block: allow remove hotplug event to arrive at blockd
authorDaniel Golle <daniel@makrotopia.org>
Fri, 23 Jul 2021 22:20:43 +0000 (23:20 +0100)
committerDaniel Golle <daniel@makrotopia.org>
Fri, 23 Jul 2021 22:35:37 +0000 (23:35 +0100)
As the hotplug event fires after the device has been removed, it will
never be found by _cache_load(). Hence the 'remove' event needs to
propagate in all cases and we only need to populate the cache in case
of 'add' events.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
block.c

diff --git a/block.c b/block.c
index b0ac52463c8fee4be17399bda8049781238d28b5..ae5adf03ae1f7ed23b6144d051686c4f5d0cc5be 100644 (file)
--- a/block.c
+++ b/block.c
@@ -1141,23 +1141,11 @@ static int mount_action(char *action, char *device, int type)
        if (!action || !device)
                return -1;
 
-       if (config_load(NULL))
-               return -1;
-
-       cache_load(1);
-
-       list_for_each_entry(pr, &devices, list)
-               if (!strcmp(basename(pr->dev), device))
-                       path = pr->dev;
-
-       if (!path)
-               return -1;
-
        if (!strcmp(action, "remove")) {
                if (type == TYPE_HOTPLUG)
                        blockd_notify("hotplug", device, NULL, NULL);
 
-               umount_device(path, type, true);
+               umount_device(device, type, true);
 
                return 0;
        } else if (strcmp(action, "add")) {
@@ -1166,6 +1154,18 @@ static int mount_action(char *action, char *device, int type)
                return -1;
        }
 
+       if (config_load(NULL))
+               return -1;
+
+       cache_load(1);
+
+       list_for_each_entry(pr, &devices, list)
+               if (!strcmp(basename(pr->dev), device))
+                       path = pr->dev;
+
+       if (!path)
+               return -1;
+
        return mount_device(find_block_info(NULL, NULL, path), type);
 }