]> sourceware.org Git - lvm2.git/commitdiff
thin: reload external origin with last thin
authorZdenek Kabelac <zkabelac@redhat.com>
Sat, 17 Dec 2016 20:55:02 +0000 (21:55 +0100)
committerZdenek Kabelac <zkabelac@redhat.com>
Sun, 18 Dec 2016 18:13:34 +0000 (19:13 +0100)
External origin could be activated as stand-alone device.
When the last thin LV is removed, external origin is no longer
the external origin and it's layer property was dropped.

Ensure dm table is correct by reloading external origin
(when it's active).

WHATS_NEW
lib/metadata/lv_manip.c

index 93fc93e6fa61fc9816cd89b7f5ebeeb105cdc9f3..6d368908aa5c1d7569d703d68c9f2b8d5c28ed2b 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.169 - 
 =====================================
+  Fix dm table when the last user of active external origin is removed.
   Improve reported lvs status for active external origin volume.
   Fix table load for splitted RAID LV and require explicit activation.
   Always active splitted RAID LV exclusively locally.
index 1889998e22e9287b316bbcb10cc3ef59a37fea87..92a6d449fa187d93037477f008f1babcf69f3217 100644 (file)
@@ -1264,6 +1264,7 @@ static int _lv_reduce(struct logical_volume *lv, uint32_t extents, int delete)
        uint32_t count = extents;
        uint32_t reduction;
        struct logical_volume *pool_lv;
+       struct logical_volume *external_lv = NULL;
 
        if (lv_is_merging_origin(lv)) {
                log_debug_metadata("Dropping snapshot merge of %s to removed origin %s.",
@@ -1275,6 +1276,9 @@ static int _lv_reduce(struct logical_volume *lv, uint32_t extents, int delete)
                if (!count)
                        break;
 
+               if (seg->external_lv)
+                       external_lv = seg->external_lv;
+
                if (seg->len <= count) {
                        if (seg->merge_lv) {
                                log_debug_metadata("Dropping snapshot merge of removed %s to origin %s.",
@@ -1341,6 +1345,12 @@ static int _lv_reduce(struct logical_volume *lv, uint32_t extents, int delete)
                   !lv->vg->fid->fmt->ops->lv_setup(lv->vg->fid, lv))
                return_0;
 
+       /* Removal of last user enforces refresh */
+       if (external_lv && !lv_is_external_origin(external_lv) &&
+           lv_is_active(external_lv) &&
+           !lv_update_and_reload(external_lv))
+               return_0;
+
        return 1;
 }
 
This page took 0.053667 seconds and 5 git commands to generate.