From a47e4227152eb6c5a9bedda0ef05a684b378e1f5 Mon Sep 17 00:00:00 2001 From: Petr Rockai Date: Thu, 17 Dec 2009 15:38:29 +0000 Subject: [PATCH] Fix removal of multiple devices from a mirror (+ regression test). --- lib/metadata/mirror.c | 3 ++- test/t-lvconvert-repair.sh | 31 +++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/lib/metadata/mirror.c b/lib/metadata/mirror.c index a43ba6b5d..b5d0d3182 100644 --- a/lib/metadata/mirror.c +++ b/lib/metadata/mirror.c @@ -533,6 +533,7 @@ static int _remove_mirror_images(struct logical_volume *lv, _is_mirror_image_removable(sub_lv, removable_pvs)) { if (!shift_mirror_images(mirrored_seg, s)) return_0; + s--; /* adjust counter after shifting */ new_area_count--; } } @@ -783,7 +784,7 @@ static int get_mirror_fault_policy(struct cmd_context *cmd __attribute((unused)) DEFAULT_MIRROR_LOG_FAULT_POLICY); else policy = find_config_str(NULL, "activation/mirror_device_fault_policy", - DEFAULT_MIRROR_DEV_FAULT_POLICY); + DEFAULT_MIRROR_IMAGE_FAULT_POLICY); if (!strcmp(policy, "remove")) return MIRROR_REMOVE; diff --git a/test/t-lvconvert-repair.sh b/test/t-lvconvert-repair.sh index a40cd2767..e3b409959 100644 --- a/test/t-lvconvert-repair.sh +++ b/test/t-lvconvert-repair.sh @@ -11,9 +11,36 @@ . ./test-utils.sh -prepare_vg 4 +prepare_vg 5 + +# fail multiple devices + +lvcreate -m 3 -L 1 -n 3way $vg +disable_dev $dev2 $dev4 +echo n | lvconvert -i 1 --repair $vg/3way +lvs -a -o +devices > lvlist +not grep unknown lvlist +vgreduce --removemissing $vg +enable_dev $dev2 $dev4 +lvchange -a n $vg/3way + +vgremove -ff $vg +vgcreate $vg $dev1 $dev2 $dev3 $dev4 + +lvcreate -m 2 -L 1 -n 4way $vg +disable_dev $dev1 $dev2 +echo n | lvconvert -i 1 --repair $vg/4way +lvs -a -o +devices > lvlist +not grep unknown lvlist +vgreduce --removemissing $vg +enable_dev $dev1 $dev2 +lvchange -a n $vg/4way + +# fail single devices + +vgremove -ff $vg +vgcreate $vg $dev1 $dev2 $dev3 -vgreduce $vg $dev4 lvcreate -m 1 -L 1 -n mirror $vg lvchange -a n $vg/mirror