On Wed, 2005-11-30 at 23:44 +0800, Ian Kent wrote:
> On Wed, 30 Nov 2005, Trond Myklebust wrote:
> 
> > On Tue, 2005-11-29 at 23:15 -0500, Jeff Moyer wrote:
> > 
> > > The patch only drops the semaphore if d_lookup finds the dentry and the
> > > dentry has a revalidate routine.  I don't follow how you can end up with
> > > multiple dentries for the same file in this case.
> > > 
> > > Sorry if I'm missing something obvious.
> > 
> > The inode->i_sem is what ensures that nobody can insert a new dentry
> > between the lookup of the cached dentry by d_lookup() and the call to
> > ->lookup() (which instantiates a new dentry).
> > 
> > Imagine you have two separate processes that are doing a __lookup_hash()
> > of the same cached dentry. Now imagine that d_revalidate() of the dentry
> > fails.
> 
> And that would be why lookup is only called if d_lookup fails in do_lookup 
> when called from the link_path_walk routine. Do you think it is possible 
> to do this safely in __lookup_hash with a similar re-ordering?

2.4 kernels did a second d_lookup() after retaking the i_sem. The
problem is what do you do in the case of a race: you either have to loop
back (may lead to infinite loops of d_lookup()+d_invalidate()) or you do
something like retry once, then return an error (which is what 2.4
kernels did).

Either choice is unsatisfying which is (I assume) why the current
behaviour was chosen for 2.6 kernels.

Cheers,
  Trond

_______________________________________________
autofs mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/autofs

Reply via email to