OPENFILE=${OPENFILE:-openfile}
OPENUNLINK=${OPENUNLINK:-openunlink}
READS=${READS:-"reads"}
-TRUNCATE=${TRUNCATE:-truncate}
MUNLINK=${MUNLINK:-munlink}
SOCKETSERVER=${SOCKETSERVER:-socketserver}
SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
}
run_test 39l "directory atime update ==========================="
+test_39m() {
+ touch $DIR1/$tfile
+ sleep 2
+ local far_past_mtime=$(date -d "May 29 1953" +%s)
+ local far_past_atime=$(date -d "Dec 17 1903" +%s)
+
+ touch -m -d @$far_past_mtime $DIR1/$tfile
+ touch -a -d @$far_past_atime $DIR1/$tfile
+
+ for (( i=0; i < 2; i++ )) ; do
+ local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
+ [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
+ error "atime or mtime set incorrectly"
+
+ cancel_lru_locks osc
+ if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
+ done
+
+
+}
+run_test 39m "test atime and mtime before 1970"
+
test_40() {
dd if=/dev/zero of=$DIR/f40 bs=4096 count=1
$RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/f40 && error
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
}
run_test 54e "console/tty device works in lustre ======================"
-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
$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
awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
}
+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"
AFTER_INODES=`num_inodes`
echo "after inodes: $AFTER_INODES"
local wait=0
- while [ $AFTER_INODES -gt $BEFORE_INODES ]; do
+ while [ $((AFTER_INODES-1*CPUS)) -gt $BEFORE_INODES ]; do
sleep 2
AFTER_INODES=`num_inodes`
wait=$((wait+2))
error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
fi
done
+ set_inode_slab_tunables "$SLAB_SETTINGS"
}
run_test 76 "confirm clients recycle inodes properly ===="
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 "test -e $LDPROC/\\\$(basename $mntdev)/max_dir_size" || LDPROC=/sys/fs/ldiskfs
- 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 ========================"
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 ==============================="
}
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)
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"
}
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
#