block: cleanup handling "start" action of the "autofs" command
authorRafał Miłecki <rafal@milecki.pl>
Sun, 9 Dec 2018 16:52:10 +0000 (17:52 +0100)
committerRafał Miłecki <rafal@milecki.pl>
Wed, 12 Dec 2018 13:02:38 +0000 (14:02 +0100)
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 <rafal@milecki.pl>
block.c

diff --git a/block.c b/block.c
index 3d06185646fa504ab12f0f0bafae32318b9adc55..091375feb8a46b061be2fd02d4aed8d17c9d523c 100644 (file)
--- 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;
        }