. ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh}
init_logging
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b 230d"
[ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
# bug number for skipped test: LU-1593 LU-2610 LU-2833 LU-1957 LU-2805
}
run_test 3 "mkdir; touch; rmdir; check dir ====================="
+# LU-4471 - failed rmdir on remote directories still removes directory on MDT0
+test_4() {
+ local MDTIDX=1
+ local remote_dir=remote_dir
+
+ [ $MDSCOUNT -ge 2 ] && skip "skip now for LU-4690" && return #LU-4690
+ test_mkdir $DIR/$remote_dir ||
+ error "Create remote directory failed"
+
+ touch $DIR/$remote_dir/$tfile ||
+ error "Create file under remote directory failed"
+
+ rmdir $DIR/$remote_dir &&
+ error "Expect error removing in-use dir $DIR/$remote_dir"
+
+ test -d $DIR/$remote_dir || error "Remote directory disappeared"
+}
+run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
+
test_5() {
test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed"
[ $(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"
error "create files under remote dir failed $i"
done
- check_fs_consistency_17n || error "e2fsck report error"
+ check_fs_consistency_17n ||
+ error "e2fsck report error after create files under remote dir"
+
+ for ((i=0;i<10;i++)); do
+ rm -rf $DIR/$tdir/remote_dir_${i} ||
+ error "destroy remote dir error $i"
+ done
+
+ check_fs_consistency_17n ||
+ error "e2fsck report error after unlink files under remote dir"
+
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.50) ] &&
+ skip "lustre < 2.4.50 does not support migrate mv " && return
+
+ for ((i=0; i<10; i++)); do
+ mkdir -p $DIR/$tdir/remote_dir_${i}
+ createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
+ error "create files under remote dir failed $i"
+ $LFS mv -M 1 $DIR/$tdir/remote_dir_${i} ||
+ error "migrate remote dir error $i"
+ done
+ check_fs_consistency_17n || error "e2fsck report error after migration"
for ((i=0;i<10;i++)); do
rm -rf $DIR/$tdir/remote_dir_${i} ||
error "destroy remote dir error $i"
done
- check_fs_consistency_17n || error "e2fsck report error"
+ check_fs_consistency_17n || error "e2fsck report error after unlink"
}
run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
run_test 24c "rename directory to non-existent target"
test_24d() {
- test_mkdir $DIR/$tdir
- test_mkdir $DIR/$tdir/d$testnum.1
- test_mkdir $DIR/$tdir/d$ttestnum.2
+ test_mkdir -c1 $DIR/$tdir
+ test_mkdir -c1 $DIR/$tdir/d$testnum.1
+ test_mkdir -c1 $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"
run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
test_24h() {
- test_mkdir $DIR/R8a
- test_mkdir $DIR/R8b
- test_mkdir $DIR/R8a/d
- test_mkdir $DIR/R8b/e
+ test_mkdir -c1 $DIR/R8a
+ test_mkdir -c1 $DIR/R8b
+ test_mkdir -c1 $DIR/R8a/d
+ test_mkdir -c1 $DIR/R8b/e
mrename $DIR/R8a/d $DIR/R8b/e
$CHECKSTAT -a $DIR/R8a/d || error
$CHECKSTAT -t dir $DIR/R8b/e || error
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`
[ ! -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 31f "remove of open directory with open-unlink file ==="
test_31g() {
- echo "-- cross directory link --"
- test_mkdir $DIR/d31ga
- test_mkdir $DIR/d31gb
- touch $DIR/d31ga/f
- ln $DIR/d31ga/f $DIR/d31gb/g
- $CHECKSTAT -t file $DIR/d31ga/f || error "source"
- [ `stat -c%h $DIR/d31ga/f` == '2' ] || error "source nlink"
- $CHECKSTAT -t file $DIR/d31gb/g || error "target"
- [ `stat -c%h $DIR/d31gb/g` == '2' ] || error "target nlink"
+ echo "-- cross directory link --"
+ test_mkdir -c1 $DIR/${tdir}ga
+ test_mkdir -c1 $DIR/${tdir}gb
+ touch $DIR/${tdir}ga/f
+ ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
+ $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
+ [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
+ $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
+ [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
}
run_test 31g "cross directory link==============="
test_31h() {
- echo "-- cross directory link --"
- test_mkdir $DIR/d31h
- test_mkdir $DIR/d31h/dir
- touch $DIR/d31h/f
- ln $DIR/d31h/f $DIR/d31h/dir/g
- $CHECKSTAT -t file $DIR/d31h/f || error "source"
- [ `stat -c%h $DIR/d31h/f` == '2' ] || error "source nlink"
- $CHECKSTAT -t file $DIR/d31h/dir/g || error "target"
- [ `stat -c%h $DIR/d31h/dir/g` == '2' ] || error "target nlink"
+ echo "-- cross directory link --"
+ test_mkdir -c1 $DIR/${tdir}
+ test_mkdir -c1 $DIR/${tdir}/dir
+ touch $DIR/${tdir}/f
+ ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
+ $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
+ [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
+ $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
+ [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
}
run_test 31h "cross directory link under child==============="
test_31i() {
- echo "-- cross directory link --"
- test_mkdir $DIR/d31i
- test_mkdir $DIR/d31i/dir
- touch $DIR/d31i/dir/f
- ln $DIR/d31i/dir/f $DIR/d31i/g
- $CHECKSTAT -t file $DIR/d31i/dir/f || error "source"
- [ `stat -c%h $DIR/d31i/dir/f` == '2' ] || error "source nlink"
- $CHECKSTAT -t file $DIR/d31i/g || error "target"
- [ `stat -c%h $DIR/d31i/g` == '2' ] || error "target nlink"
+ echo "-- cross directory link --"
+ test_mkdir -c1 $DIR/$tdir
+ test_mkdir -c1 $DIR/$tdir/dir
+ touch $DIR/$tdir/dir/f
+ ln $DIR/$tdir/dir/f $DIR/$tdir/g
+ $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
+ [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
+ $CHECKSTAT -t file $DIR/$tdir/g || error "target"
+ [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
}
run_test 31i "cross directory link under parent==============="
-
test_31j() {
- test_mkdir $DIR/d31j
- test_mkdir $DIR/d31j/dir1
- ln $DIR/d31j/dir1 $DIR/d31j/dir2 && error "ln for dir"
- link $DIR/d31j/dir1 $DIR/d31j/dir3 && error "link for dir"
- mlink $DIR/d31j/dir1 $DIR/d31j/dir4 && error "mlink for dir"
- mlink $DIR/d31j/dir1 $DIR/d31j/dir1 && error "mlink to the same dir"
+ test_mkdir -c1 -p $DIR/$tdir
+ test_mkdir -c1 -p $DIR/$tdir/dir1
+ ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
+ link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
+ mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
+ mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
return 0
}
run_test 31j "link for directory==============="
-
test_31k() {
- test_mkdir $DIR/d31k
- touch $DIR/d31k/s
- touch $DIR/d31k/exist
- mlink $DIR/d31k/s $DIR/d31k/t || error "mlink"
- mlink $DIR/d31k/s $DIR/d31k/exist && error "mlink to exist file"
- mlink $DIR/d31k/s $DIR/d31k/s && error "mlink to the same file"
- mlink $DIR/d31k/s $DIR/d31k && error "mlink to parent dir"
- mlink $DIR/d31k $DIR/d31k/s && error "mlink parent dir to target"
- mlink $DIR/d31k/not-exist $DIR/d31k/foo && error "mlink non-existing to new"
- mlink $DIR/d31k/not-exist $DIR/d31k/s && error "mlink non-existing to exist"
+ test_mkdir -c1 -p $DIR/$tdir
+ touch $DIR/$tdir/s
+ touch $DIR/$tdir/exist
+ mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
+ mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
+ mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
+ mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
+ mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
+ mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
+ mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
return 0
}
run_test 31k "link to file: the same, non-existing, dir==============="
test_31m() {
- test_mkdir $DIR/d31m
+ mkdir $DIR/d31m
touch $DIR/d31m/s
- test_mkdir $DIR/d31m2
+ mkdir $DIR/d31m2
touch $DIR/d31m2/exist
mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
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 ===="
done
}
+cleanup_54c() {
+ loopdev="$DIR/loop54c"
+
+ trap 0
+ $UMOUNT -d $tdir || rc=$?
+ losetup -d $loopdev || true
+ rm $loopdev
+ return $rc
+}
+
test_54c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
tfile="$DIR/f54c"
[ -z "$LOOPNUM" ] && echo "couldn't find empty loop device" && return
mknod $loopdev b 7 $LOOPNUM
echo "make a loop file system with $tfile on $loopdev ($LOOPNUM)..."
- dd if=/dev/zero of=$tfile bs=`page_size` seek=1024 count=1 > /dev/null
+ dd if=/dev/zero of=$tfile bs=$(get_page_size client) seek=1024 count=1 > /dev/null
losetup $loopdev $tfile || error "can't set up $loopdev for $tfile"
+ trap cleanup_54c EXIT
mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
test_mkdir -p $tdir
mount -t ext2 $loopdev $tdir || error "error mounting $loopdev on $tdir"
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
- losetup -d $loopdev
- rm $loopdev
+ cleanup_54c
}
run_test 54c "block device works in lustre ====================="
NUMFILES=3
NUMDIRS=3
setup_56() {
- local LOCAL_NUMFILES="$1"
- local LOCAL_NUMDIRS="$2"
- local MKDIR_PARAMS="$3"
-
- if [ ! -d "$TDIR" ] ; then
- test_mkdir -p $TDIR
- [ "$MKDIR_PARAMS" ] && $SETSTRIPE $MKDIR_PARAMS $TDIR
- for i in `seq 1 $LOCAL_NUMFILES` ; do
- touch $TDIR/file$i
- done
- for i in `seq 1 $LOCAL_NUMDIRS` ; do
- test_mkdir $TDIR/dir$i
- for j in `seq 1 $LOCAL_NUMFILES` ; do
- touch $TDIR/dir$i/file$j
- done
- done
- fi
+ local LOCAL_NUMFILES="$1"
+ local LOCAL_NUMDIRS="$2"
+ local MKDIR_PARAMS="$3"
+ local DIR_STRIPE_PARAMS="$4"
+
+ if [ ! -d "$TDIR" ] ; then
+ test_mkdir -p $DIR_STRIPE_PARAMS $TDIR
+ [ "$MKDIR_PARAMS" ] && $SETSTRIPE $MKDIR_PARAMS $TDIR
+ for i in `seq 1 $LOCAL_NUMFILES` ; do
+ touch $TDIR/file$i
+ done
+ for i in `seq 1 $LOCAL_NUMDIRS` ; do
+ test_mkdir $DIR_STRIPE_PARAMS $TDIR/dir$i
+ for j in `seq 1 $LOCAL_NUMFILES` ; do
+ touch $TDIR/dir$i/file$j
+ done
+ done
+ fi
}
setup_56_special() {
test_56o() {
TDIR=$DIR/${tdir}o
setup_56 $NUMFILES $NUMDIRS
-
utime $TDIR/file1 > /dev/null || error "utime (1)"
utime $TDIR/file2 > /dev/null || error "utime (2)"
utime $TDIR/dir1 > /dev/null || error "utime (3)"
TDIR=$DIR/${tdir}w
rm -rf $TDIR || error "remove $TDIR failed"
- setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT"
+ setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
local stripe_size
stripe_size=$($GETSTRIPE -S -d $TDIR) ||
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
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 ======="
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}K" && 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 test file $file of size ${size}M with ${space}K free space"
+ echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
$SETSTRIPE -c -1 $file || error "setstripe failed"
- dd if=/dev/zero of=$file bs=1M count=$size || error "dd failed"
+
+ 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 Disable read-ahead
- local old_READAHEAD=$(set_read_ahead 0)
+ echo Disable read-ahead
+ local old_READAHEAD=$(set_read_ahead 0)
- 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 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 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"
+
+test_102p() { # LU-4703 setxattr did not check ownership
+ local testfile=$DIR/$tfile
+
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.56) ] &&
+ skip "MDS needs to be at least 2.5.56" && return
+
+ touch $testfile
+
+ echo "setfacl as user..."
+ $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
+ [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
+
+ echo "setfattr as user..."
+ setfacl -m "u:$RUNAS_ID:---" $testfile
+ $RUNAS setfattr -x system.posix_acl_access $testfile
+ [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
+}
+run_test 102p "check setxattr(2) correctly fails without permission"
+
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 ==================="
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
#define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
local old_rr
- old_rr=$(do_facet $SINGLEMDS lctl get_param -n lov.*mdtlov*.qos_threshold_rr)
- do_facet $SINGLEMDS lctl set_param lov.*mdtlov*.qos_threshold_rr 0
+ old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
+ lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
+ do_facet $SINGLEMDS lctl set_param \
+ lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
mkdir -p $DIR/$tdir
do_facet $SINGLEMDS lctl set_param fail_loc=0x147
createmany -o $DIR/$tdir/f- 20 || error "can't create"
do_facet $SINGLEMDS lctl set_param fail_loc=0
rm -rf $DIR/$tdir
- do_facet $SINGLEMDS lctl set_param lov.*mdtlov*.qos_threshold_rr $old_rr
+ do_facet $SINGLEMDS lctl set_param \
+ lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
}
run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
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=""
test_120a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
[ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
skip "no early lock cancel on server" && return 0
# asynchronous object destroy at MDT could cause bl ast to client
cancel_lru_locks osc
- stat $DIR/$tdir > /dev/null
- can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
- blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
- test_mkdir $DIR/$tdir/d1
- can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
- blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
+ stat $DIR/$tdir > /dev/null
+ can1=$(lctl get_param -n ldlm.services.ldlm_canceld.stats |
+ awk '/ldlm_cancel/ {print $2}')
+ blk1=$(lctl get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ test_mkdir -c1 $DIR/$tdir/d1
+ can2=$(lctl get_param -n ldlm.services.ldlm_canceld.stats |
+ awk '/ldlm_cancel/ {print $2}')
+ blk2=$(lctl get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
[ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
[ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
lru_resize_enable mdc
test_120b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
- [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
+ test_mkdir $DIR/$tdir
+ [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \
skip "no early lock cancel on server" && return 0
lru_resize_disable mdc
lru_resize_disable osc
test_120c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
- [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
- skip "no early lock cancel on server" && return 0
+ test_mkdir -c1 $DIR/$tdir
+ [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \
+ skip "no early lock cancel on server" && return 0
lru_resize_disable mdc
lru_resize_disable osc
- test_mkdir -p $DIR/$tdir/d1
- test_mkdir -p $DIR/$tdir/d2
+ test_mkdir -p -c1 $DIR/$tdir/d1
+ test_mkdir -p -c1 $DIR/$tdir/d2
touch $DIR/$tdir/d1/f1
cancel_lru_locks mdc
stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
test_120d() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
- [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
- skip "no early lock cancel on server" && return 0
+ test_mkdir -p -c1 $DIR/$tdir
+ [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \
+ skip "no early lock cancel on server" && return 0
lru_resize_disable mdc
lru_resize_disable osc
touch $DIR/$tdir
test_120e() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir -p -c1 $DIR/$tdir
[ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
skip "no early lock cancel on server" && return 0
lru_resize_disable mdc
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
skip "no early lock cancel on server" && return 0
- test_mkdir -p $DIR/$tdir
+ test_mkdir -p -c1 $DIR/$tdir
lru_resize_disable mdc
lru_resize_disable osc
- test_mkdir -p $DIR/$tdir/d1
- test_mkdir -p $DIR/$tdir/d2
+ test_mkdir -p -c1 $DIR/$tdir/d1
+ test_mkdir -p -c1 $DIR/$tdir/d2
dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
cancel_lru_locks mdc
return
fi
remote_mds_nodsh && skip "remote MDS with nodsh" && return
-
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
+ local STRIPE_COUNT=1
+ [ $MDSCOUNT -ge 2 ] && STRIPE_COUNT=$($LFS getdirstripe -c $DIR/$tdir)
+ MAX=$((MAX*STRIPE_COUNT))
while [ ! $I -gt $MAX ]; do
$MULTIOP $DIR/$tdir/$J Oc
rc=$?
#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 " \
done
set_dir_limits 0
- error "exceeded dir size limit $MAX x $MDSCOUNT $MAX : $I bytes"
+ error "exceeded dir size limit $MAX($MDSCOUNT) : $I bytes"
}
run_test 129 "test directory size limit ========================"
$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
rm -f $test_dir/$tfile.1
echo "truncate fid $fid"
$TRUNCATE $ffid 777 || error "truncate $ffid failed."
- echo "link fid $fid"
- ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
+ if [ $MDSCOUNT -lt 2 ]; then #FIXME when cross-MDT hard link is working
+ echo "link fid $fid"
+ ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
+ fi
if [ -n $(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl) ]; then
echo "setfacl fid $fid"
setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
local rc=0
mkdir -p $DIR/$tdir
- $LFS mkdir -i $MDTIDX $remote_dir ||
+ $LFS mkdir -i $MDTIDX -c $MDSCOUNT $remote_dir ||
error "create remote directory failed"
cp /etc/hosts $remote_dir/$tfile
}
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
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
tail -1
}
-test_160() {
+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) ] ||
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
- test_mkdir -p $DIR/$tdir
- cp /etc/hosts $DIR/$tdir/$tfile
- test_mkdir $DIR/$tdir/foo1
- test_mkdir $DIR/$tdir/foo2
- ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
- ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
- ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
- ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
+ test_mkdir -p -c1 $DIR/$tdir
+ cp /etc/hosts $DIR/$tdir/$tfile
+ test_mkdir -c1 $DIR/$tdir/foo1
+ test_mkdir -c1 $DIR/$tdir/foo2
+ ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
+ ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
+ ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
+ ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
$LFS fid2path $DIR $FID
}
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
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 " \
check_swap_layouts_support && return 0
dir0=$DIR/$tdir/$testnum
- test_mkdir -p $dir0 || error "creating dir $dir0"
+ test_mkdir -p -c1 $dir0 || error "creating dir $dir0"
ref1=/etc/passwd
ref2=/etc/group
file1=$dir0/f1
}
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"
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
[ $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"
[ $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
+ local mdt_index
+ local i
+ local file
+ local pid
+ local stripe_count
+ local migrate_dir=$DIR/$tdir/migrate_dir
+ local other_dir=$DIR/$tdir/other_dir
+
+ mkdir -p $migrate_dir
+ mkdir -p $other_dir
+ for ((i=0; i<10; i++)); do
+ mkdir -p $migrate_dir/dir_${i}
+ createmany -o $migrate_dir/dir_${i}/f 10 ||
+ error "create files under remote dir failed $i"
+ done
+
+ cp /etc/passwd $migrate_dir/$tfile
+ cp /etc/passwd $other_dir/$tfile
+ mkdir -p $migrate_dir/dir_default_stripe2
+ $LFS setstripe -c 2 $migrate_dir/dir_default_stripe2
+ $LFS setstripe -c 2 $migrate_dir/${tfile}_stripe2
+
+ mkdir -p $other_dir
+ ln $migrate_dir/$tfile $other_dir/luna
+ ln $migrate_dir/$tfile $migrate_dir/sofia
+ ln $other_dir/$tfile $migrate_dir/david
+ ln -s $migrate_dir/$tfile $other_dir/zachary
+ ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
+ ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
+
+ $LFS mv -v -M $MDTIDX $migrate_dir ||
+ error "migrate remote dir error"
+
+ echo "migratate to MDT1, then checking.."
+ for ((i=0; i<10; i++)); do
+ for file in $(find $migrate_dir/dir_${i}); do
+ mdt_index=$($LFS getstripe -M $file)
+ [ $mdt_index == $MDTIDX ] ||
+ error "$file is not on MDT${MDTIDX}"
+ done
+ done
+
+ # the multiple link file should still in MDT0
+ mdt_index=$($LFS getstripe -M $migrate_dir/$tfile)
+ [ $mdt_index == 0 ] ||
+ error "$file is not on MDT${MDTIDX}"
+
+ diff /etc/passwd $migrate_dir/$tfile ||
+ error "$tfile different after migration"
+
+ diff /etc/passwd $other_dir/luna ||
+ error "luna different after migration"
+
+ diff /etc/passwd $migrate_dir/sofia ||
+ error "sofia different after migration"
+
+ diff /etc/passwd $migrate_dir/david ||
+ error "david different after migration"
+ diff /etc/passwd $other_dir/zachary ||
+ error "zachary different after migration"
+
+ diff /etc/passwd $migrate_dir/${tfile}_ln ||
+ error "${tfile}_ln different after migration"
+
+ diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
+ error "${tfile}_ln_other different after migration"
+
+ stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
+ [ $stripe_count = 2 ] ||
+ error "dir strpe_count $d != 2 after migration."
+
+ stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
+ [ $stripe_count = 2 ] ||
+ error "file strpe_count $d != 2 after migration."
+
+ #migrate back to MDT0
+ MDTIDX=0
+ $LFS mv -v -M $MDTIDX $migrate_dir ||
+ error "migrate remote dir error"
+
+ echo "migrate back to MDT0, checking.."
+ for file in $(find $migrate_dir); do
+ mdt_index=$($LFS getstripe -M $file)
+ [ $mdt_index == $MDTIDX ] ||
+ error "$file is not on MDT${MDTIDX}"
+ done
+
+ diff /etc/passwd ${migrate_dir}/$tfile ||
+ error "$tfile different after migration"
+
+ diff /etc/passwd ${other_dir}/luna ||
+ error "luna different after migration"
+
+ diff /etc/passwd ${migrate_dir}/sofia ||
+ error "sofia different after migration"
+
+ diff /etc/passwd ${other_dir}/zachary ||
+ error "zachary different after migration"
+
+ diff /etc/passwd $migrate_dir/${tfile}_ln ||
+ error "${tfile}_ln different after migration"
+
+ diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
+ error "${tfile}_ln_other different after migration"
+
+ stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
+ [ $stripe_count = 2 ] ||
+ error "dir strpe_count $d != 2 after migration."
+
+ stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
+ [ $stripe_count = 2 ] ||
+ error "file strpe_count $d != 2 after migration."
+
+ rm -rf $DIR/$tdir || error "rm dir failed after migration"
+}
+run_test 230b "migrate directory"
+
+test_230c() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local MDTIDX=1
+ local mdt_index
+ local file
+
+ #If migrating directory fails in the middle, all entries of
+ #the directory is still accessiable.
mkdir -p $DIR/$tdir
- $LFS mkdir -i $MDTIDX $remote_dir ||
- error "create remote directory failed"
+ stat $DIR/$tdir
+ createmany -o $DIR/$tdir/f 10 ||
+ error "create files under ${tdir} failed"
+
+ #failed after migrating 5 entries
+ #OBD_FAIL_MIGRATE_ENTRIES 0x1801
+ do_facet mds1 lctl set_param fail_loc=0x20001801
+ do_facet mds1 lctl set_param fail_val=5
+ local t=`ls $DIR/$tdir | wc -l`
+ $LFS mv -M $MDTIDX $DIR/$tdir &&
+ error "migrate should failed after 5 entries"
+ local u=`ls $DIR/$tdir | wc -l`
+ [ "$u" == "$t" ] || error "$u != $t during migration"
- $LFS mkdir -i 0 $remote_dir/new_dir &&
- error "nested remote directory create succeed!"
+ for file in $(find $DIR/$tdir); do
+ stat $file || error "stat $file failed"
+ done
- 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
+ do_facet mds1 lctl set_param fail_loc=0
+ do_facet mds1 lctl set_param fail_val=0
- [ $rc -ne 0 ] &&
- error "create remote directory failed after set enable_remote_dir"
+ $LFS mv -M $MDTIDX $DIR/$tdir ||
+ error "migrate open files should failed with open files"
- rm -rf $remote_dir || error "first unlink remote directory failed"
+ echo "Finish migration, then checking.."
+ for file in $(find $DIR/$tdir); do
+ mdt_index=$($LFS getstripe -M $file)
+ [ $mdt_index == $MDTIDX ] ||
+ error "$file is not on MDT${MDTIDX}"
+ done
- $RUNAS -G$RUNAS_GID $LFS mkdir -i $MDTIDX $DIR/$tfile &&
- error "chown worked"
+ rm -rf $DIR/$tdir || error "rm dir failed after migration"
+}
+run_test 230c "check directory accessiblity if migration is failed"
- 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
+test_230d() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local MDTIDX=1
+ local mdt_index
+ local i
+ local j
- [ $rc -ne 0 ] &&
- error "create remote dir failed after set enable_remote_dir_gid"
+ mkdir -p $DIR/$tdir
+
+ for ((i=0; i<100; i++)); do
+ mkdir -p $DIR/$tdir/dir_${i}
+ createmany -o $DIR/$tdir/dir_${i}/f 100 ||
+ error "create files under remote dir failed $i"
+ done
+
+ $LFS mv -M $MDTIDX -v $DIR/$tdir || error "migrate remote dir error"
+
+ echo "Finish migration, then checking.."
+ for file in $(find $DIR/$tdir); do
+ mdt_index=$($LFS getstripe -M $file)
+ [ $mdt_index == $MDTIDX ] ||
+ error "$file is not on MDT${MDTIDX}"
+ done
- rm -r $DIR/$tdir || error "second unlink remote directory failed"
+ rm -rf $DIR/$tdir || error "rm dir failed after migration"
}
-run_test 230b "nested remote directory should be failed"
+run_test 230d "check migrate big directory"
test_231a()
{
}
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"
touch $DIR/$tdir/$tfile || error "touch failed"
# OBD_FAIL_LLITE_XATTR_ENOMEM
$LCTL set_param fail_loc=0x1405
- setfattr -n user.attr -v value $DIR/$tdir/$tfile &&
- error "setfattr should have failed with ENOMEM"
- # attr pre-2.4.44-7 had a bug with rc
- getfattr -n user.attr $DIR/$tdir/$tfile &&
- error "getfattr should have failed with ENOMEM"
+ 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
}
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 -c1 $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"
+
+test_striped_dir() {
+ local mdt_index=$1
+ local stripe_count
+ local stripe_index
+
+ mkdir -p $DIR/$tdir
+ $LFS setdirstripe -i $mdt_index -c 2 -t all_char $DIR/$tdir/striped_dir ||
+ error "set striped dir error"
+
+ stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
+ if [ "$stripe_count" != "2" ]; then
+ error "stripe_count is $stripe_count, expect 2"
+ fi
+
+ stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
+ if [ "$stripe_index" != "$mdt_index" ]; then
+ error "stripe_index is $stripe_index, expect $mdt_index"
+ fi
+
+ [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
+ error "nlink error after create striped dir"
+
+ mkdir $DIR/$tdir/striped_dir/a
+ mkdir $DIR/$tdir/striped_dir/b
+
+ stat $DIR/$tdir/striped_dir/a ||
+ error "create dir under striped dir failed"
+ stat $DIR/$tdir/striped_dir/b ||
+ error "create dir under striped dir failed"
+
+ [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
+ error "nlink error after mkdir"
+
+ rmdir $DIR/$tdir/striped_dir/a
+ [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
+ error "nlink error after rmdir"
+
+ rmdir $DIR/$tdir/striped_dir/b
+ [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
+ error "nlink error after rmdir"
+
+ rmdir $DIR/$tdir/striped_dir ||
+ error "rmdir striped dir error"
+ true
+}
+
+test_300a() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ test_striped_dir 0 || error "failed on striped dir on MDT0"
+ test_striped_dir 1 || error "failed on striped dir on MDT0"
+}
+run_test 300a "basic striped dir sanity test"
+
+test_300b() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local i
+ local mtime1
+ local mtime2
+ local mtime3
+
+ test_mkdir $DIR/$tdir || error "mkdir fail"
+ $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir ||
+ error "set striped dir error"
+ for ((i=0; i<10; i++)); do
+ mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
+ sleep 1
+ touch $DIR/$tdir/striped_dir/file_$i ||
+ error "touch error $i"
+ mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
+ [ $mtime1 -eq $mtime2 ] &&
+ error "mtime not change after create"
+ sleep 1
+ rm -f $DIR/$tdir/striped_dir/file_$i ||
+ error "unlink error $i"
+ mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
+ [ $mtime2 -eq $mtime3 ] &&
+ error "mtime did not change after unlink"
+ done
+ true
+}
+run_test 300b "check ctime/mtime for striped dir"
+
+test_300c() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local file_count
+
+ mkdir -p $DIR/$tdir
+ $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
+ error "set striped dir error"
+
+ chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
+ error "chown striped dir failed"
+
+ $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
+ error "create 5k files failed"
+
+ file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
+
+ [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
+
+ rm -rf $DIR/$tdir
+}
+run_test 300c "chown && check ls under striped directory"
+
+test_300d() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local stripe_count
+ local file
+
+ mkdir -p $DIR/$tdir
+ $SETSTRIPE -c 2 $DIR/$tdir
+
+ #local striped directory
+ $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir ||
+ error "set striped dir error"
+ createmany -o $DIR/$tdir/striped_dir/f 10 ||
+ error "create 10 files failed"
+
+ #remote striped directory
+ $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
+ error "set striped dir error"
+ createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
+ error "create 10 files failed"
+
+ for file in $(find $DIR/$tdir); do
+ stripe_count=$($GETSTRIPE -c $file)
+ [ $stripe_count -eq 2 ] ||
+ error "wrong stripe $stripe_count for $file"
+ done
+
+ rm -rf $DIR/$tdir
+}
+run_test 300d "check default stripe under striped directory"
+
+test_300e() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local stripe_count
+ local file
+
+ mkdir -p $DIR/$tdir
+
+ $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir ||
+ error "set striped dir error"
+
+ touch $DIR/$tdir/striped_dir/a
+ touch $DIR/$tdir/striped_dir/b
+ touch $DIR/$tdir/striped_dir/c
+
+ mkdir $DIR/$tdir/striped_dir/dir_a
+ mkdir $DIR/$tdir/striped_dir/dir_b
+ mkdir $DIR/$tdir/striped_dir/dir_c
+
+ $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_a ||
+ error "set striped dir under striped dir error"
+
+ $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_b ||
+ error "set striped dir under striped dir error"
+
+ $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_c ||
+ error "set striped dir under striped dir error"
+
+ mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/b &&
+ error "rename file under striped dir should fail"
+
+ mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b &&
+ error "rename dir under striped dir should fail"
+
+ mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b &&
+ error "rename dir under different stripes should fail"
+
+ mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
+ error "rename file under striped dir should succeed"
+
+ mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_c ||
+ error "rename dir under striped dir should succeed"
+
+ rm -rf $DIR/$tdir
+}
+run_test 300e "check rename under striped directory"
+
+test_300f() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local stripe_count
+ local file
+
+ rm -rf $DIR/$tdir
+ mkdir -p $DIR/$tdir
+
+ $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir ||
+ error "set striped dir error"
+
+ $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir1 ||
+ error "set striped dir error"
+
+ touch $DIR/$tdir/striped_dir/a
+ mkdir $DIR/$tdir/striped_dir/dir_a
+ $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
+ error "create striped dir under striped dir fails"
+
+ touch $DIR/$tdir/striped_dir1/b
+ mkdir $DIR/$tdir/striped_dir1/dir_b
+ $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
+ error "create striped dir under striped dir fails"
+
+ mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/b &&
+ error "rename file under different striped dir should fail"
+
+ mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b &&
+ error "rename dir under different striped dir should fail"
+
+ mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b &&
+ error "rename striped dir under diff striped dir should fail"
+
+ mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
+ error "rename file under diff striped dirs fails"
+
+ mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_a ||
+ error "rename dir under diff striped dirs fails"
+
+ rm -rf $DIR/$tdir
+}
+run_test 300f "check rename cross striped directory"
+
#
# tests that do cleanup/setup should be run at the end
#
run_test 900 "umount should not race with any mgc requeue thread"
complete $SECONDS
+[ -f $EXT2_DEV ] && rm $EXT2_DEV || true
check_and_cleanup_lustre
if [ "$I_MOUNTED" != "yes" ]; then
lctl set_param debug="$OLDDEBUG" 2> /dev/null || true