aboutsummaryrefslogtreecommitdiffstats
path: root/fs/namei.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/namei.c')
-rw-r--r--fs/namei.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 068a9e50c8c0..b7cd65224d60 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1454,20 +1454,18 @@ struct dentry *lock_rename(struct dentry *p1, struct dentry *p2)
1454 1454
1455 mutex_lock(&p1->d_inode->i_sb->s_vfs_rename_mutex); 1455 mutex_lock(&p1->d_inode->i_sb->s_vfs_rename_mutex);
1456 1456
1457 for (p = p1; !IS_ROOT(p); p = p->d_parent) { 1457 p = d_ancestor(p2, p1);
1458 if (p->d_parent == p2) { 1458 if (p) {
1459 mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_PARENT); 1459 mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_PARENT);
1460 mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_CHILD); 1460 mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_CHILD);
1461 return p; 1461 return p;
1462 }
1463 } 1462 }
1464 1463
1465 for (p = p2; !IS_ROOT(p); p = p->d_parent) { 1464 p = d_ancestor(p1, p2);
1466 if (p->d_parent == p1) { 1465 if (p) {
1467 mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT); 1466 mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT);
1468 mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_CHILD); 1467 mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_CHILD);
1469 return p; 1468 return p;
1470 }
1471 } 1469 }
1472 1470
1473 mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT); 1471 mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT);