2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2011 Oracle. All Rights Reserved.
5 # FS QA Test No. btrfs/003
10 seqres=$RESULT_DIR/$seq
11 echo "QA output created by $seq"
15 status=1 # failure is the default!
18 trap "_cleanup; exit \$status" 0 1 2 3 15
20 # Check if all scratch dev pools are deletable
21 deletable_scratch_dev_pool()
25 for i in $SCRATCH_DEV_POOL; do
26 x=`echo $i | cut -d"/" -f 3`
27 if [ ! -f /sys/class/block/${x}/device/delete ]; then
39 if [ $dev_removed == 1 ]; then
41 _devmgt_add "${removed_dev_htl}"
45 # get standard environment, filters and checks
51 _require_scratch_dev_pool 4
52 _require_command "$WIPEFS_PROG" wipefs
56 # Test cases related to raid in btrfs
59 export MKFS_OPTIONS="-m raid0 -d raid0"
60 _scratch_pool_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
62 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
63 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10 -c
69 export MKFS_OPTIONS="-m raid1 -d raid1"
70 _scratch_pool_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
72 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
73 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10 -c
79 export MKFS_OPTIONS="-m raid10 -d raid10"
80 _scratch_pool_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
82 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
83 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10
89 export MKFS_OPTIONS="-m single -d single"
90 _scratch_pool_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
92 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
93 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10
100 local -a devs="( $SCRATCH_DEV_POOL )"
105 export MKFS_OPTIONS=""
106 _scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
108 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
109 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10
110 for i in `seq 2 $n`; do
111 $WIPEFS_PROG -a ${devs[$i]} >> $seqres.full 2>&1 || \
112 _fail "wipefs failed"
113 $BTRFS_UTIL_PROG device add ${devs[$i]} $SCRATCH_MNT >> $seqres.full 2>&1 || _fail "device add failed"
115 _run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full
122 local devs=( $SCRATCH_DEV_POOL )
127 # If scratch devs are not deletable skip this test
128 if ! deletable_scratch_dev_pool; then return 0; fi
130 # exclude the first and the last disk in the disk pool
132 ds=${devs[@]:1:$(($n-1))}
134 export MKFS_OPTIONS="-m raid1 -d raid1"
135 _scratch_mkfs "$ds" >> $seqres.full 2>&1 || _fail "tr: mkfs failed"
137 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
138 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10
140 #pick the 2nd last disk
141 ds=${devs[@]:$(($n-1)):1}
143 # retrive the HTL for this scsi disk
144 d=`echo $ds|cut -d"/" -f3`
145 removed_dev_htl=`ls -l /sys/class/block/${d} | rev | cut -d "/" -f 3 | rev`
148 _devmgt_remove ${removed_dev_htl} $ds
151 $BTRFS_UTIL_PROG filesystem show $SCRATCH_DEV | grep "Some devices missing" >> $seqres.full || _fail \
152 "btrfs did not report device missing"
154 # add a new disk to btrfs
155 ds=${devs[@]:$(($n)):1}
156 $WIPEFS_PROG -a ${ds} >> $seqres.full 2>&1 || _fail "wipefs failed"
157 $BTRFS_UTIL_PROG device add ${ds} $SCRATCH_MNT >> $seqres.full 2>&1 || _fail "dev add failed"
158 # in some system balance fails if there is no delay (a bug)
159 # putting sleep 10 to work around as of now
161 _run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full
163 # cleaup. add the removed disk
165 _devmgt_add "${removed_dev_htl}"
171 _scratch_pool_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
173 dirp=`mktemp -duq $SCRATCH_MNT/dir.XXXXXX`
174 _populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10
176 # pick last dev in the list
177 dev_del=`echo ${SCRATCH_DEV_POOL} | awk '{print $NF}'`
178 $BTRFS_UTIL_PROG device delete $dev_del $SCRATCH_MNT || _fail "btrfs device delete failed"
179 $BTRFS_UTIL_PROG filesystem show $SCRATCH_DEV 2>&1 | grep $dev_del >> $seqres.full && _fail "btrfs still shows the deleted dev"
191 echo "Silence is golden"