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

lvconvert: fix interim segtype regression on raid6 conversions

When converting from striped/raid0/raid0_meta
to raid6 with > 2 stripes, allow possible
direct conversion (to raid6_n_6).

In case of 2 stripes, first convert to raid5_n to restripe
to at least 3 data stripes (the raid6 minimum in lvm2) in
a second conversion before finally converting to raid6_n_6.

As before, raid6_n_6 then can be converted
to any other raid6 layout.

Enhance lvconvert-raid-takeover.sh to test the
2 stripes conversions to raid6.

Resolves: rhbz1624038
This commit is contained in:
Heinz Mauelshagen 2018-09-07 13:48:13 +02:00
parent 22a1304368
commit e2e30a64ab
3 changed files with 16 additions and 7 deletions

View File

@ -1,5 +1,6 @@
Version 3.0.0 Version 3.0.0
============= =============
Fix lvconvert striped/raid0/raid0_meta -> raid6 regression.
Add 'lvm2-activation-generator:' prefix for kmsg messages logged by generator. Add 'lvm2-activation-generator:' prefix for kmsg messages logged by generator.
Add After=rbdmap.service to {lvm2-activation-net,blk-availability}.service. Add After=rbdmap.service to {lvm2-activation-net,blk-availability}.service.
Reduce max concurrent aios to avoid EMFILE with many devices. Reduce max concurrent aios to avoid EMFILE with many devices.

View File

@ -6127,9 +6127,9 @@ static int _set_convenient_raid145610_segtype_to(const struct lv_segment *seg_fr
/* striped/raid0 -> */ /* striped/raid0 -> */
} else if (seg_is_striped(seg_from) || seg_is_any_raid0(seg_from)) { } else if (seg_is_striped(seg_from) || seg_is_any_raid0(seg_from)) {
if (segtype_is_any_raid6(*segtype)) if (segtype_is_any_raid6(*segtype))
seg_flag = SEG_RAID6_N_6; seg_flag = seg_from->area_count < 3 ? SEG_RAID5_N : SEG_RAID6_N_6;
if (segtype_is_linear(*segtype) || else if (segtype_is_linear(*segtype) ||
(!segtype_is_raid4(*segtype) && !segtype_is_raid10(*segtype) && !segtype_is_striped(*segtype))) (!segtype_is_raid4(*segtype) && !segtype_is_raid10(*segtype) && !segtype_is_striped(*segtype)))
seg_flag = SEG_RAID5_N; seg_flag = SEG_RAID5_N;

View File

@ -108,11 +108,19 @@ function _invalid_raid5_conversions
not _lvconvert raid6 raid6_n_6 4 6 $vg $lv1 not _lvconvert raid6 raid6_n_6 4 6 $vg $lv1
} }
# Check raid6 conversion constrainst of minimum 3 stripes # Check raid6 conversion constrainst for 2 stripes
_lvcreate striped 2 2 4m $vg $lv1 for type in striped raid0 raid0_meta
do
_lvcreate $type 2 2 4m $vg $lv1
not _lvconvert raid6 raid6_n_6 2 4 $vg $lv1 not _lvconvert raid6 raid6_n_6 2 4 $vg $lv1
_lvconvert raid6 raid5_n 2 3 $vg $lv1
_lvconvert raid6 raid5_n 3 4 $vg $lv1
_lvconvert raid6 raid6_n_6 3 5 $vg $lv1
lvremove -y $vg lvremove -y $vg
done
# Check raid6 conversion constrainst of minimum 3 stripes
_lvcreate raid0 3 3 4m $vg $lv1 _lvcreate raid0 3 3 4m $vg $lv1
_lvconvert raid6 raid6_n_6 3 5 $vg $lv1 _lvconvert raid6 raid6_n_6 3 5 $vg $lv1
lvremove -y $vg lvremove -y $vg