Btrfs: fix error handling in btrfs_get_sb
PATCH 1/1 Btrfs: fix error handling in btrfs_get_sb
If we failed to find the root subvol id, or the subvol=<name>, we would deactivate the locked super and close the devices. The problem is at this point we have gotten the SB all setup, which includes setting super_operations, so when we'd deactiveate the super, we'd do a close_ctree() which closes the devices, so we'd end up closing the devices twice. So if you do something like this
mount /dev/sda1 /mnt/test1
mount /dev/sda1 /mnt/test2 -o subvol=xxx
umount /mnt/test1
it would blow up (if subvol xxx doesn't exist). This patch fixes that problem. Thanks,
Signed-off-by Josef Bacik <[email protected]>
--- fs/btrfs/super.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-)
fs/btrfs/super.c +3 -4
@@ -627,7 +627,7 @@ static int btrfs_get_sb(struct file_system_type *fs_type, int flags,if (IS_ERR (root)) { error =PTR_ERR (root);deactivate_locked_super (s); - goto error; + goto error_free_subvol_name; }/* if they gave us a subvolume name bind mount into that */ if (strcmp (subvol_name,"." )) {
@@ -641,14 +641,14 @@ static int btrfs_get_sb(struct file_system_type *fs_type, int flags,deactivate_locked_super (s); error =PTR_ERR (new_root);dput (root); - goto error_close_devices; + goto error_free_subvol_name; }if (!new_root->d_inode) {dput (root);dput (new_root);deactivate_locked_super (s); error = -ENXIO ; - goto error_close_devices; + goto error_free_subvol_name; }dput (root); root = new_root;
@@ -666,7 +666,6 @@ error_close_devices:btrfs_close_devices (fs_devices); error_free_subvol_name:kfree (subvol_name); -error:return error; }
Signature · 1 line
1.6.6.1