gfs2: Register fs after creating workqueues
authorBob Peterson <rpeterso@redhat.com>
Tue, 30 Aug 2022 18:52:13 +0000 (13:52 -0500)
committerAndreas Gruenbacher <agruenba@redhat.com>
Tue, 20 Sep 2022 15:53:54 +0000 (17:53 +0200)
Before this patch, the gfs2 file system was registered prior to creating
the three workqueues. In some cases this allowed dlm to send recovery
work to a workqueue that did not yet exist because gfs2 was still
initializing.

This patch changes the order of gfs2's initialization routine so it only
registers the file system after the work queues are created.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/main.c

index 14ae9de7627726d515f2419a82dc4e109cd49689..afcb32854f14224f1a07d977faa6c8202baeb38f 100644 (file)
@@ -151,14 +151,6 @@ static int __init init_gfs2_fs(void)
        if (error)
                goto fail_shrinker;
 
-       error = register_filesystem(&gfs2_fs_type);
-       if (error)
-               goto fail_fs1;
-
-       error = register_filesystem(&gfs2meta_fs_type);
-       if (error)
-               goto fail_fs2;
-
        error = -ENOMEM;
        gfs_recovery_wq = alloc_workqueue("gfs_recovery",
                                          WQ_MEM_RECLAIM | WQ_FREEZABLE, 0);
@@ -180,11 +172,23 @@ static int __init init_gfs2_fs(void)
                goto fail_mempool;
 
        gfs2_register_debugfs();
+       error = register_filesystem(&gfs2_fs_type);
+       if (error)
+               goto fail_fs1;
+
+       error = register_filesystem(&gfs2meta_fs_type);
+       if (error)
+               goto fail_fs2;
+
 
        pr_info("GFS2 installed\n");
 
        return 0;
 
+fail_fs2:
+       unregister_filesystem(&gfs2_fs_type);
+fail_fs1:
+       mempool_destroy(gfs2_page_pool);
 fail_mempool:
        destroy_workqueue(gfs2_freeze_wq);
 fail_wq3:
@@ -192,10 +196,6 @@ fail_wq3:
 fail_wq2:
        destroy_workqueue(gfs_recovery_wq);
 fail_wq1:
-       unregister_filesystem(&gfs2meta_fs_type);
-fail_fs2:
-       unregister_filesystem(&gfs2_fs_type);
-fail_fs1:
        unregister_shrinker(&gfs2_qd_shrinker);
 fail_shrinker:
        kmem_cache_destroy(gfs2_trans_cachep);