block: mount_action: handle mount/umount deps
authorYousong Zhou <yszhou4tech@gmail.com>
Tue, 29 Oct 2019 12:39:48 +0000 (12:39 +0000)
committerJohn Crispin <john@phrozen.org>
Sat, 2 Nov 2019 18:22:44 +0000 (19:22 +0100)
This is required at least in system startup when "block hotplug" will be
triggered by udevtrigger.  E.g. /dev/vdb needs to be mounted at /mnt/s
and /dev/vdc /mnt.  It does not work if /dev/vdb was triggered then
mounted first

Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
block.c

diff --git a/block.c b/block.c
index 66dcf9c09294285481fcc7c341e7f05d8cbe727c..15caaba14549413accccd4ec005b9b9e2c9ef902 100644 (file)
--- a/block.c
+++ b/block.c
@@ -1188,30 +1188,47 @@ static int umount_device(char *path, int type, bool all)
 
 static int mount_action(char *action, char *device, int type)
 {
+       struct device *the_dev, *dev;
        char path[32];
 
        if (!action || !device)
                return -1;
-       snprintf(path, sizeof(path), "/dev/%s", device);
+
+       if (config_load(NULL))
+               return -1;
+       cache_load(0);
+
+       the_dev = find_block_device(NULL, NULL, device);
 
        if (!strcmp(action, "remove")) {
                if (type == TYPE_HOTPLUG)
                        blockd_notify(device, NULL, NULL);
 
-               umount_device(path, type, true);
-
+               if (!the_dev || !the_dev->m || the_dev->m->type != TYPE_MOUNT) {
+                       snprintf(path, sizeof(path), "/dev/%s", device);
+                       umount_device(path, type, true);
+               } else
+                       vlist_for_element_to_last_reverse(&devices, the_dev, dev, node)
+                               if (dev->m && dev->m->type == TYPE_MOUNT)
+                                       umount_device(dev->pr->dev, type, true);
                return 0;
-       } else if (strcmp(action, "add")) {
-               ULOG_ERR("Unkown action %s\n", action);
-
-               return -1;
+       } else if (!strcmp(action, "add")) {
+               if (!the_dev)
+                       return -1;
+               if (the_dev->m && the_dev->m->type == TYPE_MOUNT) {
+                       vlist_for_first_to_element(&devices, the_dev, dev, node) {
+                               if (dev->m && dev->m->type == TYPE_MOUNT) {
+                                       int err = mount_device(dev, type);
+                                       if (err)
+                                               return err;
+                               }
+                       }
+                       return 0;
+               } else
+                       return mount_device(the_dev, type);
        }
-
-       if (config_load(NULL))
-               return -1;
-       cache_load(0);
-
-       return mount_device(find_block_device(NULL, NULL, path), type);
+       ULOG_ERR("Unkown action %s\n", action);
+       return -1;
 }
 
 static int main_hotplug(int argc, char **argv)