+test_45() {
+ [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+
+ local file=$DIR/$tdir/$tfile
+ local dir=$DIR/$tdir/$dir
+ local temp=$DIR/$tdir/template
+ rm -rf $DIR/$tdir
+ test_mkdir $DIR/$tdir
+
+ $LFS setstripe -N -E1m -S1m -c2 -o0,1 -E2m -Eeof -N -E4m -Eeof \
+ -N -E3m -S1m -Eeof -N -E8m -Eeof $file ||
+ error "Create $file failed"
+
+ echo "getstripe --yaml $file"
+ $LFS getstripe --yaml $file > $temp || error "getstripe $file failed"
+ echo "setstripe --yaml=$temp $file.2"
+ $LFS setstripe --yaml=$temp $file.2 || error "setstripe $file.2 failed"
+
+ echo "compare layout"
+ local layout1=$(get_layout_param $file)
+ local layout2=$(get_layout_param $file.2)
+ [ "$layout1" == "$layout2" ] ||
+ error "FLR file $file/$file.2 layouts are not equal"
+}
+run_test 45 "Verify setstripe/getstripe with YAML with FLR file"
+
+verify_46() {
+ local src=$1
+ local dst=$2
+ local msg_prefix=$3
+
+ $LFS setstripe --copy=$src $dst || error "setstripe $dst failed"
+
+ local layout1=$(get_layout_param $src)
+ local layout2=$(get_layout_param $dst)
+ # compare their layout info
+ [ "$layout1" == "$layout2" ] ||
+ error "$msg_prefix $src <=> $dst layouts are not equal"
+}
+
+test_46() {
+ [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+
+ local file=$DIR/$tdir/$tfile
+ test_mkdir $DIR/$tdir
+
+ ########################### 1. PFL file #############################
+ echo " ** 1. PFL file"
+ rm -f $file
+ $LFS setstripe -E1m -S 1M -c2 -o0,1 -E2m -c2 -E3m -o1,0 -E4m -c1 -E-1 \
+ $file || error "1. Create PFL $file failed"
+
+ rm -f $file.copy
+ verify_46 $file $file.copy "1. PFL file"
+
+ ########################### 2. plain file ###########################
+ echo " ** 2. plain file"
+ rm -f $file
+ $LFS setstripe -c2 -o0,1 -i1 $file ||
+ error "2. Create plain $file failed"
+
+ rm -f $file.copy
+ verify_46 $file $file.copy "2. plain file"
+
+ ########################### 3. FLR file #############################
+ echo " ** 3. FLR file"
+ $LFS setstripe -N -E1m -S 1M -c2 -o0,1 -E4m -c1 -Eeof -N -E16m -Eeof \
+ $file || error "3. Create FLR $file failed"
+
+ rm -f $file.copy
+ verify_46 $file $file.copy "3. FLR file"
+
+ local dir=$DIR/$tdir/dir
+ ########################### 4. PFL dir ##############################
+ echo " ** 4. PFL dir"
+ test_mkdir $dir
+ $LFS setstripe -E1m -S 1M -c2 -E2m -c1 -E-1 $dir ||
+ error "4. setstripe PFL $dir failed"
+
+ test_mkdir $dir.copy
+ verify_46 $dir $dir.copy "4. PFL dir"
+
+ ########################### 5. plain dir ############################
+ echo " ** 5. plain dir"
+ $LFS setstripe -c2 -i-1 $dir || error "5. setstripe plain $dir failed"
+
+ verify_46 $dir $dir.copy "5. plain dir"
+
+ ########################### 6. FLR dir ##############################
+ echo " ** 6. FLR dir"
+ $LFS setstripe -N -E1m -S 1M -c2 -E2m -c1 -Eeof -N -E4m -Eeof $dir ||
+ error "6. setstripe FLR $dir failed"
+
+ verify_46 $dir $dir.copy "6. FLR dir"
+}
+run_test 46 "Verify setstripe --copy option"
+
+test_47() {
+ [ $OSTCOUNT -lt 3 ] && skip "needs >= 3 OSTs" && return
+
+ local file=$DIR/$tdir/$tfile
+ local ids
+ local ost
+ local osts
+
+ test_mkdir $DIR/$tdir
+
+ # test case 1:
+ rm -f $file
+ # mirror1: [comp0]ost0, [comp1]ost1 and ost2
+ # mirror2: [comp2] , [comp3] should not use ost1 or ost2
+ $LFS mirror create -N -E2m -c1 -o0 --flags=prefer -Eeof -c2 -o1,2 \
+ -N -E2m -c1 -Eeof -c1 $file || error "create FLR $file failed"
+ ids=($($LFS getstripe $file | awk '/lcme_id/{print $2}' | tr '\n' ' '))
+
+ dd if=/dev/zero of=$file bs=1M count=3 || error "dd $file failed"
+ $LFS mirror resync $file || error "resync $file failed"
+
+ ost=$($LFS getstripe -I${ids[2]} $file | awk '/l_ost_idx/{print $5}')
+ if [[ x$ost == "x0," ]]; then
+ $LFS getstripe $file
+ error "component ${ids[2]} objects allocated on $ost " \
+ "shouldn't on OST0"
+ fi
+
+ ost=$($LFS getstripe -I${ids[3]} $file | awk '/l_ost_idx/{print $5}')
+ if [[ x$ost == "x1," || x$ost == "x2," ]]; then
+ $LFS getstripe $file
+ error "component ${ids[3]} objects allocated on $ost " \
+ "shouldn't on OST1 or on OST2"
+ fi
+
+ ## test case 2:
+ rm -f $file
+ # mirror1: [comp0] [comp1]
+ # mirror2: [comp2] [comp3]
+ # mirror3: [comp4] [comp5]
+ # mirror4: [comp6] [comp7]
+ $LFS mirror create -N4 -E1m -c1 -Eeof -c1 $file ||
+ error "create FLR $file failed"
+ ids=($($LFS getstripe $file | awk '/lcme_id/{print $2}' | tr '\n' ' '))
+
+ dd if=/dev/zero of=$file bs=1M count=3 || error "dd $file failed"
+ $LFS mirror resync $file || error "resync $file failed"
+
+ for ((i = 0; i < 6; i++)); do
+ osts[$i]=$($LFS getstripe -I${ids[$i]} $file |
+ awk '/l_ost_idx/{print $5}')
+ done
+ # comp[0],comp[2],comp[4] should use different osts
+ if [[ ${osts[0]} == ${osts[2]} || ${osts[0]} == ${osts[4]} ||
+ ${osts[2]} == ${osts[4]} ]]; then
+ $LFS getstripe $file
+ error "component ${ids[0]}, ${ids[2]}, ${ids[4]} have objects "\
+ "allocated on duplicated OSTs"
+ fi
+ # comp[1],comp[3],comp[5] should use different osts
+ if [[ ${osts[1]} == ${osts[3]} || ${osts[1]} == ${osts[5]} ||
+ ${osts[3]} == ${osts[5]} ]]; then
+ $LFS getstripe $file
+ error "component ${ids[1]}, ${ids[3]}, ${ids[5]} have objects "\
+ "allocated on duplicated OSTs"
+ fi
+
+ return 0
+}
+run_test 47 "Verify mirror obj alloc"
+