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 =================================="
8596 [ -z "$(which setfattr 2>/dev/null)" ] &&
8597 skip_env "could not find setfattr"
8598 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8600 # b10930: get/set/list trusted.lov xattr
8601 echo "get/set/list trusted.lov xattr ..."
8602 local testfile=$DIR/$tfile
8603 $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8604 error "setstripe failed"
8605 local STRIPECOUNT=$($GETSTRIPE -c $testfile) ||
8606 error "getstripe failed"
8607 getfattr -d -m "^trusted" $testfile 2>/dev/null | grep "trusted.lov" ||
8608 error "can't get trusted.lov from $testfile"
8610 local testfile2=${testfile}2
8611 local value=$(getfattr -n trusted.lov $testfile 2>/dev/null |
8612 grep "trusted.lov" | sed -e 's/[^=]\+=//')
8615 setfattr -n trusted.lov -v $value $testfile2
8616 local stripe_size=$($GETSTRIPE -S $testfile2)
8617 local stripe_count=$($GETSTRIPE -c $testfile2)
8618 [[ $stripe_size -eq 65536 ]] ||
8619 error "stripe size $stripe_size != 65536"
8620 [[ $stripe_count -eq $STRIPECOUNT ]] ||
8621 error "stripe count $stripe_count != $STRIPECOUNT"
8624 run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
8627 [ -z "$(which setfattr 2>/dev/null)" ] &&
8628 skip_env "could not find setfattr"
8629 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8631 # b10930: get/set/list lustre.lov xattr
8632 echo "get/set/list lustre.lov xattr ..."
8633 test_mkdir $DIR/$tdir
8634 chown $RUNAS_ID $DIR/$tdir
8635 local testfile=$DIR/$tdir/$tfile
8636 $RUNAS $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8637 error "setstripe failed"
8638 local STRIPECOUNT=$($RUNAS $GETSTRIPE -c $testfile) ||
8639 error "getstripe failed"
8640 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
8641 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
8643 local testfile2=${testfile}2
8644 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
8645 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
8647 $RUNAS $MCREATE $testfile2
8648 $RUNAS setfattr -n lustre.lov -v $value $testfile2
8649 local stripe_size=$($RUNAS $GETSTRIPE -S $testfile2)
8650 local stripe_count=$($RUNAS $GETSTRIPE -c $testfile2)
8651 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
8652 [ $stripe_count -eq $STRIPECOUNT ] ||
8653 error "stripe count $stripe_count != $STRIPECOUNT"
8655 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
8657 compare_stripe_info1() {
8658 local stripe_index_all_zero=true
8660 for num in 1 2 3 4; do
8661 for count in $(seq 1 $STRIPE_COUNT); do
8662 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
8663 local size=$((STRIPE_SIZE * num))
8664 local file=file"$num-$offset-$count"
8665 stripe_size=$($LFS getstripe -S $PWD/$file)
8666 [[ $stripe_size -ne $size ]] &&
8667 error "$file: size $stripe_size != $size"
8668 stripe_count=$($LFS getstripe -c $PWD/$file)
8669 # allow fewer stripes to be created, ORI-601
8670 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
8671 error "$file: count $stripe_count != $count"
8672 stripe_index=$($LFS getstripe -i $PWD/$file)
8673 [[ $stripe_index -ne 0 ]] &&
8674 stripe_index_all_zero=false
8678 $stripe_index_all_zero &&
8679 error "all files are being extracted starting from OST index 0"
8683 have_xattrs_include() {
8684 tar --help | grep -q xattrs-include &&
8685 echo --xattrs-include="lustre.*"
8689 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8690 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8692 XINC=$(have_xattrs_include)
8694 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8696 compare_stripe_info1
8698 run_test 102d "tar restore stripe info from tarfile,not keep osts"
8701 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8702 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8704 XINC=$(have_xattrs_include)
8706 test_mkdir $DIR/$tdir.restore
8708 tar cf - --xattrs $tdir | tar xf - \
8709 -C $DIR/$tdir.restore --xattrs $XINC
8710 cd $DIR/$tdir.restore/$tdir
8711 compare_stripe_info1
8713 run_test 102f "tar copy files, not keep osts"
8716 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
8717 skip "must have user_xattr"
8718 [ -z "$(which setfattr 2>/dev/null)" ] &&
8719 skip_env "could not find setfattr"
8720 [ -z "$(which getfattr 2>/dev/null)" ] &&
8721 skip_env "could not find getfattr"
8723 local xsize=${1:-1024} # in bytes
8724 local file=$DIR/$tfile
8725 local value="$(generate_string $xsize)"
8726 local xbig=trusted.big
8729 log "save $xbig on $file"
8730 setfattr -n $xbig -v $value $file ||
8731 error "saving $xbig on $file failed"
8733 local orig=$(get_xattr_value $xbig $file)
8734 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
8736 local xsml=trusted.sml
8737 log "save $xsml on $file"
8738 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
8740 local new=$(get_xattr_value $xbig $file)
8741 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
8743 log "grow $xsml on $file"
8744 setfattr -n $xsml -v "$value" $file ||
8745 error "growing $xsml on $file failed"
8747 new=$(get_xattr_value $xbig $file)
8748 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
8749 log "$xbig still valid after growing $xsml"
8754 test_102h() { # bug 15777
8757 run_test 102h "grow xattr from inside inode to external block"
8760 large_xattr_enabled || skip_env "ea_inode feature disabled"
8762 grow_xattr $(max_xattr_size)
8764 run_test 102ha "grow xattr from inside inode to external inode"
8766 test_102i() { # bug 17038
8767 [ -z "$(which getfattr 2>/dev/null)" ] &&
8768 skip "could not find getfattr"
8771 ln -s $DIR/$tfile $DIR/${tfile}link
8772 getfattr -n trusted.lov $DIR/$tfile ||
8773 error "lgetxattr on $DIR/$tfile failed"
8774 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
8775 grep -i "no such attr" ||
8776 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
8777 rm -f $DIR/$tfile $DIR/${tfile}link
8779 run_test 102i "lgetxattr test on symbolic link ============"
8782 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8783 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8785 XINC=$(have_xattrs_include)
8786 setup_test102 "$RUNAS"
8787 chown $RUNAS_ID $DIR/$tdir
8788 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8790 compare_stripe_info1 "$RUNAS"
8792 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
8795 [ -z "$(which setfattr 2>/dev/null)" ] &&
8796 skip "could not find setfattr"
8799 # b22187 just check that does not crash for regular file.
8800 setfattr -n trusted.lov $DIR/$tfile
8801 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
8802 local test_kdir=$DIR/$tdir
8803 test_mkdir $test_kdir
8804 local default_size=$($LFS getstripe -S $test_kdir)
8805 local default_count=$($LFS getstripe -c $test_kdir)
8806 local default_offset=$($LFS getstripe -i $test_kdir)
8807 $SETSTRIPE -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
8808 error 'dir setstripe failed'
8809 setfattr -n trusted.lov $test_kdir
8810 local stripe_size=$($LFS getstripe -S $test_kdir)
8811 local stripe_count=$($LFS getstripe -c $test_kdir)
8812 local stripe_offset=$($LFS getstripe -i $test_kdir)
8813 [ $stripe_size -eq $default_size ] ||
8814 error "stripe size $stripe_size != $default_size"
8815 [ $stripe_count -eq $default_count ] ||
8816 error "stripe count $stripe_count != $default_count"
8817 [ $stripe_offset -eq $default_offset ] ||
8818 error "stripe offset $stripe_offset != $default_offset"
8819 rm -rf $DIR/$tfile $test_kdir
8821 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
8824 [ -z "$(which getfattr 2>/dev/null)" ] &&
8825 skip "could not find getfattr"
8827 # LU-532 trusted. xattr is invisible to non-root
8828 local testfile=$DIR/$tfile
8832 echo "listxattr as user..."
8833 chown $RUNAS_ID $testfile
8834 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
8835 grep -q "trusted" &&
8836 error "$testfile trusted xattrs are user visible"
8840 run_test 102l "listxattr size test =================================="
8842 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
8843 local path=$DIR/$tfile
8846 listxattr_size_check $path || error "listattr_size_check $path failed"
8848 run_test 102m "Ensure listxattr fails on small bufffer ========"
8852 getxattr() { # getxattr path name
8853 # Return the base64 encoding of the value of xattr name on path.
8857 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
8859 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8861 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8863 getfattr --absolute-names --encoding=base64 --name=$name $path |
8864 awk -F= -v name=$name '$1 == name {
8865 print substr($0, index($0, "=") + 1);
8869 test_102n() { # LU-4101 mdt: protect internal xattrs
8870 [ -z "$(which setfattr 2>/dev/null)" ] &&
8871 skip "could not find setfattr"
8872 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
8874 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
8877 local file0=$DIR/$tfile.0
8878 local file1=$DIR/$tfile.1
8879 local xattr0=$TMP/$tfile.0
8880 local xattr1=$TMP/$tfile.1
8881 local namelist="lov lma lmv link fid version som hsm"
8885 rm -rf $file0 $file1 $xattr0 $xattr1
8888 # Get 'before' xattrs of $file1.
8889 getfattr --absolute-names --dump --match=- $file1 > $xattr0
8891 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
8892 namelist+=" lfsck_namespace"
8893 for name in $namelist; do
8894 # Try to copy xattr from $file0 to $file1.
8895 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8897 setfattr --name=trusted.$name --value="$value" $file1 ||
8898 error "setxattr 'trusted.$name' failed"
8900 # Try to set a garbage xattr.
8901 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8903 if [[ x$name == "xlov" ]]; then
8904 setfattr --name=trusted.lov --value="$value" $file1 &&
8905 error "setxattr invalid 'trusted.lov' success"
8907 setfattr --name=trusted.$name --value="$value" $file1 ||
8908 error "setxattr invalid 'trusted.$name' failed"
8911 # Try to remove the xattr from $file1. We don't care if this
8912 # appears to succeed or fail, we just don't want there to be
8913 # any changes or crashes.
8914 setfattr --remove=$trusted.$name $file1 2> /dev/null
8917 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
8920 # Try to copy xattr from $file0 to $file1.
8921 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8923 setfattr --name=trusted.$name --value="$value" $file1 ||
8924 error "setxattr 'trusted.$name' failed"
8926 # Try to set a garbage xattr.
8927 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8929 setfattr --name=trusted.$name --value="$value" $file1 ||
8930 error "setxattr 'trusted.$name' failed"
8932 # Try to remove the xattr from $file1. We don't care if this
8933 # appears to succeed or fail, we just don't want there to be
8934 # any changes or crashes.
8935 setfattr --remove=$trusted.$name $file1 2> /dev/null
8938 # Get 'after' xattrs of file1.
8939 getfattr --absolute-names --dump --match=- $file1 > $xattr1
8941 if ! diff $xattr0 $xattr1; then
8942 error "before and after xattrs of '$file1' differ"
8945 rm -rf $file0 $file1 $xattr0 $xattr1
8949 run_test 102n "silently ignore setxattr on internal trusted xattrs"
8951 test_102p() { # LU-4703 setxattr did not check ownership
8952 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
8953 skip "MDS needs to be at least 2.5.56"
8955 local testfile=$DIR/$tfile
8959 echo "setfacl as user..."
8960 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
8961 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
8963 echo "setfattr as user..."
8964 setfacl -m "u:$RUNAS_ID:---" $testfile
8965 $RUNAS setfattr -x system.posix_acl_access $testfile
8966 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
8968 run_test 102p "check setxattr(2) correctly fails without permission"
8971 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
8972 skip "MDS needs to be at least 2.6.92"
8974 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
8976 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
8979 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
8980 skip "MDS needs to be at least 2.6.93"
8982 touch $DIR/$tfile || error "touch"
8983 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
8984 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
8985 rm $DIR/$tfile || error "rm"
8988 mkdir -p $DIR/$tdir || error "mkdir"
8989 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
8990 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
8991 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
8992 error "$testfile error deleting user.author1"
8993 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
8994 grep "user.$(basename $tdir)" &&
8995 error "$tdir did not delete user.$(basename $tdir)"
8996 rmdir $DIR/$tdir || error "rmdir"
8999 test_mkdir $DIR/$tdir
9000 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9001 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9002 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9003 error "$testfile error deleting user.author1"
9004 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9005 grep "user.$(basename $tdir)" &&
9006 error "$tdir did not delete user.$(basename $tdir)"
9007 rmdir $DIR/$tdir || error "rm striped dir"
9009 run_test 102r "set EAs with empty values"
9012 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9013 skip "MDS needs to be at least 2.11.52"
9015 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9017 save_lustre_params client "llite.*.xattr_cache" > $save
9019 for cache in 0 1; do
9020 lctl set_param llite.*.xattr_cache=$cache
9023 touch $DIR/$tfile || error "touch"
9024 for prefix in lustre security system trusted user; do
9025 # Note getxattr() may fail with 'Operation not
9026 # supported' or 'No such attribute' depending
9027 # on prefix and cache.
9028 getfattr -n $prefix.n102s $DIR/$tfile &&
9029 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
9033 restore_lustre_params < $save
9035 run_test 102s "getting nonexistent xattrs should fail"
9038 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9039 skip "MDS needs to be at least 2.11.52"
9041 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9043 save_lustre_params client "llite.*.xattr_cache" > $save
9045 for cache in 0 1; do
9046 lctl set_param llite.*.xattr_cache=$cache
9048 for buf_size in 0 256; do
9050 touch $DIR/$tfile || error "touch"
9051 setfattr -n user.multiop $DIR/$tfile
9052 $MULTIOP $DIR/$tfile oa$buf_size ||
9053 error "cannot get zero length xattr value (buf_size = $buf_size)"
9057 restore_lustre_params < $save
9059 run_test 102t "zero length xattr values handled correctly"
9063 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
9068 [ "$UID" != 0 ] && skip "must run as root"
9069 $GSS && skip_env "could not run under gss"
9070 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
9071 skip_env "must have acl enabled"
9072 [ -z "$(which setfacl 2>/dev/null)" ] &&
9073 skip_env "could not find setfacl"
9074 remote_mds_nodsh && skip "remote MDS with nodsh"
9076 gpasswd -a daemon bin # LU-5641
9077 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
9079 declare -a identity_old
9081 for num in $(seq $MDSCOUNT); do
9082 switch_identity $num true || identity_old[$num]=$?
9090 echo "performing cp ..."
9091 run_acl_subtest cp || error "run_acl_subtest cp failed"
9092 echo "performing getfacl-noacl..."
9093 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
9094 echo "performing misc..."
9095 run_acl_subtest misc || error "misc test failed"
9096 echo "performing permissions..."
9097 run_acl_subtest permissions || error "permissions failed"
9098 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
9099 if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] ||
9100 { [ $MDS1_VERSION -lt $(version_code 2.6) ] &&
9101 [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; }
9103 echo "performing permissions xattr..."
9104 run_acl_subtest permissions_xattr ||
9105 error "permissions_xattr failed"
9107 echo "performing setfacl..."
9108 run_acl_subtest setfacl || error "setfacl test failed"
9110 # inheritance test got from HP
9111 echo "performing inheritance..."
9112 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
9113 chmod +x make-tree || error "chmod +x failed"
9114 run_acl_subtest inheritance || error "inheritance test failed"
9117 echo "LU-974 ignore umask when acl is enabled..."
9118 run_acl_subtest 974 || error "LU-974 umask test failed"
9119 if [ $MDSCOUNT -ge 2 ]; then
9120 run_acl_subtest 974_remote ||
9121 error "LU-974 umask test failed under remote dir"
9124 echo "LU-2561 newly created file is same size as directory..."
9125 if [ "$mds1_FSTYPE" != "zfs" ]; then
9126 run_acl_subtest 2561 || error "LU-2561 test failed"
9128 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
9131 run_acl_subtest 4924 || error "LU-4924 test failed"
9136 for num in $(seq $MDSCOUNT); do
9137 if [ "${identity_old[$num]}" = 1 ]; then
9138 switch_identity $num false || identity_old[$num]=$?
9142 run_test 103a "acl test"
9148 for U in {0..511}; do
9150 local O=$(printf "%04o" $U)
9152 umask $(printf "%04o" $((511 ^ $O)))
9153 $LFS setstripe -c 1 $DIR/$tfile.s$O
9154 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
9156 (( $S == ($O & 0666) )) ||
9157 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
9159 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
9160 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
9161 (( $S == ($O & 0666) )) ||
9162 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
9164 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
9165 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
9166 (( $S == ($O & 0666) )) ||
9167 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
9168 rm -f $DIR/$tfile.[smp]$0
9172 # limit the concurrently running threads to 64. LU-11878
9173 local idx=$((U % 64))
9174 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
9179 run_test 103b "umask lfs setstripe"
9183 cp -rp $DIR/$tdir $DIR/$tdir.bak
9185 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
9186 error "$DIR/$tdir shouldn't contain default ACL"
9187 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
9188 error "$DIR/$tdir.bak shouldn't contain default ACL"
9191 run_test 103c "'cp -rp' won't set empty acl"
9194 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9197 lfs df || error "lfs df failed"
9198 lfs df -ih || error "lfs df -ih failed"
9199 lfs df -h $DIR || error "lfs df -h $DIR failed"
9200 lfs df -i $DIR || error "lfs df -i $DIR failed"
9201 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
9202 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
9204 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
9205 lctl --device %$OSC deactivate
9206 lfs df || error "lfs df with deactivated OSC failed"
9207 lctl --device %$OSC activate
9208 # wait the osc back to normal
9209 wait_osc_import_ready client ost
9211 lfs df || error "lfs df with reactivated OSC failed"
9214 run_test 104a "lfs df [-ih] [path] test ========================="
9217 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9218 [ $RUNAS_ID -eq $UID ] &&
9219 skip_env "RUNAS_ID = UID = $UID -- skipping"
9221 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
9222 grep "Permission denied" | wc -l)))
9223 if [ $denied_cnt -ne 0 ]; then
9224 error "lfs check servers test failed"
9227 run_test 104b "$RUNAS lfs check servers test ===================="
9230 # doesn't work on 2.4 kernels
9232 if $(flock_is_enabled); then
9233 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
9235 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
9239 run_test 105a "flock when mounted without -o flock test ========"
9243 if $(flock_is_enabled); then
9244 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
9246 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
9250 run_test 105b "fcntl when mounted without -o flock test ========"
9254 if $(flock_is_enabled); then
9255 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
9257 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
9261 run_test 105c "lockf when mounted without -o flock test"
9263 test_105d() { # bug 15924
9264 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9266 test_mkdir $DIR/$tdir
9267 flock_is_enabled || skip_env "mount w/o flock enabled"
9268 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
9269 $LCTL set_param fail_loc=0x80000315
9270 flocks_test 2 $DIR/$tdir
9272 run_test 105d "flock race (should not freeze) ========"
9274 test_105e() { # bug 22660 && 22040
9275 flock_is_enabled || skip_env "mount w/o flock enabled"
9278 flocks_test 3 $DIR/$tfile
9280 run_test 105e "Two conflicting flocks from same process"
9282 test_106() { #bug 10921
9283 test_mkdir $DIR/$tdir
9284 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9285 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9287 run_test 106 "attempt exec of dir followed by chown of that dir"
9290 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9298 local save_pattern=$(sysctl -n kernel.core_pattern)
9299 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9300 sysctl -w kernel.core_pattern=$file
9301 sysctl -w kernel.core_uses_pid=0
9309 kill -s 11 $SLEEPPID
9311 if [ -e $file ]; then
9312 size=`stat -c%s $file`
9313 [ $size -eq 0 ] && error "Fail to create core file $file"
9315 error "Fail to create core file $file"
9318 sysctl -w kernel.core_pattern=$save_pattern
9319 sysctl -w kernel.core_uses_pid=$save_uses_pid
9322 run_test 107 "Coredump on SIG"
9325 test_mkdir $DIR/$tdir
9326 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9327 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9328 error "mkdir with 256 char should fail, but did not"
9329 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9330 error "create with 255 char failed"
9331 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9332 error "create with 256 char should fail, but did not"
9337 run_test 110 "filename length checking"
9340 # Purpose: To verify dynamic thread (OSS) creation.
9343 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9344 remote_ost_nodsh && skip "remote OST with nodsh"
9346 # Lustre does not stop service threads once they are started.
9347 # Reset number of running threads to default.
9352 local save_params="$TMP/sanity-$TESTNAME.parameters"
9354 # Get ll_ost_io count before I/O
9355 OSTIO_pre=$(do_facet ost1 \
9356 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9357 # Exit if lustre is not running (ll_ost_io not running).
9358 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9360 echo "Starting with $OSTIO_pre threads"
9361 local thread_max=$((OSTIO_pre * 2))
9362 local rpc_in_flight=$((thread_max * 2))
9363 # Number of I/O Process proposed to be started.
9365 local facets=$(get_facets OST)
9367 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9368 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9370 # Set in_flight to $rpc_in_flight
9371 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9372 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9373 nfiles=${rpc_in_flight}
9374 # Set ost thread_max to $thread_max
9375 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9377 # 5 Minutes should be sufficient for max number of OSS
9378 # threads(thread_max) to be created.
9382 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9383 test_mkdir $DIR/$tdir
9384 for i in $(seq $nfiles); do
9385 local file=$DIR/$tdir/${tfile}-$i
9386 $LFS setstripe -c -1 -i 0 $file
9387 ($WTL $file $timeout)&
9390 # I/O Started - Wait for thread_started to reach thread_max or report
9391 # error if thread_started is more than thread_max.
9392 echo "Waiting for thread_started to reach thread_max"
9393 local thread_started=0
9394 local end_time=$((SECONDS + timeout))
9396 while [ $SECONDS -le $end_time ] ; do
9398 # Get ost i/o thread_started count.
9399 thread_started=$(do_facet ost1 \
9401 ost.OSS.ost_io.threads_started | cut -d= -f2")
9402 # Break out if thread_started is equal/greater than thread_max
9403 if [[ $thread_started -ge $thread_max ]]; then
9404 echo ll_ost_io thread_started $thread_started, \
9405 equal/greater than thread_max $thread_max
9411 # Cleanup - We have the numbers, Kill i/o jobs if running.
9412 jobcount=($(jobs -p))
9413 for i in $(seq 0 $((${#jobcount[@]}-1)))
9415 kill -9 ${jobcount[$i]}
9416 if [ $? -ne 0 ] ; then
9418 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
9422 # Cleanup files left by WTL binary.
9423 for i in $(seq $nfiles); do
9424 local file=$DIR/$tdir/${tfile}-$i
9426 if [ $? -ne 0 ] ; then
9427 echo "Warning: Failed to delete file $file"
9431 restore_lustre_params <$save_params
9432 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
9434 # Error out if no new thread has started or Thread started is greater
9436 if [[ $thread_started -le $OSTIO_pre ||
9437 $thread_started -gt $thread_max ]]; then
9438 error "ll_ost_io: thread_started $thread_started" \
9439 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
9440 "No new thread started or thread started greater " \
9444 run_test 115 "verify dynamic thread creation===================="
9447 wait_delete_completed
9448 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
9449 echo "OST kbytes available: ${AVAIL[@]}"
9454 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
9455 #echo OST $i: ${AVAIL[i]}kb
9456 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
9460 if [[ ${AVAIL[i]} -lt $MINV ]]; then
9465 echo "Min free space: OST $MINI: $MINV"
9466 echo "Max free space: OST $MAXI: $MAXV"
9469 test_116a() { # was previously test_116()
9470 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9471 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9472 remote_mds_nodsh && skip "remote MDS with nodsh"
9474 echo -n "Free space priority "
9475 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
9480 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
9481 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
9482 trap simple_cleanup_common EXIT
9484 # Check if we need to generate uneven OSTs
9485 test_mkdir -p $DIR/$tdir/OST${MINI}
9486 local FILL=$((MINV / 4))
9487 local DIFF=$((MAXV - MINV))
9488 local DIFF2=$((DIFF * 100 / MINV))
9490 local threshold=$(do_facet $SINGLEMDS \
9491 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
9492 threshold=${threshold%%%}
9493 echo -n "Check for uneven OSTs: "
9494 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
9496 if [[ $DIFF2 -gt $threshold ]]; then
9498 echo "Don't need to fill OST$MINI"
9500 # generate uneven OSTs. Write 2% over the QOS threshold value
9502 DIFF=$((threshold - DIFF2 + 2))
9503 DIFF2=$((MINV * DIFF / 100))
9504 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
9505 $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
9506 error "setstripe failed"
9507 DIFF=$((DIFF2 / 2048))
9509 while [ $i -lt $DIFF ]; do
9511 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
9512 bs=2M count=1 2>/dev/null
9521 DIFF=$((MAXV - MINV))
9522 DIFF2=$((DIFF * 100 / MINV))
9523 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
9524 if [ $DIFF2 -gt $threshold ]; then
9527 echo "failed - QOS mode won't be used"
9528 simple_cleanup_common
9529 skip "QOS imbalance criteria not met"
9537 # now fill using QOS
9538 $SETSTRIPE -c 1 $DIR/$tdir
9539 FILL=$((FILL / 200))
9540 if [ $FILL -gt 600 ]; then
9543 echo "writing $FILL files to QOS-assigned OSTs"
9545 while [ $i -lt $FILL ]; do
9547 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
9551 echo "wrote $i 200k files"
9555 echo "Note: free space may not be updated, so measurements might be off"
9557 DIFF2=$((MAXV - MINV))
9558 echo "free space delta: orig $DIFF final $DIFF2"
9559 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
9560 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
9561 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
9562 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
9563 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
9564 if [[ $DIFF -gt 0 ]]; then
9565 FILL=$((DIFF2 * 100 / DIFF - 100))
9566 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
9569 # Figure out which files were written where
9570 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9571 awk '/'$MINI1': / {print $2; exit}')
9573 MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9574 echo "$MINC files created on smaller OST $MINI1"
9575 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9576 awk '/'$MAXI1': / {print $2; exit}')
9578 MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9579 echo "$MAXC files created on larger OST $MAXI1"
9580 if [[ $MINC -gt 0 ]]; then
9581 FILL=$((MAXC * 100 / MINC - 100))
9582 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
9584 [[ $MAXC -gt $MINC ]] ||
9585 error_ignore LU-9 "stripe QOS didn't balance free space"
9586 simple_cleanup_common
9588 run_test 116a "stripe QOS: free space balance ==================="
9590 test_116b() { # LU-2093
9591 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9592 remote_mds_nodsh && skip "remote MDS with nodsh"
9594 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
9595 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
9596 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
9597 [ -z "$old_rr" ] && skip "no QOS"
9598 do_facet $SINGLEMDS lctl set_param \
9599 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
9601 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
9602 createmany -o $DIR/$tdir/f- 20 || error "can't create"
9603 do_facet $SINGLEMDS lctl set_param fail_loc=0
9605 do_facet $SINGLEMDS lctl set_param \
9606 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
9608 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
9610 test_117() # bug 10891
9612 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9614 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
9615 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
9616 lctl set_param fail_loc=0x21e
9617 > $DIR/$tfile || error "truncate failed"
9618 lctl set_param fail_loc=0
9619 echo "Truncate succeeded."
9622 run_test 117 "verify osd extend =========="
9624 NO_SLOW_RESENDCOUNT=4
9625 export OLD_RESENDCOUNT=""
9626 set_resend_count () {
9627 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
9628 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
9629 lctl set_param -n $PROC_RESENDCOUNT $1
9630 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
9633 # for reduce test_118* time (b=14842)
9634 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9636 # Reset async IO behavior after error case
9638 FILE=$DIR/reset_async
9640 # Ensure all OSCs are cleared
9641 $SETSTRIPE -c -1 $FILE
9642 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
9647 test_118a() #bug 11710
9649 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9653 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9654 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9655 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9657 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9658 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9663 run_test 118a "verify O_SYNC works =========="
9667 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9668 remote_ost_nodsh && skip "remote OST with nodsh"
9672 #define OBD_FAIL_SRV_ENOENT 0x217
9673 set_nodes_failloc "$(osts_nodes)" 0x217
9674 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9676 set_nodes_failloc "$(osts_nodes)" 0
9677 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9678 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9681 if [[ $RC -eq 0 ]]; then
9682 error "Must return error due to dropped pages, rc=$RC"
9686 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9687 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9691 echo "Dirty pages not leaked on ENOENT"
9693 # Due to the above error the OSC will issue all RPCs syncronously
9694 # until a subsequent RPC completes successfully without error.
9695 $MULTIOP $DIR/$tfile Ow4096yc
9700 run_test 118b "Reclaim dirty pages on fatal error =========="
9704 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9706 # for 118c, restore the original resend count, LU-1940
9707 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
9708 set_resend_count $OLD_RESENDCOUNT
9709 remote_ost_nodsh && skip "remote OST with nodsh"
9713 #define OBD_FAIL_OST_EROFS 0x216
9714 set_nodes_failloc "$(osts_nodes)" 0x216
9716 # multiop should block due to fsync until pages are written
9717 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9721 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9722 error "Multiop failed to block on fsync, pid=$MULTIPID"
9725 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9727 if [[ $WRITEBACK -eq 0 ]]; then
9728 error "No page in writeback, writeback=$WRITEBACK"
9731 set_nodes_failloc "$(osts_nodes)" 0
9734 if [[ $RC -ne 0 ]]; then
9735 error "Multiop fsync failed, rc=$RC"
9738 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9739 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9741 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9742 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9746 echo "Dirty pages flushed via fsync on EROFS"
9749 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
9751 # continue to use small resend count to reduce test_118* time (b=14842)
9752 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9756 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9757 remote_ost_nodsh && skip "remote OST with nodsh"
9761 #define OBD_FAIL_OST_BRW_PAUSE_BULK
9762 set_nodes_failloc "$(osts_nodes)" 0x214
9763 # multiop should block due to fsync until pages are written
9764 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9768 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9769 error "Multiop failed to block on fsync, pid=$MULTIPID"
9772 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9774 if [[ $WRITEBACK -eq 0 ]]; then
9775 error "No page in writeback, writeback=$WRITEBACK"
9778 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
9779 set_nodes_failloc "$(osts_nodes)" 0
9781 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9782 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9784 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9785 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9789 echo "Dirty pages gaurenteed flushed via fsync"
9792 run_test 118d "Fsync validation inject a delay of the bulk =========="
9795 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9799 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
9800 lctl set_param fail_loc=0x8000040a
9802 # Should simulate EINVAL error which is fatal
9803 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9805 if [[ $RC -eq 0 ]]; then
9806 error "Must return error due to dropped pages, rc=$RC"
9809 lctl set_param fail_loc=0x0
9811 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9812 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9813 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9815 if [[ $LOCKED -ne 0 ]]; then
9816 error "Locked pages remain in cache, locked=$LOCKED"
9819 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9820 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9824 echo "No pages locked after fsync"
9829 run_test 118f "Simulate unrecoverable OSC side error =========="
9832 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9836 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
9837 lctl set_param fail_loc=0x406
9839 # simulate local -ENOMEM
9840 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9843 lctl set_param fail_loc=0
9844 if [[ $RC -eq 0 ]]; then
9845 error "Must return error due to dropped pages, rc=$RC"
9848 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9849 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9850 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9852 if [[ $LOCKED -ne 0 ]]; then
9853 error "Locked pages remain in cache, locked=$LOCKED"
9856 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9857 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9861 echo "No pages locked after fsync"
9866 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
9869 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9870 remote_ost_nodsh && skip "remote OST with nodsh"
9874 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9875 set_nodes_failloc "$(osts_nodes)" 0x20e
9876 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9877 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9880 set_nodes_failloc "$(osts_nodes)" 0
9881 if [[ $RC -eq 0 ]]; then
9882 error "Must return error due to dropped pages, rc=$RC"
9885 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9886 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9887 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9889 if [[ $LOCKED -ne 0 ]]; then
9890 error "Locked pages remain in cache, locked=$LOCKED"
9893 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9894 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9898 echo "No pages locked after fsync"
9902 run_test 118h "Verify timeout in handling recoverables errors =========="
9904 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
9907 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9908 remote_ost_nodsh && skip "remote OST with nodsh"
9912 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9913 set_nodes_failloc "$(osts_nodes)" 0x20e
9915 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9916 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9919 set_nodes_failloc "$(osts_nodes)" 0
9923 if [[ $RC -ne 0 ]]; then
9924 error "got error, but should be not, rc=$RC"
9927 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9928 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9929 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9930 if [[ $LOCKED -ne 0 ]]; then
9931 error "Locked pages remain in cache, locked=$LOCKED"
9934 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9935 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9939 echo "No pages locked after fsync"
9943 run_test 118i "Fix error before timeout in recoverable error =========="
9945 [ "$SLOW" = "no" ] && set_resend_count 4
9948 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9949 remote_ost_nodsh && skip "remote OST with nodsh"
9953 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
9954 set_nodes_failloc "$(osts_nodes)" 0x220
9956 # return -EIO from OST
9957 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9959 set_nodes_failloc "$(osts_nodes)" 0x0
9960 if [[ $RC -eq 0 ]]; then
9961 error "Must return error due to dropped pages, rc=$RC"
9964 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9965 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9966 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9967 if [[ $LOCKED -ne 0 ]]; then
9968 error "Locked pages remain in cache, locked=$LOCKED"
9971 # in recoverable error on OST we want resend and stay until it finished
9972 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9973 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9977 echo "No pages locked after fsync"
9981 run_test 118j "Simulate unrecoverable OST side error =========="
9985 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9986 remote_ost_nodsh && skip "remote OSTs with nodsh"
9988 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9989 set_nodes_failloc "$(osts_nodes)" 0x20e
9990 test_mkdir $DIR/$tdir
9992 for ((i=0;i<10;i++)); do
9993 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
9994 error "dd to $DIR/$tdir/$tfile-$i failed" )&
10001 set_nodes_failloc "$(osts_nodes)" 0
10004 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
10006 test_118l() # LU-646
10008 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10010 test_mkdir $DIR/$tdir
10011 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
10014 run_test 118l "fsync dir"
10016 test_118m() # LU-3066
10018 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10020 test_mkdir $DIR/$tdir
10021 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
10024 run_test 118m "fdatasync dir ========="
10026 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10033 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10034 remote_ost_nodsh && skip "remote OSTs with nodsh"
10036 # Sleep to avoid a cached response.
10037 #define OBD_STATFS_CACHE_SECONDS 1
10040 # Inject a 10 second delay in the OST_STATFS handler.
10041 #define OBD_FAIL_OST_STATFS_DELAY 0x242
10042 set_nodes_failloc "$(osts_nodes)" 0x242
10045 stat --file-system $MOUNT > /dev/null
10048 set_nodes_failloc "$(osts_nodes)" 0
10050 if ((end - begin > 20)); then
10051 error "statfs took $((end - begin)) seconds, expected 10"
10054 run_test 118n "statfs() sends OST_STATFS requests in parallel"
10056 test_119a() # bug 11737
10058 BSIZE=$((512 * 1024))
10059 directio write $DIR/$tfile 0 1 $BSIZE
10060 # We ask to read two blocks, which is more than a file size.
10061 # directio will indicate an error when requested and actual
10062 # sizes aren't equeal (a normal situation in this case) and
10063 # print actual read amount.
10064 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
10065 if [ "$NOB" != "$BSIZE" ]; then
10066 error "read $NOB bytes instead of $BSIZE"
10070 run_test 119a "Short directIO read must return actual read amount"
10072 test_119b() # bug 11737
10074 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10076 $SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed"
10077 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
10079 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
10080 error "direct read failed"
10083 run_test 119b "Sparse directIO read must return actual read amount"
10085 test_119c() # bug 13099
10088 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
10089 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
10092 run_test 119c "Testing for direct read hitting hole"
10094 test_119d() # bug 15950
10096 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10098 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
10099 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
10101 $SETSTRIPE $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
10102 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
10103 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
10104 lctl set_param fail_loc=0x40d
10105 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
10108 cat $DIR/$tfile > /dev/null &
10109 lctl set_param fail_loc=0
10112 log "the DIO writes have completed, now wait for the reads (should not block very long)"
10114 [ -n "`ps h -p $pid_reads -o comm`" ] && \
10115 error "the read rpcs have not completed in 2s"
10117 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
10119 run_test 119d "The DIO path should try to send a new rpc once one is completed"
10122 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10123 remote_mds_nodsh && skip "remote MDS with nodsh"
10124 test_mkdir $DIR/$tdir
10125 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10126 skip_env "no early lock cancel on server"
10128 lru_resize_disable mdc
10129 lru_resize_disable osc
10130 cancel_lru_locks mdc
10131 # asynchronous object destroy at MDT could cause bl ast to client
10132 cancel_lru_locks osc
10134 stat $DIR/$tdir > /dev/null
10135 can1=$(do_facet $SINGLEMDS \
10136 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10137 awk '/ldlm_cancel/ {print $2}')
10138 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10139 awk '/ldlm_bl_callback/ {print $2}')
10140 test_mkdir -c1 $DIR/$tdir/d1
10141 can2=$(do_facet $SINGLEMDS \
10142 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10143 awk '/ldlm_cancel/ {print $2}')
10144 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10145 awk '/ldlm_bl_callback/ {print $2}')
10146 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10147 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10148 lru_resize_enable mdc
10149 lru_resize_enable osc
10151 run_test 120a "Early Lock Cancel: mkdir test"
10154 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10155 remote_mds_nodsh && skip "remote MDS with nodsh"
10156 test_mkdir $DIR/$tdir
10157 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10158 skip_env "no early lock cancel on server"
10160 lru_resize_disable mdc
10161 lru_resize_disable osc
10162 cancel_lru_locks mdc
10163 stat $DIR/$tdir > /dev/null
10164 can1=$(do_facet $SINGLEMDS \
10165 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10166 awk '/ldlm_cancel/ {print $2}')
10167 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10168 awk '/ldlm_bl_callback/ {print $2}')
10169 touch $DIR/$tdir/f1
10170 can2=$(do_facet $SINGLEMDS \
10171 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10172 awk '/ldlm_cancel/ {print $2}')
10173 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10174 awk '/ldlm_bl_callback/ {print $2}')
10175 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10176 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10177 lru_resize_enable mdc
10178 lru_resize_enable osc
10180 run_test 120b "Early Lock Cancel: create test"
10183 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10184 remote_mds_nodsh && skip "remote MDS with nodsh"
10185 test_mkdir -c1 $DIR/$tdir
10186 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10187 skip "no early lock cancel on server"
10189 lru_resize_disable mdc
10190 lru_resize_disable osc
10191 test_mkdir -c1 $DIR/$tdir/d1
10192 test_mkdir -c1 $DIR/$tdir/d2
10193 touch $DIR/$tdir/d1/f1
10194 cancel_lru_locks mdc
10195 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
10196 can1=$(do_facet $SINGLEMDS \
10197 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10198 awk '/ldlm_cancel/ {print $2}')
10199 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10200 awk '/ldlm_bl_callback/ {print $2}')
10201 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10202 can2=$(do_facet $SINGLEMDS \
10203 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10204 awk '/ldlm_cancel/ {print $2}')
10205 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10206 awk '/ldlm_bl_callback/ {print $2}')
10207 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10208 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10209 lru_resize_enable mdc
10210 lru_resize_enable osc
10212 run_test 120c "Early Lock Cancel: link test"
10215 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10216 remote_mds_nodsh && skip "remote MDS with nodsh"
10217 test_mkdir -c1 $DIR/$tdir
10218 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10219 skip_env "no early lock cancel on server"
10221 lru_resize_disable mdc
10222 lru_resize_disable osc
10224 cancel_lru_locks mdc
10225 stat $DIR/$tdir > /dev/null
10226 can1=$(do_facet $SINGLEMDS \
10227 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10228 awk '/ldlm_cancel/ {print $2}')
10229 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10230 awk '/ldlm_bl_callback/ {print $2}')
10231 chmod a+x $DIR/$tdir
10232 can2=$(do_facet $SINGLEMDS \
10233 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10234 awk '/ldlm_cancel/ {print $2}')
10235 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10236 awk '/ldlm_bl_callback/ {print $2}')
10237 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10238 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10239 lru_resize_enable mdc
10240 lru_resize_enable osc
10242 run_test 120d "Early Lock Cancel: setattr test"
10245 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10246 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10247 skip_env "no early lock cancel on server"
10248 remote_mds_nodsh && skip "remote MDS with nodsh"
10250 local dlmtrace_set=false
10252 test_mkdir -c1 $DIR/$tdir
10253 lru_resize_disable mdc
10254 lru_resize_disable osc
10255 ! $LCTL get_param debug | grep -q dlmtrace &&
10256 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
10257 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
10258 cancel_lru_locks mdc
10259 cancel_lru_locks osc
10260 dd if=$DIR/$tdir/f1 of=/dev/null
10261 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
10262 # XXX client can not do early lock cancel of OST lock
10263 # during unlink (LU-4206), so cancel osc lock now.
10265 cancel_lru_locks osc
10266 can1=$(do_facet $SINGLEMDS \
10267 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10268 awk '/ldlm_cancel/ {print $2}')
10269 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10270 awk '/ldlm_bl_callback/ {print $2}')
10271 unlink $DIR/$tdir/f1
10273 can2=$(do_facet $SINGLEMDS \
10274 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10275 awk '/ldlm_cancel/ {print $2}')
10276 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10277 awk '/ldlm_bl_callback/ {print $2}')
10278 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10279 $LCTL dk $TMP/cancel.debug.txt
10280 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10281 $LCTL dk $TMP/blocking.debug.txt
10282 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10283 lru_resize_enable mdc
10284 lru_resize_enable osc
10286 run_test 120e "Early Lock Cancel: unlink test"
10289 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10290 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10291 skip_env "no early lock cancel on server"
10292 remote_mds_nodsh && skip "remote MDS with nodsh"
10294 test_mkdir -c1 $DIR/$tdir
10295 lru_resize_disable mdc
10296 lru_resize_disable osc
10297 test_mkdir -c1 $DIR/$tdir/d1
10298 test_mkdir -c1 $DIR/$tdir/d2
10299 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10300 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10301 cancel_lru_locks mdc
10302 cancel_lru_locks osc
10303 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10304 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10305 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10306 # XXX client can not do early lock cancel of OST lock
10307 # during rename (LU-4206), so cancel osc lock now.
10309 cancel_lru_locks osc
10310 can1=$(do_facet $SINGLEMDS \
10311 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10312 awk '/ldlm_cancel/ {print $2}')
10313 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10314 awk '/ldlm_bl_callback/ {print $2}')
10315 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10317 can2=$(do_facet $SINGLEMDS \
10318 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10319 awk '/ldlm_cancel/ {print $2}')
10320 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10321 awk '/ldlm_bl_callback/ {print $2}')
10322 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10323 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10324 lru_resize_enable mdc
10325 lru_resize_enable osc
10327 run_test 120f "Early Lock Cancel: rename test"
10330 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10331 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10332 skip_env "no early lock cancel on server"
10333 remote_mds_nodsh && skip "remote MDS with nodsh"
10335 lru_resize_disable mdc
10336 lru_resize_disable osc
10338 echo create $count files
10339 test_mkdir $DIR/$tdir
10340 cancel_lru_locks mdc
10341 cancel_lru_locks osc
10344 can0=$(do_facet $SINGLEMDS \
10345 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10346 awk '/ldlm_cancel/ {print $2}')
10347 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10348 awk '/ldlm_bl_callback/ {print $2}')
10349 createmany -o $DIR/$tdir/f $count
10351 can1=$(do_facet $SINGLEMDS \
10352 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10353 awk '/ldlm_cancel/ {print $2}')
10354 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10355 awk '/ldlm_bl_callback/ {print $2}')
10357 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10358 echo rm $count files
10361 can2=$(do_facet $SINGLEMDS \
10362 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10363 awk '/ldlm_cancel/ {print $2}')
10364 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10365 awk '/ldlm_bl_callback/ {print $2}')
10367 echo total: $count removes in $((t2-t1))
10368 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10370 # wait for commitment of removal
10371 lru_resize_enable mdc
10372 lru_resize_enable osc
10374 run_test 120g "Early Lock Cancel: performance test"
10376 test_121() { #bug #10589
10377 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10380 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10381 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10382 lctl set_param fail_loc=0x310
10383 cancel_lru_locks osc > /dev/null
10384 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10385 lctl set_param fail_loc=0
10386 [[ $reads -eq $writes ]] ||
10387 error "read $reads blocks, must be $writes blocks"
10389 run_test 121 "read cancel race ========="
10391 test_123a() { # was test 123, statahead(bug 11401)
10392 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10395 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10396 log "testing UP system. Performance may be lower than expected."
10401 test_mkdir $DIR/$tdir
10402 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10403 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10405 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10406 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10408 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10409 lctl set_param -n llite.*.statahead_max 0
10410 lctl get_param llite.*.statahead_max
10411 cancel_lru_locks mdc
10412 cancel_lru_locks osc
10414 time ls -l $DIR/$tdir | wc -l
10416 delta=$((etime - stime))
10417 log "ls $i files without statahead: $delta sec"
10418 lctl set_param llite.*.statahead_max=$max
10420 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10421 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
10422 cancel_lru_locks mdc
10423 cancel_lru_locks osc
10425 time ls -l $DIR/$tdir | wc -l
10427 delta_sa=$((etime - stime))
10428 log "ls $i files with statahead: $delta_sa sec"
10429 lctl get_param -n llite.*.statahead_stats
10430 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10432 [[ $swrong -lt $ewrong ]] &&
10433 log "statahead was stopped, maybe too many locks held!"
10434 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
10436 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10437 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10438 lctl set_param -n llite.*.statahead_max 0
10439 lctl get_param llite.*.statahead_max
10440 cancel_lru_locks mdc
10441 cancel_lru_locks osc
10443 time ls -l $DIR/$tdir | wc -l
10445 delta=$((etime - stime))
10446 log "ls $i files again without statahead: $delta sec"
10447 lctl set_param llite.*.statahead_max=$max
10448 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10449 if [ $SLOWOK -eq 0 ]; then
10450 error "ls $i files is slower with statahead!"
10452 log "ls $i files is slower with statahead!"
10458 [ $delta -gt 20 ] && break
10459 [ $delta -gt 8 ] && MULT=$((50 / delta))
10460 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
10468 delta=$((etime - stime))
10469 log "rm -r $DIR/$tdir/: $delta seconds"
10471 lctl get_param -n llite.*.statahead_stats
10473 run_test 123a "verify statahead work"
10475 test_123b () { # statahead(bug 15027)
10476 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10478 test_mkdir $DIR/$tdir
10479 createmany -o $DIR/$tdir/$tfile-%d 1000
10481 cancel_lru_locks mdc
10482 cancel_lru_locks osc
10484 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
10485 lctl set_param fail_loc=0x80000803
10486 ls -lR $DIR/$tdir > /dev/null
10488 lctl set_param fail_loc=0x0
10489 lctl get_param -n llite.*.statahead_stats
10494 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
10497 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
10499 test_mkdir -i 0 -c 1 $DIR/$tdir.0
10500 test_mkdir -i 1 -c 1 $DIR/$tdir.1
10501 touch $DIR/$tdir.1/{1..3}
10502 mv $DIR/$tdir.1/{1..3} $DIR/$tdir.0
10504 remount_client $MOUNT
10506 $MULTIOP $DIR/$tdir.0 Q
10508 # let statahead to complete
10509 ls -l $DIR/$tdir.0 > /dev/null
10511 testid=$(echo $TESTNAME | tr '_' ' ')
10512 dmesg | tac | sed "/$testid/,$ d" | grep "Can not initialize inode" &&
10513 error "statahead warning" || true
10515 run_test 123c "Can not initialize inode warning on DNE statahead"
10518 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10519 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10520 skip_env "no lru resize on server"
10524 test_mkdir $DIR/$tdir
10526 log "create $NR files at $DIR/$tdir"
10527 createmany -o $DIR/$tdir/f $NR ||
10528 error "failed to create $NR files in $DIR/$tdir"
10530 cancel_lru_locks mdc
10531 ls -l $DIR/$tdir > /dev/null
10535 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
10536 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
10537 LRU_SIZE=$($LCTL get_param -n $PARAM)
10538 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
10539 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
10541 log "NS=$(basename $NSDIR)"
10546 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
10547 skip "Not enough cached locks created!"
10549 log "LRU=$LRU_SIZE"
10553 # We know that lru resize allows one client to hold $LIMIT locks
10554 # for 10h. After that locks begin to be killed by client.
10556 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
10558 if [ $LIMIT -lt $LRU_SIZE ]; then
10559 skip "Limit is too small $LIMIT"
10562 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
10563 # killing locks. Some time was spent for creating locks. This means
10564 # that up to the moment of sleep finish we must have killed some of
10565 # them (10-100 locks). This depends on how fast ther were created.
10566 # Many of them were touched in almost the same moment and thus will
10567 # be killed in groups.
10568 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
10570 # Use $LRU_SIZE_B here to take into account real number of locks
10571 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
10572 local LRU_SIZE_B=$LRU_SIZE
10574 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
10575 log "OLD_LVF=$OLD_LVF"
10576 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
10578 # Let's make sure that we really have some margin. Client checks
10579 # cached locks every 10 sec.
10580 SLEEP=$((SLEEP+20))
10581 log "Sleep ${SLEEP} sec"
10583 while ((SEC<$SLEEP)); do
10587 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
10588 echo -n "$LRU_SIZE"
10591 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
10592 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
10594 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
10595 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
10596 unlinkmany $DIR/$tdir/f $NR
10600 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
10601 log "unlink $NR files at $DIR/$tdir"
10602 unlinkmany $DIR/$tdir/f $NR
10604 run_test 124a "lru resize ======================================="
10606 get_max_pool_limit()
10608 local limit=$($LCTL get_param \
10609 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
10611 for l in $limit; do
10612 if [[ $l -gt $max ]]; then
10620 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10621 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10622 skip_env "no lru resize on server"
10624 LIMIT=$(get_max_pool_limit)
10626 NR=$(($(default_lru_size)*20))
10627 if [[ $NR -gt $LIMIT ]]; then
10628 log "Limit lock number by $LIMIT locks"
10632 IFree=$(mdsrate_inodes_available)
10633 if [ $IFree -lt $NR ]; then
10634 log "Limit lock number by $IFree inodes"
10638 lru_resize_disable mdc
10639 test_mkdir -p $DIR/$tdir/disable_lru_resize
10641 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
10642 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
10643 cancel_lru_locks mdc
10646 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10649 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10652 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10656 nolruresize_delta=$((etime-stime))
10657 log "ls -la time: $nolruresize_delta seconds"
10658 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10659 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
10661 lru_resize_enable mdc
10662 test_mkdir -p $DIR/$tdir/enable_lru_resize
10664 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
10665 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
10666 cancel_lru_locks mdc
10669 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10672 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10675 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10679 lruresize_delta=$((etime-stime))
10680 log "ls -la time: $lruresize_delta seconds"
10681 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10683 if [ $lruresize_delta -gt $nolruresize_delta ]; then
10684 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
10685 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
10686 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
10688 log "lru resize performs the same with no lru resize"
10690 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
10692 run_test 124b "lru resize (performance test) ======================="
10695 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10696 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10697 skip_env "no lru resize on server"
10699 # cache ununsed locks on client
10701 cancel_lru_locks mdc
10702 test_mkdir $DIR/$tdir
10703 createmany -o $DIR/$tdir/f $nr ||
10704 error "failed to create $nr files in $DIR/$tdir"
10705 ls -l $DIR/$tdir > /dev/null
10707 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10708 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10709 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10710 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10711 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10713 # set lru_max_age to 1 sec
10714 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10715 echo "sleep $((recalc_p * 2)) seconds..."
10716 sleep $((recalc_p * 2))
10718 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10719 # restore lru_max_age
10720 $LCTL set_param -n $nsdir.lru_max_age $max_age
10721 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10722 unlinkmany $DIR/$tdir/f $nr
10724 run_test 124c "LRUR cancel very aged locks"
10727 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10728 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10729 skip_env "no lru resize on server"
10731 # cache ununsed locks on client
10734 lru_resize_disable mdc
10735 stack_trap "lru_resize_enable mdc" EXIT
10737 cancel_lru_locks mdc
10739 # asynchronous object destroy at MDT could cause bl ast to client
10740 test_mkdir $DIR/$tdir
10741 createmany -o $DIR/$tdir/f $nr ||
10742 error "failed to create $nr files in $DIR/$tdir"
10743 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
10745 ls -l $DIR/$tdir > /dev/null
10747 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10748 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10749 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10750 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10752 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10754 # set lru_max_age to 1 sec
10755 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10756 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
10758 echo "sleep $((recalc_p * 2)) seconds..."
10759 sleep $((recalc_p * 2))
10761 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10763 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10765 run_test 124d "cancel very aged locks if lru-resize diasbaled"
10767 test_125() { # 13358
10768 $LCTL get_param -n llite.*.client_type | grep -q local ||
10769 skip "must run as local client"
10770 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
10771 skip_env "must have acl enabled"
10772 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
10774 test_mkdir $DIR/$tdir
10775 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
10776 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
10777 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
10779 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
10781 test_126() { # bug 12829/13455
10782 $GSS && skip_env "must run as gss disabled"
10783 $LCTL get_param -n llite.*.client_type | grep -q local ||
10784 skip "must run as local client"
10785 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
10787 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
10788 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
10790 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
10792 run_test 126 "check that the fsgid provided by the client is taken into account"
10794 test_127a() { # bug 15521
10795 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10797 $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
10798 $LCTL set_param osc.*.stats=0
10799 FSIZE=$((2048 * 1024))
10800 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
10801 cancel_lru_locks osc
10802 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
10804 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
10805 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
10806 echo "got $COUNT $NAME"
10807 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
10808 eval $NAME=$COUNT || error "Wrong proc format"
10811 read_bytes|write_bytes)
10812 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
10813 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
10814 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
10815 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
10816 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
10817 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
10818 error "sumsquare is too small: $SUMSQ"
10819 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
10820 error "sumsquare is too big: $SUMSQ"
10824 done < $DIR/${tfile}.tmp
10826 #check that we actually got some stats
10827 [ "$read_bytes" ] || error "Missing read_bytes stats"
10828 [ "$write_bytes" ] || error "Missing write_bytes stats"
10829 [ "$read_bytes" != 0 ] || error "no read done"
10830 [ "$write_bytes" != 0 ] || error "no write done"
10832 run_test 127a "verify the client stats are sane"
10834 test_127b() { # bug LU-333
10835 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10836 local name count samp unit min max sum sumsq
10838 $LCTL set_param llite.*.stats=0
10840 # perform 2 reads and writes so MAX is different from SUM.
10841 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10842 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10843 cancel_lru_locks osc
10844 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10845 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10847 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
10848 while read name count samp unit min max sum sumsq; do
10849 echo "got $count $name"
10850 eval $name=$count || error "Wrong proc format"
10854 [ $count -ne 2 ] && error "count is not 2: $count"
10855 [ $min -ne $PAGE_SIZE ] &&
10856 error "min is not $PAGE_SIZE: $min"
10857 [ $max -ne $PAGE_SIZE ] &&
10858 error "max is incorrect: $max"
10859 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10860 error "sum is wrong: $sum"
10863 [ $count -ne 2 ] && error "count is not 2: $count"
10864 [ $min -ne $PAGE_SIZE ] &&
10865 error "min is not $PAGE_SIZE: $min"
10866 [ $max -ne $PAGE_SIZE ] &&
10867 error "max is incorrect: $max"
10868 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10869 error "sum is wrong: $sum"
10873 done < $TMP/$tfile.tmp
10875 #check that we actually got some stats
10876 [ "$read_bytes" ] || error "Missing read_bytes stats"
10877 [ "$write_bytes" ] || error "Missing write_bytes stats"
10878 [ "$read_bytes" != 0 ] || error "no read done"
10879 [ "$write_bytes" != 0 ] || error "no write done"
10881 rm -f $TMP/${tfile}.tmp
10883 run_test 127b "verify the llite client stats are sane"
10885 test_127c() { # LU-12394
10886 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
10893 $LCTL set_param llite.*.extents_stats=1
10894 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
10896 # Use two stripes so there is enough space in default config
10897 $LFS setstripe -c 2 $DIR/$tfile
10899 # Extent stats start at 0-4K and go in power of two buckets
10900 # LL_HIST_START = 12 --> 2^12 = 4K
10901 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
10902 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
10904 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
10906 # Write and read, 2x each, second time at a non-zero offset
10907 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
10908 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
10909 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
10910 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
10914 $LCTL get_param llite.*.extents_stats
10917 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
10919 local bucket=$($LCTL get_param -n llite.*.extents_stats |
10921 reads=$(echo $bucket | awk '{print $5}')
10922 writes=$(echo $bucket | awk '{print $9}')
10923 [ "$reads" -eq $count ] ||
10924 error "$reads reads in < $bsize bucket, expect $count"
10925 [ "$writes" -eq $count ] ||
10926 error "$writes writes in < $bsize bucket, expect $count"
10929 # Test mmap write and read
10930 $LCTL set_param llite.*.extents_stats=c
10932 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
10933 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
10934 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
10936 $LCTL get_param llite.*.extents_stats
10938 count=$(((size*1024) / PAGE_SIZE))
10940 bsize=$((2 * PAGE_SIZE / 1024))K
10942 bucket=$($LCTL get_param -n llite.*.extents_stats |
10944 reads=$(echo $bucket | awk '{print $5}')
10945 writes=$(echo $bucket | awk '{print $9}')
10946 # mmap writes fault in the page first, creating an additonal read
10947 [ "$reads" -eq $((2 * count)) ] ||
10948 error "$reads reads in < $bsize bucket, expect $count"
10949 [ "$writes" -eq $count ] ||
10950 error "$writes writes in < $bsize bucket, expect $count"
10952 run_test 127c "test llite extent stats with regular & mmap i/o"
10954 test_128() { # bug 15212
10956 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
10961 result=$(grep error $TMP/$tfile.log)
10962 rm -f $DIR/$tfile $TMP/$tfile.log
10963 [ -z "$result" ] ||
10964 error "consecutive find's under interactive lfs failed"
10966 run_test 128 "interactive lfs for 2 consecutive find's"
10968 set_dir_limits () {
10973 local ldproc=/proc/fs/ldiskfs
10974 local facets=$(get_facets MDS)
10976 for facet in ${facets//,/ }; do
10977 canondev=$(ldiskfs_canon \
10978 *.$(convert_facet2label $facet).mntdev $facet)
10979 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
10980 ldproc=/sys/fs/ldiskfs
10981 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
10982 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
10986 check_mds_dmesg() {
10987 local facets=$(get_facets MDS)
10988 for facet in ${facets//,/ }; do
10989 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
10995 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10996 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
10997 skip "Need MDS version with at least 2.5.56"
10998 if [ "$mds1_FSTYPE" != ldiskfs ]; then
10999 skip_env "ldiskfs only test"
11001 remote_mds_nodsh && skip "remote MDS with nodsh"
11005 local has_warning=false
11008 mkdir -p $DIR/$tdir
11010 # block size of mds1
11011 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
11012 set_dir_limits $maxsize $maxsize
11013 local dirsize=$(stat -c%s "$DIR/$tdir")
11015 while [[ $dirsize -le $maxsize ]]; do
11016 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
11018 if ! $has_warning; then
11019 check_mds_dmesg '"is approaching"' && has_warning=true
11021 # check two errors:
11022 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
11023 # EFBIG for previous versions included in ldiskfs series
11024 if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
11026 echo "return code $rc received as expected"
11028 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
11029 error_exit "create failed w/o dir size limit"
11031 check_mds_dmesg '"has reached"' ||
11032 error_exit "reached message should be output"
11034 [ $has_warning = "false" ] &&
11035 error_exit "warning message should be output"
11037 dirsize=$(stat -c%s "$DIR/$tdir")
11039 [[ $dirsize -ge $maxsize ]] && return 0
11040 error_exit "current dir size $dirsize, " \
11041 "previous limit $maxsize"
11042 elif [ $rc -ne 0 ]; then
11044 error_exit "return $rc received instead of expected " \
11045 "$EFBIG or $ENOSPC, files in dir $dirsize"
11047 nfiles=$((nfiles + 1))
11048 dirsize=$(stat -c%s "$DIR/$tdir")
11052 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
11054 run_test 129 "test directory size limit ========================"
11063 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11064 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11066 trap cleanup_130 EXIT RETURN
11068 local fm_file=$DIR/$tfile
11069 $SETSTRIPE -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
11070 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
11071 error "dd failed for $fm_file"
11073 # LU-1795: test filefrag/FIEMAP once, even if unsupported
11074 filefrag -ves $fm_file
11076 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11077 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11078 [ $RC != 0 ] && error "filefrag $fm_file failed"
11080 filefrag_op=$(filefrag -ve -k $fm_file |
11081 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11082 lun=$($GETSTRIPE -i $fm_file)
11084 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
11087 for line in $filefrag_op
11089 frag_lun=`echo $line | cut -d: -f5`
11090 ext_len=`echo $line | cut -d: -f4`
11091 if (( $frag_lun != $lun )); then
11093 error "FIEMAP on 1-stripe file($fm_file) failed"
11096 (( tot_len += ext_len ))
11099 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
11101 error "FIEMAP on 1-stripe file($fm_file) failed;"
11107 echo "FIEMAP on single striped file succeeded"
11109 run_test 130a "FIEMAP (1-stripe file)"
11112 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11114 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11115 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11117 trap cleanup_130 EXIT RETURN
11119 local fm_file=$DIR/$tfile
11120 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11121 error "setstripe on $fm_file"
11122 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11123 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11125 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
11126 error "dd failed on $fm_file"
11128 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11129 filefrag_op=$(filefrag -ve -k $fm_file |
11130 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11132 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11133 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11138 for line in $filefrag_op
11140 frag_lun=$(echo $line | cut -d: -f5 |
11141 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11142 ext_len=$(echo $line | cut -d: -f4)
11143 if (( $frag_lun != $last_lun )); then
11144 if (( tot_len != 1024 )); then
11146 error "FIEMAP on $fm_file failed; returned " \
11147 "len $tot_len for OST $last_lun instead of 1024"
11150 (( num_luns += 1 ))
11154 (( tot_len += ext_len ))
11157 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
11159 error "FIEMAP on $fm_file failed; returned wrong number of " \
11160 "luns or wrong len for OST $last_lun"
11166 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
11168 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
11171 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11173 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11174 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11176 trap cleanup_130 EXIT RETURN
11178 local fm_file=$DIR/$tfile
11179 $SETSTRIPE -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
11180 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11181 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11183 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
11184 error "dd failed on $fm_file"
11186 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11187 filefrag_op=$(filefrag -ve -k $fm_file |
11188 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11190 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11191 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11196 for line in $filefrag_op
11198 frag_lun=$(echo $line | cut -d: -f5 |
11199 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11200 ext_len=$(echo $line | cut -d: -f4)
11201 if (( $frag_lun != $last_lun )); then
11202 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
11203 if (( logical != 512 )); then
11205 error "FIEMAP on $fm_file failed; returned " \
11206 "logical start for lun $logical instead of 512"
11209 if (( tot_len != 512 )); then
11211 error "FIEMAP on $fm_file failed; returned " \
11212 "len $tot_len for OST $last_lun instead of 1024"
11215 (( num_luns += 1 ))
11219 (( tot_len += ext_len ))
11222 if (( num_luns != 2 || tot_len != 512 )); then
11224 error "FIEMAP on $fm_file failed; returned wrong number of " \
11225 "luns or wrong len for OST $last_lun"
11231 echo "FIEMAP on 2-stripe file with hole succeeded"
11233 run_test 130c "FIEMAP (2-stripe file with hole)"
11236 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
11238 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11239 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11241 trap cleanup_130 EXIT RETURN
11243 local fm_file=$DIR/$tfile
11244 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11245 error "setstripe on $fm_file"
11246 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11247 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11249 local actual_stripe_count=$($GETSTRIPE -c $fm_file)
11250 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
11251 error "dd failed on $fm_file"
11253 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11254 filefrag_op=$(filefrag -ve -k $fm_file |
11255 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11257 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11258 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11263 for line in $filefrag_op
11265 frag_lun=$(echo $line | cut -d: -f5 |
11266 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11267 ext_len=$(echo $line | cut -d: -f4)
11268 if (( $frag_lun != $last_lun )); then
11269 if (( tot_len != 1024 )); then
11271 error "FIEMAP on $fm_file failed; returned " \
11272 "len $tot_len for OST $last_lun instead of 1024"
11275 (( num_luns += 1 ))
11279 (( tot_len += ext_len ))
11282 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
11284 error "FIEMAP on $fm_file failed; returned wrong number of " \
11285 "luns or wrong len for OST $last_lun"
11291 echo "FIEMAP on N-stripe file succeeded"
11293 run_test 130d "FIEMAP (N-stripe file)"
11296 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11298 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11299 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11301 trap cleanup_130 EXIT RETURN
11303 local fm_file=$DIR/$tfile
11304 $SETSTRIPE -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11305 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11306 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11309 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11310 for ((i = 0; i < $NUM_BLKS; i++))
11312 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11315 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11316 filefrag_op=$(filefrag -ve -k $fm_file |
11317 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11319 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11320 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11325 for line in $filefrag_op
11327 frag_lun=$(echo $line | cut -d: -f5 |
11328 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11329 ext_len=$(echo $line | cut -d: -f4)
11330 if (( $frag_lun != $last_lun )); then
11331 if (( tot_len != $EXPECTED_LEN )); then
11333 error "FIEMAP on $fm_file failed; returned " \
11334 "len $tot_len for OST $last_lun instead " \
11338 (( num_luns += 1 ))
11342 (( tot_len += ext_len ))
11345 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11347 error "FIEMAP on $fm_file failed; returned wrong number " \
11348 "of luns or wrong len for OST $last_lun"
11354 echo "FIEMAP with continuation calls succeeded"
11356 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11359 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11360 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11362 local fm_file=$DIR/$tfile
11363 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11364 error "multiop create with lov_delay_create on $fm_file"
11366 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11367 filefrag_extents=$(filefrag -vek $fm_file |
11368 awk '/extents? found/ { print $2 }')
11369 if [[ "$filefrag_extents" != "0" ]]; then
11370 error "FIEMAP on $fm_file failed; " \
11371 "returned $filefrag_extents expected 0"
11376 run_test 130f "FIEMAP (unstriped file)"
11378 # Test for writev/readv
11380 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11381 error "writev test failed"
11382 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11383 error "readv failed"
11386 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11389 local fsize=$((524288 + 1048576 + 1572864))
11390 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11391 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11392 error "append writev test failed"
11394 ((fsize += 1572864 + 1048576))
11395 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11396 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11397 error "append writev test failed"
11400 run_test 131b "test append writev"
11403 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11406 run_test 131c "test read/write on file w/o objects"
11409 rwv -f $DIR/$tfile -w -n 1 1572864
11410 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11411 if [ "$NOB" != 1572864 ]; then
11412 error "Short read filed: read $NOB bytes instead of 1572864"
11416 run_test 131d "test short read"
11419 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11420 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11421 error "read hitting hole failed"
11424 run_test 131e "test read hitting hole"
11433 mds*) res=$(do_facet $facet \
11434 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11436 ost*) res=$(do_facet $facet \
11437 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
11439 *) error "Wrong facet '$facet'" ;;
11441 [ "$res" ] || error "The counter for $op on $facet was not incremented"
11442 # if the argument $3 is zero, it means any stat increment is ok.
11443 if [[ $want -gt 0 ]]; then
11444 local count=$(echo $res | awk '{ print $2 }')
11445 [[ $count -ne $want ]] &&
11446 error "The $op counter on $facet is $count, not $want"
11451 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11452 remote_ost_nodsh && skip "remote OST with nodsh"
11453 remote_mds_nodsh && skip "remote MDS with nodsh"
11454 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11455 skip_env "MDS doesn't support rename stats"
11457 local testdir=$DIR/${tdir}/stats_testdir
11459 mkdir -p $DIR/${tdir}
11462 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11463 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11465 # verify mdt stats first.
11466 mkdir ${testdir} || error "mkdir failed"
11467 check_stats $SINGLEMDS "mkdir" 1
11468 touch ${testdir}/${tfile} || error "touch failed"
11469 check_stats $SINGLEMDS "open" 1
11470 check_stats $SINGLEMDS "close" 1
11471 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
11472 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
11473 check_stats $SINGLEMDS "mknod" 2
11475 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
11476 check_stats $SINGLEMDS "unlink" 1
11477 rm -f ${testdir}/${tfile} || error "file remove failed"
11478 check_stats $SINGLEMDS "unlink" 2
11480 # remove working dir and check mdt stats again.
11481 rmdir ${testdir} || error "rmdir failed"
11482 check_stats $SINGLEMDS "rmdir" 1
11484 local testdir1=$DIR/${tdir}/stats_testdir1
11485 mkdir -p ${testdir}
11486 mkdir -p ${testdir1}
11487 touch ${testdir1}/test1
11488 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
11489 check_stats $SINGLEMDS "crossdir_rename" 1
11491 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
11492 check_stats $SINGLEMDS "samedir_rename" 1
11494 rm -rf $DIR/${tdir}
11496 run_test 133a "Verifying MDT stats ========================================"
11501 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11502 remote_ost_nodsh && skip "remote OST with nodsh"
11503 remote_mds_nodsh && skip "remote MDS with nodsh"
11505 local testdir=$DIR/${tdir}/stats_testdir
11507 mkdir -p ${testdir} || error "mkdir failed"
11508 touch ${testdir}/${tfile} || error "touch failed"
11509 cancel_lru_locks mdc
11512 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11513 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11515 # extra mdt stats verification.
11516 chmod 444 ${testdir}/${tfile} || error "chmod failed"
11517 check_stats $SINGLEMDS "setattr" 1
11518 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11519 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
11521 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
11522 check_stats $SINGLEMDS "getattr" 1
11524 rm -rf $DIR/${tdir}
11526 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
11527 # so the check below is not reliable
11528 [ $MDSCOUNT -eq 1 ] || return 0
11530 # Sleep to avoid a cached response.
11531 #define OBD_STATFS_CACHE_SECONDS 1
11533 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11534 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11535 $LFS df || error "lfs failed"
11536 check_stats $SINGLEMDS "statfs" 1
11538 # check aggregated statfs (LU-10018)
11539 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
11541 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
11544 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11545 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11547 check_stats $SINGLEMDS "statfs" 1
11549 # We want to check that the client didn't send OST_STATFS to
11550 # ost1 but the MDT also uses OST_STATFS for precreate. So some
11551 # extra care is needed here.
11552 if remote_mds; then
11553 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
11554 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
11556 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
11557 [ "$res" ] && error "OST got STATFS"
11562 run_test 133b "Verifying extra MDT stats =================================="
11565 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11566 remote_ost_nodsh && skip "remote OST with nodsh"
11567 remote_mds_nodsh && skip "remote MDS with nodsh"
11569 local testdir=$DIR/$tdir/stats_testdir
11571 test_mkdir -p $testdir
11573 # verify obdfilter stats.
11574 $SETSTRIPE -c 1 -i 0 $testdir/$tfile
11576 cancel_lru_locks osc
11577 wait_delete_completed
11580 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11581 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11583 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
11586 cancel_lru_locks osc
11587 check_stats ost1 "write" 1
11589 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
11590 check_stats ost1 "read" 1
11592 > $testdir/$tfile || error "truncate failed"
11593 check_stats ost1 "punch" 1
11595 rm -f $testdir/$tfile || error "file remove failed"
11596 wait_delete_completed
11597 check_stats ost1 "destroy" 1
11601 run_test 133c "Verifying OST stats ========================================"
11608 while [ $value -ge 2 ]; do
11613 if [ $orig -gt $order ]; then
11621 local size=('K' 'M' 'G' 'T');
11623 local size_string=$value
11625 while [ $value -ge 1024 ]; do
11626 if [ $i -gt 3 ]; then
11627 #T is the biggest unit we get here, if that is bigger,
11629 size_string=${value}T
11632 value=$((value >> 10))
11633 if [ $value -lt 1024 ]; then
11634 size_string=${value}${size[$i]}
11643 get_rename_size() {
11645 local context=${2:-.}
11646 local sample=$(do_facet $SINGLEMDS $LCTL \
11647 get_param mdt.$FSNAME-MDT0000.rename_stats |
11648 grep -A1 $context |
11649 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
11654 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11655 remote_ost_nodsh && skip "remote OST with nodsh"
11656 remote_mds_nodsh && skip "remote MDS with nodsh"
11657 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11658 skip_env "MDS doesn't support rename stats"
11660 local testdir1=$DIR/${tdir}/stats_testdir1
11661 local testdir2=$DIR/${tdir}/stats_testdir2
11662 mkdir -p $DIR/${tdir}
11664 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11666 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
11667 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
11669 createmany -o $testdir1/test 512 || error "createmany failed"
11671 # check samedir rename size
11672 mv ${testdir1}/test0 ${testdir1}/test_0
11674 local testdir1_size=$(ls -l $DIR/${tdir} |
11675 awk '/stats_testdir1/ {print $5}')
11676 local testdir2_size=$(ls -l $DIR/${tdir} |
11677 awk '/stats_testdir2/ {print $5}')
11679 testdir1_size=$(order_2 $testdir1_size)
11680 testdir2_size=$(order_2 $testdir2_size)
11682 testdir1_size=$(size_in_KMGT $testdir1_size)
11683 testdir2_size=$(size_in_KMGT $testdir2_size)
11685 echo "source rename dir size: ${testdir1_size}"
11686 echo "target rename dir size: ${testdir2_size}"
11688 local cmd="do_facet $SINGLEMDS $LCTL "
11689 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
11691 eval $cmd || error "$cmd failed"
11692 local samedir=$($cmd | grep 'same_dir')
11693 local same_sample=$(get_rename_size $testdir1_size)
11694 [ -z "$samedir" ] && error "samedir_rename_size count error"
11695 [[ $same_sample -eq 1 ]] ||
11696 error "samedir_rename_size error $same_sample"
11697 echo "Check same dir rename stats success"
11699 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11701 # check crossdir rename size
11702 mv ${testdir1}/test_0 ${testdir2}/test_0
11704 testdir1_size=$(ls -l $DIR/${tdir} |
11705 awk '/stats_testdir1/ {print $5}')
11706 testdir2_size=$(ls -l $DIR/${tdir} |
11707 awk '/stats_testdir2/ {print $5}')
11709 testdir1_size=$(order_2 $testdir1_size)
11710 testdir2_size=$(order_2 $testdir2_size)
11712 testdir1_size=$(size_in_KMGT $testdir1_size)
11713 testdir2_size=$(size_in_KMGT $testdir2_size)
11715 echo "source rename dir size: ${testdir1_size}"
11716 echo "target rename dir size: ${testdir2_size}"
11718 eval $cmd || error "$cmd failed"
11719 local crossdir=$($cmd | grep 'crossdir')
11720 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
11721 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
11722 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
11723 [[ $src_sample -eq 1 ]] ||
11724 error "crossdir_rename_size error $src_sample"
11725 [[ $tgt_sample -eq 1 ]] ||
11726 error "crossdir_rename_size error $tgt_sample"
11727 echo "Check cross dir rename stats success"
11728 rm -rf $DIR/${tdir}
11730 run_test 133d "Verifying rename_stats ========================================"
11733 remote_mds_nodsh && skip "remote MDS with nodsh"
11734 remote_ost_nodsh && skip "remote OST with nodsh"
11735 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11737 local testdir=$DIR/${tdir}/stats_testdir
11738 local ctr f0 f1 bs=32768 count=42 sum
11740 mkdir -p ${testdir} || error "mkdir failed"
11742 $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
11744 for ctr in {write,read}_bytes; do
11746 cancel_lru_locks osc
11748 do_facet ost1 $LCTL set_param -n \
11749 "obdfilter.*.exports.clear=clear"
11751 if [ $ctr = write_bytes ]; then
11753 f1=${testdir}/${tfile}
11755 f0=${testdir}/${tfile}
11759 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
11762 cancel_lru_locks osc
11764 sum=$(do_facet ost1 $LCTL get_param \
11765 "obdfilter.*.exports.*.stats" |
11766 awk -v ctr=$ctr 'BEGIN { sum = 0 }
11767 $1 == ctr { sum += $7 }
11768 END { printf("%0.0f", sum) }')
11770 if ((sum != bs * count)); then
11771 error "Bad $ctr sum, expected $((bs * count)), got $sum"
11775 rm -rf $DIR/${tdir}
11777 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
11779 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
11781 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
11782 # not honor the -ignore_readdir_race option correctly. So we call
11783 # error_ignore() rather than error() in these cases. See LU-11152.
11785 if (find --version; do_facet mds1 find --version) |
11786 grep -q '\b4\.5\.1[1-4]\b'; then
11787 error_ignore LU-11152 "$@"
11794 # First without trusting modes.
11795 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
11796 echo "proc_dirs='$proc_dirs'"
11797 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
11798 find $proc_dirs -exec cat '{}' \; &> /dev/null
11800 # Second verifying readability.
11801 $LCTL get_param -R '*' &> /dev/null
11803 # Verifing writability with badarea_io.
11805 -ignore_readdir_race \
11807 -not -name force_lbug \
11808 -not -name changelog_mask \
11809 -exec badarea_io '{}' \; ||
11810 error_133 "find $proc_dirs failed"
11812 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
11815 remote_mds_nodsh && skip "remote MDS with nodsh"
11816 remote_ost_nodsh && skip "remote OST with nodsh"
11818 # eventually, this can also be replaced with "lctl get_param -R",
11819 # but not until that option is always available on the server
11821 for facet in mds1 ost1; do
11822 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
11823 skip_noexit "Too old lustre on $facet"
11824 local facet_proc_dirs=$(do_facet $facet \
11825 \\\ls -d $proc_regexp 2>/dev/null)
11826 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11827 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11828 do_facet $facet find $facet_proc_dirs \
11829 ! -name req_history \
11830 -exec cat '{}' \\\; &> /dev/null
11832 do_facet $facet find $facet_proc_dirs \
11833 ! -name req_history \
11835 -exec cat '{}' \\\; &> /dev/null ||
11836 error "proc file read failed"
11838 do_facet $facet find $facet_proc_dirs \
11839 -ignore_readdir_race \
11841 -not -name force_lbug \
11842 -not -name changelog_mask \
11843 -exec badarea_io '{}' \\\; ||
11844 error_133 "$facet find $facet_proc_dirs failed"
11847 # remount the FS in case writes/reads /proc break the FS
11848 cleanup || error "failed to unmount"
11849 setup || error "failed to setup"
11852 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
11855 remote_mds_nodsh && skip "remote MDS with nodsh"
11856 remote_ost_nodsh && skip "remote OST with nodsh"
11857 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
11858 skip "Need MDS version at least 2.9.54"
11862 for facet in client mds1 ost1; do
11863 local facet_proc_dirs=$(do_facet $facet \
11864 \\\ls -d $proc_regexp 2> /dev/null)
11865 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11866 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11867 # Get the list of files that are missing the terminating newline
11868 local missing=($(do_facet $facet \
11869 find ${facet_proc_dirs} -type f \| \
11870 while read F\; do \
11871 awk -v FS='\v' -v RS='\v\v' \
11872 "'END { if(NR>0 && \
11873 \\\$NF !~ /.*\\\n\$/) \
11874 print FILENAME}'" \
11877 [ ${#missing[*]} -eq 0 ] ||
11878 error "files do not end with newline: ${missing[*]}"
11881 run_test 133h "Proc files should end with newlines"
11884 remote_mds_nodsh && skip "remote MDS with nodsh"
11885 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11886 skip "Need MDS version at least 2.7.54"
11888 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11889 cancel_lru_locks mdc
11891 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
11892 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11893 [ $unused -eq 0 ] || error "$unused locks are not cleared"
11896 createmany -o $DIR/$tdir/f $nr ||
11897 error "failed to create $nr files in $DIR/$tdir"
11898 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11900 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
11901 do_facet mds1 $LCTL set_param fail_loc=0x327
11902 do_facet mds1 $LCTL set_param fail_val=500
11905 echo "sleep 10 seconds ..."
11907 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
11909 do_facet mds1 $LCTL set_param fail_loc=0
11910 do_facet mds1 $LCTL set_param fail_val=0
11911 [ $lck_cnt -lt $unused ] ||
11912 error "No locks reclaimed, before:$unused, after:$lck_cnt"
11915 unlinkmany $DIR/$tdir/f $nr
11917 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
11920 remote_mds_nodsh && skip "remote MDS with nodsh"
11921 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11922 skip "Need MDS version at least 2.7.54"
11924 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11925 cancel_lru_locks mdc
11927 local low_wm=$(do_facet mds1 $LCTL get_param -n \
11928 ldlm.lock_reclaim_threshold_mb)
11929 # disable reclaim temporarily
11930 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
11932 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
11933 do_facet mds1 $LCTL set_param fail_loc=0x328
11934 do_facet mds1 $LCTL set_param fail_val=500
11936 $LCTL set_param debug=+trace
11939 createmany -o $DIR/$tdir/f $nr &
11940 local create_pid=$!
11942 echo "Sleep $TIMEOUT seconds ..."
11944 if ! ps -p $create_pid > /dev/null 2>&1; then
11945 do_facet mds1 $LCTL set_param fail_loc=0
11946 do_facet mds1 $LCTL set_param fail_val=0
11947 do_facet mds1 $LCTL set_param \
11948 ldlm.lock_reclaim_threshold_mb=${low_wm}m
11949 error "createmany finished incorrectly!"
11951 do_facet mds1 $LCTL set_param fail_loc=0
11952 do_facet mds1 $LCTL set_param fail_val=0
11953 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
11954 wait $create_pid || return 1
11956 unlinkmany $DIR/$tdir/f $nr
11958 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
11960 test_140() { #bug-17379
11961 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11963 test_mkdir $DIR/$tdir
11964 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
11965 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
11967 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
11968 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
11970 while i=$((i + 1)); do
11972 cd $i || error "Changing to $i"
11973 ln -s ../stat stat || error "Creating stat symlink"
11974 # Read the symlink until ELOOP present,
11975 # not LBUGing the system is considered success,
11976 # we didn't overrun the stack.
11977 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
11978 if [ $ret -ne 0 ]; then
11979 if [ $ret -eq 40 ]; then
11982 error "Open stat symlink"
11988 echo "The symlink depth = $i"
11989 [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] ||
11990 error "Invalid symlink depth"
11992 # Test recursive symlink
11993 ln -s symlink_self symlink_self
11994 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
11995 echo "open symlink_self returns $ret"
11996 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
11998 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
12001 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12003 local TF="$TMP/$tfile"
12005 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12007 cancel_lru_locks $OSC
12008 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
12009 remount_client $MOUNT
12011 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
12014 $TRUNCATE $DIR/$tfile 6000
12015 cancel_lru_locks $OSC
12016 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
12019 echo "12345" >>$DIR/$tfile
12020 cancel_lru_locks $OSC
12021 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
12024 echo "12345" >>$DIR/$tfile
12025 cancel_lru_locks $OSC
12026 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
12031 run_test 150 "truncate/append tests"
12033 #LU-2902 roc_hit was not able to read all values from lproc
12034 function roc_hit_init() {
12035 local list=$(comma_list $(osts_nodes))
12036 local dir=$DIR/$tdir-check
12037 local file=$dir/$tfile
12043 #use setstripe to do a write to every ost
12044 for i in $(seq 0 $((OSTCOUNT-1))); do
12045 $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
12046 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
12047 idx=$(printf %04x $i)
12048 BEFORE=$(get_osd_param $list *OST*$idx stats |
12049 awk '$1 == "cache_access" {sum += $7}
12050 END { printf("%0.0f", sum) }')
12052 cancel_lru_locks osc
12053 cat $file >/dev/null
12055 AFTER=$(get_osd_param $list *OST*$idx stats |
12056 awk '$1 == "cache_access" {sum += $7}
12057 END { printf("%0.0f", sum) }')
12059 echo BEFORE:$BEFORE AFTER:$AFTER
12060 if ! let "AFTER - BEFORE == 4"; then
12062 error "roc_hit is not safe to use"
12070 function roc_hit() {
12071 local list=$(comma_list $(osts_nodes))
12072 echo $(get_osd_param $list '' stats |
12073 awk '$1 == "cache_hit" {sum += $7}
12074 END { printf("%0.0f", sum) }')
12077 function set_cache() {
12080 if [ "$2" == "off" ]; then
12083 local list=$(comma_list $(osts_nodes))
12084 set_osd_param $list '' $1_cache_enable $on
12086 cancel_lru_locks osc
12090 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12091 remote_ost_nodsh && skip "remote OST with nodsh"
12094 local list=$(comma_list $(osts_nodes))
12096 # check whether obdfilter is cache capable at all
12097 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
12098 skip "not cache-capable obdfilter"
12101 # check cache is enabled on all obdfilters
12102 if get_osd_param $list '' read_cache_enable | grep 0; then
12103 skip "oss cache is disabled"
12106 set_osd_param $list '' writethrough_cache_enable 1
12108 # check write cache is enabled on all obdfilters
12109 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
12110 skip "oss write cache is NOT enabled"
12115 #define OBD_FAIL_OBD_NO_LRU 0x609
12116 do_nodes $list $LCTL set_param fail_loc=0x609
12118 # pages should be in the case right after write
12119 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
12122 local BEFORE=$(roc_hit)
12123 cancel_lru_locks osc
12124 cat $DIR/$tfile >/dev/null
12125 local AFTER=$(roc_hit)
12127 do_nodes $list $LCTL set_param fail_loc=0
12129 if ! let "AFTER - BEFORE == CPAGES"; then
12130 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12133 # the following read invalidates the cache
12134 cancel_lru_locks osc
12135 set_osd_param $list '' read_cache_enable 0
12136 cat $DIR/$tfile >/dev/null
12138 # now data shouldn't be found in the cache
12140 cancel_lru_locks osc
12141 cat $DIR/$tfile >/dev/null
12143 if let "AFTER - BEFORE != 0"; then
12144 error "IN CACHE: before: $BEFORE, after: $AFTER"
12147 set_osd_param $list '' read_cache_enable 1
12150 run_test 151 "test cache on oss and controls ==============================="
12153 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12155 local TF="$TMP/$tfile"
12157 # simulate ENOMEM during write
12158 #define OBD_FAIL_OST_NOMEM 0x226
12159 lctl set_param fail_loc=0x80000226
12160 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12162 sync || error "sync failed"
12163 lctl set_param fail_loc=0
12165 # discard client's cache
12166 cancel_lru_locks osc
12168 # simulate ENOMEM during read
12169 lctl set_param fail_loc=0x80000226
12170 cmp $TF $DIR/$tfile || error "cmp failed"
12171 lctl set_param fail_loc=0
12175 run_test 152 "test read/write with enomem ============================"
12178 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
12180 run_test 153 "test if fdatasync does not crash ======================="
12182 dot_lustre_fid_permission_check() {
12184 local ffid=$MOUNT/.lustre/fid/$fid
12187 echo "stat fid $fid"
12188 stat $ffid > /dev/null || error "stat $ffid failed."
12189 echo "touch fid $fid"
12190 touch $ffid || error "touch $ffid failed."
12191 echo "write to fid $fid"
12192 cat /etc/hosts > $ffid || error "write $ffid failed."
12193 echo "read fid $fid"
12194 diff /etc/hosts $ffid || error "read $ffid failed."
12195 echo "append write to fid $fid"
12196 cat /etc/hosts >> $ffid || error "append write $ffid failed."
12197 echo "rename fid $fid"
12198 mv $ffid $test_dir/$tfile.1 &&
12199 error "rename $ffid to $tfile.1 should fail."
12200 touch $test_dir/$tfile.1
12201 mv $test_dir/$tfile.1 $ffid &&
12202 error "rename $tfile.1 to $ffid should fail."
12203 rm -f $test_dir/$tfile.1
12204 echo "truncate fid $fid"
12205 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
12206 echo "link fid $fid"
12207 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
12208 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
12209 echo "setfacl fid $fid"
12210 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
12211 echo "getfacl fid $fid"
12212 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
12214 echo "unlink fid $fid"
12215 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
12216 echo "mknod fid $fid"
12217 mknod $ffid c 1 3 && error "mknod $ffid should fail."
12219 fid=[0xf00000400:0x1:0x0]
12220 ffid=$MOUNT/.lustre/fid/$fid
12222 echo "stat non-exist fid $fid"
12223 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
12224 echo "write to non-exist fid $fid"
12225 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
12226 echo "link new fid $fid"
12227 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
12229 mkdir -p $test_dir/$tdir
12230 touch $test_dir/$tdir/$tfile
12231 fid=$($LFS path2fid $test_dir/$tdir)
12234 error "error: could not get fid for $test_dir/$dir/$tfile."
12236 ffid=$MOUNT/.lustre/fid/$fid
12239 ls $ffid > /dev/null || error "ls $ffid failed."
12240 echo "touch $fid/$tfile.1"
12241 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
12243 echo "touch $MOUNT/.lustre/fid/$tfile"
12244 touch $MOUNT/.lustre/fid/$tfile && \
12245 error "touch $MOUNT/.lustre/fid/$tfile should fail."
12247 echo "setxattr to $MOUNT/.lustre/fid"
12248 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
12250 echo "listxattr for $MOUNT/.lustre/fid"
12251 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
12253 echo "delxattr from $MOUNT/.lustre/fid"
12254 setfattr -x trusted.name1 $MOUNT/.lustre/fid
12256 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
12257 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
12258 error "touch invalid fid should fail."
12260 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
12261 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
12262 error "touch non-normal fid should fail."
12264 echo "rename $tdir to $MOUNT/.lustre/fid"
12265 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
12266 error "rename to $MOUNT/.lustre/fid should fail."
12268 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
12270 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
12271 local new_obf_mode=777
12273 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
12274 chmod $new_obf_mode $DIR/.lustre/fid ||
12275 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
12277 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
12278 [ $obf_mode -eq $new_obf_mode ] ||
12279 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
12281 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
12282 chmod $old_obf_mode $DIR/.lustre/fid ||
12283 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
12286 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
12287 fid=$($LFS path2fid $test_dir/$tfile-2)
12289 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
12291 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
12292 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
12293 error "create lov data thru .lustre failed"
12295 echo "cp /etc/passwd $test_dir/$tfile-2"
12296 cp /etc/passwd $test_dir/$tfile-2 ||
12297 error "copy to $test_dir/$tfile-2 failed."
12298 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
12299 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12300 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12302 rm -rf $test_dir/tfile.lnk
12303 rm -rf $test_dir/$tfile-2
12307 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12308 skip "Need MDS version at least 2.4.1"
12310 local tf=$DIR/$tfile
12313 local fid=$($LFS path2fid $tf)
12314 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12316 # check that we get the same pathname back
12317 local found=$($LFS fid2path $MOUNT "$fid")
12318 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12319 [ "$found" == "$tf" ] ||
12320 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12322 run_test 154A "lfs path2fid and fid2path basic checks"
12325 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12326 skip "Need MDS version at least 2.4.1"
12328 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12329 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12330 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12331 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12333 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12334 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12336 # check that we get the same pathname
12337 echo "PFID: $PFID, name: $name"
12338 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12339 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12340 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12341 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12343 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12345 run_test 154B "verify the ll_decode_linkea tool"
12348 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12349 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12350 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12351 skip "Need MDS version at least 2.2.51"
12352 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12354 cp /etc/hosts $DIR/$tfile
12356 fid=$($LFS path2fid $DIR/$tfile)
12358 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12360 dot_lustre_fid_permission_check "$fid" $DIR ||
12361 error "dot lustre permission check $fid failed"
12363 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12365 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12367 touch $MOUNT/.lustre/file &&
12368 error "creation is not allowed under .lustre"
12370 mkdir $MOUNT/.lustre/dir &&
12371 error "mkdir is not allowed under .lustre"
12375 run_test 154a "Open-by-FID"
12378 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12379 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12380 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12381 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12382 skip "Need MDS version at least 2.2.51"
12384 local remote_dir=$DIR/$tdir/remote_dir
12388 mkdir -p $DIR/$tdir
12389 $LFS mkdir -i $MDTIDX $remote_dir ||
12390 error "create remote directory failed"
12392 cp /etc/hosts $remote_dir/$tfile
12394 fid=$($LFS path2fid $remote_dir/$tfile)
12396 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12398 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12399 error "dot lustre permission check $fid failed"
12402 run_test 154b "Open-by-FID for remote directory"
12405 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12406 skip "Need MDS version at least 2.4.1"
12408 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12409 local FID1=$($LFS path2fid $DIR/$tfile.1)
12410 local FID2=$($LFS path2fid $DIR/$tfile.2)
12411 local FID3=$($LFS path2fid $DIR/$tfile.3)
12414 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12415 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12416 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12418 [ "$FID" = "${!want}" ] ||
12419 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12423 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12425 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12426 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12430 run_test 154c "lfs path2fid and fid2path multiple arguments"
12433 remote_mds_nodsh && skip "remote MDS with nodsh"
12434 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12435 skip "Need MDS version at least 2.5.53"
12437 if remote_mds; then
12438 nid=$($LCTL list_nids | sed "s/\./\\\./g")
12442 local proc_ofile="mdt.*.exports.'$nid'.open_files"
12449 local fid=$($LFS path2fid $DIR/$tfile)
12452 cmd="exec $fd<$DIR/$tfile"
12454 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
12455 echo "$fid_list" | grep "$fid"
12458 cmd="exec $fd>/dev/null"
12460 if [ $rc -ne 0 ]; then
12461 error "FID $fid not found in open files list $fid_list"
12464 run_test 154d "Verify open file fid"
12468 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
12469 skip "Need MDS version at least 2.6.50"
12471 if ls -a $MOUNT | grep -q '^\.lustre$'; then
12472 error ".lustre returned by readdir"
12475 run_test 154e ".lustre is not returned by readdir"
12478 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12480 # create parent directory on a single MDT to avoid cross-MDT hardlinks
12481 test_mkdir -p -c1 $DIR/$tdir/d
12482 # test dirs inherit from its stripe
12483 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
12484 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
12485 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
12486 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
12489 # get fid of parents
12490 local FID0=$($LFS path2fid $DIR/$tdir/d)
12491 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
12492 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
12493 local FID3=$($LFS path2fid $DIR)
12495 # check that path2fid --parents returns expected <parent_fid>/name
12496 # 1) test for a directory (single parent)
12497 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
12498 [ "$parent" == "$FID0/foo1" ] ||
12499 error "expected parent: $FID0/foo1, got: $parent"
12501 # 2) test for a file with nlink > 1 (multiple parents)
12502 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
12503 echo "$parent" | grep -F "$FID1/$tfile" ||
12504 error "$FID1/$tfile not returned in parent list"
12505 echo "$parent" | grep -F "$FID2/link" ||
12506 error "$FID2/link not returned in parent list"
12508 # 3) get parent by fid
12509 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
12510 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12511 echo "$parent" | grep -F "$FID1/$tfile" ||
12512 error "$FID1/$tfile not returned in parent list (by fid)"
12513 echo "$parent" | grep -F "$FID2/link" ||
12514 error "$FID2/link not returned in parent list (by fid)"
12516 # 4) test for entry in root directory
12517 parent=$($LFS path2fid --parents $DIR/f)
12518 echo "$parent" | grep -F "$FID3/f" ||
12519 error "$FID3/f not returned in parent list"
12521 # 5) test it on root directory
12522 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
12523 error "$MOUNT should not have parents"
12525 # enable xattr caching and check that linkea is correctly updated
12526 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
12527 save_lustre_params client "llite.*.xattr_cache" > $save
12528 lctl set_param llite.*.xattr_cache 1
12530 # 6.1) linkea update on rename
12531 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
12533 # get parents by fid
12534 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12535 # foo1 should no longer be returned in parent list
12536 echo "$parent" | grep -F "$FID1" &&
12537 error "$FID1 should no longer be in parent list"
12538 # the new path should appear
12539 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
12540 error "$FID2/$tfile.moved is not in parent list"
12542 # 6.2) linkea update on unlink
12543 rm -f $DIR/$tdir/d/foo2/link
12544 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12545 # foo2/link should no longer be returned in parent list
12546 echo "$parent" | grep -F "$FID2/link" &&
12547 error "$FID2/link should no longer be in parent list"
12551 restore_lustre_params < $save
12554 run_test 154f "get parent fids by reading link ea"
12558 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12559 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
12560 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
12561 skip "Need MDS version at least 2.6.92"
12563 mkdir -p $DIR/$tdir
12564 llapi_fid_test -d $DIR/$tdir
12566 run_test 154g "various llapi FID tests"
12568 test_155_small_load() {
12569 local temp=$TMP/$tfile
12570 local file=$DIR/$tfile
12572 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
12573 error "dd of=$temp bs=6096 count=1 failed"
12575 cancel_lru_locks $OSC
12576 cmp $temp $file || error "$temp $file differ"
12578 $TRUNCATE $temp 6000
12579 $TRUNCATE $file 6000
12580 cmp $temp $file || error "$temp $file differ (truncate1)"
12582 echo "12345" >>$temp
12583 echo "12345" >>$file
12584 cmp $temp $file || error "$temp $file differ (append1)"
12586 echo "12345" >>$temp
12587 echo "12345" >>$file
12588 cmp $temp $file || error "$temp $file differ (append2)"
12594 test_155_big_load() {
12595 remote_ost_nodsh && skip "remote OST with nodsh"
12597 local temp=$TMP/$tfile
12598 local file=$DIR/$tfile
12601 local cache_size=$(do_facet ost$((MAXI+1)) \
12602 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
12603 local large_file_size=$((cache_size * 2))
12605 echo "OSS cache size: $cache_size KB"
12606 echo "Large file size: $large_file_size KB"
12608 [ $MAXV -le $large_file_size ] &&
12609 skip_env "max available OST size needs > $large_file_size KB"
12611 $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed"
12613 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
12614 error "dd of=$temp bs=$large_file_size count=1k failed"
12617 cancel_lru_locks osc
12618 cmp $temp $file || error "$temp $file differ"
12624 save_writethrough() {
12625 local facets=$(get_facets OST)
12627 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
12631 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12633 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12635 save_writethrough $p
12638 set_cache writethrough on
12639 test_155_small_load
12640 restore_lustre_params < $p
12643 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
12646 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12648 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12650 save_writethrough $p
12653 set_cache writethrough off
12654 test_155_small_load
12655 restore_lustre_params < $p
12658 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
12661 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12663 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12665 save_writethrough $p
12668 set_cache writethrough on
12669 test_155_small_load
12670 restore_lustre_params < $p
12673 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
12676 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12678 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12680 save_writethrough $p
12683 set_cache writethrough off
12684 test_155_small_load
12685 restore_lustre_params < $p
12688 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
12691 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12693 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12695 save_writethrough $p
12698 set_cache writethrough on
12700 restore_lustre_params < $p
12703 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
12706 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12708 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12710 save_writethrough $p
12713 set_cache writethrough off
12715 restore_lustre_params < $p
12718 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
12721 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12723 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12725 save_writethrough $p
12728 set_cache writethrough on
12730 restore_lustre_params < $p
12733 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
12736 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12738 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12740 save_writethrough $p
12743 set_cache writethrough off
12745 restore_lustre_params < $p
12748 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
12751 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12752 remote_ost_nodsh && skip "remote OST with nodsh"
12753 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
12754 skip "stats not implemented on old servers"
12755 [ "$ost1_FSTYPE" = "zfs" ] &&
12756 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
12761 local file="$DIR/$tfile"
12762 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12764 save_writethrough $p
12767 log "Turn on read and write cache"
12769 set_cache writethrough on
12771 log "Write data and read it back."
12772 log "Read should be satisfied from the cache."
12773 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12775 cancel_lru_locks osc
12776 cat $file >/dev/null
12778 if ! let "AFTER - BEFORE == CPAGES"; then
12779 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12781 log "cache hits:: before: $BEFORE, after: $AFTER"
12784 log "Read again; it should be satisfied from the cache."
12786 cancel_lru_locks osc
12787 cat $file >/dev/null
12789 if ! let "AFTER - BEFORE == CPAGES"; then
12790 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12792 log "cache hits:: before: $BEFORE, after: $AFTER"
12795 log "Turn off the read cache and turn on the write cache"
12797 set_cache writethrough on
12799 log "Read again; it should be satisfied from the cache."
12801 cancel_lru_locks osc
12802 cat $file >/dev/null
12804 if ! let "AFTER - BEFORE == CPAGES"; then
12805 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12807 log "cache hits:: before: $BEFORE, after: $AFTER"
12810 log "Read again; it should not be satisfied from the cache."
12812 cancel_lru_locks osc
12813 cat $file >/dev/null
12815 if ! let "AFTER - BEFORE == 0"; then
12816 error "IN CACHE: before: $BEFORE, after: $AFTER"
12818 log "cache hits:: before: $BEFORE, after: $AFTER"
12821 log "Write data and read it back."
12822 log "Read should be satisfied from the cache."
12823 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12825 cancel_lru_locks osc
12826 cat $file >/dev/null
12828 if ! let "AFTER - BEFORE == CPAGES"; then
12829 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12831 log "cache hits:: before: $BEFORE, after: $AFTER"
12834 log "Read again; it should not be satisfied from the cache."
12836 cancel_lru_locks osc
12837 cat $file >/dev/null
12839 if ! let "AFTER - BEFORE == 0"; then
12840 error "IN CACHE: before: $BEFORE, after: $AFTER"
12842 log "cache hits:: before: $BEFORE, after: $AFTER"
12845 log "Turn off read and write cache"
12847 set_cache writethrough off
12849 log "Write data and read it back"
12850 log "It should not be satisfied from the cache."
12852 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12853 cancel_lru_locks osc
12855 cat $file >/dev/null
12857 if ! let "AFTER - BEFORE == 0"; then
12858 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12860 log "cache hits:: before: $BEFORE, after: $AFTER"
12863 log "Turn on the read cache and turn off the 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"
12872 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 "Read again; it should be satisfied from the cache."
12883 cancel_lru_locks osc
12884 cat $file >/dev/null
12886 if ! let "AFTER - BEFORE == CPAGES"; then
12887 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12889 log "cache hits:: before: $BEFORE, after: $AFTER"
12892 restore_lustre_params < $p
12895 run_test 156 "Verification of tunables"
12898 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12899 remote_mds_nodsh && skip "remote MDS with nodsh"
12900 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
12901 skip "Need MDS version at least 2.2.0"
12903 changelog_register || error "changelog_register failed"
12904 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
12905 changelog_users $SINGLEMDS | grep -q $cl_user ||
12906 error "User $cl_user not found in changelog_users"
12909 test_mkdir -p $DIR/$tdir/pics/2008/zachy
12910 changelog_clear 0 || error "changelog_clear failed"
12911 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
12912 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
12913 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
12914 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
12915 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
12916 rm $DIR/$tdir/pics/desktop.jpg
12918 changelog_dump | tail -10
12920 echo "verifying changelog mask"
12921 changelog_chmask "-MKDIR"
12922 changelog_chmask "-CLOSE"
12924 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
12925 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
12927 changelog_chmask "+MKDIR"
12928 changelog_chmask "+CLOSE"
12930 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
12931 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
12933 changelog_dump | tail -10
12934 MKDIRS=$(changelog_dump | grep -c "MKDIR")
12935 CLOSES=$(changelog_dump | grep -c "CLOSE")
12936 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
12937 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
12940 echo "verifying target fid"
12941 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
12942 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
12943 [ "$fidc" == "$fidf" ] ||
12944 error "changelog '$tfile' fid $fidc != file fid $fidf"
12945 echo "verifying parent fid"
12946 # The FID returned from the Changelog may be the directory shard on
12947 # a different MDT, and not the FID returned by path2fid on the parent.
12948 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
12949 # since this is what will matter when recreating this file in the tree.
12950 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
12951 local pathp=$($LFS fid2path $MOUNT "$fidp")
12952 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
12953 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
12955 echo "getting records for $cl_user"
12956 changelog_users $SINGLEMDS
12957 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
12959 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
12960 error "changelog_clear failed"
12961 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
12962 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
12963 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
12964 error "user index expect $user_rec1 + $nclr != $user_rec2"
12966 local min0_rec=$(changelog_users $SINGLEMDS |
12967 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
12968 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
12969 awk '{ print $1; exit; }')
12971 changelog_dump | tail -n 5
12972 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
12973 [ $first_rec == $((min0_rec + 1)) ] ||
12974 error "first index should be $min0_rec + 1 not $first_rec"
12976 # LU-3446 changelog index reset on MDT restart
12977 local cur_rec1=$(changelog_users $SINGLEMDS |
12978 awk '/^current.index:/ { print $NF }')
12979 changelog_clear 0 ||
12980 error "clear all changelog records for $cl_user failed"
12981 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
12982 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
12983 error "Fail to start $SINGLEMDS"
12984 local cur_rec2=$(changelog_users $SINGLEMDS |
12985 awk '/^current.index:/ { print $NF }')
12986 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
12987 [ $cur_rec1 == $cur_rec2 ] ||
12988 error "current index should be $cur_rec1 not $cur_rec2"
12990 echo "verifying users from this test are deregistered"
12991 changelog_deregister || error "changelog_deregister failed"
12992 changelog_users $SINGLEMDS | grep -q $cl_user &&
12993 error "User '$cl_user' still in changelog_users"
12995 # lctl get_param -n mdd.*.changelog_users
12996 # current index: 144
12997 # ID index (idle seconds)
12999 if ! changelog_users $SINGLEMDS | grep "^cl"; then
13000 # this is the normal case where all users were deregistered
13001 # make sure no new records are added when no users are present
13002 local last_rec1=$(changelog_users $SINGLEMDS |
13003 awk '/^current.index:/ { print $NF }')
13004 touch $DIR/$tdir/chloe
13005 local last_rec2=$(changelog_users $SINGLEMDS |
13006 awk '/^current.index:/ { print $NF }')
13007 echo "verify changelogs are off: $last_rec1 == $last_rec2"
13008 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
13010 # any changelog users must be leftovers from a previous test
13011 changelog_users $SINGLEMDS
13012 echo "other changelog users; can't verify off"
13015 run_test 160a "changelog sanity"
13017 test_160b() { # LU-3587
13018 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13019 remote_mds_nodsh && skip "remote MDS with nodsh"
13020 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13021 skip "Need MDS version at least 2.2.0"
13023 changelog_register || error "changelog_register failed"
13024 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13025 changelog_users $SINGLEMDS | grep -q $cl_user ||
13026 error "User '$cl_user' not found in changelog_users"
13028 local longname1=$(str_repeat a 255)
13029 local longname2=$(str_repeat b 255)
13032 echo "creating very long named file"
13033 touch $longname1 || error "create of '$longname1' failed"
13034 echo "renaming very long named file"
13035 mv $longname1 $longname2
13037 changelog_dump | grep RENME | tail -n 5
13040 run_test 160b "Verify that very long rename doesn't crash in changelog"
13043 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13044 remote_mds_nodsh && skip "remote MDS with nodsh"
13046 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
13047 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
13048 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
13049 skip "Need MDS version at least 2.5.58 or 2.5.2+"
13053 # Registration step
13054 changelog_register || error "changelog_register failed"
13057 mkdir -p $DIR/$tdir
13058 $MCREATE $DIR/$tdir/foo_160c
13059 changelog_chmask "-TRUNC"
13060 $TRUNCATE $DIR/$tdir/foo_160c 200
13061 changelog_chmask "+TRUNC"
13062 $TRUNCATE $DIR/$tdir/foo_160c 199
13063 changelog_dump | tail -n 5
13064 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
13065 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
13067 run_test 160c "verify that changelog log catch the truncate event"
13070 remote_mds_nodsh && skip "remote MDS with nodsh"
13071 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13072 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13073 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
13074 skip "Need MDS version at least 2.7.60"
13076 # Registration step
13077 changelog_register || error "changelog_register failed"
13079 mkdir -p $DIR/$tdir/migrate_dir
13080 changelog_clear 0 || error "changelog_clear failed"
13082 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
13083 changelog_dump | tail -n 5
13084 local migrates=$(changelog_dump | grep -c "MIGRT")
13085 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
13087 run_test 160d "verify that changelog log catch the migrate event"
13090 remote_mds_nodsh && skip "remote MDS with nodsh"
13093 changelog_register || error "changelog_register failed"
13095 # Delete a future user (expect fail)
13096 local MDT0=$(facet_svc $SINGLEMDS)
13097 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
13100 if [ $rc -eq 0 ]; then
13101 error "Deleted non-existant user cl77"
13102 elif [ $rc -ne 2 ]; then
13103 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
13106 # Clear to a bad index (1 billion should be safe)
13107 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
13110 if [ $rc -eq 0 ]; then
13111 error "Successfully cleared to invalid CL index"
13112 elif [ $rc -ne 22 ]; then
13113 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
13116 run_test 160e "changelog negative testing (should return errors)"
13119 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13120 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13121 skip "Need MDS version at least 2.10.56"
13123 local mdts=$(comma_list $(mdts_nodes))
13126 changelog_register || error "first changelog_register failed"
13127 changelog_register || error "second changelog_register failed"
13129 declare -A cl_user1
13130 declare -A cl_user2
13135 # generate some changelog records to accumulate on each MDT
13136 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13137 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13138 error "create $DIR/$tdir/$tfile failed"
13140 # check changelogs have been generated
13141 local nbcl=$(changelog_dump | wc -l)
13142 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13144 for param in "changelog_max_idle_time=10" \
13146 "changelog_min_gc_interval=2" \
13147 "changelog_min_free_cat_entries=3"; do
13148 local MDT0=$(facet_svc $SINGLEMDS)
13149 local var="${param%=*}"
13150 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13152 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13153 do_nodes $mdts $LCTL set_param mdd.*.$param
13156 # force cl_user2 to be idle (1st part)
13159 # simulate changelog catalog almost full
13160 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13161 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13163 for i in $(seq $MDSCOUNT); do
13164 cl_users=(${CL_USERS[mds$i]})
13165 cl_user1[mds$i]="${cl_users[0]}"
13166 cl_user2[mds$i]="${cl_users[1]}"
13168 [ -n "${cl_user1[mds$i]}" ] ||
13169 error "mds$i: no user registered"
13170 [ -n "${cl_user2[mds$i]}" ] ||
13171 error "mds$i: only ${cl_user2[mds$i]} is registered"
13173 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13174 [ -n "$user_rec1" ] ||
13175 error "mds$i: User ${cl_user1[mds$i]} not registered"
13176 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13177 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13178 [ -n "$user_rec2" ] ||
13179 error "mds$i: User ${cl_user1[mds$i]} not registered"
13180 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13181 "$user_rec1 + 2 == $user_rec2"
13182 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13183 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13184 "$user_rec1 + 2, but is $user_rec2"
13185 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13186 [ -n "$user_rec2" ] ||
13187 error "mds$i: User ${cl_user2[mds$i]} not registered"
13188 [ $user_rec1 == $user_rec2 ] ||
13189 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13190 "$user_rec1, but is $user_rec2"
13193 # force cl_user2 to be idle (2nd part) and to reach
13194 # changelog_max_idle_time
13197 # generate one more changelog to trigger fail_loc
13198 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13199 error "create $DIR/$tdir/${tfile}bis failed"
13201 # ensure gc thread is done
13202 for i in $(mdts_nodes); do
13204 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13205 error "$i: GC-thread not done"
13209 for i in $(seq $MDSCOUNT); do
13210 # check cl_user1 still registered
13211 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13212 error "mds$i: User ${cl_user1[mds$i]} not registered"
13213 # check cl_user2 unregistered
13214 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13215 error "mds$i: User ${cl_user2[mds$i]} still registered"
13217 # check changelogs are present and starting at $user_rec1 + 1
13218 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13219 [ -n "$user_rec1" ] ||
13220 error "mds$i: User ${cl_user1[mds$i]} not registered"
13221 first_rec=$($LFS changelog $(facet_svc mds$i) |
13222 awk '{ print $1; exit; }')
13224 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13225 [ $((user_rec1 + 1)) == $first_rec ] ||
13226 error "mds$i: first index should be $user_rec1 + 1, " \
13227 "but is $first_rec"
13230 run_test 160f "changelog garbage collect (timestamped users)"
13233 remote_mds_nodsh && skip "remote MDS with nodsh"
13234 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13235 skip "Need MDS version at least 2.10.56"
13237 local mdts=$(comma_list $(mdts_nodes))
13239 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
13240 do_nodes $mdts $LCTL set_param fail_loc=0x1314
13243 changelog_register || error "first changelog_register failed"
13244 changelog_register || error "second changelog_register failed"
13246 declare -A cl_user1
13247 declare -A cl_user2
13252 # generate some changelog records to accumulate on each MDT
13253 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13254 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13255 error "create $DIR/$tdir/$tfile failed"
13257 # check changelogs have been generated
13258 local nbcl=$(changelog_dump | wc -l)
13259 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13261 # reduce the max_idle_indexes value to make sure we exceed it
13262 max_ndx=$((nbcl / 2 - 1))
13264 for param in "changelog_max_idle_indexes=$max_ndx" \
13266 "changelog_min_gc_interval=2" \
13267 "changelog_min_free_cat_entries=3"; do
13268 local MDT0=$(facet_svc $SINGLEMDS)
13269 local var="${param%=*}"
13270 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13272 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13273 do_nodes $mdts $LCTL set_param mdd.*.$param ||
13274 error "unable to set mdd.*.$param"
13277 # simulate changelog catalog almost full
13278 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13279 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13281 for i in $(seq $MDSCOUNT); do
13282 cl_users=(${CL_USERS[mds$i]})
13283 cl_user1[mds$i]="${cl_users[0]}"
13284 cl_user2[mds$i]="${cl_users[1]}"
13286 [ -n "${cl_user1[mds$i]}" ] ||
13287 error "mds$i: no user registered"
13288 [ -n "${cl_user2[mds$i]}" ] ||
13289 error "mds$i: only ${cl_user1[mds$i]} is registered"
13291 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13292 [ -n "$user_rec1" ] ||
13293 error "mds$i: User ${cl_user1[mds$i]} not registered"
13294 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13295 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13296 [ -n "$user_rec2" ] ||
13297 error "mds$i: User ${cl_user1[mds$i]} not registered"
13298 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13299 "$user_rec1 + 2 == $user_rec2"
13300 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13301 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13302 "$user_rec1 + 2, but is $user_rec2"
13303 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13304 [ -n "$user_rec2" ] ||
13305 error "mds$i: User ${cl_user2[mds$i]} not registered"
13306 [ $user_rec1 == $user_rec2 ] ||
13307 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13308 "$user_rec1, but is $user_rec2"
13311 # ensure we are past the previous changelog_min_gc_interval set above
13314 # generate one more changelog to trigger fail_loc
13315 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13316 error "create $DIR/$tdir/${tfile}bis failed"
13318 # ensure gc thread is done
13319 for i in $(mdts_nodes); do
13321 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13322 error "$i: GC-thread not done"
13326 for i in $(seq $MDSCOUNT); do
13327 # check cl_user1 still registered
13328 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13329 error "mds$i: User ${cl_user1[mds$i]} not registered"
13330 # check cl_user2 unregistered
13331 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13332 error "mds$i: User ${cl_user2[mds$i]} still registered"
13334 # check changelogs are present and starting at $user_rec1 + 1
13335 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13336 [ -n "$user_rec1" ] ||
13337 error "mds$i: User ${cl_user1[mds$i]} not registered"
13338 first_rec=$($LFS changelog $(facet_svc mds$i) |
13339 awk '{ print $1; exit; }')
13341 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13342 [ $((user_rec1 + 1)) == $first_rec ] ||
13343 error "mds$i: first index should be $user_rec1 + 1, " \
13344 "but is $first_rec"
13347 run_test 160g "changelog garbage collect (old users)"
13350 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13351 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13352 skip "Need MDS version at least 2.10.56"
13354 local mdts=$(comma_list $(mdts_nodes))
13357 changelog_register || error "first changelog_register failed"
13358 changelog_register || error "second changelog_register failed"
13360 declare -A cl_user1
13361 declare -A cl_user2
13366 # generate some changelog records to accumulate on each MDT
13367 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13368 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13369 error "create $DIR/$tdir/$tfile failed"
13371 # check changelogs have been generated
13372 local nbcl=$(changelog_dump | wc -l)
13373 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13375 for param in "changelog_max_idle_time=10" \
13377 "changelog_min_gc_interval=2"; do
13378 local MDT0=$(facet_svc $SINGLEMDS)
13379 local var="${param%=*}"
13380 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13382 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13383 do_nodes $mdts $LCTL set_param mdd.*.$param
13386 # force cl_user2 to be idle (1st part)
13389 for i in $(seq $MDSCOUNT); do
13390 cl_users=(${CL_USERS[mds$i]})
13391 cl_user1[mds$i]="${cl_users[0]}"
13392 cl_user2[mds$i]="${cl_users[1]}"
13394 [ -n "${cl_user1[mds$i]}" ] ||
13395 error "mds$i: no user registered"
13396 [ -n "${cl_user2[mds$i]}" ] ||
13397 error "mds$i: only ${cl_user2[mds$i]} is registered"
13399 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13400 [ -n "$user_rec1" ] ||
13401 error "mds$i: User ${cl_user1[mds$i]} not registered"
13402 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13403 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13404 [ -n "$user_rec2" ] ||
13405 error "mds$i: User ${cl_user1[mds$i]} not registered"
13406 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13407 "$user_rec1 + 2 == $user_rec2"
13408 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13409 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13410 "$user_rec1 + 2, but is $user_rec2"
13411 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13412 [ -n "$user_rec2" ] ||
13413 error "mds$i: User ${cl_user2[mds$i]} not registered"
13414 [ $user_rec1 == $user_rec2 ] ||
13415 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13416 "$user_rec1, but is $user_rec2"
13419 # force cl_user2 to be idle (2nd part) and to reach
13420 # changelog_max_idle_time
13423 # force each GC-thread start and block then
13424 # one per MDT/MDD, set fail_val accordingly
13425 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13426 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13428 # generate more changelogs to trigger fail_loc
13429 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13430 error "create $DIR/$tdir/${tfile}bis failed"
13432 # stop MDT to stop GC-thread, should be done in back-ground as it will
13433 # block waiting for the thread to be released and exit
13434 declare -A stop_pids
13435 for i in $(seq $MDSCOUNT); do
13437 stop_pids[mds$i]=$!
13440 for i in $(mdts_nodes); do
13443 local facets=$(facets_up_on_host $i)
13445 for facet in ${facets//,/ }; do
13446 if [[ $facet == mds* ]]; then
13450 # ensure each MDS's gc threads are still present and all in "R"
13451 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
13452 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
13453 error "$i: expected $nb GC-thread"
13455 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
13457 error "$i: GC-thread not found in R-state"
13458 # check umounts of each MDT on MDS have reached kthread_stop()
13459 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
13460 error "$i: expected $nb umount"
13462 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
13463 error "$i: umount not found in D-state"
13466 # release all GC-threads
13467 do_nodes $mdts $LCTL set_param fail_loc=0
13469 # wait for MDT stop to complete
13470 for i in $(seq $MDSCOUNT); do
13471 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
13475 # may try to check if any orphan changelog records are present
13476 # via ldiskfs/zfs and llog_reader...
13478 # re-start/mount MDTs
13479 for i in $(seq $MDSCOUNT); do
13480 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
13481 error "Fail to start mds$i"
13485 for i in $(seq $MDSCOUNT); do
13486 # check cl_user1 still registered
13487 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13488 error "mds$i: User ${cl_user1[mds$i]} not registered"
13489 # check cl_user2 unregistered
13490 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13491 error "mds$i: User ${cl_user2[mds$i]} still registered"
13493 # check changelogs are present and starting at $user_rec1 + 1
13494 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13495 [ -n "$user_rec1" ] ||
13496 error "mds$i: User ${cl_user1[mds$i]} not registered"
13497 first_rec=$($LFS changelog $(facet_svc mds$i) |
13498 awk '{ print $1; exit; }')
13500 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13501 [ $((user_rec1 + 1)) == $first_rec ] ||
13502 error "mds$i: first index should be $user_rec1 + 1, " \
13503 "but is $first_rec"
13506 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
13511 local mdts=$(comma_list $(mdts_nodes))
13513 changelog_register || error "first changelog_register failed"
13515 # generate some changelog records to accumulate on each MDT
13516 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13517 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13518 error "create $DIR/$tdir/$tfile failed"
13520 # check changelogs have been generated
13521 local nbcl=$(changelog_dump | wc -l)
13522 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13524 # simulate race between register and unregister
13525 # XXX as fail_loc is set per-MDS, with DNE configs the race
13526 # simulation will only occur for one MDT per MDS and for the
13527 # others the normal race scenario will take place
13528 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
13529 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
13530 do_nodes $mdts $LCTL set_param fail_val=1
13532 # unregister 1st user
13533 changelog_deregister &
13535 # wait some time for deregister work to reach race rdv
13537 # register 2nd user
13538 changelog_register || error "2nd user register failed"
13540 wait $pid1 || error "1st user deregister failed"
13544 declare -A LAST_REC
13545 for i in $(seq $MDSCOUNT); do
13546 if changelog_users mds$i | grep "^cl"; then
13547 # make sure new records are added with one user present
13548 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
13549 awk '/^current.index:/ { print $NF }')
13551 error "mds$i has no user registered"
13555 # generate more changelog records to accumulate on each MDT
13556 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13557 error "create $DIR/$tdir/${tfile}bis failed"
13559 for i in $(seq $MDSCOUNT); do
13560 last_rec=$(changelog_users $SINGLEMDS |
13561 awk '/^current.index:/ { print $NF }')
13562 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
13563 [ $last_rec != ${LAST_REC[mds$i]} ] ||
13564 error "changelogs are off on mds$i"
13567 run_test 160i "changelog user register/unregister race"
13570 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13571 remote_mds_nodsh && skip "remote MDS with nodsh"
13573 mkdir -p $DIR/$tdir/1/1
13575 changelog_register || error "changelog_register failed"
13576 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13578 changelog_users $SINGLEMDS | grep -q $cl_user ||
13579 error "User '$cl_user' not found in changelog_users"
13580 #define OBD_FAIL_MDS_CHANGELOG_REORDER 0x15d
13581 do_facet mds1 $LCTL set_param fail_loc=0x8000015d fail_val=3
13582 rmdir $DIR/$tdir/1/1 & sleep 1
13584 touch $DIR/$tdir/2/2
13585 rm -rf $DIR/$tdir/2
13590 changelog_dump | grep rmdir || error "rmdir not recorded"
13593 changelog_deregister
13595 run_test 160k "Verify that changelog records are not lost"
13598 remote_mds_nodsh && skip "remote MDS with nodsh"
13599 [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] &&
13600 skip "Need MDS version at least 2.12.56"
13602 mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
13604 changelog_register || error "first changelog_register failed"
13606 # generate some changelog
13607 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13608 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13609 error "create $DIR/$tdir/${tfile}bis failed"
13611 # open the changelog device
13612 exec 3>/dev/changelog-$FSNAME-MDT0000
13613 exec 4</dev/changelog-$FSNAME-MDT0000
13615 # umount the first lustre mount
13619 cat <&4 >/dev/null || error "read changelog failed"
13622 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13623 changelog_users $SINGLEMDS | grep -q $cl_user ||
13624 error "User $cl_user not found in changelog_users"
13626 printf 'clear:'$cl_user':0' >&3
13633 changelog_deregister || error "changelog_deregister failed"
13636 mount_client $MOUNT || error "mount_client on $MOUNT failed"
13638 run_test 160j "client can be umounted while its chanangelog is being used"
13641 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13643 test_mkdir -c1 $DIR/$tdir
13644 cp /etc/hosts $DIR/$tdir/$tfile
13645 test_mkdir -c1 $DIR/$tdir/foo1
13646 test_mkdir -c1 $DIR/$tdir/foo2
13647 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
13648 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
13649 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
13650 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
13651 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
13652 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13653 $LFS fid2path $DIR $FID
13654 error "bad link ea"
13657 rm $DIR/$tdir/foo2/zachary
13659 rm $DIR/$tdir/foo2/thor
13661 rm $DIR/$tdir/$tfile
13663 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
13664 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
13665 { $LFS fid2path $DIR $FID; error "bad link rename"; }
13666 rm $DIR/$tdir/foo2/maggie
13669 local longname=$tfile.avg_len_is_thirty_two_
13670 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
13671 error_noexit 'failed to unlink many hardlinks'" EXIT
13672 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
13673 error "failed to hardlink many files"
13674 links=$($LFS fid2path $DIR $FID | wc -l)
13675 echo -n "${links}/1000 links in link EA"
13676 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
13678 run_test 161a "link ea sanity"
13681 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13682 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
13685 local remote_dir=$DIR/$tdir/remote_dir
13687 mkdir -p $DIR/$tdir
13688 $LFS mkdir -i $MDTIDX $remote_dir ||
13689 error "create remote directory failed"
13691 cp /etc/hosts $remote_dir/$tfile
13692 mkdir -p $remote_dir/foo1
13693 mkdir -p $remote_dir/foo2
13694 ln $remote_dir/$tfile $remote_dir/foo1/sofia
13695 ln $remote_dir/$tfile $remote_dir/foo2/zachary
13696 ln $remote_dir/$tfile $remote_dir/foo1/luna
13697 ln $remote_dir/$tfile $remote_dir/foo2/thor
13699 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
13701 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13702 $LFS fid2path $DIR $FID
13703 error "bad link ea"
13706 rm $remote_dir/foo2/zachary
13708 rm $remote_dir/foo2/thor
13710 rm $remote_dir/$tfile
13712 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
13713 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
13714 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
13715 $LFS fid2path $DIR $FID
13716 error "bad link rename"
13718 rm $remote_dir/foo2/maggie
13721 local longname=filename_avg_len_is_thirty_two_
13722 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
13723 error "failed to hardlink many files"
13724 links=$($LFS fid2path $DIR $FID | wc -l)
13725 echo -n "${links}/1000 links in link EA"
13726 [[ ${links} -gt 60 ]] ||
13727 error "expected at least 60 links in link EA"
13728 unlinkmany $remote_dir/foo2/$longname 1000 ||
13729 error "failed to unlink many hardlinks"
13731 run_test 161b "link ea sanity under remote directory"
13734 remote_mds_nodsh && skip "remote MDS with nodsh"
13735 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13736 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
13737 skip "Need MDS version at least 2.1.5"
13739 # define CLF_RENAME_LAST 0x0001
13740 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
13741 changelog_register || error "changelog_register failed"
13744 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
13745 touch $DIR/$tdir/foo_161c
13746 touch $DIR/$tdir/bar_161c
13747 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13748 changelog_dump | grep RENME | tail -n 5
13749 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13750 changelog_clear 0 || error "changelog_clear failed"
13751 if [ x$flags != "x0x1" ]; then
13752 error "flag $flags is not 0x1"
13755 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
13756 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
13757 touch $DIR/$tdir/foo_161c
13758 touch $DIR/$tdir/bar_161c
13759 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13760 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13761 changelog_dump | grep RENME | tail -n 5
13762 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13763 changelog_clear 0 || error "changelog_clear failed"
13764 if [ x$flags != "x0x0" ]; then
13765 error "flag $flags is not 0x0"
13767 echo "rename overwrite a target having nlink > 1," \
13768 "changelog record has flags of $flags"
13770 # rename doesn't overwrite a target (changelog flag 0x0)
13771 touch $DIR/$tdir/foo_161c
13772 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
13773 changelog_dump | grep RENME | tail -n 5
13774 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
13775 changelog_clear 0 || error "changelog_clear failed"
13776 if [ x$flags != "x0x0" ]; then
13777 error "flag $flags is not 0x0"
13779 echo "rename doesn't overwrite a target," \
13780 "changelog record has flags of $flags"
13782 # define CLF_UNLINK_LAST 0x0001
13783 # unlink a file having nlink = 1 (changelog flag 0x1)
13784 rm -f $DIR/$tdir/foo2_161c
13785 changelog_dump | grep UNLNK | tail -n 5
13786 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13787 changelog_clear 0 || error "changelog_clear failed"
13788 if [ x$flags != "x0x1" ]; then
13789 error "flag $flags is not 0x1"
13791 echo "unlink a file having nlink = 1," \
13792 "changelog record has flags of $flags"
13794 # unlink a file having nlink > 1 (changelog flag 0x0)
13795 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13796 rm -f $DIR/$tdir/foobar_161c
13797 changelog_dump | grep UNLNK | tail -n 5
13798 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13799 changelog_clear 0 || error "changelog_clear failed"
13800 if [ x$flags != "x0x0" ]; then
13801 error "flag $flags is not 0x0"
13803 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
13805 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
13808 remote_mds_nodsh && skip "remote MDS with nodsh"
13813 changelog_register || error "changelog_register failed"
13815 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
13816 # interfer with $MOUNT/.lustre/fid/ access
13818 [[ $? -eq 0 ]] || error "mkdir failed"
13820 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
13821 $LCTL set_param fail_loc=0x8000140c
13823 $LCTL set_param fail_val=5
13826 echo foofoo > $DIR/$tdir/$tfile &
13829 # wait for create to be delayed
13833 [[ $? -eq 0 ]] || error "create should be blocked"
13835 local tempfile=$(mktemp)
13836 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
13837 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
13838 # some delay may occur during ChangeLog publishing and file read just
13839 # above, that could allow file write to happen finally
13840 [[ -s $tempfile ]] && echo "file should be empty"
13842 $LCTL set_param fail_loc=0
13845 [[ $? -eq 0 ]] || error "create failed"
13847 run_test 161d "create with concurrent .lustre/fid access"
13850 local expected="$1"
13855 path=$($LFS fid2path "$@")
13858 if [ $rc -ne 0 ]; then
13859 error "path looked up of '$expected' failed: rc=$rc"
13860 elif [ "$path" != "$expected" ]; then
13861 error "path looked up '$path' instead of '$expected'"
13863 echo "FID '$fid' resolves to path '$path' as expected"
13867 test_162a() { # was test_162
13868 test_mkdir -p -c1 $DIR/$tdir/d2
13869 touch $DIR/$tdir/d2/$tfile
13870 touch $DIR/$tdir/d2/x1
13871 touch $DIR/$tdir/d2/x2
13872 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
13873 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
13875 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
13876 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
13879 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
13880 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
13881 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
13883 # softlink to wrong file
13884 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
13885 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
13886 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
13889 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
13890 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
13891 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
13892 # fid2path dir/fsname should both work
13893 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
13894 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
13896 # hardlink count: check that there are 2 links
13897 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
13898 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
13900 # hardlink indexing: remove the first link
13901 rm $DIR/$tdir/d2/p/q/r/hlink
13902 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
13904 run_test 162a "path lookup sanity"
13907 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13908 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13911 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
13912 error "create striped dir failed"
13914 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
13915 tail -n 1 | awk '{print $2}')
13916 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
13918 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
13919 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
13922 for ((i=0;i<5;i++)); do
13923 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
13924 error "get fid for f$i failed"
13925 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
13927 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
13928 error "get fid for d$i failed"
13929 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
13934 run_test 162b "striped directory path lookup sanity"
13936 # LU-4239: Verify fid2path works with paths 100 or more directories deep
13938 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
13939 skip "Need MDS version at least 2.7.51"
13941 local lpath=$tdir.local
13942 local rpath=$tdir.remote
13944 test_mkdir $DIR/$lpath
13945 test_mkdir $DIR/$rpath
13947 for ((i = 0; i <= 101; i++)); do
13950 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
13951 error "get fid for local directory $DIR/$lpath failed"
13952 check_path "$DIR/$lpath" $MOUNT $FID --link 0
13955 test_mkdir $DIR/$rpath
13956 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
13957 error "get fid for remote directory $DIR/$rpath failed"
13958 check_path "$DIR/$rpath" $MOUNT $FID --link 0
13963 run_test 162c "fid2path works with paths 100 or more directories deep"
13966 # do directio so as not to populate the page cache
13967 log "creating a 10 Mb file"
13968 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
13969 log "starting reads"
13970 dd if=$DIR/$tfile of=/dev/null bs=4096 &
13971 log "truncating the file"
13972 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
13974 kill %+ || true # reads might have finished
13975 echo "wait until dd is finished"
13977 log "removing the temporary file"
13978 rm -rf $DIR/$tfile || error "tmp file removal failed"
13980 run_test 169 "parallel read and truncate should not deadlock"
13983 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13985 $LCTL clear # bug 18514
13986 $LCTL debug_daemon start $TMP/${tfile}_log_good
13988 $LCTL debug_daemon stop
13989 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
13990 error "sed failed to read log_good"
13992 $LCTL debug_daemon start $TMP/${tfile}_log_good
13994 $LCTL debug_daemon stop
13996 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
13997 error "lctl df log_bad failed"
13999 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14000 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14002 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
14003 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
14005 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
14006 error "bad_line good_line1 good_line2 are empty"
14008 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14009 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
14010 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14012 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
14013 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14014 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14016 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
14017 error "bad_line_new good_line_new are empty"
14019 local expected_good=$((good_line1 + good_line2*2))
14021 rm -f $TMP/${tfile}*
14022 # LU-231, short malformed line may not be counted into bad lines
14023 if [ $bad_line -ne $bad_line_new ] &&
14024 [ $bad_line -ne $((bad_line_new - 1)) ]; then
14025 error "expected $bad_line bad lines, but got $bad_line_new"
14029 if [ $expected_good -ne $good_line_new ]; then
14030 error "expected $expected_good good lines, but got $good_line_new"
14035 run_test 170 "test lctl df to handle corrupted log ====================="
14037 test_171() { # bug20592
14038 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14040 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
14041 $LCTL set_param fail_loc=0x50e
14042 $LCTL set_param fail_val=3000
14043 multiop_bg_pause $DIR/$tfile O_s || true
14045 kill -USR1 $MULTIPID
14049 if dmesg | grep "recursive fault"; then
14050 error "caught a recursive fault"
14052 $LCTL set_param fail_loc=0
14055 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
14057 # it would be good to share it with obdfilter-survey/iokit-libecho code
14058 setup_obdecho_osc () {
14061 local obdfilter_name=$2
14062 echo "Creating new osc for $obdfilter_name on $ost_nid"
14063 # make sure we can find loopback nid
14064 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
14066 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
14067 ${obdfilter_name}_osc_UUID || rc=2; }
14068 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
14069 ${obdfilter_name}_UUID $ost_nid || rc=3; }
14073 cleanup_obdecho_osc () {
14074 local obdfilter_name=$1
14075 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
14076 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
14083 local pages=${3:-64}
14088 local obd_size=$(get_obd_size $node $OBD)
14089 local page_size=$(get_page_size $node)
14090 if [[ -n "$obd_size" ]]; then
14091 local new_count=$((obd_size / (pages * page_size / 1024)))
14092 [[ $new_count -ge $count ]] || count=$new_count
14095 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
14096 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
14098 if [ $rc -eq 0 ]; then
14099 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
14100 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
14102 echo "New object id is $id"
14103 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
14105 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
14106 "test_brw $count w v $pages $id" || rc=4; }
14107 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
14109 [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
14110 "cleanup" || rc=5; }
14111 [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \
14112 "detach" || rc=6; }
14113 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
14118 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14120 if ! module_loaded obdecho; then
14121 load_module obdecho/obdecho &&
14122 stack_trap "rmmod obdecho" EXIT ||
14123 error "unable to load obdecho on client"
14126 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
14127 local host=$($LCTL get_param -n osc.$osc.import |
14128 awk '/current_connection:/ { print $2 }' )
14129 local target=$($LCTL get_param -n osc.$osc.import |
14130 awk '/target:/ { print $2 }' )
14131 target=${target%_UUID}
14133 if [ -n "$target" ]; then
14134 setup_obdecho_osc $host $target &&
14135 stack_trap "cleanup_obdecho_osc $target" EXIT ||
14136 { error "obdecho setup failed with $?"; return; }
14138 obdecho_test ${target}_osc client ||
14139 error "obdecho_test failed on ${target}_osc"
14141 $LCTL get_param osc.$osc.import
14142 error "there is no osc.$osc.import target"
14145 run_test 180a "test obdecho on osc"
14148 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14149 remote_ost_nodsh && skip "remote OST with nodsh"
14151 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14152 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14153 error "failed to load module obdecho"
14155 local target=$(do_facet ost1 $LCTL dl |
14156 awk '/obdfilter/ { print $4; exit; }')
14158 if [ -n "$target" ]; then
14159 obdecho_test $target ost1 || error "obdecho_test failed with $?"
14161 do_facet ost1 $LCTL dl
14162 error "there is no obdfilter target on ost1"
14165 run_test 180b "test obdecho directly on obdfilter"
14167 test_180c() { # LU-2598
14168 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14169 remote_ost_nodsh && skip "remote OST with nodsh"
14170 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
14171 skip "Need MDS version at least 2.4.0"
14173 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14174 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14175 error "failed to load module obdecho"
14177 local target=$(do_facet ost1 $LCTL dl |
14178 awk '/obdfilter/ { print $4; exit; }')
14180 if [ -n "$target" ]; then
14181 local pages=16384 # 64MB bulk I/O RPC size
14183 obdecho_test "$target" ost1 "$pages" ||
14184 error "obdecho_test with pages=$pages failed with $?"
14186 do_facet ost1 $LCTL dl
14187 error "there is no obdfilter target on ost1"
14190 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
14192 test_181() { # bug 22177
14193 test_mkdir $DIR/$tdir
14194 # create enough files to index the directory
14195 createmany -o $DIR/$tdir/foobar 4000
14196 # print attributes for debug purpose
14199 multiop_bg_pause $DIR/$tdir D_Sc || return 1
14201 # remove the files & current working dir
14202 unlinkmany $DIR/$tdir/foobar 4000
14204 kill -USR1 $MULTIPID
14206 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
14209 run_test 181 "Test open-unlinked dir ========================"
14215 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14217 $LCTL set_param mdc.*.rpc_stats=clear
14219 for (( i = 0; i < $tcount; i++ )) ; do
14220 mkdir $DIR/$tdir/$i
14223 for (( i = 0; i < $tcount; i++ )) ; do
14224 createmany -o $DIR/$tdir/$i/f- $fcount &
14228 for (( i = 0; i < $tcount; i++ )) ; do
14229 unlinkmany $DIR/$tdir/$i/f- $fcount &
14233 $LCTL get_param mdc.*.rpc_stats
14237 run_test 182 "Test parallel modify metadata operations ================"
14239 test_183() { # LU-2275
14240 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14241 remote_mds_nodsh && skip "remote MDS with nodsh"
14242 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
14243 skip "Need MDS version at least 2.3.56"
14245 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14246 echo aaa > $DIR/$tdir/$tfile
14248 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
14249 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
14251 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
14252 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
14254 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
14256 # Flush negative dentry cache
14257 touch $DIR/$tdir/$tfile
14259 # We are not checking for any leaked references here, they'll
14260 # become evident next time we do cleanup with module unload.
14263 run_test 183 "No crash or request leak in case of strange dispositions ========"
14265 # test suite 184 is for LU-2016, LU-2017
14267 check_swap_layouts_support
14269 dir0=$DIR/$tdir/$testnum
14270 test_mkdir -p -c1 $dir0
14275 $SETSTRIPE -c1 $file1
14277 $SETSTRIPE -c2 $file2
14279 gen1=$($GETSTRIPE -g $file1)
14280 gen2=$($GETSTRIPE -g $file2)
14282 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
14283 gen=$($GETSTRIPE -g $file1)
14284 [[ $gen1 != $gen ]] ||
14285 "Layout generation on $file1 does not change"
14286 gen=$($GETSTRIPE -g $file2)
14287 [[ $gen2 != $gen ]] ||
14288 "Layout generation on $file2 does not change"
14290 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
14291 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
14293 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
14295 run_test 184a "Basic layout swap"
14298 check_swap_layouts_support
14300 dir0=$DIR/$tdir/$testnum
14301 mkdir -p $dir0 || error "creating dir $dir0"
14308 $SETSTRIPE -c1 $file1
14309 $SETSTRIPE -c2 $file2
14310 $SETSTRIPE -c1 $file3
14311 chown $RUNAS_ID $file3
14312 gen1=$($GETSTRIPE -g $file1)
14313 gen2=$($GETSTRIPE -g $file2)
14315 $LFS swap_layouts $dir1 $dir2 &&
14316 error "swap of directories layouts should fail"
14317 $LFS swap_layouts $dir1 $file1 &&
14318 error "swap of directory and file layouts should fail"
14319 $RUNAS $LFS swap_layouts $file1 $file2 &&
14320 error "swap of file we cannot write should fail"
14321 $LFS swap_layouts $file1 $file3 &&
14322 error "swap of file with different owner should fail"
14323 /bin/true # to clear error code
14325 run_test 184b "Forbidden layout swap (will generate errors)"
14328 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14329 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14330 check_swap_layouts_support
14332 local dir0=$DIR/$tdir/$testnum
14333 mkdir -p $dir0 || error "creating dir $dir0"
14335 local ref1=$dir0/ref1
14336 local ref2=$dir0/ref2
14337 local file1=$dir0/file1
14338 local file2=$dir0/file2
14339 # create a file large enough for the concurrent test
14340 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14341 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14342 echo "ref file size: ref1($(stat -c %s $ref1))," \
14343 "ref2($(stat -c %s $ref2))"
14346 dd if=$ref1 of=$file1 bs=16k &
14349 # Make sure dd starts to copy file
14350 while [ ! -f $file1 ]; do sleep 0.1; done
14352 $LFS swap_layouts $file1 $file2
14355 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14356 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14358 # how many bytes copied before swapping layout
14359 local copied=$(stat -c %s $file2)
14360 local remaining=$(stat -c %s $ref1)
14361 remaining=$((remaining - copied))
14362 echo "Copied $copied bytes before swapping layout..."
14364 cmp -n $copied $file1 $ref2 | grep differ &&
14365 error "Content mismatch [0, $copied) of ref2 and file1"
14366 cmp -n $copied $file2 $ref1 ||
14367 error "Content mismatch [0, $copied) of ref1 and file2"
14368 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14369 error "Content mismatch [$copied, EOF) of ref1 and file1"
14372 rm -f $ref1 $ref2 $file1 $file2
14374 run_test 184c "Concurrent write and layout swap"
14377 check_swap_layouts_support
14378 [ -z "$(which getfattr 2>/dev/null)" ] &&
14379 skip_env "no getfattr command"
14381 local file1=$DIR/$tdir/$tfile-1
14382 local file2=$DIR/$tdir/$tfile-2
14383 local file3=$DIR/$tdir/$tfile-3
14387 mkdir -p $DIR/$tdir
14388 touch $file1 || error "create $file1 failed"
14389 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14390 error "create $file2 failed"
14391 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14392 error "create $file3 failed"
14393 lovea1=$(get_layout_param $file1)
14395 $LFS swap_layouts $file2 $file3 ||
14396 error "swap $file2 $file3 layouts failed"
14397 $LFS swap_layouts $file1 $file2 ||
14398 error "swap $file1 $file2 layouts failed"
14400 lovea2=$(get_layout_param $file2)
14403 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14405 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14406 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14408 run_test 184d "allow stripeless layouts swap"
14411 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14412 skip "Need MDS version at least 2.6.94"
14413 check_swap_layouts_support
14414 [ -z "$(which getfattr 2>/dev/null)" ] &&
14415 skip_env "no getfattr command"
14417 local file1=$DIR/$tdir/$tfile-1
14418 local file2=$DIR/$tdir/$tfile-2
14419 local file3=$DIR/$tdir/$tfile-3
14422 mkdir -p $DIR/$tdir
14423 touch $file1 || error "create $file1 failed"
14424 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14425 error "create $file2 failed"
14426 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14427 error "create $file3 failed"
14429 $LFS swap_layouts $file1 $file2 ||
14430 error "swap $file1 $file2 layouts failed"
14432 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14433 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14435 echo 123 > $file1 || error "Should be able to write into $file1"
14437 $LFS swap_layouts $file1 $file3 ||
14438 error "swap $file1 $file3 layouts failed"
14440 echo 123 > $file1 || error "Should be able to write into $file1"
14442 rm -rf $file1 $file2 $file3
14444 run_test 184e "Recreate layout after stripeless layout swaps"
14447 # Create a file with name longer than sizeof(struct stat) ==
14448 # 144 to see if we can get chars from the file name to appear
14449 # in the returned striping. Note that 'f' == 0x66.
14450 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
14452 mkdir -p $DIR/$tdir
14453 mcreate $DIR/$tdir/$file
14454 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
14455 error "IOC_MDC_GETFILEINFO returned garbage striping"
14458 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
14460 test_185() { # LU-2441
14461 # LU-3553 - no volatile file support in old servers
14462 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
14463 skip "Need MDS version at least 2.3.60"
14465 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14466 touch $DIR/$tdir/spoo
14467 local mtime1=$(stat -c "%Y" $DIR/$tdir)
14468 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
14469 error "cannot create/write a volatile file"
14470 [ "$FILESET" == "" ] &&
14471 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
14472 error "FID is still valid after close"
14474 multiop_bg_pause $DIR/$tdir vVw4096_c
14481 # assume that the next FID for this client is sequential, since stdout
14482 # is unfortunately eaten by multiop_bg_pause
14483 local n=$((${fidv[1]} + 1))
14484 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
14485 if [ "$FILESET" == "" ]; then
14486 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
14487 error "FID is missing before close"
14489 kill -USR1 $multi_pid
14490 # 1 second delay, so if mtime change we will see it
14492 local mtime2=$(stat -c "%Y" $DIR/$tdir)
14493 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
14495 run_test 185 "Volatile file support"
14497 function create_check_volatile() {
14501 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
14504 local FID=$(cat /tmp/${tfile}.fid)
14505 [ "$FID" == "" ] && error "can't get FID for volatile"
14506 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
14507 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
14508 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
14512 cancel_lru_locks mdc # flush opencache
14513 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
14518 # LU-12516 - volatile creation via .lustre
14519 [[ $MDS1_VERSION -ge $(version_code 2.12.2) ]] ||
14520 skip "Need MDS version at least 2.12.2"
14522 create_check_volatile 0
14523 [ $MDSCOUNT -lt 2 ] && return 0
14526 create_check_volatile 1
14530 run_test 185a "Volatile file creation in .lustre/fid/"
14533 remote_mds_nodsh && skip "remote MDS with nodsh"
14534 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14535 skip "Need MDS version at least 2.3.0"
14537 local dir0=$DIR/$tdir/$testnum
14538 mkdir -p $dir0 || error "creating dir $dir0"
14540 local file=$dir0/file1
14541 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
14542 local dv1=$($LFS data_version $file)
14543 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
14544 local dv2=$($LFS data_version $file)
14545 [[ $dv1 != $dv2 ]] ||
14546 error "data version did not change on write $dv1 == $dv2"
14551 run_test 187a "Test data version change"
14554 remote_mds_nodsh && skip "remote MDS with nodsh"
14555 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14556 skip "Need MDS version at least 2.3.0"
14558 local dir0=$DIR/$tdir/$testnum
14559 mkdir -p $dir0 || error "creating dir $dir0"
14561 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
14562 [[ ${DV[0]} != ${DV[1]} ]] ||
14563 error "data version did not change on write"\
14564 " ${DV[0]} == ${DV[1]}"
14569 run_test 187b "Test data version change on volatile file"
14572 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14573 remote_mgs_nodsh && skip "remote MGS with nodsh"
14574 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
14576 local POOL=${POOL:-cea1}
14577 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
14578 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
14581 local last_ost=$(($OSTCOUNT - 1))
14583 local ost_list=$(seq $first_ost $ost_step $last_ost)
14584 local ost_range="$first_ost $last_ost $ost_step"
14585 local test_path=$POOL_ROOT/$POOL_DIR_NAME
14586 local file_dir=$POOL_ROOT/file_tst
14587 local subdir=$test_path/subdir
14591 # former test_200a test_200b
14592 pool_add $POOL || { rc=$? ; break; }
14593 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
14594 # former test_200c test_200d
14595 mkdir -p $test_path
14596 pool_set_dir $POOL $test_path || { rc=$? ; break; }
14597 pool_check_dir $POOL $test_path || { rc=$? ; break; }
14599 pool_check_dir $POOL $subdir || { rc=$? ; break; }
14600 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
14601 || { rc=$? ; break; }
14602 # former test_200e test_200f
14603 local files=$((OSTCOUNT*3))
14604 pool_alloc_files $POOL $test_path $files "$ost_list" \
14605 || { rc=$? ; break; }
14606 pool_create_files $POOL $file_dir $files "$ost_list" \
14607 || { rc=$? ; break; }
14608 # former test_200g test_200h
14609 pool_lfs_df $POOL || { rc=$? ; break; }
14610 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
14612 # former test_201a test_201b test_201c
14613 pool_remove_first_target $POOL || { rc=$? ; break; }
14615 local f=$test_path/$tfile
14616 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
14617 pool_remove $POOL $f || { rc=$? ; break; }
14625 run_test 200 "OST pools"
14627 # usage: default_attr <count | size | offset>
14629 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
14632 # usage: check_default_stripe_attr
14633 check_default_stripe_attr() {
14634 ACTUAL=$($GETSTRIPE $* $DIR/$tdir)
14637 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
14639 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
14643 error "unknown getstripe attr '$1'"
14646 [ $ACTUAL == $EXPECTED ] ||
14647 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
14651 test_mkdir $DIR/$tdir
14652 $SETSTRIPE --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
14654 check_default_stripe_attr --stripe-count
14655 check_default_stripe_attr --stripe-size
14656 check_default_stripe_attr --stripe-index
14658 run_test 204a "Print default stripe attributes"
14661 test_mkdir $DIR/$tdir
14662 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14664 check_default_stripe_attr --stripe-size
14665 check_default_stripe_attr --stripe-index
14667 run_test 204b "Print default stripe size and offset"
14670 test_mkdir $DIR/$tdir
14671 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14673 check_default_stripe_attr --stripe-count
14674 check_default_stripe_attr --stripe-index
14676 run_test 204c "Print default stripe count and offset"
14679 test_mkdir $DIR/$tdir
14680 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14682 check_default_stripe_attr --stripe-count
14683 check_default_stripe_attr --stripe-size
14685 run_test 204d "Print default stripe count and size"
14688 test_mkdir $DIR/$tdir
14689 $SETSTRIPE -d $DIR/$tdir
14691 check_default_stripe_attr --stripe-count --raw
14692 check_default_stripe_attr --stripe-size --raw
14693 check_default_stripe_attr --stripe-index --raw
14695 run_test 204e "Print raw stripe attributes"
14698 test_mkdir $DIR/$tdir
14699 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14701 check_default_stripe_attr --stripe-size --raw
14702 check_default_stripe_attr --stripe-index --raw
14704 run_test 204f "Print raw stripe size and offset"
14707 test_mkdir $DIR/$tdir
14708 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14710 check_default_stripe_attr --stripe-count --raw
14711 check_default_stripe_attr --stripe-index --raw
14713 run_test 204g "Print raw stripe count and offset"
14716 test_mkdir $DIR/$tdir
14717 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14719 check_default_stripe_attr --stripe-count --raw
14720 check_default_stripe_attr --stripe-size --raw
14722 run_test 204h "Print raw stripe count and size"
14724 # Figure out which job scheduler is being used, if any,
14725 # or use a fake one
14726 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
14727 JOBENV=SLURM_JOB_ID
14728 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
14730 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
14732 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
14733 JOBENV=LOADL_STEP_ID
14734 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
14737 $LCTL list_param jobid_name > /dev/null 2>&1
14738 if [ $? -eq 0 ]; then
14744 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
14746 verify_jobstats() {
14751 # we don't really need to clear the stats for this test to work, since each
14752 # command has a unique jobid, but it makes debugging easier if needed.
14753 # for facet in $facets; do
14754 # local dev=$(convert_facet2label $facet)
14755 # # clear old jobstats
14756 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
14759 # use a new JobID for each test, or we might see an old one
14760 [ "$JOBENV" = "FAKE_JOBID" ] &&
14761 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
14763 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
14765 [ "$JOBENV" = "nodelocal" ] && {
14766 FAKE_JOBID=id.$testnum.%e.$RANDOM
14767 $LCTL set_param jobid_name=$FAKE_JOBID
14768 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
14771 log "Test: ${cmd[*]}"
14772 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
14774 if [ $JOBENV = "FAKE_JOBID" ]; then
14775 FAKE_JOBID=$JOBVAL ${cmd[*]}
14780 # all files are created on OST0000
14781 for facet in $facets; do
14782 local stats="*.$(convert_facet2label $facet).job_stats"
14784 # strip out libtool wrappers for in-tree executables
14785 if [ $(do_facet $facet lctl get_param $stats |
14786 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
14787 do_facet $facet lctl get_param $stats
14788 error "No jobstats for $JOBVAL found on $facet::$stats"
14794 local new_jobenv=$1
14796 set_persistent_param_and_check client "jobid_var" \
14797 "$FSNAME.sys.jobid_var" $new_jobenv
14800 test_205a() { # Job stats
14801 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14802 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
14803 skip "Need MDS version with at least 2.7.1"
14804 remote_mgs_nodsh && skip "remote MGS with nodsh"
14805 remote_mds_nodsh && skip "remote MDS with nodsh"
14806 remote_ost_nodsh && skip "remote OST with nodsh"
14807 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
14808 skip "Server doesn't support jobstats"
14809 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
14811 local old_jobenv=$($LCTL get_param -n jobid_var)
14812 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
14814 if [[ $PERM_CMD = *"set_param -P"* ]]; then
14815 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
14817 stack_trap "do_facet mgs $PERM_CMD \
14818 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
14822 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
14823 mdt.*.job_cleanup_interval | head -n 1)
14824 local new_interval=5
14825 do_facet $SINGLEMDS \
14826 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
14827 stack_trap "do_facet $SINGLEMDS \
14828 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
14829 local start=$SECONDS
14833 cmd="mkdir $DIR/$tdir"
14834 verify_jobstats "$cmd" "$SINGLEMDS"
14836 cmd="rmdir $DIR/$tdir"
14837 verify_jobstats "$cmd" "$SINGLEMDS"
14838 # mkdir on secondary MDT
14839 if [ $MDSCOUNT -gt 1 ]; then
14840 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
14841 verify_jobstats "$cmd" "mds2"
14844 cmd="mknod $DIR/$tfile c 1 3"
14845 verify_jobstats "$cmd" "$SINGLEMDS"
14847 cmd="rm -f $DIR/$tfile"
14848 verify_jobstats "$cmd" "$SINGLEMDS"
14849 # create all files on OST0000 so verify_jobstats can find OST stats
14851 cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile"
14852 verify_jobstats "$cmd" "$SINGLEMDS"
14854 cmd="touch $DIR/$tfile"
14855 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14857 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
14858 verify_jobstats "$cmd" "ost1"
14860 cancel_lru_locks osc
14861 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
14862 verify_jobstats "$cmd" "ost1"
14864 cmd="$TRUNCATE $DIR/$tfile 0"
14865 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14867 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
14868 verify_jobstats "$cmd" "$SINGLEMDS"
14869 # jobstats expiry - sleep until old stats should be expired
14870 local left=$((new_interval + 5 - (SECONDS - start)))
14871 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
14872 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
14874 cmd="mkdir $DIR/$tdir.expire"
14875 verify_jobstats "$cmd" "$SINGLEMDS"
14876 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
14877 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
14879 # Ensure that jobid are present in changelog (if supported by MDS)
14880 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
14881 changelog_dump | tail -10
14882 jobids=$(changelog_dump | tail -9 | grep -c "j=")
14883 [ $jobids -eq 9 ] ||
14884 error "Wrong changelog jobid count $jobids != 9"
14888 jobstats_set $JOBENV
14890 changelog_dump | grep $tfile
14891 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
14892 [ $jobids -eq 0 ] ||
14893 error "Unexpected jobids when jobid_var=$JOBENV"
14896 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
14897 JOBENV="JOBCOMPLEX"
14898 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
14900 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
14902 run_test 205a "Verify job stats"
14906 $LCTL set_param jobid_var=USER jobid_name="%e.%u"
14907 env -i USERTESTJOBSTATS=foolish touch $DIR/$tfile.1
14908 do_facet $SINGLEMDS $LCTL get_param mdt.*.job_stats |
14909 grep job_id: | grep foolish &&
14910 error "Unexpected jobid found"
14913 run_test 205b "Verify job stats jobid parsing"
14915 # LU-1480, LU-1773 and LU-1657
14917 mkdir -p $DIR/$tdir
14918 $SETSTRIPE -c -1 $DIR/$tdir
14919 #define OBD_FAIL_LOV_INIT 0x1403
14920 $LCTL set_param fail_loc=0xa0001403
14921 $LCTL set_param fail_val=1
14922 touch $DIR/$tdir/$tfile || true
14924 run_test 206 "fail lov_init_raid0() doesn't lbug"
14927 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14928 local fsz=`stat -c %s $DIR/$tfile`
14929 cancel_lru_locks mdc
14931 # do not return layout in getattr intent
14932 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
14933 $LCTL set_param fail_loc=0x170
14934 local sz=`stat -c %s $DIR/$tfile`
14936 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
14940 run_test 207a "can refresh layout at glimpse"
14943 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14944 local cksum=`md5sum $DIR/$tfile`
14945 local fsz=`stat -c %s $DIR/$tfile`
14946 cancel_lru_locks mdc
14947 cancel_lru_locks osc
14949 # do not return layout in getattr intent
14950 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
14951 $LCTL set_param fail_loc=0x171
14953 # it will refresh layout after the file is opened but before read issues
14954 echo checksum is "$cksum"
14955 echo "$cksum" |md5sum -c --quiet || error "file differs"
14959 run_test 207b "can refresh layout at open"
14962 # FIXME: in this test suite, only RD lease is used. This is okay
14963 # for now as only exclusive open is supported. After generic lease
14964 # is done, this test suite should be revised. - Jinshan
14966 remote_mds_nodsh && skip "remote MDS with nodsh"
14967 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
14968 skip "Need MDS version at least 2.4.52"
14970 echo "==== test 1: verify get lease work"
14971 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
14973 echo "==== test 2: verify lease can be broken by upcoming open"
14974 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
14978 $MULTIOP $DIR/$tfile oO_RDONLY:c
14979 kill -USR1 $PID && wait $PID || error "break lease error"
14981 echo "==== test 3: verify lease can't be granted if an open already exists"
14982 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
14986 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
14987 kill -USR1 $PID && wait $PID || error "open file error"
14989 echo "==== test 4: lease can sustain over recovery"
14990 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
14996 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
14998 echo "==== test 5: lease broken can't be regained by replay"
14999 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15003 # open file to break lease and then recovery
15004 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
15007 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
15011 run_test 208 "Exclusive open"
15014 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
15015 skip_env "must have disp_stripe"
15018 sync; sleep 5; sync;
15020 echo 3 > /proc/sys/vm/drop_caches
15021 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15023 # open/close 500 times
15024 for i in $(seq 500); do
15028 echo 3 > /proc/sys/vm/drop_caches
15029 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15031 echo "before: $req_before, after: $req_after"
15032 [ $((req_after - req_before)) -ge 300 ] &&
15033 error "open/close requests are not freed"
15036 run_test 209 "read-only open/close requests should be freed promptly"
15040 size=$((size % 8192 + 1))
15041 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
15042 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
15043 rm -f $DIR/f212 $DIR/f212.xyz
15045 run_test 212 "Sendfile test ============================================"
15048 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
15049 cancel_lru_locks osc
15050 lctl set_param fail_loc=0x8000040f
15051 # generate a read lock
15052 cat $DIR/$tfile > /dev/null
15053 # write to the file, it will try to cancel the above read lock.
15054 cat /etc/hosts >> $DIR/$tfile
15056 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
15058 test_214() { # for bug 20133
15059 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
15060 for (( i=0; i < 340; i++ )) ; do
15061 touch $DIR/$tdir/d214c/a$i
15064 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
15065 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
15066 ls $DIR/d214c || error "ls $DIR/d214c failed"
15067 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
15068 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
15070 run_test 214 "hash-indexed directory test - bug 20133"
15072 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
15073 create_lnet_proc_files() {
15074 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
15077 # counterpart of create_lnet_proc_files
15078 remove_lnet_proc_files() {
15079 rm -f $TMP/lnet_$1.sys
15082 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15083 # 3rd arg as regexp for body
15084 check_lnet_proc_stats() {
15085 local l=$(cat "$TMP/lnet_$1" |wc -l)
15086 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
15088 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
15091 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15092 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
15093 # optional and can be regexp for 2nd line (lnet.routes case)
15094 check_lnet_proc_entry() {
15095 local blp=2 # blp stands for 'position of 1st line of body'
15096 [ -z "$5" ] || blp=3 # lnet.routes case
15098 local l=$(cat "$TMP/lnet_$1" |wc -l)
15099 # subtracting one from $blp because the body can be empty
15100 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
15102 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
15103 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
15105 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
15106 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
15108 # bail out if any unexpected line happened
15109 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
15110 [ "$?" != 0 ] || error "$2 misformatted"
15113 test_215() { # for bugs 18102, 21079, 21517
15114 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15116 local N='(0|[1-9][0-9]*)' # non-negative numeric
15117 local P='[1-9][0-9]*' # positive numeric
15118 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
15119 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
15120 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
15121 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
15123 local L1 # regexp for 1st line
15124 local L2 # regexp for 2nd line (optional)
15125 local BR # regexp for the rest (body)
15127 # lnet.stats should look as 11 space-separated non-negative numerics
15128 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
15129 create_lnet_proc_files "stats"
15130 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
15131 remove_lnet_proc_files "stats"
15133 # lnet.routes should look like this:
15134 # Routing disabled/enabled
15135 # net hops priority state router
15136 # where net is a string like tcp0, hops > 0, priority >= 0,
15137 # state is up/down,
15138 # router is a string like 192.168.1.1@tcp2
15139 L1="^Routing (disabled|enabled)$"
15140 L2="^net +hops +priority +state +router$"
15141 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
15142 create_lnet_proc_files "routes"
15143 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
15144 remove_lnet_proc_files "routes"
15146 # lnet.routers should look like this:
15147 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
15148 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
15149 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
15150 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
15151 L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
15152 BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
15153 create_lnet_proc_files "routers"
15154 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
15155 remove_lnet_proc_files "routers"
15157 # lnet.peers should look like this:
15158 # nid refs state last max rtr min tx min queue
15159 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
15160 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
15161 # numeric (0 or >0 or <0), queue >= 0.
15162 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
15163 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
15164 create_lnet_proc_files "peers"
15165 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
15166 remove_lnet_proc_files "peers"
15168 # lnet.buffers should look like this:
15169 # pages count credits min
15170 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
15171 L1="^pages +count +credits +min$"
15172 BR="^ +$N +$N +$I +$I$"
15173 create_lnet_proc_files "buffers"
15174 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
15175 remove_lnet_proc_files "buffers"
15177 # lnet.nis should look like this:
15178 # nid status alive refs peer rtr max tx min
15179 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
15180 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
15181 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
15182 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
15183 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
15184 create_lnet_proc_files "nis"
15185 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
15186 remove_lnet_proc_files "nis"
15188 # can we successfully write to lnet.stats?
15189 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
15191 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
15193 test_216() { # bug 20317
15194 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15195 remote_ost_nodsh && skip "remote OST with nodsh"
15198 local facets=$(get_facets OST)
15199 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15201 save_lustre_params client "osc.*.contention_seconds" > $p
15202 save_lustre_params $facets \
15203 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
15204 save_lustre_params $facets \
15205 "ldlm.namespaces.filter-*.contended_locks" >> $p
15206 save_lustre_params $facets \
15207 "ldlm.namespaces.filter-*.contention_seconds" >> $p
15208 clear_stats osc.*.osc_stats
15210 # agressive lockless i/o settings
15211 do_nodes $(comma_list $(osts_nodes)) \
15212 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
15213 ldlm.namespaces.filter-*.contended_locks=0 \
15214 ldlm.namespaces.filter-*.contention_seconds=60"
15215 lctl set_param -n osc.*.contention_seconds=60
15217 $DIRECTIO write $DIR/$tfile 0 10 4096
15218 $CHECKSTAT -s 40960 $DIR/$tfile
15220 # disable lockless i/o
15221 do_nodes $(comma_list $(osts_nodes)) \
15222 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
15223 ldlm.namespaces.filter-*.contended_locks=32 \
15224 ldlm.namespaces.filter-*.contention_seconds=0"
15225 lctl set_param -n osc.*.contention_seconds=0
15226 clear_stats osc.*.osc_stats
15228 dd if=/dev/zero of=$DIR/$tfile count=0
15229 $CHECKSTAT -s 0 $DIR/$tfile
15231 restore_lustre_params <$p
15235 run_test 216 "check lockless direct write updates file size and kms correctly"
15237 test_217() { # bug 22430
15238 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15243 for node in $(nodes_list); do
15244 nid=$(host_nids_address $node $NETTYPE)
15245 if [[ $nid = *-* ]] ; then
15246 echo "lctl ping $(h2nettype $nid)"
15247 lctl ping $(h2nettype $nid)
15249 echo "skipping $node (no hyphen detected)"
15253 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
15256 # do directio so as not to populate the page cache
15257 log "creating a 10 Mb file"
15258 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
15259 log "starting reads"
15260 dd if=$DIR/$tfile of=/dev/null bs=4096 &
15261 log "truncating the file"
15262 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
15264 kill %+ || true # reads might have finished
15265 echo "wait until dd is finished"
15267 log "removing the temporary file"
15268 rm -rf $DIR/$tfile || error "tmp file removal failed"
15270 run_test 218 "parallel read and truncate should not deadlock"
15273 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15275 # write one partial page
15276 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
15277 # set no grant so vvp_io_commit_write will do sync write
15278 $LCTL set_param fail_loc=0x411
15279 # write a full page at the end of file
15280 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
15282 $LCTL set_param fail_loc=0
15283 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
15284 $LCTL set_param fail_loc=0x411
15285 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
15288 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
15289 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
15291 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
15293 test_220() { #LU-325
15294 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15295 remote_ost_nodsh && skip "remote OST with nodsh"
15296 remote_mds_nodsh && skip "remote MDS with nodsh"
15297 remote_mgs_nodsh && skip "remote MGS with nodsh"
15301 # create on MDT0000 so the last_id and next_id are correct
15303 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
15307 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
15308 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
15309 osp.$mdtosc_proc1.prealloc_last_id)
15310 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15311 osp.$mdtosc_proc1.prealloc_next_id)
15315 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15316 #define OBD_FAIL_OST_ENOINO 0x229
15317 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15318 create_pool $FSNAME.$TESTNAME || return 1
15319 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15321 $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15323 MDSOBJS=$((last_id - next_id))
15324 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15326 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15327 echo "OST still has $count kbytes free"
15329 echo "create $MDSOBJS files @next_id..."
15330 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15332 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15333 osp.$mdtosc_proc1.prealloc_last_id)
15334 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15335 osp.$mdtosc_proc1.prealloc_next_id)
15337 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15342 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15343 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15345 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15346 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15347 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15348 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15349 echo "unlink $MDSOBJS files @$next_id..."
15350 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15352 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15355 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15357 dd if=`which date` of=$MOUNT/date oflag=sync
15358 chmod +x $MOUNT/date
15360 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15361 $LCTL set_param fail_loc=0x80001401
15363 $MOUNT/date > /dev/null
15366 run_test 221 "make sure fault and truncate race to not cause OOM"
15369 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15372 test_mkdir $DIR/$tdir
15373 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15374 createmany -o $DIR/$tdir/$tfile 10
15375 cancel_lru_locks mdc
15376 cancel_lru_locks osc
15377 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15378 $LCTL set_param fail_loc=0x31a
15379 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15380 $LCTL set_param fail_loc=0
15383 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15386 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15389 test_mkdir $DIR/$tdir
15390 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15391 createmany -o $DIR/$tdir/$tfile 10
15392 cancel_lru_locks mdc
15393 cancel_lru_locks osc
15394 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15395 $LCTL set_param fail_loc=0x31a
15396 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15397 $LCTL set_param fail_loc=0
15399 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15402 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15405 test_mkdir $DIR/$tdir
15406 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15407 createmany -o $DIR/$tdir/$tfile 10
15408 cancel_lru_locks mdc
15409 cancel_lru_locks osc
15410 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15411 $LCTL set_param fail_loc=0x31b
15412 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15413 $LCTL set_param fail_loc=0
15416 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15418 test_224a() { # LU-1039, MRP-303
15419 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15421 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15422 $LCTL set_param fail_loc=0x508
15423 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15424 $LCTL set_param fail_loc=0
15427 run_test 224a "Don't panic on bulk IO failure"
15429 test_224b() { # LU-1039, MRP-303
15430 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15432 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15433 cancel_lru_locks osc
15434 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15435 $LCTL set_param fail_loc=0x515
15436 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15437 $LCTL set_param fail_loc=0
15440 run_test 224b "Don't panic on bulk IO failure"
15442 test_224c() { # LU-6441
15443 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15444 remote_mds_nodsh && skip "remote MDS with nodsh"
15446 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15447 save_writethrough $p
15448 set_cache writethrough on
15450 local pages_per_rpc=$($LCTL get_param \
15451 osc.*.max_pages_per_rpc)
15452 local at_max=$($LCTL get_param -n at_max)
15453 local timeout=$($LCTL get_param -n timeout)
15454 local test_at="at_max"
15455 local param_at="$FSNAME.sys.at_max"
15456 local test_timeout="timeout"
15457 local param_timeout="$FSNAME.sys.timeout"
15459 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
15461 set_persistent_param_and_check client "$test_at" "$param_at" 0
15462 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
15464 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
15465 do_facet ost1 $LCTL set_param fail_loc=0x520
15466 $LFS setstripe -c 1 -i 0 $DIR/$tfile
15467 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
15469 do_facet ost1 $LCTL set_param fail_loc=0
15471 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
15472 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
15475 $LCTL set_param -n $pages_per_rpc
15476 restore_lustre_params < $p
15479 run_test 224c "Don't hang if one of md lost during large bulk RPC"
15481 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
15483 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15484 if [ -z ${MDSSURVEY} ]; then
15485 skip_env "mds-survey not found"
15487 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15488 skip "Need MDS version at least 2.2.51"
15490 local mds=$(facet_host $SINGLEMDS)
15491 local target=$(do_nodes $mds 'lctl dl' |
15492 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15494 local cmd1="file_count=1000 thrhi=4"
15495 local cmd2="dir_count=2 layer=mdd stripe_count=0"
15496 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15497 local cmd="$cmd1 $cmd2 $cmd3"
15499 rm -f ${TMP}/mds_survey*
15501 eval $cmd || error "mds-survey with zero-stripe failed"
15502 cat ${TMP}/mds_survey*
15503 rm -f ${TMP}/mds_survey*
15505 run_test 225a "Metadata survey sanity with zero-stripe"
15508 if [ -z ${MDSSURVEY} ]; then
15509 skip_env "mds-survey not found"
15511 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15512 skip "Need MDS version at least 2.2.51"
15513 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15514 remote_mds_nodsh && skip "remote MDS with nodsh"
15515 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
15516 skip_env "Need to mount OST to test"
15519 local mds=$(facet_host $SINGLEMDS)
15520 local target=$(do_nodes $mds 'lctl dl' |
15521 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15523 local cmd1="file_count=1000 thrhi=4"
15524 local cmd2="dir_count=2 layer=mdd stripe_count=1"
15525 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15526 local cmd="$cmd1 $cmd2 $cmd3"
15528 rm -f ${TMP}/mds_survey*
15530 eval $cmd || error "mds-survey with stripe_count failed"
15531 cat ${TMP}/mds_survey*
15532 rm -f ${TMP}/mds_survey*
15534 run_test 225b "Metadata survey sanity with stripe_count = 1"
15536 mcreate_path2fid () {
15542 local path=$DIR/$tdir/$name
15547 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
15548 error "cannot create $desc"
15550 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
15552 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
15554 fid_path=$($LFS fid2path $MOUNT $fid)
15556 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
15558 [ "$path" == "$fid_path" ] ||
15559 error "fid2path returned $fid_path, expected $path"
15561 echo "pass with $path and $fid"
15566 mkdir -p $DIR/$tdir
15568 mcreate_path2fid 0010666 0 0 fifo "FIFO"
15569 mcreate_path2fid 0020666 1 3 null "character special file (null)"
15570 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
15571 mcreate_path2fid 0040666 0 0 dir "directory"
15572 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
15573 mcreate_path2fid 0100666 0 0 file "regular file"
15574 mcreate_path2fid 0120666 0 0 link "symbolic link"
15575 mcreate_path2fid 0140666 0 0 sock "socket"
15577 run_test 226a "call path2fid and fid2path on files of all type"
15580 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15585 mkdir -p $DIR/$tdir
15586 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
15587 error "create remote directory failed"
15588 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
15589 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
15590 "character special file (null)"
15591 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
15592 "character special file (no device)"
15593 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
15594 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
15595 "block special file (loop)"
15596 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
15597 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
15598 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
15600 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
15602 # LU-1299 Executing or running ldd on a truncated executable does not
15603 # cause an out-of-memory condition.
15605 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15606 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
15608 dd if=$(which date) of=$MOUNT/date bs=1k count=1
15609 chmod +x $MOUNT/date
15611 $MOUNT/date > /dev/null
15612 ldd $MOUNT/date > /dev/null
15615 run_test 227 "running truncated executable does not cause OOM"
15617 # LU-1512 try to reuse idle OI blocks
15619 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15620 remote_mds_nodsh && skip "remote MDS with nodsh"
15621 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15623 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15624 local myDIR=$DIR/$tdir
15627 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15628 $LCTL set_param fail_loc=0x80001002
15629 createmany -o $myDIR/t- 10000
15630 $LCTL set_param fail_loc=0
15631 # The guard is current the largest FID holder
15633 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15635 local IDX=$(($SEQ % 64))
15637 do_facet $SINGLEMDS sync
15638 # Make sure journal flushed.
15640 local blk1=$(do_facet $SINGLEMDS \
15641 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15642 grep Blockcount | awk '{print $4}')
15644 # Remove old files, some OI blocks will become idle.
15645 unlinkmany $myDIR/t- 10000
15646 # Create new files, idle OI blocks should be reused.
15647 createmany -o $myDIR/t- 2000
15648 do_facet $SINGLEMDS sync
15649 # Make sure journal flushed.
15651 local blk2=$(do_facet $SINGLEMDS \
15652 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15653 grep Blockcount | awk '{print $4}')
15655 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15657 run_test 228a "try to reuse idle OI blocks"
15660 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15661 remote_mds_nodsh && skip "remote MDS with nodsh"
15662 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15664 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15665 local myDIR=$DIR/$tdir
15668 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15669 $LCTL set_param fail_loc=0x80001002
15670 createmany -o $myDIR/t- 10000
15671 $LCTL set_param fail_loc=0
15672 # The guard is current the largest FID holder
15674 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15676 local IDX=$(($SEQ % 64))
15678 do_facet $SINGLEMDS sync
15679 # Make sure journal flushed.
15681 local blk1=$(do_facet $SINGLEMDS \
15682 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15683 grep Blockcount | awk '{print $4}')
15685 # Remove old files, some OI blocks will become idle.
15686 unlinkmany $myDIR/t- 10000
15689 stop $SINGLEMDS || error "Fail to stop MDT."
15691 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
15693 df $MOUNT || error "Fail to df."
15694 # Create new files, idle OI blocks should be reused.
15695 createmany -o $myDIR/t- 2000
15696 do_facet $SINGLEMDS sync
15697 # Make sure journal flushed.
15699 local blk2=$(do_facet $SINGLEMDS \
15700 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15701 grep Blockcount | awk '{print $4}')
15703 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15705 run_test 228b "idle OI blocks can be reused after MDT restart"
15709 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15710 remote_mds_nodsh && skip "remote MDS with nodsh"
15711 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15713 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15714 local myDIR=$DIR/$tdir
15717 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15718 $LCTL set_param fail_loc=0x80001002
15719 # 20000 files can guarantee there are index nodes in the OI file
15720 createmany -o $myDIR/t- 20000
15721 $LCTL set_param fail_loc=0
15722 # The guard is current the largest FID holder
15724 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15726 local IDX=$(($SEQ % 64))
15728 do_facet $SINGLEMDS sync
15729 # Make sure journal flushed.
15731 local blk1=$(do_facet $SINGLEMDS \
15732 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15733 grep Blockcount | awk '{print $4}')
15735 # Remove old files, some OI blocks will become idle.
15736 unlinkmany $myDIR/t- 20000
15738 # The OI file should become empty now
15740 # Create new files, idle OI blocks should be reused.
15741 createmany -o $myDIR/t- 2000
15742 do_facet $SINGLEMDS sync
15743 # Make sure journal flushed.
15745 local blk2=$(do_facet $SINGLEMDS \
15746 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15747 grep Blockcount | awk '{print $4}')
15749 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15751 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
15753 test_229() { # LU-2482, LU-3448
15754 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15755 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
15756 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
15757 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
15761 # Create a file with a released layout and stripe count 2.
15762 $MULTIOP $DIR/$tfile H2c ||
15763 error "failed to create file with released layout"
15765 $GETSTRIPE -v $DIR/$tfile
15767 local pattern=$($GETSTRIPE -L $DIR/$tfile)
15768 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
15770 local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
15771 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
15772 stat $DIR/$tfile || error "failed to stat released file"
15774 chown $RUNAS_ID $DIR/$tfile ||
15775 error "chown $RUNAS_ID $DIR/$tfile failed"
15777 chgrp $RUNAS_ID $DIR/$tfile ||
15778 error "chgrp $RUNAS_ID $DIR/$tfile failed"
15780 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
15781 rm $DIR/$tfile || error "failed to remove released file"
15783 run_test 229 "getstripe/stat/rm/attr changes work on released files"
15786 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15787 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15788 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15789 skip "Need MDS version at least 2.11.52"
15793 test_mkdir $DIR/$tdir
15794 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
15795 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
15796 [ $mdt_idx -ne 0 ] &&
15797 error "create local directory on wrong MDT $mdt_idx"
15799 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
15800 error "create remote directory failed"
15801 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
15802 [ $mdt_idx -ne $MDTIDX ] &&
15803 error "create remote directory on wrong MDT $mdt_idx"
15805 createmany -o $DIR/$tdir/test_230/t- 10 ||
15806 error "create files on remote directory failed"
15807 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
15808 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
15809 rm -r $DIR/$tdir || error "unlink remote directory failed"
15811 run_test 230a "Create remote directory and files under the remote directory"
15814 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15815 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15816 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15817 skip "Need MDS version at least 2.11.52"
15825 local migrate_dir=$DIR/$tdir/migrate_dir
15826 local other_dir=$DIR/$tdir/other_dir
15828 test_mkdir $DIR/$tdir
15829 test_mkdir -i0 -c1 $migrate_dir
15830 test_mkdir -i0 -c1 $other_dir
15831 for ((i=0; i<10; i++)); do
15832 mkdir -p $migrate_dir/dir_${i}
15833 createmany -o $migrate_dir/dir_${i}/f 10 ||
15834 error "create files under remote dir failed $i"
15837 cp /etc/passwd $migrate_dir/$tfile
15838 cp /etc/passwd $other_dir/$tfile
15839 chattr +SAD $migrate_dir
15840 chattr +SAD $migrate_dir/$tfile
15842 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15843 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15844 local old_dir_mode=$(stat -c%f $migrate_dir)
15845 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
15847 mkdir -p $migrate_dir/dir_default_stripe2
15848 $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2
15849 $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2
15851 mkdir -p $other_dir
15852 ln $migrate_dir/$tfile $other_dir/luna
15853 ln $migrate_dir/$tfile $migrate_dir/sofia
15854 ln $other_dir/$tfile $migrate_dir/david
15855 ln -s $migrate_dir/$tfile $other_dir/zachary
15856 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
15857 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
15863 for len in 58 59 60; do
15864 lnktgt=$(str_repeat 'l' $len)
15865 touch $migrate_dir/$lnktgt
15866 ln -s $lnktgt $migrate_dir/${len}char_ln
15870 for len in 4094 4095; do
15871 lnktgt=$(str_repeat 'l' $len)
15872 ln -s $lnktgt $migrate_dir/${len}char_ln
15876 for len in 254 255; do
15877 touch $migrate_dir/$(str_repeat 'l' $len)
15880 $LFS migrate -m $MDTIDX $migrate_dir ||
15881 error "fails on migrating remote dir to MDT1"
15883 echo "migratate to MDT1, then checking.."
15884 for ((i = 0; i < 10; i++)); do
15885 for file in $(find $migrate_dir/dir_${i}); do
15886 mdt_index=$($LFS getstripe -m $file)
15887 # broken symlink getstripe will fail
15888 [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
15889 error "$file is not on MDT${MDTIDX}"
15893 # the multiple link file should still in MDT0
15894 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
15895 [ $mdt_index == 0 ] ||
15896 error "$file is not on MDT${MDTIDX}"
15898 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15899 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15900 error " expect $old_dir_flag get $new_dir_flag"
15902 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15903 [ "$old_file_flag" = "$new_file_flag" ] ||
15904 error " expect $old_file_flag get $new_file_flag"
15906 local new_dir_mode=$(stat -c%f $migrate_dir)
15907 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15908 error "expect mode $old_dir_mode get $new_dir_mode"
15910 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15911 [ "$old_file_mode" = "$new_file_mode" ] ||
15912 error "expect mode $old_file_mode get $new_file_mode"
15914 diff /etc/passwd $migrate_dir/$tfile ||
15915 error "$tfile different after migration"
15917 diff /etc/passwd $other_dir/luna ||
15918 error "luna different after migration"
15920 diff /etc/passwd $migrate_dir/sofia ||
15921 error "sofia different after migration"
15923 diff /etc/passwd $migrate_dir/david ||
15924 error "david different after migration"
15926 diff /etc/passwd $other_dir/zachary ||
15927 error "zachary different after migration"
15929 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15930 error "${tfile}_ln different after migration"
15932 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15933 error "${tfile}_ln_other different after migration"
15935 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
15936 [ $stripe_count = 2 ] ||
15937 error "dir strpe_count $d != 2 after migration."
15939 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
15940 [ $stripe_count = 2 ] ||
15941 error "file strpe_count $d != 2 after migration."
15943 #migrate back to MDT0
15946 $LFS migrate -m $MDTIDX $migrate_dir ||
15947 error "fails on migrating remote dir to MDT0"
15949 echo "migrate back to MDT0, checking.."
15950 for file in $(find $migrate_dir); do
15951 mdt_index=$($LFS getstripe -m $file)
15952 [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
15953 error "$file is not on MDT${MDTIDX}"
15956 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15957 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15958 error " expect $old_dir_flag get $new_dir_flag"
15960 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15961 [ "$old_file_flag" = "$new_file_flag" ] ||
15962 error " expect $old_file_flag get $new_file_flag"
15964 local new_dir_mode=$(stat -c%f $migrate_dir)
15965 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15966 error "expect mode $old_dir_mode get $new_dir_mode"
15968 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15969 [ "$old_file_mode" = "$new_file_mode" ] ||
15970 error "expect mode $old_file_mode get $new_file_mode"
15972 diff /etc/passwd ${migrate_dir}/$tfile ||
15973 error "$tfile different after migration"
15975 diff /etc/passwd ${other_dir}/luna ||
15976 error "luna different after migration"
15978 diff /etc/passwd ${migrate_dir}/sofia ||
15979 error "sofia different after migration"
15981 diff /etc/passwd ${other_dir}/zachary ||
15982 error "zachary different after migration"
15984 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15985 error "${tfile}_ln different after migration"
15987 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15988 error "${tfile}_ln_other different after migration"
15990 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
15991 [ $stripe_count = 2 ] ||
15992 error "dir strpe_count $d != 2 after migration."
15994 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
15995 [ $stripe_count = 2 ] ||
15996 error "file strpe_count $d != 2 after migration."
15998 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16000 run_test 230b "migrate directory"
16003 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16004 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16005 remote_mds_nodsh && skip "remote MDS with nodsh"
16006 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16007 skip "Need MDS version at least 2.11.52"
16013 local migrate_dir=$DIR/$tdir/migrate_dir
16015 #If migrating directory fails in the middle, all entries of
16016 #the directory is still accessiable.
16017 test_mkdir $DIR/$tdir
16018 test_mkdir -i0 -c1 $migrate_dir
16019 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
16021 createmany -o $migrate_dir/f $total ||
16022 error "create files under ${migrate_dir} failed"
16024 # fail after migrating top dir, and this will fail only once, so the
16025 # first sub file migration will fail (currently f3), others succeed.
16026 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
16027 do_facet mds1 lctl set_param fail_loc=0x1801
16028 local t=$(ls $migrate_dir | wc -l)
16029 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
16030 error "migrate should fail"
16031 local u=$(ls $migrate_dir | wc -l)
16032 [ "$u" == "$t" ] || error "$u != $t during migration"
16034 # add new dir/file should succeed
16035 mkdir $migrate_dir/dir ||
16036 error "mkdir failed under migrating directory"
16037 touch $migrate_dir/file ||
16038 error "create file failed under migrating directory"
16040 # add file with existing name should fail
16041 for file in $migrate_dir/f*; do
16042 stat $file > /dev/null || error "stat $file failed"
16043 $OPENFILE -f O_CREAT:O_EXCL $file &&
16044 error "open(O_CREAT|O_EXCL) $file should fail"
16045 $MULTIOP $file m && error "create $file should fail"
16046 touch $DIR/$tdir/remote_dir/$tfile ||
16047 error "touch $tfile failed"
16048 ln $DIR/$tdir/remote_dir/$tfile $file &&
16049 error "link $file should fail"
16050 mdt_index=$($LFS getstripe -m $file)
16051 if [ $mdt_index == 0 ]; then
16052 # file failed to migrate is not allowed to rename to
16053 mv $DIR/$tdir/remote_dir/$tfile $file &&
16054 error "rename to $file should fail"
16056 mv $DIR/$tdir/remote_dir/$tfile $file ||
16057 error "rename to $file failed"
16059 echo hello >> $file || error "write $file failed"
16062 # resume migration with different options should fail
16063 $LFS migrate -m 0 $migrate_dir &&
16064 error "migrate -m 0 $migrate_dir should fail"
16066 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
16067 error "migrate -c 2 $migrate_dir should fail"
16069 # resume migration should succeed
16070 $LFS migrate -m $MDTIDX $migrate_dir ||
16071 error "migrate $migrate_dir failed"
16073 echo "Finish migration, then checking.."
16074 for file in $(find $migrate_dir); do
16075 mdt_index=$($LFS getstripe -m $file)
16076 [ $mdt_index == $MDTIDX ] ||
16077 error "$file is not on MDT${MDTIDX}"
16080 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16082 run_test 230c "check directory accessiblity if migration failed"
16085 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16086 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16087 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16088 skip "Need MDS version at least 2.11.52"
16090 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
16092 local migrate_dir=$DIR/$tdir/migrate_dir
16102 old_index=$((RANDOM % MDSCOUNT))
16103 old_count=$((MDSCOUNT - old_index))
16104 new_index=$((RANDOM % MDSCOUNT))
16105 new_count=$((MDSCOUNT - new_index))
16106 new_hash="all_char"
16108 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
16109 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
16111 test_mkdir $DIR/$tdir
16112 test_mkdir -i $old_index -c $old_count $migrate_dir
16114 for ((i=0; i<100; i++)); do
16115 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
16116 createmany -o $migrate_dir/dir_${i}/f 100 ||
16117 error "create files under remote dir failed $i"
16120 echo -n "Migrate from MDT$old_index "
16121 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
16122 echo -n "to MDT$new_index"
16123 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
16126 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
16127 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
16128 error "migrate remote dir error"
16130 echo "Finish migration, then checking.."
16131 for file in $(find $migrate_dir); do
16132 mdt_index=$($LFS getstripe -m $file)
16133 if [ $mdt_index -lt $new_index ] ||
16134 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
16135 error "$file is on MDT$mdt_index"
16139 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16141 run_test 230d "check migrate big directory"
16144 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16145 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16146 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16147 skip "Need MDS version at least 2.11.52"
16154 mkdir -p $DIR/$tdir
16155 mkdir $DIR/$tdir/migrate_dir
16156 mkdir $DIR/$tdir/other_dir
16157 touch $DIR/$tdir/migrate_dir/a
16158 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
16159 ls $DIR/$tdir/other_dir
16161 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16162 error "migrate dir fails"
16164 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16165 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16167 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16168 [ $mdt_index == 0 ] || error "a is not on MDT0"
16170 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
16171 error "migrate dir fails"
16173 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
16174 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
16176 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16177 [ $mdt_index == 1 ] || error "a is not on MDT1"
16179 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
16180 [ $mdt_index == 1 ] || error "b is not on MDT1"
16182 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16183 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
16185 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
16187 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16189 run_test 230e "migrate mulitple local link files"
16192 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16193 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16194 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16195 skip "Need MDS version at least 2.11.52"
16200 mkdir -p $DIR/$tdir
16201 mkdir $DIR/$tdir/migrate_dir
16202 $LFS mkdir -i1 $DIR/$tdir/other_dir
16203 touch $DIR/$tdir/migrate_dir/a
16204 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
16205 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
16206 ls $DIR/$tdir/other_dir
16208 # a should be migrated to MDT1, since no other links on MDT0
16209 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16210 error "#1 migrate dir fails"
16211 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16212 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16213 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16214 [ $mdt_index == 1 ] || error "a is not on MDT1"
16216 # a should stay on MDT1, because it is a mulitple link file
16217 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16218 error "#2 migrate dir fails"
16219 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16220 [ $mdt_index == 1 ] || error "a is not on MDT1"
16222 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16223 error "#3 migrate dir fails"
16225 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16226 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
16227 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
16229 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
16230 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
16232 # a should be migrated to MDT0, since no other links on MDT1
16233 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16234 error "#4 migrate dir fails"
16235 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16236 [ $mdt_index == 0 ] || error "a is not on MDT0"
16238 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16240 run_test 230f "migrate mulitple remote link files"
16243 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16244 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16245 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16246 skip "Need MDS version at least 2.11.52"
16248 mkdir -p $DIR/$tdir/migrate_dir
16250 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
16251 error "migrating dir to non-exist MDT succeeds"
16254 run_test 230g "migrate dir to non-exist MDT"
16257 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16258 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16259 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16260 skip "Need MDS version at least 2.11.52"
16264 mkdir -p $DIR/$tdir/migrate_dir
16266 $LFS migrate -m1 $DIR &&
16267 error "migrating mountpoint1 should fail"
16269 $LFS migrate -m1 $DIR/$tdir/.. &&
16270 error "migrating mountpoint2 should fail"
16273 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
16274 error "migrating $tdir/migrate_dir/.. should fail"
16278 run_test 230h "migrate .. and root"
16281 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16282 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16283 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16284 skip "Need MDS version at least 2.11.52"
16286 mkdir -p $DIR/$tdir/migrate_dir
16288 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
16289 error "migration fails with a tailing slash"
16291 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
16292 error "migration fails with two tailing slashes"
16294 run_test 230i "lfs migrate -m tolerates trailing slashes"
16297 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16298 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16299 skip "Need MDS version at least 2.11.52"
16301 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
16302 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
16303 error "create $tfile failed"
16304 cat /etc/passwd > $DIR/$tdir/$tfile
16306 $LFS migrate -m 1 $DIR/$tdir
16308 cmp /etc/passwd $DIR/$tdir/$tfile ||
16309 error "DoM file mismatch after migration"
16311 run_test 230j "DoM file data not changed after dir migration"
16314 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
16315 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16316 skip "Need MDS version at least 2.11.56"
16319 local files_on_starting_mdt=0
16321 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
16322 $LFS getdirstripe $DIR/$tdir
16323 for i in $(seq $total); do
16324 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
16325 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16326 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16329 echo "$files_on_starting_mdt files on MDT0"
16331 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
16332 $LFS getdirstripe $DIR/$tdir
16334 files_on_starting_mdt=0
16335 for i in $(seq $total); do
16336 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16337 error "file $tfile.$i mismatch after migration"
16338 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16339 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16342 echo "$files_on_starting_mdt files on MDT1 after migration"
16343 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16345 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16346 $LFS getdirstripe $DIR/$tdir
16348 files_on_starting_mdt=0
16349 for i in $(seq $total); do
16350 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16351 error "file $tfile.$i mismatch after 2nd migration"
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 after 2nd migration"
16357 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16361 run_test 230k "file data not changed after dir migration"
16364 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16365 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16366 skip "Need MDS version at least 2.11.56"
16368 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16369 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16370 error "create files under remote dir failed $i"
16371 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16373 run_test 230l "readdir between MDTs won't crash"
16376 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16377 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16378 skip "Need MDS version at least 2.11.56"
16381 local mig_dir=$DIR/$tdir/migrate_dir
16382 local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16386 echo "Creating files and dirs with xattrs"
16387 test_mkdir $DIR/$tdir
16388 test_mkdir -i0 -c1 $mig_dir
16390 setfattr -n user.attr1 -v $longstr $mig_dir/dir ||
16391 error "cannot set xattr attr1 on dir"
16392 setfattr -n user.attr2 -v $shortstr $mig_dir/dir ||
16393 error "cannot set xattr attr2 on dir"
16394 touch $mig_dir/dir/f0
16395 setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 ||
16396 error "cannot set xattr attr1 on file"
16397 setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 ||
16398 error "cannot set xattr attr2 on file"
16399 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16400 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16401 [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir"
16402 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16403 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir"
16404 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16405 [ "$val" = $longstr ] || error "xattr attr1 not set properly on file"
16406 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16407 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file"
16409 echo "Migrating to MDT1"
16410 $LFS migrate -m $MDTIDX $mig_dir ||
16411 error "fails on migrating dir to MDT1"
16413 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16414 echo "Checking xattrs"
16415 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16416 [ "$val" = $longstr ] ||
16417 error "expecting xattr1 $longstr on dir, found $val"
16418 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16419 [ "$val" = $shortstr ] ||
16420 error "expecting xattr2 $shortstr on dir, found $val"
16421 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16422 [ "$val" = $longstr ] ||
16423 error "expecting xattr1 $longstr on file, found $val"
16424 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16425 [ "$val" = $shortstr ] ||
16426 error "expecting xattr2 $shortstr on file, found $val"
16428 run_test 230m "xattrs not changed after dir migration"
16432 # For simplicity this test assumes that max_pages_per_rpc
16433 # is the same across all OSCs
16434 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16435 local bulk_size=$((max_pages * PAGE_SIZE))
16436 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16439 mkdir -p $DIR/$tdir
16440 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16441 error "failed to set stripe with -S ${brw_size}M option"
16443 # clear the OSC stats
16444 $LCTL set_param osc.*.stats=0 &>/dev/null
16447 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16448 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16449 oflag=direct &>/dev/null || error "dd failed"
16451 sync; sleep 1; sync # just to be safe
16452 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16453 if [ x$nrpcs != "x1" ]; then
16454 $LCTL get_param osc.*.stats
16455 error "found $nrpcs ost_write RPCs, not 1 as expected"
16459 # Drop the OSC cache, otherwise we will read from it
16460 cancel_lru_locks osc
16462 # clear the OSC stats
16463 $LCTL set_param osc.*.stats=0 &>/dev/null
16465 # Client reads $bulk_size.
16466 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16467 iflag=direct &>/dev/null || error "dd failed"
16469 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16470 if [ x$nrpcs != "x1" ]; then
16471 $LCTL get_param osc.*.stats
16472 error "found $nrpcs ost_read RPCs, not 1 as expected"
16475 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16478 mkdir -p $DIR/$tdir
16480 for i in {0..1023}; do
16481 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16482 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16483 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16487 run_test 231b "must not assert on fully utilized OST request buffer"
16490 mkdir -p $DIR/$tdir
16491 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16493 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16494 do_facet ost1 $LCTL set_param fail_loc=0x31c
16496 # ignore dd failure
16497 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16499 do_facet ost1 $LCTL set_param fail_loc=0
16500 umount_client $MOUNT || error "umount failed"
16501 mount_client $MOUNT || error "mount failed"
16502 stop ost1 || error "cannot stop ost1"
16503 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16505 run_test 232a "failed lock should not block umount"
16508 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16509 skip "Need MDS version at least 2.10.58"
16511 mkdir -p $DIR/$tdir
16512 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16513 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16515 cancel_lru_locks osc
16517 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16518 do_facet ost1 $LCTL set_param fail_loc=0x31c
16521 $LFS data_version $DIR/$tdir/$tfile || true
16523 do_facet ost1 $LCTL set_param fail_loc=0
16524 umount_client $MOUNT || error "umount failed"
16525 mount_client $MOUNT || error "mount failed"
16526 stop ost1 || error "cannot stop ost1"
16527 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16529 run_test 232b "failed data version lock should not block umount"
16532 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
16533 skip "Need MDS version at least 2.3.64"
16534 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16536 local fid=$($LFS path2fid $MOUNT)
16538 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16539 error "cannot access $MOUNT using its FID '$fid'"
16541 run_test 233a "checking that OBF of the FS root succeeds"
16544 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
16545 skip "Need MDS version at least 2.5.90"
16546 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16548 local fid=$($LFS path2fid $MOUNT/.lustre)
16550 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16551 error "cannot access $MOUNT/.lustre using its FID '$fid'"
16553 fid=$($LFS path2fid $MOUNT/.lustre/fid)
16554 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16555 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
16557 run_test 233b "checking that OBF of the FS .lustre succeeds"
16560 local p="$TMP/sanityN-$TESTNAME.parameters"
16561 save_lustre_params client "llite.*.xattr_cache" > $p
16562 lctl set_param llite.*.xattr_cache 1 ||
16563 skip_env "xattr cache is not supported"
16565 mkdir -p $DIR/$tdir || error "mkdir failed"
16566 touch $DIR/$tdir/$tfile || error "touch failed"
16567 # OBD_FAIL_LLITE_XATTR_ENOMEM
16568 $LCTL set_param fail_loc=0x1405
16569 getfattr -n user.attr $DIR/$tdir/$tfile &&
16570 error "getfattr should have failed with ENOMEM"
16571 $LCTL set_param fail_loc=0x0
16574 restore_lustre_params < $p
16577 run_test 234 "xattr cache should not crash on ENOMEM"
16580 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
16581 skip "Need MDS version at least 2.4.52"
16583 flock_deadlock $DIR/$tfile
16588 124) error "process hangs on a deadlock"
16590 *) error "error executing flock_deadlock $DIR/$tfile"
16594 run_test 235 "LU-1715: flock deadlock detection does not work properly"
16598 check_swap_layouts_support
16600 local ref1=/etc/passwd
16601 local ref2=/etc/group
16602 local file1=$DIR/$tdir/f1
16603 local file2=$DIR/$tdir/f2
16605 test_mkdir -c1 $DIR/$tdir
16606 $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
16607 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
16608 $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
16609 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
16610 local fd=$(free_fd)
16611 local cmd="exec $fd<>$file2"
16614 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
16615 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
16618 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
16623 run_test 236 "Layout swap on open unlinked file"
16625 # LU-4659 linkea consistency
16627 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
16628 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
16629 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
16630 skip "Need MDS version at least 2.5.58 or 2.5.2+"
16633 ln $DIR/$tfile $DIR/$tfile.lnk
16634 touch $DIR/$tfile.new
16635 mv $DIR/$tfile.new $DIR/$tfile
16636 local fid1=$($LFS path2fid $DIR/$tfile)
16637 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
16638 local path1=$($LFS fid2path $FSNAME "$fid1")
16639 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
16640 local path2=$($LFS fid2path $FSNAME "$fid2")
16641 [ $tfile.lnk == $path2 ] ||
16642 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
16645 run_test 238 "Verify linkea consistency"
16647 test_239A() { # was test_239
16648 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
16649 skip "Need MDS version at least 2.5.60"
16651 local list=$(comma_list $(mdts_nodes))
16653 mkdir -p $DIR/$tdir
16654 createmany -o $DIR/$tdir/f- 5000
16655 unlinkmany $DIR/$tdir/f- 5000
16656 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
16657 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
16658 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
16659 osp.*MDT*.sync_in_flight" | calc_sum)
16660 [ "$changes" -eq 0 ] || error "$changes not synced"
16662 run_test 239A "osp_sync test"
16664 test_239a() { #LU-5297
16665 remote_mds_nodsh && skip "remote MDS with nodsh"
16668 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
16669 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
16670 chgrp $RUNAS_GID $DIR/$tfile
16671 wait_delete_completed
16673 run_test 239a "process invalid osp sync record correctly"
16675 test_239b() { #LU-5297
16676 remote_mds_nodsh && skip "remote MDS with nodsh"
16679 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
16680 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
16681 chgrp $RUNAS_GID $DIR/$tfile1
16682 wait_delete_completed
16683 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
16685 chgrp $RUNAS_GID $DIR/$tfile2
16686 wait_delete_completed
16688 run_test 239b "process osp sync record with ENOMEM error correctly"
16691 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16692 remote_mds_nodsh && skip "remote MDS with nodsh"
16694 mkdir -p $DIR/$tdir
16696 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
16697 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
16698 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
16699 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
16701 umount_client $MOUNT || error "umount failed"
16702 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
16703 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
16704 mount_client $MOUNT || error "failed to mount client"
16706 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
16707 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
16709 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
16715 for LOOP in $(seq $count); do
16716 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
16717 cancel_lru_locks $OSC || true
16725 for LOOP in $(seq $1); do
16726 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
16731 test_241a() { # was test_241
16732 local bsize=$PAGE_SIZE
16734 (( bsize < 40960 )) && bsize=40960
16735 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16737 cancel_lru_locks $OSC
16738 test_241_bio 1000 $bsize &
16740 test_241_dio 1000 $bsize
16743 run_test 241a "bio vs dio"
16746 local bsize=$PAGE_SIZE
16748 (( bsize < 40960 )) && bsize=40960
16749 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16751 test_241_dio 1000 $bsize &
16753 test_241_dio 1000 $bsize
16756 run_test 241b "dio vs dio"
16759 remote_mds_nodsh && skip "remote MDS with nodsh"
16761 mkdir -p $DIR/$tdir
16762 touch $DIR/$tdir/$tfile
16764 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
16765 do_facet mds1 lctl set_param fail_loc=0x105
16766 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
16768 do_facet mds1 lctl set_param fail_loc=0
16769 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
16771 run_test 242 "mdt_readpage failure should not cause directory unreadable"
16775 test_mkdir $DIR/$tdir
16776 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
16778 run_test 243 "various group lock tests"
16782 test_mkdir $DIR/$tdir
16783 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
16784 sendfile_grouplock $DIR/$tdir/$tfile || \
16785 error "sendfile+grouplock failed"
16788 run_test 244 "sendfile with group lock tests"
16791 local flagname="multi_mod_rpcs"
16792 local connect_data_name="max_mod_rpcs"
16795 # check if multiple modify RPCs flag is set
16796 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
16797 grep "connect_flags:")
16800 echo "$out" | grep -qw $flagname
16801 if [ $? -ne 0 ]; then
16802 echo "connect flag $flagname is not set"
16806 # check if multiple modify RPCs data is set
16807 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
16810 echo "$out" | grep -qw $connect_data_name ||
16811 error "import should have connect data $connect_data_name"
16813 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
16815 test_246() { # LU-7371
16816 remote_ost_nodsh && skip "remote OST with nodsh"
16817 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
16818 skip "Need OST version >= 2.7.62"
16820 do_facet ost1 $LCTL set_param fail_val=4095
16821 #define OBD_FAIL_OST_READ_SIZE 0x234
16822 do_facet ost1 $LCTL set_param fail_loc=0x234
16823 $LFS setstripe $DIR/$tfile -i 0 -c 1
16824 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
16825 cancel_lru_locks $FSNAME-OST0000
16826 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
16828 run_test 246 "Read file of size 4095 should return right length"
16834 umount_client $submount
16839 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16841 skip_env "Fileset feature is not supported"
16843 local submount=${MOUNT}_$tdir
16846 mkdir -p $submount || error "mkdir $submount failed"
16847 FILESET="$FILESET/$tdir" mount_client $submount ||
16848 error "mount $submount failed"
16849 trap "cleanup_247 $submount" EXIT
16850 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
16851 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
16852 error "read $MOUNT/$tdir/$tfile failed"
16853 cleanup_247 $submount
16855 run_test 247a "mount subdir as fileset"
16858 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16859 skip_env "Fileset feature is not supported"
16861 local submount=${MOUNT}_$tdir
16863 rm -rf $MOUNT/$tdir
16864 mkdir -p $submount || error "mkdir $submount failed"
16866 FILESET="$FILESET/$tdir" mount_client $submount &&
16867 error "mount $submount should fail"
16870 run_test 247b "mount subdir that dose not exist"
16873 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16874 skip_env "Fileset feature is not supported"
16876 local submount=${MOUNT}_$tdir
16878 mkdir -p $MOUNT/$tdir/dir1
16879 mkdir -p $submount || error "mkdir $submount failed"
16880 trap "cleanup_247 $submount" EXIT
16881 FILESET="$FILESET/$tdir" mount_client $submount ||
16882 error "mount $submount failed"
16883 local fid=$($LFS path2fid $MOUNT/)
16884 $LFS fid2path $submount $fid && error "fid2path should fail"
16885 cleanup_247 $submount
16887 run_test 247c "running fid2path outside root"
16890 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16891 skip "Fileset feature is not supported"
16893 local submount=${MOUNT}_$tdir
16895 mkdir -p $MOUNT/$tdir/dir1
16896 mkdir -p $submount || error "mkdir $submount failed"
16897 FILESET="$FILESET/$tdir" mount_client $submount ||
16898 error "mount $submount failed"
16899 trap "cleanup_247 $submount" EXIT
16900 local fid=$($LFS path2fid $submount/dir1)
16901 $LFS fid2path $submount $fid || error "fid2path should succeed"
16902 cleanup_247 $submount
16904 run_test 247d "running fid2path inside root"
16908 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16910 skip "Fileset feature is not supported"
16912 local submount=${MOUNT}_$tdir
16915 mkdir -p $submount || error "mkdir $submount failed"
16916 FILESET="$FILESET/.." mount_client $submount &&
16917 error "mount $submount should fail"
16920 run_test 247e "mount .. as fileset"
16923 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
16924 [ -z "$fast_read_sav" ] && skip "no fast read support"
16926 # create a large file for fast read verification
16927 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
16929 # make sure the file is created correctly
16930 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
16931 { rm -f $DIR/$tfile; skip "file creation error"; }
16933 echo "Test 1: verify that fast read is 4 times faster on cache read"
16935 # small read with fast read enabled
16936 $LCTL set_param -n llite.*.fast_read=1
16937 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16938 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16939 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16940 # small read with fast read disabled
16941 $LCTL set_param -n llite.*.fast_read=0
16942 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16943 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16944 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16946 # verify that fast read is 4 times faster for cache read
16947 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
16948 error_not_in_vm "fast read was not 4 times faster: " \
16949 "$t_fast vs $t_slow"
16951 echo "Test 2: verify the performance between big and small read"
16952 $LCTL set_param -n llite.*.fast_read=1
16954 # 1k non-cache read
16955 cancel_lru_locks osc
16956 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16957 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16958 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16960 # 1M non-cache read
16961 cancel_lru_locks osc
16962 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16963 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16964 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16966 # verify that big IO is not 4 times faster than small IO
16967 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
16968 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
16970 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
16973 run_test 248 "fast read verification"
16975 test_249() { # LU-7890
16976 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
16977 skip "Need at least version 2.8.54"
16980 $SETSTRIPE -c 1 $DIR/$tfile
16981 # Offset 2T == 4k * 512M
16982 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
16983 error "dd to 2T offset failed"
16985 run_test 249 "Write above 2T file size"
16988 [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
16989 && skip "no 16TB file size limit on ZFS"
16991 $SETSTRIPE -c 1 $DIR/$tfile
16992 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
16993 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
16994 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
16995 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
16996 conv=notrunc,fsync && error "append succeeded"
16999 run_test 250 "Write above 16T limit"
17002 $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile
17004 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
17005 #Skip once - writing the first stripe will succeed
17006 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17007 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
17008 error "short write happened"
17010 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17011 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
17012 error "short read happened"
17016 run_test 251 "Handling short read and write correctly"
17019 remote_mds_nodsh && skip "remote MDS with nodsh"
17020 remote_ost_nodsh && skip "remote OST with nodsh"
17021 if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then
17022 skip_env "ldiskfs only test"
17032 # check lr_reader on OST0000
17034 dev=$(facet_device $tgt)
17035 out=$(do_facet $tgt $LR_READER $dev)
17036 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17038 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
17039 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
17040 error "Invalid uuid returned by $LR_READER on target $tgt"
17041 echo -e "uuid returned by $LR_READER is '$uuid'\n"
17043 # check lr_reader -c on MDT0000
17045 dev=$(facet_device $tgt)
17046 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
17047 skip "$LR_READER does not support additional options"
17049 out=$(do_facet $tgt $LR_READER -c $dev)
17050 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17052 num=$(echo "$out" | grep -c "mdtlov")
17053 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
17054 error "Invalid number of mdtlov clients returned by $LR_READER"
17055 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
17057 # check lr_reader -cr on MDT0000
17058 out=$(do_facet $tgt $LR_READER -cr $dev)
17059 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17061 echo "$out" | grep -q "^reply_data:$" ||
17062 error "$LR_READER should have returned 'reply_data' section"
17063 num=$(echo "$out" | grep -c "client_generation")
17064 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
17066 run_test 252 "check lr_reader tool"
17068 test_253_fill_ost() {
17069 local size_mb #how many MB should we write to pass watermark
17070 local lwm=$3 #low watermark
17071 local free_10mb #10% of free space
17073 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17074 size_mb=$((free_kb / 1024 - lwm))
17075 free_10mb=$((free_kb / 10240))
17076 #If 10% of free space cross low watermark use it
17077 if (( free_10mb > size_mb )); then
17080 #At least we need to store 1.1 of difference between
17081 #free space and low watermark
17082 size_mb=$((size_mb + size_mb / 10))
17084 if (( lwm <= $((free_kb / 1024)) )) || [ ! -f $DIR/$tdir/1 ]; then
17085 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M count=$size_mb \
17086 oflag=append conv=notrunc
17091 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17092 echo "OST still has $((free_kb / 1024)) mbytes free"
17096 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17097 remote_mds_nodsh && skip "remote MDS with nodsh"
17098 remote_mgs_nodsh && skip "remote MGS with nodsh"
17103 local ost_name=$($LFS osts |
17104 sed -n 's/^'$ostidx': \(.*\)_UUID .*/\1/p')
17106 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
17107 do_facet $SINGLEMDS $LCTL get_param -n \
17108 osp.$mdtosc_proc1.reserved_mb_high ||
17109 skip "remote MDS does not support reserved_mb_high"
17113 wait_delete_completed
17116 local last_wm_h=$(do_facet $SINGLEMDS $LCTL get_param -n \
17117 osp.$mdtosc_proc1.reserved_mb_high)
17118 local last_wm_l=$(do_facet $SINGLEMDS $LCTL get_param -n \
17119 osp.$mdtosc_proc1.reserved_mb_low)
17120 echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l"
17122 create_pool $FSNAME.$TESTNAME || error "Pool creation failed"
17123 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name ||
17124 error "Adding $ost_name to pool failed"
17126 # Wait for client to see a OST at pool
17127 wait_update $HOSTNAME "$LCTL get_param -n
17128 lov.$FSNAME-*.pools.$TESTNAME | sort -u |
17129 grep $ost_name" "$ost_name""_UUID" $((TIMEOUT/2)) ||
17130 error "Client can not see the pool"
17131 $SETSTRIPE $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
17132 error "Setstripe failed"
17134 dd if=/dev/zero of=$DIR/$tdir/0 bs=1M count=10
17135 local blocks=$($LFS df $MOUNT | grep $ost_name | awk '{ print $4 }')
17136 echo "OST still has $((blocks/1024)) mbytes free"
17138 local new_lwm=$((blocks/1024-10))
17139 do_facet $SINGLEMDS $LCTL set_param \
17140 osp.$mdtosc_proc1.reserved_mb_high=$((new_lwm+5))
17141 do_facet $SINGLEMDS $LCTL set_param \
17142 osp.$mdtosc_proc1.reserved_mb_low=$new_lwm
17144 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17146 #First enospc could execute orphan deletion so repeat.
17147 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17149 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17150 osp.$mdtosc_proc1.prealloc_status)
17151 echo "prealloc_status $oa_status"
17153 dd if=/dev/zero of=$DIR/$tdir/2 bs=1M count=1 &&
17154 error "File creation should fail"
17155 #object allocation was stopped, but we still able to append files
17156 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M seek=6 count=5 oflag=append ||
17157 error "Append failed"
17158 rm -f $DIR/$tdir/1 $DIR/$tdir/0 $DIR/$tdir/r*
17160 wait_delete_completed
17164 for i in $(seq 10 12); do
17165 dd if=/dev/zero of=$DIR/$tdir/$i bs=1M count=1 2>/dev/null ||
17166 error "File creation failed after rm";
17169 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17170 osp.$mdtosc_proc1.prealloc_status)
17171 echo "prealloc_status $oa_status"
17173 if (( oa_status != 0 )); then
17174 error "Object allocation still disable after rm"
17176 do_facet $SINGLEMDS $LCTL set_param \
17177 osp.$mdtosc_proc1.reserved_mb_high=$last_wm_h
17178 do_facet $SINGLEMDS $LCTL set_param \
17179 osp.$mdtosc_proc1.reserved_mb_low=$last_wm_l
17182 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $ost_name ||
17183 error "Remove $ost_name from pool failed"
17184 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
17185 error "Pool destroy fialed"
17187 run_test 253 "Check object allocation limit"
17190 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17191 remote_mds_nodsh && skip "remote MDS with nodsh"
17192 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
17193 skip "MDS does not support changelog_size"
17196 local MDT0=$(facet_svc $SINGLEMDS)
17198 changelog_register || error "changelog_register failed"
17200 changelog_clear 0 || error "changelog_clear failed"
17202 local size1=$(do_facet $SINGLEMDS \
17203 $LCTL get_param -n mdd.$MDT0.changelog_size)
17204 echo "Changelog size $size1"
17207 $LFS mkdir -i 0 $DIR/$tdir
17209 mkdir -p $DIR/$tdir/pics/2008/zachy
17210 touch $DIR/$tdir/pics/2008/zachy/timestamp
17211 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
17212 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
17213 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
17214 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
17215 rm $DIR/$tdir/pics/desktop.jpg
17217 local size2=$(do_facet $SINGLEMDS \
17218 $LCTL get_param -n mdd.$MDT0.changelog_size)
17219 echo "Changelog size after work $size2"
17221 (( $size2 > $size1 )) ||
17222 error "new Changelog size=$size2 less than old size=$size1"
17224 run_test 254 "Check changelog size"
17231 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
17232 awk -F: '{print $2}' | grep $type > /dev/null
17233 if [ $? -ne 0 ]; then
17243 lfs ladvise -a willread $file > /dev/null 2>&1
17244 if [ $? -eq 0 ]; then
17248 lfs ladvise -a willread $file 2>&1 |
17249 grep "Inappropriate ioctl for device" > /dev/null
17250 if [ $? -eq 0 ]; then
17257 bc <<<"scale=2; ($1 - $2) * 100 / $2"
17260 # run a random read IO workload
17261 # usage: random_read_iops <filename> <filesize> <iosize>
17262 random_read_iops() {
17265 local iosize=${3:-4096}
17267 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
17268 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
17271 drop_file_oss_cache() {
17275 $LFS ladvise -a dontneed $file 2>/dev/null ||
17276 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
17279 ladvise_willread_performance()
17282 local average_origin=0
17283 local average_cache=0
17284 local average_ladvise=0
17286 for ((i = 1; i <= $repeat; i++)); do
17287 echo "Iter $i/$repeat: reading without willread hint"
17288 cancel_lru_locks osc
17289 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17290 local speed_origin=$(random_read_iops $DIR/$tfile $size)
17291 echo "Iter $i/$repeat: uncached speed: $speed_origin"
17292 average_origin=$(bc <<<"$average_origin + $speed_origin")
17294 cancel_lru_locks osc
17295 local speed_cache=$(random_read_iops $DIR/$tfile $size)
17296 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
17297 average_cache=$(bc <<<"$average_cache + $speed_cache")
17299 cancel_lru_locks osc
17300 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17301 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
17302 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
17303 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
17304 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
17306 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
17307 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
17308 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
17310 speedup_cache=$(percent $average_cache $average_origin)
17311 speedup_ladvise=$(percent $average_ladvise $average_origin)
17313 echo "Average uncached read: $average_origin"
17314 echo "Average speedup with OSS cached read: " \
17315 "$average_cache = +$speedup_cache%"
17316 echo "Average speedup with ladvise willread: " \
17317 "$average_ladvise = +$speedup_ladvise%"
17319 local lowest_speedup=20
17320 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
17321 echo "Speedup with OSS cached read less than $lowest_speedup%," \
17322 "got $average_cache%. Skipping ladvise willread check."
17326 # the test won't work on ZFS until it supports 'ladvise dontneed', but
17327 # it is still good to run until then to exercise 'ladvise willread'
17328 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17329 [ "$ost1_FSTYPE" = "zfs" ] &&
17330 echo "osd-zfs does not support dontneed or drop_caches" &&
17333 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
17334 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
17335 error_not_in_vm "Speedup with willread is less than " \
17336 "$lowest_speedup%, got $average_ladvise%"
17340 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17341 skip "lustre < 2.8.54 does not support ladvise "
17342 remote_ost_nodsh && skip "remote OST with nodsh"
17344 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
17346 ladvise_no_type willread $DIR/$tfile &&
17347 skip "willread ladvise is not supported"
17349 ladvise_no_ioctl $DIR/$tfile &&
17350 skip "ladvise ioctl is not supported"
17353 local size=$((size_mb * 1048576))
17354 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17355 error "dd to $DIR/$tfile failed"
17357 lfs ladvise -a willread $DIR/$tfile ||
17358 error "Ladvise failed with no range argument"
17360 lfs ladvise -a willread -s 0 $DIR/$tfile ||
17361 error "Ladvise failed with no -l or -e argument"
17363 lfs ladvise -a willread -e 1 $DIR/$tfile ||
17364 error "Ladvise failed with only -e argument"
17366 lfs ladvise -a willread -l 1 $DIR/$tfile ||
17367 error "Ladvise failed with only -l argument"
17369 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
17370 error "End offset should not be smaller than start offset"
17372 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
17373 error "End offset should not be equal to start offset"
17375 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
17376 error "Ladvise failed with overflowing -s argument"
17378 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
17379 error "Ladvise failed with overflowing -e argument"
17381 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
17382 error "Ladvise failed with overflowing -l argument"
17384 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
17385 error "Ladvise succeeded with conflicting -l and -e arguments"
17387 echo "Synchronous ladvise should wait"
17389 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17390 do_nodes $(comma_list $(osts_nodes)) \
17391 $LCTL set_param fail_val=$delay fail_loc=0x237
17393 local start_ts=$SECONDS
17394 lfs ladvise -a willread $DIR/$tfile ||
17395 error "Ladvise failed with no range argument"
17396 local end_ts=$SECONDS
17397 local inteval_ts=$((end_ts - start_ts))
17399 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17400 error "Synchronous advice didn't wait reply"
17403 echo "Asynchronous ladvise shouldn't wait"
17404 local start_ts=$SECONDS
17405 lfs ladvise -a willread -b $DIR/$tfile ||
17406 error "Ladvise failed with no range argument"
17407 local end_ts=$SECONDS
17408 local inteval_ts=$((end_ts - start_ts))
17410 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17411 error "Asynchronous advice blocked"
17414 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17415 ladvise_willread_performance
17417 run_test 255a "check 'lfs ladvise -a willread'"
17423 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17427 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17428 skip "lustre < 2.8.54 does not support ladvise "
17429 remote_ost_nodsh && skip "remote OST with nodsh"
17431 lfs setstripe -c 1 -i 0 $DIR/$tfile
17433 ladvise_no_type dontneed $DIR/$tfile &&
17434 skip "dontneed ladvise is not supported"
17436 ladvise_no_ioctl $DIR/$tfile &&
17437 skip "ladvise ioctl is not supported"
17439 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17440 [ "$ost1_FSTYPE" = "zfs" ] &&
17441 skip "zfs-osd does not support 'ladvise dontneed'"
17444 local size=$((size_mb * 1048576))
17445 # In order to prevent disturbance of other processes, only check 3/4
17446 # of the memory usage
17447 local kibibytes=$((size_mb * 1024 * 3 / 4))
17449 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17450 error "dd to $DIR/$tfile failed"
17452 #force write to complete before dropping OST cache & checking memory
17455 local total=$(facet_meminfo ost1 MemTotal)
17456 echo "Total memory: $total KiB"
17458 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17459 local before_read=$(facet_meminfo ost1 Cached)
17460 echo "Cache used before read: $before_read KiB"
17462 lfs ladvise -a willread $DIR/$tfile ||
17463 error "Ladvise willread failed"
17464 local after_read=$(facet_meminfo ost1 Cached)
17465 echo "Cache used after read: $after_read KiB"
17467 lfs ladvise -a dontneed $DIR/$tfile ||
17468 error "Ladvise dontneed again failed"
17469 local no_read=$(facet_meminfo ost1 Cached)
17470 echo "Cache used after dontneed ladvise: $no_read KiB"
17472 if [ $total -lt $((before_read + kibibytes)) ]; then
17473 echo "Memory is too small, abort checking"
17477 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17478 error "Ladvise willread should use more memory" \
17479 "than $kibibytes KiB"
17482 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17483 error "Ladvise dontneed should release more memory" \
17484 "than $kibibytes KiB"
17487 run_test 255b "check 'lfs ladvise -a dontneed'"
17490 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17491 skip "lustre < 2.10.50 does not support lockahead"
17499 test_mkdir -p $DIR/$tdir
17500 $SETSTRIPE -i 0 $DIR/$tdir
17502 #test 10 returns only success/failure
17504 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17506 if [ $rc -eq 255 ]; then
17507 error "Ladvise test${i} failed, ${rc}"
17510 #test 11 counts lock enqueue requests, all others count new locks
17512 count=$(do_facet ost1 \
17513 $LCTL get_param -n ost.OSS.ost.stats)
17514 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17516 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17518 if [ $rc -eq 255 ]; then
17519 error "Ladvise test${i} failed, ${rc}"
17522 new_count=$(do_facet ost1 \
17523 $LCTL get_param -n ost.OSS.ost.stats)
17524 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17525 awk '{ print $2 }')
17527 difference="$((new_count - count))"
17528 if [ $difference -ne $rc ]; then
17529 error "Ladvise test${i}, bad enqueue count, returned " \
17530 "${rc}, actual ${difference}"
17533 for i in $(seq 12 21); do
17534 # If we do not do this, we run the risk of having too many
17535 # locks and starting lock cancellation while we are checking
17537 cancel_lru_locks osc
17539 count=$($LCTL get_param -n \
17540 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17542 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17544 if [ $rc -eq 255 ]; then
17545 error "Ladvise test ${i} failed, ${rc}"
17548 new_count=$($LCTL get_param -n \
17549 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17550 difference="$((new_count - count))"
17552 # Test 15 output is divided by 100 to map down to valid return
17553 if [ $i -eq 15 ]; then
17557 if [ $difference -ne $rc ]; then
17558 error "Ladvise test ${i}, bad lock count, returned " \
17559 "${rc}, actual ${difference}"
17563 #test 22 returns only success/failure
17565 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17567 if [ $rc -eq 255 ]; then
17568 error "Ladvise test${i} failed, ${rc}"
17571 run_test 255c "suite of ladvise lockahead tests"
17574 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17575 remote_mds_nodsh && skip "remote MDS with nodsh"
17576 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17577 changelog_users $SINGLEMDS | grep "^cl" &&
17578 skip "active changelog user"
17584 mdt_dev=$(mdsdevname 1)
17587 changelog_register || error "changelog_register failed"
17590 mkdir -p $DIR/$tdir
17592 changelog_clear 0 || error "changelog_clear failed"
17595 touch $DIR/$tdir/{1..10}
17598 stop $SINGLEMDS || error "Fail to stop MDT"
17602 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
17604 #after mount new plainllog is used
17605 touch $DIR/$tdir/{11..19}
17606 local tmpfile=$(mktemp -u $tfile.XXXXXX)
17607 cat_sl=$(do_facet $SINGLEMDS "sync; \
17608 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17609 llog_reader $tmpfile | grep -c type=1064553b")
17610 do_facet $SINGLEMDS llog_reader $tmpfile
17612 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
17614 changelog_clear 0 || error "changelog_clear failed"
17616 cat_sl=$(do_facet $SINGLEMDS "sync; \
17617 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17618 llog_reader $tmpfile | grep -c type=1064553b; rm -f $tmpfile")
17620 if (( cat_sl == 2 )); then
17621 error "Empty plain llog was not deleted from changelog catalog"
17622 elif (( cat_sl != 1 )); then
17623 error "Active plain llog shouldn't be deleted from catalog"
17626 run_test 256 "Check llog delete for empty and not full state"
17629 remote_mds_nodsh && skip "remote MDS with nodsh"
17630 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
17631 skip "Need MDS version at least 2.8.55"
17633 test_mkdir $DIR/$tdir
17635 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
17636 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
17639 #define OBD_FAIL_MDS_XATTR_REP 0x161
17640 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17641 local facet=mds$((mdtidx + 1))
17642 set_nodes_failloc $(facet_active_host $facet) 0x80000161
17643 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
17645 stop $facet || error "stop MDS failed"
17646 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
17647 error "start MDS fail"
17649 run_test 257 "xattr locks are not lost"
17651 # Verify we take the i_mutex when security requires it
17653 #define OBD_FAIL_IMUTEX_SEC 0x141c
17654 $LCTL set_param fail_loc=0x141c
17656 chmod u+s $DIR/$tfile
17657 chmod a+rwx $DIR/$tfile
17658 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17660 if [ $RC -ne 0 ]; then
17661 error "error, failed to take i_mutex, rc=$?"
17665 run_test 258a "verify i_mutex security behavior when suid attributes is set"
17667 # Verify we do NOT take the i_mutex in the normal case
17669 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
17670 $LCTL set_param fail_loc=0x141d
17673 chmod a+rw $DIR/$tfile
17674 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17676 if [ $RC -ne 0 ]; then
17677 error "error, took i_mutex unnecessarily, rc=$?"
17682 run_test 258b "verify i_mutex security behavior"
17685 local file=$DIR/$tfile
17689 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17691 stack_trap "rm -f $file" EXIT
17693 wait_delete_completed
17694 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17695 echo "before: $before"
17697 $LFS setstripe -i 0 -c 1 $file
17698 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
17700 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17701 echo "after write: $after"
17703 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
17704 do_facet ost1 $LCTL set_param fail_loc=0x2301
17706 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17707 echo "after truncate: $after"
17710 do_facet ost1 $LCTL set_param fail_loc=0
17711 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17713 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17714 echo "after restart: $after"
17715 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
17716 error "missing truncate?"
17720 run_test 259 "crash at delayed truncate"
17723 #define OBD_FAIL_MDC_CLOSE 0x806
17724 $LCTL set_param fail_loc=0x80000806
17728 run_test 260 "Check mdc_close fail"
17730 ### Data-on-MDT sanity tests ###
17732 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17733 skip "Need MDS version at least 2.10.55 for DoM"
17736 local dom=$DIR/$tdir/dom_file
17737 local tmp=$DIR/$tdir/tmp_file
17739 mkdir -p $DIR/$tdir
17741 # basic checks for DoM component creation
17742 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
17743 error "Can set MDT layout to non-first entry"
17745 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
17746 error "Can define multiple entries as MDT layout"
17748 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
17750 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
17751 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
17752 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
17754 local mdtidx=$($LFS getstripe -m $dom)
17755 local mdtname=MDT$(printf %04x $mdtidx)
17756 local facet=mds$((mdtidx + 1))
17757 local space_check=1
17759 # Skip free space checks with ZFS
17760 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
17764 local size_tmp=$((65536 * 3))
17765 local mdtfree1=$(do_facet $facet \
17766 lctl get_param -n osd*.*$mdtname.kbytesfree)
17768 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17769 # check also direct IO along write
17770 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
17771 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17773 cmp $tmp $dom || error "file data is different"
17774 [ $(stat -c%s $dom) == $size_tmp ] ||
17775 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17776 if [ $space_check == 1 ]; then
17777 local mdtfree2=$(do_facet $facet \
17778 lctl get_param -n osd*.*$mdtname.kbytesfree)
17780 # increase in usage from by $size_tmp
17781 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17782 error "MDT free space wrong after write: " \
17783 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17787 local size_dom=10000
17789 $TRUNCATE $dom $size_dom
17790 [ $(stat -c%s $dom) == $size_dom ] ||
17791 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
17792 if [ $space_check == 1 ]; then
17793 mdtfree1=$(do_facet $facet \
17794 lctl get_param -n osd*.*$mdtname.kbytesfree)
17795 # decrease in usage from $size_tmp to new $size_dom
17796 [ $(($mdtfree1 - $mdtfree2)) -ge \
17797 $(((size_tmp - size_dom) / 1024)) ] ||
17798 error "MDT free space is wrong after truncate: " \
17799 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
17805 size_dom=$((size_dom + size_tmp))
17806 [ $(stat -c%s $dom) == $size_dom ] ||
17807 error "bad size after append: $(stat -c%s $dom) != $size_dom"
17808 if [ $space_check == 1 ]; then
17809 mdtfree2=$(do_facet $facet \
17810 lctl get_param -n osd*.*$mdtname.kbytesfree)
17811 # increase in usage by $size_tmp from previous
17812 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17813 error "MDT free space is wrong after append: " \
17814 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17819 if [ $space_check == 1 ]; then
17820 mdtfree1=$(do_facet $facet \
17821 lctl get_param -n osd*.*$mdtname.kbytesfree)
17822 # decrease in usage by $size_dom from previous
17823 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
17824 error "MDT free space is wrong after removal: " \
17825 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
17828 # combined striping
17829 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
17830 error "Can't create DoM + OST striping"
17832 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
17833 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17834 # check also direct IO along write
17835 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17837 cmp $tmp $dom || error "file data is different"
17838 [ $(stat -c%s $dom) == $size_tmp ] ||
17839 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17844 run_test 270a "DoM: basic functionality tests"
17847 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17848 skip "Need MDS version at least 2.10.55"
17850 local dom=$DIR/$tdir/dom_file
17851 local max_size=1048576
17853 mkdir -p $DIR/$tdir
17854 $LFS setstripe -E $max_size -L mdt $dom
17856 # truncate over the limit
17857 $TRUNCATE $dom $(($max_size + 1)) &&
17858 error "successful truncate over the maximum size"
17859 # write over the limit
17860 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
17861 error "successful write over the maximum size"
17862 # append over the limit
17863 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
17864 echo "12345" >> $dom && error "successful append over the maximum size"
17869 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
17872 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17873 skip "Need MDS version at least 2.10.55"
17875 mkdir -p $DIR/$tdir
17876 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17878 # check files inherit DoM EA
17879 touch $DIR/$tdir/first
17880 [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] ||
17881 error "bad pattern"
17882 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
17883 error "bad stripe count"
17884 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
17885 error "bad stripe size"
17887 # check directory inherits DoM EA and uses it as default
17888 mkdir $DIR/$tdir/subdir
17889 touch $DIR/$tdir/subdir/second
17890 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
17891 error "bad pattern in sub-directory"
17892 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
17893 error "bad stripe count in sub-directory"
17894 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
17895 error "bad stripe size in sub-directory"
17898 run_test 270c "DoM: DoM EA inheritance tests"
17901 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17902 skip "Need MDS version at least 2.10.55"
17904 mkdir -p $DIR/$tdir
17905 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17907 # inherit default DoM striping
17908 mkdir $DIR/$tdir/subdir
17909 touch $DIR/$tdir/subdir/f1
17911 # change default directory striping
17912 $LFS setstripe -c 1 $DIR/$tdir/subdir
17913 touch $DIR/$tdir/subdir/f2
17914 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
17915 error "wrong default striping in file 2"
17916 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
17917 error "bad pattern in file 2"
17920 run_test 270d "DoM: change striping from DoM to RAID0"
17923 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17924 skip "Need MDS version at least 2.10.55"
17926 mkdir -p $DIR/$tdir/dom
17927 mkdir -p $DIR/$tdir/norm
17930 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
17931 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
17933 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
17934 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
17936 # find DoM files by layout
17937 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
17938 [ $NUM -eq $DOMFILES ] ||
17939 error "lfs find -L: found $NUM, expected $DOMFILES"
17940 echo "Test 1: lfs find 20 DOM files by layout: OK"
17942 # there should be 1 dir with default DOM striping
17943 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
17945 error "lfs find -L: found $NUM, expected 1 dir"
17946 echo "Test 2: lfs find 1 DOM dir by layout: OK"
17948 # find DoM files by stripe size
17949 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
17950 [ $NUM -eq $DOMFILES ] ||
17951 error "lfs find -S: found $NUM, expected $DOMFILES"
17952 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
17954 # find files by stripe offset except DoM files
17955 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
17956 [ $NUM -eq $NORMFILES ] ||
17957 error "lfs find -i: found $NUM, expected $NORMFILES"
17958 echo "Test 5: lfs find no DOM files by stripe index: OK"
17961 run_test 270e "DoM: lfs find with DoM files test"
17964 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17965 skip "Need MDS version at least 2.10.55"
17967 local mdtname=${FSNAME}-MDT0000-mdtlov
17968 local dom=$DIR/$tdir/dom_file
17969 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
17970 lod.$mdtname.dom_stripesize)
17971 local dom_limit=131072
17973 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
17974 local dom_current=$(do_facet mds1 $LCTL get_param -n \
17975 lod.$mdtname.dom_stripesize)
17976 [ ${dom_limit} -eq ${dom_current} ] ||
17977 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
17979 $LFS mkdir -i 0 -c 1 $DIR/$tdir
17980 $LFS setstripe -d $DIR/$tdir
17981 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
17982 error "Can't set directory default striping"
17984 # exceed maximum stripe size
17985 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
17986 error "Can't create file with $((dom_limit * 2)) DoM stripe"
17987 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
17988 error "Able to create DoM component size more than LOD limit"
17990 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
17991 dom_current=$(do_facet mds1 $LCTL get_param -n \
17992 lod.$mdtname.dom_stripesize)
17993 [ 0 -eq ${dom_current} ] ||
17994 error "Can't set zero DoM stripe limit"
17997 # attempt to create DoM file on server with disabled DoM should
17998 # remove DoM entry from layout and be succeed
17999 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
18000 error "Can't create DoM file (DoM is disabled)"
18001 [ $($LFS getstripe -L $dom) == "mdt" ] &&
18002 error "File has DoM component while DoM is disabled"
18005 # attempt to create DoM file with only DoM stripe should return error
18006 $LFS setstripe -E $dom_limit -L mdt $dom &&
18007 error "Able to create DoM-only file while DoM is disabled"
18009 # too low values to be aligned with smallest stripe size 64K
18010 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
18011 dom_current=$(do_facet mds1 $LCTL get_param -n \
18012 lod.$mdtname.dom_stripesize)
18013 [ 30000 -eq ${dom_current} ] &&
18014 error "Can set too small DoM stripe limit"
18016 # 64K is a minimal stripe size in Lustre, expect limit of that size
18017 [ 65536 -eq ${dom_current} ] ||
18018 error "Limit is not set to 64K but ${dom_current}"
18020 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
18021 dom_current=$(do_facet mds1 $LCTL get_param -n \
18022 lod.$mdtname.dom_stripesize)
18024 [ 2147483648 -eq ${dom_current} ] &&
18025 error "Can set too large DoM stripe limit"
18027 do_facet mds1 $LCTL set_param -n \
18028 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
18029 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18030 error "Can't create DoM component size after limit change"
18031 do_facet mds1 $LCTL set_param -n \
18032 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
18033 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
18034 error "Can't create DoM file after limit decrease"
18035 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
18036 error "Can create big DoM component after limit decrease"
18037 touch ${dom}_def ||
18038 error "Can't create file with old default layout"
18040 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
18043 run_test 270f "DoM: maximum DoM stripe size checks"
18046 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18047 skip "Need MDS version at least 2.10.55"
18049 local dom=$DIR/$tdir/dom
18051 mkdir -p $DIR/$tdir
18053 $LFS setstripe -E 1024K -L mdt $dom
18055 lctl set_param -n mdc.*.stats=clear
18056 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18057 cat $dom > /dev/null
18058 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
18059 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
18063 run_test 271a "DoM: data is cached for read after write"
18066 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18067 skip "Need MDS version at least 2.10.55"
18069 local dom=$DIR/$tdir/dom
18071 mkdir -p $DIR/$tdir
18073 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18075 lctl set_param -n mdc.*.stats=clear
18076 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18077 cancel_lru_locks mdc
18078 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
18079 # second stat to check size is cached on client
18080 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
18081 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18082 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
18085 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
18088 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18089 skip "Need MDS version at least 2.10.55"
18091 local dom=$DIR/$tdir/dom
18093 mkdir -p $DIR/$tdir
18095 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18097 lctl set_param -n mdc.*.stats=clear
18098 lctl set_param -n osc.*.stats=clear
18099 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
18100 cancel_lru_locks mdc
18101 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18102 # second stat to check size is cached on client
18103 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18104 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18105 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
18106 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
18107 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
18110 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
18116 local mdt=MDT$(printf %04x $mdtidx)
18118 if [ -z $param ]; then
18119 lctl get_param -n mdc.*$mdt*.stats
18121 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
18126 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18127 skip "Need MDS version at least 2.10.55"
18129 local dom=$DIR/$tdir/dom
18131 mkdir -p $DIR/$tdir
18133 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18135 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18136 local facet=mds$((mdtidx + 1))
18138 cancel_lru_locks mdc
18139 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
18140 createmany -o $dom 1000
18141 lctl set_param -n mdc.*.stats=clear
18142 smalliomany -w $dom 1000 200
18143 get_mdc_stats $mdtidx
18144 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18145 # Each file has 1 open, 1 IO enqueues, total 2000
18146 # but now we have also +1 getxattr for security.capability, total 3000
18147 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
18148 unlinkmany $dom 1000
18150 cancel_lru_locks mdc
18151 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
18152 createmany -o $dom 1000
18153 lctl set_param -n mdc.*.stats=clear
18154 smalliomany -w $dom 1000 200
18155 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18156 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
18157 # for OPEN and IO lock.
18158 [ $((enq - enq_2)) -ge 1000 ] ||
18159 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
18160 unlinkmany $dom 1000
18163 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
18165 cleanup_271def_tests() {
18171 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18172 skip "Need MDS version at least 2.10.57"
18174 local dom=$DIR/$tdir/dom
18175 local tmp=$TMP/$tfile
18176 trap "cleanup_271def_tests $tmp" EXIT
18178 mkdir -p $DIR/$tdir
18180 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18182 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18184 cancel_lru_locks mdc
18185 dd if=/dev/urandom of=$tmp bs=1000 count=1
18186 dd if=$tmp of=$dom bs=1000 count=1
18187 cancel_lru_locks mdc
18189 cat /etc/hosts >> $tmp
18190 lctl set_param -n mdc.*.stats=clear
18192 # append data to the same file it should update local page
18193 echo "Append to the same page"
18194 cat /etc/hosts >> $dom
18195 local num=$(get_mdc_stats $mdtidx ost_read)
18196 local ra=$(get_mdc_stats $mdtidx req_active)
18197 local rw=$(get_mdc_stats $mdtidx req_waittime)
18199 [ -z $num ] || error "$num READ RPC occured"
18200 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18204 cmp $tmp $dom || error "file miscompare"
18206 cancel_lru_locks mdc
18207 lctl set_param -n mdc.*.stats=clear
18209 echo "Open and read file"
18210 cat $dom > /dev/null
18211 local num=$(get_mdc_stats $mdtidx ost_read)
18212 local ra=$(get_mdc_stats $mdtidx req_active)
18213 local rw=$(get_mdc_stats $mdtidx req_waittime)
18215 [ -z $num ] || error "$num READ RPC occured"
18216 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18220 cmp $tmp $dom || error "file miscompare"
18224 run_test 271d "DoM: read on open (1K file in reply buffer)"
18227 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18228 skip "Need MDS version at least 2.10.57"
18230 local dom=$DIR/$tdir/dom
18231 local tmp=$TMP/$tfile
18232 trap "cleanup_271def_tests $tmp" EXIT
18234 mkdir -p $DIR/$tdir
18236 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18238 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18240 cancel_lru_locks mdc
18241 dd if=/dev/urandom of=$tmp bs=200000 count=1
18242 dd if=$tmp of=$dom bs=200000 count=1
18243 cancel_lru_locks mdc
18244 cat /etc/hosts >> $tmp
18245 lctl set_param -n mdc.*.stats=clear
18247 echo "Append to the same page"
18248 cat /etc/hosts >> $dom
18249 local num=$(get_mdc_stats $mdtidx ost_read)
18250 local ra=$(get_mdc_stats $mdtidx req_active)
18251 local rw=$(get_mdc_stats $mdtidx req_waittime)
18253 [ -z $num ] || error "$num READ RPC occured"
18254 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18258 cmp $tmp $dom || error "file miscompare"
18260 cancel_lru_locks mdc
18261 lctl set_param -n mdc.*.stats=clear
18263 echo "Open and read file"
18264 cat $dom > /dev/null
18265 local num=$(get_mdc_stats $mdtidx ost_read)
18266 local ra=$(get_mdc_stats $mdtidx req_active)
18267 local rw=$(get_mdc_stats $mdtidx req_waittime)
18269 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
18270 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18274 cmp $tmp $dom || error "file miscompare"
18278 run_test 271f "DoM: read on open (200K file and read tail)"
18281 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
18282 skip "Skipping due to old client or server version"
18284 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
18286 $CHECKSTAT -t file $DIR1/$tfile
18288 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
18291 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
18292 $LCTL set_param fail_loc=0x80000314
18293 rm $DIR1/$tfile || error "Unlink fails"
18295 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
18296 [ $RC -eq 0 ] || error "Failed write to stale object"
18298 run_test 271g "Discard DoM data vs client flush race"
18301 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18302 skip "Need MDS version at least 2.11.50"
18304 local dom=$DIR/$tdir/dom
18305 mkdir -p $DIR/$tdir
18307 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
18308 dd if=/dev/urandom of=$dom bs=512K count=1 ||
18309 error "failed to write data into $dom"
18310 local old_md5=$(md5sum $dom)
18312 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
18313 error "failed to migrate to the same DoM component"
18315 [ $($LFS getstripe -c $dom) -eq 2 ] ||
18316 error "layout was not changed silently"
18318 local new_md5=$(md5sum $dom)
18320 [ "$old_md5" != "$new_md5" ] &&
18321 error "md5sum differ: $old_md5, $new_md5"
18324 run_test 272a "DoM migration: new layout with the same DOM component"
18327 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18328 skip "Need MDS version at least 2.11.50"
18330 local dom=$DIR/$tdir/dom
18331 mkdir -p $DIR/$tdir
18332 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18334 local mdtidx=$($LFS getstripe -m $dom)
18335 local mdtname=MDT$(printf %04x $mdtidx)
18336 local facet=mds$((mdtidx + 1))
18338 local mdtfree1=$(do_facet $facet \
18339 lctl get_param -n osd*.*$mdtname.kbytesfree)
18340 dd if=/dev/urandom of=$dom bs=2M count=1 ||
18341 error "failed to write data into $dom"
18342 local old_md5=$(md5sum $dom)
18343 cancel_lru_locks mdc
18344 local mdtfree1=$(do_facet $facet \
18345 lctl get_param -n osd*.*$mdtname.kbytesfree)
18347 $LFS migrate -c2 $dom ||
18348 error "failed to migrate to the new composite layout"
18349 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18350 error "MDT stripe was not removed"
18352 cancel_lru_locks mdc
18353 local new_md5=$(md5sum $dom)
18354 [ "$old_md5" != "$new_md5" ] &&
18355 error "$old_md5 != $new_md5"
18357 # Skip free space checks with ZFS
18358 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18359 local mdtfree2=$(do_facet $facet \
18360 lctl get_param -n osd*.*$mdtname.kbytesfree)
18361 [ $mdtfree2 -gt $mdtfree1 ] ||
18362 error "MDT space is not freed after migration"
18366 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
18369 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18370 skip "Need MDS version at least 2.11.50"
18372 local dom=$DIR/$tdir/$tfile
18373 mkdir -p $DIR/$tdir
18374 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18376 local mdtidx=$($LFS getstripe -m $dom)
18377 local mdtname=MDT$(printf %04x $mdtidx)
18378 local facet=mds$((mdtidx + 1))
18380 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18381 error "failed to write data into $dom"
18382 local old_md5=$(md5sum $dom)
18383 cancel_lru_locks mdc
18384 local mdtfree1=$(do_facet $facet \
18385 lctl get_param -n osd*.*$mdtname.kbytesfree)
18387 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18388 error "failed to migrate to the new composite layout"
18389 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18390 error "MDT stripe was not removed"
18392 cancel_lru_locks mdc
18393 local new_md5=$(md5sum $dom)
18394 [ "$old_md5" != "$new_md5" ] &&
18395 error "$old_md5 != $new_md5"
18397 # Skip free space checks with ZFS
18398 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18399 local mdtfree2=$(do_facet $facet \
18400 lctl get_param -n osd*.*$mdtname.kbytesfree)
18401 [ $mdtfree2 -gt $mdtfree1 ] ||
18402 error "MDS space is not freed after migration"
18406 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18409 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18410 skip "Need MDS version at least 2.11.50"
18412 # Layout swap cannot be done if either file has DOM component,
18413 # this will never be supported, migration should be used instead
18415 local dom=$DIR/$tdir/$tfile
18416 mkdir -p $DIR/$tdir
18418 $LFS setstripe -c2 ${dom}_plain
18419 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18420 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18421 error "can swap layout with DoM component"
18422 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18423 error "can swap layout with DoM component"
18425 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18426 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18427 error "can swap layout with DoM component"
18428 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18429 error "can swap layout with DoM component"
18432 run_test 273a "DoM: layout swapping should fail with DOM"
18435 remote_ost_nodsh && skip "remote OST with nodsh"
18436 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18437 skip "Need OST version >= 2.10.57"
18439 local file=$DIR/$tfile
18442 oss=$(comma_list $(osts_nodes))
18444 dd if=/dev/urandom of=$file bs=1M count=2 ||
18445 error "failed to create a file"
18446 cancel_lru_locks osc
18449 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18450 error "failed to read a file"
18452 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
18453 $LCTL set_param fail_loc=0x8000031f
18455 cancel_lru_locks osc &
18458 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
18459 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
18460 #IO takes another lock, but matches the PENDING one
18461 #and places it to the IO RPC
18462 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18463 error "failed to read a file with PENDING lock"
18465 run_test 275 "Read on a canceled duplicate lock"
18468 remote_ost_nodsh && skip "remote OST with nodsh"
18471 do_facet ost1 "(while true; do \
18472 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
18473 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
18476 for LOOP in $(seq 20); do
18478 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
18481 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
18482 rm $TMP/sanity_276_pid"
18484 run_test 276 "Race between mount and obd_statfs"
18486 cleanup_test_300() {
18490 test_striped_dir() {
18495 mkdir -p $DIR/$tdir
18497 SAVE_UMASK=$(umask)
18498 trap cleanup_test_300 RETURN EXIT
18500 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
18501 $DIR/$tdir/striped_dir ||
18502 error "set striped dir error"
18504 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
18505 [ "$mode" = "755" ] || error "expect 755 got $mode"
18507 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
18508 error "getdirstripe failed"
18509 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
18510 if [ "$stripe_count" != "2" ]; then
18511 error "1:stripe_count is $stripe_count, expect 2"
18513 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
18514 if [ "$stripe_count" != "2" ]; then
18515 error "2:stripe_count is $stripe_count, expect 2"
18518 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
18519 if [ "$stripe_index" != "$mdt_index" ]; then
18520 error "stripe_index is $stripe_index, expect $mdt_index"
18523 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18524 error "nlink error after create striped dir"
18526 mkdir $DIR/$tdir/striped_dir/a
18527 mkdir $DIR/$tdir/striped_dir/b
18529 stat $DIR/$tdir/striped_dir/a ||
18530 error "create dir under striped dir failed"
18531 stat $DIR/$tdir/striped_dir/b ||
18532 error "create dir under striped dir failed"
18534 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
18535 error "nlink error after mkdir"
18537 rmdir $DIR/$tdir/striped_dir/a
18538 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
18539 error "nlink error after rmdir"
18541 rmdir $DIR/$tdir/striped_dir/b
18542 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18543 error "nlink error after rmdir"
18545 chattr +i $DIR/$tdir/striped_dir
18546 createmany -o $DIR/$tdir/striped_dir/f 10 &&
18547 error "immutable flags not working under striped dir!"
18548 chattr -i $DIR/$tdir/striped_dir
18550 rmdir $DIR/$tdir/striped_dir ||
18551 error "rmdir striped dir error"
18559 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18560 skip "skipped for lustre < 2.7.0"
18561 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18562 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18564 test_striped_dir 0 || error "failed on striped dir on MDT0"
18565 test_striped_dir 1 || error "failed on striped dir on MDT0"
18567 run_test 300a "basic striped dir sanity test"
18570 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18571 skip "skipped for lustre < 2.7.0"
18572 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18573 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18580 test_mkdir $DIR/$tdir || error "mkdir fail"
18581 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18582 error "set striped dir error"
18583 for i in {0..9}; do
18584 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
18586 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
18587 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
18588 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
18590 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
18591 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
18592 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
18596 run_test 300b "check ctime/mtime for striped dir"
18599 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18600 skip "skipped for lustre < 2.7.0"
18601 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18602 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18606 mkdir -p $DIR/$tdir
18607 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
18608 error "set striped dir error"
18610 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
18611 error "chown striped dir failed"
18613 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
18614 error "create 5k files failed"
18616 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
18618 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
18622 run_test 300c "chown && check ls under striped directory"
18625 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18626 skip "skipped for lustre < 2.7.0"
18627 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18628 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18633 mkdir -p $DIR/$tdir
18634 $SETSTRIPE -c 2 $DIR/$tdir
18636 #local striped directory
18637 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18638 error "set striped dir error"
18639 #look at the directories for debug purposes
18641 $LFS getdirstripe $DIR/$tdir
18642 ls -l $DIR/$tdir/striped_dir
18643 $LFS getdirstripe $DIR/$tdir/striped_dir
18644 createmany -o $DIR/$tdir/striped_dir/f 10 ||
18645 error "create 10 files failed"
18647 #remote striped directory
18648 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
18649 error "set striped dir error"
18650 #look at the directories for debug purposes
18652 $LFS getdirstripe $DIR/$tdir
18653 ls -l $DIR/$tdir/remote_striped_dir
18654 $LFS getdirstripe $DIR/$tdir/remote_striped_dir
18655 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
18656 error "create 10 files failed"
18658 for file in $(find $DIR/$tdir); do
18659 stripe_count=$($LFS getstripe -c $file)
18660 [ $stripe_count -eq 2 ] ||
18661 error "wrong stripe $stripe_count for $file"
18666 run_test 300d "check default stripe under striped directory"
18669 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18670 skip "Need MDS version at least 2.7.55"
18671 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18672 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18677 mkdir -p $DIR/$tdir
18679 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18680 error "set striped dir error"
18682 touch $DIR/$tdir/striped_dir/a
18683 touch $DIR/$tdir/striped_dir/b
18684 touch $DIR/$tdir/striped_dir/c
18686 mkdir $DIR/$tdir/striped_dir/dir_a
18687 mkdir $DIR/$tdir/striped_dir/dir_b
18688 mkdir $DIR/$tdir/striped_dir/dir_c
18690 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
18691 error "set striped adir under striped dir error"
18693 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
18694 error "set striped bdir under striped dir error"
18696 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
18697 error "set striped cdir under striped dir error"
18699 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
18700 error "rename dir under striped dir fails"
18702 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
18703 error "rename dir under different stripes fails"
18705 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
18706 error "rename file under striped dir should succeed"
18708 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
18709 error "rename dir under striped dir should succeed"
18713 run_test 300e "check rename under striped directory"
18716 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18717 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18718 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18719 skip "Need MDS version at least 2.7.55"
18725 mkdir -p $DIR/$tdir
18727 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18728 error "set striped dir error"
18730 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
18731 error "set striped dir error"
18733 touch $DIR/$tdir/striped_dir/a
18734 mkdir $DIR/$tdir/striped_dir/dir_a
18735 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
18736 error "create striped dir under striped dir fails"
18738 touch $DIR/$tdir/striped_dir1/b
18739 mkdir $DIR/$tdir/striped_dir1/dir_b
18740 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
18741 error "create striped dir under striped dir fails"
18743 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
18744 error "rename dir under different striped dir should fail"
18746 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
18747 error "rename striped dir under diff striped dir should fail"
18749 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
18750 error "rename file under diff striped dirs fails"
18754 run_test 300f "check rename cross striped directory"
18756 test_300_check_default_striped_dir()
18759 local default_count=$2
18760 local default_index=$3
18763 local dir_stripe_index
18766 echo "checking $dirname $default_count $default_index"
18767 $LFS setdirstripe -D -c $default_count -i $default_index \
18768 -t all_char $DIR/$tdir/$dirname ||
18769 error "set default stripe on striped dir error"
18770 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
18771 [ $stripe_count -eq $default_count ] ||
18772 error "expect $default_count get $stripe_count for $dirname"
18774 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
18775 [ $stripe_index -eq $default_index ] ||
18776 error "expect $default_index get $stripe_index for $dirname"
18778 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
18779 error "create dirs failed"
18781 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
18782 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
18783 for dir in $(find $DIR/$tdir/$dirname/*); do
18784 stripe_count=$($LFS getdirstripe -c $dir)
18785 [ $stripe_count -eq $default_count ] ||
18786 [ $stripe_count -eq 0 -o $default_count -eq 1 ] ||
18787 error "stripe count $default_count != $stripe_count for $dir"
18789 stripe_index=$($LFS getdirstripe -i $dir)
18790 [ $default_index -eq -1 -o $stripe_index -eq $default_index ] ||
18791 error "$stripe_index != $default_index for $dir"
18793 #check default stripe
18794 stripe_count=$($LFS getdirstripe -D -c $dir)
18795 [ $stripe_count -eq $default_count ] ||
18796 error "default count $default_count != $stripe_count for $dir"
18798 stripe_index=$($LFS getdirstripe -D -i $dir)
18799 [ $stripe_index -eq $default_index ] ||
18800 error "default index $default_index != $stripe_index for $dir"
18802 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
18806 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18807 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18808 skip "Need MDS version at least 2.7.55"
18815 mkdir $DIR/$tdir/normal_dir
18817 #Checking when client cache stripe index
18818 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
18819 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
18820 error "create striped_dir failed"
18822 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
18823 error "create dir0 fails"
18824 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
18825 [ $stripe_index -eq 0 ] ||
18826 error "dir0 expect index 0 got $stripe_index"
18828 mkdir $DIR/$tdir/striped_dir/dir1 ||
18829 error "create dir1 fails"
18830 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
18831 [ $stripe_index -eq 1 ] ||
18832 error "dir1 expect index 1 got $stripe_index"
18834 #check default stripe count/stripe index
18835 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
18836 test_300_check_default_striped_dir normal_dir 1 0
18837 test_300_check_default_striped_dir normal_dir 2 1
18838 test_300_check_default_striped_dir normal_dir 2 -1
18840 #delete default stripe information
18841 echo "delete default stripeEA"
18842 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
18843 error "set default stripe on striped dir error"
18845 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
18846 for dir in $(find $DIR/$tdir/normal_dir/*); do
18847 stripe_count=$($LFS getdirstripe -c $dir)
18848 [ $stripe_count -eq 0 ] ||
18849 error "expect 1 get $stripe_count for $dir"
18850 stripe_index=$($LFS getdirstripe -i $dir)
18851 [ $stripe_index -eq 0 ] ||
18852 error "expect 0 get $stripe_index for $dir"
18855 run_test 300g "check default striped directory for normal directory"
18858 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18859 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18860 skip "Need MDS version at least 2.7.55"
18866 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18867 error "set striped dir error"
18869 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
18870 test_300_check_default_striped_dir striped_dir 1 0
18871 test_300_check_default_striped_dir striped_dir 2 1
18872 test_300_check_default_striped_dir striped_dir 2 -1
18874 #delete default stripe information
18875 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
18876 error "set default stripe on striped dir error"
18878 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
18879 for dir in $(find $DIR/$tdir/striped_dir/*); do
18880 stripe_count=$($LFS getdirstripe -c $dir)
18881 [ $stripe_count -eq 0 ] ||
18882 error "expect 1 get $stripe_count for $dir"
18885 run_test 300h "check default striped directory for striped directory"
18888 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18889 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18890 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18891 skip "Need MDS version at least 2.7.55"
18898 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18899 error "set striped dir error"
18901 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18902 error "create files under striped dir failed"
18904 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
18905 error "set striped hashdir error"
18907 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
18908 error "create dir0 under hash dir failed"
18909 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
18910 error "create dir1 under hash dir failed"
18912 # unfortunately, we need to umount to clear dir layout cache for now
18913 # once we fully implement dir layout, we can drop this
18914 umount_client $MOUNT || error "umount failed"
18915 mount_client $MOUNT || error "mount failed"
18917 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
18918 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
18919 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
18921 #set the stripe to be unknown hash type
18922 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
18923 $LCTL set_param fail_loc=0x1901
18924 for ((i = 0; i < 10; i++)); do
18925 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
18926 error "stat f-$i failed"
18927 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
18930 touch $DIR/$tdir/striped_dir/f0 &&
18931 error "create under striped dir with unknown hash should fail"
18933 $LCTL set_param fail_loc=0
18935 umount_client $MOUNT || error "umount failed"
18936 mount_client $MOUNT || error "mount failed"
18940 run_test 300i "client handle unknown hash type striped directory"
18943 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18944 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18945 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18946 skip "Need MDS version at least 2.7.55"
18953 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
18954 $LCTL set_param fail_loc=0x1702
18955 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18956 error "set striped dir error"
18958 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18959 error "create files under striped dir failed"
18961 $LCTL set_param fail_loc=0
18963 rm -rf $DIR/$tdir || error "unlink striped dir fails"
18967 run_test 300j "test large update record"
18970 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18971 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18972 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18973 skip "Need MDS version at least 2.7.55"
18980 #define OBD_FAIL_LARGE_STRIPE 0x1703
18981 $LCTL set_param fail_loc=0x1703
18982 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
18983 error "set striped dir error"
18984 $LCTL set_param fail_loc=0
18986 $LFS getdirstripe $DIR/$tdir/striped_dir ||
18987 error "getstripeddir fails"
18988 rm -rf $DIR/$tdir/striped_dir ||
18989 error "unlink striped dir fails"
18993 run_test 300k "test large striped directory"
18996 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18997 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18998 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18999 skip "Need MDS version at least 2.7.55"
19003 test_mkdir -p $DIR/$tdir/striped_dir
19004 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
19005 error "chown $RUNAS_ID failed"
19006 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
19007 error "set default striped dir failed"
19009 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
19010 $LCTL set_param fail_loc=0x80000158
19011 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
19013 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
19014 [ $stripe_index -eq 1 ] ||
19015 error "expect 1 get $stripe_index for $dir"
19017 run_test 300l "non-root user to create dir under striped dir with stale layout"
19020 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19021 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
19022 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19023 skip "Need MDS version at least 2.7.55"
19025 mkdir -p $DIR/$tdir/striped_dir
19026 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
19027 error "set default stripes dir error"
19029 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
19031 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
19032 [ $stripe_count -eq 0 ] ||
19033 error "expect 0 get $stripe_count for a"
19035 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
19036 error "set default stripes dir error"
19038 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
19040 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
19041 [ $stripe_count -eq 0 ] ||
19042 error "expect 0 get $stripe_count for b"
19044 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
19045 error "set default stripes dir error"
19047 mkdir $DIR/$tdir/striped_dir/c &&
19048 error "default stripe_index is invalid, mkdir c should fails"
19050 rm -rf $DIR/$tdir || error "rmdir fails"
19052 run_test 300m "setstriped directory on single MDT FS"
19055 local list=$(comma_list $(mdts_nodes))
19058 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19062 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19063 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19064 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19065 skip "Need MDS version at least 2.7.55"
19066 remote_mds_nodsh && skip "remote MDS with nodsh"
19069 local list=$(comma_list $(mdts_nodes))
19071 trap cleanup_300n RETURN EXIT
19072 mkdir -p $DIR/$tdir
19073 chmod 777 $DIR/$tdir
19074 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
19075 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19076 error "create striped dir succeeds with gid=0"
19078 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19079 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
19080 error "create striped dir fails with gid=-1"
19082 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19083 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
19084 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19085 error "set default striped dir succeeds with gid=0"
19088 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19089 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
19090 error "set default striped dir fails with gid=-1"
19093 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19094 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
19095 error "create test_dir fails"
19096 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
19097 error "create test_dir1 fails"
19098 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
19099 error "create test_dir2 fails"
19102 run_test 300n "non-root user to create dir under striped dir with default EA"
19105 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19106 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19107 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19108 skip "Need MDS version at least 2.7.55"
19113 mkdir -p $DIR/$tdir
19115 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
19116 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
19117 if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then
19118 skip "not enough free inodes $numfree1 $numfree2"
19121 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
19122 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
19123 if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then
19124 skip "not enough free space $numfree1 $numfree2"
19127 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
19128 error "setdirstripe fails"
19130 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
19131 error "create dirs fails"
19133 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
19134 ls $DIR/$tdir/striped_dir > /dev/null ||
19135 error "ls striped dir fails"
19136 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
19137 error "unlink big striped dir fails"
19139 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
19142 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19143 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19144 remote_mds_nodsh && skip "remote MDS with nodsh"
19146 mkdir -p $DIR/$tdir
19148 #define OBD_FAIL_OUT_ENOSPC 0x1704
19149 do_facet mds2 lctl set_param fail_loc=0x80001704
19150 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
19151 && error "create striped directory should fail"
19153 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
19155 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
19158 run_test 300p "create striped directory without space"
19161 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19162 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19164 local fd=$(free_fd)
19165 local cmd="exec $fd<$tdir"
19167 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
19170 trap "eval $cmd" EXIT
19171 cd $tdir || error "cd $tdir fails"
19172 rmdir ../$tdir || error "rmdir $tdir fails"
19173 mkdir local_dir && error "create dir succeeds"
19174 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
19178 run_test 300q "create remote directory under orphan directory"
19181 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
19182 skip "Need MDS version at least 2.7.55" && return
19183 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19187 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
19188 error "set striped dir error"
19190 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19191 error "getstripeddir fails"
19194 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
19195 awk '/lmv_stripe_count:/ { print $2 }')
19197 [ $MDSCOUNT -ne $stripe_count ] &&
19198 error "wrong stripe count $stripe_count expected $MDSCOUNT"
19200 rm -rf $DIR/$tdir/striped_dir ||
19201 error "unlink striped dir fails"
19203 run_test 300r "test -1 striped directory"
19205 prepare_remote_file() {
19206 mkdir $DIR/$tdir/src_dir ||
19207 error "create remote source failed"
19209 cp /etc/hosts $DIR/$tdir/src_dir/a ||
19210 error "cp to remote source failed"
19211 touch $DIR/$tdir/src_dir/a
19213 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
19214 error "create remote target dir failed"
19216 touch $DIR/$tdir/tgt_dir/b
19218 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
19219 error "rename dir cross MDT failed!"
19221 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
19222 error "src_child still exists after rename"
19224 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
19225 error "missing file(a) after rename"
19227 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
19228 error "diff after rename"
19232 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19233 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19235 local remote_file=$DIR/$tdir/tgt_dir/b
19237 mkdir -p $DIR/$tdir
19239 prepare_remote_file || error "prepare remote file failed"
19242 $OPENUNLINK $remote_file $remote_file ||
19243 error "openunlink $remote_file failed"
19244 $CHECKSTAT -a $remote_file || error "$remote_file exists"
19246 run_test 310a "open unlink remote file"
19249 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19250 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19252 local remote_file=$DIR/$tdir/tgt_dir/b
19254 mkdir -p $DIR/$tdir
19256 prepare_remote_file || error "prepare remote file failed"
19258 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19259 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
19260 $CHECKSTAT -t file $remote_file || error "check file failed"
19262 run_test 310b "unlink remote file with multiple links while open"
19265 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19266 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
19268 local remote_file=$DIR/$tdir/tgt_dir/b
19270 mkdir -p $DIR/$tdir
19272 prepare_remote_file || error "prepare remote file failed"
19274 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19275 multiop_bg_pause $remote_file O_uc ||
19276 error "mulitop failed for remote file"
19278 $MULTIOP $DIR/$tfile Ouc
19279 kill -USR1 $MULTIPID
19282 run_test 310c "open-unlink remote file with multiple links"
19286 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19287 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19288 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
19289 skip "lustre < 2.8.54 does not contain LU-4825 fix"
19290 remote_mds_nodsh && skip "remote MDS with nodsh"
19292 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19293 local mdts=$(comma_list $(mdts_nodes))
19295 mkdir -p $DIR/$tdir
19296 $SETSTRIPE -i 0 -c 1 $DIR/$tdir
19297 createmany -o $DIR/$tdir/$tfile. 1000
19299 # statfs data is not real time, let's just calculate it
19300 old_iused=$((old_iused + 1000))
19302 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19303 osp.*OST0000*MDT0000.create_count")
19304 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19305 osp.*OST0000*MDT0000.max_create_count")
19306 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
19308 $SETSTRIPE -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
19309 local index=$($GETSTRIPE -i $DIR/$tdir/$tfile)
19310 [ $index -ne 0 ] || error "$tfile stripe index is 0"
19312 unlinkmany $DIR/$tdir/$tfile. 1000
19314 do_nodes $mdts "$LCTL set_param -n \
19315 osp.*OST0000*.max_create_count=$max_count"
19316 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
19317 do_nodes $mdts "$LCTL set_param -n \
19318 osp.*OST0000*.create_count=$count"
19319 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
19320 grep "=0" && error "create_count is zero"
19323 for i in $(seq 120); do
19324 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19325 # system may be too busy to destroy all objs in time, use
19326 # a somewhat small value to not fail autotest
19327 [ $((old_iused - new_iused)) -gt 400 ] && break
19331 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
19332 [ $((old_iused - new_iused)) -gt 400 ] ||
19333 error "objs not destroyed after unlink"
19335 run_test 311 "disable OSP precreate, and unlink should destroy objs"
19342 local vdevdir=$(dirname $(facet_vdevice $ost))
19343 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
19344 local zfs_zapid=$(do_facet $ost $cmd |
19345 grep -w "/O/0/d$((objid%32))" -C 5 |
19346 awk '/Object/{getline; print $1}')
19347 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
19348 awk "/$objid = /"'{printf $3}')
19353 zfs_object_blksz() {
19357 local vdevdir=$(dirname $(facet_vdevice $ost))
19358 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
19359 local blksz=$(do_facet $ost $cmd $objid |
19360 awk '/dblk/{getline; printf $4}')
19362 case "${blksz: -1}" in
19363 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
19364 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
19371 test_312() { # LU-4856
19372 remote_ost_nodsh && skip "remote OST with nodsh"
19373 [ "$ost1_FSTYPE" = "zfs" ] ||
19374 skip_env "the test only applies to zfs"
19376 local max_blksz=$(do_facet ost1 \
19377 $ZFS get -p recordsize $(facet_device ost1) |
19378 awk '!/VALUE/{print $3}')
19380 # to make life a little bit easier
19381 $LFS mkdir -c 1 -i 0 $DIR/$tdir
19382 $LFS setstripe -c 1 -i 0 $DIR/$tdir
19384 local tf=$DIR/$tdir/$tfile
19386 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19388 # Get ZFS object id
19389 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19390 # block size change by sequential overwrite
19393 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
19394 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
19396 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
19397 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19401 # block size change by sequential append write
19402 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19403 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19404 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19407 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19408 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19409 oflag=sync conv=notrunc
19411 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19412 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19413 error "blksz error, actual $blksz, " \
19414 "expected: 2 * $count * $PAGE_SIZE"
19420 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19421 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19423 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
19424 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19425 [ $blksz -eq $PAGE_SIZE ] ||
19426 error "blksz error: $blksz, expected: $PAGE_SIZE"
19428 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
19429 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19430 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
19432 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
19433 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19434 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
19436 run_test 312 "make sure ZFS adjusts its block size by write pattern"
19439 remote_ost_nodsh && skip "remote OST with nodsh"
19441 local file=$DIR/$tfile
19444 $SETSTRIPE -c 1 -i 0 $file || error "setstripe failed"
19446 # define OBD_FAIL_TGT_RCVD_EIO 0x720
19447 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19448 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
19449 error "write should failed"
19450 do_facet ost1 "$LCTL set_param fail_loc=0"
19453 run_test 313 "io should fail after last_rcvd update fail"
19456 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19458 $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
19459 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19461 wait_delete_completed
19462 do_facet ost1 "$LCTL set_param fail_loc=0"
19464 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
19466 test_315() { # LU-618
19467 local file=$DIR/$tfile
19470 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
19471 error "multiop file write failed"
19472 $MULTIOP $file oO_RDONLY:r4063232_c &
19477 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
19480 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
19483 run_test 315 "read should be accounted"
19486 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19487 large_xattr_enabled || skip_env "ea_inode feature disabled"
19489 rm -rf $DIR/$tdir/d
19490 mkdir -p $DIR/$tdir/d
19491 chown nobody $DIR/$tdir/d
19492 touch $DIR/$tdir/d/file
19494 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
19496 run_test 316 "lfs mv"
19499 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
19500 skip "Need MDS version at least 2.11.53"
19501 if [ "$ost1_FSTYPE" == "zfs" ]; then
19502 skip "LU-10370: no implementation for ZFS"
19506 local grant_blk_size
19508 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
19509 awk '/grant_block_size:/ { print $2; exit; }')
19511 # Create File of size 5M. Truncate it to below size's and verify
19514 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
19515 error "Create file $DIR/$tfile failed"
19516 stack_trap "rm -f $DIR/$tfile" EXIT
19518 for trunc_sz in 2097152 4097 4000 509 0; do
19519 $TRUNCATE $DIR/$tfile $trunc_sz ||
19520 error "truncate $tfile to $trunc_sz failed"
19521 local sz=$(stat --format=%s $DIR/$tfile)
19522 local blk=$(stat --format=%b $DIR/$tfile)
19523 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
19524 grant_blk_size) * 8))
19526 if [[ $blk -ne $trunc_blk ]]; then
19527 $(which stat) $DIR/$tfile
19528 error "Expected Block $trunc_blk got $blk for $tfile"
19531 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19532 error "Expected Size $trunc_sz got $sz for $tfile"
19537 # Create file with a hole and write actual two blocks. Block count
19540 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
19541 conv=fsync || error "Create file : $DIR/$tfile"
19543 # Calculate the final truncate size.
19544 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
19547 # truncate to size $trunc_sz bytes. Strip the last block
19548 # The block count must drop to 8
19550 $TRUNCATE $DIR/$tfile $trunc_sz ||
19551 error "truncate $tfile to $trunc_sz failed"
19553 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
19554 sz=$(stat --format=%s $DIR/$tfile)
19555 blk=$(stat --format=%b $DIR/$tfile)
19557 if [[ $blk -ne $trunc_bsz ]]; then
19558 $(which stat) $DIR/$tfile
19559 error "Expected Block $trunc_bsz got $blk for $tfile"
19562 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19563 error "Expected Size $trunc_sz got $sz for $tfile"
19565 run_test 317 "Verify blocks get correctly update after truncate"
19568 local read_write=$1
19569 if [ "$read_write" = "write" ]; then
19570 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
19571 elif [ "$read_write" = "read" ]; then
19572 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
19574 error "argument error"
19577 # turn off debug for performance testing
19578 local saved_debug=$($LCTL get_param -n debug)
19579 $LCTL set_param debug=0
19581 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
19583 # get ost1 size - lustre-OST0000
19584 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
19585 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
19586 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
19588 if [ "$read_write" = "read" ]; then
19589 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
19592 local start_time=$(date +%s.%N)
19593 $dd_cmd bs=1M count=$blocks oflag=sync ||
19594 error "real dd $read_write error"
19595 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
19597 if [ "$read_write" = "write" ]; then
19601 # define OBD_FAIL_OST_FAKE_RW 0x238
19602 do_facet ost1 $LCTL set_param fail_loc=0x238
19604 local start_time=$(date +%s.%N)
19605 $dd_cmd bs=1M count=$blocks oflag=sync ||
19606 error "fake dd $read_write error"
19607 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
19609 if [ "$read_write" = "write" ]; then
19611 cancel_lru_locks osc
19612 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
19613 error "$tfile size not $blocks MB"
19615 do_facet ost1 $LCTL set_param fail_loc=0
19617 echo "fake $read_write $duration_fake vs. normal $read_write" \
19618 "$duration in seconds"
19619 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
19620 error_not_in_vm "fake write is slower"
19622 $LCTL set_param -n debug="$saved_debug"
19625 test_399a() { # LU-7655 for OST fake write
19626 remote_ost_nodsh && skip "remote OST with nodsh"
19630 run_test 399a "fake write should not be slower than normal write"
19632 test_399b() { # LU-8726 for OST fake read
19633 remote_ost_nodsh && skip "remote OST with nodsh"
19634 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
19635 skip_env "ldiskfs only test"
19640 run_test 399b "fake read should not be slower than normal read"
19642 test_400a() { # LU-1606, was conf-sanity test_74
19643 if ! which $CC > /dev/null 2>&1; then
19644 skip_env "$CC is not installed"
19647 local extra_flags=''
19648 local out=$TMP/$tfile
19649 local prefix=/usr/include/lustre
19652 # Oleg removes c files in his test rig so test if any c files exist
19653 [ -z "$(ls -A $LUSTRE_TESTS_API_DIR)" ] && \
19654 skip_env "Needed c test files are missing"
19656 if ! [[ -d $prefix ]]; then
19657 # Assume we're running in tree and fixup the include path.
19658 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
19659 extra_flags+=" -L$LUSTRE/utils/.lib"
19662 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
19663 $CC -Wall -Werror -std=c99 $extra_flags -o $out $prog -llustreapi ||
19664 error "client api broken"
19668 run_test 400a "Lustre client api program can compile and link"
19670 test_400b() { # LU-1606, LU-5011
19672 local out=$TMP/$tfile
19673 local prefix=/usr/include/linux/lustre
19675 # We use a hard coded prefix so that this test will not fail
19676 # when run in tree. There are headers in lustre/include/lustre/
19677 # that are not packaged (like lustre_idl.h) and have more
19678 # complicated include dependencies (like config.h and lnet/types.h).
19679 # Since this test about correct packaging we just skip them when
19680 # they don't exist (see below) rather than try to fixup cppflags.
19682 if ! which $CC > /dev/null 2>&1; then
19683 skip_env "$CC is not installed"
19686 for header in $prefix/*.h; do
19687 if ! [[ -f "$header" ]]; then
19691 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
19692 continue # lustre_ioctl.h is internal header
19695 $CC -Wall -Werror -std=c99 -include $header -c -x c /dev/null -o $out ||
19696 error "cannot compile '$header'"
19700 run_test 400b "packaged headers can be compiled"
19702 test_401a() { #LU-7437
19703 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
19704 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
19706 #count the number of parameters by "list_param -R"
19707 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
19708 #count the number of parameters by listing proc files
19709 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
19710 echo "proc_dirs='$proc_dirs'"
19711 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
19712 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
19715 [ $params -eq $procs ] ||
19716 error "found $params parameters vs. $procs proc files"
19718 # test the list_param -D option only returns directories
19719 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
19720 #count the number of parameters by listing proc directories
19721 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
19724 [ $params -eq $procs ] ||
19725 error "found $params parameters vs. $procs proc files"
19727 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
19730 local save=$($LCTL get_param -n jobid_var)
19733 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
19734 error "no error returned when setting bad parameters"
19736 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
19737 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
19739 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
19740 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
19741 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
19743 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
19746 local jobid_var_old=$($LCTL get_param -n jobid_var)
19747 local jobid_var_new
19749 $LCTL set_param jobid_var= &&
19750 error "no error returned for 'set_param a='"
19752 jobid_var_new=$($LCTL get_param -n jobid_var)
19753 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19754 error "jobid_var was changed by setting without value"
19756 $LCTL set_param jobid_var &&
19757 error "no error returned for 'set_param a'"
19759 jobid_var_new=$($LCTL get_param -n jobid_var)
19760 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19761 error "jobid_var was changed by setting without value"
19763 run_test 401c "Verify 'lctl set_param' without value fails in either format."
19766 local jobid_var_old=$($LCTL get_param -n jobid_var)
19767 local jobid_var_new
19768 local new_value="foo=bar"
19770 $LCTL set_param jobid_var=$new_value ||
19771 error "'set_param a=b' did not accept a value containing '='"
19773 jobid_var_new=$($LCTL get_param -n jobid_var)
19774 [[ "$jobid_var_new" == "$new_value" ]] ||
19775 error "'set_param a=b' failed on a value containing '='"
19777 # Reset the jobid_var to test the other format
19778 $LCTL set_param jobid_var=$jobid_var_old
19779 jobid_var_new=$($LCTL get_param -n jobid_var)
19780 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19781 error "failed to reset jobid_var"
19783 $LCTL set_param jobid_var $new_value ||
19784 error "'set_param a b' did not accept a value containing '='"
19786 jobid_var_new=$($LCTL get_param -n jobid_var)
19787 [[ "$jobid_var_new" == "$new_value" ]] ||
19788 error "'set_param a b' failed on a value containing '='"
19790 $LCTL set_param jobid_var $jobid_var_old
19791 jobid_var_new=$($LCTL get_param -n jobid_var)
19792 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19793 error "failed to reset jobid_var"
19795 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
19798 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
19799 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
19800 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
19801 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
19802 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
19803 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
19804 remote_mds_nodsh && skip "remote MDS with nodsh"
19806 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
19807 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
19808 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
19809 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
19810 echo "Touch failed - OK"
19812 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
19815 local file1=$DIR/$tfile.1
19816 local file2=$DIR/$tfile.2
19817 local tfile=$TMP/$tfile
19819 rm -f $file1 $file2 $tfile
19824 # 30 sec OBD_TIMEOUT in ll_getattr()
19825 # right before populating st_nlink
19826 $LCTL set_param fail_loc=0x80001409
19827 stat -c %h $file1 > $tfile &
19829 # create an alias, drop all locks and reclaim the dentry
19831 cancel_lru_locks mdc
19832 cancel_lru_locks osc
19833 sysctl -w vm.drop_caches=2
19837 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
19839 rm -f $tfile $file1 $file2
19841 run_test 403 "i_nlink should not drop to zero due to aliasing"
19843 test_404() { # LU-6601
19844 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
19845 skip "Need server version newer than 2.8.52"
19846 remote_mds_nodsh && skip "remote MDS with nodsh"
19848 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
19849 awk '/osp .*-osc-MDT/ { print $4}')
19852 for osp in $mosps; do
19853 echo "Deactivate: " $osp
19854 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
19855 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19856 awk -vp=$osp '$4 == p { print $2 }')
19857 [ $stat = IN ] || {
19858 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19859 error "deactivate error"
19861 echo "Activate: " $osp
19862 do_facet $SINGLEMDS $LCTL --device %$osp activate
19863 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19864 awk -vp=$osp '$4 == p { print $2 }')
19865 [ $stat = UP ] || {
19866 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19867 error "activate error"
19871 run_test 404 "validate manual {de}activated works properly for OSPs"
19874 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] ||
19875 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
19876 skip "Layout swap lock is not supported"
19878 check_swap_layouts_support
19880 test_mkdir $DIR/$tdir
19881 swap_lock_test -d $DIR/$tdir ||
19882 error "One layout swap locked test failed"
19884 run_test 405 "Various layout swap lock tests"
19887 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19888 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
19889 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
19890 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19891 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
19892 skip "Need MDS version at least 2.8.50"
19894 local def_stripe_size=$($LFS getstripe -S $MOUNT)
19895 local test_pool=$TESTNAME
19897 pool_add $test_pool || error "pool_add failed"
19898 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
19899 error "pool_add_targets failed"
19901 save_layout_restore_at_exit $MOUNT
19903 # parent set default stripe count only, child will stripe from both
19904 # parent and fs default
19905 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
19906 error "setstripe $MOUNT failed"
19907 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
19908 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
19909 for i in $(seq 10); do
19910 local f=$DIR/$tdir/$tfile.$i
19911 touch $f || error "touch failed"
19912 local count=$($LFS getstripe -c $f)
19913 [ $count -eq $OSTCOUNT ] ||
19914 error "$f stripe count $count != $OSTCOUNT"
19915 local offset=$($LFS getstripe -i $f)
19916 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
19917 local size=$($LFS getstripe -S $f)
19918 [ $size -eq $((def_stripe_size * 2)) ] ||
19919 error "$f stripe size $size != $((def_stripe_size * 2))"
19920 local pool=$($LFS getstripe -p $f)
19921 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
19924 # change fs default striping, delete parent default striping, now child
19925 # will stripe from new fs default striping only
19926 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
19927 error "change $MOUNT default stripe failed"
19928 $LFS setstripe -c 0 $DIR/$tdir ||
19929 error "delete $tdir default stripe failed"
19930 for i in $(seq 11 20); do
19931 local f=$DIR/$tdir/$tfile.$i
19932 touch $f || error "touch $f failed"
19933 local count=$($LFS getstripe -c $f)
19934 [ $count -eq 1 ] || error "$f stripe count $count != 1"
19935 local offset=$($LFS getstripe -i $f)
19936 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
19937 local size=$($LFS getstripe -S $f)
19938 [ $size -eq $def_stripe_size ] ||
19939 error "$f stripe size $size != $def_stripe_size"
19940 local pool=$($LFS getstripe -p $f)
19941 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
19944 unlinkmany $DIR/$tdir/$tfile. 1 20
19946 local f=$DIR/$tdir/$tfile
19947 pool_remove_all_targets $test_pool $f
19948 pool_remove $test_pool $f
19950 run_test 406 "DNE support fs default striping"
19953 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19954 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
19955 skip "Need MDS version at least 2.8.55"
19956 remote_mds_nodsh && skip "remote MDS with nodsh"
19958 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
19959 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
19960 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
19961 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
19962 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
19964 #define OBD_FAIL_DT_TXN_STOP 0x2019
19965 for idx in $(seq $MDSCOUNT); do
19966 do_facet mds$idx "lctl set_param fail_loc=0x2019"
19968 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
19969 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
19970 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
19973 run_test 407 "transaction fail should cause operation fail"
19976 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
19978 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
19979 lctl set_param fail_loc=0x8000040a
19980 # let ll_prepare_partial_page() fail
19981 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
19985 # create at least 100 unused inodes so that
19986 # shrink_icache_memory(0) should not return 0
19987 touch $DIR/$tfile-{0..100}
19988 rm -f $DIR/$tfile-{0..100}
19991 echo 2 > /proc/sys/vm/drop_caches
19993 run_test 408 "drop_caches should not hang due to page leaks"
19997 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19998 check_mount_and_prep
20000 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
20001 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
20002 touch $DIR/$tdir/guard || error "(2) Fail to create"
20004 local PREFIX=$(str_repeat 'A' 128)
20005 echo "Create 1K hard links start at $(date)"
20006 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20007 error "(3) Fail to hard link"
20009 echo "Links count should be right although linkEA overflow"
20010 stat $DIR/$tdir/guard || error "(4) Fail to stat"
20011 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
20012 [ $linkcount -eq 1001 ] ||
20013 error "(5) Unexpected hard links count: $linkcount"
20015 echo "List all links start at $(date)"
20016 ls -l $DIR/$tdir/foo > /dev/null ||
20017 error "(6) Fail to list $DIR/$tdir/foo"
20019 echo "Unlink hard links start at $(date)"
20020 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20021 error "(7) Fail to unlink"
20023 run_test 409 "Large amount of cross-MDTs hard links on the same file"
20027 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
20028 skip "Need client version at least 2.9.59"
20030 # Create a file, and stat it from the kernel
20031 local testfile=$DIR/$tfile
20034 local run_id=$RANDOM
20035 local my_ino=$(stat --format "%i" $testfile)
20037 # Try to insert the module. This will always fail as the
20038 # module is designed to not be inserted.
20039 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
20042 # Anything but success is a test failure
20044 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
20045 error "no inode match"
20047 run_test 410 "Test inode number returned from kernel thread"
20049 cleanup_test411_cgroup() {
20055 local cg_basedir=/sys/fs/cgroup/memory
20057 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
20058 skip "no setup for cgroup"
20060 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
20061 error "test file creation failed"
20062 cancel_lru_locks osc
20064 # Create a very small memory cgroup to force a slab allocation error
20065 local cgdir=$cg_basedir/osc_slab_alloc
20066 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
20067 trap "cleanup_test411_cgroup $cgdir" EXIT
20068 echo 2M > $cgdir/memory.kmem.limit_in_bytes
20069 echo 1M > $cgdir/memory.limit_in_bytes
20071 # Should not LBUG, just be killed by oom-killer
20072 # dd will return 0 even allocation failure in some environment.
20073 # So don't check return value
20074 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
20075 cleanup_test411_cgroup $cgdir
20079 run_test 411 "Slab allocation error with cgroup does not LBUG"
20082 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20083 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20084 skip "Need server version at least 2.10.55"
20087 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
20088 error "mkdir failed"
20089 $LFS getdirstripe $DIR/$tdir
20090 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
20091 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
20092 error "expect $((MDSCOUT - 1)) get $stripe_index"
20093 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
20094 [ $stripe_count -eq 2 ] ||
20095 error "expect 2 get $stripe_count"
20097 run_test 412 "mkdir on specific MDTs"
20100 [ $MDSCOUNT -lt 2 ] &&
20101 skip "We need at least 2 MDTs for this test"
20103 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20104 skip "Need server version at least 2.10.55"
20107 mkdir $DIR/$tdir || error "mkdir failed"
20109 # find MDT that is the most full
20110 local max=$($LFS df | grep MDT |
20119 END { split(b, c, ":")
20124 for i in $(seq $((MDSCOUNT - 1))); do
20125 $LFS mkdir -c $i $DIR/$tdir/d$i ||
20126 error "mkdir d$i failed"
20127 $LFS getdirstripe $DIR/$tdir/d$i
20128 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
20129 [ $stripe_index -ne $max ] ||
20130 error "don't expect $max"
20133 run_test 413 "mkdir on less full MDTs"
20136 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
20137 $LCTL set_param fail_loc=0x80000521
20138 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
20141 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
20144 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20145 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
20146 skip "Need server version at least 2.11.52"
20156 # this test may be slow on ZFS
20157 [ "$mds1_FSTYPE" == "zfs" ] && total=100
20159 # though this test is designed for striped directory, let's test normal
20160 # directory too since lock is always saved as CoS lock.
20161 test_mkdir $DIR/$tdir || error "mkdir $tdir"
20162 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
20171 start_time=$(date +%s)
20172 for i in $(seq $total); do
20173 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
20176 end_time=$(date +%s)
20177 duration=$((end_time - start_time))
20179 kill -9 $setattr_pid
20181 echo "rename $total files took $duration sec"
20182 [ $duration -lt 100 ] || error "rename took $duration sec"
20184 run_test 415 "lock revoke is not missing"
20187 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
20188 skip "Need server version at least 2.11.55"
20190 # define OBD_FAIL_OSD_TXN_START 0x19a
20191 do_facet mds1 lctl set_param fail_loc=0x19a
20193 lfs mkdir -c $MDSCOUNT $DIR/$tdir
20197 run_test 416 "transaction start failure won't cause system hung"
20201 do_nodes $(comma_list $(mdts_nodes)) \
20202 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
20203 do_nodes $(comma_list $(mdts_nodes)) \
20204 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
20205 do_nodes $(comma_list $(mdts_nodes)) \
20206 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
20210 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20211 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
20212 skip "Need MDS version at least 2.11.56"
20214 trap cleanup_417 RETURN EXIT
20216 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
20217 do_nodes $(comma_list $(mdts_nodes)) \
20218 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
20219 $LFS migrate -m 0 $DIR/$tdir.1 &&
20220 error "migrate dir $tdir.1 should fail"
20222 do_nodes $(comma_list $(mdts_nodes)) \
20223 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
20224 $LFS mkdir -i 1 $DIR/$tdir.2 &&
20225 error "create remote dir $tdir.2 should fail"
20227 do_nodes $(comma_list $(mdts_nodes)) \
20228 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
20229 $LFS mkdir -c 2 $DIR/$tdir.3 &&
20230 error "create striped dir $tdir.3 should fail"
20233 run_test 417 "disable remote dir, striped dir and dir migration"
20235 # Checks that the outputs of df [-i] and lfs df [-i] match
20237 # usage: check_lfs_df <blocks | inodes> <mountpoint>
20247 [ "$1" == "blocks" ] && inodes= || inodes="-i"
20249 for count in {1..100}; do
20253 # read the lines of interest
20254 df_out=($(df -P $inodes $dir | tail -n +2)) ||
20255 error "df $inodes $dir | tail -n +2 failed"
20256 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
20257 error "lfs df $inodes $dir | grep summary: failed"
20259 # skip first substrings of each output as they are different
20260 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
20261 # compare the remaining fields of the two outputs
20263 for i in {1..5}; do
20264 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
20272 lfs df $inodes $dir
20273 error "df and lfs df $1 output mismatch: " \
20274 "df ${inodes}: ${df_out[*]}, " \
20275 "lfs df ${inodes}: ${lfs_df_out[*]}"
20280 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20282 local dir=$DIR/$tdir
20283 local numfiles=$((RANDOM % 4096 + 2))
20284 local numblocks=$((RANDOM % 256 + 1))
20286 wait_delete_completed
20289 # check block output
20290 check_lfs_df blocks $dir
20291 # check inode output
20292 check_lfs_df inodes $dir
20294 # create a single file and retest
20295 echo "Creating a single file and testing"
20296 createmany -o $dir/$tfile- 1 &>/dev/null ||
20297 error "creating 1 file in $dir failed"
20298 check_lfs_df blocks $dir
20299 check_lfs_df inodes $dir
20301 # create a random number of files
20302 echo "Creating $((numfiles - 1)) files and testing"
20303 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
20304 error "creating $((numfiles - 1)) files in $dir failed"
20306 # write a random number of blocks to the first test file
20307 echo "Writing $numblocks 4K blocks and testing"
20308 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
20309 count=$numblocks &>/dev/null ||
20310 error "dd to $dir/${tfile}-0 failed"
20313 check_lfs_df blocks $dir
20314 check_lfs_df inodes $dir
20316 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
20317 error "unlinking $numfiles files in $dir failed"
20319 run_test 418 "df and lfs df outputs match"
20323 local dir=$DIR/$tdir
20328 cancel_lru_locks mdc
20330 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
20331 $LCTL set_param fail_loc=0x1410
20333 $LCTL set_param fail_loc=0
20336 run_test 419 "Verify open file by name doesn't crash kernel"
20340 [[ $MDS1_VERSION -ge $(version_code 2.12.1) ]] ||
20341 skip "Need MDS version at least 2.12.1"
20343 local SAVE_UMASK=$(umask)
20344 local dir=$DIR/$tdir
20345 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
20349 mkdir -m03777 $dir/testdir
20350 ls -dn $dir/testdir
20351 # Need to remove trailing '.' when SELinux is enabled
20352 local dirperms=$(ls -dn $dir/testdir |
20353 awk '{ sub(/\.$/, "", $1); print $1}')
20354 [ $dirperms == "drwxrwsrwt" ] ||
20355 error "incorrect perms on $dir/testdir"
20357 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
20358 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
20359 ls -n $dir/testdir/testfile
20360 local fileperms=$(ls -n $dir/testdir/testfile |
20361 awk '{ sub(/\.$/, "", $1); print $1}')
20362 [ $fileperms == "-rwxr-xr-x" ] ||
20363 error "incorrect perms on $dir/testdir/testfile"
20367 run_test 420 "clear SGID bit on non-directories for non-members"
20374 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20375 skip "Need MDS version at least 2.12.2"
20377 test_mkdir $DIR/$tdir
20378 createmany -o $DIR/$tdir/f 3
20379 cnt=$(ls -1 $DIR/$tdir | wc -l)
20380 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20382 fid1=$(lfs path2fid $DIR/$tdir/f1)
20383 fid2=$(lfs path2fid $DIR/$tdir/f2)
20384 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
20386 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
20387 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
20389 cnt=$(ls -1 $DIR/$tdir | wc -l)
20390 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20392 rm -f $DIR/$tdir/f3 || error "can't remove f3"
20393 createmany -o $DIR/$tdir/f 3
20394 cnt=$(ls -1 $DIR/$tdir | wc -l)
20395 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20397 fid1=$(lfs path2fid $DIR/$tdir/f1)
20398 fid2=$(lfs path2fid $DIR/$tdir/f2)
20399 echo "remove using fsname $FSNAME"
20400 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
20402 cnt=$(ls -1 $DIR/$tdir | wc -l)
20403 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20405 run_test 421a "simple rm by fid"
20412 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20413 skip "Need MDS version at least 2.12.2"
20415 test_mkdir $DIR/$tdir
20416 createmany -o $DIR/$tdir/f 3
20417 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
20420 FID1=$(lfs path2fid $DIR/$tdir/f1)
20421 FID2=$(lfs path2fid $DIR/$tdir/f2)
20422 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
20424 kill -USR1 $MULTIPID
20427 cnt=$(ls $DIR/$tdir | wc -l)
20428 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
20430 run_test 421b "rm by fid on open file"
20436 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20437 skip "Need MDS version at least 2.12.2"
20439 test_mkdir $DIR/$tdir
20440 createmany -o $DIR/$tdir/f 3
20441 touch $DIR/$tdir/$tfile
20442 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
20443 cnt=$(ls -1 $DIR/$tdir | wc -l)
20444 [ $cnt != 184 ] && error "unexpected #files: $cnt"
20446 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
20447 $LFS rmfid $DIR $FID1 || error "rmfid failed"
20449 cnt=$(ls $DIR/$tdir | wc -l)
20450 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
20452 run_test 421c "rm by fid against hardlinked files"
20458 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20459 skip "Need MDS version at least 2.12.2"
20461 test_mkdir $DIR/$tdir
20462 createmany -o $DIR/$tdir/f 4097
20463 cnt=$(ls -1 $DIR/$tdir | wc -l)
20464 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
20466 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
20467 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20469 cnt=$(ls $DIR/$tdir | wc -l)
20471 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20473 run_test 421d "rmfid en masse"
20479 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20480 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20481 skip "Need MDS version at least 2.12.2"
20483 mkdir -p $DIR/$tdir
20484 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20485 createmany -o $DIR/$tdir/striped_dir/f 512
20486 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20487 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20489 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20490 sed "s/[/][^:]*://g")
20491 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20493 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20495 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20497 run_test 421e "rmfid in DNE"
20503 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20504 skip "Need MDS version at least 2.12.2"
20506 test_mkdir $DIR/$tdir
20508 cnt=$(ls -1 $DIR/$tdir | wc -l)
20509 [ $cnt != 1 ] && error "unexpected #files: $cnt"
20511 FID=$(lfs path2fid $DIR/$tdir/f)
20512 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
20513 # rmfid should fail
20514 cnt=$(ls -1 $DIR/$tdir | wc -l)
20515 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
20517 chmod a+rw $DIR/$tdir
20519 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
20520 # rmfid should fail
20521 cnt=$(ls -1 $DIR/$tdir | wc -l)
20522 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
20525 $RUNAS touch $DIR/$tdir/f
20526 FID=$(lfs path2fid $DIR/$tdir/f)
20527 echo "rmfid as root"
20528 $LFS rmfid $DIR $FID || error "rmfid as root failed"
20529 cnt=$(ls -1 $DIR/$tdir | wc -l)
20530 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
20533 $RUNAS touch $DIR/$tdir/f
20534 cnt=$(ls -1 $DIR/$tdir | wc -l)
20535 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
20536 FID=$(lfs path2fid $DIR/$tdir/f)
20537 # rmfid w/o user_fid2path mount option should fail
20538 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
20539 cnt=$(ls -1 $DIR/$tdir | wc -l)
20540 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
20542 umount_client $MOUNT || "failed to umount client"
20543 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
20544 "failed to mount client'"
20546 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
20547 # rmfid should succeed
20548 cnt=$(ls -1 $DIR/$tdir | wc -l)
20549 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
20551 # rmfid shouldn't allow to remove files due to dir's permission
20552 chmod a+rwx $DIR/$tdir
20555 FID=$(lfs path2fid $DIR/$tdir/f)
20556 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
20558 umount_client $MOUNT || "failed to umount client"
20559 mount_client $MOUNT "$MOUNT_OPTS" ||
20560 "failed to mount client'"
20563 run_test 421f "rmfid checks permissions"
20569 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20570 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20571 skip "Need MDS version at least 2.12.2"
20573 mkdir -p $DIR/$tdir
20574 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20575 createmany -o $DIR/$tdir/striped_dir/f 512
20576 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20577 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20579 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20580 sed "s/[/][^:]*://g")
20582 rm -f $DIR/$tdir/striped_dir/f1*
20583 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20584 removed=$((512 - cnt))
20586 # few files have been just removed, so we expect
20587 # rmfid to fail on their fids
20588 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
20589 [ $removed != $errors ] && error "$errors != $removed"
20591 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20593 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20595 run_test 421g "rmfid to return errors properly"
20608 # ensure statfs cache is expired
20611 _stats=$(stat_test | grep $MOUNT | sort -u | wc -l)
20612 [[ ${_stats} -ne 1 ]] && error "statfs wrong"
20616 run_test 423 "statfs should return a right data"
20619 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20620 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20621 skip "Need server version at least 2.9.55"
20623 start_full_debug_logging
20627 stop_full_debug_logging
20631 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20632 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20633 awk '/The barrier for/ { print $7 }')
20636 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
20641 barrier_expired() {
20644 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20645 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20646 awk '/will be expired/ { print $7 }')
20648 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
20657 echo "Start barrier_freeze at: $(date)"
20658 #define OBD_FAIL_BARRIER_DELAY 0x2202
20659 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20660 # Do not reduce barrier time - See LU-11873
20661 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
20664 local b_status=$(barrier_stat)
20665 echo "Got barrier status at: $(date)"
20666 [ "$b_status" = "'freezing_p1'" ] ||
20667 error "(1) unexpected barrier status $b_status"
20669 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20671 b_status=$(barrier_stat)
20672 [ "$b_status" = "'frozen'" ] ||
20673 error "(2) unexpected barrier status $b_status"
20675 local expired=$(barrier_expired)
20676 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
20677 sleep $((expired + 3))
20679 b_status=$(barrier_stat)
20680 [ "$b_status" = "'expired'" ] ||
20681 error "(3) unexpected barrier status $b_status"
20683 # Do not reduce barrier time - See LU-11873
20684 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
20685 error "(4) fail to freeze barrier"
20687 b_status=$(barrier_stat)
20688 [ "$b_status" = "'frozen'" ] ||
20689 error "(5) unexpected barrier status $b_status"
20691 echo "Start barrier_thaw at: $(date)"
20692 #define OBD_FAIL_BARRIER_DELAY 0x2202
20693 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20694 do_facet mgs $LCTL barrier_thaw $FSNAME &
20697 b_status=$(barrier_stat)
20698 echo "Got barrier status at: $(date)"
20699 [ "$b_status" = "'thawing'" ] ||
20700 error "(6) unexpected barrier status $b_status"
20702 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20704 b_status=$(barrier_stat)
20705 [ "$b_status" = "'thawed'" ] ||
20706 error "(7) unexpected barrier status $b_status"
20708 #define OBD_FAIL_BARRIER_FAILURE 0x2203
20709 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
20710 do_facet mgs $LCTL barrier_freeze $FSNAME
20712 b_status=$(barrier_stat)
20713 [ "$b_status" = "'failed'" ] ||
20714 error "(8) unexpected barrier status $b_status"
20716 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
20717 do_facet mgs $LCTL barrier_thaw $FSNAME
20721 run_test 801a "write barrier user interfaces and stat machine"
20726 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20727 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
20728 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
20729 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
20730 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
20732 cancel_lru_locks mdc
20734 # 180 seconds should be long enough
20735 do_facet mgs $LCTL barrier_freeze $FSNAME 180
20737 local b_status=$(barrier_stat)
20738 [ "$b_status" = "'frozen'" ] ||
20739 error "(6) unexpected barrier status $b_status"
20741 mkdir $DIR/$tdir/d0/d10 &
20744 touch $DIR/$tdir/d1/f13 &
20747 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
20750 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
20753 rm -f $DIR/$tdir/d4/f12 &
20756 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
20758 # To guarantee taht the 'stat' is not blocked
20759 b_status=$(barrier_stat)
20760 [ "$b_status" = "'frozen'" ] ||
20761 error "(8) unexpected barrier status $b_status"
20763 # let above commands to run at background
20766 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
20767 ps -p $touch_pid || error "(10) touch should be blocked"
20768 ps -p $ln_pid || error "(11) link should be blocked"
20769 ps -p $mv_pid || error "(12) rename should be blocked"
20770 ps -p $rm_pid || error "(13) unlink should be blocked"
20772 b_status=$(barrier_stat)
20773 [ "$b_status" = "'frozen'" ] ||
20774 error "(14) unexpected barrier status $b_status"
20776 do_facet mgs $LCTL barrier_thaw $FSNAME
20777 b_status=$(barrier_stat)
20778 [ "$b_status" = "'thawed'" ] ||
20779 error "(15) unexpected barrier status $b_status"
20781 wait $mkdir_pid || error "(16) mkdir should succeed"
20782 wait $touch_pid || error "(17) touch should succeed"
20783 wait $ln_pid || error "(18) link should succeed"
20784 wait $mv_pid || error "(19) rename should succeed"
20785 wait $rm_pid || error "(20) unlink should succeed"
20789 run_test 801b "modification will be blocked by write barrier"
20792 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20796 stop mds2 || error "(1) Fail to stop mds2"
20798 do_facet mgs $LCTL barrier_freeze $FSNAME 30
20800 local b_status=$(barrier_stat)
20801 [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || {
20802 do_facet mgs $LCTL barrier_thaw $FSNAME
20803 error "(2) unexpected barrier status $b_status"
20806 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20807 error "(3) Fail to rescan barrier bitmap"
20809 # Do not reduce barrier time - See LU-11873
20810 do_facet mgs $LCTL barrier_freeze $FSNAME 20
20812 b_status=$(barrier_stat)
20813 [ "$b_status" = "'frozen'" ] ||
20814 error "(4) unexpected barrier status $b_status"
20816 do_facet mgs $LCTL barrier_thaw $FSNAME
20817 b_status=$(barrier_stat)
20818 [ "$b_status" = "'thawed'" ] ||
20819 error "(5) unexpected barrier status $b_status"
20821 local devname=$(mdsdevname 2)
20823 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
20825 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20826 error "(7) Fail to rescan barrier bitmap"
20830 run_test 801c "rescan barrier bitmap"
20832 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
20833 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
20834 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
20835 saved_MOUNT_OPTS=$MOUNT_OPTS
20841 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
20842 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
20843 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
20844 MOUNT_OPTS=$saved_MOUNT_OPTS
20849 [[ $mds1_FSTYPE = zfs ]] || skip "ZFS specific test"
20850 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20851 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20852 skip "Need server version at least 2.9.55"
20854 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
20856 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20858 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
20859 error "(2) Fail to copy"
20861 trap cleanup_802 EXIT
20863 # sync by force before remount as readonly
20864 sync; sync_all_data; sleep 3; sync_all_data
20868 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
20869 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
20870 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
20872 echo "Mount the server as read only"
20873 setupall server_only || error "(3) Fail to start servers"
20875 echo "Mount client without ro should fail"
20876 mount_client $MOUNT &&
20877 error "(4) Mount client without 'ro' should fail"
20879 echo "Mount client with ro should succeed"
20880 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
20881 mount_client $MOUNT ||
20882 error "(5) Mount client with 'ro' should succeed"
20884 echo "Modify should be refused"
20885 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
20887 echo "Read should be allowed"
20888 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
20889 error "(7) Read should succeed under ro mode"
20893 run_test 802 "simulate readonly device"
20896 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20897 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20898 skip "MDS needs to be newer than 2.10.54"
20900 mkdir -p $DIR/$tdir
20901 # Create some objects on all MDTs to trigger related logs objects
20902 for idx in $(seq $MDSCOUNT); do
20903 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
20904 $DIR/$tdir/dir${idx} ||
20905 error "Fail to create $DIR/$tdir/dir${idx}"
20909 wait_delete_completed # ensure old test cleanups are finished
20910 echo "before create:"
20912 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20914 for i in {1..10}; do
20915 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
20916 error "Fail to create $DIR/$tdir/foo$i"
20920 echo "after create:"
20922 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20924 # allow for an llog to be cleaned up during the test
20925 [ $after_used -ge $((before_used + 10 - 1)) ] ||
20926 error "before ($before_used) + 10 > after ($after_used)"
20928 for i in {1..10}; do
20929 rm -rf $DIR/$tdir/foo$i ||
20930 error "Fail to remove $DIR/$tdir/foo$i"
20933 sleep 3 # avoid MDT return cached statfs
20934 wait_delete_completed
20935 echo "after unlink:"
20937 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20939 # allow for an llog to be created during the test
20940 [ $after_used -le $((before_used + 1)) ] ||
20941 error "after ($after_used) > before ($before_used) + 1"
20943 run_test 803 "verify agent object for remote object"
20946 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20947 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20948 skip "MDS needs to be newer than 2.10.54"
20949 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
20951 mkdir -p $DIR/$tdir
20952 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
20953 error "Fail to create $DIR/$tdir/dir0"
20955 local fid=$($LFS path2fid $DIR/$tdir/dir0)
20956 local dev=$(mdsdevname 2)
20958 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20959 grep ${fid} || error "NOT found agent entry for dir0"
20961 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
20962 error "Fail to create $DIR/$tdir/dir1"
20964 touch $DIR/$tdir/dir1/foo0 ||
20965 error "Fail to create $DIR/$tdir/dir1/foo0"
20966 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
20969 for idx in $(seq $MDSCOUNT); do
20970 dev=$(mdsdevname $idx)
20971 do_facet mds${idx} \
20972 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20973 grep ${fid} && rc=$idx
20976 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
20977 error "Fail to rename foo0 to foo1"
20978 if [ $rc -eq 0 ]; then
20979 for idx in $(seq $MDSCOUNT); do
20980 dev=$(mdsdevname $idx)
20981 do_facet mds${idx} \
20982 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20983 grep ${fid} && rc=$idx
20987 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
20988 error "Fail to rename foo1 to foo2"
20989 if [ $rc -eq 0 ]; then
20990 for idx in $(seq $MDSCOUNT); do
20991 dev=$(mdsdevname $idx)
20992 do_facet mds${idx} \
20993 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20994 grep ${fid} && rc=$idx
20998 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
21000 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
21001 error "Fail to link to $DIR/$tdir/dir1/foo2"
21002 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
21003 error "Fail to rename foo2 to foo0"
21004 unlink $DIR/$tdir/dir1/foo0 ||
21005 error "Fail to unlink $DIR/$tdir/dir1/foo0"
21006 rm -rf $DIR/$tdir/dir0 ||
21007 error "Fail to rm $DIR/$tdir/dir0"
21009 for idx in $(seq $MDSCOUNT); do
21010 dev=$(mdsdevname $idx)
21014 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
21016 start mds${idx} $dev $MDS_MOUNT_OPTS ||
21017 error "mount mds$idx failed"
21018 df $MOUNT > /dev/null 2>&1
21020 # e2fsck should not return error
21022 error "e2fsck detected error on MDT${idx}: rc=$rc"
21025 run_test 804 "verify agent entry for remote entry"
21028 do_facet $SINGLEMDS zfs set quota=$old $fsset
21029 unlinkmany $DIR/$tdir/f- 1000000
21034 local zfs_version=$(do_facet mds1 cat /sys/module/zfs/version)
21035 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
21036 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
21037 skip "netfree not implemented before 0.7"
21038 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
21039 skip "Need MDS version at least 2.10.57"
21046 local pref="osd-zfs.lustre-MDT0000."
21048 # limit available space on MDS dataset to meet nospace issue
21049 # quickly. then ZFS 0.7.2 can use reserved space if asked
21050 # properly (using netfree flag in osd_declare_destroy()
21051 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
21052 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
21054 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
21055 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
21056 let "usedkb=usedkb-freekb"
21057 let "freekb=freekb/2"
21058 if let "freekb > 5000"; then
21061 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
21062 trap cleanup_805 EXIT
21064 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
21065 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
21066 rm -rf $DIR/$tdir || error "not able to remove"
21067 do_facet $SINGLEMDS zfs set quota=$old $fsset
21070 run_test 805 "ZFS can remove from full fs"
21076 local size=$($LFS getsom -s $file)
21077 local expect=$(stat -c %s $file)
21079 [[ $size == $expect ]] ||
21080 error "$file expected size: $expect, got: $size"
21082 local blocks=$($LFS getsom -b $file)
21083 expect=$(stat -c %b $file)
21084 [[ $blocks == $expect ]] ||
21085 error "$file expected blocks: $expect, got: $blocks"
21090 local size=$($LFS getsom -s $1)
21093 [[ $size == $expect ]] ||
21094 error "$file expected size: $expect, got: $size"
21098 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21099 skip "Need MDS version at least 2.11.52"
21103 touch $DIR/$tfile || error "touch $tfile failed"
21105 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21106 save_lustre_params client "llite.*.xattr_cache" > $save
21107 lctl set_param llite.*.xattr_cache=0
21108 stack_trap "restore_lustre_params < $save" EXIT
21110 # single-threaded write
21111 echo "Test SOM for single-threaded write"
21112 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
21113 error "write $tfile failed"
21114 check_lsom_size $DIR/$tfile $bs
21117 local size=$(($num * $bs))
21121 echo "Test SOM for single client multi-threaded($num) write"
21122 $TRUNCATE $DIR/$tfile 0
21123 for ((i = 0; i < $num; i++)); do
21124 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21126 offset=$((offset + $bs))
21128 for (( i=0; i < $num; i++ )); do
21131 check_lsom_size $DIR/$tfile $size
21133 $TRUNCATE $DIR/$tfile 0
21134 for ((i = 0; i < $num; i++)); do
21135 offset=$((offset - $bs))
21136 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21139 for (( i=0; i < $num; i++ )); do
21142 check_lsom_size $DIR/$tfile $size
21144 # multi-client writes
21145 num=$(get_node_count ${CLIENTS//,/ })
21146 size=$(($num * $bs))
21150 echo "Test SOM for multi-client ($num) writes"
21151 $TRUNCATE $DIR/$tfile 0
21152 for client in ${CLIENTS//,/ }; do
21153 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21156 offset=$((offset + $bs))
21158 for (( i=0; i < $num; i++ )); do
21161 check_lsom_size $DIR/$tfile $offset
21164 $TRUNCATE $DIR/$tfile 0
21165 for client in ${CLIENTS//,/ }; do
21166 offset=$((offset - $bs))
21167 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21171 for (( i=0; i < $num; i++ )); do
21174 check_lsom_size $DIR/$tfile $size
21177 echo "Test SOM for truncate"
21178 $TRUNCATE $DIR/$tfile 1048576
21179 check_lsom_size $DIR/$tfile 1048576
21180 $TRUNCATE $DIR/$tfile 1234
21181 check_lsom_size $DIR/$tfile 1234
21183 # verify SOM blocks count
21184 echo "Verify SOM block count"
21185 $TRUNCATE $DIR/$tfile 0
21186 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
21187 error "failed to write file $tfile"
21188 check_lsom_data $DIR/$tfile
21190 run_test 806 "Verify Lazy Size on MDS"
21193 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21194 skip "Need MDS version at least 2.11.52"
21196 # Registration step
21197 changelog_register || error "changelog_register failed"
21198 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
21199 changelog_users $SINGLEMDS | grep -q $cl_user ||
21200 error "User $cl_user not found in changelog_users"
21202 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21203 save_lustre_params client "llite.*.xattr_cache" > $save
21204 lctl set_param llite.*.xattr_cache=0
21205 stack_trap "restore_lustre_params < $save" EXIT
21207 rm -rf $DIR/$tdir || error "rm $tdir failed"
21208 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
21209 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
21210 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
21211 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
21212 error "truncate $tdir/trunc failed"
21215 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
21216 error "write $tfile failed"
21218 # multi-client wirtes
21219 local num=$(get_node_count ${CLIENTS//,/ })
21223 echo "Test SOM for multi-client ($num) writes"
21224 touch $DIR/$tfile || error "touch $tfile failed"
21225 $TRUNCATE $DIR/$tfile 0
21226 for client in ${CLIENTS//,/ }; do
21227 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21230 offset=$((offset + $bs))
21232 for (( i=0; i < $num; i++ )); do
21237 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
21238 check_lsom_data $DIR/$tdir/trunc
21239 check_lsom_data $DIR/$tdir/single_dd
21240 check_lsom_data $DIR/$tfile
21243 # Deregistration step
21244 changelog_deregister || error "changelog_deregister failed"
21246 run_test 807 "verify LSOM syncing tool"
21248 check_som_nologged()
21250 local lines=$($LFS changelog $FSNAME-MDT0000 |
21251 grep 'x=trusted.som' | wc -l)
21252 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
21256 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
21257 skip "Need MDS version at least 2.11.55"
21259 # Registration step
21260 changelog_register || error "changelog_register failed"
21262 touch $DIR/$tfile || error "touch $tfile failed"
21265 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
21266 error "write $tfile failed"
21269 $TRUNCATE $DIR/$tfile 1234
21272 $TRUNCATE $DIR/$tfile 1048576
21275 # Deregistration step
21276 changelog_deregister || error "changelog_deregister failed"
21278 run_test 808 "Check trusted.som xattr not logged in Changelogs"
21283 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
21287 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
21288 skip "Need MDS version at least 2.11.56"
21290 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
21291 error "failed to create DoM-only file $DIR/$tfile"
21292 touch $DIR/$tfile || error "touch $tfile failed"
21293 check_som_nodata $DIR/$tfile
21295 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
21296 error "write $tfile failed"
21297 check_som_nodata $DIR/$tfile
21299 $TRUNCATE $DIR/$tfile 1234
21300 check_som_nodata $DIR/$tfile
21302 $TRUNCATE $DIR/$tfile 4097
21303 check_som_nodata $DIR/$file
21305 run_test 809 "Verify no SOM xattr store for DoM-only files"
21308 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21309 $GSS && skip_env "could not run with gss"
21312 stack_trap "set_checksums $ORIG_CSUM" EXIT
21313 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
21318 for csum in $CKSUM_TYPES; do
21319 #define OBD_FAIL_OSC_NO_GRANT 0x411
21320 $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411
21321 for i in "10240 0" "10000 0" "4000 1" "500 1"; do
21323 dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2
21324 before=$(md5sum $DIR/$tfile)
21325 $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear
21326 after=$(md5sum $DIR/$tfile)
21327 [ "$before" == "$after" ] ||
21328 error "$csum: $before != $after bs=$1 seek=$2"
21332 run_test 810 "partial page writes on ZFS (LU-11663)"
21335 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
21336 skip "OST < 2.12.51 doesn't support this fail_loc"
21337 [ "$SHARED_KEY" = true ] &&
21338 skip "OSC connections never go IDLE with Shared-Keys enabled"
21340 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21341 # ensure ost1 is connected
21342 stat $DIR/$tfile >/dev/null || error "can't stat"
21343 wait_osc_import_state client ost1 FULL
21344 # no locks, no reqs to let the connection idle
21345 cancel_lru_locks osc
21347 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
21348 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
21349 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
21350 wait_osc_import_state client ost1 CONNECTING
21351 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
21353 stat $DIR/$tfile >/dev/null || error "can't stat file"
21355 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
21359 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
21360 echo -n y >> $DIR/$tfile
21361 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
21362 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
21364 run_test 814 "sparse cp works as expected (LU-12361)"
21368 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
21369 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
21371 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
21374 [ "$SHARED_KEY" = true ] &&
21375 skip "OSC connections never go IDLE with Shared-Keys enabled"
21377 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21378 # ensure ost1 is connected
21379 stat $DIR/$tfile >/dev/null || error "can't stat"
21380 wait_osc_import_state client ost1 FULL
21381 # no locks, no reqs to let the connection idle
21382 cancel_lru_locks osc
21383 lru_resize_disable osc
21386 before=$($LCTL get_param -n \
21387 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21389 wait_osc_import_state client ost1 IDLE
21390 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
21391 now=$($LCTL get_param -n \
21392 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21393 [ $before == $now ] || error "lru_size changed $before != $now"
21395 run_test 816 "do not reset lru_resize on idle reconnect"
21399 exportfs -u localhost:$DIR/nfsexp
21404 systemctl restart nfs-server.service || skip "failed to restart nfsd"
21406 mkdir -p $DIR/nfsexp
21407 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
21408 error "failed to export nfs"
21410 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
21411 stack_trap cleanup_817 EXIT
21413 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
21414 error "failed to mount nfs to $tmpdir"
21416 cp /bin/true $tmpdir
21417 $DIR/nfsexp/true || error "failed to execute 'true' command"
21419 run_test 817 "nfsd won't cache write lock for exec file"
21422 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21423 cancel_lru_locks osc
21424 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21425 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21426 dd if=$DIR/$tfile of=/dev/null bs=1M count=1
21429 run_test 819a "too big niobuf in read"
21432 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21433 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21434 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21435 cancel_lru_locks osc
21439 run_test 819b "too big niobuf in write"
21443 $LFS setstripe -c1 -i0 $DIR/$tfile
21444 $LFS setstripe -c1 -i1 $DIR/$tfile
21446 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
21447 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
21448 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
21449 error "start $SINGLEMDS failed"
21452 run_test 818 "unlink with failed llog"
21455 # tests that do cleanup/setup should be run at the end
21459 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21462 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
21463 $LCTL set_param fail_loc=0x903
21465 cancel_lru_locks MGC
21467 FAIL_ON_ERROR=true cleanup
21468 FAIL_ON_ERROR=true setup
21470 run_test 900 "umount should not race with any mgc requeue thread"
21474 [ $CLIENT_VERSION -lt $(version_code 2.13.52) ] &&
21475 skip "client does not have LU-13377 fix"
21476 #define OBD_FAIL_LLITE_SHORT_COMMIT 0x1415
21477 $LCTL set_param fail_loc=0x1415
21478 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21479 cancel_lru_locks osc
21482 run_test 902 "test short write doesn't hang lustre"
21485 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
21486 check_and_cleanup_lustre
21487 if [ "$I_MOUNTED" != "yes" ]; then
21488 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true