OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
lctl set_param debug=-1 2> /dev/null || true
-test_0() {
+test_0a() {
touch $DIR/$tfile
$CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
rm $DIR/$tfile
$CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
}
-run_test 0 "touch .../$tfile ; rm .../$tfile ====================="
+run_test 0a "touch; rm ====================="
test_0b() {
chmod 0755 $DIR || error "chmod 0755 $DIR failed"
}
run_test 3 "mkdir; touch; rmdir; check dir ====================="
-test_4() {
- test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
- $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
- test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed"
- $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
-}
-run_test 4 "mkdir =============================================="
-
test_5() {
test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed"
chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
$CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
error "$tfile does not have perm 0666 or UID $UID"
-}
-run_test 6a "touch .../f6a; chmod .../f6a ======================"
-
-test_6b() {
- [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
- if [ ! -f $DIR/$tfile ]; then
- touch $DIR/$tfile
- chmod 0666 $DIR/$tfile
- fi
$RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
$CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
error "$tfile should be 0666 and owned by UID $UID"
}
-run_test 6b "$RUNAS chmod .../f6a (should return error) =="
+run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
test_6c() {
[ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
$CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
error "$tfile should be owned by UID $RUNAS_ID"
-}
-run_test 6c "touch .../f6c; chown .../f6c ======================"
-
-test_6d() {
- [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
- if [ ! -f $DIR/$tfile ]; then
- touch $DIR/$tfile
- chown $RUNAS_ID $DIR/$tfile
- fi
$RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
$CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
error "$tfile should be owned by UID $RUNAS_ID"
}
-run_test 6d "$RUNAS chown .../f6c (should return error) =="
+run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
test_6e() {
[ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
$CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
error "$tfile should be owned by GID $UID"
-}
-run_test 6e "touch .../f6e; chgrp .../f6e ======================"
-
-test_6f() {
- [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
- if [ ! -f $DIR/$tfile ]; then
- touch $DIR/$tfile
- chgrp $RUNAS_ID $DIR/$tfile
- fi
$RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
$CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
}
-run_test 6f "$RUNAS chgrp .../f6e (should return error) =="
+run_test 6e "touch f6e; chgrp f6e; $RUNAS chgrp f6e (should return error) =="
test_6g() {
[ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
}
run_test 31n "check link count of unlinked file"
+link_one() {
+ local TEMPNAME=$(mktemp $1_XXXXXX)
+ mlink $TEMPNAME $1 2> /dev/null &&
+ echo "$BASHPID: link $TEMPNAME to $1 succeeded"
+ munlink $TEMPNAME
+}
+
+test_31o() { # LU-2901
+ mkdir -p $DIR/$tdir
+ for LOOP in $(seq 100); do
+ rm -f $DIR/$tdir/$tfile*
+ for THREAD in $(seq 8); do
+ link_one $DIR/$tdir/$tfile.$LOOP &
+ done
+ wait
+ local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
+ [ $LINKS -gt 1 ] && ls $DIR/$tdir &&
+ error "$LINKS duplicate links to $tfile.$LOOP" &&
+ break || true
+ done
+}
+run_test 31o "duplicate hard links with same filename"
+
cleanup_test32_mount() {
trap 0
$UMOUNT $DIR/$tdir/ext2-mountpoint
fi
remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ ENOSPC=28
EFBIG=27
- MAX=16384
- set_dir_limits $MAX
test_mkdir -p $DIR/$tdir
+ MAX=$(stat -c%s "$DIR/$tdir")
+ set_dir_limits $MAX
local I=0
local J=0
- while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do
+ while [ ! $I -gt $MAX ]; do
$MULTIOP $DIR/$tdir/$J Oc
rc=$?
- if [ $rc -eq $EFBIG ]; then
+ #check two errors ENOSPC for new version of ext4 max_dir_size patch
+ #mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1
+ #and EFBIG for previous versions
+ if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ] && [ $I -gt 0 ]; then
set_dir_limits 0
echo "return code $rc received as expected"
- return 0
+ multiop $DIR/$tdir/$J Oc
+ rc=$?
+ I=$(stat -c%s "$DIR/$tdir")
+ if [ $I -gt $MAX ] && [ $rc -eq 0 ]; then
+ return 0
+ else
+ error_exit "return code $rc current dir size $I " \
+ "previous limit $MAX"
+ fi
elif [ $rc -ne 0 ]; then
set_dir_limits 0
- error_exit "return code $rc received instead of expected $EFBIG"
+ error_exit "return code $rc received instead of expected " \
+ "$EFBIG or $ENOSPC, files in dir $I"
fi
J=$((J+1))
I=$(stat -c%s "$DIR/$tdir")
done
set_dir_limits 0
- error "exceeded dir size limit $MAX x $MDSCOUNT $((MAX * MDSCOUNT)) : $I bytes"
+ error "exceeded dir size limit $MAX x $MDSCOUNT $MAX : $I bytes"
}
run_test 129 "test directory size limit ========================"
}
run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
-test_229() { # LU-2482
+test_229() { # LU-2482, LU-3448
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+
+ rm -f $DIR/$tfile
- # Create a file with a release layout (stripe count = 0)
+ # Create a file with a released layout and stripe count 2.
$MULTIOP $DIR/$tfile H2c ||
- error "failed to create file w. released layout"
+ error "failed to create file with released layout"
$GETSTRIPE -v $DIR/$tfile
[ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
stat $DIR/$tfile || error "failed to stat released file"
- $TRUNCATE $DIR/$tfile 200000
- $CHECKSTAT -s 200000 $DIR/$tfile || error
+ # Truncate should fail.
+ $TRUNCATE $DIR/$tfile 200000 &&
+ error "truncate of released file should fail"
+
+ # Ensure that nothing happened anyway.
+ $CHECKSTAT -s 0 $DIR/$tfile ||
+ error "released file size should not change"
# Stripe count should be no change after truncate
stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe failed"
rm $DIR/$tfile || error "failed to remove released file"
}
-run_test 229 "getstripe/stat/rm work on released files (stripe count = 0)"
+run_test 229 "getstripe/stat/rm work on released files (stripe count = 2)"
test_230a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return