# bug number for skipped tests: LU-2036
ALWAYS_EXCEPT=" 76 $ALWAYS_EXCEPT"
-is_sles11() # LU-4351
-{
- if [ -r /etc/SuSE-release ]
- then
- local vers=`grep VERSION /etc/SuSE-release | awk '{print $3}'`
- if [ $vers -eq 11 ]
- then
- return 0
- fi
- fi
- return 1
-}
-
-if is_sles11; then # LU-4351
- ALWAYS_EXCEPT="$ALWAYS_EXCEPT 54c"
-fi
-
SRCDIR=$(cd $(dirname $0); echo $PWD)
export PATH=$PATH:/sbin
LFIND=${LFIND:-"$LFS find"}
LVERIFY=${LVERIFY:-ll_dirstripe_verify}
LCTL=${LCTL:-lctl}
-MCREATE=${MCREATE:-mcreate}
OPENFILE=${OPENFILE:-openfile}
OPENUNLINK=${OPENUNLINK:-openunlink}
export MULTIOP=${MULTIOP:-multiop}
. ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh}
init_logging
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b 230d"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 24D 27m 64b 68 71 77f 78 115 124b"
-[ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
-# bug number for skipped test: LU-1593 LU-2610 LU-2833 LU-1957 LU-2805
- ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h 40 48a 180 184c"
+if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then
+ # bug number for skipped test: LU-4536 LU-1957 LU-2805
+ ALWAYS_EXCEPT="$ALWAYS_EXCEPT 65ic 180 184c"
+ [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b 51ba"
+fi
FAIL_ON_ERROR=false
echo "done"
}
-check_kernel_version() {
- WANT_VER=$1
- GOT_VER=$(lctl get_param -n version | awk '/kernel:/ {print $2}')
- case $GOT_VER in
- patchless|patchless_client) return 0;;
- *) [ $GOT_VER -ge $WANT_VER ] && return 0 ;;
- esac
- log "test needs at least kernel version $WANT_VER, running $GOT_VER"
- return 1
-}
-
check_swap_layouts_support()
{
$LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
return 1
}
-if [ "$ONLY" == "cleanup" ]; then
- sh llmountcleanup.sh
- exit 0
-fi
-
check_and_setup_lustre
DIR=${DIR:-$MOUNT}
# LU-4471 - failed rmdir on remote directories still removes directory on MDT0
test_4() {
local MDTIDX=1
- local remote_dir=remote_dir
- test_mkdir $DIR/$remote_dir ||
+ test_mkdir $DIR/$tdir ||
error "Create remote directory failed"
- touch $DIR/$remote_dir/$tfile ||
+ touch $DIR/$tdir/$tfile ||
error "Create file under remote directory failed"
- rmdir $DIR/$remote_dir &&
- error "Expect error removing in-use dir $DIR/$remote_dir"
+ rmdir $DIR/$tdir &&
+ error "Expect error removing in-use dir $DIR/$tdir"
- test -d $DIR/$remote_dir || error "Remote directory disappeared"
+ test -d $DIR/$tdir || error "Remote directory disappeared"
- rm -rf $DIR/$remote_dir || error "remove remote dir error"
+ rm -rf $DIR/$tdir || error "remove remote dir error"
}
run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
test_7b() {
if [ ! -d $DIR/$tdir ]; then
- mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir
fi
$MCREATE $DIR/$tdir/$tfile
echo -n foo > $DIR/$tdir/$tfile
mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
$CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
error "$tdir/${tfile_2} not a file after rename"
+ rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
}
run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
run_test 17e "symlinks: create recursive symlink (should return error) ===="
test_17f() {
- test_mkdir -p $DIR/d17f
- ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/d17f/111
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/d17f/222
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/d17f/333
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/d17f/444
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/d17f/555
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/d17f/666
- ls -l $DIR/d17f
+ test_mkdir -p $DIR/$tdir
+ ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
+ ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
+ ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
+ ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
+ ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
+ ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/$tdir/666
+ ls -l $DIR/$tdir
}
run_test 17f "symlinks: long and very long symlink name ========================"
test_17l() { # LU-279
[[ -z "$(which getfattr 2>/dev/null)" ]] &&
skip "no getfattr command" && return 0
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
touch $DIR/$tdir/$tfile
ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
local i
local rc=0
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] &&
[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.2.93) ] &&
skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- mkdir -p $WDIR
+ test_mkdir -p $WDIR
long_sym=$short_sym
# create a long symlink file
for ((i = 0; i < 4; ++i)); do
stop mds${mds_index}
do_facet mds${mds_index} $cmd || rc=$?
- start mds${mds_index} $devname $MDS_MOUNT_OPTS
+ start mds${mds_index} $devname $MDS_MOUNT_OPTS || error "start failed"
df $MOUNT > /dev/null 2>&1
[ $rc -ne 0 ] && error "e2fsck should not report error upon "\
"short/long symlink MDT: rc=$rc"
stop mds${mdt_index}
do_facet mds${mdt_index} $cmd || rc=$?
- start mds${mdt_index} $devname $MDS_MOUNT_OPTS
+ start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
+ error "mount mds${mdt_index} failed"
df $MOUNT > /dev/null 2>&1
[ $rc -ne 0 ] && break
done
test_17n() {
local i
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] &&
[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.2.93) ] &&
skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir
for ((i=0; i<10; i++)); do
$LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
error "create remote dir error $i"
check_fs_consistency_17n ||
error "e2fsck report error after create files under remote dir"
- for ((i=0;i<10;i++)); do
+ for ((i = 0; i < 10; i++)); do
rm -rf $DIR/$tdir/remote_dir_${i} ||
error "destroy remote dir error $i"
done
[ $(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
+ 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} ||
+ $LFS mv --mdt-index 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
+ for ((i = 0; i < 10; i++)); do
rm -rf $DIR/$tdir/remote_dir_${i} ||
error "destroy remote dir error $i"
done
run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
test_17o() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $(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
local rc=0
- mkdir -p $WDIR
+ test_mkdir -p $WDIR
mdt_index=$($LFS getstripe -M $WDIR)
mdt_index=$((mdt_index+1))
- mdtdevname=$(mdsdevname $mdt_index)
touch $WDIR/$tfile
- stop mds${mdt_index}
- start mds${mdt_index} $mdtdevname $MDS_MOUNT_OPTS
+
+ #fail mds will wait the failover finish then set
+ #following fail_loc to avoid interfer the recovery process.
+ fail mds${mdt_index}
#define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
do_facet mds${mdt_index} lctl set_param fail_loc=0x194
run_test 17o "stat file with incompat LMA feature"
test_18() {
- touch $DIR/f || error "Failed to touch $DIR/f: $?"
+ touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
ls $DIR || error "Failed to ls $DIR: $?"
}
run_test 18 "touch .../f ; ls ... =============================="
run_test 24n "Statting the old file after renaming (Posix rename 2)"
test_24o() {
- check_kernel_version 37 || return 0
test_mkdir -p $DIR/d24o
rename_many -s random -v -n 10 $DIR/d24o
}
run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
test_24u() { # bug12192
- rm -rf $DIR/$tfile
$MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error
$CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
}
# Performance issue on ZFS see LU-4072 (c.f. LU-2887)
[ $(facet_fstype $SINGLEMDS) = "zfs" ] && NRFILES=10000
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
createmany -m $DIR/$tdir/$tfile $NRFILES
cancel_lru_locks mdc
dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
- [ "$SZ1" = "$SZ2" ] || \
+ [[ "$SZ1" -eq "$SZ2" ]] ||
error "Error reading at the end of the file $tfile"
}
run_test 24w "Reading a file larger than 4Gb"
local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
$LFS mkdir -i $MDTIDX $remote_dir ||
error "create remote directory failed"
- mkdir -p $DIR/$tdir/src_dir
+ test_mkdir -p $DIR/$tdir/src_dir
touch $DIR/$tdir/src_file
- mkdir -p $remote_dir/tgt_dir
+ test_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 failed!"
- mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir &&
- error "rename dir cross MDT works!"
+ mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
+ error "rename file cross MDT failed!"
- mrename $DIR/$tdir/src_file $remote_dir/tgt_file &&
- error "rename file cross MDT works!"
-
- ln $DIR/$tdir/src_file $remote_dir/tgt_file1 &&
- error "ln file cross MDT should not work!"
+ touch $DIR/$tdir/ln_file
+ ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
+ error "ln file cross MDT failed"
rm -rf $DIR/$tdir || error "Can not delete directories"
}
-run_test 24x "cross rename/link should be failed"
+run_test 24x "cross MDT rename/link"
test_24y() {
[[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
$LFS mkdir -i $MDTIDX $remote_dir ||
error "create remote directory failed"
- mkdir -p $remote_dir/src_dir
+ test_mkdir -p $remote_dir/src_dir
touch $remote_dir/src_file
- mkdir -p $remote_dir/tgt_dir
+ test_mkdir -p $remote_dir/tgt_dir
touch $remote_dir/tgt_file
mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
}
run_test 24y "rename/link on the same dir should succeed"
-test_24z() {
- [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- local MDTIDX=1
- local remote_src=$DIR/$tdir/remote_dir
- local remote_tgt=$DIR/$tdir/remote_tgt
+test_24A() { # LU-3182
+ local NFILES=5000
- mkdir -p $DIR/$tdir
- $LFS mkdir -i $MDTIDX $remote_src ||
- error "create remote directory failed"
+ rm -rf $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
+ createmany -m $DIR/$tdir/$tfile $NFILES
+ local t=$(ls $DIR/$tdir | wc -l)
+ local u=$(ls $DIR/$tdir | sort -u | wc -l)
+ local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
+ if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then
+ error "Expected $NFILES files, got $t ($u unique $v .&..)"
+ fi
+
+ rm -rf $DIR/$tdir || error "Can not delete directories"
+}
+run_test 24A "readdir() returns correct number of entries."
+
+test_24B() { # LU-4805
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local count
+
+ test_mkdir $DIR/$tdir
+ $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
+ error "create striped dir failed"
- $LFS mkdir -i $MDTIDX $remote_tgt ||
- error "create remote directory failed"
+ count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
+ [ $count -eq 2 ] || error "Expected 2, got $count"
- mrename $remote_src $remote_tgt &&
- error "rename remote dirs should not work!"
+ touch $DIR/$tdir/striped_dir/a
+
+ count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
+ [ $count -eq 3 ] || error "Expected 3, got $count"
- # If target dir does not exists, it should succeed
- rm -rf $remote_tgt
- mrename $remote_src $remote_tgt ||
- error "rename remote dirs(tgt dir does not exists) failed!"
+ touch $DIR/$tdir/striped_dir/.f
+
+ count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
+ [ $count -eq 4 ] || error "Expected 4, got $count"
rm -rf $DIR/$tdir || error "Can not delete directories"
}
-run_test 24z "rename one remote dir to another remote dir should fail"
+run_test 24B "readdir for striped dir return correct number of entries"
-test_24A() { # LU-3182
- local NFILES=5000
+test_24C() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+ mkdir $DIR/$tdir/d0
+ mkdir $DIR/$tdir/d1
+
+ $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
+ error "create striped dir failed"
+
+ cd $DIR/$tdir/d0/striped_dir
+
+ local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
+ local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
+ local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
+
+ [ "$d0_ino" = "$parent_ino" ] ||
+ error ".. wrong, expect $d0_ino, get $parent_ino"
+
+ mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
+ error "mv striped dir failed"
+
+ parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
+
+ [ "$d1_ino" = "$parent_ino" ] ||
+ error ".. wrong after mv, expect $d1_ino, get $parent_ino"
+}
+run_test 24C "check .. in striped dir"
+
+test_24D() { # LU-6101
+ local NFILES=50000
rm -rf $DIR/$tdir
mkdir -p $DIR/$tdir
createmany -m $DIR/$tdir/$tfile $NFILES
- local t=`ls $DIR/$tdir | wc -l`
- local u=`ls $DIR/$tdir | sort -u | wc -l`
- if [ $t -ne $NFILES -o $u -ne $NFILES ] ; then
- error "Expected $NFILES files, got $t ($u unique)"
+ local t=$(ls $DIR/$tdir | wc -l)
+ local u=$(ls $DIR/$tdir | sort -u | wc -l)
+ local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
+ if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then
+ error "Expected $NFILES files, got $t ($u unique $v .&..)"
fi
rm -rf $DIR/$tdir || error "Can not delete directories"
}
-run_test 24A "readdir() returns correct number of entries."
+run_test 24D "readdir() returns correct number of entries after cursor reload"
+
+test_24E() {
+ [[ $MDSCOUNT -lt 4 ]] && skip "needs >= 4 MDTs" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+
+ mkdir -p $DIR/$tdir
+ mkdir $DIR/$tdir/src_dir
+ $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
+ error "create remote source failed"
+
+ touch $DIR/$tdir/src_dir/src_child/a
+
+ $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
+ error "create remote target dir failed"
+
+ $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
+ error "create remote target child failed"
+
+ mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
+ error "rename dir cross MDT failed!"
+
+ find $DIR/$tdir
+
+ $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
+ error "src_child still exists after rename"
+
+ $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
+ error "missing file(a) after rename"
+
+ rm -rf $DIR/$tdir || error "Can not delete directories"
+}
+run_test 24E "cross MDT rename/link"
test_25a() {
echo '== symlink sanity ============================================='
run_test 27e "setstripe existing file (should return error) ======"
test_27f() {
- test_mkdir -p $DIR/d27
- $SETSTRIPE -S 100 -i 0 -c 1 $DIR/d27/fbad && error "setstripe failed"
- dd if=/dev/zero of=$DIR/d27/fbad bs=4k count=4 || error "dd failed"
- $GETSTRIPE $DIR/d27/fbad || error "$GETSTRIPE failed"
+ test_mkdir $DIR/$tdir
+ $SETSTRIPE -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
+ error "$SETSTRIPE $DIR/$tdir/$tfile failed"
+ $CHECKSTAT -t file $DIR/$tdir/$tfile &&
+ error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
+ $GETSTRIPE $DIR/$tdir/$tfile || error "$GETSTRIPE failed"
}
run_test 27f "setstripe with bad stripe size (should return error)"
run_test 27g "$GETSTRIPE with no objects"
test_27i() {
- touch $DIR/d27/fsome || error "touch failed"
- [[ $($GETSTRIPE -c $DIR/d27/fsome) -gt 0 ]] || error "missing objects"
+ test_mkdir $DIR/$tdir
+ touch $DIR/$tdir/$tfile || error "touch failed"
+ [[ $($GETSTRIPE -c $DIR/$tdir/$tfile) -gt 0 ]] ||
+ error "missing objects"
}
run_test 27i "$GETSTRIPE with some objects"
local OSTIDX=$1
local FAILLOC=$2
local FAILIDX=${3:-$OSTIDX}
+ local ofacet=ost$((OSTIDX + 1))
- test_mkdir -p $DIR/$tdir
- local MDSIDX=$(get_mds_dir "$DIR/$tdir")
- echo OSTIDX=$OSTIDX MDSIDX=$MDSIDX
+ test_mkdir -p -c1 $DIR/$tdir
+ local mdtidx=$($LFS getstripe -M $DIR/$tdir)
+ local mfacet=mds$((mdtidx + 1))
+ echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
local OST=$(ostname_from_index $OSTIDX)
- local MDT_INDEX=$(lfs df | grep "\[MDT:$((MDSIDX - 1))\]" | awk '{print $1}' | \
- sed -e 's/_UUID$//;s/^.*-//')
# 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 \
+ local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST)
+ local last_id=$(do_facet $mfacet lctl get_param -n \
osc.$mdtosc_proc1.prealloc_last_id)
- local next_id=$(do_facet mds${MDSIDX} lctl get_param -n \
+ local next_id=$(do_facet $mfacet lctl get_param -n \
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 mdtosc_proc2=$(get_mdtosc_proc_path $mfacet)
+ do_facet $mfacet lctl get_param osc.$mdtosc_proc2.prealloc*
test_mkdir -p $DIR/$tdir/${OST}
$SETSTRIPE -i $OSTIDX -c 1 $DIR/$tdir/${OST}
#define OBD_FAIL_OST_ENOSPC 0x215
- do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=$FAILIDX
- do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x215
+ do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215
echo "Creating to objid $last_id on ost $OST..."
createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
- do_facet mds${MDSIDX} lctl get_param osc.$mdtosc_proc2.prealloc*
- do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=$FAILLOC
+ do_facet $mfacet lctl get_param osc.$mdtosc_proc2.prealloc*
+ do_facet $ofacet lctl set_param fail_loc=$FAILLOC
sleep_maxage
}
done
OSTIDX=$(index_from_ostuuid $OST)
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
$SETSTRIPE -c 1 $DIR/$tdir # 1 stripe / file
for OSC in $MDS_OSCS; do
}
run_test 27C "check full striping across all OSTs"
+test_27D() {
+ [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+ local POOL=${POOL:-testpool}
+ local first_ost=0
+ local last_ost=$(($OSTCOUNT - 1))
+ local ost_step=1
+ local ost_list=$(seq $first_ost $ost_step $last_ost)
+ local ost_range="$first_ost $last_ost $ost_step"
+
+ test_mkdir -p $DIR/$tdir
+ pool_add $POOL || error "pool_add failed"
+ pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
+ llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT ||
+ error "llapi_layout_test failed"
+ cleanup_pools || error "cleanup_pools failed"
+}
+run_test 27D "validate llapi_layout API"
+
+# Verify that default_easize is increased from its initial value after
+# accessing a widely striped file.
+test_27E() {
+ [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+
+ # 72 bytes is the minimum space required to store striping
+ # information for a file striped across one OST:
+ # (sizeof(struct lov_user_md_v3) +
+ # sizeof(struct lov_user_ost_data_v1))
+ local min_easize=72
+ $LCTL set_param -n llite.*.default_easize $min_easize ||
+ error "lctl set_param failed"
+ local easize=$($LCTL get_param -n llite.*.default_easize)
+
+ [ $easize -eq $min_easize ] ||
+ error "failed to set default_easize"
+
+ $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
+ error "setstripe failed"
+ cat $DIR/$tfile
+ rm $DIR/$tfile
+
+ easize=$($LCTL get_param -n llite.*.default_easize)
+
+ [ $easize -gt $min_easize ] ||
+ error "default_easize not updated"
+}
+run_test 27E "check that default extended attribute size properly increases"
+
# createtest also checks that device nodes are created and
# then visible correctly (#2091)
test_28() { # bug 2091
run_test 31d "remove of open directory ========================="
test_31e() { # bug 2904
- check_kernel_version 34 || return 0
openfilleddirunlink $DIR/d31e || error
}
run_test 31e "remove of open non-empty directory ==============="
}
test_31o() { # LU-2901
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
for LOOP in $(seq 100); do
rm -f $DIR/$tdir/$tfile*
for THREAD in $(seq 8); do
test_31p() {
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
- mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir
$LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
$LFS setdirstripe -D -c2 -t all_char $DIR/$tdir/striped_dir
run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
test_32o() {
- rm -fr $DIR/d32o $DIR/$tfile
touch $DIR/$tfile
test_mkdir -p $DIR/d32o/tmp
TMP_DIR=$DIR/d32o/tmp
rm -fr $DIR/d33
test_mkdir -p $DIR/d33
chown $RUNAS_ID $DIR/d33
- $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 && error "create" || true
+ $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 || true
}
-run_test 33b "test open file with malformed flags (No panic and return error)"
+run_test 33b "test open file with malformed flags (No panic)"
test_33c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
$LFS mkdir -i $MDTIDX $remote_dir ||
error "create remote directory failed"
}
run_test 33d "openfile with 444 modes and malformed flags under remote dir"
+test_33e() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+
+ $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
+ $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
+ mkdir $DIR/$tdir/local_dir
+
+ local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
+ local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
+ local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
+
+ [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
+ error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
+
+ rmdir $DIR/$tdir/* || error "rmdir failed"
+
+ umask 777
+ $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
+ $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
+ mkdir $DIR/$tdir/local_dir
+
+ s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
+ s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
+ l_mode=$(stat -c%f $DIR/$tdir/local_dir)
+
+ [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
+ error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
+
+ rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
+
+ umask 000
+ $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
+ $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
+ mkdir $DIR/$tdir/local_dir
+
+ s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
+ s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
+ l_mode=$(stat -c%f $DIR/$tdir/local_dir)
+
+ [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
+ error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
+}
+run_test 33e "mkdir and striped directory should have same mode"
+
+cleanup_33f() {
+ trap 0
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
+}
+
+test_33f() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+ chmod go+rwx $DIR/$tdir
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
+ trap cleanup_33f EXIT
+
+ $RUNAS lfs mkdir -c$MDSCOUNT $DIR/$tdir/striped_dir ||
+ error "cannot create striped directory"
+
+ $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
+ error "cannot create files in striped directory"
+
+ $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
+ error "cannot remove files in striped directory"
+
+ $RUNAS rmdir $DIR/$tdir/striped_dir ||
+ error "cannot remove striped directory"
+
+ cleanup_33f
+}
+run_test 33f "nonroot user can create, access, and remove a striped directory"
+
TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
test_34a() {
rm -f $DIR/f34
test_36i() {
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
- mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir
$LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
test_39o() {
TESTDIR=$DIR/$tdir/$tfile
[ -e $TESTDIR ] && rm -rf $TESTDIR
- test_mkdir -p $TESTDIR
+ mkdir -p $TESTDIR
cd $TESTDIR
links1=2
ls
local MDTIDX=1
TESTDIR=$DIR/$tdir/$tfile
[ -e $TESTDIR ] && rm -rf $TESTDIR
- mkdir -p $TESTDIR
+ test_mkdir -p $TESTDIR
cd $TESTDIR
links1=2
ls
# test_47 is removed "Device nodes check" is moved to test_28
test_48a() { # bug 2399
- check_kernel_version 34 || return 0
- test_mkdir -p $DIR/$tdir
+ [ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.63) ] &&
+ skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly" &&
+ return
+ test_mkdir $DIR/$tdir
cd $DIR/$tdir
- mv $DIR/$tdir $DIR/d48.new || error "move directory failed"
+ mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
test_mkdir $DIR/$tdir || error "recreate directory failed"
touch foo || error "'touch foo' failed after recreating cwd"
- test_mkdir $DIR/$tdir/bar ||
- error "'mkdir foo' failed after recreating cwd"
- if check_kernel_version 44; then
- touch .foo || error "'touch .foo' failed after recreating cwd"
- test_mkdir $DIR/$tdir/.bar ||
- error "'mkdir .foo' failed after recreating cwd"
- fi
+ test_mkdir bar || error "'mkdir foo' failed after recreating cwd"
+ touch .foo || error "'touch .foo' failed after recreating cwd"
+ test_mkdir .bar || error "'mkdir .foo' failed after recreating cwd"
ls . > /dev/null || error "'ls .' failed after recreating cwd"
ls .. > /dev/null || error "'ls ..' failed after removing cwd"
cd . || error "'cd .' failed after recreating cwd"
run_test 48a "Access renamed working dir (should return errors)="
test_48b() { # bug 2399
- check_kernel_version 34 || return 0
rm -rf $DIR/$tdir
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
cd $DIR/$tdir
rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
touch foo && error "'touch foo' worked after removing cwd"
- test_mkdir $DIR/$tdir/foo &&
- error "'mkdir foo' worked after removing cwd"
- if check_kernel_version 44; then
- touch .foo && error "'touch .foo' worked after removing cwd"
- test_mkdir $DIR/$tdir/.foo &&
- error "'mkdir .foo' worked after removing cwd"
- fi
+ test_mkdir foo && error "'mkdir foo' worked after removing cwd"
+ touch .foo && error "'touch .foo' worked after removing cwd"
+ test_mkdir .foo && error "'mkdir .foo' worked after removing cwd"
ls . > /dev/null && error "'ls .' worked after removing cwd"
ls .. > /dev/null || error "'ls ..' failed after removing cwd"
is_patchless || ( cd . && error "'cd .' worked after removing cwd" )
- test_mkdir $DIR/$tdir/. && error "'mkdir .' worked after removing cwd"
+ test_mkdir . && error "'mkdir .' worked after removing cwd"
rmdir . && error "'rmdir .' worked after removing cwd"
ln -s . foo && error "'ln -s .' worked after removing cwd"
cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
run_test 48b "Access removed working dir (should return errors)="
test_48c() { # bug 2350
- check_kernel_version 36 || return 0
#lctl set_param debug=-1
#set -vx
rm -rf $DIR/$tdir
$TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
$TRACE touch foo && error "touch foo worked after removing cwd"
$TRACE test_mkdir foo && error "'mkdir foo' worked after removing cwd"
- if check_kernel_version 44; then
- touch .foo && error "touch .foo worked after removing cwd"
- test_mkdir .foo && error "mkdir .foo worked after removing cwd"
- fi
+ touch .foo && error "touch .foo worked after removing cwd"
+ test_mkdir .foo && error "mkdir .foo worked after removing cwd"
$TRACE ls . && error "'ls .' worked after removing cwd"
$TRACE ls .. || error "'ls ..' failed after removing cwd"
is_patchless || ( $TRACE cd . &&
run_test 48c "Access removed working subdir (should return errors)"
test_48d() { # bug 2350
- check_kernel_version 36 || return 0
#lctl set_param debug=-1
#set -vx
rm -rf $DIR/$tdir
$TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
$TRACE touch foo && error "'touch foo' worked after removing parent"
$TRACE test_mkdir foo && error "mkdir foo worked after removing parent"
- if check_kernel_version 44; then
- touch .foo && error "'touch .foo' worked after removing parent"
- test_mkdir .foo &&
- error "mkdir .foo worked after removing parent"
- fi
+ touch .foo && error "'touch .foo' worked after removing parent"
+ test_mkdir .foo && error "mkdir .foo worked after removing parent"
$TRACE ls . && error "'ls .' worked after removing parent"
$TRACE ls .. && error "'ls ..' worked after removing parent"
is_patchless || ( $TRACE cd . &&
run_test 48d "Access removed parent subdir (should return errors)"
test_48e() { # bug 4134
- check_kernel_version 41 || return 0
#lctl set_param debug=-1
#set -vx
rm -rf $DIR/$tdir
test_mkdir -p -c1 $BASE
+ $LFS df
+ $LFS df -i
local mdtidx=$(printf "%04x" $($LFS getstripe -M $BASE))
local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
- [[ $numfree -lt 21000 ]] && skip "not enough free inodes ($numfree)" &&
+ [[ $numfree -lt 21000 ]] &&
+ skip "not enough free inodes ($numfree) on MDT$mdtidx" &&
return
[[ $numfree -lt $NUMTEST ]] && NUMTEST=$(($numfree - 50)) &&
- echo "reduced count to $NUMTEST due to inodes"
+ echo "reduced count to $NUMTEST due to inodes on MDT$mdtidx"
# need to check free space for the directories as well
local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
numfree=$((blkfree / 4))
- [[ $numfree -lt $NUMTEST ]] && NUMTEST=$(($numfree - 50)) &&
- echo "reduced count to $NUMTEST due to blocks"
+ [[ $numfree -lt $NUMTEST ]] && NUMTEST=$((numfree - 50)) &&
+ echo "reduced count to $NUMTEST due to blocks on MDT$mdtidx"
createmany -d $BASE/d $NUMTEST && echo $NUMTEST > $BASE/fnum ||
+ {
+ $LFS df
+ $LFS df -i
echo "failed" > $BASE/fnum
+ error "failed to create $NUMTEST subdirs in MDT$mdtidx:$BASE"
+ }
}
run_test 51b "exceed 64k subdirectory nlink limit"
}
run_test 51d "check object distribution ===================="
+test_51e() {
+ if [ "$(facet_fstype $SINGLEMDS)" != ldiskfs ]; then
+ skip "Only applicable to ldiskfs-based MDTs"
+ return
+ fi
+
+ test_mkdir -c1 $DIR/$tdir || error "create $tdir failed"
+ test_mkdir -c1 $DIR/$tdir/d0 || error "create d0 failed"
+
+ touch $DIR/$tdir/d0/foo
+ createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
+ error "file exceed 65000 nlink limit!"
+ unlinkmany $DIR/$tdir/d0/f- 65001
+ return 0
+}
+run_test 51e "check file nlink limit"
+
test_52a() {
[ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
test_mkdir -p $DIR/$tdir
loopdev="$DIR/loop54c"
trap 0
- $UMOUNT -d $tdir || rc=$?
+ $UMOUNT -d $DIR/$tdir || rc=$?
losetup -d $loopdev || true
- rm $loopdev
+ losetup -d $LOOPDEV || true
+ rm -rf $loopdev $DIR/$tfile $DIR/$tdir
return $rc
}
test_54c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- tfile="$DIR/f54c"
- tdir="$DIR/d54c"
loopdev="$DIR/loop54c"
find_loop_dev
[ -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=$(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
+ mknod $loopdev b 7 $LOOPNUM
+ echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
+ dd if=/dev/zero of=$DIR/$tfile bs=$(get_page_size client) seek=1024 count=1 > /dev/null
+ losetup $loopdev $DIR/$tfile ||
+ error "can't set up $loopdev for $DIR/$tfile"
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"
+ test_mkdir -p $DIR/$tdir
+ mount -t ext2 $loopdev $DIR/$tdir ||
+ error "error mounting $loopdev on $DIR/$tdir"
+ dd if=/dev/zero of=$DIR/$tdir/tmp bs=$(get_page_size client) count=30 ||
+ error "dd write"
+ df $DIR/$tdir
+ dd if=$DIR/$tdir/tmp of=/dev/zero bs=$(get_page_size client) count=30 ||
+ error "dd read"
cleanup_54c
}
run_test 54c "block device works in lustre ====================="
run_test 54d "fifo device works in lustre ======================"
test_54e() {
- check_kernel_version 46 || return 0
f="$DIR/f54e"
string="aaaaaa"
cp -aL /dev/console $f
EXPECTED=$(((NUMDIRS + 1) * NUMFILES))
CMD="$LFIND -stripe-count $OSTCOUNT -type f $TDIR"
NUMS=$($CMD | wc -l)
- [ $NUMS -eq $EXPECTED ] ||
+ [ $NUMS -eq $EXPECTED ] || {
+ $GETSTRIPE -R $TDIR
error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
+ }
EXPECTED=$(((NUMDIRS + 1) * NUMFILES + EXTRA))
CMD="$LFIND -stripe-count +0 -type f $TDIR"
NUMS=$($CMD | wc -l)
- [ $NUMS -eq $EXPECTED ] ||
+ [ $NUMS -eq $EXPECTED ] || {
+ $GETSTRIPE -R $TDIR
error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
+ }
EXPECTED=$ONESTRIPE
CMD="$LFIND -stripe-count 1 -type f $TDIR"
NUMS=$($CMD | wc -l)
- [ $NUMS -eq $EXPECTED ] ||
+ [ $NUMS -eq $EXPECTED ] || {
+ $GETSTRIPE -R $TDIR
error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
+ }
CMD="$LFIND -stripe-count -2 -type f $TDIR"
NUMS=$($CMD | wc -l)
- [ $NUMS -eq $EXPECTED ] ||
+ [ $NUMS -eq $EXPECTED ] || {
+ $GETSTRIPE -R $TDIR
error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
+ }
EXPECTED=0
CMD="$LFIND -stripe-count $((OSTCOUNT + 1)) -type f $TDIR"
NUMS=$($CMD | wc -l)
- [ $NUMS -eq $EXPECTED ] ||
+ [ $NUMS -eq $EXPECTED ] || {
+ $GETSTRIPE -R $TDIR
error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
+ }
}
run_test 56s "check lfs find -stripe-count works"
}
run_test 56v "check 'lfs find -mdt match with lfs getstripe -M' ======="
-# Get and check the actual stripe count of one file.
-# Usage: check_stripe_count <file> <expected_stripe_count>
-check_stripe_count() {
- local file=$1
- local expected=$2
- local actual
-
- [[ -z "$file" || -z "$expected" ]] &&
- error "check_stripe_count: invalid argument!"
-
- local cmd="$GETSTRIPE -c $file"
- actual=$($cmd) || error "$cmd failed"
- actual=${actual%% *}
-
- if [[ $actual -ne $expected ]]; then
- [[ $expected -eq -1 ]] ||
- error "$cmd wrong: found $actual, expected $expected"
- [[ $actual -eq $OSTCOUNT ]] ||
- error "$cmd wrong: found $actual, expected $OSTCOUNT"
- fi
-}
-
test_56w() {
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" &&
+ return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
TDIR=$DIR/${tdir}w
check_stripe_count $TDIR/file1 $expected
+ if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.90) ];
+ then
+ # lfs_migrate file onto OST 0 if it is on OST 1, or onto
+ # OST 1 if it is on OST 0. This file is small enough to
+ # be on only one stripe.
+ file=$TDIR/migr_1_ost
+ dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
+ error "write data into $file failed"
+ local obdidx=$($LFS getstripe -i $file)
+ local oldmd5=$(md5sum $file)
+ local newobdidx=0
+ [[ $obdidx -eq 0 ]] && newobdidx=1
+ cmd="$LFS migrate -i $newobdidx $file"
+ echo $cmd
+ eval $cmd || error "$cmd failed"
+ local realobdix=$($LFS getstripe -i $file)
+ local newmd5=$(md5sum $file)
+ [[ $newobdidx -ne $realobdix ]] &&
+ error "new OST is different (was=$obdidx, wanted=$newobdidx, got=$realobdix)"
+ [[ "$oldmd5" != "$newmd5" ]] &&
+ error "md5sum differ: $oldmd5, $newmd5"
+ fi
+
# lfs_migrate dir
cmd="$LFS_MIGRATE -y -c $expected $TDIR/dir1"
echo "$cmd"
skip_env "need 2 OST, skipping test" && return
local dir0=$DIR/$tdir/$testnum
- mkdir -p $dir0 || error "creating dir $dir0"
+ test_mkdir -p $dir0 || error "creating dir $dir0"
local ref1=/etc/passwd
local file1=$dir0/file1
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=""
+ skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53" &&
+ return
+ local res=""
local dir0=$DIR/$tdir/$testnum
- mkdir -p $dir0 || error "creating dir $dir0"
+ test_mkdir -p $dir0 || error "creating dir $dir0"
local f1=$dir0/file1
local f2=$dir0/file2
}
run_test 56y "lfs find -L raid0|released"
+test_56z() { # LU-4824
+ # This checks to make sure 'lfs find' continues after errors
+ # There are two classes of errors that should be caught:
+ # - If multiple paths are provided, all should be searched even if one
+ # errors out
+ # - If errors are encountered during the search, it should not terminate
+ # early
+ local i
+ test_mkdir $DIR/$tdir
+ for i in d{0..9}; do
+ test_mkdir $DIR/$tdir/$i
+ done
+ touch $DIR/$tdir/d{0..9}/$tfile
+ $LFS find $DIR/non_existent_dir $DIR/$tdir &&
+ error "$LFS find did not return an error"
+ # Make a directory unsearchable. This should NOT be the last entry in
+ # directory order. Arbitrarily pick the 6th entry
+ chmod 700 $($LFS find $DIR/$tdir -type d | sed '6!d')
+ local count=$($RUNAS $LFS find $DIR/non_existent $DIR/$tdir | wc -l)
+ # The user should be able to see 10 directories and 9 files
+ [ $count == 19 ] || error "$LFS find did not continue after error"
+}
+run_test 56z "lfs find should continue after an error"
+
+test_56aa() { # LU-5937
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+ $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
+
+ createmany -o $DIR/$tdir/striped_dir/${tfile}- 1024
+ local dirs=$(lfs find --size +8k $DIR/$tdir/)
+
+ [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
+}
+run_test 56aa "lfs find --size under striped dir"
+
test_57a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# note test will not do anything if MDS is not local
fi
remote_mds_nodsh && skip "remote MDS with nodsh" && return
- local dir=$DIR/d57b
+ local dir=$DIR/$tdir
local FILECOUNT=100
local FILE1=$dir/f1
local FILEN=$dir/f$FILECOUNT
rm -rf $dir || error "removing $dir"
- test_mkdir -p $dir || error "creating $dir"
- local num=$(get_mds_dir $dir)
- local mymds=mds$num
+ test_mkdir -p -c1 $dir || error "creating $dir"
+ local mdtidx=$($LFS getstripe -M $dir)
+ local mdtname=MDT$(printf %04x $mdtidx)
+ local facet=mds$((mdtidx + 1))
echo "mcreating $FILECOUNT files"
createmany -m $dir/f 1 $FILECOUNT || \
sync
sleep 1
df $dir #make sure we get new statfs data
- local MDSFREE=$(do_facet $mymds \
- lctl get_param -n osd*.*MDT000$((num -1)).kbytesfree)
- local MDCFREE=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree)
+ local MDSFREE=$(do_facet $facet \
+ lctl get_param -n osd*.*$mdtname.kbytesfree)
+ local MDCFREE=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
echo "opening files to create objects/EAs"
local FILE
for FILE in `seq -f $dir/f%g 1 $FILECOUNT`; do
sleep 1 #make sure we get new statfs data
df $dir
- local MDSFREE2=$(do_facet $mymds \
- lctl get_param -n osd*.*MDT000$((num -1)).kbytesfree)
- local MDCFREE2=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree)
+ local MDSFREE2=$(do_facet $facet \
+ lctl get_param -n osd*.*$mdtname.kbytesfree)
+ local MDCFREE2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
if [[ $MDCFREE2 -lt $((MDCFREE - 16)) ]]; then
if [ "$MDSFREE" != "$MDSFREE2" ]; then
error "MDC before $MDCFREE != after $MDCFREE2"
dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
rm $DIR/$tfile
+ sync # sync lest earlier test intercept the fail_loc
+
#define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
lctl set_param fail_loc=0x80000406
$MULTIOP $DIR/$tfile Owy && \
run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
test_71() {
- test_mkdir -p $DIR/$tdir
- sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
+ test_mkdir -p $DIR/$tdir
+ $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
+ sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
}
run_test 71 "Running dbench on lustre (don't segment fault) ===="
skip_env "User $RUNAS_ID does not exist - skipping"
return 0
}
- # We had better clear the $DIR to get enough space for dd
- rm -rf $DIR/*
touch $DIR/$tfile
chmod 777 $DIR/$tfile
chmod ug+s $DIR/$tfile
[[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
[[ $F78SIZE -gt 512 ]] && F78SIZE=512
[[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
- SMALLESTOST=$(lfs df $DIR | grep OST | awk '{ print $4 }' | sort -n |
+ SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
head -n1)
echo "Smallest OST: $SMALLESTOST"
[[ $SMALLESTOST -lt 10240 ]] &&
run_test 79 "df report consistency check ======================="
test_80() { # bug 10718
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# relax strong synchronous semantics for slow backends like ZFS
local soc="obdfilter.*.sync_on_lock_cancel"
}
test_102a() {
- local testfile=$DIR/xattr_testfile
+ local testfile=$DIR/$tfile
touch $testfile
for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
local size=$((STRIPE_SIZE * num))
local file=file"$num-$offset-$count"
- stripe_size=$(lfs getstripe -S $PWD/$file)
+ stripe_size=$($LFS getstripe -S $PWD/$file)
[[ $stripe_size -ne $size ]] &&
error "$file: size $stripe_size != $size"
- stripe_count=$(lfs getstripe -c $PWD/$file)
+ stripe_count=$($LFS getstripe -c $PWD/$file)
# allow fewer stripes to be created, ORI-601
[[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
error "$file: count $stripe_count != $count"
- stripe_index=$(lfs getstripe -i $PWD/$file)
+ stripe_index=$($LFS getstripe -i $PWD/$file)
[[ $stripe_index -ne 0 ]] &&
stripe_index_all_zero=false
done
setfattr --remove=$trusted.$name $file1 2> /dev/null
done
+ if [ $(lustre_version_code $SINGLEMDS) -gt $(version_code 2.6.50) ]
+ then
+ name="lfsck_ns"
+ # 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
+ fi
+
# Get 'after' xattrs of file1.
getfattr --absolute-names --dump --match=- $file1 > $xattr1
}
run_test 102p "check setxattr(2) correctly fails without permission"
+test_102q() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.92) ] &&
+ skip "MDS needs to be at least 2.6.92" && return
+ orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
+}
+run_test 102q "flistxattr should not return trusted.link EAs for orphans"
+
+test_102r() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.93) ] &&
+ skip "MDS needs to be at least 2.6.93" && return
+ touch $DIR/$tfile || error "touch"
+ setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
+ getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
+ rm $DIR/$tfile || error "rm"
+
+ #normal directory
+ mkdir -p $DIR/$tdir || error "mkdir"
+ setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
+ getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
+ setfattr -x user.$(basename $tdir) $DIR/$tdir ||
+ error "$testfile error deleting user.author1"
+ getfattr -d -m user.$(basename $tdir) 2> /dev/null |
+ grep "user.$(basename $tdir)" &&
+ error "$tdir did not delete user.$(basename $tdir)"
+ rmdir $DIR/$tdir || error "rmdir"
+
+ #striped directory
+ test_mkdir -p $DIR/$tdir || error "make striped dir"
+ setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
+ getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
+ setfattr -x user.$(basename $tdir) $DIR/$tdir ||
+ error "$testfile error deleting user.author1"
+ getfattr -d -m user.$(basename $tdir) 2> /dev/null |
+ grep "user.$(basename $tdir)" &&
+ error "$tdir did not delete user.$(basename $tdir)"
+ rmdir $DIR/$tdir || error "rm striped dir"
+}
+run_test 102r "set EAs with empty values"
+
run_acl_subtest()
{
$LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
return $?
}
-test_103 () {
+test_103a() {
[ "$UID" != 0 ] && skip_env "must run as root" && return
[ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
skip "must have acl enabled" && return
skip_env "could not find setfacl" && return
$GSS && skip "could not run under gss" && return
+ gpasswd -a daemon bin # LU-5641
+ do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
+
declare -a identity_old
for num in $(seq $MDSCOUNT); do
fi
done
}
-run_test 103 "acl test ========================================="
+run_test 103a "acl test ========================================="
-test_104a() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- touch $DIR/$tfile
- lfs df || error "lfs df failed"
- lfs df -ih || error "lfs df -ih failed"
- lfs df -h $DIR || error "lfs df -h $DIR failed"
- lfs df -i $DIR || error "lfs df -i $DIR failed"
- lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
- lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
+test_103b() {
+ local noacl=false
+ local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
+ local mountopts=$MDS_MOUNT_OPTS
- local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
- lctl --device %$OSC deactivate
- lfs df || error "lfs df with deactivated OSC failed"
+ if [[ "$MDS_MOUNT_OPTS" =~ "noacl" ]]; then
+ noacl=true
+ else
+ # stop the MDT
+ stop $SINGLEMDS || error "failed to stop MDT."
+ # remount the MDT
+ if [ -z "$MDS_MOUNT_OPTS" ]; then
+ MDS_MOUNT_OPTS="-o noacl"
+ else
+ MDS_MOUNT_OPTS="${MDS_MOUNT_OPTS},noacl"
+ fi
+ start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS ||
+ error "failed to start MDT."
+ MDS_MOUNT_OPTS=$mountopts
+ fi
+
+ touch $DIR/$tfile
+ setfacl -m u:bin:rw $DIR/$tfile && error "setfacl should fail"
+
+ if ! $noacl; then
+ # stop the MDT
+ stop $SINGLEMDS || error "failed to stop MDT."
+ # remount the MDT
+ start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS ||
+ error "failed to start MDT."
+ fi
+
+ true
+}
+run_test 103b "MDS mount option 'noacl'"
+
+test_103c() {
+ mkdir -p $DIR/$tdir
+ cp -rp $DIR/$tdir $DIR/$tdir.bak
+
+ [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
+ error "$DIR/$tdir shouldn't contain default ACL"
+ [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
+ error "$DIR/$tdir.bak shouldn't contain default ACL"
+ true
+}
+run_test 103c "'cp -rp' won't set empty acl"
+
+test_104a() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ touch $DIR/$tfile
+ lfs df || error "lfs df failed"
+ lfs df -ih || error "lfs df -ih failed"
+ lfs df -h $DIR || error "lfs df -h $DIR failed"
+ lfs df -i $DIR || error "lfs df -i $DIR failed"
+ lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
+ lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
+
+ local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
+ lctl --device %$OSC deactivate
+ lfs df || error "lfs df with deactivated OSC failed"
lctl --device %$OSC activate
# wait the osc back to normal
wait_osc_import_state client ost FULL
test_116b() { # LU-2093
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ -z "$($LCTL get_param -n lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr |
- head -1 2>/dev/null)" ] && skip "no QOS" && return
#define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
- local old_rr
- old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
- lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
+ local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
+ lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
+ [ -z "$old_rr" ] && skip "no QOS" && return 0
do_facet $SINGLEMDS lctl set_param \
lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
mkdir -p $DIR/$tdir
local MAX_HRS=10
local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
log "LIMIT=$LIMIT"
+ if [ $LIMIT -lt $LRU_SIZE ]; then
+ skip "Limit is too small $LIMIT"
+ return 0
+ fi
# Make LVF so higher that sleeping for $SLEEP is enough to _start_
# killing locks. Some time was spent for creating locks. This means
}
run_test 124b "lru resize (performance test) ======================="
+test_124c() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ -z "$($LCTL get_param -n mdc.*.connect_flags | grep lru_resize)" ] &&
+ skip "no lru resize on server" && return 0
+
+ # cache ununsed locks on client
+ local nr=100
+ cancel_lru_locks mdc
+ test_mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+ createmany -o $DIR/$tdir/f $nr ||
+ error "failed to create $nr files in $DIR/$tdir"
+ ls -l $DIR/$tdir > /dev/null
+
+ local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
+ local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
+ local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
+ local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
+ echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
+
+ # set lru_max_age to 1 sec
+ $LCTL set_param $nsdir.lru_max_age=1000 # jiffies
+ echo "sleep $((recalc_p * 2)) seconds..."
+ sleep $((recalc_p * 2))
+
+ local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
+ # restore lru_max_age
+ $LCTL set_param -n $nsdir.lru_max_age $max_age
+ [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
+ unlinkmany $DIR/$tdir/f $nr
+}
+run_test 124c "LRUR cancel very aged locks"
+
test_125() { # 13358
[ -z "$(lctl get_param -n llite.*.client_type | grep local)" ] && skip "must run as local client" && return
[ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] && skip "must have acl enabled" && return
}
run_test 131e "test read hitting hole"
-get_ost_param() {
- local token=$1
- local gl_sum=0
- for node in $(osts_nodes); do
- gl=$(do_node $node "$LCTL get_param -n ost.OSS.ost.stats" | awk '/'$token'/ {print $2}' | head -n 1)
- [ x$gl = x"" ] && gl=0
- gl_sum=$((gl_sum + gl))
- done
- echo $gl_sum
-}
-
-som_mode_switch() {
- local som=$1
- local gl1=$2
- local gl2=$3
-
- if [ x$som = x"enabled" ]; then
- [ $((gl2 - gl1)) -gt 0 ] && error "no glimpse RPC is expected"
- MOUNTOPT=`echo $MOUNTOPT | sed 's/som_preview//g'`
- do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=disabled"
- else
- [ $((gl2 - gl1)) -gt 0 ] || error "some glimpse RPC is expected"
- MOUNTOPT="$MOUNTOPT,som_preview"
- do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=enabled"
- fi
-
- # do remount to make new mount-conf parameters actual
- echo remounting...
- sync
- stopall
- setupall
-}
-
-test_132() { #1028, SOM
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- remote_mds_nodsh && skip "remote MDS with nodsh" && return
- local num=$(get_mds_dir $DIR)
- local mymds=mds${num}
- local MOUNTOPT_SAVE=$MOUNTOPT
-
- dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null
- cancel_lru_locks osc
-
- som1=$(do_facet $mymds "$LCTL get_param mdt.*.som" | awk -F= ' {print $2}' | head -n 1)
-
- gl1=$(get_ost_param "ldlm_glimpse_enqueue")
- stat $DIR/$tfile >/dev/null
- gl2=$(get_ost_param "ldlm_glimpse_enqueue")
- echo "====> SOM is "$som1", "$((gl2 - gl1))" glimpse RPC occured"
- rm $DIR/$tfile
- som_mode_switch $som1 $gl1 $gl2
-
- dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null
- cancel_lru_locks osc
-
- som2=$(do_facet $mymds "$LCTL get_param mdt.*.som" | awk -F= ' {print $2}' | head -n 1)
- if [ $som1 == $som2 ]; then
- error "som is still "$som2
- if [ x$som2 = x"enabled" ]; then
- som2="disabled"
- else
- som2="enabled"
- fi
- fi
-
- gl1=$(get_ost_param "ldlm_glimpse_enqueue")
- stat $DIR/$tfile >/dev/null
- gl2=$(get_ost_param "ldlm_glimpse_enqueue")
- echo "====> SOM is "$som2", "$((gl2 - gl1))" glimpse RPC occured"
- som_mode_switch $som2 $gl1 $gl2
- MOUNTOPT=$MOUNTOPT_SAVE
-}
-run_test 132 "som avoids glimpse rpc"
-
check_stats() {
local res
local count
run_test 133d "Verifying rename_stats ========================================"
test_133e() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local testdir=$DIR/${tdir}/stats_testdir
local ctr f0 f1 bs=32768 count=42 sum
- remote_ost_nodsh && skip "remote OST with nodsh" && return
mkdir -p ${testdir} || error "mkdir failed"
$SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
test_133f() {
- local proc_dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/"
+ local proc_dirs
+
+ local dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/ \
+/sys/fs/lustre/ /sys/fs/lnet/"
+ local dir
+ for dir in $dirs; do
+ if [ -d $dir ]; then
+ proc_dirs="$proc_dirs $dir"
+ fi
+ done
+
local facet
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
# First without trusting modes.
find $proc_dirs -exec cat '{}' \; &> /dev/null
run_test 133f "Check for LBUGs/Oopses/unreadable files in /proc"
test_133g() {
- local proc_dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/"
+ local proc_dirs
+
+ local dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/ \
+/sys/fs/lustre/ /sys/fs/lnet/"
+ local dir
+ for dir in $dirs; do
+ if [ -d $dir ]; then
+ proc_dirs="$proc_dirs $dir"
+ fi
+ done
+
local facet
# Second verifying readability.
error "find $proc_dirs failed"
[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.5.54) ] &&
- skip "Too old lustre on MDS"
+ skip "Too old lustre on MDS" && return
[ $(lustre_version_code ost1) -le $(version_code 2.5.54) ] &&
- skip "Too old lustre on ost1"
+ skip "Too old lustre on ost1" && return
for facet in $SINGLEMDS ost1; do
do_facet $facet find $proc_dirs \
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}
+ awk '$1 == "cache_access" {sum += $7}
END { printf("%0.0f", sum) }')
cancel_lru_locks osc
cat $file >/dev/null
AFTER=$(get_osd_param $list *OST*$idx stats |
- awk '$1 == "cache_access" {sum += $2}
+ awk '$1 == "cache_access" {sum += $7}
END { printf("%0.0f", sum) }')
echo BEFORE:$BEFORE AFTER:$AFTER
function roc_hit() {
local list=$(comma_list $(osts_nodes))
echo $(get_osd_param $list '' stats |
- awk '$1 == "cache_hit" {sum += $2}
+ awk '$1 == "cache_hit" {sum += $7}
END { printf("%0.0f", sum) }')
}
$OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
fid=$($LFS path2fid $test_dir/$tfile-2)
- echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
- cp /etc/passwd $MOUNT/.lustre/fid/$fid &&
- error "create lov data thru .lustre should fail."
+
+ if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.50) ]
+ then # LU-5424
+ echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
+ cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
+ error "create lov data thru .lustre failed"
+ fi
echo "cp /etc/passwd $test_dir/$tfile-2"
cp /etc/passwd $test_dir/$tfile-2 ||
error "copy to $test_dir/$tfile-2 failed."
[ -z "$FID" ] && error "path2fid unable to get $DIR/$tfile FID"
# check that we get the same pathname back
- local FOUND=$($LFS fid2path $MOUNT $FID)
+ 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"
local rc=0
mkdir -p $DIR/$tdir
- $LFS mkdir -i $MDTIDX -c $MDSCOUNT $remote_dir ||
+ $LFS mkdir -i $MDTIDX $remote_dir ||
error "create remote directory failed"
cp /etc/hosts $remote_dir/$tfile
N=$((N + 1))
done
- $LFS fid2path $MOUNT $FID1 $FID2 $FID3 | while read PATHNAME; do
+ $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
+ do
[ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
N=$((N + 1))
rm -f $DIR/$tfile
touch $DIR/$tfile
- fid=$($LFS path2fid $DIR/$tfile)
+ local 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
+ local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
+ echo "$fid_list" | grep "$fid"
rc=$?
cmd="exec $fd>/dev/null"
}
run_test 154d "Verify open file fid"
+test_154e()
+{
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.50) ]] &&
+ skip "Need MDS version at least 2.6.50" && return
+
+ if ls -a $MOUNT | grep -q '^\.lustre$'; then
+ error ".lustre returned by readdir"
+ fi
+}
+run_test 154e ".lustre is not returned by readdir"
+
+test_154f() {
+ # create parent directory on a single MDT to avoid cross-MDT hardlinks
+ test_mkdir -p -c1 $DIR/$tdir/d
+ # test dirs inherit from its stripe
+ mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
+ mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
+ cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
+ ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
+ touch $DIR/f
+
+ # get fid of parents
+ local FID0=$($LFS path2fid $DIR/$tdir/d)
+ local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
+ local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
+ local FID3=$($LFS path2fid $DIR)
+
+ # check that path2fid --parents returns expected <parent_fid>/name
+ # 1) test for a directory (single parent)
+ local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
+ [ "$parent" == "$FID0/foo1" ] ||
+ error "expected parent: $FID0/foo1, got: $parent"
+
+ # 2) test for a file with nlink > 1 (multiple parents)
+ parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
+ echo "$parent" | grep -F "$FID1/$tfile" ||
+ error "$FID1/$tfile not returned in parent list"
+ echo "$parent" | grep -F "$FID2/link" ||
+ error "$FID2/link not returned in parent list"
+
+ # 3) get parent by fid
+ local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
+ parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
+ echo "$parent" | grep -F "$FID1/$tfile" ||
+ error "$FID1/$tfile not returned in parent list (by fid)"
+ echo "$parent" | grep -F "$FID2/link" ||
+ error "$FID2/link not returned in parent list (by fid)"
+
+ # 4) test for entry in root directory
+ parent=$($LFS path2fid --parents $DIR/f)
+ echo "$parent" | grep -F "$FID3/f" ||
+ error "$FID3/f not returned in parent list"
+
+ # 5) test it on root directory
+ [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
+ error "$MOUNT should not have parents"
+
+ # enable xattr caching and check that linkea is correctly updated
+ local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
+ save_lustre_params client "llite.*.xattr_cache" > $save
+ lctl set_param llite.*.xattr_cache 1
+
+ # 6.1) linkea update on rename
+ mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
+
+ # get parents by fid
+ parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
+ # foo1 should no longer be returned in parent list
+ echo "$parent" | grep -F "$FID1" &&
+ error "$FID1 should no longer be in parent list"
+ # the new path should appear
+ echo "$parent" | grep -F "$FID2/$tfile.moved" ||
+ error "$FID2/$tfile.moved is not in parent list"
+
+ # 6.2) linkea update on unlink
+ rm -f $DIR/$tdir/d/foo2/link
+ parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
+ # foo2/link should no longer be returned in parent list
+ echo "$parent" | grep -F "$FID2/link" &&
+ error "$FID2/link should no longer be in parent list"
+ true
+
+ rm -f $DIR/f
+ restore_lustre_params < $save
+}
+run_test 154f "get parent fids by reading link ea"
+
+test_154g()
+{
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.92) ]] ||
+ { skip "Need MDS version at least 2.6.92"; return 0; }
+
+ mkdir -p $DIR/$tdir
+ llapi_fid_test -d $DIR/$tdir
+}
+run_test 154g "various llapi FID tests"
+
test_155_small_load() {
local temp=$TMP/$tfile
local file=$DIR/$tfile
run_test 155h "Verify big file correctness: read cache:off write_cache:off"
test_156() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local CPAGES=3
local BEFORE
test_160c() {
local rc=0
+ local server_version=$(lustre_version_code $SINGLEMDS)
+
+ [[ $server_version -gt $(version_code 2.5.57) ]] ||
+ [[ $server_version -gt $(version_code 2.5.1) &&
+ $server_version -lt $(version_code 2.5.50) ]] ||
+ { skip "Need MDS version at least 2.5.58 or 2.5.2+"; return; }
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# Registration step
run_test 161b "link ea sanity under remote directory"
test_161c() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $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
local fid=$2
local path=$(${LFS} fid2path $*)
+ # Remove the '//' indicating a remote directory
+ path=$(echo $path | sed 's#//#/#g')
RC=$?
if [ $RC -ne 0 ]; then
test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
# regular file
FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
- check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0
+ check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0 ||
+ error "check path $tdir/d2/$tfile failed"
# softlink
ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
- check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0
+ check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0 ||
+ error "check path $tdir/d2/p/q/r/slink failed"
# softlink to wrong file
ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
- check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0
+ check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0 ||
+ error "check path $tdir/d2/p/q/r/slink.wrong failed"
# hardlink
ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
FID=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
# fid2path dir/fsname should both work
- check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1
- check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0
+ check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1 ||
+ error "check path $tdir/d2/a/b/c/new_file failed"
+ check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0 ||
+ error "check path $DIR/$tdir/d2/p/q/r/hlink failed"
# hardlink count: check that there are 2 links
# Doesnt work with CMD yet: 17935
# hardlink indexing: remove the first link
rm $DIR/$tdir/d2/p/q/r/hlink
- check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0
+ check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0 ||
+ error "check path $DIR/$tdir/d2/a/b/c/new_file failed"
return 0
}
run_test 162 "path lookup sanity"
+test_162b() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+ $LFS setdirstripe -i0 -c$MDSCOUNT -t all_char $DIR/$tdir/striped_dir ||
+ error "create striped dir failed"
+
+ local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
+ tail -n 1 | awk '{print $2}')
+ stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
+
+ touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
+ mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
+
+ # regular file
+ for ((i=0;i<5;i++)); do
+ FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
+ error "get fid for f$i failed"
+ check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0 ||
+ error "check path $tdir/striped_dir/f$i failed"
+
+ FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
+ error "get fid for d$i failed"
+ check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0 ||
+ error "check path $tdir/striped_dir/d$i failed"
+ done
+
+ return 0
+}
+run_test 162b "striped directory path lookup sanity"
+
+# LU-4239: Verify fid2path works with paths 100 or more directories deep
+test_162c() {
+ test_mkdir $DIR/$tdir.local
+ test_mkdir $DIR/$tdir.remote
+ local lpath=$tdir.local
+ local rpath=$tdir.remote
+
+ for ((i = 0; i <= 101; i++)); do
+ lpath="$lpath/$i"
+ mkdir $DIR/$lpath
+ FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
+ error "get fid for local directory $DIR/$lpath failed"
+ check_path "$DIR/$lpath" $MOUNT $FID --link 0 ||
+ error "check path for local directory $DIR/$lpath failed"
+
+ rpath="$rpath/$i"
+ test_mkdir $DIR/$rpath
+ FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
+ error "get fid for remote directory $DIR/$rpath failed"
+ check_path "$DIR/$rpath" $MOUNT $FID --link 0 ||
+ error "check path for remote directory $DIR/$rpath failed"
+ done
+
+ return 0
+}
+run_test 162c "fid2path works with paths 100 or more directories deep"
+
test_169() {
# do directio so as not to populate the page cache
log "creating a 10 Mb file"
}
run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
-# it would be good to share it with obdfilter-survey/libecho code
+# it would be good to share it with obdfilter-survey/iokit-libecho code
setup_obdecho_osc () {
local rc=0
local ost_nid=$1
test_180c() { # LU-2598
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
[[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.0) ]] &&
skip "Need MDS version at least 2.4.0" && return
run_test 181 "Test open-unlinked dir ========================"
test_182() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- # disable MDC RPC lock wouldn't crash client
local fcount=1000
- local tcount=4
+ local tcount=10
mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
-#define OBD_FAIL_MDC_RPCS_SEM 0x804
- $LCTL set_param fail_loc=0x804
- for (( i=0; i < $tcount; i++ )) ; do
+ $LCTL set_param mdc.*.rpc_stats=clear
+
+ for (( i = 0; i < $tcount; i++ )) ; do
mkdir $DIR/$tdir/$i
+ done
+
+ for (( i = 0; i < $tcount; i++ )) ; do
createmany -o $DIR/$tdir/$i/f- $fcount &
done
wait
- for (( i=0; i < $tcount; i++ )) ; do
+ for (( i = 0; i < $tcount; i++ )) ; do
unlinkmany $DIR/$tdir/$i/f- $fcount &
done
wait
- rm -rf $DIR/$tdir
+ $LCTL get_param mdc.*.rpc_stats
- $LCTL set_param fail_loc=0
+ rm -rf $DIR/$tdir
}
-run_test 182 "Disable MDC RPCs semaphore wouldn't crash client ================"
+run_test 182 "Test parallel modify metadata operations ================"
test_183() { # LU-2275
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.56) ]] &&
skip "Need MDS version at least 2.3.56" && return
local ref2=$dir0/ref2
local file1=$dir0/file1
local file2=$dir0/file2
- # create a file large enough for the concurent test
+ # create a file large enough for the concurrent test
dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
echo "ref file size: ref1($(stat -c %s $ref1))," \
}
run_test 184d "allow stripeless layouts swap"
+test_184e() {
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.94) ]] ||
+ { skip "Need MDS version at least 2.6.94"; return 0; }
+ check_swap_layouts_support && return 0
+ [ -z "$(which getfattr 2>/dev/null)" ] &&
+ skip "no getfattr command" && return 0
+
+ local file1=$DIR/$tdir/$tfile-1
+ local file2=$DIR/$tdir/$tfile-2
+ local file3=$DIR/$tdir/$tfile-3
+ local lovea
+
+ mkdir -p $DIR/$tdir
+ touch $file1 || error "create $file1 failed"
+ $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
+ error "create $file2 failed"
+ $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
+ error "create $file3 failed"
+
+ $LFS swap_layouts $file1 $file2 ||
+ error "swap $file1 $file2 layouts failed"
+
+ lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
+ [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
+
+ echo 123 > $file1 || error "Should be able to write into $file1"
+
+ $LFS swap_layouts $file1 $file3 ||
+ error "swap $file1 $file3 layouts failed"
+
+ echo 123 > $file1 || error "Should be able to write into $file1"
+
+ rm -rf $file1 $file2 $file3
+}
+run_test 184e "Recreate layout after stripeless layout swaps"
test_185() { # LU-2441
# LU-3553 - no volatile file support in old servers
}
run_test 187b "Test data version change on volatile file"
-# OST pools tests
-check_file_in_pool()
-{
- local file=$1
- local pool=$2
- local tlist="$3"
- local res=$($GETSTRIPE $file | grep 0x | cut -f2)
- for i in $res
- do
- for t in $tlist ; do
- [ "$i" -eq "$t" ] && continue 2
- done
-
- echo "pool list: $tlist"
- echo "striping: $res"
- error_noexit "$file not allocated in $pool"
- return 1
- done
- return 0
-}
-
-pool_add() {
- echo "Creating new pool"
- local pool=$1
-
- create_pool $FSNAME.$pool ||
- { error_noexit "No pool created, result code $?"; return 1; }
- [ $($LFS pool_list $FSNAME | grep -c $pool) -eq 1 ] ||
- { error_noexit "$pool not in lfs pool_list"; return 2; }
-}
-
-pool_add_targets() {
- echo "Adding targets to pool"
- local pool=$1
- local first=$2
- local last=$3
- local step=${4:-1}
-
- local list=$(seq $first $step $last)
-
- local t=$(for i in $list; do printf "$FSNAME-OST%04x_UUID " $i; done)
- do_facet mgs $LCTL pool_add \
- $FSNAME.$pool $FSNAME-OST[$first-$last/$step]
- wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$pool \
- | sort -u | tr '\n' ' ' " "$t" || {
- error_noexit "Add to pool failed"
- return 1
- }
- local lfscount=$($LFS pool_list $FSNAME.$pool | grep -c "\-OST")
- local addcount=$(((last - first) / step + 1))
- [ $lfscount -eq $addcount ] || {
- error_noexit "lfs pool_list bad ost count" \
- "$lfscount != $addcount"
- return 2
- }
-}
-
-pool_set_dir() {
- local pool=$1
- local tdir=$2
- echo "Setting pool on directory $tdir"
-
- $SETSTRIPE -c 2 -p $pool $tdir && return 0
-
- error_noexit "Cannot set pool $pool to $tdir"
- return 1
-}
-
-pool_check_dir() {
- local pool=$1
- local tdir=$2
- echo "Checking pool on directory $tdir"
-
- local res=$($GETSTRIPE --pool $tdir | sed "s/\s*$//")
- [ "$res" = "$pool" ] && return 0
-
- error_noexit "Pool on '$tdir' is '$res', not '$pool'"
- return 1
-}
-
-pool_dir_rel_path() {
- echo "Testing relative path works well"
- local pool=$1
- local tdir=$2
- local root=$3
-
- mkdir -p $root/$tdir/$tdir
- cd $root/$tdir
- pool_set_dir $pool $tdir || return 1
- pool_set_dir $pool ./$tdir || return 2
- pool_set_dir $pool ../$tdir || return 3
- pool_set_dir $pool ../$tdir/$tdir || return 4
- rm -rf $tdir; cd - > /dev/null
-}
-
-pool_alloc_files() {
- echo "Checking files allocation from directory pool"
- local pool=$1
- local tdir=$2
- local count=$3
- local tlist="$4"
-
- local failed=0
- for i in $(seq -w 1 $count)
- do
- local file=$tdir/file-$i
- touch $file
- check_file_in_pool $file $pool "$tlist" || \
- failed=$((failed + 1))
- done
- [ "$failed" = 0 ] && return 0
-
- error_noexit "$failed files not allocated in $pool"
- return 1
-}
-
-pool_create_files() {
- echo "Creating files in pool"
- local pool=$1
- local tdir=$2
- local count=$3
- local tlist="$4"
-
- mkdir -p $tdir
- local failed=0
- for i in $(seq -w 1 $count)
- do
- local file=$tdir/spoo-$i
- $SETSTRIPE -p $pool $file
- check_file_in_pool $file $pool "$tlist" || \
- failed=$((failed + 1))
- done
- [ "$failed" = 0 ] && return 0
-
- error_noexit "$failed files not allocated in $pool"
- return 1
-}
-
-pool_lfs_df() {
- echo "Checking 'lfs df' output"
- local pool=$1
-
- local t=$($LCTL get_param -n lov.$FSNAME-clilov-*.pools.$pool |
- tr '\n' ' ')
- local res=$($LFS df --pool $FSNAME.$pool |
- awk '{print $1}' |
- grep "$FSNAME-OST" |
- tr '\n' ' ')
- [ "$res" = "$t" ] && return 0
-
- error_noexit "Pools OSTs '$t' is not '$res' that lfs df reports"
- return 1
-}
-
-pool_file_rel_path() {
- echo "Creating files in a pool with relative pathname"
- local pool=$1
- local tdir=$2
-
- mkdir -p $tdir ||
- { error_noexit "unable to create $tdir"; return 1 ; }
- local file="/..$tdir/$tfile-1"
- $SETSTRIPE -p $pool $file ||
- { error_noexit "unable to create $file" ; return 2 ; }
-
- cd $tdir
- $SETSTRIPE -p $pool $tfile-2 || {
- error_noexit "unable to create $tfile-2 in $tdir"
- return 3
- }
-}
-
-pool_remove_first_target() {
- echo "Removing first target from a pool"
- local pool=$1
-
- local pname="lov.$FSNAME-*.pools.$pool"
- local t=$($LCTL get_param -n $pname | head -n1)
- do_facet mgs $LCTL pool_remove $FSNAME.$pool $t
- wait_update $HOSTNAME "lctl get_param -n $pname | grep $t" "" || {
- error_noexit "$t not removed from $FSNAME.$pool"
- return 1
- }
-}
-
-pool_remove_all_targets() {
- echo "Removing all targets from pool"
- local pool=$1
- local file=$2
- local pname="lov.$FSNAME-*.pools.$pool"
- for t in $($LCTL get_param -n $pname | sort -u)
- do
- do_facet mgs $LCTL pool_remove $FSNAME.$pool $t
- done
- wait_update $HOSTNAME "lctl get_param -n $pname" "" || {
- error_noexit "Pool $FSNAME.$pool cannot be drained"
- return 1
- }
- # striping on an empty/nonexistant pool should fall back
- # to "pool of everything"
- touch $file || {
- error_noexit "failed to use fallback striping for empty pool"
- return 2
- }
- # setstripe on an empty pool should fail
- $SETSTRIPE -p $pool $file 2>/dev/null && {
- error_noexit "expected failure when creating file" \
- "with empty pool"
- return 3
- }
- return 0
-}
-
-pool_remove() {
- echo "Destroying pool"
- local pool=$1
- local file=$2
-
- do_facet mgs $LCTL pool_destroy $FSNAME.$pool
-
- sleep 2
- # striping on an empty/nonexistant pool should fall back
- # to "pool of everything"
- touch $file || {
- error_noexit "failed to use fallback striping for missing pool"
- return 1
- }
- # setstripe on an empty pool should fail
- $SETSTRIPE -p $pool $file 2>/dev/null && {
- error_noexit "expected failure when creating file" \
- "with missing pool"
- return 2
- }
-
- # get param should return err once pool is gone
- if wait_update $HOSTNAME "lctl get_param -n \
- lov.$FSNAME-*.pools.$pool 2>/dev/null || echo foo" "foo"
- then
- remove_pool_from_list $FSNAME.$pool
- return 0
- fi
- error_noexit "Pool $FSNAME.$pool is not destroyed"
- return 3
-}
-
test_200() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mgs_nodsh && skip "remote MGS with nodsh" && return
local ost_range="$first_ost $last_ost $ost_step"
local test_path=$POOL_ROOT/$POOL_DIR_NAME
local file_dir=$POOL_ROOT/file_tst
+ local subdir=$test_path/subdir
local rc=0
while : ; do
mkdir -p $test_path
pool_set_dir $POOL $test_path || { rc=$? ; break; }
pool_check_dir $POOL $test_path || { rc=$? ; break; }
+ mkdir -p $subdir
+ pool_check_dir $POOL $subdir || { rc=$? ; break; }
pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
|| { rc=$? ; break; }
# former test_200e test_200f
test_205() { # Job stats
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mgs_nodsh && skip "remote MGS with nodsh" && return
[ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
skip "Server doesn't support jobstats" && return 0
[[ $JOBID_VAR = disable ]] && skip "jobstats is disabled" && return
trap jobstats_set EXIT
fi
+ local user=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+ changelog_register -n)
+ echo "Registered as changelog user $user"
+
# mkdir
cmd="mkdir $DIR/$tfile"
verify_jobstats "$cmd" "mdt"
cmd="mv -f $DIR/$tfile $DIR/jobstats_test_rename"
verify_jobstats "$cmd" "mdt"
+ # Ensure that jobid are present in changelog (if supported by MDS)
+ if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.52) ]
+ then
+ $LFS changelog $MDT0 | tail -9
+ jobids=$($LFS changelog $MDT0 | tail -9 | grep -c "j=")
+ [ $jobids -eq 9 ] ||
+ error "Wrong changelog jobid count $jobids != 9"
+
+ # LU-5862
+ JOBENV="disable"
+ jobstats_set $JOBENV
+ touch $DIR/$tfile
+ $LFS changelog $MDT0 | tail -1
+ jobids=$($LFS changelog $MDT0 | tail -1 | grep -c "j=")
+ [ $jobids -eq 0 ] ||
+ error "Unexpected jobids when jobid_var=$JOBENV"
+ fi
+
# cleanup
rm -f $DIR/jobstats_test_rename
[[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.4.52) ]] ||
{ skip "Need MDS version at least 2.4.52"; return 0; }
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
echo "==== test 1: verify get lease work"
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
# having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
create_lnet_proc_files() {
- cat /proc/sys/lnet/$1 >$TMP/lnet_$1.out || error "cannot read /proc/sys/lnet/$1"
+ lctl get_param -n $1 >$TMP/lnet_$1.out || error "cannot read lnet.$1"
sysctl lnet.$1 >$TMP/lnet_$1.sys_tmp || error "cannot read lnet.$1"
sed "s/^lnet.$1\ =\ //g" "$TMP/lnet_$1.sys_tmp" >$TMP/lnet_$1.sys
local L2 # regexp for 2nd line (optional)
local BR # regexp for the rest (body)
- # /proc/sys/lnet/stats should look as 11 space-separated non-negative numerics
+ # lnet.stats should look as 11 space-separated non-negative numerics
BR="^$N $N $N $N $N $N $N $N $N $N $N$"
create_lnet_proc_files "stats"
- check_lnet_proc_stats "stats.out" "/proc/sys/lnet/stats" "$BR"
check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
remove_lnet_proc_files "stats"
- # /proc/sys/lnet/routes should look like this:
+ # lnet.routes should look like this:
# Routing disabled/enabled
# net hops priority state router
# where net is a string like tcp0, hops > 0, priority >= 0,
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"
remove_lnet_proc_files "routes"
- # /proc/sys/lnet/routers should look like this:
+ # lnet.routers should look like this:
# ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
# where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
# last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
create_lnet_proc_files "routers"
- check_lnet_proc_entry "routers.out" "/proc/sys/lnet/routers" "$BR" "$L1"
check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
remove_lnet_proc_files "routers"
- # /proc/sys/lnet/peers should look like this:
+ # lnet.peers should look like this:
# nid refs state last max rtr min tx min queue
# where nid is a string like 192.168.1.1@tcp2, refs > 0,
# state is up/down/NA, max >= 0. last, rtr, min, tx, min are
L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
create_lnet_proc_files "peers"
- check_lnet_proc_entry "peers.out" "/proc/sys/lnet/peers" "$BR" "$L1"
check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
remove_lnet_proc_files "peers"
- # /proc/sys/lnet/buffers should look like this:
+ # lnet.buffers should look like this:
# pages count credits min
# where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
L1="^pages +count +credits +min$"
BR="^ +$N +$N +$I +$I$"
create_lnet_proc_files "buffers"
- check_lnet_proc_entry "buffers.out" "/proc/sys/lnet/buffers" "$BR" "$L1"
check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
remove_lnet_proc_files "buffers"
- # /proc/sys/lnet/nis should look like this:
+ # lnet.nis should look like this:
# nid status alive refs peer rtr max tx min
# where nid is a string like 192.168.1.1@tcp2, status is up/down,
# alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
create_lnet_proc_files "nis"
- check_lnet_proc_entry "nis.out" "/proc/sys/lnet/nis" "$BR" "$L1"
check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
remove_lnet_proc_files "nis"
- # can we successfully write to /proc/sys/lnet/stats?
- echo "0" >/proc/sys/lnet/stats || error "cannot write to /proc/sys/lnet/stats"
+ # can we successfully write to lnet.stats?
+ lctl set_param -n stats=0 || error "cannot write to lnet.stats"
sysctl -w lnet.stats=0 || error "cannot write to lnet.stats"
}
-run_test 215 "/proc/sys/lnet exists and has proper content - bugs 18102, 21079, 21517"
+run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
test_216() { # bug 20317
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local OSTIDX=0
test_mkdir -p $DIR/$tdir
- local OST=$(lfs osts | grep ${OSTIDX}": " | \
+ local OST=$($LFS osts | grep ${OSTIDX}": " | \
awk '{print $2}' | sed -e 's/_UUID$//')
# on the mdt's osc
}
run_test 224b "Don't panic on bulk IO failure"
+test_224c() { # LU-6441
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ local pages_per_rpc=$($LCTL get_param \
+ osc.*.max_pages_per_rpc)
+ local at_max=$($LCTL get_param -n at_max)
+ local timeout=$($LCTL get_param -n timeout)
+ local test_at="$LCTL get_param -n at_max"
+ local param_at="$FSNAME.sys.at_max"
+ local test_timeout="$LCTL get_param -n timeout"
+ local param_timeout="$FSNAME.sys.timeout"
+
+ $LCTL set_param -n osc.*.max_pages_per_rpc=1024
+
+ set_conf_param_and_check client "$test_at" "$param_at" 0 ||
+ error "conf_param at_max=0 failed"
+ set_conf_param_and_check client "$test_timeout" "$param_timeout" 5 ||
+ error "conf_param timeout=5 failed"
+
+ #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
+ $LCTL set_param fail_loc=0x520
+ dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
+ sync
+ $LCTL set_param fail_loc=0
+
+ set_conf_param_and_check client "$test_at" "$param_at" $at_max ||
+ error "conf_param at_max=$at_max failed"
+ set_conf_param_and_check client "$test_timeout" "$param_timeout" \
+ $timeout || error "conf_param timeout=$timeout failed"
+
+ $LCTL set_param -n $pages_per_rpc
+}
+run_test 224c "Don't hang if one of md lost during large bulk RPC"
+
MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
test_225a () {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# LU-1512 try to reuse idle OI blocks
test_228a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
skip "non-ldiskfs backend" && return
test_228b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
skip "non-ldiskfs backend" && return
#LU-1881
test_228c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
skip "non-ldiskfs backend" && return
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
+ skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53" &&
+ return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
local MDTIDX=1
- mkdir -p $DIR/$tdir/test_230_local
+ test_mkdir $DIR/$tdir
+ test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
local mdt_idx=$($GETSTRIPE -M $DIR/$tdir/test_230_local)
[ $mdt_idx -ne 0 ] &&
error "create local directory on wrong MDT $mdt_idx"
local migrate_dir=$DIR/$tdir/migrate_dir
local other_dir=$DIR/$tdir/other_dir
- mkdir -p $migrate_dir
- mkdir -p $other_dir
+ test_mkdir $DIR/$tdir
+ test_mkdir -i0 -c1 $migrate_dir
+ test_mkdir -i0 -c1 $other_dir
for ((i=0; i<10; i++)); do
mkdir -p $migrate_dir/dir_${i}
createmany -o $migrate_dir/dir_${i}/f 10 ||
ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
$LFS mv -v -M $MDTIDX $migrate_dir ||
- error "migrate remote dir error"
+ error "migrate remote dir error"
echo "migratate to MDT1, then checking.."
- for ((i=0; i<10; i++)); do
+ 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 ] ||
stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
[ $stripe_count = 2 ] ||
- error "dir strpe_count $d != 2 after migration."
+ 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."
+ 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"
+ error "migrate remote dir error"
echo "migrate back to MDT0, checking.."
for file in $(find $migrate_dir); do
local MDTIDX=1
local mdt_index
local file
+ local migrate_dir=$DIR/$tdir/migrate_dir
#If migrating directory fails in the middle, all entries of
#the directory is still accessiable.
- mkdir -p $DIR/$tdir
- stat $DIR/$tdir
- createmany -o $DIR/$tdir/f 10 ||
- error "create files under ${tdir} failed"
+ test_mkdir $DIR/$tdir
+ test_mkdir -i0 -c1 $migrate_dir
+ stat $migrate_dir
+ createmany -o $migrate_dir/f 10 ||
+ error "create files under ${migrate_dir} 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`
+ local t=$(ls $migrate_dir | wc -l)
+ $LFS mv --mdt-index $MDTIDX $migrate_dir &&
+ error "migrate should fail after 5 entries"
+ local u=$(ls $migrate_dir | wc -l)
[ "$u" == "$t" ] || error "$u != $t during migration"
- for file in $(find $DIR/$tdir); do
+ for file in $(find $migrate_dir); do
stat $file || error "stat $file failed"
done
do_facet mds1 lctl set_param fail_loc=0
do_facet mds1 lctl set_param fail_val=0
- $LFS mv -M $MDTIDX $DIR/$tdir ||
+ $LFS mv -M $MDTIDX $migrate_dir ||
error "migrate open files should failed with open files"
echo "Finish migration, then checking.."
- for file in $(find $DIR/$tdir); do
+ for file in $(find $migrate_dir); do
mdt_index=$($LFS getstripe -M $file)
[ $mdt_index == $MDTIDX ] ||
error "$file is not on MDT${MDTIDX}"
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
local MDTIDX=1
local mdt_index
+ local migrate_dir=$DIR/$tdir/migrate_dir
local i
local j
- mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
+ test_mkdir -i0 -c1 $migrate_dir
for ((i=0; i<100; i++)); do
- mkdir -p $DIR/$tdir/dir_${i}
- createmany -o $DIR/$tdir/dir_${i}/f 100 ||
+ test_mkdir -i0 -c1 $migrate_dir/dir_${i}
+ createmany -o $migrate_dir/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"
+ $LFS mv -M $MDTIDX -v $migrate_dir || error "migrate remote dir error"
echo "Finish migration, then checking.."
- for file in $(find $DIR/$tdir); do
+ for file in $(find $migrate_dir); do
mdt_index=$($LFS getstripe -M $file)
[ $mdt_index == $MDTIDX ] ||
error "$file is not on MDT${MDTIDX}"
touch $DIR/$tdir/$tfile || error "touch failed"
# OBD_FAIL_LLITE_XATTR_ENOMEM
$LCTL set_param fail_loc=0x1405
- if [ ! -f /etc/SuSE-release ]; then
+ # output of the form: attr 2 4 44 3 fc13 x86_64
+ V=($(IFS=".-" rpm -q attr))
+ if [[ ${V[1]} > 2 || ${V[2]} > 4 || ${V[3]} > 44 ||
+ ${V[1]} = 2 && ${V[2]} = 4 && ${V[3]} = 44 && ${V[4]} > 6 ]]; then
# attr pre-2.4.44-7 had a bug with rc
- # LU-3703 - SLES clients have older attr
+ # LU-3703 - SLES 11 and FC13 clients have older attr
getfattr -n user.attr $DIR/$tdir/$tfile &&
error "getfattr should have failed with ENOMEM"
+ else
+ skip "LU-3703: attr version $(getfattr --version) too old"
fi
$LCTL set_param fail_loc=0x0
rm -rf $DIR/$tdir
# The new system calls are supported in glibc >= 2.14.
test_237() {
- echo "Test file_handle syscalls" > $DIR/$tfile
+ echo "Test file_handle syscalls" > $DIR/$tfile ||
+ error "write failed"
check_fhandle_syscalls $DIR/$tfile ||
error "check_fhandle_syscalls failed"
}
# LU-4659 linkea consistency
test_238() {
+ local server_version=$(lustre_version_code $SINGLEMDS)
+
+ [[ $server_version -gt $(version_code 2.5.57) ]] ||
+ [[ $server_version -gt $(version_code 2.5.1) &&
+ $server_version -lt $(version_code 2.5.50) ]] ||
+ { skip "Need MDS version at least 2.5.58 or 2.5.2+"; return; }
+
touch $DIR/$tfile
ln $DIR/$tfile $DIR/$tfile.lnk
touch $DIR/$tfile.new
mv $DIR/$tfile.new $DIR/$tfile
- local fid1=$(lfs path2fid $DIR/$tfile)
- local fid2=$(lfs path2fid $DIR/$tfile.lnk)
- local path1=$(lfs fid2path $FSNAME $fid1)
+ local fid1=$($LFS path2fid $DIR/$tfile)
+ local fid2=$($LFS path2fid $DIR/$tfile.lnk)
+ local path1=$($LFS fid2path $FSNAME "$fid1")
[ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
- local path2=$(lfs fid2path $FSNAME $fid2)
+ local path2=$($LFS fid2path $FSNAME "$fid2")
[ $tfile.lnk == $path2 ] ||
error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
rm -f $DIR/$tfile*
}
run_test 238 "Verify linkea consistency"
+test_239() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.60) ] &&
+ skip "Need MDS version at least 2.5.60" && return
+ local list=$(comma_list $(mdts_nodes))
+
+ mkdir -p $DIR/$tdir
+ createmany -o $DIR/$tdir/f- 5000
+ unlinkmany $DIR/$tdir/f- 5000
+ do_nodes $list "lctl set_param -n osp*.*.sync_changes 1"
+ changes=$(do_nodes $list "lctl get_param -n osc.*MDT*.sync_changes \
+ osc.*MDT*.sync_in_flight" | calc_sum)
+ [ "$changes" -eq 0 ] || error "$changes not synced"
+}
+run_test 239 "osp_sync test"
+
+test_240() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir -p $DIR/$tdir
+
+ $LFS mkdir -i 0 $DIR/$tdir/d0 ||
+ error "failed to mkdir $DIR/$tdir/d0 on MDT0"
+ $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
+ error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
+
+ umount_client $MOUNT || error "umount failed"
+ #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
+ do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
+ mount_client $MOUNT || error "failed to mount client"
+
+ echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
+ stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
+}
+run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
+
+test_241_bio() {
+ for LOOP in $(seq $1); do
+ dd if=$DIR/$tfile of=/dev/null bs=40960 count=1 2>/dev/null
+ cancel_lru_locks osc
+ done
+}
+
+test_241_dio() {
+ for LOOP in $(seq $1); do
+ dd if=$DIR/$tfile of=/dev/null bs=40960 count=1 \
+ iflag=direct 2>/dev/null
+ done
+}
+
+test_241() {
+ dd if=/dev/zero of=$DIR/$tfile count=1 bs=40960
+ ls -la $DIR/$tfile
+ cancel_lru_locks osc
+ test_241_bio 1000 &
+ PID=$!
+ test_241_dio 1000
+ wait $PID
+}
+run_test 241 "bio vs dio"
+
+test_241b() {
+ dd if=/dev/zero of=$DIR/$tfile count=1 bs=40960
+ ls -la $DIR/$tfile
+ test_241_dio 1000 &
+ PID=$!
+ test_241_dio 1000
+ wait $PID
+}
+run_test 241b "dio vs dio"
+
+test_242() {
+ mkdir -p $DIR/$tdir
+ touch $DIR/$tdir/$tfile
+
+ #define OBD_FAIL_MDS_READPAGE_PACK 0x105
+ do_facet mds1 lctl set_param fail_loc=0x105
+ /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
+
+ do_facet mds1 lctl set_param fail_loc=0
+ /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
+}
+run_test 242 "mdt_readpage failure should not cause directory unreadable"
+
+test_243()
+{
+ test_mkdir -p $DIR/$tdir
+ group_lock_test -d $DIR/$tdir || error "A group lock test failed"
+}
+run_test 243 "various group lock tests"
+
+test_244()
+{
+ test_mkdir -p $DIR/$tdir
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
+ sendfile_grouplock $DIR/$tdir/$tfile || \
+ error "sendfile+grouplock failed"
+ rm -rf $DIR/$tdir
+}
+run_test 244 "sendfile with group lock tests"
+
+test_250() {
+ [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
+ && skip "no 16TB file size limit on ZFS" && return
+
+ $SETSTRIPE -c 1 $DIR/$tfile
+ # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
+ local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
+ $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
+ dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
+ conv=notrunc,fsync && error "append succeeded"
+ return 0
+}
+run_test 250 "Write above 16T limit"
+
+test_251() {
+ $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile
+
+ #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
+ #Skip once - writing the first stripe will succeed
+ $LCTL set_param fail_loc=0xa0001407 fail_val=1
+ $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
+ error "short write happened"
+
+ $LCTL set_param fail_loc=0xa0001407 fail_val=1
+ $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
+ error "short read happened"
+
+ rm -f $DIR/$tfile
+}
+run_test 251 "Handling short read and write correctly"
+
+cleanup_test_300() {
+ trap 0
+ umask $SAVE_UMASK
+}
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 ||
+
+ SAVE_UMASK=$(umask)
+ trap cleanup_test_300 RETURN EXIT
+
+ $LFS setdirstripe -i $mdt_index -c 2 -t all_char -m 755 \
+ $DIR/$tdir/striped_dir ||
error "set striped dir error"
+ local mode=$(stat -c%a $DIR/$tdir/striped_dir)
+ [ "$mode" = "755" ] || error "expect 755 got $mode"
+
+ $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
+ error "getdirstripe failed"
stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
if [ "$stripe_count" != "2" ]; then
error "stripe_count is $stripe_count, expect 2"
[ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
error "nlink error after rmdir"
+ chattr +i $DIR/$tdir/striped_dir
+ createmany -o $DIR/$tdir/striped_dir/f 10 &&
+ error "immutable flags not working under striped dir!"
+ chattr -i $DIR/$tdir/striped_dir
+
rmdir $DIR/$tdir/striped_dir ||
error "rmdir striped dir error"
+
+ cleanup_test_300
+
true
}
$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/dir_a $DIR/$tdir/striped_dir/dir_b ||
+ error "rename dir under striped dir fails"
- 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/stp_a $DIR/$tdir/striped_dir/stp_b ||
+ error "rename dir under different stripes fails"
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 ||
+ mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
error "rename dir under striped dir should succeed"
rm -rf $DIR/$tdir
$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 &&
+ 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 &&
+ 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"
+test_300_check_default_striped_dir()
+{
+ local dirname=$1
+ local default_count=$2
+ local default_index=$3
+ local stripe_count
+ local stripe_index
+ local dir_stripe_index
+ local dir
+
+ echo "checking $dirname $default_count $default_index"
+ $LFS setdirstripe -D -c $default_count -i $default_index \
+ -t all_char $DIR/$tdir/$dirname ||
+ error "set default stripe on striped dir error"
+ stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
+ [ $stripe_count -eq $default_count ] ||
+ error "expect $default_count get $stripe_count for $dirname"
+
+ stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
+ [ $stripe_index -eq $default_index ] ||
+ error "expect $default_index get $stripe_index for $dirname"
+
+ mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
+ error "create dirs failed"
+
+ createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
+ unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
+ for dir in $(find $DIR/$tdir/$dirname/*); do
+ stripe_count=$($LFS getdirstripe -c $dir)
+ [ $stripe_count -eq $default_count ] ||
+ error "stripe count $default_count != $stripe_count for $dir"
+
+ stripe_index=$($LFS getdirstripe -i $dir)
+ [ $default_index -eq -1 -o $stripe_index -eq $default_index ] ||
+ error "$stripe_index != $default_index for $dir"
+
+ #check default stripe
+ stripe_count=$($LFS getdirstripe -D -c $dir)
+ [ $stripe_count -eq $default_count ] ||
+ error "default count $default_count != $stripe_count for $dir"
+
+ stripe_index=$($LFS getdirstripe -D -i $dir)
+ [ $stripe_index -eq $default_index ] ||
+ error "default index $default_index != $stripe_index for $dir"
+ done
+ rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
+}
+
test_300g() {
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local dir
local stripe_count
+ local stripe_index
+
+ mkdir $DIR/$tdir
+ mkdir $DIR/$tdir/normal_dir
+
+ test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
+ test_300_check_default_striped_dir normal_dir 1 0
+ test_300_check_default_striped_dir normal_dir 2 1
+ test_300_check_default_striped_dir normal_dir 2 -1
+
+ #delete default stripe information
+ echo "delete default stripeEA"
+ $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
+ error "set default stripe on striped dir error"
+
+ mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
+ for dir in $(find $DIR/$tdir/normal_dir/*); do
+ stripe_count=$($LFS getdirstripe -c $dir)
+ [ $stripe_count -eq 0 ] ||
+ error "expect 1 get $stripe_count for $dir"
+ stripe_index=$($LFS getdirstripe -i $dir)
+ [ $stripe_index -eq 0 ] ||
+ error "expect 0 get $stripe_index for $dir"
+ done
+}
+run_test 300g "check default striped directory for normal directory"
+
+test_300h() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
local dir
+ local stripe_count
mkdir $DIR/$tdir
$LFS setdirstripe -i 0 -c $MDSCOUNT -t all_char \
$DIR/$tdir/striped_dir ||
error "set striped dir error"
- $LFS setdirstripe -D -c $MDSCOUNT -t all_char $DIR/$tdir/striped_dir ||
+ test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
+ test_300_check_default_striped_dir striped_dir 1 0
+ test_300_check_default_striped_dir striped_dir 2 1
+ test_300_check_default_striped_dir striped_dir 2 -1
+
+ #delete default stripe information
+ $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
error "set default stripe on striped dir error"
mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
-
for dir in $(find $DIR/$tdir/striped_dir/*); do
stripe_count=$($LFS getdirstripe -c $dir)
- [ $stripe_count -eq $MDSCOUNT ] ||
- error "expect $MDSCOUNT get $stripe_count for $dir"
+ [ $stripe_count -eq 0 ] ||
+ error "expect 1 get $stripe_count for $dir"
done
+}
+run_test 300h "check default striped directory for striped directory"
- rmdir $DIR/$tdir/striped_dir/* || error "rmdir1 failed"
- #change default stripe count to 2
- $LFS setdirstripe -D -c 2 -t all_char $DIR/$tdir/striped_dir ||
- error "set default stripe on striped dir error"
+test_300i() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local stripe_count
+ local file
- mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
+ mkdir $DIR/$tdir
- rmdir $DIR/$tdir/striped_dir/* || error "rmdir2 failed"
+ $LFS setdirstripe -i 0 -c$MDSCOUNT -t all_char $DIR/$tdir/striped_dir ||
+ error "set striped dir error"
- #change default stripe count to 1
- $LFS setdirstripe -D -c 1 -t all_char $DIR/$tdir/striped_dir ||
- error "set default stripe on striped dir error"
+ createmany -o $DIR/$tdir/striped_dir/f- 10 ||
+ error "create files under striped dir failed"
- mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
- for dir in $(find $DIR/$tdir/striped_dir/*); do
- stripe_count=$($LFS getdirstripe -c $dir)
- [ $stripe_count -eq 1 ] ||
- error "expect 1 get $stripe_count for $dir"
+ # unfortunately, we need to umount to clear dir layout cache for now
+ # once we fully implement dir layout, we can drop this
+ umount_client $MOUNT || error "umount failed"
+ mount_client $MOUNT || error "mount failed"
+
+ #set the stripe to be unknown hash type
+ #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
+ $LCTL set_param fail_loc=0x1901
+ for ((i = 0; i < 10; i++)); do
+ $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
+ error "stat f-$i failed"
+ rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
done
- rmdir $DIR/$tdir/striped_dir/* || error "rmdir3 failed"
+
+ touch $DIR/$tdir/striped_dir/f0 &&
+ error "create under striped dir with unknown hash should fail"
+
+ $LCTL set_param fail_loc=0
+
+ umount_client $MOUNT || error "umount failed"
+ mount_client $MOUNT || error "mount failed"
+
+ return 0
+}
+run_test 300i "client handle unknown hash type striped directory"
+
+prepare_remote_file() {
+ mkdir $DIR/$tdir/src_dir ||
+ error "create remote source failed"
+
+ cp /etc/hosts $DIR/$tdir/src_dir/a || error
+ touch $DIR/$tdir/src_dir/a
+
+ $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
+ error "create remote target dir failed"
+
+ touch $DIR/$tdir/tgt_dir/b
+
+ mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
+ error "rename dir cross MDT failed!"
+
+ $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
+ error "src_child still exists after rename"
+
+ $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
+ error "missing file(a) after rename"
+
+ diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
+ error "diff after rename"
}
-run_test 300g "check default striped directory for striped directory"
+
+test_310a() {
+ [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 4 MDTs" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ local remote_file=$DIR/$tdir/tgt_dir/b
+
+ mkdir -p $DIR/$tdir
+
+ prepare_remote_file || error "prepare remote file failed"
+
+ #open-unlink file
+ $OPENUNLINK $remote_file $remote_file || error
+ $CHECKSTAT -a $remote_file || error
+}
+run_test 310a "open unlink remote file"
+
+test_310b() {
+ [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 4 MDTs" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ local remote_file=$DIR/$tdir/tgt_dir/b
+
+ mkdir -p $DIR/$tdir
+
+ prepare_remote_file || error "prepare remote file failed"
+
+ ln $remote_file $DIR/$tfile || error "link failed for remote file"
+ $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
+ $CHECKSTAT -t file $remote_file || error "check file failed"
+}
+run_test 310b "unlink remote file with multiple links while open"
+
+test_310c() {
+ [[ $MDSCOUNT -lt 4 ]] && skip "needs >= 4 MDTs" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ local remote_file=$DIR/$tdir/tgt_dir/b
+
+ mkdir -p $DIR/$tdir
+
+ prepare_remote_file || error "prepare remote file failed"
+
+ ln $remote_file $DIR/$tfile || error "link failed for remote file"
+ multiop_bg_pause $remote_file O_uc ||
+ error "mulitop failed for remote file"
+ MULTIPID=$!
+ $MULTIOP $DIR/$tfile Ouc
+ kill -USR1 $MULTIPID
+ wait $MULTIPID
+}
+run_test 310c "open-unlink remote file with multiple links"
test_400a() { # LU-1606, was conf-sanity test_74
local extra_flags=''
local ls
#define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
$LCTL set_param fail_loc=0x903
- # cancel_lru_locks mgc - does not work due to lctl set_param syntax
- for ls in /proc/fs/lustre/ldlm/namespaces/MGC*/lru_size; do
- echo "clear" > $ls
- done
+
+ cancel_lru_locks MGC
+
FAIL_ON_ERROR=true cleanup
FAIL_ON_ERROR=true setup
}