[lvm-devel] master - raid: handle insufficent PVs on takeover from striped/raid0
Heinz Mauelshagen
heinzm at sourceware.org
Tue Apr 11 22:28:13 UTC 2017
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=7bc85177b08c7a6f4f0c3384c8d05b9089267c14
Commit: 7bc85177b08c7a6f4f0c3384c8d05b9089267c14
Parent: c7ecf379abfffee385c8e862029285d1b436845d
Author: Heinz Mauelshagen <heinzm at redhat.com>
AuthorDate: Wed Apr 12 00:25:23 2017 +0200
Committer: Heinz Mauelshagen <heinzm at redhat.com>
CommitterDate: Wed Apr 12 00:27:59 2017 +0200
raid: handle insufficent PVs on takeover from striped/raid0
Remove any newly allocated sub LV (pair) remnants in case
allocation fails due to lag of (parallel) free PV space
and keep initial raid type.
Resolves: rhbz1438013
---
lib/metadata/raid_manip.c | 25 +++++++++++++++++++++++--
1 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index 06a92b3..4662736 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -5006,6 +5006,7 @@ static int _takeover_upconvert_wrapper(TAKEOVER_FN_ARGS)
{
uint32_t extents_copied, region_size, seg_len, stripe_size;
struct lv_segment *seg = first_seg(lv);
+ const struct segment_type *initial_segtype = seg->segtype;
struct dm_list removal_lvs;
dm_list_init(&removal_lvs);
@@ -5083,7 +5084,7 @@ static int _takeover_upconvert_wrapper(TAKEOVER_FN_ARGS)
/* Add metadata LVs */
if (seg_is_raid0(seg)) {
log_debug_metadata("Adding metadata LVs to %s.", display_lvname(lv));
- if (!_raid0_add_or_remove_metadata_lvs(lv, 1 /* update_and_reload */, allocate_pvs, NULL))
+ if (!_raid0_add_or_remove_metadata_lvs(lv, 0 /* update_and_reload */, allocate_pvs, NULL))
return 0;
/* raid0_meta -> raid4 needs clearing of MetaLVs in order to avoid raid disk role change issues in the kernel */
}
@@ -5111,8 +5112,28 @@ static int _takeover_upconvert_wrapper(TAKEOVER_FN_ARGS)
log_debug_metadata("Adding %" PRIu32 " component LV pair(s) to %s.",
new_image_count - lv_raid_image_count(lv),
display_lvname(lv));
- if (!_lv_raid_change_image_count(lv, 1, new_image_count, allocate_pvs, NULL, 0, 1))
+ if (!_lv_raid_change_image_count(lv, 1, new_image_count, allocate_pvs, NULL, 0, 1)) {
+ /*
+ * Rollback to initial type raid0/striped after failure to upconvert
+ * to raid4/5/6/10 elminating any newly allocated metadata devices
+ * (raid4/5 -> raid6 doesn't need any explicit changes after
+ * the allocation of the additional sub LV pair failed)
+ *
+ * - initial type is raid0 -> just remove remove metadata devices
+ *
+ * - initial type is striped -> convert back to it (removes metadata devices)
+ */
+ if (segtype_is_raid0(initial_segtype) &&
+ !_raid0_add_or_remove_metadata_lvs(lv, 0, NULL, &removal_lvs))
+ return_0;
+ if (segtype_is_striped_target(initial_segtype) &&
+ !_convert_raid0_to_striped(lv, 0, &removal_lvs))
+ return_0;
+ if (!_eliminate_extracted_lvs(lv->vg, &removal_lvs)) /* Updates vg */
+ return_0;
+
return 0;
+ }
seg = first_seg(lv);
}
More information about the lvm-devel
mailing list