[PATCH vfs-2.6 2/6] vfs: add d_ancestor()
This adds d_ancestor() instead of d_isparent(), then use it. If new_dentry == old_dentry, is_subdir() returns 1, looks strange. "new_dentry == old_dentry" is not subdir obviously. But I'm not checking callers for now, so this keeps current behavior. Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
This commit is contained in:
22
fs/namei.c
22
fs/namei.c
@@ -1454,20 +1454,18 @@ struct dentry *lock_rename(struct dentry *p1, struct dentry *p2)
|
||||
|
||||
mutex_lock(&p1->d_inode->i_sb->s_vfs_rename_mutex);
|
||||
|
||||
for (p = p1; !IS_ROOT(p); p = p->d_parent) {
|
||||
if (p->d_parent == p2) {
|
||||
mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_PARENT);
|
||||
mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_CHILD);
|
||||
return p;
|
||||
}
|
||||
p = d_ancestor(p2, p1);
|
||||
if (p) {
|
||||
mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_PARENT);
|
||||
mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_CHILD);
|
||||
return p;
|
||||
}
|
||||
|
||||
for (p = p2; !IS_ROOT(p); p = p->d_parent) {
|
||||
if (p->d_parent == p1) {
|
||||
mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT);
|
||||
mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_CHILD);
|
||||
return p;
|
||||
}
|
||||
p = d_ancestor(p1, p2);
|
||||
if (p) {
|
||||
mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT);
|
||||
mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_CHILD);
|
||||
return p;
|
||||
}
|
||||
|
||||
mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT);
|
||||
|
Reference in New Issue
Block a user