From owner-freebsd-stable Fri Mar 29 14:34:58 2002 Delivered-To: freebsd-stable@freebsd.org Received: from apollo.backplane.com (apollo.backplane.com [216.240.41.2]) by hub.freebsd.org (Postfix) with ESMTP id B4AAD37B419 for ; Fri, 29 Mar 2002 14:34:54 -0800 (PST) Received: (from dillon@localhost) by apollo.backplane.com (8.11.6/8.9.1) id g2TMYpq67679; Fri, 29 Mar 2002 14:34:51 -0800 (PST) (envelope-from dillon) Date: Fri, 29 Mar 2002 14:34:51 -0800 (PST) From: Matthew Dillon Message-Id: <200203292234.g2TMYpq67679@apollo.backplane.com> To: Danny Schales Cc: Rolandas Naujikas , Bruce Campbell , Doug White , Wilko Bulte , "Paul Horechuk" , stable@FreeBSD.ORG Subject: Re: nfs_fsync: not dirty error in 4.5-RELEASE (possible solution) Sender: owner-freebsd-stable@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG Ok, I am putting this back on the main list. After looking at a kernel core that Danny graciously provided, I believe I have located the problem. The core shows NFS panicing on a struct buf showing up on the vnode's v_dirtyblkhd list that is not marked B_DELWRI. After examining the core I found that the buffer was marked B_INVAL, and I found a case in brelse() where B_DELWRI is cleared on a buffer marked B_DELWRI|B_INVAL without moving it out of the vnode's v_dirtyblkhd list. Specifically, line 1214 if kern/vfs_bio.c: /* * 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); } I believe that the correct fix is to change this code to: /* * 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)) bundirty(bp); I would appreciate it if everyone who is able to easily reproduce this panic would test this fix and post your results back to the list. If this solves the problem I will commit it to -current and -stable. -Matt Matthew Dillon To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-stable" in the body of the message