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 <dan@coes.LaTech.edu> for providing a core dump that helped me track this down.
MFC after:	1 day
This commit is contained in:
dillon 2002-04-03 00:17:36 +00:00
parent aad01d8119
commit 9a85737b15

View File

@ -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