]> sourceware.org Git - lvm2.git/commitdiff
Use UUIDs instead of names while processing event handlers.
authorPeter Rajnoha <prajnoha@redhat.com>
Wed, 14 Apr 2010 13:01:38 +0000 (13:01 +0000)
committerPeter Rajnoha <prajnoha@redhat.com>
Wed, 14 Apr 2010 13:01:38 +0000 (13:01 +0000)
Internally, we used DM names instead of UUIDs while processing event
handlers. This caused problems while trying to vgrename a VG with active LVs
where the names are being changed and so the devices were not found then.
The patch also contains a little bit of refactoring, moving "build_dlid" code
found in dev_manager.c to "build_dm_uuid", now in lvm-string.c (so we have
build_dm_uuid and build_dm_name at one place).

WHATS_NEW
daemons/dmeventd/libdevmapper-event.c
lib/activate/dev_manager.c
lib/activate/targets.h
lib/mirror/mirrored.c
lib/misc/lvm-string.c
lib/misc/lvm-string.h
lib/snapshot/snapshot.c

index 285917a40e800241a978706813bd167737f6405f..93164b83b217cfed0acd868301b5e67461ae0266 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.63 -  
 ================================
+  Use UUIDs instead of names while processing event handlers.
   Only pass visible LVs to tools in cmdline VG name/tag expansions without -a.
   Use typedefs for toollib process_each functions.
   Use C locales and use_mlockall for clvmd.
index 115622dcee26ded689ecefabab6d1ea005081bc6..222be1ec6b38fc68a851056ec523d14b93f0e77c 100644 (file)
@@ -113,7 +113,7 @@ int dm_event_handler_set_uuid(struct dm_event_handler *dmevh, const char *uuid)
        _dm_event_handler_clear_dev_info(dmevh);
 
        dmevh->uuid = dm_strdup(uuid);
-       if (!dmevh->dev_name)
+       if (!dmevh->uuid)
                return -ENOMEM;
        return 0;
 }
index dcd5000b844dc0d8a5d1b86c8de087e4b46f89b5..66cc94c8921d44ef59865cb6ab1dce11403e18d3 100644 (file)
@@ -31,7 +31,6 @@
 #include <dirent.h>
 
 #define MAX_TARGET_PARAMSIZE 50000
-#define UUID_PREFIX "LVM-"
 
 typedef enum {
        PRELOAD,
@@ -59,32 +58,6 @@ struct lv_layer {
        const char *old_name;
 };
 
-static char *_build_dlid(struct dm_pool *mem, const char *lvid, const char *layer)
-{
-       char *dlid;
-       size_t len;
-
-       if (!layer)
-               layer = "";
-
-       len = sizeof(UUID_PREFIX) + sizeof(union lvid) + strlen(layer);
-
-       if (!(dlid = dm_pool_alloc(mem, len))) {
-               log_error("_build_dlid: pool allocation failed for %" PRIsize_t
-                         " %s %s.", len, lvid, layer);
-               return NULL;
-       }
-
-       sprintf(dlid, UUID_PREFIX "%s%s%s", lvid, (*layer) ? "-" : "", layer);
-
-       return dlid;
-}
-
-char *build_dlid(struct dev_manager *dm, const char *lvid, const char *layer)
-{
-       return _build_dlid(dm->mem, lvid, layer);
-}
-
 static int _read_only_lv(struct logical_volume *lv)
 {
        return (!(lv->vg->status & LVM_WRITE) || !(lv->status & LVM_WRITE));
@@ -238,7 +211,7 @@ int dev_manager_info(struct dm_pool *mem, const struct logical_volume *lv,
                return 0;
        }
 
-       if (!(dlid = _build_dlid(mem, lv->lvid.s, NULL))) {
+       if (!(dlid = build_dm_uuid(mem, lv->lvid.s, NULL))) {
                log_error("dlid build failed for %s", lv->name);
                return 0;
        }
@@ -258,7 +231,7 @@ static const struct dm_info *_cached_info(struct dm_pool *mem,
        struct dm_tree_node *dnode;
        const struct dm_info *dinfo;
 
-       if (!(dlid = _build_dlid(mem, lv->lvid.s, NULL))) {
+       if (!(dlid = build_dm_uuid(mem, lv->lvid.s, NULL))) {
                log_error("dlid build failed for %s", lv->name);
                return NULL;
        }
@@ -370,7 +343,7 @@ static int _lv_has_target_type(struct dev_manager *dm,
        char *type = NULL;
        char *params = NULL;
 
-       if (!(dlid = build_dlid(dm, lv->lvid.s, layer)))
+       if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer)))
                return_0;
 
        if (!(dmt = _setup_task(NULL, dlid, 0,
@@ -631,7 +604,7 @@ int dev_manager_snapshot_percent(struct dev_manager *dm,
        if (!(name = build_dm_name(dm->mem, lv->vg->name, lv->name, NULL)))
                return_0;
 
-       if (!(dlid = build_dlid(dm, lv->lvid.s, NULL)))
+       if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, NULL)))
                return_0;
 
        /*
@@ -667,7 +640,7 @@ int dev_manager_mirror_percent(struct dev_manager *dm,
 
        /* FIXME dm_pool_free ? */
 
-       if (!(dlid = build_dlid(dm, lv->lvid.s, suffix))) {
+       if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, suffix))) {
                log_error("dlid build failed for %s", lv->name);
                return 0;
        }
@@ -790,7 +763,7 @@ static int _add_dev_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
        if (!(name = build_dm_name(dm->mem, lv->vg->name, lv->name, layer)))
                return_0;
 
-       if (!(dlid = build_dlid(dm, lv->lvid.s, layer)))
+       if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer)))
                return_0;
 
        log_debug("Getting device info for %s [%s]", name, dlid);
