2 # -*- tab-width: 8; indent-tabs-mode: t; -*-
4 # Run select tests by setting ONLY, or as arguments to the script.
5 # Skip specific tests by setting EXCEPT.
7 # e.g. ONLY="22 23" or ONLY="`seq 32 39`" or EXCEPT="31"
11 # bug number for skipped test: LU-9693 LU-6493 LU-9693 LU-11058
12 ALWAYS_EXCEPT="$SANITY_EXCEPT 42a 42b 42c 77k"
13 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
15 # skipped tests: LU-8411 LU-9096 LU-9054 ..
16 ALWAYS_EXCEPT=" 407 253 312 $ALWAYS_EXCEPT"
19 # bug number for skipped tests: LU-9795 (all below)
20 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 17n 60a 133g 300f"
23 if [[ $(uname -m) = aarch64 ]]; then
24 # bug number: LU-11596 (all below)
25 ALWAYS_EXCEPT+=" 42d 42e 63a 63b 64a 64b 64c"
26 # bug number: LU-11671 LU-11665 LU-11594 LU-11667 LU-11729
27 ALWAYS_EXCEPT+=" 45 101c 103a 317 810"
30 # Check Grants after these tests
31 GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c"
32 SRCDIR=$(cd $(dirname $0); echo $PWD)
33 export PATH=$PATH:/sbin
39 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
40 CREATETEST=${CREATETEST:-createtest}
42 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
44 OPENFILE=${OPENFILE:-openfile}
45 OPENUNLINK=${OPENUNLINK:-openunlink}
46 export MULTIOP=${MULTIOP:-multiop}
47 READS=${READS:-"reads"}
48 MUNLINK=${MUNLINK:-munlink}
49 SOCKETSERVER=${SOCKETSERVER:-socketserver}
50 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
51 MEMHOG=${MEMHOG:-memhog}
52 DIRECTIO=${DIRECTIO:-directio}
53 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
55 CHECK_GRANT=${CHECK_GRANT:-"yes"}
56 GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
57 export PARALLEL=${PARALLEL:-"no"}
59 export NAME=${NAME:-local}
66 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
67 LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
68 . $LUSTRE/tests/test-framework.sh
70 . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh}
74 # skip nfs tests on kernels >= 4.14.0 until they are fixed
75 if [ $LINUX_VERSION_CODE -ge $(version_code 4.14.0) ]; then
76 # bug number: LU-12661
80 # skip cgroup tests on RHEL8.1 kernels until they are fixed
81 if (( $LINUX_VERSION_CODE >= $(version_code 4.18.0) &&
82 $LINUX_VERSION_CODE < $(version_code 5.4.0) )); then
83 # bug number: LU-13063
88 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
90 if [ "$mds1_FSTYPE" = "zfs" ]; then
91 # bug number for skipped test:
92 ALWAYS_EXCEPT="$ALWAYS_EXCEPT "
94 [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
97 # Get the SLES distro version
99 # Returns a version string that should only be used in comparing
100 # strings returned by version_code()
103 local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2)
105 # All SuSE Linux versions have one decimal. version_code expects two
106 local sles_version=$version.0
107 version_code $sles_version
110 # Check if we are running on Ubuntu or SLES so we can make decisions on
112 if [ -r /etc/SuSE-release ]; then
113 sles_version=$(sles_version_code)
114 [ $sles_version -lt $(version_code 11.4.0) ] &&
115 # bug number for skipped test: LU-4341
116 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170"
117 [ $sles_version -lt $(version_code 12.0.0) ] &&
118 # bug number for skipped test: LU-3703
119 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234"
120 elif [ -r /etc/os-release ]; then
121 if grep -qi ubuntu /etc/os-release; then
122 ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
123 -e 's/^VERSION=//p' \
127 if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
128 # bug number for skipped test:
130 ALWAYS_EXCEPT+=" 103a 410"
139 pgrep ll_sa > /dev/null && { echo "There are ll_sa thread not exit!"; exit 20; }
140 cleanupall ${FORCE} $* || { echo "FAILed to clean up"; exit 20; }
149 check_swap_layouts_support()
151 $LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
152 skip "Does not support layout lock."
155 check_and_setup_lustre
159 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
161 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
162 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
163 rm -rf $DIR/[Rdfs][0-9]*
165 # $RUNAS_ID may get set incorrectly somewhere else
166 [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] &&
167 error "\$RUNAS_ID set to 0, but \$UID is also 0!"
169 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
173 if [ "${ONLY}" = "MOUNT" ] ; then
174 echo "Lustre is up, please go on"
178 echo "preparing for tests involving mounts"
179 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
181 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
182 echo # add a newline after mke2fs.
186 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
187 lctl set_param debug=-1 2> /dev/null || true
190 $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
192 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
194 run_test 0a "touch; rm ====================="
197 chmod 0755 $DIR || error "chmod 0755 $DIR failed"
198 $CHECKSTAT -p 0755 $DIR || error "$DIR permission is not 0755"
200 run_test 0b "chmod 0755 $DIR ============================="
203 $LCTL get_param mdc.*.import | grep "state: FULL" ||
204 error "import not FULL"
205 $LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" ||
208 run_test 0c "check import proc"
210 test_0d() { # LU-3397
211 [ $MGS_VERSION -lt $(version_code 2.10.57) ] &&
212 skip "proc exports not supported before 2.10.57"
214 local mgs_exp="mgs.MGS.exports"
215 local client_uuid=$($LCTL get_param -n mgc.*.uuid)
217 local exp_client_version
220 local temp_imp=$DIR/$tfile.import
221 local temp_exp=$DIR/$tfile.export
223 # save mgc import file to $temp_imp
224 $LCTL get_param mgc.*.import | tee $temp_imp
225 # Check if client uuid is found in MGS export
226 for exp_client_nid in $(do_facet mgs $LCTL get_param -N $mgs_exp.*); do
227 [ $(do_facet mgs $LCTL get_param -n $exp_client_nid.uuid) == \
231 # save mgs export file to $temp_exp
232 do_facet mgs $LCTL get_param $exp_client_nid.export | tee $temp_exp
234 # Compare the value of field "connect_flags"
235 imp_val=$(grep "connect_flags" $temp_imp)
236 exp_val=$(grep "connect_flags" $temp_exp)
237 [ "$exp_val" == "$imp_val" ] ||
238 error "export flags '$exp_val' != import flags '$imp_val'"
240 # Compare the value of client version
241 exp_client_version=$(awk '/target_version:/ { print $2 }' $temp_exp)
242 exp_val=$(version_code $exp_client_version)
243 imp_val=$CLIENT_VERSION
244 [ "$exp_val" == "$imp_val" ] ||
245 error "export client version '$exp_val' != '$imp_val'"
247 run_test 0d "check export proc ============================="
250 test_mkdir $DIR/$tdir
251 test_mkdir $DIR/$tdir/d2
252 mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
253 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir"
256 $CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed"
258 run_test 1 "mkdir; remkdir; rmdir"
261 test_mkdir $DIR/$tdir
262 touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed"
263 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
265 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed"
267 run_test 2 "mkdir; touch; rmdir; check file"
270 test_mkdir $DIR/$tdir
271 $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
272 touch $DIR/$tdir/$tfile
273 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
275 $CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed"
277 run_test 3 "mkdir; touch; rmdir; check dir"
279 # LU-4471 - failed rmdir on remote directories still removes directory on MDT0
281 test_mkdir -i 1 $DIR/$tdir
283 touch $DIR/$tdir/$tfile ||
284 error "Create file under remote directory failed"
287 error "Expect error removing in-use dir $DIR/$tdir"
289 test -d $DIR/$tdir || error "Remote directory disappeared"
291 rm -rf $DIR/$tdir || error "remove remote dir error"
293 run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
296 test_mkdir $DIR/$tdir
297 test_mkdir $DIR/$tdir/d2
298 chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed"
299 $CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707"
300 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
302 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2"
305 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
306 chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
307 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
308 error "$tfile does not have perm 0666 or UID $UID"
309 $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
310 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
311 error "$tfile should be 0666 and owned by UID $UID"
313 run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
316 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
319 chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
320 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
321 error "$tfile should be owned by UID $RUNAS_ID"
322 $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
323 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
324 error "$tfile should be owned by UID $RUNAS_ID"
326 run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
329 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
332 chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
333 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
334 error "$tfile should be owned by GID $UID"
335 $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
336 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
337 error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
339 run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)"
342 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
344 test_mkdir $DIR/$tdir
345 chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed"
346 $RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
347 chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed"
348 test_mkdir $DIR/$tdir/d/subdir
349 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir ||
350 error "$tdir/d/subdir should be GID $RUNAS_GID"
351 if [[ $MDSCOUNT -gt 1 ]]; then
352 # check remote dir sgid inherite
353 $LFS mkdir -i 0 $DIR/$tdir.local ||
354 error "mkdir $tdir.local failed"
355 chmod g+s $DIR/$tdir.local ||
356 error "chmod $tdir.local failed"
357 chgrp $RUNAS_GID $DIR/$tdir.local ||
358 error "chgrp $tdir.local failed"
359 $LFS mkdir -i 1 $DIR/$tdir.local/$tdir.remote ||
360 error "mkdir $tdir.remote failed"
361 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir.local/$tdir.remote ||
362 error "$tdir.remote should be owned by $UID.$RUNAS_ID"
363 $CHECKSTAT -p 02755 $DIR/$tdir.local/$tdir.remote ||
364 error "$tdir.remote should be mode 02755"
367 run_test 6g "verify new dir in sgid dir inherits group"
369 test_6h() { # bug 7331
370 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
372 touch $DIR/$tfile || error "touch failed"
373 chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile || error "initial chown failed"
374 $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/$tfile &&
375 error "chown $RUNAS_ID:0 $tfile worked as GID $RUNAS_GID"
376 $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile ||
377 error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID"
379 run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)"
382 test_mkdir $DIR/$tdir
383 $MCREATE $DIR/$tdir/$tfile
384 chmod 0666 $DIR/$tdir/$tfile
385 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
386 error "$tdir/$tfile should be mode 0666"
388 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
391 if [ ! -d $DIR/$tdir ]; then
392 test_mkdir $DIR/$tdir
394 $MCREATE $DIR/$tdir/$tfile
395 echo -n foo > $DIR/$tdir/$tfile
396 [ "$(cat $DIR/$tdir/$tfile)" = "foo" ] || error "$tdir/$tfile not 'foo'"
397 $CHECKSTAT -t file -s 3 $DIR/$tdir/$tfile || error "$tfile size not 3"
399 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
402 test_mkdir $DIR/$tdir
403 touch $DIR/$tdir/$tfile
404 chmod 0666 $DIR/$tdir/$tfile
405 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
406 error "$tfile mode not 0666"
408 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
411 test_mkdir $DIR/$tdir
412 test_mkdir $DIR/$tdir/d2
413 test_mkdir $DIR/$tdir/d2/d3
414 $CHECKSTAT -t dir $DIR/$tdir/d2/d3 || error "$tdir/d2/d3 not a dir"
416 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
419 test_mkdir $DIR/$tdir
420 test_mkdir $DIR/$tdir/d2
421 touch $DIR/$tdir/d2/$tfile
422 $CHECKSTAT -t file $DIR/$tdir/d2/$tfile ||
423 error "$tdir/d2/$tfile not a file"
425 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
428 test_mkdir $DIR/$tdir
429 test_mkdir $DIR/$tdir/d2
430 chmod 0666 $DIR/$tdir/d2
431 chmod 0705 $DIR/$tdir/d2
432 $CHECKSTAT -t dir -p 0705 $DIR/$tdir/d2 ||
433 error "$tdir/d2 mode not 0705"
435 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
438 test_mkdir $DIR/$tdir
439 touch $DIR/$tdir/$tfile
440 chmod 0666 $DIR/$tdir/$tfile
441 chmod 0654 $DIR/$tdir/$tfile
442 $CHECKSTAT -t file -p 0654 $DIR/$tdir/$tfile ||
443 error "$tdir/d2 mode not 0654"
445 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
448 test_mkdir $DIR/$tdir
449 dd if=/dev/zero of=$DIR/$tdir/$tfile count=10
451 $CHECKSTAT -t file -s 0 $DIR/$tdir/$tfile ||
452 error "$tdir/$tfile size not 0 after truncate"
454 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
457 test_mkdir $DIR/$tdir
458 touch $DIR/$tdir/$tfile
460 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
462 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
465 test_mkdir $DIR/$tdir
466 touch $DIR/$tdir/$tfile
467 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
468 $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
469 error "$tdir/${tfile_2} not a file after rename"
470 rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
472 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
475 test_mkdir $DIR/$tdir
476 touch $DIR/$tdir/$tfile
477 rm -rf $DIR/$tdir/$tfile
478 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
480 run_test 16 "touch .../d16/f; rm -rf .../d16/f"
483 test_mkdir $DIR/$tdir
484 touch $DIR/$tdir/$tfile
485 ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist
487 $CHECKSTAT -l $DIR/$tdir/$tfile $DIR/$tdir/l-exist ||
488 error "$tdir/l-exist not a symlink"
489 $CHECKSTAT -f -t f $DIR/$tdir/l-exist ||
490 error "$tdir/l-exist not referencing a file"
491 rm -f $DIR/$tdir/l-exist
492 $CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed"
494 run_test 17a "symlinks: create, remove (real)"
497 test_mkdir $DIR/$tdir
498 ln -s no-such-file $DIR/$tdir/l-dangle
500 $CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle ||
501 error "$tdir/l-dangle not referencing no-such-file"
502 $CHECKSTAT -fa $DIR/$tdir/l-dangle ||
503 error "$tdir/l-dangle not referencing non-existent file"
504 rm -f $DIR/$tdir/l-dangle
505 $CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed"
507 run_test 17b "symlinks: create, remove (dangling)"
509 test_17c() { # bug 3440 - don't save failed open RPC for replay
510 test_mkdir $DIR/$tdir
511 ln -s foo $DIR/$tdir/$tfile
512 cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true
514 run_test 17c "symlinks: open dangling (should return error)"
517 test_mkdir $DIR/$tdir
518 ln -s foo $DIR/$tdir/$tfile
519 touch $DIR/$tdir/$tfile || error "creating to new symlink"
521 run_test 17d "symlinks: create dangling"
524 test_mkdir $DIR/$tdir
525 local foo=$DIR/$tdir/$tfile
526 ln -s $foo $foo || error "create symlink failed"
527 ls -l $foo || error "ls -l failed"
528 ls $foo && error "ls not failed" || true
530 run_test 17e "symlinks: create recursive symlink (should return error)"
533 test_mkdir $DIR/$tdir
534 ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
535 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
536 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
537 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
538 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
539 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
542 run_test 17f "symlinks: long and very long symlink name"
544 # str_repeat(S, N) generate a string that is string S repeated N times
549 while [ $((n -= 1)) -ge 0 ]; do
555 # Long symlinks and LU-2241
557 test_mkdir $DIR/$tdir
558 local TESTS="59 60 61 4094 4095"
560 # Fix for inode size boundary in 2.1.4
561 [ $MDS1_VERSION -lt $(version_code 2.1.4) ] &&
564 # Patch not applied to 2.2 or 2.3 branches
565 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
566 [ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
569 # skip long symlink name for rhel6.5.
570 # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
571 grep -q '6.5' /etc/redhat-release &>/dev/null &&
572 TESTS="59 60 61 4062 4063"
575 local SYMNAME=$(str_repeat 'x' $i)
576 ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
577 readlink $DIR/$tdir/f$i || error "failed $i-char readlink"
580 run_test 17g "symlinks: really long symlink name and inode boundaries"
582 test_17h() { #bug 17378
583 [ $PARALLEL == "yes" ] && skip "skip parallel run"
584 remote_mds_nodsh && skip "remote MDS with nodsh"
588 test_mkdir $DIR/$tdir
589 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
590 $LFS setstripe -c -1 $DIR/$tdir
591 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
592 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
593 touch $DIR/$tdir/$tfile || true
595 run_test 17h "create objects: lov_free_memmd() doesn't lbug"
597 test_17i() { #bug 20018
598 [ $PARALLEL == "yes" ] && skip "skip parallel run"
599 remote_mds_nodsh && skip "remote MDS with nodsh"
601 local foo=$DIR/$tdir/$tfile
604 test_mkdir -c1 $DIR/$tdir
605 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
606 ln -s $foo $foo || error "create symlink failed"
607 #define OBD_FAIL_MDS_READLINK_EPROTO 0x143
608 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000143
609 ls -l $foo && error "error not detected"
612 run_test 17i "don't panic on short symlink (should return error)"
614 test_17k() { #bug 22301
615 [ $PARALLEL == "yes" ] && skip "skip parallel run"
616 [[ -z "$(which rsync 2>/dev/null)" ]] &&
617 skip "no rsync command"
618 rsync --help | grep -q xattr ||
619 skip_env "$(rsync --version | head -n1) does not support xattrs"
620 test_mkdir $DIR/$tdir
621 test_mkdir $DIR/$tdir.new
622 touch $DIR/$tdir/$tfile
623 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
624 rsync -av -X $DIR/$tdir/ $DIR/$tdir.new ||
625 error "rsync failed with xattrs enabled"
627 run_test 17k "symlinks: rsync with xattrs enabled"
629 test_17l() { # LU-279
630 [[ -z "$(which getfattr 2>/dev/null)" ]] &&
631 skip "no getfattr command"
633 test_mkdir $DIR/$tdir
634 touch $DIR/$tdir/$tfile
635 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
636 for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
637 # -h to not follow symlinks. -m '' to list all the xattrs.
638 # grep to remove first line: '# file: $path'.
639 for xattr in `getfattr -hm '' $path 2>/dev/null | grep -v '^#'`;
641 lgetxattr_size_check $path $xattr ||
642 error "lgetxattr_size_check $path $xattr failed"
646 run_test 17l "Ensure lgetxattr's returned xattr size is consistent"
650 [ $PARALLEL == "yes" ] && skip "skip parallel run"
651 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
652 remote_mds_nodsh && skip "remote MDS with nodsh"
653 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
654 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
655 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
657 local short_sym="0123456789"
658 local wdir=$DIR/$tdir
663 # create a long symlink file
664 for ((i = 0; i < 4; ++i)); do
665 long_sym=${long_sym}${long_sym}
668 echo "create 512 short and long symlink files under $wdir"
669 for ((i = 0; i < 256; ++i)); do
670 ln -sf ${long_sym}"a5a5" $wdir/long-$i
671 ln -sf ${short_sym}"a5a5" $wdir/short-$i
677 wait_delete_completed
679 echo "recreate the 512 symlink files with a shorter string"
680 for ((i = 0; i < 512; ++i)); do
681 # rewrite the symlink file with a shorter string
682 ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed"
683 ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed"
686 local mds_index=$(($($LFS getstripe -m $wdir) + 1))
687 local devname=$(mdsdevname $mds_index)
689 echo "stop and checking mds${mds_index}:"
690 # e2fsck should not return error
692 run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
695 start mds${mds_index} $devname $MDS_MOUNT_OPTS ||
696 error "start mds${mds_index} failed"
697 df $MOUNT > /dev/null 2>&1
699 error "e2fsck detected error for short/long symlink: rc=$rc"
702 run_test 17m "run e2fsck against MDT which contains short/long symlink"
704 check_fs_consistency_17n() {
708 # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
709 # so it only check MDT1/MDT2 instead of all of MDTs.
710 for mdt_index in 1 2; do
711 local devname=$(mdsdevname $mdt_index)
712 # e2fsck should not return error
714 run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
717 start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
718 error "mount mds$mdt_index failed"
719 df $MOUNT > /dev/null 2>&1
725 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
726 [ $PARALLEL == "yes" ] && skip "skip parallel run"
727 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
728 remote_mds_nodsh && skip "remote MDS with nodsh"
729 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
730 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
731 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
735 test_mkdir $DIR/$tdir
736 for ((i=0; i<10; i++)); do
737 $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
738 error "create remote dir error $i"
739 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
740 error "create files under remote dir failed $i"
743 check_fs_consistency_17n ||
744 error "e2fsck report error after create files under remote dir"
746 for ((i = 0; i < 10; i++)); do
747 rm -rf $DIR/$tdir/remote_dir_${i} ||
748 error "destroy remote dir error $i"
751 check_fs_consistency_17n ||
752 error "e2fsck report error after unlink files under remote dir"
754 [ $MDS1_VERSION -lt $(version_code 2.4.50) ] &&
755 skip "lustre < 2.4.50 does not support migrate mv"
757 for ((i = 0; i < 10; i++)); do
758 mkdir -p $DIR/$tdir/remote_dir_${i}
759 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
760 error "create files under remote dir failed $i"
761 $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
762 error "migrate remote dir error $i"
764 check_fs_consistency_17n || error "e2fsck report error after migration"
766 for ((i = 0; i < 10; i++)); do
767 rm -rf $DIR/$tdir/remote_dir_${i} ||
768 error "destroy remote dir error $i"
771 check_fs_consistency_17n || error "e2fsck report error after unlink"
773 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
776 remote_mds_nodsh && skip "remote MDS with nodsh"
777 [ $MDS1_VERSION -lt $(version_code 2.3.64) ] &&
778 skip "Need MDS version at least 2.3.64"
780 local wdir=$DIR/${tdir}o
786 mdt_index=$($LFS getstripe -m $wdir/$tfile)
787 mdt_index=$((mdt_index + 1))
790 #fail mds will wait the failover finish then set
791 #following fail_loc to avoid interfer the recovery process.
794 #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
795 do_facet mds${mdt_index} lctl set_param fail_loc=0x194
796 ls -l $wdir/$tfile && rc=1
797 do_facet mds${mdt_index} lctl set_param fail_loc=0
798 [[ $rc -eq 0 ]] || error "stat file should fail"
800 run_test 17o "stat file with incompat LMA feature"
803 touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
804 ls $DIR || error "Failed to ls $DIR: $?"
806 run_test 18 "touch .../f ; ls ... =============================="
812 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
814 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
817 ls -l $DIR/$tfile && error "ls -l $tfile failed"|| true
819 run_test 19b "ls -l .../f19 (should return error) =============="
822 [ $RUNAS_ID -eq $UID ] &&
823 skip_env "RUNAS_ID = UID = $UID -- skipping"
825 $RUNAS touch $DIR/$tfile && error "create non-root file failed" || true
827 run_test 19c "$RUNAS touch .../f19 (should return error) =="
830 cat $DIR/f19 && error || true
832 run_test 19d "cat .../f19 (should return error) =============="
841 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
843 run_test 20 "touch .../f ; ls -l ..."
846 test_mkdir $DIR/$tdir
847 [ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle
848 ln -s dangle $DIR/$tdir/link
849 echo foo >> $DIR/$tdir/link
850 cat $DIR/$tdir/dangle
851 $CHECKSTAT -t link $DIR/$tdir/link || error "$tdir/link not a link"
852 $CHECKSTAT -f -t file $DIR/$tdir/link ||
853 error "$tdir/link not linked to a file"
855 run_test 21 "write to dangling link"
858 local wdir=$DIR/$tdir
860 chown $RUNAS_ID:$RUNAS_GID $wdir
861 (cd $wdir || error "cd $wdir failed";
862 $RUNAS tar cf - /etc/hosts /etc/sysconfig/network |
864 ls -lR $wdir/etc || error "ls -lR $wdir/etc failed"
865 $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed"
866 $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc ||
867 error "checkstat -u failed"
869 run_test 22 "unpack tar archive as non-root user"
873 test_mkdir $DIR/$tdir
874 local file=$DIR/$tdir/$tfile
876 openfile -f O_CREAT:O_EXCL $file || error "$file create failed"
877 openfile -f O_CREAT:O_EXCL $file &&
878 error "$file recreate succeeded" || true
880 run_test 23a "O_CREAT|O_EXCL in subdir"
882 test_23b() { # bug 18988
883 test_mkdir $DIR/$tdir
884 local file=$DIR/$tdir/$tfile
887 echo foo > $file || error "write filed"
888 echo bar >> $file || error "append filed"
889 $CHECKSTAT -s 8 $file || error "wrong size"
892 run_test 23b "O_APPEND check"
894 # LU-9409, size with O_APPEND and tiny writes
896 local file=$DIR/$tfile
899 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800
900 $CHECKSTAT -s 6400 $file || error "wrong size, expected 6400"
904 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
905 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
907 $CHECKSTAT -s 12800 $file || error "wrong size, expected 12800"
910 #racing tiny & normal writes
911 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4096 count=4 &
912 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=100 &
914 $CHECKSTAT -s 17184 $file || error "wrong size, expected 17184"
917 #racing tiny & normal writes 2, ugly numbers
918 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4099 count=11 &
919 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=17 count=173 &
921 $CHECKSTAT -s 48030 $file || error "wrong size, expected 48030"
924 run_test 23c "O_APPEND size checks for tiny writes"
926 # LU-11069 file offset is correct after appending writes
928 local file=$DIR/$tfile
931 echo CentaurHauls > $file
932 offset=$($MULTIOP $file oO_WRONLY:O_APPEND:w13Zp)
933 if ((offset != 26)); then
934 error "wrong offset, expected 26, got '$offset'"
937 run_test 23d "file offset is correct after appending writes"
941 echo '-- same directory rename'
942 test_mkdir $DIR/$tdir
943 touch $DIR/$tdir/$tfile.1
944 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
945 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
947 run_test 24a "rename file to non-existent target"
950 test_mkdir $DIR/$tdir
951 touch $DIR/$tdir/$tfile.{1,2}
952 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
953 $CHECKSTAT -a $DIR/$tdir/$tfile.1 || error "$tfile.1 exists"
954 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
956 run_test 24b "rename file to existing target"
959 test_mkdir $DIR/$tdir
960 test_mkdir $DIR/$tdir/d$testnum.1
961 mv $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
962 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
963 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
965 run_test 24c "rename directory to non-existent target"
968 test_mkdir -c1 $DIR/$tdir
969 test_mkdir -c1 $DIR/$tdir/d$testnum.1
970 test_mkdir -c1 $DIR/$tdir/d$testnum.2
971 mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
972 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
973 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
975 run_test 24d "rename directory to existing target"
978 echo '-- cross directory renames --'
982 mv $DIR/R5a/f $DIR/R5b/g
983 $CHECKSTAT -a $DIR/R5a/f || error "$DIR/R5a/f exists"
984 $CHECKSTAT -t file $DIR/R5b/g || error "$DIR/R5b/g not file type"
986 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
991 touch $DIR/R6a/f $DIR/R6b/g
992 mv $DIR/R6a/f $DIR/R6b/g
993 $CHECKSTAT -a $DIR/R6a/f || error "$DIR/R6a/f exists"
994 $CHECKSTAT -t file $DIR/R6b/g || error "$DIR/R6b/g not file type"
996 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
1001 test_mkdir $DIR/R7a/d
1002 mv $DIR/R7a/d $DIR/R7b/e
1003 $CHECKSTAT -a $DIR/R7a/d || error "$DIR/R7a/d exists"
1004 $CHECKSTAT -t dir $DIR/R7b/e || error "$DIR/R7b/e not dir type"
1006 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
1009 test_mkdir -c1 $DIR/R8a
1010 test_mkdir -c1 $DIR/R8b
1011 test_mkdir -c1 $DIR/R8a/d
1012 test_mkdir -c1 $DIR/R8b/e
1013 mrename $DIR/R8a/d $DIR/R8b/e
1014 $CHECKSTAT -a $DIR/R8a/d || error "$DIR/R8a/d exists"
1015 $CHECKSTAT -t dir $DIR/R8b/e || error "$DIR/R8b/e not dir type"
1017 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
1020 echo "-- rename error cases"
1022 test_mkdir $DIR/R9/a
1024 mrename $DIR/R9/f $DIR/R9/a
1025 $CHECKSTAT -t file $DIR/R9/f || error "$DIR/R9/f not file type"
1026 $CHECKSTAT -t dir $DIR/R9/a || error "$DIR/R9/a not dir type"
1027 $CHECKSTAT -a $DIR/R9/a/f || error "$DIR/R9/a/f exists"
1029 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
1033 mrename $DIR/R10/f $DIR/R10/g
1034 $CHECKSTAT -t dir $DIR/R10 || error "$DIR/R10 not dir type"
1035 $CHECKSTAT -a $DIR/R10/f || error "$DIR/R10/f exists"
1036 $CHECKSTAT -a $DIR/R10/g || error "$DIR/R10/g exists"
1038 run_test 24j "source does not exist ============================"
1041 test_mkdir $DIR/R11a
1042 test_mkdir $DIR/R11a/d
1044 mv $DIR/R11a/f $DIR/R11a/d
1045 $CHECKSTAT -a $DIR/R11a/f || error "$DIR/R11a/f exists"
1046 $CHECKSTAT -t file $DIR/R11a/d/f || error "$DIR/R11a/d/f not file type"
1048 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
1050 # bug 2429 - rename foo foo foo creates invalid file
1053 $MULTIOP $f OcNs || error "rename of ${f} to itself failed"
1055 run_test 24l "Renaming a file to itself ========================"
1059 $MULTIOP $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
1060 # on ext3 this does not remove either the source or target files
1061 # though the "expected" operation would be to remove the source
1062 $CHECKSTAT -t file ${f} || error "${f} missing"
1063 $CHECKSTAT -t file ${f}2 || error "${f}2 missing"
1065 run_test 24m "Renaming a file to a hard link to itself ========="
1069 # this stats the old file after it was renamed, so it should fail
1071 $CHECKSTAT ${f} || error "${f} missing"
1073 $CHECKSTAT ${f}.rename || error "${f}.rename missing"
1074 $CHECKSTAT -a ${f} || error "${f} exists"
1076 run_test 24n "Statting the old file after renaming (Posix rename 2)"
1079 test_mkdir $DIR/$tdir
1080 rename_many -s random -v -n 10 $DIR/$tdir
1082 run_test 24o "rename of files during htree split"
1085 test_mkdir $DIR/R12a
1086 test_mkdir $DIR/R12b
1087 DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
1088 mrename $DIR/R12a $DIR/R12b
1089 $CHECKSTAT -a $DIR/R12a || error "$DIR/R12a exists"
1090 $CHECKSTAT -t dir $DIR/R12b || error "$DIR/R12b not dir type"
1091 DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
1092 [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
1094 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
1096 cleanup_multiop_pause() {
1098 kill -USR1 $MULTIPID
1102 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1104 test_mkdir $DIR/R13a
1105 test_mkdir $DIR/R13b
1106 local DIRINO=$(ls -lid $DIR/R13a | awk '{ print $1 }')
1107 multiop_bg_pause $DIR/R13b D_c || error "multiop failed to start"
1110 trap cleanup_multiop_pause EXIT
1111 mrename $DIR/R13a $DIR/R13b
1112 $CHECKSTAT -a $DIR/R13a || error "R13a still exists"
1113 $CHECKSTAT -t dir $DIR/R13b || error "R13b does not exist"
1114 local DIRINO2=$(ls -lid $DIR/R13b | awk '{ print $1 }')
1115 [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
1116 cleanup_multiop_pause
1117 wait $MULTIPID || error "multiop close failed"
1119 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
1121 test_24r() { #bug 3789
1122 test_mkdir $DIR/R14a
1123 test_mkdir $DIR/R14a/b
1124 mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
1125 $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
1126 $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
1128 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
1131 test_mkdir $DIR/R15a
1132 test_mkdir $DIR/R15a/b
1133 test_mkdir $DIR/R15a/b/c
1134 mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
1135 $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
1136 $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
1138 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
1140 test_mkdir $DIR/R16a
1141 test_mkdir $DIR/R16a/b
1142 test_mkdir $DIR/R16a/b/c
1143 mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
1144 $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
1145 $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
1147 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
1149 test_24u() { # bug12192
1150 $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error "multiop failed"
1151 $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
1153 run_test 24u "create stripe file"
1155 simple_cleanup_common() {
1158 [ -z "$DIR" -o -z "$tdir" ] && return 0
1160 local start=$SECONDS
1163 wait_delete_completed
1164 echo "cleanup time $((SECONDS - start))"
1168 max_pages_per_rpc() {
1169 local mdtname="$(printf "MDT%04x" ${1:-0})"
1170 $LCTL get_param -n mdc.*$mdtname*.max_pages_per_rpc
1174 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1176 local nrfiles=${COUNT:-100000}
1177 local fname="$DIR/$tdir/$tfile"
1179 # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
1180 [ "$mds1_FSTYPE" = "zfs" ] && nrfiles=${COUNT:-10000}
1182 test_mkdir "$(dirname $fname)"
1183 # assume MDT0000 has the fewest inodes
1184 local stripes=$($LFS getdirstripe -c $(dirname $fname))
1185 local free_inodes=$(($(mdt_free_inodes 0) * stripes))
1186 [[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
1188 trap simple_cleanup_common EXIT
1190 createmany -m "$fname" $nrfiles
1192 cancel_lru_locks mdc
1193 lctl set_param mdc.*.stats clear
1195 # was previously test_24D: LU-6101
1196 # readdir() returns correct number of entries after cursor reload
1197 local num_ls=$(ls $DIR/$tdir | wc -l)
1198 local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l)
1199 local num_all=$(ls -a $DIR/$tdir | wc -l)
1200 if [ $num_ls -ne $nrfiles -o $num_uniq -ne $nrfiles -o \
1201 $num_all -ne $((nrfiles + 2)) ]; then
1202 error "Expected $nrfiles files, got $num_ls " \
1203 "($num_uniq unique $num_all .&..)"
1205 # LU-5 large readdir
1206 # dirent_size = 32 bytes for sizeof(struct lu_dirent) +
1207 # N bytes for name (len($nrfiles) rounded to 8 bytes) +
1208 # 8 bytes for luda_type (4 bytes rounded to 8 bytes)
1209 # take into account of overhead in lu_dirpage header and end mark in
1210 # each page, plus one in rpc_num calculation.
1211 local dirent_size=$((32 + (${#tfile} | 7) + 1 + 8))
1212 local page_entries=$(((PAGE_SIZE - 24) / dirent_size))
1213 local mdt_idx=$($LFS getdirstripe -i $(dirname $fname))
1214 local rpc_pages=$(max_pages_per_rpc $mdt_idx)
1215 local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
1216 local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
1217 echo "readpages: $mds_readpage rpc_max: $rpc_max"
1218 (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
1219 error "large readdir doesn't take effect: " \
1220 "$mds_readpage should be about $rpc_max"
1222 simple_cleanup_common
1224 run_test 24v "list large directory (test hash collision, b=17560)"
1226 test_24w() { # bug21506
1228 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
1229 dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
1230 dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
1231 SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
1232 [[ "$SZ1" -eq "$SZ2" ]] ||
1233 error "Error reading at the end of the file $tfile"
1235 run_test 24w "Reading a file larger than 4Gb"
1238 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1239 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1240 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1241 skip "Need MDS version at least 2.7.56"
1244 local remote_dir=$DIR/$tdir/remote_dir
1246 test_mkdir $DIR/$tdir
1247 $LFS mkdir -i $MDTIDX $remote_dir ||
1248 error "create remote directory failed"
1250 test_mkdir $DIR/$tdir/src_dir
1251 touch $DIR/$tdir/src_file
1252 test_mkdir $remote_dir/tgt_dir
1253 touch $remote_dir/tgt_file
1255 mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
1256 error "rename dir cross MDT failed!"
1258 mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
1259 error "rename file cross MDT failed!"
1261 touch $DIR/$tdir/ln_file
1262 ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
1263 error "ln file cross MDT failed"
1265 rm -rf $DIR/$tdir || error "Can not delete directories"
1267 run_test 24x "cross MDT rename/link"
1270 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1271 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1273 local remote_dir=$DIR/$tdir/remote_dir
1276 test_mkdir $DIR/$tdir
1277 $LFS mkdir -i $mdtidx $remote_dir ||
1278 error "create remote directory failed"
1280 test_mkdir $remote_dir/src_dir
1281 touch $remote_dir/src_file
1282 test_mkdir $remote_dir/tgt_dir
1283 touch $remote_dir/tgt_file
1285 mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
1286 error "rename subdir in the same remote dir failed!"
1288 mrename $remote_dir/src_file $remote_dir/tgt_file ||
1289 error "rename files in the same remote dir failed!"
1291 ln $remote_dir/tgt_file $remote_dir/tgt_file1 ||
1292 error "link files in the same remote dir failed!"
1294 rm -rf $DIR/$tdir || error "Can not delete directories"
1296 run_test 24y "rename/link on the same dir should succeed"
1299 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1300 [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] &&
1301 skip "Need MDS version at least 2.12.51"
1305 for index in 0 1; do
1306 $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed"
1307 touch $DIR/$tdir.0/$tfile.$index || error "touch failed"
1310 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed"
1312 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0)
1313 [ $index -eq 0 ] || error "$tfile.0 is on MDT$index"
1315 local mdts=$(comma_list $(mdts_nodes))
1317 do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0
1318 stack_trap "do_nodes $mdts $LCTL \
1319 set_param mdt.*.enable_remote_rename=1" EXIT
1321 mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed"
1323 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1)
1324 [ $index -eq 1 ] || error "$tfile.1 is on MDT$index"
1326 run_test 24z "cross-MDT rename is done as cp"
1328 test_24A() { # LU-3182
1332 test_mkdir $DIR/$tdir
1333 trap simple_cleanup_common EXIT
1334 createmany -m $DIR/$tdir/$tfile $NFILES
1335 local t=$(ls $DIR/$tdir | wc -l)
1336 local u=$(ls $DIR/$tdir | sort -u | wc -l)
1337 local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
1338 if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then
1339 error "Expected $NFILES files, got $t ($u unique $v .&..)"
1342 simple_cleanup_common || error "Can not delete directories"
1344 run_test 24A "readdir() returns correct number of entries."
1346 test_24B() { # LU-4805
1347 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1351 test_mkdir $DIR/$tdir
1352 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
1353 error "create striped dir failed"
1355 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1356 [ $count -eq 2 ] || error "Expected 2, got $count"
1358 touch $DIR/$tdir/striped_dir/a
1360 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1361 [ $count -eq 3 ] || error "Expected 3, got $count"
1363 touch $DIR/$tdir/striped_dir/.f
1365 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1366 [ $count -eq 4 ] || error "Expected 4, got $count"
1368 rm -rf $DIR/$tdir || error "Can not delete directories"
1370 run_test 24B "readdir for striped dir return correct number of entries"
1373 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1379 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
1380 error "create striped dir failed"
1382 cd $DIR/$tdir/d0/striped_dir
1384 local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
1385 local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
1386 local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1388 [ "$d0_ino" = "$parent_ino" ] ||
1389 error ".. wrong, expect $d0_ino, get $parent_ino"
1391 mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
1392 error "mv striped dir failed"
1394 parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1396 [ "$d1_ino" = "$parent_ino" ] ||
1397 error ".. wrong after mv, expect $d1_ino, get $parent_ino"
1399 run_test 24C "check .. in striped dir"
1402 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
1403 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1406 mkdir $DIR/$tdir/src_dir
1407 $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
1408 error "create remote source failed"
1410 touch $DIR/$tdir/src_dir/src_child/a
1412 $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
1413 error "create remote target dir failed"
1415 $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
1416 error "create remote target child failed"
1418 mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
1419 error "rename dir cross MDT failed!"
1423 $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
1424 error "src_child still exists after rename"
1426 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
1427 error "missing file(a) after rename"
1429 rm -rf $DIR/$tdir || error "Can not delete directories"
1431 run_test 24E "cross MDT rename/link"
1434 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
1437 [ "$SLOW" = "no" ] && repeats=100
1441 echo "$repeats repeats"
1442 for ((i = 0; i < repeats; i++)); do
1443 $LFS mkdir -i0 -c2 $DIR/$tdir/test || error "mkdir fails"
1444 touch $DIR/$tdir/test/a || error "touch fails"
1445 mkdir $DIR/$tdir/test/b || error "mkdir fails"
1446 rm -rf $DIR/$tdir/test || error "rmdir fails"
1451 run_test 24F "hash order vs readdir (LU-11330)"
1454 echo '== symlink sanity ============================================='
1458 touch $DIR/s25/foo ||
1459 error "File creation in symlinked directory failed"
1461 run_test 25a "create file in symlinked directory ==============="
1464 [ ! -d $DIR/d25 ] && test_25a
1465 $CHECKSTAT -t file $DIR/s25/foo || error "$DIR/s25/foo not file type"
1467 run_test 25b "lookup file in symlinked directory ==============="
1471 test_mkdir $DIR/d26/d26-2
1472 ln -s d26/d26-2 $DIR/s26
1473 touch $DIR/s26/foo || error "File creation failed"
1475 run_test 26a "multiple component symlink ======================="
1478 test_mkdir -p $DIR/$tdir/d26-2
1479 ln -s $tdir/d26-2/foo $DIR/s26-2
1480 touch $DIR/s26-2 || error "File creation failed"
1482 run_test 26b "multiple component symlink at end of lookup ======"
1485 test_mkdir $DIR/d26.2
1486 touch $DIR/d26.2/foo
1487 ln -s d26.2 $DIR/s26.2-1
1488 ln -s s26.2-1 $DIR/s26.2-2
1489 ln -s s26.2-2 $DIR/s26.2-3
1490 chmod 0666 $DIR/s26.2-3/foo
1492 run_test 26c "chain of symlinks"
1494 # recursive symlinks (bug 439)
1496 ln -s d26-3/foo $DIR/d26-3
1498 run_test 26d "create multiple component recursive symlink"
1501 [ ! -h $DIR/d26-3 ] && test_26d
1504 run_test 26e "unlink multiple component recursive symlink"
1506 # recursive symlinks (bug 7022)
1508 test_mkdir $DIR/$tdir
1509 test_mkdir $DIR/$tdir/$tfile
1510 cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed"
1511 test_mkdir -p lndir/bar1
1512 test_mkdir $DIR/$tdir/$tfile/$tfile
1513 cd $tfile || error "cd $tfile failed"
1514 ln -s .. dotdot || error "ln dotdot failed"
1515 ln -s dotdot/lndir lndir || error "ln lndir failed"
1516 cd $DIR/$tdir || error "cd $DIR/$tdir failed"
1517 output=`ls $tfile/$tfile/lndir/bar1`
1518 [ "$output" = bar1 ] && error "unexpected output"
1519 rm -r $tfile || error "rm $tfile failed"
1520 $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
1522 run_test 26f "rm -r of a directory which has recursive symlink"
1525 test_mkdir $DIR/$tdir
1526 $LFS getstripe $DIR/$tdir
1527 $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed"
1528 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1529 cp /etc/hosts $DIR/$tdir/$tfile || error "Can't copy to one stripe file"
1531 run_test 27a "one stripe file"
1534 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1536 test_mkdir $DIR/$tdir
1537 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1538 $LFS getstripe -c $DIR/$tdir/$tfile
1539 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
1540 error "two-stripe file doesn't have two stripes"
1542 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1544 run_test 27b "create and write to two stripe file"
1547 test_mkdir $DIR/$tdir
1548 $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
1549 error "setstripe failed"
1550 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1551 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1553 run_test 27d "create file with default settings"
1556 # LU-5839 adds check for existed layout before setting it
1557 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1558 skip "Need MDS version at least 2.7.56"
1560 test_mkdir $DIR/$tdir
1561 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1562 $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice"
1563 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1565 run_test 27e "setstripe existing file (should return error)"
1568 test_mkdir $DIR/$tdir
1569 $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
1570 error "$SETSTRIPE $DIR/$tdir/$tfile failed"
1571 $CHECKSTAT -t file $DIR/$tdir/$tfile &&
1572 error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
1573 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1574 $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed"
1576 run_test 27f "setstripe with bad stripe size (should return error)"
1579 test_mkdir $DIR/$tdir
1580 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1581 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" ||
1582 error "$DIR/$tdir/$tfile has object"
1584 run_test 27g "$LFS getstripe with no objects"
1587 test_mkdir $DIR/$tdir
1588 touch $DIR/$tdir/$tfile || error "touch failed"
1589 ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed"
1590 $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2
1592 (( rc == 2 )) || error "getstripe did not return ENOENT"
1594 run_test 27ga "$LFS getstripe with missing file (should return error)"
1597 test_mkdir $DIR/$tdir
1598 touch $DIR/$tdir/$tfile || error "touch failed"
1599 [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] ||
1600 error "missing objects"
1602 run_test 27i "$LFS getstripe with some objects"
1605 test_mkdir $DIR/$tdir
1606 $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile &&
1607 error "setstripe failed" || true
1609 run_test 27j "setstripe with bad stripe offset (should return error)"
1611 test_27k() { # bug 2844
1612 test_mkdir $DIR/$tdir
1613 local file=$DIR/$tdir/$tfile
1614 local ll_max_blksize=$((4 * 1024 * 1024))
1615 $LFS setstripe -S 67108864 $file || error "setstripe failed"
1616 local blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1617 [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize"
1618 dd if=/dev/zero of=$file bs=4k count=1
1619 blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1620 [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize"
1622 run_test 27k "limit i_blksize for broken user apps"
1625 mcreate $DIR/$tfile || error "creating file"
1626 $RUNAS $LFS setstripe -c 1 $DIR/$tfile &&
1627 error "setstripe should have failed" || true
1629 run_test 27l "check setstripe permissions (should return error)"
1632 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1634 ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
1636 if [[ $ORIGFREE -gt $MAXFREE ]]; then
1637 skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
1639 trap simple_cleanup_common EXIT
1640 test_mkdir $DIR/$tdir
1641 $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
1642 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
1643 error "dd should fill OST0"
1645 while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do
1647 [ $i -gt 256 ] && break
1650 touch $DIR/$tdir/$tfile.$i
1651 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1652 awk '{print $1}'| grep -w "0") ] &&
1653 error "OST0 was full but new created file still use it"
1655 touch $DIR/$tdir/$tfile.$i
1656 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1657 awk '{print $1}'| grep -w "0") ] &&
1658 error "OST0 was full but new created file still use it"
1659 simple_cleanup_common
1661 run_test 27m "create file while OST0 was full"
1664 local delay=$(do_facet $SINGLEMDS lctl get_param -n lo[vd].*.qos_maxage |
1665 awk '{ print $1 * 2; exit; }')
1669 # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage)
1670 # if the OST isn't full anymore.
1672 local OSTIDX=${1:-""}
1674 local list=$(comma_list $(osts_nodes))
1675 [ "$OSTIDX" ] && list=$(facet_host ost$((OSTIDX + 1)))
1677 do_nodes $list lctl set_param fail_loc=0
1678 sync # initiate all OST_DESTROYs from MDS to OST
1682 exhaust_precreations() {
1685 local FAILIDX=${3:-$OSTIDX}
1686 local ofacet=ost$((OSTIDX + 1))
1688 test_mkdir -p -c1 $DIR/$tdir
1689 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
1690 local mfacet=mds$((mdtidx + 1))
1691 echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
1693 local OST=$(ostname_from_index $OSTIDX)
1696 local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST)
1697 local last_id=$(do_facet $mfacet lctl get_param -n \
1698 osp.$mdtosc_proc1.prealloc_last_id)
1699 local next_id=$(do_facet $mfacet lctl get_param -n \
1700 osp.$mdtosc_proc1.prealloc_next_id)
1702 local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet)
1703 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1705 test_mkdir -p $DIR/$tdir/${OST}
1706 $SETSTRIPE -i $OSTIDX -c 1 $DIR/$tdir/${OST}
1707 #define OBD_FAIL_OST_ENOSPC 0x215
1708 do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215
1709 echo "Creating to objid $last_id on ost $OST..."
1710 createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
1711 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1712 do_facet $ofacet lctl set_param fail_loc=$FAILLOC
1716 exhaust_all_precreations() {
1718 for (( i=0; i < OSTCOUNT; i++ )) ; do
1719 exhaust_precreations $i $1 -1
1724 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1725 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1726 remote_mds_nodsh && skip "remote MDS with nodsh"
1727 remote_ost_nodsh && skip "remote OST with nodsh"
1730 rm -f $DIR/$tdir/$tfile
1731 exhaust_precreations 0 0x80000215
1732 $LFS setstripe -c -1 $DIR/$tdir || error "setstripe failed"
1733 touch $DIR/$tdir/$tfile || error "touch failed"
1734 $LFS getstripe $DIR/$tdir/$tfile
1737 run_test 27n "create file with some full OSTs"
1740 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1741 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1742 remote_mds_nodsh && skip "remote MDS with nodsh"
1743 remote_ost_nodsh && skip "remote OST with nodsh"
1746 rm -f $DIR/$tdir/$tfile
1747 exhaust_all_precreations 0x215
1749 touch $DIR/$tdir/$tfile && error "able to create $DIR/$tdir/$tfile"
1754 run_test 27o "create file with all full OSTs (should error)"
1757 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1758 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1759 remote_mds_nodsh && skip "remote MDS with nodsh"
1760 remote_ost_nodsh && skip "remote OST with nodsh"
1763 rm -f $DIR/$tdir/$tfile
1764 test_mkdir $DIR/$tdir
1766 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1767 $TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed"
1768 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1770 exhaust_precreations 0 0x80000215
1771 echo foo >> $DIR/$tdir/$tfile || error "append failed"
1772 $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed"
1773 $LFS getstripe $DIR/$tdir/$tfile
1777 run_test 27p "append to a truncated file with some full OSTs"
1780 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1781 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1782 remote_mds_nodsh && skip "remote MDS with nodsh"
1783 remote_ost_nodsh && skip "remote OST with nodsh"
1786 rm -f $DIR/$tdir/$tfile
1788 test_mkdir $DIR/$tdir
1789 $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
1790 $TRUNCATE $DIR/$tdir/$tfile 80000000 ||
1791 error "truncate $DIR/$tdir/$tfile failed"
1792 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1794 exhaust_all_precreations 0x215
1796 echo foo >> $DIR/$tdir/$tfile && error "append succeeded"
1797 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat 2 failed"
1801 run_test 27q "append to truncated file with all OSTs full (should error)"
1804 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1805 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1806 remote_mds_nodsh && skip "remote MDS with nodsh"
1807 remote_ost_nodsh && skip "remote OST with nodsh"
1810 rm -f $DIR/$tdir/$tfile
1811 exhaust_precreations 0 0x80000215
1813 $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1817 run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
1819 test_27s() { # bug 10725
1820 test_mkdir $DIR/$tdir
1821 local stripe_size=$((4096 * 1024 * 1024)) # 2^32
1822 local stripe_count=0
1823 [ $OSTCOUNT -eq 1 ] || stripe_count=2
1824 $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir &&
1825 error "stripe width >= 2^32 succeeded" || true
1828 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
1830 test_27t() { # bug 10864
1835 $WLFS getstripe $tfile
1838 run_test 27t "check that utils parse path correctly"
1840 test_27u() { # bug 4900
1841 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1842 remote_mds_nodsh && skip "remote MDS with nodsh"
1845 local list=$(comma_list $(mdts_nodes))
1847 #define OBD_FAIL_MDS_OSC_PRECREATE 0x139
1848 do_nodes $list $LCTL set_param fail_loc=0x139
1849 test_mkdir -p $DIR/$tdir
1850 trap simple_cleanup_common EXIT
1851 createmany -o $DIR/$tdir/t- 1000
1852 do_nodes $list $LCTL set_param fail_loc=0
1854 TLOG=$TMP/$tfile.getstripe
1855 $LFS getstripe $DIR/$tdir > $TLOG
1856 OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
1857 unlinkmany $DIR/$tdir/t- 1000
1859 [[ $OBJS -gt 0 ]] &&
1860 error "$OBJS objects created on OST-0. See $TLOG" ||
1863 run_test 27u "skip object creation on OSC w/o objects"
1865 test_27v() { # bug 4900
1866 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1867 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1868 remote_mds_nodsh && skip "remote MDS with nodsh"
1869 remote_ost_nodsh && skip "remote OST with nodsh"
1871 exhaust_all_precreations 0x215
1874 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1876 touch $DIR/$tdir/$tfile
1877 #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
1879 for (( i=1; i < OSTCOUNT; i++ )); do
1880 do_facet ost$i lctl set_param fail_loc=0x705
1882 local START=`date +%s`
1883 createmany -o $DIR/$tdir/$tfile 32
1885 local FINISH=`date +%s`
1886 local TIMEOUT=`lctl get_param -n timeout`
1887 local PROCESS=$((FINISH - START))
1888 [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
1889 error "$FINISH - $START >= $TIMEOUT / 2"
1890 sleep $((TIMEOUT / 2 - PROCESS))
1893 run_test 27v "skip object creation on slow OST"
1895 test_27w() { # bug 10997
1896 test_mkdir $DIR/$tdir
1897 $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
1898 [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
1899 error "stripe size $size != 65536" || true
1900 [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
1901 error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
1903 run_test 27w "check $LFS setstripe -S and getstrip -d options"
1906 [[ $OSTCOUNT -lt 2 ]] &&
1907 skip_env "skipping multiple stripe count/offset test"
1909 test_mkdir $DIR/$tdir
1910 for i in $(seq 1 $OSTCOUNT); do
1912 $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i ||
1913 error "setstripe -c $i -i $offset failed"
1914 count=$($LFS getstripe -c $DIR/$tdir/f$i)
1915 index=$($LFS getstripe -i $DIR/$tdir/f$i)
1916 [ $count -ne $i ] && error "stripe count $count != $i" || true
1917 [ $index -ne $offset ] &&
1918 error "stripe offset $index != $offset" || true
1921 run_test 27wa "check $LFS setstripe -c -i options"
1924 remote_ost_nodsh && skip "remote OST with nodsh"
1925 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1926 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1928 OFFSET=$(($OSTCOUNT - 1))
1930 local OST=$(ostname_from_index $OSTIDX)
1932 test_mkdir $DIR/$tdir
1933 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file
1934 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1
1936 createmany -o $DIR/$tdir/$tfile $OSTCOUNT
1937 for i in $(seq 0 $OFFSET); do
1938 [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx |
1939 awk '{print $1}' | grep -w "$OSTIDX") ] &&
1940 error "OST0 was degraded but new created file still use it"
1942 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0
1944 run_test 27x "create files while OST0 is degraded"
1947 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1948 remote_mds_nodsh && skip "remote MDS with nodsh"
1949 remote_ost_nodsh && skip "remote OST with nodsh"
1950 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1952 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
1953 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
1954 osp.$mdtosc.prealloc_last_id)
1955 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
1956 osp.$mdtosc.prealloc_next_id)
1957 local fcount=$((last_id - next_id))
1958 [[ $fcount -eq 0 ]] && skip "not enough space on OST0"
1959 [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
1961 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
1962 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
1963 local OST_DEACTIVE_IDX=-1
1968 for OSC in $MDS_OSCS; do
1969 OST=$(osc_to_ost $OSC)
1970 OSTIDX=$(index_from_ostuuid $OST)
1971 if [ $OST_DEACTIVE_IDX == -1 ]; then
1972 OST_DEACTIVE_IDX=$OSTIDX
1974 if [ $OSTIDX != $OST_DEACTIVE_IDX ]; then
1975 echo $OSC "is Deactivated:"
1976 do_facet $SINGLEMDS lctl --device %$OSC deactivate
1980 OSTIDX=$(index_from_ostuuid $OST)
1981 test_mkdir $DIR/$tdir
1982 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1984 for OSC in $MDS_OSCS; do
1985 OST=$(osc_to_ost $OSC)
1986 OSTIDX=$(index_from_ostuuid $OST)
1987 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
1988 echo $OST "is degraded:"
1989 do_facet ost$((OSTIDX+1)) lctl set_param -n \
1990 obdfilter.$OST.degraded=1
1995 createmany -o $DIR/$tdir/$tfile $fcount
1997 for OSC in $MDS_OSCS; do
1998 OST=$(osc_to_ost $OSC)
1999 OSTIDX=$(index_from_ostuuid $OST)
2000 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
2001 echo $OST "is recovered from degraded:"
2002 do_facet ost$((OSTIDX+1)) lctl set_param -n \
2003 obdfilter.$OST.degraded=0
2005 do_facet $SINGLEMDS lctl --device %$OSC activate
2009 # all osp devices get activated, hence -1 stripe count restored
2010 local stripe_count=0
2012 # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp
2013 # devices get activated.
2015 $LFS setstripe -c -1 $DIR/$tfile
2016 stripe_count=$($LFS getstripe -c $DIR/$tfile)
2018 [ $stripe_count -ne $OSTCOUNT ] &&
2019 error "Of $OSTCOUNT OSTs, only $stripe_count is available"
2022 run_test 27y "create files while OST0 is degraded and the rest inactive"
2028 lmm_count=$($GETSTRIPE -c $1)
2029 lmm_seq=$($GETSTRIPE -v $1 | awk '/lmm_seq/ { print $2 }')
2030 lmm_oid=$($GETSTRIPE -v $1 | awk '/lmm_object_id/ { print $2 }')
2032 local old_ifs="$IFS"
2034 fid=($($LFS path2fid $1))
2037 log "FID seq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}"
2038 log "LOV seq $lmm_seq, oid $lmm_oid, count: $lmm_count"
2040 # compare lmm_seq and lu_fid->f_seq
2041 [ $lmm_seq = ${fid[1]} ] || { error "SEQ mismatch"; return 1; }
2042 # compare lmm_object_id and lu_fid->oid
2043 [ $lmm_oid = ${fid[2]} ] || { error "OID mismatch"; return 2; }
2045 # check the trusted.fid attribute of the OST objects of the file
2046 local have_obdidx=false
2048 $GETSTRIPE $1 | while read obdidx oid hex seq; do
2049 # skip lines up to and including "obdidx"
2050 [ -z "$obdidx" ] && break
2051 [ "$obdidx" = "obdidx" ] && have_obdidx=true && continue
2052 $have_obdidx || continue
2054 local ost=$((obdidx + 1))
2055 local dev=$(ostdevname $ost)
2058 log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
2060 seq=$(echo $seq | sed -e "s/^0x//g")
2061 if [ $seq == 0 ] || [ $(facet_fstype ost$ost) == zfs ]; then
2062 oid_hex=$(echo $oid)
2064 oid_hex=$(echo $hex | sed -e "s/^0x//g")
2066 local obj_file="O/$seq/d$((oid %32))/$oid_hex"
2070 # Don't unmount/remount the OSTs if we don't need to do that.
2071 # LU-2577 changes filter_fid to be smaller, so debugfs needs
2072 # update too, until that use mount/ll_decode_filter_fid/mount.
2073 # Re-enable when debugfs will understand new filter_fid.
2075 if [ $(facet_fstype ost$ost) == ldiskfs ]; then
2076 ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
2077 $dev 2>/dev/null" | grep "parent=")
2079 if [ -z "$ff" ]; then
2081 mount_fstype ost$ost
2082 ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
2083 $(facet_mntpt ost$ost)/$obj_file)
2084 unmount_fstype ost$ost
2085 start ost$ost $dev $OST_MOUNT_OPTS
2089 [ -z "$ff" ] && error "$obj_file: no filter_fid info"
2091 echo "$ff" | sed -e 's#.*objid=#got: objid=#'
2093 # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
2094 # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
2096 # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \
2097 # stripe_size=1048576 component_id=1 component_start=0 \
2098 # component_end=33554432
2099 local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff)
2100 local ff_pseq=$(cut -d: -f1 <<<$ff_parent)
2101 local ff_poid=$(cut -d: -f2 <<<$ff_parent)
2103 if grep -q 'stripe=' <<<$ff; then
2104 ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff)
2106 # $LL_DECODE_FILTER_FID does not print "stripe="; look
2107 # into f_ver in this case. See comment on ff_parent.
2108 ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//')
2111 # compare lmm_seq and filter_fid->ff_parent.f_seq
2112 [ $ff_pseq = $lmm_seq ] ||
2113 error "FF parent SEQ $ff_pseq != $lmm_seq"
2114 # compare lmm_object_id and filter_fid->ff_parent.f_oid
2115 [ $ff_poid = $lmm_oid ] ||
2116 error "FF parent OID $ff_poid != $lmm_oid"
2117 (($ff_pstripe == $stripe_nr)) ||
2118 error "FF stripe $ff_pstripe != $stripe_nr"
2120 stripe_nr=$((stripe_nr + 1))
2121 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2123 if grep -q 'stripe_count=' <<<$ff; then
2124 local ff_scnt=$(sed -e 's/.*stripe_count=//' \
2125 -e 's/ .*//' <<<$ff)
2126 [ $lmm_count = $ff_scnt ] ||
2127 error "FF stripe count $lmm_count != $ff_scnt"
2133 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2134 remote_ost_nodsh && skip "remote OST with nodsh"
2136 test_mkdir $DIR/$tdir
2137 $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
2138 { error "setstripe -c -1 failed"; return 1; }
2139 # We need to send a write to every object to get parent FID info set.
2140 # This _should_ also work for setattr, but does not currently.
2141 # touch $DIR/$tdir/$tfile-1 ||
2142 dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
2143 { error "dd $tfile-1 failed"; return 2; }
2144 $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
2145 { error "setstripe -c -1 failed"; return 3; }
2146 dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
2147 { error "dd $tfile-2 failed"; return 4; }
2149 # make sure write RPCs have been sent to OSTs
2152 check_seq_oid $DIR/$tdir/$tfile-1 || return 5
2153 check_seq_oid $DIR/$tdir/$tfile-2 || return 6
2155 run_test 27z "check SEQ/OID on the MDT and OST filesystems"
2157 test_27A() { # b=19102
2158 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2160 save_layout_restore_at_exit $MOUNT
2161 $LFS setstripe -c 0 -i -1 -S 0 $MOUNT
2162 wait_update $HOSTNAME "$GETSTRIPE -c $MOUNT | sed 's/ *//g'" "1" 20 ||
2163 error "stripe count $($GETSTRIPE -c $MOUNT) != 1"
2164 local default_size=$($GETSTRIPE -S $MOUNT)
2165 local default_offset=$($GETSTRIPE -i $MOUNT)
2166 local dsize=$(do_facet $SINGLEMDS \
2167 "$LCTL get_param -n lod.$(facet_svc $SINGLEMDS)*.stripesize")
2168 [ $default_size -eq $dsize ] ||
2169 error "stripe size $default_size != $dsize"
2170 [ $default_offset -eq -1 ] ||
2171 error "stripe offset $default_offset != -1"
2173 run_test 27A "check filesystem-wide default LOV EA values"
2175 test_27B() { # LU-2523
2176 test_mkdir $DIR/$tdir
2177 rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
2179 # open f1 with O_LOV_DELAY_CREATE
2181 # call setstripe ioctl on open file descriptor for f1
2183 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:nB1c \
2187 # open f1 with O_LOV_DELAY_CREATE
2189 # call setstripe ioctl on open file descriptor for f1
2191 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:uB1c
2193 # Allow multiop to fail in imitation of NFS's busted semantics.
2196 run_test 27B "call setstripe on open unlinked file/rename victim"
2198 test_27C() { #LU-2871
2199 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2207 test_mkdir $DIR/$tdir
2209 for i in $(seq 0 $((OSTCOUNT - 1))); do
2210 # set stripe across all OSTs starting from OST$i
2211 $SETSTRIPE -i $i -c -1 $tfile$i
2212 # get striping information
2213 ost_idx=($($GETSTRIPE $tfile$i |
2214 tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
2218 [ ${#ost_idx[@]} -eq $OSTCOUNT ] ||
2219 error "${#ost_idx[@]} != $OSTCOUNT"
2221 for index in $(seq 0 $((OSTCOUNT - 1))); do
2223 for j in $(echo ${ost_idx[@]}); do
2224 if [ $index -eq $j ]; then
2230 error "Can not find $index in ${ost_idx[@]}"
2234 run_test 27C "check full striping across all OSTs"
2237 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2238 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2239 remote_mds_nodsh && skip "remote MDS with nodsh"
2241 local POOL=${POOL:-testpool}
2243 local last_ost=$(($OSTCOUNT - 1))
2245 local ost_list=$(seq $first_ost $ost_step $last_ost)
2246 local ost_range="$first_ost $last_ost $ost_step"
2248 test_mkdir $DIR/$tdir
2249 pool_add $POOL || error "pool_add failed"
2250 pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
2253 [ $MDS1_VERSION -lt $(version_code 2.8.55) ] &&
2255 [ $MDS1_VERSION -lt $(version_code 2.9.55) -o \
2256 $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2257 skip27D+=" -s 30,31"
2258 llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
2259 error "llapi_layout_test failed"
2261 destroy_test_pools || error "destroy test pools failed"
2263 run_test 27D "validate llapi_layout API"
2265 # Verify that default_easize is increased from its initial value after
2266 # accessing a widely striped file.
2268 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2269 [ $CLIENT_VERSION -lt $(version_code 2.5.57) ] &&
2270 skip "client does not have LU-3338 fix"
2272 # 72 bytes is the minimum space required to store striping
2273 # information for a file striped across one OST:
2274 # (sizeof(struct lov_user_md_v3) +
2275 # sizeof(struct lov_user_ost_data_v1))
2277 $LCTL set_param -n llite.*.default_easize $min_easize ||
2278 error "lctl set_param failed"
2279 local easize=$($LCTL get_param -n llite.*.default_easize)
2281 [ $easize -eq $min_easize ] ||
2282 error "failed to set default_easize"
2284 $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
2285 error "setstripe failed"
2289 easize=$($LCTL get_param -n llite.*.default_easize)
2291 [ $easize -gt $min_easize ] ||
2292 error "default_easize not updated"
2294 run_test 27E "check that default extended attribute size properly increases"
2296 test_27F() { # LU-5346/LU-7975
2297 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2298 [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs"
2299 [[ $MDS1_VERSION -lt $(version_code 2.8.51) ]] &&
2300 skip "Need MDS version at least 2.8.51"
2301 remote_ost_nodsh && skip "remote OST with nodsh"
2303 test_mkdir $DIR/$tdir
2305 $SETSTRIPE -c 2 $DIR/$tdir
2307 # stop all OSTs to reproduce situation for LU-7975 ticket
2308 for num in $(seq $OSTCOUNT); do
2312 # open/create f0 with O_LOV_DELAY_CREATE
2313 # truncate f0 to a non-0 size
2315 multiop $DIR/$tdir/f0 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T1050000c
2317 $CHECKSTAT -s 1050000 $DIR/$tdir/f0 || error "checkstat failed"
2318 # open/write it again to force delayed layout creation
2319 cat /etc/hosts > $DIR/$tdir/f0 &
2323 for num in $(seq $OSTCOUNT); do
2324 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS ||
2325 error "ost$num failed to start"
2328 wait $catpid || error "cat failed"
2330 cmp /etc/hosts $DIR/$tdir/f0 || error "cmp failed"
2331 [[ $($GETSTRIPE -c $DIR/$tdir/f0) == 2 ]] || error "wrong stripecount"
2334 run_test 27F "Client resend delayed layout creation with non-zero size"
2336 test_27G() { #LU-10629
2337 [ $MDS1_VERSION -lt $(version_code 2.11.51) ] &&
2338 skip "Need MDS version at least 2.11.51"
2339 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2340 remote_mds_nodsh && skip "remote MDS with nodsh"
2341 local POOL=${POOL:-testpool}
2342 local ostrange="0 0 1"
2344 test_mkdir $DIR/$tdir
2345 pool_add $POOL || error "pool_add failed"
2346 pool_add_targets $POOL $ostrange || error "pool_add_targets failed"
2347 $LFS setstripe -p $POOL $DIR/$tdir
2349 local pool=$($LFS getstripe -p $DIR/$tdir)
2351 [ "$pool" = "$POOL" ] || error "Striping failed got '$pool' not '$POOL'"
2353 $LFS setstripe -d $DIR/$tdir
2355 pool=$($LFS getstripe -p $DIR/$tdir)
2359 [ -z "$pool" ] || error "'$pool' is not empty"
2361 run_test 27G "Clear OST pool from stripe"
2364 [[ $MDS1_VERSION -le $(version_code 2.11.54) ]] &&
2365 skip "Need MDS version newer than 2.11.54"
2366 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
2367 test_mkdir $DIR/$tdir
2368 $LFS setstripe -o 0 -o 2 $DIR/$tdir || error "setstripe failed"
2369 touch $DIR/$tdir/$tfile
2370 $LFS getstripe -c $DIR/$tdir/$tfile
2371 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
2372 error "two-stripe file doesn't have two stripes"
2374 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
2375 $LFS getstripe -y $DIR/$tdir/$tfile
2376 (( $($LFS getstripe -y $DIR/$tdir/$tfile |
2377 egrep -c "l_ost_idx: [02]$") == "2" )) ||
2378 error "expected l_ost_idx: [02]$ not matched"
2380 # make sure ost list have been cleared
2381 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
2382 $LFS setstripe -S $((stripesize * 4)) -i 1 \
2383 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
2385 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
2387 run_test 27H "Set specific OSTs stripe"
2390 [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.12.57) ]] &&
2391 skip "Need MDS version >= than 2.12.57"
2392 remote_mds_nodsh && skip "remote MDS with nodsh"
2393 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2395 test_mkdir $DIR/$tdir
2397 # Set default striping on directory
2398 $LFS setstripe -C 4 $DIR/$tdir
2400 echo 1 > $DIR/$tdir/${tfile}.1
2401 local count=$($LFS getstripe -c $DIR/$tdir/${tfile}.1)
2403 [ $count -eq $setcount ] ||
2404 error "(1) stripe count $count, should be $setcount"
2406 # Capture existing append_stripe_count setting for restore
2407 local orig_count=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_stripe_count)
2408 local mdts=$(comma_list $(mdts_nodes))
2409 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=$orig_count" EXIT
2411 local appendcount=$orig_count
2412 echo 1 >> $DIR/$tdir/${tfile}.2_append
2413 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.2_append)
2414 [ $count -eq $appendcount ] ||
2415 error "(2)stripe count $count, should be $appendcount for append"
2417 # Disable O_APPEND striping, verify it works
2418 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2420 # Should now get the default striping, which is 4
2422 echo 1 >> $DIR/$tdir/${tfile}.3_append
2423 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.3_append)
2424 [ $count -eq $setcount ] ||
2425 error "(3) stripe count $count, should be $setcount"
2427 # Try changing the stripe count for append files
2428 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=2
2430 # Append striping is now 2 (directory default is still 4)
2432 echo 1 >> $DIR/$tdir/${tfile}.4_append
2433 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.4_append)
2434 [ $count -eq $appendcount ] ||
2435 error "(4) stripe count $count, should be $appendcount for append"
2437 # Test append stripe count of -1
2438 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=-1
2439 appendcount=$OSTCOUNT
2440 echo 1 >> $DIR/$tdir/${tfile}.5
2441 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.5)
2442 [ $count -eq $appendcount ] ||
2443 error "(5) stripe count $count, should be $appendcount for append"
2445 # Set append striping back to default of 1
2446 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=1
2448 # Try a new default striping, PFL + DOM
2449 $LFS setstripe -L mdt -E 1M -E -1 -c 2 $DIR/$tdir
2451 # Create normal DOM file, DOM returns stripe count == 0
2453 touch $DIR/$tdir/${tfile}.6
2454 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.6)
2455 [ $count -eq $setcount ] ||
2456 error "(6) stripe count $count, should be $setcount"
2460 echo 1 >> $DIR/$tdir/${tfile}.7_append
2461 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.7_append)
2462 [ $count -eq $appendcount ] ||
2463 error "(7) stripe count $count, should be $appendcount for append"
2465 # Clean up DOM layout
2466 $LFS setstripe -d $DIR/$tdir
2468 # Now test that append striping works when layout is from root
2469 $LFS setstripe -c 2 $MOUNT
2470 # Make a special directory for this
2471 mkdir $DIR/${tdir}/${tdir}.2
2472 stack_trap "$LFS setstripe -d $MOUNT" EXIT
2474 # Verify for normal file
2476 echo 1 > $DIR/${tdir}/${tdir}.2/${tfile}.8
2477 count=$($LFS getstripe -c $DIR/$tdir/${tdir}.2/${tfile}.8)
2478 [ $count -eq $setcount ] ||
2479 error "(8) stripe count $count, should be $setcount"
2482 echo 1 >> $DIR/${tdir}/${tdir}.2/${tfile}.9_append
2483 count=$($LFS getstripe -c $DIR/${tdir}/${tdir}.2/${tfile}.9_append)
2484 [ $count -eq $appendcount ] ||
2485 error "(9) stripe count $count, should be $appendcount for append"
2487 # Now test O_APPEND striping with pools
2488 do_nodes $mdts $LCTL set_param mdd.*.append_pool="$TESTNAME"
2489 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'" EXIT
2492 pool_add $TESTNAME || error "pool creation failed"
2493 pool_add_targets $TESTNAME 0 1 || error "Pool add targets failed"
2495 echo 1 >> $DIR/$tdir/${tfile}.10_append
2497 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.10_append)
2498 [ "$pool" = "$TESTNAME" ] || error "(10) incorrect pool: $pool"
2500 # Check that count is still correct
2502 echo 1 >> $DIR/$tdir/${tfile}.11_append
2503 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.11_append)
2504 [ $count -eq $appendcount ] ||
2505 error "(11) stripe count $count, should be $appendcount for append"
2507 # Disable O_APPEND stripe count, verify pool works separately
2508 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2510 echo 1 >> $DIR/$tdir/${tfile}.12_append
2512 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.12_append)
2513 [ "$pool" = "$TESTNAME" ] || error "(12) incorrect pool: $pool"
2515 # Remove pool setting, verify it's not applied
2516 do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'
2518 echo 1 >> $DIR/$tdir/${tfile}.13_append
2520 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.13_append)
2521 [ "$pool" = "" ] || error "(13) pool found: $pool"
2523 run_test 27M "test O_APPEND striping"
2525 # createtest also checks that device nodes are created and
2526 # then visible correctly (#2091)
2527 test_28() { # bug 2091
2529 $CREATETEST $DIR/d28/ct || error "createtest failed"
2531 run_test 28 "create/mknod/mkdir with bad file types ============"
2534 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2536 sync; sleep 1; sync # flush out any dirty pages from previous tests
2543 declare -i LOCKCOUNTORIG=0
2544 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2545 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
2547 [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
2549 declare -i LOCKUNUSEDCOUNTORIG=0
2550 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2551 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
2558 declare -i LOCKCOUNTCURRENT=0
2559 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2560 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
2563 declare -i LOCKUNUSEDCOUNTCURRENT=0
2564 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2565 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
2568 if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
2569 $LCTL set_param -n ldlm.dump_namespaces ""
2570 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
2571 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2572 log "dumped log to $TMP/test_29.dk (bug 5793)"
2575 if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
2576 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
2577 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2578 log "dumped log to $TMP/test_29.dk (bug 5793)"
2582 run_test 29 "IT_GETATTR regression ============================"
2584 test_30a() { # was test_30
2585 cp $(which ls) $DIR || cp /bin/ls $DIR
2586 $DIR/ls / || error "Can't execute binary from lustre"
2589 run_test 30a "execute binary from Lustre (execve) =============="
2592 cp `which ls` $DIR || cp /bin/ls $DIR
2594 $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
2597 run_test 30b "execute binary from Lustre as non-root ==========="
2599 test_30c() { # b=22376
2600 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2602 cp `which ls` $DIR || cp /bin/ls $DIR
2604 cancel_lru_locks mdc
2605 cancel_lru_locks osc
2606 $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
2609 run_test 30c "execute binary from Lustre without read perms ===="
2612 $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
2613 $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
2615 run_test 31a "open-unlink file =================================="
2618 touch $DIR/f31 || error "touch $DIR/f31 failed"
2619 ln $DIR/f31 $DIR/f31b || error "ln failed"
2620 $MULTIOP $DIR/f31b Ouc || error "multiop failed"
2621 $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
2623 run_test 31b "unlink file with multiple links while open ======="
2626 touch $DIR/f31 || error "touch $DIR/f31 failed"
2627 ln $DIR/f31 $DIR/f31c || error "ln failed"
2628 multiop_bg_pause $DIR/f31 O_uc ||
2629 error "multiop_bg_pause for $DIR/f31 failed"
2631 $MULTIOP $DIR/f31c Ouc
2632 kill -USR1 $MULTIPID
2635 run_test 31c "open-unlink file with multiple links ============="
2638 opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
2639 $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
2641 run_test 31d "remove of open directory ========================="
2643 test_31e() { # bug 2904
2644 openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
2646 run_test 31e "remove of open non-empty directory ==============="
2648 test_31f() { # bug 4554
2649 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2652 test_mkdir $DIR/d31f
2653 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2654 cp /etc/hosts $DIR/d31f
2656 $GETSTRIPE $DIR/d31f/hosts
2657 multiop_bg_pause $DIR/d31f D_c || return 1
2660 rm -rv $DIR/d31f || error "first of $DIR/d31f"
2661 test_mkdir $DIR/d31f
2662 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2663 cp /etc/hosts $DIR/d31f
2665 $GETSTRIPE $DIR/d31f/hosts
2666 multiop_bg_pause $DIR/d31f D_c || return 1
2669 kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
2670 wait $MULTIPID || error "first opendir $MULTIPID failed"
2674 kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
2675 wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
2678 run_test 31f "remove of open directory with open-unlink file ==="
2681 echo "-- cross directory link --"
2682 test_mkdir -c1 $DIR/${tdir}ga
2683 test_mkdir -c1 $DIR/${tdir}gb
2684 touch $DIR/${tdir}ga/f
2685 ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
2686 $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
2687 [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
2688 $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
2689 [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
2691 run_test 31g "cross directory link==============="
2694 echo "-- cross directory link --"
2695 test_mkdir -c1 $DIR/${tdir}
2696 test_mkdir -c1 $DIR/${tdir}/dir
2697 touch $DIR/${tdir}/f
2698 ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
2699 $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
2700 [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
2701 $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
2702 [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
2704 run_test 31h "cross directory link under child==============="
2707 echo "-- cross directory link --"
2708 test_mkdir -c1 $DIR/$tdir
2709 test_mkdir -c1 $DIR/$tdir/dir
2710 touch $DIR/$tdir/dir/f
2711 ln $DIR/$tdir/dir/f $DIR/$tdir/g
2712 $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
2713 [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
2714 $CHECKSTAT -t file $DIR/$tdir/g || error "target"
2715 [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
2717 run_test 31i "cross directory link under parent==============="
2720 test_mkdir -c1 -p $DIR/$tdir
2721 test_mkdir -c1 -p $DIR/$tdir/dir1
2722 ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
2723 link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
2724 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
2725 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
2728 run_test 31j "link for directory==============="
2731 test_mkdir -c1 -p $DIR/$tdir
2733 touch $DIR/$tdir/exist
2734 mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
2735 mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
2736 mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
2737 mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
2738 mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
2739 mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
2740 mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
2743 run_test 31k "link to file: the same, non-existing, dir==============="
2749 touch $DIR/d31m2/exist
2750 mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
2751 mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
2752 mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
2753 mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
2754 mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
2755 mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
2758 run_test 31m "link to file: the same, non-existing, dir==============="
2761 touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
2762 nlink=$(stat --format=%h $DIR/$tfile)
2763 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2765 local cmd="exec $fd<$DIR/$tfile"
2768 trap "eval $cmd" EXIT
2769 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2770 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2771 rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
2772 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2773 [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
2776 run_test 31n "check link count of unlinked file"
2779 local TEMPNAME=$(mktemp $1_XXXXXX)
2780 mlink $TEMPNAME $1 2> /dev/null &&
2781 echo "$BASHPID: link $TEMPNAME to $1 succeeded"
2785 test_31o() { # LU-2901
2786 test_mkdir $DIR/$tdir
2787 for LOOP in $(seq 100); do
2788 rm -f $DIR/$tdir/$tfile*
2789 for THREAD in $(seq 8); do
2790 link_one $DIR/$tdir/$tfile.$LOOP &
2793 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
2794 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
2795 error "$LINKS duplicate links to $tfile.$LOOP" &&
2799 run_test 31o "duplicate hard links with same filename"
2802 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
2804 test_mkdir $DIR/$tdir
2805 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
2806 $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
2808 opendirunlink $DIR/$tdir/striped_dir/test1 ||
2809 error "open unlink test1 failed"
2810 opendirunlink $DIR/$tdir/striped_dir/test2 ||
2811 error "open unlink test2 failed"
2813 $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
2814 error "test1 still exists"
2815 $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
2816 error "test2 still exists"
2818 run_test 31p "remove of open striped directory"
2820 cleanup_test32_mount() {
2823 local loopdev=$(losetup -a | grep $EXT2_DEV | sed -ne 's/:.*$//p')
2824 $UMOUNT $DIR/$tdir/ext2-mountpoint || rc=$?
2825 losetup -d $loopdev || true
2831 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2833 echo "== more mountpoints and symlinks ================="
2834 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2835 trap cleanup_test32_mount EXIT
2836 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2837 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2838 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2839 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/.. ||
2840 error "$DIR/$tdir/ext2-mountpoint/.. not dir type"
2841 cleanup_test32_mount
2843 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
2846 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2848 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2849 trap cleanup_test32_mount EXIT
2850 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2851 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2852 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2853 ls -al $DIR/$tdir/ext2-mountpoint/.. ||
2854 error "Can't list $DIR/$tdir/ext2-mountpoint/.."
2855 cleanup_test32_mount
2857 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
2860 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2862 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2863 trap cleanup_test32_mount EXIT
2864 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2865 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2866 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2867 test_mkdir -p $DIR/$tdir/d2/test_dir
2868 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2869 error "$DIR/$tdir/ext2-mountpoint/../d2/test_dir not dir type"
2870 cleanup_test32_mount
2872 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
2875 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2877 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2878 trap cleanup_test32_mount EXIT
2879 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2880 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2881 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2882 test_mkdir -p $DIR/$tdir/d2/test_dir
2883 ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2884 error "Can't list $DIR/$tdir/ext2-mountpoint/../d2/test_dir"
2885 cleanup_test32_mount
2887 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
2891 test_mkdir -p $DIR/$tdir/tmp
2892 local tmp_dir=$DIR/$tdir/tmp
2893 ln -s $DIR/$tdir $tmp_dir/symlink11
2894 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2895 $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2896 $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
2898 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
2902 test_mkdir -p $DIR/$tdir/tmp
2903 local tmp_dir=$DIR/$tdir/tmp
2904 ln -s $DIR/$tdir $tmp_dir/symlink11
2905 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2906 ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2907 ls $DIR/$tdir/symlink01 || error "symlink01 bad"
2909 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
2912 local tmp_dir=$DIR/$tdir/tmp
2913 test_mkdir -p $tmp_dir
2914 test_mkdir $DIR/${tdir}2
2915 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2916 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2917 $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
2918 $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
2919 $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
2920 $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
2922 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2925 rm -fr $DIR/$tdir $DIR/${tdir}2
2926 tmp_dir=$DIR/$tdir/tmp
2927 test_mkdir -p $tmp_dir
2928 test_mkdir $DIR/${tdir}2
2929 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2930 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2931 ls $tmp_dir/symlink12 || error "listing symlink12"
2932 ls $DIR/$tdir/symlink02 || error "listing symlink02"
2934 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2937 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2939 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2940 trap cleanup_test32_mount EXIT
2941 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2942 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2943 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2944 touch $DIR/$tdir/test_file
2945 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../test_file ||
2946 error "$DIR/$tdir/ext2-mountpoint/../test_file not file type"
2947 cleanup_test32_mount
2949 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
2952 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2954 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2955 trap cleanup_test32_mount EXIT
2956 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2957 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2958 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2959 touch $DIR/$tdir/test_file
2960 cat $DIR/$tdir/ext2-mountpoint/../test_file ||
2961 error "Can't open $DIR/$tdir/ext2-mountpoint/../test_file"
2962 cleanup_test32_mount
2964 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
2967 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2970 trap cleanup_test32_mount EXIT
2971 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2972 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2973 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2974 test_mkdir -p $DIR/$tdir/d2
2975 touch $DIR/$tdir/d2/test_file || error "touch failed"
2976 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2977 error "$DIR/$tdir/ext2-mountpoint/../d2/test_file not file type"
2978 cleanup_test32_mount
2980 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
2983 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2986 trap cleanup_test32_mount EXIT
2987 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2988 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2989 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2990 test_mkdir -p $DIR/$tdir/d2
2991 touch $DIR/$tdir/d2/test_file || error "touch failed"
2992 cat $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2993 error "Can't open $DIR/$tdir/ext2-mountpoint/../d2/test_file"
2994 cleanup_test32_mount
2996 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
3000 test_mkdir -p $DIR/d32m/tmp
3001 TMP_DIR=$DIR/d32m/tmp
3002 ln -s $DIR $TMP_DIR/symlink11
3003 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3004 $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 ||
3005 error "symlink11 not a link"
3006 $CHECKSTAT -t link $DIR/d32m/symlink01 ||
3007 error "symlink01 not a link"
3009 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
3013 test_mkdir -p $DIR/d32n/tmp
3014 TMP_DIR=$DIR/d32n/tmp
3015 ln -s $DIR $TMP_DIR/symlink11
3016 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3017 ls -l $DIR/d32n/tmp/symlink11 || error "listing symlink11"
3018 ls -l $DIR/d32n/symlink01 || error "listing symlink01"
3020 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
3024 test_mkdir -p $DIR/d32o/tmp
3025 TMP_DIR=$DIR/d32o/tmp
3026 ln -s $DIR/$tfile $TMP_DIR/symlink12
3027 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3028 $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 ||
3029 error "symlink12 not a link"
3030 $CHECKSTAT -t link $DIR/d32o/symlink02 || error "symlink02 not a link"
3031 $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 ||
3032 error "$DIR/d32o/tmp/symlink12 not file type"
3033 $CHECKSTAT -t file -f $DIR/d32o/symlink02 ||
3034 error "$DIR/d32o/symlink02 not file type"
3036 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
3046 test_mkdir -p $DIR/d32p/tmp
3048 TMP_DIR=$DIR/d32p/tmp
3050 ln -s $DIR/$tfile $TMP_DIR/symlink12
3052 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3054 cat $DIR/d32p/tmp/symlink12 ||
3055 error "Can't open $DIR/d32p/tmp/symlink12"
3057 cat $DIR/d32p/symlink02 || error "Can't open $DIR/d32p/symlink02"
3060 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
3063 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3065 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3066 trap cleanup_test32_mount EXIT
3067 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3068 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3069 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3070 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3071 ls $DIR/$tdir/ext2-mountpoint | grep "\<under_the_mount\>" && error
3072 cleanup_test32_mount
3074 run_test 32q "stat follows mountpoints in Lustre (should return error)"
3077 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3079 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3080 trap cleanup_test32_mount EXIT
3081 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3082 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3083 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3084 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3085 ls $DIR/$tdir/ext2-mountpoint | grep -q under_the_mount && error || true
3086 cleanup_test32_mount
3088 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
3093 chmod 444 $DIR/$tfile
3094 chown $RUNAS_ID $DIR/$tfile
3096 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3099 run_test 33aa "write file with mode 444 (should return error)"
3103 test_mkdir $DIR/$tdir
3104 chown $RUNAS_ID $DIR/$tdir
3105 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
3106 error "$RUNAS create $tdir/$tfile failed"
3107 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
3108 error "open RDWR" || true
3110 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
3114 test_mkdir $DIR/$tdir
3115 chown $RUNAS_ID $DIR/$tdir
3116 $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
3118 run_test 33b "test open file with malformed flags (No panic)"
3121 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3122 remote_ost_nodsh && skip "remote OST with nodsh"
3131 test_mkdir $DIR/$tdir
3132 # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
3135 for ostnum in $(seq $OSTCOUNT); do
3136 # test-framework's OST numbering is one-based, while Lustre's
3138 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3139 # Parsing llobdstat's output sucks; we could grep the /proc
3140 # path, but that's likely to not be as portable as using the
3141 # llobdstat utility. So we parse lctl output instead.
3142 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3143 obdfilter/$ostname/stats |
3144 awk '/^write_bytes/ {print $7}' )
3145 echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes"
3146 if (( ${write_bytes:-0} > 0 ))
3153 $all_zeros || return 0
3156 echo foo > $DIR/$tdir/bar
3160 # Total up write_bytes after writing. We'd better find non-zeros.
3161 for ostnum in $(seq $OSTCOUNT); do
3162 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3163 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3164 obdfilter/$ostname/stats |
3165 awk '/^write_bytes/ {print $7}' )
3166 echo "write_bytes@$OSTnum/$ostname=$write_bytes"
3167 if (( ${write_bytes:-0} > 0 ))
3176 for ostnum in $(seq $OSTCOUNT); do
3177 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3178 echo "Check that write_bytes is present in obdfilter/*/stats:"
3179 do_facet ost$ostnum lctl get_param -n \
3180 obdfilter/$ostname/stats
3182 error "OST not keeping write_bytes stats (b22312)"
3185 run_test 33c "test llobdstat and write_bytes"
3188 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3189 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3192 local remote_dir=$DIR/$tdir/remote_dir
3194 test_mkdir $DIR/$tdir
3195 $LFS mkdir -i $MDTIDX $remote_dir ||
3196 error "create remote directory failed"
3198 touch $remote_dir/$tfile
3199 chmod 444 $remote_dir/$tfile
3200 chown $RUNAS_ID $remote_dir/$tfile
3202 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3204 chown $RUNAS_ID $remote_dir
3205 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
3206 error "create" || true
3207 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
3208 error "open RDWR" || true
3209 $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
3211 run_test 33d "openfile with 444 modes and malformed flags under remote dir"
3214 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3218 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3219 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3220 mkdir $DIR/$tdir/local_dir
3222 local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3223 local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3224 local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3226 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3227 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
3229 rmdir $DIR/$tdir/* || error "rmdir failed"
3232 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3233 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3234 mkdir $DIR/$tdir/local_dir
3236 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3237 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3238 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3240 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3241 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
3243 rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
3246 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3247 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3248 mkdir $DIR/$tdir/local_dir
3250 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3251 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3252 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3254 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3255 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
3257 run_test 33e "mkdir and striped directory should have same mode"
3261 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
3265 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3266 remote_mds_nodsh && skip "remote MDS with nodsh"
3269 chmod go+rwx $DIR/$tdir
3270 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
3271 trap cleanup_33f EXIT
3273 $RUNAS lfs mkdir -i 0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
3274 error "cannot create striped directory"
3276 $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
3277 error "cannot create files in striped directory"
3279 $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
3280 error "cannot remove files in striped directory"
3282 $RUNAS rmdir $DIR/$tdir/striped_dir ||
3283 error "cannot remove striped directory"
3287 run_test 33f "nonroot user can create, access, and remove a striped directory"
3290 mkdir -p $DIR/$tdir/dir2
3292 local err=$($RUNAS mkdir $DIR/$tdir/dir2 2>&1)
3294 [[ $err =~ "exists" ]] || error "Not exists error"
3296 run_test 33g "nonroot user create already existing root created file"
3298 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
3301 $MCREATE $DIR/f34 || error "mcreate failed"
3302 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3303 error "getstripe failed"
3304 $TRUNCATE $DIR/f34 $TEST_34_SIZE || error "truncate failed"
3305 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3306 error "getstripe failed"
3307 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3308 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3310 run_test 34a "truncate file that has not been opened ==========="
3313 [ ! -f $DIR/f34 ] && test_34a
3314 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3315 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3316 $OPENFILE -f O_RDONLY $DIR/f34
3317 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3318 error "getstripe failed"
3319 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3320 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3322 run_test 34b "O_RDONLY opening file doesn't create objects ====="
3325 [ ! -f $DIR/f34 ] && test_34a
3326 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3327 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3328 $OPENFILE -f O_RDWR $DIR/f34
3329 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" && error
3330 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3331 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3333 run_test 34c "O_RDWR opening file-with-size works =============="
3336 [ ! -f $DIR/f34 ] && test_34a
3337 dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 ||
3339 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3340 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3343 run_test 34d "write to sparse file ============================="
3347 $MCREATE $DIR/f34e || error "mcreate failed"
3348 $TRUNCATE $DIR/f34e 1000 || error "truncate failed"
3349 $CHECKSTAT -s 1000 $DIR/f34e ||
3350 error "Size of $DIR/f34e not equal to 1000 bytes"
3351 $OPENFILE -f O_RDWR $DIR/f34e
3352 $CHECKSTAT -s 1000 $DIR/f34e ||
3353 error "Size of $DIR/f34e not equal to 1000 bytes"
3355 run_test 34e "create objects, some with size and some without =="
3357 test_34f() { # bug 6242, 6243
3358 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3362 $MCREATE $DIR/f34f || error "mcreate failed"
3363 $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
3364 dd if=$DIR/f34f of=$TMP/f34f
3365 $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
3366 dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
3367 cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
3368 cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
3369 rm $TMP/f34f $TMP/f34fzero $DIR/f34f
3371 run_test 34f "read from a file with no objects until EOF ======="
3374 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3376 dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE ||
3378 $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error "truncate failed"
3379 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3380 error "Size of $DIR/$tfile not equal to $((TEST_34_SIZE / 2))"
3381 cancel_lru_locks osc
3382 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3383 error "wrong size after lock cancel"
3385 $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error "truncate failed"
3386 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3387 error "expanding truncate failed"
3388 cancel_lru_locks osc
3389 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3390 error "wrong expanded size after lock cancel"
3392 run_test 34g "truncate long file ==============================="
3395 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3400 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error "dd failed"
3401 sync # Flush the cache so that multiop below does not block on cache
3402 # flush when getting the group lock
3403 $MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
3406 # Since just timed wait is not good enough, let's do a sync write
3407 # that way we are sure enough time for a roundtrip + processing
3408 # passed + 2 seconds of extra margin.
3409 dd if=/dev/zero of=$DIR/${tfile}-1 bs=$PAGE_SIZE oflag=direct count=1
3413 if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then
3414 error "Multiop blocked on ftruncate, pid=$MULTIPID"
3418 local nsz=`stat -c %s $DIR/$tfile`
3419 [[ $nsz == $sz ]] || error "New size wrong $nsz != $sz"
3421 run_test 34h "ftruncate file under grouplock should not block"
3424 cp /bin/sh $DIR/f35a
3426 chown $RUNAS_ID $DIR/f35a
3427 $RUNAS $DIR/f35a && error || true
3430 run_test 35a "exec file with mode 444 (should return and not leak)"
3434 utime $DIR/f36 || error "utime failed for MDS"
3436 run_test 36a "MDS utime check (mknod, utime)"
3440 utime $DIR/f36 || error "utime failed for OST"
3442 run_test 36b "OST utime check (open, utime)"
3447 chown $RUNAS_ID $DIR/d36
3448 $RUNAS utime $DIR/d36/f36 || error "utime failed for MDS as non-root"
3450 run_test 36c "non-root MDS utime check (mknod, utime)"
3453 [ ! -d $DIR/d36 ] && test_36c
3454 echo "" > $DIR/d36/f36
3455 $RUNAS utime $DIR/d36/f36 || error "utime failed for OST as non-root"
3457 run_test 36d "non-root OST utime check (open, utime)"
3460 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping"
3462 test_mkdir $DIR/$tdir
3463 touch $DIR/$tdir/$tfile
3464 $RUNAS utime $DIR/$tdir/$tfile &&
3465 error "utime worked, expected failure" || true
3467 run_test 36e "utime on non-owned file (should return error)"
3471 local LANG_SAVE=$LANG
3472 local LC_LANG_SAVE=$LC_LANG
3473 export LANG=C LC_LANG=C # for date language
3475 DATESTR="Dec 20 2000"
3476 test_mkdir $DIR/$tdir
3477 lctl set_param fail_loc=$fl
3479 cp /etc/hosts $DIR/$tdir/$tfile
3480 sync & # write RPC generated with "current" inode timestamp, but delayed
3482 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
3483 LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
3484 cancel_lru_locks $OSC
3485 LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object
3487 [ "$LS_BEFORE" != "$LS_AFTER" ] && \
3488 echo "BEFORE: $LS_BEFORE" && \
3489 echo "AFTER : $LS_AFTER" && \
3490 echo "WANT : $DATESTR" && \
3491 error "$DIR/$tdir/$tfile timestamps changed" || true
3493 export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE
3497 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3499 #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
3500 subr_36fh "0x80000214"
3502 run_test 36f "utime on file racing with OST BRW write =========="
3505 remote_ost_nodsh && skip "remote OST with nodsh"
3506 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3507 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
3508 skip "Need MDS version at least 2.12.51"
3513 local tgt="obdfilter"
3515 [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1"
3517 test_mkdir $DIR/$tdir
3518 fmd_max_age=$(do_facet $facet \
3519 "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \
3522 echo "FMD max age: ${fmd_max_age}s"
3523 touch $DIR/$tdir/$tfile
3524 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3525 gawk '{cnt=cnt+$1} END{print cnt}')
3526 echo "FMD before: $fmd"
3528 error "FMD wasn't create by touch"
3529 sleep $((fmd_max_age + 12))
3530 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3531 gawk '{cnt=cnt+$1} END{print cnt}')
3532 echo "FMD after: $fmd"
3534 error "FMD wasn't expired by ping"
3536 run_test 36g "FMD cache expiry ====================="
3539 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3541 #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227
3542 subr_36fh "0x80000227"
3544 run_test 36h "utime on file racing with OST BRW write =========="
3547 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3549 test_mkdir $DIR/$tdir
3550 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
3552 local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
3553 local new_mtime=$((mtime + 200))
3555 #change Modify time of striped dir
3556 touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
3557 error "change mtime failed"
3559 local got=$(stat -c%Y $DIR/$tdir/striped_dir)
3561 [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
3563 run_test 36i "change mtime on striped directory"
3565 # test_37 - duplicate with tests 32q 32r
3568 local file=$DIR/$tfile
3570 openfile -f O_DIRECTORY $file
3573 [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true
3574 [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)"
3576 run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ==="
3578 test_39a() { # was test_39
3580 touch $DIR/${tfile}2
3581 # ls -l $DIR/$tfile $DIR/${tfile}2
3582 # ls -lu $DIR/$tfile $DIR/${tfile}2
3583 # ls -lc $DIR/$tfile $DIR/${tfile}2
3585 $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
3586 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
3588 ls -l --full-time $DIR/$tfile $DIR/${tfile}2
3590 ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
3592 ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
3593 error "O_TRUNC didn't change timestamps"
3596 run_test 39a "mtime changed on create"
3599 test_mkdir -c1 $DIR/$tdir
3600 cp -p /etc/passwd $DIR/$tdir/fopen
3601 cp -p /etc/passwd $DIR/$tdir/flink
3602 cp -p /etc/passwd $DIR/$tdir/funlink
3603 cp -p /etc/passwd $DIR/$tdir/frename
3604 ln $DIR/$tdir/funlink $DIR/$tdir/funlink2
3607 echo "aaaaaa" >> $DIR/$tdir/fopen
3608 echo "aaaaaa" >> $DIR/$tdir/flink
3609 echo "aaaaaa" >> $DIR/$tdir/funlink
3610 echo "aaaaaa" >> $DIR/$tdir/frename
3612 local open_new=`stat -c %Y $DIR/$tdir/fopen`
3613 local link_new=`stat -c %Y $DIR/$tdir/flink`
3614 local unlink_new=`stat -c %Y $DIR/$tdir/funlink`
3615 local rename_new=`stat -c %Y $DIR/$tdir/frename`
3617 cat $DIR/$tdir/fopen > /dev/null
3618 ln $DIR/$tdir/flink $DIR/$tdir/flink2
3619 rm -f $DIR/$tdir/funlink2
3620 mv -f $DIR/$tdir/frename $DIR/$tdir/frename2
3622 for (( i=0; i < 2; i++ )) ; do
3623 local open_new2=`stat -c %Y $DIR/$tdir/fopen`
3624 local link_new2=`stat -c %Y $DIR/$tdir/flink`
3625 local unlink_new2=`stat -c %Y $DIR/$tdir/funlink`
3626 local rename_new2=`stat -c %Y $DIR/$tdir/frename2`
3628 [ $open_new2 -eq $open_new ] || error "open file reverses mtime"
3629 [ $link_new2 -eq $link_new ] || error "link file reverses mtime"
3630 [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime"
3631 [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime"
3633 cancel_lru_locks $OSC
3634 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3637 run_test 39b "mtime change on open, link, unlink, rename ======"
3639 # this should be set to past
3640 TEST_39_MTIME=`date -d "1 year ago" +%s`
3646 local mtime0=`stat -c %Y $DIR1/$tfile`
3648 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3649 local mtime1=`stat -c %Y $DIR1/$tfile`
3650 [ "$mtime1" = $TEST_39_MTIME ] || \
3651 error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME"
3654 echo hello >> $DIR1/$tfile
3656 local mtime2=`stat -c %Y $DIR1/$tfile`
3657 [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \
3658 error "mtime is not updated on write: $d1 <= $mtime2 <= $d2"
3660 mv $DIR1/$tfile $DIR1/$tfile-1
3662 for (( i=0; i < 2; i++ )) ; do
3663 local mtime3=`stat -c %Y $DIR1/$tfile-1`
3664 [ "$mtime2" = "$mtime3" ] || \
3665 error "mtime ($mtime2) changed (to $mtime3) on rename"
3667 cancel_lru_locks $OSC
3668 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3671 run_test 39c "mtime change on rename ==========================="
3675 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3678 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3680 for (( i=0; i < 2; i++ )) ; do
3681 local mtime=`stat -c %Y $DIR1/$tfile`
3682 [ $mtime = $TEST_39_MTIME ] || \
3683 error "mtime($mtime) is not set to $TEST_39_MTIME"
3685 cancel_lru_locks $OSC
3686 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3689 run_test 39d "create, utime, stat =============================="
3693 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3696 local mtime1=`stat -c %Y $DIR1/$tfile`
3698 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3700 for (( i=0; i < 2; i++ )) ; do
3701 local mtime2=`stat -c %Y $DIR1/$tfile`
3702 [ $mtime2 = $TEST_39_MTIME ] || \
3703 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3705 cancel_lru_locks $OSC
3706 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3709 run_test 39e "create, stat, utime, stat ========================"
3713 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3716 mtime1=`stat -c %Y $DIR1/$tfile`
3719 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3721 for (( i=0; i < 2; i++ )) ; do
3722 local mtime2=`stat -c %Y $DIR1/$tfile`
3723 [ $mtime2 = $TEST_39_MTIME ] || \
3724 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3726 cancel_lru_locks $OSC
3727 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3730 run_test 39f "create, stat, sleep, utime, stat ================="
3734 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3736 echo hello >> $DIR1/$tfile
3737 local mtime1=`stat -c %Y $DIR1/$tfile`
3740 chmod o+r $DIR1/$tfile
3742 for (( i=0; i < 2; i++ )) ; do
3743 local mtime2=`stat -c %Y $DIR1/$tfile`
3744 [ "$mtime1" = "$mtime2" ] || \
3745 error "lost mtime: $mtime2, should be $mtime1"
3747 cancel_lru_locks $OSC
3748 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3751 run_test 39g "write, chmod, stat ==============================="
3755 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3761 echo hello >> $DIR1/$tfile
3762 local mtime1=`stat -c %Y $DIR1/$tfile`
3764 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3766 if [ "$d1" != "$d2" ]; then
3767 echo "write and touch not within one second"
3769 for (( i=0; i < 2; i++ )) ; do
3770 local mtime2=`stat -c %Y $DIR1/$tfile`
3771 [ "$mtime2" = $TEST_39_MTIME ] || \
3772 error "lost mtime: $mtime2, should be $TEST_39_MTIME"
3774 cancel_lru_locks $OSC
3775 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3779 run_test 39h "write, utime within one second, stat ============="
3782 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3787 echo hello >> $DIR1/$tfile
3788 local mtime1=`stat -c %Y $DIR1/$tfile`
3790 mv $DIR1/$tfile $DIR1/$tfile-1
3792 for (( i=0; i < 2; i++ )) ; do
3793 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3795 [ "$mtime1" = "$mtime2" ] || \
3796 error "lost mtime: $mtime2, should be $mtime1"
3798 cancel_lru_locks $OSC
3799 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3802 run_test 39i "write, rename, stat =============================="
3805 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3807 start_full_debug_logging
3811 #define OBD_FAIL_OSC_DELAY_SETTIME 0x412
3812 lctl set_param fail_loc=0x80000412
3813 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c ||
3814 error "multiop failed"
3816 local mtime1=`stat -c %Y $DIR1/$tfile`
3818 mv $DIR1/$tfile $DIR1/$tfile-1
3820 kill -USR1 $multipid
3821 wait $multipid || error "multiop close failed"
3823 for (( i=0; i < 2; i++ )) ; do
3824 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3825 [ "$mtime1" = "$mtime2" ] ||
3826 error "mtime is lost on close: $mtime2, " \
3829 cancel_lru_locks $OSC
3830 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3832 lctl set_param fail_loc=0
3833 stop_full_debug_logging
3835 run_test 39j "write, rename, close, stat ======================="
3838 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3843 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed"
3845 local mtime1=`stat -c %Y $DIR1/$tfile`
3847 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3849 kill -USR1 $multipid
3850 wait $multipid || error "multiop close failed"
3852 for (( i=0; i < 2; i++ )) ; do
3853 local mtime2=`stat -c %Y $DIR1/$tfile`
3855 [ "$mtime2" = $TEST_39_MTIME ] || \
3856 error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
3858 cancel_lru_locks osc
3859 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3862 run_test 39k "write, utime, close, stat ========================"
3864 # this should be set to future
3865 TEST_39_ATIME=`date -d "1 year" +%s`
3868 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3869 remote_mds_nodsh && skip "remote MDS with nodsh"
3871 local atime_diff=$(do_facet $SINGLEMDS \
3872 lctl get_param -n mdd.*MDT0000*.atime_diff)
3876 # test setting directory atime to future
3877 touch -a -d @$TEST_39_ATIME $DIR/$tdir
3878 local atime=$(stat -c %X $DIR/$tdir)
3879 [ "$atime" = $TEST_39_ATIME ] ||
3880 error "atime is not set to future: $atime, $TEST_39_ATIME"
3882 # test setting directory atime from future to now
3883 local now=$(date +%s)
3884 touch -a -d @$now $DIR/$tdir
3886 atime=$(stat -c %X $DIR/$tdir)
3887 [ "$atime" -eq "$now" ] ||
3888 error "atime is not updated from future: $atime, $now"
3890 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=2
3893 # test setting directory atime when now > dir atime + atime_diff
3894 local d1=$(date +%s)
3896 local d2=$(date +%s)
3897 cancel_lru_locks mdc
3898 atime=$(stat -c %X $DIR/$tdir)
3899 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3900 error "atime is not updated : $atime, should be $d2"
3902 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=60
3905 # test not setting directory atime when now < dir atime + atime_diff
3907 cancel_lru_locks mdc
3908 atime=$(stat -c %X $DIR/$tdir)
3909 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3910 error "atime is updated to $atime, should remain $d1<atime<$d2"
3912 do_facet $SINGLEMDS \
3913 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3915 run_test 39l "directory atime update ==========================="
3918 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3922 local far_past_mtime=$(date -d "May 29 1953" +%s)
3923 local far_past_atime=$(date -d "Dec 17 1903" +%s)
3925 touch -m -d @$far_past_mtime $DIR1/$tfile
3926 touch -a -d @$far_past_atime $DIR1/$tfile
3928 for (( i=0; i < 2; i++ )) ; do
3929 local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
3930 [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
3931 error "atime or mtime set incorrectly"
3933 cancel_lru_locks $OSC
3934 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3937 run_test 39m "test atime and mtime before 1970"
3939 test_39n() { # LU-3832
3940 remote_mds_nodsh && skip "remote MDS with nodsh"
3942 local atime_diff=$(do_facet $SINGLEMDS \
3943 lctl get_param -n mdd.*MDT0000*.atime_diff)
3948 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
3951 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
3952 atime0=$(stat -c %X $DIR/$tfile)
3955 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3956 atime1=$(stat -c %X $DIR/$tfile)
3959 cancel_lru_locks mdc
3960 cancel_lru_locks osc
3961 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3962 atime2=$(stat -c %X $DIR/$tfile)
3964 do_facet $SINGLEMDS \
3965 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3967 [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
3968 [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
3970 run_test 39n "check that O_NOATIME is honored"
3973 TESTDIR=$DIR/$tdir/$tfile
3974 [ -e $TESTDIR ] && rm -rf $TESTDIR
3981 links2=$(stat -c %h .)
3982 [ $(($links1 + 2)) != $links2 ] &&
3983 error "wrong links count $(($links1 + 2)) != $links2"
3985 links3=$(stat -c %h .)
3986 [ $(($links1 + 1)) != $links3 ] &&
3987 error "wrong links count $links1 != $links3"
3990 run_test 39o "directory cached attributes updated after create"
3993 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3996 TESTDIR=$DIR/$tdir/$tdir
3997 [ -e $TESTDIR ] && rm -rf $TESTDIR
3998 test_mkdir -p $TESTDIR
4002 test_mkdir -i $MDTIDX $TESTDIR/remote_dir1
4003 test_mkdir -i $MDTIDX $TESTDIR/remote_dir2
4005 links2=$(stat -c %h .)
4006 [ $(($links1 + 2)) != $links2 ] &&
4007 error "wrong links count $(($links1 + 2)) != $links2"
4009 links3=$(stat -c %h .)
4010 [ $(($links1 + 1)) != $links3 ] &&
4011 error "wrong links count $links1 != $links3"
4014 run_test 39p "remote directory cached attributes updated after create ========"
4017 test_39q() { # LU-8041
4018 local testdir=$DIR/$tdir
4020 multiop_bg_pause $testdir D_c || error "multiop failed"
4022 cancel_lru_locks mdc
4023 kill -USR1 $multipid
4024 local atime=$(stat -c %X $testdir)
4025 [ "$atime" -ne 0 ] || error "atime is zero"
4027 run_test 39q "close won't zero out atime"
4030 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
4031 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
4032 error "openfile O_WRONLY:O_TRUNC $tfile failed"
4033 $CHECKSTAT -t file -s 4096 $DIR/$tfile ||
4034 error "$tfile is not 4096 bytes in size"
4036 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
4040 small_write $DIR/f41 18
4042 run_test 41 "test small file write + fstat ====================="
4044 count_ost_writes() {
4045 lctl get_param -n ${OSC}.*.stats |
4046 awk -vwrites=0 '/ost_write/ { writes += $2 } \
4047 END { printf("%0.0f", writes) }'
4054 BG_DIRTY_RATIO_SAVE=10
4055 MAX_BG_DIRTY_RATIO=25
4059 # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs,
4060 # dirty_ratio, dirty_background_ratio
4061 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4062 sysctl -w vm.dirty_writeback_centisecs=$WRITEBACK_SAVE
4063 sysctl -w vm.dirty_background_ratio=$BG_DIRTY_RATIO_SAVE
4064 sysctl -w vm.dirty_ratio=$DIRTY_RATIO_SAVE
4066 # if file not here, we are a 2.4 kernel
4067 kill -CONT `pidof kupdated`
4072 # setup the trap first, so someone cannot exit the test at the
4073 # exact wrong time and mess up a machine
4074 trap start_writeback EXIT
4075 # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
4076 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4077 WRITEBACK_SAVE=`sysctl -n vm.dirty_writeback_centisecs`
4078 sysctl -w vm.dirty_writeback_centisecs=0
4079 sysctl -w vm.dirty_writeback_centisecs=0
4080 # save and increase /proc/sys/vm/dirty_ratio
4081 DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_ratio`
4082 sysctl -w vm.dirty_ratio=$MAX_DIRTY_RATIO
4083 # save and increase /proc/sys/vm/dirty_background_ratio
4084 BG_DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_background_ratio`
4085 sysctl -w vm.dirty_background_ratio=$MAX_BG_DIRTY_RATIO
4087 # if file not here, we are a 2.4 kernel
4088 kill -STOP `pidof kupdated`
4092 # ensure that all stripes have some grant before we test client-side cache
4094 for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
4095 dd if=/dev/zero of=$i bs=4k count=1
4100 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
4101 # file truncation, and file removal.
4103 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4106 cancel_lru_locks $OSC
4108 sync; sleep 1; sync # just to be safe
4109 BEFOREWRITES=`count_ost_writes`
4110 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur_grant_bytes | grep "[0-9]"
4111 dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
4112 AFTERWRITES=`count_ost_writes`
4113 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
4114 error "$BEFOREWRITES < $AFTERWRITES"
4117 run_test 42a "ensure that we don't flush on close"
4120 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4123 cancel_lru_locks $OSC
4126 dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
4127 BEFOREWRITES=$(count_ost_writes)
4128 $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
4129 AFTERWRITES=$(count_ost_writes)
4130 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4131 error "$BEFOREWRITES < $AFTERWRITES on unlink"
4133 BEFOREWRITES=$(count_ost_writes)
4134 sync || error "sync: $?"
4135 AFTERWRITES=$(count_ost_writes)
4136 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4137 error "$BEFOREWRITES < $AFTERWRITES on sync"
4139 dmesg | grep 'error from obd_brw_async' && error 'error writing back'
4143 run_test 42b "test destroy of file with cached dirty data ======"
4145 # if these tests just want to test the effect of truncation,
4146 # they have to be very careful. consider:
4147 # - the first open gets a {0,EOF}PR lock
4148 # - the first write conflicts and gets a {0, count-1}PW
4149 # - the rest of the writes are under {count,EOF}PW
4150 # - the open for truncate tries to match a {0,EOF}PR
4151 # for the filesize and cancels the PWs.
4152 # any number of fixes (don't get {0,EOF} on open, match
4153 # composite locks, do smarter file size management) fix
4154 # this, but for now we want these tests to verify that
4155 # the cancellation with truncate intent works, so we
4156 # start the file with a full-file pw lock to match against
4157 # until the truncate.
4162 cancel_lru_locks $OSC
4164 # prime the file with 0,EOF PW to match
4168 # now the real test..
4169 dd if=/dev/zero of=$file bs=1024 count=100
4170 BEFOREWRITES=`count_ost_writes`
4171 $TRUNCATE $file $offset
4172 cancel_lru_locks $OSC
4173 AFTERWRITES=`count_ost_writes`
4178 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4181 [ $BEFOREWRITES -eq $AFTERWRITES ] &&
4182 error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
4185 run_test 42c "test partial truncate of file with cached dirty data"
4188 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4191 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
4192 error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
4195 run_test 42d "test complete truncate of file with cached dirty data"
4197 test_42e() { # bug22074
4198 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4200 local TDIR=$DIR/${tdir}e
4201 local pages=16 # hardcoded 16 pages, don't change it.
4202 local files=$((OSTCOUNT * 500)) # hopefully 500 files on each OST
4203 local proc_osc0="osc.${FSNAME}-OST0000-osc-[^MDT]*"
4207 test_mkdir $DIR/${tdir}e
4208 $SETSTRIPE -c 1 $TDIR
4209 createmany -o $TDIR/f $files
4211 max_dirty_mb=$($LCTL get_param -n $proc_osc0/max_dirty_mb)
4213 # we assume that with $OSTCOUNT files, at least one of them will
4214 # be allocated on OST0.
4215 warmup_files=$((OSTCOUNT * max_dirty_mb))
4216 createmany -o $TDIR/w $warmup_files
4218 # write a large amount of data into one file and sync, to get good
4219 # avail_grant number from OST.
4220 for ((i=0; i<$warmup_files; i++)); do
4221 idx=$($GETSTRIPE -i $TDIR/w$i)
4222 [ $idx -ne 0 ] && continue
4223 dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1
4226 [[ $i -gt $warmup_files ]] && error "OST0 is still cold"
4228 $LCTL get_param $proc_osc0/cur_dirty_bytes
4229 $LCTL get_param $proc_osc0/cur_grant_bytes
4231 # create as much dirty pages as we can while not to trigger the actual
4232 # RPCs directly. but depends on the env, VFS may trigger flush during this
4233 # period, hopefully we are good.
4234 for ((i=0; i<$warmup_files; i++)); do
4235 idx=$($GETSTRIPE -i $TDIR/w$i)
4236 [ $idx -ne 0 ] && continue
4237 dd if=/dev/zero of=$TDIR/w$i bs=1M count=1 2>/dev/null
4239 $LCTL get_param $proc_osc0/cur_dirty_bytes
4240 $LCTL get_param $proc_osc0/cur_grant_bytes
4242 # perform the real test
4243 $LCTL set_param $proc_osc0/rpc_stats 0
4244 for ((;i<$files; i++)); do
4245 [ $($GETSTRIPE -i $TDIR/f$i) -eq 0 ] || continue
4246 dd if=/dev/zero of=$TDIR/f$i bs=$PAGE_SIZE count=$pages 2>/dev/null
4249 $LCTL get_param $proc_osc0/rpc_stats
4252 local have_ppr=false
4253 $LCTL get_param $proc_osc0/rpc_stats |
4254 while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do
4255 # skip lines until we are at the RPC histogram data
4256 [ "$PPR" == "pages" ] && have_ppr=true && continue
4257 $have_ppr || continue
4259 # we only want the percent stat for < 16 pages
4260 [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break
4262 percent=$((percent + WPCT))
4263 if [[ $percent -gt 15 ]]; then
4264 error "less than 16-pages write RPCs" \
4271 run_test 42e "verify sub-RPC writes are not done synchronously"
4273 test_43A() { # was test_43
4274 test_mkdir $DIR/$tdir
4275 cp -p /bin/ls $DIR/$tdir/$tfile
4276 $MULTIOP $DIR/$tdir/$tfile Ow_c &
4278 # give multiop a chance to open
4281 $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true
4284 run_test 43A "execution of file opened for write should return -ETXTBSY"
4287 test_mkdir $DIR/$tdir
4288 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4289 $DIR/$tdir/sleep 60 &
4291 # Make sure exec of $tdir/sleep wins race with truncate
4293 $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success"
4296 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
4299 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4301 test_mkdir $DIR/$tdir
4302 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4303 $DIR/$tdir/sleep 60 &
4305 # Make sure exec of $tdir/sleep wins race with truncate
4307 $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success"
4310 run_test 43b "truncate of file being executed should return -ETXTBSY"
4313 local testdir="$DIR/$tdir"
4316 ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) |
4317 ( cd $testdir && md5sum -c )
4319 run_test 43c "md5sum of copy into lustre"
4321 test_44A() { # was test_44
4322 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4324 dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
4325 dd if=$DIR/f1 bs=4k count=1 > /dev/null
4327 run_test 44A "zero length read from a sparse stripe"
4330 local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
4332 [ -z "$nstripe" ] && skip "can't get stripe info"
4333 [[ $nstripe -gt $OSTCOUNT ]] &&
4334 skip "Wrong default_stripe_count: $nstripe OSTCOUNT: $OSTCOUNT"
4336 local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: |
4338 if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then
4339 nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: |
4343 OFFSETS="0 $((stride/2)) $((stride-1))"
4344 for offset in $OFFSETS; do
4345 for i in $(seq 0 $((nstripe-1))); do
4346 local GLOBALOFFSETS=""
4348 local size=$((((i + 2 * $nstripe )*$stride + $offset)))
4349 local myfn=$DIR/d44a-$size
4350 echo "--------writing $myfn at $size"
4351 ll_sparseness_write $myfn $size ||
4352 error "ll_sparseness_write"
4353 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4354 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4355 error "ll_sparseness_verify $GLOBALOFFSETS"
4357 for j in $(seq 0 $((nstripe-1))); do
4359 size=$((((j + $nstripe )*$stride + $offset)))
4360 ll_sparseness_write $myfn $size ||
4361 error "ll_sparseness_write"
4362 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4364 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4365 error "ll_sparseness_verify $GLOBALOFFSETS"
4370 run_test 44a "test sparse pwrite ==============================="
4374 for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
4380 before=`dirty_osc_total`
4381 echo executing "\"$*\""
4383 after=`dirty_osc_total`
4384 echo before $before, after $after
4387 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4390 # Obtain grants from OST if it supports it
4391 echo blah > ${f}_grant
4394 do_dirty_record "echo blah > $f"
4395 [[ $before -eq $after ]] && error "write wasn't cached"
4396 do_dirty_record "> $f"
4397 [[ $before -gt $after ]] || error "truncate didn't lower dirty count"
4398 do_dirty_record "echo blah > $f"
4399 [[ $before -eq $after ]] && error "write wasn't cached"
4400 do_dirty_record "sync"
4401 [[ $before -gt $after ]] || error "writeback didn't lower dirty count"
4402 do_dirty_record "echo blah > $f"
4403 [[ $before -eq $after ]] && error "write wasn't cached"
4404 do_dirty_record "cancel_lru_locks osc"
4405 [[ $before -gt $after ]] ||
4406 error "lock cancellation didn't lower dirty count"
4409 run_test 45 "osc io page accounting ============================"
4411 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this
4412 # test tickles a bug where re-dirtying a page was failing to be mapped to the
4413 # objects offset and an assert hit when an rpc was built with 1023's mapped
4414 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
4416 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4421 dd if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4423 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=1023 count=1
4424 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4428 run_test 46 "dirtying a previously written page ================"
4430 # test_47 is removed "Device nodes check" is moved to test_28
4432 test_48a() { # bug 2399
4433 [ "$mds1_FSTYPE" = "zfs" ] &&
4434 [ $MDS1_VERSION -lt $(version_code 2.3.63) ] &&
4435 skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly"
4437 test_mkdir $DIR/$tdir
4439 mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
4440 test_mkdir $DIR/$tdir
4441 touch foo || error "'touch foo' failed after recreating cwd"
4443 touch .foo || error "'touch .foo' failed after recreating cwd"
4445 ls . > /dev/null || error "'ls .' failed after recreating cwd"
4446 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4447 cd . || error "'cd .' failed after recreating cwd"
4448 mkdir . && error "'mkdir .' worked after recreating cwd"
4449 rmdir . && error "'rmdir .' worked after recreating cwd"
4450 ln -s . baz || error "'ln -s .' failed after recreating cwd"
4451 cd .. || error "'cd ..' failed after recreating cwd"
4453 run_test 48a "Access renamed working dir (should return errors)="
4455 test_48b() { # bug 2399
4457 test_mkdir $DIR/$tdir
4459 rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
4460 touch foo && error "'touch foo' worked after removing cwd"
4461 mkdir foo && error "'mkdir foo' worked after removing cwd"
4462 touch .foo && error "'touch .foo' worked after removing cwd"
4463 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
4464 ls . > /dev/null && error "'ls .' worked after removing cwd"
4465 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4466 mkdir . && error "'mkdir .' worked after removing cwd"
4467 rmdir . && error "'rmdir .' worked after removing cwd"
4468 ln -s . foo && error "'ln -s .' worked after removing cwd"
4469 cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
4471 run_test 48b "Access removed working dir (should return errors)="
4473 test_48c() { # bug 2350
4474 #lctl set_param debug=-1
4477 test_mkdir -p $DIR/$tdir/dir
4479 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4480 $TRACE touch foo && error "touch foo worked after removing cwd"
4481 $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
4482 touch .foo && error "touch .foo worked after removing cwd"
4483 mkdir .foo && error "mkdir .foo worked after removing cwd"
4484 $TRACE ls . && error "'ls .' worked after removing cwd"
4485 $TRACE ls .. || error "'ls ..' failed after removing cwd"
4486 $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
4487 $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
4488 $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
4489 $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
4491 run_test 48c "Access removed working subdir (should return errors)"
4493 test_48d() { # bug 2350
4494 #lctl set_param debug=-1
4497 test_mkdir -p $DIR/$tdir/dir
4499 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4500 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4501 $TRACE touch foo && error "'touch foo' worked after removing parent"
4502 $TRACE mkdir foo && error "mkdir foo worked after removing parent"
4503 touch .foo && error "'touch .foo' worked after removing parent"
4504 mkdir .foo && error "mkdir .foo worked after removing parent"
4505 $TRACE ls . && error "'ls .' worked after removing parent"
4506 $TRACE ls .. && error "'ls ..' worked after removing parent"
4507 $TRACE mkdir . && error "'mkdir .' worked after removing parent"
4508 $TRACE rmdir . && error "'rmdir .' worked after removing parent"
4509 $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
4512 run_test 48d "Access removed parent subdir (should return errors)"
4514 test_48e() { # bug 4134
4515 #lctl set_param debug=-1
4518 test_mkdir -p $DIR/$tdir/dir
4520 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4521 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4522 $TRACE touch $DIR/$tdir || error "'touch $DIR/$tdir' failed"
4523 $TRACE chmod +x $DIR/$tdir || error "'chmod +x $DIR/$tdir' failed"
4524 # On a buggy kernel addition of "touch foo" after cd .. will
4525 # produce kernel oops in lookup_hash_it
4526 touch ../foo && error "'cd ..' worked after recreate parent"
4528 $TRACE rm $DIR/$tdir || error "rm '$DIR/$tdir' failed"
4530 run_test 48e "Access to recreated parent subdir (should return errors)"
4532 test_49() { # LU-1030
4533 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4534 remote_ost_nodsh && skip "remote OST with nodsh"
4536 # get ost1 size - lustre-OST0000
4537 ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
4539 # write 800M at maximum
4540 [[ $ost1_size -lt 2 ]] && ost1_size=2
4541 [[ $ost1_size -gt 819200 ]] && ost1_size=819200
4543 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
4544 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) &
4547 # change max_pages_per_rpc while writing the file
4548 local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc
4549 local orig_mppc=$($LCTL get_param -n $osc1_mppc)
4550 # loop until dd process exits
4551 while ps ax -opid | grep -wq $dd_pid; do
4552 $LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1))
4553 sleep $((RANDOM % 5 + 1))
4555 # restore original max_pages_per_rpc
4556 $LCTL set_param $osc1_mppc=$orig_mppc
4557 rm $DIR/$tfile || error "rm $DIR/$tfile failed"
4559 run_test 49 "Change max_pages_per_rpc won't break osc extent"
4563 test_mkdir $DIR/$tdir
4565 ls /proc/$$/cwd || error "ls /proc/$$/cwd failed"
4567 run_test 50 "special situations: /proc symlinks ==============="
4569 test_51a() { # was test_51
4570 # bug 1516 - create an empty entry right after ".." then split dir
4571 test_mkdir -c1 $DIR/$tdir
4572 touch $DIR/$tdir/foo
4573 $MCREATE $DIR/$tdir/bar
4575 createmany -m $DIR/$tdir/longfile 201
4577 while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do
4578 $MCREATE $DIR/$tdir/longfile$FNUM
4583 ls -l $DIR/$tdir > /dev/null || error "ls -l $DIR/$tdir failed"
4585 run_test 51a "special situations: split htree with empty entry =="
4587 cleanup_print_lfs_df () {
4594 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4596 local dir=$DIR/$tdir
4597 local nrdirs=$((65536 + 100))
4599 # cleanup the directory
4606 local mdtidx=$(printf "%04x" $($LFS getstripe -m $dir))
4607 local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
4608 [[ $numfree -lt $nrdirs ]] &&
4609 skip "not enough free inodes ($numfree) on MDT$mdtidx"
4611 # need to check free space for the directories as well
4612 local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
4613 numfree=$(( blkfree / $(fs_inode_ksize) ))
4614 [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)"
4616 trap cleanup_print_lfs_df EXIT
4619 createmany -d $dir/d $nrdirs || {
4620 unlinkmany $dir/d $nrdirs
4621 error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
4625 nrdirs=$(ls -U $dir | wc -l)
4627 # unlink all but 100 subdirectories, then check it still works
4629 local delete=$((nrdirs - left))
4634 # for ldiskfs the nlink count should be 1, but this is OSD specific
4635 # and so this is listed for informational purposes only
4636 echo "nlink before: $(stat -c %h $dir), created before: $nrdirs"
4637 unlinkmany -d $dir/d $delete ||
4638 error "unlink of first $delete subdirs failed"
4640 echo "nlink between: $(stat -c %h $dir)"
4641 local found=$(ls -U $dir | wc -l)
4642 [ $found -ne $left ] &&
4643 error "can't find subdirs: found only $found, expected $left"
4645 unlinkmany -d $dir/d $delete $left ||
4646 error "unlink of second $left subdirs failed"
4647 # regardless of whether the backing filesystem tracks nlink accurately
4648 # or not, the nlink count shouldn't be more than "." and ".." here
4649 local after=$(stat -c %h $dir)
4650 [[ $after -gt 2 ]] && error "nlink after: $after > 2" ||
4651 echo "nlink after: $after"
4653 cleanup_print_lfs_df
4655 run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
4658 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4659 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
4661 test_mkdir $DIR/$tdir
4662 createmany -o $DIR/$tdir/t- 1000
4663 $LFS getstripe $DIR/$tdir > $TMP/$tfile
4664 for N in $(seq 0 $((OSTCOUNT - 1))); do
4665 OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
4666 END { printf("%0.0f", objs) }' $TMP/$tfile)
4667 OBJS0[$N]=$(grep -A 1 idx $TMP/$tfile | awk -vobjs=0 \
4668 '($1 == '$N') { objs += 1 } \
4669 END { printf("%0.0f", objs) }')
4670 log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
4672 unlinkmany $DIR/$tdir/t- 1000
4675 for N in $(seq 1 $((OSTCOUNT - 1))); do
4676 [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] &&
4677 error "OST $N has less objects vs OST $NLAST" \
4678 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4679 [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] &&
4680 error "OST $N has less objects vs OST $NLAST" \
4681 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4683 [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] &&
4684 error "OST $N has less #0 objects vs OST $NLAST" \
4685 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4686 [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] &&
4687 error "OST $N has less #0 objects vs OST $NLAST" \
4688 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4693 run_test 51d "check object distribution"
4696 if [ "$mds1_FSTYPE" != ldiskfs ]; then
4697 skip_env "ldiskfs only test"
4700 test_mkdir -c1 $DIR/$tdir
4701 test_mkdir -c1 $DIR/$tdir/d0
4703 touch $DIR/$tdir/d0/foo
4704 createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
4705 error "file exceed 65000 nlink limit!"
4706 unlinkmany $DIR/$tdir/d0/f- 65001
4709 run_test 51e "check file nlink limit"
4712 test_mkdir $DIR/$tdir
4715 local ulimit_old=$(ulimit -n)
4716 local spare=20 # number of spare fd's for scripts/libraries, etc.
4717 local mdt=$($LFS getstripe -m $DIR/$tdir)
4718 local numfree=$($LFS df -i $DIR/$tdir | awk '/MDT:'$mdt'/ { print $4 }')
4720 echo "MDT$mdt numfree=$numfree, max=$max"
4721 [[ $numfree -gt $max ]] && numfree=$max || numfree=$((numfree * 7 / 8))
4722 if [ $((numfree + spare)) -gt $ulimit_old ]; then
4723 while ! ulimit -n $((numfree + spare)); do
4724 numfree=$((numfree * 3 / 4))
4726 echo "changed ulimit from $ulimit_old to $((numfree + spare))"
4728 echo "left ulimit at $ulimit_old"
4731 createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
4732 unlinkmany $DIR/$tdir/f $numfree
4733 error "create+open $numfree files in $DIR/$tdir failed"
4735 ulimit -n $ulimit_old
4737 # if createmany exits at 120s there will be fewer than $numfree files
4738 unlinkmany $DIR/$tdir/f $numfree || true
4740 run_test 51f "check many open files limit"
4743 [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
4744 test_mkdir $DIR/$tdir
4745 touch $DIR/$tdir/foo
4746 chattr +a $DIR/$tdir/foo || error "chattr +a failed"
4747 echo bar >> $DIR/$tdir/foo || error "append bar failed"
4748 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4749 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4750 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4752 echo foo >> $DIR/$tdir/foo || error "append foo failed"
4753 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4754 lsattr $DIR/$tdir/foo | egrep -q "^-+a[-e]+ $DIR/$tdir/foo" ||
4756 chattr -a $DIR/$tdir/foo || error "chattr -a failed"
4757 cp -r $DIR/$tdir $TMP/
4758 rm -fr $DIR/$tdir $TMP/$tdir || error "cleanup rm failed"
4760 run_test 52a "append-only flag test (should return errors)"
4763 [ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo
4764 test_mkdir $DIR/$tdir
4765 touch $DIR/$tdir/foo
4766 chattr +i $DIR/$tdir/foo || error "chattr +i failed"
4767 cat test > $DIR/$tdir/foo && error "cat test worked"
4768 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4769 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4770 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4772 echo foo >> $DIR/$tdir/foo && error "echo worked"
4773 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4774 [ -f $DIR/$tdir/foo ] || error "$tdir/foo is not a file"
4775 [ -f $DIR/$tdir/foo_ren ] && error "$tdir/foo_ren is not a file"
4776 lsattr $DIR/$tdir/foo | egrep -q "^-+i[-e]+ $DIR/$tdir/foo" ||
4778 chattr -i $DIR/$tdir/foo || error "chattr failed"
4780 rm -fr $DIR/$tdir || error "unable to remove $DIR/$tdir"
4782 run_test 52b "immutable flag test (should return errors) ======="
4785 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4786 remote_mds_nodsh && skip "remote MDS with nodsh"
4787 remote_ost_nodsh && skip "remote OST with nodsh"
4800 local support_last_seq=true
4802 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
4803 support_last_seq=false
4806 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
4808 for value in $(do_facet $SINGLEMDS \
4809 $LCTL get_param osp.$mdtosc.prealloc_last_id) ; do
4810 param=$(echo ${value[0]} | cut -d "=" -f1)
4811 ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
4813 if $support_last_seq; then
4814 param_seq=$(echo $param |
4815 sed -e s/prealloc_last_id/prealloc_last_seq/g)
4816 mds_last_seq=$(do_facet $SINGLEMDS \
4817 $LCTL get_param -n $param_seq)
4819 mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
4821 ostnum=$(index_from_ostuuid ${ostname}_UUID)
4822 node=$(facet_active_host ost$((ostnum+1)))
4823 param="obdfilter.$ostname.last_id"
4824 for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
4825 echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
4826 ost_last_id=$ost_last
4828 if $support_last_seq; then
4829 ost_last_id=$(echo $ost_last |
4830 awk -F':' '{print $2}' |
4832 ost_last_seq=$(echo $ost_last |
4833 awk -F':' '{print $1}')
4834 [[ $ost_last_seq = $mds_last_seq ]] || continue
4837 if [[ $ost_last_id != $mds_last ]]; then
4838 error "$ost_last_id != $mds_last"
4845 $found || error "can not match last_seq/last_id for $mdtosc"
4848 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
4851 perl -MSocket -e ';' || skip "no Socket perl module installed"
4853 $SOCKETSERVER $DIR/socket ||
4854 error "$SOCKETSERVER $DIR/socket failed: $?"
4855 $SOCKETCLIENT $DIR/socket ||
4856 error "$SOCKETCLIENT $DIR/socket failed: $?"
4857 $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
4859 run_test 54a "unix domain socket test =========================="
4865 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1
4867 run_test 54b "char device works in lustre ======================"
4870 [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
4871 [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
4872 [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
4874 for i in $(seq 3 7); do
4875 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
4884 loopdev="$DIR/loop54c"
4887 $UMOUNT $DIR/$tdir || rc=$?
4888 losetup -d $loopdev || true
4889 losetup -d $LOOPDEV || true
4890 rm -rf $loopdev $DIR/$tfile $DIR/$tdir
4895 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4897 loopdev="$DIR/loop54c"
4900 [ -z "$LOOPNUM" ] && skip_env "couldn't find empty loop device"
4901 trap cleanup_54c EXIT
4902 mknod $loopdev b 7 $LOOPNUM
4903 echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
4904 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE seek=1024 count=1 > /dev/null
4905 losetup $loopdev $DIR/$tfile ||
4906 error "can't set up $loopdev for $DIR/$tfile"
4907 mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
4908 test_mkdir $DIR/$tdir
4909 mount -t ext2 $loopdev $DIR/$tdir ||
4910 error "error mounting $loopdev on $DIR/$tdir"
4911 dd if=/dev/zero of=$DIR/$tdir/tmp bs=$PAGE_SIZE count=30 ||
4914 dd if=$DIR/$tdir/tmp of=/dev/zero bs=$PAGE_SIZE count=30 ||
4918 run_test 54c "block device works in lustre ====================="
4924 [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string"
4926 run_test 54d "fifo device works in lustre ======================"
4931 cp -aL /dev/console $f
4932 echo $string > $f || error "echo $string to $f failed"
4934 run_test 54e "console/tty device works in lustre ======================"
4938 local dir=$DIR/$tdir
4941 test_mkdir -p $dir/dir
4942 for i in $(seq $numfiles); do
4944 touch $dir/dir/file$i
4947 local numcomp=$($LFS getstripe --component-count $dir)
4949 [[ $numcomp == 0 ]] && numcomp=1
4951 # test lfs getstripe with --recursive
4952 local filenum=$($LFS getstripe -r $dir | egrep -c "obdidx|l_ost_idx")
4954 [[ $filenum -eq $((numfiles * 2)) ]] ||
4955 error "$LFS getstripe -r: found $filenum != $((numfiles * 2))"
4956 filenum=$($LFS getstripe $dir | egrep -c "obdidx|l_ost_idx")
4957 [[ $filenum -eq $numfiles ]] ||
4958 error "$LFS getstripe $dir: found $filenum, not $numfiles"
4959 echo "$LFS getstripe showed obdidx or l_ost_idx"
4961 # test lfs getstripe with file instead of dir
4962 filenum=$($LFS getstripe $dir/file1 | egrep -c "obdidx|l_ost_idx")
4963 [[ $filenum -eq 1 ]] ||
4964 error "$LFS getstripe $dir/file1: found $filenum, not 1"
4965 echo "$LFS getstripe file1 passed"
4967 #test lfs getstripe with --verbose
4968 filenum=$($LFS getstripe --verbose $dir | grep -c lmm_magic)
4969 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
4970 error "$LFS getstripe --verbose $dir: "\
4971 "got $filenum want $((numfiles * numcomp)) lmm_magic"
4972 [[ $($LFS getstripe $dir | grep -c lmm_magic) -eq 0 ]] ||
4973 error "$LFS getstripe $dir: showed lmm_magic"
4975 #test lfs getstripe with -v prints lmm_fid
4976 filenum=$($LFS getstripe -v $dir | grep -c lmm_fid)
4977 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
4978 error "$LFS getstripe -v $dir: "\
4979 "got $filenum want $((numfiles * numcomp)) lmm_fid"
4980 [[ $($LFS getstripe $dir | grep -c lmm_fid) -eq 0 ]] ||
4981 error "$LFS getstripe $dir: showed lmm_fid by default"
4982 echo "$LFS getstripe --verbose passed"
4984 #check for FID information
4985 local fid1=$($LFS getstripe --fid $dir/file1)
4986 local fid2=$($LFS getstripe --verbose $dir/file1 |
4987 awk '/lmm_fid: / { print $2; exit; }')
4988 local fid3=$($LFS path2fid $dir/file1)
4990 [ "$fid1" != "$fid2" ] &&
4991 error "getstripe --fid '$fid1' != getstripe --verbose '$fid2'"
4992 [ "$fid1" != "$fid3" ] &&
4993 error "getstripe --fid '$fid1' != lfs path2fid '$fid3'"
4994 echo "$LFS getstripe --fid passed"
4996 #test lfs getstripe with --obd
4997 $LFS getstripe --obd wrong_uuid $dir 2>&1 | grep -q "unknown obduuid" ||
4998 error "$LFS getstripe --obd wrong_uuid: should return error"
5000 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5003 local obduuid=$(ostuuid_from_index $ostidx)
5004 local found=$($LFS getstripe -r --obd $obduuid $dir |
5005 grep 'lmm_stripe_offset:' | grep -c " $ostidx\$")
5007 filenum=$($LFS getstripe -ir $dir | grep -c "^$ostidx\$")
5008 [[ $($LFS getstripe -id $dir) -ne $ostidx ]] ||
5010 [[ $($LFS getstripe -id $dir/dir) -ne $ostidx ]] ||
5013 [[ $found -eq $filenum ]] ||
5014 error "$LFS getstripe --obd: found $found expect $filenum"
5015 [[ $($LFS getstripe -r -v --obd $obduuid $dir |
5016 sed '/^[ ]*'${ostidx}'[ ]/d' |
5017 sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] ||
5018 error "$LFS getstripe --obd: should not show file on other obd"
5019 echo "$LFS getstripe --obd passed"
5021 run_test 56a "check $LFS getstripe"
5024 local dir=$DIR/$tdir
5028 for i in $(seq $numdirs); do
5029 test_mkdir $dir/dir$i
5032 # test lfs getdirstripe default mode is non-recursion, which is
5033 # different from lfs getstripe
5034 local dircnt=$($LFS getdirstripe $dir | grep -c lmv_stripe_count)
5036 [[ $dircnt -eq 1 ]] ||
5037 error "$LFS getdirstripe: found $dircnt, not 1"
5038 dircnt=$($LFS getdirstripe --recursive $dir |
5039 grep -c lmv_stripe_count)
5040 [[ $dircnt -eq $((numdirs + 1)) ]] ||
5041 error "$LFS getdirstripe -r: $dircnt, != $((numdirs + 1))"
5043 run_test 56b "check $LFS getdirstripe"
5046 remote_ost_nodsh && skip "remote OST with nodsh"
5049 local ost_name=$(ostname_from_index $ost_idx)
5050 local old_status=$(ost_dev_status $ost_idx)
5052 [[ -z "$old_status" ]] ||
5053 skip_env "OST $ost_name is in $old_status status"
5055 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
5056 [[ $OST1_VERSION -ge $(version_code 2.12.3) ]] && do_facet ost1 \
5057 $LCTL set_param -n obdfilter.$ost_name.no_precreate=1
5060 local new_status=$(ost_dev_status $ost_idx)
5062 [[ "$new_status" =~ "D" ]] ||
5063 error "$ost_name status is '$new_status', missing 'D'"
5064 if [[ $OST1_VERSION -ge $(version_code 2.12.3) ]]; then
5065 [[ "$new_status" =~ "N" ]] ||
5066 error "$ost_name status is '$new_status', missing 'N'"
5069 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
5070 [[ $OST1_VERSION -ge $(version_code 2.12.3) ]] && do_facet ost1 \
5071 $LCTL set_param -n obdfilter.$ost_name.no_precreate=0
5074 new_status=$(ost_dev_status $ost_idx)
5075 [[ ! "$new_status" =~ "D" && ! "$new_status" =~ "N" ]] ||
5076 error "$ost_name status is '$new_status', has 'D' and/or 'N'"
5078 run_test 56c "check 'lfs df' showing device status"
5083 local local_tdir="$1"
5084 local local_numfiles="$2"
5085 local local_numdirs="$3"
5086 local dir_params="$4"
5087 local dir_stripe_params="$5"
5089 if [ ! -d "$local_tdir" ] ; then
5090 test_mkdir -p $dir_stripe_params $local_tdir
5091 [ "$dir_params" ] && $LFS setstripe $dir_params $local_tdir
5092 for i in $(seq $local_numfiles) ; do
5093 touch $local_tdir/file$i
5095 for i in $(seq $local_numdirs) ; do
5096 test_mkdir $dir_stripe_params $local_tdir/dir$i
5097 for j in $(seq $local_numfiles) ; do
5098 touch $local_tdir/dir$i/file$j
5104 setup_56_special() {
5106 local local_numfiles=$2
5107 local local_numdirs=$3
5109 setup_56 $local_tdir $local_numfiles $local_numdirs
5111 if [ ! -e "$local_tdir/loop${local_numfiles}b" ] ; then
5112 for i in $(seq $local_numfiles) ; do
5113 mknod $local_tdir/loop${i}b b 7 $i
5114 mknod $local_tdir/null${i}c c 1 3
5115 ln -s $local_tdir/file1 $local_tdir/link${i}
5117 for i in $(seq $local_numdirs) ; do
5118 mknod $local_tdir/dir$i/loop${i}b b 7 $i
5119 mknod $local_tdir/dir$i/null${i}c c 1 3
5120 ln -s $local_tdir/dir$i/file1 $local_tdir/dir$i/link${i}
5126 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5127 local expected=$(($NUMDIRS + 2))
5129 setup_56 $dir $NUMFILES $NUMDIRS
5131 # test lfs find with -name
5132 for i in $(seq $NUMFILES) ; do
5133 local nums=$($LFS find -name "*$i" $dir | wc -l)
5135 [ $nums -eq $expected ] ||
5136 error "lfs find -name '*$i' $dir wrong: "\
5137 "found $nums, expected $expected"
5140 run_test 56g "check lfs find -name"
5143 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5144 local expected=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES))
5146 setup_56 $dir $NUMFILES $NUMDIRS
5148 # test lfs find with ! -name
5149 for i in $(seq $NUMFILES) ; do
5150 local nums=$($LFS find ! -name "*$i" $dir | wc -l)
5152 [ $nums -eq $expected ] ||
5153 error "lfs find ! -name '*$i' $dir wrong: "\
5154 "found $nums, expected $expected"
5157 run_test 56h "check lfs find ! -name"
5160 local dir=$DIR/$tdir
5164 local cmd="$LFS find -ost $(ostuuid_from_index 0 $dir) $dir"
5167 [ -z "$out" ] || error "'$cmd' returned directory '$out'"
5169 run_test 56i "check 'lfs find -ost UUID' skips directories"
5172 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5174 setup_56_special $dir $NUMFILES $NUMDIRS
5176 local expected=$((NUMDIRS + 1))
5177 local cmd="$LFS find -type d $dir"
5178 local nums=$($cmd | wc -l)
5180 [ $nums -eq $expected ] ||
5181 error "'$cmd' wrong: found $nums, expected $expected"
5183 run_test 56j "check lfs find -type d"
5186 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5188 setup_56_special $dir $NUMFILES $NUMDIRS
5190 local expected=$(((NUMDIRS + 1) * NUMFILES))
5191 local cmd="$LFS find -type f $dir"
5192 local nums=$($cmd | wc -l)
5194 [ $nums -eq $expected ] ||
5195 error "'$cmd' wrong: found $nums, expected $expected"
5197 run_test 56k "check lfs find -type f"
5200 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5202 setup_56_special $dir $NUMFILES $NUMDIRS
5204 local expected=$((NUMDIRS + NUMFILES))
5205 local cmd="$LFS find -type b $dir"
5206 local nums=$($cmd | wc -l)
5208 [ $nums -eq $expected ] ||
5209 error "'$cmd' wrong: found $nums, expected $expected"
5211 run_test 56l "check lfs find -type b"
5214 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5216 setup_56_special $dir $NUMFILES $NUMDIRS
5218 local expected=$((NUMDIRS + NUMFILES))
5219 local cmd="$LFS find -type c $dir"
5220 local nums=$($cmd | wc -l)
5221 [ $nums -eq $expected ] ||
5222 error "'$cmd' wrong: found $nums, expected $expected"
5224 run_test 56m "check lfs find -type c"
5227 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5228 setup_56_special $dir $NUMFILES $NUMDIRS
5230 local expected=$((NUMDIRS + NUMFILES))
5231 local cmd="$LFS find -type l $dir"
5232 local nums=$($cmd | wc -l)
5234 [ $nums -eq $expected ] ||
5235 error "'$cmd' wrong: found $nums, expected $expected"
5237 run_test 56n "check lfs find -type l"
5240 local dir=$DIR/$tdir
5242 setup_56 $dir $NUMFILES $NUMDIRS
5243 utime $dir/file1 > /dev/null || error "utime (1)"
5244 utime $dir/file2 > /dev/null || error "utime (2)"
5245 utime $dir/dir1 > /dev/null || error "utime (3)"
5246 utime $dir/dir2 > /dev/null || error "utime (4)"
5247 utime $dir/dir1/file1 > /dev/null || error "utime (5)"
5248 dd if=/dev/zero count=1 >> $dir/dir1/file1 && sync
5251 local nums=$($LFS find -mtime +0 $dir | wc -l)
5253 [ $nums -eq $expected ] ||
5254 error "lfs find -mtime +0 $dir: found $nums expect $expected"
5257 cmd="$LFS find -mtime 0 $dir"
5258 nums=$($cmd | wc -l)
5259 [ $nums -eq $expected ] ||
5260 error "'$cmd' wrong: found $nums, expected $expected"
5262 run_test 56o "check lfs find -mtime for old files"
5265 [ $RUNAS_ID -eq $UID ] &&
5266 skip_env "RUNAS_ID = UID = $UID -- skipping"
5268 local dir=$DIR/$tdir
5270 setup_56 $dir $NUMFILES $NUMDIRS
5271 chown $RUNAS_ID $dir/file* || error "chown $DIR/${tdir}g/file$i failed"
5273 local expected=$NUMFILES
5274 local cmd="$LFS find -uid $RUNAS_ID $dir"
5275 local nums=$($cmd | wc -l)
5277 [ $nums -eq $expected ] ||
5278 error "'$cmd' wrong: found $nums, expected $expected"
5280 expected=$(((NUMFILES + 1) * NUMDIRS + 1))
5281 cmd="$LFS find ! -uid $RUNAS_ID $dir"
5282 nums=$($cmd | wc -l)
5283 [ $nums -eq $expected ] ||
5284 error "'$cmd' wrong: found $nums, expected $expected"
5286 run_test 56p "check lfs find -uid and ! -uid"
5289 [ $RUNAS_ID -eq $UID ] &&
5290 skip_env "RUNAS_ID = UID = $UID -- skipping"
5292 local dir=$DIR/$tdir
5294 setup_56 $dir $NUMFILES $NUMDIRS
5295 chgrp $RUNAS_GID $dir/file* || error "chown $dir/file$i failed"
5297 local expected=$NUMFILES
5298 local cmd="$LFS find -gid $RUNAS_GID $dir"
5299 local nums=$($cmd | wc -l)
5301 [ $nums -eq $expected ] ||
5302 error "'$cmd' wrong: found $nums, expected $expected"
5304 expected=$(( ($NUMFILES+1) * $NUMDIRS + 1))
5305 cmd="$LFS find ! -gid $RUNAS_GID $dir"
5306 nums=$($cmd | wc -l)
5307 [ $nums -eq $expected ] ||
5308 error "'$cmd' wrong: found $nums, expected $expected"
5310 run_test 56q "check lfs find -gid and ! -gid"
5313 local dir=$DIR/$tdir
5315 setup_56 $dir $NUMFILES $NUMDIRS
5318 local cmd="$LFS find -size 0 -type f -lazy $dir"
5319 local nums=$($cmd | wc -l)
5321 [ $nums -eq $expected ] ||
5322 error "'$cmd' wrong: found $nums, expected $expected"
5323 cmd="$LFS find -size 0 -type f $dir"
5324 nums=$($cmd | wc -l)
5325 [ $nums -eq $expected ] ||
5326 error "'$cmd' wrong: found $nums, expected $expected"
5329 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5330 nums=$($cmd | wc -l)
5331 [ $nums -eq $expected ] ||
5332 error "'$cmd' wrong: found $nums, expected $expected"
5333 cmd="$LFS find ! -size 0 -type f $dir"
5334 nums=$($cmd | wc -l)
5335 [ $nums -eq $expected ] ||
5336 error "'$cmd' wrong: found $nums, expected $expected"
5338 echo "test" > $dir/$tfile
5339 echo "test2" > $dir/$tfile.2 && sync
5341 cmd="$LFS find -size 5 -type f -lazy $dir"
5342 nums=$($cmd | wc -l)
5343 [ $nums -eq $expected ] ||
5344 error "'$cmd' wrong: found $nums, expected $expected"
5345 cmd="$LFS find -size 5 -type f $dir"
5346 nums=$($cmd | wc -l)
5347 [ $nums -eq $expected ] ||
5348 error "'$cmd' wrong: found $nums, expected $expected"
5351 cmd="$LFS find -size +5 -type f -lazy $dir"
5352 nums=$($cmd | wc -l)
5353 [ $nums -eq $expected ] ||
5354 error "'$cmd' wrong: found $nums, expected $expected"
5355 cmd="$LFS find -size +5 -type f $dir"
5356 nums=$($cmd | wc -l)
5357 [ $nums -eq $expected ] ||
5358 error "'$cmd' wrong: found $nums, expected $expected"
5361 cmd="$LFS find -size +0 -type f -lazy $dir"
5362 nums=$($cmd | wc -l)
5363 [ $nums -eq $expected ] ||
5364 error "'$cmd' wrong: found $nums, expected $expected"
5365 cmd="$LFS find -size +0 -type f $dir"
5366 nums=$($cmd | wc -l)
5367 [ $nums -eq $expected ] ||
5368 error "'$cmd' wrong: found $nums, expected $expected"
5371 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5372 nums=$($cmd | wc -l)
5373 [ $nums -eq $expected ] ||
5374 error "'$cmd' wrong: found $nums, expected $expected"
5375 cmd="$LFS find ! -size -5 -type f $dir"
5376 nums=$($cmd | wc -l)
5377 [ $nums -eq $expected ] ||
5378 error "'$cmd' wrong: found $nums, expected $expected"
5381 cmd="$LFS find -size -5 -type f -lazy $dir"
5382 nums=$($cmd | wc -l)
5383 [ $nums -eq $expected ] ||
5384 error "'$cmd' wrong: found $nums, expected $expected"
5385 cmd="$LFS find -size -5 -type f $dir"
5386 nums=$($cmd | wc -l)
5387 [ $nums -eq $expected ] ||
5388 error "'$cmd' wrong: found $nums, expected $expected"
5390 run_test 56r "check lfs find -size works"
5397 cancel_lru_locks $OSC
5399 local rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5400 local nums=$($cmd | wc -l)
5402 [ $nums -eq $expected ] ||
5403 error "'$cmd' wrong: found $nums, expected $expected"
5405 local rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5407 if (( rpcs_before + glimpses != rpcs_after )); then
5408 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5409 $LCTL get_param osc.*.stats | grep ldlm_glimpse_enqueue
5411 if [[ $glimpses == 0 ]]; then
5412 error "'$cmd' should not send glimpse RPCs to OST"
5414 error "'$cmd' should send $glimpses glimpse RPCs to OST"
5420 [[ $MDS1_VERSION -ge $(version_code 2.12.4) ]] ||
5421 skip "MDS < 2.12.4 doesn't return LSOM data"
5422 local dir=$DIR/$tdir
5424 [[ $OSC == "mdc" ]] && skip "DoM files"
5426 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5427 # open and close all files to ensure LSOM is updated
5428 cancel_lru_locks $OSC
5429 find $dir -type f | xargs cat > /dev/null
5431 # expect_found glimpse_rpcs command_to_run
5432 test_56ra_sub 12 0 "$LFS find -size 0 -type f -lazy $dir"
5433 test_56ra_sub 12 12 "$LFS find -size 0 -type f $dir"
5434 test_56ra_sub 0 0 "$LFS find ! -size 0 -type f -lazy $dir"
5435 test_56ra_sub 0 12 "$LFS find ! -size 0 -type f $dir"
5437 echo "test" > $dir/$tfile
5438 echo "test2" > $dir/$tfile.2 && sync
5439 cancel_lru_locks $OSC
5440 cat $dir/$tfile $dir/$tfile.2 > /dev/null
5442 test_56ra_sub 1 0 "$LFS find -size 5 -type f -lazy $dir"
5443 test_56ra_sub 1 14 "$LFS find -size 5 -type f $dir"
5444 test_56ra_sub 1 0 "$LFS find -size +5 -type f -lazy $dir"
5445 test_56ra_sub 1 14 "$LFS find -size +5 -type f $dir"
5447 test_56ra_sub 2 0 "$LFS find -size +0 -type f -lazy $dir"
5448 test_56ra_sub 2 14 "$LFS find -size +0 -type f $dir"
5449 test_56ra_sub 2 0 "$LFS find ! -size -5 -type f -lazy $dir"
5450 test_56ra_sub 2 14 "$LFS find ! -size -5 -type f $dir"
5451 test_56ra_sub 12 0 "$LFS find -size -5 -type f -lazy $dir"
5452 test_56ra_sub 12 14 "$LFS find -size -5 -type f $dir"
5454 run_test 56ra "check lfs find -size -lazy works for data on OSTs"
5456 test_56s() { # LU-611 #LU-9369
5457 [[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
5459 local dir=$DIR/$tdir
5460 local onestripe=$(((NUMDIRS + 1) * NUMFILES))
5462 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5463 for i in $(seq $NUMDIRS); do
5464 $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile
5467 local expected=$NUMDIRS
5468 local cmd="$LFS find -c $OSTCOUNT $dir"
5469 local nums=$($cmd | wc -l)
5471 [ $nums -eq $expected ] || {
5472 $LFS getstripe -R $dir
5473 error "'$cmd' wrong: found $nums, expected $expected"
5476 expected=$((NUMDIRS + onestripe))
5477 cmd="$LFS find -stripe-count +0 -type f $dir"
5478 nums=$($cmd | wc -l)
5479 [ $nums -eq $expected ] || {
5480 $LFS getstripe -R $dir
5481 error "'$cmd' wrong: found $nums, expected $expected"
5485 cmd="$LFS find -stripe-count 1 -type f $dir"
5486 nums=$($cmd | wc -l)
5487 [ $nums -eq $expected ] || {
5488 $LFS getstripe -R $dir
5489 error "'$cmd' wrong: found $nums, expected $expected"
5492 cmd="$LFS find -stripe-count -2 -type f $dir"
5493 nums=$($cmd | wc -l)
5494 [ $nums -eq $expected ] || {
5495 $LFS getstripe -R $dir
5496 error "'$cmd' wrong: found $nums, expected $expected"
5500 cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir"
5501 nums=$($cmd | wc -l)
5502 [ $nums -eq $expected ] || {
5503 $LFS getstripe -R $dir
5504 error "'$cmd' wrong: found $nums, expected $expected"
5507 run_test 56s "check lfs find -stripe-count works"
5509 test_56t() { # LU-611 #LU-9369
5510 local dir=$DIR/$tdir
5512 setup_56 $dir 0 $NUMDIRS
5513 for i in $(seq $NUMDIRS); do
5514 $LFS setstripe -S 8M $dir/dir$i/$tfile
5517 local expected=$NUMDIRS
5518 local cmd="$LFS find -S 8M $dir"
5519 local nums=$($cmd | wc -l)
5521 [ $nums -eq $expected ] || {
5522 $LFS getstripe -R $dir
5523 error "'$cmd' wrong: found $nums, expected $expected"
5527 setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k"
5529 $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3}
5531 expected=$(((NUMDIRS + 1) * NUMFILES))
5532 cmd="$LFS find -stripe-size 512k -type f $dir"
5533 nums=$($cmd | wc -l)
5534 [ $nums -eq $expected ] ||
5535 error "'$cmd' wrong: found $nums, expected $expected"
5537 cmd="$LFS find -stripe-size +320k -type f $dir"
5538 nums=$($cmd | wc -l)
5539 [ $nums -eq $expected ] ||
5540 error "'$cmd' wrong: found $nums, expected $expected"
5542 expected=$(((NUMDIRS + 1) * NUMFILES + 4))
5543 cmd="$LFS find -stripe-size +200k -type f $dir"
5544 nums=$($cmd | wc -l)
5545 [ $nums -eq $expected ] ||
5546 error "'$cmd' wrong: found $nums, expected $expected"
5548 cmd="$LFS find -stripe-size -640k -type f $dir"
5549 nums=$($cmd | wc -l)
5550 [ $nums -eq $expected ] ||
5551 error "'$cmd' wrong: found $nums, expected $expected"
5554 cmd="$LFS find -stripe-size 256k -type f $dir"
5555 nums=$($cmd | wc -l)
5556 [ $nums -eq $expected ] ||
5557 error "'$cmd' wrong: found $nums, expected $expected"
5559 cmd="$LFS find -stripe-size -320k -type f $dir"
5560 nums=$($cmd | wc -l)
5561 [ $nums -eq $expected ] ||
5562 error "'$cmd' wrong: found $nums, expected $expected"
5565 cmd="$LFS find -stripe-size 1024k -type f $dir"
5566 nums=$($cmd | wc -l)
5567 [ $nums -eq $expected ] ||
5568 error "'$cmd' wrong: found $nums, expected $expected"
5570 run_test 56t "check lfs find -stripe-size works"
5572 test_56u() { # LU-611
5573 local dir=$DIR/$tdir
5575 setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1"
5577 if [[ $OSTCOUNT -gt 1 ]]; then
5578 $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3}
5584 local expected=$(((NUMDIRS + 1) * NUMFILES))
5585 local cmd="$LFS find -stripe-index 0 -type f $dir"
5586 local nums=$($cmd | wc -l)
5588 [ $nums -eq $expected ] ||
5589 error "'$cmd' wrong: found $nums, expected $expected"
5592 cmd="$LFS find -stripe-index 1 -type f $dir"
5593 nums=$($cmd | wc -l)
5594 [ $nums -eq $expected ] ||
5595 error "'$cmd' wrong: found $nums, expected $expected"
5597 cmd="$LFS find ! -stripe-index 0 -type f $dir"
5598 nums=$($cmd | wc -l)
5599 [ $nums -eq $expected ] ||
5600 error "'$cmd' wrong: found $nums, expected $expected"
5603 # This should produce an error and not return any files
5604 cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir"
5605 nums=$($cmd 2>/dev/null | wc -l)
5606 [ $nums -eq $expected ] ||
5607 error "'$cmd' wrong: found $nums, expected $expected"
5609 if [[ $OSTCOUNT -gt 1 ]]; then
5610 expected=$(((NUMDIRS + 1) * NUMFILES + onestripe))
5611 cmd="$LFS find -stripe-index 0,1 -type f $dir"
5612 nums=$($cmd | wc -l)
5613 [ $nums -eq $expected ] ||
5614 error "'$cmd' wrong: found $nums, expected $expected"
5617 run_test 56u "check lfs find -stripe-index works"
5621 local dir=$DIR/$tdir
5623 setup_56 $dir $NUMFILES $NUMDIRS
5625 UUID=$(mdtuuid_from_index $mdt_idx $dir)
5626 [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $mdt_idx"
5628 for file in $($LFS find -m $UUID $dir); do
5629 file_midx=$($LFS getstripe -m $file)
5630 [ $file_midx -eq $mdt_idx ] ||
5631 error "lfs find -m $UUID != getstripe -m $file_midx"
5634 run_test 56v "check 'lfs find -m match with lfs getstripe -m'"
5637 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5638 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5640 local dir=$DIR/$tdir
5642 setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
5644 local stripe_size=$($LFS getstripe -S -d $dir) ||
5645 error "$LFS getstripe -S -d $dir failed"
5646 stripe_size=${stripe_size%% *}
5648 local file_size=$((stripe_size * OSTCOUNT))
5649 local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
5650 local required_space=$((file_num * file_size))
5651 local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
5653 [[ $free_space -le $((required_space / 1024)) ]] &&
5654 skip_env "need $required_space, have $free_space kbytes"
5657 local dd_count=$((file_size / dd_bs))
5659 # write data into the files
5664 for i in $(seq $NUMFILES); do
5666 yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5667 error "write data into $file failed"
5669 for i in $(seq $NUMDIRS); do
5670 for j in $(seq $NUMFILES); do
5671 file=$dir/dir$i/file$j
5672 yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5673 error "write data into $file failed"
5677 # $LFS_MIGRATE will fail if hard link migration is unsupported
5678 if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then
5679 createmany -l$dir/dir1/file1 $dir/dir1/link 200 ||
5680 error "creating links to $dir/dir1/file1 failed"
5685 [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
5688 local cmd="$LFS_MIGRATE -y -c $expected $dir/file1"
5691 eval $cmd || error "$cmd failed"
5693 check_stripe_count $dir/file1 $expected
5695 if [ $MDS1_VERSION -ge $(version_code 2.6.90) ];
5697 # lfs_migrate file onto OST 0 if it is on OST 1, or onto
5698 # OST 1 if it is on OST 0. This file is small enough to
5699 # be on only one stripe.
5700 file=$dir/migr_1_ost
5701 dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
5702 error "write data into $file failed"
5703 local obdidx=$($LFS getstripe -i $file)
5704 local oldmd5=$(md5sum $file)
5707 [[ $obdidx -eq 0 ]] && newobdidx=1
5708 cmd="$LFS migrate -i $newobdidx $file"
5710 eval $cmd || error "$cmd failed"
5712 local realobdix=$($LFS getstripe -i $file)
5713 local newmd5=$(md5sum $file)
5715 [[ $newobdidx -ne $realobdix ]] &&
5716 error "new OST is different (was=$obdidx, "\
5717 "wanted=$newobdidx, got=$realobdix)"
5718 [[ "$oldmd5" != "$newmd5" ]] &&
5719 error "md5sum differ: $oldmd5, $newmd5"
5723 cmd="$LFS_MIGRATE -y -c $expected $dir/dir1"
5725 eval $cmd || error "$cmd failed"
5727 for j in $(seq $NUMFILES); do
5728 check_stripe_count $dir/dir1/file$j $expected
5731 # lfs_migrate works with lfs find
5732 cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir |
5733 $LFS_MIGRATE -y -c $expected"
5735 eval $cmd || error "$cmd failed"
5737 for i in $(seq 2 $NUMFILES); do
5738 check_stripe_count $dir/file$i $expected
5740 for i in $(seq 2 $NUMDIRS); do
5741 for j in $(seq $NUMFILES); do
5742 check_stripe_count $dir/dir$i/file$j $expected
5746 run_test 56w "check lfs_migrate -c stripe_count works"
5749 local file1=$DIR/$tdir/file1
5750 local create_pool=false
5751 local initial_pool=$($LFS getstripe -p $DIR)
5755 echo -n "Creating test dir..."
5756 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5759 echo -n "Creating test file..."
5760 touch $file1 || error "cannot create file"
5763 echo -n "Detecting existing pools..."
5764 pool_list=($($LFS pool_list $FSNAME | grep "$FSNAME\." | cut -d. -f2))
5766 if [ ${#pool_list[@]} -gt 0 ]; then
5767 echo "${pool_list[@]}"
5768 for thispool in "${pool_list[@]}"; do
5769 if [[ -z "$initial_pool" ||
5770 "$initial_pool" != "$thispool" ]]; then
5772 echo "Using existing pool '$pool'"
5777 echo "none detected."
5779 if [ -z "$pool" ]; then
5780 pool=${POOL:-testpool}
5781 [ "$initial_pool" = "$pool" ] && pool="testpool2"
5782 echo -n "Creating pool '$pool'..."
5784 pool_add $pool &> /dev/null ||
5785 error "pool_add failed"
5788 echo -n "Adding target to pool..."
5789 pool_add_targets $pool 0 0 1 &> /dev/null ||
5790 error "pool_add_targets failed"
5794 echo -n "Setting pool using -p option..."
5795 $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null ||
5796 error "migrate failed rc = $?"
5799 echo -n "Verifying test file is in pool after migrating..."
5800 [ "$($LFS getstripe -p $file1)" = $pool ] ||
5801 error "file was not migrated to pool $pool"
5804 echo -n "Removing test file from pool '$pool'..."
5805 # "lfs migrate $file" won't remove the file from the pool
5806 # until some striping information is changed.
5807 $LFS migrate -c 1 $file1 &> /dev/null ||
5808 error "cannot remove from pool"
5809 [ "$($LFS getstripe -p $file1)" ] &&
5810 error "pool still set"
5813 echo -n "Setting pool using --pool option..."
5814 $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null ||
5815 error "migrate failed rc = $?"
5820 if $create_pool; then
5821 destroy_test_pools 2> /dev/null ||
5822 error "destroy test pools failed"
5825 run_test 56wb "check lfs_migrate pool support"
5828 local file1="$DIR/$tdir/file1"
5835 echo -n "Creating test dir..."
5836 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5837 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
5838 error "cannot set stripe by '-S 1M -c 1'"
5841 echo -n "Setting initial stripe for test file..."
5842 $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
5843 error "cannot set stripe"
5844 cur_ssize=$($LFS getstripe -S "$file1")
5845 [ $cur_ssize -eq 524288 ] || error "setstripe -S $cur_ssize != 524288"
5848 # File currently set to -S 512K -c 1
5850 # Ensure -c and -S options are rejected when -R is set
5851 echo -n "Verifying incompatible options are detected..."
5852 $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null &&
5853 error "incompatible -c and -R options not detected"
5854 $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null &&
5855 error "incompatible -S and -R options not detected"
5858 # Ensure unrecognized options are passed through to 'lfs migrate'
5859 echo -n "Verifying -S option is passed through to lfs migrate..."
5860 $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
5861 error "migration failed"
5862 cur_ssize=$($LFS getstripe -S "$file1")
5863 [ $cur_ssize -eq 1048576 ] || error "migrate -S $cur_ssize != 1048576"
5866 # File currently set to -S 1M -c 1
5868 # Ensure long options are supported
5869 echo -n "Verifying long options supported..."
5870 $LFS_MIGRATE -y --non-block "$file1" &> /dev/null ||
5871 error "long option without argument not supported"
5872 $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
5873 error "long option with argument not supported"
5874 cur_ssize=$($LFS getstripe -S "$file1")
5875 [ $cur_ssize -eq 524288 ] ||
5876 error "migrate --stripe-size $cur_ssize != 524288"
5879 # File currently set to -S 512K -c 1
5881 if [ "$OSTCOUNT" -gt 1 ]; then
5882 echo -n "Verifying explicit stripe count can be set..."
5883 $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
5884 error "migrate failed"
5885 cur_scount=$($LFS getstripe -c "$file1")
5886 [ $cur_scount -eq 2 ] || error "migrate -c $cur_scount != 2"
5890 # File currently set to -S 512K -c 1 or -S 512K -c 2
5892 # Ensure parent striping is used if -R is set, and no stripe
5893 # count or size is specified
5894 echo -n "Setting stripe for parent directory..."
5895 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5896 error "cannot set stripe '-S 2M -c 1'"
5899 echo -n "Verifying restripe option uses parent stripe settings..."
5900 parent_ssize=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
5901 parent_scount=$($LFS getstripe -c $DIR/$tdir 2>/dev/null)
5902 $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
5903 error "migrate failed"
5904 cur_ssize=$($LFS getstripe -S "$file1")
5905 [ $cur_ssize -eq $parent_ssize ] ||
5906 error "migrate -R stripe_size $cur_ssize != $parent_ssize"
5907 cur_scount=$($LFS getstripe -c "$file1")
5908 [ $cur_scount -eq $parent_scount ] ||
5909 error "migrate -R stripe_count $cur_scount != $parent_scount"
5912 # File currently set to -S 1M -c 1
5914 # Ensure striping is preserved if -R is not set, and no stripe
5915 # count or size is specified
5916 echo -n "Verifying striping size preserved when not specified..."
5917 orig_ssize=$($LFS getstripe -S "$file1" 2>/dev/null)
5918 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5919 error "cannot set stripe on parent directory"
5920 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5921 error "migrate failed"
5922 cur_ssize=$($LFS getstripe -S "$file1")
5923 [ $cur_ssize -eq $orig_ssize ] ||
5924 error "migrate by default $cur_ssize != $orig_ssize"
5927 # Ensure file name properly detected when final option has no argument
5928 echo -n "Verifying file name properly detected..."
5929 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5930 error "file name interpreted as option argument"
5936 run_test 56wc "check unrecognized options for lfs_migrate are passed through"
5939 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5941 local file1=$DIR/$tdir/file1
5943 echo -n "Creating test dir..."
5944 test_mkdir $DIR/$tdir || error "cannot create dir"
5947 echo -n "Creating test file..."
5951 # Ensure 'lfs migrate' will fail by using a non-existent option,
5952 # and make sure rsync is not called to recover
5953 echo -n "Make sure --no-rsync option works..."
5954 $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 |
5955 grep -q 'refusing to fall back to rsync' ||
5956 error "rsync was called with --no-rsync set"
5959 # Ensure rsync is called without trying 'lfs migrate' first
5960 echo -n "Make sure --rsync option works..."
5961 $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 |
5962 grep -q 'falling back to rsync' &&
5963 error "lfs migrate was called with --rsync set"
5966 echo -n "Make sure --rsync and --no-rsync options are exclusive..."
5967 $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 |
5968 grep -q 'at the same time' ||
5969 error "--rsync and --no-rsync accepted concurrently"
5975 run_test 56wd "check lfs_migrate --rsync and --no-rsync work"
5978 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5979 check_swap_layouts_support
5981 local dir=$DIR/$tdir
5982 local ref1=/etc/passwd
5983 local file1=$dir/file1
5985 test_mkdir $dir || error "creating dir $dir"
5986 $LFS setstripe -c 2 $file1
5988 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
5989 stripe=$($LFS getstripe -c $file1)
5990 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
5991 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
5996 run_test 56x "lfs migration support"
5999 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6000 check_swap_layouts_support
6002 local dir=$DIR/$tdir/$testnum
6006 local ref1=/etc/passwd
6007 local file1=$dir/file1
6009 $LFS setstripe -c 2 $file1
6011 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
6013 local stripe=$($LFS getstripe -c $file1)
6015 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6016 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6021 run_test 56xa "lfs migration --block support"
6023 check_migrate_links() {
6025 local file1="$dir/file1"
6028 local total_count=$(($begin + $count - 1))
6029 local symlink_count=10
6032 if [ ! -f "$file1" ]; then
6033 echo -n "creating initial file..."
6034 $LFS setstripe -c 1 -S "512k" "$file1" ||
6035 error "cannot setstripe initial file"
6038 echo -n "creating symlinks..."
6039 for s in $(seq 1 $symlink_count); do
6040 ln -s "$file1" "$dir/slink$s" ||
6041 error "cannot create symlinks"
6045 echo -n "creating nonlinked files..."
6046 createmany -o "$dir/uniq" 1 10 &> /dev/null ||
6047 error "cannot create nonlinked files"
6052 if [ ! -f "$dir/file$total_count" ]; then
6053 echo -n "creating hard links $begin:$total_count..."
6054 createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
6055 /dev/null || error "cannot create hard links"
6059 echo -n "checking number of hard links listed in xattrs..."
6060 local fid=$($LFS getstripe -F "$file1")
6061 local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
6064 if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
6065 skip "hard link list has unexpected size, skipping test"
6067 if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
6068 error "link names should exceed xattrs size"
6071 echo -n "migrating files..."
6072 local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir)
6074 [ $rc -eq 0 ] || error "migrate failed rc = $rc"
6077 # make sure all links have been properly migrated
6078 echo -n "verifying files..."
6079 fid=$($LFS getstripe -F "$file1") ||
6080 error "cannot get fid for file $file1"
6081 for i in $(seq 2 $total_count); do
6082 local fid2=$($LFS getstripe -F $dir/file$i)
6084 [ "$fid2" == "$fid" ] ||
6085 error "migrated hard link has mismatched FID"
6088 # make sure hard links were properly detected, and migration was
6089 # performed only once for the entire link set; nonlinked files should
6091 local actual=$(grep -c 'done' <<< "$migrate_out")
6092 local expected=$(($uniq_count + 1))
6094 [ "$actual" -eq "$expected" ] ||
6095 error "hard links individually migrated ($actual != $expected)"
6097 # make sure the correct number of hard links are present
6098 local hardlinks=$(stat -c '%h' "$file1")
6100 [ $hardlinks -eq $total_count ] ||
6101 error "num hard links $hardlinks != $total_count"
6108 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
6109 skip "Need MDS version at least 2.10.55"
6111 local dir="$DIR/$tdir"
6113 test_mkdir "$dir" || error "cannot create dir $dir"
6115 echo "testing lfs migrate mode when all links fit within xattrs"
6116 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 2 99
6118 echo "testing rsync mode when all links fit within xattrs"
6119 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 2 99
6121 echo "testing lfs migrate mode when all links do not fit within xattrs"
6122 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100
6124 echo "testing rsync mode when all links do not fit within xattrs"
6125 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 101 100
6131 run_test 56xb "lfs migration hard link support"
6134 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6136 local dir="$DIR/$tdir"
6138 test_mkdir "$dir" || error "cannot create dir $dir"
6140 # Test 1: ensure file < 1 GB is always migrated with 1 stripe
6141 echo -n "Setting initial stripe for 20MB test file..."
6142 $LFS setstripe -c 2 -i 0 "$dir/20mb" ||
6143 error "cannot setstripe 20MB file"
6145 echo -n "Sizing 20MB test file..."
6146 truncate "$dir/20mb" 20971520 || error "cannot create 20MB test file"
6148 echo -n "Verifying small file autostripe count is 1..."
6149 $LFS_MIGRATE -y -A -C 1 "$dir/20mb" ||
6150 error "cannot migrate 20MB file"
6151 local stripe_count=$($LFS getstripe -c "$dir/20mb") ||
6152 error "cannot get stripe for $dir/20mb"
6153 [ $stripe_count -eq 1 ] ||
6154 error "unexpected stripe count $stripe_count for 20MB file"
6158 # Test 2: File is small enough to fit within the available space on
6159 # sqrt(size_in_gb) + 1 OSTs but is larger than 1GB. The file must
6160 # have at least an additional 1KB for each desired stripe for test 3
6161 echo -n "Setting stripe for 1GB test file..."
6162 $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe 1GB file"
6164 echo -n "Sizing 1GB test file..."
6165 # File size is 1GB + 3KB
6166 truncate "$dir/1gb" 1073744896 || error "cannot create 1GB test file"
6169 # need at least 512MB per OST for 1GB file to fit in 2 stripes
6170 local avail=$($LCTL get_param -n llite.$FSNAME*.kbytesavail)
6171 if (( avail > 524288 * OSTCOUNT )); then
6172 echo -n "Migrating 1GB file..."
6173 $LFS_MIGRATE -y -A -C 1 "$dir/1gb" ||
6174 error "cannot migrate 1GB file"
6176 echo -n "Verifying autostripe count is sqrt(n) + 1..."
6177 stripe_count=$($LFS getstripe -c "$dir/1gb") ||
6178 error "cannot getstripe for 1GB file"
6179 [ $stripe_count -eq 2 ] ||
6180 error "unexpected stripe count $stripe_count != 2"
6184 # Test 3: File is too large to fit within the available space on
6185 # sqrt(n) + 1 OSTs. Simulate limited available space with -X
6186 if [ $OSTCOUNT -ge 3 ]; then
6187 # The required available space is calculated as
6188 # file size (1GB + 3KB) / OST count (3).
6189 local kb_per_ost=349526
6191 echo -n "Migrating 1GB file with limit..."
6192 $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" ||
6193 error "cannot migrate 1GB file with limit"
6196 stripe_count=$($LFS getstripe -c "$dir/1gb")
6197 echo -n "Verifying 1GB autostripe count with limited space..."
6198 [ "$stripe_count" -a $stripe_count -ge 3 ] ||
6199 error "unexpected stripe count $stripe_count (min 3)"
6206 run_test 56xc "lfs migration autostripe"
6209 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6211 local dir=$DIR/$tdir
6212 local f_mgrt=$dir/$tfile.mgrt
6213 local f_yaml=$dir/$tfile.yaml
6214 local f_copy=$dir/$tfile.copy
6215 local layout_yaml="-E 1M -S 512K -c 1 -E -1 -S 1M -c 2 -i 0"
6216 local layout_copy="-c 2 -S 2M -i 1"
6217 local yamlfile=$dir/yamlfile
6218 local layout_before;
6221 test_mkdir "$dir" || error "cannot create dir $dir"
6222 $LFS setstripe $layout_yaml $f_yaml ||
6223 error "cannot setstripe $f_yaml with layout $layout_yaml"
6224 $LFS getstripe --yaml $f_yaml > $yamlfile
6225 $LFS setstripe $layout_copy $f_copy ||
6226 error "cannot setstripe $f_copy with layout $layout_copy"
6228 dd if=/dev/zero of=$f_mgrt bs=1M count=4
6230 # 1. test option --yaml
6231 $LFS_MIGRATE -y --yaml $yamlfile $f_mgrt ||
6232 error "cannot migrate $f_mgrt with --yaml $yamlfile"
6233 layout_before=$(get_layout_param $f_yaml)
6234 layout_after=$(get_layout_param $f_mgrt)
6235 [ "$layout_after" == "$layout_before" ] ||
6236 error "lfs_migrate --yaml: $layout_after != $layout_before"
6238 # 2. test option --copy
6239 $LFS_MIGRATE -y --copy $f_copy $f_mgrt ||
6240 error "cannot migrate $f_mgrt with --copy $f_copy"
6241 layout_before=$(get_layout_param $f_copy)
6242 layout_after=$(get_layout_param $f_mgrt)
6243 [ "$layout_after" == "$layout_before" ] ||
6244 error "lfs_migrate --copy: $layout_after != $layout_before"
6246 run_test 56xd "check lfs_migrate --yaml and --copy support"
6249 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6251 local dir=$DIR/$tdir
6252 local f_comp=$dir/$tfile
6253 local layout="-E 1M -S 512K -c 1 -E -1 -S 1M -c 2 -i 0"
6254 local layout_before=""
6255 local layout_after=""
6257 test_mkdir "$dir" || error "cannot create dir $dir"
6258 $LFS setstripe $layout $f_comp ||
6259 error "cannot setstripe $f_comp with layout $layout"
6260 layout_before=$(get_layout_param $f_comp)
6261 dd if=/dev/zero of=$f_comp bs=1M count=4
6263 # 1. migrate a comp layout file by lfs_migrate
6264 $LFS_MIGRATE -y $f_comp || error "cannot migrate $f_comp by lfs_migrate"
6265 layout_after=$(get_layout_param $f_comp)
6266 [ "$layout_before" == "$layout_after" ] ||
6267 error "lfs_migrate: $layout_before != $layout_after"
6269 # 2. migrate a comp layout file by lfs migrate
6270 $LFS migrate $f_comp || error "cannot migrate $f_comp by lfs migrate"
6271 layout_after=$(get_layout_param $f_comp)
6272 [ "$layout_before" == "$layout_after" ] ||
6273 error "lfs migrate: $layout_before != $layout_after"
6275 run_test 56xe "migrate a composite layout file"
6278 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
6279 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
6282 local dir=$DIR/$tdir
6286 test_mkdir -p $dir || error "creating dir $dir"
6287 touch $f1 || error "creating std file $f1"
6288 $MULTIOP $f2 H2c || error "creating released file $f2"
6290 # a directory can be raid0, so ask only for files
6291 res=$($LFS find $dir -L raid0 -type f | wc -l)
6292 [[ $res == 2 ]] || error "search raid0: found $res files != 2"
6294 res=$($LFS find $dir \! -L raid0 -type f | wc -l)
6295 [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
6297 # only files can be released, so no need to force file search
6298 res=$($LFS find $dir -L released)
6299 [[ $res == $f2 ]] || error "search released: found $res != $f2"
6301 res=$($LFS find $dir -type f \! -L released)
6302 [[ $res == $f1 ]] || error "search !released: found $res != $f1"
6304 run_test 56y "lfs find -L raid0|released"
6306 test_56z() { # LU-4824
6307 # This checks to make sure 'lfs find' continues after errors
6308 # There are two classes of errors that should be caught:
6309 # - If multiple paths are provided, all should be searched even if one
6311 # - If errors are encountered during the search, it should not terminate
6313 local dir=$DIR/$tdir
6317 for i in d{0..9}; do
6319 touch $dir/$i/$tfile
6321 $LFS find $DIR/non_existent_dir $dir &&
6322 error "$LFS find did not return an error"
6323 # Make a directory unsearchable. This should NOT be the last entry in
6324 # directory order. Arbitrarily pick the 6th entry
6325 chmod 700 $($LFS find $dir -type d | sed '6!d')
6327 $RUNAS $LFS find $DIR/non_existent $dir
6328 local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l)
6330 # The user should be able to see 10 directories and 9 files
6331 (( count == 19 )) ||
6332 error "$LFS find found $count != 19 entries after error"
6334 run_test 56z "lfs find should continue after an error"
6336 test_56aa() { # LU-5937
6337 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
6339 local dir=$DIR/$tdir
6342 $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
6344 createmany -o $dir/striped_dir/${tfile}- 1024
6345 local dirs=$($LFS find --size +8k $dir/)
6347 [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
6349 run_test 56aa "lfs find --size under striped dir"
6351 test_56ab() { # LU-10705
6352 test_mkdir $DIR/$tdir
6353 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
6354 dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
6355 dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
6356 # Flush writes to ensure valid blocks. Need to be more thorough for
6357 # ZFS, since blocks are not allocated/returned to client immediately.
6359 wait_zfs_commit ost1 2
6360 cancel_lru_locks osc
6363 local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
6365 [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
6367 files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
6368 [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
6370 rm -f $DIR/$tdir/$tfile.[123]
6372 run_test 56ab "lfs find --blocks"
6375 [ $MDS1_VERSION -lt $(version_code 2.10.50) ] &&
6376 skip "Need MDS version at least 2.10.50"
6378 # Create composite files with one component
6379 local dir=$DIR/$tdir
6381 setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
6382 # Create composite files with three components
6383 setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
6384 # Create non-composite files
6385 createmany -o $dir/${tfile}- 10
6387 local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l)
6389 [[ $nfiles == 10 ]] ||
6390 error "lfs find -E 1M found $nfiles != 10 files"
6392 nfiles=$($LFS find ! -E 1M --type f $dir | wc -l)
6393 [[ $nfiles == 25 ]] ||
6394 error "lfs find ! -E 1M found $nfiles != 25 files"
6396 # All files have a component that starts at 0
6397 nfiles=$($LFS find --component-start 0 --type f $dir | wc -l)
6398 [[ $nfiles == 35 ]] ||
6399 error "lfs find --component-start 0 - $nfiles != 35 files"
6401 nfiles=$($LFS find --component-start 2M --type f $dir | wc -l)
6402 [[ $nfiles == 15 ]] ||
6403 error "lfs find --component-start 2M - $nfiles != 15 files"
6405 # All files created here have a componenet that does not starts at 2M
6406 nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l)
6407 [[ $nfiles == 35 ]] ||
6408 error "lfs find ! --component-start 2M - $nfiles != 35 files"
6410 # Find files with a specified number of components
6411 local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l)
6412 [[ $nfiles == 15 ]] ||
6413 error "lfs find --component-count 3 - $nfiles != 15 files"
6415 # Remember non-composite files have a component count of zero
6416 local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l)
6417 [[ $nfiles == 10 ]] ||
6418 error "lfs find --component-count 0 - $nfiles != 10 files"
6420 nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l)
6421 [[ $nfiles == 20 ]] ||
6422 error "lfs find ! --component-count 3 - $nfiles != 20 files"
6424 # All files have a flag called "init"
6425 local nfiles=$($LFS find --component-flags init --type f $dir | wc -l)
6426 [[ $nfiles == 35 ]] ||
6427 error "lfs find --component-flags init - $nfiles != 35 files"
6429 # Multi-component files will have a component not initialized
6430 local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l)
6431 [[ $nfiles == 15 ]] ||
6432 error "lfs find !--component-flags init - $nfiles != 15 files"
6437 run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
6440 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
6441 skip "Need MDS version at least 2.10.57"
6451 # create mirrored directories and mirrored files
6452 mkdir $td || error "mkdir $td failed"
6453 $LFS mirror create -N3 $td || error "create mirrored dir $td failed"
6454 createmany -o $tf- 10 || error "create $tf- failed"
6456 for i in $(seq 2); do
6458 mkdir $dir || error "mkdir $dir failed"
6459 $LFS mirror create -N$((3 + i)) $dir ||
6460 error "create mirrored dir $dir failed"
6461 createmany -o $dir/$tfile- 10 ||
6462 error "create $dir/$tfile- failed"
6465 # change the states of some mirrored files
6467 for i in $(seq 2); do
6469 for j in $(seq 4 9); do
6470 echo foo > $dir/$tfile-$j
6474 # find mirrored files with specific mirror count
6475 cmd="$LFS find --mirror-count 3 --type f $td"
6476 nfiles=$($cmd | wc -l)
6477 [[ $nfiles = 10 ]] || error "$cmd: $nfiles != 10 files"
6479 cmd="$LFS find ! --mirror-count 3 --type f $td"
6480 nfiles=$($cmd | wc -l)
6481 [[ $nfiles = 20 ]] || error "$cmd: $nfiles != 20 files"
6483 cmd="$LFS find --mirror-count +2 --type f $td"
6484 nfiles=$($cmd | wc -l)
6485 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6487 cmd="$LFS find --mirror-count -6 --type f $td"
6488 nfiles=$($cmd | wc -l)
6489 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6491 # find mirrored files with specific file state
6492 cmd="$LFS find --maxdepth 1 --mirror-state=^ro --type f $td"
6493 [[ $($cmd) = $tf-6 ]] || error "$cmd: didn't return $tf-6"
6495 cmd="$LFS find --mirror-state=ro --type f $td"
6496 nfiles=$($cmd | wc -l)
6497 [[ $nfiles = 17 ]] || error "$cmd: $nfiles != 17 files"
6499 cmd="$LFS find ! --mirror-state=ro --type f $td"
6500 nfiles=$($cmd | wc -l)
6501 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6503 cmd="$LFS find --mirror-state=wp --type f $td"
6504 nfiles=$($cmd | wc -l)
6505 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6507 cmd="$LFS find ! --mirror-state=sp --type f $td"
6508 nfiles=$($cmd | wc -l)
6509 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6511 run_test 56ca "check lfs find --mirror-count|-N and --mirror-state"
6514 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6515 # note test will not do anything if MDS is not local
6516 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6517 skip_env "ldiskfs only test"
6519 remote_mds_nodsh && skip "remote MDS with nodsh"
6521 local MNTDEV="osd*.*MDT*.mntdev"
6522 DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV)
6523 [ -z "$DEV" ] && error "can't access $MNTDEV"
6524 for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
6525 do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
6526 error "can't access $DEV"
6527 DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
6528 [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
6532 run_test 57a "verify MDS filesystem created with large inodes =="
6535 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6536 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6537 skip_env "ldiskfs only test"
6539 remote_mds_nodsh && skip "remote MDS with nodsh"
6541 local dir=$DIR/$tdir
6544 local fileN=$dir/f$filecount
6546 rm -rf $dir || error "removing $dir"
6548 local mdtidx=$($LFS getstripe -m $dir)
6549 local mdtname=MDT$(printf %04x $mdtidx)
6550 local facet=mds$((mdtidx + 1))
6552 echo "mcreating $filecount files"
6553 createmany -m $dir/f 1 $filecount || error "creating files in $dir"
6555 # verify that files do not have EAs yet
6556 $LFS getstripe $file1 2>&1 | grep -q "no stripe" ||
6557 error "$file1 has an EA"
6558 $LFS getstripe $fileN 2>&1 | grep -q "no stripe" ||
6559 error "$fileN has an EA"
6563 df $dir #make sure we get new statfs data
6564 local mdsfree=$(do_facet $facet \
6565 lctl get_param -n osd*.*$mdtname.kbytesfree)
6566 local mdcfree=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6569 echo "opening files to create objects/EAs"
6570 for file in $(seq -f $dir/f%g 1 $filecount); do
6571 $OPENFILE -f O_RDWR $file > /dev/null 2>&1 ||
6572 error "opening $file"
6575 # verify that files have EAs now
6576 $LFS getstripe $file1 | grep -q "obdidx" || error "$file1 missing EA"
6577 $LFS getstripe $fileN | grep -q "obdidx" || error "$fileN missing EA"
6579 sleep 1 #make sure we get new statfs data
6581 local mdsfree2=$(do_facet $facet \
6582 lctl get_param -n osd*.*$mdtname.kbytesfree)
6583 local mdcfree2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6585 if [[ $mdcfree2 -lt $((mdcfree - 16)) ]]; then
6586 if [ "$mdsfree" != "$mdsfree2" ]; then
6587 error "MDC before $mdcfree != after $mdcfree2"
6589 echo "MDC before $mdcfree != after $mdcfree2"
6590 echo "unable to confirm if MDS has large inodes"
6595 run_test 57b "default LOV EAs are stored inside large inodes ==="
6598 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6599 [ -z "$(which wiretest 2>/dev/null)" ] &&
6600 skip_env "could not find wiretest"
6604 run_test 58 "verify cross-platform wire constants =============="
6607 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6609 echo "touch 130 files"
6610 createmany -o $DIR/f59- 130
6612 unlinkmany $DIR/f59- 130
6614 # wait for commitment of removal
6615 wait_delete_completed
6617 run_test 59 "verify cancellation of llog records async ========="
6619 TEST60_HEAD="test_60 run $RANDOM"
6621 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6622 remote_mgs_nodsh && skip "remote MGS with nodsh"
6623 do_facet mgs "! which run-llog.sh &> /dev/null" &&
6624 do_facet mgs "! ls run-llog.sh &> /dev/null" &&
6625 skip_env "missing subtest run-llog.sh"
6627 log "$TEST60_HEAD - from kernel mode"
6628 do_facet mgs "$LCTL dk > /dev/null"
6629 do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed"
6630 do_facet mgs $LCTL dk > $TMP/$tfile
6632 # LU-6388: test llog_reader
6633 local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
6634 llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
6635 [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
6636 skip_env "missing llog_reader"
6637 local fstype=$(facet_fstype mgs)
6638 [ $fstype != ldiskfs -a $fstype != zfs ] &&
6639 skip_env "Only for ldiskfs or zfs type mgs"
6641 local mntpt=$(facet_mntpt mgs)
6642 local mgsdev=$(mgsdevname 1)
6654 #get fid and record list
6655 fid_list=($(awk '/9_sub.*record/ { print $NF }' /$TMP/$tfile |
6657 rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' /$TMP/$tfile |
6659 #remount mgs as ldiskfs or zfs type
6660 stop mgs || error "stop mgs failed"
6661 mount_fstype mgs || error "remount mgs failed"
6662 for ((i = 0; i < ${#fid_list[@]}; i++)); do
6665 seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
6666 oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
6671 obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
6673 obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
6675 echo "obj_file is $obj_file"
6676 do_facet mgs $llog_reader $obj_file
6678 rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
6679 awk '{ print $3 }' | sed -e "s/^type=//g")
6680 if [ $rec_type != $rec ]; then
6681 echo "FAILED test_60a wrong record type $rec_type," \
6687 #check obj path if record type is LLOG_LOGID_MAGIC
6688 if [ "$rec" == "1064553b" ]; then
6689 path=$(do_facet mgs $llog_reader $obj_file |
6690 grep "path=" | awk '{ print $NF }' |
6691 sed -e "s/^path=//g")
6692 if [ $obj_file != $mntpt/$path ]; then
6693 echo "FAILED test_60a wrong obj path" \
6694 "$montpt/$path, should be $obj_file"
6701 #restart mgs before "error", otherwise it will block the next test
6702 stop mgs || error "stop mgs failed"
6703 start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
6704 $pass || error "test failed, see FAILED test_60a messages for specifics"
6706 run_test 60a "llog_test run from kernel module and test llog_reader"
6708 test_60b() { # bug 6411
6709 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6712 LLOG_COUNT=$(do_facet mgs dmesg |
6713 awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
6714 /llog_[a-z]*.c:[0-9]/ {
6726 [[ $LLOG_COUNT -gt 120 ]] &&
6727 error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
6729 run_test 60b "limit repeated messages from CERROR/CWARN"
6732 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6734 echo "create 5000 files"
6735 createmany -o $DIR/f60c- 5000
6736 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137
6737 lctl set_param fail_loc=0x80000137
6738 unlinkmany $DIR/f60c- 5000
6739 lctl set_param fail_loc=0
6741 run_test 60c "unlink file when mds full"
6744 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6746 SAVEPRINTK=$(lctl get_param -n printk)
6747 # verify "lctl mark" is even working"
6748 MESSAGE="test message ID $RANDOM $$"
6749 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6750 dmesg | grep -q "$MESSAGE" || error "didn't find debug marker in log"
6752 lctl set_param printk=0 || error "set lnet.printk failed"
6753 lctl get_param -n printk | grep emerg || error "lnet.printk dropped emerg"
6754 MESSAGE="new test message ID $RANDOM $$"
6755 # Assume here that libcfs_debug_mark_buffer() uses D_WARNING
6756 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6757 dmesg | grep -q "$MESSAGE" && error "D_WARNING wasn't masked" || true
6759 lctl set_param -n printk="$SAVEPRINTK"
6761 run_test 60d "test printk console message masking"
6764 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6765 remote_mds_nodsh && skip "remote MDS with nodsh"
6768 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
6769 do_facet mds1 lctl set_param fail_loc=0x15b
6772 run_test 60e "no space while new llog is being created"
6777 test_mkdir -c $MDSCOUNT $DIR/$tdir
6778 $LFS setdirstripe -D -i -1 -c $MDSCOUNT $DIR/$tdir
6783 mkdir $DIR/$tdir/subdir$index 2>/dev/null
6784 rmdir $DIR/$tdir/subdir$index 2>/dev/null
6785 index=$((index + 1))
6791 for i in $(seq 100); do
6792 # define OBD_FAIL_OSD_TXN_START 0x19a
6793 do_facet mds1 lctl set_param fail_loc=0x8000019a
6799 mkdir $DIR/$tdir/new || error "mkdir failed"
6800 rmdir $DIR/$tdir/new || error "rmdir failed"
6802 run_test 60g "transaction abort won't cause MDT hung"
6805 [ $MDS1_VERSION -le $(version_code 2.12.52) ] ||
6806 skip "Need MDS version at least 2.12.52"
6807 [ $MDSCOUNT -le 2 ] && skip "Need >= 2 MDTs"
6811 #define OBD_FAIL_MDS_STRIPE_CREATE 0x188
6812 #define OBD_FAIL_MDS_STRIPE_FID 0x189
6813 for fail_loc in 0x80000188 0x80000189; do
6814 do_facet mds1 "$LCTL set_param fail_loc=$fail_loc"
6815 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir-$fail_loc ||
6816 error "mkdir $dir-$fail_loc failed"
6817 for i in {0..10}; do
6818 # create may fail on missing stripe
6819 echo $i > $DIR/$tdir-$fail_loc/$i
6821 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6822 error "getdirstripe $tdir-$fail_loc failed"
6823 $LFS migrate -m 1 $DIR/$tdir-$fail_loc ||
6824 error "migrate $tdir-$fail_loc failed"
6825 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6826 error "getdirstripe $tdir-$fail_loc failed"
6827 pushd $DIR/$tdir-$fail_loc
6829 echo $f | cmp $f - || error "$f data mismatch"
6832 rm -rf $DIR/$tdir-$fail_loc
6835 run_test 60h "striped directory with missing stripes can be accessed"
6838 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6841 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1 || error "dd $f failed"
6842 cancel_lru_locks osc
6843 $MULTIOP $f OSMWUc || error "$MULTIOP $f failed"
6846 run_test 61a "mmap() writes don't make sync hang ================"
6849 mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
6851 run_test 61b "mmap() of unstriped file is successful"
6853 # bug 2330 - insufficient obd_match error checking causes LBUG
6855 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6859 cancel_lru_locks osc
6860 lctl set_param fail_loc=0x405
6861 cat $f && error "cat succeeded, expect -EIO"
6862 lctl set_param fail_loc=0
6864 # This test is now irrelevant (as of bug 10718 inclusion), we no longer
6865 # match every page all of the time.
6866 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
6868 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
6869 # Though this test is irrelevant anymore, it helped to reveal some
6870 # other grant bugs (LU-4482), let's keep it.
6871 test_63a() { # was test_63
6872 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6874 MAX_DIRTY_MB=$(lctl get_param -n osc.*.max_dirty_mb | head -n 1)
6876 for i in `seq 10` ; do
6877 dd if=/dev/zero of=$DIR/f63 bs=8k &
6883 rm -f $DIR/f63 || true
6885 run_test 63a "Verify oig_wait interruption does not crash ======="
6887 # bug 2248 - async write errors didn't return to application on sync
6888 # bug 3677 - async write errors left page locked
6890 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6893 lctl set_param debug=-1
6895 # ensure we have a grant to do async writes
6896 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
6899 sync # sync lest earlier test intercept the fail_loc
6901 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
6902 lctl set_param fail_loc=0x80000406
6903 $MULTIOP $DIR/$tfile Owy && \
6904 error "sync didn't return ENOMEM"
6905 sync; sleep 2; sync # do a real sync this time to flush page
6906 lctl get_param -n llite.*.dump_page_cache | grep locked && \
6907 error "locked page left in cache after async error" || true
6910 run_test 63b "async write errors should be returned to fsync ==="
6913 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6916 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
6918 run_test 64a "verify filter grant calculations (in kernel) ====="
6921 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6923 sh oos.sh $MOUNT || error "oos.sh failed: $?"
6925 run_test 64b "check out-of-space detection on client"
6928 $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
6930 run_test 64c "verify grant shrink"
6936 $LCTL get_param osc.$tgt.import | awk "/$param/ { print \$2 }"
6939 # this does exactly what osc_request.c:osc_announce_cached() does in
6940 # order to calculate max amount of grants to ask from server
6944 local nrpages=$($LCTL get_param -n osc.$tgt.max_pages_per_rpc)
6945 local rpc_in_flight=$($LCTL get_param -n osc.$tgt.max_rpcs_in_flight)
6947 ((rpc_in_flight++));
6948 nrpages=$((nrpages * rpc_in_flight))
6950 local dirty_max_pages=$($LCTL get_param -n osc.$tgt.max_dirty_mb)
6952 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
6954 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
6955 local undirty=$((nrpages * PAGE_SIZE))
6957 local max_extent_pages
6958 max_extent_pages=$(import_param $tgt grant_max_extent_size)
6959 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
6960 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
6961 local grant_extent_tax
6962 grant_extent_tax=$(import_param $tgt grant_extent_tax)
6964 undirty=$((undirty + nrextents * grant_extent_tax))
6969 # this is size of unit for grant allocation. It should be equal to
6970 # what tgt_grant.c:tgt_grant_chunk() calculates
6974 local grant_extent_tax
6976 max_brw_size=$(import_param $tgt max_brw_size)
6978 grant_extent_tax=$(import_param $tgt grant_extent_tax)
6980 echo $(((max_brw_size + grant_extent_tax) * 2))
6984 [ $OST1_VERSION -ge $(version_code 2.10.56) ] ||
6985 skip "OST < 2.10.55 doesn't limit grants enough"
6987 local tgt=$($LCTL dl | awk '/OST0000-osc-[^mM]/ { print $4 }')
6989 [[ "$($LCTL get_param osc.${tgt}.import)" =~ "grant_param" ]] ||
6990 skip "no grant_param connect flag"
6992 local olddebug="$($LCTL get_param -n debug 2> /dev/null)"
6994 $LCTL set_param -n -n debug="$OLDDEBUG" || true
6995 stack_trap "$LCTL set_param -n debug='$olddebug'" EXIT
6998 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
6999 stack_trap "rm -f $DIR/$tfile && wait_delete_completed" EXIT
7001 $LFS setstripe $DIR/$tfile -i 0 -c 1
7002 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1000 &
7005 while kill -0 $ddpid; do
7006 local cur_grant=$($LCTL get_param -n osc.$tgt.cur_grant_bytes)
7008 if [[ $cur_grant -gt $max_cur_granted ]]; then
7010 error "cur_grant $cur_grant > $max_cur_granted"
7016 run_test 64d "check grant limit exceed"
7022 local cur_grants=$($LCTL get_param -n osc.$tgt.cur_grant_bytes)
7024 ((cur_grants == expected)) ||
7025 error "$msg: grants mismatch: $cur_grants, expected $expected"
7029 echo $((($1 + $2 - 1) & ~($2 - 1)))
7033 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7034 [ $OST1_VERSION -ge $(version_code 2.11.56) ] ||
7035 skip "Need OSS version at least 2.11.56"
7037 # Remount client to reset grant
7038 remount_client $MOUNT || error "failed to remount client"
7039 local osc_tgt=$($LCTL dl | awk '/OST0000-osc-[^mM]/ { print $4 }')
7040 local init_grants=$(import_param $osc_tgt initial_grant)
7042 check_grants $osc_tgt $init_grants "init grants"
7044 local extent_tax=$(import_param $osc_tgt grant_extent_tax)
7045 local max_brw_size=$(import_param $osc_tgt max_brw_size)
7046 local gbs=$(import_param $osc_tgt grant_block_size)
7048 # write random number of bytes from max_brw_size / 4 to max_brw_size
7049 local write_bytes=$(shuf -i $((max_brw_size / 4))-$max_brw_size -n 1)
7050 # align for direct io
7051 write_bytes=$(round_up_p2 $write_bytes PAGE_SIZE)
7052 # round to grant consumption unit
7053 local wb_round_up=$(round_up_p2 $write_bytes gbs)
7055 local grants=$((wb_round_up + extent_tax))
7057 $LFS setstripe -c 1 -i 0 $DIR/$tfile || error "lfs setstripe failed"
7059 # define OBD_FAIL_TGT_NO_GRANT 0x725
7060 # make the server not grant more back
7061 do_facet ost1 $LCTL set_param fail_loc=0x725
7062 dd if=/dev/zero of=$DIR/$tfile bs=$write_bytes count=1 oflag=direct
7064 do_facet ost1 $LCTL set_param fail_loc=0
7066 check_grants $osc_tgt $((init_grants - grants)) "dio w/o grant alloc"
7068 rm -f $DIR/$tfile || error "rm failed"
7070 # Remount client to reset grant
7071 remount_client $MOUNT || error "failed to remount client"
7072 osc_tgt=$($LCTL dl | awk '/OST0000-osc-[^mM]/ { print $4 }')
7074 $LFS setstripe -c 1 -i 0 $DIR/$tfile || error "lfs setstripe failed"
7076 # define OBD_FAIL_TGT_NO_GRANT 0x725
7077 # make the server not grant more back
7078 do_facet ost1 $LCTL set_param fail_loc=0x725
7079 $MULTIOP $DIR/$tfile "oO_WRONLY:w${write_bytes}yc"
7080 do_facet ost1 $LCTL set_param fail_loc=0
7082 check_grants $osc_tgt $((init_grants - grants)) "buf io w/o grant alloc"
7084 run_test 64e "check grant consumption (no grant allocation)"
7087 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7089 # Remount client to reset grant
7090 remount_client $MOUNT || error "failed to remount client"
7091 local osc_tgt=$($LCTL dl | awk '/OST0000-osc-[^mM]/ { print $4 }')
7093 local init_grants=$(import_param $osc_tgt initial_grant)
7094 local extent_tax=$(import_param $osc_tgt grant_extent_tax)
7095 local max_brw_size=$(import_param $osc_tgt max_brw_size)
7096 local gbs=$(import_param $osc_tgt grant_block_size)
7097 local chunk=$(grant_chunk $osc_tgt)
7099 # write random number of bytes from max_brw_size / 4 to max_brw_size
7100 local write_bytes=$(shuf -i $((max_brw_size / 4))-$max_brw_size -n 1)
7101 # align for direct io
7102 write_bytes=$(round_up_p2 $write_bytes PAGE_SIZE)
7103 # round to grant consumption unit
7104 local wb_round_up=$(round_up_p2 $write_bytes gbs)
7106 local grants=$((wb_round_up + extent_tax))
7108 $LFS setstripe -c 1 -i 0 $DIR/$tfile || error "lfs setstripe failed"
7109 dd if=/dev/zero of=$DIR/$tfile bs=$write_bytes count=1 oflag=direct ||
7110 error "error writing to $DIR/$tfile"
7112 check_grants $osc_tgt $((init_grants - grants + chunk)) \
7113 "direct io with grant allocation"
7115 rm -f $DIR/$tfile || error "rm failed"
7117 # Remount client to reset grant
7118 remount_client $MOUNT || error "failed to remount client"
7119 osc_tgt=$($LCTL dl | awk '/OST0000-osc-[^mM]/ { print $4 }')
7121 $LFS setstripe -c 1 -i 0 $DIR/$tfile || error "lfs setstripe failed"
7123 local cmd="oO_WRONLY:w${write_bytes}_yc"
7125 $MULTIOP $DIR/$tfile $cmd &
7129 check_grants $osc_tgt $((init_grants - grants)) \
7130 "buffered io, not write rpc"
7132 kill -USR1 $MULTIPID
7135 check_grants $osc_tgt $((init_grants - grants + chunk)) \
7136 "buffered io, one RPC"
7138 run_test 64f "check grant consumption (with grant allocation)"
7140 # bug 1414 - set/get directories' stripe info
7142 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7144 test_mkdir $DIR/$tdir
7146 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
7148 run_test 65a "directory with no stripe info"
7151 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7153 test_mkdir $DIR/$tdir
7154 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7156 $SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7159 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
7161 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
7164 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7165 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
7167 test_mkdir $DIR/$tdir
7168 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
7170 $LFS setstripe -S $((stripesize * 4)) -i 1 \
7171 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
7173 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
7175 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
7178 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7180 test_mkdir $DIR/$tdir
7181 local STRIPECOUNT=$($GETSTRIPE -c $DIR/$tdir)
7182 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7184 if [[ $STRIPECOUNT -le 0 ]]; then
7186 elif [[ $STRIPECOUNT -gt 2000 ]]; then
7187 #LOV_MAX_STRIPE_COUNT is 2000
7188 [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1))
7190 sc=$(($STRIPECOUNT - 1))
7192 $SETSTRIPE -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
7193 touch $DIR/$tdir/f4 $DIR/$tdir/f5
7194 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
7195 error "lverify failed"
7197 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
7200 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7202 test_mkdir $DIR/$tdir
7204 $SETSTRIPE $DIR/$tdir || error "setstripe"
7205 $GETSTRIPE -v $DIR/$tdir | grep "Default" ||
7206 error "no stripe info failed"
7208 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
7210 run_test 65e "directory setstripe defaults"
7213 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7215 test_mkdir $DIR/${tdir}f
7216 $RUNAS $SETSTRIPE $DIR/${tdir}f && error "setstripe succeeded" || true
7218 run_test 65f "dir setstripe permission (should return error) ==="
7221 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7223 test_mkdir $DIR/$tdir
7224 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7226 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7227 error "setstripe -S failed"
7228 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
7229 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7230 error "delete default stripe failed"
7232 run_test 65g "directory setstripe -d"
7235 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7237 test_mkdir $DIR/$tdir
7238 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7240 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7241 error "setstripe -S failed"
7242 test_mkdir $DIR/$tdir/dd1
7243 [ $($LFS getstripe -c $DIR/$tdir) = $($GETSTRIPE -c $DIR/$tdir/dd1) ] ||
7244 error "stripe info inherit failed"
7246 run_test 65h "directory stripe info inherit ===================="
7249 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7251 save_layout_restore_at_exit $MOUNT
7253 # bug6367: set non-default striping on root directory
7254 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
7256 # bug12836: getstripe on -1 default directory striping
7257 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
7259 # bug12836: getstripe -v on -1 default directory striping
7260 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
7262 # bug12836: new find on -1 default directory striping
7263 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
7265 run_test 65i "various tests to set root directory striping"
7267 test_65j() { # bug6367
7268 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7272 # if we aren't already remounting for each test, do so for this test
7273 if [ "$CLEANUP" = ":" -a "$I_MOUNTED" = "yes" ]; then
7274 cleanup || error "failed to unmount"
7278 save_layout_restore_at_exit $MOUNT
7280 $SETSTRIPE -d $MOUNT || error "setstripe failed"
7282 run_test 65j "set default striping on root directory (bug 6367)="
7286 wait_delete_completed
7287 do_facet $SINGLEMDS "lctl set_param -n \
7288 osp.$ost*MDT0000.max_create_count=$max_count"
7289 do_facet $SINGLEMDS "lctl set_param -n \
7290 osp.$ost*MDT0000.create_count=$count"
7291 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7292 echo $INACTIVE_OSC "is Activate"
7294 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7297 test_65k() { # bug11679
7298 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7299 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7300 remote_mds_nodsh && skip "remote MDS with nodsh"
7302 local disable_precreate=true
7303 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
7304 disable_precreate=false
7306 echo "Check OST status: "
7307 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
7308 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
7310 for OSC in $MDS_OSCS; do
7311 echo $OSC "is active"
7312 do_facet $SINGLEMDS lctl --device %$OSC activate
7315 for INACTIVE_OSC in $MDS_OSCS; do
7316 local ost=$(osc_to_ost $INACTIVE_OSC)
7317 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
7318 lov.*md*.target_obd |
7319 awk -F: /$ost/'{ print $1 }' | head -n 1)
7322 $SETSTRIPE -i $ostnum -c 1 $DIR/$tdir
7323 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
7325 echo "Deactivate: " $INACTIVE_OSC
7326 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
7328 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
7329 osp.$ost*MDT0000.create_count")
7330 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
7331 osp.$ost*MDT0000.max_create_count")
7332 $disable_precreate &&
7333 do_facet $SINGLEMDS "lctl set_param -n \
7334 osp.$ost*MDT0000.max_create_count=0"
7336 for idx in $(seq 0 $((OSTCOUNT - 1))); do
7337 [ -f $DIR/$tdir/$idx ] && continue
7338 echo "$SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx"
7339 $SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx ||
7341 error "setstripe $idx should succeed"; }
7342 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
7344 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
7347 do_facet $SINGLEMDS "lctl set_param -n \
7348 osp.$ost*MDT0000.max_create_count=$max_count"
7349 do_facet $SINGLEMDS "lctl set_param -n \
7350 osp.$ost*MDT0000.create_count=$count"
7351 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7352 echo $INACTIVE_OSC "is Activate"
7354 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7357 run_test 65k "validate manual striping works properly with deactivated OSCs"
7359 test_65l() { # bug 12836
7360 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7362 test_mkdir -p $DIR/$tdir/test_dir
7363 $SETSTRIPE -c -1 $DIR/$tdir/test_dir
7364 $LFS find -mtime -1 $DIR/$tdir >/dev/null
7366 run_test 65l "lfs find on -1 stripe dir ========================"
7369 local layout=$(save_layout $MOUNT)
7370 $RUNAS $SETSTRIPE -c 2 $MOUNT && {
7371 restore_layout $MOUNT $layout
7372 error "setstripe should fail by non-root users"
7376 run_test 65m "normal user can't set filesystem default stripe"
7379 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.0) ]] ||
7380 skip "Need MDS version at least 2.12.0"
7381 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7383 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7384 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7385 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7387 local root_layout=$(save_layout $MOUNT)
7388 stack_trap "restore_layout $MOUNT $root_layout" EXIT
7390 # new subdirectory under root directory should not inherit
7391 # the default layout from root
7392 local dir1=$MOUNT/$tdir-1
7393 mkdir $dir1 || error "mkdir $dir1 failed"
7394 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7395 error "$dir1 shouldn't have LOV EA"
7397 # delete the default layout on root directory
7398 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7400 local dir2=$MOUNT/$tdir-2
7401 mkdir $dir2 || error "mkdir $dir2 failed"
7402 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7403 error "$dir2 shouldn't have LOV EA"
7405 # set a new striping pattern on root directory
7406 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7407 local new_def_stripe_size=$((def_stripe_size * 2))
7408 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7409 error "set stripe size on $MOUNT failed"
7411 # new file created in $dir2 should inherit the new stripe size from
7412 # the filesystem default
7413 local file2=$dir2/$tfile-2
7414 touch $file2 || error "touch $file2 failed"
7416 local file2_stripe_size=$($LFS getstripe -S $file2)
7417 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7418 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7420 local dir3=$MOUNT/$tdir-3
7421 mkdir $dir3 || error "mkdir $dir3 failed"
7422 # $dir3 shouldn't have LOV EA, but "lfs getstripe -d $dir3" should show
7423 # the root layout, which is the actual default layout that will be used
7424 # when new files are created in $dir3.
7425 local dir3_layout=$(get_layout_param $dir3)
7426 local root_dir_layout=$(get_layout_param $MOUNT)
7427 [[ "$dir3_layout" = "$root_dir_layout" ]] ||
7428 error "$dir3 should show the default layout from $MOUNT"
7430 # set OST pool on root directory
7431 local pool=$TESTNAME
7432 pool_add $pool || error "add $pool failed"
7433 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7434 error "add targets to $pool failed"
7436 $LFS setstripe -p $pool $MOUNT ||
7437 error "set OST pool on $MOUNT failed"
7439 # new file created in $dir3 should inherit the pool from
7440 # the filesystem default
7441 local file3=$dir3/$tfile-3
7442 touch $file3 || error "touch $file3 failed"
7444 local file3_pool=$($LFS getstripe -p $file3)
7445 [[ "$file3_pool" = "$pool" ]] ||
7446 error "$file3 didn't inherit OST pool $pool"
7448 local dir4=$MOUNT/$tdir-4
7449 mkdir $dir4 || error "mkdir $dir4 failed"
7450 local dir4_layout=$(get_layout_param $dir4)
7451 root_dir_layout=$(get_layout_param $MOUNT)
7452 echo "$LFS getstripe -d $dir4"
7453 $LFS getstripe -d $dir4
7454 echo "$LFS getstripe -d $MOUNT"
7455 $LFS getstripe -d $MOUNT
7456 [[ "$dir4_layout" = "$root_dir_layout" ]] ||
7457 error "$dir4 should show the default layout from $MOUNT"
7459 # new file created in $dir4 should inherit the pool from
7460 # the filesystem default
7461 local file4=$dir4/$tfile-4
7462 touch $file4 || error "touch $file4 failed"
7464 local file4_pool=$($LFS getstripe -p $file4)
7465 [[ "$file4_pool" = "$pool" ]] ||
7466 error "$file4 didn't inherit OST pool $pool"
7468 # new subdirectory under non-root directory should inherit
7469 # the default layout from its parent directory
7470 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7471 error "set directory layout on $dir4 failed"
7473 local dir5=$dir4/$tdir-5
7474 mkdir $dir5 || error "mkdir $dir5 failed"
7476 dir4_layout=$(get_layout_param $dir4)
7477 local dir5_layout=$(get_layout_param $dir5)
7478 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7479 error "$dir5 should inherit the default layout from $dir4"
7481 # though subdir under ROOT doesn't inherit default layout, but
7482 # its sub dir/file should be created with default layout.
7483 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
7484 [[ $MDS1_VERSION -ge $(version_code 2.12.59) ]] ||
7485 [[ $MDS1_VERSION -ge $(version_code 2.12.3) &&
7486 $MDS1_VERSION -lt $(version_code 2.12.50) ]] ||
7487 skip "Need MDS version at least 2.12.3 or 2.12.59"
7489 local default_lmv_count=$($LFS getdirstripe -D -c $MOUNT)
7490 local default_lmv_index=$($LFS getdirstripe -D -i $MOUNT)
7491 local default_lmv_hash=$($LFS getdirstripe -D -H $MOUNT)
7493 if [ $default_lmv_hash == "none" ]; then
7494 stack_trap "$LFS setdirstripe -D -d $MOUNT" EXIT
7496 stack_trap "$LFS setdirstripe -D -i $default_lmv_index \
7497 -c $default_lmv_count -H $default_lmv_hash $MOUNT" EXIT
7500 $LFS setdirstripe -D -c 2 $MOUNT ||
7501 error "setdirstripe -D -c 2 failed"
7502 mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed"
7503 local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6)
7504 [ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count"
7506 run_test 65n "don't inherit default layout from root for new subdirectories"
7508 # bug 2543 - update blocks count on client
7510 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7513 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7514 sync; sync_all_data; sync; sync_all_data
7515 cancel_lru_locks osc
7516 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7517 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7519 run_test 66 "update inode blocks count on client ==============="
7522 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7526 swapon -s | awk '($1 == "'$1'") { print $4 }'
7529 # bug5265, obdfilter oa2dentry return -ENOENT
7530 # #define OBD_FAIL_SRV_ENOENT 0x217
7532 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7533 remote_ost_nodsh && skip "remote OST with nodsh"
7536 $SETSTRIPE -c 1 -i 0 $f
7538 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
7540 do_facet ost1 lctl set_param fail_loc=0x217
7541 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
7542 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
7544 do_facet ost1 lctl set_param fail_loc=0
7545 $DIRECTIO write $f 0 2 || error "write error"
7547 cancel_lru_locks osc
7548 $DIRECTIO read $f 0 1 || error "read error"
7550 do_facet ost1 lctl set_param fail_loc=0x217
7551 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
7553 do_facet ost1 lctl set_param fail_loc=0
7556 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
7559 test_mkdir $DIR/$tdir
7560 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
7561 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
7563 run_test 71 "Running dbench on lustre (don't segment fault) ===="
7565 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
7566 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7567 [ "$RUNAS_ID" = "$UID" ] &&
7568 skip_env "RUNAS_ID = UID = $UID -- skipping"
7569 # Check that testing environment is properly set up. Skip if not
7570 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
7571 skip_env "User $RUNAS_ID does not exist - skipping"
7574 chmod 777 $DIR/$tfile
7575 chmod ug+s $DIR/$tfile
7576 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
7577 error "$RUNAS dd $DIR/$tfile failed"
7578 # See if we are still setuid/sgid
7579 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7580 error "S/gid is not dropped on write"
7581 # Now test that MDS is updated too
7582 cancel_lru_locks mdc
7583 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7584 error "S/gid is not dropped on MDS"
7587 run_test 72a "Test that remove suid works properly (bug5695) ===="
7589 test_72b() { # bug 24226 -- keep mode setting when size is not changing
7592 [ "$RUNAS_ID" = "$UID" ] &&
7593 skip_env "RUNAS_ID = UID = $UID -- skipping"
7594 [ "$RUNAS_ID" -eq 0 ] &&
7595 skip_env "RUNAS_ID = 0 -- skipping"
7596 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7597 # Check that testing environment is properly set up. Skip if not
7598 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
7599 skip_env "User $RUNAS_ID does not exist - skipping"
7601 touch $DIR/${tfile}-f{g,u}
7602 test_mkdir $DIR/${tfile}-dg
7603 test_mkdir $DIR/${tfile}-du
7604 chmod 770 $DIR/${tfile}-{f,d}{g,u}
7605 chmod g+s $DIR/${tfile}-{f,d}g
7606 chmod u+s $DIR/${tfile}-{f,d}u
7607 for perm in 777 2777 4777; do
7608 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
7609 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
7610 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
7611 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
7615 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
7617 # bug 3462 - multiple simultaneous MDC requests
7619 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7621 test_mkdir $DIR/d73-1
7622 test_mkdir $DIR/d73-2
7623 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
7626 lctl set_param fail_loc=0x80000129
7627 $MULTIOP $DIR/d73-1/f73-2 Oc &
7629 lctl set_param fail_loc=0
7631 $MULTIOP $DIR/d73-2/f73-3 Oc &
7635 wait $pid1 || return 1
7639 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
7640 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
7641 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
7645 run_test 73 "multiple MDC requests (should not deadlock)"
7647 test_74a() { # bug 6149, 6184
7648 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7651 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7653 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7654 # will spin in a tight reconnection loop
7655 $LCTL set_param fail_loc=0x8000030e
7656 # get any lock that won't be difficult - lookup works.
7658 $LCTL set_param fail_loc=0
7662 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
7664 test_74b() { # bug 13310
7665 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7667 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7669 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7670 # will spin in a tight reconnection loop
7671 $LCTL set_param fail_loc=0x8000030e
7672 # get a "difficult" lock
7674 $LCTL set_param fail_loc=0
7678 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
7681 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7683 #define OBD_FAIL_LDLM_NEW_LOCK
7684 $LCTL set_param fail_loc=0x319
7685 touch $DIR/$tfile && error "touch successful"
7686 $LCTL set_param fail_loc=0
7689 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
7692 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
7695 test_76() { # Now for bug 20433, added originally in bug 1443
7696 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7698 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
7700 cancel_lru_locks osc
7701 BEFORE_INODES=$(num_inodes)
7702 echo "before inodes: $BEFORE_INODES"
7704 [ "$SLOW" = "no" ] && COUNT=100
7705 for i in $(seq $COUNT); do
7709 cancel_lru_locks osc
7710 AFTER_INODES=$(num_inodes)
7711 echo "after inodes: $AFTER_INODES"
7713 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
7715 AFTER_INODES=$(num_inodes)
7717 echo "wait $wait seconds inodes: $AFTER_INODES"
7718 if [ $wait -gt 30 ]; then
7719 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
7723 run_test 76 "confirm clients recycle inodes properly ===="
7729 # Note: in sptlrpc modes which enable its own bulk checksum, the
7730 # original crc32_le bulk checksum will be automatically disabled,
7731 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
7732 # will be checked by sptlrpc code against sptlrpc bulk checksum.
7733 # In this case set_checksums() will not be no-op, because sptlrpc
7734 # bulk checksum will be enabled all through the test.
7736 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
7737 lctl set_param -n osc.*.checksums $1
7741 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7742 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
7743 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7744 tr -d [] | head -n1)}
7747 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
7748 log "set checksum type to $1"
7751 F77_TMP=$TMP/f77-temp
7754 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
7755 error "error writing to $F77_TMP"
7758 test_77a() { # bug 10889
7759 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7760 $GSS && skip_env "could not run with gss"
7762 [ ! -f $F77_TMP ] && setup_f77
7764 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
7768 run_test 77a "normal checksum read/write operation"
7770 test_77b() { # bug 10889
7771 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7772 $GSS && skip_env "could not run with gss"
7774 [ ! -f $F77_TMP ] && setup_f77
7775 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7776 $LCTL set_param fail_loc=0x80000409
7779 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7780 error "dd error: $?"
7781 $LCTL set_param fail_loc=0
7783 for algo in $CKSUM_TYPES; do
7784 cancel_lru_locks osc
7785 set_checksum_type $algo
7786 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7787 $LCTL set_param fail_loc=0x80000408
7788 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
7789 $LCTL set_param fail_loc=0
7792 set_checksum_type $ORIG_CSUM_TYPE
7795 run_test 77b "checksum error on client write, read"
7800 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
7802 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
7803 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
7804 $check_ost && [ -n "$ost_file_prefix" ] &&
7805 do_facet ost1 rm -f ${ost_file_prefix}\*
7809 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7810 $GSS && skip_env "could not run with gss"
7811 remote_ost_nodsh && skip "remote OST with nodsh"
7814 local osc_file_prefix
7816 local check_ost=false
7817 local ost_file_prefix
7823 # ensure corruption will occur on first OSS/OST
7824 $LFS setstripe -i 0 $DIR/$tfile
7826 [ ! -f $F77_TMP ] && setup_f77
7827 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7828 error "dd write error: $?"
7829 fid=$($LFS path2fid $DIR/$tfile)
7831 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
7834 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
7835 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
7837 echo "OSS do not support bulk pages dump upon error"
7840 osc_file_prefix=$($LCTL get_param -n debug_path)
7841 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
7843 trap cleanup_77c EXIT
7846 # enable bulk pages dump upon error on Client
7847 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
7848 # enable bulk pages dump upon error on OSS
7850 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
7852 # flush Client cache to allow next read to reach OSS
7853 cancel_lru_locks osc
7855 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7856 $LCTL set_param fail_loc=0x80000408
7857 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
7858 $LCTL set_param fail_loc=0
7862 # check cksum dump on Client
7863 osc_file=$(ls ${osc_file_prefix}*)
7864 [ -n "$osc_file" ] || error "no checksum dump file on Client"
7865 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
7866 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
7867 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
7868 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
7870 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
7871 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7872 error "dump content does not match on Client"
7874 $check_ost || skip "No need to check cksum dump on OSS"
7876 # check cksum dump on OSS
7877 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
7878 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
7879 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
7880 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
7881 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7882 error "dump content does not match on OSS"
7886 run_test 77c "checksum error on client read with debug"
7888 test_77d() { # bug 10889
7889 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7890 $GSS && skip_env "could not run with gss"
7892 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7893 $LCTL set_param fail_loc=0x80000409
7895 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7896 error "direct write: rc=$?"
7897 $LCTL set_param fail_loc=0
7900 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7901 $LCTL set_param fail_loc=0x80000408
7903 cancel_lru_locks osc
7904 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7905 error "direct read: rc=$?"
7906 $LCTL set_param fail_loc=0
7909 run_test 77d "checksum error on OST direct write, read"
7911 test_77f() { # bug 10889
7912 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7913 $GSS && skip_env "could not run with gss"
7916 for algo in $CKSUM_TYPES; do
7917 cancel_lru_locks osc
7918 set_checksum_type $algo
7919 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7920 $LCTL set_param fail_loc=0x409
7921 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
7922 error "direct write succeeded"
7923 $LCTL set_param fail_loc=0
7925 set_checksum_type $ORIG_CSUM_TYPE
7928 run_test 77f "repeat checksum error on write (expect error)"
7930 test_77g() { # bug 10889
7931 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7932 $GSS && skip_env "could not run with gss"
7933 remote_ost_nodsh && skip "remote OST with nodsh"
7935 [ ! -f $F77_TMP ] && setup_f77
7937 local file=$DIR/$tfile
7938 stack_trap "rm -f $file" EXIT
7940 $SETSTRIPE -c 1 -i 0 $file
7941 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
7942 do_facet ost1 lctl set_param fail_loc=0x8000021a
7944 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
7945 error "write error: rc=$?"
7946 do_facet ost1 lctl set_param fail_loc=0
7949 cancel_lru_locks osc
7950 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
7951 do_facet ost1 lctl set_param fail_loc=0x8000021b
7953 cmp $F77_TMP $file || error "file compare failed"
7954 do_facet ost1 lctl set_param fail_loc=0
7957 run_test 77g "checksum error on OST write, read"
7959 test_77k() { # LU-10906
7960 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7961 $GSS && skip_env "could not run with gss"
7963 local cksum_param="osc.$FSNAME*.checksums"
7964 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
7968 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
7969 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
7970 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
7974 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
7975 error "failed to set checksum=$i on MGS"
7976 wait_update $HOSTNAME "$get_checksum" $i
7978 echo "remount client, checksum should be $i"
7979 remount_client $MOUNT || "failed to remount client"
7980 checksum=$(eval $get_checksum)
7981 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7984 for opt in "checksum" "nochecksum"; do
7985 #remount with mount option
7986 echo "remount client with option $opt, checksum should be $i"
7987 umount_client $MOUNT || "failed to umount client"
7988 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
7989 "failed to mount client with option '$opt'"
7990 checksum=$(eval $get_checksum)
7991 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7995 remount_client $MOUNT || "failed to remount client"
7997 run_test 77k "enable/disable checksum correctly"
7999 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
8008 test_78() { # bug 10901
8009 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8010 remote_ost || skip_env "local OST"
8013 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
8014 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
8015 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
8016 echo "MemTotal: $MEMTOTAL"
8018 # reserve 256MB of memory for the kernel and other running processes,
8019 # and then take 1/2 of the remaining memory for the read/write buffers.
8020 if [ $MEMTOTAL -gt 512 ] ;then
8021 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
8023 # for those poor memory-starved high-end clusters...
8024 MEMTOTAL=$((MEMTOTAL / 2))
8026 echo "Mem to use for directio: $MEMTOTAL"
8028 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
8029 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
8030 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
8031 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
8033 echo "Smallest OST: $SMALLESTOST"
8034 [[ $SMALLESTOST -lt 10240 ]] &&
8035 skip "too small OSTSIZE, useless to run large O_DIRECT test"
8037 trap cleanup_test_78 EXIT
8039 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
8040 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
8042 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
8043 echo "File size: $F78SIZE"
8044 $SETSTRIPE -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
8045 for i in $(seq 1 $NSEQ); do
8046 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
8047 echo directIO rdwr round $i of $NSEQ
8048 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
8053 run_test 78 "handle large O_DIRECT writes correctly ============"
8055 test_79() { # bug 12743
8056 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8058 wait_delete_completed
8060 BKTOTAL=$(calc_osc_kbytes kbytestotal)
8061 BKFREE=$(calc_osc_kbytes kbytesfree)
8062 BKAVAIL=$(calc_osc_kbytes kbytesavail)
8064 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
8065 DFTOTAL=`echo $STRING | cut -d, -f1`
8066 DFUSED=`echo $STRING | cut -d, -f2`
8067 DFAVAIL=`echo $STRING | cut -d, -f3`
8068 DFFREE=$(($DFTOTAL - $DFUSED))
8070 ALLOWANCE=$((64 * $OSTCOUNT))
8072 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
8073 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
8074 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
8076 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
8077 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
8078 error "df free($DFFREE) mismatch OST free($BKFREE)"
8080 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
8081 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
8082 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
8085 run_test 79 "df report consistency check ======================="
8087 test_80() { # bug 10718
8088 remote_ost_nodsh && skip "remote OST with nodsh"
8089 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8091 # relax strong synchronous semantics for slow backends like ZFS
8092 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
8093 local soc="obdfilter.*.sync_lock_cancel"
8094 local save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
8096 # "sync_on_lock_cancel" was broken by v2_11_55_0-26-g7059644e9a
8097 if [ -z "$save" ]; then
8098 soc="obdfilter.*.sync_on_lock_cancel"
8099 save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
8102 if [ "$save" != "never" ]; then
8103 local hosts=$(comma_list $(osts_nodes))
8105 do_nodes $hosts $LCTL set_param $soc=never
8106 stack_trap "do_nodes $hosts $LCTL set_param $soc=$save"
8110 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
8112 local before=$(date +%s)
8113 cancel_lru_locks osc
8114 local after=$(date +%s)
8115 local diff=$((after - before))
8116 [ $diff -le 1 ] || error "elapsed for 1M@1T = $diff"
8120 run_test 80 "Page eviction is equally fast at high offsets too"
8122 test_81a() { # LU-456
8123 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8124 remote_ost_nodsh && skip "remote OST with nodsh"
8126 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8127 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
8128 do_facet ost1 lctl set_param fail_loc=0x80000228
8130 # write should trigger a retry and success
8131 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
8132 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8134 if [ $RC -ne 0 ] ; then
8135 error "write should success, but failed for $RC"
8138 run_test 81a "OST should retry write when get -ENOSPC ==============="
8140 test_81b() { # LU-456
8141 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8142 remote_ost_nodsh && skip "remote OST with nodsh"
8144 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8145 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
8146 do_facet ost1 lctl set_param fail_loc=0x228
8148 # write should retry several times and return -ENOSPC finally
8149 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
8150 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8153 if [ $RC -ne $ENOSPC ] ; then
8154 error "dd should fail for -ENOSPC, but succeed."
8157 run_test 81b "OST should return -ENOSPC when retry still fails ======="
8159 test_82() { # LU-1031
8160 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
8164 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
8166 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
8168 kill -USR1 $MULTIPID2
8170 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
8171 error "First grouplock does not block second one"
8173 echo "Second grouplock blocks first one"
8175 kill -USR1 $MULTIPID1
8179 run_test 82 "Basic grouplock test"
8182 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
8184 test_mkdir $DIR/$tdir.cvsroot
8185 chown $RUNAS_ID $DIR/$tdir.cvsroot
8188 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
8191 # some versions of cvs import exit(1) when asked to import links or
8192 # files they can't read. ignore those files.
8193 local toignore=$(find . -type l -printf '-I %f\n' -o \
8194 ! -perm /4 -printf '-I %f\n')
8195 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
8196 $tdir.reposname vtag rtag
8199 test_mkdir $DIR/$tdir.reposname
8200 chown $RUNAS_ID $DIR/$tdir.reposname
8201 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
8203 cd $DIR/$tdir.reposname
8205 $RUNAS cvs add -m 'addmsg' foo99
8207 $RUNAS cvs commit -m 'nomsg' foo99
8208 rm -fr $DIR/$tdir.cvsroot
8210 run_test 99 "cvs strange file/directory operations"
8213 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8214 [[ "$NETTYPE" =~ tcp ]] ||
8215 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
8216 remote_ost_nodsh && skip "remote OST with nodsh"
8217 remote_mds_nodsh && skip "remote MDS with nodsh"
8219 skip "useless for local single node setup"
8221 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
8222 [ "$PROT" != "tcp" ] && continue
8223 RPORT=$(echo $REMOTE | cut -d: -f2)
8224 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
8227 LPORT=`echo $LOCAL | cut -d: -f2`
8228 if [ $LPORT -ge 1024 ]; then
8229 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
8231 error_exit "local: $LPORT > 1024, remote: $RPORT"
8234 [ "$rc" = 0 ] || error_exit "privileged port not found" )
8236 run_test 100 "check local port using privileged port ==========="
8238 function get_named_value()
8247 echo $line | sed "s/^$tag[ ]*//"
8254 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
8255 awk '/^max_cached_mb/ { print $2 }')
8258 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
8263 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8264 [ $MDSCOUNT -ge 2 ] && skip_env "needs < 2 MDTs" #LU-4322
8269 local cache_limit=32
8271 $LCTL set_param -n osc.*-osc*.rpc_stats 0
8272 trap cleanup_101a EXIT
8273 $LCTL set_param -n llite.*.read_ahead_stats 0
8274 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
8277 # randomly read 10000 of 64K chunks from file 3x 32MB in size
8279 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
8280 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
8283 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
8284 get_named_value 'read but discarded' | cut -d" " -f1); do
8285 discard=$(($discard + $s))
8289 if [[ $(($discard * 10)) -gt $nreads ]]; then
8290 $LCTL get_param osc.*-osc*.rpc_stats
8291 $LCTL get_param llite.*.read_ahead_stats
8292 error "too many ($discard) discarded pages"
8294 rm -f $DIR/$tfile || true
8296 run_test 101a "check read-ahead for random reads"
8299 test_mkdir $DIR/$tdir
8300 local STRIPE_SIZE=$1
8301 local FILE_LENGTH=$2
8304 local FILE_SIZE_MB=$((FILE_LENGTH / STRIPE_SIZE))
8306 local list=$(comma_list $(osts_nodes))
8307 set_osd_param $list '' read_cache_enable 0
8308 set_osd_param $list '' writethrough_cache_enable 0
8310 trap cleanup_test101bc EXIT
8311 # prepare the read-ahead file
8312 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
8314 dd if=/dev/zero of=$DIR/$tfile bs=$STRIPE_SIZE \
8315 count=$FILE_SIZE_MB 2> /dev/null
8319 cleanup_test101bc() {
8324 local list=$(comma_list $(osts_nodes))
8325 set_osd_param $list '' read_cache_enable 1
8326 set_osd_param $list '' writethrough_cache_enable 1
8330 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
8335 local STRIPE_SIZE=$2
8336 local FILE_LENGTH=$3
8337 local RA_INC=1048576
8338 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
8339 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
8340 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
8341 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
8342 get_named_value 'read but discarded' |
8343 cut -d" " -f1 | calc_total)
8344 if [[ $DISCARD -gt $discard_limit ]]; then
8345 $LCTL get_param llite.*.read_ahead_stats
8346 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
8348 echo "Read-ahead success for size ${READ_SIZE}"
8353 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8354 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8356 local STRIPE_SIZE=1048576
8357 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
8359 if [ $SLOW == "yes" ]; then
8360 local FILE_LENGTH=$((STRIDE_SIZE * 64))
8362 local FILE_LENGTH=$((STRIDE_SIZE * 8))
8365 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
8367 # prepare the read-ahead file
8368 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8369 cancel_lru_locks osc
8370 for BIDX in 2 4 8 16 32 64 128 256
8372 local BSIZE=$((BIDX*4096))
8373 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
8374 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
8375 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
8376 $LCTL set_param -n llite.*.read_ahead_stats 0
8377 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
8378 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
8379 cancel_lru_locks osc
8380 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
8385 run_test 101b "check stride-io mode read-ahead ================="
8388 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8390 local STRIPE_SIZE=1048576
8391 local FILE_LENGTH=$((STRIPE_SIZE*100))
8395 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8397 cancel_lru_locks osc
8398 $LCTL set_param osc.*.rpc_stats 0
8399 $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
8400 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8401 local stats=$($LCTL get_param -n $osc_rpc_stats)
8402 local lines=$(echo "$stats" | awk 'END {print NR;}')
8405 if [ $lines -le 20 ]; then
8408 for size in 1 2 4 8; do
8409 local rpc=$(echo "$stats" |
8410 awk '($1 == "'$size':") {print $2; exit; }')
8412 error "Small $((size*4))k read IO $rpc !"
8414 echo "$osc_rpc_stats check passed!"
8419 run_test 101c "check stripe_size aligned read-ahead ================="
8422 $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
8423 $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
8427 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8429 local file=$DIR/$tfile
8430 local sz_MB=${FILESIZE_101d:-500}
8431 local ra_MB=${READAHEAD_MB:-40}
8433 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8434 [ $free_MB -lt $sz_MB ] &&
8435 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8437 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8438 $SETSTRIPE -c -1 $file || error "setstripe failed"
8440 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8441 echo Cancel LRU locks on lustre client to flush the client cache
8442 cancel_lru_locks osc
8444 echo Disable read-ahead
8445 local old_READAHEAD=$(set_read_ahead 0)
8447 echo Reading the test file $file with read-ahead disabled
8448 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8450 echo Cancel LRU locks on lustre client to flush the client cache
8451 cancel_lru_locks osc
8452 echo Enable read-ahead with ${ra_MB}MB
8453 set_read_ahead $ra_MB
8455 echo Reading the test file $file with read-ahead enabled
8456 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8458 echo "read-ahead disabled time read $raOFF"
8459 echo "read-ahead enabled time read $raON"
8461 set_read_ahead $old_READAHEAD
8463 wait_delete_completed
8465 [ $raOFF -le 1 -o $raON -lt $raOFF ] ||
8466 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8468 run_test 101d "file read with and without read-ahead enabled"
8471 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8473 local file=$DIR/$tfile
8474 local size_KB=500 #KB
8478 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8479 local need_KB=$((count * size_KB))
8480 [[ $free_KB -le $need_KB ]] &&
8481 skip_env "Need free space $need_KB, have $free_KB"
8483 echo "Creating $count ${size_KB}K test files"
8484 for ((i = 0; i < $count; i++)); do
8485 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8488 echo "Cancel LRU locks on lustre client to flush the client cache"
8489 cancel_lru_locks $OSC
8491 echo "Reset readahead stats"
8492 $LCTL set_param -n llite.*.read_ahead_stats 0
8494 for ((i = 0; i < $count; i++)); do
8495 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
8498 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8499 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8501 for ((i = 0; i < $count; i++)); do
8502 rm -rf $file.$i 2>/dev/null
8505 #10000 means 20% reads are missing in readahead
8506 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
8508 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
8511 which iozone || skip_env "no iozone installed"
8513 local old_debug=$($LCTL get_param debug)
8514 old_debug=${old_debug#*=}
8515 $LCTL set_param debug="reada mmap"
8517 # create a test file
8518 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
8520 echo Cancel LRU locks on lustre client to flush the client cache
8521 cancel_lru_locks osc
8523 echo Reset readahead stats
8524 $LCTL set_param -n llite.*.read_ahead_stats 0
8526 echo mmap read the file with small block size
8527 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
8530 echo checking missing pages
8531 $LCTL get_param llite.*.read_ahead_stats
8532 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8533 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8535 $LCTL set_param debug="$old_debug"
8536 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
8539 run_test 101f "check mmap read performance"
8541 test_101g_brw_size_test() {
8543 local pages=$((mb * 1048576 / PAGE_SIZE))
8544 local file=$DIR/$tfile
8546 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
8547 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
8548 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
8549 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
8553 stack_trap "rm -f $file" EXIT
8554 $LCTL set_param -n osc.*.rpc_stats=0
8556 # 10 RPCs should be enough for the test
8558 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
8559 { error "dd write ${mb} MB blocks failed"; return 3; }
8560 cancel_lru_locks osc
8561 dd of=/dev/null if=$file bs=${mb}M count=$count ||
8562 { error "dd write ${mb} MB blocks failed"; return 4; }
8564 # calculate number of full-sized read and write RPCs
8565 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
8566 sed -n '/pages per rpc/,/^$/p' |
8567 awk '/'$pages':/ { reads += $2; writes += $6 }; \
8568 END { print reads,writes }'))
8569 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
8571 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
8578 remote_ost_nodsh && skip "remote OST with nodsh"
8581 local osts=$(get_facets OST)
8582 local list=$(comma_list $(osts_nodes))
8583 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
8584 local brw_size="obdfilter.*.brw_size"
8586 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8588 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
8589 if [ $OST1_VERSION -ge $(version_code 2.8.52) -o \
8590 \( $OST1_VERSION -ge $(version_code 2.7.17) -a \
8591 $OST1_VERSION -lt $(version_code 2.7.50) \) ] &&
8592 [ $CLIENT_VERSION -ge $(version_code 2.8.52) -o \
8593 \( $CLIENT_VERSION -ge $(version_code 2.7.17) -a \
8594 $CLIENT_VERSION -lt $(version_code 2.7.50) \) ]; then
8595 [ $OST1_VERSION -ge $(version_code 2.9.52) ] && suffix="M"
8596 if [[ $orig_mb -lt 16 ]]; then
8597 save_lustre_params $osts "$brw_size" > $p
8598 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
8599 error "set 16MB RPC size failed"
8601 echo "remount client to enable new RPC size"
8602 remount_client $MOUNT || error "remount_client failed"
8605 test_101g_brw_size_test 16 || error "16MB RPC test failed"
8606 # should be able to set brw_size=12, but no rpc_stats for that
8607 test_101g_brw_size_test 8 || error "8MB RPC test failed"
8610 test_101g_brw_size_test 4 || error "4MB RPC test failed"
8612 if [[ $orig_mb -lt 16 ]]; then
8613 restore_lustre_params < $p
8614 remount_client $MOUNT || error "remount_client restore failed"
8617 rm -f $p $DIR/$tfile
8619 run_test 101g "Big bulk(4/16 MiB) readahead"
8622 test_mkdir $DIR/$tdir
8623 chown $RUNAS_ID $DIR/$tdir
8626 STRIPE_COUNT=$OSTCOUNT
8627 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
8629 trap cleanup_test102 EXIT
8631 $1 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
8633 for num in 1 2 3 4; do
8634 for count in $(seq 1 $STRIPE_COUNT); do
8635 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
8636 local size=`expr $STRIPE_SIZE \* $num`
8637 local file=file"$num-$idx-$count"
8638 $1 $SETSTRIPE -S $size -i $idx -c $count $file
8644 $1 tar cf $TMP/f102.tar $tdir --xattrs
8650 rm -rf $DIR/d0.sanity/d102
8654 [ "$UID" != 0 ] && skip "must run as root"
8655 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
8656 skip_env "must have user_xattr"
8658 [ -z "$(which setfattr 2>/dev/null)" ] &&
8659 skip_env "could not find setfattr"
8661 local testfile=$DIR/$tfile
8664 echo "set/get xattr..."
8665 setfattr -n trusted.name1 -v value1 $testfile ||
8666 error "setfattr -n trusted.name1=value1 $testfile failed"
8667 getfattr -n trusted.name1 $testfile 2> /dev/null |
8668 grep "trusted.name1=.value1" ||
8669 error "$testfile missing trusted.name1=value1"
8671 setfattr -n user.author1 -v author1 $testfile ||
8672 error "setfattr -n user.author1=author1 $testfile failed"
8673 getfattr -n user.author1 $testfile 2> /dev/null |
8674 grep "user.author1=.author1" ||
8675 error "$testfile missing trusted.author1=author1"
8678 setfattr -n trusted.name2 -v value2 $testfile ||
8679 error "$testfile unable to set trusted.name2"
8680 setfattr -n trusted.name3 -v value3 $testfile ||
8681 error "$testfile unable to set trusted.name3"
8682 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
8683 grep "trusted.name" | wc -l) -eq 3 ] ||
8684 error "$testfile missing 3 trusted.name xattrs"
8686 setfattr -n user.author2 -v author2 $testfile ||
8687 error "$testfile unable to set user.author2"
8688 setfattr -n user.author3 -v author3 $testfile ||
8689 error "$testfile unable to set user.author3"
8690 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
8691 grep "user.author" | wc -l) -eq 3 ] ||
8692 error "$testfile missing 3 user.author xattrs"
8694 echo "remove xattr..."
8695 setfattr -x trusted.name1 $testfile ||
8696 error "$testfile error deleting trusted.name1"
8697 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
8698 error "$testfile did not delete trusted.name1 xattr"
8700 setfattr -x user.author1 $testfile ||
8701 error "$testfile error deleting user.author1"
8702 echo "set lustre special xattr ..."
8703 $LFS setstripe -c1 $testfile
8704 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
8705 awk -F "=" '/trusted.lov/ { print $2 }' )
8706 setfattr -n "trusted.lov" -v $lovea $testfile ||
8707 error "$testfile doesn't ignore setting trusted.lov again"
8708 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
8709 error "$testfile allow setting invalid trusted.lov"
8712 run_test 102a "user xattr test =================================="
8714 check_102b_layout() {
8716 local testfile=$DIR/$tfile
8718 echo "test layout '$layout'"
8719 $LFS setstripe $layout $testfile || error "setstripe failed"
8720 $LFS getstripe -y $testfile
8722 echo "get/set/list trusted.lov xattr ..." # b=10930
8723 local value=$(getfattr -n trusted.lov -e hex $testfile | grep trusted)
8724 [[ "$value" =~ "trusted.lov" ]] ||
8725 error "can't get trusted.lov from $testfile"
8726 local stripe_count_orig=$($LFS getstripe -c $testfile) ||
8727 error "getstripe failed"
8729 $MCREATE $testfile.2 || error "mcreate $testfile.2 failed"
8731 value=$(cut -d= -f2 <<<$value)
8732 # LU-13168: truncated xattr should fail if short lov_user_md header
8733 [ $CLIENT_VERSION -lt $(version_code 2.13.53) ] &&
8734 lens="${#value}" || lens="$(seq 4 2 ${#value})"
8735 for len in $lens; do
8736 echo "setfattr $len $testfile.2"
8737 setfattr -n trusted.lov -v ${value:0:$len} $testfile.2 &&
8738 [ $len -lt 66 ] && error "short xattr len=$len worked"
8740 local stripe_size=$($LFS getstripe -S $testfile.2)
8741 local stripe_count=$($LFS getstripe -c $testfile.2)
8742 [[ $stripe_size -eq 65536 ]] ||
8743 error "stripe size $stripe_size != 65536"
8744 [[ $stripe_count -eq $stripe_count_orig ]] ||
8745 error "stripe count $stripe_count != $stripe_count_orig"
8746 rm $testfile $testfile.2
8750 [ -z "$(which setfattr 2>/dev/null)" ] &&
8751 skip_env "could not find setfattr"
8752 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8754 # check plain layout
8755 check_102b_layout -S 65536 -i 1 -c $OSTCOUNT
8757 # and also check composite layout
8758 check_102b_layout -E 1M -S 65536 -i 1 -c $OSTCOUNT -Eeof -S4M
8761 run_test 102b "getfattr/setfattr for trusted.lov EAs"
8764 [ -z "$(which setfattr 2>/dev/null)" ] &&
8765 skip_env "could not find setfattr"
8766 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8768 # b10930: get/set/list lustre.lov xattr
8769 echo "get/set/list lustre.lov xattr ..."
8770 test_mkdir $DIR/$tdir
8771 chown $RUNAS_ID $DIR/$tdir
8772 local testfile=$DIR/$tdir/$tfile
8773 $RUNAS $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8774 error "setstripe failed"
8775 local STRIPECOUNT=$($RUNAS $GETSTRIPE -c $testfile) ||
8776 error "getstripe failed"
8777 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
8778 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
8780 local testfile2=${testfile}2
8781 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
8782 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
8784 $RUNAS $MCREATE $testfile2
8785 $RUNAS setfattr -n lustre.lov -v $value $testfile2
8786 local stripe_size=$($RUNAS $GETSTRIPE -S $testfile2)
8787 local stripe_count=$($RUNAS $GETSTRIPE -c $testfile2)
8788 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
8789 [ $stripe_count -eq $STRIPECOUNT ] ||
8790 error "stripe count $stripe_count != $STRIPECOUNT"
8792 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
8794 compare_stripe_info1() {
8795 local stripe_index_all_zero=true
8797 for num in 1 2 3 4; do
8798 for count in $(seq 1 $STRIPE_COUNT); do
8799 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
8800 local size=$((STRIPE_SIZE * num))
8801 local file=file"$num-$offset-$count"
8802 stripe_size=$($LFS getstripe -S $PWD/$file)
8803 [[ $stripe_size -ne $size ]] &&
8804 error "$file: size $stripe_size != $size"
8805 stripe_count=$($LFS getstripe -c $PWD/$file)
8806 # allow fewer stripes to be created, ORI-601
8807 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
8808 error "$file: count $stripe_count != $count"
8809 stripe_index=$($LFS getstripe -i $PWD/$file)
8810 [[ $stripe_index -ne 0 ]] &&
8811 stripe_index_all_zero=false
8815 $stripe_index_all_zero &&
8816 error "all files are being extracted starting from OST index 0"
8820 have_xattrs_include() {
8821 tar --help | grep -q xattrs-include &&
8822 echo --xattrs-include="lustre.*"
8826 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8827 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8829 XINC=$(have_xattrs_include)
8831 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8833 compare_stripe_info1
8835 run_test 102d "tar restore stripe info from tarfile,not keep osts"
8838 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8839 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8841 XINC=$(have_xattrs_include)
8843 test_mkdir $DIR/$tdir.restore
8845 tar cf - --xattrs $tdir | tar xf - \
8846 -C $DIR/$tdir.restore --xattrs $XINC
8847 cd $DIR/$tdir.restore/$tdir
8848 compare_stripe_info1
8850 run_test 102f "tar copy files, not keep osts"
8853 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
8854 skip "must have user_xattr"
8855 [ -z "$(which setfattr 2>/dev/null)" ] &&
8856 skip_env "could not find setfattr"
8857 [ -z "$(which getfattr 2>/dev/null)" ] &&
8858 skip_env "could not find getfattr"
8860 local xsize=${1:-1024} # in bytes
8861 local file=$DIR/$tfile
8862 local value="$(generate_string $xsize)"
8863 local xbig=trusted.big
8866 log "save $xbig on $file"
8867 setfattr -n $xbig -v $value $file ||
8868 error "saving $xbig on $file failed"
8870 local orig=$(get_xattr_value $xbig $file)
8871 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
8873 local xsml=trusted.sml
8874 log "save $xsml on $file"
8875 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
8877 local new=$(get_xattr_value $xbig $file)
8878 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
8880 log "grow $xsml on $file"
8881 setfattr -n $xsml -v "$value" $file ||
8882 error "growing $xsml on $file failed"
8884 new=$(get_xattr_value $xbig $file)
8885 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
8886 log "$xbig still valid after growing $xsml"
8891 test_102h() { # bug 15777
8894 run_test 102h "grow xattr from inside inode to external block"
8897 large_xattr_enabled || skip_env "ea_inode feature disabled"
8899 grow_xattr $(max_xattr_size)
8901 run_test 102ha "grow xattr from inside inode to external inode"
8903 test_102i() { # bug 17038
8904 [ -z "$(which getfattr 2>/dev/null)" ] &&
8905 skip "could not find getfattr"
8908 ln -s $DIR/$tfile $DIR/${tfile}link
8909 getfattr -n trusted.lov $DIR/$tfile ||
8910 error "lgetxattr on $DIR/$tfile failed"
8911 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
8912 grep -i "no such attr" ||
8913 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
8914 rm -f $DIR/$tfile $DIR/${tfile}link
8916 run_test 102i "lgetxattr test on symbolic link ============"
8919 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8920 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8922 XINC=$(have_xattrs_include)
8923 setup_test102 "$RUNAS"
8924 chown $RUNAS_ID $DIR/$tdir
8925 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8927 compare_stripe_info1 "$RUNAS"
8929 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
8932 [ -z "$(which setfattr 2>/dev/null)" ] &&
8933 skip "could not find setfattr"
8936 # b22187 just check that does not crash for regular file.
8937 setfattr -n trusted.lov $DIR/$tfile
8938 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
8939 local test_kdir=$DIR/$tdir
8940 test_mkdir $test_kdir
8941 local default_size=$($LFS getstripe -S $test_kdir)
8942 local default_count=$($LFS getstripe -c $test_kdir)
8943 local default_offset=$($LFS getstripe -i $test_kdir)
8944 $SETSTRIPE -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
8945 error 'dir setstripe failed'
8946 setfattr -n trusted.lov $test_kdir
8947 local stripe_size=$($LFS getstripe -S $test_kdir)
8948 local stripe_count=$($LFS getstripe -c $test_kdir)
8949 local stripe_offset=$($LFS getstripe -i $test_kdir)
8950 [ $stripe_size -eq $default_size ] ||
8951 error "stripe size $stripe_size != $default_size"
8952 [ $stripe_count -eq $default_count ] ||
8953 error "stripe count $stripe_count != $default_count"
8954 [ $stripe_offset -eq $default_offset ] ||
8955 error "stripe offset $stripe_offset != $default_offset"
8956 rm -rf $DIR/$tfile $test_kdir
8958 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
8961 [ -z "$(which getfattr 2>/dev/null)" ] &&
8962 skip "could not find getfattr"
8964 # LU-532 trusted. xattr is invisible to non-root
8965 local testfile=$DIR/$tfile
8969 echo "listxattr as user..."
8970 chown $RUNAS_ID $testfile
8971 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
8972 grep -q "trusted" &&
8973 error "$testfile trusted xattrs are user visible"
8977 run_test 102l "listxattr size test =================================="
8979 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
8980 local path=$DIR/$tfile
8983 listxattr_size_check $path || error "listattr_size_check $path failed"
8985 run_test 102m "Ensure listxattr fails on small bufffer ========"
8989 getxattr() { # getxattr path name
8990 # Return the base64 encoding of the value of xattr name on path.
8994 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
8996 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8998 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
9000 getfattr --absolute-names --encoding=base64 --name=$name $path |
9001 awk -F= -v name=$name '$1 == name {
9002 print substr($0, index($0, "=") + 1);
9006 test_102n() { # LU-4101 mdt: protect internal xattrs
9007 [ -z "$(which setfattr 2>/dev/null)" ] &&
9008 skip "could not find setfattr"
9009 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
9011 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
9014 local file0=$DIR/$tfile.0
9015 local file1=$DIR/$tfile.1
9016 local xattr0=$TMP/$tfile.0
9017 local xattr1=$TMP/$tfile.1
9018 local namelist="lov lma lmv link fid version som hsm"
9022 rm -rf $file0 $file1 $xattr0 $xattr1
9025 # Get 'before' xattrs of $file1.
9026 getfattr --absolute-names --dump --match=- $file1 > $xattr0
9028 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
9029 namelist+=" lfsck_namespace"
9030 for name in $namelist; do
9031 # Try to copy xattr from $file0 to $file1.
9032 value=$(getxattr $file0 trusted.$name 2> /dev/null)
9034 setfattr --name=trusted.$name --value="$value" $file1 ||
9035 error "setxattr 'trusted.$name' failed"
9037 # Try to set a garbage xattr.
9038 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9040 if [[ x$name == "xlov" ]]; then
9041 setfattr --name=trusted.lov --value="$value" $file1 &&
9042 error "setxattr invalid 'trusted.lov' success"
9044 setfattr --name=trusted.$name --value="$value" $file1 ||
9045 error "setxattr invalid 'trusted.$name' failed"
9048 # Try to remove the xattr from $file1. We don't care if this
9049 # appears to succeed or fail, we just don't want there to be
9050 # any changes or crashes.
9051 setfattr --remove=$trusted.$name $file1 2> /dev/null
9054 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
9057 # Try to copy xattr from $file0 to $file1.
9058 value=$(getxattr $file0 trusted.$name 2> /dev/null)
9060 setfattr --name=trusted.$name --value="$value" $file1 ||
9061 error "setxattr 'trusted.$name' failed"
9063 # Try to set a garbage xattr.
9064 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9066 setfattr --name=trusted.$name --value="$value" $file1 ||
9067 error "setxattr 'trusted.$name' failed"
9069 # Try to remove the xattr from $file1. We don't care if this
9070 # appears to succeed or fail, we just don't want there to be
9071 # any changes or crashes.
9072 setfattr --remove=$trusted.$name $file1 2> /dev/null
9075 # Get 'after' xattrs of file1.
9076 getfattr --absolute-names --dump --match=- $file1 > $xattr1
9078 if ! diff $xattr0 $xattr1; then
9079 error "before and after xattrs of '$file1' differ"
9082 rm -rf $file0 $file1 $xattr0 $xattr1
9086 run_test 102n "silently ignore setxattr on internal trusted xattrs"
9088 test_102p() { # LU-4703 setxattr did not check ownership
9089 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
9090 skip "MDS needs to be at least 2.5.56"
9092 local testfile=$DIR/$tfile
9096 echo "setfacl as user..."
9097 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
9098 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
9100 echo "setfattr as user..."
9101 setfacl -m "u:$RUNAS_ID:---" $testfile
9102 $RUNAS setfattr -x system.posix_acl_access $testfile
9103 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
9105 run_test 102p "check setxattr(2) correctly fails without permission"
9108 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
9109 skip "MDS needs to be at least 2.6.92"
9111 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
9113 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
9116 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
9117 skip "MDS needs to be at least 2.6.93"
9119 touch $DIR/$tfile || error "touch"
9120 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
9121 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
9122 rm $DIR/$tfile || error "rm"
9125 mkdir -p $DIR/$tdir || error "mkdir"
9126 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9127 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9128 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9129 error "$testfile error deleting user.author1"
9130 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9131 grep "user.$(basename $tdir)" &&
9132 error "$tdir did not delete user.$(basename $tdir)"
9133 rmdir $DIR/$tdir || error "rmdir"
9136 test_mkdir $DIR/$tdir
9137 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9138 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9139 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9140 error "$testfile error deleting user.author1"
9141 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9142 grep "user.$(basename $tdir)" &&
9143 error "$tdir did not delete user.$(basename $tdir)"
9144 rmdir $DIR/$tdir || error "rm striped dir"
9146 run_test 102r "set EAs with empty values"
9149 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9150 skip "MDS needs to be at least 2.11.52"
9152 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9154 save_lustre_params client "llite.*.xattr_cache" > $save
9156 for cache in 0 1; do
9157 lctl set_param llite.*.xattr_cache=$cache
9160 touch $DIR/$tfile || error "touch"
9161 for prefix in lustre security system trusted user; do
9162 # Note getxattr() may fail with 'Operation not
9163 # supported' or 'No such attribute' depending
9164 # on prefix and cache.
9165 getfattr -n $prefix.n102s $DIR/$tfile &&
9166 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
9170 restore_lustre_params < $save
9172 run_test 102s "getting nonexistent xattrs should fail"
9175 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9176 skip "MDS needs to be at least 2.11.52"
9178 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9180 save_lustre_params client "llite.*.xattr_cache" > $save
9182 for cache in 0 1; do
9183 lctl set_param llite.*.xattr_cache=$cache
9185 for buf_size in 0 256; do
9187 touch $DIR/$tfile || error "touch"
9188 setfattr -n user.multiop $DIR/$tfile
9189 $MULTIOP $DIR/$tfile oa$buf_size ||
9190 error "cannot get zero length xattr value (buf_size = $buf_size)"
9194 restore_lustre_params < $save
9196 run_test 102t "zero length xattr values handled correctly"
9200 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
9205 [ "$UID" != 0 ] && skip "must run as root"
9206 $GSS && skip_env "could not run under gss"
9207 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
9208 skip_env "must have acl enabled"
9209 [ -z "$(which setfacl 2>/dev/null)" ] &&
9210 skip_env "could not find setfacl"
9211 remote_mds_nodsh && skip "remote MDS with nodsh"
9213 gpasswd -a daemon bin # LU-5641
9214 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
9216 declare -a identity_old
9218 for num in $(seq $MDSCOUNT); do
9219 switch_identity $num true || identity_old[$num]=$?
9227 echo "performing cp ..."
9228 run_acl_subtest cp || error "run_acl_subtest cp failed"
9229 echo "performing getfacl-noacl..."
9230 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
9231 echo "performing misc..."
9232 run_acl_subtest misc || error "misc test failed"
9233 echo "performing permissions..."
9234 run_acl_subtest permissions || error "permissions failed"
9235 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
9236 if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] ||
9237 { [ $MDS1_VERSION -lt $(version_code 2.6) ] &&
9238 [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; }
9240 echo "performing permissions xattr..."
9241 run_acl_subtest permissions_xattr ||
9242 error "permissions_xattr failed"
9244 echo "performing setfacl..."
9245 run_acl_subtest setfacl || error "setfacl test failed"
9247 # inheritance test got from HP
9248 echo "performing inheritance..."
9249 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
9250 chmod +x make-tree || error "chmod +x failed"
9251 run_acl_subtest inheritance || error "inheritance test failed"
9254 echo "LU-974 ignore umask when acl is enabled..."
9255 run_acl_subtest 974 || error "LU-974 umask test failed"
9256 if [ $MDSCOUNT -ge 2 ]; then
9257 run_acl_subtest 974_remote ||
9258 error "LU-974 umask test failed under remote dir"
9261 echo "LU-2561 newly created file is same size as directory..."
9262 if [ "$mds1_FSTYPE" != "zfs" ]; then
9263 run_acl_subtest 2561 || error "LU-2561 test failed"
9265 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
9268 run_acl_subtest 4924 || error "LU-4924 test failed"
9273 for num in $(seq $MDSCOUNT); do
9274 if [ "${identity_old[$num]}" = 1 ]; then
9275 switch_identity $num false || identity_old[$num]=$?
9279 run_test 103a "acl test"
9285 for U in {0..511}; do
9287 local O=$(printf "%04o" $U)
9289 umask $(printf "%04o" $((511 ^ $O)))
9290 $LFS setstripe -c 1 $DIR/$tfile.s$O
9291 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
9293 (( $S == ($O & 0666) )) ||
9294 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
9296 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
9297 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
9298 (( $S == ($O & 0666) )) ||
9299 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
9301 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
9302 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
9303 (( $S == ($O & 0666) )) ||
9304 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
9305 rm -f $DIR/$tfile.[smp]$0
9309 # limit the concurrently running threads to 64. LU-11878
9310 local idx=$((U % 64))
9311 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
9316 run_test 103b "umask lfs setstripe"
9320 cp -rp $DIR/$tdir $DIR/$tdir.bak
9322 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
9323 error "$DIR/$tdir shouldn't contain default ACL"
9324 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
9325 error "$DIR/$tdir.bak shouldn't contain default ACL"
9328 run_test 103c "'cp -rp' won't set empty acl"
9331 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9334 lfs df || error "lfs df failed"
9335 lfs df -ih || error "lfs df -ih failed"
9336 lfs df -h $DIR || error "lfs df -h $DIR failed"
9337 lfs df -i $DIR || error "lfs df -i $DIR failed"
9338 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
9339 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
9341 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
9342 lctl --device %$OSC deactivate
9343 lfs df || error "lfs df with deactivated OSC failed"
9344 lctl --device %$OSC activate
9345 # wait the osc back to normal
9346 wait_osc_import_ready client ost
9348 lfs df || error "lfs df with reactivated OSC failed"
9351 run_test 104a "lfs df [-ih] [path] test ========================="
9354 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9355 [ $RUNAS_ID -eq $UID ] &&
9356 skip_env "RUNAS_ID = UID = $UID -- skipping"
9358 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
9359 grep "Permission denied" | wc -l)))
9360 if [ $denied_cnt -ne 0 ]; then
9361 error "lfs check servers test failed"
9364 run_test 104b "$RUNAS lfs check servers test ===================="
9367 # doesn't work on 2.4 kernels
9369 if $(flock_is_enabled); then
9370 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
9372 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
9376 run_test 105a "flock when mounted without -o flock test ========"
9380 if $(flock_is_enabled); then
9381 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
9383 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
9387 run_test 105b "fcntl when mounted without -o flock test ========"
9391 if $(flock_is_enabled); then
9392 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
9394 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
9398 run_test 105c "lockf when mounted without -o flock test"
9400 test_105d() { # bug 15924
9401 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9403 test_mkdir $DIR/$tdir
9404 flock_is_enabled || skip_env "mount w/o flock enabled"
9405 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
9406 $LCTL set_param fail_loc=0x80000315
9407 flocks_test 2 $DIR/$tdir
9409 run_test 105d "flock race (should not freeze) ========"
9411 test_105e() { # bug 22660 && 22040
9412 flock_is_enabled || skip_env "mount w/o flock enabled"
9415 flocks_test 3 $DIR/$tfile
9417 run_test 105e "Two conflicting flocks from same process"
9419 test_106() { #bug 10921
9420 test_mkdir $DIR/$tdir
9421 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9422 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9424 run_test 106 "attempt exec of dir followed by chown of that dir"
9427 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9435 local save_pattern=$(sysctl -n kernel.core_pattern)
9436 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9437 sysctl -w kernel.core_pattern=$file
9438 sysctl -w kernel.core_uses_pid=0
9446 kill -s 11 $SLEEPPID
9448 if [ -e $file ]; then
9449 size=`stat -c%s $file`
9450 [ $size -eq 0 ] && error "Fail to create core file $file"
9452 error "Fail to create core file $file"
9455 sysctl -w kernel.core_pattern=$save_pattern
9456 sysctl -w kernel.core_uses_pid=$save_uses_pid
9459 run_test 107 "Coredump on SIG"
9462 test_mkdir $DIR/$tdir
9463 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9464 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9465 error "mkdir with 256 char should fail, but did not"
9466 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9467 error "create with 255 char failed"
9468 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9469 error "create with 256 char should fail, but did not"
9474 run_test 110 "filename length checking"
9477 # Purpose: To verify dynamic thread (OSS) creation.
9480 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9481 remote_ost_nodsh && skip "remote OST with nodsh"
9483 # Lustre does not stop service threads once they are started.
9484 # Reset number of running threads to default.
9489 local save_params="$TMP/sanity-$TESTNAME.parameters"
9491 # Get ll_ost_io count before I/O
9492 OSTIO_pre=$(do_facet ost1 \
9493 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9494 # Exit if lustre is not running (ll_ost_io not running).
9495 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9497 echo "Starting with $OSTIO_pre threads"
9498 local thread_max=$((OSTIO_pre * 2))
9499 local rpc_in_flight=$((thread_max * 2))
9500 # Number of I/O Process proposed to be started.
9502 local facets=$(get_facets OST)
9504 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9505 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9507 # Set in_flight to $rpc_in_flight
9508 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9509 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9510 nfiles=${rpc_in_flight}
9511 # Set ost thread_max to $thread_max
9512 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9514 # 5 Minutes should be sufficient for max number of OSS
9515 # threads(thread_max) to be created.
9519 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9520 test_mkdir $DIR/$tdir
9521 for i in $(seq $nfiles); do
9522 local file=$DIR/$tdir/${tfile}-$i
9523 $LFS setstripe -c -1 -i 0 $file
9524 ($WTL $file $timeout)&
9527 # I/O Started - Wait for thread_started to reach thread_max or report
9528 # error if thread_started is more than thread_max.
9529 echo "Waiting for thread_started to reach thread_max"
9530 local thread_started=0
9531 local end_time=$((SECONDS + timeout))
9533 while [ $SECONDS -le $end_time ] ; do
9535 # Get ost i/o thread_started count.
9536 thread_started=$(do_facet ost1 \
9538 ost.OSS.ost_io.threads_started | cut -d= -f2")
9539 # Break out if thread_started is equal/greater than thread_max
9540 if [[ $thread_started -ge $thread_max ]]; then
9541 echo ll_ost_io thread_started $thread_started, \
9542 equal/greater than thread_max $thread_max
9548 # Cleanup - We have the numbers, Kill i/o jobs if running.
9549 jobcount=($(jobs -p))
9550 for i in $(seq 0 $((${#jobcount[@]}-1)))
9552 kill -9 ${jobcount[$i]}
9553 if [ $? -ne 0 ] ; then
9555 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
9559 # Cleanup files left by WTL binary.
9560 for i in $(seq $nfiles); do
9561 local file=$DIR/$tdir/${tfile}-$i
9563 if [ $? -ne 0 ] ; then
9564 echo "Warning: Failed to delete file $file"
9568 restore_lustre_params <$save_params
9569 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
9571 # Error out if no new thread has started or Thread started is greater
9573 if [[ $thread_started -le $OSTIO_pre ||
9574 $thread_started -gt $thread_max ]]; then
9575 error "ll_ost_io: thread_started $thread_started" \
9576 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
9577 "No new thread started or thread started greater " \
9581 run_test 115 "verify dynamic thread creation===================="
9584 wait_delete_completed
9585 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
9586 echo "OST kbytes available: ${AVAIL[@]}"
9591 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
9592 #echo OST $i: ${AVAIL[i]}kb
9593 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
9597 if [[ ${AVAIL[i]} -lt $MINV ]]; then
9602 echo "Min free space: OST $MINI: $MINV"
9603 echo "Max free space: OST $MAXI: $MAXV"
9606 test_116a() { # was previously test_116()
9607 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9608 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9609 remote_mds_nodsh && skip "remote MDS with nodsh"
9611 echo -n "Free space priority "
9612 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
9617 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
9618 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
9619 trap simple_cleanup_common EXIT
9621 # Check if we need to generate uneven OSTs
9622 test_mkdir -p $DIR/$tdir/OST${MINI}
9623 local FILL=$((MINV / 4))
9624 local DIFF=$((MAXV - MINV))
9625 local DIFF2=$((DIFF * 100 / MINV))
9627 local threshold=$(do_facet $SINGLEMDS \
9628 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
9629 threshold=${threshold%%%}
9630 echo -n "Check for uneven OSTs: "
9631 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
9633 if [[ $DIFF2 -gt $threshold ]]; then
9635 echo "Don't need to fill OST$MINI"
9637 # generate uneven OSTs. Write 2% over the QOS threshold value
9639 DIFF=$((threshold - DIFF2 + 2))
9640 DIFF2=$((MINV * DIFF / 100))
9641 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
9642 $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
9643 error "setstripe failed"
9644 DIFF=$((DIFF2 / 2048))
9646 while [ $i -lt $DIFF ]; do
9648 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
9649 bs=2M count=1 2>/dev/null
9658 DIFF=$((MAXV - MINV))
9659 DIFF2=$((DIFF * 100 / MINV))
9660 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
9661 if [ $DIFF2 -gt $threshold ]; then
9664 echo "failed - QOS mode won't be used"
9665 simple_cleanup_common
9666 skip "QOS imbalance criteria not met"
9674 # now fill using QOS
9675 $SETSTRIPE -c 1 $DIR/$tdir
9676 FILL=$((FILL / 200))
9677 if [ $FILL -gt 600 ]; then
9680 echo "writing $FILL files to QOS-assigned OSTs"
9682 while [ $i -lt $FILL ]; do
9684 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
9688 echo "wrote $i 200k files"
9692 echo "Note: free space may not be updated, so measurements might be off"
9694 DIFF2=$((MAXV - MINV))
9695 echo "free space delta: orig $DIFF final $DIFF2"
9696 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
9697 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
9698 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
9699 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
9700 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
9701 if [[ $DIFF -gt 0 ]]; then
9702 FILL=$((DIFF2 * 100 / DIFF - 100))
9703 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
9706 # Figure out which files were written where
9707 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9708 awk '/'$MINI1': / {print $2; exit}')
9710 MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9711 echo "$MINC files created on smaller OST $MINI1"
9712 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9713 awk '/'$MAXI1': / {print $2; exit}')
9715 MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9716 echo "$MAXC files created on larger OST $MAXI1"
9717 if [[ $MINC -gt 0 ]]; then
9718 FILL=$((MAXC * 100 / MINC - 100))
9719 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
9721 [[ $MAXC -gt $MINC ]] ||
9722 error_ignore LU-9 "stripe QOS didn't balance free space"
9723 simple_cleanup_common
9725 run_test 116a "stripe QOS: free space balance ==================="
9727 test_116b() { # LU-2093
9728 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9729 remote_mds_nodsh && skip "remote MDS with nodsh"
9731 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
9732 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
9733 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
9734 [ -z "$old_rr" ] && skip "no QOS"
9735 do_facet $SINGLEMDS lctl set_param \
9736 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
9738 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
9739 createmany -o $DIR/$tdir/f- 20 || error "can't create"
9740 do_facet $SINGLEMDS lctl set_param fail_loc=0
9742 do_facet $SINGLEMDS lctl set_param \
9743 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
9745 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
9747 test_117() # bug 10891
9749 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9751 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
9752 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
9753 lctl set_param fail_loc=0x21e
9754 > $DIR/$tfile || error "truncate failed"
9755 lctl set_param fail_loc=0
9756 echo "Truncate succeeded."
9759 run_test 117 "verify osd extend =========="
9761 NO_SLOW_RESENDCOUNT=4
9762 export OLD_RESENDCOUNT=""
9763 set_resend_count () {
9764 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
9765 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
9766 lctl set_param -n $PROC_RESENDCOUNT $1
9767 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
9770 # for reduce test_118* time (b=14842)
9771 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9773 # Reset async IO behavior after error case
9775 FILE=$DIR/reset_async
9777 # Ensure all OSCs are cleared
9778 $SETSTRIPE -c -1 $FILE
9779 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
9784 test_118a() #bug 11710
9786 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9790 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9791 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9792 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9794 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9795 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9800 run_test 118a "verify O_SYNC works =========="
9804 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9805 remote_ost_nodsh && skip "remote OST with nodsh"
9809 #define OBD_FAIL_SRV_ENOENT 0x217
9810 set_nodes_failloc "$(osts_nodes)" 0x217
9811 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9813 set_nodes_failloc "$(osts_nodes)" 0
9814 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9815 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9818 if [[ $RC -eq 0 ]]; then
9819 error "Must return error due to dropped pages, rc=$RC"
9823 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9824 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9828 echo "Dirty pages not leaked on ENOENT"
9830 # Due to the above error the OSC will issue all RPCs syncronously
9831 # until a subsequent RPC completes successfully without error.
9832 $MULTIOP $DIR/$tfile Ow4096yc
9837 run_test 118b "Reclaim dirty pages on fatal error =========="
9841 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9843 # for 118c, restore the original resend count, LU-1940
9844 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
9845 set_resend_count $OLD_RESENDCOUNT
9846 remote_ost_nodsh && skip "remote OST with nodsh"
9850 #define OBD_FAIL_OST_EROFS 0x216
9851 set_nodes_failloc "$(osts_nodes)" 0x216
9853 # multiop should block due to fsync until pages are written
9854 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9858 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9859 error "Multiop failed to block on fsync, pid=$MULTIPID"
9862 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9864 if [[ $WRITEBACK -eq 0 ]]; then
9865 error "No page in writeback, writeback=$WRITEBACK"
9868 set_nodes_failloc "$(osts_nodes)" 0
9871 if [[ $RC -ne 0 ]]; then
9872 error "Multiop fsync failed, rc=$RC"
9875 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9876 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9878 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9879 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9883 echo "Dirty pages flushed via fsync on EROFS"
9886 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
9888 # continue to use small resend count to reduce test_118* time (b=14842)
9889 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9893 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9894 remote_ost_nodsh && skip "remote OST with nodsh"
9898 #define OBD_FAIL_OST_BRW_PAUSE_BULK
9899 set_nodes_failloc "$(osts_nodes)" 0x214
9900 # multiop should block due to fsync until pages are written
9901 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9905 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9906 error "Multiop failed to block on fsync, pid=$MULTIPID"
9909 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9911 if [[ $WRITEBACK -eq 0 ]]; then
9912 error "No page in writeback, writeback=$WRITEBACK"
9915 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
9916 set_nodes_failloc "$(osts_nodes)" 0
9918 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9919 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9921 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9922 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9926 echo "Dirty pages gaurenteed flushed via fsync"
9929 run_test 118d "Fsync validation inject a delay of the bulk =========="
9932 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9936 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
9937 lctl set_param fail_loc=0x8000040a
9939 # Should simulate EINVAL error which is fatal
9940 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9942 if [[ $RC -eq 0 ]]; then
9943 error "Must return error due to dropped pages, rc=$RC"
9946 lctl set_param fail_loc=0x0
9948 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9949 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9950 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9952 if [[ $LOCKED -ne 0 ]]; then
9953 error "Locked pages remain in cache, locked=$LOCKED"
9956 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9957 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9961 echo "No pages locked after fsync"
9966 run_test 118f "Simulate unrecoverable OSC side error =========="
9969 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9973 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
9974 lctl set_param fail_loc=0x406
9976 # simulate local -ENOMEM
9977 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9980 lctl set_param fail_loc=0
9981 if [[ $RC -eq 0 ]]; then
9982 error "Must return error due to dropped pages, rc=$RC"
9985 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9986 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9987 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9989 if [[ $LOCKED -ne 0 ]]; then
9990 error "Locked pages remain in cache, locked=$LOCKED"
9993 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9994 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9998 echo "No pages locked after fsync"
10003 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
10006 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10007 remote_ost_nodsh && skip "remote OST with nodsh"
10011 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10012 set_nodes_failloc "$(osts_nodes)" 0x20e
10013 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
10014 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10017 set_nodes_failloc "$(osts_nodes)" 0
10018 if [[ $RC -eq 0 ]]; then
10019 error "Must return error due to dropped pages, rc=$RC"
10022 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10023 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10024 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10026 if [[ $LOCKED -ne 0 ]]; then
10027 error "Locked pages remain in cache, locked=$LOCKED"
10030 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10031 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10035 echo "No pages locked after fsync"
10039 run_test 118h "Verify timeout in handling recoverables errors =========="
10041 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10044 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10045 remote_ost_nodsh && skip "remote OST with nodsh"
10049 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10050 set_nodes_failloc "$(osts_nodes)" 0x20e
10052 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
10053 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
10056 set_nodes_failloc "$(osts_nodes)" 0
10060 if [[ $RC -ne 0 ]]; then
10061 error "got error, but should be not, rc=$RC"
10064 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10065 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10066 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10067 if [[ $LOCKED -ne 0 ]]; then
10068 error "Locked pages remain in cache, locked=$LOCKED"
10071 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10072 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10076 echo "No pages locked after fsync"
10080 run_test 118i "Fix error before timeout in recoverable error =========="
10082 [ "$SLOW" = "no" ] && set_resend_count 4
10085 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10086 remote_ost_nodsh && skip "remote OST with nodsh"
10090 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
10091 set_nodes_failloc "$(osts_nodes)" 0x220
10093 # return -EIO from OST
10094 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10096 set_nodes_failloc "$(osts_nodes)" 0x0
10097 if [[ $RC -eq 0 ]]; then
10098 error "Must return error due to dropped pages, rc=$RC"
10101 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10102 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10103 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10104 if [[ $LOCKED -ne 0 ]]; then
10105 error "Locked pages remain in cache, locked=$LOCKED"
10108 # in recoverable error on OST we want resend and stay until it finished
10109 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10110 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10114 echo "No pages locked after fsync"
10118 run_test 118j "Simulate unrecoverable OST side error =========="
10122 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10123 remote_ost_nodsh && skip "remote OSTs with nodsh"
10125 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10126 set_nodes_failloc "$(osts_nodes)" 0x20e
10127 test_mkdir $DIR/$tdir
10129 for ((i=0;i<10;i++)); do
10130 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
10131 error "dd to $DIR/$tdir/$tfile-$i failed" )&
10138 set_nodes_failloc "$(osts_nodes)" 0
10141 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
10143 test_118l() # LU-646
10145 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10147 test_mkdir $DIR/$tdir
10148 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
10151 run_test 118l "fsync dir"
10153 test_118m() # LU-3066
10155 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10157 test_mkdir $DIR/$tdir
10158 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
10161 run_test 118m "fdatasync dir ========="
10163 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10170 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10171 remote_ost_nodsh && skip "remote OSTs with nodsh"
10173 # Sleep to avoid a cached response.
10174 #define OBD_STATFS_CACHE_SECONDS 1
10177 # Inject a 10 second delay in the OST_STATFS handler.
10178 #define OBD_FAIL_OST_STATFS_DELAY 0x242
10179 set_nodes_failloc "$(osts_nodes)" 0x242
10182 stat --file-system $MOUNT > /dev/null
10185 set_nodes_failloc "$(osts_nodes)" 0
10187 if ((end - begin > 20)); then
10188 error "statfs took $((end - begin)) seconds, expected 10"
10191 run_test 118n "statfs() sends OST_STATFS requests in parallel"
10193 test_119a() # bug 11737
10195 BSIZE=$((512 * 1024))
10196 directio write $DIR/$tfile 0 1 $BSIZE
10197 # We ask to read two blocks, which is more than a file size.
10198 # directio will indicate an error when requested and actual
10199 # sizes aren't equeal (a normal situation in this case) and
10200 # print actual read amount.
10201 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
10202 if [ "$NOB" != "$BSIZE" ]; then
10203 error "read $NOB bytes instead of $BSIZE"
10207 run_test 119a "Short directIO read must return actual read amount"
10209 test_119b() # bug 11737
10211 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10213 $SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed"
10214 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
10216 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
10217 error "direct read failed"
10220 run_test 119b "Sparse directIO read must return actual read amount"
10222 test_119c() # bug 13099
10225 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
10226 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
10229 run_test 119c "Testing for direct read hitting hole"
10231 test_119d() # bug 15950
10233 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10235 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
10236 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
10238 $SETSTRIPE $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
10239 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
10240 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
10241 lctl set_param fail_loc=0x40d
10242 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
10245 cat $DIR/$tfile > /dev/null &
10246 lctl set_param fail_loc=0
10249 log "the DIO writes have completed, now wait for the reads (should not block very long)"
10251 [ -n "`ps h -p $pid_reads -o comm`" ] && \
10252 error "the read rpcs have not completed in 2s"
10254 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
10256 run_test 119d "The DIO path should try to send a new rpc once one is completed"
10259 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10260 remote_mds_nodsh && skip "remote MDS with nodsh"
10261 test_mkdir $DIR/$tdir
10262 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10263 skip_env "no early lock cancel on server"
10265 lru_resize_disable mdc
10266 lru_resize_disable osc
10267 cancel_lru_locks mdc
10268 # asynchronous object destroy at MDT could cause bl ast to client
10269 cancel_lru_locks osc
10271 stat $DIR/$tdir > /dev/null
10272 can1=$(do_facet $SINGLEMDS \
10273 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10274 awk '/ldlm_cancel/ {print $2}')
10275 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10276 awk '/ldlm_bl_callback/ {print $2}')
10277 test_mkdir -c1 $DIR/$tdir/d1
10278 can2=$(do_facet $SINGLEMDS \
10279 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10280 awk '/ldlm_cancel/ {print $2}')
10281 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10282 awk '/ldlm_bl_callback/ {print $2}')
10283 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10284 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10285 lru_resize_enable mdc
10286 lru_resize_enable osc
10288 run_test 120a "Early Lock Cancel: mkdir test"
10291 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10292 remote_mds_nodsh && skip "remote MDS with nodsh"
10293 test_mkdir $DIR/$tdir
10294 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10295 skip_env "no early lock cancel on server"
10297 lru_resize_disable mdc
10298 lru_resize_disable osc
10299 cancel_lru_locks mdc
10300 stat $DIR/$tdir > /dev/null
10301 can1=$(do_facet $SINGLEMDS \
10302 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10303 awk '/ldlm_cancel/ {print $2}')
10304 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10305 awk '/ldlm_bl_callback/ {print $2}')
10306 touch $DIR/$tdir/f1
10307 can2=$(do_facet $SINGLEMDS \
10308 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10309 awk '/ldlm_cancel/ {print $2}')
10310 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10311 awk '/ldlm_bl_callback/ {print $2}')
10312 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10313 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10314 lru_resize_enable mdc
10315 lru_resize_enable osc
10317 run_test 120b "Early Lock Cancel: create test"
10320 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10321 remote_mds_nodsh && skip "remote MDS with nodsh"
10322 test_mkdir -c1 $DIR/$tdir
10323 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10324 skip "no early lock cancel on server"
10326 lru_resize_disable mdc
10327 lru_resize_disable osc
10328 test_mkdir -c1 $DIR/$tdir/d1
10329 test_mkdir -c1 $DIR/$tdir/d2
10330 touch $DIR/$tdir/d1/f1
10331 cancel_lru_locks mdc
10332 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
10333 can1=$(do_facet $SINGLEMDS \
10334 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10335 awk '/ldlm_cancel/ {print $2}')
10336 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10337 awk '/ldlm_bl_callback/ {print $2}')
10338 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10339 can2=$(do_facet $SINGLEMDS \
10340 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10341 awk '/ldlm_cancel/ {print $2}')
10342 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10343 awk '/ldlm_bl_callback/ {print $2}')
10344 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10345 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10346 lru_resize_enable mdc
10347 lru_resize_enable osc
10349 run_test 120c "Early Lock Cancel: link test"
10352 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10353 remote_mds_nodsh && skip "remote MDS with nodsh"
10354 test_mkdir -c1 $DIR/$tdir
10355 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10356 skip_env "no early lock cancel on server"
10358 lru_resize_disable mdc
10359 lru_resize_disable osc
10361 cancel_lru_locks mdc
10362 stat $DIR/$tdir > /dev/null
10363 can1=$(do_facet $SINGLEMDS \
10364 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10365 awk '/ldlm_cancel/ {print $2}')
10366 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10367 awk '/ldlm_bl_callback/ {print $2}')
10368 chmod a+x $DIR/$tdir
10369 can2=$(do_facet $SINGLEMDS \
10370 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10371 awk '/ldlm_cancel/ {print $2}')
10372 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10373 awk '/ldlm_bl_callback/ {print $2}')
10374 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10375 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10376 lru_resize_enable mdc
10377 lru_resize_enable osc
10379 run_test 120d "Early Lock Cancel: setattr test"
10382 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10383 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10384 skip_env "no early lock cancel on server"
10385 remote_mds_nodsh && skip "remote MDS with nodsh"
10387 local dlmtrace_set=false
10389 test_mkdir -c1 $DIR/$tdir
10390 lru_resize_disable mdc
10391 lru_resize_disable osc
10392 ! $LCTL get_param debug | grep -q dlmtrace &&
10393 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
10394 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
10395 cancel_lru_locks mdc
10396 cancel_lru_locks osc
10397 dd if=$DIR/$tdir/f1 of=/dev/null
10398 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
10399 # XXX client can not do early lock cancel of OST lock
10400 # during unlink (LU-4206), so cancel osc lock now.
10402 cancel_lru_locks osc
10403 can1=$(do_facet $SINGLEMDS \
10404 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10405 awk '/ldlm_cancel/ {print $2}')
10406 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10407 awk '/ldlm_bl_callback/ {print $2}')
10408 unlink $DIR/$tdir/f1
10410 can2=$(do_facet $SINGLEMDS \
10411 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10412 awk '/ldlm_cancel/ {print $2}')
10413 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10414 awk '/ldlm_bl_callback/ {print $2}')
10415 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10416 $LCTL dk $TMP/cancel.debug.txt
10417 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10418 $LCTL dk $TMP/blocking.debug.txt
10419 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10420 lru_resize_enable mdc
10421 lru_resize_enable osc
10423 run_test 120e "Early Lock Cancel: unlink test"
10426 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10427 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10428 skip_env "no early lock cancel on server"
10429 remote_mds_nodsh && skip "remote MDS with nodsh"
10431 test_mkdir -c1 $DIR/$tdir
10432 lru_resize_disable mdc
10433 lru_resize_disable osc
10434 test_mkdir -c1 $DIR/$tdir/d1
10435 test_mkdir -c1 $DIR/$tdir/d2
10436 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10437 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10438 cancel_lru_locks mdc
10439 cancel_lru_locks osc
10440 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10441 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10442 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10443 # XXX client can not do early lock cancel of OST lock
10444 # during rename (LU-4206), so cancel osc lock now.
10446 cancel_lru_locks osc
10447 can1=$(do_facet $SINGLEMDS \
10448 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10449 awk '/ldlm_cancel/ {print $2}')
10450 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10451 awk '/ldlm_bl_callback/ {print $2}')
10452 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10454 can2=$(do_facet $SINGLEMDS \
10455 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10456 awk '/ldlm_cancel/ {print $2}')
10457 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10458 awk '/ldlm_bl_callback/ {print $2}')
10459 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10460 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10461 lru_resize_enable mdc
10462 lru_resize_enable osc
10464 run_test 120f "Early Lock Cancel: rename test"
10467 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10468 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10469 skip_env "no early lock cancel on server"
10470 remote_mds_nodsh && skip "remote MDS with nodsh"
10472 lru_resize_disable mdc
10473 lru_resize_disable osc
10475 echo create $count files
10476 test_mkdir $DIR/$tdir
10477 cancel_lru_locks mdc
10478 cancel_lru_locks osc
10481 can0=$(do_facet $SINGLEMDS \
10482 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10483 awk '/ldlm_cancel/ {print $2}')
10484 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10485 awk '/ldlm_bl_callback/ {print $2}')
10486 createmany -o $DIR/$tdir/f $count
10488 can1=$(do_facet $SINGLEMDS \
10489 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10490 awk '/ldlm_cancel/ {print $2}')
10491 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10492 awk '/ldlm_bl_callback/ {print $2}')
10494 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10495 echo rm $count files
10498 can2=$(do_facet $SINGLEMDS \
10499 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10500 awk '/ldlm_cancel/ {print $2}')
10501 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10502 awk '/ldlm_bl_callback/ {print $2}')
10504 echo total: $count removes in $((t2-t1))
10505 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10507 # wait for commitment of removal
10508 lru_resize_enable mdc
10509 lru_resize_enable osc
10511 run_test 120g "Early Lock Cancel: performance test"
10513 test_121() { #bug #10589
10514 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10517 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10518 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10519 lctl set_param fail_loc=0x310
10520 cancel_lru_locks osc > /dev/null
10521 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10522 lctl set_param fail_loc=0
10523 [[ $reads -eq $writes ]] ||
10524 error "read $reads blocks, must be $writes blocks"
10526 run_test 121 "read cancel race ========="
10528 test_123a() { # was test 123, statahead(bug 11401)
10529 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10532 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10533 log "testing UP system. Performance may be lower than expected."
10538 test_mkdir $DIR/$tdir
10539 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10540 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10542 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10543 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10545 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10546 lctl set_param -n llite.*.statahead_max 0
10547 lctl get_param llite.*.statahead_max
10548 cancel_lru_locks mdc
10549 cancel_lru_locks osc
10551 time ls -l $DIR/$tdir | wc -l
10553 delta=$((etime - stime))
10554 log "ls $i files without statahead: $delta sec"
10555 lctl set_param llite.*.statahead_max=$max
10557 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10558 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
10559 cancel_lru_locks mdc
10560 cancel_lru_locks osc
10562 time ls -l $DIR/$tdir | wc -l
10564 delta_sa=$((etime - stime))
10565 log "ls $i files with statahead: $delta_sa sec"
10566 lctl get_param -n llite.*.statahead_stats
10567 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10569 [[ $swrong -lt $ewrong ]] &&
10570 log "statahead was stopped, maybe too many locks held!"
10571 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
10573 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10574 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10575 lctl set_param -n llite.*.statahead_max 0
10576 lctl get_param llite.*.statahead_max
10577 cancel_lru_locks mdc
10578 cancel_lru_locks osc
10580 time ls -l $DIR/$tdir | wc -l
10582 delta=$((etime - stime))
10583 log "ls $i files again without statahead: $delta sec"
10584 lctl set_param llite.*.statahead_max=$max
10585 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10586 if [ $SLOWOK -eq 0 ]; then
10587 error "ls $i files is slower with statahead!"
10589 log "ls $i files is slower with statahead!"
10595 [ $delta -gt 20 ] && break
10596 [ $delta -gt 8 ] && MULT=$((50 / delta))
10597 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
10605 delta=$((etime - stime))
10606 log "rm -r $DIR/$tdir/: $delta seconds"
10608 lctl get_param -n llite.*.statahead_stats
10610 run_test 123a "verify statahead work"
10612 test_123b () { # statahead(bug 15027)
10613 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10615 test_mkdir $DIR/$tdir
10616 createmany -o $DIR/$tdir/$tfile-%d 1000
10618 cancel_lru_locks mdc
10619 cancel_lru_locks osc
10621 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
10622 lctl set_param fail_loc=0x80000803
10623 ls -lR $DIR/$tdir > /dev/null
10625 lctl set_param fail_loc=0x0
10626 lctl get_param -n llite.*.statahead_stats
10631 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
10634 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
10636 test_mkdir -i 0 -c 1 $DIR/$tdir.0
10637 test_mkdir -i 1 -c 1 $DIR/$tdir.1
10638 touch $DIR/$tdir.1/{1..3}
10639 mv $DIR/$tdir.1/{1..3} $DIR/$tdir.0
10641 remount_client $MOUNT
10643 $MULTIOP $DIR/$tdir.0 Q
10645 # let statahead to complete
10646 ls -l $DIR/$tdir.0 > /dev/null
10648 testid=$(echo $TESTNAME | tr '_' ' ')
10649 dmesg | tac | sed "/$testid/,$ d" | grep "Can not initialize inode" &&
10650 error "statahead warning" || true
10652 run_test 123c "Can not initialize inode warning on DNE statahead"
10655 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10656 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10657 skip_env "no lru resize on server"
10661 test_mkdir $DIR/$tdir
10663 log "create $NR files at $DIR/$tdir"
10664 createmany -o $DIR/$tdir/f $NR ||
10665 error "failed to create $NR files in $DIR/$tdir"
10667 cancel_lru_locks mdc
10668 ls -l $DIR/$tdir > /dev/null
10672 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
10673 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
10674 LRU_SIZE=$($LCTL get_param -n $PARAM)
10675 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
10676 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
10678 log "NS=$(basename $NSDIR)"
10683 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
10684 skip "Not enough cached locks created!"
10686 log "LRU=$LRU_SIZE"
10690 # We know that lru resize allows one client to hold $LIMIT locks
10691 # for 10h. After that locks begin to be killed by client.
10693 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
10695 if [ $LIMIT -lt $LRU_SIZE ]; then
10696 skip "Limit is too small $LIMIT"
10699 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
10700 # killing locks. Some time was spent for creating locks. This means
10701 # that up to the moment of sleep finish we must have killed some of
10702 # them (10-100 locks). This depends on how fast ther were created.
10703 # Many of them were touched in almost the same moment and thus will
10704 # be killed in groups.
10705 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
10707 # Use $LRU_SIZE_B here to take into account real number of locks
10708 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
10709 local LRU_SIZE_B=$LRU_SIZE
10711 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
10712 log "OLD_LVF=$OLD_LVF"
10713 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
10715 # Let's make sure that we really have some margin. Client checks
10716 # cached locks every 10 sec.
10717 SLEEP=$((SLEEP+20))
10718 log "Sleep ${SLEEP} sec"
10720 while ((SEC<$SLEEP)); do
10724 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
10725 echo -n "$LRU_SIZE"
10728 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
10729 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
10731 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
10732 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
10733 unlinkmany $DIR/$tdir/f $NR
10737 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
10738 log "unlink $NR files at $DIR/$tdir"
10739 unlinkmany $DIR/$tdir/f $NR
10741 run_test 124a "lru resize ======================================="
10743 get_max_pool_limit()
10745 local limit=$($LCTL get_param \
10746 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
10748 for l in $limit; do
10749 if [[ $l -gt $max ]]; then
10757 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10758 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10759 skip_env "no lru resize on server"
10761 LIMIT=$(get_max_pool_limit)
10763 NR=$(($(default_lru_size)*20))
10764 if [[ $NR -gt $LIMIT ]]; then
10765 log "Limit lock number by $LIMIT locks"
10769 IFree=$(mdsrate_inodes_available)
10770 if [ $IFree -lt $NR ]; then
10771 log "Limit lock number by $IFree inodes"
10775 lru_resize_disable mdc
10776 test_mkdir -p $DIR/$tdir/disable_lru_resize
10778 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
10779 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
10780 cancel_lru_locks mdc
10783 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10786 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10789 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10793 nolruresize_delta=$((etime-stime))
10794 log "ls -la time: $nolruresize_delta seconds"
10795 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10796 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
10798 lru_resize_enable mdc
10799 test_mkdir -p $DIR/$tdir/enable_lru_resize
10801 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
10802 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
10803 cancel_lru_locks mdc
10806 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10809 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10812 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10816 lruresize_delta=$((etime-stime))
10817 log "ls -la time: $lruresize_delta seconds"
10818 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10820 if [ $lruresize_delta -gt $nolruresize_delta ]; then
10821 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
10822 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
10823 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
10825 log "lru resize performs the same with no lru resize"
10827 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
10829 run_test 124b "lru resize (performance test) ======================="
10832 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10833 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10834 skip_env "no lru resize on server"
10836 # cache ununsed locks on client
10838 cancel_lru_locks mdc
10839 test_mkdir $DIR/$tdir
10840 createmany -o $DIR/$tdir/f $nr ||
10841 error "failed to create $nr files in $DIR/$tdir"
10842 ls -l $DIR/$tdir > /dev/null
10844 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10845 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10846 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10847 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10848 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10850 # set lru_max_age to 1 sec
10851 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10852 echo "sleep $((recalc_p * 2)) seconds..."
10853 sleep $((recalc_p * 2))
10855 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10856 # restore lru_max_age
10857 $LCTL set_param -n $nsdir.lru_max_age $max_age
10858 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10859 unlinkmany $DIR/$tdir/f $nr
10861 run_test 124c "LRUR cancel very aged locks"
10864 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10865 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10866 skip_env "no lru resize on server"
10868 # cache ununsed locks on client
10871 lru_resize_disable mdc
10872 stack_trap "lru_resize_enable mdc" EXIT
10874 cancel_lru_locks mdc
10876 # asynchronous object destroy at MDT could cause bl ast to client
10877 test_mkdir $DIR/$tdir
10878 createmany -o $DIR/$tdir/f $nr ||
10879 error "failed to create $nr files in $DIR/$tdir"
10880 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
10882 ls -l $DIR/$tdir > /dev/null
10884 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10885 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10886 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10887 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10889 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10891 # set lru_max_age to 1 sec
10892 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10893 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
10895 echo "sleep $((recalc_p * 2)) seconds..."
10896 sleep $((recalc_p * 2))
10898 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10900 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10902 run_test 124d "cancel very aged locks if lru-resize diasbaled"
10904 test_125() { # 13358
10905 $LCTL get_param -n llite.*.client_type | grep -q local ||
10906 skip "must run as local client"
10907 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
10908 skip_env "must have acl enabled"
10909 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
10911 test_mkdir $DIR/$tdir
10912 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
10913 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
10914 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
10916 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
10918 test_126() { # bug 12829/13455
10919 $GSS && skip_env "must run as gss disabled"
10920 $LCTL get_param -n llite.*.client_type | grep -q local ||
10921 skip "must run as local client"
10922 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
10924 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
10925 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
10927 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
10929 run_test 126 "check that the fsgid provided by the client is taken into account"
10931 test_127a() { # bug 15521
10932 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10934 $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
10935 $LCTL set_param osc.*.stats=0
10936 FSIZE=$((2048 * 1024))
10937 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
10938 cancel_lru_locks osc
10939 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
10941 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
10942 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
10943 echo "got $COUNT $NAME"
10944 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
10945 eval $NAME=$COUNT || error "Wrong proc format"
10948 read_bytes|write_bytes)
10949 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
10950 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
10951 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
10952 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
10953 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
10954 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
10955 error "sumsquare is too small: $SUMSQ"
10956 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
10957 error "sumsquare is too big: $SUMSQ"
10961 done < $DIR/${tfile}.tmp
10963 #check that we actually got some stats
10964 [ "$read_bytes" ] || error "Missing read_bytes stats"
10965 [ "$write_bytes" ] || error "Missing write_bytes stats"
10966 [ "$read_bytes" != 0 ] || error "no read done"
10967 [ "$write_bytes" != 0 ] || error "no write done"
10969 run_test 127a "verify the client stats are sane"
10971 test_127b() { # bug LU-333
10972 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10973 local name count samp unit min max sum sumsq
10975 $LCTL set_param llite.*.stats=0
10977 # perform 2 reads and writes so MAX is different from SUM.
10978 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10979 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10980 cancel_lru_locks osc
10981 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10982 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10984 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
10985 while read name count samp unit min max sum sumsq; do
10986 echo "got $count $name"
10987 eval $name=$count || error "Wrong proc format"
10991 [ $count -ne 2 ] && error "count is not 2: $count"
10992 [ $min -ne $PAGE_SIZE ] &&
10993 error "min is not $PAGE_SIZE: $min"
10994 [ $max -ne $PAGE_SIZE ] &&
10995 error "max is incorrect: $max"
10996 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10997 error "sum is wrong: $sum"
11000 [ $count -ne 2 ] && error "count is not 2: $count"
11001 [ $min -ne $PAGE_SIZE ] &&
11002 error "min is not $PAGE_SIZE: $min"
11003 [ $max -ne $PAGE_SIZE ] &&
11004 error "max is incorrect: $max"
11005 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
11006 error "sum is wrong: $sum"
11010 done < $TMP/$tfile.tmp
11012 #check that we actually got some stats
11013 [ "$read_bytes" ] || error "Missing read_bytes stats"
11014 [ "$write_bytes" ] || error "Missing write_bytes stats"
11015 [ "$read_bytes" != 0 ] || error "no read done"
11016 [ "$write_bytes" != 0 ] || error "no write done"
11018 rm -f $TMP/${tfile}.tmp
11020 run_test 127b "verify the llite client stats are sane"
11022 test_127c() { # LU-12394
11023 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11030 $LCTL set_param llite.*.extents_stats=1
11031 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
11033 # Use two stripes so there is enough space in default config
11034 $LFS setstripe -c 2 $DIR/$tfile
11036 # Extent stats start at 0-4K and go in power of two buckets
11037 # LL_HIST_START = 12 --> 2^12 = 4K
11038 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
11039 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
11041 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
11043 # Write and read, 2x each, second time at a non-zero offset
11044 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
11045 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
11046 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
11047 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
11051 $LCTL get_param llite.*.extents_stats
11054 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
11056 local bucket=$($LCTL get_param -n llite.*.extents_stats |
11058 reads=$(echo $bucket | awk '{print $5}')
11059 writes=$(echo $bucket | awk '{print $9}')
11060 [ "$reads" -eq $count ] ||
11061 error "$reads reads in < $bsize bucket, expect $count"
11062 [ "$writes" -eq $count ] ||
11063 error "$writes writes in < $bsize bucket, expect $count"
11066 # Test mmap write and read
11067 $LCTL set_param llite.*.extents_stats=c
11069 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
11070 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
11071 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
11073 $LCTL get_param llite.*.extents_stats
11075 count=$(((size*1024) / PAGE_SIZE))
11077 bsize=$((2 * PAGE_SIZE / 1024))K
11079 bucket=$($LCTL get_param -n llite.*.extents_stats |
11081 reads=$(echo $bucket | awk '{print $5}')
11082 writes=$(echo $bucket | awk '{print $9}')
11083 # mmap writes fault in the page first, creating an additonal read
11084 [ "$reads" -eq $((2 * count)) ] ||
11085 error "$reads reads in < $bsize bucket, expect $count"
11086 [ "$writes" -eq $count ] ||
11087 error "$writes writes in < $bsize bucket, expect $count"
11089 run_test 127c "test llite extent stats with regular & mmap i/o"
11091 test_128() { # bug 15212
11093 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
11098 result=$(grep error $TMP/$tfile.log)
11099 rm -f $DIR/$tfile $TMP/$tfile.log
11100 [ -z "$result" ] ||
11101 error "consecutive find's under interactive lfs failed"
11103 run_test 128 "interactive lfs for 2 consecutive find's"
11105 set_dir_limits () {
11110 local ldproc=/proc/fs/ldiskfs
11111 local facets=$(get_facets MDS)
11113 for facet in ${facets//,/ }; do
11114 canondev=$(ldiskfs_canon \
11115 *.$(convert_facet2label $facet).mntdev $facet)
11116 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
11117 ldproc=/sys/fs/ldiskfs
11118 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
11119 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
11123 check_mds_dmesg() {
11124 local facets=$(get_facets MDS)
11125 for facet in ${facets//,/ }; do
11126 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
11132 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11133 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
11134 skip "Need MDS version with at least 2.5.56"
11135 if [ "$mds1_FSTYPE" != ldiskfs ]; then
11136 skip_env "ldiskfs only test"
11138 remote_mds_nodsh && skip "remote MDS with nodsh"
11142 local has_warning=false
11145 mkdir -p $DIR/$tdir
11147 # block size of mds1
11148 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
11149 set_dir_limits $maxsize $maxsize
11150 local dirsize=$(stat -c%s "$DIR/$tdir")
11152 while [[ $dirsize -le $maxsize ]]; do
11153 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
11155 if ! $has_warning; then
11156 check_mds_dmesg '"is approaching"' && has_warning=true
11158 # check two errors:
11159 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
11160 # EFBIG for previous versions included in ldiskfs series
11161 if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
11163 echo "return code $rc received as expected"
11165 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
11166 error_exit "create failed w/o dir size limit"
11168 check_mds_dmesg '"has reached"' ||
11169 error_exit "reached message should be output"
11171 [ $has_warning = "false" ] &&
11172 error_exit "warning message should be output"
11174 dirsize=$(stat -c%s "$DIR/$tdir")
11176 [[ $dirsize -ge $maxsize ]] && return 0
11177 error_exit "current dir size $dirsize, " \
11178 "previous limit $maxsize"
11179 elif [ $rc -ne 0 ]; then
11181 error_exit "return $rc received instead of expected " \
11182 "$EFBIG or $ENOSPC, files in dir $dirsize"
11184 nfiles=$((nfiles + 1))
11185 dirsize=$(stat -c%s "$DIR/$tdir")
11189 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
11191 run_test 129 "test directory size limit ========================"
11200 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11201 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11203 trap cleanup_130 EXIT RETURN
11205 local fm_file=$DIR/$tfile
11206 $SETSTRIPE -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
11207 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
11208 error "dd failed for $fm_file"
11210 # LU-1795: test filefrag/FIEMAP once, even if unsupported
11211 filefrag -ves $fm_file
11213 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11214 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11215 [ $RC != 0 ] && error "filefrag $fm_file failed"
11217 filefrag_op=$(filefrag -ve -k $fm_file |
11218 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11219 lun=$($GETSTRIPE -i $fm_file)
11221 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
11224 for line in $filefrag_op
11226 frag_lun=`echo $line | cut -d: -f5`
11227 ext_len=`echo $line | cut -d: -f4`
11228 if (( $frag_lun != $lun )); then
11230 error "FIEMAP on 1-stripe file($fm_file) failed"
11233 (( tot_len += ext_len ))
11236 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
11238 error "FIEMAP on 1-stripe file($fm_file) failed;"
11244 echo "FIEMAP on single striped file succeeded"
11246 run_test 130a "FIEMAP (1-stripe file)"
11249 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11251 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11252 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11254 trap cleanup_130 EXIT RETURN
11256 local fm_file=$DIR/$tfile
11257 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11258 error "setstripe on $fm_file"
11259 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11260 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11262 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
11263 error "dd failed on $fm_file"
11265 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11266 filefrag_op=$(filefrag -ve -k $fm_file |
11267 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11269 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11270 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11275 for line in $filefrag_op
11277 frag_lun=$(echo $line | cut -d: -f5 |
11278 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11279 ext_len=$(echo $line | cut -d: -f4)
11280 if (( $frag_lun != $last_lun )); then
11281 if (( tot_len != 1024 )); then
11283 error "FIEMAP on $fm_file failed; returned " \
11284 "len $tot_len for OST $last_lun instead of 1024"
11287 (( num_luns += 1 ))
11291 (( tot_len += ext_len ))
11294 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
11296 error "FIEMAP on $fm_file failed; returned wrong number of " \
11297 "luns or wrong len for OST $last_lun"
11303 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
11305 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
11308 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11310 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11311 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11313 trap cleanup_130 EXIT RETURN
11315 local fm_file=$DIR/$tfile
11316 $SETSTRIPE -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
11317 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11318 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11320 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
11321 error "dd failed on $fm_file"
11323 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11324 filefrag_op=$(filefrag -ve -k $fm_file |
11325 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11327 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11328 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11333 for line in $filefrag_op
11335 frag_lun=$(echo $line | cut -d: -f5 |
11336 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11337 ext_len=$(echo $line | cut -d: -f4)
11338 if (( $frag_lun != $last_lun )); then
11339 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
11340 if (( logical != 512 )); then
11342 error "FIEMAP on $fm_file failed; returned " \
11343 "logical start for lun $logical instead of 512"
11346 if (( tot_len != 512 )); then
11348 error "FIEMAP on $fm_file failed; returned " \
11349 "len $tot_len for OST $last_lun instead of 1024"
11352 (( num_luns += 1 ))
11356 (( tot_len += ext_len ))
11359 if (( num_luns != 2 || tot_len != 512 )); then
11361 error "FIEMAP on $fm_file failed; returned wrong number of " \
11362 "luns or wrong len for OST $last_lun"
11368 echo "FIEMAP on 2-stripe file with hole succeeded"
11370 run_test 130c "FIEMAP (2-stripe file with hole)"
11373 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
11375 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11376 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11378 trap cleanup_130 EXIT RETURN
11380 local fm_file=$DIR/$tfile
11381 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11382 error "setstripe on $fm_file"
11383 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11384 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11386 local actual_stripe_count=$($GETSTRIPE -c $fm_file)
11387 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
11388 error "dd failed on $fm_file"
11390 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11391 filefrag_op=$(filefrag -ve -k $fm_file |
11392 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11394 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11395 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11400 for line in $filefrag_op
11402 frag_lun=$(echo $line | cut -d: -f5 |
11403 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11404 ext_len=$(echo $line | cut -d: -f4)
11405 if (( $frag_lun != $last_lun )); then
11406 if (( tot_len != 1024 )); then
11408 error "FIEMAP on $fm_file failed; returned " \
11409 "len $tot_len for OST $last_lun instead of 1024"
11412 (( num_luns += 1 ))
11416 (( tot_len += ext_len ))
11419 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
11421 error "FIEMAP on $fm_file failed; returned wrong number of " \
11422 "luns or wrong len for OST $last_lun"
11428 echo "FIEMAP on N-stripe file succeeded"
11430 run_test 130d "FIEMAP (N-stripe file)"
11433 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11435 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11436 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11438 trap cleanup_130 EXIT RETURN
11440 local fm_file=$DIR/$tfile
11441 $SETSTRIPE -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11442 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11443 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11446 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11447 for ((i = 0; i < $NUM_BLKS; i++))
11449 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11452 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11453 filefrag_op=$(filefrag -ve -k $fm_file |
11454 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11456 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11457 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11462 for line in $filefrag_op
11464 frag_lun=$(echo $line | cut -d: -f5 |
11465 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11466 ext_len=$(echo $line | cut -d: -f4)
11467 if (( $frag_lun != $last_lun )); then
11468 if (( tot_len != $EXPECTED_LEN )); then
11470 error "FIEMAP on $fm_file failed; returned " \
11471 "len $tot_len for OST $last_lun instead " \
11475 (( num_luns += 1 ))
11479 (( tot_len += ext_len ))
11482 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11484 error "FIEMAP on $fm_file failed; returned wrong number " \
11485 "of luns or wrong len for OST $last_lun"
11491 echo "FIEMAP with continuation calls succeeded"
11493 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11496 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11497 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11499 local fm_file=$DIR/$tfile
11500 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11501 error "multiop create with lov_delay_create on $fm_file"
11503 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11504 filefrag_extents=$(filefrag -vek $fm_file |
11505 awk '/extents? found/ { print $2 }')
11506 if [[ "$filefrag_extents" != "0" ]]; then
11507 error "FIEMAP on $fm_file failed; " \
11508 "returned $filefrag_extents expected 0"
11513 run_test 130f "FIEMAP (unstriped file)"
11515 # Test for writev/readv
11517 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11518 error "writev test failed"
11519 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11520 error "readv failed"
11523 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11526 local fsize=$((524288 + 1048576 + 1572864))
11527 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11528 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11529 error "append writev test failed"
11531 ((fsize += 1572864 + 1048576))
11532 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11533 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11534 error "append writev test failed"
11537 run_test 131b "test append writev"
11540 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11543 run_test 131c "test read/write on file w/o objects"
11546 rwv -f $DIR/$tfile -w -n 1 1572864
11547 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11548 if [ "$NOB" != 1572864 ]; then
11549 error "Short read filed: read $NOB bytes instead of 1572864"
11553 run_test 131d "test short read"
11556 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11557 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11558 error "read hitting hole failed"
11561 run_test 131e "test read hitting hole"
11570 mds*) res=$(do_facet $facet \
11571 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11573 ost*) res=$(do_facet $facet \
11574 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
11576 *) error "Wrong facet '$facet'" ;;
11578 [ "$res" ] || error "The counter for $op on $facet was not incremented"
11579 # if the argument $3 is zero, it means any stat increment is ok.
11580 if [[ $want -gt 0 ]]; then
11581 local count=$(echo $res | awk '{ print $2 }')
11582 [[ $count -ne $want ]] &&
11583 error "The $op counter on $facet is $count, not $want"
11588 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11589 remote_ost_nodsh && skip "remote OST with nodsh"
11590 remote_mds_nodsh && skip "remote MDS with nodsh"
11591 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11592 skip_env "MDS doesn't support rename stats"
11594 local testdir=$DIR/${tdir}/stats_testdir
11596 mkdir -p $DIR/${tdir}
11599 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11600 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11602 # verify mdt stats first.
11603 mkdir ${testdir} || error "mkdir failed"
11604 check_stats $SINGLEMDS "mkdir" 1
11605 touch ${testdir}/${tfile} || error "touch failed"
11606 check_stats $SINGLEMDS "open" 1
11607 check_stats $SINGLEMDS "close" 1
11608 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
11609 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
11610 check_stats $SINGLEMDS "mknod" 2
11612 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
11613 check_stats $SINGLEMDS "unlink" 1
11614 rm -f ${testdir}/${tfile} || error "file remove failed"
11615 check_stats $SINGLEMDS "unlink" 2
11617 # remove working dir and check mdt stats again.
11618 rmdir ${testdir} || error "rmdir failed"
11619 check_stats $SINGLEMDS "rmdir" 1
11621 local testdir1=$DIR/${tdir}/stats_testdir1
11622 mkdir -p ${testdir}
11623 mkdir -p ${testdir1}
11624 touch ${testdir1}/test1
11625 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
11626 check_stats $SINGLEMDS "crossdir_rename" 1
11628 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
11629 check_stats $SINGLEMDS "samedir_rename" 1
11631 rm -rf $DIR/${tdir}
11633 run_test 133a "Verifying MDT stats ========================================"
11638 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11639 remote_ost_nodsh && skip "remote OST with nodsh"
11640 remote_mds_nodsh && skip "remote MDS with nodsh"
11642 local testdir=$DIR/${tdir}/stats_testdir
11644 mkdir -p ${testdir} || error "mkdir failed"
11645 touch ${testdir}/${tfile} || error "touch failed"
11646 cancel_lru_locks mdc
11649 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11650 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11652 # extra mdt stats verification.
11653 chmod 444 ${testdir}/${tfile} || error "chmod failed"
11654 check_stats $SINGLEMDS "setattr" 1
11655 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11656 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
11658 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
11659 check_stats $SINGLEMDS "getattr" 1
11661 rm -rf $DIR/${tdir}
11663 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
11664 # so the check below is not reliable
11665 [ $MDSCOUNT -eq 1 ] || return 0
11667 # Sleep to avoid a cached response.
11668 #define OBD_STATFS_CACHE_SECONDS 1
11670 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11671 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11672 $LFS df || error "lfs failed"
11673 check_stats $SINGLEMDS "statfs" 1
11675 # check aggregated statfs (LU-10018)
11676 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
11678 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
11681 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11682 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11684 check_stats $SINGLEMDS "statfs" 1
11686 # We want to check that the client didn't send OST_STATFS to
11687 # ost1 but the MDT also uses OST_STATFS for precreate. So some
11688 # extra care is needed here.
11689 if remote_mds; then
11690 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
11691 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
11693 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
11694 [ "$res" ] && error "OST got STATFS"
11699 run_test 133b "Verifying extra MDT stats =================================="
11702 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11703 remote_ost_nodsh && skip "remote OST with nodsh"
11704 remote_mds_nodsh && skip "remote MDS with nodsh"
11706 local testdir=$DIR/$tdir/stats_testdir
11708 test_mkdir -p $testdir
11710 # verify obdfilter stats.
11711 $SETSTRIPE -c 1 -i 0 $testdir/$tfile
11713 cancel_lru_locks osc
11714 wait_delete_completed
11717 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11718 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11720 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
11723 cancel_lru_locks osc
11724 check_stats ost1 "write" 1
11726 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
11727 check_stats ost1 "read" 1
11729 > $testdir/$tfile || error "truncate failed"
11730 check_stats ost1 "punch" 1
11732 rm -f $testdir/$tfile || error "file remove failed"
11733 wait_delete_completed
11734 check_stats ost1 "destroy" 1
11738 run_test 133c "Verifying OST stats ========================================"
11745 while [ $value -ge 2 ]; do
11750 if [ $orig -gt $order ]; then
11758 local size=('K' 'M' 'G' 'T');
11760 local size_string=$value
11762 while [ $value -ge 1024 ]; do
11763 if [ $i -gt 3 ]; then
11764 #T is the biggest unit we get here, if that is bigger,
11766 size_string=${value}T
11769 value=$((value >> 10))
11770 if [ $value -lt 1024 ]; then
11771 size_string=${value}${size[$i]}
11780 get_rename_size() {
11782 local context=${2:-.}
11783 local sample=$(do_facet $SINGLEMDS $LCTL \
11784 get_param mdt.$FSNAME-MDT0000.rename_stats |
11785 grep -A1 $context |
11786 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
11791 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11792 remote_ost_nodsh && skip "remote OST with nodsh"
11793 remote_mds_nodsh && skip "remote MDS with nodsh"
11794 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11795 skip_env "MDS doesn't support rename stats"
11797 local testdir1=$DIR/${tdir}/stats_testdir1
11798 local testdir2=$DIR/${tdir}/stats_testdir2
11799 mkdir -p $DIR/${tdir}
11801 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11803 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
11804 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
11806 createmany -o $testdir1/test 512 || error "createmany failed"
11808 # check samedir rename size
11809 mv ${testdir1}/test0 ${testdir1}/test_0
11811 local testdir1_size=$(ls -l $DIR/${tdir} |
11812 awk '/stats_testdir1/ {print $5}')
11813 local testdir2_size=$(ls -l $DIR/${tdir} |
11814 awk '/stats_testdir2/ {print $5}')
11816 testdir1_size=$(order_2 $testdir1_size)
11817 testdir2_size=$(order_2 $testdir2_size)
11819 testdir1_size=$(size_in_KMGT $testdir1_size)
11820 testdir2_size=$(size_in_KMGT $testdir2_size)
11822 echo "source rename dir size: ${testdir1_size}"
11823 echo "target rename dir size: ${testdir2_size}"
11825 local cmd="do_facet $SINGLEMDS $LCTL "
11826 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
11828 eval $cmd || error "$cmd failed"
11829 local samedir=$($cmd | grep 'same_dir')
11830 local same_sample=$(get_rename_size $testdir1_size)
11831 [ -z "$samedir" ] && error "samedir_rename_size count error"
11832 [[ $same_sample -eq 1 ]] ||
11833 error "samedir_rename_size error $same_sample"
11834 echo "Check same dir rename stats success"
11836 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11838 # check crossdir rename size
11839 mv ${testdir1}/test_0 ${testdir2}/test_0
11841 testdir1_size=$(ls -l $DIR/${tdir} |
11842 awk '/stats_testdir1/ {print $5}')
11843 testdir2_size=$(ls -l $DIR/${tdir} |
11844 awk '/stats_testdir2/ {print $5}')
11846 testdir1_size=$(order_2 $testdir1_size)
11847 testdir2_size=$(order_2 $testdir2_size)
11849 testdir1_size=$(size_in_KMGT $testdir1_size)
11850 testdir2_size=$(size_in_KMGT $testdir2_size)
11852 echo "source rename dir size: ${testdir1_size}"
11853 echo "target rename dir size: ${testdir2_size}"
11855 eval $cmd || error "$cmd failed"
11856 local crossdir=$($cmd | grep 'crossdir')
11857 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
11858 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
11859 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
11860 [[ $src_sample -eq 1 ]] ||
11861 error "crossdir_rename_size error $src_sample"
11862 [[ $tgt_sample -eq 1 ]] ||
11863 error "crossdir_rename_size error $tgt_sample"
11864 echo "Check cross dir rename stats success"
11865 rm -rf $DIR/${tdir}
11867 run_test 133d "Verifying rename_stats ========================================"
11870 remote_mds_nodsh && skip "remote MDS with nodsh"
11871 remote_ost_nodsh && skip "remote OST with nodsh"
11872 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11874 local testdir=$DIR/${tdir}/stats_testdir
11875 local ctr f0 f1 bs=32768 count=42 sum
11877 mkdir -p ${testdir} || error "mkdir failed"
11879 $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
11881 for ctr in {write,read}_bytes; do
11883 cancel_lru_locks osc
11885 do_facet ost1 $LCTL set_param -n \
11886 "obdfilter.*.exports.clear=clear"
11888 if [ $ctr = write_bytes ]; then
11890 f1=${testdir}/${tfile}
11892 f0=${testdir}/${tfile}
11896 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
11899 cancel_lru_locks osc
11901 sum=$(do_facet ost1 $LCTL get_param \
11902 "obdfilter.*.exports.*.stats" |
11903 awk -v ctr=$ctr 'BEGIN { sum = 0 }
11904 $1 == ctr { sum += $7 }
11905 END { printf("%0.0f", sum) }')
11907 if ((sum != bs * count)); then
11908 error "Bad $ctr sum, expected $((bs * count)), got $sum"
11912 rm -rf $DIR/${tdir}
11914 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
11916 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
11918 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
11919 # not honor the -ignore_readdir_race option correctly. So we call
11920 # error_ignore() rather than error() in these cases. See LU-11152.
11922 if (find --version; do_facet mds1 find --version) |
11923 grep -q '\b4\.5\.1[1-4]\b'; then
11924 error_ignore LU-11152 "$@"
11931 # First without trusting modes.
11932 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
11933 echo "proc_dirs='$proc_dirs'"
11934 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
11935 find $proc_dirs -exec cat '{}' \; &> /dev/null
11937 # Second verifying readability.
11938 $LCTL get_param -R '*' &> /dev/null
11940 # Verifing writability with badarea_io.
11942 -ignore_readdir_race \
11944 -not -name force_lbug \
11945 -not -name changelog_mask \
11946 -exec badarea_io '{}' \; ||
11947 error_133 "find $proc_dirs failed"
11949 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
11952 remote_mds_nodsh && skip "remote MDS with nodsh"
11953 remote_ost_nodsh && skip "remote OST with nodsh"
11955 # eventually, this can also be replaced with "lctl get_param -R",
11956 # but not until that option is always available on the server
11958 for facet in mds1 ost1; do
11959 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
11960 skip_noexit "Too old lustre on $facet"
11961 local facet_proc_dirs=$(do_facet $facet \
11962 \\\ls -d $proc_regexp 2>/dev/null)
11963 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11964 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11965 do_facet $facet find $facet_proc_dirs \
11966 ! -name req_history \
11967 -exec cat '{}' \\\; &> /dev/null
11969 do_facet $facet find $facet_proc_dirs \
11970 ! -name req_history \
11972 -exec cat '{}' \\\; &> /dev/null ||
11973 error "proc file read failed"
11975 do_facet $facet find $facet_proc_dirs \
11976 -ignore_readdir_race \
11978 -not -name force_lbug \
11979 -not -name changelog_mask \
11980 -exec badarea_io '{}' \\\; ||
11981 error_133 "$facet find $facet_proc_dirs failed"
11984 # remount the FS in case writes/reads /proc break the FS
11985 cleanup || error "failed to unmount"
11986 setup || error "failed to setup"
11989 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
11992 remote_mds_nodsh && skip "remote MDS with nodsh"
11993 remote_ost_nodsh && skip "remote OST with nodsh"
11994 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
11995 skip "Need MDS version at least 2.9.54"
11999 for facet in client mds1 ost1; do
12000 local facet_proc_dirs=$(do_facet $facet \
12001 \\\ls -d $proc_regexp 2> /dev/null)
12002 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
12003 echo "${facet}_proc_dirs='$facet_proc_dirs'"
12004 # Get the list of files that are missing the terminating newline
12005 local missing=($(do_facet $facet \
12006 find ${facet_proc_dirs} -type f \| \
12007 while read F\; do \
12008 awk -v FS='\v' -v RS='\v\v' \
12009 "'END { if(NR>0 && \
12010 \\\$NF !~ /.*\\\n\$/) \
12011 print FILENAME}'" \
12014 [ ${#missing[*]} -eq 0 ] ||
12015 error "files do not end with newline: ${missing[*]}"
12018 run_test 133h "Proc files should end with newlines"
12021 remote_mds_nodsh && skip "remote MDS with nodsh"
12022 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
12023 skip "Need MDS version at least 2.7.54"
12025 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12026 cancel_lru_locks mdc
12028 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
12029 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
12030 [ $unused -eq 0 ] || error "$unused locks are not cleared"
12033 createmany -o $DIR/$tdir/f $nr ||
12034 error "failed to create $nr files in $DIR/$tdir"
12035 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
12037 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
12038 do_facet mds1 $LCTL set_param fail_loc=0x327
12039 do_facet mds1 $LCTL set_param fail_val=500
12042 echo "sleep 10 seconds ..."
12044 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
12046 do_facet mds1 $LCTL set_param fail_loc=0
12047 do_facet mds1 $LCTL set_param fail_val=0
12048 [ $lck_cnt -lt $unused ] ||
12049 error "No locks reclaimed, before:$unused, after:$lck_cnt"
12052 unlinkmany $DIR/$tdir/f $nr
12054 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
12057 remote_mds_nodsh && skip "remote MDS with nodsh"
12058 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
12059 skip "Need MDS version at least 2.7.54"
12061 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12062 cancel_lru_locks mdc
12064 local low_wm=$(do_facet mds1 $LCTL get_param -n \
12065 ldlm.lock_reclaim_threshold_mb)
12066 # disable reclaim temporarily
12067 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
12069 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
12070 do_facet mds1 $LCTL set_param fail_loc=0x328
12071 do_facet mds1 $LCTL set_param fail_val=500
12073 $LCTL set_param debug=+trace
12076 createmany -o $DIR/$tdir/f $nr &
12077 local create_pid=$!
12079 echo "Sleep $TIMEOUT seconds ..."
12081 if ! ps -p $create_pid > /dev/null 2>&1; then
12082 do_facet mds1 $LCTL set_param fail_loc=0
12083 do_facet mds1 $LCTL set_param fail_val=0
12084 do_facet mds1 $LCTL set_param \
12085 ldlm.lock_reclaim_threshold_mb=${low_wm}m
12086 error "createmany finished incorrectly!"
12088 do_facet mds1 $LCTL set_param fail_loc=0
12089 do_facet mds1 $LCTL set_param fail_val=0
12090 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
12091 wait $create_pid || return 1
12093 unlinkmany $DIR/$tdir/f $nr
12095 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
12097 test_140() { #bug-17379
12098 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12100 test_mkdir $DIR/$tdir
12101 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
12102 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
12104 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
12105 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
12107 while i=$((i + 1)); do
12109 cd $i || error "Changing to $i"
12110 ln -s ../stat stat || error "Creating stat symlink"
12111 # Read the symlink until ELOOP present,
12112 # not LBUGing the system is considered success,
12113 # we didn't overrun the stack.
12114 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
12115 if [ $ret -ne 0 ]; then
12116 if [ $ret -eq 40 ]; then
12119 error "Open stat symlink"
12125 echo "The symlink depth = $i"
12126 [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] ||
12127 error "Invalid symlink depth"
12129 # Test recursive symlink
12130 ln -s symlink_self symlink_self
12131 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
12132 echo "open symlink_self returns $ret"
12133 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
12135 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
12138 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12140 local TF="$TMP/$tfile"
12142 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12144 cancel_lru_locks $OSC
12145 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
12146 remount_client $MOUNT
12148 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
12151 $TRUNCATE $DIR/$tfile 6000
12152 cancel_lru_locks $OSC
12153 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
12156 echo "12345" >>$DIR/$tfile
12157 cancel_lru_locks $OSC
12158 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
12161 echo "12345" >>$DIR/$tfile
12162 cancel_lru_locks $OSC
12163 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
12168 run_test 150 "truncate/append tests"
12170 #LU-2902 roc_hit was not able to read all values from lproc
12171 function roc_hit_init() {
12172 local list=$(comma_list $(osts_nodes))
12173 local dir=$DIR/$tdir-check
12174 local file=$dir/$tfile
12180 #use setstripe to do a write to every ost
12181 for i in $(seq 0 $((OSTCOUNT-1))); do
12182 $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
12183 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
12184 idx=$(printf %04x $i)
12185 BEFORE=$(get_osd_param $list *OST*$idx stats |
12186 awk '$1 == "cache_access" {sum += $7}
12187 END { printf("%0.0f", sum) }')
12189 cancel_lru_locks osc
12190 cat $file >/dev/null
12192 AFTER=$(get_osd_param $list *OST*$idx stats |
12193 awk '$1 == "cache_access" {sum += $7}
12194 END { printf("%0.0f", sum) }')
12196 echo BEFORE:$BEFORE AFTER:$AFTER
12197 if ! let "AFTER - BEFORE == 4"; then
12199 error "roc_hit is not safe to use"
12207 function roc_hit() {
12208 local list=$(comma_list $(osts_nodes))
12209 echo $(get_osd_param $list '' stats |
12210 awk '$1 == "cache_hit" {sum += $7}
12211 END { printf("%0.0f", sum) }')
12214 function set_cache() {
12217 if [ "$2" == "off" ]; then
12220 local list=$(comma_list $(osts_nodes))
12221 set_osd_param $list '' $1_cache_enable $on
12223 cancel_lru_locks osc
12227 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12228 remote_ost_nodsh && skip "remote OST with nodsh"
12231 local list=$(comma_list $(osts_nodes))
12233 # check whether obdfilter is cache capable at all
12234 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
12235 skip "not cache-capable obdfilter"
12238 # check cache is enabled on all obdfilters
12239 if get_osd_param $list '' read_cache_enable | grep 0; then
12240 skip "oss cache is disabled"
12243 set_osd_param $list '' writethrough_cache_enable 1
12245 # check write cache is enabled on all obdfilters
12246 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
12247 skip "oss write cache is NOT enabled"
12252 #define OBD_FAIL_OBD_NO_LRU 0x609
12253 do_nodes $list $LCTL set_param fail_loc=0x609
12255 # pages should be in the case right after write
12256 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
12259 local BEFORE=$(roc_hit)
12260 cancel_lru_locks osc
12261 cat $DIR/$tfile >/dev/null
12262 local AFTER=$(roc_hit)
12264 do_nodes $list $LCTL set_param fail_loc=0
12266 if ! let "AFTER - BEFORE == CPAGES"; then
12267 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12270 # the following read invalidates the cache
12271 cancel_lru_locks osc
12272 set_osd_param $list '' read_cache_enable 0
12273 cat $DIR/$tfile >/dev/null
12275 # now data shouldn't be found in the cache
12277 cancel_lru_locks osc
12278 cat $DIR/$tfile >/dev/null
12280 if let "AFTER - BEFORE != 0"; then
12281 error "IN CACHE: before: $BEFORE, after: $AFTER"
12284 set_osd_param $list '' read_cache_enable 1
12287 run_test 151 "test cache on oss and controls ==============================="
12290 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12292 local TF="$TMP/$tfile"
12294 # simulate ENOMEM during write
12295 #define OBD_FAIL_OST_NOMEM 0x226
12296 lctl set_param fail_loc=0x80000226
12297 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12299 sync || error "sync failed"
12300 lctl set_param fail_loc=0
12302 # discard client's cache
12303 cancel_lru_locks osc
12305 # simulate ENOMEM during read
12306 lctl set_param fail_loc=0x80000226
12307 cmp $TF $DIR/$tfile || error "cmp failed"
12308 lctl set_param fail_loc=0
12312 run_test 152 "test read/write with enomem ============================"
12315 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
12317 run_test 153 "test if fdatasync does not crash ======================="
12319 dot_lustre_fid_permission_check() {
12321 local ffid=$MOUNT/.lustre/fid/$fid
12324 echo "stat fid $fid"
12325 stat $ffid > /dev/null || error "stat $ffid failed."
12326 echo "touch fid $fid"
12327 touch $ffid || error "touch $ffid failed."
12328 echo "write to fid $fid"
12329 cat /etc/hosts > $ffid || error "write $ffid failed."
12330 echo "read fid $fid"
12331 diff /etc/hosts $ffid || error "read $ffid failed."
12332 echo "append write to fid $fid"
12333 cat /etc/hosts >> $ffid || error "append write $ffid failed."
12334 echo "rename fid $fid"
12335 mv $ffid $test_dir/$tfile.1 &&
12336 error "rename $ffid to $tfile.1 should fail."
12337 touch $test_dir/$tfile.1
12338 mv $test_dir/$tfile.1 $ffid &&
12339 error "rename $tfile.1 to $ffid should fail."
12340 rm -f $test_dir/$tfile.1
12341 echo "truncate fid $fid"
12342 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
12343 echo "link fid $fid"
12344 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
12345 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
12346 echo "setfacl fid $fid"
12347 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
12348 echo "getfacl fid $fid"
12349 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
12351 echo "unlink fid $fid"
12352 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
12353 echo "mknod fid $fid"
12354 mknod $ffid c 1 3 && error "mknod $ffid should fail."
12356 fid=[0xf00000400:0x1:0x0]
12357 ffid=$MOUNT/.lustre/fid/$fid
12359 echo "stat non-exist fid $fid"
12360 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
12361 echo "write to non-exist fid $fid"
12362 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
12363 echo "link new fid $fid"
12364 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
12366 mkdir -p $test_dir/$tdir
12367 touch $test_dir/$tdir/$tfile
12368 fid=$($LFS path2fid $test_dir/$tdir)
12371 error "error: could not get fid for $test_dir/$dir/$tfile."
12373 ffid=$MOUNT/.lustre/fid/$fid
12376 ls $ffid > /dev/null || error "ls $ffid failed."
12377 echo "touch $fid/$tfile.1"
12378 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
12380 echo "touch $MOUNT/.lustre/fid/$tfile"
12381 touch $MOUNT/.lustre/fid/$tfile && \
12382 error "touch $MOUNT/.lustre/fid/$tfile should fail."
12384 echo "setxattr to $MOUNT/.lustre/fid"
12385 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
12387 echo "listxattr for $MOUNT/.lustre/fid"
12388 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
12390 echo "delxattr from $MOUNT/.lustre/fid"
12391 setfattr -x trusted.name1 $MOUNT/.lustre/fid
12393 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
12394 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
12395 error "touch invalid fid should fail."
12397 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
12398 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
12399 error "touch non-normal fid should fail."
12401 echo "rename $tdir to $MOUNT/.lustre/fid"
12402 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
12403 error "rename to $MOUNT/.lustre/fid should fail."
12405 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
12407 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
12408 local new_obf_mode=777
12410 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
12411 chmod $new_obf_mode $DIR/.lustre/fid ||
12412 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
12414 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
12415 [ $obf_mode -eq $new_obf_mode ] ||
12416 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
12418 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
12419 chmod $old_obf_mode $DIR/.lustre/fid ||
12420 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
12423 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
12424 fid=$($LFS path2fid $test_dir/$tfile-2)
12426 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
12428 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
12429 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
12430 error "create lov data thru .lustre failed"
12432 echo "cp /etc/passwd $test_dir/$tfile-2"
12433 cp /etc/passwd $test_dir/$tfile-2 ||
12434 error "copy to $test_dir/$tfile-2 failed."
12435 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
12436 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12437 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12439 rm -rf $test_dir/tfile.lnk
12440 rm -rf $test_dir/$tfile-2
12444 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12445 skip "Need MDS version at least 2.4.1"
12447 local tf=$DIR/$tfile
12450 local fid=$($LFS path2fid $tf)
12451 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12453 # check that we get the same pathname back
12454 local found=$($LFS fid2path $MOUNT "$fid")
12455 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12456 [ "$found" == "$tf" ] ||
12457 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12459 run_test 154A "lfs path2fid and fid2path basic checks"
12462 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12463 skip "Need MDS version at least 2.4.1"
12465 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12466 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12467 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12468 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12470 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12471 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12473 # check that we get the same pathname
12474 echo "PFID: $PFID, name: $name"
12475 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12476 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12477 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12478 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12480 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12482 run_test 154B "verify the ll_decode_linkea tool"
12485 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12486 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12487 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12488 skip "Need MDS version at least 2.2.51"
12489 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12491 cp /etc/hosts $DIR/$tfile
12493 fid=$($LFS path2fid $DIR/$tfile)
12495 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12497 dot_lustre_fid_permission_check "$fid" $DIR ||
12498 error "dot lustre permission check $fid failed"
12500 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12502 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12504 touch $MOUNT/.lustre/file &&
12505 error "creation is not allowed under .lustre"
12507 mkdir $MOUNT/.lustre/dir &&
12508 error "mkdir is not allowed under .lustre"
12512 run_test 154a "Open-by-FID"
12515 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12516 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12517 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12518 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12519 skip "Need MDS version at least 2.2.51"
12521 local remote_dir=$DIR/$tdir/remote_dir
12525 mkdir -p $DIR/$tdir
12526 $LFS mkdir -i $MDTIDX $remote_dir ||
12527 error "create remote directory failed"
12529 cp /etc/hosts $remote_dir/$tfile
12531 fid=$($LFS path2fid $remote_dir/$tfile)
12533 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12535 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12536 error "dot lustre permission check $fid failed"
12539 run_test 154b "Open-by-FID for remote directory"
12542 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12543 skip "Need MDS version at least 2.4.1"
12545 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12546 local FID1=$($LFS path2fid $DIR/$tfile.1)
12547 local FID2=$($LFS path2fid $DIR/$tfile.2)
12548 local FID3=$($LFS path2fid $DIR/$tfile.3)
12551 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12552 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12553 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12555 [ "$FID" = "${!want}" ] ||
12556 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12560 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12562 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12563 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12567 run_test 154c "lfs path2fid and fid2path multiple arguments"
12570 remote_mds_nodsh && skip "remote MDS with nodsh"
12571 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12572 skip "Need MDS version at least 2.5.53"
12574 if remote_mds; then
12575 nid=$($LCTL list_nids | sed "s/\./\\\./g")
12579 local proc_ofile="mdt.*.exports.'$nid'.open_files"
12586 local fid=$($LFS path2fid $DIR/$tfile)
12589 cmd="exec $fd<$DIR/$tfile"
12591 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
12592 echo "$fid_list" | grep "$fid"
12595 cmd="exec $fd>/dev/null"
12597 if [ $rc -ne 0 ]; then
12598 error "FID $fid not found in open files list $fid_list"
12601 run_test 154d "Verify open file fid"
12605 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
12606 skip "Need MDS version at least 2.6.50"
12608 if ls -a $MOUNT | grep -q '^\.lustre$'; then
12609 error ".lustre returned by readdir"
12612 run_test 154e ".lustre is not returned by readdir"
12615 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12617 # create parent directory on a single MDT to avoid cross-MDT hardlinks
12618 test_mkdir -p -c1 $DIR/$tdir/d
12619 # test dirs inherit from its stripe
12620 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
12621 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
12622 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
12623 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
12626 # get fid of parents
12627 local FID0=$($LFS path2fid $DIR/$tdir/d)
12628 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
12629 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
12630 local FID3=$($LFS path2fid $DIR)
12632 # check that path2fid --parents returns expected <parent_fid>/name
12633 # 1) test for a directory (single parent)
12634 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
12635 [ "$parent" == "$FID0/foo1" ] ||
12636 error "expected parent: $FID0/foo1, got: $parent"
12638 # 2) test for a file with nlink > 1 (multiple parents)
12639 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
12640 echo "$parent" | grep -F "$FID1/$tfile" ||
12641 error "$FID1/$tfile not returned in parent list"
12642 echo "$parent" | grep -F "$FID2/link" ||
12643 error "$FID2/link not returned in parent list"
12645 # 3) get parent by fid
12646 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
12647 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12648 echo "$parent" | grep -F "$FID1/$tfile" ||
12649 error "$FID1/$tfile not returned in parent list (by fid)"
12650 echo "$parent" | grep -F "$FID2/link" ||
12651 error "$FID2/link not returned in parent list (by fid)"
12653 # 4) test for entry in root directory
12654 parent=$($LFS path2fid --parents $DIR/f)
12655 echo "$parent" | grep -F "$FID3/f" ||
12656 error "$FID3/f not returned in parent list"
12658 # 5) test it on root directory
12659 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
12660 error "$MOUNT should not have parents"
12662 # enable xattr caching and check that linkea is correctly updated
12663 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
12664 save_lustre_params client "llite.*.xattr_cache" > $save
12665 lctl set_param llite.*.xattr_cache 1
12667 # 6.1) linkea update on rename
12668 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
12670 # get parents by fid
12671 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12672 # foo1 should no longer be returned in parent list
12673 echo "$parent" | grep -F "$FID1" &&
12674 error "$FID1 should no longer be in parent list"
12675 # the new path should appear
12676 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
12677 error "$FID2/$tfile.moved is not in parent list"
12679 # 6.2) linkea update on unlink
12680 rm -f $DIR/$tdir/d/foo2/link
12681 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12682 # foo2/link should no longer be returned in parent list
12683 echo "$parent" | grep -F "$FID2/link" &&
12684 error "$FID2/link should no longer be in parent list"
12688 restore_lustre_params < $save
12691 run_test 154f "get parent fids by reading link ea"
12695 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12696 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
12697 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
12698 skip "Need MDS version at least 2.6.92"
12700 mkdir -p $DIR/$tdir
12701 llapi_fid_test -d $DIR/$tdir
12703 run_test 154g "various llapi FID tests"
12705 test_155_small_load() {
12706 local temp=$TMP/$tfile
12707 local file=$DIR/$tfile
12709 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
12710 error "dd of=$temp bs=6096 count=1 failed"
12712 cancel_lru_locks $OSC
12713 cmp $temp $file || error "$temp $file differ"
12715 $TRUNCATE $temp 6000
12716 $TRUNCATE $file 6000
12717 cmp $temp $file || error "$temp $file differ (truncate1)"
12719 echo "12345" >>$temp
12720 echo "12345" >>$file
12721 cmp $temp $file || error "$temp $file differ (append1)"
12723 echo "12345" >>$temp
12724 echo "12345" >>$file
12725 cmp $temp $file || error "$temp $file differ (append2)"
12731 test_155_big_load() {
12732 remote_ost_nodsh && skip "remote OST with nodsh"
12734 local temp=$TMP/$tfile
12735 local file=$DIR/$tfile
12738 local cache_size=$(do_facet ost$((MAXI+1)) \
12739 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
12740 local large_file_size=$((cache_size * 2))
12742 echo "OSS cache size: $cache_size KB"
12743 echo "Large file size: $large_file_size KB"
12745 [ $MAXV -le $large_file_size ] &&
12746 skip_env "max available OST size needs > $large_file_size KB"
12748 $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed"
12750 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
12751 error "dd of=$temp bs=$large_file_size count=1k failed"
12754 cancel_lru_locks osc
12755 cmp $temp $file || error "$temp $file differ"
12761 save_writethrough() {
12762 local facets=$(get_facets OST)
12764 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
12768 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12770 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12772 save_writethrough $p
12775 set_cache writethrough on
12776 test_155_small_load
12777 restore_lustre_params < $p
12780 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
12783 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12785 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12787 save_writethrough $p
12790 set_cache writethrough off
12791 test_155_small_load
12792 restore_lustre_params < $p
12795 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
12798 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12800 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12802 save_writethrough $p
12805 set_cache writethrough on
12806 test_155_small_load
12807 restore_lustre_params < $p
12810 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
12813 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12815 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12817 save_writethrough $p
12820 set_cache writethrough off
12821 test_155_small_load
12822 restore_lustre_params < $p
12825 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
12828 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12830 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12832 save_writethrough $p
12835 set_cache writethrough on
12837 restore_lustre_params < $p
12840 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
12843 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12845 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12847 save_writethrough $p
12850 set_cache writethrough off
12852 restore_lustre_params < $p
12855 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
12858 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12860 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12862 save_writethrough $p
12865 set_cache writethrough on
12867 restore_lustre_params < $p
12870 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
12873 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12875 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12877 save_writethrough $p
12880 set_cache writethrough off
12882 restore_lustre_params < $p
12885 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
12888 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12889 remote_ost_nodsh && skip "remote OST with nodsh"
12890 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
12891 skip "stats not implemented on old servers"
12892 [ "$ost1_FSTYPE" = "zfs" ] &&
12893 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
12898 local file="$DIR/$tfile"
12899 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12901 save_writethrough $p
12904 log "Turn on read and write cache"
12906 set_cache writethrough on
12908 log "Write data and read it back."
12909 log "Read should be satisfied from the cache."
12910 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12912 cancel_lru_locks osc
12913 cat $file >/dev/null
12915 if ! let "AFTER - BEFORE == CPAGES"; then
12916 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12918 log "cache hits:: before: $BEFORE, after: $AFTER"
12921 log "Read again; it should be satisfied from the cache."
12923 cancel_lru_locks osc
12924 cat $file >/dev/null
12926 if ! let "AFTER - BEFORE == CPAGES"; then
12927 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12929 log "cache hits:: before: $BEFORE, after: $AFTER"
12932 log "Turn off the read cache and turn on the write cache"
12934 set_cache writethrough on
12936 log "Read again; it should be satisfied from the cache."
12938 cancel_lru_locks osc
12939 cat $file >/dev/null
12941 if ! let "AFTER - BEFORE == CPAGES"; then
12942 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12944 log "cache hits:: before: $BEFORE, after: $AFTER"
12947 log "Read again; it should not be satisfied from the cache."
12949 cancel_lru_locks osc
12950 cat $file >/dev/null
12952 if ! let "AFTER - BEFORE == 0"; then
12953 error "IN CACHE: before: $BEFORE, after: $AFTER"
12955 log "cache hits:: before: $BEFORE, after: $AFTER"
12958 log "Write data and read it back."
12959 log "Read should be satisfied from the cache."
12960 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12962 cancel_lru_locks osc
12963 cat $file >/dev/null
12965 if ! let "AFTER - BEFORE == CPAGES"; then
12966 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12968 log "cache hits:: before: $BEFORE, after: $AFTER"
12971 log "Read again; it should not be satisfied from the cache."
12973 cancel_lru_locks osc
12974 cat $file >/dev/null
12976 if ! let "AFTER - BEFORE == 0"; then
12977 error "IN CACHE: before: $BEFORE, after: $AFTER"
12979 log "cache hits:: before: $BEFORE, after: $AFTER"
12982 log "Turn off read and write cache"
12984 set_cache writethrough off
12986 log "Write data and read it back"
12987 log "It should not be satisfied from the cache."
12989 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12990 cancel_lru_locks osc
12992 cat $file >/dev/null
12994 if ! let "AFTER - BEFORE == 0"; then
12995 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12997 log "cache hits:: before: $BEFORE, after: $AFTER"
13000 log "Turn on the read cache and turn off the write cache"
13002 set_cache writethrough off
13004 log "Write data and read it back"
13005 log "It should not be satisfied from the cache."
13007 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13009 cancel_lru_locks osc
13010 cat $file >/dev/null
13012 if ! let "AFTER - BEFORE == 0"; then
13013 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
13015 log "cache hits:: before: $BEFORE, after: $AFTER"
13018 log "Read again; it should be satisfied from the cache."
13020 cancel_lru_locks osc
13021 cat $file >/dev/null
13023 if ! let "AFTER - BEFORE == CPAGES"; then
13024 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
13026 log "cache hits:: before: $BEFORE, after: $AFTER"
13029 restore_lustre_params < $p
13032 run_test 156 "Verification of tunables"
13035 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13036 remote_mds_nodsh && skip "remote MDS with nodsh"
13037 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13038 skip "Need MDS version at least 2.2.0"
13040 changelog_register || error "changelog_register failed"
13041 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13042 changelog_users $SINGLEMDS | grep -q $cl_user ||
13043 error "User $cl_user not found in changelog_users"
13046 test_mkdir -p $DIR/$tdir/pics/2008/zachy
13047 changelog_clear 0 || error "changelog_clear failed"
13048 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
13049 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
13050 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
13051 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
13052 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
13053 rm $DIR/$tdir/pics/desktop.jpg
13055 changelog_dump | tail -10
13057 echo "verifying changelog mask"
13058 changelog_chmask "-MKDIR"
13059 changelog_chmask "-CLOSE"
13061 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
13062 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
13064 changelog_chmask "+MKDIR"
13065 changelog_chmask "+CLOSE"
13067 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
13068 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
13070 changelog_dump | tail -10
13071 MKDIRS=$(changelog_dump | grep -c "MKDIR")
13072 CLOSES=$(changelog_dump | grep -c "CLOSE")
13073 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
13074 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
13077 echo "verifying target fid"
13078 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
13079 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
13080 [ "$fidc" == "$fidf" ] ||
13081 error "changelog '$tfile' fid $fidc != file fid $fidf"
13082 echo "verifying parent fid"
13083 # The FID returned from the Changelog may be the directory shard on
13084 # a different MDT, and not the FID returned by path2fid on the parent.
13085 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
13086 # since this is what will matter when recreating this file in the tree.
13087 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
13088 local pathp=$($LFS fid2path $MOUNT "$fidp")
13089 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
13090 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
13092 echo "getting records for $cl_user"
13093 changelog_users $SINGLEMDS
13094 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
13096 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
13097 error "changelog_clear failed"
13098 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
13099 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
13100 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
13101 error "user index expect $user_rec1 + $nclr != $user_rec2"
13103 local min0_rec=$(changelog_users $SINGLEMDS |
13104 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
13105 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
13106 awk '{ print $1; exit; }')
13108 changelog_dump | tail -n 5
13109 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
13110 [ $first_rec == $((min0_rec + 1)) ] ||
13111 error "first index should be $min0_rec + 1 not $first_rec"
13113 # LU-3446 changelog index reset on MDT restart
13114 local cur_rec1=$(changelog_users $SINGLEMDS |
13115 awk '/^current.index:/ { print $NF }')
13116 changelog_clear 0 ||
13117 error "clear all changelog records for $cl_user failed"
13118 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
13119 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
13120 error "Fail to start $SINGLEMDS"
13121 local cur_rec2=$(changelog_users $SINGLEMDS |
13122 awk '/^current.index:/ { print $NF }')
13123 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
13124 [ $cur_rec1 == $cur_rec2 ] ||
13125 error "current index should be $cur_rec1 not $cur_rec2"
13127 echo "verifying users from this test are deregistered"
13128 changelog_deregister || error "changelog_deregister failed"
13129 changelog_users $SINGLEMDS | grep -q $cl_user &&
13130 error "User '$cl_user' still in changelog_users"
13132 # lctl get_param -n mdd.*.changelog_users
13133 # current index: 144
13134 # ID index (idle seconds)
13136 if ! changelog_users $SINGLEMDS | grep "^cl"; then
13137 # this is the normal case where all users were deregistered
13138 # make sure no new records are added when no users are present
13139 local last_rec1=$(changelog_users $SINGLEMDS |
13140 awk '/^current.index:/ { print $NF }')
13141 touch $DIR/$tdir/chloe
13142 local last_rec2=$(changelog_users $SINGLEMDS |
13143 awk '/^current.index:/ { print $NF }')
13144 echo "verify changelogs are off: $last_rec1 == $last_rec2"
13145 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
13147 # any changelog users must be leftovers from a previous test
13148 changelog_users $SINGLEMDS
13149 echo "other changelog users; can't verify off"
13152 run_test 160a "changelog sanity"
13154 test_160b() { # LU-3587
13155 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13156 remote_mds_nodsh && skip "remote MDS with nodsh"
13157 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13158 skip "Need MDS version at least 2.2.0"
13160 changelog_register || error "changelog_register failed"
13161 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13162 changelog_users $SINGLEMDS | grep -q $cl_user ||
13163 error "User '$cl_user' not found in changelog_users"
13165 local longname1=$(str_repeat a 255)
13166 local longname2=$(str_repeat b 255)
13169 echo "creating very long named file"
13170 touch $longname1 || error "create of '$longname1' failed"
13171 echo "renaming very long named file"
13172 mv $longname1 $longname2
13174 changelog_dump | grep RENME | tail -n 5
13177 run_test 160b "Verify that very long rename doesn't crash in changelog"
13180 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13181 remote_mds_nodsh && skip "remote MDS with nodsh"
13183 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
13184 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
13185 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
13186 skip "Need MDS version at least 2.5.58 or 2.5.2+"
13190 # Registration step
13191 changelog_register || error "changelog_register failed"
13194 mkdir -p $DIR/$tdir
13195 $MCREATE $DIR/$tdir/foo_160c
13196 changelog_chmask "-TRUNC"
13197 $TRUNCATE $DIR/$tdir/foo_160c 200
13198 changelog_chmask "+TRUNC"
13199 $TRUNCATE $DIR/$tdir/foo_160c 199
13200 changelog_dump | tail -n 5
13201 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
13202 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
13204 run_test 160c "verify that changelog log catch the truncate event"
13207 remote_mds_nodsh && skip "remote MDS with nodsh"
13208 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13209 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13210 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
13211 skip "Need MDS version at least 2.7.60"
13213 # Registration step
13214 changelog_register || error "changelog_register failed"
13216 mkdir -p $DIR/$tdir/migrate_dir
13217 changelog_clear 0 || error "changelog_clear failed"
13219 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
13220 changelog_dump | tail -n 5
13221 local migrates=$(changelog_dump | grep -c "MIGRT")
13222 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
13224 run_test 160d "verify that changelog log catch the migrate event"
13227 remote_mds_nodsh && skip "remote MDS with nodsh"
13230 changelog_register || error "changelog_register failed"
13232 # Delete a future user (expect fail)
13233 local MDT0=$(facet_svc $SINGLEMDS)
13234 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
13237 if [ $rc -eq 0 ]; then
13238 error "Deleted non-existant user cl77"
13239 elif [ $rc -ne 2 ]; then
13240 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
13243 # Clear to a bad index (1 billion should be safe)
13244 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
13247 if [ $rc -eq 0 ]; then
13248 error "Successfully cleared to invalid CL index"
13249 elif [ $rc -ne 22 ]; then
13250 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
13253 run_test 160e "changelog negative testing (should return errors)"
13256 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13257 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13258 skip "Need MDS version at least 2.10.56"
13260 local mdts=$(comma_list $(mdts_nodes))
13263 changelog_register || error "first changelog_register failed"
13264 changelog_register || error "second changelog_register failed"
13266 declare -A cl_user1
13267 declare -A cl_user2
13272 # generate some changelog records to accumulate on each MDT
13273 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13274 log "$(date +%s): creating first files"
13275 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13276 error "create $DIR/$tdir/$tfile failed"
13278 # check changelogs have been generated
13279 local start=$SECONDS
13280 local idle_time=$((MDSCOUNT * 5 + 5))
13281 local nbcl=$(changelog_dump | wc -l)
13282 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13284 for param in "changelog_max_idle_time=$idle_time" \
13286 "changelog_min_gc_interval=2" \
13287 "changelog_min_free_cat_entries=3"; do
13288 local MDT0=$(facet_svc $SINGLEMDS)
13289 local var="${param%=*}"
13290 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13292 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13293 do_nodes $mdts $LCTL set_param mdd.*.$param
13296 # force cl_user2 to be idle (1st part), but also cancel the
13297 # cl_user1 records so that it is not evicted later in the test.
13298 local sleep1=$((idle_time / 2))
13299 echo "$(date +%s): sleep1 $sleep1/${idle_time}s"
13302 # simulate changelog catalog almost full
13303 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13304 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13306 for i in $(seq $MDSCOUNT); do
13307 cl_users=(${CL_USERS[mds$i]})
13308 cl_user1[mds$i]="${cl_users[0]}"
13309 cl_user2[mds$i]="${cl_users[1]}"
13311 [ -n "${cl_user1[mds$i]}" ] ||
13312 error "mds$i: no user registered"
13313 [ -n "${cl_user2[mds$i]}" ] ||
13314 error "mds$i: only ${cl_user2[mds$i]} is registered"
13316 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13317 [ -n "$user_rec1" ] ||
13318 error "mds$i: User ${cl_user1[mds$i]} not registered"
13319 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13320 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13321 [ -n "$user_rec2" ] ||
13322 error "mds$i: User ${cl_user1[mds$i]} not registered"
13323 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13324 "$user_rec1 + 2 == $user_rec2"
13325 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13326 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13327 "$user_rec1 + 2, but is $user_rec2"
13328 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13329 [ -n "$user_rec2" ] ||
13330 error "mds$i: User ${cl_user2[mds$i]} not registered"
13331 [ $user_rec1 == $user_rec2 ] ||
13332 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13333 "$user_rec1, but is $user_rec2"
13336 # force cl_user2 idle (2nd part) to just exceed changelog_max_idle_time
13337 local sleep2=$((idle_time - (SECONDS - start) + 1))
13338 echo "$(date +%s): sleep2 $sleep2/${idle_time}s"
13341 # Generate one more changelog to trigger GC at fail_loc for cl_user2.
13342 # cl_user1 should be OK because it recently processed records.
13343 echo "$(date +%s): creating $((MDSCOUNT * 2)) files"
13344 createmany -m $DIR/$tdir/${tfile}b $((MDSCOUNT * 2)) ||
13345 error "create $DIR/$tdir/${tfile}b failed"
13347 # ensure gc thread is done
13348 for i in $(mdts_nodes); do
13350 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13351 error "$i: GC-thread not done"
13355 for i in $(seq $MDSCOUNT); do
13356 # check cl_user1 still registered
13357 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13358 error "mds$i: User ${cl_user1[mds$i]} not registered"
13359 # check cl_user2 unregistered
13360 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13361 error "mds$i: User ${cl_user2[mds$i]} still registered"
13363 # check changelogs are present and starting at $user_rec1 + 1
13364 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13365 [ -n "$user_rec1" ] ||
13366 error "mds$i: User ${cl_user1[mds$i]} not registered"
13367 first_rec=$($LFS changelog $(facet_svc mds$i) |
13368 awk '{ print $1; exit; }')
13370 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13371 [ $((user_rec1 + 1)) == $first_rec ] ||
13372 error "mds$i: first index should be $user_rec1 + 1, " \
13373 "but is $first_rec"
13376 run_test 160f "changelog garbage collect (timestamped users)"
13379 remote_mds_nodsh && skip "remote MDS with nodsh"
13380 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13381 skip "Need MDS version at least 2.10.56"
13383 local mdts=$(comma_list $(mdts_nodes))
13385 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
13386 do_nodes $mdts $LCTL set_param fail_loc=0x1314
13389 changelog_register || error "first changelog_register failed"
13390 changelog_register || error "second changelog_register failed"
13392 declare -A cl_user1
13393 declare -A cl_user2
13398 # generate some changelog records to accumulate on each MDT
13399 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13400 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13401 error "create $DIR/$tdir/$tfile failed"
13403 # check changelogs have been generated
13404 local nbcl=$(changelog_dump | wc -l)
13405 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13407 # reduce the max_idle_indexes value to make sure we exceed it
13408 max_ndx=$((nbcl / 2 - 1))
13410 for param in "changelog_max_idle_indexes=$max_ndx" \
13412 "changelog_min_gc_interval=2" \
13413 "changelog_min_free_cat_entries=3"; do
13414 local MDT0=$(facet_svc $SINGLEMDS)
13415 local var="${param%=*}"
13416 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13418 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13419 do_nodes $mdts $LCTL set_param mdd.*.$param ||
13420 error "unable to set mdd.*.$param"
13423 # simulate changelog catalog almost full
13424 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13425 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13427 for i in $(seq $MDSCOUNT); do
13428 cl_users=(${CL_USERS[mds$i]})
13429 cl_user1[mds$i]="${cl_users[0]}"
13430 cl_user2[mds$i]="${cl_users[1]}"
13432 [ -n "${cl_user1[mds$i]}" ] ||
13433 error "mds$i: no user registered"
13434 [ -n "${cl_user2[mds$i]}" ] ||
13435 error "mds$i: only ${cl_user1[mds$i]} is registered"
13437 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13438 [ -n "$user_rec1" ] ||
13439 error "mds$i: User ${cl_user1[mds$i]} not registered"
13440 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13441 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13442 [ -n "$user_rec2" ] ||
13443 error "mds$i: User ${cl_user1[mds$i]} not registered"
13444 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13445 "$user_rec1 + 2 == $user_rec2"
13446 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13447 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13448 "$user_rec1 + 2, but is $user_rec2"
13449 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13450 [ -n "$user_rec2" ] ||
13451 error "mds$i: User ${cl_user2[mds$i]} not registered"
13452 [ $user_rec1 == $user_rec2 ] ||
13453 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13454 "$user_rec1, but is $user_rec2"
13457 # ensure we are past the previous changelog_min_gc_interval set above
13460 # generate one more changelog to trigger fail_loc
13461 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13462 error "create $DIR/$tdir/${tfile}bis failed"
13464 # ensure gc thread is done
13465 for i in $(mdts_nodes); do
13467 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13468 error "$i: GC-thread not done"
13472 for i in $(seq $MDSCOUNT); do
13473 # check cl_user1 still registered
13474 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13475 error "mds$i: User ${cl_user1[mds$i]} not registered"
13476 # check cl_user2 unregistered
13477 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13478 error "mds$i: User ${cl_user2[mds$i]} still registered"
13480 # check changelogs are present and starting at $user_rec1 + 1
13481 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13482 [ -n "$user_rec1" ] ||
13483 error "mds$i: User ${cl_user1[mds$i]} not registered"
13484 first_rec=$($LFS changelog $(facet_svc mds$i) |
13485 awk '{ print $1; exit; }')
13487 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13488 [ $((user_rec1 + 1)) == $first_rec ] ||
13489 error "mds$i: first index should be $user_rec1 + 1, " \
13490 "but is $first_rec"
13493 run_test 160g "changelog garbage collect (old users)"
13496 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13497 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13498 skip "Need MDS version at least 2.10.56"
13500 local mdts=$(comma_list $(mdts_nodes))
13503 changelog_register || error "first changelog_register failed"
13504 changelog_register || error "second changelog_register failed"
13506 declare -A cl_user1
13507 declare -A cl_user2
13512 # generate some changelog records to accumulate on each MDT
13513 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13514 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13515 error "create $DIR/$tdir/$tfile failed"
13517 # check changelogs have been generated
13518 local nbcl=$(changelog_dump | wc -l)
13519 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13521 for param in "changelog_max_idle_time=10" \
13523 "changelog_min_gc_interval=2"; do
13524 local MDT0=$(facet_svc $SINGLEMDS)
13525 local var="${param%=*}"
13526 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13528 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13529 do_nodes $mdts $LCTL set_param mdd.*.$param
13532 # force cl_user2 to be idle (1st part)
13535 for i in $(seq $MDSCOUNT); do
13536 cl_users=(${CL_USERS[mds$i]})
13537 cl_user1[mds$i]="${cl_users[0]}"
13538 cl_user2[mds$i]="${cl_users[1]}"
13540 [ -n "${cl_user1[mds$i]}" ] ||
13541 error "mds$i: no user registered"
13542 [ -n "${cl_user2[mds$i]}" ] ||
13543 error "mds$i: only ${cl_user2[mds$i]} is registered"
13545 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13546 [ -n "$user_rec1" ] ||
13547 error "mds$i: User ${cl_user1[mds$i]} not registered"
13548 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13549 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13550 [ -n "$user_rec2" ] ||
13551 error "mds$i: User ${cl_user1[mds$i]} not registered"
13552 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13553 "$user_rec1 + 2 == $user_rec2"
13554 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13555 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13556 "$user_rec1 + 2, but is $user_rec2"
13557 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13558 [ -n "$user_rec2" ] ||
13559 error "mds$i: User ${cl_user2[mds$i]} not registered"
13560 [ $user_rec1 == $user_rec2 ] ||
13561 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13562 "$user_rec1, but is $user_rec2"
13565 # force cl_user2 to be idle (2nd part) and to reach
13566 # changelog_max_idle_time
13569 # force each GC-thread start and block then
13570 # one per MDT/MDD, set fail_val accordingly
13571 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13572 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13574 # generate more changelogs to trigger fail_loc
13575 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13576 error "create $DIR/$tdir/${tfile}bis failed"
13578 # stop MDT to stop GC-thread, should be done in back-ground as it will
13579 # block waiting for the thread to be released and exit
13580 declare -A stop_pids
13581 for i in $(seq $MDSCOUNT); do
13583 stop_pids[mds$i]=$!
13586 for i in $(mdts_nodes); do
13589 local facets=$(facets_up_on_host $i)
13591 for facet in ${facets//,/ }; do
13592 if [[ $facet == mds* ]]; then
13596 # ensure each MDS's gc threads are still present and all in "R"
13597 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
13598 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
13599 error "$i: expected $nb GC-thread"
13601 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
13603 error "$i: GC-thread not found in R-state"
13604 # check umounts of each MDT on MDS have reached kthread_stop()
13605 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
13606 error "$i: expected $nb umount"
13608 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
13609 error "$i: umount not found in D-state"
13612 # release all GC-threads
13613 do_nodes $mdts $LCTL set_param fail_loc=0
13615 # wait for MDT stop to complete
13616 for i in $(seq $MDSCOUNT); do
13617 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
13621 # may try to check if any orphan changelog records are present
13622 # via ldiskfs/zfs and llog_reader...
13624 # re-start/mount MDTs
13625 for i in $(seq $MDSCOUNT); do
13626 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
13627 error "Fail to start mds$i"
13631 for i in $(seq $MDSCOUNT); do
13632 # check cl_user1 still registered
13633 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13634 error "mds$i: User ${cl_user1[mds$i]} not registered"
13635 # check cl_user2 unregistered
13636 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13637 error "mds$i: User ${cl_user2[mds$i]} still registered"
13639 # check changelogs are present and starting at $user_rec1 + 1
13640 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13641 [ -n "$user_rec1" ] ||
13642 error "mds$i: User ${cl_user1[mds$i]} not registered"
13643 first_rec=$($LFS changelog $(facet_svc mds$i) |
13644 awk '{ print $1; exit; }')
13646 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13647 [ $((user_rec1 + 1)) == $first_rec ] ||
13648 error "mds$i: first index should be $user_rec1 + 1, " \
13649 "but is $first_rec"
13652 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
13657 local mdts=$(comma_list $(mdts_nodes))
13659 changelog_register || error "first changelog_register failed"
13661 # generate some changelog records to accumulate on each MDT
13662 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13663 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13664 error "create $DIR/$tdir/$tfile failed"
13666 # check changelogs have been generated
13667 local nbcl=$(changelog_dump | wc -l)
13668 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13670 # simulate race between register and unregister
13671 # XXX as fail_loc is set per-MDS, with DNE configs the race
13672 # simulation will only occur for one MDT per MDS and for the
13673 # others the normal race scenario will take place
13674 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
13675 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
13676 do_nodes $mdts $LCTL set_param fail_val=1
13678 # unregister 1st user
13679 changelog_deregister &
13681 # wait some time for deregister work to reach race rdv
13683 # register 2nd user
13684 changelog_register || error "2nd user register failed"
13686 wait $pid1 || error "1st user deregister failed"
13690 declare -A LAST_REC
13691 for i in $(seq $MDSCOUNT); do
13692 if changelog_users mds$i | grep "^cl"; then
13693 # make sure new records are added with one user present
13694 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
13695 awk '/^current.index:/ { print $NF }')
13697 error "mds$i has no user registered"
13701 # generate more changelog records to accumulate on each MDT
13702 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13703 error "create $DIR/$tdir/${tfile}bis failed"
13705 for i in $(seq $MDSCOUNT); do
13706 last_rec=$(changelog_users $SINGLEMDS |
13707 awk '/^current.index:/ { print $NF }')
13708 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
13709 [ $last_rec != ${LAST_REC[mds$i]} ] ||
13710 error "changelogs are off on mds$i"
13713 run_test 160i "changelog user register/unregister race"
13716 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13717 remote_mds_nodsh && skip "remote MDS with nodsh"
13719 mkdir -p $DIR/$tdir/1/1
13721 changelog_register || error "changelog_register failed"
13722 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13724 changelog_users $SINGLEMDS | grep -q $cl_user ||
13725 error "User '$cl_user' not found in changelog_users"
13726 #define OBD_FAIL_MDS_CHANGELOG_REORDER 0x15d
13727 do_facet mds1 $LCTL set_param fail_loc=0x8000015d fail_val=3
13728 rmdir $DIR/$tdir/1/1 & sleep 1
13730 touch $DIR/$tdir/2/2
13731 rm -rf $DIR/$tdir/2
13736 changelog_dump | grep rmdir || error "rmdir not recorded"
13739 changelog_deregister
13741 run_test 160k "Verify that changelog records are not lost"
13744 remote_mds_nodsh && skip "remote MDS with nodsh"
13745 [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] &&
13746 skip "Need MDS version at least 2.12.56"
13748 mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
13750 changelog_register || error "first changelog_register failed"
13752 # generate some changelog
13753 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13754 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13755 error "create $DIR/$tdir/${tfile}bis failed"
13757 # open the changelog device
13758 exec 3>/dev/changelog-$FSNAME-MDT0000
13759 exec 4</dev/changelog-$FSNAME-MDT0000
13761 # umount the first lustre mount
13765 cat <&4 >/dev/null || error "read changelog failed"
13768 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13769 changelog_users $SINGLEMDS | grep -q $cl_user ||
13770 error "User $cl_user not found in changelog_users"
13772 printf 'clear:'$cl_user':0' >&3
13779 changelog_deregister || error "changelog_deregister failed"
13782 mount_client $MOUNT || error "mount_client on $MOUNT failed"
13784 run_test 160j "client can be umounted while its chanangelog is being used"
13787 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13789 test_mkdir -c1 $DIR/$tdir
13790 cp /etc/hosts $DIR/$tdir/$tfile
13791 test_mkdir -c1 $DIR/$tdir/foo1
13792 test_mkdir -c1 $DIR/$tdir/foo2
13793 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
13794 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
13795 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
13796 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
13797 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
13798 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13799 $LFS fid2path $DIR $FID
13800 error "bad link ea"
13803 rm $DIR/$tdir/foo2/zachary
13805 rm $DIR/$tdir/foo2/thor
13807 rm $DIR/$tdir/$tfile
13809 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
13810 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
13811 { $LFS fid2path $DIR $FID; error "bad link rename"; }
13812 rm $DIR/$tdir/foo2/maggie
13815 local longname=$tfile.avg_len_is_thirty_two_
13816 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
13817 error_noexit 'failed to unlink many hardlinks'" EXIT
13818 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
13819 error "failed to hardlink many files"
13820 links=$($LFS fid2path $DIR $FID | wc -l)
13821 echo -n "${links}/1000 links in link EA"
13822 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
13824 run_test 161a "link ea sanity"
13827 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13828 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
13831 local remote_dir=$DIR/$tdir/remote_dir
13833 mkdir -p $DIR/$tdir
13834 $LFS mkdir -i $MDTIDX $remote_dir ||
13835 error "create remote directory failed"
13837 cp /etc/hosts $remote_dir/$tfile
13838 mkdir -p $remote_dir/foo1
13839 mkdir -p $remote_dir/foo2
13840 ln $remote_dir/$tfile $remote_dir/foo1/sofia
13841 ln $remote_dir/$tfile $remote_dir/foo2/zachary
13842 ln $remote_dir/$tfile $remote_dir/foo1/luna
13843 ln $remote_dir/$tfile $remote_dir/foo2/thor
13845 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
13847 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13848 $LFS fid2path $DIR $FID
13849 error "bad link ea"
13852 rm $remote_dir/foo2/zachary
13854 rm $remote_dir/foo2/thor
13856 rm $remote_dir/$tfile
13858 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
13859 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
13860 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
13861 $LFS fid2path $DIR $FID
13862 error "bad link rename"
13864 rm $remote_dir/foo2/maggie
13867 local longname=filename_avg_len_is_thirty_two_
13868 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
13869 error "failed to hardlink many files"
13870 links=$($LFS fid2path $DIR $FID | wc -l)
13871 echo -n "${links}/1000 links in link EA"
13872 [[ ${links} -gt 60 ]] ||
13873 error "expected at least 60 links in link EA"
13874 unlinkmany $remote_dir/foo2/$longname 1000 ||
13875 error "failed to unlink many hardlinks"
13877 run_test 161b "link ea sanity under remote directory"
13880 remote_mds_nodsh && skip "remote MDS with nodsh"
13881 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13882 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
13883 skip "Need MDS version at least 2.1.5"
13885 # define CLF_RENAME_LAST 0x0001
13886 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
13887 changelog_register || error "changelog_register failed"
13890 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
13891 touch $DIR/$tdir/foo_161c
13892 touch $DIR/$tdir/bar_161c
13893 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13894 changelog_dump | grep RENME | tail -n 5
13895 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13896 changelog_clear 0 || error "changelog_clear failed"
13897 if [ x$flags != "x0x1" ]; then
13898 error "flag $flags is not 0x1"
13901 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
13902 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
13903 touch $DIR/$tdir/foo_161c
13904 touch $DIR/$tdir/bar_161c
13905 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13906 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13907 changelog_dump | grep RENME | tail -n 5
13908 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13909 changelog_clear 0 || error "changelog_clear failed"
13910 if [ x$flags != "x0x0" ]; then
13911 error "flag $flags is not 0x0"
13913 echo "rename overwrite a target having nlink > 1," \
13914 "changelog record has flags of $flags"
13916 # rename doesn't overwrite a target (changelog flag 0x0)
13917 touch $DIR/$tdir/foo_161c
13918 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
13919 changelog_dump | grep RENME | tail -n 5
13920 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
13921 changelog_clear 0 || error "changelog_clear failed"
13922 if [ x$flags != "x0x0" ]; then
13923 error "flag $flags is not 0x0"
13925 echo "rename doesn't overwrite a target," \
13926 "changelog record has flags of $flags"
13928 # define CLF_UNLINK_LAST 0x0001
13929 # unlink a file having nlink = 1 (changelog flag 0x1)
13930 rm -f $DIR/$tdir/foo2_161c
13931 changelog_dump | grep UNLNK | tail -n 5
13932 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13933 changelog_clear 0 || error "changelog_clear failed"
13934 if [ x$flags != "x0x1" ]; then
13935 error "flag $flags is not 0x1"
13937 echo "unlink a file having nlink = 1," \
13938 "changelog record has flags of $flags"
13940 # unlink a file having nlink > 1 (changelog flag 0x0)
13941 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13942 rm -f $DIR/$tdir/foobar_161c
13943 changelog_dump | grep UNLNK | tail -n 5
13944 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13945 changelog_clear 0 || error "changelog_clear failed"
13946 if [ x$flags != "x0x0" ]; then
13947 error "flag $flags is not 0x0"
13949 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
13951 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
13954 remote_mds_nodsh && skip "remote MDS with nodsh"
13959 changelog_register || error "changelog_register failed"
13961 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
13962 # interfer with $MOUNT/.lustre/fid/ access
13964 [[ $? -eq 0 ]] || error "mkdir failed"
13966 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
13967 $LCTL set_param fail_loc=0x8000140c
13969 $LCTL set_param fail_val=5
13972 echo foofoo > $DIR/$tdir/$tfile &
13975 # wait for create to be delayed
13979 [[ $? -eq 0 ]] || error "create should be blocked"
13981 local tempfile=$(mktemp)
13982 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
13983 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
13984 # some delay may occur during ChangeLog publishing and file read just
13985 # above, that could allow file write to happen finally
13986 [[ -s $tempfile ]] && echo "file should be empty"
13988 $LCTL set_param fail_loc=0
13991 [[ $? -eq 0 ]] || error "create failed"
13993 run_test 161d "create with concurrent .lustre/fid access"
13996 local expected="$1"
14001 path=$($LFS fid2path "$@")
14004 if [ $rc -ne 0 ]; then
14005 error "path looked up of '$expected' failed: rc=$rc"
14006 elif [ "$path" != "$expected" ]; then
14007 error "path looked up '$path' instead of '$expected'"
14009 echo "FID '$fid' resolves to path '$path' as expected"
14013 test_162a() { # was test_162
14014 test_mkdir -p -c1 $DIR/$tdir/d2
14015 touch $DIR/$tdir/d2/$tfile
14016 touch $DIR/$tdir/d2/x1
14017 touch $DIR/$tdir/d2/x2
14018 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
14019 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
14021 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
14022 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
14025 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
14026 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
14027 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
14029 # softlink to wrong file
14030 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
14031 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
14032 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
14035 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
14036 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
14037 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
14038 # fid2path dir/fsname should both work
14039 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
14040 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
14042 # hardlink count: check that there are 2 links
14043 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
14044 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
14046 # hardlink indexing: remove the first link
14047 rm $DIR/$tdir/d2/p/q/r/hlink
14048 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
14050 run_test 162a "path lookup sanity"
14053 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14054 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
14057 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
14058 error "create striped dir failed"
14060 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
14061 tail -n 1 | awk '{print $2}')
14062 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
14064 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
14065 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
14068 for ((i=0;i<5;i++)); do
14069 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
14070 error "get fid for f$i failed"
14071 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
14073 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
14074 error "get fid for d$i failed"
14075 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
14080 run_test 162b "striped directory path lookup sanity"
14082 # LU-4239: Verify fid2path works with paths 100 or more directories deep
14084 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
14085 skip "Need MDS version at least 2.7.51"
14087 local lpath=$tdir.local
14088 local rpath=$tdir.remote
14090 test_mkdir $DIR/$lpath
14091 test_mkdir $DIR/$rpath
14093 for ((i = 0; i <= 101; i++)); do
14096 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
14097 error "get fid for local directory $DIR/$lpath failed"
14098 check_path "$DIR/$lpath" $MOUNT $FID --link 0
14101 test_mkdir $DIR/$rpath
14102 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
14103 error "get fid for remote directory $DIR/$rpath failed"
14104 check_path "$DIR/$rpath" $MOUNT $FID --link 0
14109 run_test 162c "fid2path works with paths 100 or more directories deep"
14112 # do directio so as not to populate the page cache
14113 log "creating a 10 Mb file"
14114 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
14115 log "starting reads"
14116 dd if=$DIR/$tfile of=/dev/null bs=4096 &
14117 log "truncating the file"
14118 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
14120 kill %+ || true # reads might have finished
14121 echo "wait until dd is finished"
14123 log "removing the temporary file"
14124 rm -rf $DIR/$tfile || error "tmp file removal failed"
14126 run_test 169 "parallel read and truncate should not deadlock"
14129 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14131 $LCTL clear # bug 18514
14132 $LCTL debug_daemon start $TMP/${tfile}_log_good
14134 $LCTL debug_daemon stop
14135 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
14136 error "sed failed to read log_good"
14138 $LCTL debug_daemon start $TMP/${tfile}_log_good
14140 $LCTL debug_daemon stop
14142 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
14143 error "lctl df log_bad failed"
14145 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14146 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14148 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
14149 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
14151 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
14152 error "bad_line good_line1 good_line2 are empty"
14154 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14155 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
14156 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14158 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
14159 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14160 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14162 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
14163 error "bad_line_new good_line_new are empty"
14165 local expected_good=$((good_line1 + good_line2*2))
14167 rm -f $TMP/${tfile}*
14168 # LU-231, short malformed line may not be counted into bad lines
14169 if [ $bad_line -ne $bad_line_new ] &&
14170 [ $bad_line -ne $((bad_line_new - 1)) ]; then
14171 error "expected $bad_line bad lines, but got $bad_line_new"
14175 if [ $expected_good -ne $good_line_new ]; then
14176 error "expected $expected_good good lines, but got $good_line_new"
14181 run_test 170 "test lctl df to handle corrupted log ====================="
14183 test_171() { # bug20592
14184 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14186 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
14187 $LCTL set_param fail_loc=0x50e
14188 $LCTL set_param fail_val=3000
14189 multiop_bg_pause $DIR/$tfile O_s || true
14191 kill -USR1 $MULTIPID
14195 if dmesg | grep "recursive fault"; then
14196 error "caught a recursive fault"
14198 $LCTL set_param fail_loc=0
14201 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
14203 # it would be good to share it with obdfilter-survey/iokit-libecho code
14204 setup_obdecho_osc () {
14207 local obdfilter_name=$2
14208 echo "Creating new osc for $obdfilter_name on $ost_nid"
14209 # make sure we can find loopback nid
14210 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
14212 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
14213 ${obdfilter_name}_osc_UUID || rc=2; }
14214 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
14215 ${obdfilter_name}_UUID $ost_nid || rc=3; }
14219 cleanup_obdecho_osc () {
14220 local obdfilter_name=$1
14221 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
14222 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
14229 local pages=${3:-64}
14234 local obd_size=$(get_obd_size $node $OBD)
14235 local page_size=$(get_page_size $node)
14236 if [[ -n "$obd_size" ]]; then
14237 local new_count=$((obd_size / (pages * page_size / 1024)))
14238 [[ $new_count -ge $count ]] || count=$new_count
14241 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
14242 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
14244 if [ $rc -eq 0 ]; then
14245 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
14246 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
14248 echo "New object id is $id"
14249 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
14251 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
14252 "test_brw $count w v $pages $id" || rc=4; }
14253 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
14255 [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
14256 "cleanup" || rc=5; }
14257 [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \
14258 "detach" || rc=6; }
14259 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
14264 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14266 if ! module_loaded obdecho; then
14267 load_module obdecho/obdecho &&
14268 stack_trap "rmmod obdecho" EXIT ||
14269 error "unable to load obdecho on client"
14272 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
14273 local host=$($LCTL get_param -n osc.$osc.import |
14274 awk '/current_connection:/ { print $2 }' )
14275 local target=$($LCTL get_param -n osc.$osc.import |
14276 awk '/target:/ { print $2 }' )
14277 target=${target%_UUID}
14279 if [ -n "$target" ]; then
14280 setup_obdecho_osc $host $target &&
14281 stack_trap "cleanup_obdecho_osc $target" EXIT ||
14282 { error "obdecho setup failed with $?"; return; }
14284 obdecho_test ${target}_osc client ||
14285 error "obdecho_test failed on ${target}_osc"
14287 $LCTL get_param osc.$osc.import
14288 error "there is no osc.$osc.import target"
14291 run_test 180a "test obdecho on osc"
14294 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14295 remote_ost_nodsh && skip "remote OST with nodsh"
14297 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14298 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14299 error "failed to load module obdecho"
14301 local target=$(do_facet ost1 $LCTL dl |
14302 awk '/obdfilter/ { print $4; exit; }')
14304 if [ -n "$target" ]; then
14305 obdecho_test $target ost1 || error "obdecho_test failed with $?"
14307 do_facet ost1 $LCTL dl
14308 error "there is no obdfilter target on ost1"
14311 run_test 180b "test obdecho directly on obdfilter"
14313 test_180c() { # LU-2598
14314 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14315 remote_ost_nodsh && skip "remote OST with nodsh"
14316 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
14317 skip "Need MDS version at least 2.4.0"
14319 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14320 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14321 error "failed to load module obdecho"
14323 local target=$(do_facet ost1 $LCTL dl |
14324 awk '/obdfilter/ { print $4; exit; }')
14326 if [ -n "$target" ]; then
14327 local pages=16384 # 64MB bulk I/O RPC size
14329 obdecho_test "$target" ost1 "$pages" ||
14330 error "obdecho_test with pages=$pages failed with $?"
14332 do_facet ost1 $LCTL dl
14333 error "there is no obdfilter target on ost1"
14336 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
14338 test_181() { # bug 22177
14339 test_mkdir $DIR/$tdir
14340 # create enough files to index the directory
14341 createmany -o $DIR/$tdir/foobar 4000
14342 # print attributes for debug purpose
14345 multiop_bg_pause $DIR/$tdir D_Sc || return 1
14347 # remove the files & current working dir
14348 unlinkmany $DIR/$tdir/foobar 4000
14350 kill -USR1 $MULTIPID
14352 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
14355 run_test 181 "Test open-unlinked dir ========================"
14361 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14363 $LCTL set_param mdc.*.rpc_stats=clear
14365 for (( i = 0; i < $tcount; i++ )) ; do
14366 mkdir $DIR/$tdir/$i
14369 for (( i = 0; i < $tcount; i++ )) ; do
14370 createmany -o $DIR/$tdir/$i/f- $fcount &
14374 for (( i = 0; i < $tcount; i++ )) ; do
14375 unlinkmany $DIR/$tdir/$i/f- $fcount &
14379 $LCTL get_param mdc.*.rpc_stats
14383 run_test 182 "Test parallel modify metadata operations ================"
14385 test_183() { # LU-2275
14386 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14387 remote_mds_nodsh && skip "remote MDS with nodsh"
14388 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
14389 skip "Need MDS version at least 2.3.56"
14391 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14392 echo aaa > $DIR/$tdir/$tfile
14394 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
14395 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
14397 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
14398 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
14400 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
14402 # Flush negative dentry cache
14403 touch $DIR/$tdir/$tfile
14405 # We are not checking for any leaked references here, they'll
14406 # become evident next time we do cleanup with module unload.
14409 run_test 183 "No crash or request leak in case of strange dispositions ========"
14411 # test suite 184 is for LU-2016, LU-2017
14413 check_swap_layouts_support
14415 dir0=$DIR/$tdir/$testnum
14416 test_mkdir -p -c1 $dir0
14421 $SETSTRIPE -c1 $file1
14423 $SETSTRIPE -c2 $file2
14425 gen1=$($GETSTRIPE -g $file1)
14426 gen2=$($GETSTRIPE -g $file2)
14428 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
14429 gen=$($GETSTRIPE -g $file1)
14430 [[ $gen1 != $gen ]] ||
14431 "Layout generation on $file1 does not change"
14432 gen=$($GETSTRIPE -g $file2)
14433 [[ $gen2 != $gen ]] ||
14434 "Layout generation on $file2 does not change"
14436 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
14437 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
14439 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
14441 run_test 184a "Basic layout swap"
14444 check_swap_layouts_support
14446 dir0=$DIR/$tdir/$testnum
14447 mkdir -p $dir0 || error "creating dir $dir0"
14454 $SETSTRIPE -c1 $file1
14455 $SETSTRIPE -c2 $file2
14456 $SETSTRIPE -c1 $file3
14457 chown $RUNAS_ID $file3
14458 gen1=$($GETSTRIPE -g $file1)
14459 gen2=$($GETSTRIPE -g $file2)
14461 $LFS swap_layouts $dir1 $dir2 &&
14462 error "swap of directories layouts should fail"
14463 $LFS swap_layouts $dir1 $file1 &&
14464 error "swap of directory and file layouts should fail"
14465 $RUNAS $LFS swap_layouts $file1 $file2 &&
14466 error "swap of file we cannot write should fail"
14467 $LFS swap_layouts $file1 $file3 &&
14468 error "swap of file with different owner should fail"
14469 /bin/true # to clear error code
14471 run_test 184b "Forbidden layout swap (will generate errors)"
14474 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14475 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14476 check_swap_layouts_support
14478 local dir0=$DIR/$tdir/$testnum
14479 mkdir -p $dir0 || error "creating dir $dir0"
14481 local ref1=$dir0/ref1
14482 local ref2=$dir0/ref2
14483 local file1=$dir0/file1
14484 local file2=$dir0/file2
14485 # create a file large enough for the concurrent test
14486 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14487 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14488 echo "ref file size: ref1($(stat -c %s $ref1))," \
14489 "ref2($(stat -c %s $ref2))"
14492 dd if=$ref1 of=$file1 bs=16k &
14495 # Make sure dd starts to copy file
14496 while [ ! -f $file1 ]; do sleep 0.1; done
14498 $LFS swap_layouts $file1 $file2
14501 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14502 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14504 # how many bytes copied before swapping layout
14505 local copied=$(stat -c %s $file2)
14506 local remaining=$(stat -c %s $ref1)
14507 remaining=$((remaining - copied))
14508 echo "Copied $copied bytes before swapping layout..."
14510 cmp -n $copied $file1 $ref2 | grep differ &&
14511 error "Content mismatch [0, $copied) of ref2 and file1"
14512 cmp -n $copied $file2 $ref1 ||
14513 error "Content mismatch [0, $copied) of ref1 and file2"
14514 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14515 error "Content mismatch [$copied, EOF) of ref1 and file1"
14518 rm -f $ref1 $ref2 $file1 $file2
14520 run_test 184c "Concurrent write and layout swap"
14523 check_swap_layouts_support
14524 [ -z "$(which getfattr 2>/dev/null)" ] &&
14525 skip_env "no getfattr command"
14527 local file1=$DIR/$tdir/$tfile-1
14528 local file2=$DIR/$tdir/$tfile-2
14529 local file3=$DIR/$tdir/$tfile-3
14533 mkdir -p $DIR/$tdir
14534 touch $file1 || error "create $file1 failed"
14535 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14536 error "create $file2 failed"
14537 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14538 error "create $file3 failed"
14539 lovea1=$(get_layout_param $file1)
14541 $LFS swap_layouts $file2 $file3 ||
14542 error "swap $file2 $file3 layouts failed"
14543 $LFS swap_layouts $file1 $file2 ||
14544 error "swap $file1 $file2 layouts failed"
14546 lovea2=$(get_layout_param $file2)
14549 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14551 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14552 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14554 run_test 184d "allow stripeless layouts swap"
14557 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14558 skip "Need MDS version at least 2.6.94"
14559 check_swap_layouts_support
14560 [ -z "$(which getfattr 2>/dev/null)" ] &&
14561 skip_env "no getfattr command"
14563 local file1=$DIR/$tdir/$tfile-1
14564 local file2=$DIR/$tdir/$tfile-2
14565 local file3=$DIR/$tdir/$tfile-3
14568 mkdir -p $DIR/$tdir
14569 touch $file1 || error "create $file1 failed"
14570 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14571 error "create $file2 failed"
14572 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14573 error "create $file3 failed"
14575 $LFS swap_layouts $file1 $file2 ||
14576 error "swap $file1 $file2 layouts failed"
14578 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14579 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14581 echo 123 > $file1 || error "Should be able to write into $file1"
14583 $LFS swap_layouts $file1 $file3 ||
14584 error "swap $file1 $file3 layouts failed"
14586 echo 123 > $file1 || error "Should be able to write into $file1"
14588 rm -rf $file1 $file2 $file3
14590 run_test 184e "Recreate layout after stripeless layout swaps"
14593 # Create a file with name longer than sizeof(struct stat) ==
14594 # 144 to see if we can get chars from the file name to appear
14595 # in the returned striping. Note that 'f' == 0x66.
14596 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
14598 mkdir -p $DIR/$tdir
14599 mcreate $DIR/$tdir/$file
14600 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
14601 error "IOC_MDC_GETFILEINFO returned garbage striping"
14604 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
14606 test_185() { # LU-2441
14607 # LU-3553 - no volatile file support in old servers
14608 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
14609 skip "Need MDS version at least 2.3.60"
14611 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14612 touch $DIR/$tdir/spoo
14613 local mtime1=$(stat -c "%Y" $DIR/$tdir)
14614 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
14615 error "cannot create/write a volatile file"
14616 [ "$FILESET" == "" ] &&
14617 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
14618 error "FID is still valid after close"
14620 multiop_bg_pause $DIR/$tdir vVw4096_c
14627 # assume that the next FID for this client is sequential, since stdout
14628 # is unfortunately eaten by multiop_bg_pause
14629 local n=$((${fidv[1]} + 1))
14630 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
14631 if [ "$FILESET" == "" ]; then
14632 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
14633 error "FID is missing before close"
14635 kill -USR1 $multi_pid
14636 # 1 second delay, so if mtime change we will see it
14638 local mtime2=$(stat -c "%Y" $DIR/$tdir)
14639 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
14641 run_test 185 "Volatile file support"
14643 function create_check_volatile() {
14647 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
14650 local FID=$(cat /tmp/${tfile}.fid)
14651 [ "$FID" == "" ] && error "can't get FID for volatile"
14652 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
14653 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
14654 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
14658 cancel_lru_locks mdc # flush opencache
14659 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
14664 # LU-12516 - volatile creation via .lustre
14665 [[ $MDS1_VERSION -ge $(version_code 2.12.2) ]] ||
14666 skip "Need MDS version at least 2.12.2"
14668 create_check_volatile 0
14669 [ $MDSCOUNT -lt 2 ] && return 0
14672 create_check_volatile 1
14676 run_test 185a "Volatile file creation in .lustre/fid/"
14679 remote_mds_nodsh && skip "remote MDS with nodsh"
14680 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14681 skip "Need MDS version at least 2.3.0"
14683 local dir0=$DIR/$tdir/$testnum
14684 mkdir -p $dir0 || error "creating dir $dir0"
14686 local file=$dir0/file1
14687 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
14688 local dv1=$($LFS data_version $file)
14689 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
14690 local dv2=$($LFS data_version $file)
14691 [[ $dv1 != $dv2 ]] ||
14692 error "data version did not change on write $dv1 == $dv2"
14697 run_test 187a "Test data version change"
14700 remote_mds_nodsh && skip "remote MDS with nodsh"
14701 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14702 skip "Need MDS version at least 2.3.0"
14704 local dir0=$DIR/$tdir/$testnum
14705 mkdir -p $dir0 || error "creating dir $dir0"
14707 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
14708 [[ ${DV[0]} != ${DV[1]} ]] ||
14709 error "data version did not change on write"\
14710 " ${DV[0]} == ${DV[1]}"
14715 run_test 187b "Test data version change on volatile file"
14718 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14719 remote_mgs_nodsh && skip "remote MGS with nodsh"
14720 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
14722 local POOL=${POOL:-cea1}
14723 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
14724 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
14727 local last_ost=$(($OSTCOUNT - 1))
14729 local ost_list=$(seq $first_ost $ost_step $last_ost)
14730 local ost_range="$first_ost $last_ost $ost_step"
14731 local test_path=$POOL_ROOT/$POOL_DIR_NAME
14732 local file_dir=$POOL_ROOT/file_tst
14733 local subdir=$test_path/subdir
14737 # former test_200a test_200b
14738 pool_add $POOL || { rc=$? ; break; }
14739 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
14740 # former test_200c test_200d
14741 mkdir -p $test_path
14742 pool_set_dir $POOL $test_path || { rc=$? ; break; }
14743 pool_check_dir $POOL $test_path || { rc=$? ; break; }
14745 pool_check_dir $POOL $subdir || { rc=$? ; break; }
14746 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
14747 || { rc=$? ; break; }
14748 # former test_200e test_200f
14749 local files=$((OSTCOUNT*3))
14750 pool_alloc_files $POOL $test_path $files "$ost_list" \
14751 || { rc=$? ; break; }
14752 pool_create_files $POOL $file_dir $files "$ost_list" \
14753 || { rc=$? ; break; }
14754 # former test_200g test_200h
14755 pool_lfs_df $POOL || { rc=$? ; break; }
14756 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
14758 # former test_201a test_201b test_201c
14759 pool_remove_first_target $POOL || { rc=$? ; break; }
14761 local f=$test_path/$tfile
14762 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
14763 pool_remove $POOL $f || { rc=$? ; break; }
14771 run_test 200 "OST pools"
14773 # usage: default_attr <count | size | offset>
14775 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
14778 # usage: check_default_stripe_attr
14779 check_default_stripe_attr() {
14780 ACTUAL=$($GETSTRIPE $* $DIR/$tdir)
14783 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
14785 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
14789 error "unknown getstripe attr '$1'"
14792 [ $ACTUAL == $EXPECTED ] ||
14793 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
14797 test_mkdir $DIR/$tdir
14798 $SETSTRIPE --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
14800 check_default_stripe_attr --stripe-count
14801 check_default_stripe_attr --stripe-size
14802 check_default_stripe_attr --stripe-index
14804 run_test 204a "Print default stripe attributes"
14807 test_mkdir $DIR/$tdir
14808 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14810 check_default_stripe_attr --stripe-size
14811 check_default_stripe_attr --stripe-index
14813 run_test 204b "Print default stripe size and offset"
14816 test_mkdir $DIR/$tdir
14817 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14819 check_default_stripe_attr --stripe-count
14820 check_default_stripe_attr --stripe-index
14822 run_test 204c "Print default stripe count and offset"
14825 test_mkdir $DIR/$tdir
14826 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14828 check_default_stripe_attr --stripe-count
14829 check_default_stripe_attr --stripe-size
14831 run_test 204d "Print default stripe count and size"
14834 test_mkdir $DIR/$tdir
14835 $SETSTRIPE -d $DIR/$tdir
14837 check_default_stripe_attr --stripe-count --raw
14838 check_default_stripe_attr --stripe-size --raw
14839 check_default_stripe_attr --stripe-index --raw
14841 run_test 204e "Print raw stripe attributes"
14844 test_mkdir $DIR/$tdir
14845 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14847 check_default_stripe_attr --stripe-size --raw
14848 check_default_stripe_attr --stripe-index --raw
14850 run_test 204f "Print raw stripe size and offset"
14853 test_mkdir $DIR/$tdir
14854 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14856 check_default_stripe_attr --stripe-count --raw
14857 check_default_stripe_attr --stripe-index --raw
14859 run_test 204g "Print raw stripe count and offset"
14862 test_mkdir $DIR/$tdir
14863 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14865 check_default_stripe_attr --stripe-count --raw
14866 check_default_stripe_attr --stripe-size --raw
14868 run_test 204h "Print raw stripe count and size"
14870 # Figure out which job scheduler is being used, if any,
14871 # or use a fake one
14872 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
14873 JOBENV=SLURM_JOB_ID
14874 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
14876 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
14878 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
14879 JOBENV=LOADL_STEP_ID
14880 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
14883 $LCTL list_param jobid_name > /dev/null 2>&1
14884 if [ $? -eq 0 ]; then
14890 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
14892 verify_jobstats() {
14897 # we don't really need to clear the stats for this test to work, since each
14898 # command has a unique jobid, but it makes debugging easier if needed.
14899 # for facet in $facets; do
14900 # local dev=$(convert_facet2label $facet)
14901 # # clear old jobstats
14902 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
14905 # use a new JobID for each test, or we might see an old one
14906 [ "$JOBENV" = "FAKE_JOBID" ] &&
14907 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
14909 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
14911 [ "$JOBENV" = "nodelocal" ] && {
14912 FAKE_JOBID=id.$testnum.%e.$RANDOM
14913 $LCTL set_param jobid_name=$FAKE_JOBID
14914 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
14917 log "Test: ${cmd[*]}"
14918 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
14920 if [ $JOBENV = "FAKE_JOBID" ]; then
14921 FAKE_JOBID=$JOBVAL ${cmd[*]}
14926 # all files are created on OST0000
14927 for facet in $facets; do
14928 local stats="*.$(convert_facet2label $facet).job_stats"
14930 # strip out libtool wrappers for in-tree executables
14931 if [ $(do_facet $facet lctl get_param $stats |
14932 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
14933 do_facet $facet lctl get_param $stats
14934 error "No jobstats for $JOBVAL found on $facet::$stats"
14940 local new_jobenv=$1
14942 set_persistent_param_and_check client "jobid_var" \
14943 "$FSNAME.sys.jobid_var" $new_jobenv
14946 test_205a() { # Job stats
14947 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14948 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
14949 skip "Need MDS version with at least 2.7.1"
14950 remote_mgs_nodsh && skip "remote MGS with nodsh"
14951 remote_mds_nodsh && skip "remote MDS with nodsh"
14952 remote_ost_nodsh && skip "remote OST with nodsh"
14953 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
14954 skip "Server doesn't support jobstats"
14955 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
14957 local old_jobenv=$($LCTL get_param -n jobid_var)
14958 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
14960 if [[ $PERM_CMD = *"set_param -P"* ]]; then
14961 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
14963 stack_trap "do_facet mgs $PERM_CMD \
14964 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
14968 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
14969 mdt.*.job_cleanup_interval | head -n 1)
14970 local new_interval=5
14971 do_facet $SINGLEMDS \
14972 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
14973 stack_trap "do_facet $SINGLEMDS \
14974 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
14975 local start=$SECONDS
14979 cmd="mkdir $DIR/$tdir"
14980 verify_jobstats "$cmd" "$SINGLEMDS"
14982 cmd="rmdir $DIR/$tdir"
14983 verify_jobstats "$cmd" "$SINGLEMDS"
14984 # mkdir on secondary MDT
14985 if [ $MDSCOUNT -gt 1 ]; then
14986 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
14987 verify_jobstats "$cmd" "mds2"
14990 cmd="mknod $DIR/$tfile c 1 3"
14991 verify_jobstats "$cmd" "$SINGLEMDS"
14993 cmd="rm -f $DIR/$tfile"
14994 verify_jobstats "$cmd" "$SINGLEMDS"
14995 # create all files on OST0000 so verify_jobstats can find OST stats
14997 cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile"
14998 verify_jobstats "$cmd" "$SINGLEMDS"
15000 cmd="touch $DIR/$tfile"
15001 verify_jobstats "$cmd" "$SINGLEMDS ost1"
15003 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
15004 verify_jobstats "$cmd" "ost1"
15006 cancel_lru_locks osc
15007 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
15008 verify_jobstats "$cmd" "ost1"
15010 cmd="$TRUNCATE $DIR/$tfile 0"
15011 verify_jobstats "$cmd" "$SINGLEMDS ost1"
15013 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
15014 verify_jobstats "$cmd" "$SINGLEMDS"
15015 # jobstats expiry - sleep until old stats should be expired
15016 local left=$((new_interval + 5 - (SECONDS - start)))
15017 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
15018 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
15020 cmd="mkdir $DIR/$tdir.expire"
15021 verify_jobstats "$cmd" "$SINGLEMDS"
15022 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
15023 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
15025 # Ensure that jobid are present in changelog (if supported by MDS)
15026 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
15027 changelog_dump | tail -10
15028 jobids=$(changelog_dump | tail -9 | grep -c "j=")
15029 [ $jobids -eq 9 ] ||
15030 error "Wrong changelog jobid count $jobids != 9"
15034 jobstats_set $JOBENV
15036 changelog_dump | grep $tfile
15037 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
15038 [ $jobids -eq 0 ] ||
15039 error "Unexpected jobids when jobid_var=$JOBENV"
15042 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
15043 JOBENV="JOBCOMPLEX"
15044 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
15046 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
15048 run_test 205a "Verify job stats"
15052 $LCTL set_param jobid_var=USER jobid_name="%e.%u"
15053 env -i USERTESTJOBSTATS=foolish touch $DIR/$tfile.1
15054 do_facet $SINGLEMDS $LCTL get_param mdt.*.job_stats |
15055 grep job_id: | grep foolish &&
15056 error "Unexpected jobid found"
15059 run_test 205b "Verify job stats jobid parsing"
15061 # LU-1480, LU-1773 and LU-1657
15063 mkdir -p $DIR/$tdir
15064 $SETSTRIPE -c -1 $DIR/$tdir
15065 #define OBD_FAIL_LOV_INIT 0x1403
15066 $LCTL set_param fail_loc=0xa0001403
15067 $LCTL set_param fail_val=1
15068 touch $DIR/$tdir/$tfile || true
15070 run_test 206 "fail lov_init_raid0() doesn't lbug"
15073 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15074 local fsz=`stat -c %s $DIR/$tfile`
15075 cancel_lru_locks mdc
15077 # do not return layout in getattr intent
15078 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
15079 $LCTL set_param fail_loc=0x170
15080 local sz=`stat -c %s $DIR/$tfile`
15082 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
15086 run_test 207a "can refresh layout at glimpse"
15089 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15090 local cksum=`md5sum $DIR/$tfile`
15091 local fsz=`stat -c %s $DIR/$tfile`
15092 cancel_lru_locks mdc
15093 cancel_lru_locks osc
15095 # do not return layout in getattr intent
15096 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
15097 $LCTL set_param fail_loc=0x171
15099 # it will refresh layout after the file is opened but before read issues
15100 echo checksum is "$cksum"
15101 echo "$cksum" |md5sum -c --quiet || error "file differs"
15105 run_test 207b "can refresh layout at open"
15108 # FIXME: in this test suite, only RD lease is used. This is okay
15109 # for now as only exclusive open is supported. After generic lease
15110 # is done, this test suite should be revised. - Jinshan
15112 remote_mds_nodsh && skip "remote MDS with nodsh"
15113 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
15114 skip "Need MDS version at least 2.4.52"
15116 echo "==== test 1: verify get lease work"
15117 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
15119 echo "==== test 2: verify lease can be broken by upcoming open"
15120 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15124 $MULTIOP $DIR/$tfile oO_RDONLY:c
15125 kill -USR1 $PID && wait $PID || error "break lease error"
15127 echo "==== test 3: verify lease can't be granted if an open already exists"
15128 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
15132 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
15133 kill -USR1 $PID && wait $PID || error "open file error"
15135 echo "==== test 4: lease can sustain over recovery"
15136 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
15142 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
15144 echo "==== test 5: lease broken can't be regained by replay"
15145 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15149 # open file to break lease and then recovery
15150 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
15153 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
15157 run_test 208 "Exclusive open"
15160 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
15161 skip_env "must have disp_stripe"
15164 sync; sleep 5; sync;
15166 echo 3 > /proc/sys/vm/drop_caches
15167 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15169 # open/close 500 times
15170 for i in $(seq 500); do
15174 echo 3 > /proc/sys/vm/drop_caches
15175 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15177 echo "before: $req_before, after: $req_after"
15178 [ $((req_after - req_before)) -ge 300 ] &&
15179 error "open/close requests are not freed"
15182 run_test 209 "read-only open/close requests should be freed promptly"
15186 size=$((size % 8192 + 1))
15187 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
15188 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
15189 rm -f $DIR/f212 $DIR/f212.xyz
15191 run_test 212 "Sendfile test ============================================"
15194 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
15195 cancel_lru_locks osc
15196 lctl set_param fail_loc=0x8000040f
15197 # generate a read lock
15198 cat $DIR/$tfile > /dev/null
15199 # write to the file, it will try to cancel the above read lock.
15200 cat /etc/hosts >> $DIR/$tfile
15202 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
15204 test_214() { # for bug 20133
15205 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
15206 for (( i=0; i < 340; i++ )) ; do
15207 touch $DIR/$tdir/d214c/a$i
15210 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
15211 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
15212 ls $DIR/d214c || error "ls $DIR/d214c failed"
15213 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
15214 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
15216 run_test 214 "hash-indexed directory test - bug 20133"
15218 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
15219 create_lnet_proc_files() {
15220 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
15223 # counterpart of create_lnet_proc_files
15224 remove_lnet_proc_files() {
15225 rm -f $TMP/lnet_$1.sys
15228 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15229 # 3rd arg as regexp for body
15230 check_lnet_proc_stats() {
15231 local l=$(cat "$TMP/lnet_$1" |wc -l)
15232 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
15234 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
15237 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15238 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
15239 # optional and can be regexp for 2nd line (lnet.routes case)
15240 check_lnet_proc_entry() {
15241 local blp=2 # blp stands for 'position of 1st line of body'
15242 [ -z "$5" ] || blp=3 # lnet.routes case
15244 local l=$(cat "$TMP/lnet_$1" |wc -l)
15245 # subtracting one from $blp because the body can be empty
15246 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
15248 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
15249 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
15251 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
15252 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
15254 # bail out if any unexpected line happened
15255 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
15256 [ "$?" != 0 ] || error "$2 misformatted"
15259 test_215() { # for bugs 18102, 21079, 21517
15260 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15262 local N='(0|[1-9][0-9]*)' # non-negative numeric
15263 local P='[1-9][0-9]*' # positive numeric
15264 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
15265 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
15266 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
15267 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
15269 local L1 # regexp for 1st line
15270 local L2 # regexp for 2nd line (optional)
15271 local BR # regexp for the rest (body)
15273 # lnet.stats should look as 11 space-separated non-negative numerics
15274 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
15275 create_lnet_proc_files "stats"
15276 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
15277 remove_lnet_proc_files "stats"
15279 # lnet.routes should look like this:
15280 # Routing disabled/enabled
15281 # net hops priority state router
15282 # where net is a string like tcp0, hops > 0, priority >= 0,
15283 # state is up/down,
15284 # router is a string like 192.168.1.1@tcp2
15285 L1="^Routing (disabled|enabled)$"
15286 L2="^net +hops +priority +state +router$"
15287 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
15288 create_lnet_proc_files "routes"
15289 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
15290 remove_lnet_proc_files "routes"
15292 # lnet.routers should look like this:
15293 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
15294 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
15295 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
15296 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
15297 L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
15298 BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
15299 create_lnet_proc_files "routers"
15300 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
15301 remove_lnet_proc_files "routers"
15303 # lnet.peers should look like this:
15304 # nid refs state last max rtr min tx min queue
15305 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
15306 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
15307 # numeric (0 or >0 or <0), queue >= 0.
15308 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
15309 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
15310 create_lnet_proc_files "peers"
15311 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
15312 remove_lnet_proc_files "peers"
15314 # lnet.buffers should look like this:
15315 # pages count credits min
15316 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
15317 L1="^pages +count +credits +min$"
15318 BR="^ +$N +$N +$I +$I$"
15319 create_lnet_proc_files "buffers"
15320 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
15321 remove_lnet_proc_files "buffers"
15323 # lnet.nis should look like this:
15324 # nid status alive refs peer rtr max tx min
15325 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
15326 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
15327 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
15328 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
15329 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
15330 create_lnet_proc_files "nis"
15331 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
15332 remove_lnet_proc_files "nis"
15334 # can we successfully write to lnet.stats?
15335 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
15337 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
15339 test_216() { # bug 20317
15340 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15341 remote_ost_nodsh && skip "remote OST with nodsh"
15344 local facets=$(get_facets OST)
15345 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15347 save_lustre_params client "osc.*.contention_seconds" > $p
15348 save_lustre_params $facets \
15349 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
15350 save_lustre_params $facets \
15351 "ldlm.namespaces.filter-*.contended_locks" >> $p
15352 save_lustre_params $facets \
15353 "ldlm.namespaces.filter-*.contention_seconds" >> $p
15354 clear_stats osc.*.osc_stats
15356 # agressive lockless i/o settings
15357 do_nodes $(comma_list $(osts_nodes)) \
15358 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
15359 ldlm.namespaces.filter-*.contended_locks=0 \
15360 ldlm.namespaces.filter-*.contention_seconds=60"
15361 lctl set_param -n osc.*.contention_seconds=60
15363 $DIRECTIO write $DIR/$tfile 0 10 4096
15364 $CHECKSTAT -s 40960 $DIR/$tfile
15366 # disable lockless i/o
15367 do_nodes $(comma_list $(osts_nodes)) \
15368 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
15369 ldlm.namespaces.filter-*.contended_locks=32 \
15370 ldlm.namespaces.filter-*.contention_seconds=0"
15371 lctl set_param -n osc.*.contention_seconds=0
15372 clear_stats osc.*.osc_stats
15374 dd if=/dev/zero of=$DIR/$tfile count=0
15375 $CHECKSTAT -s 0 $DIR/$tfile
15377 restore_lustre_params <$p
15381 run_test 216 "check lockless direct write updates file size and kms correctly"
15383 test_217() { # bug 22430
15384 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15389 for node in $(nodes_list); do
15390 nid=$(host_nids_address $node $NETTYPE)
15391 if [[ $nid = *-* ]] ; then
15392 echo "lctl ping $(h2nettype $nid)"
15393 lctl ping $(h2nettype $nid)
15395 echo "skipping $node (no hyphen detected)"
15399 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
15402 # do directio so as not to populate the page cache
15403 log "creating a 10 Mb file"
15404 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
15405 log "starting reads"
15406 dd if=$DIR/$tfile of=/dev/null bs=4096 &
15407 log "truncating the file"
15408 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
15410 kill %+ || true # reads might have finished
15411 echo "wait until dd is finished"
15413 log "removing the temporary file"
15414 rm -rf $DIR/$tfile || error "tmp file removal failed"
15416 run_test 218 "parallel read and truncate should not deadlock"
15419 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15421 # write one partial page
15422 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
15423 # set no grant so vvp_io_commit_write will do sync write
15424 $LCTL set_param fail_loc=0x411
15425 # write a full page at the end of file
15426 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
15428 $LCTL set_param fail_loc=0
15429 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
15430 $LCTL set_param fail_loc=0x411
15431 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
15434 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
15435 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
15437 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
15439 test_220() { #LU-325
15440 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15441 remote_ost_nodsh && skip "remote OST with nodsh"
15442 remote_mds_nodsh && skip "remote MDS with nodsh"
15443 remote_mgs_nodsh && skip "remote MGS with nodsh"
15447 # create on MDT0000 so the last_id and next_id are correct
15449 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
15453 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
15454 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
15455 osp.$mdtosc_proc1.prealloc_last_id)
15456 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15457 osp.$mdtosc_proc1.prealloc_next_id)
15461 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15462 #define OBD_FAIL_OST_ENOINO 0x229
15463 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15464 create_pool $FSNAME.$TESTNAME || return 1
15465 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15467 $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15469 MDSOBJS=$((last_id - next_id))
15470 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15472 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15473 echo "OST still has $count kbytes free"
15475 echo "create $MDSOBJS files @next_id..."
15476 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15478 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15479 osp.$mdtosc_proc1.prealloc_last_id)
15480 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15481 osp.$mdtosc_proc1.prealloc_next_id)
15483 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15488 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15489 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15491 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15492 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15493 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15494 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15495 echo "unlink $MDSOBJS files @$next_id..."
15496 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15498 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15501 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15503 dd if=`which date` of=$MOUNT/date oflag=sync
15504 chmod +x $MOUNT/date
15506 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15507 $LCTL set_param fail_loc=0x80001401
15509 $MOUNT/date > /dev/null
15512 run_test 221 "make sure fault and truncate race to not cause OOM"
15515 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15518 test_mkdir $DIR/$tdir
15519 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15520 createmany -o $DIR/$tdir/$tfile 10
15521 cancel_lru_locks mdc
15522 cancel_lru_locks osc
15523 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15524 $LCTL set_param fail_loc=0x31a
15525 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15526 $LCTL set_param fail_loc=0
15529 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15532 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15535 test_mkdir $DIR/$tdir
15536 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15537 createmany -o $DIR/$tdir/$tfile 10
15538 cancel_lru_locks mdc
15539 cancel_lru_locks osc
15540 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15541 $LCTL set_param fail_loc=0x31a
15542 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15543 $LCTL set_param fail_loc=0
15545 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15548 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15551 test_mkdir $DIR/$tdir
15552 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15553 createmany -o $DIR/$tdir/$tfile 10
15554 cancel_lru_locks mdc
15555 cancel_lru_locks osc
15556 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15557 $LCTL set_param fail_loc=0x31b
15558 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15559 $LCTL set_param fail_loc=0
15562 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15564 test_224a() { # LU-1039, MRP-303
15565 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15567 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15568 $LCTL set_param fail_loc=0x508
15569 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15570 $LCTL set_param fail_loc=0
15573 run_test 224a "Don't panic on bulk IO failure"
15575 test_224b() { # LU-1039, MRP-303
15576 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15578 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15579 cancel_lru_locks osc
15580 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15581 $LCTL set_param fail_loc=0x515
15582 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15583 $LCTL set_param fail_loc=0
15586 run_test 224b "Don't panic on bulk IO failure"
15588 test_224c() { # LU-6441
15589 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15590 remote_mds_nodsh && skip "remote MDS with nodsh"
15592 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15593 save_writethrough $p
15594 set_cache writethrough on
15596 local pages_per_rpc=$($LCTL get_param \
15597 osc.*.max_pages_per_rpc)
15598 local at_max=$($LCTL get_param -n at_max)
15599 local timeout=$($LCTL get_param -n timeout)
15600 local test_at="at_max"
15601 local param_at="$FSNAME.sys.at_max"
15602 local test_timeout="timeout"
15603 local param_timeout="$FSNAME.sys.timeout"
15605 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
15607 set_persistent_param_and_check client "$test_at" "$param_at" 0
15608 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
15610 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
15611 do_facet ost1 $LCTL set_param fail_loc=0x520
15612 $LFS setstripe -c 1 -i 0 $DIR/$tfile
15613 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
15615 do_facet ost1 $LCTL set_param fail_loc=0
15617 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
15618 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
15621 $LCTL set_param -n $pages_per_rpc
15622 restore_lustre_params < $p
15625 run_test 224c "Don't hang if one of md lost during large bulk RPC"
15627 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
15629 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15630 if [ -z ${MDSSURVEY} ]; then
15631 skip_env "mds-survey not found"
15633 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15634 skip "Need MDS version at least 2.2.51"
15636 local mds=$(facet_host $SINGLEMDS)
15637 local target=$(do_nodes $mds 'lctl dl' |
15638 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15640 local cmd1="file_count=1000 thrhi=4"
15641 local cmd2="dir_count=2 layer=mdd stripe_count=0"
15642 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15643 local cmd="$cmd1 $cmd2 $cmd3"
15645 rm -f ${TMP}/mds_survey*
15647 eval $cmd || error "mds-survey with zero-stripe failed"
15648 cat ${TMP}/mds_survey*
15649 rm -f ${TMP}/mds_survey*
15651 run_test 225a "Metadata survey sanity with zero-stripe"
15654 if [ -z ${MDSSURVEY} ]; then
15655 skip_env "mds-survey not found"
15657 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15658 skip "Need MDS version at least 2.2.51"
15659 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15660 remote_mds_nodsh && skip "remote MDS with nodsh"
15661 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
15662 skip_env "Need to mount OST to test"
15665 local mds=$(facet_host $SINGLEMDS)
15666 local target=$(do_nodes $mds 'lctl dl' |
15667 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15669 local cmd1="file_count=1000 thrhi=4"
15670 local cmd2="dir_count=2 layer=mdd stripe_count=1"
15671 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15672 local cmd="$cmd1 $cmd2 $cmd3"
15674 rm -f ${TMP}/mds_survey*
15676 eval $cmd || error "mds-survey with stripe_count failed"
15677 cat ${TMP}/mds_survey*
15678 rm -f ${TMP}/mds_survey*
15680 run_test 225b "Metadata survey sanity with stripe_count = 1"
15682 mcreate_path2fid () {
15688 local path=$DIR/$tdir/$name
15693 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
15694 error "cannot create $desc"
15696 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
15698 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
15700 fid_path=$($LFS fid2path $MOUNT $fid)
15702 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
15704 [ "$path" == "$fid_path" ] ||
15705 error "fid2path returned $fid_path, expected $path"
15707 echo "pass with $path and $fid"
15712 mkdir -p $DIR/$tdir
15714 mcreate_path2fid 0010666 0 0 fifo "FIFO"
15715 mcreate_path2fid 0020666 1 3 null "character special file (null)"
15716 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
15717 mcreate_path2fid 0040666 0 0 dir "directory"
15718 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
15719 mcreate_path2fid 0100666 0 0 file "regular file"
15720 mcreate_path2fid 0120666 0 0 link "symbolic link"
15721 mcreate_path2fid 0140666 0 0 sock "socket"
15723 run_test 226a "call path2fid and fid2path on files of all type"
15726 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15731 mkdir -p $DIR/$tdir
15732 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
15733 error "create remote directory failed"
15734 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
15735 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
15736 "character special file (null)"
15737 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
15738 "character special file (no device)"
15739 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
15740 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
15741 "block special file (loop)"
15742 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
15743 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
15744 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
15746 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
15748 # LU-1299 Executing or running ldd on a truncated executable does not
15749 # cause an out-of-memory condition.
15751 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15752 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
15754 dd if=$(which date) of=$MOUNT/date bs=1k count=1
15755 chmod +x $MOUNT/date
15757 $MOUNT/date > /dev/null
15758 ldd $MOUNT/date > /dev/null
15761 run_test 227 "running truncated executable does not cause OOM"
15763 # LU-1512 try to reuse idle OI blocks
15765 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15766 remote_mds_nodsh && skip "remote MDS with nodsh"
15767 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15769 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15770 local myDIR=$DIR/$tdir
15773 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15774 $LCTL set_param fail_loc=0x80001002
15775 createmany -o $myDIR/t- 10000
15776 $LCTL set_param fail_loc=0
15777 # The guard is current the largest FID holder
15779 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15781 local IDX=$(($SEQ % 64))
15783 do_facet $SINGLEMDS sync
15784 # Make sure journal flushed.
15786 local blk1=$(do_facet $SINGLEMDS \
15787 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15788 grep Blockcount | awk '{print $4}')
15790 # Remove old files, some OI blocks will become idle.
15791 unlinkmany $myDIR/t- 10000
15792 # Create new files, idle OI blocks should be reused.
15793 createmany -o $myDIR/t- 2000
15794 do_facet $SINGLEMDS sync
15795 # Make sure journal flushed.
15797 local blk2=$(do_facet $SINGLEMDS \
15798 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15799 grep Blockcount | awk '{print $4}')
15801 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15803 run_test 228a "try to reuse idle OI blocks"
15806 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15807 remote_mds_nodsh && skip "remote MDS with nodsh"
15808 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15810 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15811 local myDIR=$DIR/$tdir
15814 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15815 $LCTL set_param fail_loc=0x80001002
15816 createmany -o $myDIR/t- 10000
15817 $LCTL set_param fail_loc=0
15818 # The guard is current the largest FID holder
15820 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15822 local IDX=$(($SEQ % 64))
15824 do_facet $SINGLEMDS sync
15825 # Make sure journal flushed.
15827 local blk1=$(do_facet $SINGLEMDS \
15828 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15829 grep Blockcount | awk '{print $4}')
15831 # Remove old files, some OI blocks will become idle.
15832 unlinkmany $myDIR/t- 10000
15835 stop $SINGLEMDS || error "Fail to stop MDT."
15837 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
15839 df $MOUNT || error "Fail to df."
15840 # Create new files, idle OI blocks should be reused.
15841 createmany -o $myDIR/t- 2000
15842 do_facet $SINGLEMDS sync
15843 # Make sure journal flushed.
15845 local blk2=$(do_facet $SINGLEMDS \
15846 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15847 grep Blockcount | awk '{print $4}')
15849 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15851 run_test 228b "idle OI blocks can be reused after MDT restart"
15855 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15856 remote_mds_nodsh && skip "remote MDS with nodsh"
15857 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15859 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15860 local myDIR=$DIR/$tdir
15863 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15864 $LCTL set_param fail_loc=0x80001002
15865 # 20000 files can guarantee there are index nodes in the OI file
15866 createmany -o $myDIR/t- 20000
15867 $LCTL set_param fail_loc=0
15868 # The guard is current the largest FID holder
15870 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15872 local IDX=$(($SEQ % 64))
15874 do_facet $SINGLEMDS sync
15875 # Make sure journal flushed.
15877 local blk1=$(do_facet $SINGLEMDS \
15878 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15879 grep Blockcount | awk '{print $4}')
15881 # Remove old files, some OI blocks will become idle.
15882 unlinkmany $myDIR/t- 20000
15884 # The OI file should become empty now
15886 # Create new files, idle OI blocks should be reused.
15887 createmany -o $myDIR/t- 2000
15888 do_facet $SINGLEMDS sync
15889 # Make sure journal flushed.
15891 local blk2=$(do_facet $SINGLEMDS \
15892 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15893 grep Blockcount | awk '{print $4}')
15895 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15897 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
15899 test_229() { # LU-2482, LU-3448
15900 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15901 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
15902 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
15903 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
15907 # Create a file with a released layout and stripe count 2.
15908 $MULTIOP $DIR/$tfile H2c ||
15909 error "failed to create file with released layout"
15911 $GETSTRIPE -v $DIR/$tfile
15913 local pattern=$($GETSTRIPE -L $DIR/$tfile)
15914 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
15916 local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
15917 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
15918 stat $DIR/$tfile || error "failed to stat released file"
15920 chown $RUNAS_ID $DIR/$tfile ||
15921 error "chown $RUNAS_ID $DIR/$tfile failed"
15923 chgrp $RUNAS_ID $DIR/$tfile ||
15924 error "chgrp $RUNAS_ID $DIR/$tfile failed"
15926 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
15927 rm $DIR/$tfile || error "failed to remove released file"
15929 run_test 229 "getstripe/stat/rm/attr changes work on released files"
15932 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15933 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15934 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15935 skip "Need MDS version at least 2.11.52"
15939 test_mkdir $DIR/$tdir
15940 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
15941 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
15942 [ $mdt_idx -ne 0 ] &&
15943 error "create local directory on wrong MDT $mdt_idx"
15945 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
15946 error "create remote directory failed"
15947 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
15948 [ $mdt_idx -ne $MDTIDX ] &&
15949 error "create remote directory on wrong MDT $mdt_idx"
15951 createmany -o $DIR/$tdir/test_230/t- 10 ||
15952 error "create files on remote directory failed"
15953 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
15954 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
15955 rm -r $DIR/$tdir || error "unlink remote directory failed"
15957 run_test 230a "Create remote directory and files under the remote directory"
15960 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15961 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15962 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15963 skip "Need MDS version at least 2.11.52"
15971 local migrate_dir=$DIR/$tdir/migrate_dir
15972 local other_dir=$DIR/$tdir/other_dir
15974 test_mkdir $DIR/$tdir
15975 test_mkdir -i0 -c1 $migrate_dir
15976 test_mkdir -i0 -c1 $other_dir
15977 for ((i=0; i<10; i++)); do
15978 mkdir -p $migrate_dir/dir_${i}
15979 createmany -o $migrate_dir/dir_${i}/f 10 ||
15980 error "create files under remote dir failed $i"
15983 cp /etc/passwd $migrate_dir/$tfile
15984 cp /etc/passwd $other_dir/$tfile
15985 chattr +SAD $migrate_dir
15986 chattr +SAD $migrate_dir/$tfile
15988 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15989 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15990 local old_dir_mode=$(stat -c%f $migrate_dir)
15991 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
15993 mkdir -p $migrate_dir/dir_default_stripe2
15994 $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2
15995 $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2
15997 mkdir -p $other_dir
15998 ln $migrate_dir/$tfile $other_dir/luna
15999 ln $migrate_dir/$tfile $migrate_dir/sofia
16000 ln $other_dir/$tfile $migrate_dir/david
16001 ln -s $migrate_dir/$tfile $other_dir/zachary
16002 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
16003 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
16009 for len in 58 59 60; do
16010 lnktgt=$(str_repeat 'l' $len)
16011 touch $migrate_dir/$lnktgt
16012 ln -s $lnktgt $migrate_dir/${len}char_ln
16016 for len in 4094 4095; do
16017 lnktgt=$(str_repeat 'l' $len)
16018 ln -s $lnktgt $migrate_dir/${len}char_ln
16022 for len in 254 255; do
16023 touch $migrate_dir/$(str_repeat 'l' $len)
16026 $LFS migrate -m $MDTIDX $migrate_dir ||
16027 error "fails on migrating remote dir to MDT1"
16029 echo "migratate to MDT1, then checking.."
16030 for ((i = 0; i < 10; i++)); do
16031 for file in $(find $migrate_dir/dir_${i}); do
16032 mdt_index=$($LFS getstripe -m $file)
16033 # broken symlink getstripe will fail
16034 [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
16035 error "$file is not on MDT${MDTIDX}"
16039 # the multiple link file should still in MDT0
16040 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
16041 [ $mdt_index == 0 ] ||
16042 error "$file is not on MDT${MDTIDX}"
16044 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16045 [ "$old_dir_flag" = "$new_dir_flag" ] ||
16046 error " expect $old_dir_flag get $new_dir_flag"
16048 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16049 [ "$old_file_flag" = "$new_file_flag" ] ||
16050 error " expect $old_file_flag get $new_file_flag"
16052 local new_dir_mode=$(stat -c%f $migrate_dir)
16053 [ "$old_dir_mode" = "$new_dir_mode" ] ||
16054 error "expect mode $old_dir_mode get $new_dir_mode"
16056 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
16057 [ "$old_file_mode" = "$new_file_mode" ] ||
16058 error "expect mode $old_file_mode get $new_file_mode"
16060 diff /etc/passwd $migrate_dir/$tfile ||
16061 error "$tfile different after migration"
16063 diff /etc/passwd $other_dir/luna ||
16064 error "luna different after migration"
16066 diff /etc/passwd $migrate_dir/sofia ||
16067 error "sofia different after migration"
16069 diff /etc/passwd $migrate_dir/david ||
16070 error "david different after migration"
16072 diff /etc/passwd $other_dir/zachary ||
16073 error "zachary different after migration"
16075 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16076 error "${tfile}_ln different after migration"
16078 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16079 error "${tfile}_ln_other different after migration"
16081 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
16082 [ $stripe_count = 2 ] ||
16083 error "dir strpe_count $d != 2 after migration."
16085 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
16086 [ $stripe_count = 2 ] ||
16087 error "file strpe_count $d != 2 after migration."
16089 #migrate back to MDT0
16092 $LFS migrate -m $MDTIDX $migrate_dir ||
16093 error "fails on migrating remote dir to MDT0"
16095 echo "migrate back to MDT0, checking.."
16096 for file in $(find $migrate_dir); do
16097 mdt_index=$($LFS getstripe -m $file)
16098 [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
16099 error "$file is not on MDT${MDTIDX}"
16102 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16103 [ "$old_dir_flag" = "$new_dir_flag" ] ||
16104 error " expect $old_dir_flag get $new_dir_flag"
16106 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16107 [ "$old_file_flag" = "$new_file_flag" ] ||
16108 error " expect $old_file_flag get $new_file_flag"
16110 local new_dir_mode=$(stat -c%f $migrate_dir)
16111 [ "$old_dir_mode" = "$new_dir_mode" ] ||
16112 error "expect mode $old_dir_mode get $new_dir_mode"
16114 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
16115 [ "$old_file_mode" = "$new_file_mode" ] ||
16116 error "expect mode $old_file_mode get $new_file_mode"
16118 diff /etc/passwd ${migrate_dir}/$tfile ||
16119 error "$tfile different after migration"
16121 diff /etc/passwd ${other_dir}/luna ||
16122 error "luna different after migration"
16124 diff /etc/passwd ${migrate_dir}/sofia ||
16125 error "sofia different after migration"
16127 diff /etc/passwd ${other_dir}/zachary ||
16128 error "zachary different after migration"
16130 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16131 error "${tfile}_ln different after migration"
16133 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16134 error "${tfile}_ln_other different after migration"
16136 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
16137 [ $stripe_count = 2 ] ||
16138 error "dir strpe_count $d != 2 after migration."
16140 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
16141 [ $stripe_count = 2 ] ||
16142 error "file strpe_count $d != 2 after migration."
16144 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16146 run_test 230b "migrate directory"
16149 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16150 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16151 remote_mds_nodsh && skip "remote MDS with nodsh"
16152 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16153 skip "Need MDS version at least 2.11.52"
16159 local migrate_dir=$DIR/$tdir/migrate_dir
16161 #If migrating directory fails in the middle, all entries of
16162 #the directory is still accessiable.
16163 test_mkdir $DIR/$tdir
16164 test_mkdir -i0 -c1 $migrate_dir
16165 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
16167 createmany -o $migrate_dir/f $total ||
16168 error "create files under ${migrate_dir} failed"
16170 # fail after migrating top dir, and this will fail only once, so the
16171 # first sub file migration will fail (currently f3), others succeed.
16172 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
16173 do_facet mds1 lctl set_param fail_loc=0x1801
16174 local t=$(ls $migrate_dir | wc -l)
16175 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
16176 error "migrate should fail"
16177 local u=$(ls $migrate_dir | wc -l)
16178 [ "$u" == "$t" ] || error "$u != $t during migration"
16180 # add new dir/file should succeed
16181 mkdir $migrate_dir/dir ||
16182 error "mkdir failed under migrating directory"
16183 touch $migrate_dir/file ||
16184 error "create file failed under migrating directory"
16186 # add file with existing name should fail
16187 for file in $migrate_dir/f*; do
16188 stat $file > /dev/null || error "stat $file failed"
16189 $OPENFILE -f O_CREAT:O_EXCL $file &&
16190 error "open(O_CREAT|O_EXCL) $file should fail"
16191 $MULTIOP $file m && error "create $file should fail"
16192 touch $DIR/$tdir/remote_dir/$tfile ||
16193 error "touch $tfile failed"
16194 ln $DIR/$tdir/remote_dir/$tfile $file &&
16195 error "link $file should fail"
16196 mdt_index=$($LFS getstripe -m $file)
16197 if [ $mdt_index == 0 ]; then
16198 # file failed to migrate is not allowed to rename to
16199 mv $DIR/$tdir/remote_dir/$tfile $file &&
16200 error "rename to $file should fail"
16202 mv $DIR/$tdir/remote_dir/$tfile $file ||
16203 error "rename to $file failed"
16205 echo hello >> $file || error "write $file failed"
16208 # resume migration with different options should fail
16209 $LFS migrate -m 0 $migrate_dir &&
16210 error "migrate -m 0 $migrate_dir should fail"
16212 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
16213 error "migrate -c 2 $migrate_dir should fail"
16215 # resume migration should succeed
16216 $LFS migrate -m $MDTIDX $migrate_dir ||
16217 error "migrate $migrate_dir failed"
16219 echo "Finish migration, then checking.."
16220 for file in $(find $migrate_dir); do
16221 mdt_index=$($LFS getstripe -m $file)
16222 [ $mdt_index == $MDTIDX ] ||
16223 error "$file is not on MDT${MDTIDX}"
16226 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16228 run_test 230c "check directory accessiblity if migration failed"
16231 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16232 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16233 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16234 skip "Need MDS version at least 2.11.52"
16236 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
16238 local migrate_dir=$DIR/$tdir/migrate_dir
16248 old_index=$((RANDOM % MDSCOUNT))
16249 old_count=$((MDSCOUNT - old_index))
16250 new_index=$((RANDOM % MDSCOUNT))
16251 new_count=$((MDSCOUNT - new_index))
16252 new_hash="all_char"
16254 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
16255 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
16257 test_mkdir $DIR/$tdir
16258 test_mkdir -i $old_index -c $old_count $migrate_dir
16260 for ((i=0; i<100; i++)); do
16261 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
16262 createmany -o $migrate_dir/dir_${i}/f 100 ||
16263 error "create files under remote dir failed $i"
16266 echo -n "Migrate from MDT$old_index "
16267 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
16268 echo -n "to MDT$new_index"
16269 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
16272 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
16273 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
16274 error "migrate remote dir error"
16276 echo "Finish migration, then checking.."
16277 for file in $(find $migrate_dir); do
16278 mdt_index=$($LFS getstripe -m $file)
16279 if [ $mdt_index -lt $new_index ] ||
16280 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
16281 error "$file is on MDT$mdt_index"
16285 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16287 run_test 230d "check migrate big directory"
16290 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16291 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16292 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16293 skip "Need MDS version at least 2.11.52"
16300 mkdir -p $DIR/$tdir
16301 mkdir $DIR/$tdir/migrate_dir
16302 mkdir $DIR/$tdir/other_dir
16303 touch $DIR/$tdir/migrate_dir/a
16304 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
16305 ls $DIR/$tdir/other_dir
16307 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16308 error "migrate dir fails"
16310 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16311 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16313 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16314 [ $mdt_index == 0 ] || error "a is not on MDT0"
16316 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
16317 error "migrate dir fails"
16319 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
16320 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
16322 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16323 [ $mdt_index == 1 ] || error "a is not on MDT1"
16325 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
16326 [ $mdt_index == 1 ] || error "b is not on MDT1"
16328 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16329 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
16331 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
16333 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16335 run_test 230e "migrate mulitple local link files"
16338 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16339 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16340 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16341 skip "Need MDS version at least 2.11.52"
16346 mkdir -p $DIR/$tdir
16347 mkdir $DIR/$tdir/migrate_dir
16348 $LFS mkdir -i1 $DIR/$tdir/other_dir
16349 touch $DIR/$tdir/migrate_dir/a
16350 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
16351 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
16352 ls $DIR/$tdir/other_dir
16354 # a should be migrated to MDT1, since no other links on MDT0
16355 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16356 error "#1 migrate dir fails"
16357 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16358 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16359 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16360 [ $mdt_index == 1 ] || error "a is not on MDT1"
16362 # a should stay on MDT1, because it is a mulitple link file
16363 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16364 error "#2 migrate dir fails"
16365 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16366 [ $mdt_index == 1 ] || error "a is not on MDT1"
16368 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16369 error "#3 migrate dir fails"
16371 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16372 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
16373 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
16375 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
16376 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
16378 # a should be migrated to MDT0, since no other links on MDT1
16379 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16380 error "#4 migrate dir fails"
16381 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16382 [ $mdt_index == 0 ] || error "a is not on MDT0"
16384 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16386 run_test 230f "migrate mulitple remote link files"
16389 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16390 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16391 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16392 skip "Need MDS version at least 2.11.52"
16394 mkdir -p $DIR/$tdir/migrate_dir
16396 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
16397 error "migrating dir to non-exist MDT succeeds"
16400 run_test 230g "migrate dir to non-exist MDT"
16403 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16404 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16405 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16406 skip "Need MDS version at least 2.11.52"
16410 mkdir -p $DIR/$tdir/migrate_dir
16412 $LFS migrate -m1 $DIR &&
16413 error "migrating mountpoint1 should fail"
16415 $LFS migrate -m1 $DIR/$tdir/.. &&
16416 error "migrating mountpoint2 should fail"
16419 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
16420 error "migrating $tdir/migrate_dir/.. should fail"
16424 run_test 230h "migrate .. and root"
16427 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16428 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16429 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16430 skip "Need MDS version at least 2.11.52"
16432 mkdir -p $DIR/$tdir/migrate_dir
16434 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
16435 error "migration fails with a tailing slash"
16437 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
16438 error "migration fails with two tailing slashes"
16440 run_test 230i "lfs migrate -m tolerates trailing slashes"
16443 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16444 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16445 skip "Need MDS version at least 2.11.52"
16447 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
16448 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
16449 error "create $tfile failed"
16450 cat /etc/passwd > $DIR/$tdir/$tfile
16452 $LFS migrate -m 1 $DIR/$tdir
16454 cmp /etc/passwd $DIR/$tdir/$tfile ||
16455 error "DoM file mismatch after migration"
16457 run_test 230j "DoM file data not changed after dir migration"
16460 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
16461 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16462 skip "Need MDS version at least 2.11.56"
16465 local files_on_starting_mdt=0
16467 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
16468 $LFS getdirstripe $DIR/$tdir
16469 for i in $(seq $total); do
16470 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
16471 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16472 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16475 echo "$files_on_starting_mdt files on MDT0"
16477 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
16478 $LFS getdirstripe $DIR/$tdir
16480 files_on_starting_mdt=0
16481 for i in $(seq $total); do
16482 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16483 error "file $tfile.$i mismatch after migration"
16484 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16485 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16488 echo "$files_on_starting_mdt files on MDT1 after migration"
16489 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16491 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16492 $LFS getdirstripe $DIR/$tdir
16494 files_on_starting_mdt=0
16495 for i in $(seq $total); do
16496 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16497 error "file $tfile.$i mismatch after 2nd migration"
16498 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16499 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16502 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
16503 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16507 run_test 230k "file data not changed after dir migration"
16510 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16511 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16512 skip "Need MDS version at least 2.11.56"
16514 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16515 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16516 error "create files under remote dir failed $i"
16517 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16519 run_test 230l "readdir between MDTs won't crash"
16522 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16523 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16524 skip "Need MDS version at least 2.11.56"
16527 local mig_dir=$DIR/$tdir/migrate_dir
16528 local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16532 echo "Creating files and dirs with xattrs"
16533 test_mkdir $DIR/$tdir
16534 test_mkdir -i0 -c1 $mig_dir
16536 setfattr -n user.attr1 -v $longstr $mig_dir/dir ||
16537 error "cannot set xattr attr1 on dir"
16538 setfattr -n user.attr2 -v $shortstr $mig_dir/dir ||
16539 error "cannot set xattr attr2 on dir"
16540 touch $mig_dir/dir/f0
16541 setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 ||
16542 error "cannot set xattr attr1 on file"
16543 setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 ||
16544 error "cannot set xattr attr2 on file"
16545 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16546 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16547 [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir"
16548 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16549 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir"
16550 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16551 [ "$val" = $longstr ] || error "xattr attr1 not set properly on file"
16552 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16553 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file"
16555 echo "Migrating to MDT1"
16556 $LFS migrate -m $MDTIDX $mig_dir ||
16557 error "fails on migrating dir to MDT1"
16559 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16560 echo "Checking xattrs"
16561 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16562 [ "$val" = $longstr ] ||
16563 error "expecting xattr1 $longstr on dir, found $val"
16564 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16565 [ "$val" = $shortstr ] ||
16566 error "expecting xattr2 $shortstr on dir, found $val"
16567 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16568 [ "$val" = $longstr ] ||
16569 error "expecting xattr1 $longstr on file, found $val"
16570 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16571 [ "$val" = $shortstr ] ||
16572 error "expecting xattr2 $shortstr on file, found $val"
16574 run_test 230m "xattrs not changed after dir migration"
16577 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
16578 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
16579 [[ $MDS1_VERSION -ge $(version_code 2.12.5) ]] ||
16580 skip "Need MDS version at least 2.12.5"
16582 # maximum amount of local locks:
16583 # parent striped dir - 2 locks
16584 # new stripe in parent to migrate to - 1 lock
16585 # source and target - 2 locks
16586 # Total 5 locks for regular file
16587 mkdir -p $DIR/$tdir
16588 $LFS mkdir -i1 -c2 $DIR/$tdir/dir1
16589 touch $DIR/$tdir/dir1/eee
16591 # create 4 hardlink for 4 more locks
16592 # Total: 9 locks > RS_MAX_LOCKS (8)
16593 $LFS mkdir -i1 -c1 $DIR/$tdir/dir2
16594 $LFS mkdir -i1 -c1 $DIR/$tdir/dir3
16595 $LFS mkdir -i1 -c1 $DIR/$tdir/dir4
16596 $LFS mkdir -i1 -c1 $DIR/$tdir/dir5
16597 ln $DIR/$tdir/dir1/eee $DIR/$tdir/dir2/eee
16598 ln $DIR/$tdir/dir1/eee $DIR/$tdir/dir3/eee
16599 ln $DIR/$tdir/dir1/eee $DIR/$tdir/dir4/eee
16600 ln $DIR/$tdir/dir1/eee $DIR/$tdir/dir5/eee
16602 cancel_lru_locks mdc
16604 $LFS migrate -m1 -c1 $DIR/$tdir/dir1 ||
16605 error "migrate dir fails"
16607 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16609 run_test 230r "migrate with too many local locks"
16613 # For simplicity this test assumes that max_pages_per_rpc
16614 # is the same across all OSCs
16615 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16616 local bulk_size=$((max_pages * PAGE_SIZE))
16617 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16620 mkdir -p $DIR/$tdir
16621 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16622 error "failed to set stripe with -S ${brw_size}M option"
16624 # clear the OSC stats
16625 $LCTL set_param osc.*.stats=0 &>/dev/null
16628 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16629 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16630 oflag=direct &>/dev/null || error "dd failed"
16632 sync; sleep 1; sync # just to be safe
16633 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16634 if [ x$nrpcs != "x1" ]; then
16635 $LCTL get_param osc.*.stats
16636 error "found $nrpcs ost_write RPCs, not 1 as expected"
16640 # Drop the OSC cache, otherwise we will read from it
16641 cancel_lru_locks osc
16643 # clear the OSC stats
16644 $LCTL set_param osc.*.stats=0 &>/dev/null
16646 # Client reads $bulk_size.
16647 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16648 iflag=direct &>/dev/null || error "dd failed"
16650 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16651 if [ x$nrpcs != "x1" ]; then
16652 $LCTL get_param osc.*.stats
16653 error "found $nrpcs ost_read RPCs, not 1 as expected"
16656 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16659 mkdir -p $DIR/$tdir
16661 for i in {0..1023}; do
16662 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16663 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16664 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16668 run_test 231b "must not assert on fully utilized OST request buffer"
16671 mkdir -p $DIR/$tdir
16672 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16674 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16675 do_facet ost1 $LCTL set_param fail_loc=0x31c
16677 # ignore dd failure
16678 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16680 do_facet ost1 $LCTL set_param fail_loc=0
16681 umount_client $MOUNT || error "umount failed"
16682 mount_client $MOUNT || error "mount failed"
16683 stop ost1 || error "cannot stop ost1"
16684 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16686 run_test 232a "failed lock should not block umount"
16689 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16690 skip "Need MDS version at least 2.10.58"
16692 mkdir -p $DIR/$tdir
16693 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16694 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16696 cancel_lru_locks osc
16698 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16699 do_facet ost1 $LCTL set_param fail_loc=0x31c
16702 $LFS data_version $DIR/$tdir/$tfile || true
16704 do_facet ost1 $LCTL set_param fail_loc=0
16705 umount_client $MOUNT || error "umount failed"
16706 mount_client $MOUNT || error "mount failed"
16707 stop ost1 || error "cannot stop ost1"
16708 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16710 run_test 232b "failed data version lock should not block umount"
16713 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
16714 skip "Need MDS version at least 2.3.64"
16715 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16717 local fid=$($LFS path2fid $MOUNT)
16719 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16720 error "cannot access $MOUNT using its FID '$fid'"
16722 run_test 233a "checking that OBF of the FS root succeeds"
16725 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
16726 skip "Need MDS version at least 2.5.90"
16727 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16729 local fid=$($LFS path2fid $MOUNT/.lustre)
16731 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16732 error "cannot access $MOUNT/.lustre using its FID '$fid'"
16734 fid=$($LFS path2fid $MOUNT/.lustre/fid)
16735 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16736 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
16738 run_test 233b "checking that OBF of the FS .lustre succeeds"
16741 local p="$TMP/sanityN-$TESTNAME.parameters"
16742 save_lustre_params client "llite.*.xattr_cache" > $p
16743 lctl set_param llite.*.xattr_cache 1 ||
16744 skip_env "xattr cache is not supported"
16746 mkdir -p $DIR/$tdir || error "mkdir failed"
16747 touch $DIR/$tdir/$tfile || error "touch failed"
16748 # OBD_FAIL_LLITE_XATTR_ENOMEM
16749 $LCTL set_param fail_loc=0x1405
16750 getfattr -n user.attr $DIR/$tdir/$tfile &&
16751 error "getfattr should have failed with ENOMEM"
16752 $LCTL set_param fail_loc=0x0
16755 restore_lustre_params < $p
16758 run_test 234 "xattr cache should not crash on ENOMEM"
16761 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
16762 skip "Need MDS version at least 2.4.52"
16764 flock_deadlock $DIR/$tfile
16769 124) error "process hangs on a deadlock"
16771 *) error "error executing flock_deadlock $DIR/$tfile"
16775 run_test 235 "LU-1715: flock deadlock detection does not work properly"
16779 check_swap_layouts_support
16781 local ref1=/etc/passwd
16782 local ref2=/etc/group
16783 local file1=$DIR/$tdir/f1
16784 local file2=$DIR/$tdir/f2
16786 test_mkdir -c1 $DIR/$tdir
16787 $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
16788 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
16789 $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
16790 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
16791 local fd=$(free_fd)
16792 local cmd="exec $fd<>$file2"
16795 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
16796 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
16799 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
16804 run_test 236 "Layout swap on open unlinked file"
16806 # LU-4659 linkea consistency
16808 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
16809 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
16810 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
16811 skip "Need MDS version at least 2.5.58 or 2.5.2+"
16814 ln $DIR/$tfile $DIR/$tfile.lnk
16815 touch $DIR/$tfile.new
16816 mv $DIR/$tfile.new $DIR/$tfile
16817 local fid1=$($LFS path2fid $DIR/$tfile)
16818 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
16819 local path1=$($LFS fid2path $FSNAME "$fid1")
16820 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
16821 local path2=$($LFS fid2path $FSNAME "$fid2")
16822 [ $tfile.lnk == $path2 ] ||
16823 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
16826 run_test 238 "Verify linkea consistency"
16828 test_239A() { # was test_239
16829 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
16830 skip "Need MDS version at least 2.5.60"
16832 local list=$(comma_list $(mdts_nodes))
16834 mkdir -p $DIR/$tdir
16835 createmany -o $DIR/$tdir/f- 5000
16836 unlinkmany $DIR/$tdir/f- 5000
16837 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
16838 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
16839 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
16840 osp.*MDT*.sync_in_flight" | calc_sum)
16841 [ "$changes" -eq 0 ] || error "$changes not synced"
16843 run_test 239A "osp_sync test"
16845 test_239a() { #LU-5297
16846 remote_mds_nodsh && skip "remote MDS with nodsh"
16849 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
16850 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
16851 chgrp $RUNAS_GID $DIR/$tfile
16852 wait_delete_completed
16854 run_test 239a "process invalid osp sync record correctly"
16856 test_239b() { #LU-5297
16857 remote_mds_nodsh && skip "remote MDS with nodsh"
16860 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
16861 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
16862 chgrp $RUNAS_GID $DIR/$tfile1
16863 wait_delete_completed
16864 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
16866 chgrp $RUNAS_GID $DIR/$tfile2
16867 wait_delete_completed
16869 run_test 239b "process osp sync record with ENOMEM error correctly"
16872 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16873 remote_mds_nodsh && skip "remote MDS with nodsh"
16875 mkdir -p $DIR/$tdir
16877 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
16878 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
16879 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
16880 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
16882 umount_client $MOUNT || error "umount failed"
16883 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
16884 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
16885 mount_client $MOUNT || error "failed to mount client"
16887 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
16888 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
16890 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
16896 for LOOP in $(seq $count); do
16897 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
16898 cancel_lru_locks $OSC || true
16906 for LOOP in $(seq $1); do
16907 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
16912 test_241a() { # was test_241
16913 local bsize=$PAGE_SIZE
16915 (( bsize < 40960 )) && bsize=40960
16916 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16918 cancel_lru_locks $OSC
16919 test_241_bio 1000 $bsize &
16921 test_241_dio 1000 $bsize
16924 run_test 241a "bio vs dio"
16927 local bsize=$PAGE_SIZE
16929 (( bsize < 40960 )) && bsize=40960
16930 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16932 test_241_dio 1000 $bsize &
16934 test_241_dio 1000 $bsize
16937 run_test 241b "dio vs dio"
16940 remote_mds_nodsh && skip "remote MDS with nodsh"
16942 mkdir -p $DIR/$tdir
16943 touch $DIR/$tdir/$tfile
16945 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
16946 do_facet mds1 lctl set_param fail_loc=0x105
16947 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
16949 do_facet mds1 lctl set_param fail_loc=0
16950 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
16952 run_test 242 "mdt_readpage failure should not cause directory unreadable"
16956 test_mkdir $DIR/$tdir
16957 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
16959 run_test 243 "various group lock tests"
16963 test_mkdir $DIR/$tdir
16964 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
16965 sendfile_grouplock $DIR/$tdir/$tfile || \
16966 error "sendfile+grouplock failed"
16969 run_test 244 "sendfile with group lock tests"
16972 local flagname="multi_mod_rpcs"
16973 local connect_data_name="max_mod_rpcs"
16976 # check if multiple modify RPCs flag is set
16977 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
16978 grep "connect_flags:")
16981 echo "$out" | grep -qw $flagname
16982 if [ $? -ne 0 ]; then
16983 echo "connect flag $flagname is not set"
16987 # check if multiple modify RPCs data is set
16988 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
16991 echo "$out" | grep -qw $connect_data_name ||
16992 error "import should have connect data $connect_data_name"
16994 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
16996 test_246() { # LU-7371
16997 remote_ost_nodsh && skip "remote OST with nodsh"
16998 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
16999 skip "Need OST version >= 2.7.62"
17001 do_facet ost1 $LCTL set_param fail_val=4095
17002 #define OBD_FAIL_OST_READ_SIZE 0x234
17003 do_facet ost1 $LCTL set_param fail_loc=0x234
17004 $LFS setstripe $DIR/$tfile -i 0 -c 1
17005 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
17006 cancel_lru_locks $FSNAME-OST0000
17007 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
17009 run_test 246 "Read file of size 4095 should return right length"
17015 umount_client $submount
17020 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
17022 skip_env "Fileset feature is not supported"
17024 local submount=${MOUNT}_$tdir
17027 mkdir -p $submount || error "mkdir $submount failed"
17028 FILESET="$FILESET/$tdir" mount_client $submount ||
17029 error "mount $submount failed"
17030 trap "cleanup_247 $submount" EXIT
17031 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
17032 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
17033 error "read $MOUNT/$tdir/$tfile failed"
17034 cleanup_247 $submount
17036 run_test 247a "mount subdir as fileset"
17039 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
17040 skip_env "Fileset feature is not supported"
17042 local submount=${MOUNT}_$tdir
17044 rm -rf $MOUNT/$tdir
17045 mkdir -p $submount || error "mkdir $submount failed"
17047 FILESET="$FILESET/$tdir" mount_client $submount &&
17048 error "mount $submount should fail"
17051 run_test 247b "mount subdir that dose not exist"
17054 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
17055 skip_env "Fileset feature is not supported"
17057 local submount=${MOUNT}_$tdir
17059 mkdir -p $MOUNT/$tdir/dir1
17060 mkdir -p $submount || error "mkdir $submount failed"
17061 trap "cleanup_247 $submount" EXIT
17062 FILESET="$FILESET/$tdir" mount_client $submount ||
17063 error "mount $submount failed"
17064 local fid=$($LFS path2fid $MOUNT/)
17065 $LFS fid2path $submount $fid && error "fid2path should fail"
17066 cleanup_247 $submount
17068 run_test 247c "running fid2path outside root"
17071 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
17072 skip "Fileset feature is not supported"
17074 local submount=${MOUNT}_$tdir
17076 mkdir -p $MOUNT/$tdir/dir1
17077 mkdir -p $submount || error "mkdir $submount failed"
17078 FILESET="$FILESET/$tdir" mount_client $submount ||
17079 error "mount $submount failed"
17080 trap "cleanup_247 $submount" EXIT
17081 local fid=$($LFS path2fid $submount/dir1)
17082 $LFS fid2path $submount $fid || error "fid2path should succeed"
17083 cleanup_247 $submount
17085 run_test 247d "running fid2path inside root"
17089 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
17091 skip "Fileset feature is not supported"
17093 local submount=${MOUNT}_$tdir
17096 mkdir -p $submount || error "mkdir $submount failed"
17097 FILESET="$FILESET/.." mount_client $submount &&
17098 error "mount $submount should fail"
17101 run_test 247e "mount .. as fileset"
17104 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
17105 [ $MDS1_VERSION -lt $(version_code 2.13.52) ] &&
17106 skip "Need at least version 2.13.52"
17107 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
17109 skip "Fileset feature is not supported"
17111 mkdir $DIR/$tdir || error "mkdir $tdir failed"
17112 $LFS mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir/remote ||
17113 error "mkdir remote failed"
17114 mkdir $DIR/$tdir/remote/subdir || error "mkdir remote/subdir failed"
17115 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/striped ||
17116 error "mkdir striped failed"
17117 mkdir $DIR/$tdir/striped/subdir || error "mkdir striped/subdir failed"
17119 local submount=${MOUNT}_$tdir
17121 mkdir -p $submount || error "mkdir $submount failed"
17124 local fileset=$FILESET
17126 for dir in $tdir/remote $tdir/remote/subdir \
17127 $tdir/striped $tdir/striped/subdir $tdir/striped/. ; do
17128 FILESET="$fileset/$dir" mount_client $submount ||
17129 error "mount $dir failed"
17130 umount_client $submount
17133 run_test 247f "mount striped or remote directory as fileset"
17136 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
17137 [ -z "$fast_read_sav" ] && skip "no fast read support"
17139 # create a large file for fast read verification
17140 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
17142 # make sure the file is created correctly
17143 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
17144 { rm -f $DIR/$tfile; skip "file creation error"; }
17146 echo "Test 1: verify that fast read is 4 times faster on cache read"
17148 # small read with fast read enabled
17149 $LCTL set_param -n llite.*.fast_read=1
17150 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
17151 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17152 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17153 # small read with fast read disabled
17154 $LCTL set_param -n llite.*.fast_read=0
17155 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
17156 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17157 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17159 # verify that fast read is 4 times faster for cache read
17160 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
17161 error_not_in_vm "fast read was not 4 times faster: " \
17162 "$t_fast vs $t_slow"
17164 echo "Test 2: verify the performance between big and small read"
17165 $LCTL set_param -n llite.*.fast_read=1
17167 # 1k non-cache read
17168 cancel_lru_locks osc
17169 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17170 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17171 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17173 # 1M non-cache read
17174 cancel_lru_locks osc
17175 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17176 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17177 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17179 # verify that big IO is not 4 times faster than small IO
17180 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
17181 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
17183 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
17186 run_test 248 "fast read verification"
17188 test_249() { # LU-7890
17189 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
17190 skip "Need at least version 2.8.54"
17193 $SETSTRIPE -c 1 $DIR/$tfile
17194 # Offset 2T == 4k * 512M
17195 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
17196 error "dd to 2T offset failed"
17198 run_test 249 "Write above 2T file size"
17201 [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
17202 && skip "no 16TB file size limit on ZFS"
17204 $SETSTRIPE -c 1 $DIR/$tfile
17205 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
17206 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
17207 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
17208 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
17209 conv=notrunc,fsync && error "append succeeded"
17212 run_test 250 "Write above 16T limit"
17215 $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile
17217 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
17218 #Skip once - writing the first stripe will succeed
17219 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17220 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
17221 error "short write happened"
17223 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17224 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
17225 error "short read happened"
17229 run_test 251 "Handling short read and write correctly"
17232 remote_mds_nodsh && skip "remote MDS with nodsh"
17233 remote_ost_nodsh && skip "remote OST with nodsh"
17234 if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then
17235 skip_env "ldiskfs only test"
17245 # check lr_reader on OST0000
17247 dev=$(facet_device $tgt)
17248 out=$(do_facet $tgt $LR_READER $dev)
17249 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17251 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
17252 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
17253 error "Invalid uuid returned by $LR_READER on target $tgt"
17254 echo -e "uuid returned by $LR_READER is '$uuid'\n"
17256 # check lr_reader -c on MDT0000
17258 dev=$(facet_device $tgt)
17259 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
17260 skip "$LR_READER does not support additional options"
17262 out=$(do_facet $tgt $LR_READER -c $dev)
17263 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17265 num=$(echo "$out" | grep -c "mdtlov")
17266 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
17267 error "Invalid number of mdtlov clients returned by $LR_READER"
17268 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
17270 # check lr_reader -cr on MDT0000
17271 out=$(do_facet $tgt $LR_READER -cr $dev)
17272 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17274 echo "$out" | grep -q "^reply_data:$" ||
17275 error "$LR_READER should have returned 'reply_data' section"
17276 num=$(echo "$out" | grep -c "client_generation")
17277 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
17279 run_test 252 "check lr_reader tool"
17281 test_253_fill_ost() {
17282 local size_mb #how many MB should we write to pass watermark
17283 local lwm=$3 #low watermark
17284 local free_10mb #10% of free space
17286 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17287 size_mb=$((free_kb / 1024 - lwm))
17288 free_10mb=$((free_kb / 10240))
17289 #If 10% of free space cross low watermark use it
17290 if (( free_10mb > size_mb )); then
17293 #At least we need to store 1.1 of difference between
17294 #free space and low watermark
17295 size_mb=$((size_mb + size_mb / 10))
17297 if (( lwm <= $((free_kb / 1024)) )) || [ ! -f $DIR/$tdir/1 ]; then
17298 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M count=$size_mb \
17299 oflag=append conv=notrunc
17304 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17305 echo "OST still has $((free_kb / 1024)) mbytes free"
17309 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17310 remote_mds_nodsh && skip "remote MDS with nodsh"
17311 remote_mgs_nodsh && skip "remote MGS with nodsh"
17316 local ost_name=$($LFS osts |
17317 sed -n 's/^'$ostidx': \(.*\)_UUID .*/\1/p')
17319 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
17320 do_facet $SINGLEMDS $LCTL get_param -n \
17321 osp.$mdtosc_proc1.reserved_mb_high ||
17322 skip "remote MDS does not support reserved_mb_high"
17326 wait_delete_completed
17329 local last_wm_h=$(do_facet $SINGLEMDS $LCTL get_param -n \
17330 osp.$mdtosc_proc1.reserved_mb_high)
17331 local last_wm_l=$(do_facet $SINGLEMDS $LCTL get_param -n \
17332 osp.$mdtosc_proc1.reserved_mb_low)
17333 echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l"
17335 create_pool $FSNAME.$TESTNAME || error "Pool creation failed"
17336 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name ||
17337 error "Adding $ost_name to pool failed"
17339 # Wait for client to see a OST at pool
17340 wait_update $HOSTNAME "$LCTL get_param -n
17341 lov.$FSNAME-*.pools.$TESTNAME | sort -u |
17342 grep $ost_name" "$ost_name""_UUID" $((TIMEOUT/2)) ||
17343 error "Client can not see the pool"
17344 $SETSTRIPE $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
17345 error "Setstripe failed"
17347 dd if=/dev/zero of=$DIR/$tdir/0 bs=1M count=10
17348 local blocks=$($LFS df $MOUNT | grep $ost_name | awk '{ print $4 }')
17349 echo "OST still has $((blocks/1024)) mbytes free"
17351 local new_lwm=$((blocks/1024-10))
17352 do_facet $SINGLEMDS $LCTL set_param \
17353 osp.$mdtosc_proc1.reserved_mb_high=$((new_lwm+5))
17354 do_facet $SINGLEMDS $LCTL set_param \
17355 osp.$mdtosc_proc1.reserved_mb_low=$new_lwm
17357 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17359 #First enospc could execute orphan deletion so repeat.
17360 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17362 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17363 osp.$mdtosc_proc1.prealloc_status)
17364 echo "prealloc_status $oa_status"
17366 dd if=/dev/zero of=$DIR/$tdir/2 bs=1M count=1 &&
17367 error "File creation should fail"
17368 #object allocation was stopped, but we still able to append files
17369 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M seek=6 count=5 oflag=append ||
17370 error "Append failed"
17371 rm -f $DIR/$tdir/1 $DIR/$tdir/0 $DIR/$tdir/r*
17373 wait_delete_completed
17377 for i in $(seq 10 12); do
17378 dd if=/dev/zero of=$DIR/$tdir/$i bs=1M count=1 2>/dev/null ||
17379 error "File creation failed after rm";
17382 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17383 osp.$mdtosc_proc1.prealloc_status)
17384 echo "prealloc_status $oa_status"
17386 if (( oa_status != 0 )); then
17387 error "Object allocation still disable after rm"
17389 do_facet $SINGLEMDS $LCTL set_param \
17390 osp.$mdtosc_proc1.reserved_mb_high=$last_wm_h
17391 do_facet $SINGLEMDS $LCTL set_param \
17392 osp.$mdtosc_proc1.reserved_mb_low=$last_wm_l
17395 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $ost_name ||
17396 error "Remove $ost_name from pool failed"
17397 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
17398 error "Pool destroy fialed"
17400 run_test 253 "Check object allocation limit"
17403 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17404 remote_mds_nodsh && skip "remote MDS with nodsh"
17405 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
17406 skip "MDS does not support changelog_size"
17409 local MDT0=$(facet_svc $SINGLEMDS)
17411 changelog_register || error "changelog_register failed"
17413 changelog_clear 0 || error "changelog_clear failed"
17415 local size1=$(do_facet $SINGLEMDS \
17416 $LCTL get_param -n mdd.$MDT0.changelog_size)
17417 echo "Changelog size $size1"
17420 $LFS mkdir -i 0 $DIR/$tdir
17422 mkdir -p $DIR/$tdir/pics/2008/zachy
17423 touch $DIR/$tdir/pics/2008/zachy/timestamp
17424 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
17425 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
17426 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
17427 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
17428 rm $DIR/$tdir/pics/desktop.jpg
17430 local size2=$(do_facet $SINGLEMDS \
17431 $LCTL get_param -n mdd.$MDT0.changelog_size)
17432 echo "Changelog size after work $size2"
17434 (( $size2 > $size1 )) ||
17435 error "new Changelog size=$size2 less than old size=$size1"
17437 run_test 254 "Check changelog size"
17444 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
17445 awk -F: '{print $2}' | grep $type > /dev/null
17446 if [ $? -ne 0 ]; then
17456 lfs ladvise -a willread $file > /dev/null 2>&1
17457 if [ $? -eq 0 ]; then
17461 lfs ladvise -a willread $file 2>&1 |
17462 grep "Inappropriate ioctl for device" > /dev/null
17463 if [ $? -eq 0 ]; then
17470 bc <<<"scale=2; ($1 - $2) * 100 / $2"
17473 # run a random read IO workload
17474 # usage: random_read_iops <filename> <filesize> <iosize>
17475 random_read_iops() {
17478 local iosize=${3:-4096}
17480 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
17481 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
17484 drop_file_oss_cache() {
17488 $LFS ladvise -a dontneed $file 2>/dev/null ||
17489 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
17492 ladvise_willread_performance()
17495 local average_origin=0
17496 local average_cache=0
17497 local average_ladvise=0
17499 for ((i = 1; i <= $repeat; i++)); do
17500 echo "Iter $i/$repeat: reading without willread hint"
17501 cancel_lru_locks osc
17502 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17503 local speed_origin=$(random_read_iops $DIR/$tfile $size)
17504 echo "Iter $i/$repeat: uncached speed: $speed_origin"
17505 average_origin=$(bc <<<"$average_origin + $speed_origin")
17507 cancel_lru_locks osc
17508 local speed_cache=$(random_read_iops $DIR/$tfile $size)
17509 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
17510 average_cache=$(bc <<<"$average_cache + $speed_cache")
17512 cancel_lru_locks osc
17513 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17514 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
17515 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
17516 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
17517 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
17519 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
17520 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
17521 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
17523 speedup_cache=$(percent $average_cache $average_origin)
17524 speedup_ladvise=$(percent $average_ladvise $average_origin)
17526 echo "Average uncached read: $average_origin"
17527 echo "Average speedup with OSS cached read: " \
17528 "$average_cache = +$speedup_cache%"
17529 echo "Average speedup with ladvise willread: " \
17530 "$average_ladvise = +$speedup_ladvise%"
17532 local lowest_speedup=20
17533 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
17534 echo "Speedup with OSS cached read less than $lowest_speedup%," \
17535 "got $average_cache%. Skipping ladvise willread check."
17539 # the test won't work on ZFS until it supports 'ladvise dontneed', but
17540 # it is still good to run until then to exercise 'ladvise willread'
17541 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17542 [ "$ost1_FSTYPE" = "zfs" ] &&
17543 echo "osd-zfs does not support dontneed or drop_caches" &&
17546 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
17547 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
17548 error_not_in_vm "Speedup with willread is less than " \
17549 "$lowest_speedup%, got $average_ladvise%"
17553 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17554 skip "lustre < 2.8.54 does not support ladvise "
17555 remote_ost_nodsh && skip "remote OST with nodsh"
17557 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
17559 ladvise_no_type willread $DIR/$tfile &&
17560 skip "willread ladvise is not supported"
17562 ladvise_no_ioctl $DIR/$tfile &&
17563 skip "ladvise ioctl is not supported"
17566 local size=$((size_mb * 1048576))
17567 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17568 error "dd to $DIR/$tfile failed"
17570 lfs ladvise -a willread $DIR/$tfile ||
17571 error "Ladvise failed with no range argument"
17573 lfs ladvise -a willread -s 0 $DIR/$tfile ||
17574 error "Ladvise failed with no -l or -e argument"
17576 lfs ladvise -a willread -e 1 $DIR/$tfile ||
17577 error "Ladvise failed with only -e argument"
17579 lfs ladvise -a willread -l 1 $DIR/$tfile ||
17580 error "Ladvise failed with only -l argument"
17582 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
17583 error "End offset should not be smaller than start offset"
17585 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
17586 error "End offset should not be equal to start offset"
17588 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
17589 error "Ladvise failed with overflowing -s argument"
17591 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
17592 error "Ladvise failed with overflowing -e argument"
17594 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
17595 error "Ladvise failed with overflowing -l argument"
17597 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
17598 error "Ladvise succeeded with conflicting -l and -e arguments"
17600 echo "Synchronous ladvise should wait"
17602 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17603 do_nodes $(comma_list $(osts_nodes)) \
17604 $LCTL set_param fail_val=$delay fail_loc=0x237
17606 local start_ts=$SECONDS
17607 lfs ladvise -a willread $DIR/$tfile ||
17608 error "Ladvise failed with no range argument"
17609 local end_ts=$SECONDS
17610 local inteval_ts=$((end_ts - start_ts))
17612 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17613 error "Synchronous advice didn't wait reply"
17616 echo "Asynchronous ladvise shouldn't wait"
17617 local start_ts=$SECONDS
17618 lfs ladvise -a willread -b $DIR/$tfile ||
17619 error "Ladvise failed with no range argument"
17620 local end_ts=$SECONDS
17621 local inteval_ts=$((end_ts - start_ts))
17623 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17624 error "Asynchronous advice blocked"
17627 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17628 ladvise_willread_performance
17630 run_test 255a "check 'lfs ladvise -a willread'"
17636 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17640 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17641 skip "lustre < 2.8.54 does not support ladvise "
17642 remote_ost_nodsh && skip "remote OST with nodsh"
17644 lfs setstripe -c 1 -i 0 $DIR/$tfile
17646 ladvise_no_type dontneed $DIR/$tfile &&
17647 skip "dontneed ladvise is not supported"
17649 ladvise_no_ioctl $DIR/$tfile &&
17650 skip "ladvise ioctl is not supported"
17652 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17653 [ "$ost1_FSTYPE" = "zfs" ] &&
17654 skip "zfs-osd does not support 'ladvise dontneed'"
17657 local size=$((size_mb * 1048576))
17658 # In order to prevent disturbance of other processes, only check 3/4
17659 # of the memory usage
17660 local kibibytes=$((size_mb * 1024 * 3 / 4))
17662 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17663 error "dd to $DIR/$tfile failed"
17665 #force write to complete before dropping OST cache & checking memory
17668 local total=$(facet_meminfo ost1 MemTotal)
17669 echo "Total memory: $total KiB"
17671 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17672 local before_read=$(facet_meminfo ost1 Cached)
17673 echo "Cache used before read: $before_read KiB"
17675 lfs ladvise -a willread $DIR/$tfile ||
17676 error "Ladvise willread failed"
17677 local after_read=$(facet_meminfo ost1 Cached)
17678 echo "Cache used after read: $after_read KiB"
17680 lfs ladvise -a dontneed $DIR/$tfile ||
17681 error "Ladvise dontneed again failed"
17682 local no_read=$(facet_meminfo ost1 Cached)
17683 echo "Cache used after dontneed ladvise: $no_read KiB"
17685 if [ $total -lt $((before_read + kibibytes)) ]; then
17686 echo "Memory is too small, abort checking"
17690 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17691 error "Ladvise willread should use more memory" \
17692 "than $kibibytes KiB"
17695 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17696 error "Ladvise dontneed should release more memory" \
17697 "than $kibibytes KiB"
17700 run_test 255b "check 'lfs ladvise -a dontneed'"
17703 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17704 skip "lustre < 2.10.50 does not support lockahead"
17712 test_mkdir -p $DIR/$tdir
17713 $SETSTRIPE -i 0 $DIR/$tdir
17715 #test 10 returns only success/failure
17717 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17719 if [ $rc -eq 255 ]; then
17720 error "Ladvise test${i} failed, ${rc}"
17723 #test 11 counts lock enqueue requests, all others count new locks
17725 count=$(do_facet ost1 \
17726 $LCTL get_param -n ost.OSS.ost.stats)
17727 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17729 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17731 if [ $rc -eq 255 ]; then
17732 error "Ladvise test${i} failed, ${rc}"
17735 new_count=$(do_facet ost1 \
17736 $LCTL get_param -n ost.OSS.ost.stats)
17737 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17738 awk '{ print $2 }')
17740 difference="$((new_count - count))"
17741 if [ $difference -ne $rc ]; then
17742 error "Ladvise test${i}, bad enqueue count, returned " \
17743 "${rc}, actual ${difference}"
17746 for i in $(seq 12 21); do
17747 # If we do not do this, we run the risk of having too many
17748 # locks and starting lock cancellation while we are checking
17750 cancel_lru_locks osc
17752 count=$($LCTL get_param -n \
17753 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17755 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17757 if [ $rc -eq 255 ]; then
17758 error "Ladvise test ${i} failed, ${rc}"
17761 new_count=$($LCTL get_param -n \
17762 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17763 difference="$((new_count - count))"
17765 # Test 15 output is divided by 100 to map down to valid return
17766 if [ $i -eq 15 ]; then
17770 if [ $difference -ne $rc ]; then
17771 error "Ladvise test ${i}, bad lock count, returned " \
17772 "${rc}, actual ${difference}"
17776 #test 22 returns only success/failure
17778 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17780 if [ $rc -eq 255 ]; then
17781 error "Ladvise test${i} failed, ${rc}"
17784 run_test 255c "suite of ladvise lockahead tests"
17787 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17788 remote_mds_nodsh && skip "remote MDS with nodsh"
17789 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17790 changelog_users $SINGLEMDS | grep "^cl" &&
17791 skip "active changelog user"
17797 mdt_dev=$(mdsdevname 1)
17800 changelog_register || error "changelog_register failed"
17803 mkdir -p $DIR/$tdir
17805 changelog_clear 0 || error "changelog_clear failed"
17808 touch $DIR/$tdir/{1..10}
17811 stop $SINGLEMDS || error "Fail to stop MDT"
17815 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
17817 #after mount new plainllog is used
17818 touch $DIR/$tdir/{11..19}
17819 local tmpfile=$(mktemp -u $tfile.XXXXXX)
17820 cat_sl=$(do_facet $SINGLEMDS "sync; \
17821 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17822 llog_reader $tmpfile | grep -c type=1064553b")
17823 do_facet $SINGLEMDS llog_reader $tmpfile
17825 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
17827 changelog_clear 0 || error "changelog_clear failed"
17829 cat_sl=$(do_facet $SINGLEMDS "sync; \
17830 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17831 llog_reader $tmpfile | grep -c type=1064553b; rm -f $tmpfile")
17833 if (( cat_sl == 2 )); then
17834 error "Empty plain llog was not deleted from changelog catalog"
17835 elif (( cat_sl != 1 )); then
17836 error "Active plain llog shouldn't be deleted from catalog"
17839 run_test 256 "Check llog delete for empty and not full state"
17842 remote_mds_nodsh && skip "remote MDS with nodsh"
17843 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
17844 skip "Need MDS version at least 2.8.55"
17846 test_mkdir $DIR/$tdir
17848 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
17849 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
17852 #define OBD_FAIL_MDS_XATTR_REP 0x161
17853 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17854 local facet=mds$((mdtidx + 1))
17855 set_nodes_failloc $(facet_active_host $facet) 0x80000161
17856 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
17858 stop $facet || error "stop MDS failed"
17859 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
17860 error "start MDS fail"
17862 run_test 257 "xattr locks are not lost"
17864 # Verify we take the i_mutex when security requires it
17866 #define OBD_FAIL_IMUTEX_SEC 0x141c
17867 $LCTL set_param fail_loc=0x141c
17869 chmod u+s $DIR/$tfile
17870 chmod a+rwx $DIR/$tfile
17871 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17873 if [ $RC -ne 0 ]; then
17874 error "error, failed to take i_mutex, rc=$?"
17878 run_test 258a "verify i_mutex security behavior when suid attributes is set"
17880 # Verify we do NOT take the i_mutex in the normal case
17882 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
17883 $LCTL set_param fail_loc=0x141d
17886 chmod a+rw $DIR/$tfile
17887 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17889 if [ $RC -ne 0 ]; then
17890 error "error, took i_mutex unnecessarily, rc=$?"
17895 run_test 258b "verify i_mutex security behavior"
17898 local file=$DIR/$tfile
17902 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17904 stack_trap "rm -f $file" EXIT
17906 wait_delete_completed
17907 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17908 echo "before: $before"
17910 $LFS setstripe -i 0 -c 1 $file
17911 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
17913 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17914 echo "after write: $after"
17916 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
17917 do_facet ost1 $LCTL set_param fail_loc=0x2301
17919 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17920 echo "after truncate: $after"
17923 do_facet ost1 $LCTL set_param fail_loc=0
17924 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17926 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17927 echo "after restart: $after"
17928 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
17929 error "missing truncate?"
17933 run_test 259 "crash at delayed truncate"
17936 #define OBD_FAIL_MDC_CLOSE 0x806
17937 $LCTL set_param fail_loc=0x80000806
17941 run_test 260 "Check mdc_close fail"
17943 ### Data-on-MDT sanity tests ###
17945 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17946 skip "Need MDS version at least 2.10.55 for DoM"
17949 local dom=$DIR/$tdir/dom_file
17950 local tmp=$DIR/$tdir/tmp_file
17952 mkdir -p $DIR/$tdir
17954 # basic checks for DoM component creation
17955 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
17956 error "Can set MDT layout to non-first entry"
17958 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
17959 error "Can define multiple entries as MDT layout"
17961 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
17963 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
17964 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
17965 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
17967 local mdtidx=$($LFS getstripe -m $dom)
17968 local mdtname=MDT$(printf %04x $mdtidx)
17969 local facet=mds$((mdtidx + 1))
17970 local space_check=1
17972 # Skip free space checks with ZFS
17973 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
17977 local size_tmp=$((65536 * 3))
17978 local mdtfree1=$(do_facet $facet \
17979 lctl get_param -n osd*.*$mdtname.kbytesfree)
17981 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17982 # check also direct IO along write
17983 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
17984 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17986 cmp $tmp $dom || error "file data is different"
17987 [ $(stat -c%s $dom) == $size_tmp ] ||
17988 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17989 if [ $space_check == 1 ]; then
17990 local mdtfree2=$(do_facet $facet \
17991 lctl get_param -n osd*.*$mdtname.kbytesfree)
17993 # increase in usage from by $size_tmp
17994 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17995 error "MDT free space wrong after write: " \
17996 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
18000 local size_dom=10000
18002 $TRUNCATE $dom $size_dom
18003 [ $(stat -c%s $dom) == $size_dom ] ||
18004 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
18005 if [ $space_check == 1 ]; then
18006 mdtfree1=$(do_facet $facet \
18007 lctl get_param -n osd*.*$mdtname.kbytesfree)
18008 # decrease in usage from $size_tmp to new $size_dom
18009 [ $(($mdtfree1 - $mdtfree2)) -ge \
18010 $(((size_tmp - size_dom) / 1024)) ] ||
18011 error "MDT free space is wrong after truncate: " \
18012 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
18018 size_dom=$((size_dom + size_tmp))
18019 [ $(stat -c%s $dom) == $size_dom ] ||
18020 error "bad size after append: $(stat -c%s $dom) != $size_dom"
18021 if [ $space_check == 1 ]; then
18022 mdtfree2=$(do_facet $facet \
18023 lctl get_param -n osd*.*$mdtname.kbytesfree)
18024 # increase in usage by $size_tmp from previous
18025 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
18026 error "MDT free space is wrong after append: " \
18027 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
18032 if [ $space_check == 1 ]; then
18033 mdtfree1=$(do_facet $facet \
18034 lctl get_param -n osd*.*$mdtname.kbytesfree)
18035 # decrease in usage by $size_dom from previous
18036 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
18037 error "MDT free space is wrong after removal: " \
18038 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
18041 # combined striping
18042 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
18043 error "Can't create DoM + OST striping"
18045 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
18046 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
18047 # check also direct IO along write
18048 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
18050 cmp $tmp $dom || error "file data is different"
18051 [ $(stat -c%s $dom) == $size_tmp ] ||
18052 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
18057 run_test 270a "DoM: basic functionality tests"
18060 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18061 skip "Need MDS version at least 2.10.55"
18063 local dom=$DIR/$tdir/dom_file
18064 local max_size=1048576
18066 mkdir -p $DIR/$tdir
18067 $LFS setstripe -E $max_size -L mdt $dom
18069 # truncate over the limit
18070 $TRUNCATE $dom $(($max_size + 1)) &&
18071 error "successful truncate over the maximum size"
18072 # write over the limit
18073 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
18074 error "successful write over the maximum size"
18075 # append over the limit
18076 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
18077 echo "12345" >> $dom && error "successful append over the maximum size"
18082 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
18085 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18086 skip "Need MDS version at least 2.10.55"
18088 mkdir -p $DIR/$tdir
18089 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18091 # check files inherit DoM EA
18092 touch $DIR/$tdir/first
18093 [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] ||
18094 error "bad pattern"
18095 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
18096 error "bad stripe count"
18097 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
18098 error "bad stripe size"
18100 # check directory inherits DoM EA and uses it as default
18101 mkdir $DIR/$tdir/subdir
18102 touch $DIR/$tdir/subdir/second
18103 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
18104 error "bad pattern in sub-directory"
18105 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
18106 error "bad stripe count in sub-directory"
18107 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
18108 error "bad stripe size in sub-directory"
18111 run_test 270c "DoM: DoM EA inheritance tests"
18114 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18115 skip "Need MDS version at least 2.10.55"
18117 mkdir -p $DIR/$tdir
18118 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18120 # inherit default DoM striping
18121 mkdir $DIR/$tdir/subdir
18122 touch $DIR/$tdir/subdir/f1
18124 # change default directory striping
18125 $LFS setstripe -c 1 $DIR/$tdir/subdir
18126 touch $DIR/$tdir/subdir/f2
18127 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
18128 error "wrong default striping in file 2"
18129 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
18130 error "bad pattern in file 2"
18133 run_test 270d "DoM: change striping from DoM to RAID0"
18136 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18137 skip "Need MDS version at least 2.10.55"
18139 mkdir -p $DIR/$tdir/dom
18140 mkdir -p $DIR/$tdir/norm
18143 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
18144 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
18146 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
18147 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
18149 # find DoM files by layout
18150 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
18151 [ $NUM -eq $DOMFILES ] ||
18152 error "lfs find -L: found $NUM, expected $DOMFILES"
18153 echo "Test 1: lfs find 20 DOM files by layout: OK"
18155 # there should be 1 dir with default DOM striping
18156 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
18158 error "lfs find -L: found $NUM, expected 1 dir"
18159 echo "Test 2: lfs find 1 DOM dir by layout: OK"
18161 # find DoM files by stripe size
18162 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
18163 [ $NUM -eq $DOMFILES ] ||
18164 error "lfs find -S: found $NUM, expected $DOMFILES"
18165 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
18167 # find files by stripe offset except DoM files
18168 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
18169 [ $NUM -eq $NORMFILES ] ||
18170 error "lfs find -i: found $NUM, expected $NORMFILES"
18171 echo "Test 5: lfs find no DOM files by stripe index: OK"
18174 run_test 270e "DoM: lfs find with DoM files test"
18177 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18178 skip "Need MDS version at least 2.10.55"
18180 local mdtname=${FSNAME}-MDT0000-mdtlov
18181 local dom=$DIR/$tdir/dom_file
18182 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
18183 lod.$mdtname.dom_stripesize)
18184 local dom_limit=131072
18186 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
18187 local dom_current=$(do_facet mds1 $LCTL get_param -n \
18188 lod.$mdtname.dom_stripesize)
18189 [ ${dom_limit} -eq ${dom_current} ] ||
18190 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
18192 $LFS mkdir -i 0 -c 1 $DIR/$tdir
18193 $LFS setstripe -d $DIR/$tdir
18194 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
18195 error "Can't set directory default striping"
18197 # exceed maximum stripe size
18198 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18199 error "Can't create file with $((dom_limit * 2)) DoM stripe"
18200 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
18201 error "Able to create DoM component size more than LOD limit"
18203 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
18204 dom_current=$(do_facet mds1 $LCTL get_param -n \
18205 lod.$mdtname.dom_stripesize)
18206 [ 0 -eq ${dom_current} ] ||
18207 error "Can't set zero DoM stripe limit"
18210 # attempt to create DoM file on server with disabled DoM should
18211 # remove DoM entry from layout and be succeed
18212 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
18213 error "Can't create DoM file (DoM is disabled)"
18214 [ $($LFS getstripe -L $dom) == "mdt" ] &&
18215 error "File has DoM component while DoM is disabled"
18218 # attempt to create DoM file with only DoM stripe should return error
18219 $LFS setstripe -E $dom_limit -L mdt $dom &&
18220 error "Able to create DoM-only file while DoM is disabled"
18222 # too low values to be aligned with smallest stripe size 64K
18223 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
18224 dom_current=$(do_facet mds1 $LCTL get_param -n \
18225 lod.$mdtname.dom_stripesize)
18226 [ 30000 -eq ${dom_current} ] &&
18227 error "Can set too small DoM stripe limit"
18229 # 64K is a minimal stripe size in Lustre, expect limit of that size
18230 [ 65536 -eq ${dom_current} ] ||
18231 error "Limit is not set to 64K but ${dom_current}"
18233 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
18234 dom_current=$(do_facet mds1 $LCTL get_param -n \
18235 lod.$mdtname.dom_stripesize)
18237 [ 2147483648 -eq ${dom_current} ] &&
18238 error "Can set too large DoM stripe limit"
18240 do_facet mds1 $LCTL set_param -n \
18241 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
18242 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18243 error "Can't create DoM component size after limit change"
18244 do_facet mds1 $LCTL set_param -n \
18245 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
18246 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
18247 error "Can't create DoM file after limit decrease"
18248 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
18249 error "Can create big DoM component after limit decrease"
18250 touch ${dom}_def ||
18251 error "Can't create file with old default layout"
18253 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
18256 run_test 270f "DoM: maximum DoM stripe size checks"
18259 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18260 skip "Need MDS version at least 2.10.55"
18262 local dom=$DIR/$tdir/dom
18264 mkdir -p $DIR/$tdir
18266 $LFS setstripe -E 1024K -L mdt $dom
18268 lctl set_param -n mdc.*.stats=clear
18269 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18270 cat $dom > /dev/null
18271 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
18272 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
18276 run_test 271a "DoM: data is cached for read after write"
18279 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18280 skip "Need MDS version at least 2.10.55"
18282 local dom=$DIR/$tdir/dom
18284 mkdir -p $DIR/$tdir
18286 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18288 lctl set_param -n mdc.*.stats=clear
18289 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18290 cancel_lru_locks mdc
18291 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
18292 # second stat to check size is cached on client
18293 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
18294 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18295 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
18298 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
18301 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18302 skip "Need MDS version at least 2.10.55"
18304 local dom=$DIR/$tdir/dom
18306 mkdir -p $DIR/$tdir
18308 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18310 lctl set_param -n mdc.*.stats=clear
18311 lctl set_param -n osc.*.stats=clear
18312 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
18313 cancel_lru_locks mdc
18314 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18315 # second stat to check size is cached on client
18316 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18317 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18318 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
18319 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
18320 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
18323 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
18329 local mdt=MDT$(printf %04x $mdtidx)
18331 if [ -z $param ]; then
18332 lctl get_param -n mdc.*$mdt*.stats
18334 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
18339 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18340 skip "Need MDS version at least 2.10.55"
18342 local dom=$DIR/$tdir/dom
18344 mkdir -p $DIR/$tdir
18346 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18348 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18349 local facet=mds$((mdtidx + 1))
18351 cancel_lru_locks mdc
18352 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
18353 createmany -o $dom 1000
18354 lctl set_param -n mdc.*.stats=clear
18355 smalliomany -w $dom 1000 200
18356 get_mdc_stats $mdtidx
18357 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18358 # Each file has 1 open, 1 IO enqueues, total 2000
18359 # but now we have also +1 getxattr for security.capability, total 3000
18360 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
18361 unlinkmany $dom 1000
18363 cancel_lru_locks mdc
18364 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
18365 createmany -o $dom 1000
18366 lctl set_param -n mdc.*.stats=clear
18367 smalliomany -w $dom 1000 200
18368 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18369 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
18370 # for OPEN and IO lock.
18371 [ $((enq - enq_2)) -ge 1000 ] ||
18372 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
18373 unlinkmany $dom 1000
18376 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
18378 cleanup_271def_tests() {
18384 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18385 skip "Need MDS version at least 2.10.57"
18387 local dom=$DIR/$tdir/dom
18388 local tmp=$TMP/$tfile
18389 trap "cleanup_271def_tests $tmp" EXIT
18391 mkdir -p $DIR/$tdir
18393 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18395 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18397 cancel_lru_locks mdc
18398 dd if=/dev/urandom of=$tmp bs=1000 count=1
18399 dd if=$tmp of=$dom bs=1000 count=1
18400 cancel_lru_locks mdc
18402 cat /etc/hosts >> $tmp
18403 lctl set_param -n mdc.*.stats=clear
18405 # append data to the same file it should update local page
18406 echo "Append to the same page"
18407 cat /etc/hosts >> $dom
18408 local num=$(get_mdc_stats $mdtidx ost_read)
18409 local ra=$(get_mdc_stats $mdtidx req_active)
18410 local rw=$(get_mdc_stats $mdtidx req_waittime)
18412 [ -z $num ] || error "$num READ RPC occured"
18413 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18417 cmp $tmp $dom || error "file miscompare"
18419 cancel_lru_locks mdc
18420 lctl set_param -n mdc.*.stats=clear
18422 echo "Open and read file"
18423 cat $dom > /dev/null
18424 local num=$(get_mdc_stats $mdtidx ost_read)
18425 local ra=$(get_mdc_stats $mdtidx req_active)
18426 local rw=$(get_mdc_stats $mdtidx req_waittime)
18428 [ -z $num ] || error "$num READ RPC occured"
18429 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18433 cmp $tmp $dom || error "file miscompare"
18437 run_test 271d "DoM: read on open (1K file in reply buffer)"
18440 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18441 skip "Need MDS version at least 2.10.57"
18443 local dom=$DIR/$tdir/dom
18444 local tmp=$TMP/$tfile
18445 trap "cleanup_271def_tests $tmp" EXIT
18447 mkdir -p $DIR/$tdir
18449 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18451 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18453 cancel_lru_locks mdc
18454 dd if=/dev/urandom of=$tmp bs=200000 count=1
18455 dd if=$tmp of=$dom bs=200000 count=1
18456 cancel_lru_locks mdc
18457 cat /etc/hosts >> $tmp
18458 lctl set_param -n mdc.*.stats=clear
18460 echo "Append to the same page"
18461 cat /etc/hosts >> $dom
18462 local num=$(get_mdc_stats $mdtidx ost_read)
18463 local ra=$(get_mdc_stats $mdtidx req_active)
18464 local rw=$(get_mdc_stats $mdtidx req_waittime)
18466 [ -z $num ] || error "$num READ RPC occured"
18467 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18471 cmp $tmp $dom || error "file miscompare"
18473 cancel_lru_locks mdc
18474 lctl set_param -n mdc.*.stats=clear
18476 echo "Open and read file"
18477 cat $dom > /dev/null
18478 local num=$(get_mdc_stats $mdtidx ost_read)
18479 local ra=$(get_mdc_stats $mdtidx req_active)
18480 local rw=$(get_mdc_stats $mdtidx req_waittime)
18482 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
18483 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18487 cmp $tmp $dom || error "file miscompare"
18491 run_test 271f "DoM: read on open (200K file and read tail)"
18494 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
18495 skip "Skipping due to old client or server version"
18497 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
18499 $CHECKSTAT -t file $DIR1/$tfile
18501 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
18504 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
18505 $LCTL set_param fail_loc=0x80000314
18506 rm $DIR1/$tfile || error "Unlink fails"
18508 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
18509 [ $RC -eq 0 ] || error "Failed write to stale object"
18511 run_test 271g "Discard DoM data vs client flush race"
18514 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18515 skip "Need MDS version at least 2.11.50"
18517 local dom=$DIR/$tdir/dom
18518 mkdir -p $DIR/$tdir
18520 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
18521 dd if=/dev/urandom of=$dom bs=512K count=1 ||
18522 error "failed to write data into $dom"
18523 local old_md5=$(md5sum $dom)
18525 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
18526 error "failed to migrate to the same DoM component"
18528 [ $($LFS getstripe -c $dom) -eq 2 ] ||
18529 error "layout was not changed silently"
18531 local new_md5=$(md5sum $dom)
18533 [ "$old_md5" != "$new_md5" ] &&
18534 error "md5sum differ: $old_md5, $new_md5"
18537 run_test 272a "DoM migration: new layout with the same DOM component"
18540 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18541 skip "Need MDS version at least 2.11.50"
18543 local dom=$DIR/$tdir/dom
18544 mkdir -p $DIR/$tdir
18545 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18547 local mdtidx=$($LFS getstripe -m $dom)
18548 local mdtname=MDT$(printf %04x $mdtidx)
18549 local facet=mds$((mdtidx + 1))
18551 local mdtfree1=$(do_facet $facet \
18552 lctl get_param -n osd*.*$mdtname.kbytesfree)
18553 dd if=/dev/urandom of=$dom bs=2M count=1 ||
18554 error "failed to write data into $dom"
18555 local old_md5=$(md5sum $dom)
18556 cancel_lru_locks mdc
18557 local mdtfree1=$(do_facet $facet \
18558 lctl get_param -n osd*.*$mdtname.kbytesfree)
18560 $LFS migrate -c2 $dom ||
18561 error "failed to migrate to the new composite layout"
18562 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18563 error "MDT stripe was not removed"
18565 cancel_lru_locks mdc
18566 local new_md5=$(md5sum $dom)
18567 [ "$old_md5" != "$new_md5" ] &&
18568 error "$old_md5 != $new_md5"
18570 # Skip free space checks with ZFS
18571 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18572 local mdtfree2=$(do_facet $facet \
18573 lctl get_param -n osd*.*$mdtname.kbytesfree)
18574 [ $mdtfree2 -gt $mdtfree1 ] ||
18575 error "MDT space is not freed after migration"
18579 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
18582 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18583 skip "Need MDS version at least 2.11.50"
18585 local dom=$DIR/$tdir/$tfile
18586 mkdir -p $DIR/$tdir
18587 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18589 local mdtidx=$($LFS getstripe -m $dom)
18590 local mdtname=MDT$(printf %04x $mdtidx)
18591 local facet=mds$((mdtidx + 1))
18593 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18594 error "failed to write data into $dom"
18595 local old_md5=$(md5sum $dom)
18596 cancel_lru_locks mdc
18597 local mdtfree1=$(do_facet $facet \
18598 lctl get_param -n osd*.*$mdtname.kbytesfree)
18600 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18601 error "failed to migrate to the new composite layout"
18602 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18603 error "MDT stripe was not removed"
18605 cancel_lru_locks mdc
18606 local new_md5=$(md5sum $dom)
18607 [ "$old_md5" != "$new_md5" ] &&
18608 error "$old_md5 != $new_md5"
18610 # Skip free space checks with ZFS
18611 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18612 local mdtfree2=$(do_facet $facet \
18613 lctl get_param -n osd*.*$mdtname.kbytesfree)
18614 [ $mdtfree2 -gt $mdtfree1 ] ||
18615 error "MDS space is not freed after migration"
18619 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18622 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18623 skip "Need MDS version at least 2.11.50"
18625 # Layout swap cannot be done if either file has DOM component,
18626 # this will never be supported, migration should be used instead
18628 local dom=$DIR/$tdir/$tfile
18629 mkdir -p $DIR/$tdir
18631 $LFS setstripe -c2 ${dom}_plain
18632 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18633 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18634 error "can swap layout with DoM component"
18635 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18636 error "can swap layout with DoM component"
18638 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18639 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18640 error "can swap layout with DoM component"
18641 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18642 error "can swap layout with DoM component"
18645 run_test 273a "DoM: layout swapping should fail with DOM"
18648 remote_ost_nodsh && skip "remote OST with nodsh"
18649 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18650 skip "Need OST version >= 2.10.57"
18652 local file=$DIR/$tfile
18655 oss=$(comma_list $(osts_nodes))
18657 dd if=/dev/urandom of=$file bs=1M count=2 ||
18658 error "failed to create a file"
18659 cancel_lru_locks osc
18662 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18663 error "failed to read a file"
18665 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
18666 $LCTL set_param fail_loc=0x8000031f
18668 cancel_lru_locks osc &
18671 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
18672 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
18673 #IO takes another lock, but matches the PENDING one
18674 #and places it to the IO RPC
18675 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18676 error "failed to read a file with PENDING lock"
18678 run_test 275 "Read on a canceled duplicate lock"
18681 remote_ost_nodsh && skip "remote OST with nodsh"
18684 do_facet ost1 "(while true; do \
18685 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
18686 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
18689 for LOOP in $(seq 20); do
18691 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
18694 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
18695 rm $TMP/sanity_276_pid"
18697 run_test 276 "Race between mount and obd_statfs"
18699 cleanup_test_300() {
18703 test_striped_dir() {
18708 mkdir -p $DIR/$tdir
18710 SAVE_UMASK=$(umask)
18711 trap cleanup_test_300 RETURN EXIT
18713 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
18714 $DIR/$tdir/striped_dir ||
18715 error "set striped dir error"
18717 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
18718 [ "$mode" = "755" ] || error "expect 755 got $mode"
18720 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
18721 error "getdirstripe failed"
18722 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
18723 if [ "$stripe_count" != "2" ]; then
18724 error "1:stripe_count is $stripe_count, expect 2"
18726 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
18727 if [ "$stripe_count" != "2" ]; then
18728 error "2:stripe_count is $stripe_count, expect 2"
18731 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
18732 if [ "$stripe_index" != "$mdt_index" ]; then
18733 error "stripe_index is $stripe_index, expect $mdt_index"
18736 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18737 error "nlink error after create striped dir"
18739 mkdir $DIR/$tdir/striped_dir/a
18740 mkdir $DIR/$tdir/striped_dir/b
18742 stat $DIR/$tdir/striped_dir/a ||
18743 error "create dir under striped dir failed"
18744 stat $DIR/$tdir/striped_dir/b ||
18745 error "create dir under striped dir failed"
18747 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
18748 error "nlink error after mkdir"
18750 rmdir $DIR/$tdir/striped_dir/a
18751 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
18752 error "nlink error after rmdir"
18754 rmdir $DIR/$tdir/striped_dir/b
18755 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18756 error "nlink error after rmdir"
18758 chattr +i $DIR/$tdir/striped_dir
18759 createmany -o $DIR/$tdir/striped_dir/f 10 &&
18760 error "immutable flags not working under striped dir!"
18761 chattr -i $DIR/$tdir/striped_dir
18763 rmdir $DIR/$tdir/striped_dir ||
18764 error "rmdir striped dir error"
18772 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18773 skip "skipped for lustre < 2.7.0"
18774 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18775 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18777 test_striped_dir 0 || error "failed on striped dir on MDT0"
18778 test_striped_dir 1 || error "failed on striped dir on MDT0"
18780 run_test 300a "basic striped dir sanity test"
18783 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18784 skip "skipped for lustre < 2.7.0"
18785 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18786 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18793 test_mkdir $DIR/$tdir || error "mkdir fail"
18794 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18795 error "set striped dir error"
18796 for i in {0..9}; do
18797 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
18799 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
18800 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
18801 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
18803 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
18804 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
18805 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
18809 run_test 300b "check ctime/mtime for striped dir"
18812 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18813 skip "skipped for lustre < 2.7.0"
18814 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18815 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18819 mkdir -p $DIR/$tdir
18820 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
18821 error "set striped dir error"
18823 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
18824 error "chown striped dir failed"
18826 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
18827 error "create 5k files failed"
18829 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
18831 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
18835 run_test 300c "chown && check ls under striped directory"
18838 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18839 skip "skipped for lustre < 2.7.0"
18840 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18841 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18846 mkdir -p $DIR/$tdir
18847 $SETSTRIPE -c 2 $DIR/$tdir
18849 #local striped directory
18850 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18851 error "set striped dir error"
18852 #look at the directories for debug purposes
18854 $LFS getdirstripe $DIR/$tdir
18855 ls -l $DIR/$tdir/striped_dir
18856 $LFS getdirstripe $DIR/$tdir/striped_dir
18857 createmany -o $DIR/$tdir/striped_dir/f 10 ||
18858 error "create 10 files failed"
18860 #remote striped directory
18861 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
18862 error "set striped dir error"
18863 #look at the directories for debug purposes
18865 $LFS getdirstripe $DIR/$tdir
18866 ls -l $DIR/$tdir/remote_striped_dir
18867 $LFS getdirstripe $DIR/$tdir/remote_striped_dir
18868 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
18869 error "create 10 files failed"
18871 for file in $(find $DIR/$tdir); do
18872 stripe_count=$($LFS getstripe -c $file)
18873 [ $stripe_count -eq 2 ] ||
18874 error "wrong stripe $stripe_count for $file"
18879 run_test 300d "check default stripe under striped directory"
18882 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18883 skip "Need MDS version at least 2.7.55"
18884 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18885 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18890 mkdir -p $DIR/$tdir
18892 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18893 error "set striped dir error"
18895 touch $DIR/$tdir/striped_dir/a
18896 touch $DIR/$tdir/striped_dir/b
18897 touch $DIR/$tdir/striped_dir/c
18899 mkdir $DIR/$tdir/striped_dir/dir_a
18900 mkdir $DIR/$tdir/striped_dir/dir_b
18901 mkdir $DIR/$tdir/striped_dir/dir_c
18903 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
18904 error "set striped adir under striped dir error"
18906 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
18907 error "set striped bdir under striped dir error"
18909 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
18910 error "set striped cdir under striped dir error"
18912 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
18913 error "rename dir under striped dir fails"
18915 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
18916 error "rename dir under different stripes fails"
18918 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
18919 error "rename file under striped dir should succeed"
18921 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
18922 error "rename dir under striped dir should succeed"
18926 run_test 300e "check rename under striped directory"
18929 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18930 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18931 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18932 skip "Need MDS version at least 2.7.55"
18938 mkdir -p $DIR/$tdir
18940 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18941 error "set striped dir error"
18943 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
18944 error "set striped dir error"
18946 touch $DIR/$tdir/striped_dir/a
18947 mkdir $DIR/$tdir/striped_dir/dir_a
18948 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
18949 error "create striped dir under striped dir fails"
18951 touch $DIR/$tdir/striped_dir1/b
18952 mkdir $DIR/$tdir/striped_dir1/dir_b
18953 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
18954 error "create striped dir under striped dir fails"
18956 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
18957 error "rename dir under different striped dir should fail"
18959 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
18960 error "rename striped dir under diff striped dir should fail"
18962 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
18963 error "rename file under diff striped dirs fails"
18967 run_test 300f "check rename cross striped directory"
18969 test_300_check_default_striped_dir()
18972 local default_count=$2
18973 local default_index=$3
18976 local dir_stripe_index
18979 echo "checking $dirname $default_count $default_index"
18980 $LFS setdirstripe -D -c $default_count -i $default_index \
18981 -t all_char $DIR/$tdir/$dirname ||
18982 error "set default stripe on striped dir error"
18983 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
18984 [ $stripe_count -eq $default_count ] ||
18985 error "expect $default_count get $stripe_count for $dirname"
18987 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
18988 [ $stripe_index -eq $default_index ] ||
18989 error "expect $default_index get $stripe_index for $dirname"
18991 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
18992 error "create dirs failed"
18994 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
18995 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
18996 for dir in $(find $DIR/$tdir/$dirname/*); do
18997 stripe_count=$($LFS getdirstripe -c $dir)
18998 [ $stripe_count -eq $default_count ] ||
18999 [ $stripe_count -eq 0 -o $default_count -eq 1 ] ||
19000 error "stripe count $default_count != $stripe_count for $dir"
19002 stripe_index=$($LFS getdirstripe -i $dir)
19003 [ $default_index -eq -1 -o $stripe_index -eq $default_index ] ||
19004 error "$stripe_index != $default_index for $dir"
19006 #check default stripe
19007 stripe_count=$($LFS getdirstripe -D -c $dir)
19008 [ $stripe_count -eq $default_count ] ||
19009 error "default count $default_count != $stripe_count for $dir"
19011 stripe_index=$($LFS getdirstripe -D -i $dir)
19012 [ $stripe_index -eq $default_index ] ||
19013 error "default index $default_index != $stripe_index for $dir"
19015 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
19019 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19020 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19021 skip "Need MDS version at least 2.7.55"
19028 mkdir $DIR/$tdir/normal_dir
19030 #Checking when client cache stripe index
19031 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
19032 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
19033 error "create striped_dir failed"
19035 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
19036 error "create dir0 fails"
19037 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
19038 [ $stripe_index -eq 0 ] ||
19039 error "dir0 expect index 0 got $stripe_index"
19041 mkdir $DIR/$tdir/striped_dir/dir1 ||
19042 error "create dir1 fails"
19043 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
19044 [ $stripe_index -eq 1 ] ||
19045 error "dir1 expect index 1 got $stripe_index"
19047 #check default stripe count/stripe index
19048 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
19049 test_300_check_default_striped_dir normal_dir 1 0
19050 test_300_check_default_striped_dir normal_dir 2 1
19051 test_300_check_default_striped_dir normal_dir 2 -1
19053 #delete default stripe information
19054 echo "delete default stripeEA"
19055 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
19056 error "set default stripe on striped dir error"
19058 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
19059 for dir in $(find $DIR/$tdir/normal_dir/*); do
19060 stripe_count=$($LFS getdirstripe -c $dir)
19061 [ $stripe_count -eq 0 ] ||
19062 error "expect 1 get $stripe_count for $dir"
19063 stripe_index=$($LFS getdirstripe -i $dir)
19064 [ $stripe_index -eq 0 ] ||
19065 error "expect 0 get $stripe_index for $dir"
19068 run_test 300g "check default striped directory for normal directory"
19071 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19072 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19073 skip "Need MDS version at least 2.7.55"
19079 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19080 error "set striped dir error"
19082 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
19083 test_300_check_default_striped_dir striped_dir 1 0
19084 test_300_check_default_striped_dir striped_dir 2 1
19085 test_300_check_default_striped_dir striped_dir 2 -1
19087 #delete default stripe information
19088 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
19089 error "set default stripe on striped dir error"
19091 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
19092 for dir in $(find $DIR/$tdir/striped_dir/*); do
19093 stripe_count=$($LFS getdirstripe -c $dir)
19094 [ $stripe_count -eq 0 ] ||
19095 error "expect 1 get $stripe_count for $dir"
19098 run_test 300h "check default striped directory for striped directory"
19101 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19102 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19103 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19104 skip "Need MDS version at least 2.7.55"
19111 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19112 error "set striped dir error"
19114 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
19115 error "create files under striped dir failed"
19117 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
19118 error "set striped hashdir error"
19120 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
19121 error "create dir0 under hash dir failed"
19122 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
19123 error "create dir1 under hash dir failed"
19125 # unfortunately, we need to umount to clear dir layout cache for now
19126 # once we fully implement dir layout, we can drop this
19127 umount_client $MOUNT || error "umount failed"
19128 mount_client $MOUNT || error "mount failed"
19130 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
19131 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
19132 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
19134 #set the stripe to be unknown hash type
19135 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
19136 $LCTL set_param fail_loc=0x1901
19137 for ((i = 0; i < 10; i++)); do
19138 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
19139 error "stat f-$i failed"
19140 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
19143 touch $DIR/$tdir/striped_dir/f0 &&
19144 error "create under striped dir with unknown hash should fail"
19146 $LCTL set_param fail_loc=0
19148 umount_client $MOUNT || error "umount failed"
19149 mount_client $MOUNT || error "mount failed"
19153 run_test 300i "client handle unknown hash type striped directory"
19156 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19157 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19158 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19159 skip "Need MDS version at least 2.7.55"
19166 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
19167 $LCTL set_param fail_loc=0x1702
19168 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19169 error "set striped dir error"
19171 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
19172 error "create files under striped dir failed"
19174 $LCTL set_param fail_loc=0
19176 rm -rf $DIR/$tdir || error "unlink striped dir fails"
19180 run_test 300j "test large update record"
19183 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19184 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19185 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19186 skip "Need MDS version at least 2.7.55"
19193 #define OBD_FAIL_LARGE_STRIPE 0x1703
19194 $LCTL set_param fail_loc=0x1703
19195 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
19196 error "set striped dir error"
19197 $LCTL set_param fail_loc=0
19199 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19200 error "getstripeddir fails"
19201 rm -rf $DIR/$tdir/striped_dir ||
19202 error "unlink striped dir fails"
19206 run_test 300k "test large striped directory"
19209 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19210 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19211 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19212 skip "Need MDS version at least 2.7.55"
19216 test_mkdir -p $DIR/$tdir/striped_dir
19217 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
19218 error "chown $RUNAS_ID failed"
19219 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
19220 error "set default striped dir failed"
19222 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
19223 $LCTL set_param fail_loc=0x80000158
19224 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
19226 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
19227 [ $stripe_index -eq 1 ] ||
19228 error "expect 1 get $stripe_index for $dir"
19230 run_test 300l "non-root user to create dir under striped dir with stale layout"
19233 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19234 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
19235 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19236 skip "Need MDS version at least 2.7.55"
19238 mkdir -p $DIR/$tdir/striped_dir
19239 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
19240 error "set default stripes dir error"
19242 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
19244 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
19245 [ $stripe_count -eq 0 ] ||
19246 error "expect 0 get $stripe_count for a"
19248 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
19249 error "set default stripes dir error"
19251 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
19253 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
19254 [ $stripe_count -eq 0 ] ||
19255 error "expect 0 get $stripe_count for b"
19257 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
19258 error "set default stripes dir error"
19260 mkdir $DIR/$tdir/striped_dir/c &&
19261 error "default stripe_index is invalid, mkdir c should fails"
19263 rm -rf $DIR/$tdir || error "rmdir fails"
19265 run_test 300m "setstriped directory on single MDT FS"
19268 local list=$(comma_list $(mdts_nodes))
19271 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19275 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19276 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19277 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19278 skip "Need MDS version at least 2.7.55"
19279 remote_mds_nodsh && skip "remote MDS with nodsh"
19282 local list=$(comma_list $(mdts_nodes))
19284 trap cleanup_300n RETURN EXIT
19285 mkdir -p $DIR/$tdir
19286 chmod 777 $DIR/$tdir
19287 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
19288 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19289 error "create striped dir succeeds with gid=0"
19291 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19292 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
19293 error "create striped dir fails with gid=-1"
19295 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19296 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
19297 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19298 error "set default striped dir succeeds with gid=0"
19301 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19302 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
19303 error "set default striped dir fails with gid=-1"
19306 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19307 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
19308 error "create test_dir fails"
19309 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
19310 error "create test_dir1 fails"
19311 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
19312 error "create test_dir2 fails"
19315 run_test 300n "non-root user to create dir under striped dir with default EA"
19318 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19319 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19320 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19321 skip "Need MDS version at least 2.7.55"
19326 mkdir -p $DIR/$tdir
19328 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
19329 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
19330 if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then
19331 skip "not enough free inodes $numfree1 $numfree2"
19334 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
19335 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
19336 if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then
19337 skip "not enough free space $numfree1 $numfree2"
19340 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
19341 error "setdirstripe fails"
19343 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
19344 error "create dirs fails"
19346 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
19347 ls $DIR/$tdir/striped_dir > /dev/null ||
19348 error "ls striped dir fails"
19349 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
19350 error "unlink big striped dir fails"
19352 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
19355 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19356 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19357 remote_mds_nodsh && skip "remote MDS with nodsh"
19359 mkdir -p $DIR/$tdir
19361 #define OBD_FAIL_OUT_ENOSPC 0x1704
19362 do_facet mds2 lctl set_param fail_loc=0x80001704
19363 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
19364 && error "create striped directory should fail"
19366 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
19368 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
19371 run_test 300p "create striped directory without space"
19374 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19375 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19377 local fd=$(free_fd)
19378 local cmd="exec $fd<$tdir"
19380 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
19383 trap "eval $cmd" EXIT
19384 cd $tdir || error "cd $tdir fails"
19385 rmdir ../$tdir || error "rmdir $tdir fails"
19386 mkdir local_dir && error "create dir succeeds"
19387 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
19391 run_test 300q "create remote directory under orphan directory"
19394 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
19395 skip "Need MDS version at least 2.7.55" && return
19396 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19400 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
19401 error "set striped dir error"
19403 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19404 error "getstripeddir fails"
19407 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
19408 awk '/lmv_stripe_count:/ { print $2 }')
19410 [ $MDSCOUNT -ne $stripe_count ] &&
19411 error "wrong stripe count $stripe_count expected $MDSCOUNT"
19413 rm -rf $DIR/$tdir/striped_dir ||
19414 error "unlink striped dir fails"
19416 run_test 300r "test -1 striped directory"
19418 prepare_remote_file() {
19419 mkdir $DIR/$tdir/src_dir ||
19420 error "create remote source failed"
19422 cp /etc/hosts $DIR/$tdir/src_dir/a ||
19423 error "cp to remote source failed"
19424 touch $DIR/$tdir/src_dir/a
19426 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
19427 error "create remote target dir failed"
19429 touch $DIR/$tdir/tgt_dir/b
19431 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
19432 error "rename dir cross MDT failed!"
19434 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
19435 error "src_child still exists after rename"
19437 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
19438 error "missing file(a) after rename"
19440 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
19441 error "diff after rename"
19445 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19446 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19448 local remote_file=$DIR/$tdir/tgt_dir/b
19450 mkdir -p $DIR/$tdir
19452 prepare_remote_file || error "prepare remote file failed"
19455 $OPENUNLINK $remote_file $remote_file ||
19456 error "openunlink $remote_file failed"
19457 $CHECKSTAT -a $remote_file || error "$remote_file exists"
19459 run_test 310a "open unlink remote file"
19462 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19463 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19465 local remote_file=$DIR/$tdir/tgt_dir/b
19467 mkdir -p $DIR/$tdir
19469 prepare_remote_file || error "prepare remote file failed"
19471 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19472 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
19473 $CHECKSTAT -t file $remote_file || error "check file failed"
19475 run_test 310b "unlink remote file with multiple links while open"
19478 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19479 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
19481 local remote_file=$DIR/$tdir/tgt_dir/b
19483 mkdir -p $DIR/$tdir
19485 prepare_remote_file || error "prepare remote file failed"
19487 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19488 multiop_bg_pause $remote_file O_uc ||
19489 error "mulitop failed for remote file"
19491 $MULTIOP $DIR/$tfile Ouc
19492 kill -USR1 $MULTIPID
19495 run_test 310c "open-unlink remote file with multiple links"
19499 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19500 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19501 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
19502 skip "lustre < 2.8.54 does not contain LU-4825 fix"
19503 remote_mds_nodsh && skip "remote MDS with nodsh"
19505 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19506 local mdts=$(comma_list $(mdts_nodes))
19508 mkdir -p $DIR/$tdir
19509 $SETSTRIPE -i 0 -c 1 $DIR/$tdir
19510 createmany -o $DIR/$tdir/$tfile. 1000
19512 # statfs data is not real time, let's just calculate it
19513 old_iused=$((old_iused + 1000))
19515 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19516 osp.*OST0000*MDT0000.create_count")
19517 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19518 osp.*OST0000*MDT0000.max_create_count")
19519 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
19521 $SETSTRIPE -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
19522 local index=$($GETSTRIPE -i $DIR/$tdir/$tfile)
19523 [ $index -ne 0 ] || error "$tfile stripe index is 0"
19525 unlinkmany $DIR/$tdir/$tfile. 1000
19527 do_nodes $mdts "$LCTL set_param -n \
19528 osp.*OST0000*.max_create_count=$max_count"
19529 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
19530 do_nodes $mdts "$LCTL set_param -n \
19531 osp.*OST0000*.create_count=$count"
19532 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
19533 grep "=0" && error "create_count is zero"
19536 for i in $(seq 120); do
19537 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19538 # system may be too busy to destroy all objs in time, use
19539 # a somewhat small value to not fail autotest
19540 [ $((old_iused - new_iused)) -gt 400 ] && break
19544 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
19545 [ $((old_iused - new_iused)) -gt 400 ] ||
19546 error "objs not destroyed after unlink"
19548 run_test 311 "disable OSP precreate, and unlink should destroy objs"
19555 local vdevdir=$(dirname $(facet_vdevice $ost))
19556 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
19557 local zfs_zapid=$(do_facet $ost $cmd |
19558 grep -w "/O/0/d$((objid%32))" -C 5 |
19559 awk '/Object/{getline; print $1}')
19560 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
19561 awk "/$objid = /"'{printf $3}')
19566 zfs_object_blksz() {
19570 local vdevdir=$(dirname $(facet_vdevice $ost))
19571 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
19572 local blksz=$(do_facet $ost $cmd $objid |
19573 awk '/dblk/{getline; printf $4}')
19575 case "${blksz: -1}" in
19576 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
19577 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
19584 test_312() { # LU-4856
19585 remote_ost_nodsh && skip "remote OST with nodsh"
19586 [ "$ost1_FSTYPE" = "zfs" ] ||
19587 skip_env "the test only applies to zfs"
19589 local max_blksz=$(do_facet ost1 \
19590 $ZFS get -p recordsize $(facet_device ost1) |
19591 awk '!/VALUE/{print $3}')
19593 # to make life a little bit easier
19594 $LFS mkdir -c 1 -i 0 $DIR/$tdir
19595 $LFS setstripe -c 1 -i 0 $DIR/$tdir
19597 local tf=$DIR/$tdir/$tfile
19599 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19601 # Get ZFS object id
19602 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19603 # block size change by sequential overwrite
19606 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
19607 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
19609 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
19610 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19614 # block size change by sequential append write
19615 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19616 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19617 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19620 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19621 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19622 oflag=sync conv=notrunc
19624 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19625 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19626 error "blksz error, actual $blksz, " \
19627 "expected: 2 * $count * $PAGE_SIZE"
19633 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19634 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19636 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
19637 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19638 [ $blksz -eq $PAGE_SIZE ] ||
19639 error "blksz error: $blksz, expected: $PAGE_SIZE"
19641 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
19642 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19643 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
19645 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
19646 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19647 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
19649 run_test 312 "make sure ZFS adjusts its block size by write pattern"
19652 remote_ost_nodsh && skip "remote OST with nodsh"
19654 local file=$DIR/$tfile
19657 $SETSTRIPE -c 1 -i 0 $file || error "setstripe failed"
19659 # define OBD_FAIL_TGT_RCVD_EIO 0x720
19660 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19661 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
19662 error "write should failed"
19663 do_facet ost1 "$LCTL set_param fail_loc=0"
19666 run_test 313 "io should fail after last_rcvd update fail"
19669 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19671 $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
19672 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19674 wait_delete_completed
19675 do_facet ost1 "$LCTL set_param fail_loc=0"
19677 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
19679 test_315() { # LU-618
19680 local file=$DIR/$tfile
19683 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
19684 error "multiop file write failed"
19685 $MULTIOP $file oO_RDONLY:r4063232_c &
19690 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
19693 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
19696 run_test 315 "read should be accounted"
19699 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19700 large_xattr_enabled || skip_env "ea_inode feature disabled"
19702 rm -rf $DIR/$tdir/d
19703 mkdir -p $DIR/$tdir/d
19704 chown nobody $DIR/$tdir/d
19705 touch $DIR/$tdir/d/file
19707 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
19709 run_test 316 "lfs mv"
19712 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
19713 skip "Need MDS version at least 2.11.53"
19714 if [ "$ost1_FSTYPE" == "zfs" ]; then
19715 skip "LU-10370: no implementation for ZFS"
19719 local grant_blk_size
19721 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
19722 awk '/grant_block_size:/ { print $2; exit; }')
19724 # Create File of size 5M. Truncate it to below size's and verify
19727 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
19728 error "Create file $DIR/$tfile failed"
19729 stack_trap "rm -f $DIR/$tfile" EXIT
19731 for trunc_sz in 2097152 4097 4000 509 0; do
19732 $TRUNCATE $DIR/$tfile $trunc_sz ||
19733 error "truncate $tfile to $trunc_sz failed"
19734 local sz=$(stat --format=%s $DIR/$tfile)
19735 local blk=$(stat --format=%b $DIR/$tfile)
19736 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
19737 grant_blk_size) * 8))
19739 if [[ $blk -ne $trunc_blk ]]; then
19740 $(which stat) $DIR/$tfile
19741 error "Expected Block $trunc_blk got $blk for $tfile"
19744 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19745 error "Expected Size $trunc_sz got $sz for $tfile"
19750 # Create file with a hole and write actual two blocks. Block count
19753 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
19754 conv=fsync || error "Create file : $DIR/$tfile"
19756 # Calculate the final truncate size.
19757 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
19760 # truncate to size $trunc_sz bytes. Strip the last block
19761 # The block count must drop to 8
19763 $TRUNCATE $DIR/$tfile $trunc_sz ||
19764 error "truncate $tfile to $trunc_sz failed"
19766 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
19767 sz=$(stat --format=%s $DIR/$tfile)
19768 blk=$(stat --format=%b $DIR/$tfile)
19770 if [[ $blk -ne $trunc_bsz ]]; then
19771 $(which stat) $DIR/$tfile
19772 error "Expected Block $trunc_bsz got $blk for $tfile"
19775 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19776 error "Expected Size $trunc_sz got $sz for $tfile"
19778 run_test 317 "Verify blocks get correctly update after truncate"
19781 local read_write=$1
19782 if [ "$read_write" = "write" ]; then
19783 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
19784 elif [ "$read_write" = "read" ]; then
19785 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
19787 error "argument error"
19790 # turn off debug for performance testing
19791 local saved_debug=$($LCTL get_param -n debug)
19792 $LCTL set_param debug=0
19794 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
19796 # get ost1 size - lustre-OST0000
19797 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
19798 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
19799 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
19801 if [ "$read_write" = "read" ]; then
19802 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
19805 local start_time=$(date +%s.%N)
19806 $dd_cmd bs=1M count=$blocks oflag=sync ||
19807 error "real dd $read_write error"
19808 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
19810 if [ "$read_write" = "write" ]; then
19814 # define OBD_FAIL_OST_FAKE_RW 0x238
19815 do_facet ost1 $LCTL set_param fail_loc=0x238
19817 local start_time=$(date +%s.%N)
19818 $dd_cmd bs=1M count=$blocks oflag=sync ||
19819 error "fake dd $read_write error"
19820 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
19822 if [ "$read_write" = "write" ]; then
19824 cancel_lru_locks osc
19825 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
19826 error "$tfile size not $blocks MB"
19828 do_facet ost1 $LCTL set_param fail_loc=0
19830 echo "fake $read_write $duration_fake vs. normal $read_write" \
19831 "$duration in seconds"
19832 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
19833 error_not_in_vm "fake write is slower"
19835 $LCTL set_param -n debug="$saved_debug"
19838 test_399a() { # LU-7655 for OST fake write
19839 remote_ost_nodsh && skip "remote OST with nodsh"
19843 run_test 399a "fake write should not be slower than normal write"
19845 test_399b() { # LU-8726 for OST fake read
19846 remote_ost_nodsh && skip "remote OST with nodsh"
19847 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
19848 skip_env "ldiskfs only test"
19853 run_test 399b "fake read should not be slower than normal read"
19855 test_400a() { # LU-1606, was conf-sanity test_74
19856 if ! which $CC > /dev/null 2>&1; then
19857 skip_env "$CC is not installed"
19860 local extra_flags=''
19861 local out=$TMP/$tfile
19862 local prefix=/usr/include/lustre
19865 # Oleg removes c files in his test rig so test if any c files exist
19866 [ -z "$(ls -A $LUSTRE_TESTS_API_DIR)" ] && \
19867 skip_env "Needed c test files are missing"
19869 if ! [[ -d $prefix ]]; then
19870 # Assume we're running in tree and fixup the include path.
19871 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
19872 extra_flags+=" -L$LUSTRE/utils/.lib"
19875 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
19876 $CC -Wall -Werror -std=c99 $extra_flags -o $out $prog -llustreapi ||
19877 error "client api broken"
19881 run_test 400a "Lustre client api program can compile and link"
19883 test_400b() { # LU-1606, LU-5011
19885 local out=$TMP/$tfile
19886 local prefix=/usr/include/linux/lustre
19888 # We use a hard coded prefix so that this test will not fail
19889 # when run in tree. There are headers in lustre/include/lustre/
19890 # that are not packaged (like lustre_idl.h) and have more
19891 # complicated include dependencies (like config.h and lnet/types.h).
19892 # Since this test about correct packaging we just skip them when
19893 # they don't exist (see below) rather than try to fixup cppflags.
19895 if ! which $CC > /dev/null 2>&1; then
19896 skip_env "$CC is not installed"
19899 for header in $prefix/*.h; do
19900 if ! [[ -f "$header" ]]; then
19904 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
19905 continue # lustre_ioctl.h is internal header
19908 $CC -Wall -Werror -std=c99 -include $header -c -x c /dev/null -o $out ||
19909 error "cannot compile '$header'"
19913 run_test 400b "packaged headers can be compiled"
19915 test_401a() { #LU-7437
19916 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
19917 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
19919 #count the number of parameters by "list_param -R"
19920 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
19921 #count the number of parameters by listing proc files
19922 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
19923 echo "proc_dirs='$proc_dirs'"
19924 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
19925 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
19928 [ $params -eq $procs ] ||
19929 error "found $params parameters vs. $procs proc files"
19931 # test the list_param -D option only returns directories
19932 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
19933 #count the number of parameters by listing proc directories
19934 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
19937 [ $params -eq $procs ] ||
19938 error "found $params parameters vs. $procs proc files"
19940 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
19943 local save=$($LCTL get_param -n jobid_var)
19946 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
19947 error "no error returned when setting bad parameters"
19949 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
19950 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
19952 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
19953 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
19954 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
19956 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
19959 local jobid_var_old=$($LCTL get_param -n jobid_var)
19960 local jobid_var_new
19962 $LCTL set_param jobid_var= &&
19963 error "no error returned for 'set_param a='"
19965 jobid_var_new=$($LCTL get_param -n jobid_var)
19966 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19967 error "jobid_var was changed by setting without value"
19969 $LCTL set_param jobid_var &&
19970 error "no error returned for 'set_param a'"
19972 jobid_var_new=$($LCTL get_param -n jobid_var)
19973 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19974 error "jobid_var was changed by setting without value"
19976 run_test 401c "Verify 'lctl set_param' without value fails in either format."
19979 local jobid_var_old=$($LCTL get_param -n jobid_var)
19980 local jobid_var_new
19981 local new_value="foo=bar"
19983 $LCTL set_param jobid_var=$new_value ||
19984 error "'set_param a=b' did not accept a value containing '='"
19986 jobid_var_new=$($LCTL get_param -n jobid_var)
19987 [[ "$jobid_var_new" == "$new_value" ]] ||
19988 error "'set_param a=b' failed on a value containing '='"
19990 # Reset the jobid_var to test the other format
19991 $LCTL set_param jobid_var=$jobid_var_old
19992 jobid_var_new=$($LCTL get_param -n jobid_var)
19993 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19994 error "failed to reset jobid_var"
19996 $LCTL set_param jobid_var $new_value ||
19997 error "'set_param a b' did not accept a value containing '='"
19999 jobid_var_new=$($LCTL get_param -n jobid_var)
20000 [[ "$jobid_var_new" == "$new_value" ]] ||
20001 error "'set_param a b' failed on a value containing '='"
20003 $LCTL set_param jobid_var $jobid_var_old
20004 jobid_var_new=$($LCTL get_param -n jobid_var)
20005 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
20006 error "failed to reset jobid_var"
20008 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
20011 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
20012 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
20013 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
20014 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
20015 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
20016 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
20017 remote_mds_nodsh && skip "remote MDS with nodsh"
20019 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
20020 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
20021 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
20022 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
20023 echo "Touch failed - OK"
20025 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
20028 local file1=$DIR/$tfile.1
20029 local file2=$DIR/$tfile.2
20030 local tfile=$TMP/$tfile
20032 rm -f $file1 $file2 $tfile
20037 # 30 sec OBD_TIMEOUT in ll_getattr()
20038 # right before populating st_nlink
20039 $LCTL set_param fail_loc=0x80001409
20040 stat -c %h $file1 > $tfile &
20042 # create an alias, drop all locks and reclaim the dentry
20044 cancel_lru_locks mdc
20045 cancel_lru_locks osc
20046 sysctl -w vm.drop_caches=2
20050 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
20052 rm -f $tfile $file1 $file2
20054 run_test 403 "i_nlink should not drop to zero due to aliasing"
20056 test_404() { # LU-6601
20057 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
20058 skip "Need server version newer than 2.8.52"
20059 remote_mds_nodsh && skip "remote MDS with nodsh"
20061 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
20062 awk '/osp .*-osc-MDT/ { print $4}')
20065 for osp in $mosps; do
20066 echo "Deactivate: " $osp
20067 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
20068 local stat=$(do_facet $SINGLEMDS $LCTL dl |
20069 awk -vp=$osp '$4 == p { print $2 }')
20070 [ $stat = IN ] || {
20071 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
20072 error "deactivate error"
20074 echo "Activate: " $osp
20075 do_facet $SINGLEMDS $LCTL --device %$osp activate
20076 local stat=$(do_facet $SINGLEMDS $LCTL dl |
20077 awk -vp=$osp '$4 == p { print $2 }')
20078 [ $stat = UP ] || {
20079 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
20080 error "activate error"
20084 run_test 404 "validate manual {de}activated works properly for OSPs"
20087 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] ||
20088 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
20089 skip "Layout swap lock is not supported"
20091 check_swap_layouts_support
20093 test_mkdir $DIR/$tdir
20094 swap_lock_test -d $DIR/$tdir ||
20095 error "One layout swap locked test failed"
20097 run_test 405 "Various layout swap lock tests"
20100 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20101 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
20102 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
20103 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20104 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
20105 skip "Need MDS version at least 2.8.50"
20107 local def_stripe_size=$($LFS getstripe -S $MOUNT)
20108 local test_pool=$TESTNAME
20110 pool_add $test_pool || error "pool_add failed"
20111 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
20112 error "pool_add_targets failed"
20114 save_layout_restore_at_exit $MOUNT
20116 # parent set default stripe count only, child will stripe from both
20117 # parent and fs default
20118 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
20119 error "setstripe $MOUNT failed"
20120 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
20121 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
20122 for i in $(seq 10); do
20123 local f=$DIR/$tdir/$tfile.$i
20124 touch $f || error "touch failed"
20125 local count=$($LFS getstripe -c $f)
20126 [ $count -eq $OSTCOUNT ] ||
20127 error "$f stripe count $count != $OSTCOUNT"
20128 local offset=$($LFS getstripe -i $f)
20129 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
20130 local size=$($LFS getstripe -S $f)
20131 [ $size -eq $((def_stripe_size * 2)) ] ||
20132 error "$f stripe size $size != $((def_stripe_size * 2))"
20133 local pool=$($LFS getstripe -p $f)
20134 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
20137 # change fs default striping, delete parent default striping, now child
20138 # will stripe from new fs default striping only
20139 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
20140 error "change $MOUNT default stripe failed"
20141 $LFS setstripe -c 0 $DIR/$tdir ||
20142 error "delete $tdir default stripe failed"
20143 for i in $(seq 11 20); do
20144 local f=$DIR/$tdir/$tfile.$i
20145 touch $f || error "touch $f failed"
20146 local count=$($LFS getstripe -c $f)
20147 [ $count -eq 1 ] || error "$f stripe count $count != 1"
20148 local offset=$($LFS getstripe -i $f)
20149 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
20150 local size=$($LFS getstripe -S $f)
20151 [ $size -eq $def_stripe_size ] ||
20152 error "$f stripe size $size != $def_stripe_size"
20153 local pool=$($LFS getstripe -p $f)
20154 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
20157 unlinkmany $DIR/$tdir/$tfile. 1 20
20159 local f=$DIR/$tdir/$tfile
20160 pool_remove_all_targets $test_pool $f
20161 pool_remove $test_pool $f
20163 run_test 406 "DNE support fs default striping"
20166 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20167 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
20168 skip "Need MDS version at least 2.8.55"
20169 remote_mds_nodsh && skip "remote MDS with nodsh"
20171 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
20172 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
20173 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
20174 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
20175 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
20177 #define OBD_FAIL_DT_TXN_STOP 0x2019
20178 for idx in $(seq $MDSCOUNT); do
20179 do_facet mds$idx "lctl set_param fail_loc=0x2019"
20181 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
20182 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
20183 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
20186 run_test 407 "transaction fail should cause operation fail"
20189 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
20191 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
20192 lctl set_param fail_loc=0x8000040a
20193 # let ll_prepare_partial_page() fail
20194 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
20198 # create at least 100 unused inodes so that
20199 # shrink_icache_memory(0) should not return 0
20200 touch $DIR/$tfile-{0..100}
20201 rm -f $DIR/$tfile-{0..100}
20204 echo 2 > /proc/sys/vm/drop_caches
20206 run_test 408 "drop_caches should not hang due to page leaks"
20210 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20211 check_mount_and_prep
20213 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
20214 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
20215 touch $DIR/$tdir/guard || error "(2) Fail to create"
20217 local PREFIX=$(str_repeat 'A' 128)
20218 echo "Create 1K hard links start at $(date)"
20219 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20220 error "(3) Fail to hard link"
20222 echo "Links count should be right although linkEA overflow"
20223 stat $DIR/$tdir/guard || error "(4) Fail to stat"
20224 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
20225 [ $linkcount -eq 1001 ] ||
20226 error "(5) Unexpected hard links count: $linkcount"
20228 echo "List all links start at $(date)"
20229 ls -l $DIR/$tdir/foo > /dev/null ||
20230 error "(6) Fail to list $DIR/$tdir/foo"
20232 echo "Unlink hard links start at $(date)"
20233 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20234 error "(7) Fail to unlink"
20236 run_test 409 "Large amount of cross-MDTs hard links on the same file"
20240 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
20241 skip "Need client version at least 2.9.59"
20243 # Create a file, and stat it from the kernel
20244 local testfile=$DIR/$tfile
20247 local run_id=$RANDOM
20248 local my_ino=$(stat --format "%i" $testfile)
20250 # Try to insert the module. This will always fail as the
20251 # module is designed to not be inserted.
20252 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
20255 # Anything but success is a test failure
20257 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
20258 error "no inode match"
20260 run_test 410 "Test inode number returned from kernel thread"
20262 cleanup_test411_cgroup() {
20268 local cg_basedir=/sys/fs/cgroup/memory
20270 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
20271 skip "no setup for cgroup"
20273 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
20274 error "test file creation failed"
20275 cancel_lru_locks osc
20277 # Create a very small memory cgroup to force a slab allocation error
20278 local cgdir=$cg_basedir/osc_slab_alloc
20279 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
20280 trap "cleanup_test411_cgroup $cgdir" EXIT
20281 echo 2M > $cgdir/memory.kmem.limit_in_bytes
20282 echo 1M > $cgdir/memory.limit_in_bytes
20284 # Should not LBUG, just be killed by oom-killer
20285 # dd will return 0 even allocation failure in some environment.
20286 # So don't check return value
20287 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
20288 cleanup_test411_cgroup $cgdir
20292 run_test 411 "Slab allocation error with cgroup does not LBUG"
20295 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20296 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20297 skip "Need server version at least 2.10.55"
20300 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
20301 error "mkdir failed"
20302 $LFS getdirstripe $DIR/$tdir
20303 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
20304 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
20305 error "expect $((MDSCOUT - 1)) get $stripe_index"
20306 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
20307 [ $stripe_count -eq 2 ] ||
20308 error "expect 2 get $stripe_count"
20310 run_test 412 "mkdir on specific MDTs"
20313 [ $MDSCOUNT -lt 2 ] &&
20314 skip "We need at least 2 MDTs for this test"
20316 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20317 skip "Need server version at least 2.10.55"
20320 mkdir $DIR/$tdir || error "mkdir failed"
20322 # find MDT that is the most full
20323 local max=$($LFS df | grep MDT |
20332 END { split(b, c, ":")
20337 for i in $(seq $((MDSCOUNT - 1))); do
20338 $LFS mkdir -c $i $DIR/$tdir/d$i ||
20339 error "mkdir d$i failed"
20340 $LFS getdirstripe $DIR/$tdir/d$i
20341 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
20342 [ $stripe_index -ne $max ] ||
20343 error "don't expect $max"
20346 run_test 413 "mkdir on less full MDTs"
20349 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
20350 $LCTL set_param fail_loc=0x80000521
20351 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
20354 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
20357 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20358 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
20359 skip "Need server version at least 2.11.52"
20369 # this test may be slow on ZFS
20370 [ "$mds1_FSTYPE" == "zfs" ] && total=100
20372 # though this test is designed for striped directory, let's test normal
20373 # directory too since lock is always saved as CoS lock.
20374 test_mkdir $DIR/$tdir || error "mkdir $tdir"
20375 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
20384 start_time=$(date +%s)
20385 for i in $(seq $total); do
20386 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
20389 end_time=$(date +%s)
20390 duration=$((end_time - start_time))
20392 kill -9 $setattr_pid
20394 echo "rename $total files took $duration sec"
20395 [ $duration -lt 100 ] || error "rename took $duration sec"
20397 run_test 415 "lock revoke is not missing"
20400 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
20401 skip "Need server version at least 2.11.55"
20403 # define OBD_FAIL_OSD_TXN_START 0x19a
20404 do_facet mds1 lctl set_param fail_loc=0x19a
20406 lfs mkdir -c $MDSCOUNT $DIR/$tdir
20410 run_test 416 "transaction start failure won't cause system hung"
20414 do_nodes $(comma_list $(mdts_nodes)) \
20415 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
20416 do_nodes $(comma_list $(mdts_nodes)) \
20417 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
20418 do_nodes $(comma_list $(mdts_nodes)) \
20419 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
20423 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20424 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
20425 skip "Need MDS version at least 2.11.56"
20427 trap cleanup_417 RETURN EXIT
20429 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
20430 do_nodes $(comma_list $(mdts_nodes)) \
20431 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
20432 $LFS migrate -m 0 $DIR/$tdir.1 &&
20433 error "migrate dir $tdir.1 should fail"
20435 do_nodes $(comma_list $(mdts_nodes)) \
20436 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
20437 $LFS mkdir -i 1 $DIR/$tdir.2 &&
20438 error "create remote dir $tdir.2 should fail"
20440 do_nodes $(comma_list $(mdts_nodes)) \
20441 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
20442 $LFS mkdir -c 2 $DIR/$tdir.3 &&
20443 error "create striped dir $tdir.3 should fail"
20446 run_test 417 "disable remote dir, striped dir and dir migration"
20448 # Checks that the outputs of df [-i] and lfs df [-i] match
20450 # usage: check_lfs_df <blocks | inodes> <mountpoint>
20460 [ "$1" == "blocks" ] && inodes= || inodes="-i"
20462 for count in {1..100}; do
20466 # read the lines of interest
20467 df_out=($(df -P $inodes $dir | tail -n +2)) ||
20468 error "df $inodes $dir | tail -n +2 failed"
20469 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
20470 error "lfs df $inodes $dir | grep summary: failed"
20472 # skip first substrings of each output as they are different
20473 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
20474 # compare the remaining fields of the two outputs
20476 for i in {1..5}; do
20477 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
20485 lfs df $inodes $dir
20486 error "df and lfs df $1 output mismatch: " \
20487 "df ${inodes}: ${df_out[*]}, " \
20488 "lfs df ${inodes}: ${lfs_df_out[*]}"
20493 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20495 local dir=$DIR/$tdir
20496 local numfiles=$((RANDOM % 4096 + 2))
20497 local numblocks=$((RANDOM % 256 + 1))
20499 wait_delete_completed
20502 # check block output
20503 check_lfs_df blocks $dir
20504 # check inode output
20505 check_lfs_df inodes $dir
20507 # create a single file and retest
20508 echo "Creating a single file and testing"
20509 createmany -o $dir/$tfile- 1 &>/dev/null ||
20510 error "creating 1 file in $dir failed"
20511 check_lfs_df blocks $dir
20512 check_lfs_df inodes $dir
20514 # create a random number of files
20515 echo "Creating $((numfiles - 1)) files and testing"
20516 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
20517 error "creating $((numfiles - 1)) files in $dir failed"
20519 # write a random number of blocks to the first test file
20520 echo "Writing $numblocks 4K blocks and testing"
20521 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
20522 count=$numblocks &>/dev/null ||
20523 error "dd to $dir/${tfile}-0 failed"
20526 check_lfs_df blocks $dir
20527 check_lfs_df inodes $dir
20529 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
20530 error "unlinking $numfiles files in $dir failed"
20532 run_test 418 "df and lfs df outputs match"
20536 local dir=$DIR/$tdir
20541 cancel_lru_locks mdc
20543 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
20544 $LCTL set_param fail_loc=0x1410
20546 $LCTL set_param fail_loc=0
20549 run_test 419 "Verify open file by name doesn't crash kernel"
20553 [[ $MDS1_VERSION -ge $(version_code 2.12.1) ]] ||
20554 skip "Need MDS version at least 2.12.1"
20556 local SAVE_UMASK=$(umask)
20557 local dir=$DIR/$tdir
20558 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
20562 mkdir -m03777 $dir/testdir
20563 ls -dn $dir/testdir
20564 # Need to remove trailing '.' when SELinux is enabled
20565 local dirperms=$(ls -dn $dir/testdir |
20566 awk '{ sub(/\.$/, "", $1); print $1}')
20567 [ $dirperms == "drwxrwsrwt" ] ||
20568 error "incorrect perms on $dir/testdir"
20570 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
20571 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
20572 ls -n $dir/testdir/testfile
20573 local fileperms=$(ls -n $dir/testdir/testfile |
20574 awk '{ sub(/\.$/, "", $1); print $1}')
20575 [ $fileperms == "-rwxr-xr-x" ] ||
20576 error "incorrect perms on $dir/testdir/testfile"
20580 run_test 420 "clear SGID bit on non-directories for non-members"
20587 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20588 skip "Need MDS version at least 2.12.2"
20590 test_mkdir $DIR/$tdir
20591 createmany -o $DIR/$tdir/f 3
20592 cnt=$(ls -1 $DIR/$tdir | wc -l)
20593 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20595 fid1=$(lfs path2fid $DIR/$tdir/f1)
20596 fid2=$(lfs path2fid $DIR/$tdir/f2)
20597 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
20599 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
20600 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
20602 cnt=$(ls -1 $DIR/$tdir | wc -l)
20603 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20605 rm -f $DIR/$tdir/f3 || error "can't remove f3"
20606 createmany -o $DIR/$tdir/f 3
20607 cnt=$(ls -1 $DIR/$tdir | wc -l)
20608 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20610 fid1=$(lfs path2fid $DIR/$tdir/f1)
20611 fid2=$(lfs path2fid $DIR/$tdir/f2)
20612 echo "remove using fsname $FSNAME"
20613 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
20615 cnt=$(ls -1 $DIR/$tdir | wc -l)
20616 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20618 run_test 421a "simple rm by fid"
20625 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20626 skip "Need MDS version at least 2.12.2"
20628 test_mkdir $DIR/$tdir
20629 createmany -o $DIR/$tdir/f 3
20630 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
20633 FID1=$(lfs path2fid $DIR/$tdir/f1)
20634 FID2=$(lfs path2fid $DIR/$tdir/f2)
20635 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
20637 kill -USR1 $MULTIPID
20640 cnt=$(ls $DIR/$tdir | wc -l)
20641 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
20643 run_test 421b "rm by fid on open file"
20649 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20650 skip "Need MDS version at least 2.12.2"
20652 test_mkdir $DIR/$tdir
20653 createmany -o $DIR/$tdir/f 3
20654 touch $DIR/$tdir/$tfile
20655 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
20656 cnt=$(ls -1 $DIR/$tdir | wc -l)
20657 [ $cnt != 184 ] && error "unexpected #files: $cnt"
20659 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
20660 $LFS rmfid $DIR $FID1 || error "rmfid failed"
20662 cnt=$(ls $DIR/$tdir | wc -l)
20663 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
20665 run_test 421c "rm by fid against hardlinked files"
20671 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20672 skip "Need MDS version at least 2.12.2"
20674 test_mkdir $DIR/$tdir
20675 createmany -o $DIR/$tdir/f 4097
20676 cnt=$(ls -1 $DIR/$tdir | wc -l)
20677 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
20679 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
20680 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20682 cnt=$(ls $DIR/$tdir | wc -l)
20684 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20686 run_test 421d "rmfid en masse"
20692 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20693 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20694 skip "Need MDS version at least 2.12.2"
20696 mkdir -p $DIR/$tdir
20697 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20698 createmany -o $DIR/$tdir/striped_dir/f 512
20699 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20700 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20702 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20703 sed "s/[/][^:]*://g")
20704 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20706 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20708 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20710 run_test 421e "rmfid in DNE"
20716 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20717 skip "Need MDS version at least 2.12.2"
20719 test_mkdir $DIR/$tdir
20721 cnt=$(ls -1 $DIR/$tdir | wc -l)
20722 [ $cnt != 1 ] && error "unexpected #files: $cnt"
20724 FID=$(lfs path2fid $DIR/$tdir/f)
20725 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
20726 # rmfid should fail
20727 cnt=$(ls -1 $DIR/$tdir | wc -l)
20728 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
20730 chmod a+rw $DIR/$tdir
20732 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
20733 # rmfid should fail
20734 cnt=$(ls -1 $DIR/$tdir | wc -l)
20735 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
20738 $RUNAS touch $DIR/$tdir/f
20739 FID=$(lfs path2fid $DIR/$tdir/f)
20740 echo "rmfid as root"
20741 $LFS rmfid $DIR $FID || error "rmfid as root failed"
20742 cnt=$(ls -1 $DIR/$tdir | wc -l)
20743 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
20746 $RUNAS touch $DIR/$tdir/f
20747 cnt=$(ls -1 $DIR/$tdir | wc -l)
20748 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
20749 FID=$(lfs path2fid $DIR/$tdir/f)
20750 # rmfid w/o user_fid2path mount option should fail
20751 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
20752 cnt=$(ls -1 $DIR/$tdir | wc -l)
20753 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
20755 umount_client $MOUNT || "failed to umount client"
20756 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
20757 "failed to mount client'"
20759 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
20760 # rmfid should succeed
20761 cnt=$(ls -1 $DIR/$tdir | wc -l)
20762 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
20764 # rmfid shouldn't allow to remove files due to dir's permission
20765 chmod a+rwx $DIR/$tdir
20768 FID=$(lfs path2fid $DIR/$tdir/f)
20769 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
20771 umount_client $MOUNT || "failed to umount client"
20772 mount_client $MOUNT "$MOUNT_OPTS" ||
20773 "failed to mount client'"
20776 run_test 421f "rmfid checks permissions"
20782 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20783 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20784 skip "Need MDS version at least 2.12.2"
20786 mkdir -p $DIR/$tdir
20787 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20788 createmany -o $DIR/$tdir/striped_dir/f 512
20789 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20790 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20792 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20793 sed "s/[/][^:]*://g")
20795 rm -f $DIR/$tdir/striped_dir/f1*
20796 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20797 removed=$((512 - cnt))
20799 # few files have been just removed, so we expect
20800 # rmfid to fail on their fids
20801 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
20802 [ $removed != $errors ] && error "$errors != $removed"
20804 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20806 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20808 run_test 421g "rmfid to return errors properly"
20821 # ensure statfs cache is expired
20824 _stats=$(stat_test | grep $MOUNT | sort -u | wc -l)
20825 [[ ${_stats} -ne 1 ]] && error "statfs wrong"
20829 run_test 423 "statfs should return a right data"
20832 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20833 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20834 skip "Need server version at least 2.9.55"
20836 start_full_debug_logging
20840 stop_full_debug_logging
20844 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20845 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20846 awk '/The barrier for/ { print $7 }')
20849 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
20854 barrier_expired() {
20857 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20858 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20859 awk '/will be expired/ { print $7 }')
20861 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
20870 echo "Start barrier_freeze at: $(date)"
20871 #define OBD_FAIL_BARRIER_DELAY 0x2202
20872 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20873 # Do not reduce barrier time - See LU-11873
20874 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
20877 local b_status=$(barrier_stat)
20878 echo "Got barrier status at: $(date)"
20879 [ "$b_status" = "'freezing_p1'" ] ||
20880 error "(1) unexpected barrier status $b_status"
20882 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20884 b_status=$(barrier_stat)
20885 [ "$b_status" = "'frozen'" ] ||
20886 error "(2) unexpected barrier status $b_status"
20888 local expired=$(barrier_expired)
20889 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
20890 sleep $((expired + 3))
20892 b_status=$(barrier_stat)
20893 [ "$b_status" = "'expired'" ] ||
20894 error "(3) unexpected barrier status $b_status"
20896 # Do not reduce barrier time - See LU-11873
20897 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
20898 error "(4) fail to freeze barrier"
20900 b_status=$(barrier_stat)
20901 [ "$b_status" = "'frozen'" ] ||
20902 error "(5) unexpected barrier status $b_status"
20904 echo "Start barrier_thaw at: $(date)"
20905 #define OBD_FAIL_BARRIER_DELAY 0x2202
20906 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20907 do_facet mgs $LCTL barrier_thaw $FSNAME &
20910 b_status=$(barrier_stat)
20911 echo "Got barrier status at: $(date)"
20912 [ "$b_status" = "'thawing'" ] ||
20913 error "(6) unexpected barrier status $b_status"
20915 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20917 b_status=$(barrier_stat)
20918 [ "$b_status" = "'thawed'" ] ||
20919 error "(7) unexpected barrier status $b_status"
20921 #define OBD_FAIL_BARRIER_FAILURE 0x2203
20922 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
20923 do_facet mgs $LCTL barrier_freeze $FSNAME
20925 b_status=$(barrier_stat)
20926 [ "$b_status" = "'failed'" ] ||
20927 error "(8) unexpected barrier status $b_status"
20929 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
20930 do_facet mgs $LCTL barrier_thaw $FSNAME
20934 run_test 801a "write barrier user interfaces and stat machine"
20939 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20940 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
20941 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
20942 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
20943 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
20945 cancel_lru_locks mdc
20947 # 180 seconds should be long enough
20948 do_facet mgs $LCTL barrier_freeze $FSNAME 180
20950 local b_status=$(barrier_stat)
20951 [ "$b_status" = "'frozen'" ] ||
20952 error "(6) unexpected barrier status $b_status"
20954 mkdir $DIR/$tdir/d0/d10 &
20957 touch $DIR/$tdir/d1/f13 &
20960 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
20963 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
20966 rm -f $DIR/$tdir/d4/f12 &
20969 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
20971 # To guarantee taht the 'stat' is not blocked
20972 b_status=$(barrier_stat)
20973 [ "$b_status" = "'frozen'" ] ||
20974 error "(8) unexpected barrier status $b_status"
20976 # let above commands to run at background
20979 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
20980 ps -p $touch_pid || error "(10) touch should be blocked"
20981 ps -p $ln_pid || error "(11) link should be blocked"
20982 ps -p $mv_pid || error "(12) rename should be blocked"
20983 ps -p $rm_pid || error "(13) unlink should be blocked"
20985 b_status=$(barrier_stat)
20986 [ "$b_status" = "'frozen'" ] ||
20987 error "(14) unexpected barrier status $b_status"
20989 do_facet mgs $LCTL barrier_thaw $FSNAME
20990 b_status=$(barrier_stat)
20991 [ "$b_status" = "'thawed'" ] ||
20992 error "(15) unexpected barrier status $b_status"
20994 wait $mkdir_pid || error "(16) mkdir should succeed"
20995 wait $touch_pid || error "(17) touch should succeed"
20996 wait $ln_pid || error "(18) link should succeed"
20997 wait $mv_pid || error "(19) rename should succeed"
20998 wait $rm_pid || error "(20) unlink should succeed"
21002 run_test 801b "modification will be blocked by write barrier"
21005 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21009 stop mds2 || error "(1) Fail to stop mds2"
21011 do_facet mgs $LCTL barrier_freeze $FSNAME 30
21013 local b_status=$(barrier_stat)
21014 [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || {
21015 do_facet mgs $LCTL barrier_thaw $FSNAME
21016 error "(2) unexpected barrier status $b_status"
21019 do_facet mgs $LCTL barrier_rescan $FSNAME ||
21020 error "(3) Fail to rescan barrier bitmap"
21022 # Do not reduce barrier time - See LU-11873
21023 do_facet mgs $LCTL barrier_freeze $FSNAME 20
21025 b_status=$(barrier_stat)
21026 [ "$b_status" = "'frozen'" ] ||
21027 error "(4) unexpected barrier status $b_status"
21029 do_facet mgs $LCTL barrier_thaw $FSNAME
21030 b_status=$(barrier_stat)
21031 [ "$b_status" = "'thawed'" ] ||
21032 error "(5) unexpected barrier status $b_status"
21034 local devname=$(mdsdevname 2)
21036 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
21038 do_facet mgs $LCTL barrier_rescan $FSNAME ||
21039 error "(7) Fail to rescan barrier bitmap"
21043 run_test 801c "rescan barrier bitmap"
21045 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
21046 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
21047 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
21048 saved_MOUNT_OPTS=$MOUNT_OPTS
21054 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
21055 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
21056 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
21057 MOUNT_OPTS=$saved_MOUNT_OPTS
21062 [[ $mds1_FSTYPE = zfs ]] || skip "ZFS specific test"
21063 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
21064 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
21065 skip "Need server version at least 2.9.55"
21067 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
21069 mkdir $DIR/$tdir || error "(1) fail to mkdir"
21071 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
21072 error "(2) Fail to copy"
21074 trap cleanup_802 EXIT
21076 # sync by force before remount as readonly
21077 sync; sync_all_data; sleep 3; sync_all_data
21081 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
21082 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
21083 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
21085 echo "Mount the server as read only"
21086 setupall server_only || error "(3) Fail to start servers"
21088 echo "Mount client without ro should fail"
21089 mount_client $MOUNT &&
21090 error "(4) Mount client without 'ro' should fail"
21092 echo "Mount client with ro should succeed"
21093 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
21094 mount_client $MOUNT ||
21095 error "(5) Mount client with 'ro' should succeed"
21097 echo "Modify should be refused"
21098 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
21100 echo "Read should be allowed"
21101 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
21102 error "(7) Read should succeed under ro mode"
21106 run_test 802 "simulate readonly device"
21109 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21110 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
21111 skip "MDS needs to be newer than 2.10.54"
21113 mkdir -p $DIR/$tdir
21114 # Create some objects on all MDTs to trigger related logs objects
21115 for idx in $(seq $MDSCOUNT); do
21116 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
21117 $DIR/$tdir/dir${idx} ||
21118 error "Fail to create $DIR/$tdir/dir${idx}"
21122 wait_delete_completed # ensure old test cleanups are finished
21123 echo "before create:"
21125 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21127 for i in {1..10}; do
21128 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
21129 error "Fail to create $DIR/$tdir/foo$i"
21133 echo "after create:"
21135 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21137 # allow for an llog to be cleaned up during the test
21138 [ $after_used -ge $((before_used + 10 - 1)) ] ||
21139 error "before ($before_used) + 10 > after ($after_used)"
21141 for i in {1..10}; do
21142 rm -rf $DIR/$tdir/foo$i ||
21143 error "Fail to remove $DIR/$tdir/foo$i"
21146 sleep 3 # avoid MDT return cached statfs
21147 wait_delete_completed
21148 echo "after unlink:"
21150 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21152 # allow for an llog to be created during the test
21153 [ $after_used -le $((before_used + 1)) ] ||
21154 error "after ($after_used) > before ($before_used) + 1"
21156 run_test 803a "verify agent object for remote object"
21159 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21160 [ $MDS1_VERSION -lt $(version_code 2.13.56) ] &&
21161 skip "MDS needs to be newer than 2.13.56"
21162 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21164 for i in $(seq 0 $((MDSCOUNT - 1))); do
21165 $LFS mkdir -i $i $DIR/$tdir.$i || error "mkdir $tdir.$i"
21173 stat $DIR/$tdir.* >/dev/null || error "stat $tdir.*"
21174 for i in $(seq 0 $((MDSCOUNT - 1))); do
21175 tmp=$(do_facet mds$i $LCTL get_param mdt.*-MDT000$i.md_stats |
21176 awk '/getattr/ { print $2 }')
21177 before=$((before + tmp))
21179 stat $DIR/$tdir.* >/dev/null || error "stat $tdir.*"
21180 for i in $(seq 0 $((MDSCOUNT - 1))); do
21181 tmp=$(do_facet mds$i $LCTL get_param mdt.*-MDT000$i.md_stats |
21182 awk '/getattr/ { print $2 }')
21183 after=$((after + tmp))
21186 [ $before -eq $after ] || error "getattr count $before != $after"
21188 run_test 803b "remote object can getattr from cache"
21191 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21192 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
21193 skip "MDS needs to be newer than 2.10.54"
21194 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
21196 mkdir -p $DIR/$tdir
21197 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
21198 error "Fail to create $DIR/$tdir/dir0"
21200 local fid=$($LFS path2fid $DIR/$tdir/dir0)
21201 local dev=$(mdsdevname 2)
21203 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21204 grep ${fid} || error "NOT found agent entry for dir0"
21206 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
21207 error "Fail to create $DIR/$tdir/dir1"
21209 touch $DIR/$tdir/dir1/foo0 ||
21210 error "Fail to create $DIR/$tdir/dir1/foo0"
21211 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
21214 for idx in $(seq $MDSCOUNT); do
21215 dev=$(mdsdevname $idx)
21216 do_facet mds${idx} \
21217 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21218 grep ${fid} && rc=$idx
21221 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
21222 error "Fail to rename foo0 to foo1"
21223 if [ $rc -eq 0 ]; then
21224 for idx in $(seq $MDSCOUNT); do
21225 dev=$(mdsdevname $idx)
21226 do_facet mds${idx} \
21227 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21228 grep ${fid} && rc=$idx
21232 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
21233 error "Fail to rename foo1 to foo2"
21234 if [ $rc -eq 0 ]; then
21235 for idx in $(seq $MDSCOUNT); do
21236 dev=$(mdsdevname $idx)
21237 do_facet mds${idx} \
21238 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21239 grep ${fid} && rc=$idx
21243 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
21245 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
21246 error "Fail to link to $DIR/$tdir/dir1/foo2"
21247 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
21248 error "Fail to rename foo2 to foo0"
21249 unlink $DIR/$tdir/dir1/foo0 ||
21250 error "Fail to unlink $DIR/$tdir/dir1/foo0"
21251 rm -rf $DIR/$tdir/dir0 ||
21252 error "Fail to rm $DIR/$tdir/dir0"
21254 for idx in $(seq $MDSCOUNT); do
21255 dev=$(mdsdevname $idx)
21259 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
21261 start mds${idx} $dev $MDS_MOUNT_OPTS ||
21262 error "mount mds$idx failed"
21263 df $MOUNT > /dev/null 2>&1
21265 # e2fsck should not return error
21267 error "e2fsck detected error on MDT${idx}: rc=$rc"
21270 run_test 804 "verify agent entry for remote entry"
21273 do_facet $SINGLEMDS zfs set quota=$old $fsset
21274 unlinkmany $DIR/$tdir/f- 1000000
21279 local zfs_version=$(do_facet mds1 cat /sys/module/zfs/version)
21280 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
21281 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
21282 skip "netfree not implemented before 0.7"
21283 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
21284 skip "Need MDS version at least 2.10.57"
21291 local pref="osd-zfs.lustre-MDT0000."
21293 # limit available space on MDS dataset to meet nospace issue
21294 # quickly. then ZFS 0.7.2 can use reserved space if asked
21295 # properly (using netfree flag in osd_declare_destroy()
21296 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
21297 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
21299 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
21300 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
21301 let "usedkb=usedkb-freekb"
21302 let "freekb=freekb/2"
21303 if let "freekb > 5000"; then
21306 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
21307 trap cleanup_805 EXIT
21309 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
21310 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
21311 rm -rf $DIR/$tdir || error "not able to remove"
21312 do_facet $SINGLEMDS zfs set quota=$old $fsset
21315 run_test 805 "ZFS can remove from full fs"
21321 local size=$($LFS getsom -s $file)
21322 local expect=$(stat -c %s $file)
21324 [[ $size == $expect ]] ||
21325 error "$file expected size: $expect, got: $size"
21327 local blocks=$($LFS getsom -b $file)
21328 expect=$(stat -c %b $file)
21329 [[ $blocks == $expect ]] ||
21330 error "$file expected blocks: $expect, got: $blocks"
21335 local size=$($LFS getsom -s $1)
21338 [[ $size == $expect ]] ||
21339 error "$file expected size: $expect, got: $size"
21343 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21344 skip "Need MDS version at least 2.11.52"
21348 touch $DIR/$tfile || error "touch $tfile failed"
21350 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21351 save_lustre_params client "llite.*.xattr_cache" > $save
21352 lctl set_param llite.*.xattr_cache=0
21353 stack_trap "restore_lustre_params < $save" EXIT
21355 # single-threaded write
21356 echo "Test SOM for single-threaded write"
21357 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
21358 error "write $tfile failed"
21359 check_lsom_size $DIR/$tfile $bs
21362 local size=$(($num * $bs))
21366 echo "Test SOM for single client multi-threaded($num) write"
21367 $TRUNCATE $DIR/$tfile 0
21368 for ((i = 0; i < $num; i++)); do
21369 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21371 offset=$((offset + $bs))
21373 for (( i=0; i < $num; i++ )); do
21376 check_lsom_size $DIR/$tfile $size
21378 $TRUNCATE $DIR/$tfile 0
21379 for ((i = 0; i < $num; i++)); do
21380 offset=$((offset - $bs))
21381 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21384 for (( i=0; i < $num; i++ )); do
21387 check_lsom_size $DIR/$tfile $size
21389 # multi-client writes
21390 num=$(get_node_count ${CLIENTS//,/ })
21391 size=$(($num * $bs))
21395 echo "Test SOM for multi-client ($num) writes"
21396 $TRUNCATE $DIR/$tfile 0
21397 for client in ${CLIENTS//,/ }; do
21398 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21401 offset=$((offset + $bs))
21403 for (( i=0; i < $num; i++ )); do
21406 check_lsom_size $DIR/$tfile $offset
21409 $TRUNCATE $DIR/$tfile 0
21410 for client in ${CLIENTS//,/ }; do
21411 offset=$((offset - $bs))
21412 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21416 for (( i=0; i < $num; i++ )); do
21419 check_lsom_size $DIR/$tfile $size
21422 echo "Test SOM for truncate"
21423 $TRUNCATE $DIR/$tfile 1048576
21424 check_lsom_size $DIR/$tfile 1048576
21425 $TRUNCATE $DIR/$tfile 1234
21426 check_lsom_size $DIR/$tfile 1234
21428 # verify SOM blocks count
21429 echo "Verify SOM block count"
21430 $TRUNCATE $DIR/$tfile 0
21431 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
21432 error "failed to write file $tfile"
21433 check_lsom_data $DIR/$tfile
21435 run_test 806 "Verify Lazy Size on MDS"
21438 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21439 skip "Need MDS version at least 2.11.52"
21441 # Registration step
21442 changelog_register || error "changelog_register failed"
21443 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
21444 changelog_users $SINGLEMDS | grep -q $cl_user ||
21445 error "User $cl_user not found in changelog_users"
21447 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21448 save_lustre_params client "llite.*.xattr_cache" > $save
21449 lctl set_param llite.*.xattr_cache=0
21450 stack_trap "restore_lustre_params < $save" EXIT
21452 rm -rf $DIR/$tdir || error "rm $tdir failed"
21453 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
21454 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
21455 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
21456 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
21457 error "truncate $tdir/trunc failed"
21460 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
21461 error "write $tfile failed"
21463 # multi-client wirtes
21464 local num=$(get_node_count ${CLIENTS//,/ })
21468 echo "Test SOM for multi-client ($num) writes"
21469 touch $DIR/$tfile || error "touch $tfile failed"
21470 $TRUNCATE $DIR/$tfile 0
21471 for client in ${CLIENTS//,/ }; do
21472 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21475 offset=$((offset + $bs))
21477 for (( i=0; i < $num; i++ )); do
21482 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
21483 check_lsom_data $DIR/$tdir/trunc
21484 check_lsom_data $DIR/$tdir/single_dd
21485 check_lsom_data $DIR/$tfile
21488 # Deregistration step
21489 changelog_deregister || error "changelog_deregister failed"
21491 run_test 807 "verify LSOM syncing tool"
21493 check_som_nologged()
21495 local lines=$($LFS changelog $FSNAME-MDT0000 |
21496 grep 'x=trusted.som' | wc -l)
21497 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
21501 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
21502 skip "Need MDS version at least 2.11.55"
21504 # Registration step
21505 changelog_register || error "changelog_register failed"
21507 touch $DIR/$tfile || error "touch $tfile failed"
21510 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
21511 error "write $tfile failed"
21514 $TRUNCATE $DIR/$tfile 1234
21517 $TRUNCATE $DIR/$tfile 1048576
21520 # Deregistration step
21521 changelog_deregister || error "changelog_deregister failed"
21523 run_test 808 "Check trusted.som xattr not logged in Changelogs"
21528 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
21532 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
21533 skip "Need MDS version at least 2.11.56"
21535 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
21536 error "failed to create DoM-only file $DIR/$tfile"
21537 touch $DIR/$tfile || error "touch $tfile failed"
21538 check_som_nodata $DIR/$tfile
21540 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
21541 error "write $tfile failed"
21542 check_som_nodata $DIR/$tfile
21544 $TRUNCATE $DIR/$tfile 1234
21545 check_som_nodata $DIR/$tfile
21547 $TRUNCATE $DIR/$tfile 4097
21548 check_som_nodata $DIR/$file
21550 run_test 809 "Verify no SOM xattr store for DoM-only files"
21553 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21554 $GSS && skip_env "could not run with gss"
21557 stack_trap "set_checksums $ORIG_CSUM" EXIT
21558 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
21563 for csum in $CKSUM_TYPES; do
21564 #define OBD_FAIL_OSC_NO_GRANT 0x411
21565 $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411
21566 for i in "10240 0" "10000 0" "4000 1" "500 1"; do
21568 dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2
21569 before=$(md5sum $DIR/$tfile)
21570 $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear
21571 after=$(md5sum $DIR/$tfile)
21572 [ "$before" == "$after" ] ||
21573 error "$csum: $before != $after bs=$1 seek=$2"
21577 run_test 810 "partial page writes on ZFS (LU-11663)"
21580 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
21581 skip "OST < 2.12.51 doesn't support this fail_loc"
21582 [ "$SHARED_KEY" = true ] &&
21583 skip "OSC connections never go IDLE with Shared-Keys enabled"
21585 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21586 # ensure ost1 is connected
21587 stat $DIR/$tfile >/dev/null || error "can't stat"
21588 wait_osc_import_state client ost1 FULL
21589 # no locks, no reqs to let the connection idle
21590 cancel_lru_locks osc
21592 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
21593 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
21594 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
21595 wait_osc_import_state client ost1 CONNECTING
21596 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
21598 stat $DIR/$tfile >/dev/null || error "can't stat file"
21600 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
21604 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
21605 echo -n y >> $DIR/$tfile
21606 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
21607 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
21609 run_test 814 "sparse cp works as expected (LU-12361)"
21613 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
21614 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
21616 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
21619 [ "$SHARED_KEY" = true ] &&
21620 skip "OSC connections never go IDLE with Shared-Keys enabled"
21622 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21623 # ensure ost1 is connected
21624 stat $DIR/$tfile >/dev/null || error "can't stat"
21625 wait_osc_import_state client ost1 FULL
21626 # no locks, no reqs to let the connection idle
21627 cancel_lru_locks osc
21628 lru_resize_disable osc
21631 before=$($LCTL get_param -n \
21632 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21634 wait_osc_import_state client ost1 IDLE
21635 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
21636 now=$($LCTL get_param -n \
21637 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21638 [ $before == $now ] || error "lru_size changed $before != $now"
21640 run_test 816 "do not reset lru_resize on idle reconnect"
21644 exportfs -u localhost:$DIR/nfsexp
21649 systemctl restart nfs-server.service || skip "failed to restart nfsd"
21651 mkdir -p $DIR/nfsexp
21652 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
21653 error "failed to export nfs"
21655 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
21656 stack_trap cleanup_817 EXIT
21658 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
21659 error "failed to mount nfs to $tmpdir"
21661 cp /bin/true $tmpdir
21662 $DIR/nfsexp/true || error "failed to execute 'true' command"
21664 run_test 817 "nfsd won't cache write lock for exec file"
21667 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21668 cancel_lru_locks osc
21669 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21670 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21671 dd if=$DIR/$tfile of=/dev/null bs=1M count=1
21674 run_test 819a "too big niobuf in read"
21677 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21678 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21679 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21680 cancel_lru_locks osc
21684 run_test 819b "too big niobuf in write"
21688 $LFS setstripe -c1 -i0 $DIR/$tfile
21689 $LFS setstripe -c1 -i1 $DIR/$tfile
21691 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
21692 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
21693 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
21694 error "start $SINGLEMDS failed"
21697 run_test 818 "unlink with failed llog"
21700 # tests that do cleanup/setup should be run at the end
21704 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21707 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
21708 $LCTL set_param fail_loc=0x903
21710 cancel_lru_locks MGC
21712 FAIL_ON_ERROR=true cleanup
21713 FAIL_ON_ERROR=true setup
21715 run_test 900 "umount should not race with any mgc requeue thread"
21719 [ $CLIENT_VERSION -lt $(version_code 2.13.52) ] &&
21720 skip "client does not have LU-13377 fix"
21721 #define OBD_FAIL_LLITE_SHORT_COMMIT 0x1415
21722 $LCTL set_param fail_loc=0x1415
21723 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21724 cancel_lru_locks osc
21727 run_test 902 "test short write doesn't hang lustre"
21730 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
21731 check_and_cleanup_lustre
21732 if [ "$I_MOUNTED" != "yes" ]; then
21733 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true