1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

dmeventd: Start merging back replacement unmonitor code.

This commit is contained in:
Alasdair G Kergon 2016-08-23 11:30:34 +01:00
parent 952e413328
commit 97ee5a1cd3

View File

@ -1690,48 +1690,6 @@ int target_register_events(struct cmd_context *cmd, const char *dso, const struc
#endif
#ifdef DMEVENTD
/* FIXME Restructure all this code so that unmonitoring works cleanly regardless of current target type. */
static int _segment_independent_unmonitor(struct cmd_context *cmd, const struct logical_volume *lv, const char *dso)
{
int i, pending = 0, monitored;
int r;
log_verbose("Not monitoring %s with %s%s", display_lvname(lv), dso, test_mode() ? " [Test mode: skipping this]" : "");
/* FIXME Test mode should really continue a bit further. */
if (test_mode())
return 1;
if (!target_register_events(cmd, dso, lv, 0, 0, 0)) {
log_error("%s: segment unmonitoring function failed.",
display_lvname(lv));
return 0;
}
/* Check [un]monitor results */
/* Try a couple times if pending, but not forever... */
for (i = 0; i < 40; i++) {
pending = 0;
monitored = _device_registered_with_dmeventd(cmd, lv, &pending, NULL);
if (pending || monitored)
log_very_verbose("%s unmonitoring still pending: waiting...",
display_lvname(lv));
else
break;
usleep(10000 * i);
}
r = !monitored;
if (!r && !error_message_produced())
log_error("Not monitoring %s failed.", display_lvname(lv));
return r;
}
#endif
/*
* Returns 0 if an attempt to (un)monitor the device failed.
* Returns 1 otherwise.
@ -1750,6 +1708,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
static const struct lv_activate_opts zlaopts = { 0 };
struct lvinfo info;
const char *dso;
int new_unmonitor;
if (!laopts)
laopts = &zlaopts;
@ -1867,6 +1826,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
monitored = (pending) ? 0 : monitored;
monitor_fn = NULL;
new_unmonitor = 0;
if (monitor) {
if (monitored)
@ -1878,30 +1838,44 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
log_verbose("%s already not monitored.", display_lvname(lv));
else if (*dso)
/*
* Divert unmonitor away from code that depends on the new segment
* Divert unmonitor away from code that depends on the new segment
* type instead of the existing one if it's changing.
*/
return _segment_independent_unmonitor(cmd, lv, dso);
new_unmonitor = 1;
else if (seg->segtype->ops->target_unmonitor_events)
monitor_fn = seg->segtype->ops->target_unmonitor_events;
}
/* Do [un]monitor */
if (!monitor_fn)
if (new_unmonitor) {
log_verbose("Not monitoring %s with %s%s", display_lvname(lv), dso, test_mode() ? " [Test mode: skipping this]" : "");
/* FIXME Test mode should really continue a bit further. */
if (test_mode())
return 1;
if (!target_register_events(cmd, dso, lv, 0, 0, 0)) {
log_error("%s: segment unmonitoring failed.",
display_lvname(lv));
return 0;
}
} else if (!monitor_fn)
continue;
else if (monitor_fn) {
log_verbose("%sonitoring %s%s", monitor ? "M" : "Not m", display_lvname(lv),
test_mode() ? " [Test mode: skipping this]" : "");
log_verbose("%sonitoring %s%s", monitor ? "M" : "Not m", display_lvname(lv),
test_mode() ? " [Test mode: skipping this]" : "");
/* FIXME Test mode should really continue a bit further. */
if (test_mode())
continue;
/* FIXME Test mode should really continue a bit further. */
if (test_mode())
continue;
/* FIXME specify events */
if (!monitor_fn(seg, 0)) {
log_error("%s: %s segment monitoring function failed.",
display_lvname(lv), seg->segtype->name);
return 0;
/* FIXME specify events */
if (!monitor_fn(seg, 0)) {
log_error("%s: %s segment monitoring function failed.",
display_lvname(lv), seg->segtype->name);
return 0;
}
}
/* Check [un]monitor results */