@@ -925,7 +898,7 @@ static char *_add_error_device(struct dev_manager *dm, struct dm_tree *dtree,
 
        sprintf(errid, "missing_%d_%d", segno, s);
 
-       if (!(id = build_dlid(dm, seg->lv->lvid.s, errid)))
+       if (!(id = build_dm_uuid(dm->mem, seg->lv->lvid.s, errid)))
                return_NULL;
 
        if (!(name = build_dm_name(dm->mem, seg->lv->vg->name,
@@ -987,9 +960,9 @@ int add_areas_line(struct dev_manager *dm, struct lv_segment *seg,
                                                        (seg_pv(seg, s)->pe_start +
                                                         (extent_size * seg_pe(seg, s))));
                else if (seg_type(seg, s) == AREA_LV) {
-                       if (!(dlid = build_dlid(dm,
-                                                seg_lv(seg, s)->lvid.s,
-                                                NULL)))
+                       if (!(dlid = build_dm_uuid(dm->mem,
+                                                  seg_lv(seg, s)->lvid.s,
+                                                  NULL)))
                                return_0;
                        dm_tree_node_add_target_area(node, NULL, dlid,
                                                        extent_size * seg_le(seg, s));
@@ -1009,7 +982,7 @@ static int _add_origin_target_to_dtree(struct dev_manager *dm,
 {
        const char *real_dlid;
 
-       if (!(real_dlid = build_dlid(dm, lv->lvid.s, "real")))
+       if (!(real_dlid = build_dm_uuid(dm->mem, lv->lvid.s, "real")))
                return_0;
 
        if (!dm_tree_node_add_snapshot_origin_target(dnode, lv->size, real_dlid))
@@ -1025,13 +998,13 @@ static int _add_snapshot_merge_target_to_dtree(struct dev_manager *dm,
        const char *origin_dlid, *cow_dlid, *merge_dlid;
        struct lv_segment *merging_cow_seg = find_merging_cow(lv);
 
-       if (!(origin_dlid = build_dlid(dm, lv->lvid.s, "real")))
+       if (!(origin_dlid = build_dm_uuid(dm->mem, lv->lvid.s, "real")))
                return_0;
 
-       if (!(cow_dlid = build_dlid(dm, merging_cow_seg->cow->lvid.s, "cow")))
+       if (!(cow_dlid = build_dm_uuid(dm->mem, merging_cow_seg->cow->lvid.s, "cow")))
                return_0;
 
-       if (!(merge_dlid = build_dlid(dm, merging_cow_seg->cow->lvid.s, NULL)))
+       if (!(merge_dlid = build_dm_uuid(dm->mem, merging_cow_seg->cow->lvid.s, NULL)))
                return_0;
 
        if (!dm_tree_node_add_snapshot_merge_target(dnode, lv->size, origin_dlid,
@@ -1056,10 +1029,10 @@ static int _add_snapshot_target_to_dtree(struct dev_manager *dm,
                return 0;
        }
 
-       if (!(origin_dlid = build_dlid(dm, snap_seg->origin->lvid.s, "real")))
+       if (!(origin_dlid = build_dm_uuid(dm->mem, snap_seg->origin->lvid.s, "real")))
                return_0;
 
-       if (!(cow_dlid = build_dlid(dm, snap_seg->cow->lvid.s, "cow")))
+       if (!(cow_dlid = build_dm_uuid(dm->mem, snap_seg->cow->lvid.s, "cow")))
                return_0;
 
        size = (uint64_t) snap_seg->len * snap_seg->origin->vg->extent_size;
@@ -1218,7 +1191,7 @@ static int _add_new_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
        if (!(name = build_dm_name(dm->mem, lv->vg->name, lv->name, layer)))
                return_0;
 
-       if (!(dlid = build_dlid(dm, lv->lvid.s, layer)))
+       if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer)))
                return_0;
 
        /* We've already processed this node if it already has a context ptr */
@@ -1421,7 +1394,7 @@ static int _tree_action(struct dev_manager *dm, struct logical_volume *lv, actio
                goto out;
        }
 
-       if (!(dlid = build_dlid(dm, lv->lvid.s, NULL)))
+       if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, NULL)))
                goto_out;
 
        /* Only process nodes with uuid of "LVM-" plus VG id. */
index 70a4e2f19a6de5c10739119722e7ce8b794b20ff..ac68c5bb90db57a4dd071f4ff6d2647a0536f672 100644 (file)
@@ -29,6 +29,4 @@ int add_areas_line(struct dev_manager *dm, struct lv_segment *seg,
 int build_dev_string(struct dev_manager *dm, char *dlid, char *devbuf,
                     size_t bufsize, const char *desc);
 
-char *build_dlid(struct dev_manager *dm, const char *lvid, const char *layer);
-
 #endif
index f82b452f84159f2e9f613e2eaadeedf54d643de6..ee0ee64957f6059d36f98e783d096a4177372ccb 100644 (file)
@@ -239,7 +239,7 @@ static int _mirrored_target_percent(void **target_state,
        return 1;
 }
 
-static int _add_log(struct dev_manager *dm, struct lv_segment *seg,
+static int _add_log(struct dm_pool *mem, struct lv_segment *seg,
                    struct dm_tree_node *node, uint32_t area_count, uint32_t region_size)
 {
        unsigned clustered = 0;
@@ -256,14 +256,14 @@ static int _add_log(struct dev_manager *dm, struct lv_segment *seg,
 
        if (seg->log_lv) {
                /* If disk log, use its UUID */
-               if (!(log_dlid = build_dlid(dm, seg->log_lv->lvid.s, NULL))) {
+               if (!(log_dlid = build_dm_uuid(mem, seg->log_lv->lvid.s, NULL))) {
                        log_error("Failed to build uuid for log LV %s.",
                                  seg->log_lv->name);
                        return 0;
                }
        } else {
                /* If core log, use mirror's UUID and set DM_CORELOG flag */
-               if (!(log_dlid = build_dlid(dm, seg->lv->lvid.s, NULL))) {
+               if (!(log_dlid = build_dm_uuid(mem, seg->lv->lvid.s, NULL))) {
                        log_error("Failed to build uuid for mirror LV %s.",
                                  seg->lv->name);
                        return 0;
@@ -342,7 +342,7 @@ static int _mirrored_add_target_line(struct dev_manager *dm, struct dm_pool *mem
        if (!dm_tree_node_add_mirror_target(node, len))
                return_0;
 
-       if ((r = _add_log(dm, seg, node, area_count, region_size)) <= 0) {
+       if ((r = _add_log(mem, seg, node, area_count, region_size)) <= 0) {
                stack;
                return r;
        }
@@ -422,7 +422,7 @@ static int _get_mirror_dso_path(struct cmd_context *cmd, char **dso)
        return 1;
 }
 
-static struct dm_event_handler *_create_dm_event_handler(const char *dmname,
+static struct dm_event_handler *_create_dm_event_handler(const char *dmuuid,
                                                         const char *dso,
                                                         enum dm_event_mask mask)
 {
@@ -434,7 +434,7 @@ static struct dm_event_handler *_create_dm_event_handler(const char *dmname,
        if (dm_event_handler_set_dso(dmevh, dso))
                goto fail;
 
-       if (dm_event_handler_set_dev_name(dmevh, dmname))
+       if (dm_event_handler_set_uuid(dmevh, dmuuid))
                goto fail;
 
        dm_event_handler_set_event_mask(dmevh, mask);
@@ -447,7 +447,7 @@ fail:
 
 static int _target_monitored(struct lv_segment *seg, int *pending)
 {
-       char *dso, *name;
+       char *dso, *uuid;
        struct logical_volume *lv;
        struct volume_group *vg;
        enum dm_event_mask evmask = 0;
@@ -460,10 +460,10 @@ static int _target_monitored(struct lv_segment *seg, int *pending)
        if (!_get_mirror_dso_path(vg->cmd, &dso))
                return_0;
 
-       if (!(name = build_dm_name(vg->cmd->mem, vg->name, lv->name, NULL)))
+       if (!(uuid = build_dm_uuid(vg->cmd->mem, lv->lvid.s, NULL)))
                return_0;
 
-       if (!(dmevh = _create_dm_event_handler(name, dso, DM_EVENT_ALL_ERRORS)))
+       if (!(dmevh = _create_dm_event_handler(uuid, dso, DM_EVENT_ALL_ERRORS)))
                return_0;
 
        if (dm_event_get_registered_device(dmevh, 0)) {
@@ -486,7 +486,7 @@ static int _target_monitored(struct lv_segment *seg, int *pending)
 static int _target_set_events(struct lv_segment *seg,
                              int evmask __attribute((unused)), int set)
 {
-       char *dso, *name;
+       char *dso, *uuid;
        struct logical_volume *lv;
        struct volume_group *vg;
        struct dm_event_handler *dmevh;
@@ -498,10 +498,10 @@ static int _target_set_events(struct lv_segment *seg,
        if (!_get_mirror_dso_path(vg->cmd, &dso))
                return_0;
 
-       if (!(name = build_dm_name(vg->cmd->mem, vg->name, lv->name, NULL)))
+       if (!(uuid = build_dm_uuid(vg->cmd->mem, lv->lvid.s, NULL)))
                return_0;
 
-       if (!(dmevh = _create_dm_event_handler(name, dso, DM_EVENT_ALL_ERRORS)))
+       if (!(dmevh = _create_dm_event_handler(uuid, dso, DM_EVENT_ALL_ERRORS)))
                return_0;
 
        r = set ? dm_event_register_handler(dmevh) : dm_event_unregister_handler(dmevh);
@@ -509,7 +509,7 @@ static int _target_set_events(struct lv_segment *seg,
        if (!r)
                return_0;
 
-       log_info("%s %s for events", set ? "Monitored" : "Unmonitored", name);
+       log_info("%s %s for events", set ? "Monitored" : "Unmonitored", uuid);
 
        return 1;
 }
index 5a7de96b84193f682b4ffbfac112353018d80fe7..f79c8b03905bee931b7b4ba8ccd1fd196319acfa 100644 (file)
@@ -170,6 +170,27 @@ char *build_dm_name(struct dm_pool *mem, const char *vgname,
        return r;
 }
 
+char *build_dm_uuid(struct dm_pool *mem, const char *lvid, const char *layer)
+{
+       char *dmuuid;
+       size_t len;
+
+       if (!layer)
+               layer = "";
+
+       len = sizeof(UUID_PREFIX) + strlen(lvid) + strlen(layer) + 1;
+
+       if (!(dmuuid = dm_pool_alloc(mem, len))) {
+               log_error("build_dm_name: Allocation failed for %" PRIsize_t
+                         " %s %s.", len, lvid, layer);
+               return NULL;
+       }
+
+       sprintf(dmuuid, UUID_PREFIX "%s%s%s", lvid, (*layer) ? "-" : "", layer);
+
+       return dmuuid;
+}
+
 /*
  * Copies a string, quoting double quotes with backslashes.
  */
index 7f50a97ce5528e558c054c9e65c9dca53b6fd4ca..d5e544949b1dd85f97fb556b5efecb84bf69e33d 100644 (file)
@@ -20,6 +20,7 @@
 #include <stdarg.h>
 
 #define NAME_LEN 128
+#define UUID_PREFIX "LVM-"
 
 struct pool;
 
@@ -28,6 +29,8 @@ int emit_to_buffer(char **buffer, size_t *size, const char *fmt, ...)
 
 char *build_dm_name(struct dm_pool *mem, const char *vg,
                     const char *lv, const char *layer);
+char *build_dm_uuid(struct dm_pool *mem, const char *lvid,
+                   const char *layer);
 
 int validate_name(const char *n);
 
index 0a8212aaca6f088234b2d57867395d1c31041064..62766cb2bac01d826d2dc56f35acc0344f464070 100644 (file)
@@ -185,7 +185,7 @@ static int _get_snapshot_dso_path(struct cmd_context *cmd, char **dso)
        return 1;
 }
 
-static struct dm_event_handler *_create_dm_event_handler(const char *dmname,
+static struct dm_event_handler *_create_dm_event_handler(const char *dmuuid,
                                                         const char *dso,
                                                         const int timeout,
                                                         enum dm_event_mask mask)
@@ -198,7 +198,7 @@ static struct dm_event_handler *_create_dm_event_handler(const char *dmname,
        if (dm_event_handler_set_dso(dmevh, dso))
                goto fail;
 
-       if (dm_event_handler_set_dev_name(dmevh, dmname))
+       if (dm_event_handler_set_uuid(dmevh, dmuuid))
                goto fail;
 
        dm_event_handler_set_timeout(dmevh, timeout);
@@ -212,7 +212,7 @@ fail:
 
 static int _target_registered(struct lv_segment *seg, int *pending)
 {
-       char *dso, *name;
+       char *dso, *uuid;
        struct logical_volume *lv;
        struct volume_group *vg;
        enum dm_event_mask evmask = 0;
@@ -225,10 +225,10 @@ static int _target_registered(struct lv_segment *seg, int *pending)
        if (!_get_snapshot_dso_path(vg->cmd, &dso))
                return_0;
 
-       if (!(name = build_dm_name(vg->cmd->mem, vg->name, seg->cow->name, NULL)))
+       if (!(uuid = build_dm_uuid(vg->cmd->mem, seg->cow->lvid.s, NULL)))
                return_0;
 
-       if (!(dmevh = _create_dm_event_handler(name, dso, 0, DM_EVENT_ALL_ERRORS)))
+       if (!(dmevh = _create_dm_event_handler(uuid, dso, 0, DM_EVENT_ALL_ERRORS)))
                return_0;
 
        if (dm_event_get_registered_device(dmevh, 0)) {
@@ -251,7 +251,7 @@ static int _target_registered(struct lv_segment *seg, int *pending)
 static int _target_set_events(struct lv_segment *seg,
                              int events __attribute((unused)), int set)
 {
-       char *dso, *name;
+       char *dso, *uuid;
        struct volume_group *vg = seg->lv->vg;
        struct dm_event_handler *dmevh;
        int r;
@@ -259,11 +259,11 @@ static int _target_set_events(struct lv_segment *seg,
        if (!_get_snapshot_dso_path(vg->cmd, &dso))
                return_0;
 
-       if (!(name = build_dm_name(vg->cmd->mem, vg->name, seg->cow->name, NULL)))
+       if (!(uuid = build_dm_uuid(vg->cmd->mem, seg->cow->lvid.s, NULL)))
                return_0;
 
        /* FIXME: make timeout configurable */
-       if (!(dmevh = _create_dm_event_handler(name, dso, 10,
+       if (!(dmevh = _create_dm_event_handler(uuid, dso, 10,
                DM_EVENT_ALL_ERRORS|DM_EVENT_TIMEOUT)))
                return_0;
 
@@ -272,7 +272,7 @@ static int _target_set_events(struct lv_segment *seg,
        if (!r)
                return_0;
 
-       log_info("%s %s for events", set ? "Registered" : "Unregistered", name);
+       log_info("%s %s for events", set ? "Registered" : "Unregistered", uuid);
 
        return 1;
 }
This page took 0.061812 seconds and 5 git commands to generate.