From 3b29ff8c2a6489b9517d61c0f63256a1ad0c36f7 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Thu, 28 Feb 2013 17:05:06 +0800 Subject: [PATCH] discover: Add uuid and label parameters to persistent device data Rather than depending on the event (which is only available during inital discovery) for UUID and label parameters, this change adds uuid and label members to struct discover_device. This means that the label and UUID are available during the device's lifetime, not just during initial discovery. We can also just pass the device to some of the device handling code, rather than the discover context. Also, fix an issue where we don't use the raw label/uuid (instead of the encoded one) in setup_device_links. Signed-off-by: Jeremy Kerr --- discover/device-handler.c | 44 ++++++++++++++++++++++----------------- discover/device-handler.h | 3 +++ 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/discover/device-handler.c b/discover/device-handler.c index 6952dde..7533cfa 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -129,36 +129,33 @@ const struct device *device_handler_get_device( return handler->devices[index]->device; } -static void setup_device_links(struct discover_context *ctx) +static void setup_device_links(struct discover_device *dev) { - struct discover_device *dev = ctx->device; struct link { - char *env, *dir; + const char *dir, *val; } *link, links[] = { { - .env = "ID_FS_UUID", - .dir = "disk/by-uuid" + .dir = "disk/by-uuid", + .val = dev->uuid, }, { - .env = "ID_FS_LABEL", - .dir = "disk/by-label" + .dir = "disk/by-label", + .val = dev->label, }, { - .env = NULL + .dir = NULL } }; - for (link = links; link->env; link++) { + for (link = links; link->dir; link++) { char *enc, *dir, *path; - const char *value; - value = event_get_param(ctx->event, link->env); - if (!value || !*value) + if (!link->val || !*link->val) continue; - enc = encode_label(ctx, value); - dir = join_paths(ctx, mount_base(), link->dir); - path = join_paths(dev, dir, value); + enc = encode_label(dev, link->val); + dir = join_paths(dev, mount_base(), link->dir); + path = join_paths(dev, dir, enc); if (!pb_mkdir_recursive(dir)) { unlink(path); @@ -190,9 +187,8 @@ static void remove_device_links(struct discover_device *dev) unlink(dev->links[i]); } -static int mount_device(struct discover_context *ctx) +static int mount_device(struct discover_device *dev) { - struct discover_device *dev = ctx->device; const char *mountpoint; const char *argv[6]; @@ -225,7 +221,7 @@ static int mount_device(struct discover_context *ctx) goto out_rmdir; } - setup_device_links(ctx); + setup_device_links(dev); return 0; out_rmdir: @@ -325,6 +321,7 @@ static int handle_add_udev_event(struct device_handler *handler, { struct discover_context *ctx; struct discover_device *dev; + const char *param; int rc; /* create our context */ @@ -337,7 +334,16 @@ static int handle_add_udev_event(struct device_handler *handler, ctx->device = dev; - rc = mount_device(ctx); + /* try to parse UUID and labels */ + param = event_get_param(ctx->event, "ID_FS_UUID"); + if (param) + dev->uuid = talloc_strdup(dev, param); + + param = event_get_param(ctx->event, "ID_FS_LABEL"); + if (param) + dev->label = talloc_strdup(dev, param); + + rc = mount_device(dev); if (rc) { talloc_free(ctx); return 0; diff --git a/discover/device-handler.h b/discover/device-handler.h index 809f88e..e298fed 100644 --- a/discover/device-handler.h +++ b/discover/device-handler.h @@ -17,6 +17,9 @@ struct discover_device { char **links; int n_links; + char *uuid; + char *label; + char *mount_path; char *device_path; }; -- 2.39.2