diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2011-07-12 21:40:23 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2011-07-12 21:40:23 -0400 |
commit | 94c0d4ecbe7f9fe56e052b26b2ab484e246c07b4 (patch) | |
tree | aa6d28122deb93e6f14b89d78987ef91d722b59d /fs | |
parent | 258e43fdb00c73d424b114ae3850accd55b27cbb (diff) | |
download | linux-3.10-94c0d4ecbe7f9fe56e052b26b2ab484e246c07b4.tar.gz linux-3.10-94c0d4ecbe7f9fe56e052b26b2ab484e246c07b4.tar.bz2 linux-3.10-94c0d4ecbe7f9fe56e052b26b2ab484e246c07b4.zip |
Fix ->d_lock locking order in unlazy_walk()
Make sure that child is still a child of parent before nested locking
of child->d_lock in unlazy_walk(); otherwise we are risking a violation
of locking order and deadlocks.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/namei.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/namei.c b/fs/namei.c index 0223c41fb11..5c867dd1c0b 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -433,6 +433,8 @@ static int unlazy_walk(struct nameidata *nd, struct dentry *dentry) goto err_parent; BUG_ON(nd->inode != parent->d_inode); } else { + if (dentry->d_parent != parent) + goto err_parent; spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); if (!__d_rcu_to_refcount(dentry, nd->seq)) goto err_child; |