Commit 0ad9dfcb authored by Konstantin Komarov's avatar Konstantin Komarov

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: default avatarKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
parent ad26a9c8
...@@ -305,6 +305,8 @@ static int ntfs_rename(struct user_namespace *mnt_userns, struct inode *dir, ...@@ -305,6 +305,8 @@ static int ntfs_rename(struct user_namespace *mnt_userns, struct inode *dir,
ni_lock_dir(dir_ni); ni_lock_dir(dir_ni);
ni_lock(ni); ni_lock(ni);
if (dir_ni != new_dir_ni)
ni_lock_dir2(new_dir_ni);
is_bad = false; is_bad = false;
err = ni_rename(dir_ni, new_dir_ni, ni, de, new_de, &is_bad); 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, ...@@ -328,6 +330,8 @@ static int ntfs_rename(struct user_namespace *mnt_userns, struct inode *dir,
ntfs_sync_inode(inode); ntfs_sync_inode(inode);
} }
if (dir_ni != new_dir_ni)
ni_unlock(new_dir_ni);
ni_unlock(ni); ni_unlock(ni);
ni_unlock(dir_ni); ni_unlock(dir_ni);
out: out:
......
...@@ -334,6 +334,7 @@ enum ntfs_inode_mutex_lock_class { ...@@ -334,6 +334,7 @@ enum ntfs_inode_mutex_lock_class {
NTFS_INODE_MUTEX_REPARSE, NTFS_INODE_MUTEX_REPARSE,
NTFS_INODE_MUTEX_NORMAL, NTFS_INODE_MUTEX_NORMAL,
NTFS_INODE_MUTEX_PARENT, NTFS_INODE_MUTEX_PARENT,
NTFS_INODE_MUTEX_PARENT2,
}; };
/* /*
...@@ -1121,6 +1122,11 @@ static inline void ni_lock_dir(struct ntfs_inode *ni) ...@@ -1121,6 +1122,11 @@ static inline void ni_lock_dir(struct ntfs_inode *ni)
mutex_lock_nested(&ni->ni_lock, NTFS_INODE_MUTEX_PARENT); 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) static inline void ni_unlock(struct ntfs_inode *ni)
{ {
mutex_unlock(&ni->ni_lock); mutex_unlock(&ni->ni_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment