blockd: don't flush devices list on "hotplug" call
[project/fstools.git] / blockd.c
index 29d16f27080310ddfd3982ea1a1a6c0f67a0dc6f..e07530c6cbb15d3d02ce0a7bca03ca620bf60b67 100644 (file)
--- a/blockd.c
+++ b/blockd.c
@@ -111,8 +111,21 @@ block(char *cmd, char *action, char *device)
 static void
 device_free(struct device *device)
 {
-       if (device->autofs && device->target)
+       char *mp;
+
+       if (!device->autofs)
+               return;
+
+       block("autofs", "unavailable", device->name);
+
+       if (device->target)
                unlink(device->target);
+
+       mp = _find_mount_point(device->name);
+       if (mp) {
+               block("autofs", "remove", device->name);
+               free(mp);
+       }
 }
 
 static void
@@ -126,6 +139,8 @@ device_add(struct device *device)
        snprintf(path, sizeof(path), "/tmp/run/blockd/%s", device->name);
        if (symlink(path, device->target))
                ULOG_ERR("failed to symlink %s->%s\n", device->target, path);
+       else
+               block("autofs", "available", device->name);
 }
 
 static int
@@ -222,7 +237,6 @@ block_hotplug(struct ubus_context *ctx, struct ubus_object *obj,
        if (!device)
                return UBUS_STATUS_UNKNOWN_ERROR;
 
-       vlist_update(&devices);
        if (data[MOUNT_REMOVE]) {
                vlist_delete(&devices, &device->node);
        } else {
@@ -240,9 +254,8 @@ block_hotplug(struct ubus_context *ctx, struct ubus_object *obj,
                strcpy(_name, devname);
                device->target = __target;
                strcpy(__target, target);
-               vlist_add(&devices, &device->node, blobmsg_get_string(data[MOUNT_DEVICE]));
+               vlist_add(&devices, &device->node, device->name);
        }
-       vlist_flush(&devices);
 
        return 0;
 }