mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-02 01:18:26 +03:00
raid_manip: fix multi-segment misallocation on 'lvconvert --repair'
An 'lvconvert --repair $RAID_LV" to replace a failed leg of a multi-segment RAID10/4/5/6 logical volume can lead to allocation of (parts of) the replacement image component pair on the physical volume of another image component (e.g. image 0 allocated on the same PV as image 1 silently impeding resilience). Patch fixes this severe resilince issue by prohibiting allocation on PVs already holding other legs of the RAID set. It allows to allocate free space on any operational PV already holding parts of the image component pair.
This commit is contained in:
parent
8804023825
commit
cdd17eee37
@ -1,5 +1,6 @@
|
||||
Version 2.02.115 -
|
||||
=====================================
|
||||
Fix lvconvert --repair to honour resilience requirement for segmented RAID LV.
|
||||
Filter out partitioned device-mapper devices as unsuitable for use as PVs.
|
||||
Also notify lvmetad about filtered device if using pvscan --cache DevicePath.
|
||||
Use LVM's own selection instead of awk expressions in clvmd startup scripts.
|
||||
|
@ -1545,6 +1545,28 @@ has_enough_space:
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _avoid_pvs_of_lv(struct logical_volume *lv, void *data)
|
||||
{
|
||||
struct dm_list *allocate_pvs = (struct dm_list *) data;
|
||||
struct pv_list *pvl;
|
||||
|
||||
dm_list_iterate_items(pvl, allocate_pvs)
|
||||
if (!(lv->status & PARTIAL_LV) &&
|
||||
lv_is_on_pv(lv, pvl->pv))
|
||||
pvl->pv->status &= ~ALLOCATABLE_PV;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prevent any PVs holding other image components of @lv from being used for allocation,
|
||||
* I.e. reset ALLOCATABLE_PV on respective PVs listed on @allocatable_pvs
|
||||
*/
|
||||
static void _avoid_pvs_with_other_images_of_lv(struct logical_volume *lv, struct dm_list *allocate_pvs)
|
||||
{
|
||||
for_each_sub_lv(lv, _avoid_pvs_of_lv, allocate_pvs);
|
||||
}
|
||||
|
||||
/*
|
||||
* lv_raid_replace
|
||||
* @lv
|
||||
@ -1643,6 +1665,9 @@ int lv_raid_replace(struct logical_volume *lv,
|
||||
}
|
||||
}
|
||||
|
||||
/* Prevent any PVs holding image components from being used for allocation */
|
||||
_avoid_pvs_with_other_images_of_lv(lv, allocate_pvs);
|
||||
|
||||
/*
|
||||
* Allocate the new image components first
|
||||
* - This makes it easy to avoid all currently used devs
|
||||
|
Loading…
Reference in New Issue
Block a user