diff options
author | dillon <dillon@FreeBSD.org> | 1999-09-20 16:19:24 +0000 |
---|---|---|
committer | dillon <dillon@FreeBSD.org> | 1999-09-20 16:19:24 +0000 |
commit | 5007145b49ed01b5762a409e180b018ccc2384dc (patch) | |
tree | 73fb47662d1e095d2075a7513cb8ffe10b212b11 /sys/kern/vfs_bio.c | |
parent | f56081fa700df2d5a267e1aac0da2505467a9c7a (diff) | |
download | FreeBSD-src-5007145b49ed01b5762a409e180b018ccc2384dc.zip FreeBSD-src-5007145b49ed01b5762a409e180b018ccc2384dc.tar.gz |
Fix bug in brelse() regarding redirtying buffers on B_ERROR. brelse()
improperly ignored the B_INVAL flag when acting on the B_ERROR.
If both B_INVAL and B_ERROR are set the buffer is typically out of the
underlying device's block range and must be destroyed. If only B_ERROR
is set (for a write), a write error occured and operation remains as it
was before: the buffer must be redirtied to avoid corrupting the
filesystem state.
Reviewed by: David Greenman <dg@root.com>
Submitted by: Tor.Egge@fast.no
Diffstat (limited to 'sys/kern/vfs_bio.c')
-rw-r--r-- | sys/kern/vfs_bio.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 2f8f85a..9de7200 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -861,11 +861,13 @@ brelse(struct buf * bp) if (bp->b_flags & B_LOCKED) bp->b_flags &= ~B_ERROR; - if ((bp->b_flags & (B_READ | B_ERROR)) == B_ERROR) { + if ((bp->b_flags & (B_READ | B_ERROR | B_INVAL)) == B_ERROR) { /* * Failed write, redirty. Must clear B_ERROR to prevent - * pages from being scrapped. Note: B_INVAL is ignored - * here but will presumably be dealt with later. + * pages from being scrapped. If B_INVAL is set then + * this case is not run and the next case is run to + * destroy the buffer. B_INVAL can occur if the buffer + * is outside the range supported by the underlying device. */ bp->b_flags &= ~B_ERROR; bdirty(bp); |