2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2011 Oracle. All Rights Reserved.
5 # FS QA Test No. btrfs/003
10 _begin_fstest auto replace volume balance
15 # Check if all scratch dev pools are deletable
16 deletable_scratch_dev_pool()
20 for i in $SCRATCH_DEV_POOL; do
21 x=`echo $i | cut -d"/" -f 3`
22 if [ ! -f /sys/class/block/${x}/device/delete ]; then
30 # Override the default cleanup function.
35 if [ $dev_removed == 1 ]; then
37 _devmgt_add "${removed_dev_htl}"
41 # Import common functions.
46 _require_scratch_dev_pool 4
47 _require_command "$WIPEFS_PROG" wipefs
49 # Test cases related to raid in btrfs
52 export MKFS_OPTIONS="-m raid0 -d raid0"
53 _scratch_pool_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
55 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
56 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10 -c
62 export MKFS_OPTIONS="-m raid1 -d raid1"
63 _scratch_pool_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
65 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
66 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10 -c
72 export MKFS_OPTIONS="-m raid10 -d raid10"
73 _scratch_pool_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
75 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
76 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10
82 export MKFS_OPTIONS="-m single -d single"
83 _scratch_pool_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
85 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
86 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10
93 local -a devs="( $SCRATCH_DEV_POOL )"
98 export MKFS_OPTIONS=""
99 _scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
101 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
102 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10
103 for i in `seq 2 $n`; do
104 $WIPEFS_PROG -a ${devs[$i]} >> $seqres.full 2>&1 || \
105 _fail "wipefs failed"
106 $BTRFS_UTIL_PROG device add ${devs[$i]} $SCRATCH_MNT >> $seqres.full 2>&1 || _fail "device add failed"
108 _run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full
115 local devs=( $SCRATCH_DEV_POOL )
120 # If scratch devs are not deletable skip this test
121 if ! deletable_scratch_dev_pool; then return 0; fi
123 # exclude the first and the last disk in the disk pool
125 ds=${devs[@]:1:$(($n-1))}
127 export MKFS_OPTIONS="-m raid1 -d raid1"
128 _scratch_mkfs "$ds" >> $seqres.full 2>&1 || _fail "tr: mkfs failed"
130 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
131 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10
133 #pick the 2nd last disk
134 ds=${devs[@]:$(($n-1)):1}
136 # retrive the HTL for this scsi disk
137 d=`echo $ds|cut -d"/" -f3`
138 removed_dev_htl=`ls -l /sys/class/block/${d} | rev | cut -d "/" -f 3 | rev`
141 _devmgt_remove ${removed_dev_htl} $ds
144 $BTRFS_UTIL_PROG filesystem show $SCRATCH_DEV | grep "Some devices missing" >> $seqres.full || _fail \
145 "btrfs did not report device missing"
147 # add a new disk to btrfs
148 ds=${devs[@]:$(($n)):1}
149 $WIPEFS_PROG -a ${ds} >> $seqres.full 2>&1 || _fail "wipefs failed"
150 $BTRFS_UTIL_PROG device add ${ds} $SCRATCH_MNT >> $seqres.full 2>&1 || _fail "dev add failed"
151 # in some system balance fails if there is no delay (a bug)
152 # putting sleep 10 to work around as of now
154 _run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full
156 # cleaup. add the removed disk
158 _devmgt_add "${removed_dev_htl}"
164 _scratch_pool_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
166 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
167 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10
169 # pick last dev in the list
170 dev_del=`echo ${SCRATCH_DEV_POOL} | awk '{print $NF}'`
171 $BTRFS_UTIL_PROG device delete $dev_del $SCRATCH_MNT || _fail "btrfs device delete failed"
172 $BTRFS_UTIL_PROG filesystem show $SCRATCH_DEV 2>&1 | grep $dev_del >> $seqres.full && _fail "btrfs still shows the deleted dev"
176 # Zoned btrfs only supports SINGLE profile
177 if ! _scratch_btrfs_is_zoned; then
185 # _test_replace() uses raid1, but zoned btrfs only supports SINGLE
187 if ! _scratch_btrfs_is_zoned; then
192 echo "Silence is golden"