From c63e78714a121d2924dcde49d95cb72cd8b3bcd5 Mon Sep 17 00:00:00 2001 From: Jonathan Earl Brassow Date: Fri, 6 Aug 2010 15:38:32 +0000 Subject: [PATCH] Fix for bug 619221 - log device splitting regression An incorrect fix on July 13, 2010 for an annoyance has caused a regression. The offending check-in was part of the 2.02.71 release of LVM. That check-in caused any PVs specified on the command line to be ignored when performing a mirror split. This patch reverses the aforementioned check-in (solving the regressions) and posits a new solution to the list reversal problem. The original problem was that we would always take the lowest mimage LVs from a mirror when performing a split, but what we really want is to take the highest mimage LVs. This patch accomplishes that by working through the list in reverse order - choosing the higher numbered mimages first. (This also reduces the amount of processing necessary.) Signed-off-by: Jonathan Brassow Reviewed-by: Takahiro Yasui --- WHATS_NEW | 1 + lib/metadata/mirror.c | 30 +++++++++--------------------- tools/lvconvert.c | 2 +- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index c6392b9e7..aaae804ee 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.73 - ================================ + Split-mirror operations were ignoring user-specified PVs. Fix data corruption bug in cluster mirrors. Require logical volume(s) to be explicitly named for lvconvert --merge. Avoid changing aligned pe_start as a side-effect of very verbose logging. diff --git a/lib/metadata/mirror.c b/lib/metadata/mirror.c index 67af56f69..36ee0ddd4 100644 --- a/lib/metadata/mirror.c +++ b/lib/metadata/mirror.c @@ -524,34 +524,22 @@ static int _move_removable_mimages_to_end(struct logical_volume *lv, uint32_t count, struct dm_list *removable_pvs) { - int i, images; + int i; struct logical_volume *sub_lv; struct lv_segment *mirrored_seg = first_seg(lv); if (!removable_pvs) return 1; - /* - * When we shift an image to the end, we must start from - * the begining of the list again. We must visit the - * images up to the last one we just moved. - */ - for (images = mirrored_seg->area_count; images && count; images--) { - for (i = 0; i < images; i++) { - sub_lv = seg_lv(mirrored_seg, i); - - if (!is_temporary_mirror_layer(sub_lv) && - is_mirror_image_removable(sub_lv, removable_pvs)) { - if (!shift_mirror_images(mirrored_seg, i)) - return_0; - count--; - break; - } - } + for (i = mirrored_seg->area_count - 1; (i >= 0) && count; i--) { + sub_lv = seg_lv(mirrored_seg, i); - /* Did we shift any images? */ - if (i == images) - return 0; + if (!is_temporary_mirror_layer(sub_lv) && + is_mirror_image_removable(sub_lv, removable_pvs)) { + if (!shift_mirror_images(mirrored_seg, i)) + return_0; + count--; + } } return !count; diff --git a/tools/lvconvert.c b/tools/lvconvert.c index 1f17619ee..1be3a8da6 100644 --- a/tools/lvconvert.c +++ b/tools/lvconvert.c @@ -1015,7 +1015,7 @@ static int _lvconvert_mirrors_aux(struct cmd_context *cmd, lv->le_count, lp->region_size); - if (!operable_pvs && !lp->keep_mimages) + if (!operable_pvs) operable_pvs = lp->pvh; seg = first_seg(lv); -- 2.43.5