mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
fs/ntfs3: Changing locking in ntfs_rename
In some cases we can be in deadlock because we tried to lock the same dir. Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
This commit is contained in:
parent
ad26a9c845
commit
0ad9dfcb8d
@ -305,6 +305,8 @@ static int ntfs_rename(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
|
||||
ni_lock_dir(dir_ni);
|
||||
ni_lock(ni);
|
||||
if (dir_ni != new_dir_ni)
|
||||
ni_lock_dir2(new_dir_ni);
|
||||
|
||||
is_bad = false;
|
||||
err = ni_rename(dir_ni, new_dir_ni, ni, de, new_de, &is_bad);
|
||||
@ -328,6 +330,8 @@ static int ntfs_rename(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
ntfs_sync_inode(inode);
|
||||
}
|
||||
|
||||
if (dir_ni != new_dir_ni)
|
||||
ni_unlock(new_dir_ni);
|
||||
ni_unlock(ni);
|
||||
ni_unlock(dir_ni);
|
||||
out:
|
||||
|
@ -334,6 +334,7 @@ enum ntfs_inode_mutex_lock_class {
|
||||
NTFS_INODE_MUTEX_REPARSE,
|
||||
NTFS_INODE_MUTEX_NORMAL,
|
||||
NTFS_INODE_MUTEX_PARENT,
|
||||
NTFS_INODE_MUTEX_PARENT2,
|
||||
};
|
||||
|
||||
/*
|
||||
@ -1121,6 +1122,11 @@ static inline void ni_lock_dir(struct ntfs_inode *ni)
|
||||
mutex_lock_nested(&ni->ni_lock, NTFS_INODE_MUTEX_PARENT);
|
||||
}
|
||||
|
||||
static inline void ni_lock_dir2(struct ntfs_inode *ni)
|
||||
{
|
||||
mutex_lock_nested(&ni->ni_lock, NTFS_INODE_MUTEX_PARENT2);
|
||||
}
|
||||
|
||||
static inline void ni_unlock(struct ntfs_inode *ni)
|
||||
{
|
||||
mutex_unlock(&ni->ni_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user