[OpenAFS-devel] Re: [OpenAFS] Linux kernel panic, OpenAFS client, gconf

Derrick J Brashear shadow@dementia.org
Mon, 21 Jun 2004 15:55:02 -0400 (EDT)


On Mon, 21 Jun 2004, chas williams (contractor) wrote:

> [i am moving this discussion to -devel]

woot!

> looking at this gconf crashing problem i see that
> afs_linux_dentry_revlidate() needs to hold the big kernel lock (BKL).
> however if the dentry is bad, during the shrink_dcache_parent()/d_drop()
> operation we might clear the inode associated with the dentry.
> this calls afs_dentry_iput() which calls osi_iput() which will try to
> grab AFS_GLOCK.
>
> well that's bad.  you could drop the AFS_GLOCK before dropping the BKL so
> that everything is fine but that is probably a poor idea since you could
> be change lock ordering.  after looking at this some more, i am fairly
> convinced afs is getting the locks in the wrong order in the first place.
>
> anyway, in fs/namei.c:real_lookup() we have:
>
>                         lock_kernel();
>                         result = dir->i_op->lookup(dir, dentry);
>                         unlock_kernel();
>
> and lookup() is afs_linux_lookup() which grabs AFS_GLOCK.  so its
> seems clear the right order might be lock_kernel(); AFS_GLOCK(); and not
> what we currently have.  if we make this change then dentry_revalidate()
> is cleanly fixed by dropping AFS_GLOCK before calling shrink/d_drop
> but before dropping the BKL.
>
> comments?

that looks correct from a quick reading of the code.

> [on a historical note i probably added most of the lock_kernel()'s anyway
> so its my fault really.]