66 lines
1.9 KiB
Diff
66 lines
1.9 KiB
Diff
From 1299757412533c8e2ea1d00a1e77944bc87ff39d Mon Sep 17 00:00:00 2001
|
|
From: Josef Bacik <josef@redhat.com>
|
|
Date: Fri, 22 Oct 2010 15:26:53 -0400
|
|
Subject: [PATCH 1/3] 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 <josef@redhat.com>
|
|
---
|
|
fs/btrfs/super.c | 7 +++----
|
|
1 files changed, 3 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
|
|
index 1776dbd..185702f 100644
|
|
--- a/fs/btrfs/super.c
|
|
+++ b/fs/btrfs/super.c
|
|
@@ -629,7 +629,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, ".")) {
|
|
@@ -643,14 +643,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;
|
|
@@ -668,7 +668,6 @@ error_close_devices:
|
|
btrfs_close_devices(fs_devices);
|
|
error_free_subvol_name:
|
|
kfree(subvol_name);
|
|
-error:
|
|
return error;
|
|
}
|
|
|
|
--
|
|
1.7.3.3
|
|
|