[lvm-devel] master - lv_manip: remove_layer_from_lv restore lv name
Zdenek Kabelac
zkabelac at fedoraproject.org
Mon Nov 10 21:06:17 UTC 2014
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=ff30783a4f44c823544133260acb8c5171fbd0a6
Commit: ff30783a4f44c823544133260acb8c5171fbd0a6
Parent: 979d12eb4a69ad328a8583eaafc4d3d30e4d1771
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Sun Nov 9 19:48:39 2014 +0100
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Nov 10 22:05:48 2014 +0100
lv_manip: remove_layer_from_lv restore lv name
Since we 'layer' for cache origin which and we support dropping
cache layer - we need to restore origin name in case
the origin LV is more complex target - i.e. raid.
Drop _corig from name
Cleanup and rename parent -> parent_lv.
---
WHATS_NEW | 1 +
lib/metadata/lv_manip.c | 33 +++++++++++++++++++++++++--------
2 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 6084ee7..f70c657 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.112 -
=====================================
+ When remove_layer_from_lv() removes layer, restore subLV names.
Cache-pool in use becomes invisible LV.
Don't prompt for removal of _pmspare in VG without pool metadata LV.
Deactivation of snapshot origin detects and deactivates left-over snapshots.
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index 1943c07..99ed6d1 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -5948,9 +5948,12 @@ int move_lv_segments(struct logical_volume *lv_to,
int remove_layer_from_lv(struct logical_volume *lv,
struct logical_volume *layer_lv)
{
- struct logical_volume *parent;
+ static const char _suffixes[][8] = { "_tdata", "_cdata", "_corig" };
+ struct logical_volume *parent_lv;
struct lv_segment *parent_seg;
struct segment_type *segtype;
+ struct lv_names lv_names;
+ int r;
log_very_verbose("Removing layer %s for %s", layer_lv->name, lv->name);
@@ -5959,8 +5962,8 @@ int remove_layer_from_lv(struct logical_volume *lv,
layer_lv->name, lv->name);
return 0;
}
- parent = parent_seg->lv;
- if (parent != lv) {
+ parent_lv = parent_seg->lv;
+ if (parent_lv != lv) {
log_error(INTERNAL_ERROR "Wrong layer %s in %s",
layer_lv->name, lv->name);
return 0;
@@ -5970,25 +5973,39 @@ int remove_layer_from_lv(struct logical_volume *lv,
* Before removal, the layer should be cleaned up,
* i.e. additional segments and areas should have been removed.
*/
- if (dm_list_size(&parent->segments) != 1 ||
+ if (dm_list_size(&parent_lv->segments) != 1 ||
parent_seg->area_count != 1 ||
seg_type(parent_seg, 0) != AREA_LV ||
layer_lv != seg_lv(parent_seg, 0) ||
- parent->le_count != layer_lv->le_count)
+ parent_lv->le_count != layer_lv->le_count)
return_0;
- if (!lv_empty(parent))
+ if (!lv_empty(parent_lv))
return_0;
- if (!move_lv_segments(parent, layer_lv, 0, 0))
+ if (!move_lv_segments(parent_lv, layer_lv, 0, 0))
return_0;
/* Replace the empty layer with error segment */
if (!(segtype = get_segtype_from_string(lv->vg->cmd, "error")))
return_0;
- if (!lv_add_virtual_segment(layer_lv, 0, parent->le_count, segtype))
+ if (!lv_add_virtual_segment(layer_lv, 0, parent_lv->le_count, segtype))
return_0;
+ /*
+ * recuresively rename sub LVs
+ * currently supported only for thin data layer
+ * FIXME: without strcmp it breaks mirrors....
+ */
+ for (r = 0; r < DM_ARRAY_SIZE(_suffixes); ++r)
+ if (strstr(layer_lv->name, _suffixes[r]) == 0) {
+ lv_names.old = layer_lv->name;
+ lv_names.new = parent_lv->name;
+ if (!for_each_sub_lv(parent_lv, _rename_cb, (void *) &lv_names))
+ return_0;
+ break;
+ }
+
return 1;
}
More information about the lvm-devel
mailing list