mirror of
git://sourceware.org/git/lvm2.git
synced 2025-03-10 16:58:47 +03:00
Use UUIDs instead of names while processing event handlers.
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).
This commit is contained in:
parent
cb296d5bb5
commit
bda3982016
@ -1,5 +1,6 @@
|
|||||||
Version 2.02.63 -
|
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.
|
Only pass visible LVs to tools in cmdline VG name/tag expansions without -a.
|
||||||
Use typedefs for toollib process_each functions.
|
Use typedefs for toollib process_each functions.
|
||||||
Use C locales and use_mlockall for clvmd.
|
Use C locales and use_mlockall for clvmd.
|
||||||
|
@ -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);
|
_dm_event_handler_clear_dev_info(dmevh);
|
||||||
|
|
||||||
dmevh->uuid = dm_strdup(uuid);
|
dmevh->uuid = dm_strdup(uuid);
|
||||||
if (!dmevh->dev_name)
|
if (!dmevh->uuid)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
|
||||||
#define MAX_TARGET_PARAMSIZE 50000
|
#define MAX_TARGET_PARAMSIZE 50000
|
||||||
#define UUID_PREFIX "LVM-"
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
PRELOAD,
|
PRELOAD,
|
||||||
@ -59,32 +58,6 @@ struct lv_layer {
|
|||||||
const char *old_name;
|
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)
|
static int _read_only_lv(struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
return (!(lv->vg->status & LVM_WRITE) || !(lv->status & LVM_WRITE));
|
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;
|
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);
|
log_error("dlid build failed for %s", lv->name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -258,7 +231,7 @@ static const struct dm_info *_cached_info(struct dm_pool *mem,
|
|||||||
struct dm_tree_node *dnode;
|
struct dm_tree_node *dnode;
|
||||||
const struct dm_info *dinfo;
|
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);
|
log_error("dlid build failed for %s", lv->name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -370,7 +343,7 @@ static int _lv_has_target_type(struct dev_manager *dm,
|
|||||||
char *type = NULL;
|
char *type = NULL;
|
||||||
char *params = 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;
|
return_0;
|
||||||
|
|
||||||
if (!(dmt = _setup_task(NULL, dlid, 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)))
|
if (!(name = build_dm_name(dm->mem, lv->vg->name, lv->name, NULL)))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
if (!(dlid = build_dlid(dm, lv->lvid.s, NULL)))
|
if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, NULL)))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -667,7 +640,7 @@ int dev_manager_mirror_percent(struct dev_manager *dm,
|
|||||||
|
|
||||||
/* FIXME dm_pool_free ? */
|
/* 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);
|
log_error("dlid build failed for %s", lv->name);
|
||||||
return 0;
|
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)))
|
if (!(name = build_dm_name(dm->mem, lv->vg->name, lv->name, layer)))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
if (!(dlid = build_dlid(dm, lv->lvid.s, layer)))
|
if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer)))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
log_debug("Getting device info for %s [%s]", name, dlid);
|
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);
|
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;
|
return_NULL;
|
||||||
|
|
||||||
if (!(name = build_dm_name(dm->mem, seg->lv->vg->name,
|
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 +
|
(seg_pv(seg, s)->pe_start +
|
||||||
(extent_size * seg_pe(seg, s))));
|
(extent_size * seg_pe(seg, s))));
|
||||||
else if (seg_type(seg, s) == AREA_LV) {
|
else if (seg_type(seg, s) == AREA_LV) {
|
||||||
if (!(dlid = build_dlid(dm,
|
if (!(dlid = build_dm_uuid(dm->mem,
|
||||||
seg_lv(seg, s)->lvid.s,
|
seg_lv(seg, s)->lvid.s,
|
||||||
NULL)))
|
NULL)))
|
||||||
return_0;
|
return_0;
|
||||||
dm_tree_node_add_target_area(node, NULL, dlid,
|
dm_tree_node_add_target_area(node, NULL, dlid,
|
||||||
extent_size * seg_le(seg, s));
|
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;
|
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;
|
return_0;
|
||||||
|
|
||||||
if (!dm_tree_node_add_snapshot_origin_target(dnode, lv->size, real_dlid))
|
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;
|
const char *origin_dlid, *cow_dlid, *merge_dlid;
|
||||||
struct lv_segment *merging_cow_seg = find_merging_cow(lv);
|
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;
|
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;
|
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;
|
return_0;
|
||||||
|
|
||||||
if (!dm_tree_node_add_snapshot_merge_target(dnode, lv->size, origin_dlid,
|
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;
|
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;
|
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;
|
return_0;
|
||||||
|
|
||||||
size = (uint64_t) snap_seg->len * snap_seg->origin->vg->extent_size;
|
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)))
|
if (!(name = build_dm_name(dm->mem, lv->vg->name, lv->name, layer)))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
if (!(dlid = build_dlid(dm, lv->lvid.s, layer)))
|
if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer)))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
/* We've already processed this node if it already has a context ptr */
|
/* 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;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(dlid = build_dlid(dm, lv->lvid.s, NULL)))
|
if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, NULL)))
|
||||||
goto_out;
|
goto_out;
|
||||||
|
|
||||||
/* Only process nodes with uuid of "LVM-" plus VG id. */
|
/* Only process nodes with uuid of "LVM-" plus VG id. */
|
||||||
|
@ -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,
|
int build_dev_string(struct dev_manager *dm, char *dlid, char *devbuf,
|
||||||
size_t bufsize, const char *desc);
|
size_t bufsize, const char *desc);
|
||||||
|
|
||||||
char *build_dlid(struct dev_manager *dm, const char *lvid, const char *layer);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -239,7 +239,7 @@ static int _mirrored_target_percent(void **target_state,
|
|||||||
return 1;
|
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)
|
struct dm_tree_node *node, uint32_t area_count, uint32_t region_size)
|
||||||
{
|
{
|
||||||
unsigned clustered = 0;
|
unsigned clustered = 0;
|
||||||
@ -256,14 +256,14 @@ static int _add_log(struct dev_manager *dm, struct lv_segment *seg,
|
|||||||
|
|
||||||
if (seg->log_lv) {
|
if (seg->log_lv) {
|
||||||
/* If disk log, use its UUID */
|
/* 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.",
|
log_error("Failed to build uuid for log LV %s.",
|
||||||
seg->log_lv->name);
|
seg->log_lv->name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* If core log, use mirror's UUID and set DM_CORELOG flag */
|
/* 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.",
|
log_error("Failed to build uuid for mirror LV %s.",
|
||||||
seg->lv->name);
|
seg->lv->name);
|
||||||
return 0;
|
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))
|
if (!dm_tree_node_add_mirror_target(node, len))
|
||||||
return_0;
|
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;
|
stack;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
@ -422,7 +422,7 @@ static int _get_mirror_dso_path(struct cmd_context *cmd, char **dso)
|
|||||||
return 1;
|
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 char *dso,
|
||||||
enum dm_event_mask mask)
|
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))
|
if (dm_event_handler_set_dso(dmevh, dso))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (dm_event_handler_set_dev_name(dmevh, dmname))
|
if (dm_event_handler_set_uuid(dmevh, dmuuid))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
dm_event_handler_set_event_mask(dmevh, mask);
|
dm_event_handler_set_event_mask(dmevh, mask);
|
||||||
@ -447,7 +447,7 @@ fail:
|
|||||||
|
|
||||||
static int _target_monitored(struct lv_segment *seg, int *pending)
|
static int _target_monitored(struct lv_segment *seg, int *pending)
|
||||||
{
|
{
|
||||||
char *dso, *name;
|
char *dso, *uuid;
|
||||||
struct logical_volume *lv;
|
struct logical_volume *lv;
|
||||||
struct volume_group *vg;
|
struct volume_group *vg;
|
||||||
enum dm_event_mask evmask = 0;
|
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))
|
if (!_get_mirror_dso_path(vg->cmd, &dso))
|
||||||
return_0;
|
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;
|
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;
|
return_0;
|
||||||
|
|
||||||
if (dm_event_get_registered_device(dmevh, 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,
|
static int _target_set_events(struct lv_segment *seg,
|
||||||
int evmask __attribute((unused)), int set)
|
int evmask __attribute((unused)), int set)
|
||||||
{
|
{
|
||||||
char *dso, *name;
|
char *dso, *uuid;
|
||||||
struct logical_volume *lv;
|
struct logical_volume *lv;
|
||||||
struct volume_group *vg;
|
struct volume_group *vg;
|
||||||
struct dm_event_handler *dmevh;
|
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))
|
if (!_get_mirror_dso_path(vg->cmd, &dso))
|
||||||
return_0;
|
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;
|
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;
|
return_0;
|
||||||
|
|
||||||
r = set ? dm_event_register_handler(dmevh) : dm_event_unregister_handler(dmevh);
|
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)
|
if (!r)
|
||||||
return_0;
|
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 1;
|
||||||
}
|
}
|
||||||
|
@ -170,6 +170,27 @@ char *build_dm_name(struct dm_pool *mem, const char *vgname,
|
|||||||
return r;
|
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.
|
* Copies a string, quoting double quotes with backslashes.
|
||||||
*/
|
*/
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
#define NAME_LEN 128
|
#define NAME_LEN 128
|
||||||
|
#define UUID_PREFIX "LVM-"
|
||||||
|
|
||||||
struct pool;
|
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,
|
char *build_dm_name(struct dm_pool *mem, const char *vg,
|
||||||
const char *lv, const char *layer);
|
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);
|
int validate_name(const char *n);
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ static int _get_snapshot_dso_path(struct cmd_context *cmd, char **dso)
|
|||||||
return 1;
|
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 char *dso,
|
||||||
const int timeout,
|
const int timeout,
|
||||||
enum dm_event_mask mask)
|
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))
|
if (dm_event_handler_set_dso(dmevh, dso))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (dm_event_handler_set_dev_name(dmevh, dmname))
|
if (dm_event_handler_set_uuid(dmevh, dmuuid))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
dm_event_handler_set_timeout(dmevh, timeout);
|
dm_event_handler_set_timeout(dmevh, timeout);
|
||||||
@ -212,7 +212,7 @@ fail:
|
|||||||
|
|
||||||
static int _target_registered(struct lv_segment *seg, int *pending)
|
static int _target_registered(struct lv_segment *seg, int *pending)
|
||||||
{
|
{
|
||||||
char *dso, *name;
|
char *dso, *uuid;
|
||||||
struct logical_volume *lv;
|
struct logical_volume *lv;
|
||||||
struct volume_group *vg;
|
struct volume_group *vg;
|
||||||
enum dm_event_mask evmask = 0;
|
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))
|
if (!_get_snapshot_dso_path(vg->cmd, &dso))
|
||||||
return_0;
|
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;
|
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;
|
return_0;
|
||||||
|
|
||||||
if (dm_event_get_registered_device(dmevh, 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,
|
static int _target_set_events(struct lv_segment *seg,
|
||||||
int events __attribute((unused)), int set)
|
int events __attribute((unused)), int set)
|
||||||
{
|
{
|
||||||
char *dso, *name;
|
char *dso, *uuid;
|
||||||
struct volume_group *vg = seg->lv->vg;
|
struct volume_group *vg = seg->lv->vg;
|
||||||
struct dm_event_handler *dmevh;
|
struct dm_event_handler *dmevh;
|
||||||
int r;
|
int r;
|
||||||
@ -259,11 +259,11 @@ static int _target_set_events(struct lv_segment *seg,
|
|||||||
if (!_get_snapshot_dso_path(vg->cmd, &dso))
|
if (!_get_snapshot_dso_path(vg->cmd, &dso))
|
||||||
return_0;
|
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;
|
return_0;
|
||||||
|
|
||||||
/* FIXME: make timeout configurable */
|
/* 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)))
|
DM_EVENT_ALL_ERRORS|DM_EVENT_TIMEOUT)))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
@ -272,7 +272,7 @@ static int _target_set_events(struct lv_segment *seg,
|
|||||||
if (!r)
|
if (!r)
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
log_info("%s %s for events", set ? "Registered" : "Unregistered", name);
|
log_info("%s %s for events", set ? "Registered" : "Unregistered", uuid);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user