From: Rafał Miłecki <[email protected]>

Some devices may have mount target set to directory used by another
device. Detect it and print a warning.

In future we should mount such "parent" devices first.

Cc: Yousong Zhou <[email protected]>
Signed-off-by: Rafał Miłecki <[email protected]>
---
 block.c | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/block.c b/block.c
index dfee7fb..7cd1944 100644
--- a/block.c
+++ b/block.c
@@ -1029,6 +1029,34 @@ static int blockd_notify(char *device, struct mount *m, 
struct probe_info *pr)
        return err;
 }
 
+/**
+ * find_parent_device - find "parent" device for a given target path
+ *
+ * Some devices may have target path set to directory that is used as another
+ * device mount point. This function allows finding such devices so they can be
+ * mounted first.
+ */
+static struct probe_info *find_parent_device(struct probe_info *pr, const char 
*target)
+{
+       struct probe_info *e;
+
+       list_for_each_entry(e, &devices, list) {
+               struct mount *mp;
+
+               if (e == pr)
+                       continue;
+
+               mp = find_block(e->uuid, e->label, basename(e->dev), NULL);
+               if (mp && mp->target) {
+                       if (strlen(mp->target) < strlen(target) &&
+                           !strncmp(mp->target, target, strlen(mp->target)))
+                               return e;
+               }
+       }
+
+       return NULL;
+}
+
 static int mount_device(struct probe_info *pr, int type)
 {
        struct mount *m;
@@ -1069,6 +1097,14 @@ static int mount_device(struct probe_info *pr, int type)
                return err;
        }
 
+       /* Check if there is device for parent dir */
+       if (m && m->target) {
+               struct probe_info *parent = find_parent_device(pr, m->target);
+
+               if (parent)
+                       ULOG_WARN("Device %s should be mounted first!\n", 
parent->dev);
+       }
+
        if (type == TYPE_HOTPLUG)
                blockd_notify(device, m, pr);
 
-- 
2.25.1


_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to