Btrfs: unlock inodes in correct order in clone ioctl
In the clone ioctl, when the source and target inodes are different, we can acquire their mutexes in 2 possible different orders. After we're done cloning, we were releasing the mutexes always in the same order - the most correct way of doing it is to release them by the reverse order they were acquired. Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com> Signed-off-by: Josef Bacik <jbacik@fb.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
f499e40fd9
commit
c57c2b3ed2
|
@ -3263,9 +3263,17 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
|
|||
|
||||
unlock_extent(&BTRFS_I(src)->io_tree, off, off + len - 1);
|
||||
out_unlock:
|
||||
mutex_unlock(&src->i_mutex);
|
||||
if (!same_inode)
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
if (!same_inode) {
|
||||
if (inode < src) {
|
||||
mutex_unlock(&src->i_mutex);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
} else {
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
mutex_unlock(&src->i_mutex);
|
||||
}
|
||||
} else {
|
||||
mutex_unlock(&src->i_mutex);
|
||||
}
|
||||
out_fput:
|
||||
fdput(src_file);
|
||||
out_drop_write:
|
||||
|
|
Loading…
Reference in New Issue