From: Ian Kent <raven@themaw.net>
To: Sage Weil <sage@newdream.net>
Cc: linux-fsdevel <linux-fsdevel@vger.kernel.org>,
Christoph Hellwig <hch@infradead.org>,
akpm@linux-foundation.org, Al Viro <viro@zeniv.linux.org.uk>,
Yehuda Sadeh <yehuda@newdream.net>,
"H. Peter Anvin" <hpa@zytor.com>
Subject: Re: [PATCH 1/2] vfs: make real_lookup do dentry revalidation with i_mutex held
Date: Thu, 25 Jun 2009 10:50:42 +0800 [thread overview]
Message-ID: <4A42E602.8020901@themaw.net> (raw)
In-Reply-To: <Pine.LNX.4.64.0906241019250.24576@cobra.newdream.net>
Sage Weil wrote:
>>> http://marc.info/?l=linux-fsdevel&m=123831685111213&w=2
>>>
>>> Looking over it, the
>>>
>>> + unsigned int lock_held = mutex_is_locked(&dir->i_mutex);
>>> ...
>>> + if (lock_held) {
>>> + /* Already pending, send to ->lookup() */
>>> + d_drop(dentry);
>>>
>>> bit looks highly suspect. I'm guessing revalidate should never sleep, and
>>> always kick things off to ->lookup() (to do any waiting on upcall
>>> completion or whatever else) if the dentry isn't valid now...?
>> Yeah, I've heard that before, ;)
>>
>> And that maybe the case, but that was what I first had.
>>
>> Sending everything to ->lookup() might be possible but it certainly
>> isn't that simple.
>>
>> Waiting in ->d_revaidate() isn't that different to waiting in ->lookup()
>> anyway as that must always be done without the directory mutex held. If
>> the lock isn't held when in ->d_revalidate() I can't really see any
>> reason not to handle that right their, possibly preventing the need to
>> go to ->lookup().
>
> IIRC, the fundamental problem was that if ->d_revalidate() can be called
> either with or without the dir mutex, you won't know whether the mutex is
> locked by the caller or by some other thread (mutex_is_locked() doesn't
> tell you _who_ locked the mutex). And if waiting in d_revalidate means
> unlocking the mutex, that can't work, because you won't know if that's
> safe. Thus, no waiting allowed in revalidate?
Hehe, as I said, I've been through this before.
If the mutex is not held by anyone then it doesn't need to be dropped!
But now I'm thinking I'll get rid of that that check anyway, so it
doesn't really matter.
>
>> There are several cases I need to deal with, apart from path walks
>> initiated by the daemon which don't cause any call backs, and so are
>> largely handled by trivially returning success. The cases are, an
>> expiring dentry that will go away which ->lookup() can't yet handle, an
>> expiring dentry that won't go away which ->lookup() should be able to
>> handle already, and a straight out mount request which ->lookup() should
>> also be able to handle. The tail end of the expire cases can progress
>> concurrently with a mount, which is further complicated by the two cases
>> of going away or not, so it's all a bit tricky.
>
> It sounds to me like revalidate should only return success in the trivial,
> non-blocking case. And the ->lookup() should be able to handle all
> (other) cases. I.e., things should still work correctly (perhaps more
> slowly) without any d_revalidate() at all. (It still looks like the main
> change needed is for lookup to use d_obtain_alias, instead of returning
> NULL unconditionally...)
It doesn't return NULL unconditionally and hasn't for some time.
It cannot work at all without a d_revalidate().
Your assuming that an automount implies dentry creation at mount time
which isn't necessarily the case. The creation of a directory in the
autofs pseudo file system may be done (positive and hashed) without a
mount request, the mount request coming later. This is a case I missed
when I described them above.
>
>> In any case I need to get this to work without the change you proposed,
>> except for cases that result from the locking change, and I'm using
>> printks to track incorrect returns to identify those cases. So what I
>> need right now is consistent behaviour and I'm not quite there. Once I
>> have that I'll work on any issues resulting from the locking change.
>
> I suspect you want to work with the real_lookup patch applied... I don't
> think you can get consistent behavior without it. The whole goal here is
> to remove the wait-in-revalidate workaround that was compensating for that
> bug; without either the fix or the workaround you'll get occasional
> -ENOENT.
True, and I expect and watch for that.
But I'm tending to agree and am going to do that.
Ian
next prev parent reply other threads:[~2009-06-25 2:50 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-19 20:16 [PATCH 1/2] vfs: make real_lookup do dentry revalidation with i_mutex held Sage Weil
2009-03-19 20:16 ` [PATCH 2/2] vfs: clean up real_lookup Sage Weil
2009-03-19 20:22 ` Christoph Hellwig
2009-03-19 20:35 ` Sage Weil
2009-03-19 20:23 ` [PATCH 1/2] vfs: make real_lookup do dentry revalidation with i_mutex held Christoph Hellwig
2009-03-24 4:14 ` Ian Kent
2009-03-24 4:18 ` Ian Kent
2009-03-25 4:29 ` Sage Weil
2009-03-25 6:08 ` Ian Kent
2009-03-25 16:11 ` Ian Kent
2009-03-25 19:11 ` Sage Weil
2009-03-26 2:09 ` Ian Kent
2009-03-26 3:53 ` Sage Weil
2009-03-26 8:00 ` Ian Kent
2009-03-26 10:38 ` Ian Kent
2009-03-29 8:53 ` Ian Kent
2009-04-03 0:58 ` Sage Weil
2009-04-03 2:00 ` Ian Kent
2009-04-03 3:07 ` Sage Weil
2009-06-22 17:15 ` Sage Weil
2009-06-23 0:37 ` Ian Kent
2009-06-23 2:40 ` H. Peter Anvin
2009-06-25 7:21 ` Ian Kent
2009-06-25 13:41 ` H. Peter Anvin
2009-06-25 13:58 ` Christoph Hellwig
2009-06-23 2:42 ` H. Peter Anvin
2009-06-24 2:28 ` Ian Kent
2009-06-24 5:45 ` Sage Weil
2009-06-24 9:17 ` Ian Kent
2009-06-24 17:46 ` Sage Weil
2009-06-25 2:50 ` Ian Kent [this message]
2009-06-25 4:13 ` Ian Kent
2009-06-25 4:49 ` Sage Weil
2009-06-25 5:52 ` Ian Kent
2009-09-17 6:36 ` Ian Kent
2009-07-20 2:45 ` Ian Kent
2009-07-28 22:47 ` Sage Weil
2009-07-29 2:59 ` Ian Kent
2009-07-29 16:57 ` Sage Weil
2009-07-30 0:56 ` Ian Kent
2009-07-30 17:47 ` Sage Weil
2009-07-31 2:03 ` Ian Kent
2009-03-26 3:54 ` Ian Kent
2009-03-26 4:03 ` Sage Weil
2009-03-26 5:07 ` Ian Kent
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A42E602.8020901@themaw.net \
--to=raven@themaw.net \
--cc=akpm@linux-foundation.org \
--cc=hch@infradead.org \
--cc=hpa@zytor.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=sage@newdream.net \
--cc=viro@zeniv.linux.org.uk \
--cc=yehuda@newdream.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).