2 # -*- tab-width: 8; indent-tabs-mode: t; -*-
4 # Run select tests by setting ONLY, or as arguments to the script.
5 # Skip specific tests by setting EXCEPT.
7 # e.g. ONLY="22 23" or ONLY="`seq 32 39`" or EXCEPT="31"
11 # bug number for skipped test: LU-9693 LU-6493 LU-9693 LU-11058
12 ALWAYS_EXCEPT="$SANITY_EXCEPT 42a 42b 42c 77k"
13 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
15 # skipped tests: LU-8411 LU-9096 LU-9054 ..
16 ALWAYS_EXCEPT=" 407 253 312 $ALWAYS_EXCEPT"
19 # bug number for skipped tests: LU-9795 (all below)
20 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 17n 60a 133g 300f"
23 if [[ $(uname -m) = aarch64 ]]; then
24 # bug number: LU-11596 (all below)
25 ALWAYS_EXCEPT+=" 42d 42e 63a 63b 64a 64b 64c"
26 # bug number: LU-11671 LU-11665 LU-11594 LU-11667 LU-11729
27 ALWAYS_EXCEPT+=" 45 101c 103a 317 810"
30 # Check Grants after these tests
31 GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c"
32 SRCDIR=$(cd $(dirname $0); echo $PWD)
33 export PATH=$PATH:/sbin
39 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
40 CREATETEST=${CREATETEST:-createtest}
42 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
44 OPENFILE=${OPENFILE:-openfile}
45 OPENUNLINK=${OPENUNLINK:-openunlink}
46 export MULTIOP=${MULTIOP:-multiop}
47 READS=${READS:-"reads"}
48 MUNLINK=${MUNLINK:-munlink}
49 SOCKETSERVER=${SOCKETSERVER:-socketserver}
50 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
51 MEMHOG=${MEMHOG:-memhog}
52 DIRECTIO=${DIRECTIO:-directio}
53 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
55 CHECK_GRANT=${CHECK_GRANT:-"yes"}
56 GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
57 export PARALLEL=${PARALLEL:-"no"}
59 export NAME=${NAME:-local}
66 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
67 LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
68 . $LUSTRE/tests/test-framework.sh
70 . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh}
74 # skip nfs tests on kernels >= 4.14.0 until they are fixed
75 if [ $LINUX_VERSION_CODE -ge $(version_code 4.14.0) ]; then
76 # bug number: LU-12661
80 # skip cgroup tests on RHEL8.1 kernels until they are fixed
81 if (( $LINUX_VERSION_CODE >= $(version_code 4.18.0) &&
82 $LINUX_VERSION_CODE < $(version_code 5.4.0) )); then
83 # bug number: LU-13063
88 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
90 if [ "$mds1_FSTYPE" = "zfs" ]; then
91 # bug number for skipped test:
92 ALWAYS_EXCEPT="$ALWAYS_EXCEPT "
94 [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
97 # Get the SLES distro version
99 # Returns a version string that should only be used in comparing
100 # strings returned by version_code()
103 local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2)
105 # All SuSE Linux versions have one decimal. version_code expects two
106 local sles_version=$version.0
107 version_code $sles_version
110 # Check if we are running on Ubuntu or SLES so we can make decisions on
112 if [ -r /etc/SuSE-release ]; then
113 sles_version=$(sles_version_code)
114 [ $sles_version -lt $(version_code 11.4.0) ] &&
115 # bug number for skipped test: LU-4341
116 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170"
117 [ $sles_version -lt $(version_code 12.0.0) ] &&
118 # bug number for skipped test: LU-3703
119 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234"
120 elif [ -r /etc/os-release ]; then
121 if grep -qi ubuntu /etc/os-release; then
122 ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
123 -e 's/^VERSION=//p' \
127 if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
128 # bug number for skipped test:
130 ALWAYS_EXCEPT+=" 103a 410"
139 pgrep ll_sa > /dev/null && { echo "There are ll_sa thread not exit!"; exit 20; }
140 cleanupall ${FORCE} $* || { echo "FAILed to clean up"; exit 20; }
149 check_swap_layouts_support()
151 $LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
152 skip "Does not support layout lock."
155 check_and_setup_lustre
159 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
161 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
162 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
163 rm -rf $DIR/[Rdfs][0-9]*
165 # $RUNAS_ID may get set incorrectly somewhere else
166 [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] &&
167 error "\$RUNAS_ID set to 0, but \$UID is also 0!"
169 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
173 if [ "${ONLY}" = "MOUNT" ] ; then
174 echo "Lustre is up, please go on"
178 echo "preparing for tests involving mounts"
179 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
181 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
182 echo # add a newline after mke2fs.
186 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
187 lctl set_param debug=-1 2> /dev/null || true
190 $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
192 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
194 run_test 0a "touch; rm ====================="
197 chmod 0755 $DIR || error "chmod 0755 $DIR failed"
198 $CHECKSTAT -p 0755 $DIR || error "$DIR permission is not 0755"
200 run_test 0b "chmod 0755 $DIR ============================="
203 $LCTL get_param mdc.*.import | grep "state: FULL" ||
204 error "import not FULL"
205 $LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" ||
208 run_test 0c "check import proc"
210 test_0d() { # LU-3397
211 [ $MGS_VERSION -lt $(version_code 2.10.57) ] &&
212 skip "proc exports not supported before 2.10.57"
214 local mgs_exp="mgs.MGS.exports"
215 local client_uuid=$($LCTL get_param -n mgc.*.uuid)
217 local exp_client_version
220 local temp_imp=$DIR/$tfile.import
221 local temp_exp=$DIR/$tfile.export
223 # save mgc import file to $temp_imp
224 $LCTL get_param mgc.*.import | tee $temp_imp
225 # Check if client uuid is found in MGS export
226 for exp_client_nid in $(do_facet mgs $LCTL get_param -N $mgs_exp.*); do
227 [ $(do_facet mgs $LCTL get_param -n $exp_client_nid.uuid) == \
231 # save mgs export file to $temp_exp
232 do_facet mgs $LCTL get_param $exp_client_nid.export | tee $temp_exp
234 # Compare the value of field "connect_flags"
235 imp_val=$(grep "connect_flags" $temp_imp)
236 exp_val=$(grep "connect_flags" $temp_exp)
237 [ "$exp_val" == "$imp_val" ] ||
238 error "export flags '$exp_val' != import flags '$imp_val'"
240 # Compare the value of client version
241 exp_client_version=$(awk '/target_version:/ { print $2 }' $temp_exp)
242 exp_val=$(version_code $exp_client_version)
243 imp_val=$CLIENT_VERSION
244 [ "$exp_val" == "$imp_val" ] ||
245 error "export client version '$exp_val' != '$imp_val'"
247 run_test 0d "check export proc ============================="
250 test_mkdir $DIR/$tdir
251 test_mkdir $DIR/$tdir/d2
252 mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
253 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir"
256 $CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed"
258 run_test 1 "mkdir; remkdir; rmdir"
261 test_mkdir $DIR/$tdir
262 touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed"
263 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
265 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed"
267 run_test 2 "mkdir; touch; rmdir; check file"
270 test_mkdir $DIR/$tdir
271 $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
272 touch $DIR/$tdir/$tfile
273 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
275 $CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed"
277 run_test 3 "mkdir; touch; rmdir; check dir"
279 # LU-4471 - failed rmdir on remote directories still removes directory on MDT0
281 test_mkdir -i 1 $DIR/$tdir
283 touch $DIR/$tdir/$tfile ||
284 error "Create file under remote directory failed"
287 error "Expect error removing in-use dir $DIR/$tdir"
289 test -d $DIR/$tdir || error "Remote directory disappeared"
291 rm -rf $DIR/$tdir || error "remove remote dir error"
293 run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
296 test_mkdir $DIR/$tdir
297 test_mkdir $DIR/$tdir/d2
298 chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed"
299 $CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707"
300 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
302 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2"
305 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
306 chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
307 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
308 error "$tfile does not have perm 0666 or UID $UID"
309 $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
310 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
311 error "$tfile should be 0666 and owned by UID $UID"
313 run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
316 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
319 chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
320 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
321 error "$tfile should be owned by UID $RUNAS_ID"
322 $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
323 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
324 error "$tfile should be owned by UID $RUNAS_ID"
326 run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
329 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
332 chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
333 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
334 error "$tfile should be owned by GID $UID"
335 $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
336 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
337 error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
339 run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)"
342 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
344 test_mkdir $DIR/$tdir
345 chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed"
346 $RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
347 chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed"
348 test_mkdir $DIR/$tdir/d/subdir
349 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir ||
350 error "$tdir/d/subdir should be GID $RUNAS_GID"
351 if [[ $MDSCOUNT -gt 1 ]]; then
352 # check remote dir sgid inherite
353 $LFS mkdir -i 0 $DIR/$tdir.local ||
354 error "mkdir $tdir.local failed"
355 chmod g+s $DIR/$tdir.local ||
356 error "chmod $tdir.local failed"
357 chgrp $RUNAS_GID $DIR/$tdir.local ||
358 error "chgrp $tdir.local failed"
359 $LFS mkdir -i 1 $DIR/$tdir.local/$tdir.remote ||
360 error "mkdir $tdir.remote failed"
361 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir.local/$tdir.remote ||
362 error "$tdir.remote should be owned by $UID.$RUNAS_ID"
363 $CHECKSTAT -p 02755 $DIR/$tdir.local/$tdir.remote ||
364 error "$tdir.remote should be mode 02755"
367 run_test 6g "verify new dir in sgid dir inherits group"
369 test_6h() { # bug 7331
370 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
372 touch $DIR/$tfile || error "touch failed"
373 chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile || error "initial chown failed"
374 $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/$tfile &&
375 error "chown $RUNAS_ID:0 $tfile worked as GID $RUNAS_GID"
376 $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile ||
377 error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID"
379 run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)"
382 test_mkdir $DIR/$tdir
383 $MCREATE $DIR/$tdir/$tfile
384 chmod 0666 $DIR/$tdir/$tfile
385 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
386 error "$tdir/$tfile should be mode 0666"
388 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
391 if [ ! -d $DIR/$tdir ]; then
392 test_mkdir $DIR/$tdir
394 $MCREATE $DIR/$tdir/$tfile
395 echo -n foo > $DIR/$tdir/$tfile
396 [ "$(cat $DIR/$tdir/$tfile)" = "foo" ] || error "$tdir/$tfile not 'foo'"
397 $CHECKSTAT -t file -s 3 $DIR/$tdir/$tfile || error "$tfile size not 3"
399 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
402 test_mkdir $DIR/$tdir
403 touch $DIR/$tdir/$tfile
404 chmod 0666 $DIR/$tdir/$tfile
405 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
406 error "$tfile mode not 0666"
408 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
411 test_mkdir $DIR/$tdir
412 test_mkdir $DIR/$tdir/d2
413 test_mkdir $DIR/$tdir/d2/d3
414 $CHECKSTAT -t dir $DIR/$tdir/d2/d3 || error "$tdir/d2/d3 not a dir"
416 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
419 test_mkdir $DIR/$tdir
420 test_mkdir $DIR/$tdir/d2
421 touch $DIR/$tdir/d2/$tfile
422 $CHECKSTAT -t file $DIR/$tdir/d2/$tfile ||
423 error "$tdir/d2/$tfile not a file"
425 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
428 test_mkdir $DIR/$tdir
429 test_mkdir $DIR/$tdir/d2
430 chmod 0666 $DIR/$tdir/d2
431 chmod 0705 $DIR/$tdir/d2
432 $CHECKSTAT -t dir -p 0705 $DIR/$tdir/d2 ||
433 error "$tdir/d2 mode not 0705"
435 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
438 test_mkdir $DIR/$tdir
439 touch $DIR/$tdir/$tfile
440 chmod 0666 $DIR/$tdir/$tfile
441 chmod 0654 $DIR/$tdir/$tfile
442 $CHECKSTAT -t file -p 0654 $DIR/$tdir/$tfile ||
443 error "$tdir/d2 mode not 0654"
445 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
448 test_mkdir $DIR/$tdir
449 dd if=/dev/zero of=$DIR/$tdir/$tfile count=10
451 $CHECKSTAT -t file -s 0 $DIR/$tdir/$tfile ||
452 error "$tdir/$tfile size not 0 after truncate"
454 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
457 test_mkdir $DIR/$tdir
458 touch $DIR/$tdir/$tfile
460 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
462 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
465 test_mkdir $DIR/$tdir
466 touch $DIR/$tdir/$tfile
467 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
468 $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
469 error "$tdir/${tfile_2} not a file after rename"
470 rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
472 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
475 test_mkdir $DIR/$tdir
476 touch $DIR/$tdir/$tfile
477 rm -rf $DIR/$tdir/$tfile
478 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
480 run_test 16 "touch .../d16/f; rm -rf .../d16/f"
483 test_mkdir $DIR/$tdir
484 touch $DIR/$tdir/$tfile
485 ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist
487 $CHECKSTAT -l $DIR/$tdir/$tfile $DIR/$tdir/l-exist ||
488 error "$tdir/l-exist not a symlink"
489 $CHECKSTAT -f -t f $DIR/$tdir/l-exist ||
490 error "$tdir/l-exist not referencing a file"
491 rm -f $DIR/$tdir/l-exist
492 $CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed"
494 run_test 17a "symlinks: create, remove (real)"
497 test_mkdir $DIR/$tdir
498 ln -s no-such-file $DIR/$tdir/l-dangle
500 $CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle ||
501 error "$tdir/l-dangle not referencing no-such-file"
502 $CHECKSTAT -fa $DIR/$tdir/l-dangle ||
503 error "$tdir/l-dangle not referencing non-existent file"
504 rm -f $DIR/$tdir/l-dangle
505 $CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed"
507 run_test 17b "symlinks: create, remove (dangling)"
509 test_17c() { # bug 3440 - don't save failed open RPC for replay
510 test_mkdir $DIR/$tdir
511 ln -s foo $DIR/$tdir/$tfile
512 cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true
514 run_test 17c "symlinks: open dangling (should return error)"
517 test_mkdir $DIR/$tdir
518 ln -s foo $DIR/$tdir/$tfile
519 touch $DIR/$tdir/$tfile || error "creating to new symlink"
521 run_test 17d "symlinks: create dangling"
524 test_mkdir $DIR/$tdir
525 local foo=$DIR/$tdir/$tfile
526 ln -s $foo $foo || error "create symlink failed"
527 ls -l $foo || error "ls -l failed"
528 ls $foo && error "ls not failed" || true
530 run_test 17e "symlinks: create recursive symlink (should return error)"
533 test_mkdir $DIR/$tdir
534 ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
535 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
536 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
537 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
538 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
539 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/$tdir/666
542 run_test 17f "symlinks: long and very long symlink name"
544 # str_repeat(S, N) generate a string that is string S repeated N times
549 while [ $((n -= 1)) -ge 0 ]; do
555 # Long symlinks and LU-2241
557 test_mkdir $DIR/$tdir
558 local TESTS="59 60 61 4094 4095"
560 # Fix for inode size boundary in 2.1.4
561 [ $MDS1_VERSION -lt $(version_code 2.1.4) ] &&
564 # Patch not applied to 2.2 or 2.3 branches
565 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
566 [ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
569 # skip long symlink name for rhel6.5.
570 # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
571 grep -q '6.5' /etc/redhat-release &>/dev/null &&
572 TESTS="59 60 61 4062 4063"
575 local SYMNAME=$(str_repeat 'x' $i)
576 ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
577 readlink $DIR/$tdir/f$i || error "failed $i-char readlink"
580 run_test 17g "symlinks: really long symlink name and inode boundaries"
582 test_17h() { #bug 17378
583 [ $PARALLEL == "yes" ] && skip "skip parallel run"
584 remote_mds_nodsh && skip "remote MDS with nodsh"
588 test_mkdir $DIR/$tdir
589 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
590 $LFS setstripe -c -1 $DIR/$tdir
591 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
592 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
593 touch $DIR/$tdir/$tfile || true
595 run_test 17h "create objects: lov_free_memmd() doesn't lbug"
597 test_17i() { #bug 20018
598 [ $PARALLEL == "yes" ] && skip "skip parallel run"
599 remote_mds_nodsh && skip "remote MDS with nodsh"
601 local foo=$DIR/$tdir/$tfile
604 test_mkdir -c1 $DIR/$tdir
605 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
606 ln -s $foo $foo || error "create symlink failed"
607 #define OBD_FAIL_MDS_READLINK_EPROTO 0x143
608 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000143
609 ls -l $foo && error "error not detected"
612 run_test 17i "don't panic on short symlink (should return error)"
614 test_17k() { #bug 22301
615 [ $PARALLEL == "yes" ] && skip "skip parallel run"
616 [[ -z "$(which rsync 2>/dev/null)" ]] &&
617 skip "no rsync command"
618 rsync --help | grep -q xattr ||
619 skip_env "$(rsync --version | head -n1) does not support xattrs"
620 test_mkdir $DIR/$tdir
621 test_mkdir $DIR/$tdir.new
622 touch $DIR/$tdir/$tfile
623 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
624 rsync -av -X $DIR/$tdir/ $DIR/$tdir.new ||
625 error "rsync failed with xattrs enabled"
627 run_test 17k "symlinks: rsync with xattrs enabled"
629 test_17l() { # LU-279
630 [[ -z "$(which getfattr 2>/dev/null)" ]] &&
631 skip "no getfattr command"
633 test_mkdir $DIR/$tdir
634 touch $DIR/$tdir/$tfile
635 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
636 for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
637 # -h to not follow symlinks. -m '' to list all the xattrs.
638 # grep to remove first line: '# file: $path'.
639 for xattr in `getfattr -hm '' $path 2>/dev/null | grep -v '^#'`;
641 lgetxattr_size_check $path $xattr ||
642 error "lgetxattr_size_check $path $xattr failed"
646 run_test 17l "Ensure lgetxattr's returned xattr size is consistent"
650 [ $PARALLEL == "yes" ] && skip "skip parallel run"
651 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
652 remote_mds_nodsh && skip "remote MDS with nodsh"
653 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
654 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
655 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
657 local short_sym="0123456789"
658 local wdir=$DIR/$tdir
663 # create a long symlink file
664 for ((i = 0; i < 4; ++i)); do
665 long_sym=${long_sym}${long_sym}
668 echo "create 512 short and long symlink files under $wdir"
669 for ((i = 0; i < 256; ++i)); do
670 ln -sf ${long_sym}"a5a5" $wdir/long-$i
671 ln -sf ${short_sym}"a5a5" $wdir/short-$i
677 wait_delete_completed
679 echo "recreate the 512 symlink files with a shorter string"
680 for ((i = 0; i < 512; ++i)); do
681 # rewrite the symlink file with a shorter string
682 ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed"
683 ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed"
686 local mds_index=$(($($LFS getstripe -m $wdir) + 1))
687 local devname=$(mdsdevname $mds_index)
689 echo "stop and checking mds${mds_index}:"
690 # e2fsck should not return error
692 run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
695 start mds${mds_index} $devname $MDS_MOUNT_OPTS ||
696 error "start mds${mds_index} failed"
697 df $MOUNT > /dev/null 2>&1
699 error "e2fsck detected error for short/long symlink: rc=$rc"
702 run_test 17m "run e2fsck against MDT which contains short/long symlink"
704 check_fs_consistency_17n() {
708 # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
709 # so it only check MDT1/MDT2 instead of all of MDTs.
710 for mdt_index in 1 2; do
711 local devname=$(mdsdevname $mdt_index)
712 # e2fsck should not return error
714 run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
717 start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
718 error "mount mds$mdt_index failed"
719 df $MOUNT > /dev/null 2>&1
725 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
726 [ $PARALLEL == "yes" ] && skip "skip parallel run"
727 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
728 remote_mds_nodsh && skip "remote MDS with nodsh"
729 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
730 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
731 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
735 test_mkdir $DIR/$tdir
736 for ((i=0; i<10; i++)); do
737 $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
738 error "create remote dir error $i"
739 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
740 error "create files under remote dir failed $i"
743 check_fs_consistency_17n ||
744 error "e2fsck report error after create files under remote dir"
746 for ((i = 0; i < 10; i++)); do
747 rm -rf $DIR/$tdir/remote_dir_${i} ||
748 error "destroy remote dir error $i"
751 check_fs_consistency_17n ||
752 error "e2fsck report error after unlink files under remote dir"
754 [ $MDS1_VERSION -lt $(version_code 2.4.50) ] &&
755 skip "lustre < 2.4.50 does not support migrate mv"
757 for ((i = 0; i < 10; i++)); do
758 mkdir -p $DIR/$tdir/remote_dir_${i}
759 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
760 error "create files under remote dir failed $i"
761 $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
762 error "migrate remote dir error $i"
764 check_fs_consistency_17n || error "e2fsck report error after migration"
766 for ((i = 0; i < 10; i++)); do
767 rm -rf $DIR/$tdir/remote_dir_${i} ||
768 error "destroy remote dir error $i"
771 check_fs_consistency_17n || error "e2fsck report error after unlink"
773 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
776 remote_mds_nodsh && skip "remote MDS with nodsh"
777 [ $MDS1_VERSION -lt $(version_code 2.3.64) ] &&
778 skip "Need MDS version at least 2.3.64"
780 local wdir=$DIR/${tdir}o
786 mdt_index=$($LFS getstripe -m $wdir/$tfile)
787 mdt_index=$((mdt_index + 1))
790 #fail mds will wait the failover finish then set
791 #following fail_loc to avoid interfer the recovery process.
794 #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
795 do_facet mds${mdt_index} lctl set_param fail_loc=0x194
796 ls -l $wdir/$tfile && rc=1
797 do_facet mds${mdt_index} lctl set_param fail_loc=0
798 [[ $rc -eq 0 ]] || error "stat file should fail"
800 run_test 17o "stat file with incompat LMA feature"
803 touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
804 ls $DIR || error "Failed to ls $DIR: $?"
806 run_test 18 "touch .../f ; ls ... =============================="
812 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
814 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
817 ls -l $DIR/$tfile && error "ls -l $tfile failed"|| true
819 run_test 19b "ls -l .../f19 (should return error) =============="
822 [ $RUNAS_ID -eq $UID ] &&
823 skip_env "RUNAS_ID = UID = $UID -- skipping"
825 $RUNAS touch $DIR/$tfile && error "create non-root file failed" || true
827 run_test 19c "$RUNAS touch .../f19 (should return error) =="
830 cat $DIR/f19 && error || true
832 run_test 19d "cat .../f19 (should return error) =============="
841 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
843 run_test 20 "touch .../f ; ls -l ..."
846 test_mkdir $DIR/$tdir
847 [ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle
848 ln -s dangle $DIR/$tdir/link
849 echo foo >> $DIR/$tdir/link
850 cat $DIR/$tdir/dangle
851 $CHECKSTAT -t link $DIR/$tdir/link || error "$tdir/link not a link"
852 $CHECKSTAT -f -t file $DIR/$tdir/link ||
853 error "$tdir/link not linked to a file"
855 run_test 21 "write to dangling link"
858 local wdir=$DIR/$tdir
860 chown $RUNAS_ID:$RUNAS_GID $wdir
861 (cd $wdir || error "cd $wdir failed";
862 $RUNAS tar cf - /etc/hosts /etc/sysconfig/network |
864 ls -lR $wdir/etc || error "ls -lR $wdir/etc failed"
865 $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed"
866 $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc ||
867 error "checkstat -u failed"
869 run_test 22 "unpack tar archive as non-root user"
873 test_mkdir $DIR/$tdir
874 local file=$DIR/$tdir/$tfile
876 openfile -f O_CREAT:O_EXCL $file || error "$file create failed"
877 openfile -f O_CREAT:O_EXCL $file &&
878 error "$file recreate succeeded" || true
880 run_test 23a "O_CREAT|O_EXCL in subdir"
882 test_23b() { # bug 18988
883 test_mkdir $DIR/$tdir
884 local file=$DIR/$tdir/$tfile
887 echo foo > $file || error "write filed"
888 echo bar >> $file || error "append filed"
889 $CHECKSTAT -s 8 $file || error "wrong size"
892 run_test 23b "O_APPEND check"
894 # LU-9409, size with O_APPEND and tiny writes
896 local file=$DIR/$tfile
899 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800
900 $CHECKSTAT -s 6400 $file || error "wrong size, expected 6400"
904 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
905 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
907 $CHECKSTAT -s 12800 $file || error "wrong size, expected 12800"
910 #racing tiny & normal writes
911 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4096 count=4 &
912 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=100 &
914 $CHECKSTAT -s 17184 $file || error "wrong size, expected 17184"
917 #racing tiny & normal writes 2, ugly numbers
918 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4099 count=11 &
919 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=17 count=173 &
921 $CHECKSTAT -s 48030 $file || error "wrong size, expected 48030"
924 run_test 23c "O_APPEND size checks for tiny writes"
926 # LU-11069 file offset is correct after appending writes
928 local file=$DIR/$tfile
931 echo CentaurHauls > $file
932 offset=$($MULTIOP $file oO_WRONLY:O_APPEND:w13Zp)
933 if ((offset != 26)); then
934 error "wrong offset, expected 26, got '$offset'"
937 run_test 23d "file offset is correct after appending writes"
941 echo '-- same directory rename'
942 test_mkdir $DIR/$tdir
943 touch $DIR/$tdir/$tfile.1
944 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
945 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
947 run_test 24a "rename file to non-existent target"
950 test_mkdir $DIR/$tdir
951 touch $DIR/$tdir/$tfile.{1,2}
952 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
953 $CHECKSTAT -a $DIR/$tdir/$tfile.1 || error "$tfile.1 exists"
954 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
956 run_test 24b "rename file to existing target"
959 test_mkdir $DIR/$tdir
960 test_mkdir $DIR/$tdir/d$testnum.1
961 mv $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
962 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
963 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
965 run_test 24c "rename directory to non-existent target"
968 test_mkdir -c1 $DIR/$tdir
969 test_mkdir -c1 $DIR/$tdir/d$testnum.1
970 test_mkdir -c1 $DIR/$tdir/d$testnum.2
971 mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
972 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
973 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
975 run_test 24d "rename directory to existing target"
978 echo '-- cross directory renames --'
982 mv $DIR/R5a/f $DIR/R5b/g
983 $CHECKSTAT -a $DIR/R5a/f || error "$DIR/R5a/f exists"
984 $CHECKSTAT -t file $DIR/R5b/g || error "$DIR/R5b/g not file type"
986 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
991 touch $DIR/R6a/f $DIR/R6b/g
992 mv $DIR/R6a/f $DIR/R6b/g
993 $CHECKSTAT -a $DIR/R6a/f || error "$DIR/R6a/f exists"
994 $CHECKSTAT -t file $DIR/R6b/g || error "$DIR/R6b/g not file type"
996 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
1001 test_mkdir $DIR/R7a/d
1002 mv $DIR/R7a/d $DIR/R7b/e
1003 $CHECKSTAT -a $DIR/R7a/d || error "$DIR/R7a/d exists"
1004 $CHECKSTAT -t dir $DIR/R7b/e || error "$DIR/R7b/e not dir type"
1006 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
1009 test_mkdir -c1 $DIR/R8a
1010 test_mkdir -c1 $DIR/R8b
1011 test_mkdir -c1 $DIR/R8a/d
1012 test_mkdir -c1 $DIR/R8b/e
1013 mrename $DIR/R8a/d $DIR/R8b/e
1014 $CHECKSTAT -a $DIR/R8a/d || error "$DIR/R8a/d exists"
1015 $CHECKSTAT -t dir $DIR/R8b/e || error "$DIR/R8b/e not dir type"
1017 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
1020 echo "-- rename error cases"
1022 test_mkdir $DIR/R9/a
1024 mrename $DIR/R9/f $DIR/R9/a
1025 $CHECKSTAT -t file $DIR/R9/f || error "$DIR/R9/f not file type"
1026 $CHECKSTAT -t dir $DIR/R9/a || error "$DIR/R9/a not dir type"
1027 $CHECKSTAT -a $DIR/R9/a/f || error "$DIR/R9/a/f exists"
1029 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
1033 mrename $DIR/R10/f $DIR/R10/g
1034 $CHECKSTAT -t dir $DIR/R10 || error "$DIR/R10 not dir type"
1035 $CHECKSTAT -a $DIR/R10/f || error "$DIR/R10/f exists"
1036 $CHECKSTAT -a $DIR/R10/g || error "$DIR/R10/g exists"
1038 run_test 24j "source does not exist ============================"
1041 test_mkdir $DIR/R11a
1042 test_mkdir $DIR/R11a/d
1044 mv $DIR/R11a/f $DIR/R11a/d
1045 $CHECKSTAT -a $DIR/R11a/f || error "$DIR/R11a/f exists"
1046 $CHECKSTAT -t file $DIR/R11a/d/f || error "$DIR/R11a/d/f not file type"
1048 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
1050 # bug 2429 - rename foo foo foo creates invalid file
1053 $MULTIOP $f OcNs || error "rename of ${f} to itself failed"
1055 run_test 24l "Renaming a file to itself ========================"
1059 $MULTIOP $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
1060 # on ext3 this does not remove either the source or target files
1061 # though the "expected" operation would be to remove the source
1062 $CHECKSTAT -t file ${f} || error "${f} missing"
1063 $CHECKSTAT -t file ${f}2 || error "${f}2 missing"
1065 run_test 24m "Renaming a file to a hard link to itself ========="
1069 # this stats the old file after it was renamed, so it should fail
1071 $CHECKSTAT ${f} || error "${f} missing"
1073 $CHECKSTAT ${f}.rename || error "${f}.rename missing"
1074 $CHECKSTAT -a ${f} || error "${f} exists"
1076 run_test 24n "Statting the old file after renaming (Posix rename 2)"
1079 test_mkdir $DIR/$tdir
1080 rename_many -s random -v -n 10 $DIR/$tdir
1082 run_test 24o "rename of files during htree split"
1085 test_mkdir $DIR/R12a
1086 test_mkdir $DIR/R12b
1087 DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
1088 mrename $DIR/R12a $DIR/R12b
1089 $CHECKSTAT -a $DIR/R12a || error "$DIR/R12a exists"
1090 $CHECKSTAT -t dir $DIR/R12b || error "$DIR/R12b not dir type"
1091 DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
1092 [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
1094 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
1096 cleanup_multiop_pause() {
1098 kill -USR1 $MULTIPID
1102 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1104 test_mkdir $DIR/R13a
1105 test_mkdir $DIR/R13b
1106 local DIRINO=$(ls -lid $DIR/R13a | awk '{ print $1 }')
1107 multiop_bg_pause $DIR/R13b D_c || error "multiop failed to start"
1110 trap cleanup_multiop_pause EXIT
1111 mrename $DIR/R13a $DIR/R13b
1112 $CHECKSTAT -a $DIR/R13a || error "R13a still exists"
1113 $CHECKSTAT -t dir $DIR/R13b || error "R13b does not exist"
1114 local DIRINO2=$(ls -lid $DIR/R13b | awk '{ print $1 }')
1115 [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
1116 cleanup_multiop_pause
1117 wait $MULTIPID || error "multiop close failed"
1119 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
1121 test_24r() { #bug 3789
1122 test_mkdir $DIR/R14a
1123 test_mkdir $DIR/R14a/b
1124 mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
1125 $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
1126 $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
1128 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
1131 test_mkdir $DIR/R15a
1132 test_mkdir $DIR/R15a/b
1133 test_mkdir $DIR/R15a/b/c
1134 mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
1135 $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
1136 $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
1138 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
1140 test_mkdir $DIR/R16a
1141 test_mkdir $DIR/R16a/b
1142 test_mkdir $DIR/R16a/b/c
1143 mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
1144 $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
1145 $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
1147 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
1149 test_24u() { # bug12192
1150 $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error "multiop failed"
1151 $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
1153 run_test 24u "create stripe file"
1155 simple_cleanup_common() {
1158 [ -z "$DIR" -o -z "$tdir" ] && return 0
1160 local start=$SECONDS
1163 wait_delete_completed
1164 echo "cleanup time $((SECONDS - start))"
1168 max_pages_per_rpc() {
1169 local mdtname="$(printf "MDT%04x" ${1:-0})"
1170 $LCTL get_param -n mdc.*$mdtname*.max_pages_per_rpc
1174 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1176 local nrfiles=${COUNT:-100000}
1177 local fname="$DIR/$tdir/$tfile"
1179 # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
1180 [ "$mds1_FSTYPE" = "zfs" ] && nrfiles=${COUNT:-10000}
1182 test_mkdir "$(dirname $fname)"
1183 # assume MDT0000 has the fewest inodes
1184 local stripes=$($LFS getdirstripe -c $(dirname $fname))
1185 local free_inodes=$(($(mdt_free_inodes 0) * stripes))
1186 [[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
1188 trap simple_cleanup_common EXIT
1190 createmany -m "$fname" $nrfiles
1192 cancel_lru_locks mdc
1193 lctl set_param mdc.*.stats clear
1195 # was previously test_24D: LU-6101
1196 # readdir() returns correct number of entries after cursor reload
1197 local num_ls=$(ls $DIR/$tdir | wc -l)
1198 local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l)
1199 local num_all=$(ls -a $DIR/$tdir | wc -l)
1200 if [ $num_ls -ne $nrfiles -o $num_uniq -ne $nrfiles -o \
1201 $num_all -ne $((nrfiles + 2)) ]; then
1202 error "Expected $nrfiles files, got $num_ls " \
1203 "($num_uniq unique $num_all .&..)"
1205 # LU-5 large readdir
1206 # dirent_size = 32 bytes for sizeof(struct lu_dirent) +
1207 # N bytes for name (len($nrfiles) rounded to 8 bytes) +
1208 # 8 bytes for luda_type (4 bytes rounded to 8 bytes)
1209 # take into account of overhead in lu_dirpage header and end mark in
1210 # each page, plus one in rpc_num calculation.
1211 local dirent_size=$((32 + (${#tfile} | 7) + 1 + 8))
1212 local page_entries=$(((PAGE_SIZE - 24) / dirent_size))
1213 local mdt_idx=$($LFS getdirstripe -i $(dirname $fname))
1214 local rpc_pages=$(max_pages_per_rpc $mdt_idx)
1215 local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
1216 local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
1217 echo "readpages: $mds_readpage rpc_max: $rpc_max"
1218 (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
1219 error "large readdir doesn't take effect: " \
1220 "$mds_readpage should be about $rpc_max"
1222 simple_cleanup_common
1224 run_test 24v "list large directory (test hash collision, b=17560)"
1226 test_24w() { # bug21506
1228 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
1229 dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
1230 dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
1231 SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
1232 [[ "$SZ1" -eq "$SZ2" ]] ||
1233 error "Error reading at the end of the file $tfile"
1235 run_test 24w "Reading a file larger than 4Gb"
1238 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1239 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1240 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1241 skip "Need MDS version at least 2.7.56"
1244 local remote_dir=$DIR/$tdir/remote_dir
1246 test_mkdir $DIR/$tdir
1247 $LFS mkdir -i $MDTIDX $remote_dir ||
1248 error "create remote directory failed"
1250 test_mkdir $DIR/$tdir/src_dir
1251 touch $DIR/$tdir/src_file
1252 test_mkdir $remote_dir/tgt_dir
1253 touch $remote_dir/tgt_file
1255 mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
1256 error "rename dir cross MDT failed!"
1258 mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
1259 error "rename file cross MDT failed!"
1261 touch $DIR/$tdir/ln_file
1262 ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
1263 error "ln file cross MDT failed"
1265 rm -rf $DIR/$tdir || error "Can not delete directories"
1267 run_test 24x "cross MDT rename/link"
1270 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1271 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1273 local remote_dir=$DIR/$tdir/remote_dir
1276 test_mkdir $DIR/$tdir
1277 $LFS mkdir -i $mdtidx $remote_dir ||
1278 error "create remote directory failed"
1280 test_mkdir $remote_dir/src_dir
1281 touch $remote_dir/src_file
1282 test_mkdir $remote_dir/tgt_dir
1283 touch $remote_dir/tgt_file
1285 mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
1286 error "rename subdir in the same remote dir failed!"
1288 mrename $remote_dir/src_file $remote_dir/tgt_file ||
1289 error "rename files in the same remote dir failed!"
1291 ln $remote_dir/tgt_file $remote_dir/tgt_file1 ||
1292 error "link files in the same remote dir failed!"
1294 rm -rf $DIR/$tdir || error "Can not delete directories"
1296 run_test 24y "rename/link on the same dir should succeed"
1299 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1300 [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] &&
1301 skip "Need MDS version at least 2.12.51"
1305 for index in 0 1; do
1306 $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed"
1307 touch $DIR/$tdir.0/$tfile.$index || error "touch failed"
1310 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed"
1312 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0)
1313 [ $index -eq 0 ] || error "$tfile.0 is on MDT$index"
1315 local mdts=$(comma_list $(mdts_nodes))
1317 do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0
1318 stack_trap "do_nodes $mdts $LCTL \
1319 set_param mdt.*.enable_remote_rename=1" EXIT
1321 mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed"
1323 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1)
1324 [ $index -eq 1 ] || error "$tfile.1 is on MDT$index"
1326 run_test 24z "cross-MDT rename is done as cp"
1328 test_24A() { # LU-3182
1332 test_mkdir $DIR/$tdir
1333 trap simple_cleanup_common EXIT
1334 createmany -m $DIR/$tdir/$tfile $NFILES
1335 local t=$(ls $DIR/$tdir | wc -l)
1336 local u=$(ls $DIR/$tdir | sort -u | wc -l)
1337 local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
1338 if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then
1339 error "Expected $NFILES files, got $t ($u unique $v .&..)"
1342 simple_cleanup_common || error "Can not delete directories"
1344 run_test 24A "readdir() returns correct number of entries."
1346 test_24B() { # LU-4805
1347 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1351 test_mkdir $DIR/$tdir
1352 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
1353 error "create striped dir failed"
1355 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1356 [ $count -eq 2 ] || error "Expected 2, got $count"
1358 touch $DIR/$tdir/striped_dir/a
1360 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1361 [ $count -eq 3 ] || error "Expected 3, got $count"
1363 touch $DIR/$tdir/striped_dir/.f
1365 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1366 [ $count -eq 4 ] || error "Expected 4, got $count"
1368 rm -rf $DIR/$tdir || error "Can not delete directories"
1370 run_test 24B "readdir for striped dir return correct number of entries"
1373 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1379 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
1380 error "create striped dir failed"
1382 cd $DIR/$tdir/d0/striped_dir
1384 local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
1385 local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
1386 local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1388 [ "$d0_ino" = "$parent_ino" ] ||
1389 error ".. wrong, expect $d0_ino, get $parent_ino"
1391 mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
1392 error "mv striped dir failed"
1394 parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1396 [ "$d1_ino" = "$parent_ino" ] ||
1397 error ".. wrong after mv, expect $d1_ino, get $parent_ino"
1399 run_test 24C "check .. in striped dir"
1402 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
1403 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1406 mkdir $DIR/$tdir/src_dir
1407 $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
1408 error "create remote source failed"
1410 touch $DIR/$tdir/src_dir/src_child/a
1412 $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
1413 error "create remote target dir failed"
1415 $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
1416 error "create remote target child failed"
1418 mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
1419 error "rename dir cross MDT failed!"
1423 $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
1424 error "src_child still exists after rename"
1426 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
1427 error "missing file(a) after rename"
1429 rm -rf $DIR/$tdir || error "Can not delete directories"
1431 run_test 24E "cross MDT rename/link"
1434 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
1437 [ "$SLOW" = "no" ] && repeats=100
1441 echo "$repeats repeats"
1442 for ((i = 0; i < repeats; i++)); do
1443 $LFS mkdir -i0 -c2 $DIR/$tdir/test || error "mkdir fails"
1444 touch $DIR/$tdir/test/a || error "touch fails"
1445 mkdir $DIR/$tdir/test/b || error "mkdir fails"
1446 rm -rf $DIR/$tdir/test || error "rmdir fails"
1451 run_test 24F "hash order vs readdir (LU-11330)"
1454 echo '== symlink sanity ============================================='
1458 touch $DIR/s25/foo ||
1459 error "File creation in symlinked directory failed"
1461 run_test 25a "create file in symlinked directory ==============="
1464 [ ! -d $DIR/d25 ] && test_25a
1465 $CHECKSTAT -t file $DIR/s25/foo || error "$DIR/s25/foo not file type"
1467 run_test 25b "lookup file in symlinked directory ==============="
1471 test_mkdir $DIR/d26/d26-2
1472 ln -s d26/d26-2 $DIR/s26
1473 touch $DIR/s26/foo || error "File creation failed"
1475 run_test 26a "multiple component symlink ======================="
1478 test_mkdir -p $DIR/$tdir/d26-2
1479 ln -s $tdir/d26-2/foo $DIR/s26-2
1480 touch $DIR/s26-2 || error "File creation failed"
1482 run_test 26b "multiple component symlink at end of lookup ======"
1485 test_mkdir $DIR/d26.2
1486 touch $DIR/d26.2/foo
1487 ln -s d26.2 $DIR/s26.2-1
1488 ln -s s26.2-1 $DIR/s26.2-2
1489 ln -s s26.2-2 $DIR/s26.2-3
1490 chmod 0666 $DIR/s26.2-3/foo
1492 run_test 26c "chain of symlinks"
1494 # recursive symlinks (bug 439)
1496 ln -s d26-3/foo $DIR/d26-3
1498 run_test 26d "create multiple component recursive symlink"
1501 [ ! -h $DIR/d26-3 ] && test_26d
1504 run_test 26e "unlink multiple component recursive symlink"
1506 # recursive symlinks (bug 7022)
1508 test_mkdir $DIR/$tdir
1509 test_mkdir $DIR/$tdir/$tfile
1510 cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed"
1511 test_mkdir -p lndir/bar1
1512 test_mkdir $DIR/$tdir/$tfile/$tfile
1513 cd $tfile || error "cd $tfile failed"
1514 ln -s .. dotdot || error "ln dotdot failed"
1515 ln -s dotdot/lndir lndir || error "ln lndir failed"
1516 cd $DIR/$tdir || error "cd $DIR/$tdir failed"
1517 output=`ls $tfile/$tfile/lndir/bar1`
1518 [ "$output" = bar1 ] && error "unexpected output"
1519 rm -r $tfile || error "rm $tfile failed"
1520 $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
1522 run_test 26f "rm -r of a directory which has recursive symlink"
1525 test_mkdir $DIR/$tdir
1526 $LFS getstripe $DIR/$tdir
1527 $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed"
1528 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1529 cp /etc/hosts $DIR/$tdir/$tfile || error "Can't copy to one stripe file"
1531 run_test 27a "one stripe file"
1534 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1536 test_mkdir $DIR/$tdir
1537 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1538 $LFS getstripe -c $DIR/$tdir/$tfile
1539 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
1540 error "two-stripe file doesn't have two stripes"
1542 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1544 run_test 27b "create and write to two stripe file"
1547 test_mkdir $DIR/$tdir
1548 $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
1549 error "setstripe failed"
1550 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1551 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1553 run_test 27d "create file with default settings"
1556 # LU-5839 adds check for existed layout before setting it
1557 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1558 skip "Need MDS version at least 2.7.56"
1560 test_mkdir $DIR/$tdir
1561 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1562 $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice"
1563 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1565 run_test 27e "setstripe existing file (should return error)"
1568 test_mkdir $DIR/$tdir
1569 $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
1570 error "$SETSTRIPE $DIR/$tdir/$tfile failed"
1571 $CHECKSTAT -t file $DIR/$tdir/$tfile &&
1572 error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
1573 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1574 $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed"
1576 run_test 27f "setstripe with bad stripe size (should return error)"
1579 test_mkdir $DIR/$tdir
1580 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1581 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" ||
1582 error "$DIR/$tdir/$tfile has object"
1584 run_test 27g "$LFS getstripe with no objects"
1587 test_mkdir $DIR/$tdir
1588 touch $DIR/$tdir/$tfile || error "touch failed"
1589 ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed"
1590 $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2
1592 (( rc == 2 )) || error "getstripe did not return ENOENT"
1594 run_test 27ga "$LFS getstripe with missing file (should return error)"
1597 test_mkdir $DIR/$tdir
1598 touch $DIR/$tdir/$tfile || error "touch failed"
1599 [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] ||
1600 error "missing objects"
1602 run_test 27i "$LFS getstripe with some objects"
1605 test_mkdir $DIR/$tdir
1606 $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile &&
1607 error "setstripe failed" || true
1609 run_test 27j "setstripe with bad stripe offset (should return error)"
1611 test_27k() { # bug 2844
1612 test_mkdir $DIR/$tdir
1613 local file=$DIR/$tdir/$tfile
1614 local ll_max_blksize=$((4 * 1024 * 1024))
1615 $LFS setstripe -S 67108864 $file || error "setstripe failed"
1616 local blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1617 [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize"
1618 dd if=/dev/zero of=$file bs=4k count=1
1619 blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1620 [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize"
1622 run_test 27k "limit i_blksize for broken user apps"
1625 mcreate $DIR/$tfile || error "creating file"
1626 $RUNAS $LFS setstripe -c 1 $DIR/$tfile &&
1627 error "setstripe should have failed" || true
1629 run_test 27l "check setstripe permissions (should return error)"
1632 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1634 ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
1636 if [[ $ORIGFREE -gt $MAXFREE ]]; then
1637 skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
1639 trap simple_cleanup_common EXIT
1640 test_mkdir $DIR/$tdir
1641 $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
1642 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
1643 error "dd should fill OST0"
1645 while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do
1647 [ $i -gt 256 ] && break
1650 touch $DIR/$tdir/$tfile.$i
1651 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1652 awk '{print $1}'| grep -w "0") ] &&
1653 error "OST0 was full but new created file still use it"
1655 touch $DIR/$tdir/$tfile.$i
1656 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1657 awk '{print $1}'| grep -w "0") ] &&
1658 error "OST0 was full but new created file still use it"
1659 simple_cleanup_common
1661 run_test 27m "create file while OST0 was full"
1664 local delay=$(do_facet $SINGLEMDS lctl get_param -n lo[vd].*.qos_maxage |
1665 awk '{ print $1 * 2; exit; }')
1669 # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage)
1670 # if the OST isn't full anymore.
1672 local OSTIDX=${1:-""}
1674 local list=$(comma_list $(osts_nodes))
1675 [ "$OSTIDX" ] && list=$(facet_host ost$((OSTIDX + 1)))
1677 do_nodes $list lctl set_param fail_loc=0
1678 sync # initiate all OST_DESTROYs from MDS to OST
1682 exhaust_precreations() {
1685 local FAILIDX=${3:-$OSTIDX}
1686 local ofacet=ost$((OSTIDX + 1))
1688 test_mkdir -p -c1 $DIR/$tdir
1689 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
1690 local mfacet=mds$((mdtidx + 1))
1691 echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
1693 local OST=$(ostname_from_index $OSTIDX)
1696 local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST)
1697 local last_id=$(do_facet $mfacet lctl get_param -n \
1698 osp.$mdtosc_proc1.prealloc_last_id)
1699 local next_id=$(do_facet $mfacet lctl get_param -n \
1700 osp.$mdtosc_proc1.prealloc_next_id)
1702 local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet)
1703 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1705 test_mkdir -p $DIR/$tdir/${OST}
1706 $SETSTRIPE -i $OSTIDX -c 1 $DIR/$tdir/${OST}
1707 #define OBD_FAIL_OST_ENOSPC 0x215
1708 do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215
1709 echo "Creating to objid $last_id on ost $OST..."
1710 createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
1711 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1712 do_facet $ofacet lctl set_param fail_loc=$FAILLOC
1716 exhaust_all_precreations() {
1718 for (( i=0; i < OSTCOUNT; i++ )) ; do
1719 exhaust_precreations $i $1 -1
1724 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1725 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1726 remote_mds_nodsh && skip "remote MDS with nodsh"
1727 remote_ost_nodsh && skip "remote OST with nodsh"
1730 rm -f $DIR/$tdir/$tfile
1731 exhaust_precreations 0 0x80000215
1732 $LFS setstripe -c -1 $DIR/$tdir || error "setstripe failed"
1733 touch $DIR/$tdir/$tfile || error "touch failed"
1734 $LFS getstripe $DIR/$tdir/$tfile
1737 run_test 27n "create file with some full OSTs"
1740 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1741 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1742 remote_mds_nodsh && skip "remote MDS with nodsh"
1743 remote_ost_nodsh && skip "remote OST with nodsh"
1746 rm -f $DIR/$tdir/$tfile
1747 exhaust_all_precreations 0x215
1749 touch $DIR/$tdir/$tfile && error "able to create $DIR/$tdir/$tfile"
1754 run_test 27o "create file with all full OSTs (should error)"
1757 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1758 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1759 remote_mds_nodsh && skip "remote MDS with nodsh"
1760 remote_ost_nodsh && skip "remote OST with nodsh"
1763 rm -f $DIR/$tdir/$tfile
1764 test_mkdir $DIR/$tdir
1766 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1767 $TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed"
1768 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1770 exhaust_precreations 0 0x80000215
1771 echo foo >> $DIR/$tdir/$tfile || error "append failed"
1772 $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed"
1773 $LFS getstripe $DIR/$tdir/$tfile
1777 run_test 27p "append to a truncated file with some full OSTs"
1780 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1781 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1782 remote_mds_nodsh && skip "remote MDS with nodsh"
1783 remote_ost_nodsh && skip "remote OST with nodsh"
1786 rm -f $DIR/$tdir/$tfile
1788 test_mkdir $DIR/$tdir
1789 $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
1790 $TRUNCATE $DIR/$tdir/$tfile 80000000 ||
1791 error "truncate $DIR/$tdir/$tfile failed"
1792 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1794 exhaust_all_precreations 0x215
1796 echo foo >> $DIR/$tdir/$tfile && error "append succeeded"
1797 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat 2 failed"
1801 run_test 27q "append to truncated file with all OSTs full (should error)"
1804 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1805 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1806 remote_mds_nodsh && skip "remote MDS with nodsh"
1807 remote_ost_nodsh && skip "remote OST with nodsh"
1810 rm -f $DIR/$tdir/$tfile
1811 exhaust_precreations 0 0x80000215
1813 $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1817 run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
1819 test_27s() { # bug 10725
1820 test_mkdir $DIR/$tdir
1821 local stripe_size=$((4096 * 1024 * 1024)) # 2^32
1822 local stripe_count=0
1823 [ $OSTCOUNT -eq 1 ] || stripe_count=2
1824 $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir &&
1825 error "stripe width >= 2^32 succeeded" || true
1828 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
1830 test_27t() { # bug 10864
1835 $WLFS getstripe $tfile
1838 run_test 27t "check that utils parse path correctly"
1840 test_27u() { # bug 4900
1841 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1842 remote_mds_nodsh && skip "remote MDS with nodsh"
1845 local list=$(comma_list $(mdts_nodes))
1847 #define OBD_FAIL_MDS_OSC_PRECREATE 0x139
1848 do_nodes $list $LCTL set_param fail_loc=0x139
1849 test_mkdir -p $DIR/$tdir
1850 trap simple_cleanup_common EXIT
1851 createmany -o $DIR/$tdir/t- 1000
1852 do_nodes $list $LCTL set_param fail_loc=0
1854 TLOG=$TMP/$tfile.getstripe
1855 $LFS getstripe $DIR/$tdir > $TLOG
1856 OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
1857 unlinkmany $DIR/$tdir/t- 1000
1859 [[ $OBJS -gt 0 ]] &&
1860 error "$OBJS objects created on OST-0. See $TLOG" ||
1863 run_test 27u "skip object creation on OSC w/o objects"
1865 test_27v() { # bug 4900
1866 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1867 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1868 remote_mds_nodsh && skip "remote MDS with nodsh"
1869 remote_ost_nodsh && skip "remote OST with nodsh"
1871 exhaust_all_precreations 0x215
1874 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1876 touch $DIR/$tdir/$tfile
1877 #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
1879 for (( i=1; i < OSTCOUNT; i++ )); do
1880 do_facet ost$i lctl set_param fail_loc=0x705
1882 local START=`date +%s`
1883 createmany -o $DIR/$tdir/$tfile 32
1885 local FINISH=`date +%s`
1886 local TIMEOUT=`lctl get_param -n timeout`
1887 local PROCESS=$((FINISH - START))
1888 [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
1889 error "$FINISH - $START >= $TIMEOUT / 2"
1890 sleep $((TIMEOUT / 2 - PROCESS))
1893 run_test 27v "skip object creation on slow OST"
1895 test_27w() { # bug 10997
1896 test_mkdir $DIR/$tdir
1897 $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
1898 [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
1899 error "stripe size $size != 65536" || true
1900 [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
1901 error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
1903 run_test 27w "check $LFS setstripe -S and getstrip -d options"
1906 [[ $OSTCOUNT -lt 2 ]] &&
1907 skip_env "skipping multiple stripe count/offset test"
1909 test_mkdir $DIR/$tdir
1910 for i in $(seq 1 $OSTCOUNT); do
1912 $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i ||
1913 error "setstripe -c $i -i $offset failed"
1914 count=$($LFS getstripe -c $DIR/$tdir/f$i)
1915 index=$($LFS getstripe -i $DIR/$tdir/f$i)
1916 [ $count -ne $i ] && error "stripe count $count != $i" || true
1917 [ $index -ne $offset ] &&
1918 error "stripe offset $index != $offset" || true
1921 run_test 27wa "check $LFS setstripe -c -i options"
1924 remote_ost_nodsh && skip "remote OST with nodsh"
1925 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1926 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1928 OFFSET=$(($OSTCOUNT - 1))
1930 local OST=$(ostname_from_index $OSTIDX)
1932 test_mkdir $DIR/$tdir
1933 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file
1934 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1
1936 createmany -o $DIR/$tdir/$tfile $OSTCOUNT
1937 for i in $(seq 0 $OFFSET); do
1938 [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx |
1939 awk '{print $1}' | grep -w "$OSTIDX") ] &&
1940 error "OST0 was degraded but new created file still use it"
1942 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0
1944 run_test 27x "create files while OST0 is degraded"
1947 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1948 remote_mds_nodsh && skip "remote MDS with nodsh"
1949 remote_ost_nodsh && skip "remote OST with nodsh"
1950 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1952 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
1953 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
1954 osp.$mdtosc.prealloc_last_id)
1955 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
1956 osp.$mdtosc.prealloc_next_id)
1957 local fcount=$((last_id - next_id))
1958 [[ $fcount -eq 0 ]] && skip "not enough space on OST0"
1959 [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
1961 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
1962 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
1963 local OST_DEACTIVE_IDX=-1
1968 for OSC in $MDS_OSCS; do
1969 OST=$(osc_to_ost $OSC)
1970 OSTIDX=$(index_from_ostuuid $OST)
1971 if [ $OST_DEACTIVE_IDX == -1 ]; then
1972 OST_DEACTIVE_IDX=$OSTIDX
1974 if [ $OSTIDX != $OST_DEACTIVE_IDX ]; then
1975 echo $OSC "is Deactivated:"
1976 do_facet $SINGLEMDS lctl --device %$OSC deactivate
1980 OSTIDX=$(index_from_ostuuid $OST)
1981 test_mkdir $DIR/$tdir
1982 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1984 for OSC in $MDS_OSCS; do
1985 OST=$(osc_to_ost $OSC)
1986 OSTIDX=$(index_from_ostuuid $OST)
1987 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
1988 echo $OST "is degraded:"
1989 do_facet ost$((OSTIDX+1)) lctl set_param -n \
1990 obdfilter.$OST.degraded=1
1995 createmany -o $DIR/$tdir/$tfile $fcount
1997 for OSC in $MDS_OSCS; do
1998 OST=$(osc_to_ost $OSC)
1999 OSTIDX=$(index_from_ostuuid $OST)
2000 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
2001 echo $OST "is recovered from degraded:"
2002 do_facet ost$((OSTIDX+1)) lctl set_param -n \
2003 obdfilter.$OST.degraded=0
2005 do_facet $SINGLEMDS lctl --device %$OSC activate
2009 # all osp devices get activated, hence -1 stripe count restored
2010 local stripe_count=0
2012 # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp
2013 # devices get activated.
2015 $LFS setstripe -c -1 $DIR/$tfile
2016 stripe_count=$($LFS getstripe -c $DIR/$tfile)
2018 [ $stripe_count -ne $OSTCOUNT ] &&
2019 error "Of $OSTCOUNT OSTs, only $stripe_count is available"
2022 run_test 27y "create files while OST0 is degraded and the rest inactive"
2028 lmm_count=$($GETSTRIPE -c $1)
2029 lmm_seq=$($GETSTRIPE -v $1 | awk '/lmm_seq/ { print $2 }')
2030 lmm_oid=$($GETSTRIPE -v $1 | awk '/lmm_object_id/ { print $2 }')
2032 local old_ifs="$IFS"
2034 fid=($($LFS path2fid $1))
2037 log "FID seq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}"
2038 log "LOV seq $lmm_seq, oid $lmm_oid, count: $lmm_count"
2040 # compare lmm_seq and lu_fid->f_seq
2041 [ $lmm_seq = ${fid[1]} ] || { error "SEQ mismatch"; return 1; }
2042 # compare lmm_object_id and lu_fid->oid
2043 [ $lmm_oid = ${fid[2]} ] || { error "OID mismatch"; return 2; }
2045 # check the trusted.fid attribute of the OST objects of the file
2046 local have_obdidx=false
2048 $GETSTRIPE $1 | while read obdidx oid hex seq; do
2049 # skip lines up to and including "obdidx"
2050 [ -z "$obdidx" ] && break
2051 [ "$obdidx" = "obdidx" ] && have_obdidx=true && continue
2052 $have_obdidx || continue
2054 local ost=$((obdidx + 1))
2055 local dev=$(ostdevname $ost)
2058 log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
2060 seq=$(echo $seq | sed -e "s/^0x//g")
2061 if [ $seq == 0 ] || [ $(facet_fstype ost$ost) == zfs ]; then
2062 oid_hex=$(echo $oid)
2064 oid_hex=$(echo $hex | sed -e "s/^0x//g")
2066 local obj_file="O/$seq/d$((oid %32))/$oid_hex"
2070 # Don't unmount/remount the OSTs if we don't need to do that.
2071 # LU-2577 changes filter_fid to be smaller, so debugfs needs
2072 # update too, until that use mount/ll_decode_filter_fid/mount.
2073 # Re-enable when debugfs will understand new filter_fid.
2075 if [ $(facet_fstype ost$ost) == ldiskfs ]; then
2076 ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
2077 $dev 2>/dev/null" | grep "parent=")
2079 if [ -z "$ff" ]; then
2081 mount_fstype ost$ost
2082 ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
2083 $(facet_mntpt ost$ost)/$obj_file)
2084 unmount_fstype ost$ost
2085 start ost$ost $dev $OST_MOUNT_OPTS
2089 [ -z "$ff" ] && error "$obj_file: no filter_fid info"
2091 echo "$ff" | sed -e 's#.*objid=#got: objid=#'
2093 # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
2094 # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
2096 # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \
2097 # stripe_size=1048576 component_id=1 component_start=0 \
2098 # component_end=33554432
2099 local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff)
2100 local ff_pseq=$(cut -d: -f1 <<<$ff_parent)
2101 local ff_poid=$(cut -d: -f2 <<<$ff_parent)
2103 if grep -q 'stripe=' <<<$ff; then
2104 ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff)
2106 # $LL_DECODE_FILTER_FID does not print "stripe="; look
2107 # into f_ver in this case. See comment on ff_parent.
2108 ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//')
2111 # compare lmm_seq and filter_fid->ff_parent.f_seq
2112 [ $ff_pseq = $lmm_seq ] ||
2113 error "FF parent SEQ $ff_pseq != $lmm_seq"
2114 # compare lmm_object_id and filter_fid->ff_parent.f_oid
2115 [ $ff_poid = $lmm_oid ] ||
2116 error "FF parent OID $ff_poid != $lmm_oid"
2117 (($ff_pstripe == $stripe_nr)) ||
2118 error "FF stripe $ff_pstripe != $stripe_nr"
2120 stripe_nr=$((stripe_nr + 1))
2121 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2123 if grep -q 'stripe_count=' <<<$ff; then
2124 local ff_scnt=$(sed -e 's/.*stripe_count=//' \
2125 -e 's/ .*//' <<<$ff)
2126 [ $lmm_count = $ff_scnt ] ||
2127 error "FF stripe count $lmm_count != $ff_scnt"
2133 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2134 remote_ost_nodsh && skip "remote OST with nodsh"
2136 test_mkdir $DIR/$tdir
2137 $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
2138 { error "setstripe -c -1 failed"; return 1; }
2139 # We need to send a write to every object to get parent FID info set.
2140 # This _should_ also work for setattr, but does not currently.
2141 # touch $DIR/$tdir/$tfile-1 ||
2142 dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
2143 { error "dd $tfile-1 failed"; return 2; }
2144 $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
2145 { error "setstripe -c -1 failed"; return 3; }
2146 dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
2147 { error "dd $tfile-2 failed"; return 4; }
2149 # make sure write RPCs have been sent to OSTs
2152 check_seq_oid $DIR/$tdir/$tfile-1 || return 5
2153 check_seq_oid $DIR/$tdir/$tfile-2 || return 6
2155 run_test 27z "check SEQ/OID on the MDT and OST filesystems"
2157 test_27A() { # b=19102
2158 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2160 save_layout_restore_at_exit $MOUNT
2161 $LFS setstripe -c 0 -i -1 -S 0 $MOUNT
2162 wait_update $HOSTNAME "$GETSTRIPE -c $MOUNT | sed 's/ *//g'" "1" 20 ||
2163 error "stripe count $($GETSTRIPE -c $MOUNT) != 1"
2164 local default_size=$($GETSTRIPE -S $MOUNT)
2165 local default_offset=$($GETSTRIPE -i $MOUNT)
2166 local dsize=$(do_facet $SINGLEMDS \
2167 "$LCTL get_param -n lod.$(facet_svc $SINGLEMDS)*.stripesize")
2168 [ $default_size -eq $dsize ] ||
2169 error "stripe size $default_size != $dsize"
2170 [ $default_offset -eq -1 ] ||
2171 error "stripe offset $default_offset != -1"
2173 run_test 27A "check filesystem-wide default LOV EA values"
2175 test_27B() { # LU-2523
2176 test_mkdir $DIR/$tdir
2177 rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
2179 # open f1 with O_LOV_DELAY_CREATE
2181 # call setstripe ioctl on open file descriptor for f1
2183 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:nB1c \
2187 # open f1 with O_LOV_DELAY_CREATE
2189 # call setstripe ioctl on open file descriptor for f1
2191 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:uB1c
2193 # Allow multiop to fail in imitation of NFS's busted semantics.
2196 run_test 27B "call setstripe on open unlinked file/rename victim"
2198 test_27C() { #LU-2871
2199 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2207 test_mkdir $DIR/$tdir
2209 for i in $(seq 0 $((OSTCOUNT - 1))); do
2210 # set stripe across all OSTs starting from OST$i
2211 $SETSTRIPE -i $i -c -1 $tfile$i
2212 # get striping information
2213 ost_idx=($($GETSTRIPE $tfile$i |
2214 tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
2218 [ ${#ost_idx[@]} -eq $OSTCOUNT ] ||
2219 error "${#ost_idx[@]} != $OSTCOUNT"
2221 for index in $(seq 0 $((OSTCOUNT - 1))); do
2223 for j in $(echo ${ost_idx[@]}); do
2224 if [ $index -eq $j ]; then
2230 error "Can not find $index in ${ost_idx[@]}"
2234 run_test 27C "check full striping across all OSTs"
2237 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2238 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2239 remote_mds_nodsh && skip "remote MDS with nodsh"
2241 local POOL=${POOL:-testpool}
2243 local last_ost=$(($OSTCOUNT - 1))
2245 local ost_list=$(seq $first_ost $ost_step $last_ost)
2246 local ost_range="$first_ost $last_ost $ost_step"
2248 test_mkdir $DIR/$tdir
2249 pool_add $POOL || error "pool_add failed"
2250 pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
2253 [ $MDS1_VERSION -lt $(version_code 2.8.55) ] &&
2255 [ $MDS1_VERSION -lt $(version_code 2.9.55) -o \
2256 $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2257 skip27D+=" -s 30,31"
2258 llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
2259 error "llapi_layout_test failed"
2261 destroy_test_pools || error "destroy test pools failed"
2263 run_test 27D "validate llapi_layout API"
2265 # Verify that default_easize is increased from its initial value after
2266 # accessing a widely striped file.
2268 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2269 [ $CLIENT_VERSION -lt $(version_code 2.5.57) ] &&
2270 skip "client does not have LU-3338 fix"
2272 # 72 bytes is the minimum space required to store striping
2273 # information for a file striped across one OST:
2274 # (sizeof(struct lov_user_md_v3) +
2275 # sizeof(struct lov_user_ost_data_v1))
2277 $LCTL set_param -n llite.*.default_easize $min_easize ||
2278 error "lctl set_param failed"
2279 local easize=$($LCTL get_param -n llite.*.default_easize)
2281 [ $easize -eq $min_easize ] ||
2282 error "failed to set default_easize"
2284 $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
2285 error "setstripe failed"
2289 easize=$($LCTL get_param -n llite.*.default_easize)
2291 [ $easize -gt $min_easize ] ||
2292 error "default_easize not updated"
2294 run_test 27E "check that default extended attribute size properly increases"
2296 test_27F() { # LU-5346/LU-7975
2297 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2298 [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs"
2299 [[ $MDS1_VERSION -lt $(version_code 2.8.51) ]] &&
2300 skip "Need MDS version at least 2.8.51"
2301 remote_ost_nodsh && skip "remote OST with nodsh"
2303 test_mkdir $DIR/$tdir
2305 $SETSTRIPE -c 2 $DIR/$tdir
2307 # stop all OSTs to reproduce situation for LU-7975 ticket
2308 for num in $(seq $OSTCOUNT); do
2312 # open/create f0 with O_LOV_DELAY_CREATE
2313 # truncate f0 to a non-0 size
2315 multiop $DIR/$tdir/f0 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T1050000c
2317 $CHECKSTAT -s 1050000 $DIR/$tdir/f0 || error "checkstat failed"
2318 # open/write it again to force delayed layout creation
2319 cat /etc/hosts > $DIR/$tdir/f0 &
2323 for num in $(seq $OSTCOUNT); do
2324 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS ||
2325 error "ost$num failed to start"
2328 wait $catpid || error "cat failed"
2330 cmp /etc/hosts $DIR/$tdir/f0 || error "cmp failed"
2331 [[ $($GETSTRIPE -c $DIR/$tdir/f0) == 2 ]] || error "wrong stripecount"
2334 run_test 27F "Client resend delayed layout creation with non-zero size"
2336 test_27G() { #LU-10629
2337 [ $MDS1_VERSION -lt $(version_code 2.11.51) ] &&
2338 skip "Need MDS version at least 2.11.51"
2339 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2340 remote_mds_nodsh && skip "remote MDS with nodsh"
2341 local POOL=${POOL:-testpool}
2342 local ostrange="0 0 1"
2344 test_mkdir $DIR/$tdir
2345 pool_add $POOL || error "pool_add failed"
2346 pool_add_targets $POOL $ostrange || error "pool_add_targets failed"
2347 $LFS setstripe -p $POOL $DIR/$tdir
2349 local pool=$($LFS getstripe -p $DIR/$tdir)
2351 [ "$pool" = "$POOL" ] || error "Striping failed got '$pool' not '$POOL'"
2353 $LFS setstripe -d $DIR/$tdir
2355 pool=$($LFS getstripe -p $DIR/$tdir)
2359 [ -z "$pool" ] || error "'$pool' is not empty"
2361 run_test 27G "Clear OST pool from stripe"
2364 [[ $MDS1_VERSION -le $(version_code 2.11.54) ]] &&
2365 skip "Need MDS version newer than 2.11.54"
2366 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
2367 test_mkdir $DIR/$tdir
2368 $LFS setstripe -o 0 -o 2 $DIR/$tdir || error "setstripe failed"
2369 touch $DIR/$tdir/$tfile
2370 $LFS getstripe -c $DIR/$tdir/$tfile
2371 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
2372 error "two-stripe file doesn't have two stripes"
2374 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
2375 $LFS getstripe -y $DIR/$tdir/$tfile
2376 (( $($LFS getstripe -y $DIR/$tdir/$tfile |
2377 egrep -c "l_ost_idx: [02]$") == "2" )) ||
2378 error "expected l_ost_idx: [02]$ not matched"
2380 # make sure ost list have been cleared
2381 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
2382 $LFS setstripe -S $((stripesize * 4)) -i 1 \
2383 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
2385 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
2387 run_test 27H "Set specific OSTs stripe"
2390 [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.12.57) ]] &&
2391 skip "Need MDS version >= than 2.12.57"
2392 remote_mds_nodsh && skip "remote MDS with nodsh"
2393 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2395 test_mkdir $DIR/$tdir
2397 # Set default striping on directory
2398 $LFS setstripe -C 4 $DIR/$tdir
2400 echo 1 > $DIR/$tdir/${tfile}.1
2401 local count=$($LFS getstripe -c $DIR/$tdir/${tfile}.1)
2403 [ $count -eq $setcount ] ||
2404 error "(1) stripe count $count, should be $setcount"
2406 # Capture existing append_stripe_count setting for restore
2407 local orig_count=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_stripe_count)
2408 local mdts=$(comma_list $(mdts_nodes))
2409 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=$orig_count" EXIT
2411 local appendcount=$orig_count
2412 echo 1 >> $DIR/$tdir/${tfile}.2_append
2413 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.2_append)
2414 [ $count -eq $appendcount ] ||
2415 error "(2)stripe count $count, should be $appendcount for append"
2417 # Disable O_APPEND striping, verify it works
2418 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2420 # Should now get the default striping, which is 4
2422 echo 1 >> $DIR/$tdir/${tfile}.3_append
2423 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.3_append)
2424 [ $count -eq $setcount ] ||
2425 error "(3) stripe count $count, should be $setcount"
2427 # Try changing the stripe count for append files
2428 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=2
2430 # Append striping is now 2 (directory default is still 4)
2432 echo 1 >> $DIR/$tdir/${tfile}.4_append
2433 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.4_append)
2434 [ $count -eq $appendcount ] ||
2435 error "(4) stripe count $count, should be $appendcount for append"
2437 # Test append stripe count of -1
2438 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=-1
2439 appendcount=$OSTCOUNT
2440 echo 1 >> $DIR/$tdir/${tfile}.5
2441 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.5)
2442 [ $count -eq $appendcount ] ||
2443 error "(5) stripe count $count, should be $appendcount for append"
2445 # Set append striping back to default of 1
2446 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=1
2448 # Try a new default striping, PFL + DOM
2449 $LFS setstripe -L mdt -E 1M -E -1 -c 2 $DIR/$tdir
2451 # Create normal DOM file, DOM returns stripe count == 0
2453 touch $DIR/$tdir/${tfile}.6
2454 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.6)
2455 [ $count -eq $setcount ] ||
2456 error "(6) stripe count $count, should be $setcount"
2460 echo 1 >> $DIR/$tdir/${tfile}.7_append
2461 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.7_append)
2462 [ $count -eq $appendcount ] ||
2463 error "(7) stripe count $count, should be $appendcount for append"
2465 # Clean up DOM layout
2466 $LFS setstripe -d $DIR/$tdir
2468 # Now test that append striping works when layout is from root
2469 $LFS setstripe -c 2 $MOUNT
2470 # Make a special directory for this
2471 mkdir $DIR/${tdir}/${tdir}.2
2472 stack_trap "$LFS setstripe -d $MOUNT" EXIT
2474 # Verify for normal file
2476 echo 1 > $DIR/${tdir}/${tdir}.2/${tfile}.8
2477 count=$($LFS getstripe -c $DIR/$tdir/${tdir}.2/${tfile}.8)
2478 [ $count -eq $setcount ] ||
2479 error "(8) stripe count $count, should be $setcount"
2482 echo 1 >> $DIR/${tdir}/${tdir}.2/${tfile}.9_append
2483 count=$($LFS getstripe -c $DIR/${tdir}/${tdir}.2/${tfile}.9_append)
2484 [ $count -eq $appendcount ] ||
2485 error "(9) stripe count $count, should be $appendcount for append"
2487 # Now test O_APPEND striping with pools
2488 do_nodes $mdts $LCTL set_param mdd.*.append_pool="$TESTNAME"
2489 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'" EXIT
2492 pool_add $TESTNAME || error "pool creation failed"
2493 pool_add_targets $TESTNAME 0 1 || error "Pool add targets failed"
2495 echo 1 >> $DIR/$tdir/${tfile}.10_append
2497 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.10_append)
2498 [ "$pool" = "$TESTNAME" ] || error "(10) incorrect pool: $pool"
2500 # Check that count is still correct
2502 echo 1 >> $DIR/$tdir/${tfile}.11_append
2503 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.11_append)
2504 [ $count -eq $appendcount ] ||
2505 error "(11) stripe count $count, should be $appendcount for append"
2507 # Disable O_APPEND stripe count, verify pool works separately
2508 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2510 echo 1 >> $DIR/$tdir/${tfile}.12_append
2512 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.12_append)
2513 [ "$pool" = "$TESTNAME" ] || error "(12) incorrect pool: $pool"
2515 # Remove pool setting, verify it's not applied
2516 do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'
2518 echo 1 >> $DIR/$tdir/${tfile}.13_append
2520 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.13_append)
2521 [ "$pool" = "" ] || error "(13) pool found: $pool"
2523 run_test 27M "test O_APPEND striping"
2525 # createtest also checks that device nodes are created and
2526 # then visible correctly (#2091)
2527 test_28() { # bug 2091
2529 $CREATETEST $DIR/d28/ct || error "createtest failed"
2531 run_test 28 "create/mknod/mkdir with bad file types ============"
2534 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2536 sync; sleep 1; sync # flush out any dirty pages from previous tests
2543 declare -i LOCKCOUNTORIG=0
2544 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2545 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
2547 [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
2549 declare -i LOCKUNUSEDCOUNTORIG=0
2550 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2551 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
2558 declare -i LOCKCOUNTCURRENT=0
2559 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2560 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
2563 declare -i LOCKUNUSEDCOUNTCURRENT=0
2564 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2565 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
2568 if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
2569 $LCTL set_param -n ldlm.dump_namespaces ""
2570 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
2571 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2572 log "dumped log to $TMP/test_29.dk (bug 5793)"
2575 if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
2576 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
2577 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2578 log "dumped log to $TMP/test_29.dk (bug 5793)"
2582 run_test 29 "IT_GETATTR regression ============================"
2584 test_30a() { # was test_30
2585 cp $(which ls) $DIR || cp /bin/ls $DIR
2586 $DIR/ls / || error "Can't execute binary from lustre"
2589 run_test 30a "execute binary from Lustre (execve) =============="
2592 cp `which ls` $DIR || cp /bin/ls $DIR
2594 $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
2597 run_test 30b "execute binary from Lustre as non-root ==========="
2599 test_30c() { # b=22376
2600 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2602 cp `which ls` $DIR || cp /bin/ls $DIR
2604 cancel_lru_locks mdc
2605 cancel_lru_locks osc
2606 $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
2609 run_test 30c "execute binary from Lustre without read perms ===="
2612 $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
2613 $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
2615 run_test 31a "open-unlink file =================================="
2618 touch $DIR/f31 || error "touch $DIR/f31 failed"
2619 ln $DIR/f31 $DIR/f31b || error "ln failed"
2620 $MULTIOP $DIR/f31b Ouc || error "multiop failed"
2621 $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
2623 run_test 31b "unlink file with multiple links while open ======="
2626 touch $DIR/f31 || error "touch $DIR/f31 failed"
2627 ln $DIR/f31 $DIR/f31c || error "ln failed"
2628 multiop_bg_pause $DIR/f31 O_uc ||
2629 error "multiop_bg_pause for $DIR/f31 failed"
2631 $MULTIOP $DIR/f31c Ouc
2632 kill -USR1 $MULTIPID
2635 run_test 31c "open-unlink file with multiple links ============="
2638 opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
2639 $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
2641 run_test 31d "remove of open directory ========================="
2643 test_31e() { # bug 2904
2644 openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
2646 run_test 31e "remove of open non-empty directory ==============="
2648 test_31f() { # bug 4554
2649 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2652 test_mkdir $DIR/d31f
2653 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2654 cp /etc/hosts $DIR/d31f
2656 $GETSTRIPE $DIR/d31f/hosts
2657 multiop_bg_pause $DIR/d31f D_c || return 1
2660 rm -rv $DIR/d31f || error "first of $DIR/d31f"
2661 test_mkdir $DIR/d31f
2662 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2663 cp /etc/hosts $DIR/d31f
2665 $GETSTRIPE $DIR/d31f/hosts
2666 multiop_bg_pause $DIR/d31f D_c || return 1
2669 kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
2670 wait $MULTIPID || error "first opendir $MULTIPID failed"
2674 kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
2675 wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
2678 run_test 31f "remove of open directory with open-unlink file ==="
2681 echo "-- cross directory link --"
2682 test_mkdir -c1 $DIR/${tdir}ga
2683 test_mkdir -c1 $DIR/${tdir}gb
2684 touch $DIR/${tdir}ga/f
2685 ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
2686 $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
2687 [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
2688 $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
2689 [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
2691 run_test 31g "cross directory link==============="
2694 echo "-- cross directory link --"
2695 test_mkdir -c1 $DIR/${tdir}
2696 test_mkdir -c1 $DIR/${tdir}/dir
2697 touch $DIR/${tdir}/f
2698 ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
2699 $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
2700 [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
2701 $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
2702 [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
2704 run_test 31h "cross directory link under child==============="
2707 echo "-- cross directory link --"
2708 test_mkdir -c1 $DIR/$tdir
2709 test_mkdir -c1 $DIR/$tdir/dir
2710 touch $DIR/$tdir/dir/f
2711 ln $DIR/$tdir/dir/f $DIR/$tdir/g
2712 $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
2713 [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
2714 $CHECKSTAT -t file $DIR/$tdir/g || error "target"
2715 [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
2717 run_test 31i "cross directory link under parent==============="
2720 test_mkdir -c1 -p $DIR/$tdir
2721 test_mkdir -c1 -p $DIR/$tdir/dir1
2722 ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
2723 link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
2724 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
2725 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
2728 run_test 31j "link for directory==============="
2731 test_mkdir -c1 -p $DIR/$tdir
2733 touch $DIR/$tdir/exist
2734 mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
2735 mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
2736 mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
2737 mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
2738 mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
2739 mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
2740 mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
2743 run_test 31k "link to file: the same, non-existing, dir==============="
2749 touch $DIR/d31m2/exist
2750 mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
2751 mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
2752 mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
2753 mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
2754 mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
2755 mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
2758 run_test 31m "link to file: the same, non-existing, dir==============="
2761 touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
2762 nlink=$(stat --format=%h $DIR/$tfile)
2763 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2765 local cmd="exec $fd<$DIR/$tfile"
2768 trap "eval $cmd" EXIT
2769 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2770 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2771 rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
2772 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2773 [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
2776 run_test 31n "check link count of unlinked file"
2779 local TEMPNAME=$(mktemp $1_XXXXXX)
2780 mlink $TEMPNAME $1 2> /dev/null &&
2781 echo "$BASHPID: link $TEMPNAME to $1 succeeded"
2785 test_31o() { # LU-2901
2786 test_mkdir $DIR/$tdir
2787 for LOOP in $(seq 100); do
2788 rm -f $DIR/$tdir/$tfile*
2789 for THREAD in $(seq 8); do
2790 link_one $DIR/$tdir/$tfile.$LOOP &
2793 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
2794 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
2795 error "$LINKS duplicate links to $tfile.$LOOP" &&
2799 run_test 31o "duplicate hard links with same filename"
2802 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
2804 test_mkdir $DIR/$tdir
2805 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
2806 $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
2808 opendirunlink $DIR/$tdir/striped_dir/test1 ||
2809 error "open unlink test1 failed"
2810 opendirunlink $DIR/$tdir/striped_dir/test2 ||
2811 error "open unlink test2 failed"
2813 $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
2814 error "test1 still exists"
2815 $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
2816 error "test2 still exists"
2818 run_test 31p "remove of open striped directory"
2820 cleanup_test32_mount() {
2823 local loopdev=$(losetup -a | grep $EXT2_DEV | sed -ne 's/:.*$//p')
2824 $UMOUNT $DIR/$tdir/ext2-mountpoint || rc=$?
2825 losetup -d $loopdev || true
2831 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2833 echo "== more mountpoints and symlinks ================="
2834 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2835 trap cleanup_test32_mount EXIT
2836 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2837 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2838 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2839 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/.. ||
2840 error "$DIR/$tdir/ext2-mountpoint/.. not dir type"
2841 cleanup_test32_mount
2843 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
2846 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2848 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2849 trap cleanup_test32_mount EXIT
2850 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2851 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2852 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2853 ls -al $DIR/$tdir/ext2-mountpoint/.. ||
2854 error "Can't list $DIR/$tdir/ext2-mountpoint/.."
2855 cleanup_test32_mount
2857 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
2860 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2862 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2863 trap cleanup_test32_mount EXIT
2864 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2865 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2866 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2867 test_mkdir -p $DIR/$tdir/d2/test_dir
2868 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2869 error "$DIR/$tdir/ext2-mountpoint/../d2/test_dir not dir type"
2870 cleanup_test32_mount
2872 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
2875 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2877 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2878 trap cleanup_test32_mount EXIT
2879 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2880 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2881 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2882 test_mkdir -p $DIR/$tdir/d2/test_dir
2883 ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2884 error "Can't list $DIR/$tdir/ext2-mountpoint/../d2/test_dir"
2885 cleanup_test32_mount
2887 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
2891 test_mkdir -p $DIR/$tdir/tmp
2892 local tmp_dir=$DIR/$tdir/tmp
2893 ln -s $DIR/$tdir $tmp_dir/symlink11
2894 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2895 $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2896 $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
2898 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
2902 test_mkdir -p $DIR/$tdir/tmp
2903 local tmp_dir=$DIR/$tdir/tmp
2904 ln -s $DIR/$tdir $tmp_dir/symlink11
2905 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2906 ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2907 ls $DIR/$tdir/symlink01 || error "symlink01 bad"
2909 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
2912 local tmp_dir=$DIR/$tdir/tmp
2913 test_mkdir -p $tmp_dir
2914 test_mkdir $DIR/${tdir}2
2915 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2916 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2917 $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
2918 $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
2919 $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
2920 $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
2922 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2925 rm -fr $DIR/$tdir $DIR/${tdir}2
2926 tmp_dir=$DIR/$tdir/tmp
2927 test_mkdir -p $tmp_dir
2928 test_mkdir $DIR/${tdir}2
2929 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2930 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2931 ls $tmp_dir/symlink12 || error "listing symlink12"
2932 ls $DIR/$tdir/symlink02 || error "listing symlink02"
2934 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2937 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2939 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2940 trap cleanup_test32_mount EXIT
2941 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2942 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2943 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2944 touch $DIR/$tdir/test_file
2945 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../test_file ||
2946 error "$DIR/$tdir/ext2-mountpoint/../test_file not file type"
2947 cleanup_test32_mount
2949 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
2952 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2954 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2955 trap cleanup_test32_mount EXIT
2956 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2957 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2958 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2959 touch $DIR/$tdir/test_file
2960 cat $DIR/$tdir/ext2-mountpoint/../test_file ||
2961 error "Can't open $DIR/$tdir/ext2-mountpoint/../test_file"
2962 cleanup_test32_mount
2964 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
2967 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2970 trap cleanup_test32_mount EXIT
2971 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2972 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2973 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2974 test_mkdir -p $DIR/$tdir/d2
2975 touch $DIR/$tdir/d2/test_file || error "touch failed"
2976 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2977 error "$DIR/$tdir/ext2-mountpoint/../d2/test_file not file type"
2978 cleanup_test32_mount
2980 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
2983 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2986 trap cleanup_test32_mount EXIT
2987 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2988 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2989 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2990 test_mkdir -p $DIR/$tdir/d2
2991 touch $DIR/$tdir/d2/test_file || error "touch failed"
2992 cat $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2993 error "Can't open $DIR/$tdir/ext2-mountpoint/../d2/test_file"
2994 cleanup_test32_mount
2996 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
3000 test_mkdir -p $DIR/d32m/tmp
3001 TMP_DIR=$DIR/d32m/tmp
3002 ln -s $DIR $TMP_DIR/symlink11
3003 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3004 $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 ||
3005 error "symlink11 not a link"
3006 $CHECKSTAT -t link $DIR/d32m/symlink01 ||
3007 error "symlink01 not a link"
3009 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
3013 test_mkdir -p $DIR/d32n/tmp
3014 TMP_DIR=$DIR/d32n/tmp
3015 ln -s $DIR $TMP_DIR/symlink11
3016 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3017 ls -l $DIR/d32n/tmp/symlink11 || error "listing symlink11"
3018 ls -l $DIR/d32n/symlink01 || error "listing symlink01"
3020 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
3024 test_mkdir -p $DIR/d32o/tmp
3025 TMP_DIR=$DIR/d32o/tmp
3026 ln -s $DIR/$tfile $TMP_DIR/symlink12
3027 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3028 $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 ||
3029 error "symlink12 not a link"
3030 $CHECKSTAT -t link $DIR/d32o/symlink02 || error "symlink02 not a link"
3031 $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 ||
3032 error "$DIR/d32o/tmp/symlink12 not file type"
3033 $CHECKSTAT -t file -f $DIR/d32o/symlink02 ||
3034 error "$DIR/d32o/symlink02 not file type"
3036 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
3046 test_mkdir -p $DIR/d32p/tmp
3048 TMP_DIR=$DIR/d32p/tmp
3050 ln -s $DIR/$tfile $TMP_DIR/symlink12
3052 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3054 cat $DIR/d32p/tmp/symlink12 ||
3055 error "Can't open $DIR/d32p/tmp/symlink12"
3057 cat $DIR/d32p/symlink02 || error "Can't open $DIR/d32p/symlink02"
3060 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
3063 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3065 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3066 trap cleanup_test32_mount EXIT
3067 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3068 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3069 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3070 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3071 ls $DIR/$tdir/ext2-mountpoint | grep "\<under_the_mount\>" && error
3072 cleanup_test32_mount
3074 run_test 32q "stat follows mountpoints in Lustre (should return error)"
3077 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3079 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3080 trap cleanup_test32_mount EXIT
3081 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3082 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3083 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3084 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3085 ls $DIR/$tdir/ext2-mountpoint | grep -q under_the_mount && error || true
3086 cleanup_test32_mount
3088 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
3093 chmod 444 $DIR/$tfile
3094 chown $RUNAS_ID $DIR/$tfile
3096 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3099 run_test 33aa "write file with mode 444 (should return error)"
3103 test_mkdir $DIR/$tdir
3104 chown $RUNAS_ID $DIR/$tdir
3105 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
3106 error "$RUNAS create $tdir/$tfile failed"
3107 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
3108 error "open RDWR" || true
3110 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
3114 test_mkdir $DIR/$tdir
3115 chown $RUNAS_ID $DIR/$tdir
3116 $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
3118 run_test 33b "test open file with malformed flags (No panic)"
3121 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3122 remote_ost_nodsh && skip "remote OST with nodsh"
3131 test_mkdir $DIR/$tdir
3132 # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
3135 for ostnum in $(seq $OSTCOUNT); do
3136 # test-framework's OST numbering is one-based, while Lustre's
3138 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3139 # Parsing llobdstat's output sucks; we could grep the /proc
3140 # path, but that's likely to not be as portable as using the
3141 # llobdstat utility. So we parse lctl output instead.
3142 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3143 obdfilter/$ostname/stats |
3144 awk '/^write_bytes/ {print $7}' )
3145 echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes"
3146 if (( ${write_bytes:-0} > 0 ))
3153 $all_zeros || return 0
3156 echo foo > $DIR/$tdir/bar
3160 # Total up write_bytes after writing. We'd better find non-zeros.
3161 for ostnum in $(seq $OSTCOUNT); do
3162 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3163 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3164 obdfilter/$ostname/stats |
3165 awk '/^write_bytes/ {print $7}' )
3166 echo "write_bytes@$OSTnum/$ostname=$write_bytes"
3167 if (( ${write_bytes:-0} > 0 ))
3176 for ostnum in $(seq $OSTCOUNT); do
3177 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3178 echo "Check that write_bytes is present in obdfilter/*/stats:"
3179 do_facet ost$ostnum lctl get_param -n \
3180 obdfilter/$ostname/stats
3182 error "OST not keeping write_bytes stats (b22312)"
3185 run_test 33c "test llobdstat and write_bytes"
3188 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3189 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3192 local remote_dir=$DIR/$tdir/remote_dir
3194 test_mkdir $DIR/$tdir
3195 $LFS mkdir -i $MDTIDX $remote_dir ||
3196 error "create remote directory failed"
3198 touch $remote_dir/$tfile
3199 chmod 444 $remote_dir/$tfile
3200 chown $RUNAS_ID $remote_dir/$tfile
3202 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3204 chown $RUNAS_ID $remote_dir
3205 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
3206 error "create" || true
3207 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
3208 error "open RDWR" || true
3209 $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
3211 run_test 33d "openfile with 444 modes and malformed flags under remote dir"
3214 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3218 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3219 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3220 mkdir $DIR/$tdir/local_dir
3222 local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3223 local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3224 local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3226 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3227 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
3229 rmdir $DIR/$tdir/* || error "rmdir failed"
3232 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3233 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3234 mkdir $DIR/$tdir/local_dir
3236 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3237 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3238 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3240 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3241 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
3243 rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
3246 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3247 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3248 mkdir $DIR/$tdir/local_dir
3250 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3251 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3252 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3254 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3255 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
3257 run_test 33e "mkdir and striped directory should have same mode"
3261 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
3265 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3266 remote_mds_nodsh && skip "remote MDS with nodsh"
3269 chmod go+rwx $DIR/$tdir
3270 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
3271 trap cleanup_33f EXIT
3273 $RUNAS lfs mkdir -i 0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
3274 error "cannot create striped directory"
3276 $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
3277 error "cannot create files in striped directory"
3279 $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
3280 error "cannot remove files in striped directory"
3282 $RUNAS rmdir $DIR/$tdir/striped_dir ||
3283 error "cannot remove striped directory"
3287 run_test 33f "nonroot user can create, access, and remove a striped directory"
3290 mkdir -p $DIR/$tdir/dir2
3292 local err=$($RUNAS mkdir $DIR/$tdir/dir2 2>&1)
3294 [[ $err =~ "exists" ]] || error "Not exists error"
3296 run_test 33g "nonroot user create already existing root created file"
3298 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
3301 $MCREATE $DIR/f34 || error "mcreate failed"
3302 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3303 error "getstripe failed"
3304 $TRUNCATE $DIR/f34 $TEST_34_SIZE || error "truncate failed"
3305 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3306 error "getstripe failed"
3307 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3308 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3310 run_test 34a "truncate file that has not been opened ==========="
3313 [ ! -f $DIR/f34 ] && test_34a
3314 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3315 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3316 $OPENFILE -f O_RDONLY $DIR/f34
3317 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3318 error "getstripe failed"
3319 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3320 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3322 run_test 34b "O_RDONLY opening file doesn't create objects ====="
3325 [ ! -f $DIR/f34 ] && test_34a
3326 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3327 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3328 $OPENFILE -f O_RDWR $DIR/f34
3329 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" && error
3330 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3331 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3333 run_test 34c "O_RDWR opening file-with-size works =============="
3336 [ ! -f $DIR/f34 ] && test_34a
3337 dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 ||
3339 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3340 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3343 run_test 34d "write to sparse file ============================="
3347 $MCREATE $DIR/f34e || error "mcreate failed"
3348 $TRUNCATE $DIR/f34e 1000 || error "truncate failed"
3349 $CHECKSTAT -s 1000 $DIR/f34e ||
3350 error "Size of $DIR/f34e not equal to 1000 bytes"
3351 $OPENFILE -f O_RDWR $DIR/f34e
3352 $CHECKSTAT -s 1000 $DIR/f34e ||
3353 error "Size of $DIR/f34e not equal to 1000 bytes"
3355 run_test 34e "create objects, some with size and some without =="
3357 test_34f() { # bug 6242, 6243
3358 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3362 $MCREATE $DIR/f34f || error "mcreate failed"
3363 $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
3364 dd if=$DIR/f34f of=$TMP/f34f
3365 $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
3366 dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
3367 cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
3368 cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
3369 rm $TMP/f34f $TMP/f34fzero $DIR/f34f
3371 run_test 34f "read from a file with no objects until EOF ======="
3374 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3376 dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE ||
3378 $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error "truncate failed"
3379 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3380 error "Size of $DIR/$tfile not equal to $((TEST_34_SIZE / 2))"
3381 cancel_lru_locks osc
3382 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3383 error "wrong size after lock cancel"
3385 $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error "truncate failed"
3386 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3387 error "expanding truncate failed"
3388 cancel_lru_locks osc
3389 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3390 error "wrong expanded size after lock cancel"
3392 run_test 34g "truncate long file ==============================="
3395 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3400 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error "dd failed"
3401 sync # Flush the cache so that multiop below does not block on cache
3402 # flush when getting the group lock
3403 $MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
3406 # Since just timed wait is not good enough, let's do a sync write
3407 # that way we are sure enough time for a roundtrip + processing
3408 # passed + 2 seconds of extra margin.
3409 dd if=/dev/zero of=$DIR/${tfile}-1 bs=$PAGE_SIZE oflag=direct count=1
3413 if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then
3414 error "Multiop blocked on ftruncate, pid=$MULTIPID"
3418 local nsz=`stat -c %s $DIR/$tfile`
3419 [[ $nsz == $sz ]] || error "New size wrong $nsz != $sz"
3421 run_test 34h "ftruncate file under grouplock should not block"
3424 cp /bin/sh $DIR/f35a
3426 chown $RUNAS_ID $DIR/f35a
3427 $RUNAS $DIR/f35a && error || true
3430 run_test 35a "exec file with mode 444 (should return and not leak)"
3434 utime $DIR/f36 || error "utime failed for MDS"
3436 run_test 36a "MDS utime check (mknod, utime)"
3440 utime $DIR/f36 || error "utime failed for OST"
3442 run_test 36b "OST utime check (open, utime)"
3447 chown $RUNAS_ID $DIR/d36
3448 $RUNAS utime $DIR/d36/f36 || error "utime failed for MDS as non-root"
3450 run_test 36c "non-root MDS utime check (mknod, utime)"
3453 [ ! -d $DIR/d36 ] && test_36c
3454 echo "" > $DIR/d36/f36
3455 $RUNAS utime $DIR/d36/f36 || error "utime failed for OST as non-root"
3457 run_test 36d "non-root OST utime check (open, utime)"
3460 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping"
3462 test_mkdir $DIR/$tdir
3463 touch $DIR/$tdir/$tfile
3464 $RUNAS utime $DIR/$tdir/$tfile &&
3465 error "utime worked, expected failure" || true
3467 run_test 36e "utime on non-owned file (should return error)"
3471 local LANG_SAVE=$LANG
3472 local LC_LANG_SAVE=$LC_LANG
3473 export LANG=C LC_LANG=C # for date language
3475 DATESTR="Dec 20 2000"
3476 test_mkdir $DIR/$tdir
3477 lctl set_param fail_loc=$fl
3479 cp /etc/hosts $DIR/$tdir/$tfile
3480 sync & # write RPC generated with "current" inode timestamp, but delayed
3482 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
3483 LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
3484 cancel_lru_locks $OSC
3485 LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object
3487 [ "$LS_BEFORE" != "$LS_AFTER" ] && \
3488 echo "BEFORE: $LS_BEFORE" && \
3489 echo "AFTER : $LS_AFTER" && \
3490 echo "WANT : $DATESTR" && \
3491 error "$DIR/$tdir/$tfile timestamps changed" || true
3493 export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE
3497 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3499 #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
3500 subr_36fh "0x80000214"
3502 run_test 36f "utime on file racing with OST BRW write =========="
3505 remote_ost_nodsh && skip "remote OST with nodsh"
3506 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3507 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
3508 skip "Need MDS version at least 2.12.51"
3513 local tgt="obdfilter"
3515 [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1"
3517 test_mkdir $DIR/$tdir
3518 fmd_max_age=$(do_facet $facet \
3519 "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \
3522 echo "FMD max age: ${fmd_max_age}s"
3523 touch $DIR/$tdir/$tfile
3524 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3525 gawk '{cnt=cnt+$1} END{print cnt}')
3526 echo "FMD before: $fmd"
3528 error "FMD wasn't create by touch"
3529 sleep $((fmd_max_age + 12))
3530 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3531 gawk '{cnt=cnt+$1} END{print cnt}')
3532 echo "FMD after: $fmd"
3534 error "FMD wasn't expired by ping"
3536 run_test 36g "FMD cache expiry ====================="
3539 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3541 #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227
3542 subr_36fh "0x80000227"
3544 run_test 36h "utime on file racing with OST BRW write =========="
3547 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3549 test_mkdir $DIR/$tdir
3550 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
3552 local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
3553 local new_mtime=$((mtime + 200))
3555 #change Modify time of striped dir
3556 touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
3557 error "change mtime failed"
3559 local got=$(stat -c%Y $DIR/$tdir/striped_dir)
3561 [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
3563 run_test 36i "change mtime on striped directory"
3565 # test_37 - duplicate with tests 32q 32r
3568 local file=$DIR/$tfile
3570 openfile -f O_DIRECTORY $file
3573 [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true
3574 [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)"
3576 run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ==="
3578 test_39a() { # was test_39
3580 touch $DIR/${tfile}2
3581 # ls -l $DIR/$tfile $DIR/${tfile}2
3582 # ls -lu $DIR/$tfile $DIR/${tfile}2
3583 # ls -lc $DIR/$tfile $DIR/${tfile}2
3585 $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
3586 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
3588 ls -l --full-time $DIR/$tfile $DIR/${tfile}2
3590 ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
3592 ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
3593 error "O_TRUNC didn't change timestamps"
3596 run_test 39a "mtime changed on create"
3599 test_mkdir -c1 $DIR/$tdir
3600 cp -p /etc/passwd $DIR/$tdir/fopen
3601 cp -p /etc/passwd $DIR/$tdir/flink
3602 cp -p /etc/passwd $DIR/$tdir/funlink
3603 cp -p /etc/passwd $DIR/$tdir/frename
3604 ln $DIR/$tdir/funlink $DIR/$tdir/funlink2
3607 echo "aaaaaa" >> $DIR/$tdir/fopen
3608 echo "aaaaaa" >> $DIR/$tdir/flink
3609 echo "aaaaaa" >> $DIR/$tdir/funlink
3610 echo "aaaaaa" >> $DIR/$tdir/frename
3612 local open_new=`stat -c %Y $DIR/$tdir/fopen`
3613 local link_new=`stat -c %Y $DIR/$tdir/flink`
3614 local unlink_new=`stat -c %Y $DIR/$tdir/funlink`
3615 local rename_new=`stat -c %Y $DIR/$tdir/frename`
3617 cat $DIR/$tdir/fopen > /dev/null
3618 ln $DIR/$tdir/flink $DIR/$tdir/flink2
3619 rm -f $DIR/$tdir/funlink2
3620 mv -f $DIR/$tdir/frename $DIR/$tdir/frename2
3622 for (( i=0; i < 2; i++ )) ; do
3623 local open_new2=`stat -c %Y $DIR/$tdir/fopen`
3624 local link_new2=`stat -c %Y $DIR/$tdir/flink`
3625 local unlink_new2=`stat -c %Y $DIR/$tdir/funlink`
3626 local rename_new2=`stat -c %Y $DIR/$tdir/frename2`
3628 [ $open_new2 -eq $open_new ] || error "open file reverses mtime"
3629 [ $link_new2 -eq $link_new ] || error "link file reverses mtime"
3630 [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime"
3631 [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime"
3633 cancel_lru_locks $OSC
3634 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3637 run_test 39b "mtime change on open, link, unlink, rename ======"
3639 # this should be set to past
3640 TEST_39_MTIME=`date -d "1 year ago" +%s`
3646 local mtime0=`stat -c %Y $DIR1/$tfile`
3648 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3649 local mtime1=`stat -c %Y $DIR1/$tfile`
3650 [ "$mtime1" = $TEST_39_MTIME ] || \
3651 error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME"
3654 echo hello >> $DIR1/$tfile
3656 local mtime2=`stat -c %Y $DIR1/$tfile`
3657 [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \
3658 error "mtime is not updated on write: $d1 <= $mtime2 <= $d2"
3660 mv $DIR1/$tfile $DIR1/$tfile-1
3662 for (( i=0; i < 2; i++ )) ; do
3663 local mtime3=`stat -c %Y $DIR1/$tfile-1`
3664 [ "$mtime2" = "$mtime3" ] || \
3665 error "mtime ($mtime2) changed (to $mtime3) on rename"
3667 cancel_lru_locks $OSC
3668 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3671 run_test 39c "mtime change on rename ==========================="
3675 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3678 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3680 for (( i=0; i < 2; i++ )) ; do
3681 local mtime=`stat -c %Y $DIR1/$tfile`
3682 [ $mtime = $TEST_39_MTIME ] || \
3683 error "mtime($mtime) is not set to $TEST_39_MTIME"
3685 cancel_lru_locks $OSC
3686 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3689 run_test 39d "create, utime, stat =============================="
3693 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3696 local mtime1=`stat -c %Y $DIR1/$tfile`
3698 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3700 for (( i=0; i < 2; i++ )) ; do
3701 local mtime2=`stat -c %Y $DIR1/$tfile`
3702 [ $mtime2 = $TEST_39_MTIME ] || \
3703 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3705 cancel_lru_locks $OSC
3706 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3709 run_test 39e "create, stat, utime, stat ========================"
3713 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3716 mtime1=`stat -c %Y $DIR1/$tfile`
3719 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3721 for (( i=0; i < 2; i++ )) ; do
3722 local mtime2=`stat -c %Y $DIR1/$tfile`
3723 [ $mtime2 = $TEST_39_MTIME ] || \
3724 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3726 cancel_lru_locks $OSC
3727 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3730 run_test 39f "create, stat, sleep, utime, stat ================="
3734 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3736 echo hello >> $DIR1/$tfile
3737 local mtime1=`stat -c %Y $DIR1/$tfile`
3740 chmod o+r $DIR1/$tfile
3742 for (( i=0; i < 2; i++ )) ; do
3743 local mtime2=`stat -c %Y $DIR1/$tfile`
3744 [ "$mtime1" = "$mtime2" ] || \
3745 error "lost mtime: $mtime2, should be $mtime1"
3747 cancel_lru_locks $OSC
3748 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3751 run_test 39g "write, chmod, stat ==============================="
3755 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3761 echo hello >> $DIR1/$tfile
3762 local mtime1=`stat -c %Y $DIR1/$tfile`
3764 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3766 if [ "$d1" != "$d2" ]; then
3767 echo "write and touch not within one second"
3769 for (( i=0; i < 2; i++ )) ; do
3770 local mtime2=`stat -c %Y $DIR1/$tfile`
3771 [ "$mtime2" = $TEST_39_MTIME ] || \
3772 error "lost mtime: $mtime2, should be $TEST_39_MTIME"
3774 cancel_lru_locks $OSC
3775 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3779 run_test 39h "write, utime within one second, stat ============="
3782 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3787 echo hello >> $DIR1/$tfile
3788 local mtime1=`stat -c %Y $DIR1/$tfile`
3790 mv $DIR1/$tfile $DIR1/$tfile-1
3792 for (( i=0; i < 2; i++ )) ; do
3793 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3795 [ "$mtime1" = "$mtime2" ] || \
3796 error "lost mtime: $mtime2, should be $mtime1"
3798 cancel_lru_locks $OSC
3799 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3802 run_test 39i "write, rename, stat =============================="
3805 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3807 start_full_debug_logging
3811 #define OBD_FAIL_OSC_DELAY_SETTIME 0x412
3812 lctl set_param fail_loc=0x80000412
3813 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c ||
3814 error "multiop failed"
3816 local mtime1=`stat -c %Y $DIR1/$tfile`
3818 mv $DIR1/$tfile $DIR1/$tfile-1
3820 kill -USR1 $multipid
3821 wait $multipid || error "multiop close failed"
3823 for (( i=0; i < 2; i++ )) ; do
3824 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3825 [ "$mtime1" = "$mtime2" ] ||
3826 error "mtime is lost on close: $mtime2, " \
3829 cancel_lru_locks $OSC
3830 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3832 lctl set_param fail_loc=0
3833 stop_full_debug_logging
3835 run_test 39j "write, rename, close, stat ======================="
3838 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3843 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed"
3845 local mtime1=`stat -c %Y $DIR1/$tfile`
3847 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3849 kill -USR1 $multipid
3850 wait $multipid || error "multiop close failed"
3852 for (( i=0; i < 2; i++ )) ; do
3853 local mtime2=`stat -c %Y $DIR1/$tfile`
3855 [ "$mtime2" = $TEST_39_MTIME ] || \
3856 error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
3858 cancel_lru_locks osc
3859 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3862 run_test 39k "write, utime, close, stat ========================"
3864 # this should be set to future
3865 TEST_39_ATIME=`date -d "1 year" +%s`
3868 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3869 remote_mds_nodsh && skip "remote MDS with nodsh"
3871 local atime_diff=$(do_facet $SINGLEMDS \
3872 lctl get_param -n mdd.*MDT0000*.atime_diff)
3876 # test setting directory atime to future
3877 touch -a -d @$TEST_39_ATIME $DIR/$tdir
3878 local atime=$(stat -c %X $DIR/$tdir)
3879 [ "$atime" = $TEST_39_ATIME ] ||
3880 error "atime is not set to future: $atime, $TEST_39_ATIME"
3882 # test setting directory atime from future to now
3883 local now=$(date +%s)
3884 touch -a -d @$now $DIR/$tdir
3886 atime=$(stat -c %X $DIR/$tdir)
3887 [ "$atime" -eq "$now" ] ||
3888 error "atime is not updated from future: $atime, $now"
3890 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=2
3893 # test setting directory atime when now > dir atime + atime_diff
3894 local d1=$(date +%s)
3896 local d2=$(date +%s)
3897 cancel_lru_locks mdc
3898 atime=$(stat -c %X $DIR/$tdir)
3899 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3900 error "atime is not updated : $atime, should be $d2"
3902 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=60
3905 # test not setting directory atime when now < dir atime + atime_diff
3907 cancel_lru_locks mdc
3908 atime=$(stat -c %X $DIR/$tdir)
3909 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3910 error "atime is updated to $atime, should remain $d1<atime<$d2"
3912 do_facet $SINGLEMDS \
3913 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3915 run_test 39l "directory atime update ==========================="
3918 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3922 local far_past_mtime=$(date -d "May 29 1953" +%s)
3923 local far_past_atime=$(date -d "Dec 17 1903" +%s)
3925 touch -m -d @$far_past_mtime $DIR1/$tfile
3926 touch -a -d @$far_past_atime $DIR1/$tfile
3928 for (( i=0; i < 2; i++ )) ; do
3929 local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
3930 [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
3931 error "atime or mtime set incorrectly"
3933 cancel_lru_locks $OSC
3934 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3937 run_test 39m "test atime and mtime before 1970"
3939 test_39n() { # LU-3832
3940 remote_mds_nodsh && skip "remote MDS with nodsh"
3942 local atime_diff=$(do_facet $SINGLEMDS \
3943 lctl get_param -n mdd.*MDT0000*.atime_diff)
3948 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
3951 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
3952 atime0=$(stat -c %X $DIR/$tfile)
3955 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3956 atime1=$(stat -c %X $DIR/$tfile)
3959 cancel_lru_locks mdc
3960 cancel_lru_locks osc
3961 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3962 atime2=$(stat -c %X $DIR/$tfile)
3964 do_facet $SINGLEMDS \
3965 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3967 [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
3968 [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
3970 run_test 39n "check that O_NOATIME is honored"
3973 TESTDIR=$DIR/$tdir/$tfile
3974 [ -e $TESTDIR ] && rm -rf $TESTDIR
3981 links2=$(stat -c %h .)
3982 [ $(($links1 + 2)) != $links2 ] &&
3983 error "wrong links count $(($links1 + 2)) != $links2"
3985 links3=$(stat -c %h .)
3986 [ $(($links1 + 1)) != $links3 ] &&
3987 error "wrong links count $links1 != $links3"
3990 run_test 39o "directory cached attributes updated after create"
3993 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3996 TESTDIR=$DIR/$tdir/$tdir
3997 [ -e $TESTDIR ] && rm -rf $TESTDIR
3998 test_mkdir -p $TESTDIR
4002 test_mkdir -i $MDTIDX $TESTDIR/remote_dir1
4003 test_mkdir -i $MDTIDX $TESTDIR/remote_dir2
4005 links2=$(stat -c %h .)
4006 [ $(($links1 + 2)) != $links2 ] &&
4007 error "wrong links count $(($links1 + 2)) != $links2"
4009 links3=$(stat -c %h .)
4010 [ $(($links1 + 1)) != $links3 ] &&
4011 error "wrong links count $links1 != $links3"
4014 run_test 39p "remote directory cached attributes updated after create ========"
4017 test_39q() { # LU-8041
4018 local testdir=$DIR/$tdir
4020 multiop_bg_pause $testdir D_c || error "multiop failed"
4022 cancel_lru_locks mdc
4023 kill -USR1 $multipid
4024 local atime=$(stat -c %X $testdir)
4025 [ "$atime" -ne 0 ] || error "atime is zero"
4027 run_test 39q "close won't zero out atime"
4030 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
4031 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
4032 error "openfile O_WRONLY:O_TRUNC $tfile failed"
4033 $CHECKSTAT -t file -s 4096 $DIR/$tfile ||
4034 error "$tfile is not 4096 bytes in size"
4036 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
4040 small_write $DIR/f41 18
4042 run_test 41 "test small file write + fstat ====================="
4044 count_ost_writes() {
4045 lctl get_param -n ${OSC}.*.stats |
4046 awk -vwrites=0 '/ost_write/ { writes += $2 } \
4047 END { printf("%0.0f", writes) }'
4054 BG_DIRTY_RATIO_SAVE=10
4055 MAX_BG_DIRTY_RATIO=25
4059 # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs,
4060 # dirty_ratio, dirty_background_ratio
4061 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4062 sysctl -w vm.dirty_writeback_centisecs=$WRITEBACK_SAVE
4063 sysctl -w vm.dirty_background_ratio=$BG_DIRTY_RATIO_SAVE
4064 sysctl -w vm.dirty_ratio=$DIRTY_RATIO_SAVE
4066 # if file not here, we are a 2.4 kernel
4067 kill -CONT `pidof kupdated`
4072 # setup the trap first, so someone cannot exit the test at the
4073 # exact wrong time and mess up a machine
4074 trap start_writeback EXIT
4075 # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
4076 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4077 WRITEBACK_SAVE=`sysctl -n vm.dirty_writeback_centisecs`
4078 sysctl -w vm.dirty_writeback_centisecs=0
4079 sysctl -w vm.dirty_writeback_centisecs=0
4080 # save and increase /proc/sys/vm/dirty_ratio
4081 DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_ratio`
4082 sysctl -w vm.dirty_ratio=$MAX_DIRTY_RATIO
4083 # save and increase /proc/sys/vm/dirty_background_ratio
4084 BG_DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_background_ratio`
4085 sysctl -w vm.dirty_background_ratio=$MAX_BG_DIRTY_RATIO
4087 # if file not here, we are a 2.4 kernel
4088 kill -STOP `pidof kupdated`
4092 # ensure that all stripes have some grant before we test client-side cache
4094 for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
4095 dd if=/dev/zero of=$i bs=4k count=1
4100 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
4101 # file truncation, and file removal.
4103 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4106 cancel_lru_locks $OSC
4108 sync; sleep 1; sync # just to be safe
4109 BEFOREWRITES=`count_ost_writes`
4110 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur_grant_bytes | grep "[0-9]"
4111 dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
4112 AFTERWRITES=`count_ost_writes`
4113 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
4114 error "$BEFOREWRITES < $AFTERWRITES"
4117 run_test 42a "ensure that we don't flush on close"
4120 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4123 cancel_lru_locks $OSC
4126 dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
4127 BEFOREWRITES=$(count_ost_writes)
4128 $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
4129 AFTERWRITES=$(count_ost_writes)
4130 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4131 error "$BEFOREWRITES < $AFTERWRITES on unlink"
4133 BEFOREWRITES=$(count_ost_writes)
4134 sync || error "sync: $?"
4135 AFTERWRITES=$(count_ost_writes)
4136 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4137 error "$BEFOREWRITES < $AFTERWRITES on sync"
4139 dmesg | grep 'error from obd_brw_async' && error 'error writing back'
4143 run_test 42b "test destroy of file with cached dirty data ======"
4145 # if these tests just want to test the effect of truncation,
4146 # they have to be very careful. consider:
4147 # - the first open gets a {0,EOF}PR lock
4148 # - the first write conflicts and gets a {0, count-1}PW
4149 # - the rest of the writes are under {count,EOF}PW
4150 # - the open for truncate tries to match a {0,EOF}PR
4151 # for the filesize and cancels the PWs.
4152 # any number of fixes (don't get {0,EOF} on open, match
4153 # composite locks, do smarter file size management) fix
4154 # this, but for now we want these tests to verify that
4155 # the cancellation with truncate intent works, so we
4156 # start the file with a full-file pw lock to match against
4157 # until the truncate.
4162 cancel_lru_locks $OSC
4164 # prime the file with 0,EOF PW to match
4168 # now the real test..
4169 dd if=/dev/zero of=$file bs=1024 count=100
4170 BEFOREWRITES=`count_ost_writes`
4171 $TRUNCATE $file $offset
4172 cancel_lru_locks $OSC
4173 AFTERWRITES=`count_ost_writes`
4178 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4181 [ $BEFOREWRITES -eq $AFTERWRITES ] &&
4182 error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
4185 run_test 42c "test partial truncate of file with cached dirty data"
4188 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4191 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
4192 error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
4195 run_test 42d "test complete truncate of file with cached dirty data"
4197 test_42e() { # bug22074
4198 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4200 local TDIR=$DIR/${tdir}e
4201 local pages=16 # hardcoded 16 pages, don't change it.
4202 local files=$((OSTCOUNT * 500)) # hopefully 500 files on each OST
4203 local proc_osc0="osc.${FSNAME}-OST0000-osc-[^MDT]*"
4207 test_mkdir $DIR/${tdir}e
4208 $SETSTRIPE -c 1 $TDIR
4209 createmany -o $TDIR/f $files
4211 max_dirty_mb=$($LCTL get_param -n $proc_osc0/max_dirty_mb)
4213 # we assume that with $OSTCOUNT files, at least one of them will
4214 # be allocated on OST0.
4215 warmup_files=$((OSTCOUNT * max_dirty_mb))
4216 createmany -o $TDIR/w $warmup_files
4218 # write a large amount of data into one file and sync, to get good
4219 # avail_grant number from OST.
4220 for ((i=0; i<$warmup_files; i++)); do
4221 idx=$($GETSTRIPE -i $TDIR/w$i)
4222 [ $idx -ne 0 ] && continue
4223 dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1
4226 [[ $i -gt $warmup_files ]] && error "OST0 is still cold"
4228 $LCTL get_param $proc_osc0/cur_dirty_bytes
4229 $LCTL get_param $proc_osc0/cur_grant_bytes
4231 # create as much dirty pages as we can while not to trigger the actual
4232 # RPCs directly. but depends on the env, VFS may trigger flush during this
4233 # period, hopefully we are good.
4234 for ((i=0; i<$warmup_files; i++)); do
4235 idx=$($GETSTRIPE -i $TDIR/w$i)
4236 [ $idx -ne 0 ] && continue
4237 dd if=/dev/zero of=$TDIR/w$i bs=1M count=1 2>/dev/null
4239 $LCTL get_param $proc_osc0/cur_dirty_bytes
4240 $LCTL get_param $proc_osc0/cur_grant_bytes
4242 # perform the real test
4243 $LCTL set_param $proc_osc0/rpc_stats 0
4244 for ((;i<$files; i++)); do
4245 [ $($GETSTRIPE -i $TDIR/f$i) -eq 0 ] || continue
4246 dd if=/dev/zero of=$TDIR/f$i bs=$PAGE_SIZE count=$pages 2>/dev/null
4249 $LCTL get_param $proc_osc0/rpc_stats
4252 local have_ppr=false
4253 $LCTL get_param $proc_osc0/rpc_stats |
4254 while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do
4255 # skip lines until we are at the RPC histogram data
4256 [ "$PPR" == "pages" ] && have_ppr=true && continue
4257 $have_ppr || continue
4259 # we only want the percent stat for < 16 pages
4260 [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break
4262 percent=$((percent + WPCT))
4263 if [[ $percent -gt 15 ]]; then
4264 error "less than 16-pages write RPCs" \
4271 run_test 42e "verify sub-RPC writes are not done synchronously"
4273 test_43A() { # was test_43
4274 test_mkdir $DIR/$tdir
4275 cp -p /bin/ls $DIR/$tdir/$tfile
4276 $MULTIOP $DIR/$tdir/$tfile Ow_c &
4278 # give multiop a chance to open
4281 $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true
4284 run_test 43A "execution of file opened for write should return -ETXTBSY"
4287 test_mkdir $DIR/$tdir
4288 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4289 $DIR/$tdir/sleep 60 &
4291 # Make sure exec of $tdir/sleep wins race with truncate
4293 $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success"
4296 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
4299 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4301 test_mkdir $DIR/$tdir
4302 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4303 $DIR/$tdir/sleep 60 &
4305 # Make sure exec of $tdir/sleep wins race with truncate
4307 $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success"
4310 run_test 43b "truncate of file being executed should return -ETXTBSY"
4313 local testdir="$DIR/$tdir"
4316 ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) |
4317 ( cd $testdir && md5sum -c )
4319 run_test 43c "md5sum of copy into lustre"
4321 test_44A() { # was test_44
4322 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4324 dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
4325 dd if=$DIR/f1 bs=4k count=1 > /dev/null
4327 run_test 44A "zero length read from a sparse stripe"
4330 local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
4332 [ -z "$nstripe" ] && skip "can't get stripe info"
4333 [[ $nstripe -gt $OSTCOUNT ]] &&
4334 skip "Wrong default_stripe_count: $nstripe OSTCOUNT: $OSTCOUNT"
4336 local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: |
4338 if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then
4339 nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: |
4343 OFFSETS="0 $((stride/2)) $((stride-1))"
4344 for offset in $OFFSETS; do
4345 for i in $(seq 0 $((nstripe-1))); do
4346 local GLOBALOFFSETS=""
4348 local size=$((((i + 2 * $nstripe )*$stride + $offset)))
4349 local myfn=$DIR/d44a-$size
4350 echo "--------writing $myfn at $size"
4351 ll_sparseness_write $myfn $size ||
4352 error "ll_sparseness_write"
4353 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4354 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4355 error "ll_sparseness_verify $GLOBALOFFSETS"
4357 for j in $(seq 0 $((nstripe-1))); do
4359 size=$((((j + $nstripe )*$stride + $offset)))
4360 ll_sparseness_write $myfn $size ||
4361 error "ll_sparseness_write"
4362 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4364 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4365 error "ll_sparseness_verify $GLOBALOFFSETS"
4370 run_test 44a "test sparse pwrite ==============================="
4374 for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
4380 before=`dirty_osc_total`
4381 echo executing "\"$*\""
4383 after=`dirty_osc_total`
4384 echo before $before, after $after
4387 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4390 # Obtain grants from OST if it supports it
4391 echo blah > ${f}_grant
4394 do_dirty_record "echo blah > $f"
4395 [[ $before -eq $after ]] && error "write wasn't cached"
4396 do_dirty_record "> $f"
4397 [[ $before -gt $after ]] || error "truncate didn't lower dirty count"
4398 do_dirty_record "echo blah > $f"
4399 [[ $before -eq $after ]] && error "write wasn't cached"
4400 do_dirty_record "sync"
4401 [[ $before -gt $after ]] || error "writeback didn't lower dirty count"
4402 do_dirty_record "echo blah > $f"
4403 [[ $before -eq $after ]] && error "write wasn't cached"
4404 do_dirty_record "cancel_lru_locks osc"
4405 [[ $before -gt $after ]] ||
4406 error "lock cancellation didn't lower dirty count"
4409 run_test 45 "osc io page accounting ============================"
4411 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this
4412 # test tickles a bug where re-dirtying a page was failing to be mapped to the
4413 # objects offset and an assert hit when an rpc was built with 1023's mapped
4414 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
4416 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4421 dd if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4423 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=1023 count=1
4424 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4428 run_test 46 "dirtying a previously written page ================"
4430 # test_47 is removed "Device nodes check" is moved to test_28
4432 test_48a() { # bug 2399
4433 [ "$mds1_FSTYPE" = "zfs" ] &&
4434 [ $MDS1_VERSION -lt $(version_code 2.3.63) ] &&
4435 skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly"
4437 test_mkdir $DIR/$tdir
4439 mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
4440 test_mkdir $DIR/$tdir
4441 touch foo || error "'touch foo' failed after recreating cwd"
4443 touch .foo || error "'touch .foo' failed after recreating cwd"
4445 ls . > /dev/null || error "'ls .' failed after recreating cwd"
4446 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4447 cd . || error "'cd .' failed after recreating cwd"
4448 mkdir . && error "'mkdir .' worked after recreating cwd"
4449 rmdir . && error "'rmdir .' worked after recreating cwd"
4450 ln -s . baz || error "'ln -s .' failed after recreating cwd"
4451 cd .. || error "'cd ..' failed after recreating cwd"
4453 run_test 48a "Access renamed working dir (should return errors)="
4455 test_48b() { # bug 2399
4457 test_mkdir $DIR/$tdir
4459 rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
4460 touch foo && error "'touch foo' worked after removing cwd"
4461 mkdir foo && error "'mkdir foo' worked after removing cwd"
4462 touch .foo && error "'touch .foo' worked after removing cwd"
4463 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
4464 ls . > /dev/null && error "'ls .' worked after removing cwd"
4465 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4466 mkdir . && error "'mkdir .' worked after removing cwd"
4467 rmdir . && error "'rmdir .' worked after removing cwd"
4468 ln -s . foo && error "'ln -s .' worked after removing cwd"
4469 cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
4471 run_test 48b "Access removed working dir (should return errors)="
4473 test_48c() { # bug 2350
4474 #lctl set_param debug=-1
4477 test_mkdir -p $DIR/$tdir/dir
4479 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4480 $TRACE touch foo && error "touch foo worked after removing cwd"
4481 $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
4482 touch .foo && error "touch .foo worked after removing cwd"
4483 mkdir .foo && error "mkdir .foo worked after removing cwd"
4484 $TRACE ls . && error "'ls .' worked after removing cwd"
4485 $TRACE ls .. || error "'ls ..' failed after removing cwd"
4486 $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
4487 $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
4488 $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
4489 $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
4491 run_test 48c "Access removed working subdir (should return errors)"
4493 test_48d() { # bug 2350
4494 #lctl set_param debug=-1
4497 test_mkdir -p $DIR/$tdir/dir
4499 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4500 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4501 $TRACE touch foo && error "'touch foo' worked after removing parent"
4502 $TRACE mkdir foo && error "mkdir foo worked after removing parent"
4503 touch .foo && error "'touch .foo' worked after removing parent"
4504 mkdir .foo && error "mkdir .foo worked after removing parent"
4505 $TRACE ls . && error "'ls .' worked after removing parent"
4506 $TRACE ls .. && error "'ls ..' worked after removing parent"
4507 $TRACE mkdir . && error "'mkdir .' worked after removing parent"
4508 $TRACE rmdir . && error "'rmdir .' worked after removing parent"
4509 $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
4512 run_test 48d "Access removed parent subdir (should return errors)"
4514 test_48e() { # bug 4134
4515 #lctl set_param debug=-1
4518 test_mkdir -p $DIR/$tdir/dir
4520 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4521 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4522 $TRACE touch $DIR/$tdir || error "'touch $DIR/$tdir' failed"
4523 $TRACE chmod +x $DIR/$tdir || error "'chmod +x $DIR/$tdir' failed"
4524 # On a buggy kernel addition of "touch foo" after cd .. will
4525 # produce kernel oops in lookup_hash_it
4526 touch ../foo && error "'cd ..' worked after recreate parent"
4528 $TRACE rm $DIR/$tdir || error "rm '$DIR/$tdir' failed"
4530 run_test 48e "Access to recreated parent subdir (should return errors)"
4532 test_49() { # LU-1030
4533 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4534 remote_ost_nodsh && skip "remote OST with nodsh"
4536 # get ost1 size - lustre-OST0000
4537 ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
4539 # write 800M at maximum
4540 [[ $ost1_size -lt 2 ]] && ost1_size=2
4541 [[ $ost1_size -gt 819200 ]] && ost1_size=819200
4543 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
4544 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) &
4547 # change max_pages_per_rpc while writing the file
4548 local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc
4549 local orig_mppc=$($LCTL get_param -n $osc1_mppc)
4550 # loop until dd process exits
4551 while ps ax -opid | grep -wq $dd_pid; do
4552 $LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1))
4553 sleep $((RANDOM % 5 + 1))
4555 # restore original max_pages_per_rpc
4556 $LCTL set_param $osc1_mppc=$orig_mppc
4557 rm $DIR/$tfile || error "rm $DIR/$tfile failed"
4559 run_test 49 "Change max_pages_per_rpc won't break osc extent"
4563 test_mkdir $DIR/$tdir
4565 ls /proc/$$/cwd || error "ls /proc/$$/cwd failed"
4567 run_test 50 "special situations: /proc symlinks ==============="
4569 test_51a() { # was test_51
4570 # bug 1516 - create an empty entry right after ".." then split dir
4571 test_mkdir -c1 $DIR/$tdir
4572 touch $DIR/$tdir/foo
4573 $MCREATE $DIR/$tdir/bar
4575 createmany -m $DIR/$tdir/longfile 201
4577 while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do
4578 $MCREATE $DIR/$tdir/longfile$FNUM
4583 ls -l $DIR/$tdir > /dev/null || error "ls -l $DIR/$tdir failed"
4585 run_test 51a "special situations: split htree with empty entry =="
4587 cleanup_print_lfs_df () {
4594 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4596 local dir=$DIR/$tdir
4597 local nrdirs=$((65536 + 100))
4599 # cleanup the directory
4606 local mdtidx=$(printf "%04x" $($LFS getstripe -m $dir))
4607 local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
4608 [[ $numfree -lt $nrdirs ]] &&
4609 skip "not enough free inodes ($numfree) on MDT$mdtidx"
4611 # need to check free space for the directories as well
4612 local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
4613 numfree=$(( blkfree / $(fs_inode_ksize) ))
4614 [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)"
4616 trap cleanup_print_lfs_df EXIT
4619 createmany -d $dir/d $nrdirs || {
4620 unlinkmany $dir/d $nrdirs
4621 error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
4625 nrdirs=$(ls -U $dir | wc -l)
4627 # unlink all but 100 subdirectories, then check it still works
4629 local delete=$((nrdirs - left))
4634 # for ldiskfs the nlink count should be 1, but this is OSD specific
4635 # and so this is listed for informational purposes only
4636 echo "nlink before: $(stat -c %h $dir), created before: $nrdirs"
4637 unlinkmany -d $dir/d $delete ||
4638 error "unlink of first $delete subdirs failed"
4640 echo "nlink between: $(stat -c %h $dir)"
4641 local found=$(ls -U $dir | wc -l)
4642 [ $found -ne $left ] &&
4643 error "can't find subdirs: found only $found, expected $left"
4645 unlinkmany -d $dir/d $delete $left ||
4646 error "unlink of second $left subdirs failed"
4647 # regardless of whether the backing filesystem tracks nlink accurately
4648 # or not, the nlink count shouldn't be more than "." and ".." here
4649 local after=$(stat -c %h $dir)
4650 [[ $after -gt 2 ]] && error "nlink after: $after > 2" ||
4651 echo "nlink after: $after"
4653 cleanup_print_lfs_df
4655 run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
4658 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4659 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
4661 test_mkdir $DIR/$tdir
4662 createmany -o $DIR/$tdir/t- 1000
4663 $LFS getstripe $DIR/$tdir > $TMP/$tfile
4664 for N in $(seq 0 $((OSTCOUNT - 1))); do
4665 OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
4666 END { printf("%0.0f", objs) }' $TMP/$tfile)
4667 OBJS0[$N]=$(grep -A 1 idx $TMP/$tfile | awk -vobjs=0 \
4668 '($1 == '$N') { objs += 1 } \
4669 END { printf("%0.0f", objs) }')
4670 log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
4672 unlinkmany $DIR/$tdir/t- 1000
4675 for N in $(seq 1 $((OSTCOUNT - 1))); do
4676 [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] &&
4677 error "OST $N has less objects vs OST $NLAST" \
4678 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4679 [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] &&
4680 error "OST $N has less objects vs OST $NLAST" \
4681 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4683 [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] &&
4684 error "OST $N has less #0 objects vs OST $NLAST" \
4685 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4686 [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] &&
4687 error "OST $N has less #0 objects vs OST $NLAST" \
4688 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4693 run_test 51d "check object distribution"
4696 if [ "$mds1_FSTYPE" != ldiskfs ]; then
4697 skip_env "ldiskfs only test"
4700 test_mkdir -c1 $DIR/$tdir
4701 test_mkdir -c1 $DIR/$tdir/d0
4703 touch $DIR/$tdir/d0/foo
4704 createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
4705 error "file exceed 65000 nlink limit!"
4706 unlinkmany $DIR/$tdir/d0/f- 65001
4709 run_test 51e "check file nlink limit"
4712 test_mkdir $DIR/$tdir
4715 local ulimit_old=$(ulimit -n)
4716 local spare=20 # number of spare fd's for scripts/libraries, etc.
4717 local mdt=$($LFS getstripe -m $DIR/$tdir)
4718 local numfree=$($LFS df -i $DIR/$tdir | awk '/MDT:'$mdt'/ { print $4 }')
4720 echo "MDT$mdt numfree=$numfree, max=$max"
4721 [[ $numfree -gt $max ]] && numfree=$max || numfree=$((numfree * 7 / 8))
4722 if [ $((numfree + spare)) -gt $ulimit_old ]; then
4723 while ! ulimit -n $((numfree + spare)); do
4724 numfree=$((numfree * 3 / 4))
4726 echo "changed ulimit from $ulimit_old to $((numfree + spare))"
4728 echo "left ulimit at $ulimit_old"
4731 createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
4732 unlinkmany $DIR/$tdir/f $numfree
4733 error "create+open $numfree files in $DIR/$tdir failed"
4735 ulimit -n $ulimit_old
4737 # if createmany exits at 120s there will be fewer than $numfree files
4738 unlinkmany $DIR/$tdir/f $numfree || true
4740 run_test 51f "check many open files limit"
4743 [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
4744 test_mkdir $DIR/$tdir
4745 touch $DIR/$tdir/foo
4746 chattr +a $DIR/$tdir/foo || error "chattr +a failed"
4747 echo bar >> $DIR/$tdir/foo || error "append bar failed"
4748 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4749 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4750 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4752 echo foo >> $DIR/$tdir/foo || error "append foo failed"
4753 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4754 lsattr $DIR/$tdir/foo | egrep -q "^-+a[-e]+ $DIR/$tdir/foo" ||
4756 chattr -a $DIR/$tdir/foo || error "chattr -a failed"
4757 cp -r $DIR/$tdir $TMP/
4758 rm -fr $DIR/$tdir $TMP/$tdir || error "cleanup rm failed"
4760 run_test 52a "append-only flag test (should return errors)"
4763 [ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo
4764 test_mkdir $DIR/$tdir
4765 touch $DIR/$tdir/foo
4766 chattr +i $DIR/$tdir/foo || error "chattr +i failed"
4767 cat test > $DIR/$tdir/foo && error "cat test worked"
4768 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4769 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4770 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4772 echo foo >> $DIR/$tdir/foo && error "echo worked"
4773 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4774 [ -f $DIR/$tdir/foo ] || error "$tdir/foo is not a file"
4775 [ -f $DIR/$tdir/foo_ren ] && error "$tdir/foo_ren is not a file"
4776 lsattr $DIR/$tdir/foo | egrep -q "^-+i[-e]+ $DIR/$tdir/foo" ||
4778 chattr -i $DIR/$tdir/foo || error "chattr failed"
4780 rm -fr $DIR/$tdir || error "unable to remove $DIR/$tdir"
4782 run_test 52b "immutable flag test (should return errors) ======="
4785 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4786 remote_mds_nodsh && skip "remote MDS with nodsh"
4787 remote_ost_nodsh && skip "remote OST with nodsh"
4800 local support_last_seq=true
4802 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
4803 support_last_seq=false
4806 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
4808 for value in $(do_facet $SINGLEMDS \
4809 $LCTL get_param osp.$mdtosc.prealloc_last_id) ; do
4810 param=$(echo ${value[0]} | cut -d "=" -f1)
4811 ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
4813 if $support_last_seq; then
4814 param_seq=$(echo $param |
4815 sed -e s/prealloc_last_id/prealloc_last_seq/g)
4816 mds_last_seq=$(do_facet $SINGLEMDS \
4817 $LCTL get_param -n $param_seq)
4819 mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
4821 ostnum=$(index_from_ostuuid ${ostname}_UUID)
4822 node=$(facet_active_host ost$((ostnum+1)))
4823 param="obdfilter.$ostname.last_id"
4824 for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
4825 echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
4826 ost_last_id=$ost_last
4828 if $support_last_seq; then
4829 ost_last_id=$(echo $ost_last |
4830 awk -F':' '{print $2}' |
4832 ost_last_seq=$(echo $ost_last |
4833 awk -F':' '{print $1}')
4834 [[ $ost_last_seq = $mds_last_seq ]] || continue
4837 if [[ $ost_last_id != $mds_last ]]; then
4838 error "$ost_last_id != $mds_last"
4845 $found || error "can not match last_seq/last_id for $mdtosc"
4848 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
4851 perl -MSocket -e ';' || skip "no Socket perl module installed"
4853 $SOCKETSERVER $DIR/socket ||
4854 error "$SOCKETSERVER $DIR/socket failed: $?"
4855 $SOCKETCLIENT $DIR/socket ||
4856 error "$SOCKETCLIENT $DIR/socket failed: $?"
4857 $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
4859 run_test 54a "unix domain socket test =========================="
4865 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1
4867 run_test 54b "char device works in lustre ======================"
4870 [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
4871 [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
4872 [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
4874 for i in $(seq 3 7); do
4875 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
4884 loopdev="$DIR/loop54c"
4887 $UMOUNT $DIR/$tdir || rc=$?
4888 losetup -d $loopdev || true
4889 losetup -d $LOOPDEV || true
4890 rm -rf $loopdev $DIR/$tfile $DIR/$tdir
4895 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4897 loopdev="$DIR/loop54c"
4900 [ -z "$LOOPNUM" ] && skip_env "couldn't find empty loop device"
4901 trap cleanup_54c EXIT
4902 mknod $loopdev b 7 $LOOPNUM
4903 echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
4904 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE seek=1024 count=1 > /dev/null
4905 losetup $loopdev $DIR/$tfile ||
4906 error "can't set up $loopdev for $DIR/$tfile"
4907 mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
4908 test_mkdir $DIR/$tdir
4909 mount -t ext2 $loopdev $DIR/$tdir ||
4910 error "error mounting $loopdev on $DIR/$tdir"
4911 dd if=/dev/zero of=$DIR/$tdir/tmp bs=$PAGE_SIZE count=30 ||
4914 dd if=$DIR/$tdir/tmp of=/dev/zero bs=$PAGE_SIZE count=30 ||
4918 run_test 54c "block device works in lustre ====================="
4924 [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string"
4926 run_test 54d "fifo device works in lustre ======================"
4931 cp -aL /dev/console $f
4932 echo $string > $f || error "echo $string to $f failed"
4934 run_test 54e "console/tty device works in lustre ======================"
4938 local dir=$DIR/$tdir
4941 test_mkdir -p $dir/dir
4942 for i in $(seq $numfiles); do
4944 touch $dir/dir/file$i
4947 local numcomp=$($LFS getstripe --component-count $dir)
4949 [[ $numcomp == 0 ]] && numcomp=1
4951 # test lfs getstripe with --recursive
4952 local filenum=$($LFS getstripe -r $dir | egrep -c "obdidx|l_ost_idx")
4954 [[ $filenum -eq $((numfiles * 2)) ]] ||
4955 error "$LFS getstripe -r: found $filenum != $((numfiles * 2))"
4956 filenum=$($LFS getstripe $dir | egrep -c "obdidx|l_ost_idx")
4957 [[ $filenum -eq $numfiles ]] ||
4958 error "$LFS getstripe $dir: found $filenum, not $numfiles"
4959 echo "$LFS getstripe showed obdidx or l_ost_idx"
4961 # test lfs getstripe with file instead of dir
4962 filenum=$($LFS getstripe $dir/file1 | egrep -c "obdidx|l_ost_idx")
4963 [[ $filenum -eq 1 ]] ||
4964 error "$LFS getstripe $dir/file1: found $filenum, not 1"
4965 echo "$LFS getstripe file1 passed"
4967 #test lfs getstripe with --verbose
4968 filenum=$($LFS getstripe --verbose $dir | grep -c lmm_magic)
4969 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
4970 error "$LFS getstripe --verbose $dir: "\
4971 "got $filenum want $((numfiles * numcomp)) lmm_magic"
4972 [[ $($LFS getstripe $dir | grep -c lmm_magic) -eq 0 ]] ||
4973 error "$LFS getstripe $dir: showed lmm_magic"
4975 #test lfs getstripe with -v prints lmm_fid
4976 filenum=$($LFS getstripe -v $dir | grep -c lmm_fid)
4977 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
4978 error "$LFS getstripe -v $dir: "\
4979 "got $filenum want $((numfiles * numcomp)) lmm_fid"
4980 [[ $($LFS getstripe $dir | grep -c lmm_fid) -eq 0 ]] ||
4981 error "$LFS getstripe $dir: showed lmm_fid by default"
4982 echo "$LFS getstripe --verbose passed"
4984 #check for FID information
4985 local fid1=$($LFS getstripe --fid $dir/file1)
4986 local fid2=$($LFS getstripe --verbose $dir/file1 |
4987 awk '/lmm_fid: / { print $2; exit; }')
4988 local fid3=$($LFS path2fid $dir/file1)
4990 [ "$fid1" != "$fid2" ] &&
4991 error "getstripe --fid '$fid1' != getstripe --verbose '$fid2'"
4992 [ "$fid1" != "$fid3" ] &&
4993 error "getstripe --fid '$fid1' != lfs path2fid '$fid3'"
4994 echo "$LFS getstripe --fid passed"
4996 #test lfs getstripe with --obd
4997 $LFS getstripe --obd wrong_uuid $dir 2>&1 | grep -q "unknown obduuid" ||
4998 error "$LFS getstripe --obd wrong_uuid: should return error"
5000 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5003 local obduuid=$(ostuuid_from_index $ostidx)
5004 local found=$($LFS getstripe -r --obd $obduuid $dir |
5005 grep 'lmm_stripe_offset:' | grep -c " $ostidx\$")
5007 filenum=$($LFS getstripe -ir $dir | grep -c "^$ostidx\$")
5008 [[ $($LFS getstripe -id $dir) -ne $ostidx ]] ||
5010 [[ $($LFS getstripe -id $dir/dir) -ne $ostidx ]] ||
5013 [[ $found -eq $filenum ]] ||
5014 error "$LFS getstripe --obd: found $found expect $filenum"
5015 [[ $($LFS getstripe -r -v --obd $obduuid $dir |
5016 sed '/^[ ]*'${ostidx}'[ ]/d' |
5017 sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] ||
5018 error "$LFS getstripe --obd: should not show file on other obd"
5019 echo "$LFS getstripe --obd passed"
5021 run_test 56a "check $LFS getstripe"
5024 local dir=$DIR/$tdir
5028 for i in $(seq $numdirs); do
5029 test_mkdir $dir/dir$i
5032 # test lfs getdirstripe default mode is non-recursion, which is
5033 # different from lfs getstripe
5034 local dircnt=$($LFS getdirstripe $dir | grep -c lmv_stripe_count)
5036 [[ $dircnt -eq 1 ]] ||
5037 error "$LFS getdirstripe: found $dircnt, not 1"
5038 dircnt=$($LFS getdirstripe --recursive $dir |
5039 grep -c lmv_stripe_count)
5040 [[ $dircnt -eq $((numdirs + 1)) ]] ||
5041 error "$LFS getdirstripe -r: $dircnt, != $((numdirs + 1))"
5043 run_test 56b "check $LFS getdirstripe"
5046 remote_ost_nodsh && skip "remote OST with nodsh"
5049 local ost_name=$(ostname_from_index $ost_idx)
5050 local old_status=$(ost_dev_status $ost_idx)
5052 [[ -z "$old_status" ]] ||
5053 skip_env "OST $ost_name is in $old_status status"
5055 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
5056 [[ $OST1_VERSION -ge $(version_code 2.12.3) ]] && do_facet ost1 \
5057 $LCTL set_param -n obdfilter.$ost_name.no_precreate=1
5060 local new_status=$(ost_dev_status $ost_idx)
5062 [[ "$new_status" =~ "D" ]] ||
5063 error "$ost_name status is '$new_status', missing 'D'"
5064 if [[ $OST1_VERSION -ge $(version_code 2.12.3) ]]; then
5065 [[ "$new_status" =~ "N" ]] ||
5066 error "$ost_name status is '$new_status', missing 'N'"
5069 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
5070 [[ $OST1_VERSION -ge $(version_code 2.12.3) ]] && do_facet ost1 \
5071 $LCTL set_param -n obdfilter.$ost_name.no_precreate=0
5074 new_status=$(ost_dev_status $ost_idx)
5075 [[ ! "$new_status" =~ "D" && ! "$new_status" =~ "N" ]] ||
5076 error "$ost_name status is '$new_status', has 'D' and/or 'N'"
5078 run_test 56c "check 'lfs df' showing device status"
5083 local local_tdir="$1"
5084 local local_numfiles="$2"
5085 local local_numdirs="$3"
5086 local dir_params="$4"
5087 local dir_stripe_params="$5"
5089 if [ ! -d "$local_tdir" ] ; then
5090 test_mkdir -p $dir_stripe_params $local_tdir
5091 [ "$dir_params" ] && $LFS setstripe $dir_params $local_tdir
5092 for i in $(seq $local_numfiles) ; do
5093 touch $local_tdir/file$i
5095 for i in $(seq $local_numdirs) ; do
5096 test_mkdir $dir_stripe_params $local_tdir/dir$i
5097 for j in $(seq $local_numfiles) ; do
5098 touch $local_tdir/dir$i/file$j
5104 setup_56_special() {
5106 local local_numfiles=$2
5107 local local_numdirs=$3
5109 setup_56 $local_tdir $local_numfiles $local_numdirs
5111 if [ ! -e "$local_tdir/loop${local_numfiles}b" ] ; then
5112 for i in $(seq $local_numfiles) ; do
5113 mknod $local_tdir/loop${i}b b 7 $i
5114 mknod $local_tdir/null${i}c c 1 3
5115 ln -s $local_tdir/file1 $local_tdir/link${i}
5117 for i in $(seq $local_numdirs) ; do
5118 mknod $local_tdir/dir$i/loop${i}b b 7 $i
5119 mknod $local_tdir/dir$i/null${i}c c 1 3
5120 ln -s $local_tdir/dir$i/file1 $local_tdir/dir$i/link${i}
5126 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5127 local expected=$(($NUMDIRS + 2))
5129 setup_56 $dir $NUMFILES $NUMDIRS
5131 # test lfs find with -name
5132 for i in $(seq $NUMFILES) ; do
5133 local nums=$($LFS find -name "*$i" $dir | wc -l)
5135 [ $nums -eq $expected ] ||
5136 error "lfs find -name '*$i' $dir wrong: "\
5137 "found $nums, expected $expected"
5140 run_test 56g "check lfs find -name"
5143 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5144 local expected=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES))
5146 setup_56 $dir $NUMFILES $NUMDIRS
5148 # test lfs find with ! -name
5149 for i in $(seq $NUMFILES) ; do
5150 local nums=$($LFS find ! -name "*$i" $dir | wc -l)
5152 [ $nums -eq $expected ] ||
5153 error "lfs find ! -name '*$i' $dir wrong: "\
5154 "found $nums, expected $expected"
5157 run_test 56h "check lfs find ! -name"
5160 local dir=$DIR/$tdir
5164 local cmd="$LFS find -ost $(ostuuid_from_index 0 $dir) $dir"
5167 [ -z "$out" ] || error "'$cmd' returned directory '$out'"
5169 run_test 56i "check 'lfs find -ost UUID' skips directories"
5172 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5174 setup_56_special $dir $NUMFILES $NUMDIRS
5176 local expected=$((NUMDIRS + 1))
5177 local cmd="$LFS find -type d $dir"
5178 local nums=$($cmd | wc -l)
5180 [ $nums -eq $expected ] ||
5181 error "'$cmd' wrong: found $nums, expected $expected"
5183 run_test 56j "check lfs find -type d"
5186 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5188 setup_56_special $dir $NUMFILES $NUMDIRS
5190 local expected=$(((NUMDIRS + 1) * NUMFILES))
5191 local cmd="$LFS find -type f $dir"
5192 local nums=$($cmd | wc -l)
5194 [ $nums -eq $expected ] ||
5195 error "'$cmd' wrong: found $nums, expected $expected"
5197 run_test 56k "check lfs find -type f"
5200 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5202 setup_56_special $dir $NUMFILES $NUMDIRS
5204 local expected=$((NUMDIRS + NUMFILES))
5205 local cmd="$LFS find -type b $dir"
5206 local nums=$($cmd | wc -l)
5208 [ $nums -eq $expected ] ||
5209 error "'$cmd' wrong: found $nums, expected $expected"
5211 run_test 56l "check lfs find -type b"
5214 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5216 setup_56_special $dir $NUMFILES $NUMDIRS
5218 local expected=$((NUMDIRS + NUMFILES))
5219 local cmd="$LFS find -type c $dir"
5220 local nums=$($cmd | wc -l)
5221 [ $nums -eq $expected ] ||
5222 error "'$cmd' wrong: found $nums, expected $expected"
5224 run_test 56m "check lfs find -type c"
5227 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5228 setup_56_special $dir $NUMFILES $NUMDIRS
5230 local expected=$((NUMDIRS + NUMFILES))
5231 local cmd="$LFS find -type l $dir"
5232 local nums=$($cmd | wc -l)
5234 [ $nums -eq $expected ] ||
5235 error "'$cmd' wrong: found $nums, expected $expected"
5237 run_test 56n "check lfs find -type l"
5240 local dir=$DIR/$tdir
5242 setup_56 $dir $NUMFILES $NUMDIRS
5243 utime $dir/file1 > /dev/null || error "utime (1)"
5244 utime $dir/file2 > /dev/null || error "utime (2)"
5245 utime $dir/dir1 > /dev/null || error "utime (3)"
5246 utime $dir/dir2 > /dev/null || error "utime (4)"
5247 utime $dir/dir1/file1 > /dev/null || error "utime (5)"
5248 dd if=/dev/zero count=1 >> $dir/dir1/file1 && sync
5251 local nums=$($LFS find -mtime +0 $dir | wc -l)
5253 [ $nums -eq $expected ] ||
5254 error "lfs find -mtime +0 $dir: found $nums expect $expected"
5257 cmd="$LFS find -mtime 0 $dir"
5258 nums=$($cmd | wc -l)
5259 [ $nums -eq $expected ] ||
5260 error "'$cmd' wrong: found $nums, expected $expected"
5262 run_test 56o "check lfs find -mtime for old files"
5265 [ $RUNAS_ID -eq $UID ] &&
5266 skip_env "RUNAS_ID = UID = $UID -- skipping"
5268 local dir=$DIR/$tdir
5270 setup_56 $dir $NUMFILES $NUMDIRS
5271 chown $RUNAS_ID $dir/file* || error "chown $DIR/${tdir}g/file$i failed"
5273 local expected=$NUMFILES
5274 local cmd="$LFS find -uid $RUNAS_ID $dir"
5275 local nums=$($cmd | wc -l)
5277 [ $nums -eq $expected ] ||
5278 error "'$cmd' wrong: found $nums, expected $expected"
5280 expected=$(((NUMFILES + 1) * NUMDIRS + 1))
5281 cmd="$LFS find ! -uid $RUNAS_ID $dir"
5282 nums=$($cmd | wc -l)
5283 [ $nums -eq $expected ] ||
5284 error "'$cmd' wrong: found $nums, expected $expected"
5286 run_test 56p "check lfs find -uid and ! -uid"
5289 [ $RUNAS_ID -eq $UID ] &&
5290 skip_env "RUNAS_ID = UID = $UID -- skipping"
5292 local dir=$DIR/$tdir
5294 setup_56 $dir $NUMFILES $NUMDIRS
5295 chgrp $RUNAS_GID $dir/file* || error "chown $dir/file$i failed"
5297 local expected=$NUMFILES
5298 local cmd="$LFS find -gid $RUNAS_GID $dir"
5299 local nums=$($cmd | wc -l)
5301 [ $nums -eq $expected ] ||
5302 error "'$cmd' wrong: found $nums, expected $expected"
5304 expected=$(( ($NUMFILES+1) * $NUMDIRS + 1))
5305 cmd="$LFS find ! -gid $RUNAS_GID $dir"
5306 nums=$($cmd | wc -l)
5307 [ $nums -eq $expected ] ||
5308 error "'$cmd' wrong: found $nums, expected $expected"
5310 run_test 56q "check lfs find -gid and ! -gid"
5313 local dir=$DIR/$tdir
5315 setup_56 $dir $NUMFILES $NUMDIRS
5318 local cmd="$LFS find -size 0 -type f -lazy $dir"
5319 local nums=$($cmd | wc -l)
5321 [ $nums -eq $expected ] ||
5322 error "'$cmd' wrong: found $nums, expected $expected"
5323 cmd="$LFS find -size 0 -type f $dir"
5324 nums=$($cmd | wc -l)
5325 [ $nums -eq $expected ] ||
5326 error "'$cmd' wrong: found $nums, expected $expected"
5329 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5330 nums=$($cmd | wc -l)
5331 [ $nums -eq $expected ] ||
5332 error "'$cmd' wrong: found $nums, expected $expected"
5333 cmd="$LFS find ! -size 0 -type f $dir"
5334 nums=$($cmd | wc -l)
5335 [ $nums -eq $expected ] ||
5336 error "'$cmd' wrong: found $nums, expected $expected"
5338 echo "test" > $dir/$tfile
5339 echo "test2" > $dir/$tfile.2 && sync
5341 cmd="$LFS find -size 5 -type f -lazy $dir"
5342 nums=$($cmd | wc -l)
5343 [ $nums -eq $expected ] ||
5344 error "'$cmd' wrong: found $nums, expected $expected"
5345 cmd="$LFS find -size 5 -type f $dir"
5346 nums=$($cmd | wc -l)
5347 [ $nums -eq $expected ] ||
5348 error "'$cmd' wrong: found $nums, expected $expected"
5351 cmd="$LFS find -size +5 -type f -lazy $dir"
5352 nums=$($cmd | wc -l)
5353 [ $nums -eq $expected ] ||
5354 error "'$cmd' wrong: found $nums, expected $expected"
5355 cmd="$LFS find -size +5 -type f $dir"
5356 nums=$($cmd | wc -l)
5357 [ $nums -eq $expected ] ||
5358 error "'$cmd' wrong: found $nums, expected $expected"
5361 cmd="$LFS find -size +0 -type f -lazy $dir"
5362 nums=$($cmd | wc -l)
5363 [ $nums -eq $expected ] ||
5364 error "'$cmd' wrong: found $nums, expected $expected"
5365 cmd="$LFS find -size +0 -type f $dir"
5366 nums=$($cmd | wc -l)
5367 [ $nums -eq $expected ] ||
5368 error "'$cmd' wrong: found $nums, expected $expected"
5371 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5372 nums=$($cmd | wc -l)
5373 [ $nums -eq $expected ] ||
5374 error "'$cmd' wrong: found $nums, expected $expected"
5375 cmd="$LFS find ! -size -5 -type f $dir"
5376 nums=$($cmd | wc -l)
5377 [ $nums -eq $expected ] ||
5378 error "'$cmd' wrong: found $nums, expected $expected"
5381 cmd="$LFS find -size -5 -type f -lazy $dir"
5382 nums=$($cmd | wc -l)
5383 [ $nums -eq $expected ] ||
5384 error "'$cmd' wrong: found $nums, expected $expected"
5385 cmd="$LFS find -size -5 -type f $dir"
5386 nums=$($cmd | wc -l)
5387 [ $nums -eq $expected ] ||
5388 error "'$cmd' wrong: found $nums, expected $expected"
5390 run_test 56r "check lfs find -size works"
5397 cancel_lru_locks $OSC
5399 local rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5400 local nums=$($cmd | wc -l)
5402 [ $nums -eq $expected ] ||
5403 error "'$cmd' wrong: found $nums, expected $expected"
5405 local rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5407 if (( rpcs_before + glimpses != rpcs_after )); then
5408 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5409 $LCTL get_param osc.*.stats | grep ldlm_glimpse_enqueue
5411 if [[ $glimpses == 0 ]]; then
5412 error "'$cmd' should not send glimpse RPCs to OST"
5414 error "'$cmd' should send $glimpses glimpse RPCs to OST"
5420 [[ $MDS1_VERSION -ge $(version_code 2.12.4) ]] ||
5421 skip "MDS < 2.12.4 doesn't return LSOM data"
5422 local dir=$DIR/$tdir
5424 [[ $OSC == "mdc" ]] && skip "DoM files"
5426 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5427 # open and close all files to ensure LSOM is updated
5428 cancel_lru_locks $OSC
5429 find $dir -type f | xargs cat > /dev/null
5431 # expect_found glimpse_rpcs command_to_run
5432 test_56ra_sub 12 0 "$LFS find -size 0 -type f -lazy $dir"
5433 test_56ra_sub 12 12 "$LFS find -size 0 -type f $dir"
5434 test_56ra_sub 0 0 "$LFS find ! -size 0 -type f -lazy $dir"
5435 test_56ra_sub 0 12 "$LFS find ! -size 0 -type f $dir"
5437 echo "test" > $dir/$tfile
5438 echo "test2" > $dir/$tfile.2 && sync
5439 cancel_lru_locks $OSC
5440 cat $dir/$tfile $dir/$tfile.2 > /dev/null
5442 test_56ra_sub 1 0 "$LFS find -size 5 -type f -lazy $dir"
5443 test_56ra_sub 1 14 "$LFS find -size 5 -type f $dir"
5444 test_56ra_sub 1 0 "$LFS find -size +5 -type f -lazy $dir"
5445 test_56ra_sub 1 14 "$LFS find -size +5 -type f $dir"
5447 test_56ra_sub 2 0 "$LFS find -size +0 -type f -lazy $dir"
5448 test_56ra_sub 2 14 "$LFS find -size +0 -type f $dir"
5449 test_56ra_sub 2 0 "$LFS find ! -size -5 -type f -lazy $dir"
5450 test_56ra_sub 2 14 "$LFS find ! -size -5 -type f $dir"
5451 test_56ra_sub 12 0 "$LFS find -size -5 -type f -lazy $dir"
5452 test_56ra_sub 12 14 "$LFS find -size -5 -type f $dir"
5454 run_test 56ra "check lfs find -size -lazy works for data on OSTs"
5456 test_56s() { # LU-611 #LU-9369
5457 [[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
5459 local dir=$DIR/$tdir
5460 local onestripe=$(((NUMDIRS + 1) * NUMFILES))
5462 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5463 for i in $(seq $NUMDIRS); do
5464 $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile
5467 local expected=$NUMDIRS
5468 local cmd="$LFS find -c $OSTCOUNT $dir"
5469 local nums=$($cmd | wc -l)
5471 [ $nums -eq $expected ] || {
5472 $LFS getstripe -R $dir
5473 error "'$cmd' wrong: found $nums, expected $expected"
5476 expected=$((NUMDIRS + onestripe))
5477 cmd="$LFS find -stripe-count +0 -type f $dir"
5478 nums=$($cmd | wc -l)
5479 [ $nums -eq $expected ] || {
5480 $LFS getstripe -R $dir
5481 error "'$cmd' wrong: found $nums, expected $expected"
5485 cmd="$LFS find -stripe-count 1 -type f $dir"
5486 nums=$($cmd | wc -l)
5487 [ $nums -eq $expected ] || {
5488 $LFS getstripe -R $dir
5489 error "'$cmd' wrong: found $nums, expected $expected"
5492 cmd="$LFS find -stripe-count -2 -type f $dir"
5493 nums=$($cmd | wc -l)
5494 [ $nums -eq $expected ] || {
5495 $LFS getstripe -R $dir
5496 error "'$cmd' wrong: found $nums, expected $expected"
5500 cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir"
5501 nums=$($cmd | wc -l)
5502 [ $nums -eq $expected ] || {
5503 $LFS getstripe -R $dir
5504 error "'$cmd' wrong: found $nums, expected $expected"
5507 run_test 56s "check lfs find -stripe-count works"
5509 test_56t() { # LU-611 #LU-9369
5510 local dir=$DIR/$tdir
5512 setup_56 $dir 0 $NUMDIRS
5513 for i in $(seq $NUMDIRS); do
5514 $LFS setstripe -S 8M $dir/dir$i/$tfile
5517 local expected=$NUMDIRS
5518 local cmd="$LFS find -S 8M $dir"
5519 local nums=$($cmd | wc -l)
5521 [ $nums -eq $expected ] || {
5522 $LFS getstripe -R $dir
5523 error "'$cmd' wrong: found $nums, expected $expected"
5527 setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k"
5529 $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3}
5531 expected=$(((NUMDIRS + 1) * NUMFILES))
5532 cmd="$LFS find -stripe-size 512k -type f $dir"
5533 nums=$($cmd | wc -l)
5534 [ $nums -eq $expected ] ||
5535 error "'$cmd' wrong: found $nums, expected $expected"
5537 cmd="$LFS find -stripe-size +320k -type f $dir"
5538 nums=$($cmd | wc -l)
5539 [ $nums -eq $expected ] ||
5540 error "'$cmd' wrong: found $nums, expected $expected"
5542 expected=$(((NUMDIRS + 1) * NUMFILES + 4))
5543 cmd="$LFS find -stripe-size +200k -type f $dir"
5544 nums=$($cmd | wc -l)
5545 [ $nums -eq $expected ] ||
5546 error "'$cmd' wrong: found $nums, expected $expected"
5548 cmd="$LFS find -stripe-size -640k -type f $dir"
5549 nums=$($cmd | wc -l)
5550 [ $nums -eq $expected ] ||
5551 error "'$cmd' wrong: found $nums, expected $expected"
5554 cmd="$LFS find -stripe-size 256k -type f $dir"
5555 nums=$($cmd | wc -l)
5556 [ $nums -eq $expected ] ||
5557 error "'$cmd' wrong: found $nums, expected $expected"
5559 cmd="$LFS find -stripe-size -320k -type f $dir"
5560 nums=$($cmd | wc -l)
5561 [ $nums -eq $expected ] ||
5562 error "'$cmd' wrong: found $nums, expected $expected"
5565 cmd="$LFS find -stripe-size 1024k -type f $dir"
5566 nums=$($cmd | wc -l)
5567 [ $nums -eq $expected ] ||
5568 error "'$cmd' wrong: found $nums, expected $expected"
5570 run_test 56t "check lfs find -stripe-size works"
5572 test_56u() { # LU-611
5573 local dir=$DIR/$tdir
5575 setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1"
5577 if [[ $OSTCOUNT -gt 1 ]]; then
5578 $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3}
5584 local expected=$(((NUMDIRS + 1) * NUMFILES))
5585 local cmd="$LFS find -stripe-index 0 -type f $dir"
5586 local nums=$($cmd | wc -l)
5588 [ $nums -eq $expected ] ||
5589 error "'$cmd' wrong: found $nums, expected $expected"
5592 cmd="$LFS find -stripe-index 1 -type f $dir"
5593 nums=$($cmd | wc -l)
5594 [ $nums -eq $expected ] ||
5595 error "'$cmd' wrong: found $nums, expected $expected"
5597 cmd="$LFS find ! -stripe-index 0 -type f $dir"
5598 nums=$($cmd | wc -l)
5599 [ $nums -eq $expected ] ||
5600 error "'$cmd' wrong: found $nums, expected $expected"
5603 # This should produce an error and not return any files
5604 cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir"
5605 nums=$($cmd 2>/dev/null | wc -l)
5606 [ $nums -eq $expected ] ||
5607 error "'$cmd' wrong: found $nums, expected $expected"
5609 if [[ $OSTCOUNT -gt 1 ]]; then
5610 expected=$(((NUMDIRS + 1) * NUMFILES + onestripe))
5611 cmd="$LFS find -stripe-index 0,1 -type f $dir"
5612 nums=$($cmd | wc -l)
5613 [ $nums -eq $expected ] ||
5614 error "'$cmd' wrong: found $nums, expected $expected"
5617 run_test 56u "check lfs find -stripe-index works"
5621 local dir=$DIR/$tdir
5623 setup_56 $dir $NUMFILES $NUMDIRS
5625 UUID=$(mdtuuid_from_index $mdt_idx $dir)
5626 [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $mdt_idx"
5628 for file in $($LFS find -m $UUID $dir); do
5629 file_midx=$($LFS getstripe -m $file)
5630 [ $file_midx -eq $mdt_idx ] ||
5631 error "lfs find -m $UUID != getstripe -m $file_midx"
5634 run_test 56v "check 'lfs find -m match with lfs getstripe -m'"
5637 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5638 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5640 local dir=$DIR/$tdir
5642 setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
5644 local stripe_size=$($LFS getstripe -S -d $dir) ||
5645 error "$LFS getstripe -S -d $dir failed"
5646 stripe_size=${stripe_size%% *}
5648 local file_size=$((stripe_size * OSTCOUNT))
5649 local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
5650 local required_space=$((file_num * file_size))
5651 local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
5653 [[ $free_space -le $((required_space / 1024)) ]] &&
5654 skip_env "need $required_space, have $free_space kbytes"
5657 local dd_count=$((file_size / dd_bs))
5659 # write data into the files
5664 for i in $(seq $NUMFILES); do
5666 yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5667 error "write data into $file failed"
5669 for i in $(seq $NUMDIRS); do
5670 for j in $(seq $NUMFILES); do
5671 file=$dir/dir$i/file$j
5672 yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5673 error "write data into $file failed"
5677 # $LFS_MIGRATE will fail if hard link migration is unsupported
5678 if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then
5679 createmany -l$dir/dir1/file1 $dir/dir1/link 200 ||
5680 error "creating links to $dir/dir1/file1 failed"
5685 [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
5688 local cmd="$LFS_MIGRATE -y -c $expected $dir/file1"
5691 eval $cmd || error "$cmd failed"
5693 check_stripe_count $dir/file1 $expected
5695 if [ $MDS1_VERSION -ge $(version_code 2.6.90) ];
5697 # lfs_migrate file onto OST 0 if it is on OST 1, or onto
5698 # OST 1 if it is on OST 0. This file is small enough to
5699 # be on only one stripe.
5700 file=$dir/migr_1_ost
5701 dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
5702 error "write data into $file failed"
5703 local obdidx=$($LFS getstripe -i $file)
5704 local oldmd5=$(md5sum $file)
5707 [[ $obdidx -eq 0 ]] && newobdidx=1
5708 cmd="$LFS migrate -i $newobdidx $file"
5710 eval $cmd || error "$cmd failed"
5712 local realobdix=$($LFS getstripe -i $file)
5713 local newmd5=$(md5sum $file)
5715 [[ $newobdidx -ne $realobdix ]] &&
5716 error "new OST is different (was=$obdidx, "\
5717 "wanted=$newobdidx, got=$realobdix)"
5718 [[ "$oldmd5" != "$newmd5" ]] &&
5719 error "md5sum differ: $oldmd5, $newmd5"
5723 cmd="$LFS_MIGRATE -y -c $expected $dir/dir1"
5725 eval $cmd || error "$cmd failed"
5727 for j in $(seq $NUMFILES); do
5728 check_stripe_count $dir/dir1/file$j $expected
5731 # lfs_migrate works with lfs find
5732 cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir |
5733 $LFS_MIGRATE -y -c $expected"
5735 eval $cmd || error "$cmd failed"
5737 for i in $(seq 2 $NUMFILES); do
5738 check_stripe_count $dir/file$i $expected
5740 for i in $(seq 2 $NUMDIRS); do
5741 for j in $(seq $NUMFILES); do
5742 check_stripe_count $dir/dir$i/file$j $expected
5746 run_test 56w "check lfs_migrate -c stripe_count works"
5749 local file1=$DIR/$tdir/file1
5750 local create_pool=false
5751 local initial_pool=$($LFS getstripe -p $DIR)
5755 echo -n "Creating test dir..."
5756 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5759 echo -n "Creating test file..."
5760 touch $file1 || error "cannot create file"
5763 echo -n "Detecting existing pools..."
5764 pool_list=($($LFS pool_list $FSNAME | grep "$FSNAME\." | cut -d. -f2))
5766 if [ ${#pool_list[@]} -gt 0 ]; then
5767 echo "${pool_list[@]}"
5768 for thispool in "${pool_list[@]}"; do
5769 if [[ -z "$initial_pool" ||
5770 "$initial_pool" != "$thispool" ]]; then
5772 echo "Using existing pool '$pool'"
5777 echo "none detected."
5779 if [ -z "$pool" ]; then
5780 pool=${POOL:-testpool}
5781 [ "$initial_pool" = "$pool" ] && pool="testpool2"
5782 echo -n "Creating pool '$pool'..."
5784 pool_add $pool &> /dev/null ||
5785 error "pool_add failed"
5788 echo -n "Adding target to pool..."
5789 pool_add_targets $pool 0 0 1 &> /dev/null ||
5790 error "pool_add_targets failed"
5794 echo -n "Setting pool using -p option..."
5795 $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null ||
5796 error "migrate failed rc = $?"
5799 echo -n "Verifying test file is in pool after migrating..."
5800 [ "$($LFS getstripe -p $file1)" = $pool ] ||
5801 error "file was not migrated to pool $pool"
5804 echo -n "Removing test file from pool '$pool'..."
5805 # "lfs migrate $file" won't remove the file from the pool
5806 # until some striping information is changed.
5807 $LFS migrate -c 1 $file1 &> /dev/null ||
5808 error "cannot remove from pool"
5809 [ "$($LFS getstripe -p $file1)" ] &&
5810 error "pool still set"
5813 echo -n "Setting pool using --pool option..."
5814 $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null ||
5815 error "migrate failed rc = $?"
5820 if $create_pool; then
5821 destroy_test_pools 2> /dev/null ||
5822 error "destroy test pools failed"
5825 run_test 56wb "check lfs_migrate pool support"
5828 local file1="$DIR/$tdir/file1"
5835 echo -n "Creating test dir..."
5836 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5837 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
5838 error "cannot set stripe by '-S 1M -c 1'"
5841 echo -n "Setting initial stripe for test file..."
5842 $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
5843 error "cannot set stripe"
5844 cur_ssize=$($LFS getstripe -S "$file1")
5845 [ $cur_ssize -eq 524288 ] || error "setstripe -S $cur_ssize != 524288"
5848 # File currently set to -S 512K -c 1
5850 # Ensure -c and -S options are rejected when -R is set
5851 echo -n "Verifying incompatible options are detected..."
5852 $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null &&
5853 error "incompatible -c and -R options not detected"
5854 $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null &&
5855 error "incompatible -S and -R options not detected"
5858 # Ensure unrecognized options are passed through to 'lfs migrate'
5859 echo -n "Verifying -S option is passed through to lfs migrate..."
5860 $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
5861 error "migration failed"
5862 cur_ssize=$($LFS getstripe -S "$file1")
5863 [ $cur_ssize -eq 1048576 ] || error "migrate -S $cur_ssize != 1048576"
5866 # File currently set to -S 1M -c 1
5868 # Ensure long options are supported
5869 echo -n "Verifying long options supported..."
5870 $LFS_MIGRATE -y --non-block "$file1" &> /dev/null ||
5871 error "long option without argument not supported"
5872 $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
5873 error "long option with argument not supported"
5874 cur_ssize=$($LFS getstripe -S "$file1")
5875 [ $cur_ssize -eq 524288 ] ||
5876 error "migrate --stripe-size $cur_ssize != 524288"
5879 # File currently set to -S 512K -c 1
5881 if [ "$OSTCOUNT" -gt 1 ]; then
5882 echo -n "Verifying explicit stripe count can be set..."
5883 $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
5884 error "migrate failed"
5885 cur_scount=$($LFS getstripe -c "$file1")
5886 [ $cur_scount -eq 2 ] || error "migrate -c $cur_scount != 2"
5890 # File currently set to -S 512K -c 1 or -S 512K -c 2
5892 # Ensure parent striping is used if -R is set, and no stripe
5893 # count or size is specified
5894 echo -n "Setting stripe for parent directory..."
5895 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5896 error "cannot set stripe '-S 2M -c 1'"
5899 echo -n "Verifying restripe option uses parent stripe settings..."
5900 parent_ssize=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
5901 parent_scount=$($LFS getstripe -c $DIR/$tdir 2>/dev/null)
5902 $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
5903 error "migrate failed"
5904 cur_ssize=$($LFS getstripe -S "$file1")
5905 [ $cur_ssize -eq $parent_ssize ] ||
5906 error "migrate -R stripe_size $cur_ssize != $parent_ssize"
5907 cur_scount=$($LFS getstripe -c "$file1")
5908 [ $cur_scount -eq $parent_scount ] ||
5909 error "migrate -R stripe_count $cur_scount != $parent_scount"
5912 # File currently set to -S 1M -c 1
5914 # Ensure striping is preserved if -R is not set, and no stripe
5915 # count or size is specified
5916 echo -n "Verifying striping size preserved when not specified..."
5917 orig_ssize=$($LFS getstripe -S "$file1" 2>/dev/null)
5918 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5919 error "cannot set stripe on parent directory"
5920 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5921 error "migrate failed"
5922 cur_ssize=$($LFS getstripe -S "$file1")
5923 [ $cur_ssize -eq $orig_ssize ] ||
5924 error "migrate by default $cur_ssize != $orig_ssize"
5927 # Ensure file name properly detected when final option has no argument
5928 echo -n "Verifying file name properly detected..."
5929 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5930 error "file name interpreted as option argument"
5936 run_test 56wc "check unrecognized options for lfs_migrate are passed through"
5939 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5941 local file1=$DIR/$tdir/file1
5943 echo -n "Creating test dir..."
5944 test_mkdir $DIR/$tdir || error "cannot create dir"
5947 echo -n "Creating test file..."
5951 # Ensure 'lfs migrate' will fail by using a non-existent option,
5952 # and make sure rsync is not called to recover
5953 echo -n "Make sure --no-rsync option works..."
5954 $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 |
5955 grep -q 'refusing to fall back to rsync' ||
5956 error "rsync was called with --no-rsync set"
5959 # Ensure rsync is called without trying 'lfs migrate' first
5960 echo -n "Make sure --rsync option works..."
5961 $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 |
5962 grep -q 'falling back to rsync' &&
5963 error "lfs migrate was called with --rsync set"
5966 echo -n "Make sure --rsync and --no-rsync options are exclusive..."
5967 $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 |
5968 grep -q 'at the same time' ||
5969 error "--rsync and --no-rsync accepted concurrently"
5975 run_test 56wd "check lfs_migrate --rsync and --no-rsync work"
5978 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5979 check_swap_layouts_support
5981 local dir=$DIR/$tdir
5982 local ref1=/etc/passwd
5983 local file1=$dir/file1
5985 test_mkdir $dir || error "creating dir $dir"
5986 $LFS setstripe -c 2 $file1
5988 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
5989 stripe=$($LFS getstripe -c $file1)
5990 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
5991 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
5996 run_test 56x "lfs migration support"
5999 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6000 check_swap_layouts_support
6002 local dir=$DIR/$tdir/$testnum
6006 local ref1=/etc/passwd
6007 local file1=$dir/file1
6009 $LFS setstripe -c 2 $file1
6011 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
6013 local stripe=$($LFS getstripe -c $file1)
6015 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6016 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6021 run_test 56xa "lfs migration --block support"
6023 check_migrate_links() {
6025 local file1="$dir/file1"
6028 local total_count=$(($begin + $count - 1))
6029 local symlink_count=10
6032 if [ ! -f "$file1" ]; then
6033 echo -n "creating initial file..."
6034 $LFS setstripe -c 1 -S "512k" "$file1" ||
6035 error "cannot setstripe initial file"
6038 echo -n "creating symlinks..."
6039 for s in $(seq 1 $symlink_count); do
6040 ln -s "$file1" "$dir/slink$s" ||
6041 error "cannot create symlinks"
6045 echo -n "creating nonlinked files..."
6046 createmany -o "$dir/uniq" 1 10 &> /dev/null ||
6047 error "cannot create nonlinked files"
6052 if [ ! -f "$dir/file$total_count" ]; then
6053 echo -n "creating hard links $begin:$total_count..."
6054 createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
6055 /dev/null || error "cannot create hard links"
6059 echo -n "checking number of hard links listed in xattrs..."
6060 local fid=$($LFS getstripe -F "$file1")
6061 local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
6064 if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
6065 skip "hard link list has unexpected size, skipping test"
6067 if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
6068 error "link names should exceed xattrs size"
6071 echo -n "migrating files..."
6072 local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir)
6074 [ $rc -eq 0 ] || error "migrate failed rc = $rc"
6077 # make sure all links have been properly migrated
6078 echo -n "verifying files..."
6079 fid=$($LFS getstripe -F "$file1") ||
6080 error "cannot get fid for file $file1"
6081 for i in $(seq 2 $total_count); do
6082 local fid2=$($LFS getstripe -F $dir/file$i)
6084 [ "$fid2" == "$fid" ] ||
6085 error "migrated hard link has mismatched FID"
6088 # make sure hard links were properly detected, and migration was
6089 # performed only once for the entire link set; nonlinked files should
6091 local actual=$(grep -c 'done' <<< "$migrate_out")
6092 local expected=$(($uniq_count + 1))
6094 [ "$actual" -eq "$expected" ] ||
6095 error "hard links individually migrated ($actual != $expected)"
6097 # make sure the correct number of hard links are present
6098 local hardlinks=$(stat -c '%h' "$file1")
6100 [ $hardlinks -eq $total_count ] ||
6101 error "num hard links $hardlinks != $total_count"
6108 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
6109 skip "Need MDS version at least 2.10.55"
6111 local dir="$DIR/$tdir"
6113 test_mkdir "$dir" || error "cannot create dir $dir"
6115 echo "testing lfs migrate mode when all links fit within xattrs"
6116 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 2 99
6118 echo "testing rsync mode when all links fit within xattrs"
6119 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 2 99
6121 echo "testing lfs migrate mode when all links do not fit within xattrs"
6122 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100
6124 echo "testing rsync mode when all links do not fit within xattrs"
6125 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 101 100
6131 run_test 56xb "lfs migration hard link support"
6134 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6136 local dir="$DIR/$tdir"
6138 test_mkdir "$dir" || error "cannot create dir $dir"
6140 # Test 1: ensure file < 1 GB is always migrated with 1 stripe
6141 echo -n "Setting initial stripe for 20MB test file..."
6142 $LFS setstripe -c 2 -i 0 "$dir/20mb" ||
6143 error "cannot setstripe 20MB file"
6145 echo -n "Sizing 20MB test file..."
6146 truncate "$dir/20mb" 20971520 || error "cannot create 20MB test file"
6148 echo -n "Verifying small file autostripe count is 1..."
6149 $LFS_MIGRATE -y -A -C 1 "$dir/20mb" ||
6150 error "cannot migrate 20MB file"
6151 local stripe_count=$($LFS getstripe -c "$dir/20mb") ||
6152 error "cannot get stripe for $dir/20mb"
6153 [ $stripe_count -eq 1 ] ||
6154 error "unexpected stripe count $stripe_count for 20MB file"
6158 # Test 2: File is small enough to fit within the available space on
6159 # sqrt(size_in_gb) + 1 OSTs but is larger than 1GB. The file must
6160 # have at least an additional 1KB for each desired stripe for test 3
6161 echo -n "Setting stripe for 1GB test file..."
6162 $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe 1GB file"
6164 echo -n "Sizing 1GB test file..."
6165 # File size is 1GB + 3KB
6166 truncate "$dir/1gb" 1073744896 || error "cannot create 1GB test file"
6169 # need at least 512MB per OST for 1GB file to fit in 2 stripes
6170 local avail=$($LCTL get_param -n llite.$FSNAME*.kbytesavail)
6171 if (( avail > 524288 * OSTCOUNT )); then
6172 echo -n "Migrating 1GB file..."
6173 $LFS_MIGRATE -y -A -C 1 "$dir/1gb" ||
6174 error "cannot migrate 1GB file"
6176 echo -n "Verifying autostripe count is sqrt(n) + 1..."
6177 stripe_count=$($LFS getstripe -c "$dir/1gb") ||
6178 error "cannot getstripe for 1GB file"
6179 [ $stripe_count -eq 2 ] ||
6180 error "unexpected stripe count $stripe_count != 2"
6184 # Test 3: File is too large to fit within the available space on
6185 # sqrt(n) + 1 OSTs. Simulate limited available space with -X
6186 if [ $OSTCOUNT -ge 3 ]; then
6187 # The required available space is calculated as
6188 # file size (1GB + 3KB) / OST count (3).
6189 local kb_per_ost=349526
6191 echo -n "Migrating 1GB file with limit..."
6192 $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" ||
6193 error "cannot migrate 1GB file with limit"
6196 stripe_count=$($LFS getstripe -c "$dir/1gb")
6197 echo -n "Verifying 1GB autostripe count with limited space..."
6198 [ "$stripe_count" -a $stripe_count -ge 3 ] ||
6199 error "unexpected stripe count $stripe_count (min 3)"
6206 run_test 56xc "lfs migration autostripe"
6209 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6211 local dir=$DIR/$tdir
6212 local f_mgrt=$dir/$tfile.mgrt
6213 local f_yaml=$dir/$tfile.yaml
6214 local f_copy=$dir/$tfile.copy
6215 local layout_yaml="-E 1M -S 512K -c 1 -E -1 -S 1M -c 2 -i 0"
6216 local layout_copy="-c 2 -S 2M -i 1"
6217 local yamlfile=$dir/yamlfile
6218 local layout_before;
6221 test_mkdir "$dir" || error "cannot create dir $dir"
6222 $LFS setstripe $layout_yaml $f_yaml ||
6223 error "cannot setstripe $f_yaml with layout $layout_yaml"
6224 $LFS getstripe --yaml $f_yaml > $yamlfile
6225 $LFS setstripe $layout_copy $f_copy ||
6226 error "cannot setstripe $f_copy with layout $layout_copy"
6228 dd if=/dev/zero of=$f_mgrt bs=1M count=4
6230 # 1. test option --yaml
6231 $LFS_MIGRATE -y --yaml $yamlfile $f_mgrt ||
6232 error "cannot migrate $f_mgrt with --yaml $yamlfile"
6233 layout_before=$(get_layout_param $f_yaml)
6234 layout_after=$(get_layout_param $f_mgrt)
6235 [ "$layout_after" == "$layout_before" ] ||
6236 error "lfs_migrate --yaml: $layout_after != $layout_before"
6238 # 2. test option --copy
6239 $LFS_MIGRATE -y --copy $f_copy $f_mgrt ||
6240 error "cannot migrate $f_mgrt with --copy $f_copy"
6241 layout_before=$(get_layout_param $f_copy)
6242 layout_after=$(get_layout_param $f_mgrt)
6243 [ "$layout_after" == "$layout_before" ] ||
6244 error "lfs_migrate --copy: $layout_after != $layout_before"
6246 run_test 56xd "check lfs_migrate --yaml and --copy support"
6249 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6251 local dir=$DIR/$tdir
6252 local f_comp=$dir/$tfile
6253 local layout="-E 1M -S 512K -c 1 -E -1 -S 1M -c 2 -i 0"
6254 local layout_before=""
6255 local layout_after=""
6257 test_mkdir "$dir" || error "cannot create dir $dir"
6258 $LFS setstripe $layout $f_comp ||
6259 error "cannot setstripe $f_comp with layout $layout"
6260 layout_before=$(get_layout_param $f_comp)
6261 dd if=/dev/zero of=$f_comp bs=1M count=4
6263 # 1. migrate a comp layout file by lfs_migrate
6264 $LFS_MIGRATE -y $f_comp || error "cannot migrate $f_comp by lfs_migrate"
6265 layout_after=$(get_layout_param $f_comp)
6266 [ "$layout_before" == "$layout_after" ] ||
6267 error "lfs_migrate: $layout_before != $layout_after"
6269 # 2. migrate a comp layout file by lfs migrate
6270 $LFS migrate $f_comp || error "cannot migrate $f_comp by lfs migrate"
6271 layout_after=$(get_layout_param $f_comp)
6272 [ "$layout_before" == "$layout_after" ] ||
6273 error "lfs migrate: $layout_before != $layout_after"
6275 run_test 56xe "migrate a composite layout file"
6278 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
6279 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
6282 local dir=$DIR/$tdir
6286 test_mkdir -p $dir || error "creating dir $dir"
6287 touch $f1 || error "creating std file $f1"
6288 $MULTIOP $f2 H2c || error "creating released file $f2"
6290 # a directory can be raid0, so ask only for files
6291 res=$($LFS find $dir -L raid0 -type f | wc -l)
6292 [[ $res == 2 ]] || error "search raid0: found $res files != 2"
6294 res=$($LFS find $dir \! -L raid0 -type f | wc -l)
6295 [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
6297 # only files can be released, so no need to force file search
6298 res=$($LFS find $dir -L released)
6299 [[ $res == $f2 ]] || error "search released: found $res != $f2"
6301 res=$($LFS find $dir -type f \! -L released)
6302 [[ $res == $f1 ]] || error "search !released: found $res != $f1"
6304 run_test 56y "lfs find -L raid0|released"
6306 test_56z() { # LU-4824
6307 # This checks to make sure 'lfs find' continues after errors
6308 # There are two classes of errors that should be caught:
6309 # - If multiple paths are provided, all should be searched even if one
6311 # - If errors are encountered during the search, it should not terminate
6313 local dir=$DIR/$tdir
6317 for i in d{0..9}; do
6319 touch $dir/$i/$tfile
6321 $LFS find $DIR/non_existent_dir $dir &&
6322 error "$LFS find did not return an error"
6323 # Make a directory unsearchable. This should NOT be the last entry in
6324 # directory order. Arbitrarily pick the 6th entry
6325 chmod 700 $($LFS find $dir -type d | sed '6!d')
6327 $RUNAS $LFS find $DIR/non_existent $dir
6328 local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l)
6330 # The user should be able to see 10 directories and 9 files
6331 (( count == 19 )) ||
6332 error "$LFS find found $count != 19 entries after error"
6334 run_test 56z "lfs find should continue after an error"
6336 test_56aa() { # LU-5937
6337 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
6339 local dir=$DIR/$tdir
6342 $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
6344 createmany -o $dir/striped_dir/${tfile}- 1024
6345 local dirs=$($LFS find --size +8k $dir/)
6347 [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
6349 run_test 56aa "lfs find --size under striped dir"
6351 test_56ab() { # LU-10705
6352 test_mkdir $DIR/$tdir
6353 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
6354 dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
6355 dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
6356 # Flush writes to ensure valid blocks. Need to be more thorough for
6357 # ZFS, since blocks are not allocated/returned to client immediately.
6359 wait_zfs_commit ost1 2
6360 cancel_lru_locks osc
6363 local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
6365 [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
6367 files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
6368 [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
6370 rm -f $DIR/$tdir/$tfile.[123]
6372 run_test 56ab "lfs find --blocks"
6375 [ $MDS1_VERSION -lt $(version_code 2.10.50) ] &&
6376 skip "Need MDS version at least 2.10.50"
6378 # Create composite files with one component
6379 local dir=$DIR/$tdir
6381 setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
6382 # Create composite files with three components
6383 setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
6384 # Create non-composite files
6385 createmany -o $dir/${tfile}- 10
6387 local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l)
6389 [[ $nfiles == 10 ]] ||
6390 error "lfs find -E 1M found $nfiles != 10 files"
6392 nfiles=$($LFS find ! -E 1M --type f $dir | wc -l)
6393 [[ $nfiles == 25 ]] ||
6394 error "lfs find ! -E 1M found $nfiles != 25 files"
6396 # All files have a component that starts at 0
6397 nfiles=$($LFS find --component-start 0 --type f $dir | wc -l)
6398 [[ $nfiles == 35 ]] ||
6399 error "lfs find --component-start 0 - $nfiles != 35 files"
6401 nfiles=$($LFS find --component-start 2M --type f $dir | wc -l)
6402 [[ $nfiles == 15 ]] ||
6403 error "lfs find --component-start 2M - $nfiles != 15 files"
6405 # All files created here have a componenet that does not starts at 2M
6406 nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l)
6407 [[ $nfiles == 35 ]] ||
6408 error "lfs find ! --component-start 2M - $nfiles != 35 files"
6410 # Find files with a specified number of components
6411 local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l)
6412 [[ $nfiles == 15 ]] ||
6413 error "lfs find --component-count 3 - $nfiles != 15 files"
6415 # Remember non-composite files have a component count of zero
6416 local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l)
6417 [[ $nfiles == 10 ]] ||
6418 error "lfs find --component-count 0 - $nfiles != 10 files"
6420 nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l)
6421 [[ $nfiles == 20 ]] ||
6422 error "lfs find ! --component-count 3 - $nfiles != 20 files"
6424 # All files have a flag called "init"
6425 local nfiles=$($LFS find --component-flags init --type f $dir | wc -l)
6426 [[ $nfiles == 35 ]] ||
6427 error "lfs find --component-flags init - $nfiles != 35 files"
6429 # Multi-component files will have a component not initialized
6430 local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l)
6431 [[ $nfiles == 15 ]] ||
6432 error "lfs find !--component-flags init - $nfiles != 15 files"
6437 run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
6440 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
6441 skip "Need MDS version at least 2.10.57"
6451 # create mirrored directories and mirrored files
6452 mkdir $td || error "mkdir $td failed"
6453 $LFS mirror create -N3 $td || error "create mirrored dir $td failed"
6454 createmany -o $tf- 10 || error "create $tf- failed"
6456 for i in $(seq 2); do
6458 mkdir $dir || error "mkdir $dir failed"
6459 $LFS mirror create -N$((3 + i)) $dir ||
6460 error "create mirrored dir $dir failed"
6461 createmany -o $dir/$tfile- 10 ||
6462 error "create $dir/$tfile- failed"
6465 # change the states of some mirrored files
6467 for i in $(seq 2); do
6469 for j in $(seq 4 9); do
6470 echo foo > $dir/$tfile-$j
6474 # find mirrored files with specific mirror count
6475 cmd="$LFS find --mirror-count 3 --type f $td"
6476 nfiles=$($cmd | wc -l)
6477 [[ $nfiles = 10 ]] || error "$cmd: $nfiles != 10 files"
6479 cmd="$LFS find ! --mirror-count 3 --type f $td"
6480 nfiles=$($cmd | wc -l)
6481 [[ $nfiles = 20 ]] || error "$cmd: $nfiles != 20 files"
6483 cmd="$LFS find --mirror-count +2 --type f $td"
6484 nfiles=$($cmd | wc -l)
6485 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6487 cmd="$LFS find --mirror-count -6 --type f $td"
6488 nfiles=$($cmd | wc -l)
6489 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6491 # find mirrored files with specific file state
6492 cmd="$LFS find --maxdepth 1 --mirror-state=^ro --type f $td"
6493 [[ $($cmd) = $tf-6 ]] || error "$cmd: didn't return $tf-6"
6495 cmd="$LFS find --mirror-state=ro --type f $td"
6496 nfiles=$($cmd | wc -l)
6497 [[ $nfiles = 17 ]] || error "$cmd: $nfiles != 17 files"
6499 cmd="$LFS find ! --mirror-state=ro --type f $td"
6500 nfiles=$($cmd | wc -l)
6501 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6503 cmd="$LFS find --mirror-state=wp --type f $td"
6504 nfiles=$($cmd | wc -l)
6505 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6507 cmd="$LFS find ! --mirror-state=sp --type f $td"
6508 nfiles=$($cmd | wc -l)
6509 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6511 run_test 56ca "check lfs find --mirror-count|-N and --mirror-state"
6514 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6515 # note test will not do anything if MDS is not local
6516 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6517 skip_env "ldiskfs only test"
6519 remote_mds_nodsh && skip "remote MDS with nodsh"
6521 local MNTDEV="osd*.*MDT*.mntdev"
6522 DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV)
6523 [ -z "$DEV" ] && error "can't access $MNTDEV"
6524 for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
6525 do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
6526 error "can't access $DEV"
6527 DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
6528 [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
6532 run_test 57a "verify MDS filesystem created with large inodes =="
6535 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6536 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6537 skip_env "ldiskfs only test"
6539 remote_mds_nodsh && skip "remote MDS with nodsh"
6541 local dir=$DIR/$tdir
6544 local fileN=$dir/f$filecount
6546 rm -rf $dir || error "removing $dir"
6548 local mdtidx=$($LFS getstripe -m $dir)
6549 local mdtname=MDT$(printf %04x $mdtidx)
6550 local facet=mds$((mdtidx + 1))
6552 echo "mcreating $filecount files"
6553 createmany -m $dir/f 1 $filecount || error "creating files in $dir"
6555 # verify that files do not have EAs yet
6556 $LFS getstripe $file1 2>&1 | grep -q "no stripe" ||
6557 error "$file1 has an EA"
6558 $LFS getstripe $fileN 2>&1 | grep -q "no stripe" ||
6559 error "$fileN has an EA"
6563 df $dir #make sure we get new statfs data
6564 local mdsfree=$(do_facet $facet \
6565 lctl get_param -n osd*.*$mdtname.kbytesfree)
6566 local mdcfree=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6569 echo "opening files to create objects/EAs"
6570 for file in $(seq -f $dir/f%g 1 $filecount); do
6571 $OPENFILE -f O_RDWR $file > /dev/null 2>&1 ||
6572 error "opening $file"
6575 # verify that files have EAs now
6576 $LFS getstripe $file1 | grep -q "obdidx" || error "$file1 missing EA"
6577 $LFS getstripe $fileN | grep -q "obdidx" || error "$fileN missing EA"
6579 sleep 1 #make sure we get new statfs data
6581 local mdsfree2=$(do_facet $facet \
6582 lctl get_param -n osd*.*$mdtname.kbytesfree)
6583 local mdcfree2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6585 if [[ $mdcfree2 -lt $((mdcfree - 16)) ]]; then
6586 if [ "$mdsfree" != "$mdsfree2" ]; then
6587 error "MDC before $mdcfree != after $mdcfree2"
6589 echo "MDC before $mdcfree != after $mdcfree2"
6590 echo "unable to confirm if MDS has large inodes"
6595 run_test 57b "default LOV EAs are stored inside large inodes ==="
6598 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6599 [ -z "$(which wiretest 2>/dev/null)" ] &&
6600 skip_env "could not find wiretest"
6604 run_test 58 "verify cross-platform wire constants =============="
6607 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6609 echo "touch 130 files"
6610 createmany -o $DIR/f59- 130
6612 unlinkmany $DIR/f59- 130
6614 # wait for commitment of removal
6615 wait_delete_completed
6617 run_test 59 "verify cancellation of llog records async ========="
6619 TEST60_HEAD="test_60 run $RANDOM"
6621 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6622 remote_mgs_nodsh && skip "remote MGS with nodsh"
6623 do_facet mgs "! which run-llog.sh &> /dev/null" &&
6624 do_facet mgs "! ls run-llog.sh &> /dev/null" &&
6625 skip_env "missing subtest run-llog.sh"
6627 log "$TEST60_HEAD - from kernel mode"
6628 do_facet mgs "$LCTL dk > /dev/null"
6629 do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed"
6630 do_facet mgs $LCTL dk > $TMP/$tfile
6632 # LU-6388: test llog_reader
6633 local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
6634 llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
6635 [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
6636 skip_env "missing llog_reader"
6637 local fstype=$(facet_fstype mgs)
6638 [ $fstype != ldiskfs -a $fstype != zfs ] &&
6639 skip_env "Only for ldiskfs or zfs type mgs"
6641 local mntpt=$(facet_mntpt mgs)
6642 local mgsdev=$(mgsdevname 1)
6654 #get fid and record list
6655 fid_list=($(awk '/9_sub.*record/ { print $NF }' /$TMP/$tfile |
6657 rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' /$TMP/$tfile |
6659 #remount mgs as ldiskfs or zfs type
6660 stop mgs || error "stop mgs failed"
6661 mount_fstype mgs || error "remount mgs failed"
6662 for ((i = 0; i < ${#fid_list[@]}; i++)); do
6665 seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
6666 oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
6671 obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
6673 obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
6675 echo "obj_file is $obj_file"
6676 do_facet mgs $llog_reader $obj_file
6678 rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
6679 awk '{ print $3 }' | sed -e "s/^type=//g")
6680 if [ $rec_type != $rec ]; then
6681 echo "FAILED test_60a wrong record type $rec_type," \
6687 #check obj path if record type is LLOG_LOGID_MAGIC
6688 if [ "$rec" == "1064553b" ]; then
6689 path=$(do_facet mgs $llog_reader $obj_file |
6690 grep "path=" | awk '{ print $NF }' |
6691 sed -e "s/^path=//g")
6692 if [ $obj_file != $mntpt/$path ]; then
6693 echo "FAILED test_60a wrong obj path" \
6694 "$montpt/$path, should be $obj_file"
6701 #restart mgs before "error", otherwise it will block the next test
6702 stop mgs || error "stop mgs failed"
6703 start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
6704 $pass || error "test failed, see FAILED test_60a messages for specifics"
6706 run_test 60a "llog_test run from kernel module and test llog_reader"
6708 test_60b() { # bug 6411
6709 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6712 LLOG_COUNT=$(do_facet mgs dmesg |
6713 awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
6714 /llog_[a-z]*.c:[0-9]/ {
6726 [[ $LLOG_COUNT -gt 120 ]] &&
6727 error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
6729 run_test 60b "limit repeated messages from CERROR/CWARN"
6732 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6734 echo "create 5000 files"
6735 createmany -o $DIR/f60c- 5000
6736 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137
6737 lctl set_param fail_loc=0x80000137
6738 unlinkmany $DIR/f60c- 5000
6739 lctl set_param fail_loc=0
6741 run_test 60c "unlink file when mds full"
6744 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6746 SAVEPRINTK=$(lctl get_param -n printk)
6747 # verify "lctl mark" is even working"
6748 MESSAGE="test message ID $RANDOM $$"
6749 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6750 dmesg | grep -q "$MESSAGE" || error "didn't find debug marker in log"
6752 lctl set_param printk=0 || error "set lnet.printk failed"
6753 lctl get_param -n printk | grep emerg || error "lnet.printk dropped emerg"
6754 MESSAGE="new test message ID $RANDOM $$"
6755 # Assume here that libcfs_debug_mark_buffer() uses D_WARNING
6756 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6757 dmesg | grep -q "$MESSAGE" && error "D_WARNING wasn't masked" || true
6759 lctl set_param -n printk="$SAVEPRINTK"
6761 run_test 60d "test printk console message masking"
6764 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6765 remote_mds_nodsh && skip "remote MDS with nodsh"
6768 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
6769 do_facet mds1 lctl set_param fail_loc=0x15b
6772 run_test 60e "no space while new llog is being created"
6777 test_mkdir -c $MDSCOUNT $DIR/$tdir
6778 $LFS setdirstripe -D -i -1 -c $MDSCOUNT $DIR/$tdir
6783 mkdir $DIR/$tdir/subdir$index 2>/dev/null
6784 rmdir $DIR/$tdir/subdir$index 2>/dev/null
6785 index=$((index + 1))
6791 for i in $(seq 100); do
6792 # define OBD_FAIL_OSD_TXN_START 0x19a
6793 do_facet mds1 lctl set_param fail_loc=0x8000019a
6799 mkdir $DIR/$tdir/new || error "mkdir failed"
6800 rmdir $DIR/$tdir/new || error "rmdir failed"
6802 run_test 60g "transaction abort won't cause MDT hung"
6805 [ $MDS1_VERSION -le $(version_code 2.12.52) ] ||
6806 skip "Need MDS version at least 2.12.52"
6807 [ $MDSCOUNT -le 2 ] && skip "Need >= 2 MDTs"
6811 #define OBD_FAIL_MDS_STRIPE_CREATE 0x188
6812 #define OBD_FAIL_MDS_STRIPE_FID 0x189
6813 for fail_loc in 0x80000188 0x80000189; do
6814 do_facet mds1 "$LCTL set_param fail_loc=$fail_loc"
6815 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir-$fail_loc ||
6816 error "mkdir $dir-$fail_loc failed"
6817 for i in {0..10}; do
6818 # create may fail on missing stripe
6819 echo $i > $DIR/$tdir-$fail_loc/$i
6821 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6822 error "getdirstripe $tdir-$fail_loc failed"
6823 $LFS migrate -m 1 $DIR/$tdir-$fail_loc ||
6824 error "migrate $tdir-$fail_loc failed"
6825 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6826 error "getdirstripe $tdir-$fail_loc failed"
6827 pushd $DIR/$tdir-$fail_loc
6829 echo $f | cmp $f - || error "$f data mismatch"
6832 rm -rf $DIR/$tdir-$fail_loc
6835 run_test 60h "striped directory with missing stripes can be accessed"
6838 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6841 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1 || error "dd $f failed"
6842 cancel_lru_locks osc
6843 $MULTIOP $f OSMWUc || error "$MULTIOP $f failed"
6846 run_test 61a "mmap() writes don't make sync hang ================"
6849 mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
6851 run_test 61b "mmap() of unstriped file is successful"
6853 # bug 2330 - insufficient obd_match error checking causes LBUG
6855 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6859 cancel_lru_locks osc
6860 lctl set_param fail_loc=0x405
6861 cat $f && error "cat succeeded, expect -EIO"
6862 lctl set_param fail_loc=0
6864 # This test is now irrelevant (as of bug 10718 inclusion), we no longer
6865 # match every page all of the time.
6866 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
6868 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
6869 # Though this test is irrelevant anymore, it helped to reveal some
6870 # other grant bugs (LU-4482), let's keep it.
6871 test_63a() { # was test_63
6872 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6874 MAX_DIRTY_MB=$(lctl get_param -n osc.*.max_dirty_mb | head -n 1)
6876 for i in `seq 10` ; do
6877 dd if=/dev/zero of=$DIR/f63 bs=8k &
6883 rm -f $DIR/f63 || true
6885 run_test 63a "Verify oig_wait interruption does not crash ======="
6887 # bug 2248 - async write errors didn't return to application on sync
6888 # bug 3677 - async write errors left page locked
6890 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6893 lctl set_param debug=-1
6895 # ensure we have a grant to do async writes
6896 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
6899 sync # sync lest earlier test intercept the fail_loc
6901 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
6902 lctl set_param fail_loc=0x80000406
6903 $MULTIOP $DIR/$tfile Owy && \
6904 error "sync didn't return ENOMEM"
6905 sync; sleep 2; sync # do a real sync this time to flush page
6906 lctl get_param -n llite.*.dump_page_cache | grep locked && \
6907 error "locked page left in cache after async error" || true
6910 run_test 63b "async write errors should be returned to fsync ==="
6913 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6916 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
6918 run_test 64a "verify filter grant calculations (in kernel) ====="
6921 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6923 sh oos.sh $MOUNT || error "oos.sh failed: $?"
6925 run_test 64b "check out-of-space detection on client"
6928 $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
6930 run_test 64c "verify grant shrink"
6932 # this does exactly what osc_request.c:osc_announce_cached() does in
6933 # order to calculate max amount of grants to ask from server
6937 local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc)
6938 local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight)
6940 ((rpc_in_flight ++));
6941 nrpages=$((nrpages * rpc_in_flight))
6943 local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb)
6945 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
6947 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
6948 local undirty=$((nrpages * PAGE_SIZE))
6950 local max_extent_pages
6951 max_extent_pages=$($LCTL get_param osc.${tgt}.import |
6952 grep grant_max_extent_size | awk '{print $2}')
6953 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
6954 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
6955 local grant_extent_tax
6956 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
6957 grep grant_extent_tax | awk '{print $2}')
6959 undirty=$((undirty + nrextents * grant_extent_tax))
6964 # this is size of unit for grant allocation. It should be equal to
6965 # what tgt_grant.c:tgt_grant_chunk() calculates
6969 local grant_extent_tax
6971 max_brw_size=$($LCTL get_param osc.${tgt}.import |
6972 grep max_brw_size | awk '{print $2}')
6974 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
6975 grep grant_extent_tax | awk '{print $2}')
6977 echo $(((max_brw_size + grant_extent_tax) * 2))
6981 [ $OST1_VERSION -lt $(version_code 2.10.56) ] &&
6982 skip "OST < 2.10.55 doesn't limit grants enough"
6984 local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}')
6985 local file=$DIR/$tfile
6987 [[ $($LCTL get_param osc.${tgt}.import |
6988 grep "connect_flags:.*grant_param") ]] ||
6989 skip "no grant_param connect flag"
6991 local olddebug=$($LCTL get_param -n debug 2> /dev/null)
6993 $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true
6995 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
6996 stack_trap "rm -f $file" EXIT
6998 $SETSTRIPE $file -i 0 -c 1
6999 dd if=/dev/zero of=$file bs=1M count=1000 &
7004 local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes)
7005 if [[ $cur_grant -gt $max_cur_granted ]]
7008 error "cur_grant $cur_grant > $max_cur_granted"
7011 [[ $? -ne 0 ]] && break;
7016 wait_delete_completed
7017 $LCTL set_param debug="$olddebug" 2> /dev/null || true
7019 run_test 64d "check grant limit exceed"
7021 # bug 1414 - set/get directories' stripe info
7023 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7025 test_mkdir $DIR/$tdir
7027 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
7029 run_test 65a "directory with no stripe info"
7032 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7034 test_mkdir $DIR/$tdir
7035 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7037 $SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7040 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
7042 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
7045 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7046 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
7048 test_mkdir $DIR/$tdir
7049 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
7051 $LFS setstripe -S $((stripesize * 4)) -i 1 \
7052 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
7054 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
7056 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
7059 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7061 test_mkdir $DIR/$tdir
7062 local STRIPECOUNT=$($GETSTRIPE -c $DIR/$tdir)
7063 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7065 if [[ $STRIPECOUNT -le 0 ]]; then
7067 elif [[ $STRIPECOUNT -gt 2000 ]]; then
7068 #LOV_MAX_STRIPE_COUNT is 2000
7069 [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1))
7071 sc=$(($STRIPECOUNT - 1))
7073 $SETSTRIPE -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
7074 touch $DIR/$tdir/f4 $DIR/$tdir/f5
7075 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
7076 error "lverify failed"
7078 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
7081 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7083 test_mkdir $DIR/$tdir
7085 $SETSTRIPE $DIR/$tdir || error "setstripe"
7086 $GETSTRIPE -v $DIR/$tdir | grep "Default" ||
7087 error "no stripe info failed"
7089 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
7091 run_test 65e "directory setstripe defaults"
7094 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7096 test_mkdir $DIR/${tdir}f
7097 $RUNAS $SETSTRIPE $DIR/${tdir}f && error "setstripe succeeded" || true
7099 run_test 65f "dir setstripe permission (should return error) ==="
7102 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7104 test_mkdir $DIR/$tdir
7105 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7107 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7108 error "setstripe -S failed"
7109 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
7110 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7111 error "delete default stripe failed"
7113 run_test 65g "directory setstripe -d"
7116 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7118 test_mkdir $DIR/$tdir
7119 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7121 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7122 error "setstripe -S failed"
7123 test_mkdir $DIR/$tdir/dd1
7124 [ $($LFS getstripe -c $DIR/$tdir) = $($GETSTRIPE -c $DIR/$tdir/dd1) ] ||
7125 error "stripe info inherit failed"
7127 run_test 65h "directory stripe info inherit ===================="
7130 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7132 save_layout_restore_at_exit $MOUNT
7134 # bug6367: set non-default striping on root directory
7135 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
7137 # bug12836: getstripe on -1 default directory striping
7138 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
7140 # bug12836: getstripe -v on -1 default directory striping
7141 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
7143 # bug12836: new find on -1 default directory striping
7144 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
7146 run_test 65i "various tests to set root directory striping"
7148 test_65j() { # bug6367
7149 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7153 # if we aren't already remounting for each test, do so for this test
7154 if [ "$CLEANUP" = ":" -a "$I_MOUNTED" = "yes" ]; then
7155 cleanup || error "failed to unmount"
7159 save_layout_restore_at_exit $MOUNT
7161 $SETSTRIPE -d $MOUNT || error "setstripe failed"
7163 run_test 65j "set default striping on root directory (bug 6367)="
7167 wait_delete_completed
7168 do_facet $SINGLEMDS "lctl set_param -n \
7169 osp.$ost*MDT0000.max_create_count=$max_count"
7170 do_facet $SINGLEMDS "lctl set_param -n \
7171 osp.$ost*MDT0000.create_count=$count"
7172 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7173 echo $INACTIVE_OSC "is Activate"
7175 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7178 test_65k() { # bug11679
7179 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7180 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7181 remote_mds_nodsh && skip "remote MDS with nodsh"
7183 local disable_precreate=true
7184 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
7185 disable_precreate=false
7187 echo "Check OST status: "
7188 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
7189 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
7191 for OSC in $MDS_OSCS; do
7192 echo $OSC "is active"
7193 do_facet $SINGLEMDS lctl --device %$OSC activate
7196 for INACTIVE_OSC in $MDS_OSCS; do
7197 local ost=$(osc_to_ost $INACTIVE_OSC)
7198 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
7199 lov.*md*.target_obd |
7200 awk -F: /$ost/'{ print $1 }' | head -n 1)
7203 $SETSTRIPE -i $ostnum -c 1 $DIR/$tdir
7204 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
7206 echo "Deactivate: " $INACTIVE_OSC
7207 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
7209 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
7210 osp.$ost*MDT0000.create_count")
7211 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
7212 osp.$ost*MDT0000.max_create_count")
7213 $disable_precreate &&
7214 do_facet $SINGLEMDS "lctl set_param -n \
7215 osp.$ost*MDT0000.max_create_count=0"
7217 for idx in $(seq 0 $((OSTCOUNT - 1))); do
7218 [ -f $DIR/$tdir/$idx ] && continue
7219 echo "$SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx"
7220 $SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx ||
7222 error "setstripe $idx should succeed"; }
7223 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
7225 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
7228 do_facet $SINGLEMDS "lctl set_param -n \
7229 osp.$ost*MDT0000.max_create_count=$max_count"
7230 do_facet $SINGLEMDS "lctl set_param -n \
7231 osp.$ost*MDT0000.create_count=$count"
7232 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7233 echo $INACTIVE_OSC "is Activate"
7235 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7238 run_test 65k "validate manual striping works properly with deactivated OSCs"
7240 test_65l() { # bug 12836
7241 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7243 test_mkdir -p $DIR/$tdir/test_dir
7244 $SETSTRIPE -c -1 $DIR/$tdir/test_dir
7245 $LFS find -mtime -1 $DIR/$tdir >/dev/null
7247 run_test 65l "lfs find on -1 stripe dir ========================"
7250 local layout=$(save_layout $MOUNT)
7251 $RUNAS $SETSTRIPE -c 2 $MOUNT && {
7252 restore_layout $MOUNT $layout
7253 error "setstripe should fail by non-root users"
7257 run_test 65m "normal user can't set filesystem default stripe"
7260 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.0) ]] ||
7261 skip "Need MDS version at least 2.12.0"
7262 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7264 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7265 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7266 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7268 local root_layout=$(save_layout $MOUNT)
7269 stack_trap "restore_layout $MOUNT $root_layout" EXIT
7271 # new subdirectory under root directory should not inherit
7272 # the default layout from root
7273 local dir1=$MOUNT/$tdir-1
7274 mkdir $dir1 || error "mkdir $dir1 failed"
7275 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7276 error "$dir1 shouldn't have LOV EA"
7278 # delete the default layout on root directory
7279 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7281 local dir2=$MOUNT/$tdir-2
7282 mkdir $dir2 || error "mkdir $dir2 failed"
7283 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7284 error "$dir2 shouldn't have LOV EA"
7286 # set a new striping pattern on root directory
7287 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7288 local new_def_stripe_size=$((def_stripe_size * 2))
7289 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7290 error "set stripe size on $MOUNT failed"
7292 # new file created in $dir2 should inherit the new stripe size from
7293 # the filesystem default
7294 local file2=$dir2/$tfile-2
7295 touch $file2 || error "touch $file2 failed"
7297 local file2_stripe_size=$($LFS getstripe -S $file2)
7298 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7299 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7301 local dir3=$MOUNT/$tdir-3
7302 mkdir $dir3 || error "mkdir $dir3 failed"
7303 # $dir3 shouldn't have LOV EA, but "lfs getstripe -d $dir3" should show
7304 # the root layout, which is the actual default layout that will be used
7305 # when new files are created in $dir3.
7306 local dir3_layout=$(get_layout_param $dir3)
7307 local root_dir_layout=$(get_layout_param $MOUNT)
7308 [[ "$dir3_layout" = "$root_dir_layout" ]] ||
7309 error "$dir3 should show the default layout from $MOUNT"
7311 # set OST pool on root directory
7312 local pool=$TESTNAME
7313 pool_add $pool || error "add $pool failed"
7314 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7315 error "add targets to $pool failed"
7317 $LFS setstripe -p $pool $MOUNT ||
7318 error "set OST pool on $MOUNT failed"
7320 # new file created in $dir3 should inherit the pool from
7321 # the filesystem default
7322 local file3=$dir3/$tfile-3
7323 touch $file3 || error "touch $file3 failed"
7325 local file3_pool=$($LFS getstripe -p $file3)
7326 [[ "$file3_pool" = "$pool" ]] ||
7327 error "$file3 didn't inherit OST pool $pool"
7329 local dir4=$MOUNT/$tdir-4
7330 mkdir $dir4 || error "mkdir $dir4 failed"
7331 local dir4_layout=$(get_layout_param $dir4)
7332 root_dir_layout=$(get_layout_param $MOUNT)
7333 echo "$LFS getstripe -d $dir4"
7334 $LFS getstripe -d $dir4
7335 echo "$LFS getstripe -d $MOUNT"
7336 $LFS getstripe -d $MOUNT
7337 [[ "$dir4_layout" = "$root_dir_layout" ]] ||
7338 error "$dir4 should show the default layout from $MOUNT"
7340 # new file created in $dir4 should inherit the pool from
7341 # the filesystem default
7342 local file4=$dir4/$tfile-4
7343 touch $file4 || error "touch $file4 failed"
7345 local file4_pool=$($LFS getstripe -p $file4)
7346 [[ "$file4_pool" = "$pool" ]] ||
7347 error "$file4 didn't inherit OST pool $pool"
7349 # new subdirectory under non-root directory should inherit
7350 # the default layout from its parent directory
7351 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7352 error "set directory layout on $dir4 failed"
7354 local dir5=$dir4/$tdir-5
7355 mkdir $dir5 || error "mkdir $dir5 failed"
7357 dir4_layout=$(get_layout_param $dir4)
7358 local dir5_layout=$(get_layout_param $dir5)
7359 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7360 error "$dir5 should inherit the default layout from $dir4"
7362 # though subdir under ROOT doesn't inherit default layout, but
7363 # its sub dir/file should be created with default layout.
7364 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
7365 [[ $MDS1_VERSION -ge $(version_code 2.12.59) ]] ||
7366 [[ $MDS1_VERSION -ge $(version_code 2.12.3) &&
7367 $MDS1_VERSION -lt $(version_code 2.12.50) ]] ||
7368 skip "Need MDS version at least 2.12.3 or 2.12.59"
7370 local default_lmv_count=$($LFS getdirstripe -D -c $MOUNT)
7371 local default_lmv_index=$($LFS getdirstripe -D -i $MOUNT)
7372 local default_lmv_hash=$($LFS getdirstripe -D -H $MOUNT)
7374 if [ $default_lmv_hash == "none" ]; then
7375 stack_trap "$LFS setdirstripe -D -d $MOUNT" EXIT
7377 stack_trap "$LFS setdirstripe -D -i $default_lmv_index \
7378 -c $default_lmv_count -H $default_lmv_hash $MOUNT" EXIT
7381 $LFS setdirstripe -D -c 2 $MOUNT ||
7382 error "setdirstripe -D -c 2 failed"
7383 mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed"
7384 local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6)
7385 [ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count"
7387 run_test 65n "don't inherit default layout from root for new subdirectories"
7389 # bug 2543 - update blocks count on client
7391 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7394 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7395 sync; sync_all_data; sync; sync_all_data
7396 cancel_lru_locks osc
7397 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7398 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7400 run_test 66 "update inode blocks count on client ==============="
7403 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7407 swapon -s | awk '($1 == "'$1'") { print $4 }'
7410 # bug5265, obdfilter oa2dentry return -ENOENT
7411 # #define OBD_FAIL_SRV_ENOENT 0x217
7413 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7414 remote_ost_nodsh && skip "remote OST with nodsh"
7417 $SETSTRIPE -c 1 -i 0 $f
7419 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
7421 do_facet ost1 lctl set_param fail_loc=0x217
7422 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
7423 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
7425 do_facet ost1 lctl set_param fail_loc=0
7426 $DIRECTIO write $f 0 2 || error "write error"
7428 cancel_lru_locks osc
7429 $DIRECTIO read $f 0 1 || error "read error"
7431 do_facet ost1 lctl set_param fail_loc=0x217
7432 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
7434 do_facet ost1 lctl set_param fail_loc=0
7437 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
7440 test_mkdir $DIR/$tdir
7441 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
7442 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
7444 run_test 71 "Running dbench on lustre (don't segment fault) ===="
7446 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
7447 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7448 [ "$RUNAS_ID" = "$UID" ] &&
7449 skip_env "RUNAS_ID = UID = $UID -- skipping"
7450 # Check that testing environment is properly set up. Skip if not
7451 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
7452 skip_env "User $RUNAS_ID does not exist - skipping"
7455 chmod 777 $DIR/$tfile
7456 chmod ug+s $DIR/$tfile
7457 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
7458 error "$RUNAS dd $DIR/$tfile failed"
7459 # See if we are still setuid/sgid
7460 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7461 error "S/gid is not dropped on write"
7462 # Now test that MDS is updated too
7463 cancel_lru_locks mdc
7464 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7465 error "S/gid is not dropped on MDS"
7468 run_test 72a "Test that remove suid works properly (bug5695) ===="
7470 test_72b() { # bug 24226 -- keep mode setting when size is not changing
7473 [ "$RUNAS_ID" = "$UID" ] &&
7474 skip_env "RUNAS_ID = UID = $UID -- skipping"
7475 [ "$RUNAS_ID" -eq 0 ] &&
7476 skip_env "RUNAS_ID = 0 -- skipping"
7477 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7478 # Check that testing environment is properly set up. Skip if not
7479 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
7480 skip_env "User $RUNAS_ID does not exist - skipping"
7482 touch $DIR/${tfile}-f{g,u}
7483 test_mkdir $DIR/${tfile}-dg
7484 test_mkdir $DIR/${tfile}-du
7485 chmod 770 $DIR/${tfile}-{f,d}{g,u}
7486 chmod g+s $DIR/${tfile}-{f,d}g
7487 chmod u+s $DIR/${tfile}-{f,d}u
7488 for perm in 777 2777 4777; do
7489 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
7490 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
7491 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
7492 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
7496 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
7498 # bug 3462 - multiple simultaneous MDC requests
7500 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7502 test_mkdir $DIR/d73-1
7503 test_mkdir $DIR/d73-2
7504 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
7507 lctl set_param fail_loc=0x80000129
7508 $MULTIOP $DIR/d73-1/f73-2 Oc &
7510 lctl set_param fail_loc=0
7512 $MULTIOP $DIR/d73-2/f73-3 Oc &
7516 wait $pid1 || return 1
7520 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
7521 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
7522 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
7526 run_test 73 "multiple MDC requests (should not deadlock)"
7528 test_74a() { # bug 6149, 6184
7529 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7532 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7534 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7535 # will spin in a tight reconnection loop
7536 $LCTL set_param fail_loc=0x8000030e
7537 # get any lock that won't be difficult - lookup works.
7539 $LCTL set_param fail_loc=0
7543 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
7545 test_74b() { # bug 13310
7546 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7548 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7550 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7551 # will spin in a tight reconnection loop
7552 $LCTL set_param fail_loc=0x8000030e
7553 # get a "difficult" lock
7555 $LCTL set_param fail_loc=0
7559 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
7562 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7564 #define OBD_FAIL_LDLM_NEW_LOCK
7565 $LCTL set_param fail_loc=0x319
7566 touch $DIR/$tfile && error "touch successful"
7567 $LCTL set_param fail_loc=0
7570 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
7573 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
7576 test_76() { # Now for bug 20433, added originally in bug 1443
7577 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7579 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
7581 cancel_lru_locks osc
7582 BEFORE_INODES=$(num_inodes)
7583 echo "before inodes: $BEFORE_INODES"
7585 [ "$SLOW" = "no" ] && COUNT=100
7586 for i in $(seq $COUNT); do
7590 cancel_lru_locks osc
7591 AFTER_INODES=$(num_inodes)
7592 echo "after inodes: $AFTER_INODES"
7594 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
7596 AFTER_INODES=$(num_inodes)
7598 echo "wait $wait seconds inodes: $AFTER_INODES"
7599 if [ $wait -gt 30 ]; then
7600 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
7604 run_test 76 "confirm clients recycle inodes properly ===="
7610 # Note: in sptlrpc modes which enable its own bulk checksum, the
7611 # original crc32_le bulk checksum will be automatically disabled,
7612 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
7613 # will be checked by sptlrpc code against sptlrpc bulk checksum.
7614 # In this case set_checksums() will not be no-op, because sptlrpc
7615 # bulk checksum will be enabled all through the test.
7617 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
7618 lctl set_param -n osc.*.checksums $1
7622 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7623 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
7624 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7625 tr -d [] | head -n1)}
7628 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
7629 log "set checksum type to $1"
7632 F77_TMP=$TMP/f77-temp
7635 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
7636 error "error writing to $F77_TMP"
7639 test_77a() { # bug 10889
7640 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7641 $GSS && skip_env "could not run with gss"
7643 [ ! -f $F77_TMP ] && setup_f77
7645 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
7649 run_test 77a "normal checksum read/write operation"
7651 test_77b() { # bug 10889
7652 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7653 $GSS && skip_env "could not run with gss"
7655 [ ! -f $F77_TMP ] && setup_f77
7656 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7657 $LCTL set_param fail_loc=0x80000409
7660 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7661 error "dd error: $?"
7662 $LCTL set_param fail_loc=0
7664 for algo in $CKSUM_TYPES; do
7665 cancel_lru_locks osc
7666 set_checksum_type $algo
7667 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7668 $LCTL set_param fail_loc=0x80000408
7669 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
7670 $LCTL set_param fail_loc=0
7673 set_checksum_type $ORIG_CSUM_TYPE
7676 run_test 77b "checksum error on client write, read"
7681 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
7683 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
7684 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
7685 $check_ost && [ -n "$ost_file_prefix" ] &&
7686 do_facet ost1 rm -f ${ost_file_prefix}\*
7690 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7691 $GSS && skip_env "could not run with gss"
7692 remote_ost_nodsh && skip "remote OST with nodsh"
7695 local osc_file_prefix
7697 local check_ost=false
7698 local ost_file_prefix
7704 # ensure corruption will occur on first OSS/OST
7705 $LFS setstripe -i 0 $DIR/$tfile
7707 [ ! -f $F77_TMP ] && setup_f77
7708 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7709 error "dd write error: $?"
7710 fid=$($LFS path2fid $DIR/$tfile)
7712 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
7715 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
7716 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
7718 echo "OSS do not support bulk pages dump upon error"
7721 osc_file_prefix=$($LCTL get_param -n debug_path)
7722 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
7724 trap cleanup_77c EXIT
7727 # enable bulk pages dump upon error on Client
7728 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
7729 # enable bulk pages dump upon error on OSS
7731 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
7733 # flush Client cache to allow next read to reach OSS
7734 cancel_lru_locks osc
7736 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7737 $LCTL set_param fail_loc=0x80000408
7738 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
7739 $LCTL set_param fail_loc=0
7743 # check cksum dump on Client
7744 osc_file=$(ls ${osc_file_prefix}*)
7745 [ -n "$osc_file" ] || error "no checksum dump file on Client"
7746 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
7747 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
7748 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
7749 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
7751 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
7752 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7753 error "dump content does not match on Client"
7755 $check_ost || skip "No need to check cksum dump on OSS"
7757 # check cksum dump on OSS
7758 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
7759 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
7760 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
7761 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
7762 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7763 error "dump content does not match on OSS"
7767 run_test 77c "checksum error on client read with debug"
7769 test_77d() { # bug 10889
7770 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7771 $GSS && skip_env "could not run with gss"
7773 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7774 $LCTL set_param fail_loc=0x80000409
7776 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7777 error "direct write: rc=$?"
7778 $LCTL set_param fail_loc=0
7781 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7782 $LCTL set_param fail_loc=0x80000408
7784 cancel_lru_locks osc
7785 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7786 error "direct read: rc=$?"
7787 $LCTL set_param fail_loc=0
7790 run_test 77d "checksum error on OST direct write, read"
7792 test_77f() { # bug 10889
7793 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7794 $GSS && skip_env "could not run with gss"
7797 for algo in $CKSUM_TYPES; do
7798 cancel_lru_locks osc
7799 set_checksum_type $algo
7800 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7801 $LCTL set_param fail_loc=0x409
7802 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
7803 error "direct write succeeded"
7804 $LCTL set_param fail_loc=0
7806 set_checksum_type $ORIG_CSUM_TYPE
7809 run_test 77f "repeat checksum error on write (expect error)"
7811 test_77g() { # bug 10889
7812 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7813 $GSS && skip_env "could not run with gss"
7814 remote_ost_nodsh && skip "remote OST with nodsh"
7816 [ ! -f $F77_TMP ] && setup_f77
7818 local file=$DIR/$tfile
7819 stack_trap "rm -f $file" EXIT
7821 $SETSTRIPE -c 1 -i 0 $file
7822 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
7823 do_facet ost1 lctl set_param fail_loc=0x8000021a
7825 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
7826 error "write error: rc=$?"
7827 do_facet ost1 lctl set_param fail_loc=0
7830 cancel_lru_locks osc
7831 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
7832 do_facet ost1 lctl set_param fail_loc=0x8000021b
7834 cmp $F77_TMP $file || error "file compare failed"
7835 do_facet ost1 lctl set_param fail_loc=0
7838 run_test 77g "checksum error on OST write, read"
7840 test_77k() { # LU-10906
7841 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7842 $GSS && skip_env "could not run with gss"
7844 local cksum_param="osc.$FSNAME*.checksums"
7845 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
7849 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
7850 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
7851 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
7855 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
7856 error "failed to set checksum=$i on MGS"
7857 wait_update $HOSTNAME "$get_checksum" $i
7859 echo "remount client, checksum should be $i"
7860 remount_client $MOUNT || "failed to remount client"
7861 checksum=$(eval $get_checksum)
7862 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7865 for opt in "checksum" "nochecksum"; do
7866 #remount with mount option
7867 echo "remount client with option $opt, checksum should be $i"
7868 umount_client $MOUNT || "failed to umount client"
7869 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
7870 "failed to mount client with option '$opt'"
7871 checksum=$(eval $get_checksum)
7872 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7876 remount_client $MOUNT || "failed to remount client"
7878 run_test 77k "enable/disable checksum correctly"
7880 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
7889 test_78() { # bug 10901
7890 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7891 remote_ost || skip_env "local OST"
7894 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
7895 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
7896 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
7897 echo "MemTotal: $MEMTOTAL"
7899 # reserve 256MB of memory for the kernel and other running processes,
7900 # and then take 1/2 of the remaining memory for the read/write buffers.
7901 if [ $MEMTOTAL -gt 512 ] ;then
7902 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
7904 # for those poor memory-starved high-end clusters...
7905 MEMTOTAL=$((MEMTOTAL / 2))
7907 echo "Mem to use for directio: $MEMTOTAL"
7909 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
7910 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
7911 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
7912 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
7914 echo "Smallest OST: $SMALLESTOST"
7915 [[ $SMALLESTOST -lt 10240 ]] &&
7916 skip "too small OSTSIZE, useless to run large O_DIRECT test"
7918 trap cleanup_test_78 EXIT
7920 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
7921 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
7923 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
7924 echo "File size: $F78SIZE"
7925 $SETSTRIPE -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
7926 for i in $(seq 1 $NSEQ); do
7927 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
7928 echo directIO rdwr round $i of $NSEQ
7929 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
7934 run_test 78 "handle large O_DIRECT writes correctly ============"
7936 test_79() { # bug 12743
7937 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7939 wait_delete_completed
7941 BKTOTAL=$(calc_osc_kbytes kbytestotal)
7942 BKFREE=$(calc_osc_kbytes kbytesfree)
7943 BKAVAIL=$(calc_osc_kbytes kbytesavail)
7945 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
7946 DFTOTAL=`echo $STRING | cut -d, -f1`
7947 DFUSED=`echo $STRING | cut -d, -f2`
7948 DFAVAIL=`echo $STRING | cut -d, -f3`
7949 DFFREE=$(($DFTOTAL - $DFUSED))
7951 ALLOWANCE=$((64 * $OSTCOUNT))
7953 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
7954 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
7955 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
7957 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
7958 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
7959 error "df free($DFFREE) mismatch OST free($BKFREE)"
7961 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
7962 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
7963 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
7966 run_test 79 "df report consistency check ======================="
7968 test_80() { # bug 10718
7969 remote_ost_nodsh && skip "remote OST with nodsh"
7970 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7972 # relax strong synchronous semantics for slow backends like ZFS
7973 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
7974 local soc="obdfilter.*.sync_lock_cancel"
7975 local save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
7977 # "sync_on_lock_cancel" was broken by v2_11_55_0-26-g7059644e9a
7978 if [ -z "$save" ]; then
7979 soc="obdfilter.*.sync_on_lock_cancel"
7980 save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
7983 if [ "$save" != "never" ]; then
7984 local hosts=$(comma_list $(osts_nodes))
7986 do_nodes $hosts $LCTL set_param $soc=never
7987 stack_trap "do_nodes $hosts $LCTL set_param $soc=$save"
7991 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
7993 local before=$(date +%s)
7994 cancel_lru_locks osc
7995 local after=$(date +%s)
7996 local diff=$((after - before))
7997 [ $diff -le 1 ] || error "elapsed for 1M@1T = $diff"
8001 run_test 80 "Page eviction is equally fast at high offsets too"
8003 test_81a() { # LU-456
8004 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8005 remote_ost_nodsh && skip "remote OST with nodsh"
8007 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8008 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
8009 do_facet ost1 lctl set_param fail_loc=0x80000228
8011 # write should trigger a retry and success
8012 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
8013 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8015 if [ $RC -ne 0 ] ; then
8016 error "write should success, but failed for $RC"
8019 run_test 81a "OST should retry write when get -ENOSPC ==============="
8021 test_81b() { # LU-456
8022 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8023 remote_ost_nodsh && skip "remote OST with nodsh"
8025 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8026 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
8027 do_facet ost1 lctl set_param fail_loc=0x228
8029 # write should retry several times and return -ENOSPC finally
8030 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
8031 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8034 if [ $RC -ne $ENOSPC ] ; then
8035 error "dd should fail for -ENOSPC, but succeed."
8038 run_test 81b "OST should return -ENOSPC when retry still fails ======="
8040 test_82() { # LU-1031
8041 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
8045 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
8047 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
8049 kill -USR1 $MULTIPID2
8051 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
8052 error "First grouplock does not block second one"
8054 echo "Second grouplock blocks first one"
8056 kill -USR1 $MULTIPID1
8060 run_test 82 "Basic grouplock test"
8063 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
8065 test_mkdir $DIR/$tdir.cvsroot
8066 chown $RUNAS_ID $DIR/$tdir.cvsroot
8069 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
8072 # some versions of cvs import exit(1) when asked to import links or
8073 # files they can't read. ignore those files.
8074 local toignore=$(find . -type l -printf '-I %f\n' -o \
8075 ! -perm /4 -printf '-I %f\n')
8076 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
8077 $tdir.reposname vtag rtag
8080 test_mkdir $DIR/$tdir.reposname
8081 chown $RUNAS_ID $DIR/$tdir.reposname
8082 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
8084 cd $DIR/$tdir.reposname
8086 $RUNAS cvs add -m 'addmsg' foo99
8088 $RUNAS cvs commit -m 'nomsg' foo99
8089 rm -fr $DIR/$tdir.cvsroot
8091 run_test 99 "cvs strange file/directory operations"
8094 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8095 [[ "$NETTYPE" =~ tcp ]] ||
8096 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
8097 remote_ost_nodsh && skip "remote OST with nodsh"
8098 remote_mds_nodsh && skip "remote MDS with nodsh"
8100 skip "useless for local single node setup"
8102 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
8103 [ "$PROT" != "tcp" ] && continue
8104 RPORT=$(echo $REMOTE | cut -d: -f2)
8105 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
8108 LPORT=`echo $LOCAL | cut -d: -f2`
8109 if [ $LPORT -ge 1024 ]; then
8110 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
8112 error_exit "local: $LPORT > 1024, remote: $RPORT"
8115 [ "$rc" = 0 ] || error_exit "privileged port not found" )
8117 run_test 100 "check local port using privileged port ==========="
8119 function get_named_value()
8128 echo $line | sed "s/^$tag[ ]*//"
8135 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
8136 awk '/^max_cached_mb/ { print $2 }')
8139 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
8144 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8145 [ $MDSCOUNT -ge 2 ] && skip_env "needs < 2 MDTs" #LU-4322
8150 local cache_limit=32
8152 $LCTL set_param -n osc.*-osc*.rpc_stats 0
8153 trap cleanup_101a EXIT
8154 $LCTL set_param -n llite.*.read_ahead_stats 0
8155 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
8158 # randomly read 10000 of 64K chunks from file 3x 32MB in size
8160 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
8161 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
8164 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
8165 get_named_value 'read but discarded' | cut -d" " -f1); do
8166 discard=$(($discard + $s))
8170 if [[ $(($discard * 10)) -gt $nreads ]]; then
8171 $LCTL get_param osc.*-osc*.rpc_stats
8172 $LCTL get_param llite.*.read_ahead_stats
8173 error "too many ($discard) discarded pages"
8175 rm -f $DIR/$tfile || true
8177 run_test 101a "check read-ahead for random reads"
8180 test_mkdir $DIR/$tdir
8181 local STRIPE_SIZE=$1
8182 local FILE_LENGTH=$2
8185 local FILE_SIZE_MB=$((FILE_LENGTH / STRIPE_SIZE))
8187 local list=$(comma_list $(osts_nodes))
8188 set_osd_param $list '' read_cache_enable 0
8189 set_osd_param $list '' writethrough_cache_enable 0
8191 trap cleanup_test101bc EXIT
8192 # prepare the read-ahead file
8193 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
8195 dd if=/dev/zero of=$DIR/$tfile bs=$STRIPE_SIZE \
8196 count=$FILE_SIZE_MB 2> /dev/null
8200 cleanup_test101bc() {
8205 local list=$(comma_list $(osts_nodes))
8206 set_osd_param $list '' read_cache_enable 1
8207 set_osd_param $list '' writethrough_cache_enable 1
8211 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
8216 local STRIPE_SIZE=$2
8217 local FILE_LENGTH=$3
8218 local RA_INC=1048576
8219 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
8220 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
8221 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
8222 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
8223 get_named_value 'read but discarded' |
8224 cut -d" " -f1 | calc_total)
8225 if [[ $DISCARD -gt $discard_limit ]]; then
8226 $LCTL get_param llite.*.read_ahead_stats
8227 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
8229 echo "Read-ahead success for size ${READ_SIZE}"
8234 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8235 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8237 local STRIPE_SIZE=1048576
8238 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
8240 if [ $SLOW == "yes" ]; then
8241 local FILE_LENGTH=$((STRIDE_SIZE * 64))
8243 local FILE_LENGTH=$((STRIDE_SIZE * 8))
8246 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
8248 # prepare the read-ahead file
8249 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8250 cancel_lru_locks osc
8251 for BIDX in 2 4 8 16 32 64 128 256
8253 local BSIZE=$((BIDX*4096))
8254 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
8255 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
8256 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
8257 $LCTL set_param -n llite.*.read_ahead_stats 0
8258 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
8259 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
8260 cancel_lru_locks osc
8261 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
8266 run_test 101b "check stride-io mode read-ahead ================="
8269 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8271 local STRIPE_SIZE=1048576
8272 local FILE_LENGTH=$((STRIPE_SIZE*100))
8276 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8278 cancel_lru_locks osc
8279 $LCTL set_param osc.*.rpc_stats 0
8280 $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
8281 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8282 local stats=$($LCTL get_param -n $osc_rpc_stats)
8283 local lines=$(echo "$stats" | awk 'END {print NR;}')
8286 if [ $lines -le 20 ]; then
8289 for size in 1 2 4 8; do
8290 local rpc=$(echo "$stats" |
8291 awk '($1 == "'$size':") {print $2; exit; }')
8293 error "Small $((size*4))k read IO $rpc !"
8295 echo "$osc_rpc_stats check passed!"
8300 run_test 101c "check stripe_size aligned read-ahead ================="
8303 $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
8304 $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
8308 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8310 local file=$DIR/$tfile
8311 local sz_MB=${FILESIZE_101d:-500}
8312 local ra_MB=${READAHEAD_MB:-40}
8314 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8315 [ $free_MB -lt $sz_MB ] &&
8316 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8318 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8319 $SETSTRIPE -c -1 $file || error "setstripe failed"
8321 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8322 echo Cancel LRU locks on lustre client to flush the client cache
8323 cancel_lru_locks osc
8325 echo Disable read-ahead
8326 local old_READAHEAD=$(set_read_ahead 0)
8328 echo Reading the test file $file with read-ahead disabled
8329 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8331 echo Cancel LRU locks on lustre client to flush the client cache
8332 cancel_lru_locks osc
8333 echo Enable read-ahead with ${ra_MB}MB
8334 set_read_ahead $ra_MB
8336 echo Reading the test file $file with read-ahead enabled
8337 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8339 echo "read-ahead disabled time read $raOFF"
8340 echo "read-ahead enabled time read $raON"
8342 set_read_ahead $old_READAHEAD
8344 wait_delete_completed
8346 [ $raOFF -le 1 -o $raON -lt $raOFF ] ||
8347 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8349 run_test 101d "file read with and without read-ahead enabled"
8352 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8354 local file=$DIR/$tfile
8355 local size_KB=500 #KB
8359 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8360 local need_KB=$((count * size_KB))
8361 [[ $free_KB -le $need_KB ]] &&
8362 skip_env "Need free space $need_KB, have $free_KB"
8364 echo "Creating $count ${size_KB}K test files"
8365 for ((i = 0; i < $count; i++)); do
8366 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8369 echo "Cancel LRU locks on lustre client to flush the client cache"
8370 cancel_lru_locks $OSC
8372 echo "Reset readahead stats"
8373 $LCTL set_param -n llite.*.read_ahead_stats 0
8375 for ((i = 0; i < $count; i++)); do
8376 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
8379 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8380 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8382 for ((i = 0; i < $count; i++)); do
8383 rm -rf $file.$i 2>/dev/null
8386 #10000 means 20% reads are missing in readahead
8387 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
8389 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
8392 which iozone || skip_env "no iozone installed"
8394 local old_debug=$($LCTL get_param debug)
8395 old_debug=${old_debug#*=}
8396 $LCTL set_param debug="reada mmap"
8398 # create a test file
8399 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
8401 echo Cancel LRU locks on lustre client to flush the client cache
8402 cancel_lru_locks osc
8404 echo Reset readahead stats
8405 $LCTL set_param -n llite.*.read_ahead_stats 0
8407 echo mmap read the file with small block size
8408 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
8411 echo checking missing pages
8412 $LCTL get_param llite.*.read_ahead_stats
8413 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8414 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8416 $LCTL set_param debug="$old_debug"
8417 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
8420 run_test 101f "check mmap read performance"
8422 test_101g_brw_size_test() {
8424 local pages=$((mb * 1048576 / PAGE_SIZE))
8425 local file=$DIR/$tfile
8427 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
8428 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
8429 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
8430 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
8434 stack_trap "rm -f $file" EXIT
8435 $LCTL set_param -n osc.*.rpc_stats=0
8437 # 10 RPCs should be enough for the test
8439 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
8440 { error "dd write ${mb} MB blocks failed"; return 3; }
8441 cancel_lru_locks osc
8442 dd of=/dev/null if=$file bs=${mb}M count=$count ||
8443 { error "dd write ${mb} MB blocks failed"; return 4; }
8445 # calculate number of full-sized read and write RPCs
8446 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
8447 sed -n '/pages per rpc/,/^$/p' |
8448 awk '/'$pages':/ { reads += $2; writes += $6 }; \
8449 END { print reads,writes }'))
8450 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
8452 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
8459 remote_ost_nodsh && skip "remote OST with nodsh"
8462 local osts=$(get_facets OST)
8463 local list=$(comma_list $(osts_nodes))
8464 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
8465 local brw_size="obdfilter.*.brw_size"
8467 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8469 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
8470 if [ $OST1_VERSION -ge $(version_code 2.8.52) -o \
8471 \( $OST1_VERSION -ge $(version_code 2.7.17) -a \
8472 $OST1_VERSION -lt $(version_code 2.7.50) \) ] &&
8473 [ $CLIENT_VERSION -ge $(version_code 2.8.52) -o \
8474 \( $CLIENT_VERSION -ge $(version_code 2.7.17) -a \
8475 $CLIENT_VERSION -lt $(version_code 2.7.50) \) ]; then
8476 [ $OST1_VERSION -ge $(version_code 2.9.52) ] && suffix="M"
8477 if [[ $orig_mb -lt 16 ]]; then
8478 save_lustre_params $osts "$brw_size" > $p
8479 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
8480 error "set 16MB RPC size failed"
8482 echo "remount client to enable new RPC size"
8483 remount_client $MOUNT || error "remount_client failed"
8486 test_101g_brw_size_test 16 || error "16MB RPC test failed"
8487 # should be able to set brw_size=12, but no rpc_stats for that
8488 test_101g_brw_size_test 8 || error "8MB RPC test failed"
8491 test_101g_brw_size_test 4 || error "4MB RPC test failed"
8493 if [[ $orig_mb -lt 16 ]]; then
8494 restore_lustre_params < $p
8495 remount_client $MOUNT || error "remount_client restore failed"
8498 rm -f $p $DIR/$tfile
8500 run_test 101g "Big bulk(4/16 MiB) readahead"
8503 test_mkdir $DIR/$tdir
8504 chown $RUNAS_ID $DIR/$tdir
8507 STRIPE_COUNT=$OSTCOUNT
8508 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
8510 trap cleanup_test102 EXIT
8512 $1 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
8514 for num in 1 2 3 4; do
8515 for count in $(seq 1 $STRIPE_COUNT); do
8516 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
8517 local size=`expr $STRIPE_SIZE \* $num`
8518 local file=file"$num-$idx-$count"
8519 $1 $SETSTRIPE -S $size -i $idx -c $count $file
8525 $1 tar cf $TMP/f102.tar $tdir --xattrs
8531 rm -rf $DIR/d0.sanity/d102
8535 [ "$UID" != 0 ] && skip "must run as root"
8536 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
8537 skip_env "must have user_xattr"
8539 [ -z "$(which setfattr 2>/dev/null)" ] &&
8540 skip_env "could not find setfattr"
8542 local testfile=$DIR/$tfile
8545 echo "set/get xattr..."
8546 setfattr -n trusted.name1 -v value1 $testfile ||
8547 error "setfattr -n trusted.name1=value1 $testfile failed"
8548 getfattr -n trusted.name1 $testfile 2> /dev/null |
8549 grep "trusted.name1=.value1" ||
8550 error "$testfile missing trusted.name1=value1"
8552 setfattr -n user.author1 -v author1 $testfile ||
8553 error "setfattr -n user.author1=author1 $testfile failed"
8554 getfattr -n user.author1 $testfile 2> /dev/null |
8555 grep "user.author1=.author1" ||
8556 error "$testfile missing trusted.author1=author1"
8559 setfattr -n trusted.name2 -v value2 $testfile ||
8560 error "$testfile unable to set trusted.name2"
8561 setfattr -n trusted.name3 -v value3 $testfile ||
8562 error "$testfile unable to set trusted.name3"
8563 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
8564 grep "trusted.name" | wc -l) -eq 3 ] ||
8565 error "$testfile missing 3 trusted.name xattrs"
8567 setfattr -n user.author2 -v author2 $testfile ||
8568 error "$testfile unable to set user.author2"
8569 setfattr -n user.author3 -v author3 $testfile ||
8570 error "$testfile unable to set user.author3"
8571 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
8572 grep "user.author" | wc -l) -eq 3 ] ||
8573 error "$testfile missing 3 user.author xattrs"
8575 echo "remove xattr..."
8576 setfattr -x trusted.name1 $testfile ||
8577 error "$testfile error deleting trusted.name1"
8578 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
8579 error "$testfile did not delete trusted.name1 xattr"
8581 setfattr -x user.author1 $testfile ||
8582 error "$testfile error deleting user.author1"
8583 echo "set lustre special xattr ..."
8584 $LFS setstripe -c1 $testfile
8585 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
8586 awk -F "=" '/trusted.lov/ { print $2 }' )
8587 setfattr -n "trusted.lov" -v $lovea $testfile ||
8588 error "$testfile doesn't ignore setting trusted.lov again"
8589 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
8590 error "$testfile allow setting invalid trusted.lov"
8593 run_test 102a "user xattr test =================================="
8595 check_102b_layout() {
8597 local testfile=$DIR/$tfile
8599 echo "test layout '$layout'"
8600 $LFS setstripe $layout $testfile || error "setstripe failed"
8601 $LFS getstripe -y $testfile
8603 echo "get/set/list trusted.lov xattr ..." # b=10930
8604 local value=$(getfattr -n trusted.lov -e hex $testfile | grep trusted)
8605 [[ "$value" =~ "trusted.lov" ]] ||
8606 error "can't get trusted.lov from $testfile"
8607 local stripe_count_orig=$($LFS getstripe -c $testfile) ||
8608 error "getstripe failed"
8610 $MCREATE $testfile.2 || error "mcreate $testfile.2 failed"
8612 value=$(cut -d= -f2 <<<$value)
8613 # LU-13168: truncated xattr should fail if short lov_user_md header
8614 [ $CLIENT_VERSION -lt $(version_code 2.13.53) ] &&
8615 lens="${#value}" || lens="$(seq 4 2 ${#value})"
8616 for len in $lens; do
8617 echo "setfattr $len $testfile.2"
8618 setfattr -n trusted.lov -v ${value:0:$len} $testfile.2 &&
8619 [ $len -lt 66 ] && error "short xattr len=$len worked"
8621 local stripe_size=$($LFS getstripe -S $testfile.2)
8622 local stripe_count=$($LFS getstripe -c $testfile.2)
8623 [[ $stripe_size -eq 65536 ]] ||
8624 error "stripe size $stripe_size != 65536"
8625 [[ $stripe_count -eq $stripe_count_orig ]] ||
8626 error "stripe count $stripe_count != $stripe_count_orig"
8627 rm $testfile $testfile.2
8631 [ -z "$(which setfattr 2>/dev/null)" ] &&
8632 skip_env "could not find setfattr"
8633 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8635 # check plain layout
8636 check_102b_layout -S 65536 -i 1 -c $OSTCOUNT
8638 # and also check composite layout
8639 check_102b_layout -E 1M -S 65536 -i 1 -c $OSTCOUNT -Eeof -S4M
8642 run_test 102b "getfattr/setfattr for trusted.lov EAs"
8645 [ -z "$(which setfattr 2>/dev/null)" ] &&
8646 skip_env "could not find setfattr"
8647 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8649 # b10930: get/set/list lustre.lov xattr
8650 echo "get/set/list lustre.lov xattr ..."
8651 test_mkdir $DIR/$tdir
8652 chown $RUNAS_ID $DIR/$tdir
8653 local testfile=$DIR/$tdir/$tfile
8654 $RUNAS $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8655 error "setstripe failed"
8656 local STRIPECOUNT=$($RUNAS $GETSTRIPE -c $testfile) ||
8657 error "getstripe failed"
8658 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
8659 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
8661 local testfile2=${testfile}2
8662 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
8663 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
8665 $RUNAS $MCREATE $testfile2
8666 $RUNAS setfattr -n lustre.lov -v $value $testfile2
8667 local stripe_size=$($RUNAS $GETSTRIPE -S $testfile2)
8668 local stripe_count=$($RUNAS $GETSTRIPE -c $testfile2)
8669 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
8670 [ $stripe_count -eq $STRIPECOUNT ] ||
8671 error "stripe count $stripe_count != $STRIPECOUNT"
8673 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
8675 compare_stripe_info1() {
8676 local stripe_index_all_zero=true
8678 for num in 1 2 3 4; do
8679 for count in $(seq 1 $STRIPE_COUNT); do
8680 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
8681 local size=$((STRIPE_SIZE * num))
8682 local file=file"$num-$offset-$count"
8683 stripe_size=$($LFS getstripe -S $PWD/$file)
8684 [[ $stripe_size -ne $size ]] &&
8685 error "$file: size $stripe_size != $size"
8686 stripe_count=$($LFS getstripe -c $PWD/$file)
8687 # allow fewer stripes to be created, ORI-601
8688 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
8689 error "$file: count $stripe_count != $count"
8690 stripe_index=$($LFS getstripe -i $PWD/$file)
8691 [[ $stripe_index -ne 0 ]] &&
8692 stripe_index_all_zero=false
8696 $stripe_index_all_zero &&
8697 error "all files are being extracted starting from OST index 0"
8701 have_xattrs_include() {
8702 tar --help | grep -q xattrs-include &&
8703 echo --xattrs-include="lustre.*"
8707 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8708 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8710 XINC=$(have_xattrs_include)
8712 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8714 compare_stripe_info1
8716 run_test 102d "tar restore stripe info from tarfile,not keep osts"
8719 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8720 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8722 XINC=$(have_xattrs_include)
8724 test_mkdir $DIR/$tdir.restore
8726 tar cf - --xattrs $tdir | tar xf - \
8727 -C $DIR/$tdir.restore --xattrs $XINC
8728 cd $DIR/$tdir.restore/$tdir
8729 compare_stripe_info1
8731 run_test 102f "tar copy files, not keep osts"
8734 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
8735 skip "must have user_xattr"
8736 [ -z "$(which setfattr 2>/dev/null)" ] &&
8737 skip_env "could not find setfattr"
8738 [ -z "$(which getfattr 2>/dev/null)" ] &&
8739 skip_env "could not find getfattr"
8741 local xsize=${1:-1024} # in bytes
8742 local file=$DIR/$tfile
8743 local value="$(generate_string $xsize)"
8744 local xbig=trusted.big
8747 log "save $xbig on $file"
8748 setfattr -n $xbig -v $value $file ||
8749 error "saving $xbig on $file failed"
8751 local orig=$(get_xattr_value $xbig $file)
8752 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
8754 local xsml=trusted.sml
8755 log "save $xsml on $file"
8756 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
8758 local new=$(get_xattr_value $xbig $file)
8759 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
8761 log "grow $xsml on $file"
8762 setfattr -n $xsml -v "$value" $file ||
8763 error "growing $xsml on $file failed"
8765 new=$(get_xattr_value $xbig $file)
8766 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
8767 log "$xbig still valid after growing $xsml"
8772 test_102h() { # bug 15777
8775 run_test 102h "grow xattr from inside inode to external block"
8778 large_xattr_enabled || skip_env "ea_inode feature disabled"
8780 grow_xattr $(max_xattr_size)
8782 run_test 102ha "grow xattr from inside inode to external inode"
8784 test_102i() { # bug 17038
8785 [ -z "$(which getfattr 2>/dev/null)" ] &&
8786 skip "could not find getfattr"
8789 ln -s $DIR/$tfile $DIR/${tfile}link
8790 getfattr -n trusted.lov $DIR/$tfile ||
8791 error "lgetxattr on $DIR/$tfile failed"
8792 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
8793 grep -i "no such attr" ||
8794 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
8795 rm -f $DIR/$tfile $DIR/${tfile}link
8797 run_test 102i "lgetxattr test on symbolic link ============"
8800 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8801 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8803 XINC=$(have_xattrs_include)
8804 setup_test102 "$RUNAS"
8805 chown $RUNAS_ID $DIR/$tdir
8806 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8808 compare_stripe_info1 "$RUNAS"
8810 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
8813 [ -z "$(which setfattr 2>/dev/null)" ] &&
8814 skip "could not find setfattr"
8817 # b22187 just check that does not crash for regular file.
8818 setfattr -n trusted.lov $DIR/$tfile
8819 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
8820 local test_kdir=$DIR/$tdir
8821 test_mkdir $test_kdir
8822 local default_size=$($LFS getstripe -S $test_kdir)
8823 local default_count=$($LFS getstripe -c $test_kdir)
8824 local default_offset=$($LFS getstripe -i $test_kdir)
8825 $SETSTRIPE -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
8826 error 'dir setstripe failed'
8827 setfattr -n trusted.lov $test_kdir
8828 local stripe_size=$($LFS getstripe -S $test_kdir)
8829 local stripe_count=$($LFS getstripe -c $test_kdir)
8830 local stripe_offset=$($LFS getstripe -i $test_kdir)
8831 [ $stripe_size -eq $default_size ] ||
8832 error "stripe size $stripe_size != $default_size"
8833 [ $stripe_count -eq $default_count ] ||
8834 error "stripe count $stripe_count != $default_count"
8835 [ $stripe_offset -eq $default_offset ] ||
8836 error "stripe offset $stripe_offset != $default_offset"
8837 rm -rf $DIR/$tfile $test_kdir
8839 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
8842 [ -z "$(which getfattr 2>/dev/null)" ] &&
8843 skip "could not find getfattr"
8845 # LU-532 trusted. xattr is invisible to non-root
8846 local testfile=$DIR/$tfile
8850 echo "listxattr as user..."
8851 chown $RUNAS_ID $testfile
8852 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
8853 grep -q "trusted" &&
8854 error "$testfile trusted xattrs are user visible"
8858 run_test 102l "listxattr size test =================================="
8860 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
8861 local path=$DIR/$tfile
8864 listxattr_size_check $path || error "listattr_size_check $path failed"
8866 run_test 102m "Ensure listxattr fails on small bufffer ========"
8870 getxattr() { # getxattr path name
8871 # Return the base64 encoding of the value of xattr name on path.
8875 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
8877 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8879 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8881 getfattr --absolute-names --encoding=base64 --name=$name $path |
8882 awk -F= -v name=$name '$1 == name {
8883 print substr($0, index($0, "=") + 1);
8887 test_102n() { # LU-4101 mdt: protect internal xattrs
8888 [ -z "$(which setfattr 2>/dev/null)" ] &&
8889 skip "could not find setfattr"
8890 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
8892 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
8895 local file0=$DIR/$tfile.0
8896 local file1=$DIR/$tfile.1
8897 local xattr0=$TMP/$tfile.0
8898 local xattr1=$TMP/$tfile.1
8899 local namelist="lov lma lmv link fid version som hsm"
8903 rm -rf $file0 $file1 $xattr0 $xattr1
8906 # Get 'before' xattrs of $file1.
8907 getfattr --absolute-names --dump --match=- $file1 > $xattr0
8909 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
8910 namelist+=" lfsck_namespace"
8911 for name in $namelist; do
8912 # Try to copy xattr from $file0 to $file1.
8913 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8915 setfattr --name=trusted.$name --value="$value" $file1 ||
8916 error "setxattr 'trusted.$name' failed"
8918 # Try to set a garbage xattr.
8919 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8921 if [[ x$name == "xlov" ]]; then
8922 setfattr --name=trusted.lov --value="$value" $file1 &&
8923 error "setxattr invalid 'trusted.lov' success"
8925 setfattr --name=trusted.$name --value="$value" $file1 ||
8926 error "setxattr invalid 'trusted.$name' failed"
8929 # Try to remove the xattr from $file1. We don't care if this
8930 # appears to succeed or fail, we just don't want there to be
8931 # any changes or crashes.
8932 setfattr --remove=$trusted.$name $file1 2> /dev/null
8935 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
8938 # Try to copy xattr from $file0 to $file1.
8939 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8941 setfattr --name=trusted.$name --value="$value" $file1 ||
8942 error "setxattr 'trusted.$name' failed"
8944 # Try to set a garbage xattr.
8945 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8947 setfattr --name=trusted.$name --value="$value" $file1 ||
8948 error "setxattr 'trusted.$name' failed"
8950 # Try to remove the xattr from $file1. We don't care if this
8951 # appears to succeed or fail, we just don't want there to be
8952 # any changes or crashes.
8953 setfattr --remove=$trusted.$name $file1 2> /dev/null
8956 # Get 'after' xattrs of file1.
8957 getfattr --absolute-names --dump --match=- $file1 > $xattr1
8959 if ! diff $xattr0 $xattr1; then
8960 error "before and after xattrs of '$file1' differ"
8963 rm -rf $file0 $file1 $xattr0 $xattr1
8967 run_test 102n "silently ignore setxattr on internal trusted xattrs"
8969 test_102p() { # LU-4703 setxattr did not check ownership
8970 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
8971 skip "MDS needs to be at least 2.5.56"
8973 local testfile=$DIR/$tfile
8977 echo "setfacl as user..."
8978 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
8979 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
8981 echo "setfattr as user..."
8982 setfacl -m "u:$RUNAS_ID:---" $testfile
8983 $RUNAS setfattr -x system.posix_acl_access $testfile
8984 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
8986 run_test 102p "check setxattr(2) correctly fails without permission"
8989 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
8990 skip "MDS needs to be at least 2.6.92"
8992 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
8994 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
8997 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
8998 skip "MDS needs to be at least 2.6.93"
9000 touch $DIR/$tfile || error "touch"
9001 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
9002 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
9003 rm $DIR/$tfile || error "rm"
9006 mkdir -p $DIR/$tdir || error "mkdir"
9007 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9008 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9009 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9010 error "$testfile error deleting user.author1"
9011 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9012 grep "user.$(basename $tdir)" &&
9013 error "$tdir did not delete user.$(basename $tdir)"
9014 rmdir $DIR/$tdir || error "rmdir"
9017 test_mkdir $DIR/$tdir
9018 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9019 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9020 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9021 error "$testfile error deleting user.author1"
9022 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9023 grep "user.$(basename $tdir)" &&
9024 error "$tdir did not delete user.$(basename $tdir)"
9025 rmdir $DIR/$tdir || error "rm striped dir"
9027 run_test 102r "set EAs with empty values"
9030 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9031 skip "MDS needs to be at least 2.11.52"
9033 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9035 save_lustre_params client "llite.*.xattr_cache" > $save
9037 for cache in 0 1; do
9038 lctl set_param llite.*.xattr_cache=$cache
9041 touch $DIR/$tfile || error "touch"
9042 for prefix in lustre security system trusted user; do
9043 # Note getxattr() may fail with 'Operation not
9044 # supported' or 'No such attribute' depending
9045 # on prefix and cache.
9046 getfattr -n $prefix.n102s $DIR/$tfile &&
9047 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
9051 restore_lustre_params < $save
9053 run_test 102s "getting nonexistent xattrs should fail"
9056 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9057 skip "MDS needs to be at least 2.11.52"
9059 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9061 save_lustre_params client "llite.*.xattr_cache" > $save
9063 for cache in 0 1; do
9064 lctl set_param llite.*.xattr_cache=$cache
9066 for buf_size in 0 256; do
9068 touch $DIR/$tfile || error "touch"
9069 setfattr -n user.multiop $DIR/$tfile
9070 $MULTIOP $DIR/$tfile oa$buf_size ||
9071 error "cannot get zero length xattr value (buf_size = $buf_size)"
9075 restore_lustre_params < $save
9077 run_test 102t "zero length xattr values handled correctly"
9081 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
9086 [ "$UID" != 0 ] && skip "must run as root"
9087 $GSS && skip_env "could not run under gss"
9088 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
9089 skip_env "must have acl enabled"
9090 [ -z "$(which setfacl 2>/dev/null)" ] &&
9091 skip_env "could not find setfacl"
9092 remote_mds_nodsh && skip "remote MDS with nodsh"
9094 gpasswd -a daemon bin # LU-5641
9095 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
9097 declare -a identity_old
9099 for num in $(seq $MDSCOUNT); do
9100 switch_identity $num true || identity_old[$num]=$?
9108 echo "performing cp ..."
9109 run_acl_subtest cp || error "run_acl_subtest cp failed"
9110 echo "performing getfacl-noacl..."
9111 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
9112 echo "performing misc..."
9113 run_acl_subtest misc || error "misc test failed"
9114 echo "performing permissions..."
9115 run_acl_subtest permissions || error "permissions failed"
9116 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
9117 if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] ||
9118 { [ $MDS1_VERSION -lt $(version_code 2.6) ] &&
9119 [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; }
9121 echo "performing permissions xattr..."
9122 run_acl_subtest permissions_xattr ||
9123 error "permissions_xattr failed"
9125 echo "performing setfacl..."
9126 run_acl_subtest setfacl || error "setfacl test failed"
9128 # inheritance test got from HP
9129 echo "performing inheritance..."
9130 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
9131 chmod +x make-tree || error "chmod +x failed"
9132 run_acl_subtest inheritance || error "inheritance test failed"
9135 echo "LU-974 ignore umask when acl is enabled..."
9136 run_acl_subtest 974 || error "LU-974 umask test failed"
9137 if [ $MDSCOUNT -ge 2 ]; then
9138 run_acl_subtest 974_remote ||
9139 error "LU-974 umask test failed under remote dir"
9142 echo "LU-2561 newly created file is same size as directory..."
9143 if [ "$mds1_FSTYPE" != "zfs" ]; then
9144 run_acl_subtest 2561 || error "LU-2561 test failed"
9146 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
9149 run_acl_subtest 4924 || error "LU-4924 test failed"
9154 for num in $(seq $MDSCOUNT); do
9155 if [ "${identity_old[$num]}" = 1 ]; then
9156 switch_identity $num false || identity_old[$num]=$?
9160 run_test 103a "acl test"
9166 for U in {0..511}; do
9168 local O=$(printf "%04o" $U)
9170 umask $(printf "%04o" $((511 ^ $O)))
9171 $LFS setstripe -c 1 $DIR/$tfile.s$O
9172 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
9174 (( $S == ($O & 0666) )) ||
9175 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
9177 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
9178 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
9179 (( $S == ($O & 0666) )) ||
9180 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
9182 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
9183 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
9184 (( $S == ($O & 0666) )) ||
9185 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
9186 rm -f $DIR/$tfile.[smp]$0
9190 # limit the concurrently running threads to 64. LU-11878
9191 local idx=$((U % 64))
9192 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
9197 run_test 103b "umask lfs setstripe"
9201 cp -rp $DIR/$tdir $DIR/$tdir.bak
9203 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
9204 error "$DIR/$tdir shouldn't contain default ACL"
9205 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
9206 error "$DIR/$tdir.bak shouldn't contain default ACL"
9209 run_test 103c "'cp -rp' won't set empty acl"
9212 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9215 lfs df || error "lfs df failed"
9216 lfs df -ih || error "lfs df -ih failed"
9217 lfs df -h $DIR || error "lfs df -h $DIR failed"
9218 lfs df -i $DIR || error "lfs df -i $DIR failed"
9219 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
9220 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
9222 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
9223 lctl --device %$OSC deactivate
9224 lfs df || error "lfs df with deactivated OSC failed"
9225 lctl --device %$OSC activate
9226 # wait the osc back to normal
9227 wait_osc_import_ready client ost
9229 lfs df || error "lfs df with reactivated OSC failed"
9232 run_test 104a "lfs df [-ih] [path] test ========================="
9235 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9236 [ $RUNAS_ID -eq $UID ] &&
9237 skip_env "RUNAS_ID = UID = $UID -- skipping"
9239 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
9240 grep "Permission denied" | wc -l)))
9241 if [ $denied_cnt -ne 0 ]; then
9242 error "lfs check servers test failed"
9245 run_test 104b "$RUNAS lfs check servers test ===================="
9248 # doesn't work on 2.4 kernels
9250 if $(flock_is_enabled); then
9251 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
9253 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
9257 run_test 105a "flock when mounted without -o flock test ========"
9261 if $(flock_is_enabled); then
9262 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
9264 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
9268 run_test 105b "fcntl when mounted without -o flock test ========"
9272 if $(flock_is_enabled); then
9273 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
9275 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
9279 run_test 105c "lockf when mounted without -o flock test"
9281 test_105d() { # bug 15924
9282 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9284 test_mkdir $DIR/$tdir
9285 flock_is_enabled || skip_env "mount w/o flock enabled"
9286 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
9287 $LCTL set_param fail_loc=0x80000315
9288 flocks_test 2 $DIR/$tdir
9290 run_test 105d "flock race (should not freeze) ========"
9292 test_105e() { # bug 22660 && 22040
9293 flock_is_enabled || skip_env "mount w/o flock enabled"
9296 flocks_test 3 $DIR/$tfile
9298 run_test 105e "Two conflicting flocks from same process"
9300 test_106() { #bug 10921
9301 test_mkdir $DIR/$tdir
9302 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9303 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9305 run_test 106 "attempt exec of dir followed by chown of that dir"
9308 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9316 local save_pattern=$(sysctl -n kernel.core_pattern)
9317 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9318 sysctl -w kernel.core_pattern=$file
9319 sysctl -w kernel.core_uses_pid=0
9327 kill -s 11 $SLEEPPID
9329 if [ -e $file ]; then
9330 size=`stat -c%s $file`
9331 [ $size -eq 0 ] && error "Fail to create core file $file"
9333 error "Fail to create core file $file"
9336 sysctl -w kernel.core_pattern=$save_pattern
9337 sysctl -w kernel.core_uses_pid=$save_uses_pid
9340 run_test 107 "Coredump on SIG"
9343 test_mkdir $DIR/$tdir
9344 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9345 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9346 error "mkdir with 256 char should fail, but did not"
9347 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9348 error "create with 255 char failed"
9349 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9350 error "create with 256 char should fail, but did not"
9355 run_test 110 "filename length checking"
9358 # Purpose: To verify dynamic thread (OSS) creation.
9361 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9362 remote_ost_nodsh && skip "remote OST with nodsh"
9364 # Lustre does not stop service threads once they are started.
9365 # Reset number of running threads to default.
9370 local save_params="$TMP/sanity-$TESTNAME.parameters"
9372 # Get ll_ost_io count before I/O
9373 OSTIO_pre=$(do_facet ost1 \
9374 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9375 # Exit if lustre is not running (ll_ost_io not running).
9376 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9378 echo "Starting with $OSTIO_pre threads"
9379 local thread_max=$((OSTIO_pre * 2))
9380 local rpc_in_flight=$((thread_max * 2))
9381 # Number of I/O Process proposed to be started.
9383 local facets=$(get_facets OST)
9385 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9386 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9388 # Set in_flight to $rpc_in_flight
9389 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9390 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9391 nfiles=${rpc_in_flight}
9392 # Set ost thread_max to $thread_max
9393 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9395 # 5 Minutes should be sufficient for max number of OSS
9396 # threads(thread_max) to be created.
9400 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9401 test_mkdir $DIR/$tdir
9402 for i in $(seq $nfiles); do
9403 local file=$DIR/$tdir/${tfile}-$i
9404 $LFS setstripe -c -1 -i 0 $file
9405 ($WTL $file $timeout)&
9408 # I/O Started - Wait for thread_started to reach thread_max or report
9409 # error if thread_started is more than thread_max.
9410 echo "Waiting for thread_started to reach thread_max"
9411 local thread_started=0
9412 local end_time=$((SECONDS + timeout))
9414 while [ $SECONDS -le $end_time ] ; do
9416 # Get ost i/o thread_started count.
9417 thread_started=$(do_facet ost1 \
9419 ost.OSS.ost_io.threads_started | cut -d= -f2")
9420 # Break out if thread_started is equal/greater than thread_max
9421 if [[ $thread_started -ge $thread_max ]]; then
9422 echo ll_ost_io thread_started $thread_started, \
9423 equal/greater than thread_max $thread_max
9429 # Cleanup - We have the numbers, Kill i/o jobs if running.
9430 jobcount=($(jobs -p))
9431 for i in $(seq 0 $((${#jobcount[@]}-1)))
9433 kill -9 ${jobcount[$i]}
9434 if [ $? -ne 0 ] ; then
9436 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
9440 # Cleanup files left by WTL binary.
9441 for i in $(seq $nfiles); do
9442 local file=$DIR/$tdir/${tfile}-$i
9444 if [ $? -ne 0 ] ; then
9445 echo "Warning: Failed to delete file $file"
9449 restore_lustre_params <$save_params
9450 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
9452 # Error out if no new thread has started or Thread started is greater
9454 if [[ $thread_started -le $OSTIO_pre ||
9455 $thread_started -gt $thread_max ]]; then
9456 error "ll_ost_io: thread_started $thread_started" \
9457 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
9458 "No new thread started or thread started greater " \
9462 run_test 115 "verify dynamic thread creation===================="
9465 wait_delete_completed
9466 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
9467 echo "OST kbytes available: ${AVAIL[@]}"
9472 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
9473 #echo OST $i: ${AVAIL[i]}kb
9474 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
9478 if [[ ${AVAIL[i]} -lt $MINV ]]; then
9483 echo "Min free space: OST $MINI: $MINV"
9484 echo "Max free space: OST $MAXI: $MAXV"
9487 test_116a() { # was previously test_116()
9488 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9489 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9490 remote_mds_nodsh && skip "remote MDS with nodsh"
9492 echo -n "Free space priority "
9493 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
9498 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
9499 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
9500 trap simple_cleanup_common EXIT
9502 # Check if we need to generate uneven OSTs
9503 test_mkdir -p $DIR/$tdir/OST${MINI}
9504 local FILL=$((MINV / 4))
9505 local DIFF=$((MAXV - MINV))
9506 local DIFF2=$((DIFF * 100 / MINV))
9508 local threshold=$(do_facet $SINGLEMDS \
9509 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
9510 threshold=${threshold%%%}
9511 echo -n "Check for uneven OSTs: "
9512 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
9514 if [[ $DIFF2 -gt $threshold ]]; then
9516 echo "Don't need to fill OST$MINI"
9518 # generate uneven OSTs. Write 2% over the QOS threshold value
9520 DIFF=$((threshold - DIFF2 + 2))
9521 DIFF2=$((MINV * DIFF / 100))
9522 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
9523 $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
9524 error "setstripe failed"
9525 DIFF=$((DIFF2 / 2048))
9527 while [ $i -lt $DIFF ]; do
9529 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
9530 bs=2M count=1 2>/dev/null
9539 DIFF=$((MAXV - MINV))
9540 DIFF2=$((DIFF * 100 / MINV))
9541 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
9542 if [ $DIFF2 -gt $threshold ]; then
9545 echo "failed - QOS mode won't be used"
9546 simple_cleanup_common
9547 skip "QOS imbalance criteria not met"
9555 # now fill using QOS
9556 $SETSTRIPE -c 1 $DIR/$tdir
9557 FILL=$((FILL / 200))
9558 if [ $FILL -gt 600 ]; then
9561 echo "writing $FILL files to QOS-assigned OSTs"
9563 while [ $i -lt $FILL ]; do
9565 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
9569 echo "wrote $i 200k files"
9573 echo "Note: free space may not be updated, so measurements might be off"
9575 DIFF2=$((MAXV - MINV))
9576 echo "free space delta: orig $DIFF final $DIFF2"
9577 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
9578 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
9579 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
9580 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
9581 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
9582 if [[ $DIFF -gt 0 ]]; then
9583 FILL=$((DIFF2 * 100 / DIFF - 100))
9584 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
9587 # Figure out which files were written where
9588 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9589 awk '/'$MINI1': / {print $2; exit}')
9591 MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9592 echo "$MINC files created on smaller OST $MINI1"
9593 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9594 awk '/'$MAXI1': / {print $2; exit}')
9596 MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9597 echo "$MAXC files created on larger OST $MAXI1"
9598 if [[ $MINC -gt 0 ]]; then
9599 FILL=$((MAXC * 100 / MINC - 100))
9600 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
9602 [[ $MAXC -gt $MINC ]] ||
9603 error_ignore LU-9 "stripe QOS didn't balance free space"
9604 simple_cleanup_common
9606 run_test 116a "stripe QOS: free space balance ==================="
9608 test_116b() { # LU-2093
9609 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9610 remote_mds_nodsh && skip "remote MDS with nodsh"
9612 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
9613 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
9614 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
9615 [ -z "$old_rr" ] && skip "no QOS"
9616 do_facet $SINGLEMDS lctl set_param \
9617 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
9619 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
9620 createmany -o $DIR/$tdir/f- 20 || error "can't create"
9621 do_facet $SINGLEMDS lctl set_param fail_loc=0
9623 do_facet $SINGLEMDS lctl set_param \
9624 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
9626 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
9628 test_117() # bug 10891
9630 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9632 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
9633 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
9634 lctl set_param fail_loc=0x21e
9635 > $DIR/$tfile || error "truncate failed"
9636 lctl set_param fail_loc=0
9637 echo "Truncate succeeded."
9640 run_test 117 "verify osd extend =========="
9642 NO_SLOW_RESENDCOUNT=4
9643 export OLD_RESENDCOUNT=""
9644 set_resend_count () {
9645 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
9646 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
9647 lctl set_param -n $PROC_RESENDCOUNT $1
9648 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
9651 # for reduce test_118* time (b=14842)
9652 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9654 # Reset async IO behavior after error case
9656 FILE=$DIR/reset_async
9658 # Ensure all OSCs are cleared
9659 $SETSTRIPE -c -1 $FILE
9660 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
9665 test_118a() #bug 11710
9667 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9671 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9672 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9673 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9675 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9676 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9681 run_test 118a "verify O_SYNC works =========="
9685 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9686 remote_ost_nodsh && skip "remote OST with nodsh"
9690 #define OBD_FAIL_SRV_ENOENT 0x217
9691 set_nodes_failloc "$(osts_nodes)" 0x217
9692 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9694 set_nodes_failloc "$(osts_nodes)" 0
9695 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9696 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9699 if [[ $RC -eq 0 ]]; then
9700 error "Must return error due to dropped pages, rc=$RC"
9704 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9705 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9709 echo "Dirty pages not leaked on ENOENT"
9711 # Due to the above error the OSC will issue all RPCs syncronously
9712 # until a subsequent RPC completes successfully without error.
9713 $MULTIOP $DIR/$tfile Ow4096yc
9718 run_test 118b "Reclaim dirty pages on fatal error =========="
9722 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9724 # for 118c, restore the original resend count, LU-1940
9725 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
9726 set_resend_count $OLD_RESENDCOUNT
9727 remote_ost_nodsh && skip "remote OST with nodsh"
9731 #define OBD_FAIL_OST_EROFS 0x216
9732 set_nodes_failloc "$(osts_nodes)" 0x216
9734 # multiop should block due to fsync until pages are written
9735 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9739 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9740 error "Multiop failed to block on fsync, pid=$MULTIPID"
9743 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9745 if [[ $WRITEBACK -eq 0 ]]; then
9746 error "No page in writeback, writeback=$WRITEBACK"
9749 set_nodes_failloc "$(osts_nodes)" 0
9752 if [[ $RC -ne 0 ]]; then
9753 error "Multiop fsync failed, rc=$RC"
9756 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9757 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9759 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9760 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9764 echo "Dirty pages flushed via fsync on EROFS"
9767 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
9769 # continue to use small resend count to reduce test_118* time (b=14842)
9770 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9774 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9775 remote_ost_nodsh && skip "remote OST with nodsh"
9779 #define OBD_FAIL_OST_BRW_PAUSE_BULK
9780 set_nodes_failloc "$(osts_nodes)" 0x214
9781 # multiop should block due to fsync until pages are written
9782 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9786 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9787 error "Multiop failed to block on fsync, pid=$MULTIPID"
9790 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9792 if [[ $WRITEBACK -eq 0 ]]; then
9793 error "No page in writeback, writeback=$WRITEBACK"
9796 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
9797 set_nodes_failloc "$(osts_nodes)" 0
9799 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9800 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9802 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9803 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9807 echo "Dirty pages gaurenteed flushed via fsync"
9810 run_test 118d "Fsync validation inject a delay of the bulk =========="
9813 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9817 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
9818 lctl set_param fail_loc=0x8000040a
9820 # Should simulate EINVAL error which is fatal
9821 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9823 if [[ $RC -eq 0 ]]; then
9824 error "Must return error due to dropped pages, rc=$RC"
9827 lctl set_param fail_loc=0x0
9829 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9830 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9831 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9833 if [[ $LOCKED -ne 0 ]]; then
9834 error "Locked pages remain in cache, locked=$LOCKED"
9837 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9838 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9842 echo "No pages locked after fsync"
9847 run_test 118f "Simulate unrecoverable OSC side error =========="
9850 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9854 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
9855 lctl set_param fail_loc=0x406
9857 # simulate local -ENOMEM
9858 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9861 lctl set_param fail_loc=0
9862 if [[ $RC -eq 0 ]]; then
9863 error "Must return error due to dropped pages, rc=$RC"
9866 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9867 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9868 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9870 if [[ $LOCKED -ne 0 ]]; then
9871 error "Locked pages remain in cache, locked=$LOCKED"
9874 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9875 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9879 echo "No pages locked after fsync"
9884 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
9887 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9888 remote_ost_nodsh && skip "remote OST with nodsh"
9892 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9893 set_nodes_failloc "$(osts_nodes)" 0x20e
9894 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9895 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9898 set_nodes_failloc "$(osts_nodes)" 0
9899 if [[ $RC -eq 0 ]]; then
9900 error "Must return error due to dropped pages, rc=$RC"
9903 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9904 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9905 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9907 if [[ $LOCKED -ne 0 ]]; then
9908 error "Locked pages remain in cache, locked=$LOCKED"
9911 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9912 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9916 echo "No pages locked after fsync"
9920 run_test 118h "Verify timeout in handling recoverables errors =========="
9922 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
9925 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9926 remote_ost_nodsh && skip "remote OST with nodsh"
9930 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9931 set_nodes_failloc "$(osts_nodes)" 0x20e
9933 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9934 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9937 set_nodes_failloc "$(osts_nodes)" 0
9941 if [[ $RC -ne 0 ]]; then
9942 error "got error, but should be not, rc=$RC"
9945 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9946 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9947 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9948 if [[ $LOCKED -ne 0 ]]; then
9949 error "Locked pages remain in cache, locked=$LOCKED"
9952 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9953 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9957 echo "No pages locked after fsync"
9961 run_test 118i "Fix error before timeout in recoverable error =========="
9963 [ "$SLOW" = "no" ] && set_resend_count 4
9966 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9967 remote_ost_nodsh && skip "remote OST with nodsh"
9971 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
9972 set_nodes_failloc "$(osts_nodes)" 0x220
9974 # return -EIO from OST
9975 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9977 set_nodes_failloc "$(osts_nodes)" 0x0
9978 if [[ $RC -eq 0 ]]; then
9979 error "Must return error due to dropped pages, rc=$RC"
9982 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9983 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9984 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9985 if [[ $LOCKED -ne 0 ]]; then
9986 error "Locked pages remain in cache, locked=$LOCKED"
9989 # in recoverable error on OST we want resend and stay until it finished
9990 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9991 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9995 echo "No pages locked after fsync"
9999 run_test 118j "Simulate unrecoverable OST side error =========="
10003 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10004 remote_ost_nodsh && skip "remote OSTs with nodsh"
10006 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10007 set_nodes_failloc "$(osts_nodes)" 0x20e
10008 test_mkdir $DIR/$tdir
10010 for ((i=0;i<10;i++)); do
10011 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
10012 error "dd to $DIR/$tdir/$tfile-$i failed" )&
10019 set_nodes_failloc "$(osts_nodes)" 0
10022 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
10024 test_118l() # LU-646
10026 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10028 test_mkdir $DIR/$tdir
10029 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
10032 run_test 118l "fsync dir"
10034 test_118m() # LU-3066
10036 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10038 test_mkdir $DIR/$tdir
10039 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
10042 run_test 118m "fdatasync dir ========="
10044 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10051 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10052 remote_ost_nodsh && skip "remote OSTs with nodsh"
10054 # Sleep to avoid a cached response.
10055 #define OBD_STATFS_CACHE_SECONDS 1
10058 # Inject a 10 second delay in the OST_STATFS handler.
10059 #define OBD_FAIL_OST_STATFS_DELAY 0x242
10060 set_nodes_failloc "$(osts_nodes)" 0x242
10063 stat --file-system $MOUNT > /dev/null
10066 set_nodes_failloc "$(osts_nodes)" 0
10068 if ((end - begin > 20)); then
10069 error "statfs took $((end - begin)) seconds, expected 10"
10072 run_test 118n "statfs() sends OST_STATFS requests in parallel"
10074 test_119a() # bug 11737
10076 BSIZE=$((512 * 1024))
10077 directio write $DIR/$tfile 0 1 $BSIZE
10078 # We ask to read two blocks, which is more than a file size.
10079 # directio will indicate an error when requested and actual
10080 # sizes aren't equeal (a normal situation in this case) and
10081 # print actual read amount.
10082 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
10083 if [ "$NOB" != "$BSIZE" ]; then
10084 error "read $NOB bytes instead of $BSIZE"
10088 run_test 119a "Short directIO read must return actual read amount"
10090 test_119b() # bug 11737
10092 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10094 $SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed"
10095 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
10097 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
10098 error "direct read failed"
10101 run_test 119b "Sparse directIO read must return actual read amount"
10103 test_119c() # bug 13099
10106 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
10107 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
10110 run_test 119c "Testing for direct read hitting hole"
10112 test_119d() # bug 15950
10114 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10116 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
10117 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
10119 $SETSTRIPE $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
10120 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
10121 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
10122 lctl set_param fail_loc=0x40d
10123 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
10126 cat $DIR/$tfile > /dev/null &
10127 lctl set_param fail_loc=0
10130 log "the DIO writes have completed, now wait for the reads (should not block very long)"
10132 [ -n "`ps h -p $pid_reads -o comm`" ] && \
10133 error "the read rpcs have not completed in 2s"
10135 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
10137 run_test 119d "The DIO path should try to send a new rpc once one is completed"
10140 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10141 remote_mds_nodsh && skip "remote MDS with nodsh"
10142 test_mkdir $DIR/$tdir
10143 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10144 skip_env "no early lock cancel on server"
10146 lru_resize_disable mdc
10147 lru_resize_disable osc
10148 cancel_lru_locks mdc
10149 # asynchronous object destroy at MDT could cause bl ast to client
10150 cancel_lru_locks osc
10152 stat $DIR/$tdir > /dev/null
10153 can1=$(do_facet $SINGLEMDS \
10154 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10155 awk '/ldlm_cancel/ {print $2}')
10156 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10157 awk '/ldlm_bl_callback/ {print $2}')
10158 test_mkdir -c1 $DIR/$tdir/d1
10159 can2=$(do_facet $SINGLEMDS \
10160 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10161 awk '/ldlm_cancel/ {print $2}')
10162 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10163 awk '/ldlm_bl_callback/ {print $2}')
10164 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10165 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10166 lru_resize_enable mdc
10167 lru_resize_enable osc
10169 run_test 120a "Early Lock Cancel: mkdir test"
10172 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10173 remote_mds_nodsh && skip "remote MDS with nodsh"
10174 test_mkdir $DIR/$tdir
10175 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10176 skip_env "no early lock cancel on server"
10178 lru_resize_disable mdc
10179 lru_resize_disable osc
10180 cancel_lru_locks mdc
10181 stat $DIR/$tdir > /dev/null
10182 can1=$(do_facet $SINGLEMDS \
10183 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10184 awk '/ldlm_cancel/ {print $2}')
10185 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10186 awk '/ldlm_bl_callback/ {print $2}')
10187 touch $DIR/$tdir/f1
10188 can2=$(do_facet $SINGLEMDS \
10189 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10190 awk '/ldlm_cancel/ {print $2}')
10191 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10192 awk '/ldlm_bl_callback/ {print $2}')
10193 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10194 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10195 lru_resize_enable mdc
10196 lru_resize_enable osc
10198 run_test 120b "Early Lock Cancel: create test"
10201 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10202 remote_mds_nodsh && skip "remote MDS with nodsh"
10203 test_mkdir -c1 $DIR/$tdir
10204 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10205 skip "no early lock cancel on server"
10207 lru_resize_disable mdc
10208 lru_resize_disable osc
10209 test_mkdir -c1 $DIR/$tdir/d1
10210 test_mkdir -c1 $DIR/$tdir/d2
10211 touch $DIR/$tdir/d1/f1
10212 cancel_lru_locks mdc
10213 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
10214 can1=$(do_facet $SINGLEMDS \
10215 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10216 awk '/ldlm_cancel/ {print $2}')
10217 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10218 awk '/ldlm_bl_callback/ {print $2}')
10219 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10220 can2=$(do_facet $SINGLEMDS \
10221 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10222 awk '/ldlm_cancel/ {print $2}')
10223 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10224 awk '/ldlm_bl_callback/ {print $2}')
10225 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10226 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10227 lru_resize_enable mdc
10228 lru_resize_enable osc
10230 run_test 120c "Early Lock Cancel: link test"
10233 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10234 remote_mds_nodsh && skip "remote MDS with nodsh"
10235 test_mkdir -c1 $DIR/$tdir
10236 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10237 skip_env "no early lock cancel on server"
10239 lru_resize_disable mdc
10240 lru_resize_disable osc
10242 cancel_lru_locks mdc
10243 stat $DIR/$tdir > /dev/null
10244 can1=$(do_facet $SINGLEMDS \
10245 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10246 awk '/ldlm_cancel/ {print $2}')
10247 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10248 awk '/ldlm_bl_callback/ {print $2}')
10249 chmod a+x $DIR/$tdir
10250 can2=$(do_facet $SINGLEMDS \
10251 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10252 awk '/ldlm_cancel/ {print $2}')
10253 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10254 awk '/ldlm_bl_callback/ {print $2}')
10255 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10256 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10257 lru_resize_enable mdc
10258 lru_resize_enable osc
10260 run_test 120d "Early Lock Cancel: setattr test"
10263 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10264 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10265 skip_env "no early lock cancel on server"
10266 remote_mds_nodsh && skip "remote MDS with nodsh"
10268 local dlmtrace_set=false
10270 test_mkdir -c1 $DIR/$tdir
10271 lru_resize_disable mdc
10272 lru_resize_disable osc
10273 ! $LCTL get_param debug | grep -q dlmtrace &&
10274 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
10275 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
10276 cancel_lru_locks mdc
10277 cancel_lru_locks osc
10278 dd if=$DIR/$tdir/f1 of=/dev/null
10279 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
10280 # XXX client can not do early lock cancel of OST lock
10281 # during unlink (LU-4206), so cancel osc lock now.
10283 cancel_lru_locks osc
10284 can1=$(do_facet $SINGLEMDS \
10285 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10286 awk '/ldlm_cancel/ {print $2}')
10287 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10288 awk '/ldlm_bl_callback/ {print $2}')
10289 unlink $DIR/$tdir/f1
10291 can2=$(do_facet $SINGLEMDS \
10292 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10293 awk '/ldlm_cancel/ {print $2}')
10294 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10295 awk '/ldlm_bl_callback/ {print $2}')
10296 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10297 $LCTL dk $TMP/cancel.debug.txt
10298 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10299 $LCTL dk $TMP/blocking.debug.txt
10300 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10301 lru_resize_enable mdc
10302 lru_resize_enable osc
10304 run_test 120e "Early Lock Cancel: unlink test"
10307 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10308 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10309 skip_env "no early lock cancel on server"
10310 remote_mds_nodsh && skip "remote MDS with nodsh"
10312 test_mkdir -c1 $DIR/$tdir
10313 lru_resize_disable mdc
10314 lru_resize_disable osc
10315 test_mkdir -c1 $DIR/$tdir/d1
10316 test_mkdir -c1 $DIR/$tdir/d2
10317 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10318 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10319 cancel_lru_locks mdc
10320 cancel_lru_locks osc
10321 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10322 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10323 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10324 # XXX client can not do early lock cancel of OST lock
10325 # during rename (LU-4206), so cancel osc lock now.
10327 cancel_lru_locks osc
10328 can1=$(do_facet $SINGLEMDS \
10329 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10330 awk '/ldlm_cancel/ {print $2}')
10331 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10332 awk '/ldlm_bl_callback/ {print $2}')
10333 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10335 can2=$(do_facet $SINGLEMDS \
10336 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10337 awk '/ldlm_cancel/ {print $2}')
10338 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10339 awk '/ldlm_bl_callback/ {print $2}')
10340 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10341 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10342 lru_resize_enable mdc
10343 lru_resize_enable osc
10345 run_test 120f "Early Lock Cancel: rename test"
10348 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10349 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10350 skip_env "no early lock cancel on server"
10351 remote_mds_nodsh && skip "remote MDS with nodsh"
10353 lru_resize_disable mdc
10354 lru_resize_disable osc
10356 echo create $count files
10357 test_mkdir $DIR/$tdir
10358 cancel_lru_locks mdc
10359 cancel_lru_locks osc
10362 can0=$(do_facet $SINGLEMDS \
10363 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10364 awk '/ldlm_cancel/ {print $2}')
10365 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10366 awk '/ldlm_bl_callback/ {print $2}')
10367 createmany -o $DIR/$tdir/f $count
10369 can1=$(do_facet $SINGLEMDS \
10370 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10371 awk '/ldlm_cancel/ {print $2}')
10372 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10373 awk '/ldlm_bl_callback/ {print $2}')
10375 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10376 echo rm $count files
10379 can2=$(do_facet $SINGLEMDS \
10380 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10381 awk '/ldlm_cancel/ {print $2}')
10382 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10383 awk '/ldlm_bl_callback/ {print $2}')
10385 echo total: $count removes in $((t2-t1))
10386 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10388 # wait for commitment of removal
10389 lru_resize_enable mdc
10390 lru_resize_enable osc
10392 run_test 120g "Early Lock Cancel: performance test"
10394 test_121() { #bug #10589
10395 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10398 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10399 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10400 lctl set_param fail_loc=0x310
10401 cancel_lru_locks osc > /dev/null
10402 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10403 lctl set_param fail_loc=0
10404 [[ $reads -eq $writes ]] ||
10405 error "read $reads blocks, must be $writes blocks"
10407 run_test 121 "read cancel race ========="
10409 test_123a() { # was test 123, statahead(bug 11401)
10410 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10413 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10414 log "testing UP system. Performance may be lower than expected."
10419 test_mkdir $DIR/$tdir
10420 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10421 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10423 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10424 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10426 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10427 lctl set_param -n llite.*.statahead_max 0
10428 lctl get_param llite.*.statahead_max
10429 cancel_lru_locks mdc
10430 cancel_lru_locks osc
10432 time ls -l $DIR/$tdir | wc -l
10434 delta=$((etime - stime))
10435 log "ls $i files without statahead: $delta sec"
10436 lctl set_param llite.*.statahead_max=$max
10438 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10439 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
10440 cancel_lru_locks mdc
10441 cancel_lru_locks osc
10443 time ls -l $DIR/$tdir | wc -l
10445 delta_sa=$((etime - stime))
10446 log "ls $i files with statahead: $delta_sa sec"
10447 lctl get_param -n llite.*.statahead_stats
10448 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10450 [[ $swrong -lt $ewrong ]] &&
10451 log "statahead was stopped, maybe too many locks held!"
10452 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
10454 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10455 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10456 lctl set_param -n llite.*.statahead_max 0
10457 lctl get_param llite.*.statahead_max
10458 cancel_lru_locks mdc
10459 cancel_lru_locks osc
10461 time ls -l $DIR/$tdir | wc -l
10463 delta=$((etime - stime))
10464 log "ls $i files again without statahead: $delta sec"
10465 lctl set_param llite.*.statahead_max=$max
10466 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10467 if [ $SLOWOK -eq 0 ]; then
10468 error "ls $i files is slower with statahead!"
10470 log "ls $i files is slower with statahead!"
10476 [ $delta -gt 20 ] && break
10477 [ $delta -gt 8 ] && MULT=$((50 / delta))
10478 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
10486 delta=$((etime - stime))
10487 log "rm -r $DIR/$tdir/: $delta seconds"
10489 lctl get_param -n llite.*.statahead_stats
10491 run_test 123a "verify statahead work"
10493 test_123b () { # statahead(bug 15027)
10494 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10496 test_mkdir $DIR/$tdir
10497 createmany -o $DIR/$tdir/$tfile-%d 1000
10499 cancel_lru_locks mdc
10500 cancel_lru_locks osc
10502 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
10503 lctl set_param fail_loc=0x80000803
10504 ls -lR $DIR/$tdir > /dev/null
10506 lctl set_param fail_loc=0x0
10507 lctl get_param -n llite.*.statahead_stats
10512 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
10515 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
10517 test_mkdir -i 0 -c 1 $DIR/$tdir.0
10518 test_mkdir -i 1 -c 1 $DIR/$tdir.1
10519 touch $DIR/$tdir.1/{1..3}
10520 mv $DIR/$tdir.1/{1..3} $DIR/$tdir.0
10522 remount_client $MOUNT
10524 $MULTIOP $DIR/$tdir.0 Q
10526 # let statahead to complete
10527 ls -l $DIR/$tdir.0 > /dev/null
10529 testid=$(echo $TESTNAME | tr '_' ' ')
10530 dmesg | tac | sed "/$testid/,$ d" | grep "Can not initialize inode" &&
10531 error "statahead warning" || true
10533 run_test 123c "Can not initialize inode warning on DNE statahead"
10536 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10537 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10538 skip_env "no lru resize on server"
10542 test_mkdir $DIR/$tdir
10544 log "create $NR files at $DIR/$tdir"
10545 createmany -o $DIR/$tdir/f $NR ||
10546 error "failed to create $NR files in $DIR/$tdir"
10548 cancel_lru_locks mdc
10549 ls -l $DIR/$tdir > /dev/null
10553 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
10554 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
10555 LRU_SIZE=$($LCTL get_param -n $PARAM)
10556 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
10557 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
10559 log "NS=$(basename $NSDIR)"
10564 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
10565 skip "Not enough cached locks created!"
10567 log "LRU=$LRU_SIZE"
10571 # We know that lru resize allows one client to hold $LIMIT locks
10572 # for 10h. After that locks begin to be killed by client.
10574 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
10576 if [ $LIMIT -lt $LRU_SIZE ]; then
10577 skip "Limit is too small $LIMIT"
10580 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
10581 # killing locks. Some time was spent for creating locks. This means
10582 # that up to the moment of sleep finish we must have killed some of
10583 # them (10-100 locks). This depends on how fast ther were created.
10584 # Many of them were touched in almost the same moment and thus will
10585 # be killed in groups.
10586 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
10588 # Use $LRU_SIZE_B here to take into account real number of locks
10589 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
10590 local LRU_SIZE_B=$LRU_SIZE
10592 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
10593 log "OLD_LVF=$OLD_LVF"
10594 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
10596 # Let's make sure that we really have some margin. Client checks
10597 # cached locks every 10 sec.
10598 SLEEP=$((SLEEP+20))
10599 log "Sleep ${SLEEP} sec"
10601 while ((SEC<$SLEEP)); do
10605 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
10606 echo -n "$LRU_SIZE"
10609 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
10610 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
10612 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
10613 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
10614 unlinkmany $DIR/$tdir/f $NR
10618 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
10619 log "unlink $NR files at $DIR/$tdir"
10620 unlinkmany $DIR/$tdir/f $NR
10622 run_test 124a "lru resize ======================================="
10624 get_max_pool_limit()
10626 local limit=$($LCTL get_param \
10627 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
10629 for l in $limit; do
10630 if [[ $l -gt $max ]]; then
10638 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10639 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10640 skip_env "no lru resize on server"
10642 LIMIT=$(get_max_pool_limit)
10644 NR=$(($(default_lru_size)*20))
10645 if [[ $NR -gt $LIMIT ]]; then
10646 log "Limit lock number by $LIMIT locks"
10650 IFree=$(mdsrate_inodes_available)
10651 if [ $IFree -lt $NR ]; then
10652 log "Limit lock number by $IFree inodes"
10656 lru_resize_disable mdc
10657 test_mkdir -p $DIR/$tdir/disable_lru_resize
10659 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
10660 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
10661 cancel_lru_locks mdc
10664 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10667 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10670 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10674 nolruresize_delta=$((etime-stime))
10675 log "ls -la time: $nolruresize_delta seconds"
10676 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10677 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
10679 lru_resize_enable mdc
10680 test_mkdir -p $DIR/$tdir/enable_lru_resize
10682 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
10683 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
10684 cancel_lru_locks mdc
10687 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10690 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10693 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10697 lruresize_delta=$((etime-stime))
10698 log "ls -la time: $lruresize_delta seconds"
10699 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10701 if [ $lruresize_delta -gt $nolruresize_delta ]; then
10702 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
10703 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
10704 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
10706 log "lru resize performs the same with no lru resize"
10708 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
10710 run_test 124b "lru resize (performance test) ======================="
10713 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10714 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10715 skip_env "no lru resize on server"
10717 # cache ununsed locks on client
10719 cancel_lru_locks mdc
10720 test_mkdir $DIR/$tdir
10721 createmany -o $DIR/$tdir/f $nr ||
10722 error "failed to create $nr files in $DIR/$tdir"
10723 ls -l $DIR/$tdir > /dev/null
10725 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10726 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10727 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10728 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10729 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10731 # set lru_max_age to 1 sec
10732 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10733 echo "sleep $((recalc_p * 2)) seconds..."
10734 sleep $((recalc_p * 2))
10736 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10737 # restore lru_max_age
10738 $LCTL set_param -n $nsdir.lru_max_age $max_age
10739 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10740 unlinkmany $DIR/$tdir/f $nr
10742 run_test 124c "LRUR cancel very aged locks"
10745 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10746 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10747 skip_env "no lru resize on server"
10749 # cache ununsed locks on client
10752 lru_resize_disable mdc
10753 stack_trap "lru_resize_enable mdc" EXIT
10755 cancel_lru_locks mdc
10757 # asynchronous object destroy at MDT could cause bl ast to client
10758 test_mkdir $DIR/$tdir
10759 createmany -o $DIR/$tdir/f $nr ||
10760 error "failed to create $nr files in $DIR/$tdir"
10761 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
10763 ls -l $DIR/$tdir > /dev/null
10765 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10766 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10767 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10768 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10770 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10772 # set lru_max_age to 1 sec
10773 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10774 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
10776 echo "sleep $((recalc_p * 2)) seconds..."
10777 sleep $((recalc_p * 2))
10779 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10781 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10783 run_test 124d "cancel very aged locks if lru-resize diasbaled"
10785 test_125() { # 13358
10786 $LCTL get_param -n llite.*.client_type | grep -q local ||
10787 skip "must run as local client"
10788 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
10789 skip_env "must have acl enabled"
10790 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
10792 test_mkdir $DIR/$tdir
10793 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
10794 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
10795 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
10797 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
10799 test_126() { # bug 12829/13455
10800 $GSS && skip_env "must run as gss disabled"
10801 $LCTL get_param -n llite.*.client_type | grep -q local ||
10802 skip "must run as local client"
10803 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
10805 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
10806 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
10808 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
10810 run_test 126 "check that the fsgid provided by the client is taken into account"
10812 test_127a() { # bug 15521
10813 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10815 $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
10816 $LCTL set_param osc.*.stats=0
10817 FSIZE=$((2048 * 1024))
10818 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
10819 cancel_lru_locks osc
10820 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
10822 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
10823 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
10824 echo "got $COUNT $NAME"
10825 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
10826 eval $NAME=$COUNT || error "Wrong proc format"
10829 read_bytes|write_bytes)
10830 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
10831 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
10832 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
10833 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
10834 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
10835 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
10836 error "sumsquare is too small: $SUMSQ"
10837 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
10838 error "sumsquare is too big: $SUMSQ"
10842 done < $DIR/${tfile}.tmp
10844 #check that we actually got some stats
10845 [ "$read_bytes" ] || error "Missing read_bytes stats"
10846 [ "$write_bytes" ] || error "Missing write_bytes stats"
10847 [ "$read_bytes" != 0 ] || error "no read done"
10848 [ "$write_bytes" != 0 ] || error "no write done"
10850 run_test 127a "verify the client stats are sane"
10852 test_127b() { # bug LU-333
10853 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10854 local name count samp unit min max sum sumsq
10856 $LCTL set_param llite.*.stats=0
10858 # perform 2 reads and writes so MAX is different from SUM.
10859 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10860 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10861 cancel_lru_locks osc
10862 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10863 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10865 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
10866 while read name count samp unit min max sum sumsq; do
10867 echo "got $count $name"
10868 eval $name=$count || error "Wrong proc format"
10872 [ $count -ne 2 ] && error "count is not 2: $count"
10873 [ $min -ne $PAGE_SIZE ] &&
10874 error "min is not $PAGE_SIZE: $min"
10875 [ $max -ne $PAGE_SIZE ] &&
10876 error "max is incorrect: $max"
10877 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10878 error "sum is wrong: $sum"
10881 [ $count -ne 2 ] && error "count is not 2: $count"
10882 [ $min -ne $PAGE_SIZE ] &&
10883 error "min is not $PAGE_SIZE: $min"
10884 [ $max -ne $PAGE_SIZE ] &&
10885 error "max is incorrect: $max"
10886 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10887 error "sum is wrong: $sum"
10891 done < $TMP/$tfile.tmp
10893 #check that we actually got some stats
10894 [ "$read_bytes" ] || error "Missing read_bytes stats"
10895 [ "$write_bytes" ] || error "Missing write_bytes stats"
10896 [ "$read_bytes" != 0 ] || error "no read done"
10897 [ "$write_bytes" != 0 ] || error "no write done"
10899 rm -f $TMP/${tfile}.tmp
10901 run_test 127b "verify the llite client stats are sane"
10903 test_127c() { # LU-12394
10904 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
10911 $LCTL set_param llite.*.extents_stats=1
10912 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
10914 # Use two stripes so there is enough space in default config
10915 $LFS setstripe -c 2 $DIR/$tfile
10917 # Extent stats start at 0-4K and go in power of two buckets
10918 # LL_HIST_START = 12 --> 2^12 = 4K
10919 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
10920 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
10922 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
10924 # Write and read, 2x each, second time at a non-zero offset
10925 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
10926 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
10927 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
10928 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
10932 $LCTL get_param llite.*.extents_stats
10935 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
10937 local bucket=$($LCTL get_param -n llite.*.extents_stats |
10939 reads=$(echo $bucket | awk '{print $5}')
10940 writes=$(echo $bucket | awk '{print $9}')
10941 [ "$reads" -eq $count ] ||
10942 error "$reads reads in < $bsize bucket, expect $count"
10943 [ "$writes" -eq $count ] ||
10944 error "$writes writes in < $bsize bucket, expect $count"
10947 # Test mmap write and read
10948 $LCTL set_param llite.*.extents_stats=c
10950 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
10951 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
10952 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
10954 $LCTL get_param llite.*.extents_stats
10956 count=$(((size*1024) / PAGE_SIZE))
10958 bsize=$((2 * PAGE_SIZE / 1024))K
10960 bucket=$($LCTL get_param -n llite.*.extents_stats |
10962 reads=$(echo $bucket | awk '{print $5}')
10963 writes=$(echo $bucket | awk '{print $9}')
10964 # mmap writes fault in the page first, creating an additonal read
10965 [ "$reads" -eq $((2 * count)) ] ||
10966 error "$reads reads in < $bsize bucket, expect $count"
10967 [ "$writes" -eq $count ] ||
10968 error "$writes writes in < $bsize bucket, expect $count"
10970 run_test 127c "test llite extent stats with regular & mmap i/o"
10972 test_128() { # bug 15212
10974 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
10979 result=$(grep error $TMP/$tfile.log)
10980 rm -f $DIR/$tfile $TMP/$tfile.log
10981 [ -z "$result" ] ||
10982 error "consecutive find's under interactive lfs failed"
10984 run_test 128 "interactive lfs for 2 consecutive find's"
10986 set_dir_limits () {
10991 local ldproc=/proc/fs/ldiskfs
10992 local facets=$(get_facets MDS)
10994 for facet in ${facets//,/ }; do
10995 canondev=$(ldiskfs_canon \
10996 *.$(convert_facet2label $facet).mntdev $facet)
10997 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
10998 ldproc=/sys/fs/ldiskfs
10999 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
11000 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
11004 check_mds_dmesg() {
11005 local facets=$(get_facets MDS)
11006 for facet in ${facets//,/ }; do
11007 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
11013 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11014 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
11015 skip "Need MDS version with at least 2.5.56"
11016 if [ "$mds1_FSTYPE" != ldiskfs ]; then
11017 skip_env "ldiskfs only test"
11019 remote_mds_nodsh && skip "remote MDS with nodsh"
11023 local has_warning=false
11026 mkdir -p $DIR/$tdir
11028 # block size of mds1
11029 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
11030 set_dir_limits $maxsize $maxsize
11031 local dirsize=$(stat -c%s "$DIR/$tdir")
11033 while [[ $dirsize -le $maxsize ]]; do
11034 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
11036 if ! $has_warning; then
11037 check_mds_dmesg '"is approaching"' && has_warning=true
11039 # check two errors:
11040 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
11041 # EFBIG for previous versions included in ldiskfs series
11042 if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
11044 echo "return code $rc received as expected"
11046 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
11047 error_exit "create failed w/o dir size limit"
11049 check_mds_dmesg '"has reached"' ||
11050 error_exit "reached message should be output"
11052 [ $has_warning = "false" ] &&
11053 error_exit "warning message should be output"
11055 dirsize=$(stat -c%s "$DIR/$tdir")
11057 [[ $dirsize -ge $maxsize ]] && return 0
11058 error_exit "current dir size $dirsize, " \
11059 "previous limit $maxsize"
11060 elif [ $rc -ne 0 ]; then
11062 error_exit "return $rc received instead of expected " \
11063 "$EFBIG or $ENOSPC, files in dir $dirsize"
11065 nfiles=$((nfiles + 1))
11066 dirsize=$(stat -c%s "$DIR/$tdir")
11070 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
11072 run_test 129 "test directory size limit ========================"
11081 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11082 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11084 trap cleanup_130 EXIT RETURN
11086 local fm_file=$DIR/$tfile
11087 $SETSTRIPE -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
11088 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
11089 error "dd failed for $fm_file"
11091 # LU-1795: test filefrag/FIEMAP once, even if unsupported
11092 filefrag -ves $fm_file
11094 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11095 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11096 [ $RC != 0 ] && error "filefrag $fm_file failed"
11098 filefrag_op=$(filefrag -ve -k $fm_file |
11099 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11100 lun=$($GETSTRIPE -i $fm_file)
11102 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
11105 for line in $filefrag_op
11107 frag_lun=`echo $line | cut -d: -f5`
11108 ext_len=`echo $line | cut -d: -f4`
11109 if (( $frag_lun != $lun )); then
11111 error "FIEMAP on 1-stripe file($fm_file) failed"
11114 (( tot_len += ext_len ))
11117 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
11119 error "FIEMAP on 1-stripe file($fm_file) failed;"
11125 echo "FIEMAP on single striped file succeeded"
11127 run_test 130a "FIEMAP (1-stripe file)"
11130 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11132 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11133 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11135 trap cleanup_130 EXIT RETURN
11137 local fm_file=$DIR/$tfile
11138 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11139 error "setstripe on $fm_file"
11140 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11141 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11143 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
11144 error "dd failed on $fm_file"
11146 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11147 filefrag_op=$(filefrag -ve -k $fm_file |
11148 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11150 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11151 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11156 for line in $filefrag_op
11158 frag_lun=$(echo $line | cut -d: -f5 |
11159 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11160 ext_len=$(echo $line | cut -d: -f4)
11161 if (( $frag_lun != $last_lun )); then
11162 if (( tot_len != 1024 )); then
11164 error "FIEMAP on $fm_file failed; returned " \
11165 "len $tot_len for OST $last_lun instead of 1024"
11168 (( num_luns += 1 ))
11172 (( tot_len += ext_len ))
11175 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
11177 error "FIEMAP on $fm_file failed; returned wrong number of " \
11178 "luns or wrong len for OST $last_lun"
11184 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
11186 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
11189 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11191 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11192 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11194 trap cleanup_130 EXIT RETURN
11196 local fm_file=$DIR/$tfile
11197 $SETSTRIPE -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
11198 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11199 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11201 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
11202 error "dd failed on $fm_file"
11204 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11205 filefrag_op=$(filefrag -ve -k $fm_file |
11206 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11208 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11209 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11214 for line in $filefrag_op
11216 frag_lun=$(echo $line | cut -d: -f5 |
11217 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11218 ext_len=$(echo $line | cut -d: -f4)
11219 if (( $frag_lun != $last_lun )); then
11220 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
11221 if (( logical != 512 )); then
11223 error "FIEMAP on $fm_file failed; returned " \
11224 "logical start for lun $logical instead of 512"
11227 if (( tot_len != 512 )); then
11229 error "FIEMAP on $fm_file failed; returned " \
11230 "len $tot_len for OST $last_lun instead of 1024"
11233 (( num_luns += 1 ))
11237 (( tot_len += ext_len ))
11240 if (( num_luns != 2 || tot_len != 512 )); then
11242 error "FIEMAP on $fm_file failed; returned wrong number of " \
11243 "luns or wrong len for OST $last_lun"
11249 echo "FIEMAP on 2-stripe file with hole succeeded"
11251 run_test 130c "FIEMAP (2-stripe file with hole)"
11254 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
11256 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11257 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11259 trap cleanup_130 EXIT RETURN
11261 local fm_file=$DIR/$tfile
11262 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11263 error "setstripe on $fm_file"
11264 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11265 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11267 local actual_stripe_count=$($GETSTRIPE -c $fm_file)
11268 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
11269 error "dd failed on $fm_file"
11271 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11272 filefrag_op=$(filefrag -ve -k $fm_file |
11273 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11275 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11276 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11281 for line in $filefrag_op
11283 frag_lun=$(echo $line | cut -d: -f5 |
11284 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11285 ext_len=$(echo $line | cut -d: -f4)
11286 if (( $frag_lun != $last_lun )); then
11287 if (( tot_len != 1024 )); then
11289 error "FIEMAP on $fm_file failed; returned " \
11290 "len $tot_len for OST $last_lun instead of 1024"
11293 (( num_luns += 1 ))
11297 (( tot_len += ext_len ))
11300 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
11302 error "FIEMAP on $fm_file failed; returned wrong number of " \
11303 "luns or wrong len for OST $last_lun"
11309 echo "FIEMAP on N-stripe file succeeded"
11311 run_test 130d "FIEMAP (N-stripe file)"
11314 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11316 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11317 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11319 trap cleanup_130 EXIT RETURN
11321 local fm_file=$DIR/$tfile
11322 $SETSTRIPE -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11323 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11324 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11327 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11328 for ((i = 0; i < $NUM_BLKS; i++))
11330 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11333 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11334 filefrag_op=$(filefrag -ve -k $fm_file |
11335 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11337 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11338 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11343 for line in $filefrag_op
11345 frag_lun=$(echo $line | cut -d: -f5 |
11346 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11347 ext_len=$(echo $line | cut -d: -f4)
11348 if (( $frag_lun != $last_lun )); then
11349 if (( tot_len != $EXPECTED_LEN )); then
11351 error "FIEMAP on $fm_file failed; returned " \
11352 "len $tot_len for OST $last_lun instead " \
11356 (( num_luns += 1 ))
11360 (( tot_len += ext_len ))
11363 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11365 error "FIEMAP on $fm_file failed; returned wrong number " \
11366 "of luns or wrong len for OST $last_lun"
11372 echo "FIEMAP with continuation calls succeeded"
11374 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11377 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11378 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11380 local fm_file=$DIR/$tfile
11381 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11382 error "multiop create with lov_delay_create on $fm_file"
11384 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11385 filefrag_extents=$(filefrag -vek $fm_file |
11386 awk '/extents? found/ { print $2 }')
11387 if [[ "$filefrag_extents" != "0" ]]; then
11388 error "FIEMAP on $fm_file failed; " \
11389 "returned $filefrag_extents expected 0"
11394 run_test 130f "FIEMAP (unstriped file)"
11396 # Test for writev/readv
11398 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11399 error "writev test failed"
11400 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11401 error "readv failed"
11404 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11407 local fsize=$((524288 + 1048576 + 1572864))
11408 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11409 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11410 error "append writev test failed"
11412 ((fsize += 1572864 + 1048576))
11413 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11414 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11415 error "append writev test failed"
11418 run_test 131b "test append writev"
11421 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11424 run_test 131c "test read/write on file w/o objects"
11427 rwv -f $DIR/$tfile -w -n 1 1572864
11428 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11429 if [ "$NOB" != 1572864 ]; then
11430 error "Short read filed: read $NOB bytes instead of 1572864"
11434 run_test 131d "test short read"
11437 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11438 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11439 error "read hitting hole failed"
11442 run_test 131e "test read hitting hole"
11451 mds*) res=$(do_facet $facet \
11452 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11454 ost*) res=$(do_facet $facet \
11455 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
11457 *) error "Wrong facet '$facet'" ;;
11459 [ "$res" ] || error "The counter for $op on $facet was not incremented"
11460 # if the argument $3 is zero, it means any stat increment is ok.
11461 if [[ $want -gt 0 ]]; then
11462 local count=$(echo $res | awk '{ print $2 }')
11463 [[ $count -ne $want ]] &&
11464 error "The $op counter on $facet is $count, not $want"
11469 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11470 remote_ost_nodsh && skip "remote OST with nodsh"
11471 remote_mds_nodsh && skip "remote MDS with nodsh"
11472 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11473 skip_env "MDS doesn't support rename stats"
11475 local testdir=$DIR/${tdir}/stats_testdir
11477 mkdir -p $DIR/${tdir}
11480 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11481 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11483 # verify mdt stats first.
11484 mkdir ${testdir} || error "mkdir failed"
11485 check_stats $SINGLEMDS "mkdir" 1
11486 touch ${testdir}/${tfile} || error "touch failed"
11487 check_stats $SINGLEMDS "open" 1
11488 check_stats $SINGLEMDS "close" 1
11489 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
11490 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
11491 check_stats $SINGLEMDS "mknod" 2
11493 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
11494 check_stats $SINGLEMDS "unlink" 1
11495 rm -f ${testdir}/${tfile} || error "file remove failed"
11496 check_stats $SINGLEMDS "unlink" 2
11498 # remove working dir and check mdt stats again.
11499 rmdir ${testdir} || error "rmdir failed"
11500 check_stats $SINGLEMDS "rmdir" 1
11502 local testdir1=$DIR/${tdir}/stats_testdir1
11503 mkdir -p ${testdir}
11504 mkdir -p ${testdir1}
11505 touch ${testdir1}/test1
11506 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
11507 check_stats $SINGLEMDS "crossdir_rename" 1
11509 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
11510 check_stats $SINGLEMDS "samedir_rename" 1
11512 rm -rf $DIR/${tdir}
11514 run_test 133a "Verifying MDT stats ========================================"
11519 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11520 remote_ost_nodsh && skip "remote OST with nodsh"
11521 remote_mds_nodsh && skip "remote MDS with nodsh"
11523 local testdir=$DIR/${tdir}/stats_testdir
11525 mkdir -p ${testdir} || error "mkdir failed"
11526 touch ${testdir}/${tfile} || error "touch failed"
11527 cancel_lru_locks mdc
11530 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11531 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11533 # extra mdt stats verification.
11534 chmod 444 ${testdir}/${tfile} || error "chmod failed"
11535 check_stats $SINGLEMDS "setattr" 1
11536 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11537 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
11539 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
11540 check_stats $SINGLEMDS "getattr" 1
11542 rm -rf $DIR/${tdir}
11544 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
11545 # so the check below is not reliable
11546 [ $MDSCOUNT -eq 1 ] || return 0
11548 # Sleep to avoid a cached response.
11549 #define OBD_STATFS_CACHE_SECONDS 1
11551 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11552 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11553 $LFS df || error "lfs failed"
11554 check_stats $SINGLEMDS "statfs" 1
11556 # check aggregated statfs (LU-10018)
11557 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
11559 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
11562 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11563 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11565 check_stats $SINGLEMDS "statfs" 1
11567 # We want to check that the client didn't send OST_STATFS to
11568 # ost1 but the MDT also uses OST_STATFS for precreate. So some
11569 # extra care is needed here.
11570 if remote_mds; then
11571 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
11572 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
11574 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
11575 [ "$res" ] && error "OST got STATFS"
11580 run_test 133b "Verifying extra MDT stats =================================="
11583 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11584 remote_ost_nodsh && skip "remote OST with nodsh"
11585 remote_mds_nodsh && skip "remote MDS with nodsh"
11587 local testdir=$DIR/$tdir/stats_testdir
11589 test_mkdir -p $testdir
11591 # verify obdfilter stats.
11592 $SETSTRIPE -c 1 -i 0 $testdir/$tfile
11594 cancel_lru_locks osc
11595 wait_delete_completed
11598 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11599 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11601 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
11604 cancel_lru_locks osc
11605 check_stats ost1 "write" 1
11607 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
11608 check_stats ost1 "read" 1
11610 > $testdir/$tfile || error "truncate failed"
11611 check_stats ost1 "punch" 1
11613 rm -f $testdir/$tfile || error "file remove failed"
11614 wait_delete_completed
11615 check_stats ost1 "destroy" 1
11619 run_test 133c "Verifying OST stats ========================================"
11626 while [ $value -ge 2 ]; do
11631 if [ $orig -gt $order ]; then
11639 local size=('K' 'M' 'G' 'T');
11641 local size_string=$value
11643 while [ $value -ge 1024 ]; do
11644 if [ $i -gt 3 ]; then
11645 #T is the biggest unit we get here, if that is bigger,
11647 size_string=${value}T
11650 value=$((value >> 10))
11651 if [ $value -lt 1024 ]; then
11652 size_string=${value}${size[$i]}
11661 get_rename_size() {
11663 local context=${2:-.}
11664 local sample=$(do_facet $SINGLEMDS $LCTL \
11665 get_param mdt.$FSNAME-MDT0000.rename_stats |
11666 grep -A1 $context |
11667 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
11672 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11673 remote_ost_nodsh && skip "remote OST with nodsh"
11674 remote_mds_nodsh && skip "remote MDS with nodsh"
11675 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11676 skip_env "MDS doesn't support rename stats"
11678 local testdir1=$DIR/${tdir}/stats_testdir1
11679 local testdir2=$DIR/${tdir}/stats_testdir2
11680 mkdir -p $DIR/${tdir}
11682 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11684 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
11685 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
11687 createmany -o $testdir1/test 512 || error "createmany failed"
11689 # check samedir rename size
11690 mv ${testdir1}/test0 ${testdir1}/test_0
11692 local testdir1_size=$(ls -l $DIR/${tdir} |
11693 awk '/stats_testdir1/ {print $5}')
11694 local testdir2_size=$(ls -l $DIR/${tdir} |
11695 awk '/stats_testdir2/ {print $5}')
11697 testdir1_size=$(order_2 $testdir1_size)
11698 testdir2_size=$(order_2 $testdir2_size)
11700 testdir1_size=$(size_in_KMGT $testdir1_size)
11701 testdir2_size=$(size_in_KMGT $testdir2_size)
11703 echo "source rename dir size: ${testdir1_size}"
11704 echo "target rename dir size: ${testdir2_size}"
11706 local cmd="do_facet $SINGLEMDS $LCTL "
11707 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
11709 eval $cmd || error "$cmd failed"
11710 local samedir=$($cmd | grep 'same_dir')
11711 local same_sample=$(get_rename_size $testdir1_size)
11712 [ -z "$samedir" ] && error "samedir_rename_size count error"
11713 [[ $same_sample -eq 1 ]] ||
11714 error "samedir_rename_size error $same_sample"
11715 echo "Check same dir rename stats success"
11717 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11719 # check crossdir rename size
11720 mv ${testdir1}/test_0 ${testdir2}/test_0
11722 testdir1_size=$(ls -l $DIR/${tdir} |
11723 awk '/stats_testdir1/ {print $5}')
11724 testdir2_size=$(ls -l $DIR/${tdir} |
11725 awk '/stats_testdir2/ {print $5}')
11727 testdir1_size=$(order_2 $testdir1_size)
11728 testdir2_size=$(order_2 $testdir2_size)
11730 testdir1_size=$(size_in_KMGT $testdir1_size)
11731 testdir2_size=$(size_in_KMGT $testdir2_size)
11733 echo "source rename dir size: ${testdir1_size}"
11734 echo "target rename dir size: ${testdir2_size}"
11736 eval $cmd || error "$cmd failed"
11737 local crossdir=$($cmd | grep 'crossdir')
11738 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
11739 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
11740 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
11741 [[ $src_sample -eq 1 ]] ||
11742 error "crossdir_rename_size error $src_sample"
11743 [[ $tgt_sample -eq 1 ]] ||
11744 error "crossdir_rename_size error $tgt_sample"
11745 echo "Check cross dir rename stats success"
11746 rm -rf $DIR/${tdir}
11748 run_test 133d "Verifying rename_stats ========================================"
11751 remote_mds_nodsh && skip "remote MDS with nodsh"
11752 remote_ost_nodsh && skip "remote OST with nodsh"
11753 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11755 local testdir=$DIR/${tdir}/stats_testdir
11756 local ctr f0 f1 bs=32768 count=42 sum
11758 mkdir -p ${testdir} || error "mkdir failed"
11760 $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
11762 for ctr in {write,read}_bytes; do
11764 cancel_lru_locks osc
11766 do_facet ost1 $LCTL set_param -n \
11767 "obdfilter.*.exports.clear=clear"
11769 if [ $ctr = write_bytes ]; then
11771 f1=${testdir}/${tfile}
11773 f0=${testdir}/${tfile}
11777 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
11780 cancel_lru_locks osc
11782 sum=$(do_facet ost1 $LCTL get_param \
11783 "obdfilter.*.exports.*.stats" |
11784 awk -v ctr=$ctr 'BEGIN { sum = 0 }
11785 $1 == ctr { sum += $7 }
11786 END { printf("%0.0f", sum) }')
11788 if ((sum != bs * count)); then
11789 error "Bad $ctr sum, expected $((bs * count)), got $sum"
11793 rm -rf $DIR/${tdir}
11795 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
11797 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
11799 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
11800 # not honor the -ignore_readdir_race option correctly. So we call
11801 # error_ignore() rather than error() in these cases. See LU-11152.
11803 if (find --version; do_facet mds1 find --version) |
11804 grep -q '\b4\.5\.1[1-4]\b'; then
11805 error_ignore LU-11152 "$@"
11812 # First without trusting modes.
11813 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
11814 echo "proc_dirs='$proc_dirs'"
11815 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
11816 find $proc_dirs -exec cat '{}' \; &> /dev/null
11818 # Second verifying readability.
11819 $LCTL get_param -R '*' &> /dev/null
11821 # Verifing writability with badarea_io.
11823 -ignore_readdir_race \
11825 -not -name force_lbug \
11826 -not -name changelog_mask \
11827 -exec badarea_io '{}' \; ||
11828 error_133 "find $proc_dirs failed"
11830 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
11833 remote_mds_nodsh && skip "remote MDS with nodsh"
11834 remote_ost_nodsh && skip "remote OST with nodsh"
11836 # eventually, this can also be replaced with "lctl get_param -R",
11837 # but not until that option is always available on the server
11839 for facet in mds1 ost1; do
11840 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
11841 skip_noexit "Too old lustre on $facet"
11842 local facet_proc_dirs=$(do_facet $facet \
11843 \\\ls -d $proc_regexp 2>/dev/null)
11844 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11845 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11846 do_facet $facet find $facet_proc_dirs \
11847 ! -name req_history \
11848 -exec cat '{}' \\\; &> /dev/null
11850 do_facet $facet find $facet_proc_dirs \
11851 ! -name req_history \
11853 -exec cat '{}' \\\; &> /dev/null ||
11854 error "proc file read failed"
11856 do_facet $facet find $facet_proc_dirs \
11857 -ignore_readdir_race \
11859 -not -name force_lbug \
11860 -not -name changelog_mask \
11861 -exec badarea_io '{}' \\\; ||
11862 error_133 "$facet find $facet_proc_dirs failed"
11865 # remount the FS in case writes/reads /proc break the FS
11866 cleanup || error "failed to unmount"
11867 setup || error "failed to setup"
11870 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
11873 remote_mds_nodsh && skip "remote MDS with nodsh"
11874 remote_ost_nodsh && skip "remote OST with nodsh"
11875 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
11876 skip "Need MDS version at least 2.9.54"
11880 for facet in client mds1 ost1; do
11881 local facet_proc_dirs=$(do_facet $facet \
11882 \\\ls -d $proc_regexp 2> /dev/null)
11883 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11884 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11885 # Get the list of files that are missing the terminating newline
11886 local missing=($(do_facet $facet \
11887 find ${facet_proc_dirs} -type f \| \
11888 while read F\; do \
11889 awk -v FS='\v' -v RS='\v\v' \
11890 "'END { if(NR>0 && \
11891 \\\$NF !~ /.*\\\n\$/) \
11892 print FILENAME}'" \
11895 [ ${#missing[*]} -eq 0 ] ||
11896 error "files do not end with newline: ${missing[*]}"
11899 run_test 133h "Proc files should end with newlines"
11902 remote_mds_nodsh && skip "remote MDS with nodsh"
11903 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11904 skip "Need MDS version at least 2.7.54"
11906 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11907 cancel_lru_locks mdc
11909 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
11910 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11911 [ $unused -eq 0 ] || error "$unused locks are not cleared"
11914 createmany -o $DIR/$tdir/f $nr ||
11915 error "failed to create $nr files in $DIR/$tdir"
11916 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11918 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
11919 do_facet mds1 $LCTL set_param fail_loc=0x327
11920 do_facet mds1 $LCTL set_param fail_val=500
11923 echo "sleep 10 seconds ..."
11925 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
11927 do_facet mds1 $LCTL set_param fail_loc=0
11928 do_facet mds1 $LCTL set_param fail_val=0
11929 [ $lck_cnt -lt $unused ] ||
11930 error "No locks reclaimed, before:$unused, after:$lck_cnt"
11933 unlinkmany $DIR/$tdir/f $nr
11935 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
11938 remote_mds_nodsh && skip "remote MDS with nodsh"
11939 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11940 skip "Need MDS version at least 2.7.54"
11942 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11943 cancel_lru_locks mdc
11945 local low_wm=$(do_facet mds1 $LCTL get_param -n \
11946 ldlm.lock_reclaim_threshold_mb)
11947 # disable reclaim temporarily
11948 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
11950 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
11951 do_facet mds1 $LCTL set_param fail_loc=0x328
11952 do_facet mds1 $LCTL set_param fail_val=500
11954 $LCTL set_param debug=+trace
11957 createmany -o $DIR/$tdir/f $nr &
11958 local create_pid=$!
11960 echo "Sleep $TIMEOUT seconds ..."
11962 if ! ps -p $create_pid > /dev/null 2>&1; then
11963 do_facet mds1 $LCTL set_param fail_loc=0
11964 do_facet mds1 $LCTL set_param fail_val=0
11965 do_facet mds1 $LCTL set_param \
11966 ldlm.lock_reclaim_threshold_mb=${low_wm}m
11967 error "createmany finished incorrectly!"
11969 do_facet mds1 $LCTL set_param fail_loc=0
11970 do_facet mds1 $LCTL set_param fail_val=0
11971 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
11972 wait $create_pid || return 1
11974 unlinkmany $DIR/$tdir/f $nr
11976 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
11978 test_140() { #bug-17379
11979 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11981 test_mkdir $DIR/$tdir
11982 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
11983 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
11985 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
11986 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
11988 while i=$((i + 1)); do
11990 cd $i || error "Changing to $i"
11991 ln -s ../stat stat || error "Creating stat symlink"
11992 # Read the symlink until ELOOP present,
11993 # not LBUGing the system is considered success,
11994 # we didn't overrun the stack.
11995 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
11996 if [ $ret -ne 0 ]; then
11997 if [ $ret -eq 40 ]; then
12000 error "Open stat symlink"
12006 echo "The symlink depth = $i"
12007 [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] ||
12008 error "Invalid symlink depth"
12010 # Test recursive symlink
12011 ln -s symlink_self symlink_self
12012 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
12013 echo "open symlink_self returns $ret"
12014 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
12016 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
12019 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12021 local TF="$TMP/$tfile"
12023 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12025 cancel_lru_locks $OSC
12026 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
12027 remount_client $MOUNT
12029 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
12032 $TRUNCATE $DIR/$tfile 6000
12033 cancel_lru_locks $OSC
12034 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
12037 echo "12345" >>$DIR/$tfile
12038 cancel_lru_locks $OSC
12039 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
12042 echo "12345" >>$DIR/$tfile
12043 cancel_lru_locks $OSC
12044 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
12049 run_test 150 "truncate/append tests"
12051 #LU-2902 roc_hit was not able to read all values from lproc
12052 function roc_hit_init() {
12053 local list=$(comma_list $(osts_nodes))
12054 local dir=$DIR/$tdir-check
12055 local file=$dir/$tfile
12061 #use setstripe to do a write to every ost
12062 for i in $(seq 0 $((OSTCOUNT-1))); do
12063 $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
12064 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
12065 idx=$(printf %04x $i)
12066 BEFORE=$(get_osd_param $list *OST*$idx stats |
12067 awk '$1 == "cache_access" {sum += $7}
12068 END { printf("%0.0f", sum) }')
12070 cancel_lru_locks osc
12071 cat $file >/dev/null
12073 AFTER=$(get_osd_param $list *OST*$idx stats |
12074 awk '$1 == "cache_access" {sum += $7}
12075 END { printf("%0.0f", sum) }')
12077 echo BEFORE:$BEFORE AFTER:$AFTER
12078 if ! let "AFTER - BEFORE == 4"; then
12080 error "roc_hit is not safe to use"
12088 function roc_hit() {
12089 local list=$(comma_list $(osts_nodes))
12090 echo $(get_osd_param $list '' stats |
12091 awk '$1 == "cache_hit" {sum += $7}
12092 END { printf("%0.0f", sum) }')
12095 function set_cache() {
12098 if [ "$2" == "off" ]; then
12101 local list=$(comma_list $(osts_nodes))
12102 set_osd_param $list '' $1_cache_enable $on
12104 cancel_lru_locks osc
12108 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12109 remote_ost_nodsh && skip "remote OST with nodsh"
12112 local list=$(comma_list $(osts_nodes))
12114 # check whether obdfilter is cache capable at all
12115 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
12116 skip "not cache-capable obdfilter"
12119 # check cache is enabled on all obdfilters
12120 if get_osd_param $list '' read_cache_enable | grep 0; then
12121 skip "oss cache is disabled"
12124 set_osd_param $list '' writethrough_cache_enable 1
12126 # check write cache is enabled on all obdfilters
12127 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
12128 skip "oss write cache is NOT enabled"
12133 #define OBD_FAIL_OBD_NO_LRU 0x609
12134 do_nodes $list $LCTL set_param fail_loc=0x609
12136 # pages should be in the case right after write
12137 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
12140 local BEFORE=$(roc_hit)
12141 cancel_lru_locks osc
12142 cat $DIR/$tfile >/dev/null
12143 local AFTER=$(roc_hit)
12145 do_nodes $list $LCTL set_param fail_loc=0
12147 if ! let "AFTER - BEFORE == CPAGES"; then
12148 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12151 # the following read invalidates the cache
12152 cancel_lru_locks osc
12153 set_osd_param $list '' read_cache_enable 0
12154 cat $DIR/$tfile >/dev/null
12156 # now data shouldn't be found in the cache
12158 cancel_lru_locks osc
12159 cat $DIR/$tfile >/dev/null
12161 if let "AFTER - BEFORE != 0"; then
12162 error "IN CACHE: before: $BEFORE, after: $AFTER"
12165 set_osd_param $list '' read_cache_enable 1
12168 run_test 151 "test cache on oss and controls ==============================="
12171 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12173 local TF="$TMP/$tfile"
12175 # simulate ENOMEM during write
12176 #define OBD_FAIL_OST_NOMEM 0x226
12177 lctl set_param fail_loc=0x80000226
12178 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12180 sync || error "sync failed"
12181 lctl set_param fail_loc=0
12183 # discard client's cache
12184 cancel_lru_locks osc
12186 # simulate ENOMEM during read
12187 lctl set_param fail_loc=0x80000226
12188 cmp $TF $DIR/$tfile || error "cmp failed"
12189 lctl set_param fail_loc=0
12193 run_test 152 "test read/write with enomem ============================"
12196 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
12198 run_test 153 "test if fdatasync does not crash ======================="
12200 dot_lustre_fid_permission_check() {
12202 local ffid=$MOUNT/.lustre/fid/$fid
12205 echo "stat fid $fid"
12206 stat $ffid > /dev/null || error "stat $ffid failed."
12207 echo "touch fid $fid"
12208 touch $ffid || error "touch $ffid failed."
12209 echo "write to fid $fid"
12210 cat /etc/hosts > $ffid || error "write $ffid failed."
12211 echo "read fid $fid"
12212 diff /etc/hosts $ffid || error "read $ffid failed."
12213 echo "append write to fid $fid"
12214 cat /etc/hosts >> $ffid || error "append write $ffid failed."
12215 echo "rename fid $fid"
12216 mv $ffid $test_dir/$tfile.1 &&
12217 error "rename $ffid to $tfile.1 should fail."
12218 touch $test_dir/$tfile.1
12219 mv $test_dir/$tfile.1 $ffid &&
12220 error "rename $tfile.1 to $ffid should fail."
12221 rm -f $test_dir/$tfile.1
12222 echo "truncate fid $fid"
12223 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
12224 echo "link fid $fid"
12225 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
12226 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
12227 echo "setfacl fid $fid"
12228 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
12229 echo "getfacl fid $fid"
12230 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
12232 echo "unlink fid $fid"
12233 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
12234 echo "mknod fid $fid"
12235 mknod $ffid c 1 3 && error "mknod $ffid should fail."
12237 fid=[0xf00000400:0x1:0x0]
12238 ffid=$MOUNT/.lustre/fid/$fid
12240 echo "stat non-exist fid $fid"
12241 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
12242 echo "write to non-exist fid $fid"
12243 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
12244 echo "link new fid $fid"
12245 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
12247 mkdir -p $test_dir/$tdir
12248 touch $test_dir/$tdir/$tfile
12249 fid=$($LFS path2fid $test_dir/$tdir)
12252 error "error: could not get fid for $test_dir/$dir/$tfile."
12254 ffid=$MOUNT/.lustre/fid/$fid
12257 ls $ffid > /dev/null || error "ls $ffid failed."
12258 echo "touch $fid/$tfile.1"
12259 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
12261 echo "touch $MOUNT/.lustre/fid/$tfile"
12262 touch $MOUNT/.lustre/fid/$tfile && \
12263 error "touch $MOUNT/.lustre/fid/$tfile should fail."
12265 echo "setxattr to $MOUNT/.lustre/fid"
12266 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
12268 echo "listxattr for $MOUNT/.lustre/fid"
12269 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
12271 echo "delxattr from $MOUNT/.lustre/fid"
12272 setfattr -x trusted.name1 $MOUNT/.lustre/fid
12274 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
12275 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
12276 error "touch invalid fid should fail."
12278 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
12279 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
12280 error "touch non-normal fid should fail."
12282 echo "rename $tdir to $MOUNT/.lustre/fid"
12283 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
12284 error "rename to $MOUNT/.lustre/fid should fail."
12286 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
12288 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
12289 local new_obf_mode=777
12291 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
12292 chmod $new_obf_mode $DIR/.lustre/fid ||
12293 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
12295 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
12296 [ $obf_mode -eq $new_obf_mode ] ||
12297 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
12299 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
12300 chmod $old_obf_mode $DIR/.lustre/fid ||
12301 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
12304 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
12305 fid=$($LFS path2fid $test_dir/$tfile-2)
12307 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
12309 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
12310 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
12311 error "create lov data thru .lustre failed"
12313 echo "cp /etc/passwd $test_dir/$tfile-2"
12314 cp /etc/passwd $test_dir/$tfile-2 ||
12315 error "copy to $test_dir/$tfile-2 failed."
12316 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
12317 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12318 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12320 rm -rf $test_dir/tfile.lnk
12321 rm -rf $test_dir/$tfile-2
12325 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12326 skip "Need MDS version at least 2.4.1"
12328 local tf=$DIR/$tfile
12331 local fid=$($LFS path2fid $tf)
12332 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12334 # check that we get the same pathname back
12335 local found=$($LFS fid2path $MOUNT "$fid")
12336 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12337 [ "$found" == "$tf" ] ||
12338 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12340 run_test 154A "lfs path2fid and fid2path basic checks"
12343 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12344 skip "Need MDS version at least 2.4.1"
12346 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12347 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12348 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12349 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12351 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12352 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12354 # check that we get the same pathname
12355 echo "PFID: $PFID, name: $name"
12356 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12357 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12358 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12359 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12361 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12363 run_test 154B "verify the ll_decode_linkea tool"
12366 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12367 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12368 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12369 skip "Need MDS version at least 2.2.51"
12370 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12372 cp /etc/hosts $DIR/$tfile
12374 fid=$($LFS path2fid $DIR/$tfile)
12376 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12378 dot_lustre_fid_permission_check "$fid" $DIR ||
12379 error "dot lustre permission check $fid failed"
12381 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12383 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12385 touch $MOUNT/.lustre/file &&
12386 error "creation is not allowed under .lustre"
12388 mkdir $MOUNT/.lustre/dir &&
12389 error "mkdir is not allowed under .lustre"
12393 run_test 154a "Open-by-FID"
12396 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12397 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12398 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12399 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12400 skip "Need MDS version at least 2.2.51"
12402 local remote_dir=$DIR/$tdir/remote_dir
12406 mkdir -p $DIR/$tdir
12407 $LFS mkdir -i $MDTIDX $remote_dir ||
12408 error "create remote directory failed"
12410 cp /etc/hosts $remote_dir/$tfile
12412 fid=$($LFS path2fid $remote_dir/$tfile)
12414 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12416 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12417 error "dot lustre permission check $fid failed"
12420 run_test 154b "Open-by-FID for remote directory"
12423 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12424 skip "Need MDS version at least 2.4.1"
12426 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12427 local FID1=$($LFS path2fid $DIR/$tfile.1)
12428 local FID2=$($LFS path2fid $DIR/$tfile.2)
12429 local FID3=$($LFS path2fid $DIR/$tfile.3)
12432 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12433 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12434 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12436 [ "$FID" = "${!want}" ] ||
12437 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12441 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12443 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12444 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12448 run_test 154c "lfs path2fid and fid2path multiple arguments"
12451 remote_mds_nodsh && skip "remote MDS with nodsh"
12452 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12453 skip "Need MDS version at least 2.5.53"
12455 if remote_mds; then
12456 nid=$($LCTL list_nids | sed "s/\./\\\./g")
12460 local proc_ofile="mdt.*.exports.'$nid'.open_files"
12467 local fid=$($LFS path2fid $DIR/$tfile)
12470 cmd="exec $fd<$DIR/$tfile"
12472 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
12473 echo "$fid_list" | grep "$fid"
12476 cmd="exec $fd>/dev/null"
12478 if [ $rc -ne 0 ]; then
12479 error "FID $fid not found in open files list $fid_list"
12482 run_test 154d "Verify open file fid"
12486 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
12487 skip "Need MDS version at least 2.6.50"
12489 if ls -a $MOUNT | grep -q '^\.lustre$'; then
12490 error ".lustre returned by readdir"
12493 run_test 154e ".lustre is not returned by readdir"
12496 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12498 # create parent directory on a single MDT to avoid cross-MDT hardlinks
12499 test_mkdir -p -c1 $DIR/$tdir/d
12500 # test dirs inherit from its stripe
12501 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
12502 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
12503 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
12504 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
12507 # get fid of parents
12508 local FID0=$($LFS path2fid $DIR/$tdir/d)
12509 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
12510 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
12511 local FID3=$($LFS path2fid $DIR)
12513 # check that path2fid --parents returns expected <parent_fid>/name
12514 # 1) test for a directory (single parent)
12515 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
12516 [ "$parent" == "$FID0/foo1" ] ||
12517 error "expected parent: $FID0/foo1, got: $parent"
12519 # 2) test for a file with nlink > 1 (multiple parents)
12520 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
12521 echo "$parent" | grep -F "$FID1/$tfile" ||
12522 error "$FID1/$tfile not returned in parent list"
12523 echo "$parent" | grep -F "$FID2/link" ||
12524 error "$FID2/link not returned in parent list"
12526 # 3) get parent by fid
12527 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
12528 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12529 echo "$parent" | grep -F "$FID1/$tfile" ||
12530 error "$FID1/$tfile not returned in parent list (by fid)"
12531 echo "$parent" | grep -F "$FID2/link" ||
12532 error "$FID2/link not returned in parent list (by fid)"
12534 # 4) test for entry in root directory
12535 parent=$($LFS path2fid --parents $DIR/f)
12536 echo "$parent" | grep -F "$FID3/f" ||
12537 error "$FID3/f not returned in parent list"
12539 # 5) test it on root directory
12540 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
12541 error "$MOUNT should not have parents"
12543 # enable xattr caching and check that linkea is correctly updated
12544 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
12545 save_lustre_params client "llite.*.xattr_cache" > $save
12546 lctl set_param llite.*.xattr_cache 1
12548 # 6.1) linkea update on rename
12549 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
12551 # get parents by fid
12552 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12553 # foo1 should no longer be returned in parent list
12554 echo "$parent" | grep -F "$FID1" &&
12555 error "$FID1 should no longer be in parent list"
12556 # the new path should appear
12557 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
12558 error "$FID2/$tfile.moved is not in parent list"
12560 # 6.2) linkea update on unlink
12561 rm -f $DIR/$tdir/d/foo2/link
12562 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12563 # foo2/link should no longer be returned in parent list
12564 echo "$parent" | grep -F "$FID2/link" &&
12565 error "$FID2/link should no longer be in parent list"
12569 restore_lustre_params < $save
12572 run_test 154f "get parent fids by reading link ea"
12576 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12577 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
12578 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
12579 skip "Need MDS version at least 2.6.92"
12581 mkdir -p $DIR/$tdir
12582 llapi_fid_test -d $DIR/$tdir
12584 run_test 154g "various llapi FID tests"
12586 test_155_small_load() {
12587 local temp=$TMP/$tfile
12588 local file=$DIR/$tfile
12590 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
12591 error "dd of=$temp bs=6096 count=1 failed"
12593 cancel_lru_locks $OSC
12594 cmp $temp $file || error "$temp $file differ"
12596 $TRUNCATE $temp 6000
12597 $TRUNCATE $file 6000
12598 cmp $temp $file || error "$temp $file differ (truncate1)"
12600 echo "12345" >>$temp
12601 echo "12345" >>$file
12602 cmp $temp $file || error "$temp $file differ (append1)"
12604 echo "12345" >>$temp
12605 echo "12345" >>$file
12606 cmp $temp $file || error "$temp $file differ (append2)"
12612 test_155_big_load() {
12613 remote_ost_nodsh && skip "remote OST with nodsh"
12615 local temp=$TMP/$tfile
12616 local file=$DIR/$tfile
12619 local cache_size=$(do_facet ost$((MAXI+1)) \
12620 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
12621 local large_file_size=$((cache_size * 2))
12623 echo "OSS cache size: $cache_size KB"
12624 echo "Large file size: $large_file_size KB"
12626 [ $MAXV -le $large_file_size ] &&
12627 skip_env "max available OST size needs > $large_file_size KB"
12629 $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed"
12631 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
12632 error "dd of=$temp bs=$large_file_size count=1k failed"
12635 cancel_lru_locks osc
12636 cmp $temp $file || error "$temp $file differ"
12642 save_writethrough() {
12643 local facets=$(get_facets OST)
12645 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
12649 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12651 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12653 save_writethrough $p
12656 set_cache writethrough on
12657 test_155_small_load
12658 restore_lustre_params < $p
12661 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
12664 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12666 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12668 save_writethrough $p
12671 set_cache writethrough off
12672 test_155_small_load
12673 restore_lustre_params < $p
12676 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
12679 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12681 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12683 save_writethrough $p
12686 set_cache writethrough on
12687 test_155_small_load
12688 restore_lustre_params < $p
12691 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
12694 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12696 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12698 save_writethrough $p
12701 set_cache writethrough off
12702 test_155_small_load
12703 restore_lustre_params < $p
12706 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
12709 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12711 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12713 save_writethrough $p
12716 set_cache writethrough on
12718 restore_lustre_params < $p
12721 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
12724 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12726 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12728 save_writethrough $p
12731 set_cache writethrough off
12733 restore_lustre_params < $p
12736 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
12739 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12741 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12743 save_writethrough $p
12746 set_cache writethrough on
12748 restore_lustre_params < $p
12751 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
12754 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12756 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12758 save_writethrough $p
12761 set_cache writethrough off
12763 restore_lustre_params < $p
12766 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
12769 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12770 remote_ost_nodsh && skip "remote OST with nodsh"
12771 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
12772 skip "stats not implemented on old servers"
12773 [ "$ost1_FSTYPE" = "zfs" ] &&
12774 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
12779 local file="$DIR/$tfile"
12780 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12782 save_writethrough $p
12785 log "Turn on read and write cache"
12787 set_cache writethrough on
12789 log "Write data and read it back."
12790 log "Read should be satisfied from the cache."
12791 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12793 cancel_lru_locks osc
12794 cat $file >/dev/null
12796 if ! let "AFTER - BEFORE == CPAGES"; then
12797 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12799 log "cache hits:: before: $BEFORE, after: $AFTER"
12802 log "Read again; it should be satisfied from the cache."
12804 cancel_lru_locks osc
12805 cat $file >/dev/null
12807 if ! let "AFTER - BEFORE == CPAGES"; then
12808 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12810 log "cache hits:: before: $BEFORE, after: $AFTER"
12813 log "Turn off the read cache and turn on the write cache"
12815 set_cache writethrough on
12817 log "Read again; it should be satisfied from the cache."
12819 cancel_lru_locks osc
12820 cat $file >/dev/null
12822 if ! let "AFTER - BEFORE == CPAGES"; then
12823 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12825 log "cache hits:: before: $BEFORE, after: $AFTER"
12828 log "Read again; it should not be satisfied from the cache."
12830 cancel_lru_locks osc
12831 cat $file >/dev/null
12833 if ! let "AFTER - BEFORE == 0"; then
12834 error "IN CACHE: before: $BEFORE, after: $AFTER"
12836 log "cache hits:: before: $BEFORE, after: $AFTER"
12839 log "Write data and read it back."
12840 log "Read should be satisfied from the cache."
12841 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12843 cancel_lru_locks osc
12844 cat $file >/dev/null
12846 if ! let "AFTER - BEFORE == CPAGES"; then
12847 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12849 log "cache hits:: before: $BEFORE, after: $AFTER"
12852 log "Read again; it should not be satisfied from the cache."
12854 cancel_lru_locks osc
12855 cat $file >/dev/null
12857 if ! let "AFTER - BEFORE == 0"; then
12858 error "IN CACHE: before: $BEFORE, after: $AFTER"
12860 log "cache hits:: before: $BEFORE, after: $AFTER"
12863 log "Turn off read and write cache"
12865 set_cache writethrough off
12867 log "Write data and read it back"
12868 log "It should not be satisfied from the cache."
12870 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12871 cancel_lru_locks osc
12873 cat $file >/dev/null
12875 if ! let "AFTER - BEFORE == 0"; then
12876 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12878 log "cache hits:: before: $BEFORE, after: $AFTER"
12881 log "Turn on the read cache and turn off the write cache"
12883 set_cache writethrough off
12885 log "Write data and read it back"
12886 log "It should not be satisfied from the cache."
12888 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12890 cancel_lru_locks osc
12891 cat $file >/dev/null
12893 if ! let "AFTER - BEFORE == 0"; then
12894 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12896 log "cache hits:: before: $BEFORE, after: $AFTER"
12899 log "Read again; it should be satisfied from the cache."
12901 cancel_lru_locks osc
12902 cat $file >/dev/null
12904 if ! let "AFTER - BEFORE == CPAGES"; then
12905 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12907 log "cache hits:: before: $BEFORE, after: $AFTER"
12910 restore_lustre_params < $p
12913 run_test 156 "Verification of tunables"
12916 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12917 remote_mds_nodsh && skip "remote MDS with nodsh"
12918 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
12919 skip "Need MDS version at least 2.2.0"
12921 changelog_register || error "changelog_register failed"
12922 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
12923 changelog_users $SINGLEMDS | grep -q $cl_user ||
12924 error "User $cl_user not found in changelog_users"
12927 test_mkdir -p $DIR/$tdir/pics/2008/zachy
12928 changelog_clear 0 || error "changelog_clear failed"
12929 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
12930 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
12931 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
12932 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
12933 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
12934 rm $DIR/$tdir/pics/desktop.jpg
12936 changelog_dump | tail -10
12938 echo "verifying changelog mask"
12939 changelog_chmask "-MKDIR"
12940 changelog_chmask "-CLOSE"
12942 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
12943 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
12945 changelog_chmask "+MKDIR"
12946 changelog_chmask "+CLOSE"
12948 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
12949 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
12951 changelog_dump | tail -10
12952 MKDIRS=$(changelog_dump | grep -c "MKDIR")
12953 CLOSES=$(changelog_dump | grep -c "CLOSE")
12954 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
12955 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
12958 echo "verifying target fid"
12959 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
12960 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
12961 [ "$fidc" == "$fidf" ] ||
12962 error "changelog '$tfile' fid $fidc != file fid $fidf"
12963 echo "verifying parent fid"
12964 # The FID returned from the Changelog may be the directory shard on
12965 # a different MDT, and not the FID returned by path2fid on the parent.
12966 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
12967 # since this is what will matter when recreating this file in the tree.
12968 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
12969 local pathp=$($LFS fid2path $MOUNT "$fidp")
12970 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
12971 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
12973 echo "getting records for $cl_user"
12974 changelog_users $SINGLEMDS
12975 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
12977 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
12978 error "changelog_clear failed"
12979 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
12980 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
12981 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
12982 error "user index expect $user_rec1 + $nclr != $user_rec2"
12984 local min0_rec=$(changelog_users $SINGLEMDS |
12985 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
12986 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
12987 awk '{ print $1; exit; }')
12989 changelog_dump | tail -n 5
12990 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
12991 [ $first_rec == $((min0_rec + 1)) ] ||
12992 error "first index should be $min0_rec + 1 not $first_rec"
12994 # LU-3446 changelog index reset on MDT restart
12995 local cur_rec1=$(changelog_users $SINGLEMDS |
12996 awk '/^current.index:/ { print $NF }')
12997 changelog_clear 0 ||
12998 error "clear all changelog records for $cl_user failed"
12999 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
13000 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
13001 error "Fail to start $SINGLEMDS"
13002 local cur_rec2=$(changelog_users $SINGLEMDS |
13003 awk '/^current.index:/ { print $NF }')
13004 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
13005 [ $cur_rec1 == $cur_rec2 ] ||
13006 error "current index should be $cur_rec1 not $cur_rec2"
13008 echo "verifying users from this test are deregistered"
13009 changelog_deregister || error "changelog_deregister failed"
13010 changelog_users $SINGLEMDS | grep -q $cl_user &&
13011 error "User '$cl_user' still in changelog_users"
13013 # lctl get_param -n mdd.*.changelog_users
13014 # current index: 144
13015 # ID index (idle seconds)
13017 if ! changelog_users $SINGLEMDS | grep "^cl"; then
13018 # this is the normal case where all users were deregistered
13019 # make sure no new records are added when no users are present
13020 local last_rec1=$(changelog_users $SINGLEMDS |
13021 awk '/^current.index:/ { print $NF }')
13022 touch $DIR/$tdir/chloe
13023 local last_rec2=$(changelog_users $SINGLEMDS |
13024 awk '/^current.index:/ { print $NF }')
13025 echo "verify changelogs are off: $last_rec1 == $last_rec2"
13026 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
13028 # any changelog users must be leftovers from a previous test
13029 changelog_users $SINGLEMDS
13030 echo "other changelog users; can't verify off"
13033 run_test 160a "changelog sanity"
13035 test_160b() { # LU-3587
13036 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13037 remote_mds_nodsh && skip "remote MDS with nodsh"
13038 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13039 skip "Need MDS version at least 2.2.0"
13041 changelog_register || error "changelog_register failed"
13042 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13043 changelog_users $SINGLEMDS | grep -q $cl_user ||
13044 error "User '$cl_user' not found in changelog_users"
13046 local longname1=$(str_repeat a 255)
13047 local longname2=$(str_repeat b 255)
13050 echo "creating very long named file"
13051 touch $longname1 || error "create of '$longname1' failed"
13052 echo "renaming very long named file"
13053 mv $longname1 $longname2
13055 changelog_dump | grep RENME | tail -n 5
13058 run_test 160b "Verify that very long rename doesn't crash in changelog"
13061 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13062 remote_mds_nodsh && skip "remote MDS with nodsh"
13064 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
13065 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
13066 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
13067 skip "Need MDS version at least 2.5.58 or 2.5.2+"
13071 # Registration step
13072 changelog_register || error "changelog_register failed"
13075 mkdir -p $DIR/$tdir
13076 $MCREATE $DIR/$tdir/foo_160c
13077 changelog_chmask "-TRUNC"
13078 $TRUNCATE $DIR/$tdir/foo_160c 200
13079 changelog_chmask "+TRUNC"
13080 $TRUNCATE $DIR/$tdir/foo_160c 199
13081 changelog_dump | tail -n 5
13082 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
13083 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
13085 run_test 160c "verify that changelog log catch the truncate event"
13088 remote_mds_nodsh && skip "remote MDS with nodsh"
13089 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13090 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13091 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
13092 skip "Need MDS version at least 2.7.60"
13094 # Registration step
13095 changelog_register || error "changelog_register failed"
13097 mkdir -p $DIR/$tdir/migrate_dir
13098 changelog_clear 0 || error "changelog_clear failed"
13100 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
13101 changelog_dump | tail -n 5
13102 local migrates=$(changelog_dump | grep -c "MIGRT")
13103 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
13105 run_test 160d "verify that changelog log catch the migrate event"
13108 remote_mds_nodsh && skip "remote MDS with nodsh"
13111 changelog_register || error "changelog_register failed"
13113 # Delete a future user (expect fail)
13114 local MDT0=$(facet_svc $SINGLEMDS)
13115 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
13118 if [ $rc -eq 0 ]; then
13119 error "Deleted non-existant user cl77"
13120 elif [ $rc -ne 2 ]; then
13121 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
13124 # Clear to a bad index (1 billion should be safe)
13125 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
13128 if [ $rc -eq 0 ]; then
13129 error "Successfully cleared to invalid CL index"
13130 elif [ $rc -ne 22 ]; then
13131 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
13134 run_test 160e "changelog negative testing (should return errors)"
13137 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13138 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13139 skip "Need MDS version at least 2.10.56"
13141 local mdts=$(comma_list $(mdts_nodes))
13144 changelog_register || error "first changelog_register failed"
13145 changelog_register || error "second changelog_register failed"
13147 declare -A cl_user1
13148 declare -A cl_user2
13153 # generate some changelog records to accumulate on each MDT
13154 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13155 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13156 error "create $DIR/$tdir/$tfile failed"
13158 # check changelogs have been generated
13159 local nbcl=$(changelog_dump | wc -l)
13160 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13162 for param in "changelog_max_idle_time=10" \
13164 "changelog_min_gc_interval=2" \
13165 "changelog_min_free_cat_entries=3"; do
13166 local MDT0=$(facet_svc $SINGLEMDS)
13167 local var="${param%=*}"
13168 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13170 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13171 do_nodes $mdts $LCTL set_param mdd.*.$param
13174 # force cl_user2 to be idle (1st part)
13177 # simulate changelog catalog almost full
13178 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13179 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13181 for i in $(seq $MDSCOUNT); do
13182 cl_users=(${CL_USERS[mds$i]})
13183 cl_user1[mds$i]="${cl_users[0]}"
13184 cl_user2[mds$i]="${cl_users[1]}"
13186 [ -n "${cl_user1[mds$i]}" ] ||
13187 error "mds$i: no user registered"
13188 [ -n "${cl_user2[mds$i]}" ] ||
13189 error "mds$i: only ${cl_user2[mds$i]} is registered"
13191 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13192 [ -n "$user_rec1" ] ||
13193 error "mds$i: User ${cl_user1[mds$i]} not registered"
13194 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13195 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13196 [ -n "$user_rec2" ] ||
13197 error "mds$i: User ${cl_user1[mds$i]} not registered"
13198 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13199 "$user_rec1 + 2 == $user_rec2"
13200 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13201 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13202 "$user_rec1 + 2, but is $user_rec2"
13203 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13204 [ -n "$user_rec2" ] ||
13205 error "mds$i: User ${cl_user2[mds$i]} not registered"
13206 [ $user_rec1 == $user_rec2 ] ||
13207 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13208 "$user_rec1, but is $user_rec2"
13211 # force cl_user2 to be idle (2nd part) and to reach
13212 # changelog_max_idle_time
13215 # generate one more changelog to trigger fail_loc
13216 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13217 error "create $DIR/$tdir/${tfile}bis failed"
13219 # ensure gc thread is done
13220 for i in $(mdts_nodes); do
13222 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13223 error "$i: GC-thread not done"
13227 for i in $(seq $MDSCOUNT); do
13228 # check cl_user1 still registered
13229 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13230 error "mds$i: User ${cl_user1[mds$i]} not registered"
13231 # check cl_user2 unregistered
13232 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13233 error "mds$i: User ${cl_user2[mds$i]} still registered"
13235 # check changelogs are present and starting at $user_rec1 + 1
13236 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13237 [ -n "$user_rec1" ] ||
13238 error "mds$i: User ${cl_user1[mds$i]} not registered"
13239 first_rec=$($LFS changelog $(facet_svc mds$i) |
13240 awk '{ print $1; exit; }')
13242 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13243 [ $((user_rec1 + 1)) == $first_rec ] ||
13244 error "mds$i: first index should be $user_rec1 + 1, " \
13245 "but is $first_rec"
13248 run_test 160f "changelog garbage collect (timestamped users)"
13251 remote_mds_nodsh && skip "remote MDS with nodsh"
13252 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13253 skip "Need MDS version at least 2.10.56"
13255 local mdts=$(comma_list $(mdts_nodes))
13257 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
13258 do_nodes $mdts $LCTL set_param fail_loc=0x1314
13261 changelog_register || error "first changelog_register failed"
13262 changelog_register || error "second changelog_register failed"
13264 declare -A cl_user1
13265 declare -A cl_user2
13270 # generate some changelog records to accumulate on each MDT
13271 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13272 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13273 error "create $DIR/$tdir/$tfile failed"
13275 # check changelogs have been generated
13276 local nbcl=$(changelog_dump | wc -l)
13277 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13279 # reduce the max_idle_indexes value to make sure we exceed it
13280 max_ndx=$((nbcl / 2 - 1))
13282 for param in "changelog_max_idle_indexes=$max_ndx" \
13284 "changelog_min_gc_interval=2" \
13285 "changelog_min_free_cat_entries=3"; do
13286 local MDT0=$(facet_svc $SINGLEMDS)
13287 local var="${param%=*}"
13288 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13290 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13291 do_nodes $mdts $LCTL set_param mdd.*.$param ||
13292 error "unable to set mdd.*.$param"
13295 # simulate changelog catalog almost full
13296 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13297 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13299 for i in $(seq $MDSCOUNT); do
13300 cl_users=(${CL_USERS[mds$i]})
13301 cl_user1[mds$i]="${cl_users[0]}"
13302 cl_user2[mds$i]="${cl_users[1]}"
13304 [ -n "${cl_user1[mds$i]}" ] ||
13305 error "mds$i: no user registered"
13306 [ -n "${cl_user2[mds$i]}" ] ||
13307 error "mds$i: only ${cl_user1[mds$i]} is registered"
13309 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13310 [ -n "$user_rec1" ] ||
13311 error "mds$i: User ${cl_user1[mds$i]} not registered"
13312 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13313 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13314 [ -n "$user_rec2" ] ||
13315 error "mds$i: User ${cl_user1[mds$i]} not registered"
13316 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13317 "$user_rec1 + 2 == $user_rec2"
13318 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13319 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13320 "$user_rec1 + 2, but is $user_rec2"
13321 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13322 [ -n "$user_rec2" ] ||
13323 error "mds$i: User ${cl_user2[mds$i]} not registered"
13324 [ $user_rec1 == $user_rec2 ] ||
13325 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13326 "$user_rec1, but is $user_rec2"
13329 # ensure we are past the previous changelog_min_gc_interval set above
13332 # generate one more changelog to trigger fail_loc
13333 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13334 error "create $DIR/$tdir/${tfile}bis failed"
13336 # ensure gc thread is done
13337 for i in $(mdts_nodes); do
13339 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13340 error "$i: GC-thread not done"
13344 for i in $(seq $MDSCOUNT); do
13345 # check cl_user1 still registered
13346 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13347 error "mds$i: User ${cl_user1[mds$i]} not registered"
13348 # check cl_user2 unregistered
13349 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13350 error "mds$i: User ${cl_user2[mds$i]} still registered"
13352 # check changelogs are present and starting at $user_rec1 + 1
13353 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13354 [ -n "$user_rec1" ] ||
13355 error "mds$i: User ${cl_user1[mds$i]} not registered"
13356 first_rec=$($LFS changelog $(facet_svc mds$i) |
13357 awk '{ print $1; exit; }')
13359 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13360 [ $((user_rec1 + 1)) == $first_rec ] ||
13361 error "mds$i: first index should be $user_rec1 + 1, " \
13362 "but is $first_rec"
13365 run_test 160g "changelog garbage collect (old users)"
13368 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13369 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13370 skip "Need MDS version at least 2.10.56"
13372 local mdts=$(comma_list $(mdts_nodes))
13375 changelog_register || error "first changelog_register failed"
13376 changelog_register || error "second changelog_register failed"
13378 declare -A cl_user1
13379 declare -A cl_user2
13384 # generate some changelog records to accumulate on each MDT
13385 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13386 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13387 error "create $DIR/$tdir/$tfile failed"
13389 # check changelogs have been generated
13390 local nbcl=$(changelog_dump | wc -l)
13391 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13393 for param in "changelog_max_idle_time=10" \
13395 "changelog_min_gc_interval=2"; do
13396 local MDT0=$(facet_svc $SINGLEMDS)
13397 local var="${param%=*}"
13398 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13400 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13401 do_nodes $mdts $LCTL set_param mdd.*.$param
13404 # force cl_user2 to be idle (1st part)
13407 for i in $(seq $MDSCOUNT); do
13408 cl_users=(${CL_USERS[mds$i]})
13409 cl_user1[mds$i]="${cl_users[0]}"
13410 cl_user2[mds$i]="${cl_users[1]}"
13412 [ -n "${cl_user1[mds$i]}" ] ||
13413 error "mds$i: no user registered"
13414 [ -n "${cl_user2[mds$i]}" ] ||
13415 error "mds$i: only ${cl_user2[mds$i]} is registered"
13417 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13418 [ -n "$user_rec1" ] ||
13419 error "mds$i: User ${cl_user1[mds$i]} not registered"
13420 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13421 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13422 [ -n "$user_rec2" ] ||
13423 error "mds$i: User ${cl_user1[mds$i]} not registered"
13424 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13425 "$user_rec1 + 2 == $user_rec2"
13426 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13427 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13428 "$user_rec1 + 2, but is $user_rec2"
13429 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13430 [ -n "$user_rec2" ] ||
13431 error "mds$i: User ${cl_user2[mds$i]} not registered"
13432 [ $user_rec1 == $user_rec2 ] ||
13433 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13434 "$user_rec1, but is $user_rec2"
13437 # force cl_user2 to be idle (2nd part) and to reach
13438 # changelog_max_idle_time
13441 # force each GC-thread start and block then
13442 # one per MDT/MDD, set fail_val accordingly
13443 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13444 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13446 # generate more changelogs to trigger fail_loc
13447 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13448 error "create $DIR/$tdir/${tfile}bis failed"
13450 # stop MDT to stop GC-thread, should be done in back-ground as it will
13451 # block waiting for the thread to be released and exit
13452 declare -A stop_pids
13453 for i in $(seq $MDSCOUNT); do
13455 stop_pids[mds$i]=$!
13458 for i in $(mdts_nodes); do
13461 local facets=$(facets_up_on_host $i)
13463 for facet in ${facets//,/ }; do
13464 if [[ $facet == mds* ]]; then
13468 # ensure each MDS's gc threads are still present and all in "R"
13469 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
13470 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
13471 error "$i: expected $nb GC-thread"
13473 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
13475 error "$i: GC-thread not found in R-state"
13476 # check umounts of each MDT on MDS have reached kthread_stop()
13477 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
13478 error "$i: expected $nb umount"
13480 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
13481 error "$i: umount not found in D-state"
13484 # release all GC-threads
13485 do_nodes $mdts $LCTL set_param fail_loc=0
13487 # wait for MDT stop to complete
13488 for i in $(seq $MDSCOUNT); do
13489 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
13493 # may try to check if any orphan changelog records are present
13494 # via ldiskfs/zfs and llog_reader...
13496 # re-start/mount MDTs
13497 for i in $(seq $MDSCOUNT); do
13498 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
13499 error "Fail to start mds$i"
13503 for i in $(seq $MDSCOUNT); do
13504 # check cl_user1 still registered
13505 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13506 error "mds$i: User ${cl_user1[mds$i]} not registered"
13507 # check cl_user2 unregistered
13508 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13509 error "mds$i: User ${cl_user2[mds$i]} still registered"
13511 # check changelogs are present and starting at $user_rec1 + 1
13512 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13513 [ -n "$user_rec1" ] ||
13514 error "mds$i: User ${cl_user1[mds$i]} not registered"
13515 first_rec=$($LFS changelog $(facet_svc mds$i) |
13516 awk '{ print $1; exit; }')
13518 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13519 [ $((user_rec1 + 1)) == $first_rec ] ||
13520 error "mds$i: first index should be $user_rec1 + 1, " \
13521 "but is $first_rec"
13524 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
13529 local mdts=$(comma_list $(mdts_nodes))
13531 changelog_register || error "first changelog_register failed"
13533 # generate some changelog records to accumulate on each MDT
13534 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13535 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13536 error "create $DIR/$tdir/$tfile failed"
13538 # check changelogs have been generated
13539 local nbcl=$(changelog_dump | wc -l)
13540 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13542 # simulate race between register and unregister
13543 # XXX as fail_loc is set per-MDS, with DNE configs the race
13544 # simulation will only occur for one MDT per MDS and for the
13545 # others the normal race scenario will take place
13546 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
13547 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
13548 do_nodes $mdts $LCTL set_param fail_val=1
13550 # unregister 1st user
13551 changelog_deregister &
13553 # wait some time for deregister work to reach race rdv
13555 # register 2nd user
13556 changelog_register || error "2nd user register failed"
13558 wait $pid1 || error "1st user deregister failed"
13562 declare -A LAST_REC
13563 for i in $(seq $MDSCOUNT); do
13564 if changelog_users mds$i | grep "^cl"; then
13565 # make sure new records are added with one user present
13566 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
13567 awk '/^current.index:/ { print $NF }')
13569 error "mds$i has no user registered"
13573 # generate more changelog records to accumulate on each MDT
13574 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13575 error "create $DIR/$tdir/${tfile}bis failed"
13577 for i in $(seq $MDSCOUNT); do
13578 last_rec=$(changelog_users $SINGLEMDS |
13579 awk '/^current.index:/ { print $NF }')
13580 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
13581 [ $last_rec != ${LAST_REC[mds$i]} ] ||
13582 error "changelogs are off on mds$i"
13585 run_test 160i "changelog user register/unregister race"
13588 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13589 remote_mds_nodsh && skip "remote MDS with nodsh"
13591 mkdir -p $DIR/$tdir/1/1
13593 changelog_register || error "changelog_register failed"
13594 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13596 changelog_users $SINGLEMDS | grep -q $cl_user ||
13597 error "User '$cl_user' not found in changelog_users"
13598 #define OBD_FAIL_MDS_CHANGELOG_REORDER 0x15d
13599 do_facet mds1 $LCTL set_param fail_loc=0x8000015d fail_val=3
13600 rmdir $DIR/$tdir/1/1 & sleep 1
13602 touch $DIR/$tdir/2/2
13603 rm -rf $DIR/$tdir/2
13608 changelog_dump | grep rmdir || error "rmdir not recorded"
13611 changelog_deregister
13613 run_test 160k "Verify that changelog records are not lost"
13616 remote_mds_nodsh && skip "remote MDS with nodsh"
13617 [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] &&
13618 skip "Need MDS version at least 2.12.56"
13620 mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
13622 changelog_register || error "first changelog_register failed"
13624 # generate some changelog
13625 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13626 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13627 error "create $DIR/$tdir/${tfile}bis failed"
13629 # open the changelog device
13630 exec 3>/dev/changelog-$FSNAME-MDT0000
13631 exec 4</dev/changelog-$FSNAME-MDT0000
13633 # umount the first lustre mount
13637 cat <&4 >/dev/null || error "read changelog failed"
13640 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13641 changelog_users $SINGLEMDS | grep -q $cl_user ||
13642 error "User $cl_user not found in changelog_users"
13644 printf 'clear:'$cl_user':0' >&3
13651 changelog_deregister || error "changelog_deregister failed"
13654 mount_client $MOUNT || error "mount_client on $MOUNT failed"
13656 run_test 160j "client can be umounted while its chanangelog is being used"
13659 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13661 test_mkdir -c1 $DIR/$tdir
13662 cp /etc/hosts $DIR/$tdir/$tfile
13663 test_mkdir -c1 $DIR/$tdir/foo1
13664 test_mkdir -c1 $DIR/$tdir/foo2
13665 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
13666 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
13667 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
13668 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
13669 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
13670 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13671 $LFS fid2path $DIR $FID
13672 error "bad link ea"
13675 rm $DIR/$tdir/foo2/zachary
13677 rm $DIR/$tdir/foo2/thor
13679 rm $DIR/$tdir/$tfile
13681 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
13682 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
13683 { $LFS fid2path $DIR $FID; error "bad link rename"; }
13684 rm $DIR/$tdir/foo2/maggie
13687 local longname=$tfile.avg_len_is_thirty_two_
13688 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
13689 error_noexit 'failed to unlink many hardlinks'" EXIT
13690 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
13691 error "failed to hardlink many files"
13692 links=$($LFS fid2path $DIR $FID | wc -l)
13693 echo -n "${links}/1000 links in link EA"
13694 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
13696 run_test 161a "link ea sanity"
13699 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13700 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
13703 local remote_dir=$DIR/$tdir/remote_dir
13705 mkdir -p $DIR/$tdir
13706 $LFS mkdir -i $MDTIDX $remote_dir ||
13707 error "create remote directory failed"
13709 cp /etc/hosts $remote_dir/$tfile
13710 mkdir -p $remote_dir/foo1
13711 mkdir -p $remote_dir/foo2
13712 ln $remote_dir/$tfile $remote_dir/foo1/sofia
13713 ln $remote_dir/$tfile $remote_dir/foo2/zachary
13714 ln $remote_dir/$tfile $remote_dir/foo1/luna
13715 ln $remote_dir/$tfile $remote_dir/foo2/thor
13717 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
13719 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13720 $LFS fid2path $DIR $FID
13721 error "bad link ea"
13724 rm $remote_dir/foo2/zachary
13726 rm $remote_dir/foo2/thor
13728 rm $remote_dir/$tfile
13730 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
13731 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
13732 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
13733 $LFS fid2path $DIR $FID
13734 error "bad link rename"
13736 rm $remote_dir/foo2/maggie
13739 local longname=filename_avg_len_is_thirty_two_
13740 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
13741 error "failed to hardlink many files"
13742 links=$($LFS fid2path $DIR $FID | wc -l)
13743 echo -n "${links}/1000 links in link EA"
13744 [[ ${links} -gt 60 ]] ||
13745 error "expected at least 60 links in link EA"
13746 unlinkmany $remote_dir/foo2/$longname 1000 ||
13747 error "failed to unlink many hardlinks"
13749 run_test 161b "link ea sanity under remote directory"
13752 remote_mds_nodsh && skip "remote MDS with nodsh"
13753 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13754 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
13755 skip "Need MDS version at least 2.1.5"
13757 # define CLF_RENAME_LAST 0x0001
13758 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
13759 changelog_register || error "changelog_register failed"
13762 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
13763 touch $DIR/$tdir/foo_161c
13764 touch $DIR/$tdir/bar_161c
13765 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13766 changelog_dump | grep RENME | tail -n 5
13767 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13768 changelog_clear 0 || error "changelog_clear failed"
13769 if [ x$flags != "x0x1" ]; then
13770 error "flag $flags is not 0x1"
13773 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
13774 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
13775 touch $DIR/$tdir/foo_161c
13776 touch $DIR/$tdir/bar_161c
13777 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13778 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13779 changelog_dump | grep RENME | tail -n 5
13780 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13781 changelog_clear 0 || error "changelog_clear failed"
13782 if [ x$flags != "x0x0" ]; then
13783 error "flag $flags is not 0x0"
13785 echo "rename overwrite a target having nlink > 1," \
13786 "changelog record has flags of $flags"
13788 # rename doesn't overwrite a target (changelog flag 0x0)
13789 touch $DIR/$tdir/foo_161c
13790 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
13791 changelog_dump | grep RENME | tail -n 5
13792 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
13793 changelog_clear 0 || error "changelog_clear failed"
13794 if [ x$flags != "x0x0" ]; then
13795 error "flag $flags is not 0x0"
13797 echo "rename doesn't overwrite a target," \
13798 "changelog record has flags of $flags"
13800 # define CLF_UNLINK_LAST 0x0001
13801 # unlink a file having nlink = 1 (changelog flag 0x1)
13802 rm -f $DIR/$tdir/foo2_161c
13803 changelog_dump | grep UNLNK | tail -n 5
13804 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13805 changelog_clear 0 || error "changelog_clear failed"
13806 if [ x$flags != "x0x1" ]; then
13807 error "flag $flags is not 0x1"
13809 echo "unlink a file having nlink = 1," \
13810 "changelog record has flags of $flags"
13812 # unlink a file having nlink > 1 (changelog flag 0x0)
13813 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13814 rm -f $DIR/$tdir/foobar_161c
13815 changelog_dump | grep UNLNK | tail -n 5
13816 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13817 changelog_clear 0 || error "changelog_clear failed"
13818 if [ x$flags != "x0x0" ]; then
13819 error "flag $flags is not 0x0"
13821 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
13823 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
13826 remote_mds_nodsh && skip "remote MDS with nodsh"
13831 changelog_register || error "changelog_register failed"
13833 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
13834 # interfer with $MOUNT/.lustre/fid/ access
13836 [[ $? -eq 0 ]] || error "mkdir failed"
13838 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
13839 $LCTL set_param fail_loc=0x8000140c
13841 $LCTL set_param fail_val=5
13844 echo foofoo > $DIR/$tdir/$tfile &
13847 # wait for create to be delayed
13851 [[ $? -eq 0 ]] || error "create should be blocked"
13853 local tempfile=$(mktemp)
13854 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
13855 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
13856 # some delay may occur during ChangeLog publishing and file read just
13857 # above, that could allow file write to happen finally
13858 [[ -s $tempfile ]] && echo "file should be empty"
13860 $LCTL set_param fail_loc=0
13863 [[ $? -eq 0 ]] || error "create failed"
13865 run_test 161d "create with concurrent .lustre/fid access"
13868 local expected="$1"
13873 path=$($LFS fid2path "$@")
13876 if [ $rc -ne 0 ]; then
13877 error "path looked up of '$expected' failed: rc=$rc"
13878 elif [ "$path" != "$expected" ]; then
13879 error "path looked up '$path' instead of '$expected'"
13881 echo "FID '$fid' resolves to path '$path' as expected"
13885 test_162a() { # was test_162
13886 test_mkdir -p -c1 $DIR/$tdir/d2
13887 touch $DIR/$tdir/d2/$tfile
13888 touch $DIR/$tdir/d2/x1
13889 touch $DIR/$tdir/d2/x2
13890 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
13891 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
13893 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
13894 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
13897 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
13898 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
13899 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
13901 # softlink to wrong file
13902 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
13903 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
13904 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
13907 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
13908 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
13909 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
13910 # fid2path dir/fsname should both work
13911 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
13912 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
13914 # hardlink count: check that there are 2 links
13915 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
13916 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
13918 # hardlink indexing: remove the first link
13919 rm $DIR/$tdir/d2/p/q/r/hlink
13920 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
13922 run_test 162a "path lookup sanity"
13925 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13926 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13929 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
13930 error "create striped dir failed"
13932 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
13933 tail -n 1 | awk '{print $2}')
13934 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
13936 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
13937 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
13940 for ((i=0;i<5;i++)); do
13941 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
13942 error "get fid for f$i failed"
13943 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
13945 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
13946 error "get fid for d$i failed"
13947 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
13952 run_test 162b "striped directory path lookup sanity"
13954 # LU-4239: Verify fid2path works with paths 100 or more directories deep
13956 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
13957 skip "Need MDS version at least 2.7.51"
13959 local lpath=$tdir.local
13960 local rpath=$tdir.remote
13962 test_mkdir $DIR/$lpath
13963 test_mkdir $DIR/$rpath
13965 for ((i = 0; i <= 101; i++)); do
13968 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
13969 error "get fid for local directory $DIR/$lpath failed"
13970 check_path "$DIR/$lpath" $MOUNT $FID --link 0
13973 test_mkdir $DIR/$rpath
13974 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
13975 error "get fid for remote directory $DIR/$rpath failed"
13976 check_path "$DIR/$rpath" $MOUNT $FID --link 0
13981 run_test 162c "fid2path works with paths 100 or more directories deep"
13984 # do directio so as not to populate the page cache
13985 log "creating a 10 Mb file"
13986 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
13987 log "starting reads"
13988 dd if=$DIR/$tfile of=/dev/null bs=4096 &
13989 log "truncating the file"
13990 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
13992 kill %+ || true # reads might have finished
13993 echo "wait until dd is finished"
13995 log "removing the temporary file"
13996 rm -rf $DIR/$tfile || error "tmp file removal failed"
13998 run_test 169 "parallel read and truncate should not deadlock"
14001 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14003 $LCTL clear # bug 18514
14004 $LCTL debug_daemon start $TMP/${tfile}_log_good
14006 $LCTL debug_daemon stop
14007 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
14008 error "sed failed to read log_good"
14010 $LCTL debug_daemon start $TMP/${tfile}_log_good
14012 $LCTL debug_daemon stop
14014 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
14015 error "lctl df log_bad failed"
14017 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14018 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14020 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
14021 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
14023 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
14024 error "bad_line good_line1 good_line2 are empty"
14026 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14027 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
14028 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14030 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
14031 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14032 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14034 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
14035 error "bad_line_new good_line_new are empty"
14037 local expected_good=$((good_line1 + good_line2*2))
14039 rm -f $TMP/${tfile}*
14040 # LU-231, short malformed line may not be counted into bad lines
14041 if [ $bad_line -ne $bad_line_new ] &&
14042 [ $bad_line -ne $((bad_line_new - 1)) ]; then
14043 error "expected $bad_line bad lines, but got $bad_line_new"
14047 if [ $expected_good -ne $good_line_new ]; then
14048 error "expected $expected_good good lines, but got $good_line_new"
14053 run_test 170 "test lctl df to handle corrupted log ====================="
14055 test_171() { # bug20592
14056 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14058 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
14059 $LCTL set_param fail_loc=0x50e
14060 $LCTL set_param fail_val=3000
14061 multiop_bg_pause $DIR/$tfile O_s || true
14063 kill -USR1 $MULTIPID
14067 if dmesg | grep "recursive fault"; then
14068 error "caught a recursive fault"
14070 $LCTL set_param fail_loc=0
14073 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
14075 # it would be good to share it with obdfilter-survey/iokit-libecho code
14076 setup_obdecho_osc () {
14079 local obdfilter_name=$2
14080 echo "Creating new osc for $obdfilter_name on $ost_nid"
14081 # make sure we can find loopback nid
14082 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
14084 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
14085 ${obdfilter_name}_osc_UUID || rc=2; }
14086 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
14087 ${obdfilter_name}_UUID $ost_nid || rc=3; }
14091 cleanup_obdecho_osc () {
14092 local obdfilter_name=$1
14093 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
14094 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
14101 local pages=${3:-64}
14106 local obd_size=$(get_obd_size $node $OBD)
14107 local page_size=$(get_page_size $node)
14108 if [[ -n "$obd_size" ]]; then
14109 local new_count=$((obd_size / (pages * page_size / 1024)))
14110 [[ $new_count -ge $count ]] || count=$new_count
14113 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
14114 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
14116 if [ $rc -eq 0 ]; then
14117 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
14118 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
14120 echo "New object id is $id"
14121 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
14123 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
14124 "test_brw $count w v $pages $id" || rc=4; }
14125 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
14127 [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
14128 "cleanup" || rc=5; }
14129 [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \
14130 "detach" || rc=6; }
14131 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
14136 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14138 if ! module_loaded obdecho; then
14139 load_module obdecho/obdecho &&
14140 stack_trap "rmmod obdecho" EXIT ||
14141 error "unable to load obdecho on client"
14144 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
14145 local host=$($LCTL get_param -n osc.$osc.import |
14146 awk '/current_connection:/ { print $2 }' )
14147 local target=$($LCTL get_param -n osc.$osc.import |
14148 awk '/target:/ { print $2 }' )
14149 target=${target%_UUID}
14151 if [ -n "$target" ]; then
14152 setup_obdecho_osc $host $target &&
14153 stack_trap "cleanup_obdecho_osc $target" EXIT ||
14154 { error "obdecho setup failed with $?"; return; }
14156 obdecho_test ${target}_osc client ||
14157 error "obdecho_test failed on ${target}_osc"
14159 $LCTL get_param osc.$osc.import
14160 error "there is no osc.$osc.import target"
14163 run_test 180a "test obdecho on osc"
14166 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14167 remote_ost_nodsh && skip "remote OST with nodsh"
14169 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14170 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14171 error "failed to load module obdecho"
14173 local target=$(do_facet ost1 $LCTL dl |
14174 awk '/obdfilter/ { print $4; exit; }')
14176 if [ -n "$target" ]; then
14177 obdecho_test $target ost1 || error "obdecho_test failed with $?"
14179 do_facet ost1 $LCTL dl
14180 error "there is no obdfilter target on ost1"
14183 run_test 180b "test obdecho directly on obdfilter"
14185 test_180c() { # LU-2598
14186 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14187 remote_ost_nodsh && skip "remote OST with nodsh"
14188 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
14189 skip "Need MDS version at least 2.4.0"
14191 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14192 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14193 error "failed to load module obdecho"
14195 local target=$(do_facet ost1 $LCTL dl |
14196 awk '/obdfilter/ { print $4; exit; }')
14198 if [ -n "$target" ]; then
14199 local pages=16384 # 64MB bulk I/O RPC size
14201 obdecho_test "$target" ost1 "$pages" ||
14202 error "obdecho_test with pages=$pages failed with $?"
14204 do_facet ost1 $LCTL dl
14205 error "there is no obdfilter target on ost1"
14208 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
14210 test_181() { # bug 22177
14211 test_mkdir $DIR/$tdir
14212 # create enough files to index the directory
14213 createmany -o $DIR/$tdir/foobar 4000
14214 # print attributes for debug purpose
14217 multiop_bg_pause $DIR/$tdir D_Sc || return 1
14219 # remove the files & current working dir
14220 unlinkmany $DIR/$tdir/foobar 4000
14222 kill -USR1 $MULTIPID
14224 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
14227 run_test 181 "Test open-unlinked dir ========================"
14233 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14235 $LCTL set_param mdc.*.rpc_stats=clear
14237 for (( i = 0; i < $tcount; i++ )) ; do
14238 mkdir $DIR/$tdir/$i
14241 for (( i = 0; i < $tcount; i++ )) ; do
14242 createmany -o $DIR/$tdir/$i/f- $fcount &
14246 for (( i = 0; i < $tcount; i++ )) ; do
14247 unlinkmany $DIR/$tdir/$i/f- $fcount &
14251 $LCTL get_param mdc.*.rpc_stats
14255 run_test 182 "Test parallel modify metadata operations ================"
14257 test_183() { # LU-2275
14258 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14259 remote_mds_nodsh && skip "remote MDS with nodsh"
14260 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
14261 skip "Need MDS version at least 2.3.56"
14263 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14264 echo aaa > $DIR/$tdir/$tfile
14266 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
14267 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
14269 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
14270 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
14272 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
14274 # Flush negative dentry cache
14275 touch $DIR/$tdir/$tfile
14277 # We are not checking for any leaked references here, they'll
14278 # become evident next time we do cleanup with module unload.
14281 run_test 183 "No crash or request leak in case of strange dispositions ========"
14283 # test suite 184 is for LU-2016, LU-2017
14285 check_swap_layouts_support
14287 dir0=$DIR/$tdir/$testnum
14288 test_mkdir -p -c1 $dir0
14293 $SETSTRIPE -c1 $file1
14295 $SETSTRIPE -c2 $file2
14297 gen1=$($GETSTRIPE -g $file1)
14298 gen2=$($GETSTRIPE -g $file2)
14300 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
14301 gen=$($GETSTRIPE -g $file1)
14302 [[ $gen1 != $gen ]] ||
14303 "Layout generation on $file1 does not change"
14304 gen=$($GETSTRIPE -g $file2)
14305 [[ $gen2 != $gen ]] ||
14306 "Layout generation on $file2 does not change"
14308 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
14309 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
14311 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
14313 run_test 184a "Basic layout swap"
14316 check_swap_layouts_support
14318 dir0=$DIR/$tdir/$testnum
14319 mkdir -p $dir0 || error "creating dir $dir0"
14326 $SETSTRIPE -c1 $file1
14327 $SETSTRIPE -c2 $file2
14328 $SETSTRIPE -c1 $file3
14329 chown $RUNAS_ID $file3
14330 gen1=$($GETSTRIPE -g $file1)
14331 gen2=$($GETSTRIPE -g $file2)
14333 $LFS swap_layouts $dir1 $dir2 &&
14334 error "swap of directories layouts should fail"
14335 $LFS swap_layouts $dir1 $file1 &&
14336 error "swap of directory and file layouts should fail"
14337 $RUNAS $LFS swap_layouts $file1 $file2 &&
14338 error "swap of file we cannot write should fail"
14339 $LFS swap_layouts $file1 $file3 &&
14340 error "swap of file with different owner should fail"
14341 /bin/true # to clear error code
14343 run_test 184b "Forbidden layout swap (will generate errors)"
14346 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14347 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14348 check_swap_layouts_support
14350 local dir0=$DIR/$tdir/$testnum
14351 mkdir -p $dir0 || error "creating dir $dir0"
14353 local ref1=$dir0/ref1
14354 local ref2=$dir0/ref2
14355 local file1=$dir0/file1
14356 local file2=$dir0/file2
14357 # create a file large enough for the concurrent test
14358 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14359 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14360 echo "ref file size: ref1($(stat -c %s $ref1))," \
14361 "ref2($(stat -c %s $ref2))"
14364 dd if=$ref1 of=$file1 bs=16k &
14367 # Make sure dd starts to copy file
14368 while [ ! -f $file1 ]; do sleep 0.1; done
14370 $LFS swap_layouts $file1 $file2
14373 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14374 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14376 # how many bytes copied before swapping layout
14377 local copied=$(stat -c %s $file2)
14378 local remaining=$(stat -c %s $ref1)
14379 remaining=$((remaining - copied))
14380 echo "Copied $copied bytes before swapping layout..."
14382 cmp -n $copied $file1 $ref2 | grep differ &&
14383 error "Content mismatch [0, $copied) of ref2 and file1"
14384 cmp -n $copied $file2 $ref1 ||
14385 error "Content mismatch [0, $copied) of ref1 and file2"
14386 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14387 error "Content mismatch [$copied, EOF) of ref1 and file1"
14390 rm -f $ref1 $ref2 $file1 $file2
14392 run_test 184c "Concurrent write and layout swap"
14395 check_swap_layouts_support
14396 [ -z "$(which getfattr 2>/dev/null)" ] &&
14397 skip_env "no getfattr command"
14399 local file1=$DIR/$tdir/$tfile-1
14400 local file2=$DIR/$tdir/$tfile-2
14401 local file3=$DIR/$tdir/$tfile-3
14405 mkdir -p $DIR/$tdir
14406 touch $file1 || error "create $file1 failed"
14407 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14408 error "create $file2 failed"
14409 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14410 error "create $file3 failed"
14411 lovea1=$(get_layout_param $file1)
14413 $LFS swap_layouts $file2 $file3 ||
14414 error "swap $file2 $file3 layouts failed"
14415 $LFS swap_layouts $file1 $file2 ||
14416 error "swap $file1 $file2 layouts failed"
14418 lovea2=$(get_layout_param $file2)
14421 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14423 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14424 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14426 run_test 184d "allow stripeless layouts swap"
14429 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14430 skip "Need MDS version at least 2.6.94"
14431 check_swap_layouts_support
14432 [ -z "$(which getfattr 2>/dev/null)" ] &&
14433 skip_env "no getfattr command"
14435 local file1=$DIR/$tdir/$tfile-1
14436 local file2=$DIR/$tdir/$tfile-2
14437 local file3=$DIR/$tdir/$tfile-3
14440 mkdir -p $DIR/$tdir
14441 touch $file1 || error "create $file1 failed"
14442 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14443 error "create $file2 failed"
14444 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14445 error "create $file3 failed"
14447 $LFS swap_layouts $file1 $file2 ||
14448 error "swap $file1 $file2 layouts failed"
14450 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14451 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14453 echo 123 > $file1 || error "Should be able to write into $file1"
14455 $LFS swap_layouts $file1 $file3 ||
14456 error "swap $file1 $file3 layouts failed"
14458 echo 123 > $file1 || error "Should be able to write into $file1"
14460 rm -rf $file1 $file2 $file3
14462 run_test 184e "Recreate layout after stripeless layout swaps"
14465 # Create a file with name longer than sizeof(struct stat) ==
14466 # 144 to see if we can get chars from the file name to appear
14467 # in the returned striping. Note that 'f' == 0x66.
14468 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
14470 mkdir -p $DIR/$tdir
14471 mcreate $DIR/$tdir/$file
14472 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
14473 error "IOC_MDC_GETFILEINFO returned garbage striping"
14476 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
14478 test_185() { # LU-2441
14479 # LU-3553 - no volatile file support in old servers
14480 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
14481 skip "Need MDS version at least 2.3.60"
14483 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14484 touch $DIR/$tdir/spoo
14485 local mtime1=$(stat -c "%Y" $DIR/$tdir)
14486 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
14487 error "cannot create/write a volatile file"
14488 [ "$FILESET" == "" ] &&
14489 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
14490 error "FID is still valid after close"
14492 multiop_bg_pause $DIR/$tdir vVw4096_c
14499 # assume that the next FID for this client is sequential, since stdout
14500 # is unfortunately eaten by multiop_bg_pause
14501 local n=$((${fidv[1]} + 1))
14502 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
14503 if [ "$FILESET" == "" ]; then
14504 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
14505 error "FID is missing before close"
14507 kill -USR1 $multi_pid
14508 # 1 second delay, so if mtime change we will see it
14510 local mtime2=$(stat -c "%Y" $DIR/$tdir)
14511 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
14513 run_test 185 "Volatile file support"
14515 function create_check_volatile() {
14519 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
14522 local FID=$(cat /tmp/${tfile}.fid)
14523 [ "$FID" == "" ] && error "can't get FID for volatile"
14524 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
14525 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
14526 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
14530 cancel_lru_locks mdc # flush opencache
14531 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
14536 # LU-12516 - volatile creation via .lustre
14537 [[ $MDS1_VERSION -ge $(version_code 2.12.2) ]] ||
14538 skip "Need MDS version at least 2.12.2"
14540 create_check_volatile 0
14541 [ $MDSCOUNT -lt 2 ] && return 0
14544 create_check_volatile 1
14548 run_test 185a "Volatile file creation in .lustre/fid/"
14551 remote_mds_nodsh && skip "remote MDS with nodsh"
14552 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14553 skip "Need MDS version at least 2.3.0"
14555 local dir0=$DIR/$tdir/$testnum
14556 mkdir -p $dir0 || error "creating dir $dir0"
14558 local file=$dir0/file1
14559 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
14560 local dv1=$($LFS data_version $file)
14561 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
14562 local dv2=$($LFS data_version $file)
14563 [[ $dv1 != $dv2 ]] ||
14564 error "data version did not change on write $dv1 == $dv2"
14569 run_test 187a "Test data version change"
14572 remote_mds_nodsh && skip "remote MDS with nodsh"
14573 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14574 skip "Need MDS version at least 2.3.0"
14576 local dir0=$DIR/$tdir/$testnum
14577 mkdir -p $dir0 || error "creating dir $dir0"
14579 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
14580 [[ ${DV[0]} != ${DV[1]} ]] ||
14581 error "data version did not change on write"\
14582 " ${DV[0]} == ${DV[1]}"
14587 run_test 187b "Test data version change on volatile file"
14590 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14591 remote_mgs_nodsh && skip "remote MGS with nodsh"
14592 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
14594 local POOL=${POOL:-cea1}
14595 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
14596 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
14599 local last_ost=$(($OSTCOUNT - 1))
14601 local ost_list=$(seq $first_ost $ost_step $last_ost)
14602 local ost_range="$first_ost $last_ost $ost_step"
14603 local test_path=$POOL_ROOT/$POOL_DIR_NAME
14604 local file_dir=$POOL_ROOT/file_tst
14605 local subdir=$test_path/subdir
14609 # former test_200a test_200b
14610 pool_add $POOL || { rc=$? ; break; }
14611 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
14612 # former test_200c test_200d
14613 mkdir -p $test_path
14614 pool_set_dir $POOL $test_path || { rc=$? ; break; }
14615 pool_check_dir $POOL $test_path || { rc=$? ; break; }
14617 pool_check_dir $POOL $subdir || { rc=$? ; break; }
14618 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
14619 || { rc=$? ; break; }
14620 # former test_200e test_200f
14621 local files=$((OSTCOUNT*3))
14622 pool_alloc_files $POOL $test_path $files "$ost_list" \
14623 || { rc=$? ; break; }
14624 pool_create_files $POOL $file_dir $files "$ost_list" \
14625 || { rc=$? ; break; }
14626 # former test_200g test_200h
14627 pool_lfs_df $POOL || { rc=$? ; break; }
14628 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
14630 # former test_201a test_201b test_201c
14631 pool_remove_first_target $POOL || { rc=$? ; break; }
14633 local f=$test_path/$tfile
14634 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
14635 pool_remove $POOL $f || { rc=$? ; break; }
14643 run_test 200 "OST pools"
14645 # usage: default_attr <count | size | offset>
14647 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
14650 # usage: check_default_stripe_attr
14651 check_default_stripe_attr() {
14652 ACTUAL=$($GETSTRIPE $* $DIR/$tdir)
14655 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
14657 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
14661 error "unknown getstripe attr '$1'"
14664 [ $ACTUAL == $EXPECTED ] ||
14665 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
14669 test_mkdir $DIR/$tdir
14670 $SETSTRIPE --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
14672 check_default_stripe_attr --stripe-count
14673 check_default_stripe_attr --stripe-size
14674 check_default_stripe_attr --stripe-index
14676 run_test 204a "Print default stripe attributes"
14679 test_mkdir $DIR/$tdir
14680 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14682 check_default_stripe_attr --stripe-size
14683 check_default_stripe_attr --stripe-index
14685 run_test 204b "Print default stripe size and offset"
14688 test_mkdir $DIR/$tdir
14689 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14691 check_default_stripe_attr --stripe-count
14692 check_default_stripe_attr --stripe-index
14694 run_test 204c "Print default stripe count and offset"
14697 test_mkdir $DIR/$tdir
14698 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14700 check_default_stripe_attr --stripe-count
14701 check_default_stripe_attr --stripe-size
14703 run_test 204d "Print default stripe count and size"
14706 test_mkdir $DIR/$tdir
14707 $SETSTRIPE -d $DIR/$tdir
14709 check_default_stripe_attr --stripe-count --raw
14710 check_default_stripe_attr --stripe-size --raw
14711 check_default_stripe_attr --stripe-index --raw
14713 run_test 204e "Print raw stripe attributes"
14716 test_mkdir $DIR/$tdir
14717 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14719 check_default_stripe_attr --stripe-size --raw
14720 check_default_stripe_attr --stripe-index --raw
14722 run_test 204f "Print raw stripe size and offset"
14725 test_mkdir $DIR/$tdir
14726 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14728 check_default_stripe_attr --stripe-count --raw
14729 check_default_stripe_attr --stripe-index --raw
14731 run_test 204g "Print raw stripe count and offset"
14734 test_mkdir $DIR/$tdir
14735 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14737 check_default_stripe_attr --stripe-count --raw
14738 check_default_stripe_attr --stripe-size --raw
14740 run_test 204h "Print raw stripe count and size"
14742 # Figure out which job scheduler is being used, if any,
14743 # or use a fake one
14744 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
14745 JOBENV=SLURM_JOB_ID
14746 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
14748 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
14750 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
14751 JOBENV=LOADL_STEP_ID
14752 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
14755 $LCTL list_param jobid_name > /dev/null 2>&1
14756 if [ $? -eq 0 ]; then
14762 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
14764 verify_jobstats() {
14769 # we don't really need to clear the stats for this test to work, since each
14770 # command has a unique jobid, but it makes debugging easier if needed.
14771 # for facet in $facets; do
14772 # local dev=$(convert_facet2label $facet)
14773 # # clear old jobstats
14774 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
14777 # use a new JobID for each test, or we might see an old one
14778 [ "$JOBENV" = "FAKE_JOBID" ] &&
14779 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
14781 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
14783 [ "$JOBENV" = "nodelocal" ] && {
14784 FAKE_JOBID=id.$testnum.%e.$RANDOM
14785 $LCTL set_param jobid_name=$FAKE_JOBID
14786 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
14789 log "Test: ${cmd[*]}"
14790 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
14792 if [ $JOBENV = "FAKE_JOBID" ]; then
14793 FAKE_JOBID=$JOBVAL ${cmd[*]}
14798 # all files are created on OST0000
14799 for facet in $facets; do
14800 local stats="*.$(convert_facet2label $facet).job_stats"
14802 # strip out libtool wrappers for in-tree executables
14803 if [ $(do_facet $facet lctl get_param $stats |
14804 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
14805 do_facet $facet lctl get_param $stats
14806 error "No jobstats for $JOBVAL found on $facet::$stats"
14812 local new_jobenv=$1
14814 set_persistent_param_and_check client "jobid_var" \
14815 "$FSNAME.sys.jobid_var" $new_jobenv
14818 test_205a() { # Job stats
14819 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14820 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
14821 skip "Need MDS version with at least 2.7.1"
14822 remote_mgs_nodsh && skip "remote MGS with nodsh"
14823 remote_mds_nodsh && skip "remote MDS with nodsh"
14824 remote_ost_nodsh && skip "remote OST with nodsh"
14825 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
14826 skip "Server doesn't support jobstats"
14827 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
14829 local old_jobenv=$($LCTL get_param -n jobid_var)
14830 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
14832 if [[ $PERM_CMD = *"set_param -P"* ]]; then
14833 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
14835 stack_trap "do_facet mgs $PERM_CMD \
14836 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
14840 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
14841 mdt.*.job_cleanup_interval | head -n 1)
14842 local new_interval=5
14843 do_facet $SINGLEMDS \
14844 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
14845 stack_trap "do_facet $SINGLEMDS \
14846 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
14847 local start=$SECONDS
14851 cmd="mkdir $DIR/$tdir"
14852 verify_jobstats "$cmd" "$SINGLEMDS"
14854 cmd="rmdir $DIR/$tdir"
14855 verify_jobstats "$cmd" "$SINGLEMDS"
14856 # mkdir on secondary MDT
14857 if [ $MDSCOUNT -gt 1 ]; then
14858 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
14859 verify_jobstats "$cmd" "mds2"
14862 cmd="mknod $DIR/$tfile c 1 3"
14863 verify_jobstats "$cmd" "$SINGLEMDS"
14865 cmd="rm -f $DIR/$tfile"
14866 verify_jobstats "$cmd" "$SINGLEMDS"
14867 # create all files on OST0000 so verify_jobstats can find OST stats
14869 cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile"
14870 verify_jobstats "$cmd" "$SINGLEMDS"
14872 cmd="touch $DIR/$tfile"
14873 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14875 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
14876 verify_jobstats "$cmd" "ost1"
14878 cancel_lru_locks osc
14879 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
14880 verify_jobstats "$cmd" "ost1"
14882 cmd="$TRUNCATE $DIR/$tfile 0"
14883 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14885 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
14886 verify_jobstats "$cmd" "$SINGLEMDS"
14887 # jobstats expiry - sleep until old stats should be expired
14888 local left=$((new_interval + 5 - (SECONDS - start)))
14889 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
14890 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
14892 cmd="mkdir $DIR/$tdir.expire"
14893 verify_jobstats "$cmd" "$SINGLEMDS"
14894 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
14895 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
14897 # Ensure that jobid are present in changelog (if supported by MDS)
14898 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
14899 changelog_dump | tail -10
14900 jobids=$(changelog_dump | tail -9 | grep -c "j=")
14901 [ $jobids -eq 9 ] ||
14902 error "Wrong changelog jobid count $jobids != 9"
14906 jobstats_set $JOBENV
14908 changelog_dump | grep $tfile
14909 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
14910 [ $jobids -eq 0 ] ||
14911 error "Unexpected jobids when jobid_var=$JOBENV"
14914 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
14915 JOBENV="JOBCOMPLEX"
14916 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
14918 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
14920 run_test 205a "Verify job stats"
14924 $LCTL set_param jobid_var=USER jobid_name="%e.%u"
14925 env -i USERTESTJOBSTATS=foolish touch $DIR/$tfile.1
14926 do_facet $SINGLEMDS $LCTL get_param mdt.*.job_stats |
14927 grep job_id: | grep foolish &&
14928 error "Unexpected jobid found"
14931 run_test 205b "Verify job stats jobid parsing"
14933 # LU-1480, LU-1773 and LU-1657
14935 mkdir -p $DIR/$tdir
14936 $SETSTRIPE -c -1 $DIR/$tdir
14937 #define OBD_FAIL_LOV_INIT 0x1403
14938 $LCTL set_param fail_loc=0xa0001403
14939 $LCTL set_param fail_val=1
14940 touch $DIR/$tdir/$tfile || true
14942 run_test 206 "fail lov_init_raid0() doesn't lbug"
14945 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14946 local fsz=`stat -c %s $DIR/$tfile`
14947 cancel_lru_locks mdc
14949 # do not return layout in getattr intent
14950 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
14951 $LCTL set_param fail_loc=0x170
14952 local sz=`stat -c %s $DIR/$tfile`
14954 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
14958 run_test 207a "can refresh layout at glimpse"
14961 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14962 local cksum=`md5sum $DIR/$tfile`
14963 local fsz=`stat -c %s $DIR/$tfile`
14964 cancel_lru_locks mdc
14965 cancel_lru_locks osc
14967 # do not return layout in getattr intent
14968 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
14969 $LCTL set_param fail_loc=0x171
14971 # it will refresh layout after the file is opened but before read issues
14972 echo checksum is "$cksum"
14973 echo "$cksum" |md5sum -c --quiet || error "file differs"
14977 run_test 207b "can refresh layout at open"
14980 # FIXME: in this test suite, only RD lease is used. This is okay
14981 # for now as only exclusive open is supported. After generic lease
14982 # is done, this test suite should be revised. - Jinshan
14984 remote_mds_nodsh && skip "remote MDS with nodsh"
14985 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
14986 skip "Need MDS version at least 2.4.52"
14988 echo "==== test 1: verify get lease work"
14989 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
14991 echo "==== test 2: verify lease can be broken by upcoming open"
14992 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
14996 $MULTIOP $DIR/$tfile oO_RDONLY:c
14997 kill -USR1 $PID && wait $PID || error "break lease error"
14999 echo "==== test 3: verify lease can't be granted if an open already exists"
15000 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
15004 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
15005 kill -USR1 $PID && wait $PID || error "open file error"
15007 echo "==== test 4: lease can sustain over recovery"
15008 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
15014 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
15016 echo "==== test 5: lease broken can't be regained by replay"
15017 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15021 # open file to break lease and then recovery
15022 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
15025 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
15029 run_test 208 "Exclusive open"
15032 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
15033 skip_env "must have disp_stripe"
15036 sync; sleep 5; sync;
15038 echo 3 > /proc/sys/vm/drop_caches
15039 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15041 # open/close 500 times
15042 for i in $(seq 500); do
15046 echo 3 > /proc/sys/vm/drop_caches
15047 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15049 echo "before: $req_before, after: $req_after"
15050 [ $((req_after - req_before)) -ge 300 ] &&
15051 error "open/close requests are not freed"
15054 run_test 209 "read-only open/close requests should be freed promptly"
15058 size=$((size % 8192 + 1))
15059 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
15060 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
15061 rm -f $DIR/f212 $DIR/f212.xyz
15063 run_test 212 "Sendfile test ============================================"
15066 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
15067 cancel_lru_locks osc
15068 lctl set_param fail_loc=0x8000040f
15069 # generate a read lock
15070 cat $DIR/$tfile > /dev/null
15071 # write to the file, it will try to cancel the above read lock.
15072 cat /etc/hosts >> $DIR/$tfile
15074 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
15076 test_214() { # for bug 20133
15077 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
15078 for (( i=0; i < 340; i++ )) ; do
15079 touch $DIR/$tdir/d214c/a$i
15082 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
15083 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
15084 ls $DIR/d214c || error "ls $DIR/d214c failed"
15085 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
15086 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
15088 run_test 214 "hash-indexed directory test - bug 20133"
15090 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
15091 create_lnet_proc_files() {
15092 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
15095 # counterpart of create_lnet_proc_files
15096 remove_lnet_proc_files() {
15097 rm -f $TMP/lnet_$1.sys
15100 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15101 # 3rd arg as regexp for body
15102 check_lnet_proc_stats() {
15103 local l=$(cat "$TMP/lnet_$1" |wc -l)
15104 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
15106 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
15109 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15110 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
15111 # optional and can be regexp for 2nd line (lnet.routes case)
15112 check_lnet_proc_entry() {
15113 local blp=2 # blp stands for 'position of 1st line of body'
15114 [ -z "$5" ] || blp=3 # lnet.routes case
15116 local l=$(cat "$TMP/lnet_$1" |wc -l)
15117 # subtracting one from $blp because the body can be empty
15118 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
15120 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
15121 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
15123 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
15124 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
15126 # bail out if any unexpected line happened
15127 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
15128 [ "$?" != 0 ] || error "$2 misformatted"
15131 test_215() { # for bugs 18102, 21079, 21517
15132 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15134 local N='(0|[1-9][0-9]*)' # non-negative numeric
15135 local P='[1-9][0-9]*' # positive numeric
15136 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
15137 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
15138 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
15139 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
15141 local L1 # regexp for 1st line
15142 local L2 # regexp for 2nd line (optional)
15143 local BR # regexp for the rest (body)
15145 # lnet.stats should look as 11 space-separated non-negative numerics
15146 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
15147 create_lnet_proc_files "stats"
15148 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
15149 remove_lnet_proc_files "stats"
15151 # lnet.routes should look like this:
15152 # Routing disabled/enabled
15153 # net hops priority state router
15154 # where net is a string like tcp0, hops > 0, priority >= 0,
15155 # state is up/down,
15156 # router is a string like 192.168.1.1@tcp2
15157 L1="^Routing (disabled|enabled)$"
15158 L2="^net +hops +priority +state +router$"
15159 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
15160 create_lnet_proc_files "routes"
15161 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
15162 remove_lnet_proc_files "routes"
15164 # lnet.routers should look like this:
15165 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
15166 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
15167 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
15168 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
15169 L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
15170 BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
15171 create_lnet_proc_files "routers"
15172 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
15173 remove_lnet_proc_files "routers"
15175 # lnet.peers should look like this:
15176 # nid refs state last max rtr min tx min queue
15177 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
15178 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
15179 # numeric (0 or >0 or <0), queue >= 0.
15180 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
15181 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
15182 create_lnet_proc_files "peers"
15183 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
15184 remove_lnet_proc_files "peers"
15186 # lnet.buffers should look like this:
15187 # pages count credits min
15188 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
15189 L1="^pages +count +credits +min$"
15190 BR="^ +$N +$N +$I +$I$"
15191 create_lnet_proc_files "buffers"
15192 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
15193 remove_lnet_proc_files "buffers"
15195 # lnet.nis should look like this:
15196 # nid status alive refs peer rtr max tx min
15197 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
15198 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
15199 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
15200 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
15201 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
15202 create_lnet_proc_files "nis"
15203 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
15204 remove_lnet_proc_files "nis"
15206 # can we successfully write to lnet.stats?
15207 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
15209 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
15211 test_216() { # bug 20317
15212 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15213 remote_ost_nodsh && skip "remote OST with nodsh"
15216 local facets=$(get_facets OST)
15217 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15219 save_lustre_params client "osc.*.contention_seconds" > $p
15220 save_lustre_params $facets \
15221 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
15222 save_lustre_params $facets \
15223 "ldlm.namespaces.filter-*.contended_locks" >> $p
15224 save_lustre_params $facets \
15225 "ldlm.namespaces.filter-*.contention_seconds" >> $p
15226 clear_stats osc.*.osc_stats
15228 # agressive lockless i/o settings
15229 do_nodes $(comma_list $(osts_nodes)) \
15230 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
15231 ldlm.namespaces.filter-*.contended_locks=0 \
15232 ldlm.namespaces.filter-*.contention_seconds=60"
15233 lctl set_param -n osc.*.contention_seconds=60
15235 $DIRECTIO write $DIR/$tfile 0 10 4096
15236 $CHECKSTAT -s 40960 $DIR/$tfile
15238 # disable lockless i/o
15239 do_nodes $(comma_list $(osts_nodes)) \
15240 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
15241 ldlm.namespaces.filter-*.contended_locks=32 \
15242 ldlm.namespaces.filter-*.contention_seconds=0"
15243 lctl set_param -n osc.*.contention_seconds=0
15244 clear_stats osc.*.osc_stats
15246 dd if=/dev/zero of=$DIR/$tfile count=0
15247 $CHECKSTAT -s 0 $DIR/$tfile
15249 restore_lustre_params <$p
15253 run_test 216 "check lockless direct write updates file size and kms correctly"
15255 test_217() { # bug 22430
15256 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15261 for node in $(nodes_list); do
15262 nid=$(host_nids_address $node $NETTYPE)
15263 if [[ $nid = *-* ]] ; then
15264 echo "lctl ping $(h2nettype $nid)"
15265 lctl ping $(h2nettype $nid)
15267 echo "skipping $node (no hyphen detected)"
15271 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
15274 # do directio so as not to populate the page cache
15275 log "creating a 10 Mb file"
15276 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
15277 log "starting reads"
15278 dd if=$DIR/$tfile of=/dev/null bs=4096 &
15279 log "truncating the file"
15280 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
15282 kill %+ || true # reads might have finished
15283 echo "wait until dd is finished"
15285 log "removing the temporary file"
15286 rm -rf $DIR/$tfile || error "tmp file removal failed"
15288 run_test 218 "parallel read and truncate should not deadlock"
15291 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15293 # write one partial page
15294 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
15295 # set no grant so vvp_io_commit_write will do sync write
15296 $LCTL set_param fail_loc=0x411
15297 # write a full page at the end of file
15298 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
15300 $LCTL set_param fail_loc=0
15301 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
15302 $LCTL set_param fail_loc=0x411
15303 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
15306 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
15307 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
15309 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
15311 test_220() { #LU-325
15312 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15313 remote_ost_nodsh && skip "remote OST with nodsh"
15314 remote_mds_nodsh && skip "remote MDS with nodsh"
15315 remote_mgs_nodsh && skip "remote MGS with nodsh"
15319 # create on MDT0000 so the last_id and next_id are correct
15321 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
15325 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
15326 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
15327 osp.$mdtosc_proc1.prealloc_last_id)
15328 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15329 osp.$mdtosc_proc1.prealloc_next_id)
15333 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15334 #define OBD_FAIL_OST_ENOINO 0x229
15335 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15336 create_pool $FSNAME.$TESTNAME || return 1
15337 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15339 $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15341 MDSOBJS=$((last_id - next_id))
15342 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15344 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15345 echo "OST still has $count kbytes free"
15347 echo "create $MDSOBJS files @next_id..."
15348 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15350 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15351 osp.$mdtosc_proc1.prealloc_last_id)
15352 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15353 osp.$mdtosc_proc1.prealloc_next_id)
15355 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15360 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15361 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15363 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15364 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15365 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15366 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15367 echo "unlink $MDSOBJS files @$next_id..."
15368 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15370 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15373 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15375 dd if=`which date` of=$MOUNT/date oflag=sync
15376 chmod +x $MOUNT/date
15378 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15379 $LCTL set_param fail_loc=0x80001401
15381 $MOUNT/date > /dev/null
15384 run_test 221 "make sure fault and truncate race to not cause OOM"
15387 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15390 test_mkdir $DIR/$tdir
15391 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15392 createmany -o $DIR/$tdir/$tfile 10
15393 cancel_lru_locks mdc
15394 cancel_lru_locks osc
15395 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15396 $LCTL set_param fail_loc=0x31a
15397 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15398 $LCTL set_param fail_loc=0
15401 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15404 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15407 test_mkdir $DIR/$tdir
15408 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15409 createmany -o $DIR/$tdir/$tfile 10
15410 cancel_lru_locks mdc
15411 cancel_lru_locks osc
15412 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15413 $LCTL set_param fail_loc=0x31a
15414 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15415 $LCTL set_param fail_loc=0
15417 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15420 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15423 test_mkdir $DIR/$tdir
15424 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15425 createmany -o $DIR/$tdir/$tfile 10
15426 cancel_lru_locks mdc
15427 cancel_lru_locks osc
15428 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15429 $LCTL set_param fail_loc=0x31b
15430 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15431 $LCTL set_param fail_loc=0
15434 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15436 test_224a() { # LU-1039, MRP-303
15437 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15439 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15440 $LCTL set_param fail_loc=0x508
15441 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15442 $LCTL set_param fail_loc=0
15445 run_test 224a "Don't panic on bulk IO failure"
15447 test_224b() { # LU-1039, MRP-303
15448 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15450 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15451 cancel_lru_locks osc
15452 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15453 $LCTL set_param fail_loc=0x515
15454 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15455 $LCTL set_param fail_loc=0
15458 run_test 224b "Don't panic on bulk IO failure"
15460 test_224c() { # LU-6441
15461 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15462 remote_mds_nodsh && skip "remote MDS with nodsh"
15464 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15465 save_writethrough $p
15466 set_cache writethrough on
15468 local pages_per_rpc=$($LCTL get_param \
15469 osc.*.max_pages_per_rpc)
15470 local at_max=$($LCTL get_param -n at_max)
15471 local timeout=$($LCTL get_param -n timeout)
15472 local test_at="at_max"
15473 local param_at="$FSNAME.sys.at_max"
15474 local test_timeout="timeout"
15475 local param_timeout="$FSNAME.sys.timeout"
15477 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
15479 set_persistent_param_and_check client "$test_at" "$param_at" 0
15480 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
15482 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
15483 do_facet ost1 $LCTL set_param fail_loc=0x520
15484 $LFS setstripe -c 1 -i 0 $DIR/$tfile
15485 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
15487 do_facet ost1 $LCTL set_param fail_loc=0
15489 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
15490 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
15493 $LCTL set_param -n $pages_per_rpc
15494 restore_lustre_params < $p
15497 run_test 224c "Don't hang if one of md lost during large bulk RPC"
15499 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
15501 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15502 if [ -z ${MDSSURVEY} ]; then
15503 skip_env "mds-survey not found"
15505 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15506 skip "Need MDS version at least 2.2.51"
15508 local mds=$(facet_host $SINGLEMDS)
15509 local target=$(do_nodes $mds 'lctl dl' |
15510 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15512 local cmd1="file_count=1000 thrhi=4"
15513 local cmd2="dir_count=2 layer=mdd stripe_count=0"
15514 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15515 local cmd="$cmd1 $cmd2 $cmd3"
15517 rm -f ${TMP}/mds_survey*
15519 eval $cmd || error "mds-survey with zero-stripe failed"
15520 cat ${TMP}/mds_survey*
15521 rm -f ${TMP}/mds_survey*
15523 run_test 225a "Metadata survey sanity with zero-stripe"
15526 if [ -z ${MDSSURVEY} ]; then
15527 skip_env "mds-survey not found"
15529 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15530 skip "Need MDS version at least 2.2.51"
15531 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15532 remote_mds_nodsh && skip "remote MDS with nodsh"
15533 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
15534 skip_env "Need to mount OST to test"
15537 local mds=$(facet_host $SINGLEMDS)
15538 local target=$(do_nodes $mds 'lctl dl' |
15539 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15541 local cmd1="file_count=1000 thrhi=4"
15542 local cmd2="dir_count=2 layer=mdd stripe_count=1"
15543 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15544 local cmd="$cmd1 $cmd2 $cmd3"
15546 rm -f ${TMP}/mds_survey*
15548 eval $cmd || error "mds-survey with stripe_count failed"
15549 cat ${TMP}/mds_survey*
15550 rm -f ${TMP}/mds_survey*
15552 run_test 225b "Metadata survey sanity with stripe_count = 1"
15554 mcreate_path2fid () {
15560 local path=$DIR/$tdir/$name
15565 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
15566 error "cannot create $desc"
15568 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
15570 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
15572 fid_path=$($LFS fid2path $MOUNT $fid)
15574 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
15576 [ "$path" == "$fid_path" ] ||
15577 error "fid2path returned $fid_path, expected $path"
15579 echo "pass with $path and $fid"
15584 mkdir -p $DIR/$tdir
15586 mcreate_path2fid 0010666 0 0 fifo "FIFO"
15587 mcreate_path2fid 0020666 1 3 null "character special file (null)"
15588 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
15589 mcreate_path2fid 0040666 0 0 dir "directory"
15590 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
15591 mcreate_path2fid 0100666 0 0 file "regular file"
15592 mcreate_path2fid 0120666 0 0 link "symbolic link"
15593 mcreate_path2fid 0140666 0 0 sock "socket"
15595 run_test 226a "call path2fid and fid2path on files of all type"
15598 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15603 mkdir -p $DIR/$tdir
15604 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
15605 error "create remote directory failed"
15606 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
15607 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
15608 "character special file (null)"
15609 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
15610 "character special file (no device)"
15611 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
15612 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
15613 "block special file (loop)"
15614 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
15615 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
15616 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
15618 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
15620 # LU-1299 Executing or running ldd on a truncated executable does not
15621 # cause an out-of-memory condition.
15623 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15624 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
15626 dd if=$(which date) of=$MOUNT/date bs=1k count=1
15627 chmod +x $MOUNT/date
15629 $MOUNT/date > /dev/null
15630 ldd $MOUNT/date > /dev/null
15633 run_test 227 "running truncated executable does not cause OOM"
15635 # LU-1512 try to reuse idle OI blocks
15637 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15638 remote_mds_nodsh && skip "remote MDS with nodsh"
15639 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15641 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15642 local myDIR=$DIR/$tdir
15645 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15646 $LCTL set_param fail_loc=0x80001002
15647 createmany -o $myDIR/t- 10000
15648 $LCTL set_param fail_loc=0
15649 # The guard is current the largest FID holder
15651 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15653 local IDX=$(($SEQ % 64))
15655 do_facet $SINGLEMDS sync
15656 # Make sure journal flushed.
15658 local blk1=$(do_facet $SINGLEMDS \
15659 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15660 grep Blockcount | awk '{print $4}')
15662 # Remove old files, some OI blocks will become idle.
15663 unlinkmany $myDIR/t- 10000
15664 # Create new files, idle OI blocks should be reused.
15665 createmany -o $myDIR/t- 2000
15666 do_facet $SINGLEMDS sync
15667 # Make sure journal flushed.
15669 local blk2=$(do_facet $SINGLEMDS \
15670 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15671 grep Blockcount | awk '{print $4}')
15673 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15675 run_test 228a "try to reuse idle OI blocks"
15678 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15679 remote_mds_nodsh && skip "remote MDS with nodsh"
15680 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15682 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15683 local myDIR=$DIR/$tdir
15686 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15687 $LCTL set_param fail_loc=0x80001002
15688 createmany -o $myDIR/t- 10000
15689 $LCTL set_param fail_loc=0
15690 # The guard is current the largest FID holder
15692 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15694 local IDX=$(($SEQ % 64))
15696 do_facet $SINGLEMDS sync
15697 # Make sure journal flushed.
15699 local blk1=$(do_facet $SINGLEMDS \
15700 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15701 grep Blockcount | awk '{print $4}')
15703 # Remove old files, some OI blocks will become idle.
15704 unlinkmany $myDIR/t- 10000
15707 stop $SINGLEMDS || error "Fail to stop MDT."
15709 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
15711 df $MOUNT || error "Fail to df."
15712 # Create new files, idle OI blocks should be reused.
15713 createmany -o $myDIR/t- 2000
15714 do_facet $SINGLEMDS sync
15715 # Make sure journal flushed.
15717 local blk2=$(do_facet $SINGLEMDS \
15718 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15719 grep Blockcount | awk '{print $4}')
15721 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15723 run_test 228b "idle OI blocks can be reused after MDT restart"
15727 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15728 remote_mds_nodsh && skip "remote MDS with nodsh"
15729 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15731 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15732 local myDIR=$DIR/$tdir
15735 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15736 $LCTL set_param fail_loc=0x80001002
15737 # 20000 files can guarantee there are index nodes in the OI file
15738 createmany -o $myDIR/t- 20000
15739 $LCTL set_param fail_loc=0
15740 # The guard is current the largest FID holder
15742 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15744 local IDX=$(($SEQ % 64))
15746 do_facet $SINGLEMDS sync
15747 # Make sure journal flushed.
15749 local blk1=$(do_facet $SINGLEMDS \
15750 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15751 grep Blockcount | awk '{print $4}')
15753 # Remove old files, some OI blocks will become idle.
15754 unlinkmany $myDIR/t- 20000
15756 # The OI file should become empty now
15758 # Create new files, idle OI blocks should be reused.
15759 createmany -o $myDIR/t- 2000
15760 do_facet $SINGLEMDS sync
15761 # Make sure journal flushed.
15763 local blk2=$(do_facet $SINGLEMDS \
15764 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15765 grep Blockcount | awk '{print $4}')
15767 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15769 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
15771 test_229() { # LU-2482, LU-3448
15772 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15773 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
15774 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
15775 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
15779 # Create a file with a released layout and stripe count 2.
15780 $MULTIOP $DIR/$tfile H2c ||
15781 error "failed to create file with released layout"
15783 $GETSTRIPE -v $DIR/$tfile
15785 local pattern=$($GETSTRIPE -L $DIR/$tfile)
15786 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
15788 local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
15789 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
15790 stat $DIR/$tfile || error "failed to stat released file"
15792 chown $RUNAS_ID $DIR/$tfile ||
15793 error "chown $RUNAS_ID $DIR/$tfile failed"
15795 chgrp $RUNAS_ID $DIR/$tfile ||
15796 error "chgrp $RUNAS_ID $DIR/$tfile failed"
15798 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
15799 rm $DIR/$tfile || error "failed to remove released file"
15801 run_test 229 "getstripe/stat/rm/attr changes work on released files"
15804 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15805 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15806 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15807 skip "Need MDS version at least 2.11.52"
15811 test_mkdir $DIR/$tdir
15812 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
15813 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
15814 [ $mdt_idx -ne 0 ] &&
15815 error "create local directory on wrong MDT $mdt_idx"
15817 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
15818 error "create remote directory failed"
15819 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
15820 [ $mdt_idx -ne $MDTIDX ] &&
15821 error "create remote directory on wrong MDT $mdt_idx"
15823 createmany -o $DIR/$tdir/test_230/t- 10 ||
15824 error "create files on remote directory failed"
15825 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
15826 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
15827 rm -r $DIR/$tdir || error "unlink remote directory failed"
15829 run_test 230a "Create remote directory and files under the remote directory"
15832 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15833 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15834 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15835 skip "Need MDS version at least 2.11.52"
15843 local migrate_dir=$DIR/$tdir/migrate_dir
15844 local other_dir=$DIR/$tdir/other_dir
15846 test_mkdir $DIR/$tdir
15847 test_mkdir -i0 -c1 $migrate_dir
15848 test_mkdir -i0 -c1 $other_dir
15849 for ((i=0; i<10; i++)); do
15850 mkdir -p $migrate_dir/dir_${i}
15851 createmany -o $migrate_dir/dir_${i}/f 10 ||
15852 error "create files under remote dir failed $i"
15855 cp /etc/passwd $migrate_dir/$tfile
15856 cp /etc/passwd $other_dir/$tfile
15857 chattr +SAD $migrate_dir
15858 chattr +SAD $migrate_dir/$tfile
15860 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15861 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15862 local old_dir_mode=$(stat -c%f $migrate_dir)
15863 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
15865 mkdir -p $migrate_dir/dir_default_stripe2
15866 $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2
15867 $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2
15869 mkdir -p $other_dir
15870 ln $migrate_dir/$tfile $other_dir/luna
15871 ln $migrate_dir/$tfile $migrate_dir/sofia
15872 ln $other_dir/$tfile $migrate_dir/david
15873 ln -s $migrate_dir/$tfile $other_dir/zachary
15874 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
15875 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
15881 for len in 58 59 60; do
15882 lnktgt=$(str_repeat 'l' $len)
15883 touch $migrate_dir/$lnktgt
15884 ln -s $lnktgt $migrate_dir/${len}char_ln
15888 for len in 4094 4095; do
15889 lnktgt=$(str_repeat 'l' $len)
15890 ln -s $lnktgt $migrate_dir/${len}char_ln
15894 for len in 254 255; do
15895 touch $migrate_dir/$(str_repeat 'l' $len)
15898 $LFS migrate -m $MDTIDX $migrate_dir ||
15899 error "fails on migrating remote dir to MDT1"
15901 echo "migratate to MDT1, then checking.."
15902 for ((i = 0; i < 10; i++)); do
15903 for file in $(find $migrate_dir/dir_${i}); do
15904 mdt_index=$($LFS getstripe -m $file)
15905 # broken symlink getstripe will fail
15906 [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
15907 error "$file is not on MDT${MDTIDX}"
15911 # the multiple link file should still in MDT0
15912 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
15913 [ $mdt_index == 0 ] ||
15914 error "$file is not on MDT${MDTIDX}"
15916 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15917 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15918 error " expect $old_dir_flag get $new_dir_flag"
15920 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15921 [ "$old_file_flag" = "$new_file_flag" ] ||
15922 error " expect $old_file_flag get $new_file_flag"
15924 local new_dir_mode=$(stat -c%f $migrate_dir)
15925 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15926 error "expect mode $old_dir_mode get $new_dir_mode"
15928 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15929 [ "$old_file_mode" = "$new_file_mode" ] ||
15930 error "expect mode $old_file_mode get $new_file_mode"
15932 diff /etc/passwd $migrate_dir/$tfile ||
15933 error "$tfile different after migration"
15935 diff /etc/passwd $other_dir/luna ||
15936 error "luna different after migration"
15938 diff /etc/passwd $migrate_dir/sofia ||
15939 error "sofia different after migration"
15941 diff /etc/passwd $migrate_dir/david ||
15942 error "david different after migration"
15944 diff /etc/passwd $other_dir/zachary ||
15945 error "zachary different after migration"
15947 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15948 error "${tfile}_ln different after migration"
15950 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15951 error "${tfile}_ln_other different after migration"
15953 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
15954 [ $stripe_count = 2 ] ||
15955 error "dir strpe_count $d != 2 after migration."
15957 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
15958 [ $stripe_count = 2 ] ||
15959 error "file strpe_count $d != 2 after migration."
15961 #migrate back to MDT0
15964 $LFS migrate -m $MDTIDX $migrate_dir ||
15965 error "fails on migrating remote dir to MDT0"
15967 echo "migrate back to MDT0, checking.."
15968 for file in $(find $migrate_dir); do
15969 mdt_index=$($LFS getstripe -m $file)
15970 [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
15971 error "$file is not on MDT${MDTIDX}"
15974 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15975 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15976 error " expect $old_dir_flag get $new_dir_flag"
15978 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15979 [ "$old_file_flag" = "$new_file_flag" ] ||
15980 error " expect $old_file_flag get $new_file_flag"
15982 local new_dir_mode=$(stat -c%f $migrate_dir)
15983 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15984 error "expect mode $old_dir_mode get $new_dir_mode"
15986 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15987 [ "$old_file_mode" = "$new_file_mode" ] ||
15988 error "expect mode $old_file_mode get $new_file_mode"
15990 diff /etc/passwd ${migrate_dir}/$tfile ||
15991 error "$tfile different after migration"
15993 diff /etc/passwd ${other_dir}/luna ||
15994 error "luna different after migration"
15996 diff /etc/passwd ${migrate_dir}/sofia ||
15997 error "sofia different after migration"
15999 diff /etc/passwd ${other_dir}/zachary ||
16000 error "zachary different after migration"
16002 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16003 error "${tfile}_ln different after migration"
16005 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16006 error "${tfile}_ln_other different after migration"
16008 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
16009 [ $stripe_count = 2 ] ||
16010 error "dir strpe_count $d != 2 after migration."
16012 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
16013 [ $stripe_count = 2 ] ||
16014 error "file strpe_count $d != 2 after migration."
16016 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16018 run_test 230b "migrate directory"
16021 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16022 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16023 remote_mds_nodsh && skip "remote MDS with nodsh"
16024 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16025 skip "Need MDS version at least 2.11.52"
16031 local migrate_dir=$DIR/$tdir/migrate_dir
16033 #If migrating directory fails in the middle, all entries of
16034 #the directory is still accessiable.
16035 test_mkdir $DIR/$tdir
16036 test_mkdir -i0 -c1 $migrate_dir
16037 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
16039 createmany -o $migrate_dir/f $total ||
16040 error "create files under ${migrate_dir} failed"
16042 # fail after migrating top dir, and this will fail only once, so the
16043 # first sub file migration will fail (currently f3), others succeed.
16044 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
16045 do_facet mds1 lctl set_param fail_loc=0x1801
16046 local t=$(ls $migrate_dir | wc -l)
16047 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
16048 error "migrate should fail"
16049 local u=$(ls $migrate_dir | wc -l)
16050 [ "$u" == "$t" ] || error "$u != $t during migration"
16052 # add new dir/file should succeed
16053 mkdir $migrate_dir/dir ||
16054 error "mkdir failed under migrating directory"
16055 touch $migrate_dir/file ||
16056 error "create file failed under migrating directory"
16058 # add file with existing name should fail
16059 for file in $migrate_dir/f*; do
16060 stat $file > /dev/null || error "stat $file failed"
16061 $OPENFILE -f O_CREAT:O_EXCL $file &&
16062 error "open(O_CREAT|O_EXCL) $file should fail"
16063 $MULTIOP $file m && error "create $file should fail"
16064 touch $DIR/$tdir/remote_dir/$tfile ||
16065 error "touch $tfile failed"
16066 ln $DIR/$tdir/remote_dir/$tfile $file &&
16067 error "link $file should fail"
16068 mdt_index=$($LFS getstripe -m $file)
16069 if [ $mdt_index == 0 ]; then
16070 # file failed to migrate is not allowed to rename to
16071 mv $DIR/$tdir/remote_dir/$tfile $file &&
16072 error "rename to $file should fail"
16074 mv $DIR/$tdir/remote_dir/$tfile $file ||
16075 error "rename to $file failed"
16077 echo hello >> $file || error "write $file failed"
16080 # resume migration with different options should fail
16081 $LFS migrate -m 0 $migrate_dir &&
16082 error "migrate -m 0 $migrate_dir should fail"
16084 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
16085 error "migrate -c 2 $migrate_dir should fail"
16087 # resume migration should succeed
16088 $LFS migrate -m $MDTIDX $migrate_dir ||
16089 error "migrate $migrate_dir failed"
16091 echo "Finish migration, then checking.."
16092 for file in $(find $migrate_dir); do
16093 mdt_index=$($LFS getstripe -m $file)
16094 [ $mdt_index == $MDTIDX ] ||
16095 error "$file is not on MDT${MDTIDX}"
16098 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16100 run_test 230c "check directory accessiblity if migration failed"
16103 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16104 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16105 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16106 skip "Need MDS version at least 2.11.52"
16108 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
16110 local migrate_dir=$DIR/$tdir/migrate_dir
16120 old_index=$((RANDOM % MDSCOUNT))
16121 old_count=$((MDSCOUNT - old_index))
16122 new_index=$((RANDOM % MDSCOUNT))
16123 new_count=$((MDSCOUNT - new_index))
16124 new_hash="all_char"
16126 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
16127 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
16129 test_mkdir $DIR/$tdir
16130 test_mkdir -i $old_index -c $old_count $migrate_dir
16132 for ((i=0; i<100; i++)); do
16133 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
16134 createmany -o $migrate_dir/dir_${i}/f 100 ||
16135 error "create files under remote dir failed $i"
16138 echo -n "Migrate from MDT$old_index "
16139 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
16140 echo -n "to MDT$new_index"
16141 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
16144 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
16145 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
16146 error "migrate remote dir error"
16148 echo "Finish migration, then checking.."
16149 for file in $(find $migrate_dir); do
16150 mdt_index=$($LFS getstripe -m $file)
16151 if [ $mdt_index -lt $new_index ] ||
16152 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
16153 error "$file is on MDT$mdt_index"
16157 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16159 run_test 230d "check migrate big directory"
16162 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16163 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16164 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16165 skip "Need MDS version at least 2.11.52"
16172 mkdir -p $DIR/$tdir
16173 mkdir $DIR/$tdir/migrate_dir
16174 mkdir $DIR/$tdir/other_dir
16175 touch $DIR/$tdir/migrate_dir/a
16176 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
16177 ls $DIR/$tdir/other_dir
16179 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16180 error "migrate dir fails"
16182 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16183 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16185 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16186 [ $mdt_index == 0 ] || error "a is not on MDT0"
16188 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
16189 error "migrate dir fails"
16191 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
16192 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
16194 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16195 [ $mdt_index == 1 ] || error "a is not on MDT1"
16197 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
16198 [ $mdt_index == 1 ] || error "b is not on MDT1"
16200 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16201 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
16203 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
16205 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16207 run_test 230e "migrate mulitple local link files"
16210 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16211 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16212 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16213 skip "Need MDS version at least 2.11.52"
16218 mkdir -p $DIR/$tdir
16219 mkdir $DIR/$tdir/migrate_dir
16220 $LFS mkdir -i1 $DIR/$tdir/other_dir
16221 touch $DIR/$tdir/migrate_dir/a
16222 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
16223 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
16224 ls $DIR/$tdir/other_dir
16226 # a should be migrated to MDT1, since no other links on MDT0
16227 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16228 error "#1 migrate dir fails"
16229 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16230 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16231 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16232 [ $mdt_index == 1 ] || error "a is not on MDT1"
16234 # a should stay on MDT1, because it is a mulitple link file
16235 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16236 error "#2 migrate dir fails"
16237 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16238 [ $mdt_index == 1 ] || error "a is not on MDT1"
16240 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16241 error "#3 migrate dir fails"
16243 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16244 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
16245 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
16247 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
16248 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
16250 # a should be migrated to MDT0, since no other links on MDT1
16251 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16252 error "#4 migrate dir fails"
16253 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16254 [ $mdt_index == 0 ] || error "a is not on MDT0"
16256 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16258 run_test 230f "migrate mulitple remote link files"
16261 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16262 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16263 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16264 skip "Need MDS version at least 2.11.52"
16266 mkdir -p $DIR/$tdir/migrate_dir
16268 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
16269 error "migrating dir to non-exist MDT succeeds"
16272 run_test 230g "migrate dir to non-exist MDT"
16275 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16276 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16277 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16278 skip "Need MDS version at least 2.11.52"
16282 mkdir -p $DIR/$tdir/migrate_dir
16284 $LFS migrate -m1 $DIR &&
16285 error "migrating mountpoint1 should fail"
16287 $LFS migrate -m1 $DIR/$tdir/.. &&
16288 error "migrating mountpoint2 should fail"
16291 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
16292 error "migrating $tdir/migrate_dir/.. should fail"
16296 run_test 230h "migrate .. and root"
16299 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16300 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16301 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16302 skip "Need MDS version at least 2.11.52"
16304 mkdir -p $DIR/$tdir/migrate_dir
16306 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
16307 error "migration fails with a tailing slash"
16309 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
16310 error "migration fails with two tailing slashes"
16312 run_test 230i "lfs migrate -m tolerates trailing slashes"
16315 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16316 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16317 skip "Need MDS version at least 2.11.52"
16319 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
16320 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
16321 error "create $tfile failed"
16322 cat /etc/passwd > $DIR/$tdir/$tfile
16324 $LFS migrate -m 1 $DIR/$tdir
16326 cmp /etc/passwd $DIR/$tdir/$tfile ||
16327 error "DoM file mismatch after migration"
16329 run_test 230j "DoM file data not changed after dir migration"
16332 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
16333 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16334 skip "Need MDS version at least 2.11.56"
16337 local files_on_starting_mdt=0
16339 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
16340 $LFS getdirstripe $DIR/$tdir
16341 for i in $(seq $total); do
16342 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
16343 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16344 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16347 echo "$files_on_starting_mdt files on MDT0"
16349 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
16350 $LFS getdirstripe $DIR/$tdir
16352 files_on_starting_mdt=0
16353 for i in $(seq $total); do
16354 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16355 error "file $tfile.$i mismatch after migration"
16356 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16357 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16360 echo "$files_on_starting_mdt files on MDT1 after migration"
16361 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16363 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16364 $LFS getdirstripe $DIR/$tdir
16366 files_on_starting_mdt=0
16367 for i in $(seq $total); do
16368 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16369 error "file $tfile.$i mismatch after 2nd migration"
16370 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16371 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16374 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
16375 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16379 run_test 230k "file data not changed after dir migration"
16382 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16383 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16384 skip "Need MDS version at least 2.11.56"
16386 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16387 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16388 error "create files under remote dir failed $i"
16389 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16391 run_test 230l "readdir between MDTs won't crash"
16394 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16395 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16396 skip "Need MDS version at least 2.11.56"
16399 local mig_dir=$DIR/$tdir/migrate_dir
16400 local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16404 echo "Creating files and dirs with xattrs"
16405 test_mkdir $DIR/$tdir
16406 test_mkdir -i0 -c1 $mig_dir
16408 setfattr -n user.attr1 -v $longstr $mig_dir/dir ||
16409 error "cannot set xattr attr1 on dir"
16410 setfattr -n user.attr2 -v $shortstr $mig_dir/dir ||
16411 error "cannot set xattr attr2 on dir"
16412 touch $mig_dir/dir/f0
16413 setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 ||
16414 error "cannot set xattr attr1 on file"
16415 setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 ||
16416 error "cannot set xattr attr2 on file"
16417 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16418 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16419 [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir"
16420 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16421 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir"
16422 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16423 [ "$val" = $longstr ] || error "xattr attr1 not set properly on file"
16424 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16425 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file"
16427 echo "Migrating to MDT1"
16428 $LFS migrate -m $MDTIDX $mig_dir ||
16429 error "fails on migrating dir to MDT1"
16431 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16432 echo "Checking xattrs"
16433 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16434 [ "$val" = $longstr ] ||
16435 error "expecting xattr1 $longstr on dir, found $val"
16436 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16437 [ "$val" = $shortstr ] ||
16438 error "expecting xattr2 $shortstr on dir, found $val"
16439 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16440 [ "$val" = $longstr ] ||
16441 error "expecting xattr1 $longstr on file, found $val"
16442 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16443 [ "$val" = $shortstr ] ||
16444 error "expecting xattr2 $shortstr on file, found $val"
16446 run_test 230m "xattrs not changed after dir migration"
16450 # For simplicity this test assumes that max_pages_per_rpc
16451 # is the same across all OSCs
16452 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16453 local bulk_size=$((max_pages * PAGE_SIZE))
16454 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16457 mkdir -p $DIR/$tdir
16458 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16459 error "failed to set stripe with -S ${brw_size}M option"
16461 # clear the OSC stats
16462 $LCTL set_param osc.*.stats=0 &>/dev/null
16465 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16466 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16467 oflag=direct &>/dev/null || error "dd failed"
16469 sync; sleep 1; sync # just to be safe
16470 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16471 if [ x$nrpcs != "x1" ]; then
16472 $LCTL get_param osc.*.stats
16473 error "found $nrpcs ost_write RPCs, not 1 as expected"
16477 # Drop the OSC cache, otherwise we will read from it
16478 cancel_lru_locks osc
16480 # clear the OSC stats
16481 $LCTL set_param osc.*.stats=0 &>/dev/null
16483 # Client reads $bulk_size.
16484 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16485 iflag=direct &>/dev/null || error "dd failed"
16487 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16488 if [ x$nrpcs != "x1" ]; then
16489 $LCTL get_param osc.*.stats
16490 error "found $nrpcs ost_read RPCs, not 1 as expected"
16493 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16496 mkdir -p $DIR/$tdir
16498 for i in {0..1023}; do
16499 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16500 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16501 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16505 run_test 231b "must not assert on fully utilized OST request buffer"
16508 mkdir -p $DIR/$tdir
16509 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16511 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16512 do_facet ost1 $LCTL set_param fail_loc=0x31c
16514 # ignore dd failure
16515 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16517 do_facet ost1 $LCTL set_param fail_loc=0
16518 umount_client $MOUNT || error "umount failed"
16519 mount_client $MOUNT || error "mount failed"
16520 stop ost1 || error "cannot stop ost1"
16521 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16523 run_test 232a "failed lock should not block umount"
16526 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16527 skip "Need MDS version at least 2.10.58"
16529 mkdir -p $DIR/$tdir
16530 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16531 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16533 cancel_lru_locks osc
16535 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16536 do_facet ost1 $LCTL set_param fail_loc=0x31c
16539 $LFS data_version $DIR/$tdir/$tfile || true
16541 do_facet ost1 $LCTL set_param fail_loc=0
16542 umount_client $MOUNT || error "umount failed"
16543 mount_client $MOUNT || error "mount failed"
16544 stop ost1 || error "cannot stop ost1"
16545 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16547 run_test 232b "failed data version lock should not block umount"
16550 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
16551 skip "Need MDS version at least 2.3.64"
16552 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16554 local fid=$($LFS path2fid $MOUNT)
16556 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16557 error "cannot access $MOUNT using its FID '$fid'"
16559 run_test 233a "checking that OBF of the FS root succeeds"
16562 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
16563 skip "Need MDS version at least 2.5.90"
16564 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16566 local fid=$($LFS path2fid $MOUNT/.lustre)
16568 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16569 error "cannot access $MOUNT/.lustre using its FID '$fid'"
16571 fid=$($LFS path2fid $MOUNT/.lustre/fid)
16572 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16573 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
16575 run_test 233b "checking that OBF of the FS .lustre succeeds"
16578 local p="$TMP/sanityN-$TESTNAME.parameters"
16579 save_lustre_params client "llite.*.xattr_cache" > $p
16580 lctl set_param llite.*.xattr_cache 1 ||
16581 skip_env "xattr cache is not supported"
16583 mkdir -p $DIR/$tdir || error "mkdir failed"
16584 touch $DIR/$tdir/$tfile || error "touch failed"
16585 # OBD_FAIL_LLITE_XATTR_ENOMEM
16586 $LCTL set_param fail_loc=0x1405
16587 getfattr -n user.attr $DIR/$tdir/$tfile &&
16588 error "getfattr should have failed with ENOMEM"
16589 $LCTL set_param fail_loc=0x0
16592 restore_lustre_params < $p
16595 run_test 234 "xattr cache should not crash on ENOMEM"
16598 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
16599 skip "Need MDS version at least 2.4.52"
16601 flock_deadlock $DIR/$tfile
16606 124) error "process hangs on a deadlock"
16608 *) error "error executing flock_deadlock $DIR/$tfile"
16612 run_test 235 "LU-1715: flock deadlock detection does not work properly"
16616 check_swap_layouts_support
16618 local ref1=/etc/passwd
16619 local ref2=/etc/group
16620 local file1=$DIR/$tdir/f1
16621 local file2=$DIR/$tdir/f2
16623 test_mkdir -c1 $DIR/$tdir
16624 $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
16625 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
16626 $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
16627 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
16628 local fd=$(free_fd)
16629 local cmd="exec $fd<>$file2"
16632 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
16633 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
16636 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
16641 run_test 236 "Layout swap on open unlinked file"
16643 # LU-4659 linkea consistency
16645 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
16646 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
16647 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
16648 skip "Need MDS version at least 2.5.58 or 2.5.2+"
16651 ln $DIR/$tfile $DIR/$tfile.lnk
16652 touch $DIR/$tfile.new
16653 mv $DIR/$tfile.new $DIR/$tfile
16654 local fid1=$($LFS path2fid $DIR/$tfile)
16655 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
16656 local path1=$($LFS fid2path $FSNAME "$fid1")
16657 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
16658 local path2=$($LFS fid2path $FSNAME "$fid2")
16659 [ $tfile.lnk == $path2 ] ||
16660 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
16663 run_test 238 "Verify linkea consistency"
16665 test_239A() { # was test_239
16666 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
16667 skip "Need MDS version at least 2.5.60"
16669 local list=$(comma_list $(mdts_nodes))
16671 mkdir -p $DIR/$tdir
16672 createmany -o $DIR/$tdir/f- 5000
16673 unlinkmany $DIR/$tdir/f- 5000
16674 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
16675 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
16676 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
16677 osp.*MDT*.sync_in_flight" | calc_sum)
16678 [ "$changes" -eq 0 ] || error "$changes not synced"
16680 run_test 239A "osp_sync test"
16682 test_239a() { #LU-5297
16683 remote_mds_nodsh && skip "remote MDS with nodsh"
16686 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
16687 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
16688 chgrp $RUNAS_GID $DIR/$tfile
16689 wait_delete_completed
16691 run_test 239a "process invalid osp sync record correctly"
16693 test_239b() { #LU-5297
16694 remote_mds_nodsh && skip "remote MDS with nodsh"
16697 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
16698 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
16699 chgrp $RUNAS_GID $DIR/$tfile1
16700 wait_delete_completed
16701 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
16703 chgrp $RUNAS_GID $DIR/$tfile2
16704 wait_delete_completed
16706 run_test 239b "process osp sync record with ENOMEM error correctly"
16709 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16710 remote_mds_nodsh && skip "remote MDS with nodsh"
16712 mkdir -p $DIR/$tdir
16714 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
16715 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
16716 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
16717 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
16719 umount_client $MOUNT || error "umount failed"
16720 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
16721 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
16722 mount_client $MOUNT || error "failed to mount client"
16724 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
16725 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
16727 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
16733 for LOOP in $(seq $count); do
16734 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
16735 cancel_lru_locks $OSC || true
16743 for LOOP in $(seq $1); do
16744 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
16749 test_241a() { # was test_241
16750 local bsize=$PAGE_SIZE
16752 (( bsize < 40960 )) && bsize=40960
16753 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16755 cancel_lru_locks $OSC
16756 test_241_bio 1000 $bsize &
16758 test_241_dio 1000 $bsize
16761 run_test 241a "bio vs dio"
16764 local bsize=$PAGE_SIZE
16766 (( bsize < 40960 )) && bsize=40960
16767 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16769 test_241_dio 1000 $bsize &
16771 test_241_dio 1000 $bsize
16774 run_test 241b "dio vs dio"
16777 remote_mds_nodsh && skip "remote MDS with nodsh"
16779 mkdir -p $DIR/$tdir
16780 touch $DIR/$tdir/$tfile
16782 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
16783 do_facet mds1 lctl set_param fail_loc=0x105
16784 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
16786 do_facet mds1 lctl set_param fail_loc=0
16787 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
16789 run_test 242 "mdt_readpage failure should not cause directory unreadable"
16793 test_mkdir $DIR/$tdir
16794 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
16796 run_test 243 "various group lock tests"
16800 test_mkdir $DIR/$tdir
16801 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
16802 sendfile_grouplock $DIR/$tdir/$tfile || \
16803 error "sendfile+grouplock failed"
16806 run_test 244 "sendfile with group lock tests"
16809 local flagname="multi_mod_rpcs"
16810 local connect_data_name="max_mod_rpcs"
16813 # check if multiple modify RPCs flag is set
16814 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
16815 grep "connect_flags:")
16818 echo "$out" | grep -qw $flagname
16819 if [ $? -ne 0 ]; then
16820 echo "connect flag $flagname is not set"
16824 # check if multiple modify RPCs data is set
16825 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
16828 echo "$out" | grep -qw $connect_data_name ||
16829 error "import should have connect data $connect_data_name"
16831 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
16833 test_246() { # LU-7371
16834 remote_ost_nodsh && skip "remote OST with nodsh"
16835 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
16836 skip "Need OST version >= 2.7.62"
16838 do_facet ost1 $LCTL set_param fail_val=4095
16839 #define OBD_FAIL_OST_READ_SIZE 0x234
16840 do_facet ost1 $LCTL set_param fail_loc=0x234
16841 $LFS setstripe $DIR/$tfile -i 0 -c 1
16842 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
16843 cancel_lru_locks $FSNAME-OST0000
16844 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
16846 run_test 246 "Read file of size 4095 should return right length"
16852 umount_client $submount
16857 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16859 skip_env "Fileset feature is not supported"
16861 local submount=${MOUNT}_$tdir
16864 mkdir -p $submount || error "mkdir $submount failed"
16865 FILESET="$FILESET/$tdir" mount_client $submount ||
16866 error "mount $submount failed"
16867 trap "cleanup_247 $submount" EXIT
16868 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
16869 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
16870 error "read $MOUNT/$tdir/$tfile failed"
16871 cleanup_247 $submount
16873 run_test 247a "mount subdir as fileset"
16876 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16877 skip_env "Fileset feature is not supported"
16879 local submount=${MOUNT}_$tdir
16881 rm -rf $MOUNT/$tdir
16882 mkdir -p $submount || error "mkdir $submount failed"
16884 FILESET="$FILESET/$tdir" mount_client $submount &&
16885 error "mount $submount should fail"
16888 run_test 247b "mount subdir that dose not exist"
16891 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16892 skip_env "Fileset feature is not supported"
16894 local submount=${MOUNT}_$tdir
16896 mkdir -p $MOUNT/$tdir/dir1
16897 mkdir -p $submount || error "mkdir $submount failed"
16898 trap "cleanup_247 $submount" EXIT
16899 FILESET="$FILESET/$tdir" mount_client $submount ||
16900 error "mount $submount failed"
16901 local fid=$($LFS path2fid $MOUNT/)
16902 $LFS fid2path $submount $fid && error "fid2path should fail"
16903 cleanup_247 $submount
16905 run_test 247c "running fid2path outside root"
16908 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16909 skip "Fileset feature is not supported"
16911 local submount=${MOUNT}_$tdir
16913 mkdir -p $MOUNT/$tdir/dir1
16914 mkdir -p $submount || error "mkdir $submount failed"
16915 FILESET="$FILESET/$tdir" mount_client $submount ||
16916 error "mount $submount failed"
16917 trap "cleanup_247 $submount" EXIT
16918 local fid=$($LFS path2fid $submount/dir1)
16919 $LFS fid2path $submount $fid || error "fid2path should succeed"
16920 cleanup_247 $submount
16922 run_test 247d "running fid2path inside root"
16926 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16928 skip "Fileset feature is not supported"
16930 local submount=${MOUNT}_$tdir
16933 mkdir -p $submount || error "mkdir $submount failed"
16934 FILESET="$FILESET/.." mount_client $submount &&
16935 error "mount $submount should fail"
16938 run_test 247e "mount .. as fileset"
16941 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
16942 [ -z "$fast_read_sav" ] && skip "no fast read support"
16944 # create a large file for fast read verification
16945 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
16947 # make sure the file is created correctly
16948 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
16949 { rm -f $DIR/$tfile; skip "file creation error"; }
16951 echo "Test 1: verify that fast read is 4 times faster on cache read"
16953 # small read with fast read enabled
16954 $LCTL set_param -n llite.*.fast_read=1
16955 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16956 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16957 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16958 # small read with fast read disabled
16959 $LCTL set_param -n llite.*.fast_read=0
16960 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16961 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16962 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16964 # verify that fast read is 4 times faster for cache read
16965 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
16966 error_not_in_vm "fast read was not 4 times faster: " \
16967 "$t_fast vs $t_slow"
16969 echo "Test 2: verify the performance between big and small read"
16970 $LCTL set_param -n llite.*.fast_read=1
16972 # 1k non-cache read
16973 cancel_lru_locks osc
16974 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16975 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16976 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16978 # 1M non-cache read
16979 cancel_lru_locks osc
16980 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16981 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16982 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16984 # verify that big IO is not 4 times faster than small IO
16985 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
16986 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
16988 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
16991 run_test 248 "fast read verification"
16993 test_249() { # LU-7890
16994 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
16995 skip "Need at least version 2.8.54"
16998 $SETSTRIPE -c 1 $DIR/$tfile
16999 # Offset 2T == 4k * 512M
17000 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
17001 error "dd to 2T offset failed"
17003 run_test 249 "Write above 2T file size"
17006 [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
17007 && skip "no 16TB file size limit on ZFS"
17009 $SETSTRIPE -c 1 $DIR/$tfile
17010 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
17011 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
17012 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
17013 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
17014 conv=notrunc,fsync && error "append succeeded"
17017 run_test 250 "Write above 16T limit"
17020 $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile
17022 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
17023 #Skip once - writing the first stripe will succeed
17024 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17025 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
17026 error "short write happened"
17028 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17029 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
17030 error "short read happened"
17034 run_test 251 "Handling short read and write correctly"
17037 remote_mds_nodsh && skip "remote MDS with nodsh"
17038 remote_ost_nodsh && skip "remote OST with nodsh"
17039 if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then
17040 skip_env "ldiskfs only test"
17050 # check lr_reader on OST0000
17052 dev=$(facet_device $tgt)
17053 out=$(do_facet $tgt $LR_READER $dev)
17054 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17056 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
17057 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
17058 error "Invalid uuid returned by $LR_READER on target $tgt"
17059 echo -e "uuid returned by $LR_READER is '$uuid'\n"
17061 # check lr_reader -c on MDT0000
17063 dev=$(facet_device $tgt)
17064 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
17065 skip "$LR_READER does not support additional options"
17067 out=$(do_facet $tgt $LR_READER -c $dev)
17068 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17070 num=$(echo "$out" | grep -c "mdtlov")
17071 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
17072 error "Invalid number of mdtlov clients returned by $LR_READER"
17073 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
17075 # check lr_reader -cr on MDT0000
17076 out=$(do_facet $tgt $LR_READER -cr $dev)
17077 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17079 echo "$out" | grep -q "^reply_data:$" ||
17080 error "$LR_READER should have returned 'reply_data' section"
17081 num=$(echo "$out" | grep -c "client_generation")
17082 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
17084 run_test 252 "check lr_reader tool"
17086 test_253_fill_ost() {
17087 local size_mb #how many MB should we write to pass watermark
17088 local lwm=$3 #low watermark
17089 local free_10mb #10% of free space
17091 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17092 size_mb=$((free_kb / 1024 - lwm))
17093 free_10mb=$((free_kb / 10240))
17094 #If 10% of free space cross low watermark use it
17095 if (( free_10mb > size_mb )); then
17098 #At least we need to store 1.1 of difference between
17099 #free space and low watermark
17100 size_mb=$((size_mb + size_mb / 10))
17102 if (( lwm <= $((free_kb / 1024)) )) || [ ! -f $DIR/$tdir/1 ]; then
17103 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M count=$size_mb \
17104 oflag=append conv=notrunc
17109 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17110 echo "OST still has $((free_kb / 1024)) mbytes free"
17114 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17115 remote_mds_nodsh && skip "remote MDS with nodsh"
17116 remote_mgs_nodsh && skip "remote MGS with nodsh"
17121 local ost_name=$($LFS osts |
17122 sed -n 's/^'$ostidx': \(.*\)_UUID .*/\1/p')
17124 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
17125 do_facet $SINGLEMDS $LCTL get_param -n \
17126 osp.$mdtosc_proc1.reserved_mb_high ||
17127 skip "remote MDS does not support reserved_mb_high"
17131 wait_delete_completed
17134 local last_wm_h=$(do_facet $SINGLEMDS $LCTL get_param -n \
17135 osp.$mdtosc_proc1.reserved_mb_high)
17136 local last_wm_l=$(do_facet $SINGLEMDS $LCTL get_param -n \
17137 osp.$mdtosc_proc1.reserved_mb_low)
17138 echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l"
17140 create_pool $FSNAME.$TESTNAME || error "Pool creation failed"
17141 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name ||
17142 error "Adding $ost_name to pool failed"
17144 # Wait for client to see a OST at pool
17145 wait_update $HOSTNAME "$LCTL get_param -n
17146 lov.$FSNAME-*.pools.$TESTNAME | sort -u |
17147 grep $ost_name" "$ost_name""_UUID" $((TIMEOUT/2)) ||
17148 error "Client can not see the pool"
17149 $SETSTRIPE $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
17150 error "Setstripe failed"
17152 dd if=/dev/zero of=$DIR/$tdir/0 bs=1M count=10
17153 local blocks=$($LFS df $MOUNT | grep $ost_name | awk '{ print $4 }')
17154 echo "OST still has $((blocks/1024)) mbytes free"
17156 local new_lwm=$((blocks/1024-10))
17157 do_facet $SINGLEMDS $LCTL set_param \
17158 osp.$mdtosc_proc1.reserved_mb_high=$((new_lwm+5))
17159 do_facet $SINGLEMDS $LCTL set_param \
17160 osp.$mdtosc_proc1.reserved_mb_low=$new_lwm
17162 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17164 #First enospc could execute orphan deletion so repeat.
17165 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17167 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17168 osp.$mdtosc_proc1.prealloc_status)
17169 echo "prealloc_status $oa_status"
17171 dd if=/dev/zero of=$DIR/$tdir/2 bs=1M count=1 &&
17172 error "File creation should fail"
17173 #object allocation was stopped, but we still able to append files
17174 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M seek=6 count=5 oflag=append ||
17175 error "Append failed"
17176 rm -f $DIR/$tdir/1 $DIR/$tdir/0 $DIR/$tdir/r*
17178 wait_delete_completed
17182 for i in $(seq 10 12); do
17183 dd if=/dev/zero of=$DIR/$tdir/$i bs=1M count=1 2>/dev/null ||
17184 error "File creation failed after rm";
17187 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17188 osp.$mdtosc_proc1.prealloc_status)
17189 echo "prealloc_status $oa_status"
17191 if (( oa_status != 0 )); then
17192 error "Object allocation still disable after rm"
17194 do_facet $SINGLEMDS $LCTL set_param \
17195 osp.$mdtosc_proc1.reserved_mb_high=$last_wm_h
17196 do_facet $SINGLEMDS $LCTL set_param \
17197 osp.$mdtosc_proc1.reserved_mb_low=$last_wm_l
17200 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $ost_name ||
17201 error "Remove $ost_name from pool failed"
17202 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
17203 error "Pool destroy fialed"
17205 run_test 253 "Check object allocation limit"
17208 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17209 remote_mds_nodsh && skip "remote MDS with nodsh"
17210 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
17211 skip "MDS does not support changelog_size"
17214 local MDT0=$(facet_svc $SINGLEMDS)
17216 changelog_register || error "changelog_register failed"
17218 changelog_clear 0 || error "changelog_clear failed"
17220 local size1=$(do_facet $SINGLEMDS \
17221 $LCTL get_param -n mdd.$MDT0.changelog_size)
17222 echo "Changelog size $size1"
17225 $LFS mkdir -i 0 $DIR/$tdir
17227 mkdir -p $DIR/$tdir/pics/2008/zachy
17228 touch $DIR/$tdir/pics/2008/zachy/timestamp
17229 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
17230 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
17231 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
17232 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
17233 rm $DIR/$tdir/pics/desktop.jpg
17235 local size2=$(do_facet $SINGLEMDS \
17236 $LCTL get_param -n mdd.$MDT0.changelog_size)
17237 echo "Changelog size after work $size2"
17239 (( $size2 > $size1 )) ||
17240 error "new Changelog size=$size2 less than old size=$size1"
17242 run_test 254 "Check changelog size"
17249 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
17250 awk -F: '{print $2}' | grep $type > /dev/null
17251 if [ $? -ne 0 ]; then
17261 lfs ladvise -a willread $file > /dev/null 2>&1
17262 if [ $? -eq 0 ]; then
17266 lfs ladvise -a willread $file 2>&1 |
17267 grep "Inappropriate ioctl for device" > /dev/null
17268 if [ $? -eq 0 ]; then
17275 bc <<<"scale=2; ($1 - $2) * 100 / $2"
17278 # run a random read IO workload
17279 # usage: random_read_iops <filename> <filesize> <iosize>
17280 random_read_iops() {
17283 local iosize=${3:-4096}
17285 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
17286 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
17289 drop_file_oss_cache() {
17293 $LFS ladvise -a dontneed $file 2>/dev/null ||
17294 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
17297 ladvise_willread_performance()
17300 local average_origin=0
17301 local average_cache=0
17302 local average_ladvise=0
17304 for ((i = 1; i <= $repeat; i++)); do
17305 echo "Iter $i/$repeat: reading without willread hint"
17306 cancel_lru_locks osc
17307 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17308 local speed_origin=$(random_read_iops $DIR/$tfile $size)
17309 echo "Iter $i/$repeat: uncached speed: $speed_origin"
17310 average_origin=$(bc <<<"$average_origin + $speed_origin")
17312 cancel_lru_locks osc
17313 local speed_cache=$(random_read_iops $DIR/$tfile $size)
17314 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
17315 average_cache=$(bc <<<"$average_cache + $speed_cache")
17317 cancel_lru_locks osc
17318 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17319 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
17320 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
17321 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
17322 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
17324 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
17325 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
17326 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
17328 speedup_cache=$(percent $average_cache $average_origin)
17329 speedup_ladvise=$(percent $average_ladvise $average_origin)
17331 echo "Average uncached read: $average_origin"
17332 echo "Average speedup with OSS cached read: " \
17333 "$average_cache = +$speedup_cache%"
17334 echo "Average speedup with ladvise willread: " \
17335 "$average_ladvise = +$speedup_ladvise%"
17337 local lowest_speedup=20
17338 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
17339 echo "Speedup with OSS cached read less than $lowest_speedup%," \
17340 "got $average_cache%. Skipping ladvise willread check."
17344 # the test won't work on ZFS until it supports 'ladvise dontneed', but
17345 # it is still good to run until then to exercise 'ladvise willread'
17346 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17347 [ "$ost1_FSTYPE" = "zfs" ] &&
17348 echo "osd-zfs does not support dontneed or drop_caches" &&
17351 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
17352 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
17353 error_not_in_vm "Speedup with willread is less than " \
17354 "$lowest_speedup%, got $average_ladvise%"
17358 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17359 skip "lustre < 2.8.54 does not support ladvise "
17360 remote_ost_nodsh && skip "remote OST with nodsh"
17362 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
17364 ladvise_no_type willread $DIR/$tfile &&
17365 skip "willread ladvise is not supported"
17367 ladvise_no_ioctl $DIR/$tfile &&
17368 skip "ladvise ioctl is not supported"
17371 local size=$((size_mb * 1048576))
17372 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17373 error "dd to $DIR/$tfile failed"
17375 lfs ladvise -a willread $DIR/$tfile ||
17376 error "Ladvise failed with no range argument"
17378 lfs ladvise -a willread -s 0 $DIR/$tfile ||
17379 error "Ladvise failed with no -l or -e argument"
17381 lfs ladvise -a willread -e 1 $DIR/$tfile ||
17382 error "Ladvise failed with only -e argument"
17384 lfs ladvise -a willread -l 1 $DIR/$tfile ||
17385 error "Ladvise failed with only -l argument"
17387 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
17388 error "End offset should not be smaller than start offset"
17390 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
17391 error "End offset should not be equal to start offset"
17393 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
17394 error "Ladvise failed with overflowing -s argument"
17396 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
17397 error "Ladvise failed with overflowing -e argument"
17399 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
17400 error "Ladvise failed with overflowing -l argument"
17402 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
17403 error "Ladvise succeeded with conflicting -l and -e arguments"
17405 echo "Synchronous ladvise should wait"
17407 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17408 do_nodes $(comma_list $(osts_nodes)) \
17409 $LCTL set_param fail_val=$delay fail_loc=0x237
17411 local start_ts=$SECONDS
17412 lfs ladvise -a willread $DIR/$tfile ||
17413 error "Ladvise failed with no range argument"
17414 local end_ts=$SECONDS
17415 local inteval_ts=$((end_ts - start_ts))
17417 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17418 error "Synchronous advice didn't wait reply"
17421 echo "Asynchronous ladvise shouldn't wait"
17422 local start_ts=$SECONDS
17423 lfs ladvise -a willread -b $DIR/$tfile ||
17424 error "Ladvise failed with no range argument"
17425 local end_ts=$SECONDS
17426 local inteval_ts=$((end_ts - start_ts))
17428 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17429 error "Asynchronous advice blocked"
17432 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17433 ladvise_willread_performance
17435 run_test 255a "check 'lfs ladvise -a willread'"
17441 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17445 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17446 skip "lustre < 2.8.54 does not support ladvise "
17447 remote_ost_nodsh && skip "remote OST with nodsh"
17449 lfs setstripe -c 1 -i 0 $DIR/$tfile
17451 ladvise_no_type dontneed $DIR/$tfile &&
17452 skip "dontneed ladvise is not supported"
17454 ladvise_no_ioctl $DIR/$tfile &&
17455 skip "ladvise ioctl is not supported"
17457 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17458 [ "$ost1_FSTYPE" = "zfs" ] &&
17459 skip "zfs-osd does not support 'ladvise dontneed'"
17462 local size=$((size_mb * 1048576))
17463 # In order to prevent disturbance of other processes, only check 3/4
17464 # of the memory usage
17465 local kibibytes=$((size_mb * 1024 * 3 / 4))
17467 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17468 error "dd to $DIR/$tfile failed"
17470 #force write to complete before dropping OST cache & checking memory
17473 local total=$(facet_meminfo ost1 MemTotal)
17474 echo "Total memory: $total KiB"
17476 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17477 local before_read=$(facet_meminfo ost1 Cached)
17478 echo "Cache used before read: $before_read KiB"
17480 lfs ladvise -a willread $DIR/$tfile ||
17481 error "Ladvise willread failed"
17482 local after_read=$(facet_meminfo ost1 Cached)
17483 echo "Cache used after read: $after_read KiB"
17485 lfs ladvise -a dontneed $DIR/$tfile ||
17486 error "Ladvise dontneed again failed"
17487 local no_read=$(facet_meminfo ost1 Cached)
17488 echo "Cache used after dontneed ladvise: $no_read KiB"
17490 if [ $total -lt $((before_read + kibibytes)) ]; then
17491 echo "Memory is too small, abort checking"
17495 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17496 error "Ladvise willread should use more memory" \
17497 "than $kibibytes KiB"
17500 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17501 error "Ladvise dontneed should release more memory" \
17502 "than $kibibytes KiB"
17505 run_test 255b "check 'lfs ladvise -a dontneed'"
17508 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17509 skip "lustre < 2.10.50 does not support lockahead"
17517 test_mkdir -p $DIR/$tdir
17518 $SETSTRIPE -i 0 $DIR/$tdir
17520 #test 10 returns only success/failure
17522 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17524 if [ $rc -eq 255 ]; then
17525 error "Ladvise test${i} failed, ${rc}"
17528 #test 11 counts lock enqueue requests, all others count new locks
17530 count=$(do_facet ost1 \
17531 $LCTL get_param -n ost.OSS.ost.stats)
17532 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17534 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17536 if [ $rc -eq 255 ]; then
17537 error "Ladvise test${i} failed, ${rc}"
17540 new_count=$(do_facet ost1 \
17541 $LCTL get_param -n ost.OSS.ost.stats)
17542 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17543 awk '{ print $2 }')
17545 difference="$((new_count - count))"
17546 if [ $difference -ne $rc ]; then
17547 error "Ladvise test${i}, bad enqueue count, returned " \
17548 "${rc}, actual ${difference}"
17551 for i in $(seq 12 21); do
17552 # If we do not do this, we run the risk of having too many
17553 # locks and starting lock cancellation while we are checking
17555 cancel_lru_locks osc
17557 count=$($LCTL get_param -n \
17558 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17560 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17562 if [ $rc -eq 255 ]; then
17563 error "Ladvise test ${i} failed, ${rc}"
17566 new_count=$($LCTL get_param -n \
17567 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17568 difference="$((new_count - count))"
17570 # Test 15 output is divided by 100 to map down to valid return
17571 if [ $i -eq 15 ]; then
17575 if [ $difference -ne $rc ]; then
17576 error "Ladvise test ${i}, bad lock count, returned " \
17577 "${rc}, actual ${difference}"
17581 #test 22 returns only success/failure
17583 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17585 if [ $rc -eq 255 ]; then
17586 error "Ladvise test${i} failed, ${rc}"
17589 run_test 255c "suite of ladvise lockahead tests"
17592 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17593 remote_mds_nodsh && skip "remote MDS with nodsh"
17594 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17595 changelog_users $SINGLEMDS | grep "^cl" &&
17596 skip "active changelog user"
17602 mdt_dev=$(mdsdevname 1)
17605 changelog_register || error "changelog_register failed"
17608 mkdir -p $DIR/$tdir
17610 changelog_clear 0 || error "changelog_clear failed"
17613 touch $DIR/$tdir/{1..10}
17616 stop $SINGLEMDS || error "Fail to stop MDT"
17620 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
17622 #after mount new plainllog is used
17623 touch $DIR/$tdir/{11..19}
17624 local tmpfile=$(mktemp -u $tfile.XXXXXX)
17625 cat_sl=$(do_facet $SINGLEMDS "sync; \
17626 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17627 llog_reader $tmpfile | grep -c type=1064553b")
17628 do_facet $SINGLEMDS llog_reader $tmpfile
17630 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
17632 changelog_clear 0 || error "changelog_clear failed"
17634 cat_sl=$(do_facet $SINGLEMDS "sync; \
17635 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17636 llog_reader $tmpfile | grep -c type=1064553b; rm -f $tmpfile")
17638 if (( cat_sl == 2 )); then
17639 error "Empty plain llog was not deleted from changelog catalog"
17640 elif (( cat_sl != 1 )); then
17641 error "Active plain llog shouldn't be deleted from catalog"
17644 run_test 256 "Check llog delete for empty and not full state"
17647 remote_mds_nodsh && skip "remote MDS with nodsh"
17648 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
17649 skip "Need MDS version at least 2.8.55"
17651 test_mkdir $DIR/$tdir
17653 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
17654 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
17657 #define OBD_FAIL_MDS_XATTR_REP 0x161
17658 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17659 local facet=mds$((mdtidx + 1))
17660 set_nodes_failloc $(facet_active_host $facet) 0x80000161
17661 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
17663 stop $facet || error "stop MDS failed"
17664 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
17665 error "start MDS fail"
17667 run_test 257 "xattr locks are not lost"
17669 # Verify we take the i_mutex when security requires it
17671 #define OBD_FAIL_IMUTEX_SEC 0x141c
17672 $LCTL set_param fail_loc=0x141c
17674 chmod u+s $DIR/$tfile
17675 chmod a+rwx $DIR/$tfile
17676 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17678 if [ $RC -ne 0 ]; then
17679 error "error, failed to take i_mutex, rc=$?"
17683 run_test 258a "verify i_mutex security behavior when suid attributes is set"
17685 # Verify we do NOT take the i_mutex in the normal case
17687 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
17688 $LCTL set_param fail_loc=0x141d
17691 chmod a+rw $DIR/$tfile
17692 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17694 if [ $RC -ne 0 ]; then
17695 error "error, took i_mutex unnecessarily, rc=$?"
17700 run_test 258b "verify i_mutex security behavior"
17703 local file=$DIR/$tfile
17707 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17709 stack_trap "rm -f $file" EXIT
17711 wait_delete_completed
17712 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17713 echo "before: $before"
17715 $LFS setstripe -i 0 -c 1 $file
17716 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
17718 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17719 echo "after write: $after"
17721 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
17722 do_facet ost1 $LCTL set_param fail_loc=0x2301
17724 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17725 echo "after truncate: $after"
17728 do_facet ost1 $LCTL set_param fail_loc=0
17729 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17731 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17732 echo "after restart: $after"
17733 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
17734 error "missing truncate?"
17738 run_test 259 "crash at delayed truncate"
17741 #define OBD_FAIL_MDC_CLOSE 0x806
17742 $LCTL set_param fail_loc=0x80000806
17746 run_test 260 "Check mdc_close fail"
17748 ### Data-on-MDT sanity tests ###
17750 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17751 skip "Need MDS version at least 2.10.55 for DoM"
17754 local dom=$DIR/$tdir/dom_file
17755 local tmp=$DIR/$tdir/tmp_file
17757 mkdir -p $DIR/$tdir
17759 # basic checks for DoM component creation
17760 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
17761 error "Can set MDT layout to non-first entry"
17763 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
17764 error "Can define multiple entries as MDT layout"
17766 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
17768 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
17769 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
17770 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
17772 local mdtidx=$($LFS getstripe -m $dom)
17773 local mdtname=MDT$(printf %04x $mdtidx)
17774 local facet=mds$((mdtidx + 1))
17775 local space_check=1
17777 # Skip free space checks with ZFS
17778 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
17782 local size_tmp=$((65536 * 3))
17783 local mdtfree1=$(do_facet $facet \
17784 lctl get_param -n osd*.*$mdtname.kbytesfree)
17786 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17787 # check also direct IO along write
17788 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
17789 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17791 cmp $tmp $dom || error "file data is different"
17792 [ $(stat -c%s $dom) == $size_tmp ] ||
17793 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17794 if [ $space_check == 1 ]; then
17795 local mdtfree2=$(do_facet $facet \
17796 lctl get_param -n osd*.*$mdtname.kbytesfree)
17798 # increase in usage from by $size_tmp
17799 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17800 error "MDT free space wrong after write: " \
17801 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17805 local size_dom=10000
17807 $TRUNCATE $dom $size_dom
17808 [ $(stat -c%s $dom) == $size_dom ] ||
17809 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
17810 if [ $space_check == 1 ]; then
17811 mdtfree1=$(do_facet $facet \
17812 lctl get_param -n osd*.*$mdtname.kbytesfree)
17813 # decrease in usage from $size_tmp to new $size_dom
17814 [ $(($mdtfree1 - $mdtfree2)) -ge \
17815 $(((size_tmp - size_dom) / 1024)) ] ||
17816 error "MDT free space is wrong after truncate: " \
17817 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
17823 size_dom=$((size_dom + size_tmp))
17824 [ $(stat -c%s $dom) == $size_dom ] ||
17825 error "bad size after append: $(stat -c%s $dom) != $size_dom"
17826 if [ $space_check == 1 ]; then
17827 mdtfree2=$(do_facet $facet \
17828 lctl get_param -n osd*.*$mdtname.kbytesfree)
17829 # increase in usage by $size_tmp from previous
17830 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17831 error "MDT free space is wrong after append: " \
17832 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17837 if [ $space_check == 1 ]; then
17838 mdtfree1=$(do_facet $facet \
17839 lctl get_param -n osd*.*$mdtname.kbytesfree)
17840 # decrease in usage by $size_dom from previous
17841 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
17842 error "MDT free space is wrong after removal: " \
17843 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
17846 # combined striping
17847 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
17848 error "Can't create DoM + OST striping"
17850 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
17851 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17852 # check also direct IO along write
17853 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17855 cmp $tmp $dom || error "file data is different"
17856 [ $(stat -c%s $dom) == $size_tmp ] ||
17857 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17862 run_test 270a "DoM: basic functionality tests"
17865 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17866 skip "Need MDS version at least 2.10.55"
17868 local dom=$DIR/$tdir/dom_file
17869 local max_size=1048576
17871 mkdir -p $DIR/$tdir
17872 $LFS setstripe -E $max_size -L mdt $dom
17874 # truncate over the limit
17875 $TRUNCATE $dom $(($max_size + 1)) &&
17876 error "successful truncate over the maximum size"
17877 # write over the limit
17878 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
17879 error "successful write over the maximum size"
17880 # append over the limit
17881 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
17882 echo "12345" >> $dom && error "successful append over the maximum size"
17887 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
17890 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17891 skip "Need MDS version at least 2.10.55"
17893 mkdir -p $DIR/$tdir
17894 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17896 # check files inherit DoM EA
17897 touch $DIR/$tdir/first
17898 [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] ||
17899 error "bad pattern"
17900 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
17901 error "bad stripe count"
17902 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
17903 error "bad stripe size"
17905 # check directory inherits DoM EA and uses it as default
17906 mkdir $DIR/$tdir/subdir
17907 touch $DIR/$tdir/subdir/second
17908 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
17909 error "bad pattern in sub-directory"
17910 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
17911 error "bad stripe count in sub-directory"
17912 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
17913 error "bad stripe size in sub-directory"
17916 run_test 270c "DoM: DoM EA inheritance tests"
17919 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17920 skip "Need MDS version at least 2.10.55"
17922 mkdir -p $DIR/$tdir
17923 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17925 # inherit default DoM striping
17926 mkdir $DIR/$tdir/subdir
17927 touch $DIR/$tdir/subdir/f1
17929 # change default directory striping
17930 $LFS setstripe -c 1 $DIR/$tdir/subdir
17931 touch $DIR/$tdir/subdir/f2
17932 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
17933 error "wrong default striping in file 2"
17934 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
17935 error "bad pattern in file 2"
17938 run_test 270d "DoM: change striping from DoM to RAID0"
17941 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17942 skip "Need MDS version at least 2.10.55"
17944 mkdir -p $DIR/$tdir/dom
17945 mkdir -p $DIR/$tdir/norm
17948 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
17949 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
17951 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
17952 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
17954 # find DoM files by layout
17955 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
17956 [ $NUM -eq $DOMFILES ] ||
17957 error "lfs find -L: found $NUM, expected $DOMFILES"
17958 echo "Test 1: lfs find 20 DOM files by layout: OK"
17960 # there should be 1 dir with default DOM striping
17961 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
17963 error "lfs find -L: found $NUM, expected 1 dir"
17964 echo "Test 2: lfs find 1 DOM dir by layout: OK"
17966 # find DoM files by stripe size
17967 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
17968 [ $NUM -eq $DOMFILES ] ||
17969 error "lfs find -S: found $NUM, expected $DOMFILES"
17970 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
17972 # find files by stripe offset except DoM files
17973 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
17974 [ $NUM -eq $NORMFILES ] ||
17975 error "lfs find -i: found $NUM, expected $NORMFILES"
17976 echo "Test 5: lfs find no DOM files by stripe index: OK"
17979 run_test 270e "DoM: lfs find with DoM files test"
17982 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17983 skip "Need MDS version at least 2.10.55"
17985 local mdtname=${FSNAME}-MDT0000-mdtlov
17986 local dom=$DIR/$tdir/dom_file
17987 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
17988 lod.$mdtname.dom_stripesize)
17989 local dom_limit=131072
17991 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
17992 local dom_current=$(do_facet mds1 $LCTL get_param -n \
17993 lod.$mdtname.dom_stripesize)
17994 [ ${dom_limit} -eq ${dom_current} ] ||
17995 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
17997 $LFS mkdir -i 0 -c 1 $DIR/$tdir
17998 $LFS setstripe -d $DIR/$tdir
17999 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
18000 error "Can't set directory default striping"
18002 # exceed maximum stripe size
18003 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18004 error "Can't create file with $((dom_limit * 2)) DoM stripe"
18005 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
18006 error "Able to create DoM component size more than LOD limit"
18008 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
18009 dom_current=$(do_facet mds1 $LCTL get_param -n \
18010 lod.$mdtname.dom_stripesize)
18011 [ 0 -eq ${dom_current} ] ||
18012 error "Can't set zero DoM stripe limit"
18015 # attempt to create DoM file on server with disabled DoM should
18016 # remove DoM entry from layout and be succeed
18017 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
18018 error "Can't create DoM file (DoM is disabled)"
18019 [ $($LFS getstripe -L $dom) == "mdt" ] &&
18020 error "File has DoM component while DoM is disabled"
18023 # attempt to create DoM file with only DoM stripe should return error
18024 $LFS setstripe -E $dom_limit -L mdt $dom &&
18025 error "Able to create DoM-only file while DoM is disabled"
18027 # too low values to be aligned with smallest stripe size 64K
18028 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
18029 dom_current=$(do_facet mds1 $LCTL get_param -n \
18030 lod.$mdtname.dom_stripesize)
18031 [ 30000 -eq ${dom_current} ] &&
18032 error "Can set too small DoM stripe limit"
18034 # 64K is a minimal stripe size in Lustre, expect limit of that size
18035 [ 65536 -eq ${dom_current} ] ||
18036 error "Limit is not set to 64K but ${dom_current}"
18038 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
18039 dom_current=$(do_facet mds1 $LCTL get_param -n \
18040 lod.$mdtname.dom_stripesize)
18042 [ 2147483648 -eq ${dom_current} ] &&
18043 error "Can set too large DoM stripe limit"
18045 do_facet mds1 $LCTL set_param -n \
18046 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
18047 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18048 error "Can't create DoM component size after limit change"
18049 do_facet mds1 $LCTL set_param -n \
18050 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
18051 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
18052 error "Can't create DoM file after limit decrease"
18053 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
18054 error "Can create big DoM component after limit decrease"
18055 touch ${dom}_def ||
18056 error "Can't create file with old default layout"
18058 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
18061 run_test 270f "DoM: maximum DoM stripe size checks"
18064 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18065 skip "Need MDS version at least 2.10.55"
18067 local dom=$DIR/$tdir/dom
18069 mkdir -p $DIR/$tdir
18071 $LFS setstripe -E 1024K -L mdt $dom
18073 lctl set_param -n mdc.*.stats=clear
18074 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18075 cat $dom > /dev/null
18076 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
18077 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
18081 run_test 271a "DoM: data is cached for read after write"
18084 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18085 skip "Need MDS version at least 2.10.55"
18087 local dom=$DIR/$tdir/dom
18089 mkdir -p $DIR/$tdir
18091 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18093 lctl set_param -n mdc.*.stats=clear
18094 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18095 cancel_lru_locks mdc
18096 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
18097 # second stat to check size is cached on client
18098 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
18099 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18100 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
18103 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
18106 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18107 skip "Need MDS version at least 2.10.55"
18109 local dom=$DIR/$tdir/dom
18111 mkdir -p $DIR/$tdir
18113 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18115 lctl set_param -n mdc.*.stats=clear
18116 lctl set_param -n osc.*.stats=clear
18117 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
18118 cancel_lru_locks mdc
18119 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18120 # second stat to check size is cached on client
18121 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18122 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18123 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
18124 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
18125 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
18128 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
18134 local mdt=MDT$(printf %04x $mdtidx)
18136 if [ -z $param ]; then
18137 lctl get_param -n mdc.*$mdt*.stats
18139 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
18144 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18145 skip "Need MDS version at least 2.10.55"
18147 local dom=$DIR/$tdir/dom
18149 mkdir -p $DIR/$tdir
18151 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18153 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18154 local facet=mds$((mdtidx + 1))
18156 cancel_lru_locks mdc
18157 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
18158 createmany -o $dom 1000
18159 lctl set_param -n mdc.*.stats=clear
18160 smalliomany -w $dom 1000 200
18161 get_mdc_stats $mdtidx
18162 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18163 # Each file has 1 open, 1 IO enqueues, total 2000
18164 # but now we have also +1 getxattr for security.capability, total 3000
18165 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
18166 unlinkmany $dom 1000
18168 cancel_lru_locks mdc
18169 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
18170 createmany -o $dom 1000
18171 lctl set_param -n mdc.*.stats=clear
18172 smalliomany -w $dom 1000 200
18173 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18174 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
18175 # for OPEN and IO lock.
18176 [ $((enq - enq_2)) -ge 1000 ] ||
18177 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
18178 unlinkmany $dom 1000
18181 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
18183 cleanup_271def_tests() {
18189 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18190 skip "Need MDS version at least 2.10.57"
18192 local dom=$DIR/$tdir/dom
18193 local tmp=$TMP/$tfile
18194 trap "cleanup_271def_tests $tmp" EXIT
18196 mkdir -p $DIR/$tdir
18198 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18200 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18202 cancel_lru_locks mdc
18203 dd if=/dev/urandom of=$tmp bs=1000 count=1
18204 dd if=$tmp of=$dom bs=1000 count=1
18205 cancel_lru_locks mdc
18207 cat /etc/hosts >> $tmp
18208 lctl set_param -n mdc.*.stats=clear
18210 # append data to the same file it should update local page
18211 echo "Append to the same page"
18212 cat /etc/hosts >> $dom
18213 local num=$(get_mdc_stats $mdtidx ost_read)
18214 local ra=$(get_mdc_stats $mdtidx req_active)
18215 local rw=$(get_mdc_stats $mdtidx req_waittime)
18217 [ -z $num ] || error "$num READ RPC occured"
18218 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18222 cmp $tmp $dom || error "file miscompare"
18224 cancel_lru_locks mdc
18225 lctl set_param -n mdc.*.stats=clear
18227 echo "Open and read file"
18228 cat $dom > /dev/null
18229 local num=$(get_mdc_stats $mdtidx ost_read)
18230 local ra=$(get_mdc_stats $mdtidx req_active)
18231 local rw=$(get_mdc_stats $mdtidx req_waittime)
18233 [ -z $num ] || error "$num READ RPC occured"
18234 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18238 cmp $tmp $dom || error "file miscompare"
18242 run_test 271d "DoM: read on open (1K file in reply buffer)"
18245 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18246 skip "Need MDS version at least 2.10.57"
18248 local dom=$DIR/$tdir/dom
18249 local tmp=$TMP/$tfile
18250 trap "cleanup_271def_tests $tmp" EXIT
18252 mkdir -p $DIR/$tdir
18254 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18256 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18258 cancel_lru_locks mdc
18259 dd if=/dev/urandom of=$tmp bs=200000 count=1
18260 dd if=$tmp of=$dom bs=200000 count=1
18261 cancel_lru_locks mdc
18262 cat /etc/hosts >> $tmp
18263 lctl set_param -n mdc.*.stats=clear
18265 echo "Append to the same page"
18266 cat /etc/hosts >> $dom
18267 local num=$(get_mdc_stats $mdtidx ost_read)
18268 local ra=$(get_mdc_stats $mdtidx req_active)
18269 local rw=$(get_mdc_stats $mdtidx req_waittime)
18271 [ -z $num ] || error "$num READ RPC occured"
18272 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18276 cmp $tmp $dom || error "file miscompare"
18278 cancel_lru_locks mdc
18279 lctl set_param -n mdc.*.stats=clear
18281 echo "Open and read file"
18282 cat $dom > /dev/null
18283 local num=$(get_mdc_stats $mdtidx ost_read)
18284 local ra=$(get_mdc_stats $mdtidx req_active)
18285 local rw=$(get_mdc_stats $mdtidx req_waittime)
18287 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
18288 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18292 cmp $tmp $dom || error "file miscompare"
18296 run_test 271f "DoM: read on open (200K file and read tail)"
18299 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
18300 skip "Skipping due to old client or server version"
18302 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
18304 $CHECKSTAT -t file $DIR1/$tfile
18306 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
18309 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
18310 $LCTL set_param fail_loc=0x80000314
18311 rm $DIR1/$tfile || error "Unlink fails"
18313 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
18314 [ $RC -eq 0 ] || error "Failed write to stale object"
18316 run_test 271g "Discard DoM data vs client flush race"
18319 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18320 skip "Need MDS version at least 2.11.50"
18322 local dom=$DIR/$tdir/dom
18323 mkdir -p $DIR/$tdir
18325 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
18326 dd if=/dev/urandom of=$dom bs=512K count=1 ||
18327 error "failed to write data into $dom"
18328 local old_md5=$(md5sum $dom)
18330 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
18331 error "failed to migrate to the same DoM component"
18333 [ $($LFS getstripe -c $dom) -eq 2 ] ||
18334 error "layout was not changed silently"
18336 local new_md5=$(md5sum $dom)
18338 [ "$old_md5" != "$new_md5" ] &&
18339 error "md5sum differ: $old_md5, $new_md5"
18342 run_test 272a "DoM migration: new layout with the same DOM component"
18345 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18346 skip "Need MDS version at least 2.11.50"
18348 local dom=$DIR/$tdir/dom
18349 mkdir -p $DIR/$tdir
18350 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18352 local mdtidx=$($LFS getstripe -m $dom)
18353 local mdtname=MDT$(printf %04x $mdtidx)
18354 local facet=mds$((mdtidx + 1))
18356 local mdtfree1=$(do_facet $facet \
18357 lctl get_param -n osd*.*$mdtname.kbytesfree)
18358 dd if=/dev/urandom of=$dom bs=2M count=1 ||
18359 error "failed to write data into $dom"
18360 local old_md5=$(md5sum $dom)
18361 cancel_lru_locks mdc
18362 local mdtfree1=$(do_facet $facet \
18363 lctl get_param -n osd*.*$mdtname.kbytesfree)
18365 $LFS migrate -c2 $dom ||
18366 error "failed to migrate to the new composite layout"
18367 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18368 error "MDT stripe was not removed"
18370 cancel_lru_locks mdc
18371 local new_md5=$(md5sum $dom)
18372 [ "$old_md5" != "$new_md5" ] &&
18373 error "$old_md5 != $new_md5"
18375 # Skip free space checks with ZFS
18376 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18377 local mdtfree2=$(do_facet $facet \
18378 lctl get_param -n osd*.*$mdtname.kbytesfree)
18379 [ $mdtfree2 -gt $mdtfree1 ] ||
18380 error "MDT space is not freed after migration"
18384 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
18387 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18388 skip "Need MDS version at least 2.11.50"
18390 local dom=$DIR/$tdir/$tfile
18391 mkdir -p $DIR/$tdir
18392 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18394 local mdtidx=$($LFS getstripe -m $dom)
18395 local mdtname=MDT$(printf %04x $mdtidx)
18396 local facet=mds$((mdtidx + 1))
18398 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18399 error "failed to write data into $dom"
18400 local old_md5=$(md5sum $dom)
18401 cancel_lru_locks mdc
18402 local mdtfree1=$(do_facet $facet \
18403 lctl get_param -n osd*.*$mdtname.kbytesfree)
18405 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18406 error "failed to migrate to the new composite layout"
18407 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18408 error "MDT stripe was not removed"
18410 cancel_lru_locks mdc
18411 local new_md5=$(md5sum $dom)
18412 [ "$old_md5" != "$new_md5" ] &&
18413 error "$old_md5 != $new_md5"
18415 # Skip free space checks with ZFS
18416 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18417 local mdtfree2=$(do_facet $facet \
18418 lctl get_param -n osd*.*$mdtname.kbytesfree)
18419 [ $mdtfree2 -gt $mdtfree1 ] ||
18420 error "MDS space is not freed after migration"
18424 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18427 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18428 skip "Need MDS version at least 2.11.50"
18430 # Layout swap cannot be done if either file has DOM component,
18431 # this will never be supported, migration should be used instead
18433 local dom=$DIR/$tdir/$tfile
18434 mkdir -p $DIR/$tdir
18436 $LFS setstripe -c2 ${dom}_plain
18437 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18438 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18439 error "can swap layout with DoM component"
18440 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18441 error "can swap layout with DoM component"
18443 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18444 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18445 error "can swap layout with DoM component"
18446 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18447 error "can swap layout with DoM component"
18450 run_test 273a "DoM: layout swapping should fail with DOM"
18453 remote_ost_nodsh && skip "remote OST with nodsh"
18454 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18455 skip "Need OST version >= 2.10.57"
18457 local file=$DIR/$tfile
18460 oss=$(comma_list $(osts_nodes))
18462 dd if=/dev/urandom of=$file bs=1M count=2 ||
18463 error "failed to create a file"
18464 cancel_lru_locks osc
18467 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18468 error "failed to read a file"
18470 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
18471 $LCTL set_param fail_loc=0x8000031f
18473 cancel_lru_locks osc &
18476 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
18477 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
18478 #IO takes another lock, but matches the PENDING one
18479 #and places it to the IO RPC
18480 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18481 error "failed to read a file with PENDING lock"
18483 run_test 275 "Read on a canceled duplicate lock"
18486 remote_ost_nodsh && skip "remote OST with nodsh"
18489 do_facet ost1 "(while true; do \
18490 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
18491 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
18494 for LOOP in $(seq 20); do
18496 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
18499 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
18500 rm $TMP/sanity_276_pid"
18502 run_test 276 "Race between mount and obd_statfs"
18504 cleanup_test_300() {
18508 test_striped_dir() {
18513 mkdir -p $DIR/$tdir
18515 SAVE_UMASK=$(umask)
18516 trap cleanup_test_300 RETURN EXIT
18518 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
18519 $DIR/$tdir/striped_dir ||
18520 error "set striped dir error"
18522 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
18523 [ "$mode" = "755" ] || error "expect 755 got $mode"
18525 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
18526 error "getdirstripe failed"
18527 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
18528 if [ "$stripe_count" != "2" ]; then
18529 error "1:stripe_count is $stripe_count, expect 2"
18531 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
18532 if [ "$stripe_count" != "2" ]; then
18533 error "2:stripe_count is $stripe_count, expect 2"
18536 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
18537 if [ "$stripe_index" != "$mdt_index" ]; then
18538 error "stripe_index is $stripe_index, expect $mdt_index"
18541 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18542 error "nlink error after create striped dir"
18544 mkdir $DIR/$tdir/striped_dir/a
18545 mkdir $DIR/$tdir/striped_dir/b
18547 stat $DIR/$tdir/striped_dir/a ||
18548 error "create dir under striped dir failed"
18549 stat $DIR/$tdir/striped_dir/b ||
18550 error "create dir under striped dir failed"
18552 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
18553 error "nlink error after mkdir"
18555 rmdir $DIR/$tdir/striped_dir/a
18556 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
18557 error "nlink error after rmdir"
18559 rmdir $DIR/$tdir/striped_dir/b
18560 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18561 error "nlink error after rmdir"
18563 chattr +i $DIR/$tdir/striped_dir
18564 createmany -o $DIR/$tdir/striped_dir/f 10 &&
18565 error "immutable flags not working under striped dir!"
18566 chattr -i $DIR/$tdir/striped_dir
18568 rmdir $DIR/$tdir/striped_dir ||
18569 error "rmdir striped dir error"
18577 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18578 skip "skipped for lustre < 2.7.0"
18579 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18580 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18582 test_striped_dir 0 || error "failed on striped dir on MDT0"
18583 test_striped_dir 1 || error "failed on striped dir on MDT0"
18585 run_test 300a "basic striped dir sanity test"
18588 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18589 skip "skipped for lustre < 2.7.0"
18590 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18591 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18598 test_mkdir $DIR/$tdir || error "mkdir fail"
18599 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18600 error "set striped dir error"
18601 for i in {0..9}; do
18602 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
18604 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
18605 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
18606 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
18608 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
18609 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
18610 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
18614 run_test 300b "check ctime/mtime for striped dir"
18617 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18618 skip "skipped for lustre < 2.7.0"
18619 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18620 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18624 mkdir -p $DIR/$tdir
18625 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
18626 error "set striped dir error"
18628 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
18629 error "chown striped dir failed"
18631 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
18632 error "create 5k files failed"
18634 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
18636 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
18640 run_test 300c "chown && check ls under striped directory"
18643 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18644 skip "skipped for lustre < 2.7.0"
18645 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18646 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18651 mkdir -p $DIR/$tdir
18652 $SETSTRIPE -c 2 $DIR/$tdir
18654 #local striped directory
18655 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18656 error "set striped dir error"
18657 #look at the directories for debug purposes
18659 $LFS getdirstripe $DIR/$tdir
18660 ls -l $DIR/$tdir/striped_dir
18661 $LFS getdirstripe $DIR/$tdir/striped_dir
18662 createmany -o $DIR/$tdir/striped_dir/f 10 ||
18663 error "create 10 files failed"
18665 #remote striped directory
18666 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
18667 error "set striped dir error"
18668 #look at the directories for debug purposes
18670 $LFS getdirstripe $DIR/$tdir
18671 ls -l $DIR/$tdir/remote_striped_dir
18672 $LFS getdirstripe $DIR/$tdir/remote_striped_dir
18673 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
18674 error "create 10 files failed"
18676 for file in $(find $DIR/$tdir); do
18677 stripe_count=$($LFS getstripe -c $file)
18678 [ $stripe_count -eq 2 ] ||
18679 error "wrong stripe $stripe_count for $file"
18684 run_test 300d "check default stripe under striped directory"
18687 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18688 skip "Need MDS version at least 2.7.55"
18689 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18690 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18695 mkdir -p $DIR/$tdir
18697 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18698 error "set striped dir error"
18700 touch $DIR/$tdir/striped_dir/a
18701 touch $DIR/$tdir/striped_dir/b
18702 touch $DIR/$tdir/striped_dir/c
18704 mkdir $DIR/$tdir/striped_dir/dir_a
18705 mkdir $DIR/$tdir/striped_dir/dir_b
18706 mkdir $DIR/$tdir/striped_dir/dir_c
18708 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
18709 error "set striped adir under striped dir error"
18711 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
18712 error "set striped bdir under striped dir error"
18714 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
18715 error "set striped cdir under striped dir error"
18717 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
18718 error "rename dir under striped dir fails"
18720 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
18721 error "rename dir under different stripes fails"
18723 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
18724 error "rename file under striped dir should succeed"
18726 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
18727 error "rename dir under striped dir should succeed"
18731 run_test 300e "check rename under striped directory"
18734 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18735 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18736 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18737 skip "Need MDS version at least 2.7.55"
18743 mkdir -p $DIR/$tdir
18745 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18746 error "set striped dir error"
18748 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
18749 error "set striped dir error"
18751 touch $DIR/$tdir/striped_dir/a
18752 mkdir $DIR/$tdir/striped_dir/dir_a
18753 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
18754 error "create striped dir under striped dir fails"
18756 touch $DIR/$tdir/striped_dir1/b
18757 mkdir $DIR/$tdir/striped_dir1/dir_b
18758 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
18759 error "create striped dir under striped dir fails"
18761 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
18762 error "rename dir under different striped dir should fail"
18764 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
18765 error "rename striped dir under diff striped dir should fail"
18767 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
18768 error "rename file under diff striped dirs fails"
18772 run_test 300f "check rename cross striped directory"
18774 test_300_check_default_striped_dir()
18777 local default_count=$2
18778 local default_index=$3
18781 local dir_stripe_index
18784 echo "checking $dirname $default_count $default_index"
18785 $LFS setdirstripe -D -c $default_count -i $default_index \
18786 -t all_char $DIR/$tdir/$dirname ||
18787 error "set default stripe on striped dir error"
18788 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
18789 [ $stripe_count -eq $default_count ] ||
18790 error "expect $default_count get $stripe_count for $dirname"
18792 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
18793 [ $stripe_index -eq $default_index ] ||
18794 error "expect $default_index get $stripe_index for $dirname"
18796 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
18797 error "create dirs failed"
18799 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
18800 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
18801 for dir in $(find $DIR/$tdir/$dirname/*); do
18802 stripe_count=$($LFS getdirstripe -c $dir)
18803 [ $stripe_count -eq $default_count ] ||
18804 [ $stripe_count -eq 0 -o $default_count -eq 1 ] ||
18805 error "stripe count $default_count != $stripe_count for $dir"
18807 stripe_index=$($LFS getdirstripe -i $dir)
18808 [ $default_index -eq -1 -o $stripe_index -eq $default_index ] ||
18809 error "$stripe_index != $default_index for $dir"
18811 #check default stripe
18812 stripe_count=$($LFS getdirstripe -D -c $dir)
18813 [ $stripe_count -eq $default_count ] ||
18814 error "default count $default_count != $stripe_count for $dir"
18816 stripe_index=$($LFS getdirstripe -D -i $dir)
18817 [ $stripe_index -eq $default_index ] ||
18818 error "default index $default_index != $stripe_index for $dir"
18820 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
18824 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18825 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18826 skip "Need MDS version at least 2.7.55"
18833 mkdir $DIR/$tdir/normal_dir
18835 #Checking when client cache stripe index
18836 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
18837 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
18838 error "create striped_dir failed"
18840 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
18841 error "create dir0 fails"
18842 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
18843 [ $stripe_index -eq 0 ] ||
18844 error "dir0 expect index 0 got $stripe_index"
18846 mkdir $DIR/$tdir/striped_dir/dir1 ||
18847 error "create dir1 fails"
18848 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
18849 [ $stripe_index -eq 1 ] ||
18850 error "dir1 expect index 1 got $stripe_index"
18852 #check default stripe count/stripe index
18853 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
18854 test_300_check_default_striped_dir normal_dir 1 0
18855 test_300_check_default_striped_dir normal_dir 2 1
18856 test_300_check_default_striped_dir normal_dir 2 -1
18858 #delete default stripe information
18859 echo "delete default stripeEA"
18860 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
18861 error "set default stripe on striped dir error"
18863 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
18864 for dir in $(find $DIR/$tdir/normal_dir/*); do
18865 stripe_count=$($LFS getdirstripe -c $dir)
18866 [ $stripe_count -eq 0 ] ||
18867 error "expect 1 get $stripe_count for $dir"
18868 stripe_index=$($LFS getdirstripe -i $dir)
18869 [ $stripe_index -eq 0 ] ||
18870 error "expect 0 get $stripe_index for $dir"
18873 run_test 300g "check default striped directory for normal directory"
18876 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18877 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18878 skip "Need MDS version at least 2.7.55"
18884 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18885 error "set striped dir error"
18887 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
18888 test_300_check_default_striped_dir striped_dir 1 0
18889 test_300_check_default_striped_dir striped_dir 2 1
18890 test_300_check_default_striped_dir striped_dir 2 -1
18892 #delete default stripe information
18893 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
18894 error "set default stripe on striped dir error"
18896 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
18897 for dir in $(find $DIR/$tdir/striped_dir/*); do
18898 stripe_count=$($LFS getdirstripe -c $dir)
18899 [ $stripe_count -eq 0 ] ||
18900 error "expect 1 get $stripe_count for $dir"
18903 run_test 300h "check default striped directory for striped directory"
18906 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18907 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18908 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18909 skip "Need MDS version at least 2.7.55"
18916 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18917 error "set striped dir error"
18919 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18920 error "create files under striped dir failed"
18922 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
18923 error "set striped hashdir error"
18925 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
18926 error "create dir0 under hash dir failed"
18927 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
18928 error "create dir1 under hash dir failed"
18930 # unfortunately, we need to umount to clear dir layout cache for now
18931 # once we fully implement dir layout, we can drop this
18932 umount_client $MOUNT || error "umount failed"
18933 mount_client $MOUNT || error "mount failed"
18935 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
18936 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
18937 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
18939 #set the stripe to be unknown hash type
18940 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
18941 $LCTL set_param fail_loc=0x1901
18942 for ((i = 0; i < 10; i++)); do
18943 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
18944 error "stat f-$i failed"
18945 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
18948 touch $DIR/$tdir/striped_dir/f0 &&
18949 error "create under striped dir with unknown hash should fail"
18951 $LCTL set_param fail_loc=0
18953 umount_client $MOUNT || error "umount failed"
18954 mount_client $MOUNT || error "mount failed"
18958 run_test 300i "client handle unknown hash type striped directory"
18961 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18962 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18963 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18964 skip "Need MDS version at least 2.7.55"
18971 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
18972 $LCTL set_param fail_loc=0x1702
18973 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18974 error "set striped dir error"
18976 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18977 error "create files under striped dir failed"
18979 $LCTL set_param fail_loc=0
18981 rm -rf $DIR/$tdir || error "unlink striped dir fails"
18985 run_test 300j "test large update record"
18988 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18989 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18990 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18991 skip "Need MDS version at least 2.7.55"
18998 #define OBD_FAIL_LARGE_STRIPE 0x1703
18999 $LCTL set_param fail_loc=0x1703
19000 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
19001 error "set striped dir error"
19002 $LCTL set_param fail_loc=0
19004 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19005 error "getstripeddir fails"
19006 rm -rf $DIR/$tdir/striped_dir ||
19007 error "unlink striped dir fails"
19011 run_test 300k "test large striped directory"
19014 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19015 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19016 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19017 skip "Need MDS version at least 2.7.55"
19021 test_mkdir -p $DIR/$tdir/striped_dir
19022 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
19023 error "chown $RUNAS_ID failed"
19024 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
19025 error "set default striped dir failed"
19027 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
19028 $LCTL set_param fail_loc=0x80000158
19029 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
19031 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
19032 [ $stripe_index -eq 1 ] ||
19033 error "expect 1 get $stripe_index for $dir"
19035 run_test 300l "non-root user to create dir under striped dir with stale layout"
19038 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19039 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
19040 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19041 skip "Need MDS version at least 2.7.55"
19043 mkdir -p $DIR/$tdir/striped_dir
19044 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
19045 error "set default stripes dir error"
19047 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
19049 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
19050 [ $stripe_count -eq 0 ] ||
19051 error "expect 0 get $stripe_count for a"
19053 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
19054 error "set default stripes dir error"
19056 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
19058 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
19059 [ $stripe_count -eq 0 ] ||
19060 error "expect 0 get $stripe_count for b"
19062 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
19063 error "set default stripes dir error"
19065 mkdir $DIR/$tdir/striped_dir/c &&
19066 error "default stripe_index is invalid, mkdir c should fails"
19068 rm -rf $DIR/$tdir || error "rmdir fails"
19070 run_test 300m "setstriped directory on single MDT FS"
19073 local list=$(comma_list $(mdts_nodes))
19076 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19080 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19081 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19082 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19083 skip "Need MDS version at least 2.7.55"
19084 remote_mds_nodsh && skip "remote MDS with nodsh"
19087 local list=$(comma_list $(mdts_nodes))
19089 trap cleanup_300n RETURN EXIT
19090 mkdir -p $DIR/$tdir
19091 chmod 777 $DIR/$tdir
19092 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
19093 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19094 error "create striped dir succeeds with gid=0"
19096 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19097 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
19098 error "create striped dir fails with gid=-1"
19100 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19101 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
19102 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19103 error "set default striped dir succeeds with gid=0"
19106 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19107 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
19108 error "set default striped dir fails with gid=-1"
19111 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19112 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
19113 error "create test_dir fails"
19114 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
19115 error "create test_dir1 fails"
19116 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
19117 error "create test_dir2 fails"
19120 run_test 300n "non-root user to create dir under striped dir with default EA"
19123 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19124 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19125 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19126 skip "Need MDS version at least 2.7.55"
19131 mkdir -p $DIR/$tdir
19133 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
19134 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
19135 if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then
19136 skip "not enough free inodes $numfree1 $numfree2"
19139 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
19140 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
19141 if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then
19142 skip "not enough free space $numfree1 $numfree2"
19145 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
19146 error "setdirstripe fails"
19148 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
19149 error "create dirs fails"
19151 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
19152 ls $DIR/$tdir/striped_dir > /dev/null ||
19153 error "ls striped dir fails"
19154 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
19155 error "unlink big striped dir fails"
19157 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
19160 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19161 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19162 remote_mds_nodsh && skip "remote MDS with nodsh"
19164 mkdir -p $DIR/$tdir
19166 #define OBD_FAIL_OUT_ENOSPC 0x1704
19167 do_facet mds2 lctl set_param fail_loc=0x80001704
19168 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
19169 && error "create striped directory should fail"
19171 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
19173 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
19176 run_test 300p "create striped directory without space"
19179 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19180 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19182 local fd=$(free_fd)
19183 local cmd="exec $fd<$tdir"
19185 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
19188 trap "eval $cmd" EXIT
19189 cd $tdir || error "cd $tdir fails"
19190 rmdir ../$tdir || error "rmdir $tdir fails"
19191 mkdir local_dir && error "create dir succeeds"
19192 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
19196 run_test 300q "create remote directory under orphan directory"
19199 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
19200 skip "Need MDS version at least 2.7.55" && return
19201 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19205 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
19206 error "set striped dir error"
19208 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19209 error "getstripeddir fails"
19212 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
19213 awk '/lmv_stripe_count:/ { print $2 }')
19215 [ $MDSCOUNT -ne $stripe_count ] &&
19216 error "wrong stripe count $stripe_count expected $MDSCOUNT"
19218 rm -rf $DIR/$tdir/striped_dir ||
19219 error "unlink striped dir fails"
19221 run_test 300r "test -1 striped directory"
19223 prepare_remote_file() {
19224 mkdir $DIR/$tdir/src_dir ||
19225 error "create remote source failed"
19227 cp /etc/hosts $DIR/$tdir/src_dir/a ||
19228 error "cp to remote source failed"
19229 touch $DIR/$tdir/src_dir/a
19231 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
19232 error "create remote target dir failed"
19234 touch $DIR/$tdir/tgt_dir/b
19236 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
19237 error "rename dir cross MDT failed!"
19239 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
19240 error "src_child still exists after rename"
19242 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
19243 error "missing file(a) after rename"
19245 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
19246 error "diff after rename"
19250 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19251 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19253 local remote_file=$DIR/$tdir/tgt_dir/b
19255 mkdir -p $DIR/$tdir
19257 prepare_remote_file || error "prepare remote file failed"
19260 $OPENUNLINK $remote_file $remote_file ||
19261 error "openunlink $remote_file failed"
19262 $CHECKSTAT -a $remote_file || error "$remote_file exists"
19264 run_test 310a "open unlink remote file"
19267 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19268 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19270 local remote_file=$DIR/$tdir/tgt_dir/b
19272 mkdir -p $DIR/$tdir
19274 prepare_remote_file || error "prepare remote file failed"
19276 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19277 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
19278 $CHECKSTAT -t file $remote_file || error "check file failed"
19280 run_test 310b "unlink remote file with multiple links while open"
19283 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19284 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
19286 local remote_file=$DIR/$tdir/tgt_dir/b
19288 mkdir -p $DIR/$tdir
19290 prepare_remote_file || error "prepare remote file failed"
19292 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19293 multiop_bg_pause $remote_file O_uc ||
19294 error "mulitop failed for remote file"
19296 $MULTIOP $DIR/$tfile Ouc
19297 kill -USR1 $MULTIPID
19300 run_test 310c "open-unlink remote file with multiple links"
19304 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19305 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19306 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
19307 skip "lustre < 2.8.54 does not contain LU-4825 fix"
19308 remote_mds_nodsh && skip "remote MDS with nodsh"
19310 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19311 local mdts=$(comma_list $(mdts_nodes))
19313 mkdir -p $DIR/$tdir
19314 $SETSTRIPE -i 0 -c 1 $DIR/$tdir
19315 createmany -o $DIR/$tdir/$tfile. 1000
19317 # statfs data is not real time, let's just calculate it
19318 old_iused=$((old_iused + 1000))
19320 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19321 osp.*OST0000*MDT0000.create_count")
19322 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19323 osp.*OST0000*MDT0000.max_create_count")
19324 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
19326 $SETSTRIPE -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
19327 local index=$($GETSTRIPE -i $DIR/$tdir/$tfile)
19328 [ $index -ne 0 ] || error "$tfile stripe index is 0"
19330 unlinkmany $DIR/$tdir/$tfile. 1000
19332 do_nodes $mdts "$LCTL set_param -n \
19333 osp.*OST0000*.max_create_count=$max_count"
19334 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
19335 do_nodes $mdts "$LCTL set_param -n \
19336 osp.*OST0000*.create_count=$count"
19337 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
19338 grep "=0" && error "create_count is zero"
19341 for i in $(seq 120); do
19342 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19343 # system may be too busy to destroy all objs in time, use
19344 # a somewhat small value to not fail autotest
19345 [ $((old_iused - new_iused)) -gt 400 ] && break
19349 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
19350 [ $((old_iused - new_iused)) -gt 400 ] ||
19351 error "objs not destroyed after unlink"
19353 run_test 311 "disable OSP precreate, and unlink should destroy objs"
19360 local vdevdir=$(dirname $(facet_vdevice $ost))
19361 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
19362 local zfs_zapid=$(do_facet $ost $cmd |
19363 grep -w "/O/0/d$((objid%32))" -C 5 |
19364 awk '/Object/{getline; print $1}')
19365 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
19366 awk "/$objid = /"'{printf $3}')
19371 zfs_object_blksz() {
19375 local vdevdir=$(dirname $(facet_vdevice $ost))
19376 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
19377 local blksz=$(do_facet $ost $cmd $objid |
19378 awk '/dblk/{getline; printf $4}')
19380 case "${blksz: -1}" in
19381 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
19382 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
19389 test_312() { # LU-4856
19390 remote_ost_nodsh && skip "remote OST with nodsh"
19391 [ "$ost1_FSTYPE" = "zfs" ] ||
19392 skip_env "the test only applies to zfs"
19394 local max_blksz=$(do_facet ost1 \
19395 $ZFS get -p recordsize $(facet_device ost1) |
19396 awk '!/VALUE/{print $3}')
19398 # to make life a little bit easier
19399 $LFS mkdir -c 1 -i 0 $DIR/$tdir
19400 $LFS setstripe -c 1 -i 0 $DIR/$tdir
19402 local tf=$DIR/$tdir/$tfile
19404 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19406 # Get ZFS object id
19407 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19408 # block size change by sequential overwrite
19411 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
19412 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
19414 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
19415 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19419 # block size change by sequential append write
19420 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19421 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19422 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19425 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19426 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19427 oflag=sync conv=notrunc
19429 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19430 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19431 error "blksz error, actual $blksz, " \
19432 "expected: 2 * $count * $PAGE_SIZE"
19438 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19439 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19441 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
19442 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19443 [ $blksz -eq $PAGE_SIZE ] ||
19444 error "blksz error: $blksz, expected: $PAGE_SIZE"
19446 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
19447 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19448 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
19450 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
19451 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19452 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
19454 run_test 312 "make sure ZFS adjusts its block size by write pattern"
19457 remote_ost_nodsh && skip "remote OST with nodsh"
19459 local file=$DIR/$tfile
19462 $SETSTRIPE -c 1 -i 0 $file || error "setstripe failed"
19464 # define OBD_FAIL_TGT_RCVD_EIO 0x720
19465 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19466 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
19467 error "write should failed"
19468 do_facet ost1 "$LCTL set_param fail_loc=0"
19471 run_test 313 "io should fail after last_rcvd update fail"
19474 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19476 $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
19477 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19479 wait_delete_completed
19480 do_facet ost1 "$LCTL set_param fail_loc=0"
19482 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
19484 test_315() { # LU-618
19485 local file=$DIR/$tfile
19488 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
19489 error "multiop file write failed"
19490 $MULTIOP $file oO_RDONLY:r4063232_c &
19495 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
19498 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
19501 run_test 315 "read should be accounted"
19504 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19505 large_xattr_enabled || skip_env "ea_inode feature disabled"
19507 rm -rf $DIR/$tdir/d
19508 mkdir -p $DIR/$tdir/d
19509 chown nobody $DIR/$tdir/d
19510 touch $DIR/$tdir/d/file
19512 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
19514 run_test 316 "lfs mv"
19517 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
19518 skip "Need MDS version at least 2.11.53"
19519 if [ "$ost1_FSTYPE" == "zfs" ]; then
19520 skip "LU-10370: no implementation for ZFS"
19524 local grant_blk_size
19526 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
19527 awk '/grant_block_size:/ { print $2; exit; }')
19529 # Create File of size 5M. Truncate it to below size's and verify
19532 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
19533 error "Create file $DIR/$tfile failed"
19534 stack_trap "rm -f $DIR/$tfile" EXIT
19536 for trunc_sz in 2097152 4097 4000 509 0; do
19537 $TRUNCATE $DIR/$tfile $trunc_sz ||
19538 error "truncate $tfile to $trunc_sz failed"
19539 local sz=$(stat --format=%s $DIR/$tfile)
19540 local blk=$(stat --format=%b $DIR/$tfile)
19541 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
19542 grant_blk_size) * 8))
19544 if [[ $blk -ne $trunc_blk ]]; then
19545 $(which stat) $DIR/$tfile
19546 error "Expected Block $trunc_blk got $blk for $tfile"
19549 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19550 error "Expected Size $trunc_sz got $sz for $tfile"
19555 # Create file with a hole and write actual two blocks. Block count
19558 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
19559 conv=fsync || error "Create file : $DIR/$tfile"
19561 # Calculate the final truncate size.
19562 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
19565 # truncate to size $trunc_sz bytes. Strip the last block
19566 # The block count must drop to 8
19568 $TRUNCATE $DIR/$tfile $trunc_sz ||
19569 error "truncate $tfile to $trunc_sz failed"
19571 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
19572 sz=$(stat --format=%s $DIR/$tfile)
19573 blk=$(stat --format=%b $DIR/$tfile)
19575 if [[ $blk -ne $trunc_bsz ]]; then
19576 $(which stat) $DIR/$tfile
19577 error "Expected Block $trunc_bsz got $blk for $tfile"
19580 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19581 error "Expected Size $trunc_sz got $sz for $tfile"
19583 run_test 317 "Verify blocks get correctly update after truncate"
19586 local read_write=$1
19587 if [ "$read_write" = "write" ]; then
19588 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
19589 elif [ "$read_write" = "read" ]; then
19590 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
19592 error "argument error"
19595 # turn off debug for performance testing
19596 local saved_debug=$($LCTL get_param -n debug)
19597 $LCTL set_param debug=0
19599 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
19601 # get ost1 size - lustre-OST0000
19602 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
19603 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
19604 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
19606 if [ "$read_write" = "read" ]; then
19607 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
19610 local start_time=$(date +%s.%N)
19611 $dd_cmd bs=1M count=$blocks oflag=sync ||
19612 error "real dd $read_write error"
19613 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
19615 if [ "$read_write" = "write" ]; then
19619 # define OBD_FAIL_OST_FAKE_RW 0x238
19620 do_facet ost1 $LCTL set_param fail_loc=0x238
19622 local start_time=$(date +%s.%N)
19623 $dd_cmd bs=1M count=$blocks oflag=sync ||
19624 error "fake dd $read_write error"
19625 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
19627 if [ "$read_write" = "write" ]; then
19629 cancel_lru_locks osc
19630 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
19631 error "$tfile size not $blocks MB"
19633 do_facet ost1 $LCTL set_param fail_loc=0
19635 echo "fake $read_write $duration_fake vs. normal $read_write" \
19636 "$duration in seconds"
19637 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
19638 error_not_in_vm "fake write is slower"
19640 $LCTL set_param -n debug="$saved_debug"
19643 test_399a() { # LU-7655 for OST fake write
19644 remote_ost_nodsh && skip "remote OST with nodsh"
19648 run_test 399a "fake write should not be slower than normal write"
19650 test_399b() { # LU-8726 for OST fake read
19651 remote_ost_nodsh && skip "remote OST with nodsh"
19652 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
19653 skip_env "ldiskfs only test"
19658 run_test 399b "fake read should not be slower than normal read"
19660 test_400a() { # LU-1606, was conf-sanity test_74
19661 if ! which $CC > /dev/null 2>&1; then
19662 skip_env "$CC is not installed"
19665 local extra_flags=''
19666 local out=$TMP/$tfile
19667 local prefix=/usr/include/lustre
19670 # Oleg removes c files in his test rig so test if any c files exist
19671 [ -z "$(ls -A $LUSTRE_TESTS_API_DIR)" ] && \
19672 skip_env "Needed c test files are missing"
19674 if ! [[ -d $prefix ]]; then
19675 # Assume we're running in tree and fixup the include path.
19676 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
19677 extra_flags+=" -L$LUSTRE/utils/.lib"
19680 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
19681 $CC -Wall -Werror -std=c99 $extra_flags -o $out $prog -llustreapi ||
19682 error "client api broken"
19686 run_test 400a "Lustre client api program can compile and link"
19688 test_400b() { # LU-1606, LU-5011
19690 local out=$TMP/$tfile
19691 local prefix=/usr/include/linux/lustre
19693 # We use a hard coded prefix so that this test will not fail
19694 # when run in tree. There are headers in lustre/include/lustre/
19695 # that are not packaged (like lustre_idl.h) and have more
19696 # complicated include dependencies (like config.h and lnet/types.h).
19697 # Since this test about correct packaging we just skip them when
19698 # they don't exist (see below) rather than try to fixup cppflags.
19700 if ! which $CC > /dev/null 2>&1; then
19701 skip_env "$CC is not installed"
19704 for header in $prefix/*.h; do
19705 if ! [[ -f "$header" ]]; then
19709 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
19710 continue # lustre_ioctl.h is internal header
19713 $CC -Wall -Werror -std=c99 -include $header -c -x c /dev/null -o $out ||
19714 error "cannot compile '$header'"
19718 run_test 400b "packaged headers can be compiled"
19720 test_401a() { #LU-7437
19721 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
19722 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
19724 #count the number of parameters by "list_param -R"
19725 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
19726 #count the number of parameters by listing proc files
19727 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
19728 echo "proc_dirs='$proc_dirs'"
19729 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
19730 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
19733 [ $params -eq $procs ] ||
19734 error "found $params parameters vs. $procs proc files"
19736 # test the list_param -D option only returns directories
19737 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
19738 #count the number of parameters by listing proc directories
19739 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
19742 [ $params -eq $procs ] ||
19743 error "found $params parameters vs. $procs proc files"
19745 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
19748 local save=$($LCTL get_param -n jobid_var)
19751 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
19752 error "no error returned when setting bad parameters"
19754 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
19755 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
19757 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
19758 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
19759 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
19761 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
19764 local jobid_var_old=$($LCTL get_param -n jobid_var)
19765 local jobid_var_new
19767 $LCTL set_param jobid_var= &&
19768 error "no error returned for 'set_param a='"
19770 jobid_var_new=$($LCTL get_param -n jobid_var)
19771 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19772 error "jobid_var was changed by setting without value"
19774 $LCTL set_param jobid_var &&
19775 error "no error returned for 'set_param a'"
19777 jobid_var_new=$($LCTL get_param -n jobid_var)
19778 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19779 error "jobid_var was changed by setting without value"
19781 run_test 401c "Verify 'lctl set_param' without value fails in either format."
19784 local jobid_var_old=$($LCTL get_param -n jobid_var)
19785 local jobid_var_new
19786 local new_value="foo=bar"
19788 $LCTL set_param jobid_var=$new_value ||
19789 error "'set_param a=b' did not accept a value containing '='"
19791 jobid_var_new=$($LCTL get_param -n jobid_var)
19792 [[ "$jobid_var_new" == "$new_value" ]] ||
19793 error "'set_param a=b' failed on a value containing '='"
19795 # Reset the jobid_var to test the other format
19796 $LCTL set_param jobid_var=$jobid_var_old
19797 jobid_var_new=$($LCTL get_param -n jobid_var)
19798 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19799 error "failed to reset jobid_var"
19801 $LCTL set_param jobid_var $new_value ||
19802 error "'set_param a b' did not accept a value containing '='"
19804 jobid_var_new=$($LCTL get_param -n jobid_var)
19805 [[ "$jobid_var_new" == "$new_value" ]] ||
19806 error "'set_param a b' failed on a value containing '='"
19808 $LCTL set_param jobid_var $jobid_var_old
19809 jobid_var_new=$($LCTL get_param -n jobid_var)
19810 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19811 error "failed to reset jobid_var"
19813 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
19816 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
19817 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
19818 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
19819 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
19820 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
19821 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
19822 remote_mds_nodsh && skip "remote MDS with nodsh"
19824 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
19825 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
19826 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
19827 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
19828 echo "Touch failed - OK"
19830 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
19833 local file1=$DIR/$tfile.1
19834 local file2=$DIR/$tfile.2
19835 local tfile=$TMP/$tfile
19837 rm -f $file1 $file2 $tfile
19842 # 30 sec OBD_TIMEOUT in ll_getattr()
19843 # right before populating st_nlink
19844 $LCTL set_param fail_loc=0x80001409
19845 stat -c %h $file1 > $tfile &
19847 # create an alias, drop all locks and reclaim the dentry
19849 cancel_lru_locks mdc
19850 cancel_lru_locks osc
19851 sysctl -w vm.drop_caches=2
19855 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
19857 rm -f $tfile $file1 $file2
19859 run_test 403 "i_nlink should not drop to zero due to aliasing"
19861 test_404() { # LU-6601
19862 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
19863 skip "Need server version newer than 2.8.52"
19864 remote_mds_nodsh && skip "remote MDS with nodsh"
19866 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
19867 awk '/osp .*-osc-MDT/ { print $4}')
19870 for osp in $mosps; do
19871 echo "Deactivate: " $osp
19872 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
19873 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19874 awk -vp=$osp '$4 == p { print $2 }')
19875 [ $stat = IN ] || {
19876 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19877 error "deactivate error"
19879 echo "Activate: " $osp
19880 do_facet $SINGLEMDS $LCTL --device %$osp activate
19881 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19882 awk -vp=$osp '$4 == p { print $2 }')
19883 [ $stat = UP ] || {
19884 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19885 error "activate error"
19889 run_test 404 "validate manual {de}activated works properly for OSPs"
19892 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] ||
19893 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
19894 skip "Layout swap lock is not supported"
19896 check_swap_layouts_support
19898 test_mkdir $DIR/$tdir
19899 swap_lock_test -d $DIR/$tdir ||
19900 error "One layout swap locked test failed"
19902 run_test 405 "Various layout swap lock tests"
19905 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19906 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
19907 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
19908 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19909 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
19910 skip "Need MDS version at least 2.8.50"
19912 local def_stripe_size=$($LFS getstripe -S $MOUNT)
19913 local test_pool=$TESTNAME
19915 pool_add $test_pool || error "pool_add failed"
19916 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
19917 error "pool_add_targets failed"
19919 save_layout_restore_at_exit $MOUNT
19921 # parent set default stripe count only, child will stripe from both
19922 # parent and fs default
19923 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
19924 error "setstripe $MOUNT failed"
19925 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
19926 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
19927 for i in $(seq 10); do
19928 local f=$DIR/$tdir/$tfile.$i
19929 touch $f || error "touch failed"
19930 local count=$($LFS getstripe -c $f)
19931 [ $count -eq $OSTCOUNT ] ||
19932 error "$f stripe count $count != $OSTCOUNT"
19933 local offset=$($LFS getstripe -i $f)
19934 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
19935 local size=$($LFS getstripe -S $f)
19936 [ $size -eq $((def_stripe_size * 2)) ] ||
19937 error "$f stripe size $size != $((def_stripe_size * 2))"
19938 local pool=$($LFS getstripe -p $f)
19939 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
19942 # change fs default striping, delete parent default striping, now child
19943 # will stripe from new fs default striping only
19944 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
19945 error "change $MOUNT default stripe failed"
19946 $LFS setstripe -c 0 $DIR/$tdir ||
19947 error "delete $tdir default stripe failed"
19948 for i in $(seq 11 20); do
19949 local f=$DIR/$tdir/$tfile.$i
19950 touch $f || error "touch $f failed"
19951 local count=$($LFS getstripe -c $f)
19952 [ $count -eq 1 ] || error "$f stripe count $count != 1"
19953 local offset=$($LFS getstripe -i $f)
19954 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
19955 local size=$($LFS getstripe -S $f)
19956 [ $size -eq $def_stripe_size ] ||
19957 error "$f stripe size $size != $def_stripe_size"
19958 local pool=$($LFS getstripe -p $f)
19959 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
19962 unlinkmany $DIR/$tdir/$tfile. 1 20
19964 local f=$DIR/$tdir/$tfile
19965 pool_remove_all_targets $test_pool $f
19966 pool_remove $test_pool $f
19968 run_test 406 "DNE support fs default striping"
19971 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19972 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
19973 skip "Need MDS version at least 2.8.55"
19974 remote_mds_nodsh && skip "remote MDS with nodsh"
19976 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
19977 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
19978 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
19979 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
19980 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
19982 #define OBD_FAIL_DT_TXN_STOP 0x2019
19983 for idx in $(seq $MDSCOUNT); do
19984 do_facet mds$idx "lctl set_param fail_loc=0x2019"
19986 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
19987 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
19988 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
19991 run_test 407 "transaction fail should cause operation fail"
19994 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
19996 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
19997 lctl set_param fail_loc=0x8000040a
19998 # let ll_prepare_partial_page() fail
19999 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
20003 # create at least 100 unused inodes so that
20004 # shrink_icache_memory(0) should not return 0
20005 touch $DIR/$tfile-{0..100}
20006 rm -f $DIR/$tfile-{0..100}
20009 echo 2 > /proc/sys/vm/drop_caches
20011 run_test 408 "drop_caches should not hang due to page leaks"
20015 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20016 check_mount_and_prep
20018 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
20019 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
20020 touch $DIR/$tdir/guard || error "(2) Fail to create"
20022 local PREFIX=$(str_repeat 'A' 128)
20023 echo "Create 1K hard links start at $(date)"
20024 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20025 error "(3) Fail to hard link"
20027 echo "Links count should be right although linkEA overflow"
20028 stat $DIR/$tdir/guard || error "(4) Fail to stat"
20029 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
20030 [ $linkcount -eq 1001 ] ||
20031 error "(5) Unexpected hard links count: $linkcount"
20033 echo "List all links start at $(date)"
20034 ls -l $DIR/$tdir/foo > /dev/null ||
20035 error "(6) Fail to list $DIR/$tdir/foo"
20037 echo "Unlink hard links start at $(date)"
20038 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20039 error "(7) Fail to unlink"
20041 run_test 409 "Large amount of cross-MDTs hard links on the same file"
20045 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
20046 skip "Need client version at least 2.9.59"
20048 # Create a file, and stat it from the kernel
20049 local testfile=$DIR/$tfile
20052 local run_id=$RANDOM
20053 local my_ino=$(stat --format "%i" $testfile)
20055 # Try to insert the module. This will always fail as the
20056 # module is designed to not be inserted.
20057 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
20060 # Anything but success is a test failure
20062 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
20063 error "no inode match"
20065 run_test 410 "Test inode number returned from kernel thread"
20067 cleanup_test411_cgroup() {
20073 local cg_basedir=/sys/fs/cgroup/memory
20075 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
20076 skip "no setup for cgroup"
20078 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
20079 error "test file creation failed"
20080 cancel_lru_locks osc
20082 # Create a very small memory cgroup to force a slab allocation error
20083 local cgdir=$cg_basedir/osc_slab_alloc
20084 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
20085 trap "cleanup_test411_cgroup $cgdir" EXIT
20086 echo 2M > $cgdir/memory.kmem.limit_in_bytes
20087 echo 1M > $cgdir/memory.limit_in_bytes
20089 # Should not LBUG, just be killed by oom-killer
20090 # dd will return 0 even allocation failure in some environment.
20091 # So don't check return value
20092 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
20093 cleanup_test411_cgroup $cgdir
20097 run_test 411 "Slab allocation error with cgroup does not LBUG"
20100 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20101 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20102 skip "Need server version at least 2.10.55"
20105 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
20106 error "mkdir failed"
20107 $LFS getdirstripe $DIR/$tdir
20108 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
20109 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
20110 error "expect $((MDSCOUT - 1)) get $stripe_index"
20111 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
20112 [ $stripe_count -eq 2 ] ||
20113 error "expect 2 get $stripe_count"
20115 run_test 412 "mkdir on specific MDTs"
20118 [ $MDSCOUNT -lt 2 ] &&
20119 skip "We need at least 2 MDTs for this test"
20121 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20122 skip "Need server version at least 2.10.55"
20125 mkdir $DIR/$tdir || error "mkdir failed"
20127 # find MDT that is the most full
20128 local max=$($LFS df | grep MDT |
20137 END { split(b, c, ":")
20142 for i in $(seq $((MDSCOUNT - 1))); do
20143 $LFS mkdir -c $i $DIR/$tdir/d$i ||
20144 error "mkdir d$i failed"
20145 $LFS getdirstripe $DIR/$tdir/d$i
20146 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
20147 [ $stripe_index -ne $max ] ||
20148 error "don't expect $max"
20151 run_test 413 "mkdir on less full MDTs"
20154 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
20155 $LCTL set_param fail_loc=0x80000521
20156 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
20159 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
20162 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20163 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
20164 skip "Need server version at least 2.11.52"
20174 # this test may be slow on ZFS
20175 [ "$mds1_FSTYPE" == "zfs" ] && total=100
20177 # though this test is designed for striped directory, let's test normal
20178 # directory too since lock is always saved as CoS lock.
20179 test_mkdir $DIR/$tdir || error "mkdir $tdir"
20180 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
20189 start_time=$(date +%s)
20190 for i in $(seq $total); do
20191 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
20194 end_time=$(date +%s)
20195 duration=$((end_time - start_time))
20197 kill -9 $setattr_pid
20199 echo "rename $total files took $duration sec"
20200 [ $duration -lt 100 ] || error "rename took $duration sec"
20202 run_test 415 "lock revoke is not missing"
20205 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
20206 skip "Need server version at least 2.11.55"
20208 # define OBD_FAIL_OSD_TXN_START 0x19a
20209 do_facet mds1 lctl set_param fail_loc=0x19a
20211 lfs mkdir -c $MDSCOUNT $DIR/$tdir
20215 run_test 416 "transaction start failure won't cause system hung"
20219 do_nodes $(comma_list $(mdts_nodes)) \
20220 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
20221 do_nodes $(comma_list $(mdts_nodes)) \
20222 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
20223 do_nodes $(comma_list $(mdts_nodes)) \
20224 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
20228 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20229 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
20230 skip "Need MDS version at least 2.11.56"
20232 trap cleanup_417 RETURN EXIT
20234 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
20235 do_nodes $(comma_list $(mdts_nodes)) \
20236 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
20237 $LFS migrate -m 0 $DIR/$tdir.1 &&
20238 error "migrate dir $tdir.1 should fail"
20240 do_nodes $(comma_list $(mdts_nodes)) \
20241 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
20242 $LFS mkdir -i 1 $DIR/$tdir.2 &&
20243 error "create remote dir $tdir.2 should fail"
20245 do_nodes $(comma_list $(mdts_nodes)) \
20246 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
20247 $LFS mkdir -c 2 $DIR/$tdir.3 &&
20248 error "create striped dir $tdir.3 should fail"
20251 run_test 417 "disable remote dir, striped dir and dir migration"
20253 # Checks that the outputs of df [-i] and lfs df [-i] match
20255 # usage: check_lfs_df <blocks | inodes> <mountpoint>
20265 [ "$1" == "blocks" ] && inodes= || inodes="-i"
20267 for count in {1..100}; do
20271 # read the lines of interest
20272 df_out=($(df -P $inodes $dir | tail -n +2)) ||
20273 error "df $inodes $dir | tail -n +2 failed"
20274 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
20275 error "lfs df $inodes $dir | grep summary: failed"
20277 # skip first substrings of each output as they are different
20278 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
20279 # compare the remaining fields of the two outputs
20281 for i in {1..5}; do
20282 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
20290 lfs df $inodes $dir
20291 error "df and lfs df $1 output mismatch: " \
20292 "df ${inodes}: ${df_out[*]}, " \
20293 "lfs df ${inodes}: ${lfs_df_out[*]}"
20298 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20300 local dir=$DIR/$tdir
20301 local numfiles=$((RANDOM % 4096 + 2))
20302 local numblocks=$((RANDOM % 256 + 1))
20304 wait_delete_completed
20307 # check block output
20308 check_lfs_df blocks $dir
20309 # check inode output
20310 check_lfs_df inodes $dir
20312 # create a single file and retest
20313 echo "Creating a single file and testing"
20314 createmany -o $dir/$tfile- 1 &>/dev/null ||
20315 error "creating 1 file in $dir failed"
20316 check_lfs_df blocks $dir
20317 check_lfs_df inodes $dir
20319 # create a random number of files
20320 echo "Creating $((numfiles - 1)) files and testing"
20321 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
20322 error "creating $((numfiles - 1)) files in $dir failed"
20324 # write a random number of blocks to the first test file
20325 echo "Writing $numblocks 4K blocks and testing"
20326 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
20327 count=$numblocks &>/dev/null ||
20328 error "dd to $dir/${tfile}-0 failed"
20331 check_lfs_df blocks $dir
20332 check_lfs_df inodes $dir
20334 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
20335 error "unlinking $numfiles files in $dir failed"
20337 run_test 418 "df and lfs df outputs match"
20341 local dir=$DIR/$tdir
20346 cancel_lru_locks mdc
20348 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
20349 $LCTL set_param fail_loc=0x1410
20351 $LCTL set_param fail_loc=0
20354 run_test 419 "Verify open file by name doesn't crash kernel"
20358 [[ $MDS1_VERSION -ge $(version_code 2.12.1) ]] ||
20359 skip "Need MDS version at least 2.12.1"
20361 local SAVE_UMASK=$(umask)
20362 local dir=$DIR/$tdir
20363 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
20367 mkdir -m03777 $dir/testdir
20368 ls -dn $dir/testdir
20369 # Need to remove trailing '.' when SELinux is enabled
20370 local dirperms=$(ls -dn $dir/testdir |
20371 awk '{ sub(/\.$/, "", $1); print $1}')
20372 [ $dirperms == "drwxrwsrwt" ] ||
20373 error "incorrect perms on $dir/testdir"
20375 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
20376 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
20377 ls -n $dir/testdir/testfile
20378 local fileperms=$(ls -n $dir/testdir/testfile |
20379 awk '{ sub(/\.$/, "", $1); print $1}')
20380 [ $fileperms == "-rwxr-xr-x" ] ||
20381 error "incorrect perms on $dir/testdir/testfile"
20385 run_test 420 "clear SGID bit on non-directories for non-members"
20392 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20393 skip "Need MDS version at least 2.12.2"
20395 test_mkdir $DIR/$tdir
20396 createmany -o $DIR/$tdir/f 3
20397 cnt=$(ls -1 $DIR/$tdir | wc -l)
20398 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20400 fid1=$(lfs path2fid $DIR/$tdir/f1)
20401 fid2=$(lfs path2fid $DIR/$tdir/f2)
20402 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
20404 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
20405 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
20407 cnt=$(ls -1 $DIR/$tdir | wc -l)
20408 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20410 rm -f $DIR/$tdir/f3 || error "can't remove f3"
20411 createmany -o $DIR/$tdir/f 3
20412 cnt=$(ls -1 $DIR/$tdir | wc -l)
20413 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20415 fid1=$(lfs path2fid $DIR/$tdir/f1)
20416 fid2=$(lfs path2fid $DIR/$tdir/f2)
20417 echo "remove using fsname $FSNAME"
20418 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
20420 cnt=$(ls -1 $DIR/$tdir | wc -l)
20421 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20423 run_test 421a "simple rm by fid"
20430 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20431 skip "Need MDS version at least 2.12.2"
20433 test_mkdir $DIR/$tdir
20434 createmany -o $DIR/$tdir/f 3
20435 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
20438 FID1=$(lfs path2fid $DIR/$tdir/f1)
20439 FID2=$(lfs path2fid $DIR/$tdir/f2)
20440 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
20442 kill -USR1 $MULTIPID
20445 cnt=$(ls $DIR/$tdir | wc -l)
20446 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
20448 run_test 421b "rm by fid on open file"
20454 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20455 skip "Need MDS version at least 2.12.2"
20457 test_mkdir $DIR/$tdir
20458 createmany -o $DIR/$tdir/f 3
20459 touch $DIR/$tdir/$tfile
20460 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
20461 cnt=$(ls -1 $DIR/$tdir | wc -l)
20462 [ $cnt != 184 ] && error "unexpected #files: $cnt"
20464 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
20465 $LFS rmfid $DIR $FID1 || error "rmfid failed"
20467 cnt=$(ls $DIR/$tdir | wc -l)
20468 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
20470 run_test 421c "rm by fid against hardlinked files"
20476 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20477 skip "Need MDS version at least 2.12.2"
20479 test_mkdir $DIR/$tdir
20480 createmany -o $DIR/$tdir/f 4097
20481 cnt=$(ls -1 $DIR/$tdir | wc -l)
20482 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
20484 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
20485 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20487 cnt=$(ls $DIR/$tdir | wc -l)
20489 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20491 run_test 421d "rmfid en masse"
20497 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20498 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20499 skip "Need MDS version at least 2.12.2"
20501 mkdir -p $DIR/$tdir
20502 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20503 createmany -o $DIR/$tdir/striped_dir/f 512
20504 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20505 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20507 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20508 sed "s/[/][^:]*://g")
20509 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20511 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20513 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20515 run_test 421e "rmfid in DNE"
20521 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20522 skip "Need MDS version at least 2.12.2"
20524 test_mkdir $DIR/$tdir
20526 cnt=$(ls -1 $DIR/$tdir | wc -l)
20527 [ $cnt != 1 ] && error "unexpected #files: $cnt"
20529 FID=$(lfs path2fid $DIR/$tdir/f)
20530 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
20531 # rmfid should fail
20532 cnt=$(ls -1 $DIR/$tdir | wc -l)
20533 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
20535 chmod a+rw $DIR/$tdir
20537 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
20538 # rmfid should fail
20539 cnt=$(ls -1 $DIR/$tdir | wc -l)
20540 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
20543 $RUNAS touch $DIR/$tdir/f
20544 FID=$(lfs path2fid $DIR/$tdir/f)
20545 echo "rmfid as root"
20546 $LFS rmfid $DIR $FID || error "rmfid as root failed"
20547 cnt=$(ls -1 $DIR/$tdir | wc -l)
20548 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
20551 $RUNAS touch $DIR/$tdir/f
20552 cnt=$(ls -1 $DIR/$tdir | wc -l)
20553 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
20554 FID=$(lfs path2fid $DIR/$tdir/f)
20555 # rmfid w/o user_fid2path mount option should fail
20556 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
20557 cnt=$(ls -1 $DIR/$tdir | wc -l)
20558 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
20560 umount_client $MOUNT || "failed to umount client"
20561 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
20562 "failed to mount client'"
20564 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
20565 # rmfid should succeed
20566 cnt=$(ls -1 $DIR/$tdir | wc -l)
20567 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
20569 # rmfid shouldn't allow to remove files due to dir's permission
20570 chmod a+rwx $DIR/$tdir
20573 FID=$(lfs path2fid $DIR/$tdir/f)
20574 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
20576 umount_client $MOUNT || "failed to umount client"
20577 mount_client $MOUNT "$MOUNT_OPTS" ||
20578 "failed to mount client'"
20581 run_test 421f "rmfid checks permissions"
20587 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20588 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20589 skip "Need MDS version at least 2.12.2"
20591 mkdir -p $DIR/$tdir
20592 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20593 createmany -o $DIR/$tdir/striped_dir/f 512
20594 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20595 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20597 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20598 sed "s/[/][^:]*://g")
20600 rm -f $DIR/$tdir/striped_dir/f1*
20601 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20602 removed=$((512 - cnt))
20604 # few files have been just removed, so we expect
20605 # rmfid to fail on their fids
20606 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
20607 [ $removed != $errors ] && error "$errors != $removed"
20609 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20611 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20613 run_test 421g "rmfid to return errors properly"
20626 # ensure statfs cache is expired
20629 _stats=$(stat_test | grep $MOUNT | sort -u | wc -l)
20630 [[ ${_stats} -ne 1 ]] && error "statfs wrong"
20634 run_test 423 "statfs should return a right data"
20637 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20638 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20639 skip "Need server version at least 2.9.55"
20641 start_full_debug_logging
20645 stop_full_debug_logging
20649 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20650 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20651 awk '/The barrier for/ { print $7 }')
20654 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
20659 barrier_expired() {
20662 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20663 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20664 awk '/will be expired/ { print $7 }')
20666 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
20675 echo "Start barrier_freeze at: $(date)"
20676 #define OBD_FAIL_BARRIER_DELAY 0x2202
20677 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20678 # Do not reduce barrier time - See LU-11873
20679 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
20682 local b_status=$(barrier_stat)
20683 echo "Got barrier status at: $(date)"
20684 [ "$b_status" = "'freezing_p1'" ] ||
20685 error "(1) unexpected barrier status $b_status"
20687 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20689 b_status=$(barrier_stat)
20690 [ "$b_status" = "'frozen'" ] ||
20691 error "(2) unexpected barrier status $b_status"
20693 local expired=$(barrier_expired)
20694 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
20695 sleep $((expired + 3))
20697 b_status=$(barrier_stat)
20698 [ "$b_status" = "'expired'" ] ||
20699 error "(3) unexpected barrier status $b_status"
20701 # Do not reduce barrier time - See LU-11873
20702 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
20703 error "(4) fail to freeze barrier"
20705 b_status=$(barrier_stat)
20706 [ "$b_status" = "'frozen'" ] ||
20707 error "(5) unexpected barrier status $b_status"
20709 echo "Start barrier_thaw at: $(date)"
20710 #define OBD_FAIL_BARRIER_DELAY 0x2202
20711 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20712 do_facet mgs $LCTL barrier_thaw $FSNAME &
20715 b_status=$(barrier_stat)
20716 echo "Got barrier status at: $(date)"
20717 [ "$b_status" = "'thawing'" ] ||
20718 error "(6) unexpected barrier status $b_status"
20720 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20722 b_status=$(barrier_stat)
20723 [ "$b_status" = "'thawed'" ] ||
20724 error "(7) unexpected barrier status $b_status"
20726 #define OBD_FAIL_BARRIER_FAILURE 0x2203
20727 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
20728 do_facet mgs $LCTL barrier_freeze $FSNAME
20730 b_status=$(barrier_stat)
20731 [ "$b_status" = "'failed'" ] ||
20732 error "(8) unexpected barrier status $b_status"
20734 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
20735 do_facet mgs $LCTL barrier_thaw $FSNAME
20739 run_test 801a "write barrier user interfaces and stat machine"
20744 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20745 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
20746 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
20747 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
20748 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
20750 cancel_lru_locks mdc
20752 # 180 seconds should be long enough
20753 do_facet mgs $LCTL barrier_freeze $FSNAME 180
20755 local b_status=$(barrier_stat)
20756 [ "$b_status" = "'frozen'" ] ||
20757 error "(6) unexpected barrier status $b_status"
20759 mkdir $DIR/$tdir/d0/d10 &
20762 touch $DIR/$tdir/d1/f13 &
20765 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
20768 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
20771 rm -f $DIR/$tdir/d4/f12 &
20774 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
20776 # To guarantee taht the 'stat' is not blocked
20777 b_status=$(barrier_stat)
20778 [ "$b_status" = "'frozen'" ] ||
20779 error "(8) unexpected barrier status $b_status"
20781 # let above commands to run at background
20784 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
20785 ps -p $touch_pid || error "(10) touch should be blocked"
20786 ps -p $ln_pid || error "(11) link should be blocked"
20787 ps -p $mv_pid || error "(12) rename should be blocked"
20788 ps -p $rm_pid || error "(13) unlink should be blocked"
20790 b_status=$(barrier_stat)
20791 [ "$b_status" = "'frozen'" ] ||
20792 error "(14) unexpected barrier status $b_status"
20794 do_facet mgs $LCTL barrier_thaw $FSNAME
20795 b_status=$(barrier_stat)
20796 [ "$b_status" = "'thawed'" ] ||
20797 error "(15) unexpected barrier status $b_status"
20799 wait $mkdir_pid || error "(16) mkdir should succeed"
20800 wait $touch_pid || error "(17) touch should succeed"
20801 wait $ln_pid || error "(18) link should succeed"
20802 wait $mv_pid || error "(19) rename should succeed"
20803 wait $rm_pid || error "(20) unlink should succeed"
20807 run_test 801b "modification will be blocked by write barrier"
20810 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20814 stop mds2 || error "(1) Fail to stop mds2"
20816 do_facet mgs $LCTL barrier_freeze $FSNAME 30
20818 local b_status=$(barrier_stat)
20819 [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || {
20820 do_facet mgs $LCTL barrier_thaw $FSNAME
20821 error "(2) unexpected barrier status $b_status"
20824 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20825 error "(3) Fail to rescan barrier bitmap"
20827 # Do not reduce barrier time - See LU-11873
20828 do_facet mgs $LCTL barrier_freeze $FSNAME 20
20830 b_status=$(barrier_stat)
20831 [ "$b_status" = "'frozen'" ] ||
20832 error "(4) unexpected barrier status $b_status"
20834 do_facet mgs $LCTL barrier_thaw $FSNAME
20835 b_status=$(barrier_stat)
20836 [ "$b_status" = "'thawed'" ] ||
20837 error "(5) unexpected barrier status $b_status"
20839 local devname=$(mdsdevname 2)
20841 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
20843 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20844 error "(7) Fail to rescan barrier bitmap"
20848 run_test 801c "rescan barrier bitmap"
20850 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
20851 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
20852 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
20853 saved_MOUNT_OPTS=$MOUNT_OPTS
20859 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
20860 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
20861 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
20862 MOUNT_OPTS=$saved_MOUNT_OPTS
20867 [[ $mds1_FSTYPE = zfs ]] || skip "ZFS specific test"
20868 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20869 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20870 skip "Need server version at least 2.9.55"
20872 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
20874 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20876 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
20877 error "(2) Fail to copy"
20879 trap cleanup_802 EXIT
20881 # sync by force before remount as readonly
20882 sync; sync_all_data; sleep 3; sync_all_data
20886 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
20887 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
20888 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
20890 echo "Mount the server as read only"
20891 setupall server_only || error "(3) Fail to start servers"
20893 echo "Mount client without ro should fail"
20894 mount_client $MOUNT &&
20895 error "(4) Mount client without 'ro' should fail"
20897 echo "Mount client with ro should succeed"
20898 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
20899 mount_client $MOUNT ||
20900 error "(5) Mount client with 'ro' should succeed"
20902 echo "Modify should be refused"
20903 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
20905 echo "Read should be allowed"
20906 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
20907 error "(7) Read should succeed under ro mode"
20911 run_test 802 "simulate readonly device"
20914 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20915 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20916 skip "MDS needs to be newer than 2.10.54"
20918 mkdir -p $DIR/$tdir
20919 # Create some objects on all MDTs to trigger related logs objects
20920 for idx in $(seq $MDSCOUNT); do
20921 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
20922 $DIR/$tdir/dir${idx} ||
20923 error "Fail to create $DIR/$tdir/dir${idx}"
20927 wait_delete_completed # ensure old test cleanups are finished
20928 echo "before create:"
20930 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20932 for i in {1..10}; do
20933 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
20934 error "Fail to create $DIR/$tdir/foo$i"
20938 echo "after create:"
20940 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20942 # allow for an llog to be cleaned up during the test
20943 [ $after_used -ge $((before_used + 10 - 1)) ] ||
20944 error "before ($before_used) + 10 > after ($after_used)"
20946 for i in {1..10}; do
20947 rm -rf $DIR/$tdir/foo$i ||
20948 error "Fail to remove $DIR/$tdir/foo$i"
20951 sleep 3 # avoid MDT return cached statfs
20952 wait_delete_completed
20953 echo "after unlink:"
20955 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20957 # allow for an llog to be created during the test
20958 [ $after_used -le $((before_used + 1)) ] ||
20959 error "after ($after_used) > before ($before_used) + 1"
20961 run_test 803 "verify agent object for remote object"
20964 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20965 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20966 skip "MDS needs to be newer than 2.10.54"
20967 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
20969 mkdir -p $DIR/$tdir
20970 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
20971 error "Fail to create $DIR/$tdir/dir0"
20973 local fid=$($LFS path2fid $DIR/$tdir/dir0)
20974 local dev=$(mdsdevname 2)
20976 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20977 grep ${fid} || error "NOT found agent entry for dir0"
20979 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
20980 error "Fail to create $DIR/$tdir/dir1"
20982 touch $DIR/$tdir/dir1/foo0 ||
20983 error "Fail to create $DIR/$tdir/dir1/foo0"
20984 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
20987 for idx in $(seq $MDSCOUNT); do
20988 dev=$(mdsdevname $idx)
20989 do_facet mds${idx} \
20990 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20991 grep ${fid} && rc=$idx
20994 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
20995 error "Fail to rename foo0 to foo1"
20996 if [ $rc -eq 0 ]; then
20997 for idx in $(seq $MDSCOUNT); do
20998 dev=$(mdsdevname $idx)
20999 do_facet mds${idx} \
21000 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21001 grep ${fid} && rc=$idx
21005 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
21006 error "Fail to rename foo1 to foo2"
21007 if [ $rc -eq 0 ]; then
21008 for idx in $(seq $MDSCOUNT); do
21009 dev=$(mdsdevname $idx)
21010 do_facet mds${idx} \
21011 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21012 grep ${fid} && rc=$idx
21016 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
21018 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
21019 error "Fail to link to $DIR/$tdir/dir1/foo2"
21020 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
21021 error "Fail to rename foo2 to foo0"
21022 unlink $DIR/$tdir/dir1/foo0 ||
21023 error "Fail to unlink $DIR/$tdir/dir1/foo0"
21024 rm -rf $DIR/$tdir/dir0 ||
21025 error "Fail to rm $DIR/$tdir/dir0"
21027 for idx in $(seq $MDSCOUNT); do
21028 dev=$(mdsdevname $idx)
21032 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
21034 start mds${idx} $dev $MDS_MOUNT_OPTS ||
21035 error "mount mds$idx failed"
21036 df $MOUNT > /dev/null 2>&1
21038 # e2fsck should not return error
21040 error "e2fsck detected error on MDT${idx}: rc=$rc"
21043 run_test 804 "verify agent entry for remote entry"
21046 do_facet $SINGLEMDS zfs set quota=$old $fsset
21047 unlinkmany $DIR/$tdir/f- 1000000
21052 local zfs_version=$(do_facet mds1 cat /sys/module/zfs/version)
21053 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
21054 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
21055 skip "netfree not implemented before 0.7"
21056 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
21057 skip "Need MDS version at least 2.10.57"
21064 local pref="osd-zfs.lustre-MDT0000."
21066 # limit available space on MDS dataset to meet nospace issue
21067 # quickly. then ZFS 0.7.2 can use reserved space if asked
21068 # properly (using netfree flag in osd_declare_destroy()
21069 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
21070 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
21072 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
21073 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
21074 let "usedkb=usedkb-freekb"
21075 let "freekb=freekb/2"
21076 if let "freekb > 5000"; then
21079 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
21080 trap cleanup_805 EXIT
21082 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
21083 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
21084 rm -rf $DIR/$tdir || error "not able to remove"
21085 do_facet $SINGLEMDS zfs set quota=$old $fsset
21088 run_test 805 "ZFS can remove from full fs"
21094 local size=$($LFS getsom -s $file)
21095 local expect=$(stat -c %s $file)
21097 [[ $size == $expect ]] ||
21098 error "$file expected size: $expect, got: $size"
21100 local blocks=$($LFS getsom -b $file)
21101 expect=$(stat -c %b $file)
21102 [[ $blocks == $expect ]] ||
21103 error "$file expected blocks: $expect, got: $blocks"
21108 local size=$($LFS getsom -s $1)
21111 [[ $size == $expect ]] ||
21112 error "$file expected size: $expect, got: $size"
21116 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21117 skip "Need MDS version at least 2.11.52"
21121 touch $DIR/$tfile || error "touch $tfile failed"
21123 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21124 save_lustre_params client "llite.*.xattr_cache" > $save
21125 lctl set_param llite.*.xattr_cache=0
21126 stack_trap "restore_lustre_params < $save" EXIT
21128 # single-threaded write
21129 echo "Test SOM for single-threaded write"
21130 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
21131 error "write $tfile failed"
21132 check_lsom_size $DIR/$tfile $bs
21135 local size=$(($num * $bs))
21139 echo "Test SOM for single client multi-threaded($num) write"
21140 $TRUNCATE $DIR/$tfile 0
21141 for ((i = 0; i < $num; i++)); do
21142 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21144 offset=$((offset + $bs))
21146 for (( i=0; i < $num; i++ )); do
21149 check_lsom_size $DIR/$tfile $size
21151 $TRUNCATE $DIR/$tfile 0
21152 for ((i = 0; i < $num; i++)); do
21153 offset=$((offset - $bs))
21154 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21157 for (( i=0; i < $num; i++ )); do
21160 check_lsom_size $DIR/$tfile $size
21162 # multi-client writes
21163 num=$(get_node_count ${CLIENTS//,/ })
21164 size=$(($num * $bs))
21168 echo "Test SOM for multi-client ($num) writes"
21169 $TRUNCATE $DIR/$tfile 0
21170 for client in ${CLIENTS//,/ }; do
21171 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21174 offset=$((offset + $bs))
21176 for (( i=0; i < $num; i++ )); do
21179 check_lsom_size $DIR/$tfile $offset
21182 $TRUNCATE $DIR/$tfile 0
21183 for client in ${CLIENTS//,/ }; do
21184 offset=$((offset - $bs))
21185 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21189 for (( i=0; i < $num; i++ )); do
21192 check_lsom_size $DIR/$tfile $size
21195 echo "Test SOM for truncate"
21196 $TRUNCATE $DIR/$tfile 1048576
21197 check_lsom_size $DIR/$tfile 1048576
21198 $TRUNCATE $DIR/$tfile 1234
21199 check_lsom_size $DIR/$tfile 1234
21201 # verify SOM blocks count
21202 echo "Verify SOM block count"
21203 $TRUNCATE $DIR/$tfile 0
21204 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
21205 error "failed to write file $tfile"
21206 check_lsom_data $DIR/$tfile
21208 run_test 806 "Verify Lazy Size on MDS"
21211 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21212 skip "Need MDS version at least 2.11.52"
21214 # Registration step
21215 changelog_register || error "changelog_register failed"
21216 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
21217 changelog_users $SINGLEMDS | grep -q $cl_user ||
21218 error "User $cl_user not found in changelog_users"
21220 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21221 save_lustre_params client "llite.*.xattr_cache" > $save
21222 lctl set_param llite.*.xattr_cache=0
21223 stack_trap "restore_lustre_params < $save" EXIT
21225 rm -rf $DIR/$tdir || error "rm $tdir failed"
21226 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
21227 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
21228 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
21229 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
21230 error "truncate $tdir/trunc failed"
21233 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
21234 error "write $tfile failed"
21236 # multi-client wirtes
21237 local num=$(get_node_count ${CLIENTS//,/ })
21241 echo "Test SOM for multi-client ($num) writes"
21242 touch $DIR/$tfile || error "touch $tfile failed"
21243 $TRUNCATE $DIR/$tfile 0
21244 for client in ${CLIENTS//,/ }; do
21245 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21248 offset=$((offset + $bs))
21250 for (( i=0; i < $num; i++ )); do
21255 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
21256 check_lsom_data $DIR/$tdir/trunc
21257 check_lsom_data $DIR/$tdir/single_dd
21258 check_lsom_data $DIR/$tfile
21261 # Deregistration step
21262 changelog_deregister || error "changelog_deregister failed"
21264 run_test 807 "verify LSOM syncing tool"
21266 check_som_nologged()
21268 local lines=$($LFS changelog $FSNAME-MDT0000 |
21269 grep 'x=trusted.som' | wc -l)
21270 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
21274 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
21275 skip "Need MDS version at least 2.11.55"
21277 # Registration step
21278 changelog_register || error "changelog_register failed"
21280 touch $DIR/$tfile || error "touch $tfile failed"
21283 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
21284 error "write $tfile failed"
21287 $TRUNCATE $DIR/$tfile 1234
21290 $TRUNCATE $DIR/$tfile 1048576
21293 # Deregistration step
21294 changelog_deregister || error "changelog_deregister failed"
21296 run_test 808 "Check trusted.som xattr not logged in Changelogs"
21301 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
21305 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
21306 skip "Need MDS version at least 2.11.56"
21308 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
21309 error "failed to create DoM-only file $DIR/$tfile"
21310 touch $DIR/$tfile || error "touch $tfile failed"
21311 check_som_nodata $DIR/$tfile
21313 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
21314 error "write $tfile failed"
21315 check_som_nodata $DIR/$tfile
21317 $TRUNCATE $DIR/$tfile 1234
21318 check_som_nodata $DIR/$tfile
21320 $TRUNCATE $DIR/$tfile 4097
21321 check_som_nodata $DIR/$file
21323 run_test 809 "Verify no SOM xattr store for DoM-only files"
21326 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21327 $GSS && skip_env "could not run with gss"
21330 stack_trap "set_checksums $ORIG_CSUM" EXIT
21331 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
21336 for csum in $CKSUM_TYPES; do
21337 #define OBD_FAIL_OSC_NO_GRANT 0x411
21338 $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411
21339 for i in "10240 0" "10000 0" "4000 1" "500 1"; do
21341 dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2
21342 before=$(md5sum $DIR/$tfile)
21343 $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear
21344 after=$(md5sum $DIR/$tfile)
21345 [ "$before" == "$after" ] ||
21346 error "$csum: $before != $after bs=$1 seek=$2"
21350 run_test 810 "partial page writes on ZFS (LU-11663)"
21353 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
21354 skip "OST < 2.12.51 doesn't support this fail_loc"
21355 [ "$SHARED_KEY" = true ] &&
21356 skip "OSC connections never go IDLE with Shared-Keys enabled"
21358 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21359 # ensure ost1 is connected
21360 stat $DIR/$tfile >/dev/null || error "can't stat"
21361 wait_osc_import_state client ost1 FULL
21362 # no locks, no reqs to let the connection idle
21363 cancel_lru_locks osc
21365 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
21366 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
21367 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
21368 wait_osc_import_state client ost1 CONNECTING
21369 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
21371 stat $DIR/$tfile >/dev/null || error "can't stat file"
21373 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
21377 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
21378 echo -n y >> $DIR/$tfile
21379 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
21380 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
21382 run_test 814 "sparse cp works as expected (LU-12361)"
21386 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
21387 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
21389 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
21392 [ "$SHARED_KEY" = true ] &&
21393 skip "OSC connections never go IDLE with Shared-Keys enabled"
21395 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21396 # ensure ost1 is connected
21397 stat $DIR/$tfile >/dev/null || error "can't stat"
21398 wait_osc_import_state client ost1 FULL
21399 # no locks, no reqs to let the connection idle
21400 cancel_lru_locks osc
21401 lru_resize_disable osc
21404 before=$($LCTL get_param -n \
21405 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21407 wait_osc_import_state client ost1 IDLE
21408 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
21409 now=$($LCTL get_param -n \
21410 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21411 [ $before == $now ] || error "lru_size changed $before != $now"
21413 run_test 816 "do not reset lru_resize on idle reconnect"
21417 exportfs -u localhost:$DIR/nfsexp
21422 systemctl restart nfs-server.service || skip "failed to restart nfsd"
21424 mkdir -p $DIR/nfsexp
21425 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
21426 error "failed to export nfs"
21428 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
21429 stack_trap cleanup_817 EXIT
21431 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
21432 error "failed to mount nfs to $tmpdir"
21434 cp /bin/true $tmpdir
21435 $DIR/nfsexp/true || error "failed to execute 'true' command"
21437 run_test 817 "nfsd won't cache write lock for exec file"
21440 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21441 cancel_lru_locks osc
21442 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21443 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21444 dd if=$DIR/$tfile of=/dev/null bs=1M count=1
21447 run_test 819a "too big niobuf in read"
21450 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21451 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21452 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21453 cancel_lru_locks osc
21457 run_test 819b "too big niobuf in write"
21461 $LFS setstripe -c1 -i0 $DIR/$tfile
21462 $LFS setstripe -c1 -i1 $DIR/$tfile
21464 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
21465 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
21466 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
21467 error "start $SINGLEMDS failed"
21470 run_test 818 "unlink with failed llog"
21473 # tests that do cleanup/setup should be run at the end
21477 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21480 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
21481 $LCTL set_param fail_loc=0x903
21483 cancel_lru_locks MGC
21485 FAIL_ON_ERROR=true cleanup
21486 FAIL_ON_ERROR=true setup
21488 run_test 900 "umount should not race with any mgc requeue thread"
21492 [ $CLIENT_VERSION -lt $(version_code 2.13.52) ] &&
21493 skip "client does not have LU-13377 fix"
21494 #define OBD_FAIL_LLITE_SHORT_COMMIT 0x1415
21495 $LCTL set_param fail_loc=0x1415
21496 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21497 cancel_lru_locks osc
21500 run_test 902 "test short write doesn't hang lustre"
21503 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
21504 check_and_cleanup_lustre
21505 if [ "$I_MOUNTED" != "yes" ]; then
21506 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true