]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Linux 6.5 compat: safe cleanup in spl_proc_fini()
authorAndrea Righi <andrea.righi@canonical.com>
Sat, 2 Sep 2023 00:21:40 +0000 (02:21 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 19 Sep 2023 15:50:01 +0000 (08:50 -0700)
If we fail to create a proc entry in spl_proc_init() we may end up
calling unregister_sysctl_table() twice: one in the failure path of
spl_proc_init() and another time during spl_proc_fini().

Avoid the double call to unregister_sysctl_table() and while at it
refactor the code a bit to reduce code duplication.

This was accidentally introduced when the spl code was
updated for Linux 6.5 compatibility.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Ameer Hamza <ahamza@ixsystems.com>
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
Closes #15234
Closes #15235

module/os/linux/spl/spl-proc.c

index bcc356ae55b6a93a3cd0ab9ff4915091084df776..5cb5a6dadb05bca8f8ff9d192807fcbe54115bc8 100644 (file)
@@ -659,6 +659,21 @@ static struct ctl_table spl_root[] = {
 };
 #endif
 
+static void spl_proc_cleanup(void)
+{
+       remove_proc_entry("kstat", proc_spl);
+       remove_proc_entry("slab", proc_spl_kmem);
+       remove_proc_entry("kmem", proc_spl);
+       remove_proc_entry("taskq-all", proc_spl);
+       remove_proc_entry("taskq", proc_spl);
+       remove_proc_entry("spl", NULL);
+
+       if (spl_header) {
+               unregister_sysctl_table(spl_header);
+               spl_header = NULL;
+       }
+}
+
 int
 spl_proc_init(void)
 {
@@ -723,15 +738,8 @@ spl_proc_init(void)
                goto out;
        }
 out:
-       if (rc) {
-               remove_proc_entry("kstat", proc_spl);
-               remove_proc_entry("slab", proc_spl_kmem);
-               remove_proc_entry("kmem", proc_spl);
-               remove_proc_entry("taskq-all", proc_spl);
-               remove_proc_entry("taskq", proc_spl);
-               remove_proc_entry("spl", NULL);
-               unregister_sysctl_table(spl_header);
-       }
+       if (rc)
+               spl_proc_cleanup();
 
        return (rc);
 }
@@ -739,13 +747,5 @@ out:
 void
 spl_proc_fini(void)
 {
-       remove_proc_entry("kstat", proc_spl);
-       remove_proc_entry("slab", proc_spl_kmem);
-       remove_proc_entry("kmem", proc_spl);
-       remove_proc_entry("taskq-all", proc_spl);
-       remove_proc_entry("taskq", proc_spl);
-       remove_proc_entry("spl", NULL);
-
-       ASSERT(spl_header != NULL);
-       unregister_sysctl_table(spl_header);
+       spl_proc_cleanup();
 }