]> sourceware.org Git - lvm2.git/commitdiff
activate: check all snap segs are inactive
authorZdenek Kabelac <zkabelac@redhat.com>
Wed, 5 Nov 2014 10:53:11 +0000 (11:53 +0100)
committerZdenek Kabelac <zkabelac@redhat.com>
Wed, 5 Nov 2014 14:30:58 +0000 (15:30 +0100)
When deactivating origin, we may have possibly left table in broken state,
where origin is not active, but snapshot volume is still present.

Let's ensure deactivation of origin detects also all associated
snapshots are inactive - otherwise do not skip deactivation.
(so i.e. 'vgchange -an' would detect errors)

WHATS_NEW
lib/activate/activate.c

index 03baa06d5f8cbbf799295410b402172d4f7b7e20..06d3b9bb7ee59b44a6060bd01e093dc694b5e12b 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.112 - 
 =====================================
+  Deactivation of snapshot origin detects and deactivates left-over snapshots.
   Properly report error when taking snapshot of any cache type LV.
   Add basic thread debugging messages to dmeventd.
   Include threads being shutdown in dmeventd device registration responses.
index c2a662f0349fe5c823906aab3ac26484c6d82cd3..ac6330f94ef259e51b19569a80160b70d69b0095 100644 (file)
@@ -2002,6 +2002,7 @@ int lv_deactivate(struct cmd_context *cmd, const char *lvid_s, const struct logi
        const struct logical_volume *lv_to_free = NULL;
        struct lvinfo info;
        static const struct lv_activate_opts laopts = { .skip_in_use = 1 };
+       struct dm_list *snh;
        int r = 0;
 
        if (!activation())
@@ -2023,7 +2024,19 @@ int lv_deactivate(struct cmd_context *cmd, const char *lvid_s, const struct logi
 
        if (!info.exists) {
                r = 1;
-               goto out;
+               /* Check attached snapshot segments are also inactive */
+               dm_list_iterate(snh, &lv->snapshot_segs) {
+                       if (!lv_info(cmd, dm_list_struct_base(snh, struct lv_segment, origin_list)->cow,
+                                    0, &info, 0, 0))
+                               goto_out;
+                       if (info.exists) {
+                               r = 0; /* Snapshot left in table? */
+                               break;
+                       }
+               }
+
+               if (r)
+                       goto out;
        }
 
        if (lv_is_visible(lv) || lv_is_virtual_origin(lv) ||
This page took 0.047549 seconds and 5 git commands to generate.