]> git.karo-electronics.de Git - linux-beck.git/commitdiff
drbd: remove /proc/drbd before unregistering from netlink
authorLars Ellenberg <lars.ellenberg@linbit.com>
Wed, 24 Nov 2010 09:37:35 +0000 (10:37 +0100)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 10 Mar 2011 10:35:12 +0000 (11:35 +0100)
There still exists a (theoretical) race on module unload, where
/proc/drbd may still exist, but the netlink callback has been
unregistered already, allowing drbdsetup to shout without listeners,
and get no reply.

Reorder remove_proc_entry and unregister of netlink callback.
drbdsetup first checks for existence of the proc entry,
and if that is missing, won't even try to contact the module.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_main.c

index 8b8a38dc6492f91776eba2ba035adb69b1d2f0d4..150ed16d26efa7e3cc76de0a5b8ff8150a61fcde 100644 (file)
@@ -3174,11 +3174,20 @@ static void drbd_cleanup(void)
 
        unregister_reboot_notifier(&drbd_notifier);
 
+       /* first remove proc,
+        * drbdsetup uses it's presence to detect
+        * whether DRBD is loaded.
+        * If we would get stuck in proc removal,
+        * but have netlink already deregistered,
+        * some drbdsetup commands may wait forever
+        * for an answer.
+        */
+       if (drbd_proc)
+               remove_proc_entry("drbd", NULL);
+
        drbd_nl_cleanup();
 
        if (minor_table) {
-               if (drbd_proc)
-                       remove_proc_entry("drbd", NULL);
                i = minor_count;
                while (i--)
                        drbd_delete_device(i);