Subject: Re: More LFS Woes
To: Konrad Schroder <perseant@hhhh.org>
From: Gary Duzan <gary@duzan.org>
List: tech-kern
Date: 02/03/2003 00:19:27
In Message <Pine.NEB.4.51.0302021501110.264@hammer.hhhh.org> ,
   Konrad Schroder <perseant@hhhh.org> wrote:

=>On Sun, 2 Feb 2003, Gary Duzan wrote:
=>
=>> #13 0xc01c18cb in lfs_remove (v=0xe411bcbc)
=>>     at /usr/src/sys/ufs/lfs/lfs_vnops.c:632
=>> #14 0xc01c6da8 in ufs_rename (v=0xe411be70) at /usr/src/sys/sys/vnode_if.h:686
=>> #15 0xc01c1f0f in lfs_rename (v=0xe411be70)
=>>     at /usr/src/sys/ufs/lfs/lfs_vnops.c:741
=>[...]
=>>    Any ideas about what is going on here? I have a good core dump,
=>> and I can reliably recreate the problem, so suggestions on things
=>> to check and/or try would be appreciated.
=>
=>I think you should be able to duplicate this condition by something like
=>
=>	cd /my/lfs
=>	: > foo
=>	ln foo bar
=>	mv foo bar
=>
=>at least, that should duplicate your stack trace.

   It did duplicate the condition.

=>                                                   The problem that causes
=>this assertion failure is that lfs_remove is being called while the
=>original dirop (lfs_rename) is still active on the same inode.

   I knew that looked screwy...

=>                                                                I've just
=>committed the obvious fix for that, although it's not immediately clear
=>that this double-dirop is the cause of your original problem.

   Well, it fixed the immediate problem, anyway. The above example
is fixed and the build completes normally. I haven't worked out
all the details, but I think it fixes the original problem, too,
since we've eliminated the bogus call path, ufs_rename -> lfs_remove
-> lfs_set_dirop -> lfs_reserve -> lfs_reservebuf, which updates
the counter. I didn't see the lfs_fits_buf warning during the build,
either, so I think we can call it fixed for now.
   Thanks.

					Gary Duzan