diff options
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 22 |
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); |