From: Rafał Miłecki <ra...@milecki.pl> When blockd starts it uses "start" action for getting current state of block devices. The way main_autofs() was implemented was a bit hacky though:
1) It was calling mount_device() with TYPE_HOTPLUG First of all that made code harder to understand. Faking TYPE_HOTPLUG for a TYPE_AUTOFS made following mount_device() logic more complex. Secondly the only reason for that seems to be to trigger "swap" and extroot checks in the mount_device(). Other than that it was only about calling blockd_notify() anyway. 2) It wasn't consistent Consider a "swap" or extroot without an "autofs" set (a pretty expected case). a) During original TYPE_HOTPLUG event mount_device() would detect both cases early and return without calling blockd_notify(). b) With previous main_autofs() implementation blockd_notify() was called for both cases. With this change main_autofs() doesn't fake TYPE_HOTPLUG and it follows mount_device() logic which should result in an expected & consistent state of devices in blockd. Signed-off-by: Rafał Miłecki <ra...@milecki.pl> --- block.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/block.c b/block.c index 3d06185..091375f 100644 --- a/block.c +++ b/block.c @@ -1186,12 +1186,16 @@ static int main_autofs(int argc, char **argv) cache_load(0); list_for_each_entry(pr, &devices, list) { - struct mount *m = find_block(pr->uuid, pr->label, NULL, NULL); + struct mount *m; - if (m && m->autofs) - mount_device(pr, TYPE_HOTPLUG); - else - blockd_notify(pr->dev, m, pr); + if (!strcmp(pr->type, "swap")) + continue; + + m = find_block(pr->uuid, pr->label, NULL, NULL); + if (m && m->extroot) + continue; + + blockd_notify(pr->dev, m, pr); } return 0; } -- 2.13.7 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel