mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-18 10:04:20 +03:00
merge _target_*register_events
introduce _create_dm_event_handler()
This commit is contained in:
parent
c63c19a73e
commit
0e2084da9c
@ -368,7 +368,7 @@ static int _mirrored_target_present(const struct lv_segment *seg __attribute((un
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DMEVENTD
|
#ifdef DMEVENTD
|
||||||
static int _setup_registration(struct cmd_context *cmd, char **dso)
|
static int _get_mirror_dso_path(struct cmd_context *cmd, char **dso)
|
||||||
{
|
{
|
||||||
char *path;
|
char *path;
|
||||||
const char *libpath;
|
const char *libpath;
|
||||||
@ -388,6 +388,29 @@ static int _setup_registration(struct cmd_context *cmd, char **dso)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct dm_event_handler *_create_dm_event_handler(const char *dmname,
|
||||||
|
const char *dso,
|
||||||
|
enum dm_event_mask mask)
|
||||||
|
{
|
||||||
|
struct dm_event_handler *dmevh;
|
||||||
|
|
||||||
|
if (!(dmevh = dm_event_handler_create()))
|
||||||
|
return_0;
|
||||||
|
|
||||||
|
if (dm_event_handler_set_dso(dmevh, dso))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (dm_event_handler_set_dev_name(dmevh, dmname))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
dm_event_handler_set_event_mask(dmevh, mask);
|
||||||
|
return dmevh;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
dm_event_handler_destroy(dmevh);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
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, *name;
|
||||||
@ -400,21 +423,15 @@ static int _target_registered(struct lv_segment *seg, int *pending)
|
|||||||
vg = lv->vg;
|
vg = lv->vg;
|
||||||
|
|
||||||
*pending = 0;
|
*pending = 0;
|
||||||
if (!_setup_registration(vg->cmd, &dso)) {
|
if (!_get_mirror_dso_path(vg->cmd, &dso))
|
||||||
stack;
|
return_0;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(name = build_dm_name(vg->cmd->mem, vg->name, lv->name, NULL)))
|
if (!(name = build_dm_name(vg->cmd->mem, vg->name, lv->name, NULL)))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
if (!(dmevh = dm_event_handler_create()))
|
if (!(dmevh = _create_dm_event_handler(name, dso, DM_EVENT_ALL_ERRORS)))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
dm_event_handler_set_dso(dmevh, dso);
|
|
||||||
dm_event_handler_set_dev_name(dmevh, name);
|
|
||||||
dm_event_handler_set_event_mask(dmevh, DM_EVENT_ALL_ERRORS);
|
|
||||||
|
|
||||||
if (dm_event_get_registered_device(dmevh, 0)) {
|
if (dm_event_get_registered_device(dmevh, 0)) {
|
||||||
dm_event_handler_destroy(dmevh);
|
dm_event_handler_destroy(dmevh);
|
||||||
return 0;
|
return 0;
|
||||||
@ -432,79 +449,50 @@ static int _target_registered(struct lv_segment *seg, int *pending)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME This gets run while suspended and performs banned operations. */
|
/* FIXME This gets run while suspended and performs banned operations. */
|
||||||
/* FIXME Merge these two functions */
|
static int _target_set_events(struct cmd_context *cmd,
|
||||||
static int _target_register_events(struct cmd_context *cmd,
|
|
||||||
struct lv_segment *seg,
|
struct lv_segment *seg,
|
||||||
int evmask)
|
int evmask, int set)
|
||||||
{
|
{
|
||||||
char *dso, *name;
|
char *dso, *name;
|
||||||
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;
|
||||||
|
int r;
|
||||||
|
|
||||||
lv = seg->lv;
|
lv = seg->lv;
|
||||||
vg = lv->vg;
|
vg = lv->vg;
|
||||||
|
|
||||||
if (!_setup_registration(cmd, &dso)) {
|
if (!_get_mirror_dso_path(cmd, &dso))
|
||||||
stack;
|
return_0;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(name = build_dm_name(cmd->mem, vg->name, lv->name, NULL)))
|
if (!(name = build_dm_name(cmd->mem, vg->name, lv->name, NULL)))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
if (!(dmevh = dm_event_handler_create()))
|
if (!(dmevh = _create_dm_event_handler(name, dso, DM_EVENT_ALL_ERRORS)))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
dm_event_handler_set_dso(dmevh, dso);
|
r = set ? dm_event_register_handler(dmevh) : dm_event_unregister_handler(dmevh);
|
||||||
dm_event_handler_set_dev_name(dmevh, name);
|
|
||||||
dm_event_handler_set_event_mask(dmevh, DM_EVENT_ALL_ERRORS);
|
|
||||||
if (!dm_event_register_handler(dmevh)) {
|
|
||||||
dm_event_handler_destroy(dmevh);
|
dm_event_handler_destroy(dmevh);
|
||||||
|
if (!r)
|
||||||
return_0;
|
return_0;
|
||||||
}
|
|
||||||
dm_event_handler_destroy(dmevh);
|
|
||||||
|
|
||||||
log_info("Registered %s for events", name);
|
log_info("%s %s for events", set ? "Registered" : "Unregistered", name);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _target_register_events(struct cmd_context *cmd,
|
||||||
|
struct lv_segment *seg,
|
||||||
|
int events)
|
||||||
|
{
|
||||||
|
return _target_set_events(cmd, seg, events, 1);
|
||||||
|
}
|
||||||
|
|
||||||
static int _target_unregister_events(struct cmd_context *cmd,
|
static int _target_unregister_events(struct cmd_context *cmd,
|
||||||
struct lv_segment *seg,
|
struct lv_segment *seg,
|
||||||
int evmask)
|
int events)
|
||||||
{
|
{
|
||||||
char *dso;
|
return _target_set_events(cmd, seg, events, 0);
|
||||||
char *name;
|
|
||||||
struct logical_volume *lv;
|
|
||||||
struct volume_group *vg;
|
|
||||||
struct dm_event_handler *dmevh;
|
|
||||||
|
|
||||||
lv = seg->lv;
|
|
||||||
vg = lv->vg;
|
|
||||||
|
|
||||||
/* FIXME Remove this and use handle to avoid config file race */
|
|
||||||
if (!_setup_registration(cmd, &dso))
|
|
||||||
return_0;
|
|
||||||
|
|
||||||
if (!(name = build_dm_name(cmd->mem, vg->name, lv->name, NULL)))
|
|
||||||
return_0;
|
|
||||||
|
|
||||||
if (!(dmevh = dm_event_handler_create()))
|
|
||||||
return_0;
|
|
||||||
|
|
||||||
dm_event_handler_set_dso(dmevh, dso);
|
|
||||||
dm_event_handler_set_dev_name(dmevh, name);
|
|
||||||
dm_event_handler_set_event_mask(dmevh, DM_EVENT_ALL_ERRORS);
|
|
||||||
if (!dm_event_unregister_handler(dmevh)) {
|
|
||||||
dm_event_handler_destroy(dmevh);
|
|
||||||
return_0;
|
|
||||||
}
|
|
||||||
dm_event_handler_destroy(dmevh);
|
|
||||||
|
|
||||||
log_info("Unregistered %s for events", name);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* DMEVENTD */
|
#endif /* DMEVENTD */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user