Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 Apr 2002 11:01:13 -0500 (EST)
From:      Bruce Campbell <bruce@engmail.uwaterloo.ca>
To:        stable@FreeBSD.ORG
Subject:   Re: nfs_fsync: not dirty  error in 4.5-RELEASE (possible solution)
Message-ID:  <Pine.GSO.4.05.10204021057090.17772-100000@engmail.uwaterloo.ca>
In-Reply-To: <200203292234.g2TMYpq67679@apollo.backplane.com>

next in thread | previous in thread | raw e-mail | index | archive | help

While I can't create this panic at will, I've now had 3 panics in 2 weeks
(2 in the last 24 hours), on 2 different machines, one running stock...

FreeBSD engpfile3.uwaterloo.ca 4.5-RELEASE FreeBSD 4.5-RELEASE #0: 
Mon Jan 28 14:31:56 GMT 2002 
murray@builder.freebsdmall.com:/usr/src/sys/compile/GENERIC  i386

and have collected 2 kernel cores, for further investigation if needed.

I'm now building a test machine to try the possible solution.



On Fri, 29 Mar 2002, Matthew Dillon wrote:
>     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 
> 					<dillon@backplane.com>
> 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.05.10204021057090.17772-100000>