summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2020-02-04 16:05:56 -0600
committerDavid Teigland <teigland@redhat.com>2020-02-04 16:12:09 -0600
commit2a6078f96168e860474b42c42b1924fc353c4558 (patch)
treea1f6d82b26f169a24b51269c183c59e960c49e0c
parent9255c7148ac3d920aafe58f78a9672dd3a0967bd (diff)
downloadlvm2-2a6078f96168e860474b42c42b1924fc353c4558.tar.gz
writecache: fix splitcache when origin is raid
-rw-r--r--lib/metadata/lv_manip.c13
-rw-r--r--test/shell/writecache-split.sh17
2 files changed, 26 insertions, 4 deletions
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index c9f7348fa..3604a6347 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -4535,6 +4535,9 @@ static int _for_each_sub_lv(struct logical_volume *lv, int level,
if (!_for_each_sub_lv(seg->pool_lv, level, fn, data))
return_0;
+ if (!_for_each_sub_lv(seg->writecache, level, fn, data))
+ return_0;
+
for (s = 0; s < seg->area_count; s++) {
if (seg_type(seg, s) != AREA_LV)
continue;
@@ -6989,7 +6992,7 @@ int move_lv_segments(struct logical_volume *lv_to,
int remove_layer_from_lv(struct logical_volume *lv,
struct logical_volume *layer_lv)
{
- static const char _suffixes[][8] = { "_tdata", "_cdata", "_corig", "_vdata" };
+ static const char _suffixes[][8] = { "_tdata", "_cdata", "_corig", "_wcorig", "_vdata" };
struct logical_volume *parent_lv;
struct lv_segment *parent_seg;
struct segment_type *segtype;
@@ -7069,8 +7072,8 @@ int remove_layer_from_lv(struct logical_volume *lv,
* currently supported only for thin data layer
* FIXME: without strcmp it breaks mirrors....
*/
- if (!strstr(layer_lv->name, "_mimage"))
- for (r = 0; r < DM_ARRAY_SIZE(_suffixes); ++r)
+ if (!strstr(layer_lv->name, "_mimage")) {
+ 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;
@@ -7078,6 +7081,8 @@ int remove_layer_from_lv(struct logical_volume *lv,
return_0;
break;
}
+ }
+ }
return 1;
}
@@ -7093,7 +7098,7 @@ struct logical_volume *insert_layer_for_lv(struct cmd_context *cmd,
uint64_t status,
const char *layer_suffix)
{
- static const char _suffixes[][8] = { "_tdata", "_cdata", "_corig", "_vdata" };
+ static const char _suffixes[][8] = { "_tdata", "_cdata", "_corig", "_wcorig", "_vdata" };
int r;
char name[NAME_LEN];
struct dm_str_list *sl;
diff --git a/test/shell/writecache-split.sh b/test/shell/writecache-split.sh
index 7168d023c..0f2dc4729 100644
--- a/test/shell/writecache-split.sh
+++ b/test/shell/writecache-split.sh
@@ -128,6 +128,23 @@ vgextend --restoremissing $vg "$dev3"
vgremove -ff $vg
#
+# splitcache when origin is raid
+#
+
+vgcreate $vg "$dev1" "$dev2" "$dev3" "$dev4"
+
+lvcreate --type raid1 -m1 -L6 -n $lv1 -an $vg "$dev1" "$dev2"
+lvcreate -L6 -n $lv2 -an $vg "$dev3"
+lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1
+lvchange -ay $vg/$lv1
+lvchange -an $vg/$lv1
+lvconvert --splitcache $vg/$lv1
+lvs $vg/$lv1
+lvs $vg/$lv2
+
+vgremove -ff $vg
+
+#
# vgsplit should not separate cachevol from main lv
#