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"
6932 # this does exactly what osc_request.c:osc_announce_cached() does in
6933 # order to calculate max amount of grants to ask from server
6937 local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc)
6938 local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight)
6940 ((rpc_in_flight ++));
6941 nrpages=$((nrpages * rpc_in_flight))
6943 local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb)
6945 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
6947 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
6948 local undirty=$((nrpages * PAGE_SIZE))
6950 local max_extent_pages
6951 max_extent_pages=$($LCTL get_param osc.${tgt}.import |
6952 grep grant_max_extent_size | awk '{print $2}')
6953 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
6954 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
6955 local grant_extent_tax
6956 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
6957 grep grant_extent_tax | awk '{print $2}')
6959 undirty=$((undirty + nrextents * grant_extent_tax))
6964 # this is size of unit for grant allocation. It should be equal to
6965 # what tgt_grant.c:tgt_grant_chunk() calculates
6969 local grant_extent_tax
6971 max_brw_size=$($LCTL get_param osc.${tgt}.import |
6972 grep max_brw_size | awk '{print $2}')
6974 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
6975 grep grant_extent_tax | awk '{print $2}')
6977 echo $(((max_brw_size + grant_extent_tax) * 2))
6981 [ $OST1_VERSION -lt $(version_code 2.10.56) ] &&
6982 skip "OST < 2.10.55 doesn't limit grants enough"
6984 local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}')
6985 local file=$DIR/$tfile
6987 [[ $($LCTL get_param osc.${tgt}.import |
6988 grep "connect_flags:.*grant_param") ]] ||
6989 skip "no grant_param connect flag"
6991 local olddebug=$($LCTL get_param -n debug 2> /dev/null)
6993 $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true
6995 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
6996 stack_trap "rm -f $file" EXIT
6998 $SETSTRIPE $file -i 0 -c 1
6999 dd if=/dev/zero of=$file bs=1M count=1000 &
7004 local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes)
7005 if [[ $cur_grant -gt $max_cur_granted ]]
7008 error "cur_grant $cur_grant > $max_cur_granted"
7011 [[ $? -ne 0 ]] && break;
7016 wait_delete_completed
7017 $LCTL set_param debug="$olddebug" 2> /dev/null || true
7019 run_test 64d "check grant limit exceed"
7021 # bug 1414 - set/get directories' stripe info
7023 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7025 test_mkdir $DIR/$tdir
7027 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
7029 run_test 65a "directory with no stripe info"
7032 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7034 test_mkdir $DIR/$tdir
7035 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7037 $SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7040 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
7042 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
7045 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7046 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
7048 test_mkdir $DIR/$tdir
7049 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
7051 $LFS setstripe -S $((stripesize * 4)) -i 1 \
7052 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
7054 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
7056 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
7059 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7061 test_mkdir $DIR/$tdir
7062 local STRIPECOUNT=$($GETSTRIPE -c $DIR/$tdir)
7063 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7065 if [[ $STRIPECOUNT -le 0 ]]; then
7067 elif [[ $STRIPECOUNT -gt 2000 ]]; then
7068 #LOV_MAX_STRIPE_COUNT is 2000
7069 [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1))
7071 sc=$(($STRIPECOUNT - 1))
7073 $SETSTRIPE -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
7074 touch $DIR/$tdir/f4 $DIR/$tdir/f5
7075 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
7076 error "lverify failed"
7078 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
7081 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7083 test_mkdir $DIR/$tdir
7085 $SETSTRIPE $DIR/$tdir || error "setstripe"
7086 $GETSTRIPE -v $DIR/$tdir | grep "Default" ||
7087 error "no stripe info failed"
7089 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
7091 run_test 65e "directory setstripe defaults"
7094 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7096 test_mkdir $DIR/${tdir}f
7097 $RUNAS $SETSTRIPE $DIR/${tdir}f && error "setstripe succeeded" || true
7099 run_test 65f "dir setstripe permission (should return error) ==="
7102 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7104 test_mkdir $DIR/$tdir
7105 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7107 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7108 error "setstripe -S failed"
7109 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
7110 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7111 error "delete default stripe failed"
7113 run_test 65g "directory setstripe -d"
7116 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7118 test_mkdir $DIR/$tdir
7119 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7121 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7122 error "setstripe -S failed"
7123 test_mkdir $DIR/$tdir/dd1
7124 [ $($LFS getstripe -c $DIR/$tdir) = $($GETSTRIPE -c $DIR/$tdir/dd1) ] ||
7125 error "stripe info inherit failed"
7127 run_test 65h "directory stripe info inherit ===================="
7130 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7132 save_layout_restore_at_exit $MOUNT
7134 # bug6367: set non-default striping on root directory
7135 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
7137 # bug12836: getstripe on -1 default directory striping
7138 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
7140 # bug12836: getstripe -v on -1 default directory striping
7141 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
7143 # bug12836: new find on -1 default directory striping
7144 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
7146 run_test 65i "various tests to set root directory striping"
7148 test_65j() { # bug6367
7149 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7153 # if we aren't already remounting for each test, do so for this test
7154 if [ "$CLEANUP" = ":" -a "$I_MOUNTED" = "yes" ]; then
7155 cleanup || error "failed to unmount"
7159 save_layout_restore_at_exit $MOUNT
7161 $SETSTRIPE -d $MOUNT || error "setstripe failed"
7163 run_test 65j "set default striping on root directory (bug 6367)="
7167 wait_delete_completed
7168 do_facet $SINGLEMDS "lctl set_param -n \
7169 osp.$ost*MDT0000.max_create_count=$max_count"
7170 do_facet $SINGLEMDS "lctl set_param -n \
7171 osp.$ost*MDT0000.create_count=$count"
7172 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7173 echo $INACTIVE_OSC "is Activate"
7175 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7178 test_65k() { # bug11679
7179 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7180 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7181 remote_mds_nodsh && skip "remote MDS with nodsh"
7183 local disable_precreate=true
7184 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
7185 disable_precreate=false
7187 echo "Check OST status: "
7188 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
7189 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
7191 for OSC in $MDS_OSCS; do
7192 echo $OSC "is active"
7193 do_facet $SINGLEMDS lctl --device %$OSC activate
7196 for INACTIVE_OSC in $MDS_OSCS; do
7197 local ost=$(osc_to_ost $INACTIVE_OSC)
7198 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
7199 lov.*md*.target_obd |
7200 awk -F: /$ost/'{ print $1 }' | head -n 1)
7203 $SETSTRIPE -i $ostnum -c 1 $DIR/$tdir
7204 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
7206 echo "Deactivate: " $INACTIVE_OSC
7207 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
7209 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
7210 osp.$ost*MDT0000.create_count")
7211 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
7212 osp.$ost*MDT0000.max_create_count")
7213 $disable_precreate &&
7214 do_facet $SINGLEMDS "lctl set_param -n \
7215 osp.$ost*MDT0000.max_create_count=0"
7217 for idx in $(seq 0 $((OSTCOUNT - 1))); do
7218 [ -f $DIR/$tdir/$idx ] && continue
7219 echo "$SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx"
7220 $SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx ||
7222 error "setstripe $idx should succeed"; }
7223 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
7225 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
7228 do_facet $SINGLEMDS "lctl set_param -n \
7229 osp.$ost*MDT0000.max_create_count=$max_count"
7230 do_facet $SINGLEMDS "lctl set_param -n \
7231 osp.$ost*MDT0000.create_count=$count"
7232 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7233 echo $INACTIVE_OSC "is Activate"
7235 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7238 run_test 65k "validate manual striping works properly with deactivated OSCs"
7240 test_65l() { # bug 12836
7241 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7243 test_mkdir -p $DIR/$tdir/test_dir
7244 $SETSTRIPE -c -1 $DIR/$tdir/test_dir
7245 $LFS find -mtime -1 $DIR/$tdir >/dev/null
7247 run_test 65l "lfs find on -1 stripe dir ========================"
7250 local layout=$(save_layout $MOUNT)
7251 $RUNAS $SETSTRIPE -c 2 $MOUNT && {
7252 restore_layout $MOUNT $layout
7253 error "setstripe should fail by non-root users"
7257 run_test 65m "normal user can't set filesystem default stripe"
7260 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.0) ]] ||
7261 skip "Need MDS version at least 2.12.0"
7262 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7264 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7265 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7266 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7268 local root_layout=$(save_layout $MOUNT)
7269 stack_trap "restore_layout $MOUNT $root_layout" EXIT
7271 # new subdirectory under root directory should not inherit
7272 # the default layout from root
7273 local dir1=$MOUNT/$tdir-1
7274 mkdir $dir1 || error "mkdir $dir1 failed"
7275 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7276 error "$dir1 shouldn't have LOV EA"
7278 # delete the default layout on root directory
7279 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7281 local dir2=$MOUNT/$tdir-2
7282 mkdir $dir2 || error "mkdir $dir2 failed"
7283 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7284 error "$dir2 shouldn't have LOV EA"
7286 # set a new striping pattern on root directory
7287 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7288 local new_def_stripe_size=$((def_stripe_size * 2))
7289 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7290 error "set stripe size on $MOUNT failed"
7292 # new file created in $dir2 should inherit the new stripe size from
7293 # the filesystem default
7294 local file2=$dir2/$tfile-2
7295 touch $file2 || error "touch $file2 failed"
7297 local file2_stripe_size=$($LFS getstripe -S $file2)
7298 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7299 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7301 local dir3=$MOUNT/$tdir-3
7302 mkdir $dir3 || error "mkdir $dir3 failed"
7303 # $dir3 shouldn't have LOV EA, but "lfs getstripe -d $dir3" should show
7304 # the root layout, which is the actual default layout that will be used
7305 # when new files are created in $dir3.
7306 local dir3_layout=$(get_layout_param $dir3)
7307 local root_dir_layout=$(get_layout_param $MOUNT)
7308 [[ "$dir3_layout" = "$root_dir_layout" ]] ||
7309 error "$dir3 should show the default layout from $MOUNT"
7311 # set OST pool on root directory
7312 local pool=$TESTNAME
7313 pool_add $pool || error "add $pool failed"
7314 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7315 error "add targets to $pool failed"
7317 $LFS setstripe -p $pool $MOUNT ||
7318 error "set OST pool on $MOUNT failed"
7320 # new file created in $dir3 should inherit the pool from
7321 # the filesystem default
7322 local file3=$dir3/$tfile-3
7323 touch $file3 || error "touch $file3 failed"
7325 local file3_pool=$($LFS getstripe -p $file3)
7326 [[ "$file3_pool" = "$pool" ]] ||
7327 error "$file3 didn't inherit OST pool $pool"
7329 local dir4=$MOUNT/$tdir-4
7330 mkdir $dir4 || error "mkdir $dir4 failed"
7331 local dir4_layout=$(get_layout_param $dir4)
7332 root_dir_layout=$(get_layout_param $MOUNT)
7333 echo "$LFS getstripe -d $dir4"
7334 $LFS getstripe -d $dir4
7335 echo "$LFS getstripe -d $MOUNT"
7336 $LFS getstripe -d $MOUNT
7337 [[ "$dir4_layout" = "$root_dir_layout" ]] ||
7338 error "$dir4 should show the default layout from $MOUNT"
7340 # new file created in $dir4 should inherit the pool from
7341 # the filesystem default
7342 local file4=$dir4/$tfile-4
7343 touch $file4 || error "touch $file4 failed"
7345 local file4_pool=$($LFS getstripe -p $file4)
7346 [[ "$file4_pool" = "$pool" ]] ||
7347 error "$file4 didn't inherit OST pool $pool"
7349 # new subdirectory under non-root directory should inherit
7350 # the default layout from its parent directory
7351 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7352 error "set directory layout on $dir4 failed"
7354 local dir5=$dir4/$tdir-5
7355 mkdir $dir5 || error "mkdir $dir5 failed"
7357 dir4_layout=$(get_layout_param $dir4)
7358 local dir5_layout=$(get_layout_param $dir5)
7359 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7360 error "$dir5 should inherit the default layout from $dir4"
7362 # though subdir under ROOT doesn't inherit default layout, but
7363 # its sub dir/file should be created with default layout.
7364 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
7365 [[ $MDS1_VERSION -ge $(version_code 2.12.59) ]] ||
7366 [[ $MDS1_VERSION -ge $(version_code 2.12.3) &&
7367 $MDS1_VERSION -lt $(version_code 2.12.50) ]] ||
7368 skip "Need MDS version at least 2.12.3 or 2.12.59"
7370 local default_lmv_count=$($LFS getdirstripe -D -c $MOUNT)
7371 local default_lmv_index=$($LFS getdirstripe -D -i $MOUNT)
7372 local default_lmv_hash=$($LFS getdirstripe -D -H $MOUNT)
7374 if [ $default_lmv_hash == "none" ]; then
7375 stack_trap "$LFS setdirstripe -D -d $MOUNT" EXIT
7377 stack_trap "$LFS setdirstripe -D -i $default_lmv_index \
7378 -c $default_lmv_count -H $default_lmv_hash $MOUNT" EXIT
7381 $LFS setdirstripe -D -c 2 $MOUNT ||
7382 error "setdirstripe -D -c 2 failed"
7383 mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed"
7384 local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6)
7385 [ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count"
7387 run_test 65n "don't inherit default layout from root for new subdirectories"
7389 # bug 2543 - update blocks count on client
7391 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7394 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7395 sync; sync_all_data; sync; sync_all_data
7396 cancel_lru_locks osc
7397 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7398 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7400 run_test 66 "update inode blocks count on client ==============="
7403 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7407 swapon -s | awk '($1 == "'$1'") { print $4 }'
7410 # bug5265, obdfilter oa2dentry return -ENOENT
7411 # #define OBD_FAIL_SRV_ENOENT 0x217
7413 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7414 remote_ost_nodsh && skip "remote OST with nodsh"
7417 $SETSTRIPE -c 1 -i 0 $f
7419 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
7421 do_facet ost1 lctl set_param fail_loc=0x217
7422 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
7423 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
7425 do_facet ost1 lctl set_param fail_loc=0
7426 $DIRECTIO write $f 0 2 || error "write error"
7428 cancel_lru_locks osc
7429 $DIRECTIO read $f 0 1 || error "read error"
7431 do_facet ost1 lctl set_param fail_loc=0x217
7432 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
7434 do_facet ost1 lctl set_param fail_loc=0
7437 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
7440 test_mkdir $DIR/$tdir
7441 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
7442 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
7444 run_test 71 "Running dbench on lustre (don't segment fault) ===="
7446 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
7447 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7448 [ "$RUNAS_ID" = "$UID" ] &&
7449 skip_env "RUNAS_ID = UID = $UID -- skipping"
7450 # Check that testing environment is properly set up. Skip if not
7451 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
7452 skip_env "User $RUNAS_ID does not exist - skipping"
7455 chmod 777 $DIR/$tfile
7456 chmod ug+s $DIR/$tfile
7457 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
7458 error "$RUNAS dd $DIR/$tfile failed"
7459 # See if we are still setuid/sgid
7460 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7461 error "S/gid is not dropped on write"
7462 # Now test that MDS is updated too
7463 cancel_lru_locks mdc
7464 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7465 error "S/gid is not dropped on MDS"
7468 run_test 72a "Test that remove suid works properly (bug5695) ===="
7470 test_72b() { # bug 24226 -- keep mode setting when size is not changing
7473 [ "$RUNAS_ID" = "$UID" ] &&
7474 skip_env "RUNAS_ID = UID = $UID -- skipping"
7475 [ "$RUNAS_ID" -eq 0 ] &&
7476 skip_env "RUNAS_ID = 0 -- skipping"
7477 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7478 # Check that testing environment is properly set up. Skip if not
7479 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
7480 skip_env "User $RUNAS_ID does not exist - skipping"
7482 touch $DIR/${tfile}-f{g,u}
7483 test_mkdir $DIR/${tfile}-dg
7484 test_mkdir $DIR/${tfile}-du
7485 chmod 770 $DIR/${tfile}-{f,d}{g,u}
7486 chmod g+s $DIR/${tfile}-{f,d}g
7487 chmod u+s $DIR/${tfile}-{f,d}u
7488 for perm in 777 2777 4777; do
7489 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
7490 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
7491 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
7492 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
7496 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
7498 # bug 3462 - multiple simultaneous MDC requests
7500 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7502 test_mkdir $DIR/d73-1
7503 test_mkdir $DIR/d73-2
7504 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
7507 lctl set_param fail_loc=0x80000129
7508 $MULTIOP $DIR/d73-1/f73-2 Oc &
7510 lctl set_param fail_loc=0
7512 $MULTIOP $DIR/d73-2/f73-3 Oc &
7516 wait $pid1 || return 1
7520 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
7521 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
7522 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
7526 run_test 73 "multiple MDC requests (should not deadlock)"
7528 test_74a() { # bug 6149, 6184
7529 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7532 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7534 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7535 # will spin in a tight reconnection loop
7536 $LCTL set_param fail_loc=0x8000030e
7537 # get any lock that won't be difficult - lookup works.
7539 $LCTL set_param fail_loc=0
7543 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
7545 test_74b() { # bug 13310
7546 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7548 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7550 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7551 # will spin in a tight reconnection loop
7552 $LCTL set_param fail_loc=0x8000030e
7553 # get a "difficult" lock
7555 $LCTL set_param fail_loc=0
7559 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
7562 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7564 #define OBD_FAIL_LDLM_NEW_LOCK
7565 $LCTL set_param fail_loc=0x319
7566 touch $DIR/$tfile && error "touch successful"
7567 $LCTL set_param fail_loc=0
7570 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
7573 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
7576 test_76() { # Now for bug 20433, added originally in bug 1443
7577 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7579 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
7581 cancel_lru_locks osc
7582 BEFORE_INODES=$(num_inodes)
7583 echo "before inodes: $BEFORE_INODES"
7585 [ "$SLOW" = "no" ] && COUNT=100
7586 for i in $(seq $COUNT); do
7590 cancel_lru_locks osc
7591 AFTER_INODES=$(num_inodes)
7592 echo "after inodes: $AFTER_INODES"
7594 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
7596 AFTER_INODES=$(num_inodes)
7598 echo "wait $wait seconds inodes: $AFTER_INODES"
7599 if [ $wait -gt 30 ]; then
7600 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
7604 run_test 76 "confirm clients recycle inodes properly ===="
7610 # Note: in sptlrpc modes which enable its own bulk checksum, the
7611 # original crc32_le bulk checksum will be automatically disabled,
7612 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
7613 # will be checked by sptlrpc code against sptlrpc bulk checksum.
7614 # In this case set_checksums() will not be no-op, because sptlrpc
7615 # bulk checksum will be enabled all through the test.
7617 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
7618 lctl set_param -n osc.*.checksums $1
7622 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7623 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
7624 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7625 tr -d [] | head -n1)}
7628 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
7629 log "set checksum type to $1"
7632 F77_TMP=$TMP/f77-temp
7635 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
7636 error "error writing to $F77_TMP"
7639 test_77a() { # bug 10889
7640 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7641 $GSS && skip_env "could not run with gss"
7643 [ ! -f $F77_TMP ] && setup_f77
7645 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
7649 run_test 77a "normal checksum read/write operation"
7651 test_77b() { # bug 10889
7652 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7653 $GSS && skip_env "could not run with gss"
7655 [ ! -f $F77_TMP ] && setup_f77
7656 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7657 $LCTL set_param fail_loc=0x80000409
7660 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7661 error "dd error: $?"
7662 $LCTL set_param fail_loc=0
7664 for algo in $CKSUM_TYPES; do
7665 cancel_lru_locks osc
7666 set_checksum_type $algo
7667 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7668 $LCTL set_param fail_loc=0x80000408
7669 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
7670 $LCTL set_param fail_loc=0
7673 set_checksum_type $ORIG_CSUM_TYPE
7676 run_test 77b "checksum error on client write, read"
7681 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
7683 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
7684 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
7685 $check_ost && [ -n "$ost_file_prefix" ] &&
7686 do_facet ost1 rm -f ${ost_file_prefix}\*
7690 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7691 $GSS && skip_env "could not run with gss"
7692 remote_ost_nodsh && skip "remote OST with nodsh"
7695 local osc_file_prefix
7697 local check_ost=false
7698 local ost_file_prefix
7704 # ensure corruption will occur on first OSS/OST
7705 $LFS setstripe -i 0 $DIR/$tfile
7707 [ ! -f $F77_TMP ] && setup_f77
7708 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7709 error "dd write error: $?"
7710 fid=$($LFS path2fid $DIR/$tfile)
7712 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
7715 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
7716 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
7718 echo "OSS do not support bulk pages dump upon error"
7721 osc_file_prefix=$($LCTL get_param -n debug_path)
7722 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
7724 trap cleanup_77c EXIT
7727 # enable bulk pages dump upon error on Client
7728 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
7729 # enable bulk pages dump upon error on OSS
7731 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
7733 # flush Client cache to allow next read to reach OSS
7734 cancel_lru_locks osc
7736 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7737 $LCTL set_param fail_loc=0x80000408
7738 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
7739 $LCTL set_param fail_loc=0
7743 # check cksum dump on Client
7744 osc_file=$(ls ${osc_file_prefix}*)
7745 [ -n "$osc_file" ] || error "no checksum dump file on Client"
7746 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
7747 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
7748 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
7749 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
7751 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
7752 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7753 error "dump content does not match on Client"
7755 $check_ost || skip "No need to check cksum dump on OSS"
7757 # check cksum dump on OSS
7758 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
7759 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
7760 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
7761 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
7762 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7763 error "dump content does not match on OSS"
7767 run_test 77c "checksum error on client read with debug"
7769 test_77d() { # bug 10889
7770 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7771 $GSS && skip_env "could not run with gss"
7773 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7774 $LCTL set_param fail_loc=0x80000409
7776 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7777 error "direct write: rc=$?"
7778 $LCTL set_param fail_loc=0
7781 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7782 $LCTL set_param fail_loc=0x80000408
7784 cancel_lru_locks osc
7785 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7786 error "direct read: rc=$?"
7787 $LCTL set_param fail_loc=0
7790 run_test 77d "checksum error on OST direct write, read"
7792 test_77f() { # bug 10889
7793 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7794 $GSS && skip_env "could not run with gss"
7797 for algo in $CKSUM_TYPES; do
7798 cancel_lru_locks osc
7799 set_checksum_type $algo
7800 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7801 $LCTL set_param fail_loc=0x409
7802 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
7803 error "direct write succeeded"
7804 $LCTL set_param fail_loc=0
7806 set_checksum_type $ORIG_CSUM_TYPE
7809 run_test 77f "repeat checksum error on write (expect error)"
7811 test_77g() { # bug 10889
7812 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7813 $GSS && skip_env "could not run with gss"
7814 remote_ost_nodsh && skip "remote OST with nodsh"
7816 [ ! -f $F77_TMP ] && setup_f77
7818 local file=$DIR/$tfile
7819 stack_trap "rm -f $file" EXIT
7821 $SETSTRIPE -c 1 -i 0 $file
7822 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
7823 do_facet ost1 lctl set_param fail_loc=0x8000021a
7825 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
7826 error "write error: rc=$?"
7827 do_facet ost1 lctl set_param fail_loc=0
7830 cancel_lru_locks osc
7831 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
7832 do_facet ost1 lctl set_param fail_loc=0x8000021b
7834 cmp $F77_TMP $file || error "file compare failed"
7835 do_facet ost1 lctl set_param fail_loc=0
7838 run_test 77g "checksum error on OST write, read"
7840 test_77k() { # LU-10906
7841 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7842 $GSS && skip_env "could not run with gss"
7844 local cksum_param="osc.$FSNAME*.checksums"
7845 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
7849 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
7850 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
7851 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
7855 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
7856 error "failed to set checksum=$i on MGS"
7857 wait_update $HOSTNAME "$get_checksum" $i
7859 echo "remount client, checksum should be $i"
7860 remount_client $MOUNT || "failed to remount client"
7861 checksum=$(eval $get_checksum)
7862 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7865 for opt in "checksum" "nochecksum"; do
7866 #remount with mount option
7867 echo "remount client with option $opt, checksum should be $i"
7868 umount_client $MOUNT || "failed to umount client"
7869 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
7870 "failed to mount client with option '$opt'"
7871 checksum=$(eval $get_checksum)
7872 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7876 remount_client $MOUNT || "failed to remount client"
7878 run_test 77k "enable/disable checksum correctly"
7880 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
7889 test_78() { # bug 10901
7890 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7891 remote_ost || skip_env "local OST"
7894 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
7895 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
7896 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
7897 echo "MemTotal: $MEMTOTAL"
7899 # reserve 256MB of memory for the kernel and other running processes,
7900 # and then take 1/2 of the remaining memory for the read/write buffers.
7901 if [ $MEMTOTAL -gt 512 ] ;then
7902 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
7904 # for those poor memory-starved high-end clusters...
7905 MEMTOTAL=$((MEMTOTAL / 2))
7907 echo "Mem to use for directio: $MEMTOTAL"
7909 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
7910 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
7911 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
7912 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
7914 echo "Smallest OST: $SMALLESTOST"
7915 [[ $SMALLESTOST -lt 10240 ]] &&
7916 skip "too small OSTSIZE, useless to run large O_DIRECT test"
7918 trap cleanup_test_78 EXIT
7920 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
7921 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
7923 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
7924 echo "File size: $F78SIZE"
7925 $SETSTRIPE -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
7926 for i in $(seq 1 $NSEQ); do
7927 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
7928 echo directIO rdwr round $i of $NSEQ
7929 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
7934 run_test 78 "handle large O_DIRECT writes correctly ============"
7936 test_79() { # bug 12743
7937 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7939 wait_delete_completed
7941 BKTOTAL=$(calc_osc_kbytes kbytestotal)
7942 BKFREE=$(calc_osc_kbytes kbytesfree)
7943 BKAVAIL=$(calc_osc_kbytes kbytesavail)
7945 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
7946 DFTOTAL=`echo $STRING | cut -d, -f1`
7947 DFUSED=`echo $STRING | cut -d, -f2`
7948 DFAVAIL=`echo $STRING | cut -d, -f3`
7949 DFFREE=$(($DFTOTAL - $DFUSED))
7951 ALLOWANCE=$((64 * $OSTCOUNT))
7953 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
7954 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
7955 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
7957 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
7958 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
7959 error "df free($DFFREE) mismatch OST free($BKFREE)"
7961 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
7962 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
7963 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
7966 run_test 79 "df report consistency check ======================="
7968 test_80() { # bug 10718
7969 remote_ost_nodsh && skip "remote OST with nodsh"
7970 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7972 # relax strong synchronous semantics for slow backends like ZFS
7973 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
7974 local soc="obdfilter.*.sync_lock_cancel"
7975 local save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
7977 # "sync_on_lock_cancel" was broken by v2_11_55_0-26-g7059644e9a
7978 if [ -z "$save" ]; then
7979 soc="obdfilter.*.sync_on_lock_cancel"
7980 save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
7983 if [ "$save" != "never" ]; then
7984 local hosts=$(comma_list $(osts_nodes))
7986 do_nodes $hosts $LCTL set_param $soc=never
7987 stack_trap "do_nodes $hosts $LCTL set_param $soc=$save"
7991 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
7993 local before=$(date +%s)
7994 cancel_lru_locks osc
7995 local after=$(date +%s)
7996 local diff=$((after - before))
7997 [ $diff -le 1 ] || error "elapsed for 1M@1T = $diff"
8001 run_test 80 "Page eviction is equally fast at high offsets too"
8003 test_81a() { # LU-456
8004 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8005 remote_ost_nodsh && skip "remote OST with nodsh"
8007 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8008 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
8009 do_facet ost1 lctl set_param fail_loc=0x80000228
8011 # write should trigger a retry and success
8012 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
8013 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8015 if [ $RC -ne 0 ] ; then
8016 error "write should success, but failed for $RC"
8019 run_test 81a "OST should retry write when get -ENOSPC ==============="
8021 test_81b() { # LU-456
8022 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8023 remote_ost_nodsh && skip "remote OST with nodsh"
8025 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8026 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
8027 do_facet ost1 lctl set_param fail_loc=0x228
8029 # write should retry several times and return -ENOSPC finally
8030 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
8031 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8034 if [ $RC -ne $ENOSPC ] ; then
8035 error "dd should fail for -ENOSPC, but succeed."
8038 run_test 81b "OST should return -ENOSPC when retry still fails ======="
8040 test_82() { # LU-1031
8041 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
8045 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
8047 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
8049 kill -USR1 $MULTIPID2
8051 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
8052 error "First grouplock does not block second one"
8054 echo "Second grouplock blocks first one"
8056 kill -USR1 $MULTIPID1
8060 run_test 82 "Basic grouplock test"
8063 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
8065 test_mkdir $DIR/$tdir.cvsroot
8066 chown $RUNAS_ID $DIR/$tdir.cvsroot
8069 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
8072 # some versions of cvs import exit(1) when asked to import links or
8073 # files they can't read. ignore those files.
8074 local toignore=$(find . -type l -printf '-I %f\n' -o \
8075 ! -perm /4 -printf '-I %f\n')
8076 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
8077 $tdir.reposname vtag rtag
8080 test_mkdir $DIR/$tdir.reposname
8081 chown $RUNAS_ID $DIR/$tdir.reposname
8082 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
8084 cd $DIR/$tdir.reposname
8086 $RUNAS cvs add -m 'addmsg' foo99
8088 $RUNAS cvs commit -m 'nomsg' foo99
8089 rm -fr $DIR/$tdir.cvsroot
8091 run_test 99 "cvs strange file/directory operations"
8094 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8095 [[ "$NETTYPE" =~ tcp ]] ||
8096 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
8097 remote_ost_nodsh && skip "remote OST with nodsh"
8098 remote_mds_nodsh && skip "remote MDS with nodsh"
8100 skip "useless for local single node setup"
8102 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
8103 [ "$PROT" != "tcp" ] && continue
8104 RPORT=$(echo $REMOTE | cut -d: -f2)
8105 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
8108 LPORT=`echo $LOCAL | cut -d: -f2`
8109 if [ $LPORT -ge 1024 ]; then
8110 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
8112 error_exit "local: $LPORT > 1024, remote: $RPORT"
8115 [ "$rc" = 0 ] || error_exit "privileged port not found" )
8117 run_test 100 "check local port using privileged port ==========="
8119 function get_named_value()
8128 echo $line | sed "s/^$tag[ ]*//"
8135 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
8136 awk '/^max_cached_mb/ { print $2 }')
8139 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
8144 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8145 [ $MDSCOUNT -ge 2 ] && skip_env "needs < 2 MDTs" #LU-4322
8150 local cache_limit=32
8152 $LCTL set_param -n osc.*-osc*.rpc_stats 0
8153 trap cleanup_101a EXIT
8154 $LCTL set_param -n llite.*.read_ahead_stats 0
8155 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
8158 # randomly read 10000 of 64K chunks from file 3x 32MB in size
8160 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
8161 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
8164 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
8165 get_named_value 'read but discarded' | cut -d" " -f1); do
8166 discard=$(($discard + $s))
8170 if [[ $(($discard * 10)) -gt $nreads ]]; then
8171 $LCTL get_param osc.*-osc*.rpc_stats
8172 $LCTL get_param llite.*.read_ahead_stats
8173 error "too many ($discard) discarded pages"
8175 rm -f $DIR/$tfile || true
8177 run_test 101a "check read-ahead for random reads"
8180 test_mkdir $DIR/$tdir
8181 local STRIPE_SIZE=$1
8182 local FILE_LENGTH=$2
8185 local FILE_SIZE_MB=$((FILE_LENGTH / STRIPE_SIZE))
8187 local list=$(comma_list $(osts_nodes))
8188 set_osd_param $list '' read_cache_enable 0
8189 set_osd_param $list '' writethrough_cache_enable 0
8191 trap cleanup_test101bc EXIT
8192 # prepare the read-ahead file
8193 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
8195 dd if=/dev/zero of=$DIR/$tfile bs=$STRIPE_SIZE \
8196 count=$FILE_SIZE_MB 2> /dev/null
8200 cleanup_test101bc() {
8205 local list=$(comma_list $(osts_nodes))
8206 set_osd_param $list '' read_cache_enable 1
8207 set_osd_param $list '' writethrough_cache_enable 1
8211 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
8216 local STRIPE_SIZE=$2
8217 local FILE_LENGTH=$3
8218 local RA_INC=1048576
8219 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
8220 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
8221 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
8222 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
8223 get_named_value 'read but discarded' |
8224 cut -d" " -f1 | calc_total)
8225 if [[ $DISCARD -gt $discard_limit ]]; then
8226 $LCTL get_param llite.*.read_ahead_stats
8227 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
8229 echo "Read-ahead success for size ${READ_SIZE}"
8234 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8235 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8237 local STRIPE_SIZE=1048576
8238 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
8240 if [ $SLOW == "yes" ]; then
8241 local FILE_LENGTH=$((STRIDE_SIZE * 64))
8243 local FILE_LENGTH=$((STRIDE_SIZE * 8))
8246 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
8248 # prepare the read-ahead file
8249 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8250 cancel_lru_locks osc
8251 for BIDX in 2 4 8 16 32 64 128 256
8253 local BSIZE=$((BIDX*4096))
8254 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
8255 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
8256 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
8257 $LCTL set_param -n llite.*.read_ahead_stats 0
8258 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
8259 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
8260 cancel_lru_locks osc
8261 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
8266 run_test 101b "check stride-io mode read-ahead ================="
8269 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8271 local STRIPE_SIZE=1048576
8272 local FILE_LENGTH=$((STRIPE_SIZE*100))
8276 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8278 cancel_lru_locks osc
8279 $LCTL set_param osc.*.rpc_stats 0
8280 $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
8281 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8282 local stats=$($LCTL get_param -n $osc_rpc_stats)
8283 local lines=$(echo "$stats" | awk 'END {print NR;}')
8286 if [ $lines -le 20 ]; then
8289 for size in 1 2 4 8; do
8290 local rpc=$(echo "$stats" |
8291 awk '($1 == "'$size':") {print $2; exit; }')
8293 error "Small $((size*4))k read IO $rpc !"
8295 echo "$osc_rpc_stats check passed!"
8300 run_test 101c "check stripe_size aligned read-ahead ================="
8303 $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
8304 $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
8308 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8310 local file=$DIR/$tfile
8311 local sz_MB=${FILESIZE_101d:-500}
8312 local ra_MB=${READAHEAD_MB:-40}
8314 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8315 [ $free_MB -lt $sz_MB ] &&
8316 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8318 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8319 $SETSTRIPE -c -1 $file || error "setstripe failed"
8321 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8322 echo Cancel LRU locks on lustre client to flush the client cache
8323 cancel_lru_locks osc
8325 echo Disable read-ahead
8326 local old_READAHEAD=$(set_read_ahead 0)
8328 echo Reading the test file $file with read-ahead disabled
8329 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8331 echo Cancel LRU locks on lustre client to flush the client cache
8332 cancel_lru_locks osc
8333 echo Enable read-ahead with ${ra_MB}MB
8334 set_read_ahead $ra_MB
8336 echo Reading the test file $file with read-ahead enabled
8337 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8339 echo "read-ahead disabled time read $raOFF"
8340 echo "read-ahead enabled time read $raON"
8342 set_read_ahead $old_READAHEAD
8344 wait_delete_completed
8346 [ $raOFF -le 1 -o $raON -lt $raOFF ] ||
8347 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8349 run_test 101d "file read with and without read-ahead enabled"
8352 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8354 local file=$DIR/$tfile
8355 local size_KB=500 #KB
8359 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8360 local need_KB=$((count * size_KB))
8361 [[ $free_KB -le $need_KB ]] &&
8362 skip_env "Need free space $need_KB, have $free_KB"
8364 echo "Creating $count ${size_KB}K test files"
8365 for ((i = 0; i < $count; i++)); do
8366 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8369 echo "Cancel LRU locks on lustre client to flush the client cache"
8370 cancel_lru_locks $OSC
8372 echo "Reset readahead stats"
8373 $LCTL set_param -n llite.*.read_ahead_stats 0
8375 for ((i = 0; i < $count; i++)); do
8376 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
8379 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8380 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8382 for ((i = 0; i < $count; i++)); do
8383 rm -rf $file.$i 2>/dev/null
8386 #10000 means 20% reads are missing in readahead
8387 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
8389 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
8392 which iozone || skip_env "no iozone installed"
8394 local old_debug=$($LCTL get_param debug)
8395 old_debug=${old_debug#*=}
8396 $LCTL set_param debug="reada mmap"
8398 # create a test file
8399 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
8401 echo Cancel LRU locks on lustre client to flush the client cache
8402 cancel_lru_locks osc
8404 echo Reset readahead stats
8405 $LCTL set_param -n llite.*.read_ahead_stats 0
8407 echo mmap read the file with small block size
8408 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
8411 echo checking missing pages
8412 $LCTL get_param llite.*.read_ahead_stats
8413 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8414 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8416 $LCTL set_param debug="$old_debug"
8417 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
8420 run_test 101f "check mmap read performance"
8422 test_101g_brw_size_test() {
8424 local pages=$((mb * 1048576 / PAGE_SIZE))
8425 local file=$DIR/$tfile
8427 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
8428 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
8429 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
8430 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
8434 stack_trap "rm -f $file" EXIT
8435 $LCTL set_param -n osc.*.rpc_stats=0
8437 # 10 RPCs should be enough for the test
8439 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
8440 { error "dd write ${mb} MB blocks failed"; return 3; }
8441 cancel_lru_locks osc
8442 dd of=/dev/null if=$file bs=${mb}M count=$count ||
8443 { error "dd write ${mb} MB blocks failed"; return 4; }
8445 # calculate number of full-sized read and write RPCs
8446 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
8447 sed -n '/pages per rpc/,/^$/p' |
8448 awk '/'$pages':/ { reads += $2; writes += $6 }; \
8449 END { print reads,writes }'))
8450 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
8452 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
8459 remote_ost_nodsh && skip "remote OST with nodsh"
8462 local osts=$(get_facets OST)
8463 local list=$(comma_list $(osts_nodes))
8464 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
8465 local brw_size="obdfilter.*.brw_size"
8467 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8469 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
8470 if [ $OST1_VERSION -ge $(version_code 2.8.52) -o \
8471 \( $OST1_VERSION -ge $(version_code 2.7.17) -a \
8472 $OST1_VERSION -lt $(version_code 2.7.50) \) ] &&
8473 [ $CLIENT_VERSION -ge $(version_code 2.8.52) -o \
8474 \( $CLIENT_VERSION -ge $(version_code 2.7.17) -a \
8475 $CLIENT_VERSION -lt $(version_code 2.7.50) \) ]; then
8476 [ $OST1_VERSION -ge $(version_code 2.9.52) ] && suffix="M"
8477 if [[ $orig_mb -lt 16 ]]; then
8478 save_lustre_params $osts "$brw_size" > $p
8479 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
8480 error "set 16MB RPC size failed"
8482 echo "remount client to enable new RPC size"
8483 remount_client $MOUNT || error "remount_client failed"
8486 test_101g_brw_size_test 16 || error "16MB RPC test failed"
8487 # should be able to set brw_size=12, but no rpc_stats for that
8488 test_101g_brw_size_test 8 || error "8MB RPC test failed"
8491 test_101g_brw_size_test 4 || error "4MB RPC test failed"
8493 if [[ $orig_mb -lt 16 ]]; then
8494 restore_lustre_params < $p
8495 remount_client $MOUNT || error "remount_client restore failed"
8498 rm -f $p $DIR/$tfile
8500 run_test 101g "Big bulk(4/16 MiB) readahead"
8503 test_mkdir $DIR/$tdir
8504 chown $RUNAS_ID $DIR/$tdir
8507 STRIPE_COUNT=$OSTCOUNT
8508 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
8510 trap cleanup_test102 EXIT
8512 $1 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
8514 for num in 1 2 3 4; do
8515 for count in $(seq 1 $STRIPE_COUNT); do
8516 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
8517 local size=`expr $STRIPE_SIZE \* $num`
8518 local file=file"$num-$idx-$count"
8519 $1 $SETSTRIPE -S $size -i $idx -c $count $file
8525 $1 tar cf $TMP/f102.tar $tdir --xattrs
8531 rm -rf $DIR/d0.sanity/d102
8535 [ "$UID" != 0 ] && skip "must run as root"
8536 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
8537 skip_env "must have user_xattr"
8539 [ -z "$(which setfattr 2>/dev/null)" ] &&
8540 skip_env "could not find setfattr"
8542 local testfile=$DIR/$tfile
8545 echo "set/get xattr..."
8546 setfattr -n trusted.name1 -v value1 $testfile ||
8547 error "setfattr -n trusted.name1=value1 $testfile failed"
8548 getfattr -n trusted.name1 $testfile 2> /dev/null |
8549 grep "trusted.name1=.value1" ||
8550 error "$testfile missing trusted.name1=value1"
8552 setfattr -n user.author1 -v author1 $testfile ||
8553 error "setfattr -n user.author1=author1 $testfile failed"
8554 getfattr -n user.author1 $testfile 2> /dev/null |
8555 grep "user.author1=.author1" ||
8556 error "$testfile missing trusted.author1=author1"
8559 setfattr -n trusted.name2 -v value2 $testfile ||
8560 error "$testfile unable to set trusted.name2"
8561 setfattr -n trusted.name3 -v value3 $testfile ||
8562 error "$testfile unable to set trusted.name3"
8563 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
8564 grep "trusted.name" | wc -l) -eq 3 ] ||
8565 error "$testfile missing 3 trusted.name xattrs"
8567 setfattr -n user.author2 -v author2 $testfile ||
8568 error "$testfile unable to set user.author2"
8569 setfattr -n user.author3 -v author3 $testfile ||
8570 error "$testfile unable to set user.author3"
8571 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
8572 grep "user.author" | wc -l) -eq 3 ] ||
8573 error "$testfile missing 3 user.author xattrs"
8575 echo "remove xattr..."
8576 setfattr -x trusted.name1 $testfile ||
8577 error "$testfile error deleting trusted.name1"
8578 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
8579 error "$testfile did not delete trusted.name1 xattr"
8581 setfattr -x user.author1 $testfile ||
8582 error "$testfile error deleting user.author1"
8583 echo "set lustre special xattr ..."
8584 $LFS setstripe -c1 $testfile
8585 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
8586 awk -F "=" '/trusted.lov/ { print $2 }' )
8587 setfattr -n "trusted.lov" -v $lovea $testfile ||
8588 error "$testfile doesn't ignore setting trusted.lov again"
8589 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
8590 error "$testfile allow setting invalid trusted.lov"
8593 run_test 102a "user xattr test =================================="
8595 check_102b_layout() {
8597 local testfile=$DIR/$tfile
8599 echo "test layout '$layout'"
8600 $LFS setstripe $layout $testfile || error "setstripe failed"
8601 $LFS getstripe -y $testfile
8603 echo "get/set/list trusted.lov xattr ..." # b=10930
8604 local value=$(getfattr -n trusted.lov -e hex $testfile | grep trusted)
8605 [[ "$value" =~ "trusted.lov" ]] ||
8606 error "can't get trusted.lov from $testfile"
8607 local stripe_count_orig=$($LFS getstripe -c $testfile) ||
8608 error "getstripe failed"
8610 $MCREATE $testfile.2 || error "mcreate $testfile.2 failed"
8612 value=$(cut -d= -f2 <<<$value)
8613 # LU-13168: truncated xattr should fail if short lov_user_md header
8614 [ $CLIENT_VERSION -lt $(version_code 2.13.53) ] &&
8615 lens="${#value}" || lens="$(seq 4 2 ${#value})"
8616 for len in $lens; do
8617 echo "setfattr $len $testfile.2"
8618 setfattr -n trusted.lov -v ${value:0:$len} $testfile.2 &&
8619 [ $len -lt 66 ] && error "short xattr len=$len worked"
8621 local stripe_size=$($LFS getstripe -S $testfile.2)
8622 local stripe_count=$($LFS getstripe -c $testfile.2)
8623 [[ $stripe_size -eq 65536 ]] ||
8624 error "stripe size $stripe_size != 65536"
8625 [[ $stripe_count -eq $stripe_count_orig ]] ||
8626 error "stripe count $stripe_count != $stripe_count_orig"
8627 rm $testfile $testfile.2
8631 [ -z "$(which setfattr 2>/dev/null)" ] &&
8632 skip_env "could not find setfattr"
8633 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8635 # check plain layout
8636 check_102b_layout -S 65536 -i 1 -c $OSTCOUNT
8638 # and also check composite layout
8639 check_102b_layout -E 1M -S 65536 -i 1 -c $OSTCOUNT -Eeof -S4M
8642 run_test 102b "getfattr/setfattr for trusted.lov EAs"
8645 [ -z "$(which setfattr 2>/dev/null)" ] &&
8646 skip_env "could not find setfattr"
8647 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8649 # b10930: get/set/list lustre.lov xattr
8650 echo "get/set/list lustre.lov xattr ..."
8651 test_mkdir $DIR/$tdir
8652 chown $RUNAS_ID $DIR/$tdir
8653 local testfile=$DIR/$tdir/$tfile
8654 $RUNAS $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8655 error "setstripe failed"
8656 local STRIPECOUNT=$($RUNAS $GETSTRIPE -c $testfile) ||
8657 error "getstripe failed"
8658 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
8659 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
8661 local testfile2=${testfile}2
8662 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
8663 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
8665 $RUNAS $MCREATE $testfile2
8666 $RUNAS setfattr -n lustre.lov -v $value $testfile2
8667 local stripe_size=$($RUNAS $GETSTRIPE -S $testfile2)
8668 local stripe_count=$($RUNAS $GETSTRIPE -c $testfile2)
8669 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
8670 [ $stripe_count -eq $STRIPECOUNT ] ||
8671 error "stripe count $stripe_count != $STRIPECOUNT"
8673 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
8675 compare_stripe_info1() {
8676 local stripe_index_all_zero=true
8678 for num in 1 2 3 4; do
8679 for count in $(seq 1 $STRIPE_COUNT); do
8680 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
8681 local size=$((STRIPE_SIZE * num))
8682 local file=file"$num-$offset-$count"
8683 stripe_size=$($LFS getstripe -S $PWD/$file)
8684 [[ $stripe_size -ne $size ]] &&
8685 error "$file: size $stripe_size != $size"
8686 stripe_count=$($LFS getstripe -c $PWD/$file)
8687 # allow fewer stripes to be created, ORI-601
8688 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
8689 error "$file: count $stripe_count != $count"
8690 stripe_index=$($LFS getstripe -i $PWD/$file)
8691 [[ $stripe_index -ne 0 ]] &&
8692 stripe_index_all_zero=false
8696 $stripe_index_all_zero &&
8697 error "all files are being extracted starting from OST index 0"
8701 have_xattrs_include() {
8702 tar --help | grep -q xattrs-include &&
8703 echo --xattrs-include="lustre.*"
8707 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8708 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8710 XINC=$(have_xattrs_include)
8712 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8714 compare_stripe_info1
8716 run_test 102d "tar restore stripe info from tarfile,not keep osts"
8719 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8720 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8722 XINC=$(have_xattrs_include)
8724 test_mkdir $DIR/$tdir.restore
8726 tar cf - --xattrs $tdir | tar xf - \
8727 -C $DIR/$tdir.restore --xattrs $XINC
8728 cd $DIR/$tdir.restore/$tdir
8729 compare_stripe_info1
8731 run_test 102f "tar copy files, not keep osts"
8734 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
8735 skip "must have user_xattr"
8736 [ -z "$(which setfattr 2>/dev/null)" ] &&
8737 skip_env "could not find setfattr"
8738 [ -z "$(which getfattr 2>/dev/null)" ] &&
8739 skip_env "could not find getfattr"
8741 local xsize=${1:-1024} # in bytes
8742 local file=$DIR/$tfile
8743 local value="$(generate_string $xsize)"
8744 local xbig=trusted.big
8747 log "save $xbig on $file"
8748 setfattr -n $xbig -v $value $file ||
8749 error "saving $xbig on $file failed"
8751 local orig=$(get_xattr_value $xbig $file)
8752 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
8754 local xsml=trusted.sml
8755 log "save $xsml on $file"
8756 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
8758 local new=$(get_xattr_value $xbig $file)
8759 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
8761 log "grow $xsml on $file"
8762 setfattr -n $xsml -v "$value" $file ||
8763 error "growing $xsml on $file failed"
8765 new=$(get_xattr_value $xbig $file)
8766 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
8767 log "$xbig still valid after growing $xsml"
8772 test_102h() { # bug 15777
8775 run_test 102h "grow xattr from inside inode to external block"
8778 large_xattr_enabled || skip_env "ea_inode feature disabled"
8780 grow_xattr $(max_xattr_size)
8782 run_test 102ha "grow xattr from inside inode to external inode"
8784 test_102i() { # bug 17038
8785 [ -z "$(which getfattr 2>/dev/null)" ] &&
8786 skip "could not find getfattr"
8789 ln -s $DIR/$tfile $DIR/${tfile}link
8790 getfattr -n trusted.lov $DIR/$tfile ||
8791 error "lgetxattr on $DIR/$tfile failed"
8792 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
8793 grep -i "no such attr" ||
8794 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
8795 rm -f $DIR/$tfile $DIR/${tfile}link
8797 run_test 102i "lgetxattr test on symbolic link ============"
8800 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8801 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8803 XINC=$(have_xattrs_include)
8804 setup_test102 "$RUNAS"
8805 chown $RUNAS_ID $DIR/$tdir
8806 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8808 compare_stripe_info1 "$RUNAS"
8810 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
8813 [ -z "$(which setfattr 2>/dev/null)" ] &&
8814 skip "could not find setfattr"
8817 # b22187 just check that does not crash for regular file.
8818 setfattr -n trusted.lov $DIR/$tfile
8819 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
8820 local test_kdir=$DIR/$tdir
8821 test_mkdir $test_kdir
8822 local default_size=$($LFS getstripe -S $test_kdir)
8823 local default_count=$($LFS getstripe -c $test_kdir)
8824 local default_offset=$($LFS getstripe -i $test_kdir)
8825 $SETSTRIPE -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
8826 error 'dir setstripe failed'
8827 setfattr -n trusted.lov $test_kdir
8828 local stripe_size=$($LFS getstripe -S $test_kdir)
8829 local stripe_count=$($LFS getstripe -c $test_kdir)
8830 local stripe_offset=$($LFS getstripe -i $test_kdir)
8831 [ $stripe_size -eq $default_size ] ||
8832 error "stripe size $stripe_size != $default_size"
8833 [ $stripe_count -eq $default_count ] ||
8834 error "stripe count $stripe_count != $default_count"
8835 [ $stripe_offset -eq $default_offset ] ||
8836 error "stripe offset $stripe_offset != $default_offset"
8837 rm -rf $DIR/$tfile $test_kdir
8839 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
8842 [ -z "$(which getfattr 2>/dev/null)" ] &&
8843 skip "could not find getfattr"
8845 # LU-532 trusted. xattr is invisible to non-root
8846 local testfile=$DIR/$tfile
8850 echo "listxattr as user..."
8851 chown $RUNAS_ID $testfile
8852 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
8853 grep -q "trusted" &&
8854 error "$testfile trusted xattrs are user visible"
8858 run_test 102l "listxattr size test =================================="
8860 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
8861 local path=$DIR/$tfile
8864 listxattr_size_check $path || error "listattr_size_check $path failed"
8866 run_test 102m "Ensure listxattr fails on small bufffer ========"
8870 getxattr() { # getxattr path name
8871 # Return the base64 encoding of the value of xattr name on path.
8875 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
8877 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8879 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8881 getfattr --absolute-names --encoding=base64 --name=$name $path |
8882 awk -F= -v name=$name '$1 == name {
8883 print substr($0, index($0, "=") + 1);
8887 test_102n() { # LU-4101 mdt: protect internal xattrs
8888 [ -z "$(which setfattr 2>/dev/null)" ] &&
8889 skip "could not find setfattr"
8890 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
8892 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
8895 local file0=$DIR/$tfile.0
8896 local file1=$DIR/$tfile.1
8897 local xattr0=$TMP/$tfile.0
8898 local xattr1=$TMP/$tfile.1
8899 local namelist="lov lma lmv link fid version som hsm"
8903 rm -rf $file0 $file1 $xattr0 $xattr1
8906 # Get 'before' xattrs of $file1.
8907 getfattr --absolute-names --dump --match=- $file1 > $xattr0
8909 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
8910 namelist+=" lfsck_namespace"
8911 for name in $namelist; do
8912 # Try to copy xattr from $file0 to $file1.
8913 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8915 setfattr --name=trusted.$name --value="$value" $file1 ||
8916 error "setxattr 'trusted.$name' failed"
8918 # Try to set a garbage xattr.
8919 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8921 if [[ x$name == "xlov" ]]; then
8922 setfattr --name=trusted.lov --value="$value" $file1 &&
8923 error "setxattr invalid 'trusted.lov' success"
8925 setfattr --name=trusted.$name --value="$value" $file1 ||
8926 error "setxattr invalid 'trusted.$name' failed"
8929 # Try to remove the xattr from $file1. We don't care if this
8930 # appears to succeed or fail, we just don't want there to be
8931 # any changes or crashes.
8932 setfattr --remove=$trusted.$name $file1 2> /dev/null
8935 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
8938 # Try to copy xattr from $file0 to $file1.
8939 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8941 setfattr --name=trusted.$name --value="$value" $file1 ||
8942 error "setxattr 'trusted.$name' failed"
8944 # Try to set a garbage xattr.
8945 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8947 setfattr --name=trusted.$name --value="$value" $file1 ||
8948 error "setxattr 'trusted.$name' failed"
8950 # Try to remove the xattr from $file1. We don't care if this
8951 # appears to succeed or fail, we just don't want there to be
8952 # any changes or crashes.
8953 setfattr --remove=$trusted.$name $file1 2> /dev/null
8956 # Get 'after' xattrs of file1.
8957 getfattr --absolute-names --dump --match=- $file1 > $xattr1
8959 if ! diff $xattr0 $xattr1; then
8960 error "before and after xattrs of '$file1' differ"
8963 rm -rf $file0 $file1 $xattr0 $xattr1
8967 run_test 102n "silently ignore setxattr on internal trusted xattrs"
8969 test_102p() { # LU-4703 setxattr did not check ownership
8970 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
8971 skip "MDS needs to be at least 2.5.56"
8973 local testfile=$DIR/$tfile
8977 echo "setfacl as user..."
8978 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
8979 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
8981 echo "setfattr as user..."
8982 setfacl -m "u:$RUNAS_ID:---" $testfile
8983 $RUNAS setfattr -x system.posix_acl_access $testfile
8984 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
8986 run_test 102p "check setxattr(2) correctly fails without permission"
8989 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
8990 skip "MDS needs to be at least 2.6.92"
8992 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
8994 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
8997 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
8998 skip "MDS needs to be at least 2.6.93"
9000 touch $DIR/$tfile || error "touch"
9001 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
9002 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
9003 rm $DIR/$tfile || error "rm"
9006 mkdir -p $DIR/$tdir || error "mkdir"
9007 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9008 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9009 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9010 error "$testfile error deleting user.author1"
9011 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9012 grep "user.$(basename $tdir)" &&
9013 error "$tdir did not delete user.$(basename $tdir)"
9014 rmdir $DIR/$tdir || error "rmdir"
9017 test_mkdir $DIR/$tdir
9018 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9019 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9020 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9021 error "$testfile error deleting user.author1"
9022 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9023 grep "user.$(basename $tdir)" &&
9024 error "$tdir did not delete user.$(basename $tdir)"
9025 rmdir $DIR/$tdir || error "rm striped dir"
9027 run_test 102r "set EAs with empty values"
9030 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9031 skip "MDS needs to be at least 2.11.52"
9033 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9035 save_lustre_params client "llite.*.xattr_cache" > $save
9037 for cache in 0 1; do
9038 lctl set_param llite.*.xattr_cache=$cache
9041 touch $DIR/$tfile || error "touch"
9042 for prefix in lustre security system trusted user; do
9043 # Note getxattr() may fail with 'Operation not
9044 # supported' or 'No such attribute' depending
9045 # on prefix and cache.
9046 getfattr -n $prefix.n102s $DIR/$tfile &&
9047 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
9051 restore_lustre_params < $save
9053 run_test 102s "getting nonexistent xattrs should fail"
9056 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9057 skip "MDS needs to be at least 2.11.52"
9059 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9061 save_lustre_params client "llite.*.xattr_cache" > $save
9063 for cache in 0 1; do
9064 lctl set_param llite.*.xattr_cache=$cache
9066 for buf_size in 0 256; do
9068 touch $DIR/$tfile || error "touch"
9069 setfattr -n user.multiop $DIR/$tfile
9070 $MULTIOP $DIR/$tfile oa$buf_size ||
9071 error "cannot get zero length xattr value (buf_size = $buf_size)"
9075 restore_lustre_params < $save
9077 run_test 102t "zero length xattr values handled correctly"
9081 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
9086 [ "$UID" != 0 ] && skip "must run as root"
9087 $GSS && skip_env "could not run under gss"
9088 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
9089 skip_env "must have acl enabled"
9090 [ -z "$(which setfacl 2>/dev/null)" ] &&
9091 skip_env "could not find setfacl"
9092 remote_mds_nodsh && skip "remote MDS with nodsh"
9094 gpasswd -a daemon bin # LU-5641
9095 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
9097 declare -a identity_old
9099 for num in $(seq $MDSCOUNT); do
9100 switch_identity $num true || identity_old[$num]=$?
9108 echo "performing cp ..."
9109 run_acl_subtest cp || error "run_acl_subtest cp failed"
9110 echo "performing getfacl-noacl..."
9111 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
9112 echo "performing misc..."
9113 run_acl_subtest misc || error "misc test failed"
9114 echo "performing permissions..."
9115 run_acl_subtest permissions || error "permissions failed"
9116 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
9117 if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] ||
9118 { [ $MDS1_VERSION -lt $(version_code 2.6) ] &&
9119 [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; }
9121 echo "performing permissions xattr..."
9122 run_acl_subtest permissions_xattr ||
9123 error "permissions_xattr failed"
9125 echo "performing setfacl..."
9126 run_acl_subtest setfacl || error "setfacl test failed"
9128 # inheritance test got from HP
9129 echo "performing inheritance..."
9130 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
9131 chmod +x make-tree || error "chmod +x failed"
9132 run_acl_subtest inheritance || error "inheritance test failed"
9135 echo "LU-974 ignore umask when acl is enabled..."
9136 run_acl_subtest 974 || error "LU-974 umask test failed"
9137 if [ $MDSCOUNT -ge 2 ]; then
9138 run_acl_subtest 974_remote ||
9139 error "LU-974 umask test failed under remote dir"
9142 echo "LU-2561 newly created file is same size as directory..."
9143 if [ "$mds1_FSTYPE" != "zfs" ]; then
9144 run_acl_subtest 2561 || error "LU-2561 test failed"
9146 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
9149 run_acl_subtest 4924 || error "LU-4924 test failed"
9154 for num in $(seq $MDSCOUNT); do
9155 if [ "${identity_old[$num]}" = 1 ]; then
9156 switch_identity $num false || identity_old[$num]=$?
9160 run_test 103a "acl test"
9166 for U in {0..511}; do
9168 local O=$(printf "%04o" $U)
9170 umask $(printf "%04o" $((511 ^ $O)))
9171 $LFS setstripe -c 1 $DIR/$tfile.s$O
9172 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
9174 (( $S == ($O & 0666) )) ||
9175 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
9177 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
9178 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
9179 (( $S == ($O & 0666) )) ||
9180 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
9182 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
9183 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
9184 (( $S == ($O & 0666) )) ||
9185 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
9186 rm -f $DIR/$tfile.[smp]$0
9190 # limit the concurrently running threads to 64. LU-11878
9191 local idx=$((U % 64))
9192 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
9197 run_test 103b "umask lfs setstripe"
9201 cp -rp $DIR/$tdir $DIR/$tdir.bak
9203 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
9204 error "$DIR/$tdir shouldn't contain default ACL"
9205 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
9206 error "$DIR/$tdir.bak shouldn't contain default ACL"
9209 run_test 103c "'cp -rp' won't set empty acl"
9212 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9215 lfs df || error "lfs df failed"
9216 lfs df -ih || error "lfs df -ih failed"
9217 lfs df -h $DIR || error "lfs df -h $DIR failed"
9218 lfs df -i $DIR || error "lfs df -i $DIR failed"
9219 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
9220 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
9222 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
9223 lctl --device %$OSC deactivate
9224 lfs df || error "lfs df with deactivated OSC failed"
9225 lctl --device %$OSC activate
9226 # wait the osc back to normal
9227 wait_osc_import_ready client ost
9229 lfs df || error "lfs df with reactivated OSC failed"
9232 run_test 104a "lfs df [-ih] [path] test ========================="
9235 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9236 [ $RUNAS_ID -eq $UID ] &&
9237 skip_env "RUNAS_ID = UID = $UID -- skipping"
9239 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
9240 grep "Permission denied" | wc -l)))
9241 if [ $denied_cnt -ne 0 ]; then
9242 error "lfs check servers test failed"
9245 run_test 104b "$RUNAS lfs check servers test ===================="
9248 # doesn't work on 2.4 kernels
9250 if $(flock_is_enabled); then
9251 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
9253 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
9257 run_test 105a "flock when mounted without -o flock test ========"
9261 if $(flock_is_enabled); then
9262 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
9264 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
9268 run_test 105b "fcntl when mounted without -o flock test ========"
9272 if $(flock_is_enabled); then
9273 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
9275 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
9279 run_test 105c "lockf when mounted without -o flock test"
9281 test_105d() { # bug 15924
9282 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9284 test_mkdir $DIR/$tdir
9285 flock_is_enabled || skip_env "mount w/o flock enabled"
9286 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
9287 $LCTL set_param fail_loc=0x80000315
9288 flocks_test 2 $DIR/$tdir
9290 run_test 105d "flock race (should not freeze) ========"
9292 test_105e() { # bug 22660 && 22040
9293 flock_is_enabled || skip_env "mount w/o flock enabled"
9296 flocks_test 3 $DIR/$tfile
9298 run_test 105e "Two conflicting flocks from same process"
9300 test_106() { #bug 10921
9301 test_mkdir $DIR/$tdir
9302 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9303 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9305 run_test 106 "attempt exec of dir followed by chown of that dir"
9308 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9316 local save_pattern=$(sysctl -n kernel.core_pattern)
9317 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9318 sysctl -w kernel.core_pattern=$file
9319 sysctl -w kernel.core_uses_pid=0
9327 kill -s 11 $SLEEPPID
9329 if [ -e $file ]; then
9330 size=`stat -c%s $file`
9331 [ $size -eq 0 ] && error "Fail to create core file $file"
9333 error "Fail to create core file $file"
9336 sysctl -w kernel.core_pattern=$save_pattern
9337 sysctl -w kernel.core_uses_pid=$save_uses_pid
9340 run_test 107 "Coredump on SIG"
9343 test_mkdir $DIR/$tdir
9344 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9345 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9346 error "mkdir with 256 char should fail, but did not"
9347 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9348 error "create with 255 char failed"
9349 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9350 error "create with 256 char should fail, but did not"
9355 run_test 110 "filename length checking"
9358 # Purpose: To verify dynamic thread (OSS) creation.
9361 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9362 remote_ost_nodsh && skip "remote OST with nodsh"
9364 # Lustre does not stop service threads once they are started.
9365 # Reset number of running threads to default.
9370 local save_params="$TMP/sanity-$TESTNAME.parameters"
9372 # Get ll_ost_io count before I/O
9373 OSTIO_pre=$(do_facet ost1 \
9374 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9375 # Exit if lustre is not running (ll_ost_io not running).
9376 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9378 echo "Starting with $OSTIO_pre threads"
9379 local thread_max=$((OSTIO_pre * 2))
9380 local rpc_in_flight=$((thread_max * 2))
9381 # Number of I/O Process proposed to be started.
9383 local facets=$(get_facets OST)
9385 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9386 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9388 # Set in_flight to $rpc_in_flight
9389 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9390 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9391 nfiles=${rpc_in_flight}
9392 # Set ost thread_max to $thread_max
9393 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9395 # 5 Minutes should be sufficient for max number of OSS
9396 # threads(thread_max) to be created.
9400 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9401 test_mkdir $DIR/$tdir
9402 for i in $(seq $nfiles); do
9403 local file=$DIR/$tdir/${tfile}-$i
9404 $LFS setstripe -c -1 -i 0 $file
9405 ($WTL $file $timeout)&
9408 # I/O Started - Wait for thread_started to reach thread_max or report
9409 # error if thread_started is more than thread_max.
9410 echo "Waiting for thread_started to reach thread_max"
9411 local thread_started=0
9412 local end_time=$((SECONDS + timeout))
9414 while [ $SECONDS -le $end_time ] ; do
9416 # Get ost i/o thread_started count.
9417 thread_started=$(do_facet ost1 \
9419 ost.OSS.ost_io.threads_started | cut -d= -f2")
9420 # Break out if thread_started is equal/greater than thread_max
9421 if [[ $thread_started -ge $thread_max ]]; then
9422 echo ll_ost_io thread_started $thread_started, \
9423 equal/greater than thread_max $thread_max
9429 # Cleanup - We have the numbers, Kill i/o jobs if running.
9430 jobcount=($(jobs -p))
9431 for i in $(seq 0 $((${#jobcount[@]}-1)))
9433 kill -9 ${jobcount[$i]}
9434 if [ $? -ne 0 ] ; then
9436 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
9440 # Cleanup files left by WTL binary.
9441 for i in $(seq $nfiles); do
9442 local file=$DIR/$tdir/${tfile}-$i
9444 if [ $? -ne 0 ] ; then
9445 echo "Warning: Failed to delete file $file"
9449 restore_lustre_params <$save_params
9450 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
9452 # Error out if no new thread has started or Thread started is greater
9454 if [[ $thread_started -le $OSTIO_pre ||
9455 $thread_started -gt $thread_max ]]; then
9456 error "ll_ost_io: thread_started $thread_started" \
9457 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
9458 "No new thread started or thread started greater " \
9462 run_test 115 "verify dynamic thread creation===================="
9465 wait_delete_completed
9466 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
9467 echo "OST kbytes available: ${AVAIL[@]}"
9472 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
9473 #echo OST $i: ${AVAIL[i]}kb
9474 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
9478 if [[ ${AVAIL[i]} -lt $MINV ]]; then
9483 echo "Min free space: OST $MINI: $MINV"
9484 echo "Max free space: OST $MAXI: $MAXV"
9487 test_116a() { # was previously test_116()
9488 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9489 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9490 remote_mds_nodsh && skip "remote MDS with nodsh"
9492 echo -n "Free space priority "
9493 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
9498 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
9499 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
9500 trap simple_cleanup_common EXIT
9502 # Check if we need to generate uneven OSTs
9503 test_mkdir -p $DIR/$tdir/OST${MINI}
9504 local FILL=$((MINV / 4))
9505 local DIFF=$((MAXV - MINV))
9506 local DIFF2=$((DIFF * 100 / MINV))
9508 local threshold=$(do_facet $SINGLEMDS \
9509 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
9510 threshold=${threshold%%%}
9511 echo -n "Check for uneven OSTs: "
9512 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
9514 if [[ $DIFF2 -gt $threshold ]]; then
9516 echo "Don't need to fill OST$MINI"
9518 # generate uneven OSTs. Write 2% over the QOS threshold value
9520 DIFF=$((threshold - DIFF2 + 2))
9521 DIFF2=$((MINV * DIFF / 100))
9522 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
9523 $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
9524 error "setstripe failed"
9525 DIFF=$((DIFF2 / 2048))
9527 while [ $i -lt $DIFF ]; do
9529 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
9530 bs=2M count=1 2>/dev/null
9539 DIFF=$((MAXV - MINV))
9540 DIFF2=$((DIFF * 100 / MINV))
9541 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
9542 if [ $DIFF2 -gt $threshold ]; then
9545 echo "failed - QOS mode won't be used"
9546 simple_cleanup_common
9547 skip "QOS imbalance criteria not met"
9555 # now fill using QOS
9556 $SETSTRIPE -c 1 $DIR/$tdir
9557 FILL=$((FILL / 200))
9558 if [ $FILL -gt 600 ]; then
9561 echo "writing $FILL files to QOS-assigned OSTs"
9563 while [ $i -lt $FILL ]; do
9565 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
9569 echo "wrote $i 200k files"
9573 echo "Note: free space may not be updated, so measurements might be off"
9575 DIFF2=$((MAXV - MINV))
9576 echo "free space delta: orig $DIFF final $DIFF2"
9577 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
9578 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
9579 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
9580 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
9581 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
9582 if [[ $DIFF -gt 0 ]]; then
9583 FILL=$((DIFF2 * 100 / DIFF - 100))
9584 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
9587 # Figure out which files were written where
9588 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9589 awk '/'$MINI1': / {print $2; exit}')
9591 MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9592 echo "$MINC files created on smaller OST $MINI1"
9593 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9594 awk '/'$MAXI1': / {print $2; exit}')
9596 MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9597 echo "$MAXC files created on larger OST $MAXI1"
9598 if [[ $MINC -gt 0 ]]; then
9599 FILL=$((MAXC * 100 / MINC - 100))
9600 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
9602 [[ $MAXC -gt $MINC ]] ||
9603 error_ignore LU-9 "stripe QOS didn't balance free space"
9604 simple_cleanup_common
9606 run_test 116a "stripe QOS: free space balance ==================="
9608 test_116b() { # LU-2093
9609 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9610 remote_mds_nodsh && skip "remote MDS with nodsh"
9612 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
9613 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
9614 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
9615 [ -z "$old_rr" ] && skip "no QOS"
9616 do_facet $SINGLEMDS lctl set_param \
9617 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
9619 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
9620 createmany -o $DIR/$tdir/f- 20 || error "can't create"
9621 do_facet $SINGLEMDS lctl set_param fail_loc=0
9623 do_facet $SINGLEMDS lctl set_param \
9624 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
9626 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
9628 test_117() # bug 10891
9630 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9632 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
9633 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
9634 lctl set_param fail_loc=0x21e
9635 > $DIR/$tfile || error "truncate failed"
9636 lctl set_param fail_loc=0
9637 echo "Truncate succeeded."
9640 run_test 117 "verify osd extend =========="
9642 NO_SLOW_RESENDCOUNT=4
9643 export OLD_RESENDCOUNT=""
9644 set_resend_count () {
9645 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
9646 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
9647 lctl set_param -n $PROC_RESENDCOUNT $1
9648 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
9651 # for reduce test_118* time (b=14842)
9652 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9654 # Reset async IO behavior after error case
9656 FILE=$DIR/reset_async
9658 # Ensure all OSCs are cleared
9659 $SETSTRIPE -c -1 $FILE
9660 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
9665 test_118a() #bug 11710
9667 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9671 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9672 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9673 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9675 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9676 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9681 run_test 118a "verify O_SYNC works =========="
9685 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9686 remote_ost_nodsh && skip "remote OST with nodsh"
9690 #define OBD_FAIL_SRV_ENOENT 0x217
9691 set_nodes_failloc "$(osts_nodes)" 0x217
9692 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9694 set_nodes_failloc "$(osts_nodes)" 0
9695 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9696 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9699 if [[ $RC -eq 0 ]]; then
9700 error "Must return error due to dropped pages, rc=$RC"
9704 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9705 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9709 echo "Dirty pages not leaked on ENOENT"
9711 # Due to the above error the OSC will issue all RPCs syncronously
9712 # until a subsequent RPC completes successfully without error.
9713 $MULTIOP $DIR/$tfile Ow4096yc
9718 run_test 118b "Reclaim dirty pages on fatal error =========="
9722 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9724 # for 118c, restore the original resend count, LU-1940
9725 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
9726 set_resend_count $OLD_RESENDCOUNT
9727 remote_ost_nodsh && skip "remote OST with nodsh"
9731 #define OBD_FAIL_OST_EROFS 0x216
9732 set_nodes_failloc "$(osts_nodes)" 0x216
9734 # multiop should block due to fsync until pages are written
9735 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9739 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9740 error "Multiop failed to block on fsync, pid=$MULTIPID"
9743 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9745 if [[ $WRITEBACK -eq 0 ]]; then
9746 error "No page in writeback, writeback=$WRITEBACK"
9749 set_nodes_failloc "$(osts_nodes)" 0
9752 if [[ $RC -ne 0 ]]; then
9753 error "Multiop fsync failed, rc=$RC"
9756 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9757 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9759 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9760 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9764 echo "Dirty pages flushed via fsync on EROFS"
9767 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
9769 # continue to use small resend count to reduce test_118* time (b=14842)
9770 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9774 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9775 remote_ost_nodsh && skip "remote OST with nodsh"
9779 #define OBD_FAIL_OST_BRW_PAUSE_BULK
9780 set_nodes_failloc "$(osts_nodes)" 0x214
9781 # multiop should block due to fsync until pages are written
9782 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9786 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9787 error "Multiop failed to block on fsync, pid=$MULTIPID"
9790 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9792 if [[ $WRITEBACK -eq 0 ]]; then
9793 error "No page in writeback, writeback=$WRITEBACK"
9796 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
9797 set_nodes_failloc "$(osts_nodes)" 0
9799 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9800 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9802 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9803 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9807 echo "Dirty pages gaurenteed flushed via fsync"
9810 run_test 118d "Fsync validation inject a delay of the bulk =========="
9813 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9817 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
9818 lctl set_param fail_loc=0x8000040a
9820 # Should simulate EINVAL error which is fatal
9821 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9823 if [[ $RC -eq 0 ]]; then
9824 error "Must return error due to dropped pages, rc=$RC"
9827 lctl set_param fail_loc=0x0
9829 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9830 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9831 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9833 if [[ $LOCKED -ne 0 ]]; then
9834 error "Locked pages remain in cache, locked=$LOCKED"
9837 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9838 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9842 echo "No pages locked after fsync"
9847 run_test 118f "Simulate unrecoverable OSC side error =========="
9850 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9854 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
9855 lctl set_param fail_loc=0x406
9857 # simulate local -ENOMEM
9858 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9861 lctl set_param fail_loc=0
9862 if [[ $RC -eq 0 ]]; then
9863 error "Must return error due to dropped pages, rc=$RC"
9866 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9867 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9868 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9870 if [[ $LOCKED -ne 0 ]]; then
9871 error "Locked pages remain in cache, locked=$LOCKED"
9874 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9875 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9879 echo "No pages locked after fsync"
9884 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
9887 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9888 remote_ost_nodsh && skip "remote OST with nodsh"
9892 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9893 set_nodes_failloc "$(osts_nodes)" 0x20e
9894 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9895 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9898 set_nodes_failloc "$(osts_nodes)" 0
9899 if [[ $RC -eq 0 ]]; then
9900 error "Must return error due to dropped pages, rc=$RC"
9903 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9904 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9905 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9907 if [[ $LOCKED -ne 0 ]]; then
9908 error "Locked pages remain in cache, locked=$LOCKED"
9911 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9912 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9916 echo "No pages locked after fsync"
9920 run_test 118h "Verify timeout in handling recoverables errors =========="
9922 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
9925 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9926 remote_ost_nodsh && skip "remote OST with nodsh"
9930 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9931 set_nodes_failloc "$(osts_nodes)" 0x20e
9933 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9934 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9937 set_nodes_failloc "$(osts_nodes)" 0
9941 if [[ $RC -ne 0 ]]; then
9942 error "got error, but should be not, rc=$RC"
9945 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9946 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9947 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9948 if [[ $LOCKED -ne 0 ]]; then
9949 error "Locked pages remain in cache, locked=$LOCKED"
9952 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9953 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9957 echo "No pages locked after fsync"
9961 run_test 118i "Fix error before timeout in recoverable error =========="
9963 [ "$SLOW" = "no" ] && set_resend_count 4
9966 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9967 remote_ost_nodsh && skip "remote OST with nodsh"
9971 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
9972 set_nodes_failloc "$(osts_nodes)" 0x220
9974 # return -EIO from OST
9975 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9977 set_nodes_failloc "$(osts_nodes)" 0x0
9978 if [[ $RC -eq 0 ]]; then
9979 error "Must return error due to dropped pages, rc=$RC"
9982 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9983 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9984 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9985 if [[ $LOCKED -ne 0 ]]; then
9986 error "Locked pages remain in cache, locked=$LOCKED"
9989 # in recoverable error on OST we want resend and stay until it finished
9990 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9991 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9995 echo "No pages locked after fsync"
9999 run_test 118j "Simulate unrecoverable OST side error =========="
10003 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10004 remote_ost_nodsh && skip "remote OSTs with nodsh"
10006 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10007 set_nodes_failloc "$(osts_nodes)" 0x20e
10008 test_mkdir $DIR/$tdir
10010 for ((i=0;i<10;i++)); do
10011 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
10012 error "dd to $DIR/$tdir/$tfile-$i failed" )&
10019 set_nodes_failloc "$(osts_nodes)" 0
10022 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
10024 test_118l() # LU-646
10026 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10028 test_mkdir $DIR/$tdir
10029 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
10032 run_test 118l "fsync dir"
10034 test_118m() # LU-3066
10036 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10038 test_mkdir $DIR/$tdir
10039 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
10042 run_test 118m "fdatasync dir ========="
10044 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10051 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10052 remote_ost_nodsh && skip "remote OSTs with nodsh"
10054 # Sleep to avoid a cached response.
10055 #define OBD_STATFS_CACHE_SECONDS 1
10058 # Inject a 10 second delay in the OST_STATFS handler.
10059 #define OBD_FAIL_OST_STATFS_DELAY 0x242
10060 set_nodes_failloc "$(osts_nodes)" 0x242
10063 stat --file-system $MOUNT > /dev/null
10066 set_nodes_failloc "$(osts_nodes)" 0
10068 if ((end - begin > 20)); then
10069 error "statfs took $((end - begin)) seconds, expected 10"
10072 run_test 118n "statfs() sends OST_STATFS requests in parallel"
10074 test_119a() # bug 11737
10076 BSIZE=$((512 * 1024))
10077 directio write $DIR/$tfile 0 1 $BSIZE
10078 # We ask to read two blocks, which is more than a file size.
10079 # directio will indicate an error when requested and actual
10080 # sizes aren't equeal (a normal situation in this case) and
10081 # print actual read amount.
10082 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
10083 if [ "$NOB" != "$BSIZE" ]; then
10084 error "read $NOB bytes instead of $BSIZE"
10088 run_test 119a "Short directIO read must return actual read amount"
10090 test_119b() # bug 11737
10092 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10094 $SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed"
10095 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
10097 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
10098 error "direct read failed"
10101 run_test 119b "Sparse directIO read must return actual read amount"
10103 test_119c() # bug 13099
10106 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
10107 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
10110 run_test 119c "Testing for direct read hitting hole"
10112 test_119d() # bug 15950
10114 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10116 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
10117 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
10119 $SETSTRIPE $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
10120 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
10121 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
10122 lctl set_param fail_loc=0x40d
10123 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
10126 cat $DIR/$tfile > /dev/null &
10127 lctl set_param fail_loc=0
10130 log "the DIO writes have completed, now wait for the reads (should not block very long)"
10132 [ -n "`ps h -p $pid_reads -o comm`" ] && \
10133 error "the read rpcs have not completed in 2s"
10135 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
10137 run_test 119d "The DIO path should try to send a new rpc once one is completed"
10140 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10141 remote_mds_nodsh && skip "remote MDS with nodsh"
10142 test_mkdir $DIR/$tdir
10143 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10144 skip_env "no early lock cancel on server"
10146 lru_resize_disable mdc
10147 lru_resize_disable osc
10148 cancel_lru_locks mdc
10149 # asynchronous object destroy at MDT could cause bl ast to client
10150 cancel_lru_locks osc
10152 stat $DIR/$tdir > /dev/null
10153 can1=$(do_facet $SINGLEMDS \
10154 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10155 awk '/ldlm_cancel/ {print $2}')
10156 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10157 awk '/ldlm_bl_callback/ {print $2}')
10158 test_mkdir -c1 $DIR/$tdir/d1
10159 can2=$(do_facet $SINGLEMDS \
10160 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10161 awk '/ldlm_cancel/ {print $2}')
10162 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10163 awk '/ldlm_bl_callback/ {print $2}')
10164 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10165 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10166 lru_resize_enable mdc
10167 lru_resize_enable osc
10169 run_test 120a "Early Lock Cancel: mkdir test"
10172 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10173 remote_mds_nodsh && skip "remote MDS with nodsh"
10174 test_mkdir $DIR/$tdir
10175 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10176 skip_env "no early lock cancel on server"
10178 lru_resize_disable mdc
10179 lru_resize_disable osc
10180 cancel_lru_locks mdc
10181 stat $DIR/$tdir > /dev/null
10182 can1=$(do_facet $SINGLEMDS \
10183 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10184 awk '/ldlm_cancel/ {print $2}')
10185 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10186 awk '/ldlm_bl_callback/ {print $2}')
10187 touch $DIR/$tdir/f1
10188 can2=$(do_facet $SINGLEMDS \
10189 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10190 awk '/ldlm_cancel/ {print $2}')
10191 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10192 awk '/ldlm_bl_callback/ {print $2}')
10193 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10194 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10195 lru_resize_enable mdc
10196 lru_resize_enable osc
10198 run_test 120b "Early Lock Cancel: create test"
10201 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10202 remote_mds_nodsh && skip "remote MDS with nodsh"
10203 test_mkdir -c1 $DIR/$tdir
10204 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10205 skip "no early lock cancel on server"
10207 lru_resize_disable mdc
10208 lru_resize_disable osc
10209 test_mkdir -c1 $DIR/$tdir/d1
10210 test_mkdir -c1 $DIR/$tdir/d2
10211 touch $DIR/$tdir/d1/f1
10212 cancel_lru_locks mdc
10213 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
10214 can1=$(do_facet $SINGLEMDS \
10215 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10216 awk '/ldlm_cancel/ {print $2}')
10217 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10218 awk '/ldlm_bl_callback/ {print $2}')
10219 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10220 can2=$(do_facet $SINGLEMDS \
10221 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10222 awk '/ldlm_cancel/ {print $2}')
10223 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10224 awk '/ldlm_bl_callback/ {print $2}')
10225 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10226 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10227 lru_resize_enable mdc
10228 lru_resize_enable osc
10230 run_test 120c "Early Lock Cancel: link test"
10233 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10234 remote_mds_nodsh && skip "remote MDS with nodsh"
10235 test_mkdir -c1 $DIR/$tdir
10236 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10237 skip_env "no early lock cancel on server"
10239 lru_resize_disable mdc
10240 lru_resize_disable osc
10242 cancel_lru_locks mdc
10243 stat $DIR/$tdir > /dev/null
10244 can1=$(do_facet $SINGLEMDS \
10245 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10246 awk '/ldlm_cancel/ {print $2}')
10247 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10248 awk '/ldlm_bl_callback/ {print $2}')
10249 chmod a+x $DIR/$tdir
10250 can2=$(do_facet $SINGLEMDS \
10251 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10252 awk '/ldlm_cancel/ {print $2}')
10253 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10254 awk '/ldlm_bl_callback/ {print $2}')
10255 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10256 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10257 lru_resize_enable mdc
10258 lru_resize_enable osc
10260 run_test 120d "Early Lock Cancel: setattr test"
10263 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10264 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10265 skip_env "no early lock cancel on server"
10266 remote_mds_nodsh && skip "remote MDS with nodsh"
10268 local dlmtrace_set=false
10270 test_mkdir -c1 $DIR/$tdir
10271 lru_resize_disable mdc
10272 lru_resize_disable osc
10273 ! $LCTL get_param debug | grep -q dlmtrace &&
10274 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
10275 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
10276 cancel_lru_locks mdc
10277 cancel_lru_locks osc
10278 dd if=$DIR/$tdir/f1 of=/dev/null
10279 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
10280 # XXX client can not do early lock cancel of OST lock
10281 # during unlink (LU-4206), so cancel osc lock now.
10283 cancel_lru_locks osc
10284 can1=$(do_facet $SINGLEMDS \
10285 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10286 awk '/ldlm_cancel/ {print $2}')
10287 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10288 awk '/ldlm_bl_callback/ {print $2}')
10289 unlink $DIR/$tdir/f1
10291 can2=$(do_facet $SINGLEMDS \
10292 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10293 awk '/ldlm_cancel/ {print $2}')
10294 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10295 awk '/ldlm_bl_callback/ {print $2}')
10296 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10297 $LCTL dk $TMP/cancel.debug.txt
10298 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10299 $LCTL dk $TMP/blocking.debug.txt
10300 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10301 lru_resize_enable mdc
10302 lru_resize_enable osc
10304 run_test 120e "Early Lock Cancel: unlink test"
10307 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10308 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10309 skip_env "no early lock cancel on server"
10310 remote_mds_nodsh && skip "remote MDS with nodsh"
10312 test_mkdir -c1 $DIR/$tdir
10313 lru_resize_disable mdc
10314 lru_resize_disable osc
10315 test_mkdir -c1 $DIR/$tdir/d1
10316 test_mkdir -c1 $DIR/$tdir/d2
10317 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10318 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10319 cancel_lru_locks mdc
10320 cancel_lru_locks osc
10321 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10322 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10323 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10324 # XXX client can not do early lock cancel of OST lock
10325 # during rename (LU-4206), so cancel osc lock now.
10327 cancel_lru_locks osc
10328 can1=$(do_facet $SINGLEMDS \
10329 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10330 awk '/ldlm_cancel/ {print $2}')
10331 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10332 awk '/ldlm_bl_callback/ {print $2}')
10333 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10335 can2=$(do_facet $SINGLEMDS \
10336 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10337 awk '/ldlm_cancel/ {print $2}')
10338 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10339 awk '/ldlm_bl_callback/ {print $2}')
10340 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10341 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10342 lru_resize_enable mdc
10343 lru_resize_enable osc
10345 run_test 120f "Early Lock Cancel: rename test"
10348 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10349 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10350 skip_env "no early lock cancel on server"
10351 remote_mds_nodsh && skip "remote MDS with nodsh"
10353 lru_resize_disable mdc
10354 lru_resize_disable osc
10356 echo create $count files
10357 test_mkdir $DIR/$tdir
10358 cancel_lru_locks mdc
10359 cancel_lru_locks osc
10362 can0=$(do_facet $SINGLEMDS \
10363 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10364 awk '/ldlm_cancel/ {print $2}')
10365 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10366 awk '/ldlm_bl_callback/ {print $2}')
10367 createmany -o $DIR/$tdir/f $count
10369 can1=$(do_facet $SINGLEMDS \
10370 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10371 awk '/ldlm_cancel/ {print $2}')
10372 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10373 awk '/ldlm_bl_callback/ {print $2}')
10375 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10376 echo rm $count files
10379 can2=$(do_facet $SINGLEMDS \
10380 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10381 awk '/ldlm_cancel/ {print $2}')
10382 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10383 awk '/ldlm_bl_callback/ {print $2}')
10385 echo total: $count removes in $((t2-t1))
10386 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10388 # wait for commitment of removal
10389 lru_resize_enable mdc
10390 lru_resize_enable osc
10392 run_test 120g "Early Lock Cancel: performance test"
10394 test_121() { #bug #10589
10395 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10398 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10399 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10400 lctl set_param fail_loc=0x310
10401 cancel_lru_locks osc > /dev/null
10402 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10403 lctl set_param fail_loc=0
10404 [[ $reads -eq $writes ]] ||
10405 error "read $reads blocks, must be $writes blocks"
10407 run_test 121 "read cancel race ========="
10409 test_123a() { # was test 123, statahead(bug 11401)
10410 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10413 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10414 log "testing UP system. Performance may be lower than expected."
10419 test_mkdir $DIR/$tdir
10420 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10421 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10423 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10424 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10426 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10427 lctl set_param -n llite.*.statahead_max 0
10428 lctl get_param llite.*.statahead_max
10429 cancel_lru_locks mdc
10430 cancel_lru_locks osc
10432 time ls -l $DIR/$tdir | wc -l
10434 delta=$((etime - stime))
10435 log "ls $i files without statahead: $delta sec"
10436 lctl set_param llite.*.statahead_max=$max
10438 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10439 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
10440 cancel_lru_locks mdc
10441 cancel_lru_locks osc
10443 time ls -l $DIR/$tdir | wc -l
10445 delta_sa=$((etime - stime))
10446 log "ls $i files with statahead: $delta_sa sec"
10447 lctl get_param -n llite.*.statahead_stats
10448 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10450 [[ $swrong -lt $ewrong ]] &&
10451 log "statahead was stopped, maybe too many locks held!"
10452 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
10454 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10455 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10456 lctl set_param -n llite.*.statahead_max 0
10457 lctl get_param llite.*.statahead_max
10458 cancel_lru_locks mdc
10459 cancel_lru_locks osc
10461 time ls -l $DIR/$tdir | wc -l
10463 delta=$((etime - stime))
10464 log "ls $i files again without statahead: $delta sec"
10465 lctl set_param llite.*.statahead_max=$max
10466 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10467 if [ $SLOWOK -eq 0 ]; then
10468 error "ls $i files is slower with statahead!"
10470 log "ls $i files is slower with statahead!"
10476 [ $delta -gt 20 ] && break
10477 [ $delta -gt 8 ] && MULT=$((50 / delta))
10478 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
10486 delta=$((etime - stime))
10487 log "rm -r $DIR/$tdir/: $delta seconds"
10489 lctl get_param -n llite.*.statahead_stats
10491 run_test 123a "verify statahead work"
10493 test_123b () { # statahead(bug 15027)
10494 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10496 test_mkdir $DIR/$tdir
10497 createmany -o $DIR/$tdir/$tfile-%d 1000
10499 cancel_lru_locks mdc
10500 cancel_lru_locks osc
10502 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
10503 lctl set_param fail_loc=0x80000803
10504 ls -lR $DIR/$tdir > /dev/null
10506 lctl set_param fail_loc=0x0
10507 lctl get_param -n llite.*.statahead_stats
10512 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
10515 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
10517 test_mkdir -i 0 -c 1 $DIR/$tdir.0
10518 test_mkdir -i 1 -c 1 $DIR/$tdir.1
10519 touch $DIR/$tdir.1/{1..3}
10520 mv $DIR/$tdir.1/{1..3} $DIR/$tdir.0
10522 remount_client $MOUNT
10524 $MULTIOP $DIR/$tdir.0 Q
10526 # let statahead to complete
10527 ls -l $DIR/$tdir.0 > /dev/null
10529 testid=$(echo $TESTNAME | tr '_' ' ')
10530 dmesg | tac | sed "/$testid/,$ d" | grep "Can not initialize inode" &&
10531 error "statahead warning" || true
10533 run_test 123c "Can not initialize inode warning on DNE statahead"
10536 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10537 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10538 skip_env "no lru resize on server"
10542 test_mkdir $DIR/$tdir
10544 log "create $NR files at $DIR/$tdir"
10545 createmany -o $DIR/$tdir/f $NR ||
10546 error "failed to create $NR files in $DIR/$tdir"
10548 cancel_lru_locks mdc
10549 ls -l $DIR/$tdir > /dev/null
10553 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
10554 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
10555 LRU_SIZE=$($LCTL get_param -n $PARAM)
10556 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
10557 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
10559 log "NS=$(basename $NSDIR)"
10564 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
10565 skip "Not enough cached locks created!"
10567 log "LRU=$LRU_SIZE"
10571 # We know that lru resize allows one client to hold $LIMIT locks
10572 # for 10h. After that locks begin to be killed by client.
10574 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
10576 if [ $LIMIT -lt $LRU_SIZE ]; then
10577 skip "Limit is too small $LIMIT"
10580 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
10581 # killing locks. Some time was spent for creating locks. This means
10582 # that up to the moment of sleep finish we must have killed some of
10583 # them (10-100 locks). This depends on how fast ther were created.
10584 # Many of them were touched in almost the same moment and thus will
10585 # be killed in groups.
10586 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
10588 # Use $LRU_SIZE_B here to take into account real number of locks
10589 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
10590 local LRU_SIZE_B=$LRU_SIZE
10592 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
10593 log "OLD_LVF=$OLD_LVF"
10594 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
10596 # Let's make sure that we really have some margin. Client checks
10597 # cached locks every 10 sec.
10598 SLEEP=$((SLEEP+20))
10599 log "Sleep ${SLEEP} sec"
10601 while ((SEC<$SLEEP)); do
10605 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
10606 echo -n "$LRU_SIZE"
10609 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
10610 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
10612 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
10613 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
10614 unlinkmany $DIR/$tdir/f $NR
10618 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
10619 log "unlink $NR files at $DIR/$tdir"
10620 unlinkmany $DIR/$tdir/f $NR
10622 run_test 124a "lru resize ======================================="
10624 get_max_pool_limit()
10626 local limit=$($LCTL get_param \
10627 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
10629 for l in $limit; do
10630 if [[ $l -gt $max ]]; then
10638 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10639 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10640 skip_env "no lru resize on server"
10642 LIMIT=$(get_max_pool_limit)
10644 NR=$(($(default_lru_size)*20))
10645 if [[ $NR -gt $LIMIT ]]; then
10646 log "Limit lock number by $LIMIT locks"
10650 IFree=$(mdsrate_inodes_available)
10651 if [ $IFree -lt $NR ]; then
10652 log "Limit lock number by $IFree inodes"
10656 lru_resize_disable mdc
10657 test_mkdir -p $DIR/$tdir/disable_lru_resize
10659 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
10660 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
10661 cancel_lru_locks mdc
10664 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10667 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10670 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10674 nolruresize_delta=$((etime-stime))
10675 log "ls -la time: $nolruresize_delta seconds"
10676 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10677 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
10679 lru_resize_enable mdc
10680 test_mkdir -p $DIR/$tdir/enable_lru_resize
10682 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
10683 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
10684 cancel_lru_locks mdc
10687 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10690 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10693 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10697 lruresize_delta=$((etime-stime))
10698 log "ls -la time: $lruresize_delta seconds"
10699 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10701 if [ $lruresize_delta -gt $nolruresize_delta ]; then
10702 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
10703 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
10704 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
10706 log "lru resize performs the same with no lru resize"
10708 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
10710 run_test 124b "lru resize (performance test) ======================="
10713 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10714 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10715 skip_env "no lru resize on server"
10717 # cache ununsed locks on client
10719 cancel_lru_locks mdc
10720 test_mkdir $DIR/$tdir
10721 createmany -o $DIR/$tdir/f $nr ||
10722 error "failed to create $nr files in $DIR/$tdir"
10723 ls -l $DIR/$tdir > /dev/null
10725 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10726 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10727 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10728 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10729 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10731 # set lru_max_age to 1 sec
10732 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10733 echo "sleep $((recalc_p * 2)) seconds..."
10734 sleep $((recalc_p * 2))
10736 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10737 # restore lru_max_age
10738 $LCTL set_param -n $nsdir.lru_max_age $max_age
10739 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10740 unlinkmany $DIR/$tdir/f $nr
10742 run_test 124c "LRUR cancel very aged locks"
10745 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10746 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10747 skip_env "no lru resize on server"
10749 # cache ununsed locks on client
10752 lru_resize_disable mdc
10753 stack_trap "lru_resize_enable mdc" EXIT
10755 cancel_lru_locks mdc
10757 # asynchronous object destroy at MDT could cause bl ast to client
10758 test_mkdir $DIR/$tdir
10759 createmany -o $DIR/$tdir/f $nr ||
10760 error "failed to create $nr files in $DIR/$tdir"
10761 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
10763 ls -l $DIR/$tdir > /dev/null
10765 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10766 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10767 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10768 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10770 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10772 # set lru_max_age to 1 sec
10773 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10774 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
10776 echo "sleep $((recalc_p * 2)) seconds..."
10777 sleep $((recalc_p * 2))
10779 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10781 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10783 run_test 124d "cancel very aged locks if lru-resize diasbaled"
10785 test_125() { # 13358
10786 $LCTL get_param -n llite.*.client_type | grep -q local ||
10787 skip "must run as local client"
10788 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
10789 skip_env "must have acl enabled"
10790 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
10792 test_mkdir $DIR/$tdir
10793 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
10794 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
10795 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
10797 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
10799 test_126() { # bug 12829/13455
10800 $GSS && skip_env "must run as gss disabled"
10801 $LCTL get_param -n llite.*.client_type | grep -q local ||
10802 skip "must run as local client"
10803 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
10805 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
10806 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
10808 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
10810 run_test 126 "check that the fsgid provided by the client is taken into account"
10812 test_127a() { # bug 15521
10813 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10815 $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
10816 $LCTL set_param osc.*.stats=0
10817 FSIZE=$((2048 * 1024))
10818 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
10819 cancel_lru_locks osc
10820 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
10822 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
10823 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
10824 echo "got $COUNT $NAME"
10825 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
10826 eval $NAME=$COUNT || error "Wrong proc format"
10829 read_bytes|write_bytes)
10830 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
10831 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
10832 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
10833 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
10834 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
10835 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
10836 error "sumsquare is too small: $SUMSQ"
10837 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
10838 error "sumsquare is too big: $SUMSQ"
10842 done < $DIR/${tfile}.tmp
10844 #check that we actually got some stats
10845 [ "$read_bytes" ] || error "Missing read_bytes stats"
10846 [ "$write_bytes" ] || error "Missing write_bytes stats"
10847 [ "$read_bytes" != 0 ] || error "no read done"
10848 [ "$write_bytes" != 0 ] || error "no write done"
10850 run_test 127a "verify the client stats are sane"
10852 test_127b() { # bug LU-333
10853 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10854 local name count samp unit min max sum sumsq
10856 $LCTL set_param llite.*.stats=0
10858 # perform 2 reads and writes so MAX is different from SUM.
10859 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10860 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10861 cancel_lru_locks osc
10862 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10863 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10865 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
10866 while read name count samp unit min max sum sumsq; do
10867 echo "got $count $name"
10868 eval $name=$count || error "Wrong proc format"
10872 [ $count -ne 2 ] && error "count is not 2: $count"
10873 [ $min -ne $PAGE_SIZE ] &&
10874 error "min is not $PAGE_SIZE: $min"
10875 [ $max -ne $PAGE_SIZE ] &&
10876 error "max is incorrect: $max"
10877 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10878 error "sum is wrong: $sum"
10881 [ $count -ne 2 ] && error "count is not 2: $count"
10882 [ $min -ne $PAGE_SIZE ] &&
10883 error "min is not $PAGE_SIZE: $min"
10884 [ $max -ne $PAGE_SIZE ] &&
10885 error "max is incorrect: $max"
10886 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10887 error "sum is wrong: $sum"
10891 done < $TMP/$tfile.tmp
10893 #check that we actually got some stats
10894 [ "$read_bytes" ] || error "Missing read_bytes stats"
10895 [ "$write_bytes" ] || error "Missing write_bytes stats"
10896 [ "$read_bytes" != 0 ] || error "no read done"
10897 [ "$write_bytes" != 0 ] || error "no write done"
10899 rm -f $TMP/${tfile}.tmp
10901 run_test 127b "verify the llite client stats are sane"
10903 test_127c() { # LU-12394
10904 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
10911 $LCTL set_param llite.*.extents_stats=1
10912 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
10914 # Use two stripes so there is enough space in default config
10915 $LFS setstripe -c 2 $DIR/$tfile
10917 # Extent stats start at 0-4K and go in power of two buckets
10918 # LL_HIST_START = 12 --> 2^12 = 4K
10919 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
10920 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
10922 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
10924 # Write and read, 2x each, second time at a non-zero offset
10925 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
10926 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
10927 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
10928 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
10932 $LCTL get_param llite.*.extents_stats
10935 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
10937 local bucket=$($LCTL get_param -n llite.*.extents_stats |
10939 reads=$(echo $bucket | awk '{print $5}')
10940 writes=$(echo $bucket | awk '{print $9}')
10941 [ "$reads" -eq $count ] ||
10942 error "$reads reads in < $bsize bucket, expect $count"
10943 [ "$writes" -eq $count ] ||
10944 error "$writes writes in < $bsize bucket, expect $count"
10947 # Test mmap write and read
10948 $LCTL set_param llite.*.extents_stats=c
10950 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
10951 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
10952 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
10954 $LCTL get_param llite.*.extents_stats
10956 count=$(((size*1024) / PAGE_SIZE))
10958 bsize=$((2 * PAGE_SIZE / 1024))K
10960 bucket=$($LCTL get_param -n llite.*.extents_stats |
10962 reads=$(echo $bucket | awk '{print $5}')
10963 writes=$(echo $bucket | awk '{print $9}')
10964 # mmap writes fault in the page first, creating an additonal read
10965 [ "$reads" -eq $((2 * count)) ] ||
10966 error "$reads reads in < $bsize bucket, expect $count"
10967 [ "$writes" -eq $count ] ||
10968 error "$writes writes in < $bsize bucket, expect $count"
10970 run_test 127c "test llite extent stats with regular & mmap i/o"
10972 test_128() { # bug 15212
10974 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
10979 result=$(grep error $TMP/$tfile.log)
10980 rm -f $DIR/$tfile $TMP/$tfile.log
10981 [ -z "$result" ] ||
10982 error "consecutive find's under interactive lfs failed"
10984 run_test 128 "interactive lfs for 2 consecutive find's"
10986 set_dir_limits () {
10991 local ldproc=/proc/fs/ldiskfs
10992 local facets=$(get_facets MDS)
10994 for facet in ${facets//,/ }; do
10995 canondev=$(ldiskfs_canon \
10996 *.$(convert_facet2label $facet).mntdev $facet)
10997 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
10998 ldproc=/sys/fs/ldiskfs
10999 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
11000 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
11004 check_mds_dmesg() {
11005 local facets=$(get_facets MDS)
11006 for facet in ${facets//,/ }; do
11007 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
11013 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11014 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
11015 skip "Need MDS version with at least 2.5.56"
11016 if [ "$mds1_FSTYPE" != ldiskfs ]; then
11017 skip_env "ldiskfs only test"
11019 remote_mds_nodsh && skip "remote MDS with nodsh"
11023 local has_warning=false
11026 mkdir -p $DIR/$tdir
11028 # block size of mds1
11029 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
11030 set_dir_limits $maxsize $maxsize
11031 local dirsize=$(stat -c%s "$DIR/$tdir")
11033 while [[ $dirsize -le $maxsize ]]; do
11034 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
11036 if ! $has_warning; then
11037 check_mds_dmesg '"is approaching"' && has_warning=true
11039 # check two errors:
11040 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
11041 # EFBIG for previous versions included in ldiskfs series
11042 if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
11044 echo "return code $rc received as expected"
11046 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
11047 error_exit "create failed w/o dir size limit"
11049 check_mds_dmesg '"has reached"' ||
11050 error_exit "reached message should be output"
11052 [ $has_warning = "false" ] &&
11053 error_exit "warning message should be output"
11055 dirsize=$(stat -c%s "$DIR/$tdir")
11057 [[ $dirsize -ge $maxsize ]] && return 0
11058 error_exit "current dir size $dirsize, " \
11059 "previous limit $maxsize"
11060 elif [ $rc -ne 0 ]; then
11062 error_exit "return $rc received instead of expected " \
11063 "$EFBIG or $ENOSPC, files in dir $dirsize"
11065 nfiles=$((nfiles + 1))
11066 dirsize=$(stat -c%s "$DIR/$tdir")
11070 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
11072 run_test 129 "test directory size limit ========================"
11081 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11082 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11084 trap cleanup_130 EXIT RETURN
11086 local fm_file=$DIR/$tfile
11087 $SETSTRIPE -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
11088 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
11089 error "dd failed for $fm_file"
11091 # LU-1795: test filefrag/FIEMAP once, even if unsupported
11092 filefrag -ves $fm_file
11094 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11095 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11096 [ $RC != 0 ] && error "filefrag $fm_file failed"
11098 filefrag_op=$(filefrag -ve -k $fm_file |
11099 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11100 lun=$($GETSTRIPE -i $fm_file)
11102 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
11105 for line in $filefrag_op
11107 frag_lun=`echo $line | cut -d: -f5`
11108 ext_len=`echo $line | cut -d: -f4`
11109 if (( $frag_lun != $lun )); then
11111 error "FIEMAP on 1-stripe file($fm_file) failed"
11114 (( tot_len += ext_len ))
11117 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
11119 error "FIEMAP on 1-stripe file($fm_file) failed;"
11125 echo "FIEMAP on single striped file succeeded"
11127 run_test 130a "FIEMAP (1-stripe file)"
11130 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11132 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11133 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11135 trap cleanup_130 EXIT RETURN
11137 local fm_file=$DIR/$tfile
11138 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11139 error "setstripe on $fm_file"
11140 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11141 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11143 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
11144 error "dd failed on $fm_file"
11146 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11147 filefrag_op=$(filefrag -ve -k $fm_file |
11148 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11150 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11151 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11156 for line in $filefrag_op
11158 frag_lun=$(echo $line | cut -d: -f5 |
11159 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11160 ext_len=$(echo $line | cut -d: -f4)
11161 if (( $frag_lun != $last_lun )); then
11162 if (( tot_len != 1024 )); then
11164 error "FIEMAP on $fm_file failed; returned " \
11165 "len $tot_len for OST $last_lun instead of 1024"
11168 (( num_luns += 1 ))
11172 (( tot_len += ext_len ))
11175 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
11177 error "FIEMAP on $fm_file failed; returned wrong number of " \
11178 "luns or wrong len for OST $last_lun"
11184 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
11186 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
11189 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11191 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11192 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11194 trap cleanup_130 EXIT RETURN
11196 local fm_file=$DIR/$tfile
11197 $SETSTRIPE -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
11198 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11199 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11201 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
11202 error "dd failed on $fm_file"
11204 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11205 filefrag_op=$(filefrag -ve -k $fm_file |
11206 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11208 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11209 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11214 for line in $filefrag_op
11216 frag_lun=$(echo $line | cut -d: -f5 |
11217 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11218 ext_len=$(echo $line | cut -d: -f4)
11219 if (( $frag_lun != $last_lun )); then
11220 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
11221 if (( logical != 512 )); then
11223 error "FIEMAP on $fm_file failed; returned " \
11224 "logical start for lun $logical instead of 512"
11227 if (( tot_len != 512 )); then
11229 error "FIEMAP on $fm_file failed; returned " \
11230 "len $tot_len for OST $last_lun instead of 1024"
11233 (( num_luns += 1 ))
11237 (( tot_len += ext_len ))
11240 if (( num_luns != 2 || tot_len != 512 )); then
11242 error "FIEMAP on $fm_file failed; returned wrong number of " \
11243 "luns or wrong len for OST $last_lun"
11249 echo "FIEMAP on 2-stripe file with hole succeeded"
11251 run_test 130c "FIEMAP (2-stripe file with hole)"
11254 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
11256 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11257 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11259 trap cleanup_130 EXIT RETURN
11261 local fm_file=$DIR/$tfile
11262 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11263 error "setstripe on $fm_file"
11264 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11265 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11267 local actual_stripe_count=$($GETSTRIPE -c $fm_file)
11268 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
11269 error "dd failed on $fm_file"
11271 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11272 filefrag_op=$(filefrag -ve -k $fm_file |
11273 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11275 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11276 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11281 for line in $filefrag_op
11283 frag_lun=$(echo $line | cut -d: -f5 |
11284 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11285 ext_len=$(echo $line | cut -d: -f4)
11286 if (( $frag_lun != $last_lun )); then
11287 if (( tot_len != 1024 )); then
11289 error "FIEMAP on $fm_file failed; returned " \
11290 "len $tot_len for OST $last_lun instead of 1024"
11293 (( num_luns += 1 ))
11297 (( tot_len += ext_len ))
11300 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
11302 error "FIEMAP on $fm_file failed; returned wrong number of " \
11303 "luns or wrong len for OST $last_lun"
11309 echo "FIEMAP on N-stripe file succeeded"
11311 run_test 130d "FIEMAP (N-stripe file)"
11314 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11316 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11317 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11319 trap cleanup_130 EXIT RETURN
11321 local fm_file=$DIR/$tfile
11322 $SETSTRIPE -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11323 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11324 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11327 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11328 for ((i = 0; i < $NUM_BLKS; i++))
11330 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11333 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11334 filefrag_op=$(filefrag -ve -k $fm_file |
11335 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11337 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11338 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11343 for line in $filefrag_op
11345 frag_lun=$(echo $line | cut -d: -f5 |
11346 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11347 ext_len=$(echo $line | cut -d: -f4)
11348 if (( $frag_lun != $last_lun )); then
11349 if (( tot_len != $EXPECTED_LEN )); then
11351 error "FIEMAP on $fm_file failed; returned " \
11352 "len $tot_len for OST $last_lun instead " \
11356 (( num_luns += 1 ))
11360 (( tot_len += ext_len ))
11363 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11365 error "FIEMAP on $fm_file failed; returned wrong number " \
11366 "of luns or wrong len for OST $last_lun"
11372 echo "FIEMAP with continuation calls succeeded"
11374 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11377 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11378 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11380 local fm_file=$DIR/$tfile
11381 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11382 error "multiop create with lov_delay_create on $fm_file"
11384 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11385 filefrag_extents=$(filefrag -vek $fm_file |
11386 awk '/extents? found/ { print $2 }')
11387 if [[ "$filefrag_extents" != "0" ]]; then
11388 error "FIEMAP on $fm_file failed; " \
11389 "returned $filefrag_extents expected 0"
11394 run_test 130f "FIEMAP (unstriped file)"
11396 # Test for writev/readv
11398 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11399 error "writev test failed"
11400 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11401 error "readv failed"
11404 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11407 local fsize=$((524288 + 1048576 + 1572864))
11408 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11409 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11410 error "append writev test failed"
11412 ((fsize += 1572864 + 1048576))
11413 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11414 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11415 error "append writev test failed"
11418 run_test 131b "test append writev"
11421 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11424 run_test 131c "test read/write on file w/o objects"
11427 rwv -f $DIR/$tfile -w -n 1 1572864
11428 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11429 if [ "$NOB" != 1572864 ]; then
11430 error "Short read filed: read $NOB bytes instead of 1572864"
11434 run_test 131d "test short read"
11437 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11438 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11439 error "read hitting hole failed"
11442 run_test 131e "test read hitting hole"
11451 mds*) res=$(do_facet $facet \
11452 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11454 ost*) res=$(do_facet $facet \
11455 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
11457 *) error "Wrong facet '$facet'" ;;
11459 [ "$res" ] || error "The counter for $op on $facet was not incremented"
11460 # if the argument $3 is zero, it means any stat increment is ok.
11461 if [[ $want -gt 0 ]]; then
11462 local count=$(echo $res | awk '{ print $2 }')
11463 [[ $count -ne $want ]] &&
11464 error "The $op counter on $facet is $count, not $want"
11469 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11470 remote_ost_nodsh && skip "remote OST with nodsh"
11471 remote_mds_nodsh && skip "remote MDS with nodsh"
11472 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11473 skip_env "MDS doesn't support rename stats"
11475 local testdir=$DIR/${tdir}/stats_testdir
11477 mkdir -p $DIR/${tdir}
11480 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11481 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11483 # verify mdt stats first.
11484 mkdir ${testdir} || error "mkdir failed"
11485 check_stats $SINGLEMDS "mkdir" 1
11486 touch ${testdir}/${tfile} || error "touch failed"
11487 check_stats $SINGLEMDS "open" 1
11488 check_stats $SINGLEMDS "close" 1
11489 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
11490 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
11491 check_stats $SINGLEMDS "mknod" 2
11493 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
11494 check_stats $SINGLEMDS "unlink" 1
11495 rm -f ${testdir}/${tfile} || error "file remove failed"
11496 check_stats $SINGLEMDS "unlink" 2
11498 # remove working dir and check mdt stats again.
11499 rmdir ${testdir} || error "rmdir failed"
11500 check_stats $SINGLEMDS "rmdir" 1
11502 local testdir1=$DIR/${tdir}/stats_testdir1
11503 mkdir -p ${testdir}
11504 mkdir -p ${testdir1}
11505 touch ${testdir1}/test1
11506 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
11507 check_stats $SINGLEMDS "crossdir_rename" 1
11509 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
11510 check_stats $SINGLEMDS "samedir_rename" 1
11512 rm -rf $DIR/${tdir}
11514 run_test 133a "Verifying MDT stats ========================================"
11519 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11520 remote_ost_nodsh && skip "remote OST with nodsh"
11521 remote_mds_nodsh && skip "remote MDS with nodsh"
11523 local testdir=$DIR/${tdir}/stats_testdir
11525 mkdir -p ${testdir} || error "mkdir failed"
11526 touch ${testdir}/${tfile} || error "touch failed"
11527 cancel_lru_locks mdc
11530 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11531 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11533 # extra mdt stats verification.
11534 chmod 444 ${testdir}/${tfile} || error "chmod failed"
11535 check_stats $SINGLEMDS "setattr" 1
11536 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11537 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
11539 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
11540 check_stats $SINGLEMDS "getattr" 1
11542 rm -rf $DIR/${tdir}
11544 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
11545 # so the check below is not reliable
11546 [ $MDSCOUNT -eq 1 ] || return 0
11548 # Sleep to avoid a cached response.
11549 #define OBD_STATFS_CACHE_SECONDS 1
11551 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11552 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11553 $LFS df || error "lfs failed"
11554 check_stats $SINGLEMDS "statfs" 1
11556 # check aggregated statfs (LU-10018)
11557 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
11559 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
11562 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11563 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11565 check_stats $SINGLEMDS "statfs" 1
11567 # We want to check that the client didn't send OST_STATFS to
11568 # ost1 but the MDT also uses OST_STATFS for precreate. So some
11569 # extra care is needed here.
11570 if remote_mds; then
11571 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
11572 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
11574 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
11575 [ "$res" ] && error "OST got STATFS"
11580 run_test 133b "Verifying extra MDT stats =================================="
11583 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11584 remote_ost_nodsh && skip "remote OST with nodsh"
11585 remote_mds_nodsh && skip "remote MDS with nodsh"
11587 local testdir=$DIR/$tdir/stats_testdir
11589 test_mkdir -p $testdir
11591 # verify obdfilter stats.
11592 $SETSTRIPE -c 1 -i 0 $testdir/$tfile
11594 cancel_lru_locks osc
11595 wait_delete_completed
11598 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11599 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11601 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
11604 cancel_lru_locks osc
11605 check_stats ost1 "write" 1
11607 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
11608 check_stats ost1 "read" 1
11610 > $testdir/$tfile || error "truncate failed"
11611 check_stats ost1 "punch" 1
11613 rm -f $testdir/$tfile || error "file remove failed"
11614 wait_delete_completed
11615 check_stats ost1 "destroy" 1
11619 run_test 133c "Verifying OST stats ========================================"
11626 while [ $value -ge 2 ]; do
11631 if [ $orig -gt $order ]; then
11639 local size=('K' 'M' 'G' 'T');
11641 local size_string=$value
11643 while [ $value -ge 1024 ]; do
11644 if [ $i -gt 3 ]; then
11645 #T is the biggest unit we get here, if that is bigger,
11647 size_string=${value}T
11650 value=$((value >> 10))
11651 if [ $value -lt 1024 ]; then
11652 size_string=${value}${size[$i]}
11661 get_rename_size() {
11663 local context=${2:-.}
11664 local sample=$(do_facet $SINGLEMDS $LCTL \
11665 get_param mdt.$FSNAME-MDT0000.rename_stats |
11666 grep -A1 $context |
11667 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
11672 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11673 remote_ost_nodsh && skip "remote OST with nodsh"
11674 remote_mds_nodsh && skip "remote MDS with nodsh"
11675 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11676 skip_env "MDS doesn't support rename stats"
11678 local testdir1=$DIR/${tdir}/stats_testdir1
11679 local testdir2=$DIR/${tdir}/stats_testdir2
11680 mkdir -p $DIR/${tdir}
11682 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11684 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
11685 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
11687 createmany -o $testdir1/test 512 || error "createmany failed"
11689 # check samedir rename size
11690 mv ${testdir1}/test0 ${testdir1}/test_0
11692 local testdir1_size=$(ls -l $DIR/${tdir} |
11693 awk '/stats_testdir1/ {print $5}')
11694 local testdir2_size=$(ls -l $DIR/${tdir} |
11695 awk '/stats_testdir2/ {print $5}')
11697 testdir1_size=$(order_2 $testdir1_size)
11698 testdir2_size=$(order_2 $testdir2_size)
11700 testdir1_size=$(size_in_KMGT $testdir1_size)
11701 testdir2_size=$(size_in_KMGT $testdir2_size)
11703 echo "source rename dir size: ${testdir1_size}"
11704 echo "target rename dir size: ${testdir2_size}"
11706 local cmd="do_facet $SINGLEMDS $LCTL "
11707 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
11709 eval $cmd || error "$cmd failed"
11710 local samedir=$($cmd | grep 'same_dir')
11711 local same_sample=$(get_rename_size $testdir1_size)
11712 [ -z "$samedir" ] && error "samedir_rename_size count error"
11713 [[ $same_sample -eq 1 ]] ||
11714 error "samedir_rename_size error $same_sample"
11715 echo "Check same dir rename stats success"
11717 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11719 # check crossdir rename size
11720 mv ${testdir1}/test_0 ${testdir2}/test_0
11722 testdir1_size=$(ls -l $DIR/${tdir} |
11723 awk '/stats_testdir1/ {print $5}')
11724 testdir2_size=$(ls -l $DIR/${tdir} |
11725 awk '/stats_testdir2/ {print $5}')
11727 testdir1_size=$(order_2 $testdir1_size)
11728 testdir2_size=$(order_2 $testdir2_size)
11730 testdir1_size=$(size_in_KMGT $testdir1_size)
11731 testdir2_size=$(size_in_KMGT $testdir2_size)
11733 echo "source rename dir size: ${testdir1_size}"
11734 echo "target rename dir size: ${testdir2_size}"
11736 eval $cmd || error "$cmd failed"
11737 local crossdir=$($cmd | grep 'crossdir')
11738 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
11739 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
11740 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
11741 [[ $src_sample -eq 1 ]] ||
11742 error "crossdir_rename_size error $src_sample"
11743 [[ $tgt_sample -eq 1 ]] ||
11744 error "crossdir_rename_size error $tgt_sample"
11745 echo "Check cross dir rename stats success"
11746 rm -rf $DIR/${tdir}
11748 run_test 133d "Verifying rename_stats ========================================"
11751 remote_mds_nodsh && skip "remote MDS with nodsh"
11752 remote_ost_nodsh && skip "remote OST with nodsh"
11753 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11755 local testdir=$DIR/${tdir}/stats_testdir
11756 local ctr f0 f1 bs=32768 count=42 sum
11758 mkdir -p ${testdir} || error "mkdir failed"
11760 $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
11762 for ctr in {write,read}_bytes; do
11764 cancel_lru_locks osc
11766 do_facet ost1 $LCTL set_param -n \
11767 "obdfilter.*.exports.clear=clear"
11769 if [ $ctr = write_bytes ]; then
11771 f1=${testdir}/${tfile}
11773 f0=${testdir}/${tfile}
11777 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
11780 cancel_lru_locks osc
11782 sum=$(do_facet ost1 $LCTL get_param \
11783 "obdfilter.*.exports.*.stats" |
11784 awk -v ctr=$ctr 'BEGIN { sum = 0 }
11785 $1 == ctr { sum += $7 }
11786 END { printf("%0.0f", sum) }')
11788 if ((sum != bs * count)); then
11789 error "Bad $ctr sum, expected $((bs * count)), got $sum"
11793 rm -rf $DIR/${tdir}
11795 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
11797 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
11799 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
11800 # not honor the -ignore_readdir_race option correctly. So we call
11801 # error_ignore() rather than error() in these cases. See LU-11152.
11803 if (find --version; do_facet mds1 find --version) |
11804 grep -q '\b4\.5\.1[1-4]\b'; then
11805 error_ignore LU-11152 "$@"
11812 # First without trusting modes.
11813 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
11814 echo "proc_dirs='$proc_dirs'"
11815 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
11816 find $proc_dirs -exec cat '{}' \; &> /dev/null
11818 # Second verifying readability.
11819 $LCTL get_param -R '*' &> /dev/null
11821 # Verifing writability with badarea_io.
11823 -ignore_readdir_race \
11825 -not -name force_lbug \
11826 -not -name changelog_mask \
11827 -exec badarea_io '{}' \; ||
11828 error_133 "find $proc_dirs failed"
11830 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
11833 remote_mds_nodsh && skip "remote MDS with nodsh"
11834 remote_ost_nodsh && skip "remote OST with nodsh"
11836 # eventually, this can also be replaced with "lctl get_param -R",
11837 # but not until that option is always available on the server
11839 for facet in mds1 ost1; do
11840 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
11841 skip_noexit "Too old lustre on $facet"
11842 local facet_proc_dirs=$(do_facet $facet \
11843 \\\ls -d $proc_regexp 2>/dev/null)
11844 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11845 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11846 do_facet $facet find $facet_proc_dirs \
11847 ! -name req_history \
11848 -exec cat '{}' \\\; &> /dev/null
11850 do_facet $facet find $facet_proc_dirs \
11851 ! -name req_history \
11853 -exec cat '{}' \\\; &> /dev/null ||
11854 error "proc file read failed"
11856 do_facet $facet find $facet_proc_dirs \
11857 -ignore_readdir_race \
11859 -not -name force_lbug \
11860 -not -name changelog_mask \
11861 -exec badarea_io '{}' \\\; ||
11862 error_133 "$facet find $facet_proc_dirs failed"
11865 # remount the FS in case writes/reads /proc break the FS
11866 cleanup || error "failed to unmount"
11867 setup || error "failed to setup"
11870 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
11873 remote_mds_nodsh && skip "remote MDS with nodsh"
11874 remote_ost_nodsh && skip "remote OST with nodsh"
11875 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
11876 skip "Need MDS version at least 2.9.54"
11880 for facet in client mds1 ost1; do
11881 local facet_proc_dirs=$(do_facet $facet \
11882 \\\ls -d $proc_regexp 2> /dev/null)
11883 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11884 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11885 # Get the list of files that are missing the terminating newline
11886 local missing=($(do_facet $facet \
11887 find ${facet_proc_dirs} -type f \| \
11888 while read F\; do \
11889 awk -v FS='\v' -v RS='\v\v' \
11890 "'END { if(NR>0 && \
11891 \\\$NF !~ /.*\\\n\$/) \
11892 print FILENAME}'" \
11895 [ ${#missing[*]} -eq 0 ] ||
11896 error "files do not end with newline: ${missing[*]}"
11899 run_test 133h "Proc files should end with newlines"
11902 remote_mds_nodsh && skip "remote MDS with nodsh"
11903 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11904 skip "Need MDS version at least 2.7.54"
11906 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11907 cancel_lru_locks mdc
11909 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
11910 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11911 [ $unused -eq 0 ] || error "$unused locks are not cleared"
11914 createmany -o $DIR/$tdir/f $nr ||
11915 error "failed to create $nr files in $DIR/$tdir"
11916 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11918 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
11919 do_facet mds1 $LCTL set_param fail_loc=0x327
11920 do_facet mds1 $LCTL set_param fail_val=500
11923 echo "sleep 10 seconds ..."
11925 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
11927 do_facet mds1 $LCTL set_param fail_loc=0
11928 do_facet mds1 $LCTL set_param fail_val=0
11929 [ $lck_cnt -lt $unused ] ||
11930 error "No locks reclaimed, before:$unused, after:$lck_cnt"
11933 unlinkmany $DIR/$tdir/f $nr
11935 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
11938 remote_mds_nodsh && skip "remote MDS with nodsh"
11939 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11940 skip "Need MDS version at least 2.7.54"
11942 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11943 cancel_lru_locks mdc
11945 local low_wm=$(do_facet mds1 $LCTL get_param -n \
11946 ldlm.lock_reclaim_threshold_mb)
11947 # disable reclaim temporarily
11948 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
11950 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
11951 do_facet mds1 $LCTL set_param fail_loc=0x328
11952 do_facet mds1 $LCTL set_param fail_val=500
11954 $LCTL set_param debug=+trace
11957 createmany -o $DIR/$tdir/f $nr &
11958 local create_pid=$!
11960 echo "Sleep $TIMEOUT seconds ..."
11962 if ! ps -p $create_pid > /dev/null 2>&1; then
11963 do_facet mds1 $LCTL set_param fail_loc=0
11964 do_facet mds1 $LCTL set_param fail_val=0
11965 do_facet mds1 $LCTL set_param \
11966 ldlm.lock_reclaim_threshold_mb=${low_wm}m
11967 error "createmany finished incorrectly!"
11969 do_facet mds1 $LCTL set_param fail_loc=0
11970 do_facet mds1 $LCTL set_param fail_val=0
11971 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
11972 wait $create_pid || return 1
11974 unlinkmany $DIR/$tdir/f $nr
11976 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
11978 test_140() { #bug-17379
11979 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11981 test_mkdir $DIR/$tdir
11982 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
11983 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
11985 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
11986 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
11988 while i=$((i + 1)); do
11990 cd $i || error "Changing to $i"
11991 ln -s ../stat stat || error "Creating stat symlink"
11992 # Read the symlink until ELOOP present,
11993 # not LBUGing the system is considered success,
11994 # we didn't overrun the stack.
11995 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
11996 if [ $ret -ne 0 ]; then
11997 if [ $ret -eq 40 ]; then
12000 error "Open stat symlink"
12006 echo "The symlink depth = $i"
12007 [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] ||
12008 error "Invalid symlink depth"
12010 # Test recursive symlink
12011 ln -s symlink_self symlink_self
12012 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
12013 echo "open symlink_self returns $ret"
12014 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
12016 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
12019 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12021 local TF="$TMP/$tfile"
12023 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12025 cancel_lru_locks $OSC
12026 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
12027 remount_client $MOUNT
12029 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
12032 $TRUNCATE $DIR/$tfile 6000
12033 cancel_lru_locks $OSC
12034 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
12037 echo "12345" >>$DIR/$tfile
12038 cancel_lru_locks $OSC
12039 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
12042 echo "12345" >>$DIR/$tfile
12043 cancel_lru_locks $OSC
12044 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
12049 run_test 150 "truncate/append tests"
12051 #LU-2902 roc_hit was not able to read all values from lproc
12052 function roc_hit_init() {
12053 local list=$(comma_list $(osts_nodes))
12054 local dir=$DIR/$tdir-check
12055 local file=$dir/$tfile
12061 #use setstripe to do a write to every ost
12062 for i in $(seq 0 $((OSTCOUNT-1))); do
12063 $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
12064 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
12065 idx=$(printf %04x $i)
12066 BEFORE=$(get_osd_param $list *OST*$idx stats |
12067 awk '$1 == "cache_access" {sum += $7}
12068 END { printf("%0.0f", sum) }')
12070 cancel_lru_locks osc
12071 cat $file >/dev/null
12073 AFTER=$(get_osd_param $list *OST*$idx stats |
12074 awk '$1 == "cache_access" {sum += $7}
12075 END { printf("%0.0f", sum) }')
12077 echo BEFORE:$BEFORE AFTER:$AFTER
12078 if ! let "AFTER - BEFORE == 4"; then
12080 error "roc_hit is not safe to use"
12088 function roc_hit() {
12089 local list=$(comma_list $(osts_nodes))
12090 echo $(get_osd_param $list '' stats |
12091 awk '$1 == "cache_hit" {sum += $7}
12092 END { printf("%0.0f", sum) }')
12095 function set_cache() {
12098 if [ "$2" == "off" ]; then
12101 local list=$(comma_list $(osts_nodes))
12102 set_osd_param $list '' $1_cache_enable $on
12104 cancel_lru_locks osc
12108 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12109 remote_ost_nodsh && skip "remote OST with nodsh"
12112 local list=$(comma_list $(osts_nodes))
12114 # check whether obdfilter is cache capable at all
12115 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
12116 skip "not cache-capable obdfilter"
12119 # check cache is enabled on all obdfilters
12120 if get_osd_param $list '' read_cache_enable | grep 0; then
12121 skip "oss cache is disabled"
12124 set_osd_param $list '' writethrough_cache_enable 1
12126 # check write cache is enabled on all obdfilters
12127 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
12128 skip "oss write cache is NOT enabled"
12133 #define OBD_FAIL_OBD_NO_LRU 0x609
12134 do_nodes $list $LCTL set_param fail_loc=0x609
12136 # pages should be in the case right after write
12137 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
12140 local BEFORE=$(roc_hit)
12141 cancel_lru_locks osc
12142 cat $DIR/$tfile >/dev/null
12143 local AFTER=$(roc_hit)
12145 do_nodes $list $LCTL set_param fail_loc=0
12147 if ! let "AFTER - BEFORE == CPAGES"; then
12148 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12151 # the following read invalidates the cache
12152 cancel_lru_locks osc
12153 set_osd_param $list '' read_cache_enable 0
12154 cat $DIR/$tfile >/dev/null
12156 # now data shouldn't be found in the cache
12158 cancel_lru_locks osc
12159 cat $DIR/$tfile >/dev/null
12161 if let "AFTER - BEFORE != 0"; then
12162 error "IN CACHE: before: $BEFORE, after: $AFTER"
12165 set_osd_param $list '' read_cache_enable 1
12168 run_test 151 "test cache on oss and controls ==============================="
12171 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12173 local TF="$TMP/$tfile"
12175 # simulate ENOMEM during write
12176 #define OBD_FAIL_OST_NOMEM 0x226
12177 lctl set_param fail_loc=0x80000226
12178 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12180 sync || error "sync failed"
12181 lctl set_param fail_loc=0
12183 # discard client's cache
12184 cancel_lru_locks osc
12186 # simulate ENOMEM during read
12187 lctl set_param fail_loc=0x80000226
12188 cmp $TF $DIR/$tfile || error "cmp failed"
12189 lctl set_param fail_loc=0
12193 run_test 152 "test read/write with enomem ============================"
12196 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
12198 run_test 153 "test if fdatasync does not crash ======================="
12200 dot_lustre_fid_permission_check() {
12202 local ffid=$MOUNT/.lustre/fid/$fid
12205 echo "stat fid $fid"
12206 stat $ffid > /dev/null || error "stat $ffid failed."
12207 echo "touch fid $fid"
12208 touch $ffid || error "touch $ffid failed."
12209 echo "write to fid $fid"
12210 cat /etc/hosts > $ffid || error "write $ffid failed."
12211 echo "read fid $fid"
12212 diff /etc/hosts $ffid || error "read $ffid failed."
12213 echo "append write to fid $fid"
12214 cat /etc/hosts >> $ffid || error "append write $ffid failed."
12215 echo "rename fid $fid"
12216 mv $ffid $test_dir/$tfile.1 &&
12217 error "rename $ffid to $tfile.1 should fail."
12218 touch $test_dir/$tfile.1
12219 mv $test_dir/$tfile.1 $ffid &&
12220 error "rename $tfile.1 to $ffid should fail."
12221 rm -f $test_dir/$tfile.1
12222 echo "truncate fid $fid"
12223 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
12224 echo "link fid $fid"
12225 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
12226 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
12227 echo "setfacl fid $fid"
12228 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
12229 echo "getfacl fid $fid"
12230 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
12232 echo "unlink fid $fid"
12233 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
12234 echo "mknod fid $fid"
12235 mknod $ffid c 1 3 && error "mknod $ffid should fail."
12237 fid=[0xf00000400:0x1:0x0]
12238 ffid=$MOUNT/.lustre/fid/$fid
12240 echo "stat non-exist fid $fid"
12241 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
12242 echo "write to non-exist fid $fid"
12243 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
12244 echo "link new fid $fid"
12245 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
12247 mkdir -p $test_dir/$tdir
12248 touch $test_dir/$tdir/$tfile
12249 fid=$($LFS path2fid $test_dir/$tdir)
12252 error "error: could not get fid for $test_dir/$dir/$tfile."
12254 ffid=$MOUNT/.lustre/fid/$fid
12257 ls $ffid > /dev/null || error "ls $ffid failed."
12258 echo "touch $fid/$tfile.1"
12259 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
12261 echo "touch $MOUNT/.lustre/fid/$tfile"
12262 touch $MOUNT/.lustre/fid/$tfile && \
12263 error "touch $MOUNT/.lustre/fid/$tfile should fail."
12265 echo "setxattr to $MOUNT/.lustre/fid"
12266 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
12268 echo "listxattr for $MOUNT/.lustre/fid"
12269 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
12271 echo "delxattr from $MOUNT/.lustre/fid"
12272 setfattr -x trusted.name1 $MOUNT/.lustre/fid
12274 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
12275 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
12276 error "touch invalid fid should fail."
12278 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
12279 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
12280 error "touch non-normal fid should fail."
12282 echo "rename $tdir to $MOUNT/.lustre/fid"
12283 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
12284 error "rename to $MOUNT/.lustre/fid should fail."
12286 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
12288 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
12289 local new_obf_mode=777
12291 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
12292 chmod $new_obf_mode $DIR/.lustre/fid ||
12293 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
12295 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
12296 [ $obf_mode -eq $new_obf_mode ] ||
12297 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
12299 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
12300 chmod $old_obf_mode $DIR/.lustre/fid ||
12301 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
12304 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
12305 fid=$($LFS path2fid $test_dir/$tfile-2)
12307 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
12309 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
12310 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
12311 error "create lov data thru .lustre failed"
12313 echo "cp /etc/passwd $test_dir/$tfile-2"
12314 cp /etc/passwd $test_dir/$tfile-2 ||
12315 error "copy to $test_dir/$tfile-2 failed."
12316 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
12317 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12318 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12320 rm -rf $test_dir/tfile.lnk
12321 rm -rf $test_dir/$tfile-2
12325 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12326 skip "Need MDS version at least 2.4.1"
12328 local tf=$DIR/$tfile
12331 local fid=$($LFS path2fid $tf)
12332 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12334 # check that we get the same pathname back
12335 local found=$($LFS fid2path $MOUNT "$fid")
12336 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12337 [ "$found" == "$tf" ] ||
12338 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12340 run_test 154A "lfs path2fid and fid2path basic checks"
12343 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12344 skip "Need MDS version at least 2.4.1"
12346 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12347 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12348 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12349 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12351 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12352 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12354 # check that we get the same pathname
12355 echo "PFID: $PFID, name: $name"
12356 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12357 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12358 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12359 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12361 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12363 run_test 154B "verify the ll_decode_linkea tool"
12366 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12367 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12368 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12369 skip "Need MDS version at least 2.2.51"
12370 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12372 cp /etc/hosts $DIR/$tfile
12374 fid=$($LFS path2fid $DIR/$tfile)
12376 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12378 dot_lustre_fid_permission_check "$fid" $DIR ||
12379 error "dot lustre permission check $fid failed"
12381 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12383 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12385 touch $MOUNT/.lustre/file &&
12386 error "creation is not allowed under .lustre"
12388 mkdir $MOUNT/.lustre/dir &&
12389 error "mkdir is not allowed under .lustre"
12393 run_test 154a "Open-by-FID"
12396 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12397 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12398 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12399 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12400 skip "Need MDS version at least 2.2.51"
12402 local remote_dir=$DIR/$tdir/remote_dir
12406 mkdir -p $DIR/$tdir
12407 $LFS mkdir -i $MDTIDX $remote_dir ||
12408 error "create remote directory failed"
12410 cp /etc/hosts $remote_dir/$tfile
12412 fid=$($LFS path2fid $remote_dir/$tfile)
12414 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12416 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12417 error "dot lustre permission check $fid failed"
12420 run_test 154b "Open-by-FID for remote directory"
12423 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12424 skip "Need MDS version at least 2.4.1"
12426 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12427 local FID1=$($LFS path2fid $DIR/$tfile.1)
12428 local FID2=$($LFS path2fid $DIR/$tfile.2)
12429 local FID3=$($LFS path2fid $DIR/$tfile.3)
12432 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12433 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12434 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12436 [ "$FID" = "${!want}" ] ||
12437 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12441 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12443 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12444 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12448 run_test 154c "lfs path2fid and fid2path multiple arguments"
12451 remote_mds_nodsh && skip "remote MDS with nodsh"
12452 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12453 skip "Need MDS version at least 2.5.53"
12455 if remote_mds; then
12456 nid=$($LCTL list_nids | sed "s/\./\\\./g")
12460 local proc_ofile="mdt.*.exports.'$nid'.open_files"
12467 local fid=$($LFS path2fid $DIR/$tfile)
12470 cmd="exec $fd<$DIR/$tfile"
12472 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
12473 echo "$fid_list" | grep "$fid"
12476 cmd="exec $fd>/dev/null"
12478 if [ $rc -ne 0 ]; then
12479 error "FID $fid not found in open files list $fid_list"
12482 run_test 154d "Verify open file fid"
12486 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
12487 skip "Need MDS version at least 2.6.50"
12489 if ls -a $MOUNT | grep -q '^\.lustre$'; then
12490 error ".lustre returned by readdir"
12493 run_test 154e ".lustre is not returned by readdir"
12496 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12498 # create parent directory on a single MDT to avoid cross-MDT hardlinks
12499 test_mkdir -p -c1 $DIR/$tdir/d
12500 # test dirs inherit from its stripe
12501 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
12502 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
12503 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
12504 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
12507 # get fid of parents
12508 local FID0=$($LFS path2fid $DIR/$tdir/d)
12509 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
12510 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
12511 local FID3=$($LFS path2fid $DIR)
12513 # check that path2fid --parents returns expected <parent_fid>/name
12514 # 1) test for a directory (single parent)
12515 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
12516 [ "$parent" == "$FID0/foo1" ] ||
12517 error "expected parent: $FID0/foo1, got: $parent"
12519 # 2) test for a file with nlink > 1 (multiple parents)
12520 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
12521 echo "$parent" | grep -F "$FID1/$tfile" ||
12522 error "$FID1/$tfile not returned in parent list"
12523 echo "$parent" | grep -F "$FID2/link" ||
12524 error "$FID2/link not returned in parent list"
12526 # 3) get parent by fid
12527 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
12528 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12529 echo "$parent" | grep -F "$FID1/$tfile" ||
12530 error "$FID1/$tfile not returned in parent list (by fid)"
12531 echo "$parent" | grep -F "$FID2/link" ||
12532 error "$FID2/link not returned in parent list (by fid)"
12534 # 4) test for entry in root directory
12535 parent=$($LFS path2fid --parents $DIR/f)
12536 echo "$parent" | grep -F "$FID3/f" ||
12537 error "$FID3/f not returned in parent list"
12539 # 5) test it on root directory
12540 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
12541 error "$MOUNT should not have parents"
12543 # enable xattr caching and check that linkea is correctly updated
12544 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
12545 save_lustre_params client "llite.*.xattr_cache" > $save
12546 lctl set_param llite.*.xattr_cache 1
12548 # 6.1) linkea update on rename
12549 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
12551 # get parents by fid
12552 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12553 # foo1 should no longer be returned in parent list
12554 echo "$parent" | grep -F "$FID1" &&
12555 error "$FID1 should no longer be in parent list"
12556 # the new path should appear
12557 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
12558 error "$FID2/$tfile.moved is not in parent list"
12560 # 6.2) linkea update on unlink
12561 rm -f $DIR/$tdir/d/foo2/link
12562 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12563 # foo2/link should no longer be returned in parent list
12564 echo "$parent" | grep -F "$FID2/link" &&
12565 error "$FID2/link should no longer be in parent list"
12569 restore_lustre_params < $save
12572 run_test 154f "get parent fids by reading link ea"
12576 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12577 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
12578 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
12579 skip "Need MDS version at least 2.6.92"
12581 mkdir -p $DIR/$tdir
12582 llapi_fid_test -d $DIR/$tdir
12584 run_test 154g "various llapi FID tests"
12586 test_155_small_load() {
12587 local temp=$TMP/$tfile
12588 local file=$DIR/$tfile
12590 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
12591 error "dd of=$temp bs=6096 count=1 failed"
12593 cancel_lru_locks $OSC
12594 cmp $temp $file || error "$temp $file differ"
12596 $TRUNCATE $temp 6000
12597 $TRUNCATE $file 6000
12598 cmp $temp $file || error "$temp $file differ (truncate1)"
12600 echo "12345" >>$temp
12601 echo "12345" >>$file
12602 cmp $temp $file || error "$temp $file differ (append1)"
12604 echo "12345" >>$temp
12605 echo "12345" >>$file
12606 cmp $temp $file || error "$temp $file differ (append2)"
12612 test_155_big_load() {
12613 remote_ost_nodsh && skip "remote OST with nodsh"
12615 local temp=$TMP/$tfile
12616 local file=$DIR/$tfile
12619 local cache_size=$(do_facet ost$((MAXI+1)) \
12620 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
12621 local large_file_size=$((cache_size * 2))
12623 echo "OSS cache size: $cache_size KB"
12624 echo "Large file size: $large_file_size KB"
12626 [ $MAXV -le $large_file_size ] &&
12627 skip_env "max available OST size needs > $large_file_size KB"
12629 $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed"
12631 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
12632 error "dd of=$temp bs=$large_file_size count=1k failed"
12635 cancel_lru_locks osc
12636 cmp $temp $file || error "$temp $file differ"
12642 save_writethrough() {
12643 local facets=$(get_facets OST)
12645 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
12649 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12651 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12653 save_writethrough $p
12656 set_cache writethrough on
12657 test_155_small_load
12658 restore_lustre_params < $p
12661 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
12664 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12666 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12668 save_writethrough $p
12671 set_cache writethrough off
12672 test_155_small_load
12673 restore_lustre_params < $p
12676 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
12679 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12681 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12683 save_writethrough $p
12686 set_cache writethrough on
12687 test_155_small_load
12688 restore_lustre_params < $p
12691 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
12694 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12696 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12698 save_writethrough $p
12701 set_cache writethrough off
12702 test_155_small_load
12703 restore_lustre_params < $p
12706 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
12709 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12711 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12713 save_writethrough $p
12716 set_cache writethrough on
12718 restore_lustre_params < $p
12721 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
12724 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12726 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12728 save_writethrough $p
12731 set_cache writethrough off
12733 restore_lustre_params < $p
12736 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
12739 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12741 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12743 save_writethrough $p
12746 set_cache writethrough on
12748 restore_lustre_params < $p
12751 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
12754 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12756 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12758 save_writethrough $p
12761 set_cache writethrough off
12763 restore_lustre_params < $p
12766 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
12769 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12770 remote_ost_nodsh && skip "remote OST with nodsh"
12771 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
12772 skip "stats not implemented on old servers"
12773 [ "$ost1_FSTYPE" = "zfs" ] &&
12774 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
12779 local file="$DIR/$tfile"
12780 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12782 save_writethrough $p
12785 log "Turn on read and write cache"
12787 set_cache writethrough on
12789 log "Write data and read it back."
12790 log "Read should be satisfied from the cache."
12791 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12793 cancel_lru_locks osc
12794 cat $file >/dev/null
12796 if ! let "AFTER - BEFORE == CPAGES"; then
12797 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12799 log "cache hits:: before: $BEFORE, after: $AFTER"
12802 log "Read again; it should be satisfied from the cache."
12804 cancel_lru_locks osc
12805 cat $file >/dev/null
12807 if ! let "AFTER - BEFORE == CPAGES"; then
12808 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12810 log "cache hits:: before: $BEFORE, after: $AFTER"
12813 log "Turn off the read cache and turn on the write cache"
12815 set_cache writethrough on
12817 log "Read again; it should be satisfied from the cache."
12819 cancel_lru_locks osc
12820 cat $file >/dev/null
12822 if ! let "AFTER - BEFORE == CPAGES"; then
12823 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12825 log "cache hits:: before: $BEFORE, after: $AFTER"
12828 log "Read again; it should not be satisfied from the cache."
12830 cancel_lru_locks osc
12831 cat $file >/dev/null
12833 if ! let "AFTER - BEFORE == 0"; then
12834 error "IN CACHE: before: $BEFORE, after: $AFTER"
12836 log "cache hits:: before: $BEFORE, after: $AFTER"
12839 log "Write data and read it back."
12840 log "Read should be satisfied from the cache."
12841 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12843 cancel_lru_locks osc
12844 cat $file >/dev/null
12846 if ! let "AFTER - BEFORE == CPAGES"; then
12847 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12849 log "cache hits:: before: $BEFORE, after: $AFTER"
12852 log "Read again; it should not be satisfied from the cache."
12854 cancel_lru_locks osc
12855 cat $file >/dev/null
12857 if ! let "AFTER - BEFORE == 0"; then
12858 error "IN CACHE: before: $BEFORE, after: $AFTER"
12860 log "cache hits:: before: $BEFORE, after: $AFTER"
12863 log "Turn off read and write cache"
12865 set_cache writethrough off
12867 log "Write data and read it back"
12868 log "It should not be satisfied from the cache."
12870 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12871 cancel_lru_locks osc
12873 cat $file >/dev/null
12875 if ! let "AFTER - BEFORE == 0"; then
12876 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12878 log "cache hits:: before: $BEFORE, after: $AFTER"
12881 log "Turn on the read cache and turn off the write cache"
12883 set_cache writethrough off
12885 log "Write data and read it back"
12886 log "It should not be satisfied from the cache."
12888 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12890 cancel_lru_locks osc
12891 cat $file >/dev/null
12893 if ! let "AFTER - BEFORE == 0"; then
12894 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12896 log "cache hits:: before: $BEFORE, after: $AFTER"
12899 log "Read again; it should be satisfied from the cache."
12901 cancel_lru_locks osc
12902 cat $file >/dev/null
12904 if ! let "AFTER - BEFORE == CPAGES"; then
12905 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12907 log "cache hits:: before: $BEFORE, after: $AFTER"
12910 restore_lustre_params < $p
12913 run_test 156 "Verification of tunables"
12916 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12917 remote_mds_nodsh && skip "remote MDS with nodsh"
12918 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
12919 skip "Need MDS version at least 2.2.0"
12921 changelog_register || error "changelog_register failed"
12922 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
12923 changelog_users $SINGLEMDS | grep -q $cl_user ||
12924 error "User $cl_user not found in changelog_users"
12927 test_mkdir -p $DIR/$tdir/pics/2008/zachy
12928 changelog_clear 0 || error "changelog_clear failed"
12929 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
12930 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
12931 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
12932 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
12933 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
12934 rm $DIR/$tdir/pics/desktop.jpg
12936 changelog_dump | tail -10
12938 echo "verifying changelog mask"
12939 changelog_chmask "-MKDIR"
12940 changelog_chmask "-CLOSE"
12942 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
12943 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
12945 changelog_chmask "+MKDIR"
12946 changelog_chmask "+CLOSE"
12948 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
12949 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
12951 changelog_dump | tail -10
12952 MKDIRS=$(changelog_dump | grep -c "MKDIR")
12953 CLOSES=$(changelog_dump | grep -c "CLOSE")
12954 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
12955 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
12958 echo "verifying target fid"
12959 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
12960 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
12961 [ "$fidc" == "$fidf" ] ||
12962 error "changelog '$tfile' fid $fidc != file fid $fidf"
12963 echo "verifying parent fid"
12964 # The FID returned from the Changelog may be the directory shard on
12965 # a different MDT, and not the FID returned by path2fid on the parent.
12966 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
12967 # since this is what will matter when recreating this file in the tree.
12968 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
12969 local pathp=$($LFS fid2path $MOUNT "$fidp")
12970 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
12971 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
12973 echo "getting records for $cl_user"
12974 changelog_users $SINGLEMDS
12975 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
12977 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
12978 error "changelog_clear failed"
12979 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
12980 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
12981 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
12982 error "user index expect $user_rec1 + $nclr != $user_rec2"
12984 local min0_rec=$(changelog_users $SINGLEMDS |
12985 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
12986 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
12987 awk '{ print $1; exit; }')
12989 changelog_dump | tail -n 5
12990 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
12991 [ $first_rec == $((min0_rec + 1)) ] ||
12992 error "first index should be $min0_rec + 1 not $first_rec"
12994 # LU-3446 changelog index reset on MDT restart
12995 local cur_rec1=$(changelog_users $SINGLEMDS |
12996 awk '/^current.index:/ { print $NF }')
12997 changelog_clear 0 ||
12998 error "clear all changelog records for $cl_user failed"
12999 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
13000 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
13001 error "Fail to start $SINGLEMDS"
13002 local cur_rec2=$(changelog_users $SINGLEMDS |
13003 awk '/^current.index:/ { print $NF }')
13004 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
13005 [ $cur_rec1 == $cur_rec2 ] ||
13006 error "current index should be $cur_rec1 not $cur_rec2"
13008 echo "verifying users from this test are deregistered"
13009 changelog_deregister || error "changelog_deregister failed"
13010 changelog_users $SINGLEMDS | grep -q $cl_user &&
13011 error "User '$cl_user' still in changelog_users"
13013 # lctl get_param -n mdd.*.changelog_users
13014 # current index: 144
13015 # ID index (idle seconds)
13017 if ! changelog_users $SINGLEMDS | grep "^cl"; then
13018 # this is the normal case where all users were deregistered
13019 # make sure no new records are added when no users are present
13020 local last_rec1=$(changelog_users $SINGLEMDS |
13021 awk '/^current.index:/ { print $NF }')
13022 touch $DIR/$tdir/chloe
13023 local last_rec2=$(changelog_users $SINGLEMDS |
13024 awk '/^current.index:/ { print $NF }')
13025 echo "verify changelogs are off: $last_rec1 == $last_rec2"
13026 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
13028 # any changelog users must be leftovers from a previous test
13029 changelog_users $SINGLEMDS
13030 echo "other changelog users; can't verify off"
13033 run_test 160a "changelog sanity"
13035 test_160b() { # LU-3587
13036 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13037 remote_mds_nodsh && skip "remote MDS with nodsh"
13038 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13039 skip "Need MDS version at least 2.2.0"
13041 changelog_register || error "changelog_register failed"
13042 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13043 changelog_users $SINGLEMDS | grep -q $cl_user ||
13044 error "User '$cl_user' not found in changelog_users"
13046 local longname1=$(str_repeat a 255)
13047 local longname2=$(str_repeat b 255)
13050 echo "creating very long named file"
13051 touch $longname1 || error "create of '$longname1' failed"
13052 echo "renaming very long named file"
13053 mv $longname1 $longname2
13055 changelog_dump | grep RENME | tail -n 5
13058 run_test 160b "Verify that very long rename doesn't crash in changelog"
13061 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13062 remote_mds_nodsh && skip "remote MDS with nodsh"
13064 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
13065 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
13066 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
13067 skip "Need MDS version at least 2.5.58 or 2.5.2+"
13071 # Registration step
13072 changelog_register || error "changelog_register failed"
13075 mkdir -p $DIR/$tdir
13076 $MCREATE $DIR/$tdir/foo_160c
13077 changelog_chmask "-TRUNC"
13078 $TRUNCATE $DIR/$tdir/foo_160c 200
13079 changelog_chmask "+TRUNC"
13080 $TRUNCATE $DIR/$tdir/foo_160c 199
13081 changelog_dump | tail -n 5
13082 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
13083 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
13085 run_test 160c "verify that changelog log catch the truncate event"
13088 remote_mds_nodsh && skip "remote MDS with nodsh"
13089 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13090 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13091 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
13092 skip "Need MDS version at least 2.7.60"
13094 # Registration step
13095 changelog_register || error "changelog_register failed"
13097 mkdir -p $DIR/$tdir/migrate_dir
13098 changelog_clear 0 || error "changelog_clear failed"
13100 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
13101 changelog_dump | tail -n 5
13102 local migrates=$(changelog_dump | grep -c "MIGRT")
13103 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
13105 run_test 160d "verify that changelog log catch the migrate event"
13108 remote_mds_nodsh && skip "remote MDS with nodsh"
13111 changelog_register || error "changelog_register failed"
13113 # Delete a future user (expect fail)
13114 local MDT0=$(facet_svc $SINGLEMDS)
13115 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
13118 if [ $rc -eq 0 ]; then
13119 error "Deleted non-existant user cl77"
13120 elif [ $rc -ne 2 ]; then
13121 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
13124 # Clear to a bad index (1 billion should be safe)
13125 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
13128 if [ $rc -eq 0 ]; then
13129 error "Successfully cleared to invalid CL index"
13130 elif [ $rc -ne 22 ]; then
13131 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
13134 run_test 160e "changelog negative testing (should return errors)"
13137 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13138 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13139 skip "Need MDS version at least 2.10.56"
13141 local mdts=$(comma_list $(mdts_nodes))
13144 changelog_register || error "first changelog_register failed"
13145 changelog_register || error "second changelog_register failed"
13147 declare -A cl_user1
13148 declare -A cl_user2
13153 # generate some changelog records to accumulate on each MDT
13154 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13155 log "$(date +%s): creating first files"
13156 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13157 error "create $DIR/$tdir/$tfile failed"
13159 # check changelogs have been generated
13160 local start=$SECONDS
13161 local idle_time=$((MDSCOUNT * 5 + 5))
13162 local nbcl=$(changelog_dump | wc -l)
13163 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13165 for param in "changelog_max_idle_time=$idle_time" \
13167 "changelog_min_gc_interval=2" \
13168 "changelog_min_free_cat_entries=3"; do
13169 local MDT0=$(facet_svc $SINGLEMDS)
13170 local var="${param%=*}"
13171 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13173 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13174 do_nodes $mdts $LCTL set_param mdd.*.$param
13177 # force cl_user2 to be idle (1st part), but also cancel the
13178 # cl_user1 records so that it is not evicted later in the test.
13179 local sleep1=$((idle_time / 2))
13180 echo "$(date +%s): sleep1 $sleep1/${idle_time}s"
13183 # simulate changelog catalog almost full
13184 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13185 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13187 for i in $(seq $MDSCOUNT); do
13188 cl_users=(${CL_USERS[mds$i]})
13189 cl_user1[mds$i]="${cl_users[0]}"
13190 cl_user2[mds$i]="${cl_users[1]}"
13192 [ -n "${cl_user1[mds$i]}" ] ||
13193 error "mds$i: no user registered"
13194 [ -n "${cl_user2[mds$i]}" ] ||
13195 error "mds$i: only ${cl_user2[mds$i]} is registered"
13197 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13198 [ -n "$user_rec1" ] ||
13199 error "mds$i: User ${cl_user1[mds$i]} not registered"
13200 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13201 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13202 [ -n "$user_rec2" ] ||
13203 error "mds$i: User ${cl_user1[mds$i]} not registered"
13204 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13205 "$user_rec1 + 2 == $user_rec2"
13206 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13207 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13208 "$user_rec1 + 2, but is $user_rec2"
13209 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13210 [ -n "$user_rec2" ] ||
13211 error "mds$i: User ${cl_user2[mds$i]} not registered"
13212 [ $user_rec1 == $user_rec2 ] ||
13213 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13214 "$user_rec1, but is $user_rec2"
13217 # force cl_user2 idle (2nd part) to just exceed changelog_max_idle_time
13218 local sleep2=$((idle_time - (SECONDS - start) + 1))
13219 echo "$(date +%s): sleep2 $sleep2/${idle_time}s"
13222 # Generate one more changelog to trigger GC at fail_loc for cl_user2.
13223 # cl_user1 should be OK because it recently processed records.
13224 echo "$(date +%s): creating $((MDSCOUNT * 2)) files"
13225 createmany -m $DIR/$tdir/${tfile}b $((MDSCOUNT * 2)) ||
13226 error "create $DIR/$tdir/${tfile}b failed"
13228 # ensure gc thread is done
13229 for i in $(mdts_nodes); do
13231 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13232 error "$i: GC-thread not done"
13236 for i in $(seq $MDSCOUNT); do
13237 # check cl_user1 still registered
13238 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13239 error "mds$i: User ${cl_user1[mds$i]} not registered"
13240 # check cl_user2 unregistered
13241 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13242 error "mds$i: User ${cl_user2[mds$i]} still registered"
13244 # check changelogs are present and starting at $user_rec1 + 1
13245 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13246 [ -n "$user_rec1" ] ||
13247 error "mds$i: User ${cl_user1[mds$i]} not registered"
13248 first_rec=$($LFS changelog $(facet_svc mds$i) |
13249 awk '{ print $1; exit; }')
13251 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13252 [ $((user_rec1 + 1)) == $first_rec ] ||
13253 error "mds$i: first index should be $user_rec1 + 1, " \
13254 "but is $first_rec"
13257 run_test 160f "changelog garbage collect (timestamped users)"
13260 remote_mds_nodsh && skip "remote MDS with nodsh"
13261 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13262 skip "Need MDS version at least 2.10.56"
13264 local mdts=$(comma_list $(mdts_nodes))
13266 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
13267 do_nodes $mdts $LCTL set_param fail_loc=0x1314
13270 changelog_register || error "first changelog_register failed"
13271 changelog_register || error "second changelog_register failed"
13273 declare -A cl_user1
13274 declare -A cl_user2
13279 # generate some changelog records to accumulate on each MDT
13280 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13281 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13282 error "create $DIR/$tdir/$tfile failed"
13284 # check changelogs have been generated
13285 local nbcl=$(changelog_dump | wc -l)
13286 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13288 # reduce the max_idle_indexes value to make sure we exceed it
13289 max_ndx=$((nbcl / 2 - 1))
13291 for param in "changelog_max_idle_indexes=$max_ndx" \
13293 "changelog_min_gc_interval=2" \
13294 "changelog_min_free_cat_entries=3"; do
13295 local MDT0=$(facet_svc $SINGLEMDS)
13296 local var="${param%=*}"
13297 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13299 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13300 do_nodes $mdts $LCTL set_param mdd.*.$param ||
13301 error "unable to set mdd.*.$param"
13304 # simulate changelog catalog almost full
13305 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13306 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13308 for i in $(seq $MDSCOUNT); do
13309 cl_users=(${CL_USERS[mds$i]})
13310 cl_user1[mds$i]="${cl_users[0]}"
13311 cl_user2[mds$i]="${cl_users[1]}"
13313 [ -n "${cl_user1[mds$i]}" ] ||
13314 error "mds$i: no user registered"
13315 [ -n "${cl_user2[mds$i]}" ] ||
13316 error "mds$i: only ${cl_user1[mds$i]} is registered"
13318 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13319 [ -n "$user_rec1" ] ||
13320 error "mds$i: User ${cl_user1[mds$i]} not registered"
13321 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13322 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13323 [ -n "$user_rec2" ] ||
13324 error "mds$i: User ${cl_user1[mds$i]} not registered"
13325 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13326 "$user_rec1 + 2 == $user_rec2"
13327 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13328 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13329 "$user_rec1 + 2, but is $user_rec2"
13330 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13331 [ -n "$user_rec2" ] ||
13332 error "mds$i: User ${cl_user2[mds$i]} not registered"
13333 [ $user_rec1 == $user_rec2 ] ||
13334 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13335 "$user_rec1, but is $user_rec2"
13338 # ensure we are past the previous changelog_min_gc_interval set above
13341 # generate one more changelog to trigger fail_loc
13342 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13343 error "create $DIR/$tdir/${tfile}bis failed"
13345 # ensure gc thread is done
13346 for i in $(mdts_nodes); do
13348 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13349 error "$i: GC-thread not done"
13353 for i in $(seq $MDSCOUNT); do
13354 # check cl_user1 still registered
13355 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13356 error "mds$i: User ${cl_user1[mds$i]} not registered"
13357 # check cl_user2 unregistered
13358 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13359 error "mds$i: User ${cl_user2[mds$i]} still registered"
13361 # check changelogs are present and starting at $user_rec1 + 1
13362 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13363 [ -n "$user_rec1" ] ||
13364 error "mds$i: User ${cl_user1[mds$i]} not registered"
13365 first_rec=$($LFS changelog $(facet_svc mds$i) |
13366 awk '{ print $1; exit; }')
13368 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13369 [ $((user_rec1 + 1)) == $first_rec ] ||
13370 error "mds$i: first index should be $user_rec1 + 1, " \
13371 "but is $first_rec"
13374 run_test 160g "changelog garbage collect (old users)"
13377 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13378 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13379 skip "Need MDS version at least 2.10.56"
13381 local mdts=$(comma_list $(mdts_nodes))
13384 changelog_register || error "first changelog_register failed"
13385 changelog_register || error "second changelog_register failed"
13387 declare -A cl_user1
13388 declare -A cl_user2
13393 # generate some changelog records to accumulate on each MDT
13394 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13395 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13396 error "create $DIR/$tdir/$tfile failed"
13398 # check changelogs have been generated
13399 local nbcl=$(changelog_dump | wc -l)
13400 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13402 for param in "changelog_max_idle_time=10" \
13404 "changelog_min_gc_interval=2"; do
13405 local MDT0=$(facet_svc $SINGLEMDS)
13406 local var="${param%=*}"
13407 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13409 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13410 do_nodes $mdts $LCTL set_param mdd.*.$param
13413 # force cl_user2 to be idle (1st part)
13416 for i in $(seq $MDSCOUNT); do
13417 cl_users=(${CL_USERS[mds$i]})
13418 cl_user1[mds$i]="${cl_users[0]}"
13419 cl_user2[mds$i]="${cl_users[1]}"
13421 [ -n "${cl_user1[mds$i]}" ] ||
13422 error "mds$i: no user registered"
13423 [ -n "${cl_user2[mds$i]}" ] ||
13424 error "mds$i: only ${cl_user2[mds$i]} is registered"
13426 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13427 [ -n "$user_rec1" ] ||
13428 error "mds$i: User ${cl_user1[mds$i]} not registered"
13429 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13430 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13431 [ -n "$user_rec2" ] ||
13432 error "mds$i: User ${cl_user1[mds$i]} not registered"
13433 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13434 "$user_rec1 + 2 == $user_rec2"
13435 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13436 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13437 "$user_rec1 + 2, but is $user_rec2"
13438 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13439 [ -n "$user_rec2" ] ||
13440 error "mds$i: User ${cl_user2[mds$i]} not registered"
13441 [ $user_rec1 == $user_rec2 ] ||
13442 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13443 "$user_rec1, but is $user_rec2"
13446 # force cl_user2 to be idle (2nd part) and to reach
13447 # changelog_max_idle_time
13450 # force each GC-thread start and block then
13451 # one per MDT/MDD, set fail_val accordingly
13452 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13453 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13455 # generate more changelogs to trigger fail_loc
13456 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13457 error "create $DIR/$tdir/${tfile}bis failed"
13459 # stop MDT to stop GC-thread, should be done in back-ground as it will
13460 # block waiting for the thread to be released and exit
13461 declare -A stop_pids
13462 for i in $(seq $MDSCOUNT); do
13464 stop_pids[mds$i]=$!
13467 for i in $(mdts_nodes); do
13470 local facets=$(facets_up_on_host $i)
13472 for facet in ${facets//,/ }; do
13473 if [[ $facet == mds* ]]; then
13477 # ensure each MDS's gc threads are still present and all in "R"
13478 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
13479 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
13480 error "$i: expected $nb GC-thread"
13482 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
13484 error "$i: GC-thread not found in R-state"
13485 # check umounts of each MDT on MDS have reached kthread_stop()
13486 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
13487 error "$i: expected $nb umount"
13489 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
13490 error "$i: umount not found in D-state"
13493 # release all GC-threads
13494 do_nodes $mdts $LCTL set_param fail_loc=0
13496 # wait for MDT stop to complete
13497 for i in $(seq $MDSCOUNT); do
13498 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
13502 # may try to check if any orphan changelog records are present
13503 # via ldiskfs/zfs and llog_reader...
13505 # re-start/mount MDTs
13506 for i in $(seq $MDSCOUNT); do
13507 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
13508 error "Fail to start mds$i"
13512 for i in $(seq $MDSCOUNT); do
13513 # check cl_user1 still registered
13514 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13515 error "mds$i: User ${cl_user1[mds$i]} not registered"
13516 # check cl_user2 unregistered
13517 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13518 error "mds$i: User ${cl_user2[mds$i]} still registered"
13520 # check changelogs are present and starting at $user_rec1 + 1
13521 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13522 [ -n "$user_rec1" ] ||
13523 error "mds$i: User ${cl_user1[mds$i]} not registered"
13524 first_rec=$($LFS changelog $(facet_svc mds$i) |
13525 awk '{ print $1; exit; }')
13527 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13528 [ $((user_rec1 + 1)) == $first_rec ] ||
13529 error "mds$i: first index should be $user_rec1 + 1, " \
13530 "but is $first_rec"
13533 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
13538 local mdts=$(comma_list $(mdts_nodes))
13540 changelog_register || error "first changelog_register failed"
13542 # generate some changelog records to accumulate on each MDT
13543 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13544 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13545 error "create $DIR/$tdir/$tfile failed"
13547 # check changelogs have been generated
13548 local nbcl=$(changelog_dump | wc -l)
13549 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13551 # simulate race between register and unregister
13552 # XXX as fail_loc is set per-MDS, with DNE configs the race
13553 # simulation will only occur for one MDT per MDS and for the
13554 # others the normal race scenario will take place
13555 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
13556 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
13557 do_nodes $mdts $LCTL set_param fail_val=1
13559 # unregister 1st user
13560 changelog_deregister &
13562 # wait some time for deregister work to reach race rdv
13564 # register 2nd user
13565 changelog_register || error "2nd user register failed"
13567 wait $pid1 || error "1st user deregister failed"
13571 declare -A LAST_REC
13572 for i in $(seq $MDSCOUNT); do
13573 if changelog_users mds$i | grep "^cl"; then
13574 # make sure new records are added with one user present
13575 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
13576 awk '/^current.index:/ { print $NF }')
13578 error "mds$i has no user registered"
13582 # generate more changelog records to accumulate on each MDT
13583 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13584 error "create $DIR/$tdir/${tfile}bis failed"
13586 for i in $(seq $MDSCOUNT); do
13587 last_rec=$(changelog_users $SINGLEMDS |
13588 awk '/^current.index:/ { print $NF }')
13589 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
13590 [ $last_rec != ${LAST_REC[mds$i]} ] ||
13591 error "changelogs are off on mds$i"
13594 run_test 160i "changelog user register/unregister race"
13597 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13598 remote_mds_nodsh && skip "remote MDS with nodsh"
13600 mkdir -p $DIR/$tdir/1/1
13602 changelog_register || error "changelog_register failed"
13603 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13605 changelog_users $SINGLEMDS | grep -q $cl_user ||
13606 error "User '$cl_user' not found in changelog_users"
13607 #define OBD_FAIL_MDS_CHANGELOG_REORDER 0x15d
13608 do_facet mds1 $LCTL set_param fail_loc=0x8000015d fail_val=3
13609 rmdir $DIR/$tdir/1/1 & sleep 1
13611 touch $DIR/$tdir/2/2
13612 rm -rf $DIR/$tdir/2
13617 changelog_dump | grep rmdir || error "rmdir not recorded"
13620 changelog_deregister
13622 run_test 160k "Verify that changelog records are not lost"
13625 remote_mds_nodsh && skip "remote MDS with nodsh"
13626 [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] &&
13627 skip "Need MDS version at least 2.12.56"
13629 mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
13631 changelog_register || error "first changelog_register failed"
13633 # generate some changelog
13634 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13635 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13636 error "create $DIR/$tdir/${tfile}bis failed"
13638 # open the changelog device
13639 exec 3>/dev/changelog-$FSNAME-MDT0000
13640 exec 4</dev/changelog-$FSNAME-MDT0000
13642 # umount the first lustre mount
13646 cat <&4 >/dev/null || error "read changelog failed"
13649 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13650 changelog_users $SINGLEMDS | grep -q $cl_user ||
13651 error "User $cl_user not found in changelog_users"
13653 printf 'clear:'$cl_user':0' >&3
13660 changelog_deregister || error "changelog_deregister failed"
13663 mount_client $MOUNT || error "mount_client on $MOUNT failed"
13665 run_test 160j "client can be umounted while its chanangelog is being used"
13668 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13670 test_mkdir -c1 $DIR/$tdir
13671 cp /etc/hosts $DIR/$tdir/$tfile
13672 test_mkdir -c1 $DIR/$tdir/foo1
13673 test_mkdir -c1 $DIR/$tdir/foo2
13674 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
13675 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
13676 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
13677 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
13678 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
13679 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13680 $LFS fid2path $DIR $FID
13681 error "bad link ea"
13684 rm $DIR/$tdir/foo2/zachary
13686 rm $DIR/$tdir/foo2/thor
13688 rm $DIR/$tdir/$tfile
13690 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
13691 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
13692 { $LFS fid2path $DIR $FID; error "bad link rename"; }
13693 rm $DIR/$tdir/foo2/maggie
13696 local longname=$tfile.avg_len_is_thirty_two_
13697 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
13698 error_noexit 'failed to unlink many hardlinks'" EXIT
13699 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
13700 error "failed to hardlink many files"
13701 links=$($LFS fid2path $DIR $FID | wc -l)
13702 echo -n "${links}/1000 links in link EA"
13703 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
13705 run_test 161a "link ea sanity"
13708 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13709 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
13712 local remote_dir=$DIR/$tdir/remote_dir
13714 mkdir -p $DIR/$tdir
13715 $LFS mkdir -i $MDTIDX $remote_dir ||
13716 error "create remote directory failed"
13718 cp /etc/hosts $remote_dir/$tfile
13719 mkdir -p $remote_dir/foo1
13720 mkdir -p $remote_dir/foo2
13721 ln $remote_dir/$tfile $remote_dir/foo1/sofia
13722 ln $remote_dir/$tfile $remote_dir/foo2/zachary
13723 ln $remote_dir/$tfile $remote_dir/foo1/luna
13724 ln $remote_dir/$tfile $remote_dir/foo2/thor
13726 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
13728 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13729 $LFS fid2path $DIR $FID
13730 error "bad link ea"
13733 rm $remote_dir/foo2/zachary
13735 rm $remote_dir/foo2/thor
13737 rm $remote_dir/$tfile
13739 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
13740 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
13741 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
13742 $LFS fid2path $DIR $FID
13743 error "bad link rename"
13745 rm $remote_dir/foo2/maggie
13748 local longname=filename_avg_len_is_thirty_two_
13749 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
13750 error "failed to hardlink many files"
13751 links=$($LFS fid2path $DIR $FID | wc -l)
13752 echo -n "${links}/1000 links in link EA"
13753 [[ ${links} -gt 60 ]] ||
13754 error "expected at least 60 links in link EA"
13755 unlinkmany $remote_dir/foo2/$longname 1000 ||
13756 error "failed to unlink many hardlinks"
13758 run_test 161b "link ea sanity under remote directory"
13761 remote_mds_nodsh && skip "remote MDS with nodsh"
13762 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13763 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
13764 skip "Need MDS version at least 2.1.5"
13766 # define CLF_RENAME_LAST 0x0001
13767 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
13768 changelog_register || error "changelog_register failed"
13771 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
13772 touch $DIR/$tdir/foo_161c
13773 touch $DIR/$tdir/bar_161c
13774 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13775 changelog_dump | grep RENME | tail -n 5
13776 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13777 changelog_clear 0 || error "changelog_clear failed"
13778 if [ x$flags != "x0x1" ]; then
13779 error "flag $flags is not 0x1"
13782 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
13783 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
13784 touch $DIR/$tdir/foo_161c
13785 touch $DIR/$tdir/bar_161c
13786 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13787 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13788 changelog_dump | grep RENME | tail -n 5
13789 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13790 changelog_clear 0 || error "changelog_clear failed"
13791 if [ x$flags != "x0x0" ]; then
13792 error "flag $flags is not 0x0"
13794 echo "rename overwrite a target having nlink > 1," \
13795 "changelog record has flags of $flags"
13797 # rename doesn't overwrite a target (changelog flag 0x0)
13798 touch $DIR/$tdir/foo_161c
13799 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
13800 changelog_dump | grep RENME | tail -n 5
13801 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
13802 changelog_clear 0 || error "changelog_clear failed"
13803 if [ x$flags != "x0x0" ]; then
13804 error "flag $flags is not 0x0"
13806 echo "rename doesn't overwrite a target," \
13807 "changelog record has flags of $flags"
13809 # define CLF_UNLINK_LAST 0x0001
13810 # unlink a file having nlink = 1 (changelog flag 0x1)
13811 rm -f $DIR/$tdir/foo2_161c
13812 changelog_dump | grep UNLNK | tail -n 5
13813 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13814 changelog_clear 0 || error "changelog_clear failed"
13815 if [ x$flags != "x0x1" ]; then
13816 error "flag $flags is not 0x1"
13818 echo "unlink a file having nlink = 1," \
13819 "changelog record has flags of $flags"
13821 # unlink a file having nlink > 1 (changelog flag 0x0)
13822 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13823 rm -f $DIR/$tdir/foobar_161c
13824 changelog_dump | grep UNLNK | tail -n 5
13825 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13826 changelog_clear 0 || error "changelog_clear failed"
13827 if [ x$flags != "x0x0" ]; then
13828 error "flag $flags is not 0x0"
13830 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
13832 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
13835 remote_mds_nodsh && skip "remote MDS with nodsh"
13840 changelog_register || error "changelog_register failed"
13842 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
13843 # interfer with $MOUNT/.lustre/fid/ access
13845 [[ $? -eq 0 ]] || error "mkdir failed"
13847 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
13848 $LCTL set_param fail_loc=0x8000140c
13850 $LCTL set_param fail_val=5
13853 echo foofoo > $DIR/$tdir/$tfile &
13856 # wait for create to be delayed
13860 [[ $? -eq 0 ]] || error "create should be blocked"
13862 local tempfile=$(mktemp)
13863 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
13864 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
13865 # some delay may occur during ChangeLog publishing and file read just
13866 # above, that could allow file write to happen finally
13867 [[ -s $tempfile ]] && echo "file should be empty"
13869 $LCTL set_param fail_loc=0
13872 [[ $? -eq 0 ]] || error "create failed"
13874 run_test 161d "create with concurrent .lustre/fid access"
13877 local expected="$1"
13882 path=$($LFS fid2path "$@")
13885 if [ $rc -ne 0 ]; then
13886 error "path looked up of '$expected' failed: rc=$rc"
13887 elif [ "$path" != "$expected" ]; then
13888 error "path looked up '$path' instead of '$expected'"
13890 echo "FID '$fid' resolves to path '$path' as expected"
13894 test_162a() { # was test_162
13895 test_mkdir -p -c1 $DIR/$tdir/d2
13896 touch $DIR/$tdir/d2/$tfile
13897 touch $DIR/$tdir/d2/x1
13898 touch $DIR/$tdir/d2/x2
13899 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
13900 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
13902 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
13903 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
13906 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
13907 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
13908 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
13910 # softlink to wrong file
13911 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
13912 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
13913 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
13916 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
13917 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
13918 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
13919 # fid2path dir/fsname should both work
13920 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
13921 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
13923 # hardlink count: check that there are 2 links
13924 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
13925 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
13927 # hardlink indexing: remove the first link
13928 rm $DIR/$tdir/d2/p/q/r/hlink
13929 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
13931 run_test 162a "path lookup sanity"
13934 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13935 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13938 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
13939 error "create striped dir failed"
13941 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
13942 tail -n 1 | awk '{print $2}')
13943 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
13945 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
13946 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
13949 for ((i=0;i<5;i++)); do
13950 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
13951 error "get fid for f$i failed"
13952 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
13954 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
13955 error "get fid for d$i failed"
13956 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
13961 run_test 162b "striped directory path lookup sanity"
13963 # LU-4239: Verify fid2path works with paths 100 or more directories deep
13965 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
13966 skip "Need MDS version at least 2.7.51"
13968 local lpath=$tdir.local
13969 local rpath=$tdir.remote
13971 test_mkdir $DIR/$lpath
13972 test_mkdir $DIR/$rpath
13974 for ((i = 0; i <= 101; i++)); do
13977 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
13978 error "get fid for local directory $DIR/$lpath failed"
13979 check_path "$DIR/$lpath" $MOUNT $FID --link 0
13982 test_mkdir $DIR/$rpath
13983 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
13984 error "get fid for remote directory $DIR/$rpath failed"
13985 check_path "$DIR/$rpath" $MOUNT $FID --link 0
13990 run_test 162c "fid2path works with paths 100 or more directories deep"
13993 # do directio so as not to populate the page cache
13994 log "creating a 10 Mb file"
13995 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
13996 log "starting reads"
13997 dd if=$DIR/$tfile of=/dev/null bs=4096 &
13998 log "truncating the file"
13999 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
14001 kill %+ || true # reads might have finished
14002 echo "wait until dd is finished"
14004 log "removing the temporary file"
14005 rm -rf $DIR/$tfile || error "tmp file removal failed"
14007 run_test 169 "parallel read and truncate should not deadlock"
14010 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14012 $LCTL clear # bug 18514
14013 $LCTL debug_daemon start $TMP/${tfile}_log_good
14015 $LCTL debug_daemon stop
14016 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
14017 error "sed failed to read log_good"
14019 $LCTL debug_daemon start $TMP/${tfile}_log_good
14021 $LCTL debug_daemon stop
14023 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
14024 error "lctl df log_bad failed"
14026 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14027 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14029 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
14030 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
14032 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
14033 error "bad_line good_line1 good_line2 are empty"
14035 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14036 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
14037 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14039 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
14040 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14041 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14043 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
14044 error "bad_line_new good_line_new are empty"
14046 local expected_good=$((good_line1 + good_line2*2))
14048 rm -f $TMP/${tfile}*
14049 # LU-231, short malformed line may not be counted into bad lines
14050 if [ $bad_line -ne $bad_line_new ] &&
14051 [ $bad_line -ne $((bad_line_new - 1)) ]; then
14052 error "expected $bad_line bad lines, but got $bad_line_new"
14056 if [ $expected_good -ne $good_line_new ]; then
14057 error "expected $expected_good good lines, but got $good_line_new"
14062 run_test 170 "test lctl df to handle corrupted log ====================="
14064 test_171() { # bug20592
14065 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14067 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
14068 $LCTL set_param fail_loc=0x50e
14069 $LCTL set_param fail_val=3000
14070 multiop_bg_pause $DIR/$tfile O_s || true
14072 kill -USR1 $MULTIPID
14076 if dmesg | grep "recursive fault"; then
14077 error "caught a recursive fault"
14079 $LCTL set_param fail_loc=0
14082 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
14084 # it would be good to share it with obdfilter-survey/iokit-libecho code
14085 setup_obdecho_osc () {
14088 local obdfilter_name=$2
14089 echo "Creating new osc for $obdfilter_name on $ost_nid"
14090 # make sure we can find loopback nid
14091 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
14093 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
14094 ${obdfilter_name}_osc_UUID || rc=2; }
14095 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
14096 ${obdfilter_name}_UUID $ost_nid || rc=3; }
14100 cleanup_obdecho_osc () {
14101 local obdfilter_name=$1
14102 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
14103 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
14110 local pages=${3:-64}
14115 local obd_size=$(get_obd_size $node $OBD)
14116 local page_size=$(get_page_size $node)
14117 if [[ -n "$obd_size" ]]; then
14118 local new_count=$((obd_size / (pages * page_size / 1024)))
14119 [[ $new_count -ge $count ]] || count=$new_count
14122 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
14123 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
14125 if [ $rc -eq 0 ]; then
14126 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
14127 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
14129 echo "New object id is $id"
14130 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
14132 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
14133 "test_brw $count w v $pages $id" || rc=4; }
14134 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
14136 [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
14137 "cleanup" || rc=5; }
14138 [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \
14139 "detach" || rc=6; }
14140 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
14145 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14147 if ! module_loaded obdecho; then
14148 load_module obdecho/obdecho &&
14149 stack_trap "rmmod obdecho" EXIT ||
14150 error "unable to load obdecho on client"
14153 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
14154 local host=$($LCTL get_param -n osc.$osc.import |
14155 awk '/current_connection:/ { print $2 }' )
14156 local target=$($LCTL get_param -n osc.$osc.import |
14157 awk '/target:/ { print $2 }' )
14158 target=${target%_UUID}
14160 if [ -n "$target" ]; then
14161 setup_obdecho_osc $host $target &&
14162 stack_trap "cleanup_obdecho_osc $target" EXIT ||
14163 { error "obdecho setup failed with $?"; return; }
14165 obdecho_test ${target}_osc client ||
14166 error "obdecho_test failed on ${target}_osc"
14168 $LCTL get_param osc.$osc.import
14169 error "there is no osc.$osc.import target"
14172 run_test 180a "test obdecho on osc"
14175 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14176 remote_ost_nodsh && skip "remote OST with nodsh"
14178 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14179 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14180 error "failed to load module obdecho"
14182 local target=$(do_facet ost1 $LCTL dl |
14183 awk '/obdfilter/ { print $4; exit; }')
14185 if [ -n "$target" ]; then
14186 obdecho_test $target ost1 || error "obdecho_test failed with $?"
14188 do_facet ost1 $LCTL dl
14189 error "there is no obdfilter target on ost1"
14192 run_test 180b "test obdecho directly on obdfilter"
14194 test_180c() { # LU-2598
14195 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14196 remote_ost_nodsh && skip "remote OST with nodsh"
14197 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
14198 skip "Need MDS version at least 2.4.0"
14200 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14201 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14202 error "failed to load module obdecho"
14204 local target=$(do_facet ost1 $LCTL dl |
14205 awk '/obdfilter/ { print $4; exit; }')
14207 if [ -n "$target" ]; then
14208 local pages=16384 # 64MB bulk I/O RPC size
14210 obdecho_test "$target" ost1 "$pages" ||
14211 error "obdecho_test with pages=$pages failed with $?"
14213 do_facet ost1 $LCTL dl
14214 error "there is no obdfilter target on ost1"
14217 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
14219 test_181() { # bug 22177
14220 test_mkdir $DIR/$tdir
14221 # create enough files to index the directory
14222 createmany -o $DIR/$tdir/foobar 4000
14223 # print attributes for debug purpose
14226 multiop_bg_pause $DIR/$tdir D_Sc || return 1
14228 # remove the files & current working dir
14229 unlinkmany $DIR/$tdir/foobar 4000
14231 kill -USR1 $MULTIPID
14233 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
14236 run_test 181 "Test open-unlinked dir ========================"
14242 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14244 $LCTL set_param mdc.*.rpc_stats=clear
14246 for (( i = 0; i < $tcount; i++ )) ; do
14247 mkdir $DIR/$tdir/$i
14250 for (( i = 0; i < $tcount; i++ )) ; do
14251 createmany -o $DIR/$tdir/$i/f- $fcount &
14255 for (( i = 0; i < $tcount; i++ )) ; do
14256 unlinkmany $DIR/$tdir/$i/f- $fcount &
14260 $LCTL get_param mdc.*.rpc_stats
14264 run_test 182 "Test parallel modify metadata operations ================"
14266 test_183() { # LU-2275
14267 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14268 remote_mds_nodsh && skip "remote MDS with nodsh"
14269 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
14270 skip "Need MDS version at least 2.3.56"
14272 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14273 echo aaa > $DIR/$tdir/$tfile
14275 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
14276 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
14278 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
14279 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
14281 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
14283 # Flush negative dentry cache
14284 touch $DIR/$tdir/$tfile
14286 # We are not checking for any leaked references here, they'll
14287 # become evident next time we do cleanup with module unload.
14290 run_test 183 "No crash or request leak in case of strange dispositions ========"
14292 # test suite 184 is for LU-2016, LU-2017
14294 check_swap_layouts_support
14296 dir0=$DIR/$tdir/$testnum
14297 test_mkdir -p -c1 $dir0
14302 $SETSTRIPE -c1 $file1
14304 $SETSTRIPE -c2 $file2
14306 gen1=$($GETSTRIPE -g $file1)
14307 gen2=$($GETSTRIPE -g $file2)
14309 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
14310 gen=$($GETSTRIPE -g $file1)
14311 [[ $gen1 != $gen ]] ||
14312 "Layout generation on $file1 does not change"
14313 gen=$($GETSTRIPE -g $file2)
14314 [[ $gen2 != $gen ]] ||
14315 "Layout generation on $file2 does not change"
14317 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
14318 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
14320 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
14322 run_test 184a "Basic layout swap"
14325 check_swap_layouts_support
14327 dir0=$DIR/$tdir/$testnum
14328 mkdir -p $dir0 || error "creating dir $dir0"
14335 $SETSTRIPE -c1 $file1
14336 $SETSTRIPE -c2 $file2
14337 $SETSTRIPE -c1 $file3
14338 chown $RUNAS_ID $file3
14339 gen1=$($GETSTRIPE -g $file1)
14340 gen2=$($GETSTRIPE -g $file2)
14342 $LFS swap_layouts $dir1 $dir2 &&
14343 error "swap of directories layouts should fail"
14344 $LFS swap_layouts $dir1 $file1 &&
14345 error "swap of directory and file layouts should fail"
14346 $RUNAS $LFS swap_layouts $file1 $file2 &&
14347 error "swap of file we cannot write should fail"
14348 $LFS swap_layouts $file1 $file3 &&
14349 error "swap of file with different owner should fail"
14350 /bin/true # to clear error code
14352 run_test 184b "Forbidden layout swap (will generate errors)"
14355 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14356 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14357 check_swap_layouts_support
14359 local dir0=$DIR/$tdir/$testnum
14360 mkdir -p $dir0 || error "creating dir $dir0"
14362 local ref1=$dir0/ref1
14363 local ref2=$dir0/ref2
14364 local file1=$dir0/file1
14365 local file2=$dir0/file2
14366 # create a file large enough for the concurrent test
14367 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14368 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14369 echo "ref file size: ref1($(stat -c %s $ref1))," \
14370 "ref2($(stat -c %s $ref2))"
14373 dd if=$ref1 of=$file1 bs=16k &
14376 # Make sure dd starts to copy file
14377 while [ ! -f $file1 ]; do sleep 0.1; done
14379 $LFS swap_layouts $file1 $file2
14382 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14383 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14385 # how many bytes copied before swapping layout
14386 local copied=$(stat -c %s $file2)
14387 local remaining=$(stat -c %s $ref1)
14388 remaining=$((remaining - copied))
14389 echo "Copied $copied bytes before swapping layout..."
14391 cmp -n $copied $file1 $ref2 | grep differ &&
14392 error "Content mismatch [0, $copied) of ref2 and file1"
14393 cmp -n $copied $file2 $ref1 ||
14394 error "Content mismatch [0, $copied) of ref1 and file2"
14395 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14396 error "Content mismatch [$copied, EOF) of ref1 and file1"
14399 rm -f $ref1 $ref2 $file1 $file2
14401 run_test 184c "Concurrent write and layout swap"
14404 check_swap_layouts_support
14405 [ -z "$(which getfattr 2>/dev/null)" ] &&
14406 skip_env "no getfattr command"
14408 local file1=$DIR/$tdir/$tfile-1
14409 local file2=$DIR/$tdir/$tfile-2
14410 local file3=$DIR/$tdir/$tfile-3
14414 mkdir -p $DIR/$tdir
14415 touch $file1 || error "create $file1 failed"
14416 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14417 error "create $file2 failed"
14418 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14419 error "create $file3 failed"
14420 lovea1=$(get_layout_param $file1)
14422 $LFS swap_layouts $file2 $file3 ||
14423 error "swap $file2 $file3 layouts failed"
14424 $LFS swap_layouts $file1 $file2 ||
14425 error "swap $file1 $file2 layouts failed"
14427 lovea2=$(get_layout_param $file2)
14430 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14432 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14433 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14435 run_test 184d "allow stripeless layouts swap"
14438 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14439 skip "Need MDS version at least 2.6.94"
14440 check_swap_layouts_support
14441 [ -z "$(which getfattr 2>/dev/null)" ] &&
14442 skip_env "no getfattr command"
14444 local file1=$DIR/$tdir/$tfile-1
14445 local file2=$DIR/$tdir/$tfile-2
14446 local file3=$DIR/$tdir/$tfile-3
14449 mkdir -p $DIR/$tdir
14450 touch $file1 || error "create $file1 failed"
14451 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14452 error "create $file2 failed"
14453 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14454 error "create $file3 failed"
14456 $LFS swap_layouts $file1 $file2 ||
14457 error "swap $file1 $file2 layouts failed"
14459 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14460 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14462 echo 123 > $file1 || error "Should be able to write into $file1"
14464 $LFS swap_layouts $file1 $file3 ||
14465 error "swap $file1 $file3 layouts failed"
14467 echo 123 > $file1 || error "Should be able to write into $file1"
14469 rm -rf $file1 $file2 $file3
14471 run_test 184e "Recreate layout after stripeless layout swaps"
14474 # Create a file with name longer than sizeof(struct stat) ==
14475 # 144 to see if we can get chars from the file name to appear
14476 # in the returned striping. Note that 'f' == 0x66.
14477 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
14479 mkdir -p $DIR/$tdir
14480 mcreate $DIR/$tdir/$file
14481 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
14482 error "IOC_MDC_GETFILEINFO returned garbage striping"
14485 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
14487 test_185() { # LU-2441
14488 # LU-3553 - no volatile file support in old servers
14489 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
14490 skip "Need MDS version at least 2.3.60"
14492 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14493 touch $DIR/$tdir/spoo
14494 local mtime1=$(stat -c "%Y" $DIR/$tdir)
14495 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
14496 error "cannot create/write a volatile file"
14497 [ "$FILESET" == "" ] &&
14498 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
14499 error "FID is still valid after close"
14501 multiop_bg_pause $DIR/$tdir vVw4096_c
14508 # assume that the next FID for this client is sequential, since stdout
14509 # is unfortunately eaten by multiop_bg_pause
14510 local n=$((${fidv[1]} + 1))
14511 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
14512 if [ "$FILESET" == "" ]; then
14513 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
14514 error "FID is missing before close"
14516 kill -USR1 $multi_pid
14517 # 1 second delay, so if mtime change we will see it
14519 local mtime2=$(stat -c "%Y" $DIR/$tdir)
14520 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
14522 run_test 185 "Volatile file support"
14524 function create_check_volatile() {
14528 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
14531 local FID=$(cat /tmp/${tfile}.fid)
14532 [ "$FID" == "" ] && error "can't get FID for volatile"
14533 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
14534 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
14535 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
14539 cancel_lru_locks mdc # flush opencache
14540 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
14545 # LU-12516 - volatile creation via .lustre
14546 [[ $MDS1_VERSION -ge $(version_code 2.12.2) ]] ||
14547 skip "Need MDS version at least 2.12.2"
14549 create_check_volatile 0
14550 [ $MDSCOUNT -lt 2 ] && return 0
14553 create_check_volatile 1
14557 run_test 185a "Volatile file creation in .lustre/fid/"
14560 remote_mds_nodsh && skip "remote MDS with nodsh"
14561 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14562 skip "Need MDS version at least 2.3.0"
14564 local dir0=$DIR/$tdir/$testnum
14565 mkdir -p $dir0 || error "creating dir $dir0"
14567 local file=$dir0/file1
14568 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
14569 local dv1=$($LFS data_version $file)
14570 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
14571 local dv2=$($LFS data_version $file)
14572 [[ $dv1 != $dv2 ]] ||
14573 error "data version did not change on write $dv1 == $dv2"
14578 run_test 187a "Test data version change"
14581 remote_mds_nodsh && skip "remote MDS with nodsh"
14582 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14583 skip "Need MDS version at least 2.3.0"
14585 local dir0=$DIR/$tdir/$testnum
14586 mkdir -p $dir0 || error "creating dir $dir0"
14588 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
14589 [[ ${DV[0]} != ${DV[1]} ]] ||
14590 error "data version did not change on write"\
14591 " ${DV[0]} == ${DV[1]}"
14596 run_test 187b "Test data version change on volatile file"
14599 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14600 remote_mgs_nodsh && skip "remote MGS with nodsh"
14601 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
14603 local POOL=${POOL:-cea1}
14604 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
14605 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
14608 local last_ost=$(($OSTCOUNT - 1))
14610 local ost_list=$(seq $first_ost $ost_step $last_ost)
14611 local ost_range="$first_ost $last_ost $ost_step"
14612 local test_path=$POOL_ROOT/$POOL_DIR_NAME
14613 local file_dir=$POOL_ROOT/file_tst
14614 local subdir=$test_path/subdir
14618 # former test_200a test_200b
14619 pool_add $POOL || { rc=$? ; break; }
14620 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
14621 # former test_200c test_200d
14622 mkdir -p $test_path
14623 pool_set_dir $POOL $test_path || { rc=$? ; break; }
14624 pool_check_dir $POOL $test_path || { rc=$? ; break; }
14626 pool_check_dir $POOL $subdir || { rc=$? ; break; }
14627 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
14628 || { rc=$? ; break; }
14629 # former test_200e test_200f
14630 local files=$((OSTCOUNT*3))
14631 pool_alloc_files $POOL $test_path $files "$ost_list" \
14632 || { rc=$? ; break; }
14633 pool_create_files $POOL $file_dir $files "$ost_list" \
14634 || { rc=$? ; break; }
14635 # former test_200g test_200h
14636 pool_lfs_df $POOL || { rc=$? ; break; }
14637 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
14639 # former test_201a test_201b test_201c
14640 pool_remove_first_target $POOL || { rc=$? ; break; }
14642 local f=$test_path/$tfile
14643 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
14644 pool_remove $POOL $f || { rc=$? ; break; }
14652 run_test 200 "OST pools"
14654 # usage: default_attr <count | size | offset>
14656 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
14659 # usage: check_default_stripe_attr
14660 check_default_stripe_attr() {
14661 ACTUAL=$($GETSTRIPE $* $DIR/$tdir)
14664 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
14666 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
14670 error "unknown getstripe attr '$1'"
14673 [ $ACTUAL == $EXPECTED ] ||
14674 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
14678 test_mkdir $DIR/$tdir
14679 $SETSTRIPE --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
14681 check_default_stripe_attr --stripe-count
14682 check_default_stripe_attr --stripe-size
14683 check_default_stripe_attr --stripe-index
14685 run_test 204a "Print default stripe attributes"
14688 test_mkdir $DIR/$tdir
14689 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14691 check_default_stripe_attr --stripe-size
14692 check_default_stripe_attr --stripe-index
14694 run_test 204b "Print default stripe size and offset"
14697 test_mkdir $DIR/$tdir
14698 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14700 check_default_stripe_attr --stripe-count
14701 check_default_stripe_attr --stripe-index
14703 run_test 204c "Print default stripe count and offset"
14706 test_mkdir $DIR/$tdir
14707 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14709 check_default_stripe_attr --stripe-count
14710 check_default_stripe_attr --stripe-size
14712 run_test 204d "Print default stripe count and size"
14715 test_mkdir $DIR/$tdir
14716 $SETSTRIPE -d $DIR/$tdir
14718 check_default_stripe_attr --stripe-count --raw
14719 check_default_stripe_attr --stripe-size --raw
14720 check_default_stripe_attr --stripe-index --raw
14722 run_test 204e "Print raw stripe attributes"
14725 test_mkdir $DIR/$tdir
14726 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14728 check_default_stripe_attr --stripe-size --raw
14729 check_default_stripe_attr --stripe-index --raw
14731 run_test 204f "Print raw stripe size and offset"
14734 test_mkdir $DIR/$tdir
14735 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14737 check_default_stripe_attr --stripe-count --raw
14738 check_default_stripe_attr --stripe-index --raw
14740 run_test 204g "Print raw stripe count and offset"
14743 test_mkdir $DIR/$tdir
14744 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14746 check_default_stripe_attr --stripe-count --raw
14747 check_default_stripe_attr --stripe-size --raw
14749 run_test 204h "Print raw stripe count and size"
14751 # Figure out which job scheduler is being used, if any,
14752 # or use a fake one
14753 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
14754 JOBENV=SLURM_JOB_ID
14755 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
14757 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
14759 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
14760 JOBENV=LOADL_STEP_ID
14761 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
14764 $LCTL list_param jobid_name > /dev/null 2>&1
14765 if [ $? -eq 0 ]; then
14771 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
14773 verify_jobstats() {
14778 # we don't really need to clear the stats for this test to work, since each
14779 # command has a unique jobid, but it makes debugging easier if needed.
14780 # for facet in $facets; do
14781 # local dev=$(convert_facet2label $facet)
14782 # # clear old jobstats
14783 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
14786 # use a new JobID for each test, or we might see an old one
14787 [ "$JOBENV" = "FAKE_JOBID" ] &&
14788 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
14790 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
14792 [ "$JOBENV" = "nodelocal" ] && {
14793 FAKE_JOBID=id.$testnum.%e.$RANDOM
14794 $LCTL set_param jobid_name=$FAKE_JOBID
14795 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
14798 log "Test: ${cmd[*]}"
14799 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
14801 if [ $JOBENV = "FAKE_JOBID" ]; then
14802 FAKE_JOBID=$JOBVAL ${cmd[*]}
14807 # all files are created on OST0000
14808 for facet in $facets; do
14809 local stats="*.$(convert_facet2label $facet).job_stats"
14811 # strip out libtool wrappers for in-tree executables
14812 if [ $(do_facet $facet lctl get_param $stats |
14813 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
14814 do_facet $facet lctl get_param $stats
14815 error "No jobstats for $JOBVAL found on $facet::$stats"
14821 local new_jobenv=$1
14823 set_persistent_param_and_check client "jobid_var" \
14824 "$FSNAME.sys.jobid_var" $new_jobenv
14827 test_205a() { # Job stats
14828 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14829 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
14830 skip "Need MDS version with at least 2.7.1"
14831 remote_mgs_nodsh && skip "remote MGS with nodsh"
14832 remote_mds_nodsh && skip "remote MDS with nodsh"
14833 remote_ost_nodsh && skip "remote OST with nodsh"
14834 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
14835 skip "Server doesn't support jobstats"
14836 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
14838 local old_jobenv=$($LCTL get_param -n jobid_var)
14839 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
14841 if [[ $PERM_CMD = *"set_param -P"* ]]; then
14842 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
14844 stack_trap "do_facet mgs $PERM_CMD \
14845 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
14849 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
14850 mdt.*.job_cleanup_interval | head -n 1)
14851 local new_interval=5
14852 do_facet $SINGLEMDS \
14853 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
14854 stack_trap "do_facet $SINGLEMDS \
14855 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
14856 local start=$SECONDS
14860 cmd="mkdir $DIR/$tdir"
14861 verify_jobstats "$cmd" "$SINGLEMDS"
14863 cmd="rmdir $DIR/$tdir"
14864 verify_jobstats "$cmd" "$SINGLEMDS"
14865 # mkdir on secondary MDT
14866 if [ $MDSCOUNT -gt 1 ]; then
14867 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
14868 verify_jobstats "$cmd" "mds2"
14871 cmd="mknod $DIR/$tfile c 1 3"
14872 verify_jobstats "$cmd" "$SINGLEMDS"
14874 cmd="rm -f $DIR/$tfile"
14875 verify_jobstats "$cmd" "$SINGLEMDS"
14876 # create all files on OST0000 so verify_jobstats can find OST stats
14878 cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile"
14879 verify_jobstats "$cmd" "$SINGLEMDS"
14881 cmd="touch $DIR/$tfile"
14882 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14884 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
14885 verify_jobstats "$cmd" "ost1"
14887 cancel_lru_locks osc
14888 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
14889 verify_jobstats "$cmd" "ost1"
14891 cmd="$TRUNCATE $DIR/$tfile 0"
14892 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14894 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
14895 verify_jobstats "$cmd" "$SINGLEMDS"
14896 # jobstats expiry - sleep until old stats should be expired
14897 local left=$((new_interval + 5 - (SECONDS - start)))
14898 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
14899 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
14901 cmd="mkdir $DIR/$tdir.expire"
14902 verify_jobstats "$cmd" "$SINGLEMDS"
14903 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
14904 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
14906 # Ensure that jobid are present in changelog (if supported by MDS)
14907 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
14908 changelog_dump | tail -10
14909 jobids=$(changelog_dump | tail -9 | grep -c "j=")
14910 [ $jobids -eq 9 ] ||
14911 error "Wrong changelog jobid count $jobids != 9"
14915 jobstats_set $JOBENV
14917 changelog_dump | grep $tfile
14918 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
14919 [ $jobids -eq 0 ] ||
14920 error "Unexpected jobids when jobid_var=$JOBENV"
14923 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
14924 JOBENV="JOBCOMPLEX"
14925 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
14927 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
14929 run_test 205a "Verify job stats"
14933 $LCTL set_param jobid_var=USER jobid_name="%e.%u"
14934 env -i USERTESTJOBSTATS=foolish touch $DIR/$tfile.1
14935 do_facet $SINGLEMDS $LCTL get_param mdt.*.job_stats |
14936 grep job_id: | grep foolish &&
14937 error "Unexpected jobid found"
14940 run_test 205b "Verify job stats jobid parsing"
14942 # LU-1480, LU-1773 and LU-1657
14944 mkdir -p $DIR/$tdir
14945 $SETSTRIPE -c -1 $DIR/$tdir
14946 #define OBD_FAIL_LOV_INIT 0x1403
14947 $LCTL set_param fail_loc=0xa0001403
14948 $LCTL set_param fail_val=1
14949 touch $DIR/$tdir/$tfile || true
14951 run_test 206 "fail lov_init_raid0() doesn't lbug"
14954 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14955 local fsz=`stat -c %s $DIR/$tfile`
14956 cancel_lru_locks mdc
14958 # do not return layout in getattr intent
14959 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
14960 $LCTL set_param fail_loc=0x170
14961 local sz=`stat -c %s $DIR/$tfile`
14963 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
14967 run_test 207a "can refresh layout at glimpse"
14970 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14971 local cksum=`md5sum $DIR/$tfile`
14972 local fsz=`stat -c %s $DIR/$tfile`
14973 cancel_lru_locks mdc
14974 cancel_lru_locks osc
14976 # do not return layout in getattr intent
14977 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
14978 $LCTL set_param fail_loc=0x171
14980 # it will refresh layout after the file is opened but before read issues
14981 echo checksum is "$cksum"
14982 echo "$cksum" |md5sum -c --quiet || error "file differs"
14986 run_test 207b "can refresh layout at open"
14989 # FIXME: in this test suite, only RD lease is used. This is okay
14990 # for now as only exclusive open is supported. After generic lease
14991 # is done, this test suite should be revised. - Jinshan
14993 remote_mds_nodsh && skip "remote MDS with nodsh"
14994 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
14995 skip "Need MDS version at least 2.4.52"
14997 echo "==== test 1: verify get lease work"
14998 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
15000 echo "==== test 2: verify lease can be broken by upcoming open"
15001 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15005 $MULTIOP $DIR/$tfile oO_RDONLY:c
15006 kill -USR1 $PID && wait $PID || error "break lease error"
15008 echo "==== test 3: verify lease can't be granted if an open already exists"
15009 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
15013 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
15014 kill -USR1 $PID && wait $PID || error "open file error"
15016 echo "==== test 4: lease can sustain over recovery"
15017 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
15023 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
15025 echo "==== test 5: lease broken can't be regained by replay"
15026 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15030 # open file to break lease and then recovery
15031 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
15034 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
15038 run_test 208 "Exclusive open"
15041 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
15042 skip_env "must have disp_stripe"
15045 sync; sleep 5; sync;
15047 echo 3 > /proc/sys/vm/drop_caches
15048 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15050 # open/close 500 times
15051 for i in $(seq 500); do
15055 echo 3 > /proc/sys/vm/drop_caches
15056 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15058 echo "before: $req_before, after: $req_after"
15059 [ $((req_after - req_before)) -ge 300 ] &&
15060 error "open/close requests are not freed"
15063 run_test 209 "read-only open/close requests should be freed promptly"
15067 size=$((size % 8192 + 1))
15068 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
15069 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
15070 rm -f $DIR/f212 $DIR/f212.xyz
15072 run_test 212 "Sendfile test ============================================"
15075 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
15076 cancel_lru_locks osc
15077 lctl set_param fail_loc=0x8000040f
15078 # generate a read lock
15079 cat $DIR/$tfile > /dev/null
15080 # write to the file, it will try to cancel the above read lock.
15081 cat /etc/hosts >> $DIR/$tfile
15083 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
15085 test_214() { # for bug 20133
15086 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
15087 for (( i=0; i < 340; i++ )) ; do
15088 touch $DIR/$tdir/d214c/a$i
15091 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
15092 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
15093 ls $DIR/d214c || error "ls $DIR/d214c failed"
15094 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
15095 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
15097 run_test 214 "hash-indexed directory test - bug 20133"
15099 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
15100 create_lnet_proc_files() {
15101 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
15104 # counterpart of create_lnet_proc_files
15105 remove_lnet_proc_files() {
15106 rm -f $TMP/lnet_$1.sys
15109 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15110 # 3rd arg as regexp for body
15111 check_lnet_proc_stats() {
15112 local l=$(cat "$TMP/lnet_$1" |wc -l)
15113 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
15115 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
15118 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15119 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
15120 # optional and can be regexp for 2nd line (lnet.routes case)
15121 check_lnet_proc_entry() {
15122 local blp=2 # blp stands for 'position of 1st line of body'
15123 [ -z "$5" ] || blp=3 # lnet.routes case
15125 local l=$(cat "$TMP/lnet_$1" |wc -l)
15126 # subtracting one from $blp because the body can be empty
15127 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
15129 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
15130 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
15132 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
15133 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
15135 # bail out if any unexpected line happened
15136 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
15137 [ "$?" != 0 ] || error "$2 misformatted"
15140 test_215() { # for bugs 18102, 21079, 21517
15141 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15143 local N='(0|[1-9][0-9]*)' # non-negative numeric
15144 local P='[1-9][0-9]*' # positive numeric
15145 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
15146 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
15147 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
15148 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
15150 local L1 # regexp for 1st line
15151 local L2 # regexp for 2nd line (optional)
15152 local BR # regexp for the rest (body)
15154 # lnet.stats should look as 11 space-separated non-negative numerics
15155 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
15156 create_lnet_proc_files "stats"
15157 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
15158 remove_lnet_proc_files "stats"
15160 # lnet.routes should look like this:
15161 # Routing disabled/enabled
15162 # net hops priority state router
15163 # where net is a string like tcp0, hops > 0, priority >= 0,
15164 # state is up/down,
15165 # router is a string like 192.168.1.1@tcp2
15166 L1="^Routing (disabled|enabled)$"
15167 L2="^net +hops +priority +state +router$"
15168 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
15169 create_lnet_proc_files "routes"
15170 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
15171 remove_lnet_proc_files "routes"
15173 # lnet.routers should look like this:
15174 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
15175 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
15176 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
15177 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
15178 L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
15179 BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
15180 create_lnet_proc_files "routers"
15181 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
15182 remove_lnet_proc_files "routers"
15184 # lnet.peers should look like this:
15185 # nid refs state last max rtr min tx min queue
15186 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
15187 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
15188 # numeric (0 or >0 or <0), queue >= 0.
15189 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
15190 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
15191 create_lnet_proc_files "peers"
15192 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
15193 remove_lnet_proc_files "peers"
15195 # lnet.buffers should look like this:
15196 # pages count credits min
15197 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
15198 L1="^pages +count +credits +min$"
15199 BR="^ +$N +$N +$I +$I$"
15200 create_lnet_proc_files "buffers"
15201 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
15202 remove_lnet_proc_files "buffers"
15204 # lnet.nis should look like this:
15205 # nid status alive refs peer rtr max tx min
15206 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
15207 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
15208 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
15209 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
15210 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
15211 create_lnet_proc_files "nis"
15212 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
15213 remove_lnet_proc_files "nis"
15215 # can we successfully write to lnet.stats?
15216 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
15218 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
15220 test_216() { # bug 20317
15221 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15222 remote_ost_nodsh && skip "remote OST with nodsh"
15225 local facets=$(get_facets OST)
15226 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15228 save_lustre_params client "osc.*.contention_seconds" > $p
15229 save_lustre_params $facets \
15230 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
15231 save_lustre_params $facets \
15232 "ldlm.namespaces.filter-*.contended_locks" >> $p
15233 save_lustre_params $facets \
15234 "ldlm.namespaces.filter-*.contention_seconds" >> $p
15235 clear_stats osc.*.osc_stats
15237 # agressive lockless i/o settings
15238 do_nodes $(comma_list $(osts_nodes)) \
15239 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
15240 ldlm.namespaces.filter-*.contended_locks=0 \
15241 ldlm.namespaces.filter-*.contention_seconds=60"
15242 lctl set_param -n osc.*.contention_seconds=60
15244 $DIRECTIO write $DIR/$tfile 0 10 4096
15245 $CHECKSTAT -s 40960 $DIR/$tfile
15247 # disable lockless i/o
15248 do_nodes $(comma_list $(osts_nodes)) \
15249 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
15250 ldlm.namespaces.filter-*.contended_locks=32 \
15251 ldlm.namespaces.filter-*.contention_seconds=0"
15252 lctl set_param -n osc.*.contention_seconds=0
15253 clear_stats osc.*.osc_stats
15255 dd if=/dev/zero of=$DIR/$tfile count=0
15256 $CHECKSTAT -s 0 $DIR/$tfile
15258 restore_lustre_params <$p
15262 run_test 216 "check lockless direct write updates file size and kms correctly"
15264 test_217() { # bug 22430
15265 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15270 for node in $(nodes_list); do
15271 nid=$(host_nids_address $node $NETTYPE)
15272 if [[ $nid = *-* ]] ; then
15273 echo "lctl ping $(h2nettype $nid)"
15274 lctl ping $(h2nettype $nid)
15276 echo "skipping $node (no hyphen detected)"
15280 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
15283 # do directio so as not to populate the page cache
15284 log "creating a 10 Mb file"
15285 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
15286 log "starting reads"
15287 dd if=$DIR/$tfile of=/dev/null bs=4096 &
15288 log "truncating the file"
15289 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
15291 kill %+ || true # reads might have finished
15292 echo "wait until dd is finished"
15294 log "removing the temporary file"
15295 rm -rf $DIR/$tfile || error "tmp file removal failed"
15297 run_test 218 "parallel read and truncate should not deadlock"
15300 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15302 # write one partial page
15303 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
15304 # set no grant so vvp_io_commit_write will do sync write
15305 $LCTL set_param fail_loc=0x411
15306 # write a full page at the end of file
15307 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
15309 $LCTL set_param fail_loc=0
15310 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
15311 $LCTL set_param fail_loc=0x411
15312 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
15315 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
15316 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
15318 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
15320 test_220() { #LU-325
15321 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15322 remote_ost_nodsh && skip "remote OST with nodsh"
15323 remote_mds_nodsh && skip "remote MDS with nodsh"
15324 remote_mgs_nodsh && skip "remote MGS with nodsh"
15328 # create on MDT0000 so the last_id and next_id are correct
15330 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
15334 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
15335 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
15336 osp.$mdtosc_proc1.prealloc_last_id)
15337 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15338 osp.$mdtosc_proc1.prealloc_next_id)
15342 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15343 #define OBD_FAIL_OST_ENOINO 0x229
15344 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15345 create_pool $FSNAME.$TESTNAME || return 1
15346 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15348 $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15350 MDSOBJS=$((last_id - next_id))
15351 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15353 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15354 echo "OST still has $count kbytes free"
15356 echo "create $MDSOBJS files @next_id..."
15357 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15359 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15360 osp.$mdtosc_proc1.prealloc_last_id)
15361 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15362 osp.$mdtosc_proc1.prealloc_next_id)
15364 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15369 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15370 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15372 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15373 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15374 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15375 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15376 echo "unlink $MDSOBJS files @$next_id..."
15377 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15379 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15382 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15384 dd if=`which date` of=$MOUNT/date oflag=sync
15385 chmod +x $MOUNT/date
15387 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15388 $LCTL set_param fail_loc=0x80001401
15390 $MOUNT/date > /dev/null
15393 run_test 221 "make sure fault and truncate race to not cause OOM"
15396 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15399 test_mkdir $DIR/$tdir
15400 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15401 createmany -o $DIR/$tdir/$tfile 10
15402 cancel_lru_locks mdc
15403 cancel_lru_locks osc
15404 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15405 $LCTL set_param fail_loc=0x31a
15406 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15407 $LCTL set_param fail_loc=0
15410 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15413 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15416 test_mkdir $DIR/$tdir
15417 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15418 createmany -o $DIR/$tdir/$tfile 10
15419 cancel_lru_locks mdc
15420 cancel_lru_locks osc
15421 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15422 $LCTL set_param fail_loc=0x31a
15423 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15424 $LCTL set_param fail_loc=0
15426 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15429 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15432 test_mkdir $DIR/$tdir
15433 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15434 createmany -o $DIR/$tdir/$tfile 10
15435 cancel_lru_locks mdc
15436 cancel_lru_locks osc
15437 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15438 $LCTL set_param fail_loc=0x31b
15439 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15440 $LCTL set_param fail_loc=0
15443 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15445 test_224a() { # LU-1039, MRP-303
15446 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15448 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15449 $LCTL set_param fail_loc=0x508
15450 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15451 $LCTL set_param fail_loc=0
15454 run_test 224a "Don't panic on bulk IO failure"
15456 test_224b() { # LU-1039, MRP-303
15457 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15459 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15460 cancel_lru_locks osc
15461 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15462 $LCTL set_param fail_loc=0x515
15463 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15464 $LCTL set_param fail_loc=0
15467 run_test 224b "Don't panic on bulk IO failure"
15469 test_224c() { # LU-6441
15470 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15471 remote_mds_nodsh && skip "remote MDS with nodsh"
15473 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15474 save_writethrough $p
15475 set_cache writethrough on
15477 local pages_per_rpc=$($LCTL get_param \
15478 osc.*.max_pages_per_rpc)
15479 local at_max=$($LCTL get_param -n at_max)
15480 local timeout=$($LCTL get_param -n timeout)
15481 local test_at="at_max"
15482 local param_at="$FSNAME.sys.at_max"
15483 local test_timeout="timeout"
15484 local param_timeout="$FSNAME.sys.timeout"
15486 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
15488 set_persistent_param_and_check client "$test_at" "$param_at" 0
15489 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
15491 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
15492 do_facet ost1 $LCTL set_param fail_loc=0x520
15493 $LFS setstripe -c 1 -i 0 $DIR/$tfile
15494 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
15496 do_facet ost1 $LCTL set_param fail_loc=0
15498 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
15499 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
15502 $LCTL set_param -n $pages_per_rpc
15503 restore_lustre_params < $p
15506 run_test 224c "Don't hang if one of md lost during large bulk RPC"
15508 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
15510 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15511 if [ -z ${MDSSURVEY} ]; then
15512 skip_env "mds-survey not found"
15514 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15515 skip "Need MDS version at least 2.2.51"
15517 local mds=$(facet_host $SINGLEMDS)
15518 local target=$(do_nodes $mds 'lctl dl' |
15519 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15521 local cmd1="file_count=1000 thrhi=4"
15522 local cmd2="dir_count=2 layer=mdd stripe_count=0"
15523 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15524 local cmd="$cmd1 $cmd2 $cmd3"
15526 rm -f ${TMP}/mds_survey*
15528 eval $cmd || error "mds-survey with zero-stripe failed"
15529 cat ${TMP}/mds_survey*
15530 rm -f ${TMP}/mds_survey*
15532 run_test 225a "Metadata survey sanity with zero-stripe"
15535 if [ -z ${MDSSURVEY} ]; then
15536 skip_env "mds-survey not found"
15538 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15539 skip "Need MDS version at least 2.2.51"
15540 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15541 remote_mds_nodsh && skip "remote MDS with nodsh"
15542 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
15543 skip_env "Need to mount OST to test"
15546 local mds=$(facet_host $SINGLEMDS)
15547 local target=$(do_nodes $mds 'lctl dl' |
15548 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15550 local cmd1="file_count=1000 thrhi=4"
15551 local cmd2="dir_count=2 layer=mdd stripe_count=1"
15552 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15553 local cmd="$cmd1 $cmd2 $cmd3"
15555 rm -f ${TMP}/mds_survey*
15557 eval $cmd || error "mds-survey with stripe_count failed"
15558 cat ${TMP}/mds_survey*
15559 rm -f ${TMP}/mds_survey*
15561 run_test 225b "Metadata survey sanity with stripe_count = 1"
15563 mcreate_path2fid () {
15569 local path=$DIR/$tdir/$name
15574 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
15575 error "cannot create $desc"
15577 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
15579 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
15581 fid_path=$($LFS fid2path $MOUNT $fid)
15583 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
15585 [ "$path" == "$fid_path" ] ||
15586 error "fid2path returned $fid_path, expected $path"
15588 echo "pass with $path and $fid"
15593 mkdir -p $DIR/$tdir
15595 mcreate_path2fid 0010666 0 0 fifo "FIFO"
15596 mcreate_path2fid 0020666 1 3 null "character special file (null)"
15597 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
15598 mcreate_path2fid 0040666 0 0 dir "directory"
15599 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
15600 mcreate_path2fid 0100666 0 0 file "regular file"
15601 mcreate_path2fid 0120666 0 0 link "symbolic link"
15602 mcreate_path2fid 0140666 0 0 sock "socket"
15604 run_test 226a "call path2fid and fid2path on files of all type"
15607 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15612 mkdir -p $DIR/$tdir
15613 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
15614 error "create remote directory failed"
15615 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
15616 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
15617 "character special file (null)"
15618 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
15619 "character special file (no device)"
15620 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
15621 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
15622 "block special file (loop)"
15623 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
15624 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
15625 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
15627 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
15629 # LU-1299 Executing or running ldd on a truncated executable does not
15630 # cause an out-of-memory condition.
15632 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15633 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
15635 dd if=$(which date) of=$MOUNT/date bs=1k count=1
15636 chmod +x $MOUNT/date
15638 $MOUNT/date > /dev/null
15639 ldd $MOUNT/date > /dev/null
15642 run_test 227 "running truncated executable does not cause OOM"
15644 # LU-1512 try to reuse idle OI blocks
15646 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15647 remote_mds_nodsh && skip "remote MDS with nodsh"
15648 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15650 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15651 local myDIR=$DIR/$tdir
15654 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15655 $LCTL set_param fail_loc=0x80001002
15656 createmany -o $myDIR/t- 10000
15657 $LCTL set_param fail_loc=0
15658 # The guard is current the largest FID holder
15660 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15662 local IDX=$(($SEQ % 64))
15664 do_facet $SINGLEMDS sync
15665 # Make sure journal flushed.
15667 local blk1=$(do_facet $SINGLEMDS \
15668 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15669 grep Blockcount | awk '{print $4}')
15671 # Remove old files, some OI blocks will become idle.
15672 unlinkmany $myDIR/t- 10000
15673 # Create new files, idle OI blocks should be reused.
15674 createmany -o $myDIR/t- 2000
15675 do_facet $SINGLEMDS sync
15676 # Make sure journal flushed.
15678 local blk2=$(do_facet $SINGLEMDS \
15679 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15680 grep Blockcount | awk '{print $4}')
15682 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15684 run_test 228a "try to reuse idle OI blocks"
15687 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15688 remote_mds_nodsh && skip "remote MDS with nodsh"
15689 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15691 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15692 local myDIR=$DIR/$tdir
15695 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15696 $LCTL set_param fail_loc=0x80001002
15697 createmany -o $myDIR/t- 10000
15698 $LCTL set_param fail_loc=0
15699 # The guard is current the largest FID holder
15701 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15703 local IDX=$(($SEQ % 64))
15705 do_facet $SINGLEMDS sync
15706 # Make sure journal flushed.
15708 local blk1=$(do_facet $SINGLEMDS \
15709 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15710 grep Blockcount | awk '{print $4}')
15712 # Remove old files, some OI blocks will become idle.
15713 unlinkmany $myDIR/t- 10000
15716 stop $SINGLEMDS || error "Fail to stop MDT."
15718 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
15720 df $MOUNT || error "Fail to df."
15721 # Create new files, idle OI blocks should be reused.
15722 createmany -o $myDIR/t- 2000
15723 do_facet $SINGLEMDS sync
15724 # Make sure journal flushed.
15726 local blk2=$(do_facet $SINGLEMDS \
15727 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15728 grep Blockcount | awk '{print $4}')
15730 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15732 run_test 228b "idle OI blocks can be reused after MDT restart"
15736 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15737 remote_mds_nodsh && skip "remote MDS with nodsh"
15738 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15740 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15741 local myDIR=$DIR/$tdir
15744 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15745 $LCTL set_param fail_loc=0x80001002
15746 # 20000 files can guarantee there are index nodes in the OI file
15747 createmany -o $myDIR/t- 20000
15748 $LCTL set_param fail_loc=0
15749 # The guard is current the largest FID holder
15751 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15753 local IDX=$(($SEQ % 64))
15755 do_facet $SINGLEMDS sync
15756 # Make sure journal flushed.
15758 local blk1=$(do_facet $SINGLEMDS \
15759 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15760 grep Blockcount | awk '{print $4}')
15762 # Remove old files, some OI blocks will become idle.
15763 unlinkmany $myDIR/t- 20000
15765 # The OI file should become empty now
15767 # Create new files, idle OI blocks should be reused.
15768 createmany -o $myDIR/t- 2000
15769 do_facet $SINGLEMDS sync
15770 # Make sure journal flushed.
15772 local blk2=$(do_facet $SINGLEMDS \
15773 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15774 grep Blockcount | awk '{print $4}')
15776 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15778 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
15780 test_229() { # LU-2482, LU-3448
15781 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15782 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
15783 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
15784 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
15788 # Create a file with a released layout and stripe count 2.
15789 $MULTIOP $DIR/$tfile H2c ||
15790 error "failed to create file with released layout"
15792 $GETSTRIPE -v $DIR/$tfile
15794 local pattern=$($GETSTRIPE -L $DIR/$tfile)
15795 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
15797 local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
15798 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
15799 stat $DIR/$tfile || error "failed to stat released file"
15801 chown $RUNAS_ID $DIR/$tfile ||
15802 error "chown $RUNAS_ID $DIR/$tfile failed"
15804 chgrp $RUNAS_ID $DIR/$tfile ||
15805 error "chgrp $RUNAS_ID $DIR/$tfile failed"
15807 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
15808 rm $DIR/$tfile || error "failed to remove released file"
15810 run_test 229 "getstripe/stat/rm/attr changes work on released files"
15813 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15814 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15815 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15816 skip "Need MDS version at least 2.11.52"
15820 test_mkdir $DIR/$tdir
15821 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
15822 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
15823 [ $mdt_idx -ne 0 ] &&
15824 error "create local directory on wrong MDT $mdt_idx"
15826 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
15827 error "create remote directory failed"
15828 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
15829 [ $mdt_idx -ne $MDTIDX ] &&
15830 error "create remote directory on wrong MDT $mdt_idx"
15832 createmany -o $DIR/$tdir/test_230/t- 10 ||
15833 error "create files on remote directory failed"
15834 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
15835 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
15836 rm -r $DIR/$tdir || error "unlink remote directory failed"
15838 run_test 230a "Create remote directory and files under the remote directory"
15841 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15842 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15843 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15844 skip "Need MDS version at least 2.11.52"
15852 local migrate_dir=$DIR/$tdir/migrate_dir
15853 local other_dir=$DIR/$tdir/other_dir
15855 test_mkdir $DIR/$tdir
15856 test_mkdir -i0 -c1 $migrate_dir
15857 test_mkdir -i0 -c1 $other_dir
15858 for ((i=0; i<10; i++)); do
15859 mkdir -p $migrate_dir/dir_${i}
15860 createmany -o $migrate_dir/dir_${i}/f 10 ||
15861 error "create files under remote dir failed $i"
15864 cp /etc/passwd $migrate_dir/$tfile
15865 cp /etc/passwd $other_dir/$tfile
15866 chattr +SAD $migrate_dir
15867 chattr +SAD $migrate_dir/$tfile
15869 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15870 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15871 local old_dir_mode=$(stat -c%f $migrate_dir)
15872 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
15874 mkdir -p $migrate_dir/dir_default_stripe2
15875 $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2
15876 $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2
15878 mkdir -p $other_dir
15879 ln $migrate_dir/$tfile $other_dir/luna
15880 ln $migrate_dir/$tfile $migrate_dir/sofia
15881 ln $other_dir/$tfile $migrate_dir/david
15882 ln -s $migrate_dir/$tfile $other_dir/zachary
15883 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
15884 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
15890 for len in 58 59 60; do
15891 lnktgt=$(str_repeat 'l' $len)
15892 touch $migrate_dir/$lnktgt
15893 ln -s $lnktgt $migrate_dir/${len}char_ln
15897 for len in 4094 4095; do
15898 lnktgt=$(str_repeat 'l' $len)
15899 ln -s $lnktgt $migrate_dir/${len}char_ln
15903 for len in 254 255; do
15904 touch $migrate_dir/$(str_repeat 'l' $len)
15907 $LFS migrate -m $MDTIDX $migrate_dir ||
15908 error "fails on migrating remote dir to MDT1"
15910 echo "migratate to MDT1, then checking.."
15911 for ((i = 0; i < 10; i++)); do
15912 for file in $(find $migrate_dir/dir_${i}); do
15913 mdt_index=$($LFS getstripe -m $file)
15914 # broken symlink getstripe will fail
15915 [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
15916 error "$file is not on MDT${MDTIDX}"
15920 # the multiple link file should still in MDT0
15921 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
15922 [ $mdt_index == 0 ] ||
15923 error "$file is not on MDT${MDTIDX}"
15925 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15926 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15927 error " expect $old_dir_flag get $new_dir_flag"
15929 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15930 [ "$old_file_flag" = "$new_file_flag" ] ||
15931 error " expect $old_file_flag get $new_file_flag"
15933 local new_dir_mode=$(stat -c%f $migrate_dir)
15934 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15935 error "expect mode $old_dir_mode get $new_dir_mode"
15937 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15938 [ "$old_file_mode" = "$new_file_mode" ] ||
15939 error "expect mode $old_file_mode get $new_file_mode"
15941 diff /etc/passwd $migrate_dir/$tfile ||
15942 error "$tfile different after migration"
15944 diff /etc/passwd $other_dir/luna ||
15945 error "luna different after migration"
15947 diff /etc/passwd $migrate_dir/sofia ||
15948 error "sofia different after migration"
15950 diff /etc/passwd $migrate_dir/david ||
15951 error "david different after migration"
15953 diff /etc/passwd $other_dir/zachary ||
15954 error "zachary different after migration"
15956 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15957 error "${tfile}_ln different after migration"
15959 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15960 error "${tfile}_ln_other different after migration"
15962 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
15963 [ $stripe_count = 2 ] ||
15964 error "dir strpe_count $d != 2 after migration."
15966 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
15967 [ $stripe_count = 2 ] ||
15968 error "file strpe_count $d != 2 after migration."
15970 #migrate back to MDT0
15973 $LFS migrate -m $MDTIDX $migrate_dir ||
15974 error "fails on migrating remote dir to MDT0"
15976 echo "migrate back to MDT0, checking.."
15977 for file in $(find $migrate_dir); do
15978 mdt_index=$($LFS getstripe -m $file)
15979 [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
15980 error "$file is not on MDT${MDTIDX}"
15983 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15984 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15985 error " expect $old_dir_flag get $new_dir_flag"
15987 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15988 [ "$old_file_flag" = "$new_file_flag" ] ||
15989 error " expect $old_file_flag get $new_file_flag"
15991 local new_dir_mode=$(stat -c%f $migrate_dir)
15992 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15993 error "expect mode $old_dir_mode get $new_dir_mode"
15995 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15996 [ "$old_file_mode" = "$new_file_mode" ] ||
15997 error "expect mode $old_file_mode get $new_file_mode"
15999 diff /etc/passwd ${migrate_dir}/$tfile ||
16000 error "$tfile different after migration"
16002 diff /etc/passwd ${other_dir}/luna ||
16003 error "luna different after migration"
16005 diff /etc/passwd ${migrate_dir}/sofia ||
16006 error "sofia different after migration"
16008 diff /etc/passwd ${other_dir}/zachary ||
16009 error "zachary different after migration"
16011 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16012 error "${tfile}_ln different after migration"
16014 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16015 error "${tfile}_ln_other different after migration"
16017 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
16018 [ $stripe_count = 2 ] ||
16019 error "dir strpe_count $d != 2 after migration."
16021 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
16022 [ $stripe_count = 2 ] ||
16023 error "file strpe_count $d != 2 after migration."
16025 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16027 run_test 230b "migrate directory"
16030 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16031 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16032 remote_mds_nodsh && skip "remote MDS with nodsh"
16033 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16034 skip "Need MDS version at least 2.11.52"
16040 local migrate_dir=$DIR/$tdir/migrate_dir
16042 #If migrating directory fails in the middle, all entries of
16043 #the directory is still accessiable.
16044 test_mkdir $DIR/$tdir
16045 test_mkdir -i0 -c1 $migrate_dir
16046 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
16048 createmany -o $migrate_dir/f $total ||
16049 error "create files under ${migrate_dir} failed"
16051 # fail after migrating top dir, and this will fail only once, so the
16052 # first sub file migration will fail (currently f3), others succeed.
16053 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
16054 do_facet mds1 lctl set_param fail_loc=0x1801
16055 local t=$(ls $migrate_dir | wc -l)
16056 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
16057 error "migrate should fail"
16058 local u=$(ls $migrate_dir | wc -l)
16059 [ "$u" == "$t" ] || error "$u != $t during migration"
16061 # add new dir/file should succeed
16062 mkdir $migrate_dir/dir ||
16063 error "mkdir failed under migrating directory"
16064 touch $migrate_dir/file ||
16065 error "create file failed under migrating directory"
16067 # add file with existing name should fail
16068 for file in $migrate_dir/f*; do
16069 stat $file > /dev/null || error "stat $file failed"
16070 $OPENFILE -f O_CREAT:O_EXCL $file &&
16071 error "open(O_CREAT|O_EXCL) $file should fail"
16072 $MULTIOP $file m && error "create $file should fail"
16073 touch $DIR/$tdir/remote_dir/$tfile ||
16074 error "touch $tfile failed"
16075 ln $DIR/$tdir/remote_dir/$tfile $file &&
16076 error "link $file should fail"
16077 mdt_index=$($LFS getstripe -m $file)
16078 if [ $mdt_index == 0 ]; then
16079 # file failed to migrate is not allowed to rename to
16080 mv $DIR/$tdir/remote_dir/$tfile $file &&
16081 error "rename to $file should fail"
16083 mv $DIR/$tdir/remote_dir/$tfile $file ||
16084 error "rename to $file failed"
16086 echo hello >> $file || error "write $file failed"
16089 # resume migration with different options should fail
16090 $LFS migrate -m 0 $migrate_dir &&
16091 error "migrate -m 0 $migrate_dir should fail"
16093 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
16094 error "migrate -c 2 $migrate_dir should fail"
16096 # resume migration should succeed
16097 $LFS migrate -m $MDTIDX $migrate_dir ||
16098 error "migrate $migrate_dir failed"
16100 echo "Finish migration, then checking.."
16101 for file in $(find $migrate_dir); do
16102 mdt_index=$($LFS getstripe -m $file)
16103 [ $mdt_index == $MDTIDX ] ||
16104 error "$file is not on MDT${MDTIDX}"
16107 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16109 run_test 230c "check directory accessiblity if migration failed"
16112 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16113 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16114 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16115 skip "Need MDS version at least 2.11.52"
16117 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
16119 local migrate_dir=$DIR/$tdir/migrate_dir
16129 old_index=$((RANDOM % MDSCOUNT))
16130 old_count=$((MDSCOUNT - old_index))
16131 new_index=$((RANDOM % MDSCOUNT))
16132 new_count=$((MDSCOUNT - new_index))
16133 new_hash="all_char"
16135 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
16136 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
16138 test_mkdir $DIR/$tdir
16139 test_mkdir -i $old_index -c $old_count $migrate_dir
16141 for ((i=0; i<100; i++)); do
16142 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
16143 createmany -o $migrate_dir/dir_${i}/f 100 ||
16144 error "create files under remote dir failed $i"
16147 echo -n "Migrate from MDT$old_index "
16148 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
16149 echo -n "to MDT$new_index"
16150 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
16153 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
16154 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
16155 error "migrate remote dir error"
16157 echo "Finish migration, then checking.."
16158 for file in $(find $migrate_dir); do
16159 mdt_index=$($LFS getstripe -m $file)
16160 if [ $mdt_index -lt $new_index ] ||
16161 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
16162 error "$file is on MDT$mdt_index"
16166 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16168 run_test 230d "check migrate big directory"
16171 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16172 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16173 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16174 skip "Need MDS version at least 2.11.52"
16181 mkdir -p $DIR/$tdir
16182 mkdir $DIR/$tdir/migrate_dir
16183 mkdir $DIR/$tdir/other_dir
16184 touch $DIR/$tdir/migrate_dir/a
16185 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
16186 ls $DIR/$tdir/other_dir
16188 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16189 error "migrate dir fails"
16191 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16192 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16194 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16195 [ $mdt_index == 0 ] || error "a is not on MDT0"
16197 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
16198 error "migrate dir fails"
16200 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
16201 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
16203 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16204 [ $mdt_index == 1 ] || error "a is not on MDT1"
16206 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
16207 [ $mdt_index == 1 ] || error "b is not on MDT1"
16209 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16210 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
16212 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
16214 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16216 run_test 230e "migrate mulitple local link files"
16219 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16220 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16221 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16222 skip "Need MDS version at least 2.11.52"
16227 mkdir -p $DIR/$tdir
16228 mkdir $DIR/$tdir/migrate_dir
16229 $LFS mkdir -i1 $DIR/$tdir/other_dir
16230 touch $DIR/$tdir/migrate_dir/a
16231 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
16232 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
16233 ls $DIR/$tdir/other_dir
16235 # a should be migrated to MDT1, since no other links on MDT0
16236 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16237 error "#1 migrate dir fails"
16238 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16239 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16240 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16241 [ $mdt_index == 1 ] || error "a is not on MDT1"
16243 # a should stay on MDT1, because it is a mulitple link file
16244 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16245 error "#2 migrate dir fails"
16246 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16247 [ $mdt_index == 1 ] || error "a is not on MDT1"
16249 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16250 error "#3 migrate dir fails"
16252 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16253 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
16254 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
16256 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
16257 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
16259 # a should be migrated to MDT0, since no other links on MDT1
16260 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16261 error "#4 migrate dir fails"
16262 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16263 [ $mdt_index == 0 ] || error "a is not on MDT0"
16265 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16267 run_test 230f "migrate mulitple remote link files"
16270 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16271 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16272 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16273 skip "Need MDS version at least 2.11.52"
16275 mkdir -p $DIR/$tdir/migrate_dir
16277 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
16278 error "migrating dir to non-exist MDT succeeds"
16281 run_test 230g "migrate dir to non-exist MDT"
16284 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16285 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16286 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16287 skip "Need MDS version at least 2.11.52"
16291 mkdir -p $DIR/$tdir/migrate_dir
16293 $LFS migrate -m1 $DIR &&
16294 error "migrating mountpoint1 should fail"
16296 $LFS migrate -m1 $DIR/$tdir/.. &&
16297 error "migrating mountpoint2 should fail"
16300 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
16301 error "migrating $tdir/migrate_dir/.. should fail"
16305 run_test 230h "migrate .. and root"
16308 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16309 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16310 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16311 skip "Need MDS version at least 2.11.52"
16313 mkdir -p $DIR/$tdir/migrate_dir
16315 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
16316 error "migration fails with a tailing slash"
16318 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
16319 error "migration fails with two tailing slashes"
16321 run_test 230i "lfs migrate -m tolerates trailing slashes"
16324 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16325 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16326 skip "Need MDS version at least 2.11.52"
16328 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
16329 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
16330 error "create $tfile failed"
16331 cat /etc/passwd > $DIR/$tdir/$tfile
16333 $LFS migrate -m 1 $DIR/$tdir
16335 cmp /etc/passwd $DIR/$tdir/$tfile ||
16336 error "DoM file mismatch after migration"
16338 run_test 230j "DoM file data not changed after dir migration"
16341 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
16342 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16343 skip "Need MDS version at least 2.11.56"
16346 local files_on_starting_mdt=0
16348 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
16349 $LFS getdirstripe $DIR/$tdir
16350 for i in $(seq $total); do
16351 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
16352 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16353 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16356 echo "$files_on_starting_mdt files on MDT0"
16358 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
16359 $LFS getdirstripe $DIR/$tdir
16361 files_on_starting_mdt=0
16362 for i in $(seq $total); do
16363 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16364 error "file $tfile.$i mismatch after migration"
16365 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16366 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16369 echo "$files_on_starting_mdt files on MDT1 after migration"
16370 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16372 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16373 $LFS getdirstripe $DIR/$tdir
16375 files_on_starting_mdt=0
16376 for i in $(seq $total); do
16377 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16378 error "file $tfile.$i mismatch after 2nd migration"
16379 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16380 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16383 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
16384 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16388 run_test 230k "file data not changed after dir migration"
16391 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16392 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16393 skip "Need MDS version at least 2.11.56"
16395 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16396 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16397 error "create files under remote dir failed $i"
16398 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16400 run_test 230l "readdir between MDTs won't crash"
16403 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16404 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16405 skip "Need MDS version at least 2.11.56"
16408 local mig_dir=$DIR/$tdir/migrate_dir
16409 local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16413 echo "Creating files and dirs with xattrs"
16414 test_mkdir $DIR/$tdir
16415 test_mkdir -i0 -c1 $mig_dir
16417 setfattr -n user.attr1 -v $longstr $mig_dir/dir ||
16418 error "cannot set xattr attr1 on dir"
16419 setfattr -n user.attr2 -v $shortstr $mig_dir/dir ||
16420 error "cannot set xattr attr2 on dir"
16421 touch $mig_dir/dir/f0
16422 setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 ||
16423 error "cannot set xattr attr1 on file"
16424 setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 ||
16425 error "cannot set xattr attr2 on file"
16426 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16427 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16428 [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir"
16429 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16430 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir"
16431 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16432 [ "$val" = $longstr ] || error "xattr attr1 not set properly on file"
16433 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16434 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file"
16436 echo "Migrating to MDT1"
16437 $LFS migrate -m $MDTIDX $mig_dir ||
16438 error "fails on migrating dir to MDT1"
16440 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16441 echo "Checking xattrs"
16442 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16443 [ "$val" = $longstr ] ||
16444 error "expecting xattr1 $longstr on dir, found $val"
16445 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16446 [ "$val" = $shortstr ] ||
16447 error "expecting xattr2 $shortstr on dir, found $val"
16448 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16449 [ "$val" = $longstr ] ||
16450 error "expecting xattr1 $longstr on file, found $val"
16451 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16452 [ "$val" = $shortstr ] ||
16453 error "expecting xattr2 $shortstr on file, found $val"
16455 run_test 230m "xattrs not changed after dir migration"
16459 # For simplicity this test assumes that max_pages_per_rpc
16460 # is the same across all OSCs
16461 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16462 local bulk_size=$((max_pages * PAGE_SIZE))
16463 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16466 mkdir -p $DIR/$tdir
16467 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16468 error "failed to set stripe with -S ${brw_size}M option"
16470 # clear the OSC stats
16471 $LCTL set_param osc.*.stats=0 &>/dev/null
16474 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16475 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16476 oflag=direct &>/dev/null || error "dd failed"
16478 sync; sleep 1; sync # just to be safe
16479 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16480 if [ x$nrpcs != "x1" ]; then
16481 $LCTL get_param osc.*.stats
16482 error "found $nrpcs ost_write RPCs, not 1 as expected"
16486 # Drop the OSC cache, otherwise we will read from it
16487 cancel_lru_locks osc
16489 # clear the OSC stats
16490 $LCTL set_param osc.*.stats=0 &>/dev/null
16492 # Client reads $bulk_size.
16493 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16494 iflag=direct &>/dev/null || error "dd failed"
16496 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16497 if [ x$nrpcs != "x1" ]; then
16498 $LCTL get_param osc.*.stats
16499 error "found $nrpcs ost_read RPCs, not 1 as expected"
16502 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16505 mkdir -p $DIR/$tdir
16507 for i in {0..1023}; do
16508 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16509 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16510 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16514 run_test 231b "must not assert on fully utilized OST request buffer"
16517 mkdir -p $DIR/$tdir
16518 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16520 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16521 do_facet ost1 $LCTL set_param fail_loc=0x31c
16523 # ignore dd failure
16524 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16526 do_facet ost1 $LCTL set_param fail_loc=0
16527 umount_client $MOUNT || error "umount failed"
16528 mount_client $MOUNT || error "mount failed"
16529 stop ost1 || error "cannot stop ost1"
16530 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16532 run_test 232a "failed lock should not block umount"
16535 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16536 skip "Need MDS version at least 2.10.58"
16538 mkdir -p $DIR/$tdir
16539 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16540 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16542 cancel_lru_locks osc
16544 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16545 do_facet ost1 $LCTL set_param fail_loc=0x31c
16548 $LFS data_version $DIR/$tdir/$tfile || true
16550 do_facet ost1 $LCTL set_param fail_loc=0
16551 umount_client $MOUNT || error "umount failed"
16552 mount_client $MOUNT || error "mount failed"
16553 stop ost1 || error "cannot stop ost1"
16554 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16556 run_test 232b "failed data version lock should not block umount"
16559 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
16560 skip "Need MDS version at least 2.3.64"
16561 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16563 local fid=$($LFS path2fid $MOUNT)
16565 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16566 error "cannot access $MOUNT using its FID '$fid'"
16568 run_test 233a "checking that OBF of the FS root succeeds"
16571 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
16572 skip "Need MDS version at least 2.5.90"
16573 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16575 local fid=$($LFS path2fid $MOUNT/.lustre)
16577 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16578 error "cannot access $MOUNT/.lustre using its FID '$fid'"
16580 fid=$($LFS path2fid $MOUNT/.lustre/fid)
16581 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16582 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
16584 run_test 233b "checking that OBF of the FS .lustre succeeds"
16587 local p="$TMP/sanityN-$TESTNAME.parameters"
16588 save_lustre_params client "llite.*.xattr_cache" > $p
16589 lctl set_param llite.*.xattr_cache 1 ||
16590 skip_env "xattr cache is not supported"
16592 mkdir -p $DIR/$tdir || error "mkdir failed"
16593 touch $DIR/$tdir/$tfile || error "touch failed"
16594 # OBD_FAIL_LLITE_XATTR_ENOMEM
16595 $LCTL set_param fail_loc=0x1405
16596 getfattr -n user.attr $DIR/$tdir/$tfile &&
16597 error "getfattr should have failed with ENOMEM"
16598 $LCTL set_param fail_loc=0x0
16601 restore_lustre_params < $p
16604 run_test 234 "xattr cache should not crash on ENOMEM"
16607 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
16608 skip "Need MDS version at least 2.4.52"
16610 flock_deadlock $DIR/$tfile
16615 124) error "process hangs on a deadlock"
16617 *) error "error executing flock_deadlock $DIR/$tfile"
16621 run_test 235 "LU-1715: flock deadlock detection does not work properly"
16625 check_swap_layouts_support
16627 local ref1=/etc/passwd
16628 local ref2=/etc/group
16629 local file1=$DIR/$tdir/f1
16630 local file2=$DIR/$tdir/f2
16632 test_mkdir -c1 $DIR/$tdir
16633 $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
16634 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
16635 $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
16636 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
16637 local fd=$(free_fd)
16638 local cmd="exec $fd<>$file2"
16641 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
16642 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
16645 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
16650 run_test 236 "Layout swap on open unlinked file"
16652 # LU-4659 linkea consistency
16654 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
16655 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
16656 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
16657 skip "Need MDS version at least 2.5.58 or 2.5.2+"
16660 ln $DIR/$tfile $DIR/$tfile.lnk
16661 touch $DIR/$tfile.new
16662 mv $DIR/$tfile.new $DIR/$tfile
16663 local fid1=$($LFS path2fid $DIR/$tfile)
16664 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
16665 local path1=$($LFS fid2path $FSNAME "$fid1")
16666 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
16667 local path2=$($LFS fid2path $FSNAME "$fid2")
16668 [ $tfile.lnk == $path2 ] ||
16669 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
16672 run_test 238 "Verify linkea consistency"
16674 test_239A() { # was test_239
16675 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
16676 skip "Need MDS version at least 2.5.60"
16678 local list=$(comma_list $(mdts_nodes))
16680 mkdir -p $DIR/$tdir
16681 createmany -o $DIR/$tdir/f- 5000
16682 unlinkmany $DIR/$tdir/f- 5000
16683 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
16684 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
16685 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
16686 osp.*MDT*.sync_in_flight" | calc_sum)
16687 [ "$changes" -eq 0 ] || error "$changes not synced"
16689 run_test 239A "osp_sync test"
16691 test_239a() { #LU-5297
16692 remote_mds_nodsh && skip "remote MDS with nodsh"
16695 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
16696 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
16697 chgrp $RUNAS_GID $DIR/$tfile
16698 wait_delete_completed
16700 run_test 239a "process invalid osp sync record correctly"
16702 test_239b() { #LU-5297
16703 remote_mds_nodsh && skip "remote MDS with nodsh"
16706 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
16707 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
16708 chgrp $RUNAS_GID $DIR/$tfile1
16709 wait_delete_completed
16710 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
16712 chgrp $RUNAS_GID $DIR/$tfile2
16713 wait_delete_completed
16715 run_test 239b "process osp sync record with ENOMEM error correctly"
16718 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16719 remote_mds_nodsh && skip "remote MDS with nodsh"
16721 mkdir -p $DIR/$tdir
16723 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
16724 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
16725 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
16726 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
16728 umount_client $MOUNT || error "umount failed"
16729 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
16730 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
16731 mount_client $MOUNT || error "failed to mount client"
16733 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
16734 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
16736 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
16742 for LOOP in $(seq $count); do
16743 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
16744 cancel_lru_locks $OSC || true
16752 for LOOP in $(seq $1); do
16753 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
16758 test_241a() { # was test_241
16759 local bsize=$PAGE_SIZE
16761 (( bsize < 40960 )) && bsize=40960
16762 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16764 cancel_lru_locks $OSC
16765 test_241_bio 1000 $bsize &
16767 test_241_dio 1000 $bsize
16770 run_test 241a "bio vs dio"
16773 local bsize=$PAGE_SIZE
16775 (( bsize < 40960 )) && bsize=40960
16776 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16778 test_241_dio 1000 $bsize &
16780 test_241_dio 1000 $bsize
16783 run_test 241b "dio vs dio"
16786 remote_mds_nodsh && skip "remote MDS with nodsh"
16788 mkdir -p $DIR/$tdir
16789 touch $DIR/$tdir/$tfile
16791 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
16792 do_facet mds1 lctl set_param fail_loc=0x105
16793 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
16795 do_facet mds1 lctl set_param fail_loc=0
16796 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
16798 run_test 242 "mdt_readpage failure should not cause directory unreadable"
16802 test_mkdir $DIR/$tdir
16803 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
16805 run_test 243 "various group lock tests"
16809 test_mkdir $DIR/$tdir
16810 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
16811 sendfile_grouplock $DIR/$tdir/$tfile || \
16812 error "sendfile+grouplock failed"
16815 run_test 244 "sendfile with group lock tests"
16818 local flagname="multi_mod_rpcs"
16819 local connect_data_name="max_mod_rpcs"
16822 # check if multiple modify RPCs flag is set
16823 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
16824 grep "connect_flags:")
16827 echo "$out" | grep -qw $flagname
16828 if [ $? -ne 0 ]; then
16829 echo "connect flag $flagname is not set"
16833 # check if multiple modify RPCs data is set
16834 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
16837 echo "$out" | grep -qw $connect_data_name ||
16838 error "import should have connect data $connect_data_name"
16840 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
16842 test_246() { # LU-7371
16843 remote_ost_nodsh && skip "remote OST with nodsh"
16844 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
16845 skip "Need OST version >= 2.7.62"
16847 do_facet ost1 $LCTL set_param fail_val=4095
16848 #define OBD_FAIL_OST_READ_SIZE 0x234
16849 do_facet ost1 $LCTL set_param fail_loc=0x234
16850 $LFS setstripe $DIR/$tfile -i 0 -c 1
16851 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
16852 cancel_lru_locks $FSNAME-OST0000
16853 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
16855 run_test 246 "Read file of size 4095 should return right length"
16861 umount_client $submount
16866 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16868 skip_env "Fileset feature is not supported"
16870 local submount=${MOUNT}_$tdir
16873 mkdir -p $submount || error "mkdir $submount failed"
16874 FILESET="$FILESET/$tdir" mount_client $submount ||
16875 error "mount $submount failed"
16876 trap "cleanup_247 $submount" EXIT
16877 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
16878 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
16879 error "read $MOUNT/$tdir/$tfile failed"
16880 cleanup_247 $submount
16882 run_test 247a "mount subdir as fileset"
16885 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16886 skip_env "Fileset feature is not supported"
16888 local submount=${MOUNT}_$tdir
16890 rm -rf $MOUNT/$tdir
16891 mkdir -p $submount || error "mkdir $submount failed"
16893 FILESET="$FILESET/$tdir" mount_client $submount &&
16894 error "mount $submount should fail"
16897 run_test 247b "mount subdir that dose not exist"
16900 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16901 skip_env "Fileset feature is not supported"
16903 local submount=${MOUNT}_$tdir
16905 mkdir -p $MOUNT/$tdir/dir1
16906 mkdir -p $submount || error "mkdir $submount failed"
16907 trap "cleanup_247 $submount" EXIT
16908 FILESET="$FILESET/$tdir" mount_client $submount ||
16909 error "mount $submount failed"
16910 local fid=$($LFS path2fid $MOUNT/)
16911 $LFS fid2path $submount $fid && error "fid2path should fail"
16912 cleanup_247 $submount
16914 run_test 247c "running fid2path outside root"
16917 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16918 skip "Fileset feature is not supported"
16920 local submount=${MOUNT}_$tdir
16922 mkdir -p $MOUNT/$tdir/dir1
16923 mkdir -p $submount || error "mkdir $submount failed"
16924 FILESET="$FILESET/$tdir" mount_client $submount ||
16925 error "mount $submount failed"
16926 trap "cleanup_247 $submount" EXIT
16927 local fid=$($LFS path2fid $submount/dir1)
16928 $LFS fid2path $submount $fid || error "fid2path should succeed"
16929 cleanup_247 $submount
16931 run_test 247d "running fid2path inside root"
16935 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16937 skip "Fileset feature is not supported"
16939 local submount=${MOUNT}_$tdir
16942 mkdir -p $submount || error "mkdir $submount failed"
16943 FILESET="$FILESET/.." mount_client $submount &&
16944 error "mount $submount should fail"
16947 run_test 247e "mount .. as fileset"
16950 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16951 [ $MDS1_VERSION -lt $(version_code 2.13.52) ] &&
16952 skip "Need at least version 2.13.52"
16953 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16955 skip "Fileset feature is not supported"
16957 mkdir $DIR/$tdir || error "mkdir $tdir failed"
16958 $LFS mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir/remote ||
16959 error "mkdir remote failed"
16960 mkdir $DIR/$tdir/remote/subdir || error "mkdir remote/subdir failed"
16961 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/striped ||
16962 error "mkdir striped failed"
16963 mkdir $DIR/$tdir/striped/subdir || error "mkdir striped/subdir failed"
16965 local submount=${MOUNT}_$tdir
16967 mkdir -p $submount || error "mkdir $submount failed"
16970 local fileset=$FILESET
16972 for dir in $tdir/remote $tdir/remote/subdir \
16973 $tdir/striped $tdir/striped/subdir $tdir/striped/. ; do
16974 FILESET="$fileset/$dir" mount_client $submount ||
16975 error "mount $dir failed"
16976 umount_client $submount
16979 run_test 247f "mount striped or remote directory as fileset"
16982 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
16983 [ -z "$fast_read_sav" ] && skip "no fast read support"
16985 # create a large file for fast read verification
16986 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
16988 # make sure the file is created correctly
16989 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
16990 { rm -f $DIR/$tfile; skip "file creation error"; }
16992 echo "Test 1: verify that fast read is 4 times faster on cache read"
16994 # small read with fast read enabled
16995 $LCTL set_param -n llite.*.fast_read=1
16996 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16997 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16998 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16999 # small read with fast read disabled
17000 $LCTL set_param -n llite.*.fast_read=0
17001 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
17002 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17003 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17005 # verify that fast read is 4 times faster for cache read
17006 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
17007 error_not_in_vm "fast read was not 4 times faster: " \
17008 "$t_fast vs $t_slow"
17010 echo "Test 2: verify the performance between big and small read"
17011 $LCTL set_param -n llite.*.fast_read=1
17013 # 1k non-cache read
17014 cancel_lru_locks osc
17015 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17016 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17017 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17019 # 1M non-cache read
17020 cancel_lru_locks osc
17021 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17022 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17023 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17025 # verify that big IO is not 4 times faster than small IO
17026 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
17027 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
17029 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
17032 run_test 248 "fast read verification"
17034 test_249() { # LU-7890
17035 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
17036 skip "Need at least version 2.8.54"
17039 $SETSTRIPE -c 1 $DIR/$tfile
17040 # Offset 2T == 4k * 512M
17041 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
17042 error "dd to 2T offset failed"
17044 run_test 249 "Write above 2T file size"
17047 [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
17048 && skip "no 16TB file size limit on ZFS"
17050 $SETSTRIPE -c 1 $DIR/$tfile
17051 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
17052 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
17053 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
17054 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
17055 conv=notrunc,fsync && error "append succeeded"
17058 run_test 250 "Write above 16T limit"
17061 $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile
17063 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
17064 #Skip once - writing the first stripe will succeed
17065 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17066 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
17067 error "short write happened"
17069 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17070 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
17071 error "short read happened"
17075 run_test 251 "Handling short read and write correctly"
17078 remote_mds_nodsh && skip "remote MDS with nodsh"
17079 remote_ost_nodsh && skip "remote OST with nodsh"
17080 if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then
17081 skip_env "ldiskfs only test"
17091 # check lr_reader on OST0000
17093 dev=$(facet_device $tgt)
17094 out=$(do_facet $tgt $LR_READER $dev)
17095 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17097 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
17098 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
17099 error "Invalid uuid returned by $LR_READER on target $tgt"
17100 echo -e "uuid returned by $LR_READER is '$uuid'\n"
17102 # check lr_reader -c on MDT0000
17104 dev=$(facet_device $tgt)
17105 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
17106 skip "$LR_READER does not support additional options"
17108 out=$(do_facet $tgt $LR_READER -c $dev)
17109 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17111 num=$(echo "$out" | grep -c "mdtlov")
17112 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
17113 error "Invalid number of mdtlov clients returned by $LR_READER"
17114 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
17116 # check lr_reader -cr on MDT0000
17117 out=$(do_facet $tgt $LR_READER -cr $dev)
17118 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17120 echo "$out" | grep -q "^reply_data:$" ||
17121 error "$LR_READER should have returned 'reply_data' section"
17122 num=$(echo "$out" | grep -c "client_generation")
17123 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
17125 run_test 252 "check lr_reader tool"
17127 test_253_fill_ost() {
17128 local size_mb #how many MB should we write to pass watermark
17129 local lwm=$3 #low watermark
17130 local free_10mb #10% of free space
17132 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17133 size_mb=$((free_kb / 1024 - lwm))
17134 free_10mb=$((free_kb / 10240))
17135 #If 10% of free space cross low watermark use it
17136 if (( free_10mb > size_mb )); then
17139 #At least we need to store 1.1 of difference between
17140 #free space and low watermark
17141 size_mb=$((size_mb + size_mb / 10))
17143 if (( lwm <= $((free_kb / 1024)) )) || [ ! -f $DIR/$tdir/1 ]; then
17144 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M count=$size_mb \
17145 oflag=append conv=notrunc
17150 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17151 echo "OST still has $((free_kb / 1024)) mbytes free"
17155 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17156 remote_mds_nodsh && skip "remote MDS with nodsh"
17157 remote_mgs_nodsh && skip "remote MGS with nodsh"
17162 local ost_name=$($LFS osts |
17163 sed -n 's/^'$ostidx': \(.*\)_UUID .*/\1/p')
17165 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
17166 do_facet $SINGLEMDS $LCTL get_param -n \
17167 osp.$mdtosc_proc1.reserved_mb_high ||
17168 skip "remote MDS does not support reserved_mb_high"
17172 wait_delete_completed
17175 local last_wm_h=$(do_facet $SINGLEMDS $LCTL get_param -n \
17176 osp.$mdtosc_proc1.reserved_mb_high)
17177 local last_wm_l=$(do_facet $SINGLEMDS $LCTL get_param -n \
17178 osp.$mdtosc_proc1.reserved_mb_low)
17179 echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l"
17181 create_pool $FSNAME.$TESTNAME || error "Pool creation failed"
17182 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name ||
17183 error "Adding $ost_name to pool failed"
17185 # Wait for client to see a OST at pool
17186 wait_update $HOSTNAME "$LCTL get_param -n
17187 lov.$FSNAME-*.pools.$TESTNAME | sort -u |
17188 grep $ost_name" "$ost_name""_UUID" $((TIMEOUT/2)) ||
17189 error "Client can not see the pool"
17190 $SETSTRIPE $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
17191 error "Setstripe failed"
17193 dd if=/dev/zero of=$DIR/$tdir/0 bs=1M count=10
17194 local blocks=$($LFS df $MOUNT | grep $ost_name | awk '{ print $4 }')
17195 echo "OST still has $((blocks/1024)) mbytes free"
17197 local new_lwm=$((blocks/1024-10))
17198 do_facet $SINGLEMDS $LCTL set_param \
17199 osp.$mdtosc_proc1.reserved_mb_high=$((new_lwm+5))
17200 do_facet $SINGLEMDS $LCTL set_param \
17201 osp.$mdtosc_proc1.reserved_mb_low=$new_lwm
17203 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17205 #First enospc could execute orphan deletion so repeat.
17206 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17208 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17209 osp.$mdtosc_proc1.prealloc_status)
17210 echo "prealloc_status $oa_status"
17212 dd if=/dev/zero of=$DIR/$tdir/2 bs=1M count=1 &&
17213 error "File creation should fail"
17214 #object allocation was stopped, but we still able to append files
17215 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M seek=6 count=5 oflag=append ||
17216 error "Append failed"
17217 rm -f $DIR/$tdir/1 $DIR/$tdir/0 $DIR/$tdir/r*
17219 wait_delete_completed
17223 for i in $(seq 10 12); do
17224 dd if=/dev/zero of=$DIR/$tdir/$i bs=1M count=1 2>/dev/null ||
17225 error "File creation failed after rm";
17228 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17229 osp.$mdtosc_proc1.prealloc_status)
17230 echo "prealloc_status $oa_status"
17232 if (( oa_status != 0 )); then
17233 error "Object allocation still disable after rm"
17235 do_facet $SINGLEMDS $LCTL set_param \
17236 osp.$mdtosc_proc1.reserved_mb_high=$last_wm_h
17237 do_facet $SINGLEMDS $LCTL set_param \
17238 osp.$mdtosc_proc1.reserved_mb_low=$last_wm_l
17241 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $ost_name ||
17242 error "Remove $ost_name from pool failed"
17243 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
17244 error "Pool destroy fialed"
17246 run_test 253 "Check object allocation limit"
17249 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17250 remote_mds_nodsh && skip "remote MDS with nodsh"
17251 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
17252 skip "MDS does not support changelog_size"
17255 local MDT0=$(facet_svc $SINGLEMDS)
17257 changelog_register || error "changelog_register failed"
17259 changelog_clear 0 || error "changelog_clear failed"
17261 local size1=$(do_facet $SINGLEMDS \
17262 $LCTL get_param -n mdd.$MDT0.changelog_size)
17263 echo "Changelog size $size1"
17266 $LFS mkdir -i 0 $DIR/$tdir
17268 mkdir -p $DIR/$tdir/pics/2008/zachy
17269 touch $DIR/$tdir/pics/2008/zachy/timestamp
17270 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
17271 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
17272 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
17273 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
17274 rm $DIR/$tdir/pics/desktop.jpg
17276 local size2=$(do_facet $SINGLEMDS \
17277 $LCTL get_param -n mdd.$MDT0.changelog_size)
17278 echo "Changelog size after work $size2"
17280 (( $size2 > $size1 )) ||
17281 error "new Changelog size=$size2 less than old size=$size1"
17283 run_test 254 "Check changelog size"
17290 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
17291 awk -F: '{print $2}' | grep $type > /dev/null
17292 if [ $? -ne 0 ]; then
17302 lfs ladvise -a willread $file > /dev/null 2>&1
17303 if [ $? -eq 0 ]; then
17307 lfs ladvise -a willread $file 2>&1 |
17308 grep "Inappropriate ioctl for device" > /dev/null
17309 if [ $? -eq 0 ]; then
17316 bc <<<"scale=2; ($1 - $2) * 100 / $2"
17319 # run a random read IO workload
17320 # usage: random_read_iops <filename> <filesize> <iosize>
17321 random_read_iops() {
17324 local iosize=${3:-4096}
17326 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
17327 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
17330 drop_file_oss_cache() {
17334 $LFS ladvise -a dontneed $file 2>/dev/null ||
17335 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
17338 ladvise_willread_performance()
17341 local average_origin=0
17342 local average_cache=0
17343 local average_ladvise=0
17345 for ((i = 1; i <= $repeat; i++)); do
17346 echo "Iter $i/$repeat: reading without willread hint"
17347 cancel_lru_locks osc
17348 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17349 local speed_origin=$(random_read_iops $DIR/$tfile $size)
17350 echo "Iter $i/$repeat: uncached speed: $speed_origin"
17351 average_origin=$(bc <<<"$average_origin + $speed_origin")
17353 cancel_lru_locks osc
17354 local speed_cache=$(random_read_iops $DIR/$tfile $size)
17355 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
17356 average_cache=$(bc <<<"$average_cache + $speed_cache")
17358 cancel_lru_locks osc
17359 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17360 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
17361 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
17362 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
17363 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
17365 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
17366 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
17367 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
17369 speedup_cache=$(percent $average_cache $average_origin)
17370 speedup_ladvise=$(percent $average_ladvise $average_origin)
17372 echo "Average uncached read: $average_origin"
17373 echo "Average speedup with OSS cached read: " \
17374 "$average_cache = +$speedup_cache%"
17375 echo "Average speedup with ladvise willread: " \
17376 "$average_ladvise = +$speedup_ladvise%"
17378 local lowest_speedup=20
17379 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
17380 echo "Speedup with OSS cached read less than $lowest_speedup%," \
17381 "got $average_cache%. Skipping ladvise willread check."
17385 # the test won't work on ZFS until it supports 'ladvise dontneed', but
17386 # it is still good to run until then to exercise 'ladvise willread'
17387 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17388 [ "$ost1_FSTYPE" = "zfs" ] &&
17389 echo "osd-zfs does not support dontneed or drop_caches" &&
17392 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
17393 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
17394 error_not_in_vm "Speedup with willread is less than " \
17395 "$lowest_speedup%, got $average_ladvise%"
17399 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17400 skip "lustre < 2.8.54 does not support ladvise "
17401 remote_ost_nodsh && skip "remote OST with nodsh"
17403 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
17405 ladvise_no_type willread $DIR/$tfile &&
17406 skip "willread ladvise is not supported"
17408 ladvise_no_ioctl $DIR/$tfile &&
17409 skip "ladvise ioctl is not supported"
17412 local size=$((size_mb * 1048576))
17413 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17414 error "dd to $DIR/$tfile failed"
17416 lfs ladvise -a willread $DIR/$tfile ||
17417 error "Ladvise failed with no range argument"
17419 lfs ladvise -a willread -s 0 $DIR/$tfile ||
17420 error "Ladvise failed with no -l or -e argument"
17422 lfs ladvise -a willread -e 1 $DIR/$tfile ||
17423 error "Ladvise failed with only -e argument"
17425 lfs ladvise -a willread -l 1 $DIR/$tfile ||
17426 error "Ladvise failed with only -l argument"
17428 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
17429 error "End offset should not be smaller than start offset"
17431 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
17432 error "End offset should not be equal to start offset"
17434 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
17435 error "Ladvise failed with overflowing -s argument"
17437 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
17438 error "Ladvise failed with overflowing -e argument"
17440 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
17441 error "Ladvise failed with overflowing -l argument"
17443 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
17444 error "Ladvise succeeded with conflicting -l and -e arguments"
17446 echo "Synchronous ladvise should wait"
17448 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17449 do_nodes $(comma_list $(osts_nodes)) \
17450 $LCTL set_param fail_val=$delay fail_loc=0x237
17452 local start_ts=$SECONDS
17453 lfs ladvise -a willread $DIR/$tfile ||
17454 error "Ladvise failed with no range argument"
17455 local end_ts=$SECONDS
17456 local inteval_ts=$((end_ts - start_ts))
17458 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17459 error "Synchronous advice didn't wait reply"
17462 echo "Asynchronous ladvise shouldn't wait"
17463 local start_ts=$SECONDS
17464 lfs ladvise -a willread -b $DIR/$tfile ||
17465 error "Ladvise failed with no range argument"
17466 local end_ts=$SECONDS
17467 local inteval_ts=$((end_ts - start_ts))
17469 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17470 error "Asynchronous advice blocked"
17473 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17474 ladvise_willread_performance
17476 run_test 255a "check 'lfs ladvise -a willread'"
17482 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17486 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17487 skip "lustre < 2.8.54 does not support ladvise "
17488 remote_ost_nodsh && skip "remote OST with nodsh"
17490 lfs setstripe -c 1 -i 0 $DIR/$tfile
17492 ladvise_no_type dontneed $DIR/$tfile &&
17493 skip "dontneed ladvise is not supported"
17495 ladvise_no_ioctl $DIR/$tfile &&
17496 skip "ladvise ioctl is not supported"
17498 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17499 [ "$ost1_FSTYPE" = "zfs" ] &&
17500 skip "zfs-osd does not support 'ladvise dontneed'"
17503 local size=$((size_mb * 1048576))
17504 # In order to prevent disturbance of other processes, only check 3/4
17505 # of the memory usage
17506 local kibibytes=$((size_mb * 1024 * 3 / 4))
17508 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17509 error "dd to $DIR/$tfile failed"
17511 #force write to complete before dropping OST cache & checking memory
17514 local total=$(facet_meminfo ost1 MemTotal)
17515 echo "Total memory: $total KiB"
17517 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17518 local before_read=$(facet_meminfo ost1 Cached)
17519 echo "Cache used before read: $before_read KiB"
17521 lfs ladvise -a willread $DIR/$tfile ||
17522 error "Ladvise willread failed"
17523 local after_read=$(facet_meminfo ost1 Cached)
17524 echo "Cache used after read: $after_read KiB"
17526 lfs ladvise -a dontneed $DIR/$tfile ||
17527 error "Ladvise dontneed again failed"
17528 local no_read=$(facet_meminfo ost1 Cached)
17529 echo "Cache used after dontneed ladvise: $no_read KiB"
17531 if [ $total -lt $((before_read + kibibytes)) ]; then
17532 echo "Memory is too small, abort checking"
17536 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17537 error "Ladvise willread should use more memory" \
17538 "than $kibibytes KiB"
17541 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17542 error "Ladvise dontneed should release more memory" \
17543 "than $kibibytes KiB"
17546 run_test 255b "check 'lfs ladvise -a dontneed'"
17549 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17550 skip "lustre < 2.10.50 does not support lockahead"
17558 test_mkdir -p $DIR/$tdir
17559 $SETSTRIPE -i 0 $DIR/$tdir
17561 #test 10 returns only success/failure
17563 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17565 if [ $rc -eq 255 ]; then
17566 error "Ladvise test${i} failed, ${rc}"
17569 #test 11 counts lock enqueue requests, all others count new locks
17571 count=$(do_facet ost1 \
17572 $LCTL get_param -n ost.OSS.ost.stats)
17573 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17575 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17577 if [ $rc -eq 255 ]; then
17578 error "Ladvise test${i} failed, ${rc}"
17581 new_count=$(do_facet ost1 \
17582 $LCTL get_param -n ost.OSS.ost.stats)
17583 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17584 awk '{ print $2 }')
17586 difference="$((new_count - count))"
17587 if [ $difference -ne $rc ]; then
17588 error "Ladvise test${i}, bad enqueue count, returned " \
17589 "${rc}, actual ${difference}"
17592 for i in $(seq 12 21); do
17593 # If we do not do this, we run the risk of having too many
17594 # locks and starting lock cancellation while we are checking
17596 cancel_lru_locks osc
17598 count=$($LCTL get_param -n \
17599 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17601 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17603 if [ $rc -eq 255 ]; then
17604 error "Ladvise test ${i} failed, ${rc}"
17607 new_count=$($LCTL get_param -n \
17608 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17609 difference="$((new_count - count))"
17611 # Test 15 output is divided by 100 to map down to valid return
17612 if [ $i -eq 15 ]; then
17616 if [ $difference -ne $rc ]; then
17617 error "Ladvise test ${i}, bad lock count, returned " \
17618 "${rc}, actual ${difference}"
17622 #test 22 returns only success/failure
17624 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17626 if [ $rc -eq 255 ]; then
17627 error "Ladvise test${i} failed, ${rc}"
17630 run_test 255c "suite of ladvise lockahead tests"
17633 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17634 remote_mds_nodsh && skip "remote MDS with nodsh"
17635 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17636 changelog_users $SINGLEMDS | grep "^cl" &&
17637 skip "active changelog user"
17643 mdt_dev=$(mdsdevname 1)
17646 changelog_register || error "changelog_register failed"
17649 mkdir -p $DIR/$tdir
17651 changelog_clear 0 || error "changelog_clear failed"
17654 touch $DIR/$tdir/{1..10}
17657 stop $SINGLEMDS || error "Fail to stop MDT"
17661 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
17663 #after mount new plainllog is used
17664 touch $DIR/$tdir/{11..19}
17665 local tmpfile=$(mktemp -u $tfile.XXXXXX)
17666 cat_sl=$(do_facet $SINGLEMDS "sync; \
17667 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17668 llog_reader $tmpfile | grep -c type=1064553b")
17669 do_facet $SINGLEMDS llog_reader $tmpfile
17671 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
17673 changelog_clear 0 || error "changelog_clear failed"
17675 cat_sl=$(do_facet $SINGLEMDS "sync; \
17676 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17677 llog_reader $tmpfile | grep -c type=1064553b; rm -f $tmpfile")
17679 if (( cat_sl == 2 )); then
17680 error "Empty plain llog was not deleted from changelog catalog"
17681 elif (( cat_sl != 1 )); then
17682 error "Active plain llog shouldn't be deleted from catalog"
17685 run_test 256 "Check llog delete for empty and not full state"
17688 remote_mds_nodsh && skip "remote MDS with nodsh"
17689 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
17690 skip "Need MDS version at least 2.8.55"
17692 test_mkdir $DIR/$tdir
17694 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
17695 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
17698 #define OBD_FAIL_MDS_XATTR_REP 0x161
17699 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17700 local facet=mds$((mdtidx + 1))
17701 set_nodes_failloc $(facet_active_host $facet) 0x80000161
17702 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
17704 stop $facet || error "stop MDS failed"
17705 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
17706 error "start MDS fail"
17708 run_test 257 "xattr locks are not lost"
17710 # Verify we take the i_mutex when security requires it
17712 #define OBD_FAIL_IMUTEX_SEC 0x141c
17713 $LCTL set_param fail_loc=0x141c
17715 chmod u+s $DIR/$tfile
17716 chmod a+rwx $DIR/$tfile
17717 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17719 if [ $RC -ne 0 ]; then
17720 error "error, failed to take i_mutex, rc=$?"
17724 run_test 258a "verify i_mutex security behavior when suid attributes is set"
17726 # Verify we do NOT take the i_mutex in the normal case
17728 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
17729 $LCTL set_param fail_loc=0x141d
17732 chmod a+rw $DIR/$tfile
17733 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17735 if [ $RC -ne 0 ]; then
17736 error "error, took i_mutex unnecessarily, rc=$?"
17741 run_test 258b "verify i_mutex security behavior"
17744 local file=$DIR/$tfile
17748 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17750 stack_trap "rm -f $file" EXIT
17752 wait_delete_completed
17753 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17754 echo "before: $before"
17756 $LFS setstripe -i 0 -c 1 $file
17757 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
17759 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17760 echo "after write: $after"
17762 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
17763 do_facet ost1 $LCTL set_param fail_loc=0x2301
17765 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17766 echo "after truncate: $after"
17769 do_facet ost1 $LCTL set_param fail_loc=0
17770 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17772 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17773 echo "after restart: $after"
17774 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
17775 error "missing truncate?"
17779 run_test 259 "crash at delayed truncate"
17782 #define OBD_FAIL_MDC_CLOSE 0x806
17783 $LCTL set_param fail_loc=0x80000806
17787 run_test 260 "Check mdc_close fail"
17789 ### Data-on-MDT sanity tests ###
17791 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17792 skip "Need MDS version at least 2.10.55 for DoM"
17795 local dom=$DIR/$tdir/dom_file
17796 local tmp=$DIR/$tdir/tmp_file
17798 mkdir -p $DIR/$tdir
17800 # basic checks for DoM component creation
17801 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
17802 error "Can set MDT layout to non-first entry"
17804 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
17805 error "Can define multiple entries as MDT layout"
17807 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
17809 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
17810 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
17811 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
17813 local mdtidx=$($LFS getstripe -m $dom)
17814 local mdtname=MDT$(printf %04x $mdtidx)
17815 local facet=mds$((mdtidx + 1))
17816 local space_check=1
17818 # Skip free space checks with ZFS
17819 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
17823 local size_tmp=$((65536 * 3))
17824 local mdtfree1=$(do_facet $facet \
17825 lctl get_param -n osd*.*$mdtname.kbytesfree)
17827 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17828 # check also direct IO along write
17829 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
17830 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17832 cmp $tmp $dom || error "file data is different"
17833 [ $(stat -c%s $dom) == $size_tmp ] ||
17834 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17835 if [ $space_check == 1 ]; then
17836 local mdtfree2=$(do_facet $facet \
17837 lctl get_param -n osd*.*$mdtname.kbytesfree)
17839 # increase in usage from by $size_tmp
17840 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17841 error "MDT free space wrong after write: " \
17842 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17846 local size_dom=10000
17848 $TRUNCATE $dom $size_dom
17849 [ $(stat -c%s $dom) == $size_dom ] ||
17850 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
17851 if [ $space_check == 1 ]; then
17852 mdtfree1=$(do_facet $facet \
17853 lctl get_param -n osd*.*$mdtname.kbytesfree)
17854 # decrease in usage from $size_tmp to new $size_dom
17855 [ $(($mdtfree1 - $mdtfree2)) -ge \
17856 $(((size_tmp - size_dom) / 1024)) ] ||
17857 error "MDT free space is wrong after truncate: " \
17858 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
17864 size_dom=$((size_dom + size_tmp))
17865 [ $(stat -c%s $dom) == $size_dom ] ||
17866 error "bad size after append: $(stat -c%s $dom) != $size_dom"
17867 if [ $space_check == 1 ]; then
17868 mdtfree2=$(do_facet $facet \
17869 lctl get_param -n osd*.*$mdtname.kbytesfree)
17870 # increase in usage by $size_tmp from previous
17871 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17872 error "MDT free space is wrong after append: " \
17873 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17878 if [ $space_check == 1 ]; then
17879 mdtfree1=$(do_facet $facet \
17880 lctl get_param -n osd*.*$mdtname.kbytesfree)
17881 # decrease in usage by $size_dom from previous
17882 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
17883 error "MDT free space is wrong after removal: " \
17884 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
17887 # combined striping
17888 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
17889 error "Can't create DoM + OST striping"
17891 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
17892 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17893 # check also direct IO along write
17894 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17896 cmp $tmp $dom || error "file data is different"
17897 [ $(stat -c%s $dom) == $size_tmp ] ||
17898 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17903 run_test 270a "DoM: basic functionality tests"
17906 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17907 skip "Need MDS version at least 2.10.55"
17909 local dom=$DIR/$tdir/dom_file
17910 local max_size=1048576
17912 mkdir -p $DIR/$tdir
17913 $LFS setstripe -E $max_size -L mdt $dom
17915 # truncate over the limit
17916 $TRUNCATE $dom $(($max_size + 1)) &&
17917 error "successful truncate over the maximum size"
17918 # write over the limit
17919 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
17920 error "successful write over the maximum size"
17921 # append over the limit
17922 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
17923 echo "12345" >> $dom && error "successful append over the maximum size"
17928 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
17931 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17932 skip "Need MDS version at least 2.10.55"
17934 mkdir -p $DIR/$tdir
17935 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17937 # check files inherit DoM EA
17938 touch $DIR/$tdir/first
17939 [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] ||
17940 error "bad pattern"
17941 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
17942 error "bad stripe count"
17943 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
17944 error "bad stripe size"
17946 # check directory inherits DoM EA and uses it as default
17947 mkdir $DIR/$tdir/subdir
17948 touch $DIR/$tdir/subdir/second
17949 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
17950 error "bad pattern in sub-directory"
17951 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
17952 error "bad stripe count in sub-directory"
17953 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
17954 error "bad stripe size in sub-directory"
17957 run_test 270c "DoM: DoM EA inheritance tests"
17960 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17961 skip "Need MDS version at least 2.10.55"
17963 mkdir -p $DIR/$tdir
17964 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17966 # inherit default DoM striping
17967 mkdir $DIR/$tdir/subdir
17968 touch $DIR/$tdir/subdir/f1
17970 # change default directory striping
17971 $LFS setstripe -c 1 $DIR/$tdir/subdir
17972 touch $DIR/$tdir/subdir/f2
17973 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
17974 error "wrong default striping in file 2"
17975 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
17976 error "bad pattern in file 2"
17979 run_test 270d "DoM: change striping from DoM to RAID0"
17982 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17983 skip "Need MDS version at least 2.10.55"
17985 mkdir -p $DIR/$tdir/dom
17986 mkdir -p $DIR/$tdir/norm
17989 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
17990 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
17992 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
17993 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
17995 # find DoM files by layout
17996 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
17997 [ $NUM -eq $DOMFILES ] ||
17998 error "lfs find -L: found $NUM, expected $DOMFILES"
17999 echo "Test 1: lfs find 20 DOM files by layout: OK"
18001 # there should be 1 dir with default DOM striping
18002 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
18004 error "lfs find -L: found $NUM, expected 1 dir"
18005 echo "Test 2: lfs find 1 DOM dir by layout: OK"
18007 # find DoM files by stripe size
18008 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
18009 [ $NUM -eq $DOMFILES ] ||
18010 error "lfs find -S: found $NUM, expected $DOMFILES"
18011 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
18013 # find files by stripe offset except DoM files
18014 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
18015 [ $NUM -eq $NORMFILES ] ||
18016 error "lfs find -i: found $NUM, expected $NORMFILES"
18017 echo "Test 5: lfs find no DOM files by stripe index: OK"
18020 run_test 270e "DoM: lfs find with DoM files test"
18023 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18024 skip "Need MDS version at least 2.10.55"
18026 local mdtname=${FSNAME}-MDT0000-mdtlov
18027 local dom=$DIR/$tdir/dom_file
18028 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
18029 lod.$mdtname.dom_stripesize)
18030 local dom_limit=131072
18032 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
18033 local dom_current=$(do_facet mds1 $LCTL get_param -n \
18034 lod.$mdtname.dom_stripesize)
18035 [ ${dom_limit} -eq ${dom_current} ] ||
18036 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
18038 $LFS mkdir -i 0 -c 1 $DIR/$tdir
18039 $LFS setstripe -d $DIR/$tdir
18040 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
18041 error "Can't set directory default striping"
18043 # exceed maximum stripe size
18044 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18045 error "Can't create file with $((dom_limit * 2)) DoM stripe"
18046 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
18047 error "Able to create DoM component size more than LOD limit"
18049 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
18050 dom_current=$(do_facet mds1 $LCTL get_param -n \
18051 lod.$mdtname.dom_stripesize)
18052 [ 0 -eq ${dom_current} ] ||
18053 error "Can't set zero DoM stripe limit"
18056 # attempt to create DoM file on server with disabled DoM should
18057 # remove DoM entry from layout and be succeed
18058 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
18059 error "Can't create DoM file (DoM is disabled)"
18060 [ $($LFS getstripe -L $dom) == "mdt" ] &&
18061 error "File has DoM component while DoM is disabled"
18064 # attempt to create DoM file with only DoM stripe should return error
18065 $LFS setstripe -E $dom_limit -L mdt $dom &&
18066 error "Able to create DoM-only file while DoM is disabled"
18068 # too low values to be aligned with smallest stripe size 64K
18069 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
18070 dom_current=$(do_facet mds1 $LCTL get_param -n \
18071 lod.$mdtname.dom_stripesize)
18072 [ 30000 -eq ${dom_current} ] &&
18073 error "Can set too small DoM stripe limit"
18075 # 64K is a minimal stripe size in Lustre, expect limit of that size
18076 [ 65536 -eq ${dom_current} ] ||
18077 error "Limit is not set to 64K but ${dom_current}"
18079 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
18080 dom_current=$(do_facet mds1 $LCTL get_param -n \
18081 lod.$mdtname.dom_stripesize)
18083 [ 2147483648 -eq ${dom_current} ] &&
18084 error "Can set too large DoM stripe limit"
18086 do_facet mds1 $LCTL set_param -n \
18087 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
18088 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18089 error "Can't create DoM component size after limit change"
18090 do_facet mds1 $LCTL set_param -n \
18091 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
18092 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
18093 error "Can't create DoM file after limit decrease"
18094 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
18095 error "Can create big DoM component after limit decrease"
18096 touch ${dom}_def ||
18097 error "Can't create file with old default layout"
18099 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
18102 run_test 270f "DoM: maximum DoM stripe size checks"
18105 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18106 skip "Need MDS version at least 2.10.55"
18108 local dom=$DIR/$tdir/dom
18110 mkdir -p $DIR/$tdir
18112 $LFS setstripe -E 1024K -L mdt $dom
18114 lctl set_param -n mdc.*.stats=clear
18115 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18116 cat $dom > /dev/null
18117 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
18118 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
18122 run_test 271a "DoM: data is cached for read after write"
18125 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18126 skip "Need MDS version at least 2.10.55"
18128 local dom=$DIR/$tdir/dom
18130 mkdir -p $DIR/$tdir
18132 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18134 lctl set_param -n mdc.*.stats=clear
18135 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18136 cancel_lru_locks mdc
18137 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
18138 # second stat to check size is cached on client
18139 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
18140 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18141 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
18144 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
18147 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18148 skip "Need MDS version at least 2.10.55"
18150 local dom=$DIR/$tdir/dom
18152 mkdir -p $DIR/$tdir
18154 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18156 lctl set_param -n mdc.*.stats=clear
18157 lctl set_param -n osc.*.stats=clear
18158 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
18159 cancel_lru_locks mdc
18160 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18161 # second stat to check size is cached on client
18162 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18163 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18164 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
18165 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
18166 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
18169 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
18175 local mdt=MDT$(printf %04x $mdtidx)
18177 if [ -z $param ]; then
18178 lctl get_param -n mdc.*$mdt*.stats
18180 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
18185 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18186 skip "Need MDS version at least 2.10.55"
18188 local dom=$DIR/$tdir/dom
18190 mkdir -p $DIR/$tdir
18192 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18194 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18195 local facet=mds$((mdtidx + 1))
18197 cancel_lru_locks mdc
18198 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
18199 createmany -o $dom 1000
18200 lctl set_param -n mdc.*.stats=clear
18201 smalliomany -w $dom 1000 200
18202 get_mdc_stats $mdtidx
18203 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18204 # Each file has 1 open, 1 IO enqueues, total 2000
18205 # but now we have also +1 getxattr for security.capability, total 3000
18206 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
18207 unlinkmany $dom 1000
18209 cancel_lru_locks mdc
18210 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
18211 createmany -o $dom 1000
18212 lctl set_param -n mdc.*.stats=clear
18213 smalliomany -w $dom 1000 200
18214 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18215 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
18216 # for OPEN and IO lock.
18217 [ $((enq - enq_2)) -ge 1000 ] ||
18218 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
18219 unlinkmany $dom 1000
18222 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
18224 cleanup_271def_tests() {
18230 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18231 skip "Need MDS version at least 2.10.57"
18233 local dom=$DIR/$tdir/dom
18234 local tmp=$TMP/$tfile
18235 trap "cleanup_271def_tests $tmp" EXIT
18237 mkdir -p $DIR/$tdir
18239 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18241 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18243 cancel_lru_locks mdc
18244 dd if=/dev/urandom of=$tmp bs=1000 count=1
18245 dd if=$tmp of=$dom bs=1000 count=1
18246 cancel_lru_locks mdc
18248 cat /etc/hosts >> $tmp
18249 lctl set_param -n mdc.*.stats=clear
18251 # append data to the same file it should update local page
18252 echo "Append to the same page"
18253 cat /etc/hosts >> $dom
18254 local num=$(get_mdc_stats $mdtidx ost_read)
18255 local ra=$(get_mdc_stats $mdtidx req_active)
18256 local rw=$(get_mdc_stats $mdtidx req_waittime)
18258 [ -z $num ] || error "$num READ RPC occured"
18259 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18263 cmp $tmp $dom || error "file miscompare"
18265 cancel_lru_locks mdc
18266 lctl set_param -n mdc.*.stats=clear
18268 echo "Open and read file"
18269 cat $dom > /dev/null
18270 local num=$(get_mdc_stats $mdtidx ost_read)
18271 local ra=$(get_mdc_stats $mdtidx req_active)
18272 local rw=$(get_mdc_stats $mdtidx req_waittime)
18274 [ -z $num ] || error "$num READ RPC occured"
18275 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18279 cmp $tmp $dom || error "file miscompare"
18283 run_test 271d "DoM: read on open (1K file in reply buffer)"
18286 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18287 skip "Need MDS version at least 2.10.57"
18289 local dom=$DIR/$tdir/dom
18290 local tmp=$TMP/$tfile
18291 trap "cleanup_271def_tests $tmp" EXIT
18293 mkdir -p $DIR/$tdir
18295 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18297 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18299 cancel_lru_locks mdc
18300 dd if=/dev/urandom of=$tmp bs=200000 count=1
18301 dd if=$tmp of=$dom bs=200000 count=1
18302 cancel_lru_locks mdc
18303 cat /etc/hosts >> $tmp
18304 lctl set_param -n mdc.*.stats=clear
18306 echo "Append to the same page"
18307 cat /etc/hosts >> $dom
18308 local num=$(get_mdc_stats $mdtidx ost_read)
18309 local ra=$(get_mdc_stats $mdtidx req_active)
18310 local rw=$(get_mdc_stats $mdtidx req_waittime)
18312 [ -z $num ] || error "$num READ RPC occured"
18313 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18317 cmp $tmp $dom || error "file miscompare"
18319 cancel_lru_locks mdc
18320 lctl set_param -n mdc.*.stats=clear
18322 echo "Open and read file"
18323 cat $dom > /dev/null
18324 local num=$(get_mdc_stats $mdtidx ost_read)
18325 local ra=$(get_mdc_stats $mdtidx req_active)
18326 local rw=$(get_mdc_stats $mdtidx req_waittime)
18328 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
18329 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18333 cmp $tmp $dom || error "file miscompare"
18337 run_test 271f "DoM: read on open (200K file and read tail)"
18340 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
18341 skip "Skipping due to old client or server version"
18343 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
18345 $CHECKSTAT -t file $DIR1/$tfile
18347 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
18350 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
18351 $LCTL set_param fail_loc=0x80000314
18352 rm $DIR1/$tfile || error "Unlink fails"
18354 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
18355 [ $RC -eq 0 ] || error "Failed write to stale object"
18357 run_test 271g "Discard DoM data vs client flush race"
18360 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18361 skip "Need MDS version at least 2.11.50"
18363 local dom=$DIR/$tdir/dom
18364 mkdir -p $DIR/$tdir
18366 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
18367 dd if=/dev/urandom of=$dom bs=512K count=1 ||
18368 error "failed to write data into $dom"
18369 local old_md5=$(md5sum $dom)
18371 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
18372 error "failed to migrate to the same DoM component"
18374 [ $($LFS getstripe -c $dom) -eq 2 ] ||
18375 error "layout was not changed silently"
18377 local new_md5=$(md5sum $dom)
18379 [ "$old_md5" != "$new_md5" ] &&
18380 error "md5sum differ: $old_md5, $new_md5"
18383 run_test 272a "DoM migration: new layout with the same DOM component"
18386 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18387 skip "Need MDS version at least 2.11.50"
18389 local dom=$DIR/$tdir/dom
18390 mkdir -p $DIR/$tdir
18391 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18393 local mdtidx=$($LFS getstripe -m $dom)
18394 local mdtname=MDT$(printf %04x $mdtidx)
18395 local facet=mds$((mdtidx + 1))
18397 local mdtfree1=$(do_facet $facet \
18398 lctl get_param -n osd*.*$mdtname.kbytesfree)
18399 dd if=/dev/urandom of=$dom bs=2M count=1 ||
18400 error "failed to write data into $dom"
18401 local old_md5=$(md5sum $dom)
18402 cancel_lru_locks mdc
18403 local mdtfree1=$(do_facet $facet \
18404 lctl get_param -n osd*.*$mdtname.kbytesfree)
18406 $LFS migrate -c2 $dom ||
18407 error "failed to migrate to the new composite layout"
18408 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18409 error "MDT stripe was not removed"
18411 cancel_lru_locks mdc
18412 local new_md5=$(md5sum $dom)
18413 [ "$old_md5" != "$new_md5" ] &&
18414 error "$old_md5 != $new_md5"
18416 # Skip free space checks with ZFS
18417 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18418 local mdtfree2=$(do_facet $facet \
18419 lctl get_param -n osd*.*$mdtname.kbytesfree)
18420 [ $mdtfree2 -gt $mdtfree1 ] ||
18421 error "MDT space is not freed after migration"
18425 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
18428 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18429 skip "Need MDS version at least 2.11.50"
18431 local dom=$DIR/$tdir/$tfile
18432 mkdir -p $DIR/$tdir
18433 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18435 local mdtidx=$($LFS getstripe -m $dom)
18436 local mdtname=MDT$(printf %04x $mdtidx)
18437 local facet=mds$((mdtidx + 1))
18439 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18440 error "failed to write data into $dom"
18441 local old_md5=$(md5sum $dom)
18442 cancel_lru_locks mdc
18443 local mdtfree1=$(do_facet $facet \
18444 lctl get_param -n osd*.*$mdtname.kbytesfree)
18446 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18447 error "failed to migrate to the new composite layout"
18448 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18449 error "MDT stripe was not removed"
18451 cancel_lru_locks mdc
18452 local new_md5=$(md5sum $dom)
18453 [ "$old_md5" != "$new_md5" ] &&
18454 error "$old_md5 != $new_md5"
18456 # Skip free space checks with ZFS
18457 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18458 local mdtfree2=$(do_facet $facet \
18459 lctl get_param -n osd*.*$mdtname.kbytesfree)
18460 [ $mdtfree2 -gt $mdtfree1 ] ||
18461 error "MDS space is not freed after migration"
18465 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18468 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18469 skip "Need MDS version at least 2.11.50"
18471 # Layout swap cannot be done if either file has DOM component,
18472 # this will never be supported, migration should be used instead
18474 local dom=$DIR/$tdir/$tfile
18475 mkdir -p $DIR/$tdir
18477 $LFS setstripe -c2 ${dom}_plain
18478 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18479 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18480 error "can swap layout with DoM component"
18481 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18482 error "can swap layout with DoM component"
18484 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18485 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18486 error "can swap layout with DoM component"
18487 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18488 error "can swap layout with DoM component"
18491 run_test 273a "DoM: layout swapping should fail with DOM"
18494 remote_ost_nodsh && skip "remote OST with nodsh"
18495 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18496 skip "Need OST version >= 2.10.57"
18498 local file=$DIR/$tfile
18501 oss=$(comma_list $(osts_nodes))
18503 dd if=/dev/urandom of=$file bs=1M count=2 ||
18504 error "failed to create a file"
18505 cancel_lru_locks osc
18508 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18509 error "failed to read a file"
18511 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
18512 $LCTL set_param fail_loc=0x8000031f
18514 cancel_lru_locks osc &
18517 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
18518 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
18519 #IO takes another lock, but matches the PENDING one
18520 #and places it to the IO RPC
18521 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18522 error "failed to read a file with PENDING lock"
18524 run_test 275 "Read on a canceled duplicate lock"
18527 remote_ost_nodsh && skip "remote OST with nodsh"
18530 do_facet ost1 "(while true; do \
18531 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
18532 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
18535 for LOOP in $(seq 20); do
18537 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
18540 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
18541 rm $TMP/sanity_276_pid"
18543 run_test 276 "Race between mount and obd_statfs"
18545 cleanup_test_300() {
18549 test_striped_dir() {
18554 mkdir -p $DIR/$tdir
18556 SAVE_UMASK=$(umask)
18557 trap cleanup_test_300 RETURN EXIT
18559 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
18560 $DIR/$tdir/striped_dir ||
18561 error "set striped dir error"
18563 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
18564 [ "$mode" = "755" ] || error "expect 755 got $mode"
18566 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
18567 error "getdirstripe failed"
18568 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
18569 if [ "$stripe_count" != "2" ]; then
18570 error "1:stripe_count is $stripe_count, expect 2"
18572 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
18573 if [ "$stripe_count" != "2" ]; then
18574 error "2:stripe_count is $stripe_count, expect 2"
18577 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
18578 if [ "$stripe_index" != "$mdt_index" ]; then
18579 error "stripe_index is $stripe_index, expect $mdt_index"
18582 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18583 error "nlink error after create striped dir"
18585 mkdir $DIR/$tdir/striped_dir/a
18586 mkdir $DIR/$tdir/striped_dir/b
18588 stat $DIR/$tdir/striped_dir/a ||
18589 error "create dir under striped dir failed"
18590 stat $DIR/$tdir/striped_dir/b ||
18591 error "create dir under striped dir failed"
18593 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
18594 error "nlink error after mkdir"
18596 rmdir $DIR/$tdir/striped_dir/a
18597 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
18598 error "nlink error after rmdir"
18600 rmdir $DIR/$tdir/striped_dir/b
18601 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18602 error "nlink error after rmdir"
18604 chattr +i $DIR/$tdir/striped_dir
18605 createmany -o $DIR/$tdir/striped_dir/f 10 &&
18606 error "immutable flags not working under striped dir!"
18607 chattr -i $DIR/$tdir/striped_dir
18609 rmdir $DIR/$tdir/striped_dir ||
18610 error "rmdir striped dir error"
18618 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18619 skip "skipped for lustre < 2.7.0"
18620 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18621 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18623 test_striped_dir 0 || error "failed on striped dir on MDT0"
18624 test_striped_dir 1 || error "failed on striped dir on MDT0"
18626 run_test 300a "basic striped dir sanity test"
18629 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18630 skip "skipped for lustre < 2.7.0"
18631 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18632 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18639 test_mkdir $DIR/$tdir || error "mkdir fail"
18640 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18641 error "set striped dir error"
18642 for i in {0..9}; do
18643 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
18645 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
18646 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
18647 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
18649 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
18650 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
18651 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
18655 run_test 300b "check ctime/mtime for striped dir"
18658 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18659 skip "skipped for lustre < 2.7.0"
18660 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18661 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18665 mkdir -p $DIR/$tdir
18666 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
18667 error "set striped dir error"
18669 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
18670 error "chown striped dir failed"
18672 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
18673 error "create 5k files failed"
18675 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
18677 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
18681 run_test 300c "chown && check ls under striped directory"
18684 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18685 skip "skipped for lustre < 2.7.0"
18686 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18687 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18692 mkdir -p $DIR/$tdir
18693 $SETSTRIPE -c 2 $DIR/$tdir
18695 #local striped directory
18696 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18697 error "set striped dir error"
18698 #look at the directories for debug purposes
18700 $LFS getdirstripe $DIR/$tdir
18701 ls -l $DIR/$tdir/striped_dir
18702 $LFS getdirstripe $DIR/$tdir/striped_dir
18703 createmany -o $DIR/$tdir/striped_dir/f 10 ||
18704 error "create 10 files failed"
18706 #remote striped directory
18707 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
18708 error "set striped dir error"
18709 #look at the directories for debug purposes
18711 $LFS getdirstripe $DIR/$tdir
18712 ls -l $DIR/$tdir/remote_striped_dir
18713 $LFS getdirstripe $DIR/$tdir/remote_striped_dir
18714 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
18715 error "create 10 files failed"
18717 for file in $(find $DIR/$tdir); do
18718 stripe_count=$($LFS getstripe -c $file)
18719 [ $stripe_count -eq 2 ] ||
18720 error "wrong stripe $stripe_count for $file"
18725 run_test 300d "check default stripe under striped directory"
18728 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18729 skip "Need MDS version at least 2.7.55"
18730 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18731 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18736 mkdir -p $DIR/$tdir
18738 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18739 error "set striped dir error"
18741 touch $DIR/$tdir/striped_dir/a
18742 touch $DIR/$tdir/striped_dir/b
18743 touch $DIR/$tdir/striped_dir/c
18745 mkdir $DIR/$tdir/striped_dir/dir_a
18746 mkdir $DIR/$tdir/striped_dir/dir_b
18747 mkdir $DIR/$tdir/striped_dir/dir_c
18749 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
18750 error "set striped adir under striped dir error"
18752 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
18753 error "set striped bdir under striped dir error"
18755 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
18756 error "set striped cdir under striped dir error"
18758 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
18759 error "rename dir under striped dir fails"
18761 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
18762 error "rename dir under different stripes fails"
18764 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
18765 error "rename file under striped dir should succeed"
18767 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
18768 error "rename dir under striped dir should succeed"
18772 run_test 300e "check rename under striped directory"
18775 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18776 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18777 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18778 skip "Need MDS version at least 2.7.55"
18784 mkdir -p $DIR/$tdir
18786 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18787 error "set striped dir error"
18789 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
18790 error "set striped dir error"
18792 touch $DIR/$tdir/striped_dir/a
18793 mkdir $DIR/$tdir/striped_dir/dir_a
18794 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
18795 error "create striped dir under striped dir fails"
18797 touch $DIR/$tdir/striped_dir1/b
18798 mkdir $DIR/$tdir/striped_dir1/dir_b
18799 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
18800 error "create striped dir under striped dir fails"
18802 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
18803 error "rename dir under different striped dir should fail"
18805 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
18806 error "rename striped dir under diff striped dir should fail"
18808 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
18809 error "rename file under diff striped dirs fails"
18813 run_test 300f "check rename cross striped directory"
18815 test_300_check_default_striped_dir()
18818 local default_count=$2
18819 local default_index=$3
18822 local dir_stripe_index
18825 echo "checking $dirname $default_count $default_index"
18826 $LFS setdirstripe -D -c $default_count -i $default_index \
18827 -t all_char $DIR/$tdir/$dirname ||
18828 error "set default stripe on striped dir error"
18829 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
18830 [ $stripe_count -eq $default_count ] ||
18831 error "expect $default_count get $stripe_count for $dirname"
18833 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
18834 [ $stripe_index -eq $default_index ] ||
18835 error "expect $default_index get $stripe_index for $dirname"
18837 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
18838 error "create dirs failed"
18840 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
18841 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
18842 for dir in $(find $DIR/$tdir/$dirname/*); do
18843 stripe_count=$($LFS getdirstripe -c $dir)
18844 [ $stripe_count -eq $default_count ] ||
18845 [ $stripe_count -eq 0 -o $default_count -eq 1 ] ||
18846 error "stripe count $default_count != $stripe_count for $dir"
18848 stripe_index=$($LFS getdirstripe -i $dir)
18849 [ $default_index -eq -1 -o $stripe_index -eq $default_index ] ||
18850 error "$stripe_index != $default_index for $dir"
18852 #check default stripe
18853 stripe_count=$($LFS getdirstripe -D -c $dir)
18854 [ $stripe_count -eq $default_count ] ||
18855 error "default count $default_count != $stripe_count for $dir"
18857 stripe_index=$($LFS getdirstripe -D -i $dir)
18858 [ $stripe_index -eq $default_index ] ||
18859 error "default index $default_index != $stripe_index for $dir"
18861 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
18865 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18866 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18867 skip "Need MDS version at least 2.7.55"
18874 mkdir $DIR/$tdir/normal_dir
18876 #Checking when client cache stripe index
18877 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
18878 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
18879 error "create striped_dir failed"
18881 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
18882 error "create dir0 fails"
18883 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
18884 [ $stripe_index -eq 0 ] ||
18885 error "dir0 expect index 0 got $stripe_index"
18887 mkdir $DIR/$tdir/striped_dir/dir1 ||
18888 error "create dir1 fails"
18889 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
18890 [ $stripe_index -eq 1 ] ||
18891 error "dir1 expect index 1 got $stripe_index"
18893 #check default stripe count/stripe index
18894 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
18895 test_300_check_default_striped_dir normal_dir 1 0
18896 test_300_check_default_striped_dir normal_dir 2 1
18897 test_300_check_default_striped_dir normal_dir 2 -1
18899 #delete default stripe information
18900 echo "delete default stripeEA"
18901 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
18902 error "set default stripe on striped dir error"
18904 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
18905 for dir in $(find $DIR/$tdir/normal_dir/*); do
18906 stripe_count=$($LFS getdirstripe -c $dir)
18907 [ $stripe_count -eq 0 ] ||
18908 error "expect 1 get $stripe_count for $dir"
18909 stripe_index=$($LFS getdirstripe -i $dir)
18910 [ $stripe_index -eq 0 ] ||
18911 error "expect 0 get $stripe_index for $dir"
18914 run_test 300g "check default striped directory for normal directory"
18917 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18918 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18919 skip "Need MDS version at least 2.7.55"
18925 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18926 error "set striped dir error"
18928 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
18929 test_300_check_default_striped_dir striped_dir 1 0
18930 test_300_check_default_striped_dir striped_dir 2 1
18931 test_300_check_default_striped_dir striped_dir 2 -1
18933 #delete default stripe information
18934 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
18935 error "set default stripe on striped dir error"
18937 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
18938 for dir in $(find $DIR/$tdir/striped_dir/*); do
18939 stripe_count=$($LFS getdirstripe -c $dir)
18940 [ $stripe_count -eq 0 ] ||
18941 error "expect 1 get $stripe_count for $dir"
18944 run_test 300h "check default striped directory for striped directory"
18947 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18948 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18949 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18950 skip "Need MDS version at least 2.7.55"
18957 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18958 error "set striped dir error"
18960 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18961 error "create files under striped dir failed"
18963 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
18964 error "set striped hashdir error"
18966 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
18967 error "create dir0 under hash dir failed"
18968 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
18969 error "create dir1 under hash dir failed"
18971 # unfortunately, we need to umount to clear dir layout cache for now
18972 # once we fully implement dir layout, we can drop this
18973 umount_client $MOUNT || error "umount failed"
18974 mount_client $MOUNT || error "mount failed"
18976 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
18977 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
18978 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
18980 #set the stripe to be unknown hash type
18981 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
18982 $LCTL set_param fail_loc=0x1901
18983 for ((i = 0; i < 10; i++)); do
18984 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
18985 error "stat f-$i failed"
18986 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
18989 touch $DIR/$tdir/striped_dir/f0 &&
18990 error "create under striped dir with unknown hash should fail"
18992 $LCTL set_param fail_loc=0
18994 umount_client $MOUNT || error "umount failed"
18995 mount_client $MOUNT || error "mount failed"
18999 run_test 300i "client handle unknown hash type striped directory"
19002 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19003 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19004 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19005 skip "Need MDS version at least 2.7.55"
19012 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
19013 $LCTL set_param fail_loc=0x1702
19014 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19015 error "set striped dir error"
19017 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
19018 error "create files under striped dir failed"
19020 $LCTL set_param fail_loc=0
19022 rm -rf $DIR/$tdir || error "unlink striped dir fails"
19026 run_test 300j "test large update record"
19029 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19030 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19031 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19032 skip "Need MDS version at least 2.7.55"
19039 #define OBD_FAIL_LARGE_STRIPE 0x1703
19040 $LCTL set_param fail_loc=0x1703
19041 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
19042 error "set striped dir error"
19043 $LCTL set_param fail_loc=0
19045 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19046 error "getstripeddir fails"
19047 rm -rf $DIR/$tdir/striped_dir ||
19048 error "unlink striped dir fails"
19052 run_test 300k "test large striped directory"
19055 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19056 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19057 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19058 skip "Need MDS version at least 2.7.55"
19062 test_mkdir -p $DIR/$tdir/striped_dir
19063 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
19064 error "chown $RUNAS_ID failed"
19065 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
19066 error "set default striped dir failed"
19068 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
19069 $LCTL set_param fail_loc=0x80000158
19070 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
19072 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
19073 [ $stripe_index -eq 1 ] ||
19074 error "expect 1 get $stripe_index for $dir"
19076 run_test 300l "non-root user to create dir under striped dir with stale layout"
19079 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19080 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
19081 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19082 skip "Need MDS version at least 2.7.55"
19084 mkdir -p $DIR/$tdir/striped_dir
19085 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
19086 error "set default stripes dir error"
19088 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
19090 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
19091 [ $stripe_count -eq 0 ] ||
19092 error "expect 0 get $stripe_count for a"
19094 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
19095 error "set default stripes dir error"
19097 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
19099 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
19100 [ $stripe_count -eq 0 ] ||
19101 error "expect 0 get $stripe_count for b"
19103 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
19104 error "set default stripes dir error"
19106 mkdir $DIR/$tdir/striped_dir/c &&
19107 error "default stripe_index is invalid, mkdir c should fails"
19109 rm -rf $DIR/$tdir || error "rmdir fails"
19111 run_test 300m "setstriped directory on single MDT FS"
19114 local list=$(comma_list $(mdts_nodes))
19117 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19121 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19122 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19123 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19124 skip "Need MDS version at least 2.7.55"
19125 remote_mds_nodsh && skip "remote MDS with nodsh"
19128 local list=$(comma_list $(mdts_nodes))
19130 trap cleanup_300n RETURN EXIT
19131 mkdir -p $DIR/$tdir
19132 chmod 777 $DIR/$tdir
19133 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
19134 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19135 error "create striped dir succeeds with gid=0"
19137 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19138 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
19139 error "create striped dir fails with gid=-1"
19141 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19142 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
19143 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19144 error "set default striped dir succeeds with gid=0"
19147 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19148 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
19149 error "set default striped dir fails with gid=-1"
19152 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19153 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
19154 error "create test_dir fails"
19155 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
19156 error "create test_dir1 fails"
19157 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
19158 error "create test_dir2 fails"
19161 run_test 300n "non-root user to create dir under striped dir with default EA"
19164 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19165 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19166 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19167 skip "Need MDS version at least 2.7.55"
19172 mkdir -p $DIR/$tdir
19174 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
19175 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
19176 if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then
19177 skip "not enough free inodes $numfree1 $numfree2"
19180 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
19181 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
19182 if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then
19183 skip "not enough free space $numfree1 $numfree2"
19186 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
19187 error "setdirstripe fails"
19189 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
19190 error "create dirs fails"
19192 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
19193 ls $DIR/$tdir/striped_dir > /dev/null ||
19194 error "ls striped dir fails"
19195 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
19196 error "unlink big striped dir fails"
19198 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
19201 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19202 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19203 remote_mds_nodsh && skip "remote MDS with nodsh"
19205 mkdir -p $DIR/$tdir
19207 #define OBD_FAIL_OUT_ENOSPC 0x1704
19208 do_facet mds2 lctl set_param fail_loc=0x80001704
19209 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
19210 && error "create striped directory should fail"
19212 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
19214 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
19217 run_test 300p "create striped directory without space"
19220 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19221 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19223 local fd=$(free_fd)
19224 local cmd="exec $fd<$tdir"
19226 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
19229 trap "eval $cmd" EXIT
19230 cd $tdir || error "cd $tdir fails"
19231 rmdir ../$tdir || error "rmdir $tdir fails"
19232 mkdir local_dir && error "create dir succeeds"
19233 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
19237 run_test 300q "create remote directory under orphan directory"
19240 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
19241 skip "Need MDS version at least 2.7.55" && return
19242 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19246 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
19247 error "set striped dir error"
19249 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19250 error "getstripeddir fails"
19253 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
19254 awk '/lmv_stripe_count:/ { print $2 }')
19256 [ $MDSCOUNT -ne $stripe_count ] &&
19257 error "wrong stripe count $stripe_count expected $MDSCOUNT"
19259 rm -rf $DIR/$tdir/striped_dir ||
19260 error "unlink striped dir fails"
19262 run_test 300r "test -1 striped directory"
19264 prepare_remote_file() {
19265 mkdir $DIR/$tdir/src_dir ||
19266 error "create remote source failed"
19268 cp /etc/hosts $DIR/$tdir/src_dir/a ||
19269 error "cp to remote source failed"
19270 touch $DIR/$tdir/src_dir/a
19272 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
19273 error "create remote target dir failed"
19275 touch $DIR/$tdir/tgt_dir/b
19277 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
19278 error "rename dir cross MDT failed!"
19280 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
19281 error "src_child still exists after rename"
19283 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
19284 error "missing file(a) after rename"
19286 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
19287 error "diff after rename"
19291 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19292 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19294 local remote_file=$DIR/$tdir/tgt_dir/b
19296 mkdir -p $DIR/$tdir
19298 prepare_remote_file || error "prepare remote file failed"
19301 $OPENUNLINK $remote_file $remote_file ||
19302 error "openunlink $remote_file failed"
19303 $CHECKSTAT -a $remote_file || error "$remote_file exists"
19305 run_test 310a "open unlink remote file"
19308 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19309 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19311 local remote_file=$DIR/$tdir/tgt_dir/b
19313 mkdir -p $DIR/$tdir
19315 prepare_remote_file || error "prepare remote file failed"
19317 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19318 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
19319 $CHECKSTAT -t file $remote_file || error "check file failed"
19321 run_test 310b "unlink remote file with multiple links while open"
19324 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19325 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
19327 local remote_file=$DIR/$tdir/tgt_dir/b
19329 mkdir -p $DIR/$tdir
19331 prepare_remote_file || error "prepare remote file failed"
19333 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19334 multiop_bg_pause $remote_file O_uc ||
19335 error "mulitop failed for remote file"
19337 $MULTIOP $DIR/$tfile Ouc
19338 kill -USR1 $MULTIPID
19341 run_test 310c "open-unlink remote file with multiple links"
19345 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19346 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19347 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
19348 skip "lustre < 2.8.54 does not contain LU-4825 fix"
19349 remote_mds_nodsh && skip "remote MDS with nodsh"
19351 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19352 local mdts=$(comma_list $(mdts_nodes))
19354 mkdir -p $DIR/$tdir
19355 $SETSTRIPE -i 0 -c 1 $DIR/$tdir
19356 createmany -o $DIR/$tdir/$tfile. 1000
19358 # statfs data is not real time, let's just calculate it
19359 old_iused=$((old_iused + 1000))
19361 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19362 osp.*OST0000*MDT0000.create_count")
19363 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19364 osp.*OST0000*MDT0000.max_create_count")
19365 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
19367 $SETSTRIPE -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
19368 local index=$($GETSTRIPE -i $DIR/$tdir/$tfile)
19369 [ $index -ne 0 ] || error "$tfile stripe index is 0"
19371 unlinkmany $DIR/$tdir/$tfile. 1000
19373 do_nodes $mdts "$LCTL set_param -n \
19374 osp.*OST0000*.max_create_count=$max_count"
19375 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
19376 do_nodes $mdts "$LCTL set_param -n \
19377 osp.*OST0000*.create_count=$count"
19378 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
19379 grep "=0" && error "create_count is zero"
19382 for i in $(seq 120); do
19383 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19384 # system may be too busy to destroy all objs in time, use
19385 # a somewhat small value to not fail autotest
19386 [ $((old_iused - new_iused)) -gt 400 ] && break
19390 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
19391 [ $((old_iused - new_iused)) -gt 400 ] ||
19392 error "objs not destroyed after unlink"
19394 run_test 311 "disable OSP precreate, and unlink should destroy objs"
19401 local vdevdir=$(dirname $(facet_vdevice $ost))
19402 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
19403 local zfs_zapid=$(do_facet $ost $cmd |
19404 grep -w "/O/0/d$((objid%32))" -C 5 |
19405 awk '/Object/{getline; print $1}')
19406 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
19407 awk "/$objid = /"'{printf $3}')
19412 zfs_object_blksz() {
19416 local vdevdir=$(dirname $(facet_vdevice $ost))
19417 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
19418 local blksz=$(do_facet $ost $cmd $objid |
19419 awk '/dblk/{getline; printf $4}')
19421 case "${blksz: -1}" in
19422 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
19423 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
19430 test_312() { # LU-4856
19431 remote_ost_nodsh && skip "remote OST with nodsh"
19432 [ "$ost1_FSTYPE" = "zfs" ] ||
19433 skip_env "the test only applies to zfs"
19435 local max_blksz=$(do_facet ost1 \
19436 $ZFS get -p recordsize $(facet_device ost1) |
19437 awk '!/VALUE/{print $3}')
19439 # to make life a little bit easier
19440 $LFS mkdir -c 1 -i 0 $DIR/$tdir
19441 $LFS setstripe -c 1 -i 0 $DIR/$tdir
19443 local tf=$DIR/$tdir/$tfile
19445 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19447 # Get ZFS object id
19448 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19449 # block size change by sequential overwrite
19452 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
19453 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
19455 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
19456 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19460 # block size change by sequential append write
19461 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19462 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19463 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19466 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19467 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19468 oflag=sync conv=notrunc
19470 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19471 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19472 error "blksz error, actual $blksz, " \
19473 "expected: 2 * $count * $PAGE_SIZE"
19479 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19480 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19482 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
19483 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19484 [ $blksz -eq $PAGE_SIZE ] ||
19485 error "blksz error: $blksz, expected: $PAGE_SIZE"
19487 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
19488 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19489 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
19491 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
19492 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19493 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
19495 run_test 312 "make sure ZFS adjusts its block size by write pattern"
19498 remote_ost_nodsh && skip "remote OST with nodsh"
19500 local file=$DIR/$tfile
19503 $SETSTRIPE -c 1 -i 0 $file || error "setstripe failed"
19505 # define OBD_FAIL_TGT_RCVD_EIO 0x720
19506 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19507 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
19508 error "write should failed"
19509 do_facet ost1 "$LCTL set_param fail_loc=0"
19512 run_test 313 "io should fail after last_rcvd update fail"
19515 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19517 $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
19518 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19520 wait_delete_completed
19521 do_facet ost1 "$LCTL set_param fail_loc=0"
19523 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
19525 test_315() { # LU-618
19526 local file=$DIR/$tfile
19529 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
19530 error "multiop file write failed"
19531 $MULTIOP $file oO_RDONLY:r4063232_c &
19536 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
19539 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
19542 run_test 315 "read should be accounted"
19545 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19546 large_xattr_enabled || skip_env "ea_inode feature disabled"
19548 rm -rf $DIR/$tdir/d
19549 mkdir -p $DIR/$tdir/d
19550 chown nobody $DIR/$tdir/d
19551 touch $DIR/$tdir/d/file
19553 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
19555 run_test 316 "lfs mv"
19558 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
19559 skip "Need MDS version at least 2.11.53"
19560 if [ "$ost1_FSTYPE" == "zfs" ]; then
19561 skip "LU-10370: no implementation for ZFS"
19565 local grant_blk_size
19567 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
19568 awk '/grant_block_size:/ { print $2; exit; }')
19570 # Create File of size 5M. Truncate it to below size's and verify
19573 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
19574 error "Create file $DIR/$tfile failed"
19575 stack_trap "rm -f $DIR/$tfile" EXIT
19577 for trunc_sz in 2097152 4097 4000 509 0; do
19578 $TRUNCATE $DIR/$tfile $trunc_sz ||
19579 error "truncate $tfile to $trunc_sz failed"
19580 local sz=$(stat --format=%s $DIR/$tfile)
19581 local blk=$(stat --format=%b $DIR/$tfile)
19582 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
19583 grant_blk_size) * 8))
19585 if [[ $blk -ne $trunc_blk ]]; then
19586 $(which stat) $DIR/$tfile
19587 error "Expected Block $trunc_blk got $blk for $tfile"
19590 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19591 error "Expected Size $trunc_sz got $sz for $tfile"
19596 # Create file with a hole and write actual two blocks. Block count
19599 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
19600 conv=fsync || error "Create file : $DIR/$tfile"
19602 # Calculate the final truncate size.
19603 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
19606 # truncate to size $trunc_sz bytes. Strip the last block
19607 # The block count must drop to 8
19609 $TRUNCATE $DIR/$tfile $trunc_sz ||
19610 error "truncate $tfile to $trunc_sz failed"
19612 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
19613 sz=$(stat --format=%s $DIR/$tfile)
19614 blk=$(stat --format=%b $DIR/$tfile)
19616 if [[ $blk -ne $trunc_bsz ]]; then
19617 $(which stat) $DIR/$tfile
19618 error "Expected Block $trunc_bsz got $blk for $tfile"
19621 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19622 error "Expected Size $trunc_sz got $sz for $tfile"
19624 run_test 317 "Verify blocks get correctly update after truncate"
19627 local read_write=$1
19628 if [ "$read_write" = "write" ]; then
19629 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
19630 elif [ "$read_write" = "read" ]; then
19631 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
19633 error "argument error"
19636 # turn off debug for performance testing
19637 local saved_debug=$($LCTL get_param -n debug)
19638 $LCTL set_param debug=0
19640 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
19642 # get ost1 size - lustre-OST0000
19643 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
19644 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
19645 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
19647 if [ "$read_write" = "read" ]; then
19648 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
19651 local start_time=$(date +%s.%N)
19652 $dd_cmd bs=1M count=$blocks oflag=sync ||
19653 error "real dd $read_write error"
19654 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
19656 if [ "$read_write" = "write" ]; then
19660 # define OBD_FAIL_OST_FAKE_RW 0x238
19661 do_facet ost1 $LCTL set_param fail_loc=0x238
19663 local start_time=$(date +%s.%N)
19664 $dd_cmd bs=1M count=$blocks oflag=sync ||
19665 error "fake dd $read_write error"
19666 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
19668 if [ "$read_write" = "write" ]; then
19670 cancel_lru_locks osc
19671 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
19672 error "$tfile size not $blocks MB"
19674 do_facet ost1 $LCTL set_param fail_loc=0
19676 echo "fake $read_write $duration_fake vs. normal $read_write" \
19677 "$duration in seconds"
19678 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
19679 error_not_in_vm "fake write is slower"
19681 $LCTL set_param -n debug="$saved_debug"
19684 test_399a() { # LU-7655 for OST fake write
19685 remote_ost_nodsh && skip "remote OST with nodsh"
19689 run_test 399a "fake write should not be slower than normal write"
19691 test_399b() { # LU-8726 for OST fake read
19692 remote_ost_nodsh && skip "remote OST with nodsh"
19693 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
19694 skip_env "ldiskfs only test"
19699 run_test 399b "fake read should not be slower than normal read"
19701 test_400a() { # LU-1606, was conf-sanity test_74
19702 if ! which $CC > /dev/null 2>&1; then
19703 skip_env "$CC is not installed"
19706 local extra_flags=''
19707 local out=$TMP/$tfile
19708 local prefix=/usr/include/lustre
19711 # Oleg removes c files in his test rig so test if any c files exist
19712 [ -z "$(ls -A $LUSTRE_TESTS_API_DIR)" ] && \
19713 skip_env "Needed c test files are missing"
19715 if ! [[ -d $prefix ]]; then
19716 # Assume we're running in tree and fixup the include path.
19717 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
19718 extra_flags+=" -L$LUSTRE/utils/.lib"
19721 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
19722 $CC -Wall -Werror -std=c99 $extra_flags -o $out $prog -llustreapi ||
19723 error "client api broken"
19727 run_test 400a "Lustre client api program can compile and link"
19729 test_400b() { # LU-1606, LU-5011
19731 local out=$TMP/$tfile
19732 local prefix=/usr/include/linux/lustre
19734 # We use a hard coded prefix so that this test will not fail
19735 # when run in tree. There are headers in lustre/include/lustre/
19736 # that are not packaged (like lustre_idl.h) and have more
19737 # complicated include dependencies (like config.h and lnet/types.h).
19738 # Since this test about correct packaging we just skip them when
19739 # they don't exist (see below) rather than try to fixup cppflags.
19741 if ! which $CC > /dev/null 2>&1; then
19742 skip_env "$CC is not installed"
19745 for header in $prefix/*.h; do
19746 if ! [[ -f "$header" ]]; then
19750 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
19751 continue # lustre_ioctl.h is internal header
19754 $CC -Wall -Werror -std=c99 -include $header -c -x c /dev/null -o $out ||
19755 error "cannot compile '$header'"
19759 run_test 400b "packaged headers can be compiled"
19761 test_401a() { #LU-7437
19762 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
19763 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
19765 #count the number of parameters by "list_param -R"
19766 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
19767 #count the number of parameters by listing proc files
19768 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
19769 echo "proc_dirs='$proc_dirs'"
19770 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
19771 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
19774 [ $params -eq $procs ] ||
19775 error "found $params parameters vs. $procs proc files"
19777 # test the list_param -D option only returns directories
19778 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
19779 #count the number of parameters by listing proc directories
19780 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
19783 [ $params -eq $procs ] ||
19784 error "found $params parameters vs. $procs proc files"
19786 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
19789 local save=$($LCTL get_param -n jobid_var)
19792 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
19793 error "no error returned when setting bad parameters"
19795 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
19796 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
19798 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
19799 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
19800 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
19802 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
19805 local jobid_var_old=$($LCTL get_param -n jobid_var)
19806 local jobid_var_new
19808 $LCTL set_param jobid_var= &&
19809 error "no error returned for 'set_param a='"
19811 jobid_var_new=$($LCTL get_param -n jobid_var)
19812 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19813 error "jobid_var was changed by setting without value"
19815 $LCTL set_param jobid_var &&
19816 error "no error returned for 'set_param a'"
19818 jobid_var_new=$($LCTL get_param -n jobid_var)
19819 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19820 error "jobid_var was changed by setting without value"
19822 run_test 401c "Verify 'lctl set_param' without value fails in either format."
19825 local jobid_var_old=$($LCTL get_param -n jobid_var)
19826 local jobid_var_new
19827 local new_value="foo=bar"
19829 $LCTL set_param jobid_var=$new_value ||
19830 error "'set_param a=b' did not accept a value containing '='"
19832 jobid_var_new=$($LCTL get_param -n jobid_var)
19833 [[ "$jobid_var_new" == "$new_value" ]] ||
19834 error "'set_param a=b' failed on a value containing '='"
19836 # Reset the jobid_var to test the other format
19837 $LCTL set_param jobid_var=$jobid_var_old
19838 jobid_var_new=$($LCTL get_param -n jobid_var)
19839 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19840 error "failed to reset jobid_var"
19842 $LCTL set_param jobid_var $new_value ||
19843 error "'set_param a b' did not accept a value containing '='"
19845 jobid_var_new=$($LCTL get_param -n jobid_var)
19846 [[ "$jobid_var_new" == "$new_value" ]] ||
19847 error "'set_param a b' failed on a value containing '='"
19849 $LCTL set_param jobid_var $jobid_var_old
19850 jobid_var_new=$($LCTL get_param -n jobid_var)
19851 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19852 error "failed to reset jobid_var"
19854 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
19857 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
19858 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
19859 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
19860 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
19861 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
19862 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
19863 remote_mds_nodsh && skip "remote MDS with nodsh"
19865 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
19866 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
19867 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
19868 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
19869 echo "Touch failed - OK"
19871 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
19874 local file1=$DIR/$tfile.1
19875 local file2=$DIR/$tfile.2
19876 local tfile=$TMP/$tfile
19878 rm -f $file1 $file2 $tfile
19883 # 30 sec OBD_TIMEOUT in ll_getattr()
19884 # right before populating st_nlink
19885 $LCTL set_param fail_loc=0x80001409
19886 stat -c %h $file1 > $tfile &
19888 # create an alias, drop all locks and reclaim the dentry
19890 cancel_lru_locks mdc
19891 cancel_lru_locks osc
19892 sysctl -w vm.drop_caches=2
19896 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
19898 rm -f $tfile $file1 $file2
19900 run_test 403 "i_nlink should not drop to zero due to aliasing"
19902 test_404() { # LU-6601
19903 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
19904 skip "Need server version newer than 2.8.52"
19905 remote_mds_nodsh && skip "remote MDS with nodsh"
19907 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
19908 awk '/osp .*-osc-MDT/ { print $4}')
19911 for osp in $mosps; do
19912 echo "Deactivate: " $osp
19913 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
19914 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19915 awk -vp=$osp '$4 == p { print $2 }')
19916 [ $stat = IN ] || {
19917 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19918 error "deactivate error"
19920 echo "Activate: " $osp
19921 do_facet $SINGLEMDS $LCTL --device %$osp activate
19922 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19923 awk -vp=$osp '$4 == p { print $2 }')
19924 [ $stat = UP ] || {
19925 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19926 error "activate error"
19930 run_test 404 "validate manual {de}activated works properly for OSPs"
19933 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] ||
19934 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
19935 skip "Layout swap lock is not supported"
19937 check_swap_layouts_support
19939 test_mkdir $DIR/$tdir
19940 swap_lock_test -d $DIR/$tdir ||
19941 error "One layout swap locked test failed"
19943 run_test 405 "Various layout swap lock tests"
19946 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19947 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
19948 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
19949 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19950 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
19951 skip "Need MDS version at least 2.8.50"
19953 local def_stripe_size=$($LFS getstripe -S $MOUNT)
19954 local test_pool=$TESTNAME
19956 pool_add $test_pool || error "pool_add failed"
19957 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
19958 error "pool_add_targets failed"
19960 save_layout_restore_at_exit $MOUNT
19962 # parent set default stripe count only, child will stripe from both
19963 # parent and fs default
19964 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
19965 error "setstripe $MOUNT failed"
19966 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
19967 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
19968 for i in $(seq 10); do
19969 local f=$DIR/$tdir/$tfile.$i
19970 touch $f || error "touch failed"
19971 local count=$($LFS getstripe -c $f)
19972 [ $count -eq $OSTCOUNT ] ||
19973 error "$f stripe count $count != $OSTCOUNT"
19974 local offset=$($LFS getstripe -i $f)
19975 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
19976 local size=$($LFS getstripe -S $f)
19977 [ $size -eq $((def_stripe_size * 2)) ] ||
19978 error "$f stripe size $size != $((def_stripe_size * 2))"
19979 local pool=$($LFS getstripe -p $f)
19980 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
19983 # change fs default striping, delete parent default striping, now child
19984 # will stripe from new fs default striping only
19985 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
19986 error "change $MOUNT default stripe failed"
19987 $LFS setstripe -c 0 $DIR/$tdir ||
19988 error "delete $tdir default stripe failed"
19989 for i in $(seq 11 20); do
19990 local f=$DIR/$tdir/$tfile.$i
19991 touch $f || error "touch $f failed"
19992 local count=$($LFS getstripe -c $f)
19993 [ $count -eq 1 ] || error "$f stripe count $count != 1"
19994 local offset=$($LFS getstripe -i $f)
19995 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
19996 local size=$($LFS getstripe -S $f)
19997 [ $size -eq $def_stripe_size ] ||
19998 error "$f stripe size $size != $def_stripe_size"
19999 local pool=$($LFS getstripe -p $f)
20000 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
20003 unlinkmany $DIR/$tdir/$tfile. 1 20
20005 local f=$DIR/$tdir/$tfile
20006 pool_remove_all_targets $test_pool $f
20007 pool_remove $test_pool $f
20009 run_test 406 "DNE support fs default striping"
20012 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20013 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
20014 skip "Need MDS version at least 2.8.55"
20015 remote_mds_nodsh && skip "remote MDS with nodsh"
20017 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
20018 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
20019 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
20020 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
20021 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
20023 #define OBD_FAIL_DT_TXN_STOP 0x2019
20024 for idx in $(seq $MDSCOUNT); do
20025 do_facet mds$idx "lctl set_param fail_loc=0x2019"
20027 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
20028 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
20029 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
20032 run_test 407 "transaction fail should cause operation fail"
20035 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
20037 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
20038 lctl set_param fail_loc=0x8000040a
20039 # let ll_prepare_partial_page() fail
20040 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
20044 # create at least 100 unused inodes so that
20045 # shrink_icache_memory(0) should not return 0
20046 touch $DIR/$tfile-{0..100}
20047 rm -f $DIR/$tfile-{0..100}
20050 echo 2 > /proc/sys/vm/drop_caches
20052 run_test 408 "drop_caches should not hang due to page leaks"
20056 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20057 check_mount_and_prep
20059 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
20060 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
20061 touch $DIR/$tdir/guard || error "(2) Fail to create"
20063 local PREFIX=$(str_repeat 'A' 128)
20064 echo "Create 1K hard links start at $(date)"
20065 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20066 error "(3) Fail to hard link"
20068 echo "Links count should be right although linkEA overflow"
20069 stat $DIR/$tdir/guard || error "(4) Fail to stat"
20070 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
20071 [ $linkcount -eq 1001 ] ||
20072 error "(5) Unexpected hard links count: $linkcount"
20074 echo "List all links start at $(date)"
20075 ls -l $DIR/$tdir/foo > /dev/null ||
20076 error "(6) Fail to list $DIR/$tdir/foo"
20078 echo "Unlink hard links start at $(date)"
20079 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20080 error "(7) Fail to unlink"
20082 run_test 409 "Large amount of cross-MDTs hard links on the same file"
20086 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
20087 skip "Need client version at least 2.9.59"
20089 # Create a file, and stat it from the kernel
20090 local testfile=$DIR/$tfile
20093 local run_id=$RANDOM
20094 local my_ino=$(stat --format "%i" $testfile)
20096 # Try to insert the module. This will always fail as the
20097 # module is designed to not be inserted.
20098 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
20101 # Anything but success is a test failure
20103 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
20104 error "no inode match"
20106 run_test 410 "Test inode number returned from kernel thread"
20108 cleanup_test411_cgroup() {
20114 local cg_basedir=/sys/fs/cgroup/memory
20116 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
20117 skip "no setup for cgroup"
20119 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
20120 error "test file creation failed"
20121 cancel_lru_locks osc
20123 # Create a very small memory cgroup to force a slab allocation error
20124 local cgdir=$cg_basedir/osc_slab_alloc
20125 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
20126 trap "cleanup_test411_cgroup $cgdir" EXIT
20127 echo 2M > $cgdir/memory.kmem.limit_in_bytes
20128 echo 1M > $cgdir/memory.limit_in_bytes
20130 # Should not LBUG, just be killed by oom-killer
20131 # dd will return 0 even allocation failure in some environment.
20132 # So don't check return value
20133 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
20134 cleanup_test411_cgroup $cgdir
20138 run_test 411 "Slab allocation error with cgroup does not LBUG"
20141 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20142 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20143 skip "Need server version at least 2.10.55"
20146 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
20147 error "mkdir failed"
20148 $LFS getdirstripe $DIR/$tdir
20149 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
20150 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
20151 error "expect $((MDSCOUT - 1)) get $stripe_index"
20152 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
20153 [ $stripe_count -eq 2 ] ||
20154 error "expect 2 get $stripe_count"
20156 run_test 412 "mkdir on specific MDTs"
20159 [ $MDSCOUNT -lt 2 ] &&
20160 skip "We need at least 2 MDTs for this test"
20162 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20163 skip "Need server version at least 2.10.55"
20166 mkdir $DIR/$tdir || error "mkdir failed"
20168 # find MDT that is the most full
20169 local max=$($LFS df | grep MDT |
20178 END { split(b, c, ":")
20183 for i in $(seq $((MDSCOUNT - 1))); do
20184 $LFS mkdir -c $i $DIR/$tdir/d$i ||
20185 error "mkdir d$i failed"
20186 $LFS getdirstripe $DIR/$tdir/d$i
20187 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
20188 [ $stripe_index -ne $max ] ||
20189 error "don't expect $max"
20192 run_test 413 "mkdir on less full MDTs"
20195 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
20196 $LCTL set_param fail_loc=0x80000521
20197 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
20200 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
20203 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20204 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
20205 skip "Need server version at least 2.11.52"
20215 # this test may be slow on ZFS
20216 [ "$mds1_FSTYPE" == "zfs" ] && total=100
20218 # though this test is designed for striped directory, let's test normal
20219 # directory too since lock is always saved as CoS lock.
20220 test_mkdir $DIR/$tdir || error "mkdir $tdir"
20221 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
20230 start_time=$(date +%s)
20231 for i in $(seq $total); do
20232 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
20235 end_time=$(date +%s)
20236 duration=$((end_time - start_time))
20238 kill -9 $setattr_pid
20240 echo "rename $total files took $duration sec"
20241 [ $duration -lt 100 ] || error "rename took $duration sec"
20243 run_test 415 "lock revoke is not missing"
20246 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
20247 skip "Need server version at least 2.11.55"
20249 # define OBD_FAIL_OSD_TXN_START 0x19a
20250 do_facet mds1 lctl set_param fail_loc=0x19a
20252 lfs mkdir -c $MDSCOUNT $DIR/$tdir
20256 run_test 416 "transaction start failure won't cause system hung"
20260 do_nodes $(comma_list $(mdts_nodes)) \
20261 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
20262 do_nodes $(comma_list $(mdts_nodes)) \
20263 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
20264 do_nodes $(comma_list $(mdts_nodes)) \
20265 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
20269 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20270 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
20271 skip "Need MDS version at least 2.11.56"
20273 trap cleanup_417 RETURN EXIT
20275 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
20276 do_nodes $(comma_list $(mdts_nodes)) \
20277 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
20278 $LFS migrate -m 0 $DIR/$tdir.1 &&
20279 error "migrate dir $tdir.1 should fail"
20281 do_nodes $(comma_list $(mdts_nodes)) \
20282 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
20283 $LFS mkdir -i 1 $DIR/$tdir.2 &&
20284 error "create remote dir $tdir.2 should fail"
20286 do_nodes $(comma_list $(mdts_nodes)) \
20287 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
20288 $LFS mkdir -c 2 $DIR/$tdir.3 &&
20289 error "create striped dir $tdir.3 should fail"
20292 run_test 417 "disable remote dir, striped dir and dir migration"
20294 # Checks that the outputs of df [-i] and lfs df [-i] match
20296 # usage: check_lfs_df <blocks | inodes> <mountpoint>
20306 [ "$1" == "blocks" ] && inodes= || inodes="-i"
20308 for count in {1..100}; do
20312 # read the lines of interest
20313 df_out=($(df -P $inodes $dir | tail -n +2)) ||
20314 error "df $inodes $dir | tail -n +2 failed"
20315 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
20316 error "lfs df $inodes $dir | grep summary: failed"
20318 # skip first substrings of each output as they are different
20319 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
20320 # compare the remaining fields of the two outputs
20322 for i in {1..5}; do
20323 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
20331 lfs df $inodes $dir
20332 error "df and lfs df $1 output mismatch: " \
20333 "df ${inodes}: ${df_out[*]}, " \
20334 "lfs df ${inodes}: ${lfs_df_out[*]}"
20339 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20341 local dir=$DIR/$tdir
20342 local numfiles=$((RANDOM % 4096 + 2))
20343 local numblocks=$((RANDOM % 256 + 1))
20345 wait_delete_completed
20348 # check block output
20349 check_lfs_df blocks $dir
20350 # check inode output
20351 check_lfs_df inodes $dir
20353 # create a single file and retest
20354 echo "Creating a single file and testing"
20355 createmany -o $dir/$tfile- 1 &>/dev/null ||
20356 error "creating 1 file in $dir failed"
20357 check_lfs_df blocks $dir
20358 check_lfs_df inodes $dir
20360 # create a random number of files
20361 echo "Creating $((numfiles - 1)) files and testing"
20362 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
20363 error "creating $((numfiles - 1)) files in $dir failed"
20365 # write a random number of blocks to the first test file
20366 echo "Writing $numblocks 4K blocks and testing"
20367 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
20368 count=$numblocks &>/dev/null ||
20369 error "dd to $dir/${tfile}-0 failed"
20372 check_lfs_df blocks $dir
20373 check_lfs_df inodes $dir
20375 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
20376 error "unlinking $numfiles files in $dir failed"
20378 run_test 418 "df and lfs df outputs match"
20382 local dir=$DIR/$tdir
20387 cancel_lru_locks mdc
20389 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
20390 $LCTL set_param fail_loc=0x1410
20392 $LCTL set_param fail_loc=0
20395 run_test 419 "Verify open file by name doesn't crash kernel"
20399 [[ $MDS1_VERSION -ge $(version_code 2.12.1) ]] ||
20400 skip "Need MDS version at least 2.12.1"
20402 local SAVE_UMASK=$(umask)
20403 local dir=$DIR/$tdir
20404 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
20408 mkdir -m03777 $dir/testdir
20409 ls -dn $dir/testdir
20410 # Need to remove trailing '.' when SELinux is enabled
20411 local dirperms=$(ls -dn $dir/testdir |
20412 awk '{ sub(/\.$/, "", $1); print $1}')
20413 [ $dirperms == "drwxrwsrwt" ] ||
20414 error "incorrect perms on $dir/testdir"
20416 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
20417 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
20418 ls -n $dir/testdir/testfile
20419 local fileperms=$(ls -n $dir/testdir/testfile |
20420 awk '{ sub(/\.$/, "", $1); print $1}')
20421 [ $fileperms == "-rwxr-xr-x" ] ||
20422 error "incorrect perms on $dir/testdir/testfile"
20426 run_test 420 "clear SGID bit on non-directories for non-members"
20433 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20434 skip "Need MDS version at least 2.12.2"
20436 test_mkdir $DIR/$tdir
20437 createmany -o $DIR/$tdir/f 3
20438 cnt=$(ls -1 $DIR/$tdir | wc -l)
20439 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20441 fid1=$(lfs path2fid $DIR/$tdir/f1)
20442 fid2=$(lfs path2fid $DIR/$tdir/f2)
20443 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
20445 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
20446 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
20448 cnt=$(ls -1 $DIR/$tdir | wc -l)
20449 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20451 rm -f $DIR/$tdir/f3 || error "can't remove f3"
20452 createmany -o $DIR/$tdir/f 3
20453 cnt=$(ls -1 $DIR/$tdir | wc -l)
20454 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20456 fid1=$(lfs path2fid $DIR/$tdir/f1)
20457 fid2=$(lfs path2fid $DIR/$tdir/f2)
20458 echo "remove using fsname $FSNAME"
20459 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
20461 cnt=$(ls -1 $DIR/$tdir | wc -l)
20462 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20464 run_test 421a "simple rm by fid"
20471 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20472 skip "Need MDS version at least 2.12.2"
20474 test_mkdir $DIR/$tdir
20475 createmany -o $DIR/$tdir/f 3
20476 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
20479 FID1=$(lfs path2fid $DIR/$tdir/f1)
20480 FID2=$(lfs path2fid $DIR/$tdir/f2)
20481 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
20483 kill -USR1 $MULTIPID
20486 cnt=$(ls $DIR/$tdir | wc -l)
20487 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
20489 run_test 421b "rm by fid on open file"
20495 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20496 skip "Need MDS version at least 2.12.2"
20498 test_mkdir $DIR/$tdir
20499 createmany -o $DIR/$tdir/f 3
20500 touch $DIR/$tdir/$tfile
20501 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
20502 cnt=$(ls -1 $DIR/$tdir | wc -l)
20503 [ $cnt != 184 ] && error "unexpected #files: $cnt"
20505 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
20506 $LFS rmfid $DIR $FID1 || error "rmfid failed"
20508 cnt=$(ls $DIR/$tdir | wc -l)
20509 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
20511 run_test 421c "rm by fid against hardlinked files"
20517 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20518 skip "Need MDS version at least 2.12.2"
20520 test_mkdir $DIR/$tdir
20521 createmany -o $DIR/$tdir/f 4097
20522 cnt=$(ls -1 $DIR/$tdir | wc -l)
20523 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
20525 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
20526 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20528 cnt=$(ls $DIR/$tdir | wc -l)
20530 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20532 run_test 421d "rmfid en masse"
20538 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20539 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20540 skip "Need MDS version at least 2.12.2"
20542 mkdir -p $DIR/$tdir
20543 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20544 createmany -o $DIR/$tdir/striped_dir/f 512
20545 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20546 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20548 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20549 sed "s/[/][^:]*://g")
20550 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20552 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20554 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20556 run_test 421e "rmfid in DNE"
20562 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20563 skip "Need MDS version at least 2.12.2"
20565 test_mkdir $DIR/$tdir
20567 cnt=$(ls -1 $DIR/$tdir | wc -l)
20568 [ $cnt != 1 ] && error "unexpected #files: $cnt"
20570 FID=$(lfs path2fid $DIR/$tdir/f)
20571 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
20572 # rmfid should fail
20573 cnt=$(ls -1 $DIR/$tdir | wc -l)
20574 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
20576 chmod a+rw $DIR/$tdir
20578 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
20579 # rmfid should fail
20580 cnt=$(ls -1 $DIR/$tdir | wc -l)
20581 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
20584 $RUNAS touch $DIR/$tdir/f
20585 FID=$(lfs path2fid $DIR/$tdir/f)
20586 echo "rmfid as root"
20587 $LFS rmfid $DIR $FID || error "rmfid as root failed"
20588 cnt=$(ls -1 $DIR/$tdir | wc -l)
20589 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
20592 $RUNAS touch $DIR/$tdir/f
20593 cnt=$(ls -1 $DIR/$tdir | wc -l)
20594 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
20595 FID=$(lfs path2fid $DIR/$tdir/f)
20596 # rmfid w/o user_fid2path mount option should fail
20597 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
20598 cnt=$(ls -1 $DIR/$tdir | wc -l)
20599 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
20601 umount_client $MOUNT || "failed to umount client"
20602 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
20603 "failed to mount client'"
20605 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
20606 # rmfid should succeed
20607 cnt=$(ls -1 $DIR/$tdir | wc -l)
20608 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
20610 # rmfid shouldn't allow to remove files due to dir's permission
20611 chmod a+rwx $DIR/$tdir
20614 FID=$(lfs path2fid $DIR/$tdir/f)
20615 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
20617 umount_client $MOUNT || "failed to umount client"
20618 mount_client $MOUNT "$MOUNT_OPTS" ||
20619 "failed to mount client'"
20622 run_test 421f "rmfid checks permissions"
20628 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20629 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20630 skip "Need MDS version at least 2.12.2"
20632 mkdir -p $DIR/$tdir
20633 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20634 createmany -o $DIR/$tdir/striped_dir/f 512
20635 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20636 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20638 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20639 sed "s/[/][^:]*://g")
20641 rm -f $DIR/$tdir/striped_dir/f1*
20642 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20643 removed=$((512 - cnt))
20645 # few files have been just removed, so we expect
20646 # rmfid to fail on their fids
20647 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
20648 [ $removed != $errors ] && error "$errors != $removed"
20650 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20652 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20654 run_test 421g "rmfid to return errors properly"
20667 # ensure statfs cache is expired
20670 _stats=$(stat_test | grep $MOUNT | sort -u | wc -l)
20671 [[ ${_stats} -ne 1 ]] && error "statfs wrong"
20675 run_test 423 "statfs should return a right data"
20678 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20679 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20680 skip "Need server version at least 2.9.55"
20682 start_full_debug_logging
20686 stop_full_debug_logging
20690 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20691 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20692 awk '/The barrier for/ { print $7 }')
20695 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
20700 barrier_expired() {
20703 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20704 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20705 awk '/will be expired/ { print $7 }')
20707 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
20716 echo "Start barrier_freeze at: $(date)"
20717 #define OBD_FAIL_BARRIER_DELAY 0x2202
20718 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20719 # Do not reduce barrier time - See LU-11873
20720 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
20723 local b_status=$(barrier_stat)
20724 echo "Got barrier status at: $(date)"
20725 [ "$b_status" = "'freezing_p1'" ] ||
20726 error "(1) unexpected barrier status $b_status"
20728 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20730 b_status=$(barrier_stat)
20731 [ "$b_status" = "'frozen'" ] ||
20732 error "(2) unexpected barrier status $b_status"
20734 local expired=$(barrier_expired)
20735 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
20736 sleep $((expired + 3))
20738 b_status=$(barrier_stat)
20739 [ "$b_status" = "'expired'" ] ||
20740 error "(3) unexpected barrier status $b_status"
20742 # Do not reduce barrier time - See LU-11873
20743 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
20744 error "(4) fail to freeze barrier"
20746 b_status=$(barrier_stat)
20747 [ "$b_status" = "'frozen'" ] ||
20748 error "(5) unexpected barrier status $b_status"
20750 echo "Start barrier_thaw at: $(date)"
20751 #define OBD_FAIL_BARRIER_DELAY 0x2202
20752 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20753 do_facet mgs $LCTL barrier_thaw $FSNAME &
20756 b_status=$(barrier_stat)
20757 echo "Got barrier status at: $(date)"
20758 [ "$b_status" = "'thawing'" ] ||
20759 error "(6) unexpected barrier status $b_status"
20761 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20763 b_status=$(barrier_stat)
20764 [ "$b_status" = "'thawed'" ] ||
20765 error "(7) unexpected barrier status $b_status"
20767 #define OBD_FAIL_BARRIER_FAILURE 0x2203
20768 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
20769 do_facet mgs $LCTL barrier_freeze $FSNAME
20771 b_status=$(barrier_stat)
20772 [ "$b_status" = "'failed'" ] ||
20773 error "(8) unexpected barrier status $b_status"
20775 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
20776 do_facet mgs $LCTL barrier_thaw $FSNAME
20780 run_test 801a "write barrier user interfaces and stat machine"
20785 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20786 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
20787 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
20788 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
20789 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
20791 cancel_lru_locks mdc
20793 # 180 seconds should be long enough
20794 do_facet mgs $LCTL barrier_freeze $FSNAME 180
20796 local b_status=$(barrier_stat)
20797 [ "$b_status" = "'frozen'" ] ||
20798 error "(6) unexpected barrier status $b_status"
20800 mkdir $DIR/$tdir/d0/d10 &
20803 touch $DIR/$tdir/d1/f13 &
20806 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
20809 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
20812 rm -f $DIR/$tdir/d4/f12 &
20815 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
20817 # To guarantee taht the 'stat' is not blocked
20818 b_status=$(barrier_stat)
20819 [ "$b_status" = "'frozen'" ] ||
20820 error "(8) unexpected barrier status $b_status"
20822 # let above commands to run at background
20825 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
20826 ps -p $touch_pid || error "(10) touch should be blocked"
20827 ps -p $ln_pid || error "(11) link should be blocked"
20828 ps -p $mv_pid || error "(12) rename should be blocked"
20829 ps -p $rm_pid || error "(13) unlink should be blocked"
20831 b_status=$(barrier_stat)
20832 [ "$b_status" = "'frozen'" ] ||
20833 error "(14) unexpected barrier status $b_status"
20835 do_facet mgs $LCTL barrier_thaw $FSNAME
20836 b_status=$(barrier_stat)
20837 [ "$b_status" = "'thawed'" ] ||
20838 error "(15) unexpected barrier status $b_status"
20840 wait $mkdir_pid || error "(16) mkdir should succeed"
20841 wait $touch_pid || error "(17) touch should succeed"
20842 wait $ln_pid || error "(18) link should succeed"
20843 wait $mv_pid || error "(19) rename should succeed"
20844 wait $rm_pid || error "(20) unlink should succeed"
20848 run_test 801b "modification will be blocked by write barrier"
20851 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20855 stop mds2 || error "(1) Fail to stop mds2"
20857 do_facet mgs $LCTL barrier_freeze $FSNAME 30
20859 local b_status=$(barrier_stat)
20860 [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || {
20861 do_facet mgs $LCTL barrier_thaw $FSNAME
20862 error "(2) unexpected barrier status $b_status"
20865 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20866 error "(3) Fail to rescan barrier bitmap"
20868 # Do not reduce barrier time - See LU-11873
20869 do_facet mgs $LCTL barrier_freeze $FSNAME 20
20871 b_status=$(barrier_stat)
20872 [ "$b_status" = "'frozen'" ] ||
20873 error "(4) unexpected barrier status $b_status"
20875 do_facet mgs $LCTL barrier_thaw $FSNAME
20876 b_status=$(barrier_stat)
20877 [ "$b_status" = "'thawed'" ] ||
20878 error "(5) unexpected barrier status $b_status"
20880 local devname=$(mdsdevname 2)
20882 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
20884 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20885 error "(7) Fail to rescan barrier bitmap"
20889 run_test 801c "rescan barrier bitmap"
20891 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
20892 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
20893 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
20894 saved_MOUNT_OPTS=$MOUNT_OPTS
20900 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
20901 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
20902 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
20903 MOUNT_OPTS=$saved_MOUNT_OPTS
20908 [[ $mds1_FSTYPE = zfs ]] || skip "ZFS specific test"
20909 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20910 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20911 skip "Need server version at least 2.9.55"
20913 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
20915 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20917 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
20918 error "(2) Fail to copy"
20920 trap cleanup_802 EXIT
20922 # sync by force before remount as readonly
20923 sync; sync_all_data; sleep 3; sync_all_data
20927 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
20928 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
20929 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
20931 echo "Mount the server as read only"
20932 setupall server_only || error "(3) Fail to start servers"
20934 echo "Mount client without ro should fail"
20935 mount_client $MOUNT &&
20936 error "(4) Mount client without 'ro' should fail"
20938 echo "Mount client with ro should succeed"
20939 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
20940 mount_client $MOUNT ||
20941 error "(5) Mount client with 'ro' should succeed"
20943 echo "Modify should be refused"
20944 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
20946 echo "Read should be allowed"
20947 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
20948 error "(7) Read should succeed under ro mode"
20952 run_test 802 "simulate readonly device"
20955 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20956 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20957 skip "MDS needs to be newer than 2.10.54"
20959 mkdir -p $DIR/$tdir
20960 # Create some objects on all MDTs to trigger related logs objects
20961 for idx in $(seq $MDSCOUNT); do
20962 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
20963 $DIR/$tdir/dir${idx} ||
20964 error "Fail to create $DIR/$tdir/dir${idx}"
20968 wait_delete_completed # ensure old test cleanups are finished
20969 echo "before create:"
20971 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20973 for i in {1..10}; do
20974 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
20975 error "Fail to create $DIR/$tdir/foo$i"
20979 echo "after create:"
20981 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20983 # allow for an llog to be cleaned up during the test
20984 [ $after_used -ge $((before_used + 10 - 1)) ] ||
20985 error "before ($before_used) + 10 > after ($after_used)"
20987 for i in {1..10}; do
20988 rm -rf $DIR/$tdir/foo$i ||
20989 error "Fail to remove $DIR/$tdir/foo$i"
20992 sleep 3 # avoid MDT return cached statfs
20993 wait_delete_completed
20994 echo "after unlink:"
20996 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20998 # allow for an llog to be created during the test
20999 [ $after_used -le $((before_used + 1)) ] ||
21000 error "after ($after_used) > before ($before_used) + 1"
21002 run_test 803 "verify agent object for remote object"
21005 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21006 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
21007 skip "MDS needs to be newer than 2.10.54"
21008 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
21010 mkdir -p $DIR/$tdir
21011 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
21012 error "Fail to create $DIR/$tdir/dir0"
21014 local fid=$($LFS path2fid $DIR/$tdir/dir0)
21015 local dev=$(mdsdevname 2)
21017 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21018 grep ${fid} || error "NOT found agent entry for dir0"
21020 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
21021 error "Fail to create $DIR/$tdir/dir1"
21023 touch $DIR/$tdir/dir1/foo0 ||
21024 error "Fail to create $DIR/$tdir/dir1/foo0"
21025 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
21028 for idx in $(seq $MDSCOUNT); do
21029 dev=$(mdsdevname $idx)
21030 do_facet mds${idx} \
21031 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21032 grep ${fid} && rc=$idx
21035 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
21036 error "Fail to rename foo0 to foo1"
21037 if [ $rc -eq 0 ]; then
21038 for idx in $(seq $MDSCOUNT); do
21039 dev=$(mdsdevname $idx)
21040 do_facet mds${idx} \
21041 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21042 grep ${fid} && rc=$idx
21046 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
21047 error "Fail to rename foo1 to foo2"
21048 if [ $rc -eq 0 ]; then
21049 for idx in $(seq $MDSCOUNT); do
21050 dev=$(mdsdevname $idx)
21051 do_facet mds${idx} \
21052 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21053 grep ${fid} && rc=$idx
21057 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
21059 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
21060 error "Fail to link to $DIR/$tdir/dir1/foo2"
21061 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
21062 error "Fail to rename foo2 to foo0"
21063 unlink $DIR/$tdir/dir1/foo0 ||
21064 error "Fail to unlink $DIR/$tdir/dir1/foo0"
21065 rm -rf $DIR/$tdir/dir0 ||
21066 error "Fail to rm $DIR/$tdir/dir0"
21068 for idx in $(seq $MDSCOUNT); do
21069 dev=$(mdsdevname $idx)
21073 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
21075 start mds${idx} $dev $MDS_MOUNT_OPTS ||
21076 error "mount mds$idx failed"
21077 df $MOUNT > /dev/null 2>&1
21079 # e2fsck should not return error
21081 error "e2fsck detected error on MDT${idx}: rc=$rc"
21084 run_test 804 "verify agent entry for remote entry"
21087 do_facet $SINGLEMDS zfs set quota=$old $fsset
21088 unlinkmany $DIR/$tdir/f- 1000000
21093 local zfs_version=$(do_facet mds1 cat /sys/module/zfs/version)
21094 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
21095 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
21096 skip "netfree not implemented before 0.7"
21097 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
21098 skip "Need MDS version at least 2.10.57"
21105 local pref="osd-zfs.lustre-MDT0000."
21107 # limit available space on MDS dataset to meet nospace issue
21108 # quickly. then ZFS 0.7.2 can use reserved space if asked
21109 # properly (using netfree flag in osd_declare_destroy()
21110 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
21111 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
21113 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
21114 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
21115 let "usedkb=usedkb-freekb"
21116 let "freekb=freekb/2"
21117 if let "freekb > 5000"; then
21120 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
21121 trap cleanup_805 EXIT
21123 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
21124 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
21125 rm -rf $DIR/$tdir || error "not able to remove"
21126 do_facet $SINGLEMDS zfs set quota=$old $fsset
21129 run_test 805 "ZFS can remove from full fs"
21135 local size=$($LFS getsom -s $file)
21136 local expect=$(stat -c %s $file)
21138 [[ $size == $expect ]] ||
21139 error "$file expected size: $expect, got: $size"
21141 local blocks=$($LFS getsom -b $file)
21142 expect=$(stat -c %b $file)
21143 [[ $blocks == $expect ]] ||
21144 error "$file expected blocks: $expect, got: $blocks"
21149 local size=$($LFS getsom -s $1)
21152 [[ $size == $expect ]] ||
21153 error "$file expected size: $expect, got: $size"
21157 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21158 skip "Need MDS version at least 2.11.52"
21162 touch $DIR/$tfile || error "touch $tfile failed"
21164 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21165 save_lustre_params client "llite.*.xattr_cache" > $save
21166 lctl set_param llite.*.xattr_cache=0
21167 stack_trap "restore_lustre_params < $save" EXIT
21169 # single-threaded write
21170 echo "Test SOM for single-threaded write"
21171 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
21172 error "write $tfile failed"
21173 check_lsom_size $DIR/$tfile $bs
21176 local size=$(($num * $bs))
21180 echo "Test SOM for single client multi-threaded($num) write"
21181 $TRUNCATE $DIR/$tfile 0
21182 for ((i = 0; i < $num; i++)); do
21183 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21185 offset=$((offset + $bs))
21187 for (( i=0; i < $num; i++ )); do
21190 check_lsom_size $DIR/$tfile $size
21192 $TRUNCATE $DIR/$tfile 0
21193 for ((i = 0; i < $num; i++)); do
21194 offset=$((offset - $bs))
21195 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21198 for (( i=0; i < $num; i++ )); do
21201 check_lsom_size $DIR/$tfile $size
21203 # multi-client writes
21204 num=$(get_node_count ${CLIENTS//,/ })
21205 size=$(($num * $bs))
21209 echo "Test SOM for multi-client ($num) writes"
21210 $TRUNCATE $DIR/$tfile 0
21211 for client in ${CLIENTS//,/ }; do
21212 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21215 offset=$((offset + $bs))
21217 for (( i=0; i < $num; i++ )); do
21220 check_lsom_size $DIR/$tfile $offset
21223 $TRUNCATE $DIR/$tfile 0
21224 for client in ${CLIENTS//,/ }; do
21225 offset=$((offset - $bs))
21226 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21230 for (( i=0; i < $num; i++ )); do
21233 check_lsom_size $DIR/$tfile $size
21236 echo "Test SOM for truncate"
21237 $TRUNCATE $DIR/$tfile 1048576
21238 check_lsom_size $DIR/$tfile 1048576
21239 $TRUNCATE $DIR/$tfile 1234
21240 check_lsom_size $DIR/$tfile 1234
21242 # verify SOM blocks count
21243 echo "Verify SOM block count"
21244 $TRUNCATE $DIR/$tfile 0
21245 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
21246 error "failed to write file $tfile"
21247 check_lsom_data $DIR/$tfile
21249 run_test 806 "Verify Lazy Size on MDS"
21252 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21253 skip "Need MDS version at least 2.11.52"
21255 # Registration step
21256 changelog_register || error "changelog_register failed"
21257 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
21258 changelog_users $SINGLEMDS | grep -q $cl_user ||
21259 error "User $cl_user not found in changelog_users"
21261 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21262 save_lustre_params client "llite.*.xattr_cache" > $save
21263 lctl set_param llite.*.xattr_cache=0
21264 stack_trap "restore_lustre_params < $save" EXIT
21266 rm -rf $DIR/$tdir || error "rm $tdir failed"
21267 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
21268 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
21269 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
21270 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
21271 error "truncate $tdir/trunc failed"
21274 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
21275 error "write $tfile failed"
21277 # multi-client wirtes
21278 local num=$(get_node_count ${CLIENTS//,/ })
21282 echo "Test SOM for multi-client ($num) writes"
21283 touch $DIR/$tfile || error "touch $tfile failed"
21284 $TRUNCATE $DIR/$tfile 0
21285 for client in ${CLIENTS//,/ }; do
21286 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21289 offset=$((offset + $bs))
21291 for (( i=0; i < $num; i++ )); do
21296 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
21297 check_lsom_data $DIR/$tdir/trunc
21298 check_lsom_data $DIR/$tdir/single_dd
21299 check_lsom_data $DIR/$tfile
21302 # Deregistration step
21303 changelog_deregister || error "changelog_deregister failed"
21305 run_test 807 "verify LSOM syncing tool"
21307 check_som_nologged()
21309 local lines=$($LFS changelog $FSNAME-MDT0000 |
21310 grep 'x=trusted.som' | wc -l)
21311 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
21315 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
21316 skip "Need MDS version at least 2.11.55"
21318 # Registration step
21319 changelog_register || error "changelog_register failed"
21321 touch $DIR/$tfile || error "touch $tfile failed"
21324 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
21325 error "write $tfile failed"
21328 $TRUNCATE $DIR/$tfile 1234
21331 $TRUNCATE $DIR/$tfile 1048576
21334 # Deregistration step
21335 changelog_deregister || error "changelog_deregister failed"
21337 run_test 808 "Check trusted.som xattr not logged in Changelogs"
21342 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
21346 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
21347 skip "Need MDS version at least 2.11.56"
21349 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
21350 error "failed to create DoM-only file $DIR/$tfile"
21351 touch $DIR/$tfile || error "touch $tfile failed"
21352 check_som_nodata $DIR/$tfile
21354 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
21355 error "write $tfile failed"
21356 check_som_nodata $DIR/$tfile
21358 $TRUNCATE $DIR/$tfile 1234
21359 check_som_nodata $DIR/$tfile
21361 $TRUNCATE $DIR/$tfile 4097
21362 check_som_nodata $DIR/$file
21364 run_test 809 "Verify no SOM xattr store for DoM-only files"
21367 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21368 $GSS && skip_env "could not run with gss"
21371 stack_trap "set_checksums $ORIG_CSUM" EXIT
21372 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
21377 for csum in $CKSUM_TYPES; do
21378 #define OBD_FAIL_OSC_NO_GRANT 0x411
21379 $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411
21380 for i in "10240 0" "10000 0" "4000 1" "500 1"; do
21382 dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2
21383 before=$(md5sum $DIR/$tfile)
21384 $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear
21385 after=$(md5sum $DIR/$tfile)
21386 [ "$before" == "$after" ] ||
21387 error "$csum: $before != $after bs=$1 seek=$2"
21391 run_test 810 "partial page writes on ZFS (LU-11663)"
21394 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
21395 skip "OST < 2.12.51 doesn't support this fail_loc"
21396 [ "$SHARED_KEY" = true ] &&
21397 skip "OSC connections never go IDLE with Shared-Keys enabled"
21399 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21400 # ensure ost1 is connected
21401 stat $DIR/$tfile >/dev/null || error "can't stat"
21402 wait_osc_import_state client ost1 FULL
21403 # no locks, no reqs to let the connection idle
21404 cancel_lru_locks osc
21406 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
21407 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
21408 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
21409 wait_osc_import_state client ost1 CONNECTING
21410 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
21412 stat $DIR/$tfile >/dev/null || error "can't stat file"
21414 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
21418 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
21419 echo -n y >> $DIR/$tfile
21420 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
21421 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
21423 run_test 814 "sparse cp works as expected (LU-12361)"
21427 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
21428 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
21430 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
21433 [ "$SHARED_KEY" = true ] &&
21434 skip "OSC connections never go IDLE with Shared-Keys enabled"
21436 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21437 # ensure ost1 is connected
21438 stat $DIR/$tfile >/dev/null || error "can't stat"
21439 wait_osc_import_state client ost1 FULL
21440 # no locks, no reqs to let the connection idle
21441 cancel_lru_locks osc
21442 lru_resize_disable osc
21445 before=$($LCTL get_param -n \
21446 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21448 wait_osc_import_state client ost1 IDLE
21449 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
21450 now=$($LCTL get_param -n \
21451 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21452 [ $before == $now ] || error "lru_size changed $before != $now"
21454 run_test 816 "do not reset lru_resize on idle reconnect"
21458 exportfs -u localhost:$DIR/nfsexp
21463 systemctl restart nfs-server.service || skip "failed to restart nfsd"
21465 mkdir -p $DIR/nfsexp
21466 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
21467 error "failed to export nfs"
21469 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
21470 stack_trap cleanup_817 EXIT
21472 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
21473 error "failed to mount nfs to $tmpdir"
21475 cp /bin/true $tmpdir
21476 $DIR/nfsexp/true || error "failed to execute 'true' command"
21478 run_test 817 "nfsd won't cache write lock for exec file"
21481 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21482 cancel_lru_locks osc
21483 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21484 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21485 dd if=$DIR/$tfile of=/dev/null bs=1M count=1
21488 run_test 819a "too big niobuf in read"
21491 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21492 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21493 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21494 cancel_lru_locks osc
21498 run_test 819b "too big niobuf in write"
21502 $LFS setstripe -c1 -i0 $DIR/$tfile
21503 $LFS setstripe -c1 -i1 $DIR/$tfile
21505 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
21506 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
21507 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
21508 error "start $SINGLEMDS failed"
21511 run_test 818 "unlink with failed llog"
21514 # tests that do cleanup/setup should be run at the end
21518 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21521 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
21522 $LCTL set_param fail_loc=0x903
21524 cancel_lru_locks MGC
21526 FAIL_ON_ERROR=true cleanup
21527 FAIL_ON_ERROR=true setup
21529 run_test 900 "umount should not race with any mgc requeue thread"
21533 [ $CLIENT_VERSION -lt $(version_code 2.13.52) ] &&
21534 skip "client does not have LU-13377 fix"
21535 #define OBD_FAIL_LLITE_SHORT_COMMIT 0x1415
21536 $LCTL set_param fail_loc=0x1415
21537 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21538 cancel_lru_locks osc
21541 run_test 902 "test short write doesn't hang lustre"
21544 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
21545 check_and_cleanup_lustre
21546 if [ "$I_MOUNTED" != "yes" ]; then
21547 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true