From d1b534dfc6e7bbc51719447305749ee2b803ed1e Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Wed, 3 Apr 2002 00:17:36 +0000 Subject: [PATCH] brelse() was improperly clearing B_DELWRI in the B_DELWRI|B_INVAL case without removing the buffer from the vnode's dirty buffer list, which can result in a panic in NFS. Replaced the code with a call to bundirty() which deals with it properly. PR: kern/36108, kern/36174 Submitted by: various people Special mention: to Danny Schales for providing a core dump that helped me track this down. MFC after: 1 day --- sys/kern/vfs_bio.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 2a56103d3830..a81136a7f5b7 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -1338,11 +1338,8 @@ brelse(struct buf * bp) * If B_INVAL, clear B_DELWRI. We've already placed the buffer * on the correct queue. */ - if ((bp->b_flags & (B_INVAL|B_DELWRI)) == (B_INVAL|B_DELWRI)) { - bp->b_flags &= ~B_DELWRI; - --numdirtybuffers; - numdirtywakeup(lodirtybuffers); - } + if ((bp->b_flags & (B_INVAL|B_DELWRI)) == (B_INVAL|B_DELWRI)) + bundirty(bp); /* * Fixup numfreebuffers count. The bp is on an appropriate queue