2017-07-02 22:38:32 +03:00
#!/usr/bin/env bash
2014-03-02 22:46:17 +04:00
# Copyright (C) 2013-2014 Red Hat, Inc. All rights reserved.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
2016-01-21 13:49:46 +03:00
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2014-03-02 22:46:17 +04:00
2016-02-23 01:13:42 +03:00
SKIP_WITH_LVMLOCKD = 1
2015-10-27 17:10:06 +03:00
SKIP_WITH_LVMPOLLD = 1
2014-03-02 22:46:17 +04:00
2015-10-27 17:10:06 +03:00
. lib/inittest
2015-05-09 02:59:18 +03:00
2014-03-02 22:46:17 +04:00
get_image_pvs( ) {
local d
local images
2017-07-10 11:38:55 +03:00
images = $( dmsetup ls | grep " ${ 1 } - ${ 2 } _.image_.* " | cut -f1 | sed -e s:-:/:)
2014-03-02 22:46:17 +04:00
lvs --noheadings -a -o devices $images | sed s/\( .\) //
}
########################################################
# MAIN
########################################################
aux raid456_replace_works || skip
2014-05-24 00:35:05 +04:00
aux have_raid 1 3 0 || skip
2014-03-02 22:46:17 +04:00
2016-12-12 13:22:41 +03:00
aux prepare_vg 7 # 7 devices for 2 dev replacement of 5-dev RAID6
2014-03-02 22:46:17 +04:00
2016-10-28 22:54:10 +03:00
levels = "5 6"
aux have_raid4 && levels = "4 5 6"
2014-03-02 22:46:17 +04:00
# RAID 4/5/6 (can replace up to 'parity' devices)
2016-10-28 22:54:10 +03:00
for i in $levels ; do
2014-03-02 22:46:17 +04:00
lvcreate --type raid$i -i 3 -l 3 -n $lv1 $vg
if [ $i -eq 6 ] ; then
dev_cnt = 5
limit = 2
else
dev_cnt = 4
limit = 1
fi
for j in { 1..3} ; do
for o in $( seq 0 $i ) ; do
replace = ""
devices = ( $( get_image_pvs $vg $lv1 ) )
for k in $( seq $j ) ; do
2017-07-06 20:27:04 +03:00
index = $(( ( k + o ) % dev_cnt ))
2014-03-02 22:46:17 +04:00
replace = " $replace --replace ${ devices [ $index ] } "
done
aux wait_for_sync $vg $lv1
if [ $j -gt $limit ] ; then
not lvconvert $replace $vg /$lv1
else
lvconvert $replace $vg /$lv1
fi
done
done
lvremove -ff $vg
done
vgremove -ff $vg