]> sourceware.org Git - lvm2.git/commitdiff
Monitor origin -real device below snapshot instead of overlay device. (brassow)
authorAlasdair Kergon <agk@redhat.com>
Tue, 17 Aug 2010 01:16:41 +0000 (01:16 +0000)
committerAlasdair Kergon <agk@redhat.com>
Tue, 17 Aug 2010 01:16:41 +0000 (01:16 +0000)
WHATS_NEW
lib/activate/activate.c
lib/activate/activate.h
lib/mirror/mirrored.c
lib/snapshot/snapshot.c
tools/vgchange.c

index ffacab7c56aa4d2b42fbb3bde83500e5259a2515..d622e8d48b1db95bcbdcf7af063ad994f55d1f8c 100644 (file)
--- 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.
index 68ddfefaaf047308739174ecca46d4f60aa52516..681eba70447c714c4bb6bf22a12c43c23203643c 100644 (file)
@@ -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
index d908eefd612aef4736adf511f6477c0b21a1cff9..1a0c37cbe18ed91c19b39c031fb1dd91d3186d72 100644 (file)
@@ -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
 
index 9b89ca28b1d201a39a134ad124585fe2ab78b674..2745c14c0928faefbba5fa4cdc3fcce7fd75a9da 100644 (file)
@@ -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)
index 0dcd800c641d61a0aa960c3b10a129b329ce17fa..92f891111d13dfab60a07a7d4e363e2a340aad49 100644 (file)
@@ -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,
index fbd403f2ebb9ce03a87f176fcb0d08da641e876a..36ff0c83b131f2e1367166f61d7b3889108789d4 100644 (file)
@@ -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;
 
This page took 0.055932 seconds and 5 git commands to generate.