diff --git a/sys/dev/ata/atapi-cd.c b/sys/dev/ata/atapi-cd.c index 15a6a2b005da..81c8ed4922ff 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 0838056bedbe..cf25c1b1ad5f 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 4a95e8831c87..55a4bc170789 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 4a95e8831c87..55a4bc170789 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 9052f85aa456..f4ae3d6412cc 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 9052f85aa456..f4ae3d6412cc 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) /*