X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=2a4cf7011308952d3d2ed55bd70a64336f8b2481;hp=be74422dfc1cb650a485bcb07d35dbf1ad4ef805;hb=1cc5fa26070fc9afef954b1b627001a981f7dc34;hpb=63c94b527024a55016acd98cfea3e37b1f208fdf diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index be74422..2a4cf70 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -10,7 +10,7 @@ set -e ONLY=${ONLY:-"$*"} # bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 12653 12653 5188 16260 19742 -ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 65a 65e 68b 119d 130 $SANITY_EXCEPT" +ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 65a 65e 68b $SANITY_EXCEPT" # bug number for skipped test: 2108 9789 3637 9789 3561 5188/5749 1443 #ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"27m 42a 42b 42c 42d 45 68 76"} # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! @@ -20,9 +20,6 @@ CPU=`awk '/model/ {print $4}' /proc/cpuinfo` # buffer i/o errs sock spc runas [ "$CPU" = "UML" ] && EXCEPT="$EXCEPT 27m 27n 27o 27p 27q 27r 31d 54a 64b 99a 99b 99c 99d 99e 99f 101" -# test76 is not valid with FIDs because inode numbers are not reused -ALWAYS_EXCEPT="$ALWAYS_EXCEPT 76" - case `uname -r` in 2.4*) FSTYPE=${FSTYPE:-ext3} ;; 2.6*) FSTYPE=${FSTYPE:-ldiskfs} ;; @@ -47,12 +44,9 @@ MCREATE=${MCREATE:-mcreate} OPENFILE=${OPENFILE:-openfile} OPENUNLINK=${OPENUNLINK:-openunlink} READS=${READS:-"reads"} -TRUNCATE=${TRUNCATE:-truncate} MUNLINK=${MUNLINK:-munlink} SOCKETSERVER=${SOCKETSERVER:-socketserver} SOCKETCLIENT=${SOCKETCLIENT:-socketclient} -IOPENTEST1=${IOPENTEST1:-iopentest1} -IOPENTEST2=${IOPENTEST2:-iopentest2} MEMHOG=${MEMHOG:-memhog} DIRECTIO=${DIRECTIO:-directio} ACCEPTOR_PORT=${ACCEPTOR_PORT:-988} @@ -74,9 +68,8 @@ init_test_env $@ . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh} init_logging -[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 24v 27m 36f 36g 51b 51c 60c 63 64b 68 71 73 77f 78 101 103 115 120g 124b" +[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 24v 27m 36f 36g 36h 51b 51c 60c 63 64b 68 71 73 77f 78 101 103 115 120g 124b" -SANITYLOG=${TESTSUITELOG:-$TMP/$(basename $0 .sh).log} FAIL_ON_ERROR=false cleanup() { @@ -107,8 +100,6 @@ if [ "$ONLY" == "cleanup" ]; then exit 0 fi -[ "$SANITYLOG" ] && rm -f $SANITYLOG || true - check_and_setup_lustre DIR=${DIR:-$MOUNT} @@ -130,7 +121,7 @@ rm -rf $DIR/[Rdfs][0-9]* # $RUNAS_ID may get set incorrectly somewhere else [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] && error "\$RUNAS_ID set to 0, but \$UID is also 0!" -check_runas_id $RUNAS_ID $RUNAS_ID $RUNAS +check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS build_test_filter @@ -304,16 +295,16 @@ test_6g() { $RUNAS mkdir $DIR/d6g/d || error chmod g+s $DIR/d6g/d || error mkdir $DIR/d6g/d/subdir - $CHECKSTAT -g \#$RUNAS_ID $DIR/d6g/d/subdir || error + $CHECKSTAT -g \#$RUNAS_GID $DIR/d6g/d/subdir || error } run_test 6g "Is new dir in sgid dir inheriting group?" test_6h() { # bug 7331 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping" && return touch $DIR/f6h || error "touch failed" - chown $RUNAS_ID:$RUNAS_ID $DIR/f6h || error "initial chown failed" - $RUNAS -G$RUNAS_ID chown $RUNAS_ID:0 $DIR/f6h && error "chown worked" - $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_ID $DIR/f6h || error + chown $RUNAS_ID:$RUNAS_GID $DIR/f6h || error "initial chown failed" + $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/f6h && error "chown worked" + $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/f6h || error } run_test 6h "$RUNAS chown RUNAS_ID.0 .../f6h (should return error)" @@ -480,7 +471,7 @@ test_17h() { #bug 17378 mkdir -p $DIR/$tdir $SETSTRIPE $DIR/$tdir -c -1 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141 - do_facet mds lctl set_param fail_loc=0x80000141 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000141 touch $DIR/$tdir/$tfile || true } run_test 17h "create objects: lov_free_memmd() doesn't lbug" @@ -490,12 +481,23 @@ test_17i() { #bug 20018 local foo=$DIR/$tdir/$tfile ln -s $foo $foo || error "create symlink failed" #define OBD_FAIL_MDS_READLINK_EPROTO 0x143 - do_facet mds lctl set_param fail_loc=0x80000144 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000143 ls -l $foo && error "error not detected" return 0 } run_test 17i "don't panic on short symlink" +test_17k() { #bug 22301 + rsync --help | grep -q xattr || + skip_env "$(rsync --version| head -1) does not support xattrs" + mkdir -p $DIR/{$tdir,$tdir.new} + touch $DIR/$tdir/$tfile + ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk + rsync -av -X $DIR/$tdir/ $DIR/$tdir.new || + error "rsync failed with xattrs enabled" +} +run_test 17k "symlinks: rsync with xattrs enabled =========================" + test_18() { touch $DIR/f ls $DIR || error @@ -554,13 +556,13 @@ run_test 21 "write to dangling link ============================" test_22() { WDIR=$DIR/$tdir mkdir -p $WDIR - chown $RUNAS_ID $WDIR + chown $RUNAS_ID:$RUNAS_GID $WDIR (cd $WDIR || error "cd $WDIR failed"; $RUNAS tar cf - /etc/hosts /etc/sysconfig/network | \ $RUNAS tar xf -) ls -lR $WDIR/etc || error "ls -lR $WDIR/etc failed" $CHECKSTAT -t dir $WDIR/etc || error "checkstat -t dir failed" - $CHECKSTAT -u \#$RUNAS_ID $WDIR/etc || error "checkstat -u failed" + $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $WDIR/etc || error "checkstat -u failed" } run_test 22 "unpack tar archive as non-root user ===============" @@ -797,6 +799,17 @@ test_24v() { } run_test 24v "list directory with large files (handle hash collision, bug: 17560)" +test_24w() { # bug21506 + SZ1=234852 + dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1 + dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2 + dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3 + SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'` + [ "$SZ1" = "$SZ2" ] || \ + error "Error reading at the end of the file $tfile" +} +run_test 24w "Reading a file larger than 4Gb" + test_25a() { echo '== symlink sanity =============================================' @@ -985,7 +998,7 @@ test_27m() { run_test 27m "create file while OST0 was full ==================" sleep_maxage() { - local DELAY=$(do_facet mds lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}') + local DELAY=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}') sleep $DELAY } @@ -1016,19 +1029,23 @@ exhaust_precreations() { sed -e 's/_UUID$//;s/^.*-//') # on the mdt's osc - local last_id=$(do_facet mds${MDSIDX} lctl get_param -n osc.*${OST}-osc-${MDT_INDEX}.prealloc_last_id) - local next_id=$(do_facet mds${MDSIDX} lctl get_param -n osc.*${OST}-osc-${MDT_INDEX}.prealloc_next_id) + local mdtosc_proc1=$(get_mdtosc_proc_path mds${MDSIDX} $OST) + local last_id=$(do_facet mds${MDSIDX} lctl get_param -n \ + osc.$mdtosc_proc1.prealloc_last_id) + local next_id=$(do_facet mds${MDSIDX} lctl get_param -n \ + osc.$mdtosc_proc1.prealloc_next_id) - do_facet mds${MDSIDX} lctl get_param osc.*OST*-osc-${MDT_INDEX}.prealloc* + local mdtosc_proc2=$(get_mdtosc_proc_path mds${MDSIDX}) + do_facet mds${MDSIDX} lctl get_param osc.$mdtosc_proc2.prealloc* - mkdir -p $DIR/d27/${OST} + mkdir -p $DIR/$tdir/${OST} $SETSTRIPE $DIR/$tdir/${OST} -i $OSTIDX -c 1 #define OBD_FAIL_OST_ENOSPC 0x215 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=$FAILIDX do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x215 echo "Creating to objid $last_id on ost $OST..." createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2)) - do_facet mds${MDSIDX} lctl get_param osc.*OST*-osc-${MDT_INDEX}.prealloc* + do_facet mds${MDSIDX} lctl get_param osc.$mdtosc_proc2.prealloc* do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=$FAILLOC sleep_maxage } @@ -1203,6 +1220,8 @@ test_27w() { # bug 10997 $LSTRIPE $DIR/$tdir/f0 -s 65536 || error "lstripe failed" size=`$GETSTRIPE $DIR/$tdir/f0 -s` [ $size -ne 65536 ] && error "stripe size $size != 65536" || true + gsdir=$($LFS getstripe -d $DIR/$tdir) + [ $(echo $gsdir | grep -c stripe_count) -ne 1 ] && error "$LFS getstripe -d $DIR/$tdir failed" [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping multiple stripe count/offset test" && return for i in `seq 1 $OSTCOUNT`; do @@ -1239,13 +1258,16 @@ test_27y() { [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return - local last_id=$(do_facet $SINGLEMDS lctl get_param -n osc.*0000-osc-MDT0000.prealloc_last_id) - local next_id=$(do_facet $SINGLEMDS lctl get_param -n osc.*0000-osc-MDT0000.prealloc_next_id) + local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000) + local last_id=$(do_facet $SINGLEMDS lctl get_param -n \ + osc.$mdtosc.prealloc_last_id) + local next_id=$(do_facet $SINGLEMDS lctl get_param -n \ + osc.$mdtosc.prealloc_next_id) local fcount=$((last_id - next_id)) [ $fcount -eq 0 ] && skip "not enough space on OST0" && return [ $fcount -gt $OSTCOUNT ] && fcount=$OSTCOUNT - MDS_OSCS=`do_facet mds lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }'` + MDS_OSCS=`do_facet $SINGLEMDS lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }'` OFFSET=$(($OSTCOUNT-1)) OST=-1 for OSC in $MDS_OSCS; do @@ -1253,7 +1275,7 @@ test_27y() { OST=`osc_to_ost $OSC` } else { echo $OSC "is Deactivate:" - do_facet mds lctl --device %$OSC deactivate + do_facet $SINGLEMDS lctl --device %$OSC deactivate } fi done @@ -1273,12 +1295,94 @@ test_27y() { for OSC in $MDS_OSCS; do [ `osc_to_ost $OSC` != $OST ] && { echo $OSC "is activate" - do_facet mds lctl --device %$OSC activate + do_facet $SINGLEMDS lctl --device %$OSC activate } done } run_test 27y "create files while OST0 is degraded and the rest inactive" +check_seq_oid() +{ + echo check file $1 + local old_ifs="$IFS" + IFS=$'\t\n :' + lmm=($($GETSTRIPE -v $1)) + + IFS=$'[:]' + fid=($($LFS path2fid $1)) + IFS="$old_ifs" + + # compare lmm_seq and lu_fid->f_seq + [ ${lmm[4]} = ${fid[1]} ] || { error "SEQ mismatch"; return 1; } + # compare lmm_object_id and lu_fid->oid + [ ${lmm[6]} = ${fid[2]} ] || { error "OID mismatch"; return 2; } + + echo -e "\tseq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}\n\tstripe count: ${lmm[8]}" + + [ "$FSTYPE" != "ldiskfs" ] && skip "can not check trusted.fid FSTYPE=$FSTYPE" && return 0 + + # check the trusted.fid attribute of the OST objects of the file + for (( i=0, j=19; i < ${lmm[8]}; i++, j+=4 )); do + local obdidx=${lmm[$j]} + local devnum=$((obdidx + 1)) + local objid=${lmm[$((j+1))]} + local group=${lmm[$((j+3))]} + local dev=$(ostdevname $devnum) + local dir=${MOUNT%/*}/ost$devnum + do_facet ost$devnum mount -t $FSTYPE $dev $dir $OST_MOUNT_OPTS || + { error "mounting $dev as $FSTYPE failed"; return 3; } + + obj_filename=$(do_facet ost$devnum find $dir/O/$group -name $objid) + local ff=$(do_facet ost$devnum $LL_DECODE_FILTER_FID $obj_filename) + IFS=$'/= [:]' + ff=($(echo $ff)) + IFS="$old_ifs" + + # compare lmm_seq and filter_fid->ff_parent.f_seq + [ ${ff[11]} = ${lmm[4]} ] || { error "parent SEQ mismatch"; return 4; } + # compare lmm_object_id and filter_fid->ff_parent.f_oid + [ ${ff[12]} = ${lmm[6]} ] || { error "parent OID mismatch"; return 5; } + let stripe=${ff[13]} + [ $stripe -eq $i ] || { error "stripe mismatch"; return 6; } + + echo -e "\t\tost $obdidx, objid $objid, group $group" + do_facet ost$devnum umount -d $dev + done +} + +test_27z() { + mkdir -p $DIR/$tdir + $SETSTRIPE $DIR/$tdir/$tfile-1 -c 1 -o 0 -s 1m || + { error "setstripe -c -1 failed"; return 1; } + dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 || + { error "dd 1 mb failed"; return 2; } + $SETSTRIPE $DIR/$tdir/$tfile-2 -c -1 -o $(($OSTCOUNT - 1)) -s 1m || + { error "setstripe -c 1 failed"; return 3; } + dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT || + { error "dd $OSTCOUNT mb failed"; return 4; } + sync + + check_seq_oid $DIR/$tdir/$tfile-1 || return 5 + check_seq_oid $DIR/$tdir/$tfile-2 || return 6 +} +run_test 27z "check SEQ/OID on the MDT and OST filesystems" + +test_27A() { # b=19102 + local restore_size=`$GETSTRIPE -s $MOUNT` + local restore_count=`$GETSTRIPE -c $MOUNT` + local restore_offset=`$GETSTRIPE -o $MOUNT` + $SETSTRIPE -c 0 -o -1 -s 0 $MOUNT + local default_size=`$GETSTRIPE -s $MOUNT` + local default_count=`$GETSTRIPE -c $MOUNT` + local default_offset=`$GETSTRIPE -o $MOUNT` + local dsize=$((1024 * 1024)) + [ $default_size -eq $dsize ] || error "stripe size $default_size != $dsize" + [ $default_count -eq 1 ] || error "stripe count $default_count != 1" + [ $default_offset -eq -1 ] || error "stripe offset $default_offset != -1" + $SETSTRIPE -c $restore_count -o $restore_offset -s $restore_size $MOUNT +} +run_test 27A "check filesystem-wide default LOV EA values" + # createtest also checks that device nodes are created and # then visible correctly (#2091) test_28() { # bug 2091 @@ -1335,12 +1439,30 @@ test_29() { } run_test 29 "IT_GETATTR regression ============================" -test_30() { +test_30a() { # was test_30 + cp `which ls` $DIR || cp /bin/ls $DIR + $DIR/ls / || error + rm $DIR/ls +} +run_test 30a "execute binary from Lustre (execve) ==============" + +test_30b() { cp `which ls` $DIR || cp /bin/ls $DIR - $DIR/ls / + chmod go+rx $DIR/ls + $RUNAS $DIR/ls / || error rm $DIR/ls } -run_test 30 "run binary from Lustre (execve) ===================" +run_test 30b "execute binary from Lustre as non-root ===========" + +test_30c() { # b=22376 + cp `which ls` $DIR || cp /bin/ls $DIR + chmod a-rw $DIR/ls + cancel_lru_locks mdc + cancel_lru_locks osc + $RUNAS $DIR/ls / || error + rm -f $DIR/ls +} +run_test 30c "execute binary from Lustre without read perms ====" test_31a() { $OPENUNLINK $DIR/f31 $DIR/f31 || error @@ -1394,7 +1516,7 @@ test_31f() { # bug 4554 $SETSTRIPE $DIR/d31f -s 1048576 -c 1 cp /etc/hosts $DIR/d31f ls -l $DIR/d31f - $DIR/d31f/hosts + $GETSTRIPE $DIR/d31f/hosts multiop_bg_pause $DIR/d31f D_c || return 1 MULTIPID2=$! @@ -1724,6 +1846,70 @@ test_33b() { } run_test 33b "test open file with malformed flags (No panic and return error)" +test_33c() { + local ostnum + local ostname + local write_bytes + local all_zeros + + all_zeros=: + rm -fr $DIR/d33 + mkdir -p $DIR/d33 + # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0 + + sync + for ostnum in $(seq $OSTCOUNT); do + # test-framework's OST numbering is one-based, while Lustre's + # is zero-based + ostname=$(printf "lustre-OST%.4d" $((ostnum - 1))) + # Parsing llobdstat's output sucks; we could grep the /proc + # path, but that's likely to not be as portable as using the + # llobdstat utility. So we parse lctl output instead. + write_bytes=$(do_facet ost$ostnum lctl get_param -n \ + obdfilter/$ostname/stats | + awk '/^write_bytes/ {print $7}' ) + echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes" + if (( ${write_bytes:-0} > 0 )) + then + all_zeros=false + break; + fi + done + + $all_zeros || return 0 + + # Write four bytes + echo foo > $DIR/d33/bar + # Really write them + sync + + # Total up write_bytes after writing. We'd better find non-zeros. + for ostnum in $(seq $OSTCOUNT); do + ostname=$(printf "lustre-OST%.4d" $((ostnum - 1))) + write_bytes=$(do_facet ost$ostnum lctl get_param -n \ + obdfilter/$ostname/stats | + awk '/^write_bytes/ {print $7}' ) + echo "write_bytes@$OSTnum/$ostname=$write_bytes" + if (( ${write_bytes:-0} > 0 )) + then + all_zeros=false + break; + fi + done + + if $all_zeros + then + for ostnum in $(seq $OSTCOUNT); do + ostname=$(printf "lustre-OST%.4d" $((ostnum - 1))) + echo "Check that write_bytes is present in obdfilter/*/stats:" + do_facet ost$ostnum lctl get_param -n \ + obdfilter/$ostname/stats + done + error "OST not keeping write_bytes stats (b22312)" + fi +} +run_test 33c "test llobdstat and write_bytes" + TEST_34_SIZE=${TEST_34_SIZE:-2000000000000} test_34a() { rm -f $DIR/f34 @@ -1785,6 +1971,23 @@ test_34f() { # bug 6242, 6243 } run_test 34f "read from a file with no objects until EOF =======" +test_34g() { + dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE || error + $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error + $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile || error "truncate failed" + cancel_lru_locks osc + $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile || \ + error "wrong size after lock cancel" + + $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error + $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile || \ + error "expanding truncate failed" + cancel_lru_locks osc + $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile || \ + error "wrong expanded size after lock cancel" +} +run_test 34g "truncate long file ===============================" + test_35a() { cp /bin/sh $DIR/f35a chmod 444 $DIR/f35a @@ -1830,15 +2033,15 @@ test_36e() { } run_test 36e "utime on non-owned file (should return error) ====" -test_36f() { +subr_36fh() { + local fl="$1" local LANG_SAVE=$LANG local LC_LANG_SAVE=$LC_LANG export LANG=C LC_LANG=C # for date language DATESTR="Dec 20 2000" mkdir -p $DIR/$tdir - #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214 - lctl set_param fail_loc=0x80000214 + lctl set_param fail_loc=$fl date; date +%s cp /etc/hosts $DIR/$tdir/$tfile sync & # write RPC generated with "current" inode timestamp, but delayed @@ -1856,6 +2059,11 @@ test_36f() { export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE } + +test_36f() { + #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214 + subr_36fh "0x80000214" +} run_test 36f "utime on file racing with OST BRW write ==========" test_36g() { @@ -1873,6 +2081,12 @@ test_36g() { } run_test 36g "filter mod data cache expiry =====================" +test_36h() { + #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227 + subr_36fh "0x80000227" +} +run_test 36h "utime on file racing with OST BRW write ==========" + test_37() { mkdir -p $DIR/$tdir echo f > $DIR/$tdir/fbugfile @@ -1904,16 +2118,332 @@ test_39() { $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then echo "mtime" - ls -l $DIR/$tfile $DIR/${tfile}2 + ls -l --full-time $DIR/$tfile $DIR/${tfile}2 echo "atime" - ls -lu $DIR/$tfile $DIR/${tfile}2 + ls -lu --full-time $DIR/$tfile $DIR/${tfile}2 echo "ctime" - ls -lc $DIR/$tfile $DIR/${tfile}2 + ls -lc --full-time $DIR/$tfile $DIR/${tfile}2 error "O_TRUNC didn't change timestamps" fi } run_test 39 "mtime changed on create ===========================" +test_39b() { + mkdir -p $DIR/$tdir + cp -p /etc/passwd $DIR/$tdir/fopen + cp -p /etc/passwd $DIR/$tdir/flink + cp -p /etc/passwd $DIR/$tdir/funlink + cp -p /etc/passwd $DIR/$tdir/frename + ln $DIR/$tdir/funlink $DIR/$tdir/funlink2 + + sleep 1 + echo "aaaaaa" >> $DIR/$tdir/fopen + echo "aaaaaa" >> $DIR/$tdir/flink + echo "aaaaaa" >> $DIR/$tdir/funlink + echo "aaaaaa" >> $DIR/$tdir/frename + + local open_new=`stat -c %Y $DIR/$tdir/fopen` + local link_new=`stat -c %Y $DIR/$tdir/flink` + local unlink_new=`stat -c %Y $DIR/$tdir/funlink` + local rename_new=`stat -c %Y $DIR/$tdir/frename` + + cat $DIR/$tdir/fopen > /dev/null + ln $DIR/$tdir/flink $DIR/$tdir/flink2 + rm -f $DIR/$tdir/funlink2 + mv -f $DIR/$tdir/frename $DIR/$tdir/frename2 + + for (( i=0; i < 2; i++ )) ; do + local open_new2=`stat -c %Y $DIR/$tdir/fopen` + local link_new2=`stat -c %Y $DIR/$tdir/flink` + local unlink_new2=`stat -c %Y $DIR/$tdir/funlink` + local rename_new2=`stat -c %Y $DIR/$tdir/frename2` + + [ $open_new2 -eq $open_new ] || error "open file reverses mtime" + [ $link_new2 -eq $link_new ] || error "link file reverses mtime" + [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime" + [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39b "mtime change on open, link, unlink, rename ======" + +# this should be set to past +TEST_39_MTIME=`date -d "1 year ago" +%s` + +# bug 11063 +test_39c() { + touch $DIR1/$tfile + sleep 2 + local mtime0=`stat -c %Y $DIR1/$tfile` + + touch -m -d @$TEST_39_MTIME $DIR1/$tfile + local mtime1=`stat -c %Y $DIR1/$tfile` + [ "$mtime1" = $TEST_39_MTIME ] || \ + error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME" + + local d1=`date +%s` + echo hello >> $DIR1/$tfile + local d2=`date +%s` + local mtime2=`stat -c %Y $DIR1/$tfile` + [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \ + error "mtime is not updated on write: $d1 <= $mtime2 <= $d2" + + mv $DIR1/$tfile $DIR1/$tfile-1 + + for (( i=0; i < 2; i++ )) ; do + local mtime3=`stat -c %Y $DIR1/$tfile-1` + [ "$mtime2" = "$mtime3" ] || \ + error "mtime ($mtime2) changed (to $mtime3) on rename" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39c "mtime change on rename ===========================" + +# bug 21114 +test_39d() { + touch $DIR1/$tfile + + touch -m -d @$TEST_39_MTIME $DIR1/$tfile + + for (( i=0; i < 2; i++ )) ; do + local mtime=`stat -c %Y $DIR1/$tfile` + [ $mtime = $TEST_39_MTIME ] || \ + error "mtime($mtime) is not set to $TEST_39_MTIME" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39d "create, utime, stat ==============================" + +# bug 21114 +test_39e() { + touch $DIR1/$tfile + local mtime1=`stat -c %Y $DIR1/$tfile` + + touch -m -d @$TEST_39_MTIME $DIR1/$tfile + + for (( i=0; i < 2; i++ )) ; do + local mtime2=`stat -c %Y $DIR1/$tfile` + [ $mtime2 = $TEST_39_MTIME ] || \ + error "mtime($mtime2) is not set to $TEST_39_MTIME" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39e "create, stat, utime, stat ========================" + +# bug 21114 +test_39f() { + touch $DIR1/$tfile + mtime1=`stat -c %Y $DIR1/$tfile` + + sleep 2 + touch -m -d @$TEST_39_MTIME $DIR1/$tfile + + for (( i=0; i < 2; i++ )) ; do + local mtime2=`stat -c %Y $DIR1/$tfile` + [ $mtime2 = $TEST_39_MTIME ] || \ + error "mtime($mtime2) is not set to $TEST_39_MTIME" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39f "create, stat, sleep, utime, stat =================" + +# bug 11063 +test_39g() { + echo hello >> $DIR1/$tfile + local mtime1=`stat -c %Y $DIR1/$tfile` + + sleep 2 + chmod o+r $DIR1/$tfile + + for (( i=0; i < 2; i++ )) ; do + local mtime2=`stat -c %Y $DIR1/$tfile` + [ "$mtime1" = "$mtime2" ] || \ + error "lost mtime: $mtime2, should be $mtime1" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39g "write, chmod, stat ===============================" + +# bug 11063 +test_39h() { + touch $DIR1/$tfile + sleep 1 + + local d1=`date` + echo hello >> $DIR1/$tfile + local mtime1=`stat -c %Y $DIR1/$tfile` + + touch -m -d @$TEST_39_MTIME $DIR1/$tfile + local d2=`date` + if [ "$d1" != "$d2" ]; then + echo "write and touch not within one second" + else + for (( i=0; i < 2; i++ )) ; do + local mtime2=`stat -c %Y $DIR1/$tfile` + [ "$mtime2" = $TEST_39_MTIME ] || \ + error "lost mtime: $mtime2, should be $TEST_39_MTIME" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done + fi +} +run_test 39h "write, utime within one second, stat =============" + +test_39i() { + touch $DIR1/$tfile + sleep 1 + + echo hello >> $DIR1/$tfile + local mtime1=`stat -c %Y $DIR1/$tfile` + + mv $DIR1/$tfile $DIR1/$tfile-1 + + for (( i=0; i < 2; i++ )) ; do + local mtime2=`stat -c %Y $DIR1/$tfile-1` + + [ "$mtime1" = "$mtime2" ] || \ + error "lost mtime: $mtime2, should be $mtime1" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39i "write, rename, stat ==============================" + +test_39j() { + touch $DIR1/$tfile + sleep 1 + + multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed" + local multipid=$! + local mtime1=`stat -c %Y $DIR1/$tfile` + + mv $DIR1/$tfile $DIR1/$tfile-1 + + kill -USR1 $multipid + wait $multipid || error "multiop close failed" + + for (( i=0; i < 2; i++ )) ; do + local mtime2=`stat -c %Y $DIR1/$tfile-1` + [ "$mtime1" = "$mtime2" ] || \ + error "mtime is lost on close: $mtime2, should be $mtime1" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39j "write, rename, close, stat =======================" + +test_39k() { + touch $DIR1/$tfile + sleep 1 + + multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed" + local multipid=$! + local mtime1=`stat -c %Y $DIR1/$tfile` + + touch -m -d @$TEST_39_MTIME $DIR1/$tfile + + kill -USR1 $multipid + wait $multipid || error "multiop close failed" + + for (( i=0; i < 2; i++ )) ; do + local mtime2=`stat -c %Y $DIR1/$tfile` + + [ "$mtime2" = $TEST_39_MTIME ] || \ + error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39k "write, utime, close, stat ========================" + +# this should be set to future +TEST_39_ATIME=`date -d "1 year" +%s` + +test_39l() { + local atime_diff=$(do_facet $SINGLEMDS lctl get_param -n mdd.*.atime_diff) + + mkdir -p $DIR/$tdir + + # test setting directory atime to future + touch -a -d @$TEST_39_ATIME $DIR/$tdir + local atime=$(stat -c %X $DIR/$tdir) + [ "$atime" = $TEST_39_ATIME ] || \ + error "atime is not set to future: $atime, should be $TEST_39_ATIME" + + # test setting directory atime from future to now + local d1=$(date +%s) + ls $DIR/$tdir + local d2=$(date +%s) + + cancel_lru_locks mdc + atime=$(stat -c %X $DIR/$tdir) + [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] || \ + error "atime is not updated from future: $atime, should be $d1 dir atime + atime_diff + d1=$(date +%s) + ls $DIR/$tdir + d2=$(date +%s) + cancel_lru_locks mdc + atime=$(stat -c %X $DIR/$tdir) + [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] || \ + error "atime is not updated : $atime, should be $d2" + + do_facet $SINGLEMDS lctl set_param -n mdd.*.atime_diff=60 + sleep 3 + + # test not setting directory atime when now < dir atime + atime_diff + ls $DIR/$tdir + cancel_lru_locks mdc + atime=$(stat -c %X $DIR/$tdir) + [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] || \ + error "atime is updated to $atime, should remain $d1/dev/null + done + $LCTL get_param $proc_osc0/cur_dirty_bytes + $LCTL get_param $proc_osc0/cur_grant_bytes + + # perform the real test + $LCTL set_param $proc_osc0/rpc_stats 0 + for ((;i<$files; i++)); do + [ $($LFS getstripe -i $TDIR/f$i) -eq 0 ] || continue + dd if=/dev/zero of=$TDIR/f$i bs=$pagesz count=$pages 2>/dev/null + done + sync + $LCTL get_param $proc_osc0/rpc_stats + + $LCTL get_param $proc_osc0/rpc_stats | + while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do + [ "$PPR" != "16:" ] && continue + [ $WPCT -lt 85 ] && error "$pages-page write RPCs only $WPCT% < 85%" + break # we only want the "pages per rpc" stat + done + rm -rf $TDIR +} +run_test 42e "verify sub-RPC writes are not done synchronously" + test_43() { mkdir -p $DIR/$tdir cp -p /bin/ls $DIR/$tdir/$tfile @@ -2103,7 +2698,7 @@ test_43b() { cp -p `which multiop` $DIR/d43/multiop || cp -p multiop $DIR/d43/multiop MULTIOP_PROG=$DIR/d43/multiop multiop_bg_pause $TMP/test43.junk O_c || return 1 MULTIOP_PID=$! - truncate $DIR/d43/multiop 0 && error "expected error, got success" + $TRUNCATE $DIR/d43/multiop 0 && error "expected error, got success" kill -USR1 $MULTIOP_PID || return 2 wait $MULTIOP_PID || return 3 rm $TMP/test43.junk @@ -2198,10 +2793,6 @@ test_45() { } run_test 45 "osc io page accounting ============================" -page_size() { - getconf PAGE_SIZE -} - # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this # test tickles a bug where re-dirtying a page was failing to be mapped to the # objects offset and an assert hit when an rpc was built with 1023's mapped @@ -2471,7 +3062,7 @@ test_52a() { link $DIR/d52a/foo $DIR/d52a/foo_link 2>/dev/null && error "link worked" echo foo >> $DIR/d52a/foo || error "append foo failed" mrename $DIR/d52a/foo $DIR/d52a/foo_ren && error "rename worked" - lsattr $DIR/d52a/foo | egrep -q "^-+[ae]-+ $DIR/d52a/foo" || error "lsattr" + lsattr $DIR/d52a/foo | egrep -q "^-+a[-e]+ $DIR/d52a/foo" || error "lsattr" chattr -a $DIR/d52a/foo || error "chattr -a failed" cp -r $DIR/d52a /tmp/ rm -fr $DIR/d52a || error "cleanup rm failed" @@ -2491,7 +3082,7 @@ test_52b() { mrename $DIR/d52b/foo $DIR/d52b/foo_ren && error "rename worked" [ -f $DIR/d52b/foo ] || error [ -f $DIR/d52b/foo_ren ] && error - lsattr $DIR/d52b/foo | egrep -q "^-+[ie]-+ $DIR/d52b/foo" || error "lsattr" + lsattr $DIR/d52b/foo | egrep -q "^-+i[-e]+ $DIR/d52b/foo" || error "lsattr" chattr -i $DIR/d52b/foo || error "chattr failed" rm -fr $DIR/d52b || error @@ -2509,7 +3100,8 @@ test_53() { local ostnum # only test MDT0000 - for value in $(do_facet $SINGLEMDS lctl get_param osc.*-osc-MDT0000.prealloc_last_id) ; do + local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS) + for value in $(do_facet $SINGLEMDS lctl get_param osc.$mdtosc.prealloc_last_id) ; do param=`echo ${value[0]} | cut -d "=" -f1` ostname=`echo $param | cut -d "." -f2 | cut -d - -f 1-2` mds_last=$(do_facet $SINGLEMDS lctl get_param -n $param) @@ -2593,30 +3185,8 @@ test_54e() { } run_test 54e "console/tty device works in lustre ======================" -check_fstype() { - grep -q $FSTYPE /proc/filesystems && return 1 - modprobe $FSTYPE - grep -q $FSTYPE /proc/filesystems && return 1 - insmod ../$FSTYPE/$FSTYPE.o - grep -q $FSTYPE /proc/filesystems && return 1 - insmod ../$FSTYPE/$FSTYPE.ko - grep -q $FSTYPE /proc/filesystems && return 1 - return 0 -} - -test_55() { - rm -rf $DIR/d55 - mkdir $DIR/d55 - client_only && skip "Not a server" && return - mount -t $FSTYPE -o loop,iopen $EXT2_DEV $DIR/d55 || error "mounting" - touch $DIR/d55/foo - $IOPENTEST1 $DIR/d55/foo $DIR/d55 || error "running $IOPENTEST1" - $IOPENTEST2 $DIR/d55 || error "running $IOPENTEST2" - echo "check for $EXT2_DEV. Please wait..." - rm -rf $DIR/d55/* - $UMOUNT $DIR/d55 || error "unmounting" -} -run_test 55 "check iopen_connect_dentry() ======================" +#The test_55 used to be iopen test and it was removed by bz#24037. +#run_test 55 "check iopen_connect_dentry() ======================" test_56a() { # was test_56 rm -rf $DIR/d56 @@ -2745,8 +3315,8 @@ run_test 56h "check lfs find ! -name =============================" test_56i() { tdir=${tdir}i mkdir -p $DIR/$tdir - UUID=`$LFS osts | awk '/0: / { print $2 }'` - OUT="`$LFIND -ost $UUID $DIR/$tdir`" + UUID=$(ostuuid_from_index 0 $DIR/$tdir) + OUT=$($LFIND -obd $UUID $DIR/$tdir) [ "$OUT" ] && error "$LFIND returned directory '$OUT'" || true } run_test 56i "check 'lfs find -ost UUID' skips directories =======" @@ -2849,14 +3419,14 @@ test_56q() { setup_56 $NUMFILES $NUMDIRS - chgrp $RUNAS_ID $TDIR/file* || error "chown $DIR/${tdir}g/file$i failed" + chgrp $RUNAS_GID $TDIR/file* || error "chown $DIR/${tdir}g/file$i failed" EXPECTED=$NUMFILES - NUMS="`$LFIND -gid $RUNAS_ID $TDIR | wc -l`" + NUMS="`$LFIND -gid $RUNAS_GID $TDIR | wc -l`" [ $NUMS -eq $EXPECTED ] || \ error "lfs find -gid $TDIR wrong: found $NUMS, expected $EXPECTED" EXPECTED=$(( ($NUMFILES+1) * $NUMDIRS + 1)) - NUMS="`$LFIND ! -gid $RUNAS_ID $TDIR | wc -l`" + NUMS="`$LFIND ! -gid $RUNAS_GID $TDIR | wc -l`" [ $NUMS -eq $EXPECTED ] || \ error "lfs find ! -gid $TDIR wrong: found $NUMS, expected $EXPECTED" @@ -2864,11 +3434,43 @@ test_56q() { } run_test 56q "check lfs find -gid and ! -gid ===============================" +test_56r() { + setup_56 $NUMFILES $NUMDIRS + TDIR=$DIR/${tdir}g + + EXPECTED=12 + NUMS=`$LFIND -size 0 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR -size 0 wrong: found $NUMS, expected $EXPECTED" + EXPECTED=0 + NUMS=`$LFIND ! -size 0 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR ! -size 0 wrong: found $NUMS, expected $EXPECTED" + echo "test" > $TDIR/56r && sync + EXPECTED=1 + NUMS=`$LFIND -size 5 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR -size 5 wrong: found $NUMS, expected $EXPECTED" + EXPECTED=1 + NUMS=`$LFIND -size +5 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR -size +5 wrong: found $NUMS, expected $EXPECTED" + EXPECTED=13 + NUMS=`$LFIND -size +0 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR -size +0 wrong: found $NUMS, expected $EXPECTED" + EXPECTED=0 + NUMS=`$LFIND ! -size -5 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR ! -size -5 wrong: found $NUMS, expected $EXPECTED" +} + +run_test 56r "check lfs find -size works ==========================" + test_57a() { # note test will not do anything if MDS is not local remote_mds_nodsh && skip "remote MDS with nodsh" && return - - local MNTDEV="osd.*MDT*.mntdev" + local MNTDEV="osd*.*MDT*.mntdev" DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV) [ -z "$DEV" ] && error "can't access $MNTDEV" for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do @@ -2903,7 +3505,8 @@ test_57b() { sync sleep 1 df $dir #make sure we get new statfs data - local MDSFREE=$(do_facet $mymds lctl get_param -n osd.*MDT000$((num -1)).kbytesfree) + local MDSFREE=$(do_facet $mymds \ + lctl get_param -n osd*.*MDT000$((num -1)).kbytesfree) local MDCFREE=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree) echo "opening files to create objects/EAs" local FILE @@ -2917,7 +3520,8 @@ test_57b() { sleep 1 #make sure we get new statfs data df $dir - local MDSFREE2=$(do_facet $mymds lctl get_param -n osd.*MDT000$((num -1)).kbytesfree) + local MDSFREE2=$(do_facet $mymds \ + lctl get_param -n osd*.*MDT000$((num -1)).kbytesfree) local MDCFREE2=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree) if [ "$MDCFREE2" -lt "$((MDCFREE - 8))" ]; then if [ "$MDSFREE" != "$MDSFREE2" ]; then @@ -3201,7 +3805,7 @@ test_65k() { # bug11679 STRIPE_INDEX=`do_facet $SINGLEMDS lctl get_param -n lov.*md*.target_obd | grep $STRIPE_OST | awk -F: '{print $1}' | head -n 1` - [ -f $DIR/$tdir/${STRIPE_INDEX} ] && continue + [ -f $DIR/$tdir/${STRIPE_INDEX} ] && continue echo "$SETSTRIPE $DIR/$tdir/${STRIPE_INDEX} -i ${STRIPE_INDEX} -c 1" do_facet client $SETSTRIPE $DIR/$tdir/${STRIPE_INDEX} -i ${STRIPE_INDEX} -c 1 RC=$? @@ -3334,7 +3938,7 @@ test_69() { $DIRECTIO write ${f}.2 0 1 || error "directio write error" do_facet ost1 lctl set_param fail_loc=0x217 - truncate $f 1 # vmtruncate() will ignore truncate() error. + $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error. $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT" do_facet ost1 lctl set_param fail_loc=0 @@ -3357,12 +3961,12 @@ test_71() { } run_test 71 "Running dbench on lustre (don't segment fault) ====" -test_72() { # bug 5695 - Test that on 2.6 remove_suid works properly +test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly check_kernel_version 43 || return 0 [ "$RUNAS_ID" = "$UID" ] && skip_env "RUNAS_ID = UID = $UID -- skipping" && return # Check that testing environment is properly set up. Skip if not - FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS || { + FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS || { skip_env "User $RUNAS_ID does not exist - skipping" return 0 } @@ -3380,7 +3984,35 @@ test_72() { # bug 5695 - Test that on 2.6 remove_suid works properly true rm -f $DIR/f72 } -run_test 72 "Test that remove suid works properly (bug5695) ====" +run_test 72a "Test that remove suid works properly (bug5695) ====" + +test_72b() { # bug 24226 -- keep mode setting when size is not changing + local perm + + [ "$RUNAS_ID" = "$UID" ] && \ + skip_env "RUNAS_ID = UID = $UID -- skipping" && return + [ "$RUNAS_ID" -eq 0 ] && \ + skip_env "RUNAS_ID = 0 -- skipping" && return + + # Check that testing environment is properly set up. Skip if not + FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS || { + skip_env "User $RUNAS_ID does not exist - skipping" + return 0 + } + touch $DIR/${tfile}-f{g,u} + mkdir $DIR/${tfile}-d{g,u} + chmod 770 $DIR/${tfile}-{f,d}{g,u} + chmod g+s $DIR/${tfile}-{f,d}g + chmod u+s $DIR/${tfile}-{f,d}u + for perm in 777 2777 4777; do + $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm" + $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm" + $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm" + $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm" + done + true +} +run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)" # bug 3462 - multiple simultaneous MDC requests test_73() { @@ -3439,14 +4071,34 @@ test_74b() { # bug 13310 } run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)" +test_74c() { +#define OBD_FAIL_LDLM_NEW_LOCK + lctl set_param fail_loc=0x80000319 + touch $DIR/$tfile && error "Touch successful" + true +} +run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)" + num_inodes() { awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo } -test_76() { # bug 1443 - DETH=$(grep deathrow /proc/kallsyms /proc/ksyms 2> /dev/null | wc -l) - [ $DETH -eq 0 ] && skip "No _iget." && return 0 - BEFORE_INODES=`num_inodes` +get_inode_slab_tunables() { + awk '/lustre_inode_cache/ {print $9," ",$10," ",$11; exit}' /proc/slabinfo +} + +set_inode_slab_tunables() { + echo "lustre_inode_cache $1" > /proc/slabinfo +} + +test_76() { # Now for bug 20433, added originally in bug 1443 + local SLAB_SETTINGS=`get_inode_slab_tunables` + local CPUS=`getconf _NPROCESSORS_ONLN` + # we cannot set limit below 1 which means 1 inode in each + # per-cpu cache is still allowed + set_inode_slab_tunables "1 1 0" + cancel_lru_locks osc + BEFORE_INODES=`num_inodes` echo "before inodes: $BEFORE_INODES" local COUNT=1000 [ "$SLOW" = "no" ] && COUNT=100 @@ -3454,13 +4106,23 @@ test_76() { # bug 1443 touch $DIR/$tfile rm -f $DIR/$tfile done + cancel_lru_locks osc AFTER_INODES=`num_inodes` echo "after inodes: $AFTER_INODES" - [ $AFTER_INODES -gt $((BEFORE_INODES + 32)) ] && \ - error "inode slab grew from $BEFORE_INODES to $AFTER_INODES" - true + local wait=0 + while [ $((AFTER_INODES-1*CPUS)) -gt $BEFORE_INODES ]; do + sleep 2 + AFTER_INODES=`num_inodes` + wait=$((wait+2)) + echo "wait $wait seconds inodes: $AFTER_INODES" + if [ $wait -gt 30 ]; then + error "inode slab grew from $BEFORE_INODES to $AFTER_INODES" + fi + done + set_inode_slab_tunables "$SLAB_SETTINGS" } -run_test 76 "destroy duplicate inodes in client inode cache ====" +run_test 76 "confirm clients recycle inodes properly ====" + export ORIG_CSUM="" set_checksums() @@ -3878,28 +4540,23 @@ test_101() { } run_test 101 "check read-ahead for random reads ================" -export SETUP_TEST101=no -setup_test101() { - [ "$SETUP_TEST101" = "yes" ] && return +setup_test101b() { mkdir -p $DIR/$tdir STRIPE_SIZE=1048576 STRIPE_COUNT=$OSTCOUNT STRIPE_OFFSET=0 - trap cleanup_test101 EXIT + trap cleanup_test101b EXIT # prepare the read-ahead file $SETSTRIPE $DIR/$tfile -s $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT dd if=/dev/zero of=$DIR/$tfile bs=1024k count=100 2> /dev/null - SETUP_TEST101=yes } -cleanup_test101() { - [ "$SETUP_TEST101" = "yes" ] || return +cleanup_test101b() { trap 0 rm -rf $DIR/$tdir - rm -f $DIR/$tfile - SETUP_TEST101=no + rm -f $DIR/$tfile } calc_total() { @@ -3933,7 +4590,7 @@ test_101b() { local FILE_LENGTH=$((STRIPE_SIZE*100)) local ITERATION=$((FILE_LENGTH/STRIDE_SIZE)) # prepare the read-ahead file - setup_test101 + setup_test101b cancel_lru_locks osc for BIDX in 2 4 8 16 32 64 128 256 do @@ -3947,7 +4604,7 @@ test_101b() { cancel_lru_locks osc ra_check_101 $BSIZE done - cleanup_test101 + cleanup_test101b true } run_test 101b "check stride-io mode read-ahead =================" @@ -3997,9 +4654,7 @@ test_101d() { } run_test 101d "file read with and without read-ahead enabled =================" -export SETUP_TEST102=no setup_test102() { - [ "$SETUP_TEST102" = "yes" ] && return mkdir -p $DIR/$tdir chown $RUNAS_ID $DIR/$tdir STRIPE_SIZE=65536 @@ -4026,14 +4681,12 @@ setup_test102() { cd $DIR $1 $TAR cf $TMP/f102.tar $tdir --xattrs - SETUP_TEST102=yes } cleanup_test102() { trap 0 - [ "$SETUP_TEST102" = "yes" ] || return 0 rm -f $TMP/f102.tar - SETUP_TEST102=no + rm -rf $DIR/d0.sanity/d102 } test_102a() { @@ -4286,6 +4939,28 @@ test_102j() { } run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ===" +test_102k() { + touch $DIR/$tfile + # b22187 just check that does not crash for regular file. + setfattr -n trusted.lov $DIR/$tfile + # b22187 'setfattr -n trusted.lov' should work as remove LOV EA for directories + local test_kdir=$DIR/d102k + mkdir $test_kdir + local default_size=`$GETSTRIPE -s $test_kdir` + local default_count=`$GETSTRIPE -c $test_kdir` + local default_offset=`$GETSTRIPE -o $test_kdir` + $SETSTRIPE -s 65536 -i 1 -c $OSTCOUNT $test_kdir || error 'dir setstripe failed' + setfattr -n trusted.lov $test_kdir + local stripe_size=`$GETSTRIPE -s $test_kdir` + local stripe_count=`$GETSTRIPE -c $test_kdir` + local stripe_offset=`$GETSTRIPE -o $test_kdir` + [ $stripe_size -eq $default_size ] || error "stripe size $stripe_size != $default_size" + [ $stripe_count -eq $default_count ] || error "stripe count $stripe_count != $default_count" + [ $stripe_offset -eq $default_offset ] || error "stripe offset $stripe_offset != $default_offset" + rm -rf $DIR/$tfile $test_kdir +} +run_test 102k "setfattr without parameter of value shouldn't cause a crash" + cleanup_test102 run_acl_subtest() @@ -4339,7 +5014,7 @@ test_103 () { } run_test 103 "acl test =========================================" -test_104() { +test_104a() { touch $DIR/$tfile lfs df || error "lfs df failed" lfs df -ih || error "lfs df -ih failed" @@ -4355,7 +5030,18 @@ test_104() { lfs df || error "lfs df with reactivated OSC failed" rm -f $DIR/$tfile } -run_test 104 "lfs df [-ih] [path] test =========================" +run_test 104a "lfs df [-ih] [path] test =========================" + +test_104b() { + [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping" && return + chmod 666 /dev/obd + denied_cnt=$((`$RUNAS $LFS check servers 2>&1 | grep "Permission denied" | wc -l`)) + if [ $denied_cnt -ne 0 ]; + then + error "lfs check servers test failed" + fi +} +run_test 104b "$RUNAS lfs check servers test ====================" test_105a() { # doesn't work on 2.4 kernels @@ -4584,7 +5270,7 @@ test_116() { [ $MINC -gt 0 ] && echo "Wrote $(($MAXC * 100 / $MINC - 100))% more files to larger OST $MAXI1" [ $MAXC -gt $MINC ] || error_ignore "stripe QOS didn't balance free space" - rm -rf $DIR/$tdir/OST${MINI} + rm -rf $DIR/$tdir } run_test 116 "stripe QOS: free space balance ===================" @@ -4942,16 +5628,17 @@ test_118k() set_nodes_failloc "$(osts_nodes)" 0x20e mkdir -p $DIR/$tdir - for ((i=0;i<10;i++)); do - (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \ + for ((i=0;i<10;i++)); do + (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \ error "dd to $DIR/$tdir/$tfile-$i failed" )& - SLEEPPID=$! - sleep 0.500s - kill $SLEEPPID - wait $SLEEPPID - done + SLEEPPID=$! + sleep 0.500s + kill $SLEEPPID + wait $SLEEPPID + done - set_nodes_failloc "$(osts_nodes)" 0 + set_nodes_failloc "$(osts_nodes)" 0 + rm -rf $DIR/$tdir } run_test 118k "bio alloc -ENOMEM and IO TERM handling =========" @@ -5549,49 +6236,48 @@ test_128() { # bug 15212 run_test 128 "interactive lfs for 2 consecutive find's" set_dir_limits () { - local mntdev - local node + local mntdev + local canondev + local node local LDPROC=/proc/fs/ldiskfs - for node in $(mdts_nodes); do - devs=$(do_node $node "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }') - for dev in $devs; do - mntdev=$(do_node $node "lctl get_param -n osd.$dev.mntdev") - do_node $node "echo $1 >$LDPROC/\\\$(basename $mntdev)/max_dir_size" - done + for facet in $(get_facets MDS); do + canondev=$(ldiskfs_canon *.$(convert_facet2label $facet).mntdev $facet) + do_facet $facet "test -e $LDPROC/$canondev/max_dir_size" || LDPROC=/sys/fs/ldiskfs + do_facet $facet "echo $1 >$LDPROC/$canondev/max_dir_size" done } test_129() { - [ "$FSTYPE" != "ldiskfs" ] && skip "not needed for FSTYPE=$FSTYPE" && return 0 - remote_mds_nodsh && skip "remote MDS with nodsh" && return + [ "$FSTYPE" != "ldiskfs" ] && skip "not needed for FSTYPE=$FSTYPE" && return 0 + remote_mds_nodsh && skip "remote MDS with nodsh" && return - EFBIG=27 - MAX=16384 + EFBIG=27 + MAX=16384 - set_dir_limits $MAX + set_dir_limits $MAX - mkdir -p $DIR/$tdir + mkdir -p $DIR/$tdir - I=0 - J=0 - while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do - multiop $DIR/$tdir/$J Oc - rc=$? - if [ $rc -eq $EFBIG ]; then - set_dir_limits 0 - echo "return code $rc received as expected" - return 0 - elif [ $rc -ne 0 ]; then - set_dir_limits 0 - error_exit "return code $rc received instead of expected $EFBIG" - fi - J=$((J+1)) - I=$(stat -c%s "$DIR/$tdir") - done + I=0 + J=0 + while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do + multiop $DIR/$tdir/$J Oc + rc=$? + if [ $rc -eq $EFBIG ]; then + set_dir_limits 0 + echo "return code $rc received as expected" + return 0 + elif [ $rc -ne 0 ]; then + set_dir_limits 0 + error_exit "return code $rc received instead of expected $EFBIG" + fi + J=$((J+1)) + I=$(stat -c%s "$DIR/$tdir") + done - error "exceeded dir size limit $MAX x $MDSCOUNT $((MAX * MDSCOUNT)) : $I bytes" - do_facet $SINGLEMDS "echo 0 >$LDPROC" + set_dir_limits 0 + error "exceeded dir size limit $MAX x $MDSCOUNT $((MAX * MDSCOUNT)) : $I bytes" } run_test 129 "test directory size limit ========================" @@ -5911,9 +6597,11 @@ som_mode_switch() { if [ x$som = x"enabled" ]; then [ $((gl2 - gl1)) -gt 0 ] && error "no glimpse RPC is expected" + MOUNTOPT=`echo $MOUNTOPT | sed 's/som_preview//g'` do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=disabled" else [ $((gl2 - gl1)) -gt 0 ] || error "some glimpse RPC is expected" + MOUNTOPT="$MOUNTOPT,som_preview" do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=enabled" fi @@ -5925,8 +6613,9 @@ som_mode_switch() { } test_132() { #1028, SOM - local num=$(get_mds_dir $DIR) - local mymds=mds${num} + local num=$(get_mds_dir $DIR) + local mymds=mds${num} + local MOUNTOPT_SAVE=$MOUNTOPT dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null cancel_lru_locks osc @@ -5956,8 +6645,9 @@ test_132() { #1028, SOM gl1=$(get_ost_param "ldlm_glimpse_enqueue") stat $DIR/$tfile >/dev/null gl2=$(get_ost_param "ldlm_glimpse_enqueue") - echo "SOM is "$som2", "$((gl2 - gl1))" glimpse RPC occured" + echo "====> SOM is "$som2", "$((gl2 - gl1))" glimpse RPC occured" som_mode_switch $som2 $gl1 $gl2 + MOUNTOPT=$MOUNTOPT_SAVE } run_test 132 "som avoids glimpse rpc" @@ -6443,7 +7133,7 @@ test_161() { rm $DIR/$tdir/$tfile # rename mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie - if [ "$($LFS fid2path $DIR --link 1 $FID)" != "/$tdir/foo2/maggie" ] + if [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] then $LFS fid2path $DIR $FID err17935 "bad link rename" @@ -6477,42 +7167,47 @@ check_path() { err17935 "path looked up \"${path}\" instead of \"${expected}\"" return 2 fi - echo "fid $fid resolves to path $path" + echo "fid $fid resolves to path $path (expected $expected)" } test_162() { - # Make changes to filesystem - mkdir -p $DIR/$tdir/d2 - touch $DIR/$tdir/d2/$tfile - touch $DIR/$tdir/d2/x1 - touch $DIR/$tdir/d2/x2 - mkdir -p $DIR/$tdir/d2/a/b/c - mkdir -p $DIR/$tdir/d2/p/q/r + # Make changes to filesystem + mkdir -p $DIR/$tdir/d2 + touch $DIR/$tdir/d2/$tfile + touch $DIR/$tdir/d2/x1 + touch $DIR/$tdir/d2/x2 + mkdir -p $DIR/$tdir/d2/a/b/c + mkdir -p $DIR/$tdir/d2/p/q/r # regular file - FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[') - check_path "/$tdir/d2/$tfile" $DIR $FID --link 0 + FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]') + check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0 # softlink - ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink - FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[') - check_path "/$tdir/d2/p/q/r/slink" $DIR $FID --link 0 + ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink + FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]') + check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0 + + # softlink to wrong file + ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong + FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]') + check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0 # hardlink - ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink - mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file - FID=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[') - # fid2path dir/fsname should both work - check_path "/$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1 - check_path "/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0 - - # hardlink count: check that there are 2 links - # Doesnt work with CMD yet: 17935 + ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink + mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file + FID=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]') + # fid2path dir/fsname should both work + check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1 + check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0 + + # hardlink count: check that there are 2 links + # Doesnt work with CMD yet: 17935 ${LFS} fid2path $DIR $FID | wc -l | grep -q 2 || \ err17935 "expected 2 links" # hardlink indexing: remove the first link - rm $DIR/$tdir/d2/p/q/r/hlink - check_path "/$tdir/d2/a/b/c/new_file" $DIR $FID --link 0 + rm $DIR/$tdir/d2/p/q/r/hlink + check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0 return 0 } @@ -6520,15 +7215,16 @@ run_test 162 "path lookup sanity" test_163() { remote_mds_nodsh && skip "remote MDS with nodsh" && return - copytool --test || { skip "copytool not runnable: $?" && return; } - copytool & + copytool --test $FSNAME || { skip "copytool not runnable: $?" && return; } + copytool $FSNAME & sleep 1 local uuid=$($LCTL get_param -n mdc.${FSNAME}-MDT0000-mdc-*.uuid) # this proc file is temporary and linux-only - do_facet mds lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid || error "lnl send failed" - kill $! + do_facet $SINGLEMDS lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\ + error "kernel->userspace send failed" + kill -INT $! } -run_test 163 "LustreNetLink kernelcomms" +run_test 163 "kernel <-> userspace comms" test_169() { # do directio so as not to populate the page cache @@ -6618,6 +7314,7 @@ setup_obdecho_osc () { local rc=0 local ost_nid=$1 local obdfilter_name=$2 + echo "Creating new osc for $obdfilter_name on $ost_nid" [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \ ${obdfilter_name}_osc_UUID || rc=2; } [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \ @@ -6625,7 +7322,7 @@ setup_obdecho_osc () { return $rc } -cleaup_obdecho_osc () { +cleanup_obdecho_osc () { local obdfilter_name=$1 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null $LCTL --device ${obdfilter_name}_osc detach >/dev/null @@ -6636,47 +7333,60 @@ obdecho_create_test() { local OBD=$1 local node=$2 local rc=0 + local id do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1 - [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" || \ + [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" || rc=2; } - [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec create 1" || \ - rc=3; } - [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec test_brw 0 w 1" ||\ + if [ $rc -eq 0 ]; then + id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}') + [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3 + fi + echo "New object id is $id" + [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec test_brw 10 w v 64 $id" || rc=4; } [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \ "cleanup" || rc=5; } [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \ "detach" || rc=6; } + [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc" return $rc } -test_180() { +test_180a() { local rc=0 local rmmod_local=0 - local rmmod_remote=0 - lsmod | grep -q obdecho || \ - { load_module obdecho/obdecho && rmmod_local=1; } - OBD=$($LCTL dl | grep -v mdt | grep osc | awk '{print $4;exit}') - HOST=$($LCTL dl -t | grep -v mdt | grep osc | awk '{print $7;exit}') - OBD=`echo $OBD | sed 's/-osc-.*$//'` - [ "x$OBD" != "x" ] && { setup_obdecho_osc $HOST $OBD || rc=1; } || rc=1 - [ $rc -eq 0 ] && { obdecho_create_test ${OBD}_osc client || rc=2; } - [ "x$OBD" != "x" ] && cleaup_obdecho_osc $OBD + if ! module_loaded obdecho; then + load_module obdecho/obdecho + rmmod_local=1 + fi + + local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}') + local host=$(awk '/current_connection:/ {print $2}' /proc/fs/lustre/osc/$osc/import) + local target=$(awk '/target:/ {print $2}' /proc/fs/lustre/osc/$osc/import) + target=${target%_UUID} + + [[ -n $target ]] && { setup_obdecho_osc $host $target || rc=1; } || rc=1 + [ $rc -eq 0 ] && { obdecho_create_test ${target}_osc client || rc=2; } + [[ -n $target ]] && cleanup_obdecho_osc $target [ $rmmod_local -eq 1 ] && rmmod obdecho - [ $rc -eq 0 ] || return $rc + return $rc +} +run_test 180a "test obdecho on osc" + +test_180b() { + local rc=0 + local rmmod_remote=0 do_facet ost "lsmod | grep -q obdecho || " \ "{ insmod ${LUSTRE}/obdecho/obdecho.ko || " \ "modprobe obdecho; }" && rmmod_remote=1 - OBD=$(do_facet ost $LCTL dl | awk '/obdfilter/ {print $4;exit}') - [ "x$OBD" != "x" ] && { obdecho_create_test $OBD ost || rc=3; } + target=$(do_facet ost $LCTL dl | awk '/obdfilter/ {print $4;exit}') + [[ -n $target ]] && { obdecho_create_test $target ost || rc=1; } [ $rmmod_remote -eq 1 ] && do_facet ost "rmmod obdecho" - [ $rc -eq 0 ] || return $rc - - true + return $rc } -run_test 180 "test obdecho ============================================" +run_test 180b "test obdecho directly on obdfilter" # OST pools tests POOL=${POOL:-cea1} @@ -6686,7 +7396,8 @@ TGTPOOL_MAX=$(($TGT_COUNT - 1)) TGTPOOL_STEP=2 TGTPOOL_LIST=`seq $TGTPOOL_FIRST $TGTPOOL_STEP $TGTPOOL_MAX` POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools} -POOL_DIR=$POOL_ROOT/dir_tst +POOL_DIR_NAME=dir_tst +POOL_DIR=$POOL_ROOT/$POOL_DIR_NAME POOL_FILE=$POOL_ROOT/file_tst check_file_in_pool() @@ -6736,13 +7447,25 @@ test_200c() { mkdir -p $POOL_DIR $SETSTRIPE -c 2 -p $POOL $POOL_DIR [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR" + # b-19919 test relative path works well + mkdir -p $POOL_DIR/$POOL_DIR_NAME + cd $POOL_DIR + $SETSTRIPE -c 2 -p $POOL $POOL_DIR_NAME + [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR/$POOL_DIR_NAME" + $SETSTRIPE -c 2 -p $POOL ./$POOL_DIR_NAME + [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR/./$POOL_DIR_NAME" + $SETSTRIPE -c 2 -p $POOL ../$POOL_DIR_NAME + [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR/../$POOL_DIR_NAME" + $SETSTRIPE -c 2 -p $POOL ../$POOL_DIR_NAME/$POOL_DIR_NAME + [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR/../$POOL_DIR_NAME/$POOL_DIR_NAME" + rm -rf $POOL_DIR_NAME; cd - } run_test 200c "Set pool on a directory =================================" test_200d() { remote_mgs_nodsh && skip "remote MGS with nodsh" && return - res=$($GETSTRIPE --pool $POOL_DIR | awk '/^pool:/ {print $2}') - [ "$res" = $POOL ] || error "Pool on $POOL_DIR is $res, not $POOL" + res=$($GETSTRIPE --pool $POOL_DIR) + [ $res = $POOL ] || error "Pool on $POOL_DIR is $res, not $POOL" } run_test 200d "Check pool on a directory ===============================" @@ -6789,6 +7512,18 @@ test_200g() { } run_test 200g "lfs df a pool ============================================" +test_200h() { # b=24039 + mkdir -p $POOL_DIR || error "unable to create $POOL_DIR" + + local file="/..$POOL_DIR/$tfile-1" + $SETSTRIPE -p $POOL $file || error "unable to create $file" + + cd $POOL_DIR + $SETSTRIPE -p $POOL $tfile-2 || \ + error "unable to create $tfile-2 in $POOL_DIR" +} +run_test 200h "Create files in a pool with relative pathname ============" + test_201a() { remote_mgs_nodsh && skip "remote MGS with nodsh" && return TGT=$($LCTL get_param -n lov.$FSNAME-*.pools.$POOL | head -1) @@ -6961,12 +7696,12 @@ test_215() { # for bugs 18102, 21079, 21517 remove_lnet_proc_files "routers" # /proc/sys/lnet/peers should look like this: - # nid refs state max rtr min tx min queue + # nid refs state last max rtr min tx min queue # where nid is a string like 192.168.1.1@tcp2, refs > 0, - # state is up/down/NA, max >= 0. rtr, min, tx, min are + # state is up/down/NA, max >= 0. last, rtr, min, tx, min are # numeric (0 or >0 or <0), queue >= 0. - L1="^nid +refs +state +max +rtr +min +tx +min +queue$" - BR="^$NID +$P +(up|down|NA) +$N +$I +$I +$I +$I +$N$" + L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$" + BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$" create_lnet_proc_files "peers" check_lnet_proc_entry "peers.out" "/proc/sys/lnet/peers" "$BR" "$L1" check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1" @@ -7036,6 +7771,36 @@ test_216() { # bug 20317 } run_test 216 "check lockless direct write works and updates file size and kms correctly" +test_217() { # bug 22430 + local node + for node in $(nodes_list); do + if [[ $node = *-* ]] ; then + echo "lctl ping $node@$NETTYPE" + lctl ping $node@$NETTYPE + else + echo "skipping $node (no hiphen detected)" + fi + done +} +run_test 217 "check lctl ping for hostnames with hiphen ('-')" + +test_218() { + # do directio so as not to populate the page cache + log "creating a 10 Mb file" + multiop $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file" + log "starting reads" + dd if=$DIR/$tfile of=/dev/null bs=4096 & + log "truncating the file" + multiop $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file" + log "killing dd" + kill %+ || true # reads might have finished + echo "wait until dd is finished" + wait + log "removing the temporary file" + rm -rf $DIR/$tfile || error "tmp file removal failed" +} +run_test 218 "parallel read and truncate should not deadlock =======================" + # # tests that do cleanup/setup should be run at the end # @@ -7053,12 +7818,9 @@ test_900() { } run_test 900 "umount should not race with any mgc requeue thread" -log "cleanup: ======================================================" +complete $(basename $0) $SECONDS check_and_cleanup_lustre if [ "$I_MOUNTED" != "yes" ]; then lctl set_param debug="$OLDDEBUG" 2> /dev/null || true fi - -echo '=========================== finished ===============================' -[ -f "$SANITYLOG" ] && cat $SANITYLOG && grep -q FAIL $SANITYLOG && exit 1 || true -echo "$0: completed" +exit_status