summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2000-04-25 10:51:18 +0000
committerphk <phk@FreeBSD.org>2000-04-25 10:51:18 +0000
commita708c222de7b2882a8f9e471911f7768d353532c (patch)
tree845969f3fdfdd9a87c329c4f057492cffe310673 /sys
parent7dbc44ea9253465e587b32df22ba4bef4b564e19 (diff)
downloadFreeBSD-src-a708c222de7b2882a8f9e471911f7768d353532c.zip
FreeBSD-src-a708c222de7b2882a8f9e471911f7768d353532c.tar.gz
Clone the {b|bio}_offset field, and make sure it is always initialized
in struct bio. Eventually, bio_offset will probably obsolete the bio_blkno and bio_pblkno fields. Remove the special hack in atapi-cd.c to determine of bio_offset was valid.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ata/atapi-cd.c9
-rw-r--r--sys/kern/subr_disk.c2
-rw-r--r--sys/sys/bio.h2
-rw-r--r--sys/sys/buf.h2
-rw-r--r--sys/sys/conf.h12
-rw-r--r--sys/sys/linedisc.h12
6 files changed, 21 insertions, 18 deletions
diff --git a/sys/dev/ata/atapi-cd.c b/sys/dev/ata/atapi-cd.c
index 15a6a2b..81c8ed4 100644
--- a/sys/dev/ata/atapi-cd.c
+++ b/sys/dev/ata/atapi-cd.c
@@ -1146,14 +1146,7 @@ acd_start(struct atapi_softc *atp)
bzero(ccb, sizeof(ccb));
count = (bp->bio_bcount + (cdp->block_size - 1)) / cdp->block_size;
- {
- /* XXX Hack until b_offset is always initialized */
- struct buf *bup = (struct buf *)bp;
- if (bup->b_flags & B_PHYS)
- lba = bup->b_offset / cdp->block_size;
- else
- lba = bp->bio_blkno / (cdp->block_size / DEV_BSIZE);
- }
+ lba = bp->bio_offset / cdp->block_size;
if (bp->bio_cmd == BIO_READ) {
/* if transfer goes beyond EOM adjust it to be within limits */
diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c
index 0838056..cf25c1b 100644
--- a/sys/kern/subr_disk.c
+++ b/sys/kern/subr_disk.c
@@ -201,6 +201,8 @@ diskstrategy(struct bio *bp)
return;
}
+ KASSERT(dp->d_devsw != NULL, ("NULL devsw"));
+ KASSERT(dp->d_devsw->d_strategy != NULL, ("NULL d_strategy"));
dp->d_devsw->d_strategy(bp);
return;
diff --git a/sys/sys/bio.h b/sys/sys/bio.h
index 4a95e88..55a4bc1 100644
--- a/sys/sys/bio.h
+++ b/sys/sys/bio.h
@@ -137,9 +137,9 @@ struct buf {
#define b_iodone b_io.bio_done
#define b_iodone_chain b_io.bio_done_chain
#define b_ioflags b_io.bio_flags
-#define b_offset b_io.bio_offset
#define b_pblkno b_io.bio_pblkno
#define b_resid b_io.bio_resid
+ off_t b_offset; /* Offset into file. */
LIST_ENTRY(buf) b_hash; /* Hash chain. */
TAILQ_ENTRY(buf) b_vnbufs; /* Buffer's associated vnode. */
TAILQ_ENTRY(buf) b_freelist; /* Free list position if not active. */
diff --git a/sys/sys/buf.h b/sys/sys/buf.h
index 4a95e88..55a4bc1 100644
--- a/sys/sys/buf.h
+++ b/sys/sys/buf.h
@@ -137,9 +137,9 @@ struct buf {
#define b_iodone b_io.bio_done
#define b_iodone_chain b_io.bio_done_chain
#define b_ioflags b_io.bio_flags
-#define b_offset b_io.bio_offset
#define b_pblkno b_io.bio_pblkno
#define b_resid b_io.bio_resid
+ off_t b_offset; /* Offset into file. */
LIST_ENTRY(buf) b_hash; /* Hash chain. */
TAILQ_ENTRY(buf) b_vnbufs; /* Buffer's associated vnode. */
TAILQ_ENTRY(buf) b_freelist; /* Free list position if not active. */
diff --git a/sys/sys/conf.h b/sys/sys/conf.h
index 9052f85..f4ae3d6 100644
--- a/sys/sys/conf.h
+++ b/sys/sys/conf.h
@@ -138,11 +138,15 @@ typedef void devfs_remove_t __P((dev_t dev));
* of surgery, reset the flag and restart all the stuff on the stall
* queue.
*/
-#define DEV_STRATEGY(bp, dummy) \
- do { \
+#define DEV_STRATEGY(bp, dummy) \
+ do { \
if ((!(bp)->b_iocmd) || ((bp)->b_iocmd & ((bp)->b_iocmd - 1))) \
- Debugger("d_iocmd botch"); \
- (*devsw((bp)->b_dev)->d_strategy)(&(bp)->b_io); \
+ Debugger("d_iocmd botch"); \
+ if ((bp)->b_flags & B_PHYS) \
+ (bp)->b_io.bio_offset = (bp)->b_offset; \
+ else \
+ (bp)->b_io.bio_offset = dbtob((bp)->b_blkno); \
+ (*devsw((bp)->b_dev)->d_strategy)(&(bp)->b_io); \
} while (0)
/*
diff --git a/sys/sys/linedisc.h b/sys/sys/linedisc.h
index 9052f85..f4ae3d6 100644
--- a/sys/sys/linedisc.h
+++ b/sys/sys/linedisc.h
@@ -138,11 +138,15 @@ typedef void devfs_remove_t __P((dev_t dev));
* of surgery, reset the flag and restart all the stuff on the stall
* queue.
*/
-#define DEV_STRATEGY(bp, dummy) \
- do { \
+#define DEV_STRATEGY(bp, dummy) \
+ do { \
if ((!(bp)->b_iocmd) || ((bp)->b_iocmd & ((bp)->b_iocmd - 1))) \
- Debugger("d_iocmd botch"); \
- (*devsw((bp)->b_dev)->d_strategy)(&(bp)->b_io); \
+ Debugger("d_iocmd botch"); \
+ if ((bp)->b_flags & B_PHYS) \
+ (bp)->b_io.bio_offset = (bp)->b_offset; \
+ else \
+ (bp)->b_io.bio_offset = dbtob((bp)->b_blkno); \
+ (*devsw((bp)->b_dev)->d_strategy)(&(bp)->b_io); \
} while (0)
/*
OpenPOWER on IntegriCloud