blockd: don't flush devices list on "hotplug" call
[project/fstools.git] / blockd.c
index a5da32c49d24725c1e163d178524f1914cda0abc..e07530c6cbb15d3d02ce0a7bca03ca620bf60b67 100644 (file)
--- a/blockd.c
+++ b/blockd.c
@@ -111,53 +111,36 @@ block(char *cmd, char *action, char *device)
 static void
 device_free(struct device *device)
 {
-       struct blob_attr *data[__MOUNT_MAX];
-       char *target = NULL;
-       char *path = NULL, _path[64], *mp;
-
-       blobmsg_parse(mount_policy, __MOUNT_MAX, data,
-                     blob_data(device->msg), blob_len(device->msg));
+       char *mp;
 
-       if (data[MOUNT_AUTOFS]) {
-               target = device->target;
-               snprintf(_path, sizeof(_path), "/tmp/run/blockd/%s",
-                        blobmsg_get_string(data[MOUNT_DEVICE]));
-               path = _path;
-       } else {
-               path = target = device->target;
-       }
+       if (!device->autofs)
+               return;
 
-       mp = _find_mount_point(device->name);
-       if (path && mp)
-               if (umount2(path, MNT_DETACH))
-                       ULOG_ERR("failed to unmount %s\n", path);
-       free(mp);
+       block("autofs", "unavailable", device->name);
 
-       if (!target)
-               return;
+       if (device->target)
+               unlink(device->target);
 
-       if (data[MOUNT_AUTOFS])
-               unlink(target);
-       else
-               rmdir(target);
+       mp = _find_mount_point(device->name);
+       if (mp) {
+               block("autofs", "remove", device->name);
+               free(mp);
+       }
 }
 
 static void
 device_add(struct device *device)
 {
-       struct blob_attr *data[__MOUNT_MAX];
        char path[64];
 
-       blobmsg_parse(mount_policy, __MOUNT_MAX, data,
-                     blob_data(device->msg), blob_len(device->msg));
-
-       if (!data[MOUNT_AUTOFS])
+       if (!device->autofs)
                return;
 
-       snprintf(path, sizeof(path), "/tmp/run/blockd/%s",
-                blobmsg_get_string(data[MOUNT_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
@@ -254,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 {
@@ -272,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;
 }