diff options
author | yar <yar@FreeBSD.org> | 2003-06-15 18:13:17 +0000 |
---|---|---|
committer | yar <yar@FreeBSD.org> | 2003-06-15 18:13:17 +0000 |
commit | 180cfbc14f376c745830944bac62fa42f45d6eb3 (patch) | |
tree | 7a3bb2e81c8c54a3e1a9dab413afa53409bc222c /sys/dev/fdc/fdc.c | |
parent | 66f662a622976cb236f15dc6c2767c396daa7c1d (diff) | |
download | FreeBSD-src-180cfbc14f376c745830944bac62fa42f45d6eb3.zip FreeBSD-src-180cfbc14f376c745830944bac62fa42f45d6eb3.tar.gz |
Always set bio_resid properly in fdstrategy(),
as should every block device strategy routine.
There was at least one evil consequence of not doing so:
Some errors returned by fdstrategy() could be lost (EAGAIN,
in particular.)
PR: kern/52338 (in the audit-trail)
Discussed with: bde
Diffstat (limited to 'sys/dev/fdc/fdc.c')
-rw-r--r-- | sys/dev/fdc/fdc.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/sys/dev/fdc/fdc.c b/sys/dev/fdc/fdc.c index b6ec2c3..2d835a0 100644 --- a/sys/dev/fdc/fdc.c +++ b/sys/dev/fdc/fdc.c @@ -1669,6 +1669,7 @@ fdstrategy(struct bio *bp) panic("fdstrategy: buf for nonexistent device (%#lx, %#lx)", (u_long)major(bp->bio_dev), (u_long)minor(bp->bio_dev)); fdc = fd->fdc; + bp->bio_resid = bp->bio_bcount; if (fd->type == FDT_NONE || fd->ft == 0) { bp->bio_error = ENXIO; bp->bio_flags |= BIO_ERROR; @@ -1712,9 +1713,7 @@ fdstrategy(struct bio *bp) nblocks = fd->ft->size; if (blknum + bp->bio_bcount / fdblk > nblocks) { if (blknum >= nblocks) { - if (bp->bio_cmd == BIO_READ) - bp->bio_resid = bp->bio_bcount; - else { + if (bp->bio_cmd != BIO_READ) { bp->bio_error = ENOSPC; bp->bio_flags |= BIO_ERROR; } |