[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b 230d"
-[ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
-# bug number for skipped test: LU-1593 LU-2610 LU-2833 LU-1957 LU-2805
- ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h 40 48a 180 184c"
+if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then
+ # bug number for skipped test: LU-1593 LU-4536 LU-5242 LU-1957 LU-2805
+ ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h 65ic 132 180 184c"
+ [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b 51ba"
+fi
FAIL_ON_ERROR=false
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)"
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
}
rm -fr $DIR/d33
test_mkdir -p $DIR/d33
chown $RUNAS_ID $DIR/d33
- $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33
+ $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 || true
}
run_test 33b "test open file with malformed flags (No panic)"
# test_47 is removed "Device nodes check" is moved to test_28
test_48a() { # bug 2399
+ [ $(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
check_kernel_version 34 || return 0
test_mkdir -p $DIR/$tdir
cd $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 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"
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"
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() {
+ orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
+}
+run_test 102q "flistxattr should not return trusted.link EAs for orphans"
+
run_acl_subtest()
{
$LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
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
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
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 MOUNT_OPTS_SAVE=$MOUNT_OPTS
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ local mdtidx=$($LFS getstripe -M $DIR)
+ local facet=mds$((mdtidx + 1))
- dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null
- cancel_lru_locks osc
+ local MOUNTOPT_SAVE=$MOUNTOPT
- som1=$(do_facet $mymds "$LCTL get_param -n mdt.*.som" | head -n 1)
+ dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null
+ cancel_lru_locks osc
+ som1=$(do_facet $facet "$LCTL get_param mdt.*.som" |
+ awk -F= ' {print $2}' | head -n 1)
gl1=$(get_ost_param "ldlm_glimpse_enqueue")
stat $DIR/$tfile >/dev/null
dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null
cancel_lru_locks osc
- som2=$(do_facet $mymds "$LCTL get_param -n mdt.*.som" | head -n 1)
+ som2=$(do_facet $facet "$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
}
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_155_small_load() {
local temp=$TMP/$tfile
local file=$DIR/$tfile
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
}
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"
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
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
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
}
run_test 241 "bio 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"
+
cleanup_test_300() {
trap 0
umask $SAVE_UMASK