BUF/BIO cleanup 7/99:
authorHiten Pandya <hmp@dragonflybsd.org>
Mon, 8 Aug 2005 01:25:31 +0000 (01:25 +0000)
committerHiten Pandya <hmp@dragonflybsd.org>
Mon, 8 Aug 2005 01:25:31 +0000 (01:25 +0000)
First attempt at separating low-level information from BUF structure into
the new BIO structure.  The latter will be used to represent the actual
I/O underlying the buffer cache, other subsystems and device drivers.

Other information from the BUF structure will be moved eventually once
their place in the grand scheme is determined.  For now, preprocess macros
have been added to reduce widespread changes; this is a temporary measure
by all means until more of the BIO and BUF API is formalised.

Remove compatibility preprocessor macros in the AAC driver because our
BUF/BIO system is mutating; not to mention they were getting in the way.

NB the name BIO has been used because it's quite appropriate and known
among kernel developers from other operating system groups, be it BSD or
Linux.

This change should not have any operational affect (famous last words).

Reviewed by: Matthew Dillon <dillon@dragonflybsd.org>

sys/dev/raid/aac/aac.c
sys/dev/raid/aac/aac_compat.h
sys/dev/raid/aac/aac_disk.c
sys/dev/raid/aac/aacvar.h
sys/kern/vfs_bio.c
sys/sys/bio.h [new file with mode: 0644]
sys/sys/buf.h

index b2b90f7..08af215 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/dev/aac/aac.c,v 1.9.2.14 2003/04/08 13:22:08 scottl Exp $
- *     $DragonFly: src/sys/dev/raid/aac/aac.c,v 1.18 2005/06/09 20:55:05 swildner Exp $
+ *     $DragonFly: src/sys/dev/raid/aac/aac.c,v 1.19 2005/08/08 01:25:31 hmp Exp $
  */
 
 /*
@@ -877,14 +877,14 @@ aac_complete(void *context, int pending)
  * Handle a bio submitted from a disk device.
  */
 void
