[OpenWrt-Devel,V2,fstools] Revert "block: mount_action: handle mount/umount deps"
diff mbox series

Message ID 20191228105808.5432-1-zajec5@gmail.com
State Under Review
Delegated to: Rafał Miłecki
Headers show
Series
  • [OpenWrt-Devel,V2,fstools] Revert "block: mount_action: handle mount/umount deps"
Related show

Commit Message

Rafał Miłecki Dec. 28, 2019, 10:58 a.m. UTC
From: Rafał Miłecki <rafal@milecki.pl>

This reverts commit 32c3126b2f0464106d74317336b6aef1d7d5f82f.

Internal list of devices guarantees some basic sorting (by device type
and then a name) but nothing more. In particular it cannot be guaranteed
that all preceding entries are parent devices. That would require a tree
struct instead of a flat list.

In most cases mounting all preceding devices results in unwanted mounts.

If there are 2 disks with 2 partitions each:
sda: /dev/sda1 /dev/sda2
sdb: /dev/sdb1 /dev/sdb2
Then using autofs and accessing sdb2 would result in mounting all 4
partitions and spinning unneeded sda.

If some dependency handling is required it should be implemented
explicitly as current solution isn't reliable and it breaks expected
autofs behavior.

Cc: Yousong Zhou <yszhou4tech@gmail.com>
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
V2: Update commit message
---
 block.c | 43 +++++++++++++------------------------------
 1 file changed, 13 insertions(+), 30 deletions(-)

Patch
diff mbox series

diff --git a/block.c b/block.c
index b6d49a8..e07cbc5 100644
--- a/block.c
+++ b/block.c
@@ -1199,47 +1199,30 @@  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;
-
-	if (config_load(NULL))
-		return -1;
-	cache_load(0);
-
-	the_dev = find_block_device(NULL, NULL, device);
+	snprintf(path, sizeof(path), "/dev/%s", device);
 
 	if (!strcmp(action, "remove")) {
 		if (type == TYPE_HOTPLUG)
 			blockd_notify(device, NULL, NULL);
 
-		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);
+		umount_device(path, type, true);
+
 		return 0;
-	} 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);
+	} else if (strcmp(action, "add")) {
+		ULOG_ERR("Unkown action %s\n", action);
+
+		return -1;
 	}
-	ULOG_ERR("Unkown action %s\n", action);
-	return -1;
+
+	if (config_load(NULL))
+		return -1;
+	cache_load(0);
+
+	return mount_device(find_block_device(NULL, NULL, path), type);
 }
 
 static int main_hotplug(int argc, char **argv)