[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.3.55) ] &&
TESTS="4094 4095"
+ # skip long symlink name for rhel6.5.
+ # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
+ grep -q '6.5' /etc/redhat-release && TESTS="59 60 61 4062 4063"
+
for i in $TESTS; do
local SYMNAME=$(str_repeat 'x' $i)
ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
echo "stop and checking mds${mds_index}: $cmd"
# e2fsck should not return error
- stop mds${mds_index} -f
+ stop mds${mds_index}
do_facet mds${mds_index} $cmd || rc=$?
start mds${mds_index} $devname $MDS_MOUNT_OPTS
local cmd
local rc=0
- for mdt_index in $(seq 1 $MDSCOUNT); do
+ # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
+ # so it only check MDT1/MDT2 instead of all of MDTs.
+ for mdt_index in $(seq 1 2); do
devname=$(mdsdevname $mdt_index)
cmd="$E2FSCK -fnvd $devname"
run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
test_17o() {
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.64) ]] &&
+ skip "Need MDS version at least 2.3.64" && return
+
local WDIR=$DIR/${tdir}o
local mdt_index
local mdtdevname
test_24d() {
test_mkdir $DIR/$tdir
test_mkdir $DIR/$tdir/d$testnum.1
- test_mkdir $DIR/$tdir/d$ttestnum.2
+ test_mkdir $DIR/$tdir/d$testnum.2
mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
$CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
$CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
test_24v() {
local NRFILES=100000
- local FREE_INODES=$(lfs_df -i | grep "summary" | awk '{print $4}')
+ local FREE_INODES=$(mdt_free_inodes 0)
[ $FREE_INODES -lt $NRFILES ] && \
skip "not enough free inodes $FREE_INODES required $NRFILES" &&
return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
trap simple_cleanup_common EXIT
+ # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
+ [ $(facet_fstype $SINGLEMDS) = "zfs" ] && NRFILES=10000
+
mkdir -p $DIR/$tdir
createmany -m $DIR/$tdir/$tfile $NRFILES
mkdir -p $remote_dir/tgt_dir
touch $remote_dir/tgt_file
+ mrename $remote_dir $DIR/ &&
+ error "rename dir cross MDT works!"
+
mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir &&
error "rename dir cross MDT works!"
test_24A() { # LU-3182
local NFILES=5000
+ rm -rf $DIR/$tdir
mkdir -p $DIR/$tdir
createmany -m $DIR/$tdir/$tfile $NFILES
local t=`ls $DIR/$tdir | wc -l`
$GETSTRIPE -c $DIR/d27/f01
[ $($GETSTRIPE -c $DIR/d27/f01) -eq 2 ] ||
error "two-stripe file doesn't have two stripes"
-}
-run_test 27b "create two stripe file"
-
-test_27c() {
- [ -f $DIR/d27/f01 ] || skip "test_27b not run" && return
dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4 || error "dd failed"
}
-run_test 27c "write to two stripe file"
+run_test 27b "create and write to two stripe file"
test_27d() {
test_mkdir -p $DIR/d27
[ ! -d $DIR/d27 ] && test_mkdir -p $DIR d27
$SETSTRIPE -S 67108864 $FILE || error "setstripe failed"
BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
- [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "$BLKSIZE > $LL_MAX_BLKSIZE"
+ [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "1:$BLKSIZE > $LL_MAX_BLKSIZE"
dd if=/dev/zero of=$FILE bs=4k count=1
BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
- [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "$BLKSIZE > $LL_MAX_BLKSIZE"
+ [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "2:$BLKSIZE > $LL_MAX_BLKSIZE"
}
run_test 27k "limit i_blksize for broken user apps ============="
# on the mdt's osc
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)
+ osc.$mdtosc_proc1.prealloc_last_id)
local next_id=$(do_facet mds${MDSIDX} lctl get_param -n \
- osc.$mdtosc_proc1.prealloc_next_id)
+ osc.$mdtosc_proc1.prealloc_next_id)
local mdtosc_proc2=$(get_mdtosc_proc_path mds${MDSIDX})
do_facet mds${MDSIDX} lctl get_param osc.$mdtosc_proc2.prealloc*
local dev=$(ostdevname $ost)
local oid_hex
- if [ $(facet_fstype ost$ost) != ldiskfs ]; then
- echo "Currently only works with ldiskfs-based OSTs"
- continue
- fi
-
- log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
-
- #don't unmount/remount the OSTs if we don't need to do that
- # LU-2577 changes filter_fid to be smaller, so debugfs needs
- # update too, until that use mount/ll_decode_filter_fid/mount
- local dir=$(facet_mntpt ost$ost)
- local opts=${OST_MOUNT_OPTS}
-
- if ! do_facet ost$ost test -b ${dev}; then
- opts=$(csa_add "$opts" -o loop)
- fi
-
- stop ost$ost
- do_facet ost$ost mount -t $(facet_fstype ost$ost) $opts $dev $dir ||
- { error "mounting $dev as $FSTYPE failed"; return 3; }
+ log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
seq=$(echo $seq | sed -e "s/^0x//g")
if [ $seq == 0 ]; then
else
oid_hex=$(echo $hex | sed -e "s/^0x//g")
fi
- local obj_file=$(do_facet ost$ost find $dir/O/$seq -name $oid_hex)
- local ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID $obj_file)
- do_facet ost$ost umount -d $dir
- start ost$ost $dev $OST_MOUNT_OPTS
+ local obj_file="O/$seq/d$((oid %32))/$oid_hex"
- # re-enable when debugfs will understand new filter_fid
- #local ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
- # $dev 2>/dev/null" | grep "parent=")
+ local ff
+ #
+ # Don't unmount/remount the OSTs if we don't need to do that.
+ # LU-2577 changes filter_fid to be smaller, so debugfs needs
+ # update too, until that use mount/ll_decode_filter_fid/mount.
+ # Re-enable when debugfs will understand new filter_fid.
+ #
+ if false && [ $(facet_fstype ost$ost) == ldiskfs ]; then
+ ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
+ $dev 2>/dev/null" | grep "parent=")
+ else
+ stop ost$ost
+ mount_fstype ost$ost
+ ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
+ $(facet_mntpt ost$ost)/$obj_file)
+ unmount_fstype ost$ost
+ start ost$ost $dev $OST_MOUNT_OPTS
+ fi
- [ -z "$ff" ] && error "$obj_file: no filter_fid info"
+ [ -z "$ff" ] && error "$obj_file: no filter_fid info"
- echo "$ff" | sed -e 's#.*objid=#got: objid=#'
+ echo "$ff" | sed -e 's#.*objid=#got: objid=#'
- # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
- # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
- local ff_parent=$(echo $ff|sed -e 's/.*parent=.//')
- local ff_pseq=$(echo $ff_parent | cut -d: -f1)
- local ff_poid=$(echo $ff_parent | cut -d: -f2)
- local ff_pstripe=$(echo $ff_parent | sed -e 's/.*stripe=//')
+ # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
+ # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
+ local ff_parent=$(echo $ff|sed -e 's/.*parent=.//')
+ local ff_pseq=$(echo $ff_parent | cut -d: -f1)
+ local ff_poid=$(echo $ff_parent | cut -d: -f2)
+ local ff_pstripe
+ if echo $ff_parent | grep -q 'stripe='; then
+ ff_pstripe=$(echo $ff_parent | sed -e 's/.*stripe=//')
+ else
+ #
+ # $LL_DECODE_FILTER_FID does not print "stripe="; look
+ # into f_ver in this case. See the comment on
+ # ff_parent.
+ #
+ ff_pstripe=$(echo $ff_parent | cut -d: -f3 |
+ sed -e 's/\]//')
+ fi
# compare lmm_seq and filter_fid->ff_parent.f_seq
[ $ff_pseq = $lmm_seq ] ||
# compare lmm_object_id and filter_fid->ff_parent.f_oid
[ $ff_poid = $lmm_oid ] ||
error "FF parent OID $ff_poid != $lmm_oid"
- [ $ff_pstripe = $stripe_nr ] ||
+ (($ff_pstripe == $stripe_nr)) ||
error "FF stripe $ff_pstripe != $stripe_nr"
stripe_nr=$((stripe_nr + 1))
local restore_count=$($GETSTRIPE -c $MOUNT)
local restore_offset=$($GETSTRIPE -i $MOUNT)
$SETSTRIPE -c 0 -i -1 -S 0 $MOUNT
+ wait_update $HOSTNAME "$GETSTRIPE -c $MOUNT | sed 's/ *//g'" "1" 20 ||
+ error "stripe count $($GETSTRIPE -c $MOUNT) != 1"
local default_size=$($GETSTRIPE -S $MOUNT)
- local default_count=$($GETSTRIPE -c $MOUNT)
local default_offset=$($GETSTRIPE -i $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 -i $restore_offset -S $restore_size $MOUNT
}
run_test 31m "link to file: the same, non-existing, dir==============="
test_31n() {
- [ -e /proc/self/fd/173 ] && echo "skipping, fd 173 is in use" && return
touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
nlink=$(stat --format=%h $DIR/$tfile)
[ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
- exec 173<$DIR/$tfile
- trap "exec 173<&-" EXIT
- nlink=$(stat --dereference --format=%h /proc/self/fd/173)
+ local fd=$(free_fd)
+ local cmd="exec $fd<$DIR/$tfile"
+ eval $cmd
+ cmd="exec $fd<&-"
+ trap "eval $cmd" EXIT
+ nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
[ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
- nlink=$(stat --dereference --format=%h /proc/self/fd/173)
+ nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
[ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
- exec 173<&-
+ eval $cmd
}
run_test 31n "check link count of unlinked file"
cleanup_test32_mount() {
trap 0
- $UMOUNT $DIR/$tdir/ext2-mountpoint
+ $UMOUNT -d $DIR/$tdir/ext2-mountpoint
}
test_32a() {
cleanup_testdir_mount() {
trap 0
- $UMOUNT $DIR/$tdir
+ $UMOUNT -d $DIR/$tdir
}
test_32q() {
}
run_test 39m "test atime and mtime before 1970"
+test_39n() { # LU-3832
+ local atime_diff=$(do_facet $SINGLEMDS \
+ lctl get_param -n mdd.*MDT0000*.atime_diff)
+ local atime0
+ local atime1
+ local atime2
+
+ do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
+
+ rm -rf $DIR/$tfile
+ dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
+ atime0=$(stat -c %X $DIR/$tfile)
+
+ sleep 5
+ $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
+ atime1=$(stat -c %X $DIR/$tfile)
+
+ sleep 5
+ cancel_lru_locks mdc
+ cancel_lru_locks osc
+ $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
+ atime2=$(stat -c %X $DIR/$tfile)
+
+ do_facet $SINGLEMDS \
+ lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
+
+ [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
+ [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
+}
+run_test 39n "check that O_NOATIME is honored"
+
+test_39o() {
+ TESTDIR=$DIR/$tdir/$tfile
+ [ -e $TESTDIR ] && rm -rf $TESTDIR
+ test_mkdir -p $TESTDIR
+ cd $TESTDIR
+ links1=2
+ ls
+ mkdir a b
+ ls
+ links2=$(stat -c %h .)
+ [ $(($links1 + 2)) != $links2 ] &&
+ error "wrong links count $(($links1 + 2)) != $links2"
+ rmdir b
+ links3=$(stat -c %h .)
+ [ $(($links1 + 1)) != $links3 ] &&
+ error "wrong links count $links1 != $links3"
+ return 0
+}
+run_test 39o "directory cached attributes updated after create ========"
+
+test_39p() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local MDTIDX=1
+ TESTDIR=$DIR/$tdir/$tfile
+ [ -e $TESTDIR ] && rm -rf $TESTDIR
+ mkdir -p $TESTDIR
+ cd $TESTDIR
+ links1=2
+ ls
+ $LFS mkdir -i $MDTIDX $TESTDIR/remote_dir1
+ $LFS mkdir -i $MDTIDX $TESTDIR/remote_dir2
+ ls
+ links2=$(stat -c %h .)
+ [ $(($links1 + 2)) != $links2 ] &&
+ error "wrong links count $(($links1 + 2)) != $links2"
+ rmdir remote_dir2
+ links3=$(stat -c %h .)
+ [ $(($links1 + 1)) != $links3 ] &&
+ error "wrong links count $links1 != $links3"
+ return 0
+}
+run_test 39p "remote directory cached attributes updated after create ========"
+
+
test_40() {
dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
$RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
export NUMTEST=70000
test_51b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- local BASE=$DIR/$tdir
+ local BASE=$DIR/d${base}.${TESTSUITE}
# cleanup the directory
rm -fr $BASE
run_test 51b "exceed 64k subdirectory nlink limit"
test_51ba() { # LU-993
- local BASE=$DIR/$tdir
+ local BASE=$DIR/d${base}.${TESTSUITE}
# unlink all but 100 subdirectories, then check it still works
local LEFT=100
[ -f $BASE/fnum ] && local NUMPREV=$(cat $BASE/fnum) && rm $BASE/fnum
local ost_last_id
local ostnum
local node
- local found=0
+ local found=false
+ local support_last_seq=true
+
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.60) ]] ||
+ support_last_seq=false
# only test MDT0000
- 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)
- param_seq=$(echo ${param} |
- sed -e s/prealloc_last_id/prealloc_last_seq/g)
- mds_last_seq=$(do_facet $SINGLEMDS lctl get_param -n $param_seq)
- mds_last=$(do_facet $SINGLEMDS lctl get_param -n $param)
+ local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
+ local value
+ 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)
+
+ if $support_last_seq; then
+ param_seq=$(echo $param |
+ sed -e s/prealloc_last_id/prealloc_last_seq/g)
+ mds_last_seq=$(do_facet $SINGLEMDS \
+ $LCTL get_param -n $param_seq)
+ fi
+ mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
ostnum=$(index_from_ostuuid ${ostname}_UUID)
node=$(facet_active_host ost$((ostnum+1)))
param="obdfilter.$ostname.last_id"
- for ost_last in $(do_node $node lctl get_param -n $param) ; do
- echo "$ostname.last_id=$ost_last ;MDS.last_id=$mds_last"
- ost_last_id=$(echo $ost_last | awk -F':' '{print $2}' |
- sed -e "s/^0x//g")
- ost_last_seq=$(echo $ost_last | awk -F':' '{print $1}')
- if [ $ost_last_seq = $mds_last_seq ]; then
- if [ $ost_last_id != $mds_last ]; then
- error "$ost_last != $mds_last_id"
- else
- found=1
- break
- fi
+ for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
+ echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
+ ost_last_id=$ost_last
+
+ if $support_last_seq; then
+ ost_last_id=$(echo $ost_last |
+ awk -F':' '{print $2}' |
+ sed -e "s/^0x//g")
+ ost_last_seq=$(echo $ost_last |
+ awk -F':' '{print $1}')
+ [[ $ost_last_seq = $mds_last_seq ]] || continue
+ fi
+
+ if [[ $ost_last_id != $mds_last ]]; then
+ error "$ost_last_id != $mds_last"
+ else
+ found=true
+ break
fi
done
- done
- [ $found = 0 ] && error "can not match last_seq/last_id for $mdtosc"
+ done
+ $found || error "can not match last_seq/last_id for $mdtosc"
return 0
}
run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
dd if=/dev/zero of=$tdir/tmp bs=`page_size` count=30 || error "dd write"
df $tdir
dd if=$tdir/tmp of=/dev/zero bs=`page_size` count=30 || error "dd read"
- $UMOUNT $tdir
+ $UMOUNT -d $tdir
losetup -d $loopdev
rm $loopdev
}
test_56a() { # was test_56
rm -rf $DIR/$tdir
$SETSTRIPE -d $DIR
- test_mkdir $DIR/$tdir
- test_mkdir $DIR/$tdir/dir
+ test_mkdir -p $DIR/$tdir/dir
NUMFILES=3
NUMFILESx2=$(($NUMFILES * 2))
for i in `seq 1 $NUMFILES` ; do
}
run_test 56x "lfs migration support"
+test_56y() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] &&
+ skip "No HSM support on MDS of $(get_lustre_version)," \
+ "need 2.4.53 at least" && return
+ local res=""
+
+ local dir0=$DIR/$tdir/$testnum
+ mkdir -p $dir0 || error "creating dir $dir0"
+ local f1=$dir0/file1
+ local f2=$dir0/file2
+
+ touch $f1 || error "creating std file $f1"
+ $MULTIOP $f2 H2c || error "creating released file $f2"
+
+ # a directory can be raid0, so ask only for files
+ res=$($LFIND $dir0 -L raid0 -type f | wc -l)
+ [[ $res == 2 ]] || error "search raid0: found $res files != 2"
+
+ res=$($LFIND $dir0 \! -L raid0 -type f | wc -l)
+ [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
+
+ # only files can be released, so no need to force file search
+ res=$($LFIND $dir0 -L released)
+ [[ $res == $f2 ]] || error "search released: found $res != $f2"
+
+ res=$($LFIND $dir0 \! -L released)
+ [[ $res == $f1 ]] || error "search !released: found $res != $f1"
+
+}
+run_test 56y "lfs find -L raid0|released"
+
test_57a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# note test will not do anything if MDS is not local
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 [ "$MDCFREE2" -lt "$((MDCFREE - 16))" ]; then
if [ "$MDSFREE" != "$MDSFREE2" ]; then
error "MDC before $MDCFREE != after $MDCFREE2"
else
#run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
# bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
-test_63a() { # was test_63
+# Though this test is irrelevant anymore, it helped to reveal some
+# other grant bugs (LU-4482), let's keep it.
+test_63a() { # was test_63
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
MAX_DIRTY_MB=`lctl get_param -n osc.*.max_dirty_mb | head -n 1`
- lctl set_param -n osc.*.max_dirty_mb 0
for i in `seq 10` ; do
dd if=/dev/zero of=$DIR/f63 bs=8k &
sleep 5
sleep 1
done
- lctl set_param -n osc.*.max_dirty_mb $MAX_DIRTY_MB
rm -f $DIR/f63 || true
}
run_test 63a "Verify oig_wait interruption does not crash ======="
set_checksums 0
rm -f $DIR/$tfile
}
-run_test 77a "normal checksum read/write operation ============="
+run_test 77a "normal checksum read/write operation"
test_77b() { # bug 10889
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
$GSS && skip "could not run with gss" && return
[ ! -f $F77_TMP ] && setup_f77
#define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
- lctl set_param fail_loc=0x80000409
+ $LCTL set_param fail_loc=0x80000409
set_checksums 1
- dd if=$F77_TMP of=$DIR/f77b bs=1M count=$F77SZ conv=sync || \
+
+ dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
error "dd error: $?"
- lctl set_param fail_loc=0
- set_checksums 0
-}
-run_test 77b "checksum error on client write ===================="
+ $LCTL set_param fail_loc=0
-test_77c() { # bug 10889
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- $GSS && skip "could not run with gss" && return
- [ ! -f $DIR/f77b ] && skip "requires 77b - skipping" && return
- set_checksums 1
for algo in $CKSUM_TYPES; do
cancel_lru_locks osc
set_checksum_type $algo
#define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
- lctl set_param fail_loc=0x80000408
- cmp $F77_TMP $DIR/f77b || error "file compare failed"
- lctl set_param fail_loc=0
+ $LCTL set_param fail_loc=0x80000408
+ cmp $F77_TMP $DIR/$tfile || error "file compare failed"
+ $LCTL set_param fail_loc=0
done
set_checksums 0
set_checksum_type $ORIG_CSUM_TYPE
- rm -f $DIR/f77b
+ rm -f $DIR/$tfile
}
-run_test 77c "checksum error on client read ==================="
+run_test 77b "checksum error on client write, read"
test_77d() { # bug 10889
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
$GSS && skip "could not run with gss" && return
#define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
- lctl set_param fail_loc=0x80000409
+ $LCTL set_param fail_loc=0x80000409
set_checksums 1
- directio write $DIR/f77 0 $F77SZ $((1024 * 1024)) || \
+ $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
error "direct write: rc=$?"
- lctl set_param fail_loc=0
+ $LCTL set_param fail_loc=0
set_checksums 0
-}
-run_test 77d "checksum error on OST direct write ==============="
-test_77e() { # bug 10889
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- $GSS && skip "could not run with gss" && return
- [ ! -f $DIR/f77 ] && skip "requires 77d - skipping" && return
#define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
- lctl set_param fail_loc=0x80000408
+ $LCTL set_param fail_loc=0x80000408
set_checksums 1
cancel_lru_locks osc
- directio read $DIR/f77 0 $F77SZ $((1024 * 1024)) || \
+ $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
error "direct read: rc=$?"
- lctl set_param fail_loc=0
+ $LCTL set_param fail_loc=0
set_checksums 0
}
-run_test 77e "checksum error on OST direct read ================"
+run_test 77d "checksum error on OST direct write, read"
test_77f() { # bug 10889
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
cancel_lru_locks osc
set_checksum_type $algo
#define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
- lctl set_param fail_loc=0x409
- directio write $DIR/f77 0 $F77SZ $((1024 * 1024)) && \
+ $LCTL set_param fail_loc=0x409
+ $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
error "direct write succeeded"
- lctl set_param fail_loc=0
+ $LCTL set_param fail_loc=0
done
set_checksum_type $ORIG_CSUM_TYPE
set_checksums 0
}
-run_test 77f "repeat checksum error on write (expect error) ===="
+run_test 77f "repeat checksum error on write (expect error)"
test_77g() { # bug 10889
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ ! -f $F77_TMP ] && setup_f77
- $SETSTRIPE -c 1 -i 0 $DIR/f77g
+ $SETSTRIPE -c 1 -i 0 $DIR/$tfile
#define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
do_facet ost1 lctl set_param fail_loc=0x8000021a
set_checksums 1
- dd if=$F77_TMP of=$DIR/f77g bs=1M count=$F77SZ || \
+ dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ ||
error "write error: rc=$?"
do_facet ost1 lctl set_param fail_loc=0
set_checksums 0
-}
-run_test 77g "checksum error on OST write ======================"
-
-test_77h() { # bug 10889
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- $GSS && skip "could not run with gss" && return
- remote_ost_nodsh && skip "remote OST with nodsh" && return
- [ ! -f $DIR/f77g ] && skip "requires 77g - skipping" && return
cancel_lru_locks osc
#define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
do_facet ost1 lctl set_param fail_loc=0x8000021b
set_checksums 1
- cmp $F77_TMP $DIR/f77g || error "file compare failed"
+ cmp $F77_TMP $DIR/$tfile || error "file compare failed"
do_facet ost1 lctl set_param fail_loc=0
set_checksums 0
}
-run_test 77h "checksum error on OST read ======================="
+run_test 77g "checksum error on OST write, read"
test_77i() { # bug 13805
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
done
remount_client $MOUNT
}
-run_test 77i "client not supporting OSD_CONNECT_CKSUM =========="
+run_test 77i "client not supporting OSD_CONNECT_CKSUM"
test_77j() { # bug 13805
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
done
remount_client $MOUNT
}
-run_test 77j "client only supporting ADLER32 ===================="
+run_test 77j "client only supporting ADLER32"
[ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
rm -f $F77_TMP
test_101a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -ge 2 ] && skip "skip now for >= 2 MDTs" && return #LU-4322
local s
local discard
local nreads=10000
local STRIPE_SIZE=1048576
local FILE_LENGTH=$((STRIPE_SIZE*100))
local nreads=10000
- local osc
+ local osc_rpc_stats
- setup_test101bc
-
- cancel_lru_locks osc
- $LCTL set_param osc.*.rpc_stats 0
- $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
- for osc in $($LCTL get_param -N osc.*); do
- if [ "$osc" == "osc.num_refs" ]; then
- continue
- fi
-
- local lines=$($LCTL get_param -n ${osc}.rpc_stats | wc | awk '{print $1}')
- if [ $lines -le 20 ]; then
- continue
- fi
+ setup_test101bc
- local rpc4k=$($LCTL get_param -n ${osc}.rpc_stats |
- awk '$1 == "1:" { print $2; exit; }')
- local rpc8k=$($LCTL get_param -n ${osc}.rpc_stats |
- awk '$1 == "2:" { print $2; exit; }')
- local rpc16k=$($LCTL get_param -n ${osc}.rpc_stats |
- awk '$1 == "4:" { print $2; exit; }')
- local rpc32k=$($LCTL get_param -n ${osc}.rpc_stats |
- awk '$1 == "8:" { print $2; exit; }')
-
- [ $rpc4k != 0 ] && error "Small 4k read IO ${rpc4k}!"
- [ $rpc8k != 0 ] && error "Small 8k read IO ${rpc8k}!"
- [ $rpc16k != 0 ] && error "Small 16k read IO ${rpc16k}!"
- [ $rpc32k != 0 ] && error "Small 32k read IO ${rpc32k}!"
- echo "${osc} rpc check passed!"
- done
- cleanup_test101bc
- true
+ cancel_lru_locks osc
+ $LCTL set_param osc.*.rpc_stats 0
+ $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
+ for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
+ local stats=$($LCTL get_param -n $osc_rpc_stats)
+ local lines=$(echo "$stats" | awk 'END {print NR;}')
+ local size
+
+ if [ $lines -le 20 ]; then
+ continue
+ fi
+ for size in 1 2 4 8; do
+ local rpc=$(echo "$stats" |
+ awk '($1 == "'$size':") {print $2; exit; }')
+ [ $rpc != 0 ] &&
+ error "Small $((size*4))k read IO $rpc !"
+ done
+ echo "$osc_rpc_stats check passed!"
+ done
+ cleanup_test101bc
+ true
}
run_test 101c "check stripe_size aligned read-ahead ================="
set_read_ahead() {
- $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
- $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
+ $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
+ $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
}
test_101d() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local file=$DIR/$tfile
- local size=${FILESIZE_101c:-500}
+ local sz_MB=${FILESIZE_101d:-500}
local ra_MB=${READAHEAD_MB:-40}
- local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
- [ $space -gt $((size * 1024)) ] ||
- { skip "Need free space ${size}M, have $space" && return; }
+ local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
+ [ $free_MB -lt $sz_MB ] &&
+ skip "Need free space ${sz_MB}M, have ${free_MB}M" && return
- echo Creating ${size}M test file $file
- dd if=/dev/zero of=$file bs=1M count=$size || error "dd failed"
- echo Cancel LRU locks on lustre client to flush the client cache
- cancel_lru_locks osc
+ echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
+ $SETSTRIPE -c -1 $file || error "setstripe failed"
- echo Disable read-ahead
- local old_READAHEAD=$(set_read_ahead 0)
+ dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
+ echo Cancel LRU locks on lustre client to flush the client cache
+ cancel_lru_locks osc
- echo Reading the test file $file with read-ahead disabled
- time_ra_OFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$size")
+ echo Disable read-ahead
+ local old_READAHEAD=$(set_read_ahead 0)
- echo Cancel LRU locks on lustre client to flush the client cache
- cancel_lru_locks osc
- echo Enable read-ahead with ${ra_MB}MB
- set_read_ahead $ra_MB
+ echo Reading the test file $file with read-ahead disabled
+ local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
+
+ echo Cancel LRU locks on lustre client to flush the client cache
+ cancel_lru_locks osc
+ echo Enable read-ahead with ${ra_MB}MB
+ set_read_ahead $ra_MB
- echo Reading the test file $file with read-ahead enabled
- time_ra_ON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$size")
+ echo Reading the test file $file with read-ahead enabled
+ local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
- echo read-ahead disabled time read $time_ra_OFF
- echo read-ahead enabled time read $time_ra_ON
+ echo "read-ahead disabled time read $raOFF"
+ echo "read-ahead enabled time read $raON"
set_read_ahead $old_READAHEAD
rm -f $file
wait_delete_completed
- [ $time_ra_ON -lt $time_ra_OFF ] ||
- error "read-ahead enabled time read (${time_ra_ON}s) is more than
- read-ahead disabled time read (${time_ra_OFF}s) filesize ${size}M"
+ [ $raOFF -le 1 -o $raON -lt $raOFF ] ||
+ error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
}
-run_test 101d "file read with and without read-ahead enabled ================="
+run_test 101d "file read with and without read-ahead enabled"
test_101e() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- local file=$DIR/$tfile
- local size=500 #KB
- local count=100
- local blksize=1024
-
- local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
- local need_space=$((count * size))
- [ $space -gt $need_space ] ||
- { skip_env "Need free space $need_space, have $space" && return; }
-
- echo Creating $count ${size}K test files
- for ((i = 0; i < $count; i++)); do
- dd if=/dev/zero of=${file}_${i} bs=$blksize count=$size 2>/dev/null
- done
+ local file=$DIR/$tfile
+ local size_KB=500 #KB
+ local count=100
+ local bsize=1024
+
+ local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
+ local need_KB=$((count * size_KB))
+ [ $free_KB -le $need_KB ] &&
+ skip_env "Need free space $need_KB, have $free_KB" && return
+
+ echo "Creating $count ${size_KB}K test files"
+ for ((i = 0; i < $count; i++)); do
+ dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
+ done
- echo Cancel LRU locks on lustre client to flush the client cache
- cancel_lru_locks osc
+ echo "Cancel LRU locks on lustre client to flush the client cache"
+ cancel_lru_locks osc
- echo Reset readahead stats
- $LCTL set_param -n llite.*.read_ahead_stats 0
+ echo "Reset readahead stats"
+ $LCTL set_param -n llite.*.read_ahead_stats 0
- for ((i = 0; i < $count; i++)); do
- dd if=${file}_${i} of=/dev/null bs=$blksize count=$size 2>/dev/null
- done
+ for ((i = 0; i < $count; i++)); do
+ dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
+ done
- local miss=$($LCTL get_param -n llite.*.read_ahead_stats | \
- get_named_value 'misses' | cut -d" " -f1 | calc_total)
+ local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
+ get_named_value 'misses' | cut -d" " -f1 | calc_total)
- for ((i = 0; i < $count; i++)); do
- rm -rf ${file}_${i} 2>/dev/null
- done
+ for ((i = 0; i < $count; i++)); do
+ rm -rf $file.$i 2>/dev/null
+ done
- #10000 means 20% reads are missing in readahead
- [ $miss -lt 10000 ] || error "misses too much for small reads"
+ #10000 means 20% reads are missing in readahead
+ [ $miss -lt 10000 ] || error "misses too much for small reads"
}
run_test 101e "check read-ahead for small read(1k) for small files(500k)"
return 0;
}
-run_test 102l "listxattr filter test =================================="
+run_test 102l "listxattr size test =================================="
+
+test_102m() { # LU-3403 llite: error of listxattr when buffer is small
+ local path=$DIR/$tfile
+ touch $path
+
+ listxattr_size_check $path || error "listattr_size_check $path failed"
+}
+run_test 102m "Ensure listxattr fails on small bufffer ========"
cleanup_test102
+getxattr() { # getxattr path name
+ # Return the base64 encoding of the value of xattr name on path.
+ local path=$1
+ local name=$2
+
+ # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
+ # file: $path
+ # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
+ #
+ # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
+
+ getfattr --absolute-names --encoding=base64 --name=$name $path |
+ awk -F= -v name=$name '$1 == name {
+ print substr($0, index($0, "=") + 1);
+ }'
+}
+
+test_102n() { # LU-4101 mdt: protect internal xattrs
+ local file0=$DIR/$tfile.0
+ local file1=$DIR/$tfile.1
+ local xattr0=$TMP/$tfile.0
+ local xattr1=$TMP/$tfile.1
+ local name
+ local value
+
+ if [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.50) ]
+ then
+ skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
+ return
+ fi
+
+ rm -rf $file0 $file1 $xattr0 $xattr1
+ touch $file0 $file1
+
+ # Get 'before' xattrs of $file1.
+ getfattr --absolute-names --dump --match=- $file1 > $xattr0
+
+ for name in lov lma lmv link fid version som hsm lfsck_namespace; do
+ # Try to copy xattr from $file0 to $file1.
+ value=$(getxattr $file0 trusted.$name 2> /dev/null)
+
+ setfattr --name=trusted.$name --value="$value" $file1 ||
+ error "setxattr 'trusted.$name' failed"
+
+ # Try to set a garbage xattr.
+ value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
+
+ setfattr --name=trusted.$name --value="$value" $file1 ||
+ error "setxattr 'trusted.$name' failed"
+
+ # Try to remove the xattr from $file1. We don't care if this
+ # appears to succeed or fail, we just don't want there to be
+ # any changes or crashes.
+ setfattr --remove=$trusted.$name $file1 2> /dev/null
+ done
+
+ # Get 'after' xattrs of file1.
+ getfattr --absolute-names --dump --match=- $file1 > $xattr1
+
+ if ! diff $xattr0 $xattr1; then
+ error "before and after xattrs of '$file1' differ"
+ fi
+
+ rm -rf $file0 $file1 $xattr0 $xattr1
+
+ return 0
+}
+run_test 102n "silently ignore setxattr on internal trusted xattrs"
+
run_acl_subtest()
{
$LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
[ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs" && return
echo -n "Free space priority "
- lctl get_param -n lov.*-clilov-*.qos_prio_free
+ do_facet $SINGLEMDS lctl get_param -n lo*.*-mdtlov.qos_prio_free |
+ head -1
declare -a AVAIL
free_min_max
- [ $MINV -gt 960000 ] && skip "too much free space in OST$MINI, skip" &&\
- return
- # generate uneven OSTs
+ [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip" && return
+ trap simple_cleanup_common EXIT
+
+ # Check if we need to generate uneven OSTs
test_mkdir -p $DIR/$tdir/OST${MINI}
- declare -i FILL
- FILL=$(($MINV / 4))
- echo "Filling 25% remaining space in OST${MINI} with ${FILL}Kb"
- $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI}||error "setstripe failed"
- i=0
- while [ $FILL -gt 0 ]; do
- i=$(($i + 1))
- dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i bs=2M count=1 2>/dev/null
- FILL=$(($FILL - 2048))
- echo -n .
- done
- FILL=$(($MINV / 4))
- sync
- sleep_maxage
+ local FILL=$(($MINV / 4))
+ local DIFF=$(($MAXV - $MINV))
+ local DIFF2=$(($DIFF * 100 / $MINV))
+
+ local threshold=$(do_facet $SINGLEMDS \
+ lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -1)
+ threshold=${threshold%%%}
+ echo -n "Check for uneven OSTs: "
+ echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
+
+ if [ $DIFF2 -gt $threshold ]; then
+ echo "ok"
+ echo "Don't need to fill OST$MINI"
+ else
+ # generate uneven OSTs. Write 2% over the QOS threshold value
+ echo "no"
+ DIFF=$(($threshold - $DIFF2 + 2))
+ DIFF2=$(( ($MINV * $DIFF)/100 ))
+ echo "Fill ${DIFF}% remaining space in OST${MINI} with ${DIFF2}KB"
+ $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
+ error "setstripe failed"
+ DIFF=$(($DIFF2 / 2048))
+ i=0
+ while [ $i -lt $DIFF ]; do
+ i=$(($i + 1))
+ dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
+ bs=2M count=1 2>/dev/null
+ echo -n .
+ done
+ echo .
+ sync
+ sleep_maxage
+ free_min_max
+ fi
- free_min_max
DIFF=$(($MAXV - $MINV))
DIFF2=$(($DIFF * 100 / $MINV))
- echo -n "diff=${DIFF}=${DIFF2}% must be > 20% for QOS mode..."
- if [ $DIFF2 -gt 20 ]; then
- echo "ok"
+ echo -n "diff=${DIFF}=${DIFF2}% must be > ${threshold}% for QOS mode..."
+ if [ $DIFF2 -gt $threshold ]; then
+ echo "ok"
else
- echo "failed - QOS mode won't be used"
- error_ignore "QOS imbalance criteria not met"
- return
+ echo "failed - QOS mode won't be used"
+ skip "QOS imbalance criteria not met"
+ simple_cleanup_common
+ return
fi
MINI1=$MINI; MINV1=$MINV
MAXI1=$MAXI; MAXV1=$MAXV
# now fill using QOS
- echo writing a bunch of files to QOS-assigned OSTs
$SETSTRIPE -c 1 $DIR/$tdir
+ FILL=$(($FILL / 200))
+ if [ $FILL -gt 600 ]; then
+ FILL=600
+ fi
+ echo "writing $FILL files to QOS-assigned OSTs"
i=0
- while [ $FILL -gt 0 ]; do
- i=$(($i + 1))
- dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1024 count=200 2>/dev/null
- FILL=$(($FILL - 200))
- echo -n .
+ while [ $i -lt $FILL ]; do
+ i=$(($i + 1))
+ dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
+ count=1 2>/dev/null
+ echo -n .
done
echo "wrote $i 200k files"
sync
echo "free space delta: orig $DIFF final $DIFF2"
[ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
DIFF=$(($MINV1 - ${AVAIL[$MINI1]}))
- echo "Wrote $DIFF to smaller OST $MINI1"
+ echo "Wrote ${DIFF}KB to smaller OST $MINI1"
DIFF2=$(($MAXV1 - ${AVAIL[$MAXI1]}))
- echo "Wrote $DIFF2 to larger OST $MAXI1"
- [ $DIFF -gt 0 ] && echo "Wrote $(($DIFF2 * 100 / $DIFF - 100))% more data to larger OST $MAXI1"
+ echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
+ FILL=$(($DIFF2 * 100 / $DIFF - 100))
+ [ $DIFF -gt 0 ] &&
+ echo "Wrote ${FILL}% more data to larger OST $MAXI1"
# Figure out which files were written where
UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
- awk '/'$MINI1': / {print $2; exit}')
+ awk '/'$MINI1': / {print $2; exit}')
echo $UUID
- MINC=$($GETSTRIPE --obd $UUID $DIR/$tdir | wc -l)
+ MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
echo "$MINC files created on smaller OST $MINI1"
UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
- awk '/'$MAXI1': / {print $2; exit}')
+ awk '/'$MAXI1': / {print $2; exit}')
echo $UUID
- MAXC=$($GETSTRIPE --obd $UUID $DIR/$tdir | wc -l)
+ MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
echo "$MAXC files created on larger OST $MAXI1"
- [ $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
+ FILL=$(($MAXC * 100 / $MINC - 100))
+ [ $MINC -gt 0 ] &&
+ echo "Wrote ${FILL}% more files to larger OST $MAXI1"
+ [ $MAXC -gt $MINC ] ||
+ error_ignore LU-9 "stripe QOS didn't balance free space"
+ simple_cleanup_common
}
run_test 116a "stripe QOS: free space balance ==================="
echo "Truncate succeeded."
rm -f $DIR/$tfile
}
-run_test 117 "verify fsfilt_extend =========="
+run_test 117 "verify osd extend =========="
NO_SLOW_RESENDCOUNT=4
export OLD_RESENDCOUNT=""
ENOSPC=28
EFBIG=27
+ rm -rf $DIR/$tdir
test_mkdir -p $DIR/$tdir
- MAX=$(stat -c%s "$DIR/$tdir")
+ # block size of mds1
+ local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
+ local MDSBLOCKSIZE=$($LCTL get_param -n mdc.*MDT0000*.blocksize)
+ local MAX=$((MDSBLOCKSIZE * 3))
set_dir_limits $MAX
- local I=0
+ local I=$(stat -c%s "$DIR/$tdir")
local J=0
while [ ! $I -gt $MAX ]; do
$MULTIOP $DIR/$tdir/$J Oc
#check two errors ENOSPC for new version of ext4 max_dir_size patch
#mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1
#and EFBIG for previous versions
- if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ] && [ $I -gt 0 ]; then
+ if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
set_dir_limits 0
echo "return code $rc received as expected"
- multiop $DIR/$tdir/$J Oc
- rc=$?
+ multiop $DIR/$tdir/$J Oc ||
+ error_exit "multiop failed w/o dir size limit"
+
I=$(stat -c%s "$DIR/$tdir")
- if [ $I -gt $MAX ] && [ $rc -eq 0 ]; then
- return 0
+
+ if [ $(lustre_version_code $SINGLEMDS) -lt \
+ $(version_code 2.4.51) ]
+ then
+ [ $I -eq $MAX ] && return 0
else
- error_exit "return code $rc current dir size $I " \
- "previous limit $MAX"
+ [ $I -gt $MAX ] && return 0
fi
+ error_exit "current dir size $I, previous limit $MAX"
elif [ $rc -ne 0 ]; then
set_dir_limits 0
error_exit "return code $rc received instead of expected " \
$SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file||error "setstripe on $fm_file"
[ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
skip "ORI-366/LU-1941: FIEMAP unimplemented on ZFS" && return
- dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT || error "dd failed on $fm_file"
+
+ local actual_stripecnt=$($GETSTRIPE -c $fm_file)
+ dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripecnt ||
+ error "dd failed on $fm_file"
filefrag -ves $fm_file || error "filefrag $fm_file failed"
- filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" | grep -v "ext:" | grep -v "found"`
+ filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" |
+ grep -v "ext:" | grep -v "found"`
last_lun=`echo $filefrag_op | cut -d: -f5`
(( tot_len += ext_len ))
last_lun=$frag_lun
done
- if (( num_luns != OSTCOUNT || tot_len != 1024 )); then
+ if (( num_luns != actual_stripecnt || tot_len != 1024 )); then
cleanup_130
error "FIEMAP on $fm_file failed; returned wrong number of luns or wrong len for OST $last_lun"
return
}
run_test 150 "truncate/append tests"
+#LU-2902 roc_hit was not able to read all values from lproc
+function roc_hit_init() {
+ local list=$(comma_list $(osts_nodes))
+ local dir=$DIR/$tdir-check
+ local file=$dir/file
+ local BEFORE
+ local AFTER
+ local idx
+
+ test_mkdir -p $dir
+ #use setstripe to do a write to every ost
+ for i in $(seq 0 $((OSTCOUNT-1))); do
+ $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
+ dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
+ idx=$(printf %04x $i)
+ BEFORE=$(get_osd_param $list *OST*$idx stats |
+ awk '$1 == "cache_access" {sum += $2} END { print sum }')
+ if [ -z "$BEFORE" ]; then
+ BEFORE=0
+ fi
+
+ cancel_lru_locks osc
+ cat $file >/dev/null
+
+ AFTER=$(get_osd_param $list *OST*$idx stats |
+ awk '$1 == "cache_access" {sum += $2} END { print sum }')
+
+ echo BEFORE:$BEFORE AFTER:$AFTER
+ if ! let "AFTER - BEFORE == 4"; then
+ rm -rf $dir
+ error "roc_hit is not safe to use"
+ fi
+ rm $file
+ done
+
+ rm -rf $dir
+}
+
function roc_hit() {
local list=$(comma_list $(osts_nodes))
- #debug temp debug for LU-2902: lets see what values we get back
- echo $(get_osd_param $list '' stats) 1>&2
echo $(get_osd_param $list '' stats |
- awk '/'cache_hit'/ {sum+=$2} END {print sum}')
+ awk '$1 == "cache_hit" {sum += $2} END { print sum }')
}
function set_cache() {
return 0
fi
+ roc_hit_init
+
#define OBD_FAIL_OBD_NO_LRU 0x609
do_nodes $list $LCTL set_param fail_loc=0x609
rm -rf $test_dir/$tfile-2
}
+test_154A() {
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.1) ]] &&
+ skip "Need MDS version at least 2.4.1" && return
+
+ touch $DIR/$tfile
+ local FID=$($LFS path2fid $DIR/$tfile)
+ [ -z "$FID" ] && error "path2fid unable to get $DIR/$tfile FID"
+
+ # check that we get the same pathname back
+ local FOUND=$($LFS fid2path $MOUNT $FID)
+ [ -z "$FOUND" ] && error "fid2path unable to get $FID path"
+ [ "$FOUND" != "$DIR/$tfile" ] &&
+ error "fid2path(path2fid($DIR/$tfile)) = $FOUND != $DIR/$tfile"
+
+ rm -rf $DIR/$tfile
+}
+run_test 154A "lfs path2fid and fid2path basic checks"
+
test_154a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.51) ]] ||
}
run_test 154b "Open-by-FID for remote directory"
+test_154c() {
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.1) ]] &&
+ skip "Need MDS version at least 2.4.1" && return
+
+ touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
+ local FID1=$($LFS path2fid $DIR/$tfile.1)
+ local FID2=$($LFS path2fid $DIR/$tfile.2)
+ local FID3=$($LFS path2fid $DIR/$tfile.3)
+
+ local N=1
+ $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
+ [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
+ error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
+ local want=FID$N
+ [ "$FID" = "${!want}" ] ||
+ error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
+ N=$((N + 1))
+ done
+
+ $LFS fid2path $MOUNT $FID1 $FID2 $FID3 | while read PATHNAME; do
+ [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
+ error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
+ N=$((N + 1))
+ done
+}
+run_test 154c "lfs path2fid and fid2path multiple arguments"
+
+test_154d() {
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.53) ]] &&
+ skip "Need MDS version at least 2.5.53" && return
+
+ if remote_mds; then
+ nid=$($LCTL list_nids | sed "s/\./\\\./g")
+ else
+ nid="0@lo"
+ fi
+ local proc_ofile="mdt.*.exports.'$nid'.open_files"
+ local fd
+ local cmd
+
+ rm -f $DIR/$tfile
+ touch $DIR/$tfile
+
+ fid=$($LFS path2fid $DIR/$tfile)
+ # Open the file
+ fd=$(free_fd)
+ cmd="exec $fd<$DIR/$tfile"
+ eval $cmd
+ fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
+ echo $fid_list | grep $fid
+ rc=$?
+
+ cmd="exec $fd>/dev/null"
+ eval $cmd
+ if [ $rc -ne 0 ]; then
+ error "FID $fid not found in open files list $fid_list"
+ fi
+}
+run_test 154d "Verify open file fid"
+
test_155_small_load() {
local temp=$TMP/$tfile
local file=$DIR/$tfile
skip "LU-1956/LU-2261: stats unimplemented on OSD ZFS" &&
return
+ roc_hit_init
+
log "Turn on read and write cache"
set_cache read on
set_cache writethrough on
BEFORE=`roc_hit`
cat $file >/dev/null
AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == 0"; then
- error_ignore 20762 "IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
-
+ if ! let "AFTER - BEFORE == 0"; then
+ error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
log "Turn on the read cache and turn off the write cache"
set_cache read on
cancel_lru_locks osc
cat $file >/dev/null
AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == 0"; then
- error_ignore 20762 "IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
+ if ! let "AFTER - BEFORE == 0"; then
+ error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
log "Read again; it should be satisfied from the cache."
BEFORE=`roc_hit`
#Changelogs
err17935 () {
if [ $MDSCOUNT -gt 1 ]; then
- error_ignore 17935 $*
+ error_ignore bz17935 $*
else
error $*
fi
fi
}
-test_160() {
+changelog_extract_field() {
+ local mdt=$1
+ local cltype=$2
+ local file=$3
+ local identifier=$4
+
+ $LFS changelog $mdt | gawk "/$cltype.*$file$/ {
+ print gensub(/^.* "$identifier'(\[[^\]]*\]).*$/,"\\1",1)}' |
+ tail -1
+}
+
+test_160a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] ||
# verify contents
echo "verifying target fid"
- fidc=$($LFS changelog $MDT0|awk '/CREAT.*timestamp$/{print $6}'|tail -1)
+ fidc=$(changelog_extract_field $MDT0 "CREAT" "timestamp" "t=")
fidf=$($LFS path2fid $DIR/$tdir/pics/zach/timestamp)
- [ "$fidc" == "t=$fidf" ] ||
+ [ "$fidc" == "$fidf" ] ||
err17935 "fid in changelog $fidc != file fid $fidf"
echo "verifying parent fid"
- fidc=$($LFS changelog $MDT0|awk '/CREAT.*timestamp$/{print $7}'|tail -1)
+ fidc=$(changelog_extract_field $MDT0 "CREAT" "timestamp" "p=")
fidf=$($LFS path2fid $DIR/$tdir/pics/zach)
- [ "$fidc" == "p=$fidf" ] ||
+ [ "$fidc" == "$fidf" ] ||
err17935 "pfid in changelog $fidc != dir fid $fidf"
USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$USER\" {print \$2}")
echo "$USERS other changelog users; can't verify off"
fi
}
-run_test 160 "changelog sanity"
+run_test 160a "changelog sanity"
+
+test_160b() { # LU-3587
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] ||
+ { skip "Need MDS version at least 2.2.0"; return; }
+
+ local CL_USERS="mdd.$MDT0.changelog_users"
+ local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
+ USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n)
+ echo "Registered as changelog user $USER"
+ $GET_CL_USERS | grep -q $USER ||
+ error "User $USER not found in changelog_users"
+
+ local LONGNAME1=$(str_repeat a 255)
+ local LONGNAME2=$(str_repeat b 255)
+
+ cd $DIR
+ echo "creating very long named file"
+ touch $LONGNAME1 || error "create of $LONGNAME1 failed"
+ echo "moving very long named file"
+ mv $LONGNAME1 $LONGNAME2
+
+ $LFS changelog $MDT0 | grep RENME
+
+ echo "deregistering $USER"
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+
+ rm -f $LONGNAME2
+}
+run_test 160b "Verify that very long rename doesn't crash in changelog"
test_161a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
}
run_test 161b "link ea sanity under remote directory"
+test_161c() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.1.5) ]] &&
+ skip "Need MDS version at least 2.1.5" && return
+
+ # define CLF_RENAME_LAST 0x0001
+ # rename overwrite a target having nlink = 1 (changelog flag 0x1)
+ local USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+ changelog_register -n)
+ rm -rf $DIR/$tdir
+ mkdir -p $DIR/$tdir
+ touch $DIR/$tdir/foo_161c
+ touch $DIR/$tdir/bar_161c
+ mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
+ $LFS changelog $MDT0 | grep RENME
+ local flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | \
+ cut -f5 -d' ')
+ $LFS changelog_clear $MDT0 $USER 0
+ if [ x$flags != "x0x1" ]; then
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+ $USER
+ error "flag $flags is not 0x1"
+ fi
+ echo "rename overwrite a target having nlink = 1," \
+ "changelog record has flags of $flags"
+
+ # rename overwrite a target having nlink > 1 (changelog flag 0x0)
+ touch $DIR/$tdir/foo_161c
+ touch $DIR/$tdir/bar_161c
+ ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
+ mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
+ $LFS changelog $MDT0 | grep RENME
+ flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | cut -f5 -d' ')
+ $LFS changelog_clear $MDT0 $USER 0
+ if [ x$flags != "x0x0" ]; then
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+ $USER
+ error "flag $flags is not 0x0"
+ fi
+ echo "rename overwrite a target having nlink > 1," \
+ "changelog record has flags of $flags"
+
+ # rename doesn't overwrite a target (changelog flag 0x0)
+ touch $DIR/$tdir/foo_161c
+ mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
+ $LFS changelog $MDT0 | grep RENME
+ flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | cut -f5 -d' ')
+ $LFS changelog_clear $MDT0 $USER 0
+ if [ x$flags != "x0x0" ]; then
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+ $USER
+ error "flag $flags is not 0x0"
+ fi
+ echo "rename doesn't overwrite a target," \
+ "changelog record has flags of $flags"
+
+ # define CLF_UNLINK_LAST 0x0001
+ # unlink a file having nlink = 1 (changelog flag 0x1)
+ rm -f $DIR/$tdir/foo2_161c
+ $LFS changelog $MDT0 | grep UNLNK
+ flags=$($LFS changelog $MDT0 | grep UNLNK | tail -1 | cut -f5 -d' ')
+ $LFS changelog_clear $MDT0 $USER 0
+ if [ x$flags != "x0x1" ]; then
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+ $USER
+ error "flag $flags is not 0x1"
+ fi
+ echo "unlink a file having nlink = 1," \
+ "changelog record has flags of $flags"
+
+ # unlink a file having nlink > 1 (changelog flag 0x0)
+ ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
+ rm -f $DIR/$tdir/foobar_161c
+ $LFS changelog $MDT0 | grep UNLNK
+ flags=$($LFS changelog $MDT0 | grep UNLNK | tail -1 | cut -f5 -d' ')
+ $LFS changelog_clear $MDT0 $USER 0
+ if [ x$flags != "x0x0" ]; then
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+ $USER
+ error "flag $flags is not 0x0"
+ fi
+ echo "unlink a file having nlink > 1," \
+ "changelog record has flags of $flags"
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+}
+run_test 161c "check CL_RENME[UNLINK] changelog record flags"
+
check_path() {
local expected=$1
shift
}
run_test 162 "path lookup sanity"
-test_163() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- remote_mds_nodsh && skip "remote MDS with nodsh" && return
- 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 $SINGLEMDS lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\
- error "kernel->userspace send failed"
- kill -INT $!
-}
-run_test 163 "kernel <-> userspace comms"
-
test_169() {
# do directio so as not to populate the page cache
log "creating a 10 Mb file"
local pages=${3:-64}
local rc=0
local id
+
+ local count=10
+ local obd_size=$(get_obd_size $node $OBD)
+ local page_size=$(get_page_size $node)
+ if [[ -n "$obd_size" ]]; then
+ local new_count=$((obd_size / (pages * page_size / 1024)))
+ [[ $new_count -ge $count ]] || count=$new_count
+ fi
+
do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
[ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
rc=2; }
[ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
rc=4; }
[ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
- "test_brw 10 w v $pages $id" || rc=4; }
+ "test_brw $count w v $pages $id" || rc=4; }
[ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
rc=4; }
[ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
run_test 182 "Disable MDC RPCs semaphore wouldn't crash client ================"
test_183() { # LU-2275
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.56) ]] &&
+ skip "Need MDS version at least 2.3.56" && return
+
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
echo aaa > $DIR/$tdir/$tfile
}
run_test 208 "Exclusive open"
+test_209() {
+ [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
+ skip_env "must have disp_stripe" && return
+
+ touch $DIR/$tfile
+ sync; sleep 5; sync;
+
+ echo 3 > /proc/sys/vm/drop_caches
+ req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
+
+ # open/close 500 times
+ for i in $(seq 500); do
+ cat $DIR/$tfile
+ done
+
+ echo 3 > /proc/sys/vm/drop_caches
+ req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
+
+ echo "before: $req_before, after: $req_after"
+ [ $((req_after - req_before)) -ge 300 ] &&
+ error "open/close requests are not freed"
+ return 0
+}
+run_test 209 "read-only open/close requests should be freed promptly"
+
test_212() {
size=`date +%s`
size=$((size % 8192 + 1))
run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
test_214() { # for bug 20133
- test_mkdir -p $DIR/d214p/d214c
+ mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
for (( i=0; i < 340; i++ )) ; do
- touch $DIR/d214p/d214c/a$i
+ touch $DIR/$tdir/d214c/a$i
done
- ls -l $DIR/d214p || error "ls -l $DIR/d214p failed"
- mv $DIR/d214p/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
+ ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
+ mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
ls $DIR/d214c || error "ls $DIR/d214c failed"
+ rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
}
run_test 214 "hash-indexed directory test - bug 20133"
# /proc/sys/lnet/routes should look like this:
# Routing disabled/enabled
- # net hops state router
- # where net is a string like tcp0, hops >= 0, state is up/down,
+ # net hops priority state router
+ # where net is a string like tcp0, hops > 0, priority >= 0,
+ # state is up/down,
# router is a string like 192.168.1.1@tcp2
L1="^Routing (disabled|enabled)$"
- L2="^net +hops +state +router$"
- BR="^$NET +$N +(up|down) +$NID$"
+ L2="^net +hops +priority +state +router$"
+ BR="^$NET +$N +(0|1) +(up|down) +$NID$"
create_lnet_proc_files "routes"
check_lnet_proc_entry "routes.out" "/proc/sys/lnet/routes" "$BR" "$L1" "$L2"
check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
$LCTL set_param fail_loc=0x411
dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
+
+ # LU-4201
+ dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
+ $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
}
run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
test_229() { # LU-2482, LU-3448
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] &&
+ skip "No HSM support on MDS of $(get_lustre_version)," \
+ "need 2.4.53 at least" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
$GETSTRIPE -v $DIR/$tfile
- local pattern=$($GETSTRIPE -v $DIR/$tfile |
- grep lmm_stripe_pattern | awk '{print $2}')
+ local pattern=$($GETSTRIPE -L $DIR/$tfile)
[ X"$pattern" = X"80000001" ] || error "pattern error ($pattern)"
local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
[ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
stat $DIR/$tfile || error "failed to stat released file"
- $TRUNCATE $DIR/$tfile 200000 &&
- error "truncate of released file should fail"
-
- # Ensure that nothing happened anyway.
- $CHECKSTAT -s 0 $DIR/$tfile ||
- error "released file size should not change"
-
- # Stripe count should be no change after truncate
- stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe failed"
- [ $stripe_count -eq 2 ] || error "after trunc: ($stripe_count)"
-
chown $RUNAS_ID $DIR/$tfile ||
error "chown $RUNAS_ID $DIR/$tfile failed"
chgrp $RUNAS_ID $DIR/$tfile ||
error "chgrp $RUNAS_ID $DIR/$tfile failed"
- touch $DIR/$tfile ||
- error "touch $DIR/$tfile failed"
-
+ touch $DIR/$tfile || error "touch $DIR/$tfile failed"
rm $DIR/$tfile || error "failed to remove released file"
}
run_test 229 "getstripe/stat/rm/attr changes work on released files"
}
run_test 230a "Create remote directory and files under the remote directory"
-test_230b() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
- local MDTIDX=1
- local remote_dir=$DIR/$tdir/remote_dir
- local rc=0
-
- mkdir -p $DIR/$tdir
- $LFS mkdir -i $MDTIDX $remote_dir ||
- error "create remote directory failed"
-
- $LFS mkdir -i 0 $remote_dir/new_dir &&
- error "nested remote directory create succeed!"
-
- do_facet mds$((MDTIDX + 1)) lctl set_param mdt.*.enable_remote_dir=1
- $LFS mkdir -i 0 $remote_dir/new_dir || rc=$?
- do_facet mds$((MDTIDX + 1)) lctl set_param mdt.*.enable_remote_dir=0
-
- [ $rc -ne 0 ] &&
- error "create remote directory failed after set enable_remote_dir"
-
- rm -rf $remote_dir || error "first unlink remote directory failed"
-
- $RUNAS -G$RUNAS_GID $LFS mkdir -i $MDTIDX $DIR/$tfile &&
- error "chown worked"
-
- do_facet mds$MDTIDX lctl set_param \
- mdt.*.enable_remote_dir_gid=$RUNAS_GID
- $LFS mkdir -i $MDTIDX $remote_dir || rc=$?
- do_facet mds$MDTIDX lctl set_param mdt.*.enable_remote_dir_gid=0
-
- [ $rc -ne 0 ] &&
- error "create remote dir failed after set enable_remote_dir_gid"
-
- rm -r $DIR/$tdir || error "second unlink remote directory failed"
-}
-run_test 230b "nested remote directory should be failed"
-
test_231a()
{
# For simplicity this test assumes that max_pages_per_rpc
}
run_test 232 "failed lock should not block umount"
-test_233() {
+test_233a() {
+ [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.64) ] ||
+ { skip "Need MDS version at least 2.3.64"; return; }
+
local fid=$($LFS path2fid $MOUNT)
stat $MOUNT/.lustre/fid/$fid > /dev/null ||
error "cannot access $MOUNT using its FID '$fid'"
}
-run_test 233 "checking that OBF of the FS root succeeds"
+run_test 233a "checking that OBF of the FS root succeeds"
+
+test_233b() {
+ [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.5.90) ] ||
+ { skip "Need MDS version at least 2.5.90"; return; }
+
+ local fid=$($LFS path2fid $MOUNT/.lustre)
+ stat $MOUNT/.lustre/fid/$fid > /dev/null ||
+ error "cannot access $MOUNT/.lustre using its FID '$fid'"
+
+ fid=$($LFS path2fid $MOUNT/.lustre/fid)
+ stat $MOUNT/.lustre/fid/$fid > /dev/null ||
+ error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
+}
+run_test 233b "checking that OBF of the FS .lustre succeeds"
+
+test_234() {
+ local p="$TMP/sanityN-$TESTNAME.parameters"
+ save_lustre_params client "llite.*.xattr_cache" > $p
+ lctl set_param llite.*.xattr_cache 1 ||
+ { skip "xattr cache is not supported"; return 0; }
+
+ mkdir -p $DIR/$tdir || error "mkdir failed"
+ touch $DIR/$tdir/$tfile || error "touch failed"
+ # OBD_FAIL_LLITE_XATTR_ENOMEM
+ $LCTL set_param fail_loc=0x1405
+ if [ ! -f /etc/SuSE-release ]; then
+ # attr pre-2.4.44-7 had a bug with rc
+ # LU-3703 - SLES clients have older attr
+ getfattr -n user.attr $DIR/$tdir/$tfile &&
+ error "getfattr should have failed with ENOMEM"
+ fi
+ $LCTL set_param fail_loc=0x0
+ rm -rf $DIR/$tdir
+
+ restore_lustre_params < $p
+ rm -f $p
+}
+run_test 234 "xattr cache should not crash on ENOMEM"
+
+test_235() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.52) ] &&
+ skip "Need MDS version at least 2.4.52" && return
+ flock_deadlock $DIR/$tfile
+ local RC=$?
+ case $RC in
+ 0)
+ ;;
+ 124) error "process hangs on a deadlock"
+ ;;
+ *) error "error executing flock_deadlock $DIR/$tfile"
+ ;;
+ esac
+}
+run_test 235 "LU-1715: flock deadlock detection does not work properly"
+
+#LU-2935
+test_236() {
+ check_swap_layouts_support && return 0
+ test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
+
+ local ref1=/etc/passwd
+ local ref2=/etc/group
+ local file1=$DIR/$tdir/f1
+ local file2=$DIR/$tdir/f2
+
+ $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
+ cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
+ $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
+ cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
+ local fd=$(free_fd)
+ local cmd="exec $fd<>$file2"
+ eval $cmd
+ rm $file2
+ $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
+ error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
+ cmd="exec $fd>&-"
+ eval $cmd
+ cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
+
+ #cleanup
+ rm -rf $DIR/$tdir
+}
+run_test 236 "Layout swap on open unlinked file"
+
+# test to verify file handle related system calls
+# (name_to_handle_at/open_by_handle_at)
+# The new system calls are supported in glibc >= 2.14.
+
+test_237() {
+ echo "Test file_handle syscalls" > $DIR/$tfile
+ check_fhandle_syscalls $DIR/$tfile ||
+ error "check_fhandle_syscalls failed"
+}
+run_test 237 "Verify name_to_handle_at/open_by_handle_at syscalls"
#
# tests that do cleanup/setup should be run at the end