-aac_submit_bio(struct bio *bp)
+aac_submit_bio(struct buf *bp)
 {
        struct aac_disk *ad;
        struct aac_softc *sc;
 
        debug_called(2);
 
-       ad = (struct aac_disk *)bp->bio_dev->si_drv1;
+       ad = (struct aac_disk *)bp->b_dev->si_drv1;
        sc = ad->ad_controller;
 
        /* queue the BIO and try to get some work done */
@@ -903,7 +903,7 @@ aac_bio_command(struct aac_softc *sc, struct aac_command **cmp)
        struct aac_blockread *br;
        struct aac_blockwrite *bw;
        struct aac_disk *ad;
-       struct bio *bp;
+       struct buf *bp;
 
        debug_called(2);
 
@@ -915,8 +915,8 @@ aac_bio_command(struct aac_softc *sc, struct aac_command **cmp)
                goto fail;
 
        /* fill out the command */
-       cm->cm_data = (void *)bp->bio_data;
-       cm->cm_datalen = bp->bio_bcount;
+       cm->cm_data = (void *)bp->b_data;
+       cm->cm_datalen = bp->b_bcount;
        cm->cm_complete = aac_bio_complete;
        cm->cm_private = bp;
        cm->cm_timestamp = time_second;
@@ -937,13 +937,13 @@ aac_bio_command(struct aac_softc *sc, struct aac_command **cmp)
        fib->Header.Size = sizeof(struct aac_fib_header);
 
        /* build the read/write request */
-       ad = (struct aac_disk *)bp->bio_dev->si_drv1;
+       ad = (struct aac_disk *)bp->b_dev->si_drv1;
        if (BIO_IS_READ(bp)) {
                br = (struct aac_blockread *)&fib->data[0];
                br->Command = VM_CtBlockRead;
                br->ContainerId = ad->ad_container->co_mntobj.ObjectId;
-               br->BlockNumber = bp->bio_pblkno;
-               br->ByteCount = bp->bio_bcount;
+               br->BlockNumber = bp->b_pblkno;
+               br->ByteCount = bp->b_bcount;
                fib->Header.Size += sizeof(struct aac_blockread);
                cm->cm_sgtable = &br->SgMap;
                cm->cm_flags |= AAC_CMD_DATAIN;
@@ -951,8 +951,8 @@ aac_bio_command(struct aac_softc *sc, struct aac_command **cmp)
                bw = (struct aac_blockwrite *)&fib->data[0];
                bw->Command = VM_CtBlockWrite;
                bw->ContainerId = ad->ad_container->co_mntobj.ObjectId;
-               bw->BlockNumber = bp->bio_pblkno;
-               bw->ByteCount = bp->bio_bcount;
+               bw->BlockNumber = bp->b_pblkno;
+               bw->ByteCount = bp->b_bcount;
                bw->Stable = CUNSTABLE; /* XXX what's appropriate here? */
                fib->Header.Size += sizeof(struct aac_blockwrite);
                cm->cm_flags |= AAC_CMD_DATAOUT;
@@ -978,11 +978,11 @@ aac_bio_complete(struct aac_command *cm)
 {
        struct aac_blockread_response *brr;
        struct aac_blockwrite_response *bwr;
-       struct bio *bp;
+       struct buf *bp;
        AAC_FSAStatus status;
 
        /* fetch relevant status and then release the command */
-       bp = (struct bio *)cm->cm_private;
+       bp = (struct buf *)cm->cm_private;
        if (BIO_IS_READ(bp)) {
                brr = (struct aac_blockread_response *)&cm->cm_fib->data[0];
                status = brr->Status;
@@ -994,12 +994,12 @@ aac_bio_complete(struct aac_command *cm)
 
        /* fix up the bio based on status */
        if (status == ST_OK) {
-               bp->bio_resid = 0;
+               bp->b_resid = 0;
        } else {
-               bp->bio_error = EIO;
-               bp->bio_flags |= BIO_ERROR;
+               bp->b_error = EIO;
+               bp->b_flags |= B_ERROR;
                /* pass an error string out to the disk layer */
-               bp->bio_driver1 = aac_describe_code(aac_command_status_table,
+               bp->b_driver1 = aac_describe_code(aac_command_status_table,
                                                    status);
        }
        aac_biodone(bp);
index fb551ed..948d8e5 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/aac/aac_compat.h,v 1.2.2.2 2001/09/19 19:09:11 scottl Exp $
- * $DragonFly: src/sys/dev/raid/aac/Attic/aac_compat.h,v 1.5 2004/07/17 01:45:37 hmp Exp $
+ * $DragonFly: src/sys/dev/raid/aac/Attic/aac_compat.h,v 1.6 2005/08/08 01:25:31 hmp Exp $
  */
 /*
  * Backwards compatibility support.
  * Handle the new/old bio/buf changeover
  */
 
-#if defined(__DragonFly__) || __FreeBSD_version < 500003               /* old buf style */
+#ifdef __DragonFly__
 #include <sys/proc.h>
 #include <sys/buf.h>
 #include <sys/buf2.h>
-#define FREEBSD_4
-#define bio                                    buf
 #define bioq_init(x)                           bufq_init(x)
-#define bioq_insert_tail(x, y)                 bufq_insert_tail(x, y)
+#define bioq_insert_tail(x, y)         bufq_insert_tail(x, y)
 #define bioq_remove(x, y)                      bufq_remove(x, y)
 #define bioq_first(x)                          bufq_first(x)
 #define bio_queue_head                         buf_queue_head
-#define bio_bcount                             b_bcount
-#define bio_blkno                              b_blkno
-#define bio_caller1                            b_caller1
-#define bio_data                               b_data
-#define bio_dev                                        b_dev
-#define bio_driver1                            b_driver1
-#define bio_error                              b_error
-#define bio_flags                              b_flags
-#define bio_pblkno                             b_pblkno
-#define bio_resid                              b_resid
+#define        FREEBSD_4
 #define BIO_ERROR                              B_ERROR
 #define devstat_end_transaction_bio(x, y)      devstat_end_transaction_buf(x, y)
 #define BIO_IS_READ(x)                         ((x)->b_flags & B_READ)
-
-#else                                  /* new bio style */
-#include <sys/bio.h>
-#define BIO_IS_READ(x)                         ((x)->bio_cmd == BIO_READ)
 #endif
index 49c8478..93897be 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/dev/aac/aac_disk.c,v 1.3.2.8 2003/01/11 18:39:39 scottl Exp $
- *     $DragonFly: src/sys/dev/raid/aac/aac_disk.c,v 1.9 2004/06/02 19:31:02 dillon Exp $
+ *     $DragonFly: src/sys/dev/raid/aac/aac_disk.c,v 1.10 2005/08/08 01:25:31 hmp Exp $
  */
 
 #include "opt_aac.h"
@@ -183,25 +183,25 @@ aac_disk_close(dev_t dev, int flags, int fmt, d_thread_t *td)
  * Handle an I/O request.
  */
 static void
-aac_disk_strategy(struct bio *bp)
+aac_disk_strategy(struct buf *bp)
 {
        struct aac_disk *sc;
 
        debug_called(4);
 
-       sc = (struct aac_disk *)bp->bio_dev->si_drv1;
+       sc = (struct aac_disk *)bp->b_dev->si_drv1;
 
        /* bogus disk? */
        if (sc == NULL) {
-               bp->bio_flags |= BIO_ERROR;
-               bp->bio_error = EINVAL;
+               bp->b_flags |= B_ERROR;
+               bp->b_error = EINVAL;
                biodone(bp);
                return;
        }
 
        /* do-nothing operation? */
-       if (bp->bio_bcount == 0) {
-               bp->bio_resid = bp->bio_bcount;
+       if (bp->b_bcount == 0) {
+               bp->b_resid = bp->b_bcount;
                biodone(bp);
                return;
        }
@@ -294,24 +294,24 @@ retry:
  * Handle completion of an I/O request.
  */
 void
-aac_biodone(struct bio *bp)
+aac_biodone(struct buf *bp)
 {
        struct aac_disk *sc;
        int blkno;
 
        debug_called(4);
 
-       sc = (struct aac_disk *)bp->bio_dev->si_drv1;
+       sc = (struct aac_disk *)bp->b_dev->si_drv1;
 
        devstat_end_transaction_bio(&sc->ad_stats, bp);
-       if (bp->bio_flags & BIO_ERROR) {
+       if (bp->b_flags & BIO_ERROR) {
                blkno = (sc->ad_label.d_nsectors) ? 0 : -1;
 #if defined(__FreeBSD__) && __FreeBSD_version > 500005
                diskerr(bp, bp->b_dev,
                        (char *)bp->bio_driver1, blkno, &sc->ad_label);
 #else
                diskerr(bp, bp->b_dev,
-                       (char *)bp->bio_driver1, 0, blkno, &sc->ad_label);
+                       (char *)bp->b_driver1, 0, blkno, &sc->ad_label);
 #endif
        }
        biodone(bp);
index 8139773..e873ab7 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/dev/aac/aacvar.h,v 1.4.2.7 2003/04/08 13:22:08 scottl Exp $
- *     $DragonFly: src/sys/dev/raid/aac/aacvar.h,v 1.9 2005/06/09 20:55:05 swildner Exp $
+ *     $DragonFly: src/sys/dev/raid/aac/aacvar.h,v 1.10 2005/08/08 01:25:31 hmp Exp $
  */
 
 #include <sys/thread2.h>
@@ -145,7 +145,7 @@ struct aac_command
        struct aac_fib          *cm_fib;        /* FIB associated with this
                                                 * command */
        u_int32_t               cm_fibphys;     /* bus address of the FIB */
-       struct bio              *cm_data;       /* pointer to data in kernel
+       struct buf              *cm_data;       /* pointer to data in kernel
                                                 * space */
        u_int32_t               cm_datalen;     /* data length */
        bus_dmamap_t            cm_datamap;     /* DMA map for bio data */
@@ -330,7 +330,7 @@ struct aac_softc
        TAILQ_HEAD(,aac_command) aac_busy;
        TAILQ_HEAD(,aac_command) aac_complete;  /* commands which have been
                                                 * returned by the controller */
-       struct bio_queue_head   aac_bioq;
+       struct buf_queue_head   aac_bioq;
        struct aac_queue_table  *aac_queues;
        struct aac_queue_entry  *aac_qentries[AAC_QUEUE_COUNT];
 
@@ -390,8 +390,8 @@ extern int          aac_suspend(device_t dev);
 extern int             aac_resume(device_t dev);
 extern void            aac_intr(void *arg);
 extern devclass_t      aac_devclass;
-extern void            aac_submit_bio(struct bio *bp);
-extern void            aac_biodone(struct bio *bp);
+extern void            aac_submit_bio(struct buf *bp);
+extern void            aac_biodone(struct buf *bp);
 extern int             aac_dump_enqueue(struct aac_disk *ad, u_int32_t lba,
                                         void *data, int nblks);
 extern void            aac_dump_complete(struct aac_softc *sc);
@@ -557,7 +557,7 @@ aac_initq_bio(struct aac_softc *sc)
 }
 
 static __inline void
-aac_enqueue_bio(struct aac_softc *sc, struct bio *bp)
+aac_enqueue_bio(struct aac_softc *sc, struct buf *bp)
 {
        crit_enter();
        bioq_insert_tail(&sc->aac_bioq, bp);
@@ -565,10 +565,10 @@ aac_enqueue_bio(struct aac_softc *sc, struct bio *bp)
        crit_exit();
 }
 
-static __inline struct bio *
+static __inline struct buf *
 aac_dequeue_bio(struct aac_softc *sc)
 {
-       struct bio *bp;
+       struct buf *bp;
 
        crit_enter();
        if ((bp = bioq_first(&sc->aac_bioq)) != NULL) {
index 81e810d..db209a0 100644 (file)
@@ -12,7 +12,7 @@
  *             John S. Dyson.
  *
  * $FreeBSD: src/sys/kern/vfs_bio.c,v 1.242.2.20 2003/05/28 18:38:10 alc Exp $
- * $DragonFly: src/sys/kern/vfs_bio.c,v 1.45 2005/08/07 03:28:50 hmp Exp $
+ * $DragonFly: src/sys/kern/vfs_bio.c,v 1.46 2005/08/08 01:25:31 hmp Exp $
  */
 
 /*
@@ -451,6 +451,7 @@ bufinit(void)
        for (i = 0; i < nbuf; i++) {
                bp = &buf[i];
                bzero(bp, sizeof *bp);
+               bp->b_bio.bio_buf = bp; /* back pointer (temporary) */
                bp->b_flags = B_INVAL;  /* we're just an empty header */
                bp->b_dev = NODEV;
                bp->b_qindex = BQUEUE_EMPTY;
@@ -2915,7 +2916,7 @@ biodone(struct buf *bp)
 
        KASSERT(BUF_REFCNTNB(bp) > 0, ("biodone: bp %p not busy %d", bp, BUF_REFCNTNB(bp)));
        KASSERT(!(bp->b_flags & B_DONE), ("biodone: bp %p already done", bp));
-       void (*b_iodone)(struct buf *);
+       biodone_t *biodone_func;
 
        bp->b_flags |= B_DONE;
        bp->b_dev = NODEV;
@@ -2933,9 +2934,9 @@ biodone(struct buf *bp)
 
        /* call optional completion function if requested */
        if (bp->b_iodone != NULL) {
-               b_iodone = bp->b_iodone;
+               biodone_func = bp->b_iodone;
                bp->b_iodone = NULL;
-               (*b_iodone) (bp);
+               (*biodone_func) (bp);
                crit_exit();
                return;
        }
diff --git a/sys/sys/bio.h b/sys/sys/bio.h
new file mode 100644 (file)
index 0000000..7f70b31
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2004, 2005 The DragonFly Project.  All rights reserved.
+ *
+ * This code is derived from software contributed to The DragonFly Project
+ * by Hiten Pandya <hmp@backplane.com>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of The DragonFly Project nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific, prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $DragonFly: src/sys/sys/bio.h,v 1.1 2005/08/08 01:25:31 hmp Exp $
+ */
+
+#ifndef _SYS_QUEUE_H_
+#include <sys/queue.h>
+#endif
+
+typedef void biodone_t(struct buf *);
+
+/*
+ * BIO encapsulation for storage drivers and systems that do not require
+ * caching support for underlying blocks.
+ */
+struct bio {
+       LIST_ENTRY(bio) bio_chain;      /* Chaining. */
+       struct buf      *bio_buf;       /* High-level buffer back-pointer. */
+       daddr_t bio_lblkno;             /* Logical block number. */
+       daddr_t bio_blkno;              /* Underlying physical block number. */
+       daddr_t bio_pblkno;             /* Physical block number. */
+       dev_t   bio_dev;                /* Device associated to this I/O. */
+       biodone_t       *bio_done;      /* Completion function (optional). */
+       long    bio_resid;              /* Remaining I/O. */
+       int     bio_flags;              /* Operational flags. */
+       int     bio_error;              /* Error value. */
+       void    *bio_driver_ctx;        /* Private context for drivers. */
+       void    *bio_caller_ctx;        /* Private context for callers. */
+};
index 148d5fe..7418925 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)buf.h       8.9 (Berkeley) 3/30/95
  * $FreeBSD: src/sys/sys/buf.h,v 1.88.2.10 2003/01/25 19:02:23 dillon Exp $
- * $DragonFly: src/sys/sys/buf.h,v 1.16 2005/08/04 16:28:30 hmp Exp $
+ * $DragonFly: src/sys/sys/buf.h,v 1.17 2005/08/08 01:25:31 hmp Exp $
  */
 
 #ifndef _SYS_BUF_H_
 #include <sys/tree.h>
 #endif
 
+#ifndef _SYS_BIO_H_
+#include <sys/bio.h>
+#endif
+
 struct buf;
 struct mount;
 struct vnode;
@@ -118,34 +122,25 @@ struct buf {
        LIST_ENTRY(buf) b_hash;         /* Hash chain. */
        RB_ENTRY(buf) b_rbnode;         /* Red-Black node in vnode RB tree */
        TAILQ_ENTRY(buf) b_freelist;    /* Free list position if not active. */
-       TAILQ_ENTRY(buf) b_act;         /* Device driver queue when active. *new* */
+       TAILQ_ENTRY(buf) b_act;         /* driver queue when active. *new* */
+       struct bio b_bio;               /* Underlying I/O */
        long    b_flags;                /* B_* flags. */
        unsigned short b_qindex;        /* buffer queue index */
        unsigned char b_xflags;         /* extra flags */
        struct lock b_lock;             /* Buffer lock */
-       int     b_error;                /* Errno value. */
        long    b_bufsize;              /* Allocated buffer size. */
        long    b_runningbufspace;      /* when I/O is running, pipelining */
        long    b_bcount;               /* Valid bytes in buffer. */
-       long    b_resid;                /* Remaining I/O. */
-       dev_t   b_dev;                  /* Device associated with buffer. */
        caddr_t b_data;                 /* Memory, superblocks, indirect etc. */
        caddr_t b_kvabase;              /* base kva for buffer */
        int     b_kvasize;              /* size of kva for buffer */
-       daddr_t b_lblkno;               /* Logical block number. */
-       daddr_t b_blkno;                /* Underlying physical block number. */
        off_t   b_offset;               /* Offset into file */
-                                       /* Function to call upon completion. */
-       void    (*b_iodone) (struct buf *);
                                        /* For nested b_iodone's. */
        struct  iodone_chain *b_iodone_chain;
        struct  vnode *b_vp;            /* Device vnode. */
        int     b_dirtyoff;             /* Offset in buffer of dirty region. */
        int     b_dirtyend;             /* Offset of end of dirty region. */
-       daddr_t b_pblkno;               /* physical block number */
        void    *b_saveaddr;            /* Original b_addr for physio. */
-       void    *b_driver1;             /* for private use by the driver */
-       void    *b_caller1;             /* for private use by the caller */
        union   pager_info {
                void    *pg_spc;
                int     pg_reqpage;
@@ -162,7 +157,16 @@ struct buf {
        } b_chain;
 };
 
-#define b_spc  b_pager.pg_spc
+#define        b_dev           b_bio.bio_dev
+#define        b_resid         b_bio.bio_resid
+#define        b_error         b_bio.bio_error
+#define        b_lblkno        b_bio.bio_lblkno
+#define        b_blkno         b_bio.bio_blkno
+#define        b_pblkno        b_bio.bio_pblkno
+#define        b_driver1       b_bio.bio_driver_ctx
+#define        b_caller1       b_bio.bio_caller_ctx
+#define        b_iodone        b_bio.bio_done
+#define        b_spc           b_pager.pg_spc
 
 /*
  * These flags are kept in b_flags.