1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-18 10:04:20 +03:00

RAID LVs could not handle a down-convert if a device other than the last one

in the array was specified for removal.  This change addresses that (bz806111).
This commit is contained in:
Jonathan Earl Brassow 2012-04-11 01:23:29 +00:00
parent bad8b5848f
commit c0b5886f18
2 changed files with 17 additions and 2 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.96 -
================================
Fix problems when specifying PVs during RAID down-converts.
Fix ability to handle failures in mirrored log (regression intro 2.02.89).
Fix unlocking volume group in vgreduce in error path.
Exit immediately if LISTEN_PID env var incorrect during systemd handover.

View File

@ -975,6 +975,8 @@ static int _raid_extract_images(struct logical_volume *lv, uint32_t new_count,
static int _raid_remove_images(struct logical_volume *lv,
uint32_t new_count, struct dm_list *pvs)
{
uint32_t s;
struct lv_segment *seg;
struct dm_list removal_list;
struct lv_list *lvl;
@ -1024,9 +1026,21 @@ static int _raid_remove_images(struct logical_volume *lv,
}
/*
* Resume original LV
* This also resumes all other sub-LVs
* Resume the remaining LVs
* We must start by resuming the sub-LVs first (which would
* otherwise be handled automatically) because the shifting
* of positions could otherwise cause name collisions. For
* example, if position 0 of a 3-way array is removed, position
* 1 and 2 must be shifted and renamed 0 and 1. If position 2
* tries to rename first, it will collide with the existing
* position 1.
*/
seg = first_seg(lv);
for (s = 0; (new_count > 1) && (s < seg->area_count); s++) {
if (!resume_lv(lv->vg->cmd, seg_lv(seg, s)) ||
!resume_lv(lv->vg->cmd, seg_metalv(seg, s)))
return_0;
}
if (!resume_lv(lv->vg->cmd, lv)) {
log_error("Failed to resume %s/%s after committing changes",
lv->vg->name, lv->name);