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.
_dm_event_handler_clear_dev_info(dmevh);
dmevh->uuid = dm_strdup(uuid);
- if (!dmevh->dev_name)
+ if (!dmevh->uuid)
return -ENOMEM;
return 0;
}
#include <dirent.h>
#define MAX_TARGET_PARAMSIZE 50000
-#define UUID_PREFIX "LVM-"
typedef enum {
PRELOAD,
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));
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;
}
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;
}
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,
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;
/*
/* 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;
}
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);
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,
(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));
{
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))
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,
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;
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 */
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. */
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
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;
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;
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;
}
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)
{
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);
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;
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)) {
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;
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);
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;
}
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.
*/
#include <stdarg.h>
#define NAME_LEN 128
+#define UUID_PREFIX "LVM-"
struct pool;
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);
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)
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);
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;
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)) {
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;
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;
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;
}