From f92b4f9482b4022cf279262a524bc236c5a5a65a Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Tue, 17 Aug 2010 01:16:41 +0000 Subject: [PATCH] Monitor origin -real device below snapshot instead of overlay device. (brassow) --- WHATS_NEW | 1 + lib/activate/activate.c | 21 ++++++++++----------- lib/activate/activate.h | 5 +++-- lib/mirror/mirrored.c | 5 +++-- lib/snapshot/snapshot.c | 5 +++-- tools/vgchange.c | 2 +- 6 files changed, 21 insertions(+), 18 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index ffacab7c5..d622e8d48 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.73 - ================================ + Monitor origin -real device below snapshot instead of overlay device. Don't really change monitoring status when in test mode. Fix some exit statuses when starting/stopping monitoring fails. Enable snapshot monitoring by default when dmeventd is enabled. diff --git a/lib/activate/activate.c b/lib/activate/activate.c index 68ddfefaa..681eba704 100644 --- a/lib/activate/activate.c +++ b/lib/activate/activate.c @@ -770,7 +770,8 @@ char *get_monitor_dso_path(struct cmd_context *cmd, const char *libpath) return path; } -int target_registered_with_dmeventd(struct cmd_context *cmd, const char *dso, const char *lvid, int *pending) +int target_registered_with_dmeventd(struct cmd_context *cmd, const char *dso, + struct logical_volume *lv, int *pending) { char *uuid; enum dm_event_mask evmask = 0; @@ -781,7 +782,8 @@ int target_registered_with_dmeventd(struct cmd_context *cmd, const char *dso, co if (!dso) return_0; - if (!(uuid = build_dm_uuid(cmd->mem, lvid, NULL))) + /* We always monitor the "real" device, never the "snapshot-origin" itself. */ + if (!(uuid = build_dm_uuid(cmd->mem, lv->lvid.s, lv_is_origin(lv) ? "real" : NULL))) return_0; if (!(dmevh = _create_dm_event_handler(cmd, uuid, dso, 0, DM_EVENT_ALL_ERRORS))) @@ -803,7 +805,7 @@ int target_registered_with_dmeventd(struct cmd_context *cmd, const char *dso, co return evmask; } -int target_register_events(struct cmd_context *cmd, const char *dso, const char *lvid, +int target_register_events(struct cmd_context *cmd, const char *dso, struct logical_volume *lv, int evmask __attribute__((unused)), int set, int timeout) { char *uuid; @@ -813,7 +815,8 @@ int target_register_events(struct cmd_context *cmd, const char *dso, const char if (!dso) return_0; - if (!(uuid = build_dm_uuid(cmd->mem, lvid, NULL))) + /* We always monitor the "real" device, never the "snapshot-origin" itself. */ + if (!(uuid = build_dm_uuid(cmd->mem, lv->lvid.s, lv_is_origin(lv) ? "real" : NULL))) return_0; if (!(dmevh = _create_dm_event_handler(cmd, uuid, dso, timeout, @@ -869,18 +872,14 @@ int monitor_dev_for_events(struct cmd_context *cmd, /* * In case this LV is a snapshot origin, we instead monitor - * each of its respective snapshots (the origin itself does - * not need to be monitored). - * - * TODO: This may change when snapshots of mirrors are allowed. + * each of its respective snapshots. The origin itself may + * also need to be monitored if it is a mirror, for example. */ - if (lv_is_origin(lv)) { + if (lv_is_origin(lv)) dm_list_iterate_safe(snh, snht, &lv->snapshot_segs) if (!monitor_dev_for_events(cmd, dm_list_struct_base(snh, struct lv_segment, origin_list)->cow, monitor)) r = 0; - return r; - } /* * If the volume is mirrored and its log is also mirrored, monitor diff --git a/lib/activate/activate.h b/lib/activate/activate.h index d908eefd6..1a0c37cbe 100644 --- a/lib/activate/activate.h +++ b/lib/activate/activate.h @@ -105,8 +105,9 @@ int monitor_dev_for_events(struct cmd_context *cmd, #ifdef DMEVENTD # include "libdevmapper-event.h" char *get_monitor_dso_path(struct cmd_context *cmd, const char *libpath); -int target_registered_with_dmeventd(struct cmd_context *cmd, const char *libpath, const char *lvid, int *pending); -int target_register_events(struct cmd_context *cmd, const char *dso, const char *lvid, +int target_registered_with_dmeventd(struct cmd_context *cmd, const char *libpath, + struct logical_volume *lv, int *pending); +int target_register_events(struct cmd_context *cmd, const char *dso, struct logical_volume *lv, int evmask __attribute__((unused)), int set, int timeout); #endif diff --git a/lib/mirror/mirrored.c b/lib/mirror/mirrored.c index 9b89ca28b..2745c14c0 100644 --- a/lib/mirror/mirrored.c +++ b/lib/mirror/mirrored.c @@ -548,17 +548,18 @@ static const char *_get_mirror_dso_path(struct cmd_context *cmd) DEFAULT_DMEVENTD_MIRROR_LIB)); } +/* FIXME Cache this */ static int _target_registered(struct lv_segment *seg, int *pending) { return target_registered_with_dmeventd(seg->lv->vg->cmd, _get_mirror_dso_path(seg->lv->vg->cmd), - seg->lv->lvid.s, pending); + seg->lv, pending); } /* FIXME This gets run while suspended and performs banned operations. */ static int _target_set_events(struct lv_segment *seg, int evmask, int set) { return target_register_events(seg->lv->vg->cmd, _get_mirror_dso_path(seg->lv->vg->cmd), - seg->lv->lvid.s, evmask, set, 0); + seg->lv, evmask, set, 0); } static int _target_monitor_events(struct lv_segment *seg, int events) diff --git a/lib/snapshot/snapshot.c b/lib/snapshot/snapshot.c index 0dcd800c6..92f891111 100644 --- a/lib/snapshot/snapshot.c +++ b/lib/snapshot/snapshot.c @@ -168,10 +168,11 @@ static const char *_get_snapshot_dso_path(struct cmd_context *cmd) DEFAULT_DMEVENTD_SNAPSHOT_LIB)); } +/* FIXME Cache this */ static int _target_registered(struct lv_segment *seg, int *pending) { return target_registered_with_dmeventd(seg->lv->vg->cmd, _get_snapshot_dso_path(seg->lv->vg->cmd), - seg->cow->lvid.s, pending); + seg->cow, pending); } /* FIXME This gets run while suspended and performs banned operations. */ @@ -179,7 +180,7 @@ static int _target_set_events(struct lv_segment *seg, int evmask, int set) { /* FIXME Make timeout (10) configurable */ return target_register_events(seg->lv->vg->cmd, _get_snapshot_dso_path(seg->lv->vg->cmd), - seg->cow->lvid.s, evmask, set, 10); + seg->cow, evmask, set, 10); } static int _target_register_events(struct lv_segment *seg, diff --git a/tools/vgchange.c b/tools/vgchange.c index fbd403f2e..36ff0c83b 100644 --- a/tools/vgchange.c +++ b/tools/vgchange.c @@ -190,7 +190,7 @@ static int _vgchange_background_polling(struct cmd_context *cmd, struct volume_g static int _vgchange_available(struct cmd_context *cmd, struct volume_group *vg) { - int lv_open, active, monitored; + int lv_open, active, monitored = 0; int available, ret_max = ECMD_PROCESSED; int activate = 1; -- 2.43.5