}
run_test 27b "create and write to two stripe file"
+# 27c family tests specific striping, setstripe -o
+test_27ca() {
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
+ test_mkdir -p $DIR/$tdir
+ local osts="1"
+
+ $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
+ $LFS getstripe -i $DIR/$tdir/$tfile
+ [ $($LFS getstripe -i $DIR/$tdir/$tfile ) -eq $osts ] ||
+ error "stripe not on specified OST"
+
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
+}
+run_test 27ca "one stripe on specified OST"
+
+test_27cb() {
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
+ test_mkdir -p $DIR/$tdir
+ local osts="1,0"
+ $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
+ local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
+ echo "$getstripe"
+
+ # Strip getstripe output to a space separated list of OSTs
+ local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
+ awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
+ [ "$getstripe_osts" = "${osts//,/ }" ] ||
+ error "stripes not on specified OSTs"
+
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
+}
+run_test 27cb "two stripes on specified OSTs"
+
+test_27cc() {
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
+ [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
+ skip "server does not support overstriping"
+
+ test_mkdir -p $DIR/$tdir
+ local osts="0,0"
+ $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
+ local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
+ echo "$getstripe"
+
+ # Strip getstripe output to a space separated list of OSTs
+ local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
+ awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
+ [ "$getstripe_osts" = "${osts//,/ }" ] ||
+ error "stripes not on specified OSTs"
+
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
+}
+run_test 27cc "two stripes on the same OST"
+
+test_27cd() {
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
+ [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
+ skip "server does not support overstriping"
+ test_mkdir -p $DIR/$tdir
+ local osts="0,1,1,0"
+ $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
+ local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
+ echo "$getstripe"
+
+ # Strip getstripe output to a space separated list of OSTs
+ local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
+ awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
+ [ "$getstripe_osts" = "${osts//,/ }" ] ||
+ error "stripes not on specified OSTs"
+
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
+}
+run_test 27cd "four stripes on two OSTs"
+
+test_27ce() {
+ [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
+ skip_env "too many osts, skipping"
+ [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
+ skip "server does not support overstriping"
+ # We do one more stripe than we have OSTs
+ [ $OSTCOUNT -ge 159 ] || large_xattr_enabled ||
+ skip_env "ea_inode feature disabled"
+
+ test_mkdir -p $DIR/$tdir
+ local osts=""
+ for i in $(seq 0 $OSTCOUNT);
+ do
+ osts=$osts"0"
+ if [ $i -ne $OSTCOUNT ]; then
+ osts=$osts","
+ fi
+ done
+ $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
+ local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
+ echo "$getstripe"
+
+ # Strip getstripe output to a space separated list of OSTs
+ local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
+ awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
+ [ "$getstripe_osts" = "${osts//,/ }" ] ||
+ error "stripes not on specified OSTs"
+
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
+}
+run_test 27ce "more stripes than OSTs with -o"
+
test_27d() {
test_mkdir $DIR/$tdir
$LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
}
run_test 27g "$LFS getstripe with no objects"
+test_27ga() {
+ test_mkdir $DIR/$tdir
+ touch $DIR/$tdir/$tfile || error "touch failed"
+ ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed"
+ $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2
+ local rc=$?
+ (( rc == 2 )) || error "getstripe did not return ENOENT"
+}
+run_test 27ga "$LFS getstripe with missing file (should return error)"
+
test_27i() {
test_mkdir $DIR/$tdir
touch $DIR/$tdir/$tfile || error "touch failed"
test_27m() {
[[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
+ [ -n "$RCLIENTS" -o -n "$MOUNT_2" ] &&
+ skip_env "multiple clients -- skipping"
+
ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
head -n1)
if [[ $ORIGFREE -gt $MAXFREE ]]; then
}
run_test 27B "call setstripe on open unlinked file/rename victim"
-test_27C() { #LU-2871
+# 27C family tests full striping and overstriping
+test_27Ca() { #LU-2871
[[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
declare -a ost_idx
done
done
}
-run_test 27C "check full striping across all OSTs"
+run_test 27Ca "check full striping across all OSTs"
+
+test_27Cb() {
+ [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
+ skip "server does not support overstriping"
+ [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
+ skip_env "too many osts, skipping"
+
+ test_mkdir -p $DIR/$tdir
+ local setcount=$(($OSTCOUNT * 2))
+ [ $setcount -ge 160 ] || large_xattr_enabled ||
+ skip_env "ea_inode feature disabled"
+
+ $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
+ error "setstripe failed"
+
+ local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
+ [ $count -eq $setcount ] ||
+ error "stripe count $count, should be $setcount"
+
+ $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
+ error "overstriped should be set in pattern"
+
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
+ error "dd failed"
+}
+run_test 27Cb "more stripes than OSTs with -C"
+
+test_27Cc() {
+ [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
+ skip "server does not support overstriping"
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
+
+ test_mkdir -p $DIR/$tdir
+ local setcount=$(($OSTCOUNT - 1))
+
+ [ $setcount -ge 160 ] || large_xattr_enabled ||
+ skip_env "ea_inode feature disabled"
+
+ $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
+ error "setstripe failed"
+
+ local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
+ [ $count -eq $setcount ] ||
+ error "stripe count $count, should be $setcount"
+
+ $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" &&
+ error "overstriped should not be set in pattern"
+
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
+ error "dd failed"
+}
+run_test 27Cc "fewer stripes than OSTs does not set overstriping"
+
+test_27Cd() {
+ [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
+ skip "server does not support overstriping"
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
+ large_xattr_enabled || skip_env "ea_inode feature disabled"
+
+ test_mkdir -p $DIR/$tdir
+ local setcount=$LOV_MAX_STRIPE_COUNT
+
+ $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
+ error "setstripe failed"
+
+ local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
+ [ $count -eq $setcount ] ||
+ error "stripe count $count, should be $setcount"
+
+ $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
+ error "overstriped should be set in pattern"
+
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
+ error "dd failed"
+
+ rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
+}
+run_test 27Cd "test maximum stripe count"
+
+test_27Ce() {
+ [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
+ skip "server does not support overstriping"
+ test_mkdir -p $DIR/$tdir
+
+ pool_add $TESTNAME || error "Pool creation failed"
+ pool_add_targets $TESTNAME 0 || error "pool_add_targets failed"
+
+ local setcount=8
+
+ $LFS setstripe -C $setcount -p "$TESTNAME" $DIR/$tdir/$tfile ||
+ error "setstripe failed"
+
+ local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
+ [ $count -eq $setcount ] ||
+ error "stripe count $count, should be $setcount"
+
+ $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
+ error "overstriped should be set in pattern"
+
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
+ error "dd failed"
+
+ rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
+}
+run_test 27Ce "test pool with overstriping"
+
+test_27Cf() {
+ [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
+ skip "server does not support overstriping"
+ [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
+ skip_env "too many osts, skipping"
+
+ test_mkdir -p $DIR/$tdir
+
+ local setcount=$(($OSTCOUNT * 2))
+ [ $setcount -ge 160 ] || large_xattr_enabled ||
+ skip_env "ea_inode feature disabled"
+
+ $LFS setstripe -C $setcount $DIR/$tdir/ ||
+ error "setstripe failed"
+
+ echo 1 > $DIR/$tdir/$tfile
+
+ local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
+ [ $count -eq $setcount ] ||
+ error "stripe count $count, should be $setcount"
+
+ $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
+ error "overstriped should be set in pattern"
+
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
+ error "dd failed"
+
+ rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
+}
+run_test 27Cf "test default inheritance with overstriping"
test_27D() {
[ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
[ $MDS1_VERSION -lt $(version_code 2.9.55) ] ||
[ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
skip27D+=" -s 30,31"
+ [[ ! $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ||
+ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
+ skip27D+=" -s 32,33"
llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
error "llapi_layout_test failed"
}
run_test 27I "check that root dir striping does not break parent dir one"
+test_27J() {
+ [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.51) ]] &&
+ skip "Need MDS version newer than 2.12.51"
+
+ test_mkdir $DIR/$tdir
+ local uuid1=$(cat /proc/sys/kernel/random/uuid)
+ local uuid2=$(cat /proc/sys/kernel/random/uuid)
+
+ # create foreign file (raw way)
+ create_foreign_file -f $DIR/$tdir/$tfile -x "${uuid1}@${uuid2}" \
+ -t 1 -F 0xda08 || error "create_foreign_file failed"
+
+ # verify foreign file (raw way)
+ parse_foreign_file -f $DIR/$tdir/$tfile |
+ grep "lov_foreign_magic: 0x0BD70BD0" ||
+ error "$DIR/$tdir/$tfile: invalid LOV EA foreign magic"
+ parse_foreign_file -f $DIR/$tdir/$tfile | grep "lov_xattr_size: 89" ||
+ error "$DIR/$tdir/$tfile: invalid LOV EA foreign size"
+ parse_foreign_file -f $DIR/$tdir/$tfile |
+ grep "lov_foreign_size: 73" ||
+ error "$DIR/$tdir/$tfile: invalid LOV EA foreign size"
+ parse_foreign_file -f $DIR/$tdir/$tfile |
+ grep "lov_foreign_type: 1" ||
+ error "$DIR/$tdir/$tfile: invalid LOV EA foreign type"
+ parse_foreign_file -f $DIR/$tdir/$tfile |
+ grep "lov_foreign_flags: 0x0000DA08" ||
+ error "$DIR/$tdir/$tfile: invalid LOV EA foreign flags"
+ local lov=$(parse_foreign_file -f $DIR/$tdir/$tfile |
+ grep "lov_foreign_value: 0x" |
+ sed -e 's/lov_foreign_value: 0x//')
+ local lov2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160)
+ [[ $lov = ${lov2// /} ]] ||
+ error "$DIR/$tdir/$tfile: invalid LOV EA foreign value"
+
+ # create foreign file (lfs + API)
+ $LFS setstripe --foreign=daos --flags 0xda08 \
+ -x "${uuid1}@${uuid2}" $DIR/$tdir/${tfile}2 ||
+ error "$DIR/$tdir/${tfile}2: create failed"
+
+ $LFS getstripe -v $DIR/$tdir/${tfile}2 |
+ grep "lfm_magic:.*0x0BD70BD0" ||
+ error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign magic"
+ # lfm_length is LOV EA size - sizeof(lfm_magic) - sizeof(lfm_length)
+ $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_length:.*73" ||
+ error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign size"
+ $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_type:.*daos" ||
+ error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign type"
+ $LFS getstripe -v $DIR/$tdir/${tfile}2 |
+ grep "lfm_flags:.*0x0000DA08" ||
+ error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign flags"
+ $LFS getstripe $DIR/$tdir/${tfile}2 |
+ grep "lfm_value:.*${uuid1}@${uuid2}" ||
+ error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign value"
+
+ # modify striping should fail
+ $LFS setstripe -c 2 $DIR/$tdir/$tfile &&
+ error "$DIR/$tdir/$tfile: setstripe should fail"
+ $LFS setstripe -c 2 $DIR/$tdir/${tfile}2 &&
+ error "$DIR/$tdir/${tfile}2: setstripe should fail"
+
+ # R/W should fail
+ cat $DIR/$tdir/$tfile && error "$DIR/$tdir/$tfile: read should fail"
+ cat $DIR/$tdir/${tfile}2 &&
+ error "$DIR/$tdir/${tfile}2: read should fail"
+ cat /etc/passwd > $DIR/$tdir/$tfile &&
+ error "$DIR/$tdir/$tfile: write should fail"
+ cat /etc/passwd > $DIR/$tdir/${tfile}2 &&
+ error "$DIR/$tdir/${tfile}2: write should fail"
+
+ # chmod should work
+ chmod 222 $DIR/$tdir/$tfile ||
+ error "$DIR/$tdir/$tfile: chmod failed"
+ chmod 222 $DIR/$tdir/${tfile}2 ||
+ error "$DIR/$tdir/${tfile}2: chmod failed"
+
+ # chown should work
+ chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tfile ||
+ error "$DIR/$tdir/$tfile: chown failed"
+ chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tfile}2 ||
+ error "$DIR/$tdir/${tfile}2: chown failed"
+
+ # rename should work
+ mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}.new ||
+ error "$DIR/$tdir/$tfile: rename of foreign file has failed"
+ mv $DIR/$tdir/${tfile}2 $DIR/$tdir/${tfile}2.new ||
+ error "$DIR/$tdir/${tfile}2: rename of foreign file has failed"
+
+ #remove foreign file
+ rm $DIR/$tdir/${tfile}.new ||
+ error "$DIR/$tdir/${tfile}.new: remove of foreign file has failed"
+ rm $DIR/$tdir/${tfile}2.new ||
+ error "$DIR/$tdir/${tfile}2.new: remove of foreign file has failed"
+}
+run_test 27J "basic ops on file with foreign LOV"
+
+test_27K() {
+ [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.49) ]] &&
+ skip "Need MDS version newer than 2.12.49"
+
+ test_mkdir $DIR/$tdir
+ local uuid1=$(cat /proc/sys/kernel/random/uuid)
+ local uuid2=$(cat /proc/sys/kernel/random/uuid)
+
+ # create foreign dir (raw way)
+ create_foreign_dir -d $DIR/$tdir/$tdir -x "${uuid1}@${uuid2}" -t 1 ||
+ error "create_foreign_dir FAILED"
+
+ # verify foreign dir (raw way)
+ parse_foreign_dir -d $DIR/$tdir/$tdir |
+ grep "lmv_foreign_magic:.*0xcd50cd0" ||
+ error "$DIR/$tdir/$tfile: invalid LMV EA magic"
+ parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_xattr_size:.*89$" ||
+ error "$DIR/$tdir/$tdir: invalid LMV EA size"
+ parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_type: 1$" ||
+ error "$DIR/$tdir/$tdir: invalid LMV EA type"
+ parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_flags: 0$" ||
+ error "$DIR/$tdir/$tdir: invalid LMV EA flags"
+ local lmv=$(parse_foreign_dir -d $DIR/$tdir/$tdir |
+ grep "lmv_foreign_value: 0x" |
+ sed 's/lmv_foreign_value: 0x//')
+ local lmv2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160 |
+ sed 's/ //g')
+ [[ $lmv == $lmv2 ]] || error "$DIR/$tdir/$tdir: invalid LMV EA value"
+
+ # create foreign dir (lfs + API)
+ $LFS mkdir --foreign=daos --xattr="${uuid1}@${uuid2}" --flags=0xda05 \
+ $DIR/$tdir/${tdir}2 ||
+ error "$DIR/$tdir/${tdir}2: create failed"
+
+ $LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
+ grep "lfm_magic:.*0x0CD50CD0" ||
+ error "$DIR/$tdir/${tdir}2: invalid LMV EA magic"
+ # lfm_length is LMV EA size - sizeof(lfm_magic) - sizeof(lfm_length)
+ # - sizeof(lfm_type) - sizeof(lfm_flags)
+ $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_length:.*73" ||
+ error "$DIR/$tdir/${tdir}2: invalid LMV EA size"
+ $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_type:.*daos" ||
+ error "$DIR/$tdir/${tdir}2: invalid LMV EA type"
+ $LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
+ grep "lfm_flags:.*0x0000DA05" ||
+ error "$DIR/$tdir/${tdir}2: invalid LMV EA flags"
+ $LFS getdirstripe $DIR/$tdir/${tdir}2 |
+ grep "lfm_value.*${uuid1}@${uuid2}" ||
+ error "$DIR/$tdir/${tdir}2: invalid LMV EA value"
+
+ # file create in dir should fail
+ touch $DIR/$tdir/$tdir/$tfile && "$DIR/$tdir: file create should fail"
+ touch $DIR/$tdir/${tdir}2/$tfile &&
+ "$DIR/${tdir}2: file create should fail"
+
+ # chmod should work
+ chmod 777 $DIR/$tdir/$tdir ||
+ error "$DIR/$tdir: chmod failed"
+ chmod 777 $DIR/$tdir/${tdir}2 ||
+ error "$DIR/${tdir}2: chmod failed"
+
+ # chown should work
+ chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tdir ||
+ error "$DIR/$tdir: chown failed"
+ chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tdir}2 ||
+ error "$DIR/${tdir}2: chown failed"
+
+ # rename should work
+ mv $DIR/$tdir/$tdir $DIR/$tdir/${tdir}.new ||
+ error "$DIR/$tdir/$tdir: rename of foreign dir has failed"
+ mv $DIR/$tdir/${tdir}2 $DIR/$tdir/${tdir}2.new ||
+ error "$DIR/$tdir/${tdir}2: rename of foreign dir has failed"
+
+ #remove foreign dir
+ rmdir $DIR/$tdir/${tdir}.new ||
+ error "$DIR/$tdir/${tdir}.new: remove of foreign dir has failed"
+ rmdir $DIR/$tdir/${tdir}2.new ||
+ error "$DIR/$tdir/${tdir}2.new: remove of foreign dir has failed"
+}
+run_test 27K "basic ops on dir with foreign LMV"
+
# createtest also checks that device nodes are created and
# then visible correctly (#2091)
test_28() { # bug 2091
test_43a() {
test_mkdir $DIR/$tdir
- cp -p $(which $MULTIOP) $DIR/$tdir/multiop ||
- cp -p multiop $DIR/$tdir/multiop
- MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c ||
- error "multiop open $TMP/$tfile.junk failed"
- rm $TMP/$tfile.junk # delete junk file on close (not part of test)
- MULTIOP_PID=$!
- $MULTIOP $DIR/$tdir/multiop Oc && error "expected error, got success"
- kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed"
- wait $MULTIOP_PID || error "wait PID $MULTIOP_PID failed"
+ cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
+ $DIR/$tdir/sleep 60 &
+ SLEEP_PID=$!
+ # Make sure exec of $tdir/sleep wins race with truncate
+ sleep 1
+ $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success"
+ kill $SLEEP_PID
}
run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
[ $PARALLEL == "yes" ] && skip "skip parallel run"
test_mkdir $DIR/$tdir
- cp -p $(which $MULTIOP) $DIR/$tdir/multiop ||
- cp -p multiop $DIR/$tdir/multiop
- MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c ||
- error "multiop open $TMP/$tfile.junk failed"
- rm $TMP/$tfile.junk # delete junk file on close (not part of test)
- MULTIOP_PID=$!
- $TRUNCATE $DIR/$tdir/multiop 0 && error "expected error, got success"
- kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed"
- wait $MULTIOP_PID || error "wait PID $MULTIOP_PID failed"
+ cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
+ $DIR/$tdir/sleep 60 &
+ SLEEP_PID=$!
+ # Make sure exec of $tdir/sleep wins race with truncate
+ sleep 1
+ $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success"
+ kill $SLEEP_PID
}
run_test 43b "truncate of file being executed should return -ETXTBSY"
}
run_test 60g "transaction abort won't cause MDT hung"
+test_60h() {
+ [ $MDS1_VERSION -le $(version_code 2.12.52) ] ||
+ skip "Need MDS version at least 2.12.52"
+ [ $MDSCOUNT -le 2 ] || skip "Need >= 2 MDTs"
+
+ local f
+
+ #define OBD_FAIL_MDS_STRIPE_CREATE 0x188
+ #define OBD_FAIL_MDS_STRIPE_FID 0x189
+ for fail_loc in 0x80000188 0x80000189; do
+ do_facet mds1 "$LCTL set_param fail_loc=$fail_loc"
+ $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir-$fail_loc ||
+ error "mkdir $dir-$fail_loc failed"
+ for i in {0..10}; do
+ # create may fail on missing stripe
+ echo $i > $DIR/$tdir-$fail_loc/$i
+ done
+ $LFS getdirstripe $DIR/$tdir-$fail_loc ||
+ error "getdirstripe $tdir-$fail_loc failed"
+ $LFS migrate -m 1 $DIR/$tdir-$fail_loc ||
+ error "migrate $tdir-$fail_loc failed"
+ $LFS getdirstripe $DIR/$tdir-$fail_loc ||
+ error "getdirstripe $tdir-$fail_loc failed"
+ pushd $DIR/$tdir-$fail_loc
+ for f in *; do
+ echo $f | cmp $f - || error "$f data mismatch"
+ done
+ popd
+ rm -rf $DIR/$tdir-$fail_loc
+ done
+}
+run_test 60h "striped directory with missing stripes can be accessed"
+
test_61a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run"
run_test 61a "mmap() writes don't make sync hang ================"
test_61b() {
- mmap_mknod_test $tfile || error "mmap_mknod_test failed"
+ mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
}
run_test 61b "mmap() of unstriped file is successful"
if [[ $STRIPECOUNT -le 0 ]]; then
sc=1
- elif [[ $STRIPECOUNT -gt 2000 ]]; then
-#LOV_MAX_STRIPE_COUNT is 2000
- [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1))
+ elif [[ $STRIPECOUNT -gt $LOV_MAX_STRIPE_COUNT ]]; then
+ [[ $OSTCOUNT -gt $LOV_MAX_STRIPE_COUNT ]] &&
+ sc=$LOV_MAX_STRIPE_COUNT || sc=$(($OSTCOUNT - 1))
else
sc=$(($STRIPECOUNT - 1))
fi
# where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
# last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
# numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
- L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
- BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
+ L1="^ref +rtr_ref +alive +router$"
+ BR="^$P +$P +(up|down) +$NID$"
create_lnet_proc_files "routers"
check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
remove_lnet_proc_files "routers"
fi
rm -f $DIR/$tfile
}
-run_test 258a
+run_test 258a "verify i_mutex security behavior when suid attributes is set"
# Verify we do NOT take the i_mutex in the normal case
test_258b() {
}
run_test 271f "DoM: read on open (200K file and read tail)"
+test_271g() {
+ [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
+ skip "Skipping due to old client or server version"
+
+ $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
+ # to get layout
+ $CHECKSTAT -t file $DIR1/$tfile
+
+ $MULTIOP $DIR1/$tfile Ow40960_w4096c &
+ MULTIOP_PID=$!
+ sleep 1
+ #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
+ $LCTL set_param fail_loc=0x80000314
+ rm $DIR1/$tfile || error "Unlink fails"
+ RC=$?
+ kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
+ [ $RC -eq 0 ] || error "Failed write to stale object"
+}
+run_test 271g "Discard DoM data vs client flush race"
+
test_272a() {
[ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
skip "Need MDS version at least 2.11.50"
}
run_test 419 "Verify open file by name doesn't crash kernel"
+test_420()
+{
+ [[ $MDS1_VERSION -ge $(version_code 2.12.53) ]] ||
+ skip "Need MDS version at least 2.12.53"
+
+ local SAVE_UMASK=$(umask)
+ local dir=$DIR/$tdir
+ local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
+
+ mkdir -p $dir
+ umask 0000
+ mkdir -m03777 $dir/testdir
+ ls -dn $dir/testdir
+ local dirperms=$(ls -dn $dir/testdir | awk '{print $1}')
+ [ $dirperms == "drwxrwsrwt" ] ||
+ error "incorrect perms on $dir/testdir"
+
+ $PDSH ${uname}@localhost "PATH=$LUSTRE/tests:\$PATH; \
+ openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
+ ls -n $dir/testdir/testfile
+ local fileperms=$(ls -n $dir/testdir/testfile | awk '{print $1}')
+ [ $fileperms == "-rwxr-xr-x" ] ||
+ error "incorrect perms on $dir/testdir/testfile"
+
+ umask $SAVE_UMASK
+}
+run_test 420 "clear SGID bit on non-directories for non-members"
+
prep_801() {
[[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
[[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
test_812() {
[ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
skip "OST < 2.12.51 doesn't support this fail_loc"
+ [ "$SHARED_KEY" = true ] &&
+ skip "OSC connections never go IDLE with Shared-Keys enabled"
$LFS setstripe -c 1 -i 0 $DIR/$tfile
# ensure ost1 is connected
}
run_test 813 "File heat verfication"
+test_814()
+{
+ dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
+ echo -n y >> $DIR/$tfile
+ cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
+ diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
+}
+run_test 814 "sparse cp works as expected (LU-12361)"
+
#
# tests that do cleanup/setup should be run at the end
#