bcachefs: Fix bch2_mount error path
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 18 Aug 2023 21:44:21 +0000 (17:44 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:11 +0000 (17:10 -0400)
In the bch2_mount() error path, we were calling
deactivate_locked_super(), which calls ->kill_sb(), which in our case
was calling bch2_fs_free() without __bch2_fs_stop().

This changes bch2_mount() to just call bch2_fs_stop() directly.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fs.c
fs/bcachefs/super.c

index d2f93a8..4843170 100644 (file)
@@ -1906,7 +1906,10 @@ out:
        return dget(sb->s_root);
 
 err_put_super:
+       sb->s_fs_info = NULL;
+       c->vfs_sb = NULL;
        deactivate_locked_super(sb);
+       bch2_fs_stop(c);
        return ERR_PTR(bch2_err_class(ret));
 }
 
@@ -1914,8 +1917,11 @@ static void bch2_kill_sb(struct super_block *sb)
 {
        struct bch_fs *c = sb->s_fs_info;
 
+       if (c)
+               c->vfs_sb = NULL;
        generic_shutdown_super(sb);
-       bch2_fs_free(c);
+       if (c)
+               bch2_fs_free(c);
 }
 
 static struct file_system_type bcache_fs_type = {
index 8e2ec3b..6042486 100644 (file)
@@ -581,6 +581,8 @@ void bch2_fs_free(struct bch_fs *c)
 {
        unsigned i;
 
+       BUG_ON(!test_bit(BCH_FS_STOPPING, &c->flags));
+
        mutex_lock(&bch_fs_list_lock);
        list_del(&c->list);
        mutex_unlock(&bch_fs_list_lock);