summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Golle <daniel@makrotopia.org>2021-07-14 04:42:25 +0100
committerDaniel Golle <daniel@makrotopia.org>2021-07-14 05:30:41 +0100
commit39558a1f3ebbf0a56188ead4f703456feab2102f (patch)
tree4a30163f767da39aebc736630289e2923e67981d
parent2f42515977adef7c026eb380ed2423c533cf8f3d (diff)
downloadfstools-39558a1f3ebbf0a56188ead4f703456feab2102f.tar.gz
blockd: also send ubus notification on mount hotplug
Also sending a ubus notification on mount hotplug provides a useful shortcut for procd service triggers. As the /etc/hotplug.d/mount API for now doesn't have any users and also makes it hard to aggregate hotplug calls, we should consider removing it in favor of only using triggers on the block notifications in future. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
-rw-r--r--blockd.c46
1 files changed, 34 insertions, 12 deletions
diff --git a/blockd.c b/blockd.c
index f6973d8..541fedc 100644
--- a/blockd.c
+++ b/blockd.c
@@ -135,8 +135,10 @@ block(char *cmd, char *action, char *device)
return ret;
}
-static int hotplug_call_mount(const char *action, const char *devname,
- uloop_process_handler cb, void *priv)
+static int send_block_notification(struct ubus_context *ctx, const char *action,
+ const char *devname);
+static int hotplug_call_mount(struct ubus_context *ctx, const char *action,
+ const char *devname, uloop_process_handler cb, void *priv)
{
char * const argv[] = { "hotplug-call", "mount", NULL };
struct hotplug_context *c = NULL;
@@ -174,6 +176,8 @@ static int hotplug_call_mount(const char *action, const char *devname,
break;
}
+ send_block_notification(ctx, action, devname);
+
return 0;
}
@@ -196,13 +200,13 @@ static void device_mount_remove_hotplug_cb(struct uloop_process *p, int stat)
free(hctx);
}
-static void device_mount_remove(struct device *device)
+static void device_mount_remove(struct ubus_context *ctx, struct device *device)
{
- hotplug_call_mount("remove", device->name,
+ hotplug_call_mount(ctx, "remove", device->name,
device_mount_remove_hotplug_cb, device);
}
-static void device_mount_add(struct device *device)
+static void device_mount_add(struct ubus_context *ctx, struct device *device)
{
struct stat st;
char *path;
@@ -219,7 +223,7 @@ static void device_mount_add(struct device *device)
if (symlink(path, device->target))
ULOG_ERR("failed to symlink %s->%s (%d) - %m\n", device->target, path, errno);
else
- hotplug_call_mount("add", device->name, NULL, NULL);
+ hotplug_call_mount(ctx, "add", device->name, NULL, NULL);
free(path);
}
@@ -309,7 +313,7 @@ block_hotplug(struct ubus_context *ctx, struct ubus_object *obj,
vlist_delete(&devices, &device->node);
if (device->autofs)
- device_mount_remove(device);
+ device_mount_remove(ctx, device);
else
free(device);
@@ -333,13 +337,13 @@ block_hotplug(struct ubus_context *ctx, struct ubus_object *obj,
if (old && !device_move(old, device)) {
if (device->autofs) {
- device_mount_remove(old);
- device_mount_add(device);
+ device_mount_remove(ctx, old);
+ device_mount_add(ctx, device);
} else {
block("mount", NULL, NULL);
}
} else if (device->autofs) {
- device_mount_add(device);
+ device_mount_add(ctx, device);
}
}
@@ -365,7 +369,7 @@ static int blockd_mount(struct ubus_context *ctx, struct ubus_object *obj,
if (!device)
return UBUS_STATUS_UNKNOWN_ERROR;
- hotplug_call_mount("add", device->name, NULL, NULL);
+ hotplug_call_mount(ctx, "add", device->name, NULL, NULL);
return 0;
}
@@ -409,7 +413,7 @@ static int blockd_umount(struct ubus_context *ctx, struct ubus_object *obj,
c->ctx = ctx;
ubus_defer_request(ctx, req, &c->req);
- err = hotplug_call_mount("remove", devname, blockd_umount_hotplug_cb, c);
+ err = hotplug_call_mount(ctx, "remove", devname, blockd_umount_hotplug_cb, c);
if (err) {
free(c);
return UBUS_STATUS_UNKNOWN_ERROR;
@@ -490,6 +494,24 @@ static struct ubus_object block_object = {
.n_methods = ARRAY_SIZE(block_methods),
};
+/* send ubus event for successful mounts, useful for procd triggers */
+static int send_block_notification(struct ubus_context *ctx, const char *action,
+ const char *devname)
+{
+ struct blob_buf buf = { 0 };
+ int err;
+
+ if (!ctx)
+ return -ENXIO;
+
+ blob_buf_init(&buf, 0);
+ blobmsg_add_string(&buf, "devname", devname);
+
+ err = ubus_notify(ctx, &block_object, action, buf.head, -1);
+
+ return err;
+}
+
static void
ubus_connect_handler(struct ubus_context *ctx)
{