summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/cam/scsi/scsi_cd.c11
-rw-r--r--sys/cam/scsi/scsi_da.c11
-rw-r--r--sys/cam/scsi/scsi_pt.c11
-rw-r--r--sys/cam/scsi/scsi_sa.c11
-rw-r--r--sys/contrib/dev/fla/fla.c3
-rw-r--r--sys/dev/amr/amr_disk.c3
-rw-r--r--sys/dev/ata/ata-disk.c21
-rw-r--r--sys/dev/ata/atapi-all.c4
-rw-r--r--sys/dev/ata/atapi-cd.c19
-rw-r--r--sys/dev/ata/atapi-fd.c15
-rw-r--r--sys/dev/ata/atapi-tape.c19
-rw-r--r--sys/dev/ccd/ccd.c3
-rw-r--r--sys/dev/fdc/fdc.c6
-rw-r--r--sys/dev/ida/ida_disk.c3
-rw-r--r--sys/dev/md/md.c9
-rw-r--r--sys/dev/mlx/mlx_disk.c3
-rw-r--r--sys/geom/geom_ccd.c3
-rw-r--r--sys/ia64/ia64/sscdisk.c3
-rw-r--r--sys/isa/fd.c6
-rw-r--r--sys/kern/subr_disk.c4
-rw-r--r--sys/pc98/cbus/fdc.c6
-rw-r--r--sys/pc98/pc98/fd.c6
-rw-r--r--sys/pc98/pc98/wd.c3
-rw-r--r--sys/pc98/pc98/wd_cd.c15
-rw-r--r--sys/pc98/pc98/wfd.c3
-rw-r--r--sys/pc98/pc98/wst.c4
-rw-r--r--sys/sys/bio.h18
-rw-r--r--sys/sys/devicestat.h2
-rw-r--r--sys/vm/swap_pager.c4
29 files changed, 75 insertions, 154 deletions
diff --git a/sys/cam/scsi/scsi_cd.c b/sys/cam/scsi/scsi_cd.c
index 4768ff1..278dfc2 100644
--- a/sys/cam/scsi/scsi_cd.c
+++ b/sys/cam/scsi/scsi_cd.c
@@ -387,9 +387,7 @@ cdoninvalidate(struct cam_periph *periph)
while ((q_bp = bioq_first(&softc->bio_queue)) != NULL){
bioq_remove(&softc->bio_queue, q_bp);
q_bp->bio_resid = q_bp->bio_bcount;
- q_bp->bio_error = ENXIO;
- q_bp->bio_flags |= BIO_ERROR;
- biodone(q_bp);
+ biofinish(q_bp, NULL, ENXIO);
}
splx(s);
@@ -1577,9 +1575,7 @@ cddone(struct cam_periph *periph, union ccb *done_ccb)
while ((q_bp = bioq_first(&softc->bio_queue)) != NULL) {
bioq_remove(&softc->bio_queue, q_bp);
q_bp->bio_resid = q_bp->bio_bcount;
- q_bp->bio_error = EIO;
- q_bp->bio_flags |= BIO_ERROR;
- biodone(q_bp);
+ biofinish(q_bp, NULL, EIO);
}
splx(s);
bp->bio_resid = bp->bio_bcount;
@@ -1611,8 +1607,7 @@ cddone(struct cam_periph *periph, union ccb *done_ccb)
if (softc->flags & CD_FLAG_CHANGER)
cdchangerschedule(softc);
- devstat_end_transaction_bio(&softc->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &softc->device_stats, 0);
break;
}
case CD_CCB_PROBE:
diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c
index 772e5bc..10c22f8 100644
--- a/sys/cam/scsi/scsi_da.c
+++ b/sys/cam/scsi/scsi_da.c
@@ -862,9 +862,7 @@ daoninvalidate(struct cam_periph *periph)
while ((q_bp = bioq_first(&softc->bio_queue)) != NULL){
bioq_remove(&softc->bio_queue, q_bp);
q_bp->bio_resid = q_bp->bio_bcount;
- q_bp->bio_error = ENXIO;
- q_bp->bio_flags |= BIO_ERROR;
- biodone(q_bp);
+ biofinish(q_bp, NULL, ENXIO);
}
splx(s);
@@ -1244,9 +1242,7 @@ dadone(struct cam_periph *periph, union ccb *done_ccb)
!= NULL) {
bioq_remove(&softc->bio_queue, q_bp);
q_bp->bio_resid = q_bp->bio_bcount;
- q_bp->bio_error = EIO;
- q_bp->bio_flags |= BIO_ERROR;
- biodone(q_bp);
+ biofinish(q_bp, NULL, EIO);
}
splx(s);
bp->bio_error = error;
@@ -1285,8 +1281,7 @@ dadone(struct cam_periph *periph, union ccb *done_ccb)
if (softc->device_stats.busy_count == 0)
softc->flags |= DA_FLAG_WENT_IDLE;
- devstat_end_transaction_bio(&softc->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &softc->device_stats, 0);
break;
}
case DA_CCB_PROBE:
diff --git a/sys/cam/scsi/scsi_pt.c b/sys/cam/scsi/scsi_pt.c
index 3137b4a..dff8c60 100644
--- a/sys/cam/scsi/scsi_pt.c
+++ b/sys/cam/scsi/scsi_pt.c
@@ -414,9 +414,7 @@ ptoninvalidate(struct cam_periph *periph)
while ((q_bp = bioq_first(&softc->bio_queue)) != NULL){
bioq_remove(&softc->bio_queue, q_bp);
q_bp->bio_resid = q_bp->bio_bcount;
- q_bp->bio_error = ENXIO;
- q_bp->bio_flags |= BIO_ERROR;
- biodone(q_bp);
+ biofinish(q_bp, NULL, ENXIO);
}
splx(s);
@@ -626,9 +624,7 @@ ptdone(struct cam_periph *periph, union ccb *done_ccb)
!= NULL) {
bioq_remove(&softc->bio_queue, q_bp);
q_bp->bio_resid = q_bp->bio_bcount;
- q_bp->bio_error = EIO;
- q_bp->bio_flags |= BIO_ERROR;
- biodone(q_bp);
+ biofinish(q_bp, NULL, EIO);
}
splx(s);
bp->bio_error = error;
@@ -662,8 +658,7 @@ ptdone(struct cam_periph *periph, union ccb *done_ccb)
LIST_REMOVE(&done_ccb->ccb_h, periph_links.le);
splx(oldspl);
- devstat_end_transaction_bio(&softc->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &softc->device_stats, 0);
break;
}
case PT_CCB_WAITING:
diff --git a/sys/cam/scsi/scsi_sa.c b/sys/cam/scsi/scsi_sa.c
index 318534e..de3c7c1 100644
--- a/sys/cam/scsi/scsi_sa.c
+++ b/sys/cam/scsi/scsi_sa.c
@@ -1323,9 +1323,7 @@ saoninvalidate(struct cam_periph *periph)
while ((q_bp = bioq_first(&softc->bio_queue)) != NULL){
bioq_remove(&softc->bio_queue, q_bp);
q_bp->bio_resid = q_bp->bio_bcount;
- q_bp->bio_error = ENXIO;
- q_bp->bio_flags |= BIO_ERROR;
- biodone(q_bp);
+ biofinish(q_bp, NULL, ENXIO);
}
softc->queue_count = 0;
splx(s);
@@ -1708,9 +1706,7 @@ sadone(struct cam_periph *periph, union ccb *done_ccb)
while ((q_bp = bioq_first(&softc->bio_queue)) != NULL) {
bioq_remove(&softc->bio_queue, q_bp);
q_bp->bio_resid = q_bp->bio_bcount;
- q_bp->bio_error = EIO;
- q_bp->bio_flags |= BIO_ERROR;
- biodone(q_bp);
+ biofinish(q_bp, NULL, EIO);
}
splx(s);
}
@@ -1761,8 +1757,7 @@ sadone(struct cam_periph *periph, union ccb *done_ccb)
bp->bio_resid, bp->bio_bcount));
}
#endif
- devstat_end_transaction_bio(&softc->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &softc->device_stats, 0);
break;
}
case SA_CCB_WAITING:
diff --git a/sys/contrib/dev/fla/fla.c b/sys/contrib/dev/fla/fla.c
index 54a98b9..6f758de 100644
--- a/sys/contrib/dev/fla/fla.c
+++ b/sys/contrib/dev/fla/fla.c
@@ -235,8 +235,7 @@ flastrategy(struct bio *bp)
} else {
bp->bio_resid = 0;
}
- devstat_end_transaction_bio(&sc->stats, bp);
- biodone(bp);
+ biofinish(bp, &sc->stats, 0);
s = splbio();
}
diff --git a/sys/dev/amr/amr_disk.c b/sys/dev/amr/amr_disk.c
index bd9c729..f846043 100644
--- a/sys/dev/amr/amr_disk.c
+++ b/sys/dev/amr/amr_disk.c
@@ -200,8 +200,7 @@ amrd_intr(void *data)
bio->bio_resid = 0;
}
- devstat_end_transaction_bio(&sc->amrd_stats, bio);
- biodone(bio);
+ biofinish(bio, &sc->amrd_stats, 0);
}
static int
diff --git a/sys/dev/ata/ata-disk.c b/sys/dev/ata/ata-disk.c
index ec720cb..6d44958 100644
--- a/sys/dev/ata/ata-disk.c
+++ b/sys/dev/ata/ata-disk.c
@@ -228,15 +228,11 @@ ad_detach(struct ad_softc *adp, int flush)
if (request->device != adp)
continue;
TAILQ_REMOVE(&adp->controller->ata_queue, request, chain);
- request->bp->bio_error = ENXIO;
- request->bp->bio_flags |= BIO_ERROR;
- biodone(request->bp);
+ biofinish(request->bp, NULL, ENXIO);
ad_free(request);
}
while ((bp = bioq_first(&adp->queue))) {
- bp->bio_error = ENXIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, ENXIO);
}
disk_invalidate(&adp->disk);
disk_destroy(adp->dev);
@@ -269,9 +265,7 @@ adstrategy(struct bio *bp)
int s;
if (adp->flags & AD_F_DETACHING) {
- bp->bio_error = ENXIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, ENXIO);
return;
}
@@ -580,8 +574,7 @@ transfer_failed:
request->bp->bio_error = EIO;
request->bp->bio_flags |= BIO_ERROR;
request->bp->bio_resid = request->bytecount;
- devstat_end_transaction_bio(&adp->stats, request->bp);
- biodone(request->bp);
+ biofinish(request->bp, &adp->stats, 0);
ad_free(request);
}
ata_reinit(adp->controller);
@@ -714,8 +707,7 @@ ad_interrupt(struct ad_request *request)
}
#endif
finish:
- devstat_end_transaction_bio(&adp->stats, request->bp);
- biodone(request->bp);
+ biofinish(request->bp, &adp->stats, 0);
ad_free(request);
adp->outstanding--;
@@ -905,8 +897,7 @@ ad_timeout(struct ad_request *request)
/* retries all used up, return error */
request->bp->bio_error = EIO;
request->bp->bio_flags |= BIO_ERROR;
- devstat_end_transaction_bio(&adp->stats, request->bp);
- biodone(request->bp);
+ biofinish(request->bp, &adp->stats, 0);
ad_free(request);
}
ata_reinit(adp->controller);
diff --git a/sys/dev/ata/atapi-all.c b/sys/dev/ata/atapi-all.c
index 24f4ea2..5ebc611 100644
--- a/sys/dev/ata/atapi-all.c
+++ b/sys/dev/ata/atapi-all.c
@@ -159,9 +159,7 @@ atapi_detach(struct atapi_softc *atp)
TAILQ_REMOVE(&atp->controller->atapi_queue, request, chain);
if (request->driver) {
struct bio *bp = (struct bio *) request->driver;
- bp->bio_error = ENXIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, ENXIO);
}
if (request->dmatab)
free(request->dmatab, M_DEVBUF);
diff --git a/sys/dev/ata/atapi-cd.c b/sys/dev/ata/atapi-cd.c
index 8af513f..4e79c74 100644
--- a/sys/dev/ata/atapi-cd.c
+++ b/sys/dev/ata/atapi-cd.c
@@ -200,9 +200,7 @@ acddetach(struct atapi_softc *atp)
if (cdp->driver[subdev] == cdp)
continue;
while ((bp = bioq_first(&cdp->driver[subdev]->queue))) {
- bp->bio_error = ENXIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, ENXIO);
}
destroy_dev(cdp->driver[subdev]->dev1);
destroy_dev(cdp->driver[subdev]->dev2);
@@ -220,9 +218,7 @@ acddetach(struct atapi_softc *atp)
free(cdp->changer_info, M_ACD);
}
while ((bp = bioq_first(&cdp->queue))) {
- bp->bio_error = ENXIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, ENXIO);
}
destroy_dev(cdp->dev1);
destroy_dev(cdp->dev2);
@@ -1061,9 +1057,7 @@ acdstrategy(struct bio *bp)
int s;
if (cdp->atp->flags & ATAPI_F_DETACHING) {
- bp->bio_error = ENXIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, ENXIO);
return;
}
@@ -1116,9 +1110,7 @@ acd_start(struct atapi_softc *atp)
/* reject all queued entries if media changed */
if (cdp->atp->flags & ATAPI_F_MEDIA_CHANGED) {
- bp->bio_error = EIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, EIO);
return;
}
@@ -1194,8 +1186,7 @@ acd_done(struct atapi_request *request)
}
else
bp->bio_resid = bp->bio_bcount - request->donecount;
- devstat_end_transaction_bio(cdp->stats, bp);
- biodone(bp);
+ biofinish(bp, cdp->stats, 0);
return 0;
}
diff --git a/sys/dev/ata/atapi-fd.c b/sys/dev/ata/atapi-fd.c
index 6905a29..a831ff4 100644
--- a/sys/dev/ata/atapi-fd.c
+++ b/sys/dev/ata/atapi-fd.c
@@ -127,9 +127,7 @@ afddetach(struct atapi_softc *atp)
struct bio *bp;
while ((bp = bioq_first(&fdp->queue))) {
- bp->bio_error = ENXIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, ENXIO);
}
disk_invalidate(&fdp->disk);
disk_destroy(fdp->dev);
@@ -305,9 +303,7 @@ afdstrategy(struct bio *bp)
int s;
if (fdp->atp->flags & ATAPI_F_DETACHING) {
- bp->bio_error = ENXIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, ENXIO);
return;
}
@@ -341,9 +337,7 @@ afd_start(struct atapi_softc *atp)
/* should reject all queued entries if media have changed. */
if (fdp->atp->flags & ATAPI_F_MEDIA_CHANGED) {
- bp->bio_error = EIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, EIO);
return;
}
@@ -416,8 +410,7 @@ afd_done(struct atapi_request *request)
}
else
bp->bio_resid += (bp->bio_bcount - request->donecount);
- devstat_end_transaction_bio(&fdp->stats, bp);
- biodone(bp);
+ biofinish(bp, &fdp->stats, 0);
return 0;
}
diff --git a/sys/dev/ata/atapi-tape.c b/sys/dev/ata/atapi-tape.c
index a5f3f42..fb02a1f 100644
--- a/sys/dev/ata/atapi-tape.c
+++ b/sys/dev/ata/atapi-tape.c
@@ -159,9 +159,7 @@ astdetach(struct atapi_softc *atp)
struct bio *bp;
while ((bp = bioq_first(&stp->queue))) {
- bp->bio_error = ENXIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, ENXIO);
}
destroy_dev(stp->dev1);
destroy_dev(stp->dev2);
@@ -430,9 +428,7 @@ aststrategy(struct bio *bp)
int s;
if (stp->atp->flags & ATAPI_F_DETACHING) {
- bp->bio_error = ENXIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, ENXIO);
return;
}
@@ -443,9 +439,7 @@ aststrategy(struct bio *bp)
return;
}
if (!(bp->bio_cmd == BIO_READ) && stp->flags & F_WRITEPROTECT) {
- bp->bio_error = EPERM;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, EPERM);
return;
}
@@ -453,9 +447,7 @@ aststrategy(struct bio *bp)
if (bp->bio_bcount % stp->blksize) {
ata_printf(stp->atp->controller, stp->atp->unit,
"bad request, must be multiple of %d\n", stp->blksize);
- bp->bio_error = EIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, EIO);
return;
}
@@ -524,8 +516,7 @@ ast_done(struct atapi_request *request)
bp->bio_resid = bp->bio_bcount - request->donecount;
ast_total += (bp->bio_bcount - bp->bio_resid);
}
- devstat_end_transaction_bio(&stp->stats, bp);
- biodone(bp);
+ biofinish(bp, &stp->stats, 0);
return 0;
}
diff --git a/sys/dev/ccd/ccd.c b/sys/dev/ccd/ccd.c
index 6494861..4addc2e 100644
--- a/sys/dev/ccd/ccd.c
+++ b/sys/dev/ccd/ccd.c
@@ -1116,8 +1116,7 @@ ccdintr(cs, bp)
*/
if (bp->bio_flags & BIO_ERROR)
bp->bio_resid = bp->bio_bcount;
- devstat_end_transaction_bio(&cs->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &cs->device_stats, 0);
}
/*
diff --git a/sys/dev/fdc/fdc.c b/sys/dev/fdc/fdc.c
index 285aed8..29939cc 100644
--- a/sys/dev/fdc/fdc.c
+++ b/sys/dev/fdc/fdc.c
@@ -2082,8 +2082,7 @@ fdstate(fdc_p fdc)
fd->skip = 0;
fdc->bp = NULL;
device_unbusy(fd->dev);
- devstat_end_transaction_bio(&fd->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &fd->device_stats, 0);
fdc->fd = (fd_p) 0;
fdc->fdu = -1;
fdc->state = FINDWORK;
@@ -2246,8 +2245,7 @@ retrier(struct fdc_data *fdc)
fdc->bp = NULL;
fdc->fd->skip = 0;
device_unbusy(fd->dev);
- devstat_end_transaction_bio(&fdc->fd->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &fdc->fd->device_stats, 0);
fdc->state = FINDWORK;
fdc->flags |= FDC_NEEDS_RESET;
fdc->fd = (fd_p) 0;
diff --git a/sys/dev/ida/ida_disk.c b/sys/dev/ida/ida_disk.c
index 0aaeadc..99251ef 100644
--- a/sys/dev/ida/ida_disk.c
+++ b/sys/dev/ida/ida_disk.c
@@ -252,8 +252,7 @@ idad_intr(struct bio *bp)
else
bp->bio_resid = 0;
- devstat_end_transaction_bio(&drv->stats, bp);
- biodone(bp);
+ biofinish(bp, &drv->stats, 0);
}
static int
diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c
index 0d882c1..87576e7 100644
--- a/sys/dev/md/md.c
+++ b/sys/dev/md/md.c
@@ -304,8 +304,7 @@ mdstart_malloc(struct md_s *sc)
dst += sc->secsize;
}
bp->bio_resid = 0;
- devstat_end_transaction_bio(&sc->stats, bp);
- biodone(bp);
+ biofinish(bp, &sc->stats, 0);
}
return;
}
@@ -338,8 +337,7 @@ mdstart_preload(struct md_s *sc)
bcopy(bp->bio_data, sc->pl_ptr + (bp->bio_pblkno << DEV_BSHIFT), bp->bio_bcount);
}
bp->bio_resid = 0;
- devstat_end_transaction_bio(&sc->stats, bp);
- biodone(bp);
+ biofinish(bp, &sc->stats, 0);
}
return;
}
@@ -404,8 +402,7 @@ mdstart_vnode(struct md_s *sc)
bp->bio_error = error;
bp->bio_flags |= BIO_ERROR;
}
- devstat_end_transaction_bio(&sc->stats, bp);
- biodone(bp);
+ biofinish(bp, &sc->stats, 0);
}
return;
}
diff --git a/sys/dev/mlx/mlx_disk.c b/sys/dev/mlx/mlx_disk.c
index 365ac45..18698c2 100644
--- a/sys/dev/mlx/mlx_disk.c
+++ b/sys/dev/mlx/mlx_disk.c
@@ -212,8 +212,7 @@ mlxd_intr(void *data)
else
bp->bio_resid = 0;
- devstat_end_transaction_bio(&sc->mlxd_stats, bp);
- biodone(bp);
+ biofinish(bp, &sc->mlxd_stats, 0);
}
static int
diff --git a/sys/geom/geom_ccd.c b/sys/geom/geom_ccd.c
index 6494861..4addc2e 100644
--- a/sys/geom/geom_ccd.c
+++ b/sys/geom/geom_ccd.c
@@ -1116,8 +1116,7 @@ ccdintr(cs, bp)
*/
if (bp->bio_flags & BIO_ERROR)
bp->bio_resid = bp->bio_bcount;
- devstat_end_transaction_bio(&cs->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &cs->device_stats, 0);
}
/*
diff --git a/sys/ia64/ia64/sscdisk.c b/sys/ia64/ia64/sscdisk.c
index 4a9cff0..e58f412 100644
--- a/sys/ia64/ia64/sscdisk.c
+++ b/sys/ia64/ia64/sscdisk.c
@@ -224,8 +224,7 @@ sscstrategy(struct bio *bp)
off += t;
}
bp->bio_resid = 0;
- devstat_end_transaction_bio(&sc->stats, bp);
- biodone(bp);
+ biofinish(bp, &sc->stats, 0);
s = splbio();
}
diff --git a/sys/isa/fd.c b/sys/isa/fd.c
index 285aed8..29939cc 100644
--- a/sys/isa/fd.c
+++ b/sys/isa/fd.c
@@ -2082,8 +2082,7 @@ fdstate(fdc_p fdc)
fd->skip = 0;
fdc->bp = NULL;
device_unbusy(fd->dev);
- devstat_end_transaction_bio(&fd->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &fd->device_stats, 0);
fdc->fd = (fd_p) 0;
fdc->fdu = -1;
fdc->state = FINDWORK;
@@ -2246,8 +2245,7 @@ retrier(struct fdc_data *fdc)
fdc->bp = NULL;
fdc->fd->skip = 0;
device_unbusy(fd->dev);
- devstat_end_transaction_bio(&fdc->fd->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &fdc->fd->device_stats, 0);
fdc->state = FINDWORK;
fdc->flags |= FDC_NEEDS_RESET;
fdc->fd = (fd_p) 0;
diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c
index 762658f..b4932cb 100644
--- a/sys/kern/subr_disk.c
+++ b/sys/kern/subr_disk.c
@@ -300,9 +300,7 @@ diskstrategy(struct bio *bp)
inherit_raw(pdev, bp->bio_dev);
if (!dp) {
- bp->bio_error = ENXIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, ENXIO);
return;
}
diff --git a/sys/pc98/cbus/fdc.c b/sys/pc98/cbus/fdc.c
index 74db224..a7df8b3 100644
--- a/sys/pc98/cbus/fdc.c
+++ b/sys/pc98/cbus/fdc.c
@@ -2514,8 +2514,7 @@ fdstate(fdc_p fdc)
fd->skip = 0;
fdc->bp = NULL;
device_unbusy(fd->dev);
- devstat_end_transaction_bio(&fd->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &fd->device_stats, 0);
fdc->fd = (fd_p) 0;
fdc->fdu = -1;
fdc->state = FINDWORK;
@@ -2687,8 +2686,7 @@ retrier(struct fdc_data *fdc)
fdc->bp = NULL;
fdc->fd->skip = 0;
device_unbusy(fd->dev);
- devstat_end_transaction_bio(&fdc->fd->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &fdc->fd->device_stats, 0);
fdc->state = FINDWORK;
fdc->flags |= FDC_NEEDS_RESET;
fdc->fd = (fd_p) 0;
diff --git a/sys/pc98/pc98/fd.c b/sys/pc98/pc98/fd.c
index 74db224..a7df8b3 100644
--- a/sys/pc98/pc98/fd.c
+++ b/sys/pc98/pc98/fd.c
@@ -2514,8 +2514,7 @@ fdstate(fdc_p fdc)
fd->skip = 0;
fdc->bp = NULL;
device_unbusy(fd->dev);
- devstat_end_transaction_bio(&fd->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &fd->device_stats, 0);
fdc->fd = (fd_p) 0;
fdc->fdu = -1;
fdc->state = FINDWORK;
@@ -2687,8 +2686,7 @@ retrier(struct fdc_data *fdc)
fdc->bp = NULL;
fdc->fd->skip = 0;
device_unbusy(fd->dev);
- devstat_end_transaction_bio(&fdc->fd->device_stats, bp);
- biodone(bp);
+ biofinish(bp, &fdc->fd->device_stats, 0);
fdc->state = FINDWORK;
fdc->flags |= FDC_NEEDS_RESET;
fdc->fd = (fd_p) 0;
diff --git a/sys/pc98/pc98/wd.c b/sys/pc98/pc98/wd.c
index a527233..5779d39 100644
--- a/sys/pc98/pc98/wd.c
+++ b/sys/pc98/pc98/wd.c
@@ -1210,8 +1210,7 @@ done: ;
bp->bio_resid = bp->bio_bcount - du->dk_skip * DEV_BSIZE;
wdutab[du->dk_lunit].b_active = 0;
du->dk_skip = 0;
- devstat_end_transaction_bio(&du->dk_stats, bp);
- biodone(bp);
+ biofinish(bp, &du->dk_stats, 0);
}
/* controller idle */
diff --git a/sys/pc98/pc98/wd_cd.c b/sys/pc98/pc98/wd_cd.c
index 0de3104..98146f6 100644
--- a/sys/pc98/pc98/wd_cd.c
+++ b/sys/pc98/pc98/wd_cd.c
@@ -437,9 +437,7 @@ acdstrategy(struct bio *bp)
#ifdef NOTYET
/* allow write only on CD-R/RW media */ /* all for now SOS */
if ((bp->bio_cmd == BIO_WRITE) && !(writeable_media)) {
- bp->bio_error = EROFS;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, EROFS);
return;
}
#endif
@@ -474,9 +472,7 @@ acd_start(struct acd *cdp)
/* Should reject all queued entries if media have changed. */
if (cdp->flags & F_MEDIA_CHANGED) {
- bp->bio_error = EIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, EIO);
return;
}
@@ -486,9 +482,7 @@ acd_start(struct acd *cdp)
if ((cdp->flags & F_TRACK_PREPED) == 0) {
if ((cdp->flags & F_TRACK_PREP) == 0) {
printf("wcd%d: sequence error\n", cdp->lun);
- bp->bio_error = EIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, EIO);
return;
} else {
if (acd_open_track(cdp, &cdp->preptrack) != 0) {
@@ -540,8 +534,7 @@ acd_done(struct acd *cdp, struct bio *bp, int resid, struct atapires result)
if (bp->bio_cmd == BIO_WRITE)
cdp->flags |= F_WRITTEN;
}
- devstat_end_transaction_bio(cdp->device_stats, bp);
- biodone(bp);
+ biofinish(bp, cdp->device_stats, 0);
acd_start(cdp);
}
diff --git a/sys/pc98/pc98/wfd.c b/sys/pc98/pc98/wfd.c
index 42abf43..fd6d66c 100644
--- a/sys/pc98/pc98/wfd.c
+++ b/sys/pc98/pc98/wfd.c
@@ -542,8 +542,7 @@ static void wfd_done (struct wfd *t, struct bio *bp, int resid,
*/
if (((int)bp->bio_driver1)-- <= 0) {
bp->bio_resid = (int)bp->bio_driver2;
- devstat_end_transaction_bio(&t->device_stats, bp);
- biodone (bp);
+ biofinish(bp, &t->device_stats, 0);
}
wfd_start (t);
diff --git a/sys/pc98/pc98/wst.c b/sys/pc98/pc98/wst.c
index 4b9b1b3..0f2c942 100644
--- a/sys/pc98/pc98/wst.c
+++ b/sys/pc98/pc98/wst.c
@@ -395,9 +395,7 @@ wststrategy(struct bio *bp)
/* Check for != blocksize requests */
if (bp->bio_bcount % t->blksize) {
printf("wst%d: bad request, must be multiple of %d\n", lun, t->blksize);
- bp->bio_error = EIO;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, EIO);
return;
}
diff --git a/sys/sys/bio.h b/sys/sys/bio.h
index 4e01e1e..1af16d8 100644
--- a/sys/sys/bio.h
+++ b/sys/sys/bio.h
@@ -103,13 +103,21 @@ biodone(struct bio *bp)
bp->bio_done(bp);
}
+#ifndef _DEVICESTAT_H
+struct devstat;
+void devstat_end_transaction_bio(struct devstat *, struct bio *);
+#endif
+
static __inline__ void
-bioerror(struct bio *bp, int error, int complete)
+biofinish(struct bio *bp, struct devstat *stat, int error)
{
- if (complete)
- bp->bio_resid = bp->bio_bcount;
- bp->bio_error = error;
- bp->bio_flags |= BIO_ERROR;
+
+ if (error) {
+ bp->bio_error = error;
+ bp->bio_flags |= BIO_ERROR;
+ }
+ if (stat != NULL)
+ devstat_end_transaction_bio(stat, bp);
biodone(bp);
}
diff --git a/sys/sys/devicestat.h b/sys/sys/devicestat.h
index 7e617c6..b3e7f7f 100644
--- a/sys/sys/devicestat.h
+++ b/sys/sys/devicestat.h
@@ -218,7 +218,9 @@ void devstat_start_transaction(struct devstat *ds);
void devstat_end_transaction(struct devstat *ds, u_int32_t bytes,
devstat_tag_type tag_type,
devstat_trans_flags flags);
+#ifndef _SYS_BIO_H_
void devstat_end_transaction_bio(struct devstat *ds, struct bio *bp);
#endif
+#endif
#endif /* _DEVICESTAT_H */
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index aa2cb52..8d343f4 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -853,9 +853,7 @@ swap_pager_strategy(vm_object_t object, struct bio *bp)
/* XXX: KASSERT instead ? */
if (bp->bio_bcount & PAGE_MASK) {
- bp->bio_error = EINVAL;
- bp->bio_flags |= BIO_ERROR;
- biodone(bp);
+ biofinish(bp, NULL, EINVAL);
printf("swap_pager_strategy: bp %p blk %d size %d, not page bounded\n", bp, (int)bp->bio_pblkno, (int)bp->bio_bcount);
return;
}
OpenPOWER on IntegriCloud