summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_bio.c
diff options
context:
space:
mode:
authordillon <dillon@FreeBSD.org>1999-09-20 16:19:24 +0000
committerdillon <dillon@FreeBSD.org>1999-09-20 16:19:24 +0000
commit5007145b49ed01b5762a409e180b018ccc2384dc (patch)
tree73fb47662d1e095d2075a7513cb8ffe10b212b11 /sys/kern/vfs_bio.c
parentf56081fa700df2d5a267e1aac0da2505467a9c7a (diff)
downloadFreeBSD-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.c8
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);
OpenPOWER on IntegriCloud