linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ian Kent <raven@themaw.net>
To: Sage Weil <sage@newdream.net>
Cc: linux-fsdevel@vger.kernel.org, hch@infradead.org,
	akpm@linux-foundation.org, Al Viro <viro@zeniv.linux.org.uk>,
	Andreas Dilger <adilger@sun.com>,
	Yehuda Sadeh <yehuda@newdream.net>
Subject: Re: [PATCH 1/2] vfs: make real_lookup do dentry revalidation with i_mutex held
Date: Tue, 24 Mar 2009 13:14:54 +0900	[thread overview]
Message-ID: <49C85E3E.7030505@themaw.net> (raw)
In-Reply-To: <1237493790-5665-1-git-send-email-sage@newdream.net>

Sage Weil wrote:
> real_lookup() is called by do_lookup() if dentry revalidation fails.  If
> the cache is re-populated while waiting for i_mutex, it may find that
> a d_lookup() subsequently succeeds (see the "Uhhuh! Nasty case" comment).
> 
> Previously, real_lookup() would drop i_mutex and do_revalidate() again. If
> revalidate failed _again_, however, it would give up with -ENOENT.  The
> problem here that network file systems may be invalidating dentries via
> server callbacks, e.g. due to concurrent access from another client, and
> -ENOENT is frequently the wrong answer.

This will be something of a problem for autofs4 (and autofs).
It would require fairly significant changes to the revalidate code.

> 
> This problem has been seen with both Lustre and Ceph.  It seems possible
> to hit this case with NFS as well if the cache lifetime is very short.
> 
> Instead, we should do_revalidate() while i_mutex is still held.  If
> revalidation fails, we can move on to a ->lookup() and ensure a correct
> result without worrying about any subsequent races.
> 
> Note that do_revalidate() is called with i_mutex held elsewhere.  For
> example, do_filp_open(), lookup_create(), do_unlinkat(), do_rmdir(),
> and possibly others all take the directory i_mutex, and then
> 
> -> lookup_hash
>         -> __lookup_hash
>                 -> cached_lookup
>                         -> do_revalidate
> 
> so this does not introduce any new locking rules for d_revalidate
> implementations.
> 
> Yes, the goto is ugly.  A cleanup patch follows.
> 
> CC: Al Viro <viro@zeniv.linux.org.uk>
> CC: Andreas Dilger <adilger@sun.com>
> Signed-off-by: Yehuda Sadeh <yehuda@newdream.net>
> Signed-off-by: Sage Weil <sage@newdream.net>
> ---
>  fs/namei.c |    5 +++--
>  1 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/namei.c b/fs/namei.c
> index c30e33d..b9e7128 100644
> --- a/fs/namei.c
> +++ b/fs/namei.c
> @@ -489,6 +489,7 @@ static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, s
>  	if (!result) {
>  		struct dentry *dentry;
>  
> +do_the_lookup:
>  		/* Don't create child dentry for a dead directory. */
>  		result = ERR_PTR(-ENOENT);
>  		if (IS_DEADDIR(dir))
> @@ -512,12 +513,12 @@ out_unlock:
>  	 * Uhhuh! Nasty case: the cache was re-populated while
>  	 * we waited on the semaphore. Need to revalidate.
>  	 */
> -	mutex_unlock(&dir->i_mutex);
>  	if (result->d_op && result->d_op->d_revalidate) {
>  		result = do_revalidate(result, nd);
>  		if (!result)
> -			result = ERR_PTR(-ENOENT);
> +			goto do_the_lookup;
>  	}
> +	mutex_unlock(&dir->i_mutex);
>  	return result;
>  }
>  


  parent reply	other threads:[~2009-03-24  4:15 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 [this message]
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
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=49C85E3E.7030505@themaw.net \
    --to=raven@themaw.net \
    --cc=adilger@sun.com \
    --cc=akpm@linux-foundation.org \
    --cc=hch@infradead.org \
    --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).