OSDN Git Service

btrfs: fix mount/umount race
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 17 Nov 2011 06:29:09 +0000 (01:29 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 9 Jan 2012 00:33:23 +0000 (19:33 -0500)
Do *NOT* skip doomed superblocks in btrfs_test_super(); we want
sget() to wait for their shutdown to complete.  Since we don't
mutilate ->s_fs_info in ->put_super() anymore (or free what it
used to point to until the superblock is past being findable
by sget()), we can just DTRT there and report a match.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/btrfs/super.c

index eca4862..b9fd62a 100644 (file)
@@ -733,20 +733,15 @@ static int btrfs_test_super(struct super_block *s, void *data)
        struct btrfs_root *test_root = data;
        struct btrfs_root *root = btrfs_sb(s);
 
-       /*
-        * If this super block is going away, return false as it
-        * can't match as an existing super block.
-        */
-       if (!atomic_read(&s->s_active))
-               return 0;
        return root->fs_info->fs_devices == test_root->fs_info->fs_devices;
 }
 
 static int btrfs_set_super(struct super_block *s, void *data)
 {
-       s->s_fs_info = data;
-
-       return set_anon_super(s, data);
+       int err = set_anon_super(s, data);
+       if (!err)
+               s->s_fs_info = data;
+       return err;
 }
 
 /*