Kyle McMartin 54f1e03
From 8f172904b45a6b530eaa345b23956682629bddee Mon Sep 17 00:00:00 2001
Kyle McMartin 54f1e03
From: Josef Bacik <josef@redhat.com>
Kyle McMartin 54f1e03
Date: Fri, 22 Oct 2010 15:26:53 -0400
Kyle McMartin 54f1e03
Subject: Btrfs: fix error handling in btrfs_get_sb
Kyle McMartin 54f1e03
Kyle McMartin 54f1e03
If we failed to find the root subvol id, or the subvol=<name>, we would
Kyle McMartin 54f1e03
deactivate the locked super and close the devices.  The problem is at this point
Kyle McMartin 54f1e03
we have gotten the SB all setup, which includes setting super_operations, so
Kyle McMartin 54f1e03
when we'd deactiveate the super, we'd do a close_ctree() which closes the
Kyle McMartin 54f1e03
devices, so we'd end up closing the devices twice.  So if you do something like
Kyle McMartin 54f1e03
this
Kyle McMartin 54f1e03
Kyle McMartin 54f1e03
mount /dev/sda1 /mnt/test1
Kyle McMartin 54f1e03
mount /dev/sda1 /mnt/test2 -o subvol=xxx
Kyle McMartin 54f1e03
umount /mnt/test1
Kyle McMartin 54f1e03
Kyle McMartin 54f1e03
it would blow up (if subvol xxx doesn't exist).  This patch fixes that problem.
Kyle McMartin 54f1e03
Thanks,
Kyle McMartin 54f1e03
Kyle McMartin 54f1e03
Signed-off-by: Josef Bacik <josef@redhat.com>
Kyle McMartin 54f1e03
---
Kyle McMartin 54f1e03
 fs/btrfs/super.c |    7 +++----
Kyle McMartin 54f1e03
 1 files changed, 3 insertions(+), 4 deletions(-)
Kyle McMartin 54f1e03
Kyle McMartin 54f1e03
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
Kyle McMartin 54f1e03
index f2393b3..c246f25 100644
Kyle McMartin 54f1e03
--- a/fs/btrfs/super.c
Kyle McMartin 54f1e03
+++ b/fs/btrfs/super.c
Kyle McMartin 54f1e03
@@ -629,7 +629,7 @@ static int btrfs_get_sb(struct file_system_type *fs_type, int flags,
Kyle McMartin 54f1e03
 	if (IS_ERR(root)) {
Kyle McMartin 54f1e03
 		error = PTR_ERR(root);
Kyle McMartin 54f1e03
 		deactivate_locked_super(s);
Kyle McMartin 54f1e03
-		goto error;
Kyle McMartin 54f1e03
+		goto error_free_subvol_name;
Kyle McMartin 54f1e03
 	}
Kyle McMartin 54f1e03
 	/* if they gave us a subvolume name bind mount into that */
Kyle McMartin 54f1e03
 	if (strcmp(subvol_name, ".")) {
Kyle McMartin 54f1e03
@@ -643,14 +643,14 @@ static int btrfs_get_sb(struct file_system_type *fs_type, int flags,
Kyle McMartin 54f1e03
 			deactivate_locked_super(s);
Kyle McMartin 54f1e03
 			error = PTR_ERR(new_root);
Kyle McMartin 54f1e03
 			dput(root);
Kyle McMartin 54f1e03
-			goto error_close_devices;
Kyle McMartin 54f1e03
+			goto error_free_subvol_name;
Kyle McMartin 54f1e03
 		}
Kyle McMartin 54f1e03
 		if (!new_root->d_inode) {
Kyle McMartin 54f1e03
 			dput(root);
Kyle McMartin 54f1e03
 			dput(new_root);
Kyle McMartin 54f1e03
 			deactivate_locked_super(s);
Kyle McMartin 54f1e03
 			error = -ENXIO;
Kyle McMartin 54f1e03
-			goto error_close_devices;
Kyle McMartin 54f1e03
+			goto error_free_subvol_name;
Kyle McMartin 54f1e03
 		}
Kyle McMartin 54f1e03
 		dput(root);
Kyle McMartin 54f1e03
 		root = new_root;
Kyle McMartin 54f1e03
@@ -668,7 +668,6 @@ error_close_devices:
Kyle McMartin 54f1e03
 	btrfs_close_devices(fs_devices);
Kyle McMartin 54f1e03
 error_free_subvol_name:
Kyle McMartin 54f1e03
 	kfree(subvol_name);
Kyle McMartin 54f1e03
-error:
Kyle McMartin 54f1e03
 	return error;
Kyle McMartin 54f1e03
 }
Kyle McMartin 54f1e03
 
Kyle McMartin 54f1e03
-- 
Kyle McMartin 54f1e03
1.7.3.3
Kyle McMartin 54f1e03