tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: rename(), wapbl and deadlock

On Wed, Jan 13, 2010 at 10:45:29AM +0000, David Holland wrote:
> On Thu, Dec 17, 2009 at 10:29:13PM +0100, Manuel Bouyer wrote:
>  > I got a look again at the ufs_rename patch that David Holland sent
>  > at the end of september, and managed to get it working on netbsd-5.
> I've posted three fix patches (that apply on top) along with the
> original patches here:
> This includes fixes for the link count problems I was seeing on the
> last go-around, and also fixes the panic: relookup: bad hash issue
> (which turned out to be due to insufficiently careful frobbing of
> SAVESTART), and also includes (I believe) all the issues posted here.

I applied these fixes to my netbsd-5 tree.

> It is now fairly solid, but there are at least two issues remaining:
> after pounding for a while one fairly reliably gets KASSERT(vp->v_size
> != ip->i_size) failing in ufs_blkatoff, for reasons that are not
> entirely clear. I suspect the state information that ufs_lookup leaves
> behind in the inode is getting mixed up or garbaged.

I get this almost immediatly on a Xen guest with WAPBL:
login: panic: kernel diagnostic assertion "dvp->v_size == dp->i_size" failed: 
file "/dsk/l1/misc/bouyer/netbsd-5/src/sys/ufs/ufs/ufs_lookup.c", line 897

This is the kassert just after "Get the block containing the space for the
new directory entry".

> The other is this:
>  > With these changes, I couldn't crash or hang a kernel using rsync
>  > on a WAPBL filesystem. However, the system doen't come up multiuser
>  > if / is not logged:
>  > Building databases: devpanic: kernel diagnostic assertion "bn >= NDADDR" 
> failed: file "/dsk/l1/misc/bouyer/netbsd-5/src/sys/ufs/ufs/ufs_bmap.c", line 
> 349
>  > fatal breakpoint trap in supervisor mode
> which I think may be related, but maybe not, and I haven't so far
> looked into it.

I worked around this by using ufs_wapbl_rename() even for non-WAPBL mounts.
The KASSERT(dvp->v_size == dp->i_size) does fire too, but not as fast as
with WAPBL on.

Manuel Bouyer <>
     NetBSD: 26 ans d'experience feront toujours la difference

Home | Main Index | Thread Index | Old Index