btrfs: don't double lock the subvol_sem for rename exchange
commit943eb3bf25
upstream. If we're rename exchanging two subvols we'll try to lock this lock twice, which is bad. Just lock once if either of the ino's are subvols. Fixes:cdd1fedf82
("btrfs: add support for RENAME_EXCHANGE and RENAME_WHITEOUT") CC: stable@vger.kernel.org # 4.4+ Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
aceca7b13f
commit
831140602a
|
@ -9535,9 +9535,8 @@ static int btrfs_rename_exchange(struct inode *old_dir,
|
|||
btrfs_init_log_ctx(&ctx_dest, new_inode);
|
||||
|
||||
/* close the race window with snapshot create/destroy ioctl */
|
||||
if (old_ino == BTRFS_FIRST_FREE_OBJECTID)
|
||||
down_read(&fs_info->subvol_sem);
|
||||
if (new_ino == BTRFS_FIRST_FREE_OBJECTID)
|
||||
if (old_ino == BTRFS_FIRST_FREE_OBJECTID ||
|
||||
new_ino == BTRFS_FIRST_FREE_OBJECTID)
|
||||
down_read(&fs_info->subvol_sem);
|
||||
|
||||
/*
|
||||
|
@ -9771,9 +9770,8 @@ out_fail:
|
|||
ret = ret ? ret : ret2;
|
||||
}
|
||||
out_notrans:
|
||||
if (new_ino == BTRFS_FIRST_FREE_OBJECTID)
|
||||
up_read(&fs_info->subvol_sem);
|
||||
if (old_ino == BTRFS_FIRST_FREE_OBJECTID)
|
||||
if (new_ino == BTRFS_FIRST_FREE_OBJECTID ||
|
||||
old_ino == BTRFS_FIRST_FREE_OBJECTID)
|
||||
up_read(&fs_info->subvol_sem);
|
||||
|
||||
ASSERT(list_empty(&ctx_root.list));
|
||||
|
|
Loading…
Reference in New Issue