From: Al Viro <viro@ZenIV.linux.org.uk>
To: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: npiggin@kernel.dk, linux-fsdevel@vger.kernel.org
Subject: Re: [2.6.38] Deadlock between rename_lock and vfsmount_lock.
Date: Fri, 18 Mar 2011 12:07:48 +0000 [thread overview]
Message-ID: <20110318120748.GH22723@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20110318110603.GG22723@ZenIV.linux.org.uk>
On Fri, Mar 18, 2011 at 11:06:03AM +0000, Al Viro wrote:
> That's incredibly ugly. I agree that the deadlock exists and needs to be
> dealt with, but not that way. _Strongly_ NAKed. I'll see what I can come
> up with, but that variant is not an option.
Actually, why do we hold vfsmount_lock over that loop at all? We already
hold namespace_sem, so ->mnt_parent is protected...
FWIW, there's a thing I really don't like about that area - I would really
prefer to have namespace_sem nest _inside_ i_mutex and have no fs operations
whatsoever done under it. Note that we already take care (mostly) to
keep actual fs shutdowns outside of it.
The real obstacle is follow_down() we do under namespace_sem on several
paths; otherwise we'd be able to grab i_mutex first and be done with that.
Moreover, we have extra ugliness in follow_down(); I really wonder
what is the only instance trying to do here.
Look: we pass mounting_here == true to autofs4_d_manage(). It sees the
flag, then checks if we have DCACHE_MOUNTED set and returns either -EISDIR
or 0. -EISDIR leads to follow_down() returning 0 immediately. 0 leads
to trying to cross the mountpoint. First of all, we could as well return
0 regardless - if DCACHE_MOUNTED is not set, follow_down() will see that
and return 0 since there's nothing left to do.
What's more, we have a funny situation here - we might as well replace
if (managed & DCACHE_MANAGE_TRANSIT) {
with
if (!mounting_here && managed & DCACHE_MANAGE_TRANSIT) {
in follow_down() and lose that argument of ->d_manage().
So let's do this:
lock_mount(path, follow)
retry:
lock path->dentry->d_inode
if unlikely(can't mount)
unlock
fail
grab namespace_sem
if !follow || likely(lookup_mnt() returns NULL)
we are done
drop namespace_sem
unlock
drop path
replace it with result of lookup_mnt() (and its ->mnt_root)
goto retry;
and use that (local to fs/namespace.c) in do_add_mount()/do_move_mount()/
do_loopback() (with follow = 1) and pivot_root() (follow = 0). BTW,
the lack of following in do_loopback() looks like a bug...
Also in do_loopback(): take release_mounts() after unlocking everything.
graft_tree() doesn't grab i_mutex - callers take it.
follow_down() loses mounting_here argument and so does ->d_manage().
cant_mount() calls are all merged into one in lock_mount().
Comments?
next prev parent reply other threads:[~2011-03-18 12:07 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-16 8:54 [2.6.38] Possible deadlock at pivot_root? Tetsuo Handa
2011-03-17 5:01 ` [2.6.38] Deadlock between rename_lock and vfsmount_lock Tetsuo Handa
2011-03-18 10:59 ` Tetsuo Handa
2011-03-18 11:06 ` Al Viro
2011-03-18 11:54 ` Tetsuo Handa
2011-03-18 12:07 ` Al Viro [this message]
2011-03-18 12:13 ` Al Viro
2011-03-18 12:52 ` Al Viro
2011-03-18 13:18 ` Al Viro
2011-03-19 2:39 ` Tetsuo Handa
2011-03-23 23:00 ` Greg KH
2011-03-24 0:04 ` Tetsuo Handa
2011-03-24 0:10 ` Greg KH
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=20110318120748.GH22723@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=linux-fsdevel@vger.kernel.org \
--cc=npiggin@kernel.dk \
--cc=penguin-kernel@I-love.SAKURA.ne.jp \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.