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}
75 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
77 if [ "$mds1_FSTYPE" = "zfs" ]; then
78 # bug number for skipped test: LU-1957
79 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 180"
81 [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
84 # Get the SLES distro version
86 # Returns a version string that should only be used in comparing
87 # strings returned by version_code()
90 local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2)
92 # All SuSE Linux versions have one decimal. version_code expects two
93 local sles_version=$version.0
94 version_code $sles_version
97 # Check if we are running on Ubuntu or SLES so we can make decisions on
99 if [ -r /etc/SuSE-release ]; then
100 sles_version=$(sles_version_code)
101 [ $sles_version -lt $(version_code 11.4.0) ] &&
102 # bug number for skipped test: LU-4341
103 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170"
104 [ $sles_version -lt $(version_code 12.0.0) ] &&
105 # bug number for skipped test: LU-3703
106 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234"
107 elif [ -r /etc/os-release ]; then
108 if grep -qi ubuntu /etc/os-release; then
109 ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
110 -e 's/^VERSION=//p' \
114 if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
115 # bug number for skipped test:
117 ALWAYS_EXCEPT+=" 103a 410"
126 pgrep ll_sa > /dev/null && { echo "There are ll_sa thread not exit!"; exit 20; }
127 cleanupall ${FORCE} $* || { echo "FAILed to clean up"; exit 20; }
136 check_swap_layouts_support()
138 $LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
139 skip "Does not support layout lock."
142 check_and_setup_lustre
146 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
148 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
149 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
150 rm -rf $DIR/[Rdfs][0-9]*
152 # $RUNAS_ID may get set incorrectly somewhere else
153 [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] &&
154 error "\$RUNAS_ID set to 0, but \$UID is also 0!"
156 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
160 if [ "${ONLY}" = "MOUNT" ] ; then
161 echo "Lustre is up, please go on"
165 echo "preparing for tests involving mounts"
166 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
168 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
169 echo # add a newline after mke2fs.
173 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
174 lctl set_param debug=-1 2> /dev/null || true
177 $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
179 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
181 run_test 0a "touch; rm ====================="
184 chmod 0755 $DIR || error "chmod 0755 $DIR failed"
185 $CHECKSTAT -p 0755 $DIR || error "$DIR permission is not 0755"
187 run_test 0b "chmod 0755 $DIR ============================="
190 $LCTL get_param mdc.*.import | grep "state: FULL" ||
191 error "import not FULL"
192 $LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" ||
195 run_test 0c "check import proc"
197 test_0d() { # LU-3397
198 [ $MGS_VERSION -lt $(version_code 2.10.57) ] &&
199 skip "proc exports not supported before 2.10.57"
201 local mgs_exp="mgs.MGS.exports"
202 local client_uuid=$($LCTL get_param -n mgc.*.uuid)
204 local exp_client_version
207 local temp_imp=$DIR/$tfile.import
208 local temp_exp=$DIR/$tfile.export
210 # save mgc import file to $temp_imp
211 $LCTL get_param mgc.*.import | tee $temp_imp
212 # Check if client uuid is found in MGS export
213 for exp_client_nid in $(do_facet mgs $LCTL get_param -N $mgs_exp.*); do
214 [ $(do_facet mgs $LCTL get_param -n $exp_client_nid.uuid) == \
218 # save mgs export file to $temp_exp
219 do_facet mgs $LCTL get_param $exp_client_nid.export | tee $temp_exp
221 # Compare the value of field "connect_flags"
222 imp_val=$(grep "connect_flags" $temp_imp)
223 exp_val=$(grep "connect_flags" $temp_exp)
224 [ "$exp_val" == "$imp_val" ] ||
225 error "export flags '$exp_val' != import flags '$imp_val'"
227 # Compare the value of client version
228 exp_client_version=$(awk '/target_version:/ { print $2 }' $temp_exp)
229 exp_val=$(version_code $exp_client_version)
230 imp_val=$CLIENT_VERSION
231 [ "$exp_val" == "$imp_val" ] ||
232 error "export client version '$exp_val' != '$imp_val'"
234 run_test 0d "check export proc ============================="
237 test_mkdir $DIR/$tdir
238 test_mkdir $DIR/$tdir/d2
239 mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
240 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir"
243 $CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed"
245 run_test 1 "mkdir; remkdir; rmdir"
248 test_mkdir $DIR/$tdir
249 touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed"
250 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
252 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed"
254 run_test 2 "mkdir; touch; rmdir; check file"
257 test_mkdir $DIR/$tdir
258 $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
259 touch $DIR/$tdir/$tfile
260 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
262 $CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed"
264 run_test 3 "mkdir; touch; rmdir; check dir"
266 # LU-4471 - failed rmdir on remote directories still removes directory on MDT0
268 test_mkdir -i 1 $DIR/$tdir
270 touch $DIR/$tdir/$tfile ||
271 error "Create file under remote directory failed"
274 error "Expect error removing in-use dir $DIR/$tdir"
276 test -d $DIR/$tdir || error "Remote directory disappeared"
278 rm -rf $DIR/$tdir || error "remove remote dir error"
280 run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
283 test_mkdir $DIR/$tdir
284 test_mkdir $DIR/$tdir/d2
285 chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed"
286 $CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707"
287 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
289 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2"
292 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
293 chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
294 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
295 error "$tfile does not have perm 0666 or UID $UID"
296 $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
297 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
298 error "$tfile should be 0666 and owned by UID $UID"
300 run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
303 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
306 chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
307 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
308 error "$tfile should be owned by UID $RUNAS_ID"
309 $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
310 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
311 error "$tfile should be owned by UID $RUNAS_ID"
313 run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
316 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
319 chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
320 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
321 error "$tfile should be owned by GID $UID"
322 $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
323 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
324 error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
326 run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)"
329 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
331 test_mkdir $DIR/$tdir
332 chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed"
333 $RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
334 chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed"
335 test_mkdir $DIR/$tdir/d/subdir
336 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir ||
337 error "$tdir/d/subdir should be GID $RUNAS_GID"
338 if [[ $MDSCOUNT -gt 1 ]]; then
339 # check remote dir sgid inherite
340 $LFS mkdir -i 0 $DIR/$tdir.local ||
341 error "mkdir $tdir.local failed"
342 chmod g+s $DIR/$tdir.local ||
343 error "chmod $tdir.local failed"
344 chgrp $RUNAS_GID $DIR/$tdir.local ||
345 error "chgrp $tdir.local failed"
346 $LFS mkdir -i 1 $DIR/$tdir.local/$tdir.remote ||
347 error "mkdir $tdir.remote failed"
348 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir.local/$tdir.remote ||
349 error "$tdir.remote should be owned by $UID.$RUNAS_ID"
350 $CHECKSTAT -p 02755 $DIR/$tdir.local/$tdir.remote ||
351 error "$tdir.remote should be mode 02755"
354 run_test 6g "verify new dir in sgid dir inherits group"
356 test_6h() { # bug 7331
357 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
359 touch $DIR/$tfile || error "touch failed"
360 chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile || error "initial chown failed"
361 $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/$tfile &&
362 error "chown $RUNAS_ID:0 $tfile worked as GID $RUNAS_GID"
363 $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile ||
364 error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID"
366 run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)"
369 test_mkdir $DIR/$tdir
370 $MCREATE $DIR/$tdir/$tfile
371 chmod 0666 $DIR/$tdir/$tfile
372 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
373 error "$tdir/$tfile should be mode 0666"
375 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
378 if [ ! -d $DIR/$tdir ]; then
379 test_mkdir $DIR/$tdir
381 $MCREATE $DIR/$tdir/$tfile
382 echo -n foo > $DIR/$tdir/$tfile
383 [ "$(cat $DIR/$tdir/$tfile)" = "foo" ] || error "$tdir/$tfile not 'foo'"
384 $CHECKSTAT -t file -s 3 $DIR/$tdir/$tfile || error "$tfile size not 3"
386 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
389 test_mkdir $DIR/$tdir
390 touch $DIR/$tdir/$tfile
391 chmod 0666 $DIR/$tdir/$tfile
392 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
393 error "$tfile mode not 0666"
395 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
398 test_mkdir $DIR/$tdir
399 test_mkdir $DIR/$tdir/d2
400 test_mkdir $DIR/$tdir/d2/d3
401 $CHECKSTAT -t dir $DIR/$tdir/d2/d3 || error "$tdir/d2/d3 not a dir"
403 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
406 test_mkdir $DIR/$tdir
407 test_mkdir $DIR/$tdir/d2
408 touch $DIR/$tdir/d2/$tfile
409 $CHECKSTAT -t file $DIR/$tdir/d2/$tfile ||
410 error "$tdir/d2/$tfile not a file"
412 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
415 test_mkdir $DIR/$tdir
416 test_mkdir $DIR/$tdir/d2
417 chmod 0666 $DIR/$tdir/d2
418 chmod 0705 $DIR/$tdir/d2
419 $CHECKSTAT -t dir -p 0705 $DIR/$tdir/d2 ||
420 error "$tdir/d2 mode not 0705"
422 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
425 test_mkdir $DIR/$tdir
426 touch $DIR/$tdir/$tfile
427 chmod 0666 $DIR/$tdir/$tfile
428 chmod 0654 $DIR/$tdir/$tfile
429 $CHECKSTAT -t file -p 0654 $DIR/$tdir/$tfile ||
430 error "$tdir/d2 mode not 0654"
432 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
435 test_mkdir $DIR/$tdir
436 dd if=/dev/zero of=$DIR/$tdir/$tfile count=10
438 $CHECKSTAT -t file -s 0 $DIR/$tdir/$tfile ||
439 error "$tdir/$tfile size not 0 after truncate"
441 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
444 test_mkdir $DIR/$tdir
445 touch $DIR/$tdir/$tfile
447 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
449 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
452 test_mkdir $DIR/$tdir
453 touch $DIR/$tdir/$tfile
454 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
455 $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
456 error "$tdir/${tfile_2} not a file after rename"
457 rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
459 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
462 test_mkdir $DIR/$tdir
463 touch $DIR/$tdir/$tfile
464 rm -rf $DIR/$tdir/$tfile
465 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
467 run_test 16 "touch .../d16/f; rm -rf .../d16/f"
470 test_mkdir $DIR/$tdir
471 touch $DIR/$tdir/$tfile
472 ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist
474 $CHECKSTAT -l $DIR/$tdir/$tfile $DIR/$tdir/l-exist ||
475 error "$tdir/l-exist not a symlink"
476 $CHECKSTAT -f -t f $DIR/$tdir/l-exist ||
477 error "$tdir/l-exist not referencing a file"
478 rm -f $DIR/$tdir/l-exist
479 $CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed"
481 run_test 17a "symlinks: create, remove (real)"
484 test_mkdir $DIR/$tdir
485 ln -s no-such-file $DIR/$tdir/l-dangle
487 $CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle ||
488 error "$tdir/l-dangle not referencing no-such-file"
489 $CHECKSTAT -fa $DIR/$tdir/l-dangle ||
490 error "$tdir/l-dangle not referencing non-existent file"
491 rm -f $DIR/$tdir/l-dangle
492 $CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed"
494 run_test 17b "symlinks: create, remove (dangling)"
496 test_17c() { # bug 3440 - don't save failed open RPC for replay
497 test_mkdir $DIR/$tdir
498 ln -s foo $DIR/$tdir/$tfile
499 cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true
501 run_test 17c "symlinks: open dangling (should return error)"
504 test_mkdir $DIR/$tdir
505 ln -s foo $DIR/$tdir/$tfile
506 touch $DIR/$tdir/$tfile || error "creating to new symlink"
508 run_test 17d "symlinks: create dangling"
511 test_mkdir $DIR/$tdir
512 local foo=$DIR/$tdir/$tfile
513 ln -s $foo $foo || error "create symlink failed"
514 ls -l $foo || error "ls -l failed"
515 ls $foo && error "ls not failed" || true
517 run_test 17e "symlinks: create recursive symlink (should return error)"
520 test_mkdir $DIR/$tdir
521 ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
522 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
523 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
524 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
525 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
526 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
529 run_test 17f "symlinks: long and very long symlink name"
531 # str_repeat(S, N) generate a string that is string S repeated N times
536 while [ $((n -= 1)) -ge 0 ]; do
542 # Long symlinks and LU-2241
544 test_mkdir $DIR/$tdir
545 local TESTS="59 60 61 4094 4095"
547 # Fix for inode size boundary in 2.1.4
548 [ $MDS1_VERSION -lt $(version_code 2.1.4) ] &&
551 # Patch not applied to 2.2 or 2.3 branches
552 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
553 [ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
556 # skip long symlink name for rhel6.5.
557 # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
558 grep -q '6.5' /etc/redhat-release &>/dev/null &&
559 TESTS="59 60 61 4062 4063"
562 local SYMNAME=$(str_repeat 'x' $i)
563 ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
564 readlink $DIR/$tdir/f$i || error "failed $i-char readlink"
567 run_test 17g "symlinks: really long symlink name and inode boundaries"
569 test_17h() { #bug 17378
570 [ $PARALLEL == "yes" ] && skip "skip parallel run"
571 remote_mds_nodsh && skip "remote MDS with nodsh"
575 test_mkdir $DIR/$tdir
576 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
577 $LFS setstripe -c -1 $DIR/$tdir
578 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
579 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
580 touch $DIR/$tdir/$tfile || true
582 run_test 17h "create objects: lov_free_memmd() doesn't lbug"
584 test_17i() { #bug 20018
585 [ $PARALLEL == "yes" ] && skip "skip parallel run"
586 remote_mds_nodsh && skip "remote MDS with nodsh"
588 local foo=$DIR/$tdir/$tfile
591 test_mkdir -c1 $DIR/$tdir
592 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
593 ln -s $foo $foo || error "create symlink failed"
594 #define OBD_FAIL_MDS_READLINK_EPROTO 0x143
595 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000143
596 ls -l $foo && error "error not detected"
599 run_test 17i "don't panic on short symlink (should return error)"
601 test_17k() { #bug 22301
602 [ $PARALLEL == "yes" ] && skip "skip parallel run"
603 [[ -z "$(which rsync 2>/dev/null)" ]] &&
604 skip "no rsync command"
605 rsync --help | grep -q xattr ||
606 skip_env "$(rsync --version | head -n1) does not support xattrs"
607 test_mkdir $DIR/$tdir
608 test_mkdir $DIR/$tdir.new
609 touch $DIR/$tdir/$tfile
610 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
611 rsync -av -X $DIR/$tdir/ $DIR/$tdir.new ||
612 error "rsync failed with xattrs enabled"
614 run_test 17k "symlinks: rsync with xattrs enabled"
616 test_17l() { # LU-279
617 [[ -z "$(which getfattr 2>/dev/null)" ]] &&
618 skip "no getfattr command"
620 test_mkdir $DIR/$tdir
621 touch $DIR/$tdir/$tfile
622 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
623 for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
624 # -h to not follow symlinks. -m '' to list all the xattrs.
625 # grep to remove first line: '# file: $path'.
626 for xattr in `getfattr -hm '' $path 2>/dev/null | grep -v '^#'`;
628 lgetxattr_size_check $path $xattr ||
629 error "lgetxattr_size_check $path $xattr failed"
633 run_test 17l "Ensure lgetxattr's returned xattr size is consistent"
637 [ $PARALLEL == "yes" ] && skip "skip parallel run"
638 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
639 remote_mds_nodsh && skip "remote MDS with nodsh"
640 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
641 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
642 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
644 local short_sym="0123456789"
645 local wdir=$DIR/$tdir
650 # create a long symlink file
651 for ((i = 0; i < 4; ++i)); do
652 long_sym=${long_sym}${long_sym}
655 echo "create 512 short and long symlink files under $wdir"
656 for ((i = 0; i < 256; ++i)); do
657 ln -sf ${long_sym}"a5a5" $wdir/long-$i
658 ln -sf ${short_sym}"a5a5" $wdir/short-$i
664 wait_delete_completed
666 echo "recreate the 512 symlink files with a shorter string"
667 for ((i = 0; i < 512; ++i)); do
668 # rewrite the symlink file with a shorter string
669 ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed"
670 ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed"
673 local mds_index=$(($($LFS getstripe -m $wdir) + 1))
674 local devname=$(mdsdevname $mds_index)
676 echo "stop and checking mds${mds_index}:"
677 # e2fsck should not return error
679 run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
682 start mds${mds_index} $devname $MDS_MOUNT_OPTS ||
683 error "start mds${mds_index} failed"
684 df $MOUNT > /dev/null 2>&1
686 error "e2fsck detected error for short/long symlink: rc=$rc"
689 run_test 17m "run e2fsck against MDT which contains short/long symlink"
691 check_fs_consistency_17n() {
695 # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
696 # so it only check MDT1/MDT2 instead of all of MDTs.
697 for mdt_index in 1 2; do
698 local devname=$(mdsdevname $mdt_index)
699 # e2fsck should not return error
701 run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
704 start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
705 error "mount mds$mdt_index failed"
706 df $MOUNT > /dev/null 2>&1
712 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
713 [ $PARALLEL == "yes" ] && skip "skip parallel run"
714 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
715 remote_mds_nodsh && skip "remote MDS with nodsh"
716 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
717 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
718 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
722 test_mkdir $DIR/$tdir
723 for ((i=0; i<10; i++)); do
724 $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
725 error "create remote dir error $i"
726 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
727 error "create files under remote dir failed $i"
730 check_fs_consistency_17n ||
731 error "e2fsck report error after create files under remote dir"
733 for ((i = 0; i < 10; i++)); do
734 rm -rf $DIR/$tdir/remote_dir_${i} ||
735 error "destroy remote dir error $i"
738 check_fs_consistency_17n ||
739 error "e2fsck report error after unlink files under remote dir"
741 [ $MDS1_VERSION -lt $(version_code 2.4.50) ] &&
742 skip "lustre < 2.4.50 does not support migrate mv"
744 for ((i = 0; i < 10; i++)); do
745 mkdir -p $DIR/$tdir/remote_dir_${i}
746 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
747 error "create files under remote dir failed $i"
748 $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
749 error "migrate remote dir error $i"
751 check_fs_consistency_17n || error "e2fsck report error after migration"
753 for ((i = 0; i < 10; i++)); do
754 rm -rf $DIR/$tdir/remote_dir_${i} ||
755 error "destroy remote dir error $i"
758 check_fs_consistency_17n || error "e2fsck report error after unlink"
760 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
763 remote_mds_nodsh && skip "remote MDS with nodsh"
764 [ $MDS1_VERSION -lt $(version_code 2.3.64) ] &&
765 skip "Need MDS version at least 2.3.64"
767 local wdir=$DIR/${tdir}o
773 mdt_index=$($LFS getstripe -m $wdir/$tfile)
774 mdt_index=$((mdt_index + 1))
777 #fail mds will wait the failover finish then set
778 #following fail_loc to avoid interfer the recovery process.
781 #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
782 do_facet mds${mdt_index} lctl set_param fail_loc=0x194
783 ls -l $wdir/$tfile && rc=1
784 do_facet mds${mdt_index} lctl set_param fail_loc=0
785 [[ $rc -eq 0 ]] || error "stat file should fail"
787 run_test 17o "stat file with incompat LMA feature"
790 touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
791 ls $DIR || error "Failed to ls $DIR: $?"
793 run_test 18 "touch .../f ; ls ... =============================="
799 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
801 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
804 ls -l $DIR/$tfile && error "ls -l $tfile failed"|| true
806 run_test 19b "ls -l .../f19 (should return error) =============="
809 [ $RUNAS_ID -eq $UID ] &&
810 skip_env "RUNAS_ID = UID = $UID -- skipping"
812 $RUNAS touch $DIR/$tfile && error "create non-root file failed" || true
814 run_test 19c "$RUNAS touch .../f19 (should return error) =="
817 cat $DIR/f19 && error || true
819 run_test 19d "cat .../f19 (should return error) =============="
828 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
830 run_test 20 "touch .../f ; ls -l ..."
833 test_mkdir $DIR/$tdir
834 [ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle
835 ln -s dangle $DIR/$tdir/link
836 echo foo >> $DIR/$tdir/link
837 cat $DIR/$tdir/dangle
838 $CHECKSTAT -t link $DIR/$tdir/link || error "$tdir/link not a link"
839 $CHECKSTAT -f -t file $DIR/$tdir/link ||
840 error "$tdir/link not linked to a file"
842 run_test 21 "write to dangling link"
845 local wdir=$DIR/$tdir
847 chown $RUNAS_ID:$RUNAS_GID $wdir
848 (cd $wdir || error "cd $wdir failed";
849 $RUNAS tar cf - /etc/hosts /etc/sysconfig/network |
851 ls -lR $wdir/etc || error "ls -lR $wdir/etc failed"
852 $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed"
853 $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc ||
854 error "checkstat -u failed"
856 run_test 22 "unpack tar archive as non-root user"
860 test_mkdir $DIR/$tdir
861 local file=$DIR/$tdir/$tfile
863 openfile -f O_CREAT:O_EXCL $file || error "$file create failed"
864 openfile -f O_CREAT:O_EXCL $file &&
865 error "$file recreate succeeded" || true
867 run_test 23a "O_CREAT|O_EXCL in subdir"
869 test_23b() { # bug 18988
870 test_mkdir $DIR/$tdir
871 local file=$DIR/$tdir/$tfile
874 echo foo > $file || error "write filed"
875 echo bar >> $file || error "append filed"
876 $CHECKSTAT -s 8 $file || error "wrong size"
879 run_test 23b "O_APPEND check"
881 # LU-9409, size with O_APPEND and tiny writes
883 local file=$DIR/$tfile
886 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800
887 $CHECKSTAT -s 6400 $file || error "wrong size, expected 6400"
891 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
892 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
894 $CHECKSTAT -s 12800 $file || error "wrong size, expected 12800"
897 #racing tiny & normal writes
898 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4096 count=4 &
899 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=100 &
901 $CHECKSTAT -s 17184 $file || error "wrong size, expected 17184"
904 #racing tiny & normal writes 2, ugly numbers
905 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4099 count=11 &
906 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=17 count=173 &
908 $CHECKSTAT -s 48030 $file || error "wrong size, expected 48030"
911 run_test 23c "O_APPEND size checks for tiny writes"
913 # LU-11069 file offset is correct after appending writes
915 local file=$DIR/$tfile
918 echo CentaurHauls > $file
919 offset=$($MULTIOP $file oO_WRONLY:O_APPEND:w13Zp)
920 if ((offset != 26)); then
921 error "wrong offset, expected 26, got '$offset'"
924 run_test 23d "file offset is correct after appending writes"
928 echo '-- same directory rename'
929 test_mkdir $DIR/$tdir
930 touch $DIR/$tdir/$tfile.1
931 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
932 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
934 run_test 24a "rename file to non-existent target"
937 test_mkdir $DIR/$tdir
938 touch $DIR/$tdir/$tfile.{1,2}
939 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
940 $CHECKSTAT -a $DIR/$tdir/$tfile.1 || error "$tfile.1 exists"
941 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
943 run_test 24b "rename file to existing target"
946 test_mkdir $DIR/$tdir
947 test_mkdir $DIR/$tdir/d$testnum.1
948 mv $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
949 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
950 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
952 run_test 24c "rename directory to non-existent target"
955 test_mkdir -c1 $DIR/$tdir
956 test_mkdir -c1 $DIR/$tdir/d$testnum.1
957 test_mkdir -c1 $DIR/$tdir/d$testnum.2
958 mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
959 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
960 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
962 run_test 24d "rename directory to existing target"
965 echo '-- cross directory renames --'
969 mv $DIR/R5a/f $DIR/R5b/g
970 $CHECKSTAT -a $DIR/R5a/f || error "$DIR/R5a/f exists"
971 $CHECKSTAT -t file $DIR/R5b/g || error "$DIR/R5b/g not file type"
973 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
978 touch $DIR/R6a/f $DIR/R6b/g
979 mv $DIR/R6a/f $DIR/R6b/g
980 $CHECKSTAT -a $DIR/R6a/f || error "$DIR/R6a/f exists"
981 $CHECKSTAT -t file $DIR/R6b/g || error "$DIR/R6b/g not file type"
983 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
988 test_mkdir $DIR/R7a/d
989 mv $DIR/R7a/d $DIR/R7b/e
990 $CHECKSTAT -a $DIR/R7a/d || error "$DIR/R7a/d exists"
991 $CHECKSTAT -t dir $DIR/R7b/e || error "$DIR/R7b/e not dir type"
993 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
996 test_mkdir -c1 $DIR/R8a
997 test_mkdir -c1 $DIR/R8b
998 test_mkdir -c1 $DIR/R8a/d
999 test_mkdir -c1 $DIR/R8b/e
1000 mrename $DIR/R8a/d $DIR/R8b/e
1001 $CHECKSTAT -a $DIR/R8a/d || error "$DIR/R8a/d exists"
1002 $CHECKSTAT -t dir $DIR/R8b/e || error "$DIR/R8b/e not dir type"
1004 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
1007 echo "-- rename error cases"
1009 test_mkdir $DIR/R9/a
1011 mrename $DIR/R9/f $DIR/R9/a
1012 $CHECKSTAT -t file $DIR/R9/f || error "$DIR/R9/f not file type"
1013 $CHECKSTAT -t dir $DIR/R9/a || error "$DIR/R9/a not dir type"
1014 $CHECKSTAT -a $DIR/R9/a/f || error "$DIR/R9/a/f exists"
1016 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
1020 mrename $DIR/R10/f $DIR/R10/g
1021 $CHECKSTAT -t dir $DIR/R10 || error "$DIR/R10 not dir type"
1022 $CHECKSTAT -a $DIR/R10/f || error "$DIR/R10/f exists"
1023 $CHECKSTAT -a $DIR/R10/g || error "$DIR/R10/g exists"
1025 run_test 24j "source does not exist ============================"
1028 test_mkdir $DIR/R11a
1029 test_mkdir $DIR/R11a/d
1031 mv $DIR/R11a/f $DIR/R11a/d
1032 $CHECKSTAT -a $DIR/R11a/f || error "$DIR/R11a/f exists"
1033 $CHECKSTAT -t file $DIR/R11a/d/f || error "$DIR/R11a/d/f not file type"
1035 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
1037 # bug 2429 - rename foo foo foo creates invalid file
1040 $MULTIOP $f OcNs || error "rename of ${f} to itself failed"
1042 run_test 24l "Renaming a file to itself ========================"
1046 $MULTIOP $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
1047 # on ext3 this does not remove either the source or target files
1048 # though the "expected" operation would be to remove the source
1049 $CHECKSTAT -t file ${f} || error "${f} missing"
1050 $CHECKSTAT -t file ${f}2 || error "${f}2 missing"
1052 run_test 24m "Renaming a file to a hard link to itself ========="
1056 # this stats the old file after it was renamed, so it should fail
1058 $CHECKSTAT ${f} || error "${f} missing"
1060 $CHECKSTAT ${f}.rename || error "${f}.rename missing"
1061 $CHECKSTAT -a ${f} || error "${f} exists"
1063 run_test 24n "Statting the old file after renaming (Posix rename 2)"
1066 test_mkdir $DIR/$tdir
1067 rename_many -s random -v -n 10 $DIR/$tdir
1069 run_test 24o "rename of files during htree split"
1072 test_mkdir $DIR/R12a
1073 test_mkdir $DIR/R12b
1074 DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
1075 mrename $DIR/R12a $DIR/R12b
1076 $CHECKSTAT -a $DIR/R12a || error "$DIR/R12a exists"
1077 $CHECKSTAT -t dir $DIR/R12b || error "$DIR/R12b not dir type"
1078 DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
1079 [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
1081 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
1083 cleanup_multiop_pause() {
1085 kill -USR1 $MULTIPID
1089 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1091 test_mkdir $DIR/R13a
1092 test_mkdir $DIR/R13b
1093 local DIRINO=$(ls -lid $DIR/R13a | awk '{ print $1 }')
1094 multiop_bg_pause $DIR/R13b D_c || error "multiop failed to start"
1097 trap cleanup_multiop_pause EXIT
1098 mrename $DIR/R13a $DIR/R13b
1099 $CHECKSTAT -a $DIR/R13a || error "R13a still exists"
1100 $CHECKSTAT -t dir $DIR/R13b || error "R13b does not exist"
1101 local DIRINO2=$(ls -lid $DIR/R13b | awk '{ print $1 }')
1102 [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
1103 cleanup_multiop_pause
1104 wait $MULTIPID || error "multiop close failed"
1106 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
1108 test_24r() { #bug 3789
1109 test_mkdir $DIR/R14a
1110 test_mkdir $DIR/R14a/b
1111 mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
1112 $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
1113 $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
1115 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
1118 test_mkdir $DIR/R15a
1119 test_mkdir $DIR/R15a/b
1120 test_mkdir $DIR/R15a/b/c
1121 mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
1122 $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
1123 $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
1125 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
1127 test_mkdir $DIR/R16a
1128 test_mkdir $DIR/R16a/b
1129 test_mkdir $DIR/R16a/b/c
1130 mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
1131 $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
1132 $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
1134 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
1136 test_24u() { # bug12192
1137 $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error "multiop failed"
1138 $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
1140 run_test 24u "create stripe file"
1142 simple_cleanup_common() {
1145 [ -z "$DIR" -o -z "$tdir" ] && return 0
1147 local start=$SECONDS
1150 wait_delete_completed
1151 echo "cleanup time $((SECONDS - start))"
1155 max_pages_per_rpc() {
1156 local mdtname="$(printf "MDT%04x" ${1:-0})"
1157 $LCTL get_param -n mdc.*$mdtname*.max_pages_per_rpc
1161 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1163 local nrfiles=${COUNT:-100000}
1164 local fname="$DIR/$tdir/$tfile"
1166 # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
1167 [ "$mds1_FSTYPE" = "zfs" ] && nrfiles=${COUNT:-10000}
1169 test_mkdir "$(dirname $fname)"
1170 # assume MDT0000 has the fewest inodes
1171 local stripes=$($LFS getdirstripe -c $(dirname $fname))
1172 local free_inodes=$(($(mdt_free_inodes 0) * stripes))
1173 [[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
1175 trap simple_cleanup_common EXIT
1177 createmany -m "$fname" $nrfiles
1179 cancel_lru_locks mdc
1180 lctl set_param mdc.*.stats clear
1182 # was previously test_24D: LU-6101
1183 # readdir() returns correct number of entries after cursor reload
1184 local num_ls=$(ls $DIR/$tdir | wc -l)
1185 local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l)
1186 local num_all=$(ls -a $DIR/$tdir | wc -l)
1187 if [ $num_ls -ne $nrfiles -o $num_uniq -ne $nrfiles -o \
1188 $num_all -ne $((nrfiles + 2)) ]; then
1189 error "Expected $nrfiles files, got $num_ls " \
1190 "($num_uniq unique $num_all .&..)"
1192 # LU-5 large readdir
1193 # dirent_size = 32 bytes for sizeof(struct lu_dirent) +
1194 # N bytes for name (len($nrfiles) rounded to 8 bytes) +
1195 # 8 bytes for luda_type (4 bytes rounded to 8 bytes)
1196 # take into account of overhead in lu_dirpage header and end mark in
1197 # each page, plus one in rpc_num calculation.
1198 local dirent_size=$((32 + (${#tfile} | 7) + 1 + 8))
1199 local page_entries=$(((PAGE_SIZE - 24) / dirent_size))
1200 local mdt_idx=$($LFS getdirstripe -i $(dirname $fname))
1201 local rpc_pages=$(max_pages_per_rpc $mdt_idx)
1202 local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
1203 local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
1204 echo "readpages: $mds_readpage rpc_max: $rpc_max"
1205 (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
1206 error "large readdir doesn't take effect: " \
1207 "$mds_readpage should be about $rpc_max"
1209 simple_cleanup_common
1211 run_test 24v "list large directory (test hash collision, b=17560)"
1213 test_24w() { # bug21506
1215 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
1216 dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
1217 dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
1218 SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
1219 [[ "$SZ1" -eq "$SZ2" ]] ||
1220 error "Error reading at the end of the file $tfile"
1222 run_test 24w "Reading a file larger than 4Gb"
1225 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1226 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1227 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1228 skip "Need MDS version at least 2.7.56"
1231 local remote_dir=$DIR/$tdir/remote_dir
1233 test_mkdir $DIR/$tdir
1234 $LFS mkdir -i $MDTIDX $remote_dir ||
1235 error "create remote directory failed"
1237 test_mkdir $DIR/$tdir/src_dir
1238 touch $DIR/$tdir/src_file
1239 test_mkdir $remote_dir/tgt_dir
1240 touch $remote_dir/tgt_file
1242 mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
1243 error "rename dir cross MDT failed!"
1245 mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
1246 error "rename file cross MDT failed!"
1248 touch $DIR/$tdir/ln_file
1249 ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
1250 error "ln file cross MDT failed"
1252 rm -rf $DIR/$tdir || error "Can not delete directories"
1254 run_test 24x "cross MDT rename/link"
1257 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1258 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1260 local remote_dir=$DIR/$tdir/remote_dir
1263 test_mkdir $DIR/$tdir
1264 $LFS mkdir -i $mdtidx $remote_dir ||
1265 error "create remote directory failed"
1267 test_mkdir $remote_dir/src_dir
1268 touch $remote_dir/src_file
1269 test_mkdir $remote_dir/tgt_dir
1270 touch $remote_dir/tgt_file
1272 mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
1273 error "rename subdir in the same remote dir failed!"
1275 mrename $remote_dir/src_file $remote_dir/tgt_file ||
1276 error "rename files in the same remote dir failed!"
1278 ln $remote_dir/tgt_file $remote_dir/tgt_file1 ||
1279 error "link files in the same remote dir failed!"
1281 rm -rf $DIR/$tdir || error "Can not delete directories"
1283 run_test 24y "rename/link on the same dir should succeed"
1286 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1287 [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] &&
1288 skip "Need MDS version at least 2.12.51"
1292 for index in 0 1; do
1293 $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed"
1294 touch $DIR/$tdir.0/$tfile.$index || error "touch failed"
1297 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed"
1299 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0)
1300 [ $index -eq 0 ] || error "$tfile.0 is on MDT$index"
1302 local mdts=$(comma_list $(mdts_nodes))
1304 do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0
1305 stack_trap "do_nodes $mdts $LCTL \
1306 set_param mdt.*.enable_remote_rename=1" EXIT
1308 mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed"
1310 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1)
1311 [ $index -eq 1 ] || error "$tfile.1 is on MDT$index"
1313 run_test 24z "cross-MDT rename is done as cp"
1315 test_24A() { # LU-3182
1319 test_mkdir $DIR/$tdir
1320 trap simple_cleanup_common EXIT
1321 createmany -m $DIR/$tdir/$tfile $NFILES
1322 local t=$(ls $DIR/$tdir | wc -l)
1323 local u=$(ls $DIR/$tdir | sort -u | wc -l)
1324 local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
1325 if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then
1326 error "Expected $NFILES files, got $t ($u unique $v .&..)"
1329 simple_cleanup_common || error "Can not delete directories"
1331 run_test 24A "readdir() returns correct number of entries."
1333 test_24B() { # LU-4805
1334 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1338 test_mkdir $DIR/$tdir
1339 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
1340 error "create striped dir failed"
1342 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1343 [ $count -eq 2 ] || error "Expected 2, got $count"
1345 touch $DIR/$tdir/striped_dir/a
1347 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1348 [ $count -eq 3 ] || error "Expected 3, got $count"
1350 touch $DIR/$tdir/striped_dir/.f
1352 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1353 [ $count -eq 4 ] || error "Expected 4, got $count"
1355 rm -rf $DIR/$tdir || error "Can not delete directories"
1357 run_test 24B "readdir for striped dir return correct number of entries"
1360 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1366 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
1367 error "create striped dir failed"
1369 cd $DIR/$tdir/d0/striped_dir
1371 local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
1372 local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
1373 local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1375 [ "$d0_ino" = "$parent_ino" ] ||
1376 error ".. wrong, expect $d0_ino, get $parent_ino"
1378 mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
1379 error "mv striped dir failed"
1381 parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1383 [ "$d1_ino" = "$parent_ino" ] ||
1384 error ".. wrong after mv, expect $d1_ino, get $parent_ino"
1386 run_test 24C "check .. in striped dir"
1389 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
1390 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1393 mkdir $DIR/$tdir/src_dir
1394 $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
1395 error "create remote source failed"
1397 touch $DIR/$tdir/src_dir/src_child/a
1399 $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
1400 error "create remote target dir failed"
1402 $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
1403 error "create remote target child failed"
1405 mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
1406 error "rename dir cross MDT failed!"
1410 $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
1411 error "src_child still exists after rename"
1413 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
1414 error "missing file(a) after rename"
1416 rm -rf $DIR/$tdir || error "Can not delete directories"
1418 run_test 24E "cross MDT rename/link"
1421 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
1424 [ "$SLOW" = "no" ] && repeats=100
1428 echo "$repeats repeats"
1429 for ((i = 0; i < repeats; i++)); do
1430 $LFS mkdir -i0 -c2 $DIR/$tdir/test || error "mkdir fails"
1431 touch $DIR/$tdir/test/a || error "touch fails"
1432 mkdir $DIR/$tdir/test/b || error "mkdir fails"
1433 rm -rf $DIR/$tdir/test || error "rmdir fails"
1438 run_test 24F "hash order vs readdir (LU-11330)"
1441 echo '== symlink sanity ============================================='
1445 touch $DIR/s25/foo ||
1446 error "File creation in symlinked directory failed"
1448 run_test 25a "create file in symlinked directory ==============="
1451 [ ! -d $DIR/d25 ] && test_25a
1452 $CHECKSTAT -t file $DIR/s25/foo || error "$DIR/s25/foo not file type"
1454 run_test 25b "lookup file in symlinked directory ==============="
1458 test_mkdir $DIR/d26/d26-2
1459 ln -s d26/d26-2 $DIR/s26
1460 touch $DIR/s26/foo || error "File creation failed"
1462 run_test 26a "multiple component symlink ======================="
1465 test_mkdir -p $DIR/$tdir/d26-2
1466 ln -s $tdir/d26-2/foo $DIR/s26-2
1467 touch $DIR/s26-2 || error "File creation failed"
1469 run_test 26b "multiple component symlink at end of lookup ======"
1472 test_mkdir $DIR/d26.2
1473 touch $DIR/d26.2/foo
1474 ln -s d26.2 $DIR/s26.2-1
1475 ln -s s26.2-1 $DIR/s26.2-2
1476 ln -s s26.2-2 $DIR/s26.2-3
1477 chmod 0666 $DIR/s26.2-3/foo
1479 run_test 26c "chain of symlinks"
1481 # recursive symlinks (bug 439)
1483 ln -s d26-3/foo $DIR/d26-3
1485 run_test 26d "create multiple component recursive symlink"
1488 [ ! -h $DIR/d26-3 ] && test_26d
1491 run_test 26e "unlink multiple component recursive symlink"
1493 # recursive symlinks (bug 7022)
1495 test_mkdir $DIR/$tdir
1496 test_mkdir $DIR/$tdir/$tfile
1497 cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed"
1498 test_mkdir -p lndir/bar1
1499 test_mkdir $DIR/$tdir/$tfile/$tfile
1500 cd $tfile || error "cd $tfile failed"
1501 ln -s .. dotdot || error "ln dotdot failed"
1502 ln -s dotdot/lndir lndir || error "ln lndir failed"
1503 cd $DIR/$tdir || error "cd $DIR/$tdir failed"
1504 output=`ls $tfile/$tfile/lndir/bar1`
1505 [ "$output" = bar1 ] && error "unexpected output"
1506 rm -r $tfile || error "rm $tfile failed"
1507 $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
1509 run_test 26f "rm -r of a directory which has recursive symlink"
1512 test_mkdir $DIR/$tdir
1513 $LFS getstripe $DIR/$tdir
1514 $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed"
1515 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1516 cp /etc/hosts $DIR/$tdir/$tfile || error "Can't copy to one stripe file"
1518 run_test 27a "one stripe file"
1521 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1523 test_mkdir $DIR/$tdir
1524 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1525 $LFS getstripe -c $DIR/$tdir/$tfile
1526 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
1527 error "two-stripe file doesn't have two stripes"
1529 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1531 run_test 27b "create and write to two stripe file"
1534 test_mkdir $DIR/$tdir
1535 $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
1536 error "setstripe failed"
1537 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1538 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1540 run_test 27d "create file with default settings"
1543 # LU-5839 adds check for existed layout before setting it
1544 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1545 skip "Need MDS version at least 2.7.56"
1547 test_mkdir $DIR/$tdir
1548 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1549 $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice"
1550 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1552 run_test 27e "setstripe existing file (should return error)"
1555 test_mkdir $DIR/$tdir
1556 $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
1557 error "$SETSTRIPE $DIR/$tdir/$tfile failed"
1558 $CHECKSTAT -t file $DIR/$tdir/$tfile &&
1559 error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
1560 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1561 $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed"
1563 run_test 27f "setstripe with bad stripe size (should return error)"
1566 test_mkdir $DIR/$tdir
1567 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1568 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" ||
1569 error "$DIR/$tdir/$tfile has object"
1571 run_test 27g "$LFS getstripe with no objects"
1574 test_mkdir $DIR/$tdir
1575 touch $DIR/$tdir/$tfile || error "touch failed"
1576 ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed"
1577 $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2
1579 (( rc == 2 )) || error "getstripe did not return ENOENT"
1581 run_test 27ga "$LFS getstripe with missing file (should return error)"
1584 test_mkdir $DIR/$tdir
1585 touch $DIR/$tdir/$tfile || error "touch failed"
1586 [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] ||
1587 error "missing objects"
1589 run_test 27i "$LFS getstripe with some objects"
1592 test_mkdir $DIR/$tdir
1593 $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile &&
1594 error "setstripe failed" || true
1596 run_test 27j "setstripe with bad stripe offset (should return error)"
1598 test_27k() { # bug 2844
1599 test_mkdir $DIR/$tdir
1600 local file=$DIR/$tdir/$tfile
1601 local ll_max_blksize=$((4 * 1024 * 1024))
1602 $LFS setstripe -S 67108864 $file || error "setstripe failed"
1603 local blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1604 [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize"
1605 dd if=/dev/zero of=$file bs=4k count=1
1606 blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1607 [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize"
1609 run_test 27k "limit i_blksize for broken user apps"
1612 mcreate $DIR/$tfile || error "creating file"
1613 $RUNAS $LFS setstripe -c 1 $DIR/$tfile &&
1614 error "setstripe should have failed" || true
1616 run_test 27l "check setstripe permissions (should return error)"
1619 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1621 ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
1623 if [[ $ORIGFREE -gt $MAXFREE ]]; then
1624 skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
1626 trap simple_cleanup_common EXIT
1627 test_mkdir $DIR/$tdir
1628 $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
1629 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
1630 error "dd should fill OST0"
1632 while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do
1634 [ $i -gt 256 ] && break
1637 touch $DIR/$tdir/$tfile.$i
1638 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1639 awk '{print $1}'| grep -w "0") ] &&
1640 error "OST0 was full but new created file still use it"
1642 touch $DIR/$tdir/$tfile.$i
1643 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1644 awk '{print $1}'| grep -w "0") ] &&
1645 error "OST0 was full but new created file still use it"
1646 simple_cleanup_common
1648 run_test 27m "create file while OST0 was full"
1651 local delay=$(do_facet $SINGLEMDS lctl get_param -n lo[vd].*.qos_maxage |
1652 awk '{ print $1 * 2; exit; }')
1656 # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage)
1657 # if the OST isn't full anymore.
1659 local OSTIDX=${1:-""}
1661 local list=$(comma_list $(osts_nodes))
1662 [ "$OSTIDX" ] && list=$(facet_host ost$((OSTIDX + 1)))
1664 do_nodes $list lctl set_param fail_loc=0
1665 sync # initiate all OST_DESTROYs from MDS to OST
1669 exhaust_precreations() {
1672 local FAILIDX=${3:-$OSTIDX}
1673 local ofacet=ost$((OSTIDX + 1))
1675 test_mkdir -p -c1 $DIR/$tdir
1676 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
1677 local mfacet=mds$((mdtidx + 1))
1678 echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
1680 local OST=$(ostname_from_index $OSTIDX)
1683 local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST)
1684 local last_id=$(do_facet $mfacet lctl get_param -n \
1685 osp.$mdtosc_proc1.prealloc_last_id)
1686 local next_id=$(do_facet $mfacet lctl get_param -n \
1687 osp.$mdtosc_proc1.prealloc_next_id)
1689 local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet)
1690 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1692 test_mkdir -p $DIR/$tdir/${OST}
1693 $SETSTRIPE -i $OSTIDX -c 1 $DIR/$tdir/${OST}
1694 #define OBD_FAIL_OST_ENOSPC 0x215
1695 do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215
1696 echo "Creating to objid $last_id on ost $OST..."
1697 createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
1698 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1699 do_facet $ofacet lctl set_param fail_loc=$FAILLOC
1703 exhaust_all_precreations() {
1705 for (( i=0; i < OSTCOUNT; i++ )) ; do
1706 exhaust_precreations $i $1 -1
1711 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1712 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1713 remote_mds_nodsh && skip "remote MDS with nodsh"
1714 remote_ost_nodsh && skip "remote OST with nodsh"
1717 rm -f $DIR/$tdir/$tfile
1718 exhaust_precreations 0 0x80000215
1719 $LFS setstripe -c -1 $DIR/$tdir || error "setstripe failed"
1720 touch $DIR/$tdir/$tfile || error "touch failed"
1721 $LFS getstripe $DIR/$tdir/$tfile
1724 run_test 27n "create file with some full OSTs"
1727 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1728 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1729 remote_mds_nodsh && skip "remote MDS with nodsh"
1730 remote_ost_nodsh && skip "remote OST with nodsh"
1733 rm -f $DIR/$tdir/$tfile
1734 exhaust_all_precreations 0x215
1736 touch $DIR/$tdir/$tfile && error "able to create $DIR/$tdir/$tfile"
1741 run_test 27o "create file with all full OSTs (should error)"
1744 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1745 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1746 remote_mds_nodsh && skip "remote MDS with nodsh"
1747 remote_ost_nodsh && skip "remote OST with nodsh"
1750 rm -f $DIR/$tdir/$tfile
1751 test_mkdir $DIR/$tdir
1753 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1754 $TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed"
1755 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1757 exhaust_precreations 0 0x80000215
1758 echo foo >> $DIR/$tdir/$tfile || error "append failed"
1759 $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed"
1760 $LFS getstripe $DIR/$tdir/$tfile
1764 run_test 27p "append to a truncated file with some full OSTs"
1767 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1768 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1769 remote_mds_nodsh && skip "remote MDS with nodsh"
1770 remote_ost_nodsh && skip "remote OST with nodsh"
1773 rm -f $DIR/$tdir/$tfile
1775 test_mkdir $DIR/$tdir
1776 $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
1777 $TRUNCATE $DIR/$tdir/$tfile 80000000 ||
1778 error "truncate $DIR/$tdir/$tfile failed"
1779 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1781 exhaust_all_precreations 0x215
1783 echo foo >> $DIR/$tdir/$tfile && error "append succeeded"
1784 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat 2 failed"
1788 run_test 27q "append to truncated file with all OSTs full (should error)"
1791 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1792 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1793 remote_mds_nodsh && skip "remote MDS with nodsh"
1794 remote_ost_nodsh && skip "remote OST with nodsh"
1797 rm -f $DIR/$tdir/$tfile
1798 exhaust_precreations 0 0x80000215
1800 $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1804 run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
1806 test_27s() { # bug 10725
1807 test_mkdir $DIR/$tdir
1808 local stripe_size=$((4096 * 1024 * 1024)) # 2^32
1809 local stripe_count=0
1810 [ $OSTCOUNT -eq 1 ] || stripe_count=2
1811 $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir &&
1812 error "stripe width >= 2^32 succeeded" || true
1815 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
1817 test_27t() { # bug 10864
1822 $WLFS getstripe $tfile
1825 run_test 27t "check that utils parse path correctly"
1827 test_27u() { # bug 4900
1828 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1829 remote_mds_nodsh && skip "remote MDS with nodsh"
1832 local list=$(comma_list $(mdts_nodes))
1834 #define OBD_FAIL_MDS_OSC_PRECREATE 0x139
1835 do_nodes $list $LCTL set_param fail_loc=0x139
1836 test_mkdir -p $DIR/$tdir
1837 trap simple_cleanup_common EXIT
1838 createmany -o $DIR/$tdir/t- 1000
1839 do_nodes $list $LCTL set_param fail_loc=0
1841 TLOG=$TMP/$tfile.getstripe
1842 $LFS getstripe $DIR/$tdir > $TLOG
1843 OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
1844 unlinkmany $DIR/$tdir/t- 1000
1846 [[ $OBJS -gt 0 ]] &&
1847 error "$OBJS objects created on OST-0. See $TLOG" ||
1850 run_test 27u "skip object creation on OSC w/o objects"
1852 test_27v() { # bug 4900
1853 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1854 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1855 remote_mds_nodsh && skip "remote MDS with nodsh"
1856 remote_ost_nodsh && skip "remote OST with nodsh"
1858 exhaust_all_precreations 0x215
1861 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1863 touch $DIR/$tdir/$tfile
1864 #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
1866 for (( i=1; i < OSTCOUNT; i++ )); do
1867 do_facet ost$i lctl set_param fail_loc=0x705
1869 local START=`date +%s`
1870 createmany -o $DIR/$tdir/$tfile 32
1872 local FINISH=`date +%s`
1873 local TIMEOUT=`lctl get_param -n timeout`
1874 local PROCESS=$((FINISH - START))
1875 [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
1876 error "$FINISH - $START >= $TIMEOUT / 2"
1877 sleep $((TIMEOUT / 2 - PROCESS))
1880 run_test 27v "skip object creation on slow OST"
1882 test_27w() { # bug 10997
1883 test_mkdir $DIR/$tdir
1884 $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
1885 [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
1886 error "stripe size $size != 65536" || true
1887 [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
1888 error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
1890 run_test 27w "check $LFS setstripe -S and getstrip -d options"
1893 [[ $OSTCOUNT -lt 2 ]] &&
1894 skip_env "skipping multiple stripe count/offset test"
1896 test_mkdir $DIR/$tdir
1897 for i in $(seq 1 $OSTCOUNT); do
1899 $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i ||
1900 error "setstripe -c $i -i $offset failed"
1901 count=$($LFS getstripe -c $DIR/$tdir/f$i)
1902 index=$($LFS getstripe -i $DIR/$tdir/f$i)
1903 [ $count -ne $i ] && error "stripe count $count != $i" || true
1904 [ $index -ne $offset ] &&
1905 error "stripe offset $index != $offset" || true
1908 run_test 27wa "check $LFS setstripe -c -i options"
1911 remote_ost_nodsh && skip "remote OST with nodsh"
1912 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1913 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1915 OFFSET=$(($OSTCOUNT - 1))
1917 local OST=$(ostname_from_index $OSTIDX)
1919 test_mkdir $DIR/$tdir
1920 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file
1921 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1
1923 createmany -o $DIR/$tdir/$tfile $OSTCOUNT
1924 for i in $(seq 0 $OFFSET); do
1925 [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx |
1926 awk '{print $1}' | grep -w "$OSTIDX") ] &&
1927 error "OST0 was degraded but new created file still use it"
1929 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0
1931 run_test 27x "create files while OST0 is degraded"
1934 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1935 remote_mds_nodsh && skip "remote MDS with nodsh"
1936 remote_ost_nodsh && skip "remote OST with nodsh"
1937 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1939 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
1940 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
1941 osp.$mdtosc.prealloc_last_id)
1942 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
1943 osp.$mdtosc.prealloc_next_id)
1944 local fcount=$((last_id - next_id))
1945 [[ $fcount -eq 0 ]] && skip "not enough space on OST0"
1946 [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
1948 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
1949 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
1950 local OST_DEACTIVE_IDX=-1
1955 for OSC in $MDS_OSCS; do
1956 OST=$(osc_to_ost $OSC)
1957 OSTIDX=$(index_from_ostuuid $OST)
1958 if [ $OST_DEACTIVE_IDX == -1 ]; then
1959 OST_DEACTIVE_IDX=$OSTIDX
1961 if [ $OSTIDX != $OST_DEACTIVE_IDX ]; then
1962 echo $OSC "is Deactivated:"
1963 do_facet $SINGLEMDS lctl --device %$OSC deactivate
1967 OSTIDX=$(index_from_ostuuid $OST)
1968 test_mkdir $DIR/$tdir
1969 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1971 for OSC in $MDS_OSCS; do
1972 OST=$(osc_to_ost $OSC)
1973 OSTIDX=$(index_from_ostuuid $OST)
1974 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
1975 echo $OST "is degraded:"
1976 do_facet ost$((OSTIDX+1)) lctl set_param -n \
1977 obdfilter.$OST.degraded=1
1982 createmany -o $DIR/$tdir/$tfile $fcount
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 recovered from degraded:"
1989 do_facet ost$((OSTIDX+1)) lctl set_param -n \
1990 obdfilter.$OST.degraded=0
1992 do_facet $SINGLEMDS lctl --device %$OSC activate
1996 # all osp devices get activated, hence -1 stripe count restored
1997 local stripe_count=0
1999 # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp
2000 # devices get activated.
2002 $LFS setstripe -c -1 $DIR/$tfile
2003 stripe_count=$($LFS getstripe -c $DIR/$tfile)
2005 [ $stripe_count -ne $OSTCOUNT ] &&
2006 error "Of $OSTCOUNT OSTs, only $stripe_count is available"
2009 run_test 27y "create files while OST0 is degraded and the rest inactive"
2015 lmm_count=$($GETSTRIPE -c $1)
2016 lmm_seq=$($GETSTRIPE -v $1 | awk '/lmm_seq/ { print $2 }')
2017 lmm_oid=$($GETSTRIPE -v $1 | awk '/lmm_object_id/ { print $2 }')
2019 local old_ifs="$IFS"
2021 fid=($($LFS path2fid $1))
2024 log "FID seq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}"
2025 log "LOV seq $lmm_seq, oid $lmm_oid, count: $lmm_count"
2027 # compare lmm_seq and lu_fid->f_seq
2028 [ $lmm_seq = ${fid[1]} ] || { error "SEQ mismatch"; return 1; }
2029 # compare lmm_object_id and lu_fid->oid
2030 [ $lmm_oid = ${fid[2]} ] || { error "OID mismatch"; return 2; }
2032 # check the trusted.fid attribute of the OST objects of the file
2033 local have_obdidx=false
2035 $GETSTRIPE $1 | while read obdidx oid hex seq; do
2036 # skip lines up to and including "obdidx"
2037 [ -z "$obdidx" ] && break
2038 [ "$obdidx" = "obdidx" ] && have_obdidx=true && continue
2039 $have_obdidx || continue
2041 local ost=$((obdidx + 1))
2042 local dev=$(ostdevname $ost)
2045 log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
2047 seq=$(echo $seq | sed -e "s/^0x//g")
2048 if [ $seq == 0 ] || [ $(facet_fstype ost$ost) == zfs ]; then
2049 oid_hex=$(echo $oid)
2051 oid_hex=$(echo $hex | sed -e "s/^0x//g")
2053 local obj_file="O/$seq/d$((oid %32))/$oid_hex"
2057 # Don't unmount/remount the OSTs if we don't need to do that.
2058 # LU-2577 changes filter_fid to be smaller, so debugfs needs
2059 # update too, until that use mount/ll_decode_filter_fid/mount.
2060 # Re-enable when debugfs will understand new filter_fid.
2062 if [ $(facet_fstype ost$ost) == ldiskfs ]; then
2063 ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
2064 $dev 2>/dev/null" | grep "parent=")
2066 if [ -z "$ff" ]; then
2068 mount_fstype ost$ost
2069 ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
2070 $(facet_mntpt ost$ost)/$obj_file)
2071 unmount_fstype ost$ost
2072 start ost$ost $dev $OST_MOUNT_OPTS
2076 [ -z "$ff" ] && error "$obj_file: no filter_fid info"
2078 echo "$ff" | sed -e 's#.*objid=#got: objid=#'
2080 # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
2081 # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
2083 # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \
2084 # stripe_size=1048576 component_id=1 component_start=0 \
2085 # component_end=33554432
2086 local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff)
2087 local ff_pseq=$(cut -d: -f1 <<<$ff_parent)
2088 local ff_poid=$(cut -d: -f2 <<<$ff_parent)
2090 if grep -q 'stripe=' <<<$ff; then
2091 ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff)
2093 # $LL_DECODE_FILTER_FID does not print "stripe="; look
2094 # into f_ver in this case. See comment on ff_parent.
2095 ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//')
2098 # compare lmm_seq and filter_fid->ff_parent.f_seq
2099 [ $ff_pseq = $lmm_seq ] ||
2100 error "FF parent SEQ $ff_pseq != $lmm_seq"
2101 # compare lmm_object_id and filter_fid->ff_parent.f_oid
2102 [ $ff_poid = $lmm_oid ] ||
2103 error "FF parent OID $ff_poid != $lmm_oid"
2104 (($ff_pstripe == $stripe_nr)) ||
2105 error "FF stripe $ff_pstripe != $stripe_nr"
2107 stripe_nr=$((stripe_nr + 1))
2108 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2110 if grep -q 'stripe_count=' <<<$ff; then
2111 local ff_scnt=$(sed -e 's/.*stripe_count=//' \
2112 -e 's/ .*//' <<<$ff)
2113 [ $lmm_count = $ff_scnt ] ||
2114 error "FF stripe count $lmm_count != $ff_scnt"
2120 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2121 remote_ost_nodsh && skip "remote OST with nodsh"
2123 test_mkdir $DIR/$tdir
2124 $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
2125 { error "setstripe -c -1 failed"; return 1; }
2126 # We need to send a write to every object to get parent FID info set.
2127 # This _should_ also work for setattr, but does not currently.
2128 # touch $DIR/$tdir/$tfile-1 ||
2129 dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
2130 { error "dd $tfile-1 failed"; return 2; }
2131 $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
2132 { error "setstripe -c -1 failed"; return 3; }
2133 dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
2134 { error "dd $tfile-2 failed"; return 4; }
2136 # make sure write RPCs have been sent to OSTs
2139 check_seq_oid $DIR/$tdir/$tfile-1 || return 5
2140 check_seq_oid $DIR/$tdir/$tfile-2 || return 6
2142 run_test 27z "check SEQ/OID on the MDT and OST filesystems"
2144 test_27A() { # b=19102
2145 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2147 save_layout_restore_at_exit $MOUNT
2148 $LFS setstripe -c 0 -i -1 -S 0 $MOUNT
2149 wait_update $HOSTNAME "$GETSTRIPE -c $MOUNT | sed 's/ *//g'" "1" 20 ||
2150 error "stripe count $($GETSTRIPE -c $MOUNT) != 1"
2151 local default_size=$($GETSTRIPE -S $MOUNT)
2152 local default_offset=$($GETSTRIPE -i $MOUNT)
2153 local dsize=$(do_facet $SINGLEMDS \
2154 "$LCTL get_param -n lod.$(facet_svc $SINGLEMDS)*.stripesize")
2155 [ $default_size -eq $dsize ] ||
2156 error "stripe size $default_size != $dsize"
2157 [ $default_offset -eq -1 ] ||
2158 error "stripe offset $default_offset != -1"
2160 run_test 27A "check filesystem-wide default LOV EA values"
2162 test_27B() { # LU-2523
2163 test_mkdir $DIR/$tdir
2164 rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
2166 # open f1 with O_LOV_DELAY_CREATE
2168 # call setstripe ioctl on open file descriptor for f1
2170 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:nB1c \
2174 # open f1 with O_LOV_DELAY_CREATE
2176 # call setstripe ioctl on open file descriptor for f1
2178 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:uB1c
2180 # Allow multiop to fail in imitation of NFS's busted semantics.
2183 run_test 27B "call setstripe on open unlinked file/rename victim"
2185 test_27C() { #LU-2871
2186 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2194 test_mkdir $DIR/$tdir
2196 for i in $(seq 0 $((OSTCOUNT - 1))); do
2197 # set stripe across all OSTs starting from OST$i
2198 $SETSTRIPE -i $i -c -1 $tfile$i
2199 # get striping information
2200 ost_idx=($($GETSTRIPE $tfile$i |
2201 tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
2205 [ ${#ost_idx[@]} -eq $OSTCOUNT ] ||
2206 error "${#ost_idx[@]} != $OSTCOUNT"
2208 for index in $(seq 0 $((OSTCOUNT - 1))); do
2210 for j in $(echo ${ost_idx[@]}); do
2211 if [ $index -eq $j ]; then
2217 error "Can not find $index in ${ost_idx[@]}"
2221 run_test 27C "check full striping across all OSTs"
2224 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2225 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2226 remote_mds_nodsh && skip "remote MDS with nodsh"
2228 local POOL=${POOL:-testpool}
2230 local last_ost=$(($OSTCOUNT - 1))
2232 local ost_list=$(seq $first_ost $ost_step $last_ost)
2233 local ost_range="$first_ost $last_ost $ost_step"
2235 test_mkdir $DIR/$tdir
2236 pool_add $POOL || error "pool_add failed"
2237 pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
2240 [ $MDS1_VERSION -lt $(version_code 2.8.55) ] &&
2242 [ $MDS1_VERSION -lt $(version_code 2.9.55) -o \
2243 $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2244 skip27D+=" -s 30,31"
2245 llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
2246 error "llapi_layout_test failed"
2248 destroy_test_pools || error "destroy test pools failed"
2250 run_test 27D "validate llapi_layout API"
2252 # Verify that default_easize is increased from its initial value after
2253 # accessing a widely striped file.
2255 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2256 [ $CLIENT_VERSION -lt $(version_code 2.5.57) ] &&
2257 skip "client does not have LU-3338 fix"
2259 # 72 bytes is the minimum space required to store striping
2260 # information for a file striped across one OST:
2261 # (sizeof(struct lov_user_md_v3) +
2262 # sizeof(struct lov_user_ost_data_v1))
2264 $LCTL set_param -n llite.*.default_easize $min_easize ||
2265 error "lctl set_param failed"
2266 local easize=$($LCTL get_param -n llite.*.default_easize)
2268 [ $easize -eq $min_easize ] ||
2269 error "failed to set default_easize"
2271 $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
2272 error "setstripe failed"
2276 easize=$($LCTL get_param -n llite.*.default_easize)
2278 [ $easize -gt $min_easize ] ||
2279 error "default_easize not updated"
2281 run_test 27E "check that default extended attribute size properly increases"
2283 test_27F() { # LU-5346/LU-7975
2284 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2285 [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs"
2286 [[ $MDS1_VERSION -lt $(version_code 2.8.51) ]] &&
2287 skip "Need MDS version at least 2.8.51"
2288 remote_ost_nodsh && skip "remote OST with nodsh"
2290 test_mkdir $DIR/$tdir
2292 $SETSTRIPE -c 2 $DIR/$tdir
2294 # stop all OSTs to reproduce situation for LU-7975 ticket
2295 for num in $(seq $OSTCOUNT); do
2299 # open/create f0 with O_LOV_DELAY_CREATE
2300 # truncate f0 to a non-0 size
2302 multiop $DIR/$tdir/f0 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T1050000c
2304 $CHECKSTAT -s 1050000 $DIR/$tdir/f0 || error "checkstat failed"
2305 # open/write it again to force delayed layout creation
2306 cat /etc/hosts > $DIR/$tdir/f0 &
2310 for num in $(seq $OSTCOUNT); do
2311 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS ||
2312 error "ost$num failed to start"
2315 wait $catpid || error "cat failed"
2317 cmp /etc/hosts $DIR/$tdir/f0 || error "cmp failed"
2318 [[ $($GETSTRIPE -c $DIR/$tdir/f0) == 2 ]] || error "wrong stripecount"
2321 run_test 27F "Client resend delayed layout creation with non-zero size"
2323 test_27G() { #LU-10629
2324 [ $MDS1_VERSION -lt $(version_code 2.11.51) ] &&
2325 skip "Need MDS version at least 2.11.51"
2326 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2327 remote_mds_nodsh && skip "remote MDS with nodsh"
2328 local POOL=${POOL:-testpool}
2329 local ostrange="0 0 1"
2331 test_mkdir $DIR/$tdir
2332 pool_add $POOL || error "pool_add failed"
2333 pool_add_targets $POOL $ostrange || error "pool_add_targets failed"
2334 $LFS setstripe -p $POOL $DIR/$tdir
2336 local pool=$($LFS getstripe -p $DIR/$tdir)
2338 [ "$pool" = "$POOL" ] || error "Striping failed got '$pool' not '$POOL'"
2340 $LFS setstripe -d $DIR/$tdir
2342 pool=$($LFS getstripe -p $DIR/$tdir)
2346 [ -z "$pool" ] || error "'$pool' is not empty"
2348 run_test 27G "Clear OST pool from stripe"
2351 [[ $MDS1_VERSION -le $(version_code 2.11.54) ]] &&
2352 skip "Need MDS version newer than 2.11.54"
2353 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
2354 test_mkdir $DIR/$tdir
2355 $LFS setstripe -o 0 -o 2 $DIR/$tdir || error "setstripe failed"
2356 touch $DIR/$tdir/$tfile
2357 $LFS getstripe -c $DIR/$tdir/$tfile
2358 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
2359 error "two-stripe file doesn't have two stripes"
2361 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
2362 $LFS getstripe -y $DIR/$tdir/$tfile
2363 (( $($LFS getstripe -y $DIR/$tdir/$tfile |
2364 egrep -c "l_ost_idx: [02]$") == "2" )) ||
2365 error "expected l_ost_idx: [02]$ not matched"
2367 # make sure ost list have been cleared
2368 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
2369 $LFS setstripe -S $((stripesize * 4)) -i 1 \
2370 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
2372 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
2374 run_test 27H "Set specific OSTs stripe"
2376 # createtest also checks that device nodes are created and
2377 # then visible correctly (#2091)
2378 test_28() { # bug 2091
2380 $CREATETEST $DIR/d28/ct || error "createtest failed"
2382 run_test 28 "create/mknod/mkdir with bad file types ============"
2385 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2387 sync; sleep 1; sync # flush out any dirty pages from previous tests
2394 declare -i LOCKCOUNTORIG=0
2395 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2396 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
2398 [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
2400 declare -i LOCKUNUSEDCOUNTORIG=0
2401 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2402 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
2409 declare -i LOCKCOUNTCURRENT=0
2410 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2411 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
2414 declare -i LOCKUNUSEDCOUNTCURRENT=0
2415 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2416 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
2419 if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
2420 $LCTL set_param -n ldlm.dump_namespaces ""
2421 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
2422 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2423 log "dumped log to $TMP/test_29.dk (bug 5793)"
2426 if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
2427 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
2428 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2429 log "dumped log to $TMP/test_29.dk (bug 5793)"
2433 run_test 29 "IT_GETATTR regression ============================"
2435 test_30a() { # was test_30
2436 cp $(which ls) $DIR || cp /bin/ls $DIR
2437 $DIR/ls / || error "Can't execute binary from lustre"
2440 run_test 30a "execute binary from Lustre (execve) =============="
2443 cp `which ls` $DIR || cp /bin/ls $DIR
2445 $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
2448 run_test 30b "execute binary from Lustre as non-root ==========="
2450 test_30c() { # b=22376
2451 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2453 cp `which ls` $DIR || cp /bin/ls $DIR
2455 cancel_lru_locks mdc
2456 cancel_lru_locks osc
2457 $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
2460 run_test 30c "execute binary from Lustre without read perms ===="
2463 $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
2464 $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
2466 run_test 31a "open-unlink file =================================="
2469 touch $DIR/f31 || error "touch $DIR/f31 failed"
2470 ln $DIR/f31 $DIR/f31b || error "ln failed"
2471 $MULTIOP $DIR/f31b Ouc || error "multiop failed"
2472 $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
2474 run_test 31b "unlink file with multiple links while open ======="
2477 touch $DIR/f31 || error "touch $DIR/f31 failed"
2478 ln $DIR/f31 $DIR/f31c || error "ln failed"
2479 multiop_bg_pause $DIR/f31 O_uc ||
2480 error "multiop_bg_pause for $DIR/f31 failed"
2482 $MULTIOP $DIR/f31c Ouc
2483 kill -USR1 $MULTIPID
2486 run_test 31c "open-unlink file with multiple links ============="
2489 opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
2490 $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
2492 run_test 31d "remove of open directory ========================="
2494 test_31e() { # bug 2904
2495 openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
2497 run_test 31e "remove of open non-empty directory ==============="
2499 test_31f() { # bug 4554
2500 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2503 test_mkdir $DIR/d31f
2504 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2505 cp /etc/hosts $DIR/d31f
2507 $GETSTRIPE $DIR/d31f/hosts
2508 multiop_bg_pause $DIR/d31f D_c || return 1
2511 rm -rv $DIR/d31f || error "first of $DIR/d31f"
2512 test_mkdir $DIR/d31f
2513 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2514 cp /etc/hosts $DIR/d31f
2516 $GETSTRIPE $DIR/d31f/hosts
2517 multiop_bg_pause $DIR/d31f D_c || return 1
2520 kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
2521 wait $MULTIPID || error "first opendir $MULTIPID failed"
2525 kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
2526 wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
2529 run_test 31f "remove of open directory with open-unlink file ==="
2532 echo "-- cross directory link --"
2533 test_mkdir -c1 $DIR/${tdir}ga
2534 test_mkdir -c1 $DIR/${tdir}gb
2535 touch $DIR/${tdir}ga/f
2536 ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
2537 $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
2538 [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
2539 $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
2540 [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
2542 run_test 31g "cross directory link==============="
2545 echo "-- cross directory link --"
2546 test_mkdir -c1 $DIR/${tdir}
2547 test_mkdir -c1 $DIR/${tdir}/dir
2548 touch $DIR/${tdir}/f
2549 ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
2550 $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
2551 [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
2552 $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
2553 [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
2555 run_test 31h "cross directory link under child==============="
2558 echo "-- cross directory link --"
2559 test_mkdir -c1 $DIR/$tdir
2560 test_mkdir -c1 $DIR/$tdir/dir
2561 touch $DIR/$tdir/dir/f
2562 ln $DIR/$tdir/dir/f $DIR/$tdir/g
2563 $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
2564 [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
2565 $CHECKSTAT -t file $DIR/$tdir/g || error "target"
2566 [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
2568 run_test 31i "cross directory link under parent==============="
2571 test_mkdir -c1 -p $DIR/$tdir
2572 test_mkdir -c1 -p $DIR/$tdir/dir1
2573 ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
2574 link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
2575 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
2576 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
2579 run_test 31j "link for directory==============="
2582 test_mkdir -c1 -p $DIR/$tdir
2584 touch $DIR/$tdir/exist
2585 mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
2586 mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
2587 mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
2588 mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
2589 mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
2590 mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
2591 mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
2594 run_test 31k "link to file: the same, non-existing, dir==============="
2600 touch $DIR/d31m2/exist
2601 mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
2602 mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
2603 mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
2604 mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
2605 mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
2606 mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
2609 run_test 31m "link to file: the same, non-existing, dir==============="
2612 touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
2613 nlink=$(stat --format=%h $DIR/$tfile)
2614 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2616 local cmd="exec $fd<$DIR/$tfile"
2619 trap "eval $cmd" EXIT
2620 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2621 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2622 rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
2623 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2624 [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
2627 run_test 31n "check link count of unlinked file"
2630 local TEMPNAME=$(mktemp $1_XXXXXX)
2631 mlink $TEMPNAME $1 2> /dev/null &&
2632 echo "$BASHPID: link $TEMPNAME to $1 succeeded"
2636 test_31o() { # LU-2901
2637 test_mkdir $DIR/$tdir
2638 for LOOP in $(seq 100); do
2639 rm -f $DIR/$tdir/$tfile*
2640 for THREAD in $(seq 8); do
2641 link_one $DIR/$tdir/$tfile.$LOOP &
2644 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
2645 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
2646 error "$LINKS duplicate links to $tfile.$LOOP" &&
2650 run_test 31o "duplicate hard links with same filename"
2653 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
2655 test_mkdir $DIR/$tdir
2656 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
2657 $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
2659 opendirunlink $DIR/$tdir/striped_dir/test1 ||
2660 error "open unlink test1 failed"
2661 opendirunlink $DIR/$tdir/striped_dir/test2 ||
2662 error "open unlink test2 failed"
2664 $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
2665 error "test1 still exists"
2666 $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
2667 error "test2 still exists"
2669 run_test 31p "remove of open striped directory"
2671 cleanup_test32_mount() {
2674 local loopdev=$(losetup -a | grep $EXT2_DEV | sed -ne 's/:.*$//p')
2675 $UMOUNT $DIR/$tdir/ext2-mountpoint || rc=$?
2676 losetup -d $loopdev || true
2682 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2684 echo "== more mountpoints and symlinks ================="
2685 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2686 trap cleanup_test32_mount EXIT
2687 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2688 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2689 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2690 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/.. ||
2691 error "$DIR/$tdir/ext2-mountpoint/.. not dir type"
2692 cleanup_test32_mount
2694 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
2697 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2699 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2700 trap cleanup_test32_mount EXIT
2701 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2702 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2703 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2704 ls -al $DIR/$tdir/ext2-mountpoint/.. ||
2705 error "Can't list $DIR/$tdir/ext2-mountpoint/.."
2706 cleanup_test32_mount
2708 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
2711 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2713 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2714 trap cleanup_test32_mount EXIT
2715 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2716 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2717 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2718 test_mkdir -p $DIR/$tdir/d2/test_dir
2719 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2720 error "$DIR/$tdir/ext2-mountpoint/../d2/test_dir not dir type"
2721 cleanup_test32_mount
2723 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
2726 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2728 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2729 trap cleanup_test32_mount EXIT
2730 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2731 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2732 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2733 test_mkdir -p $DIR/$tdir/d2/test_dir
2734 ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2735 error "Can't list $DIR/$tdir/ext2-mountpoint/../d2/test_dir"
2736 cleanup_test32_mount
2738 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
2742 test_mkdir -p $DIR/$tdir/tmp
2743 local tmp_dir=$DIR/$tdir/tmp
2744 ln -s $DIR/$tdir $tmp_dir/symlink11
2745 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2746 $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2747 $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
2749 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
2753 test_mkdir -p $DIR/$tdir/tmp
2754 local tmp_dir=$DIR/$tdir/tmp
2755 ln -s $DIR/$tdir $tmp_dir/symlink11
2756 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2757 ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2758 ls $DIR/$tdir/symlink01 || error "symlink01 bad"
2760 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
2763 local tmp_dir=$DIR/$tdir/tmp
2764 test_mkdir -p $tmp_dir
2765 test_mkdir $DIR/${tdir}2
2766 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2767 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2768 $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
2769 $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
2770 $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
2771 $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
2773 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2776 rm -fr $DIR/$tdir $DIR/${tdir}2
2777 tmp_dir=$DIR/$tdir/tmp
2778 test_mkdir -p $tmp_dir
2779 test_mkdir $DIR/${tdir}2
2780 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2781 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2782 ls $tmp_dir/symlink12 || error "listing symlink12"
2783 ls $DIR/$tdir/symlink02 || error "listing symlink02"
2785 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2788 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2790 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2791 trap cleanup_test32_mount EXIT
2792 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2793 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2794 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2795 touch $DIR/$tdir/test_file
2796 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../test_file ||
2797 error "$DIR/$tdir/ext2-mountpoint/../test_file not file type"
2798 cleanup_test32_mount
2800 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
2803 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2805 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2806 trap cleanup_test32_mount EXIT
2807 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2808 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2809 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2810 touch $DIR/$tdir/test_file
2811 cat $DIR/$tdir/ext2-mountpoint/../test_file ||
2812 error "Can't open $DIR/$tdir/ext2-mountpoint/../test_file"
2813 cleanup_test32_mount
2815 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
2818 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2821 trap cleanup_test32_mount EXIT
2822 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2823 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2824 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2825 test_mkdir -p $DIR/$tdir/d2
2826 touch $DIR/$tdir/d2/test_file || error "touch failed"
2827 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2828 error "$DIR/$tdir/ext2-mountpoint/../d2/test_file not file type"
2829 cleanup_test32_mount
2831 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
2834 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2837 trap cleanup_test32_mount EXIT
2838 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2839 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2840 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2841 test_mkdir -p $DIR/$tdir/d2
2842 touch $DIR/$tdir/d2/test_file || error "touch failed"
2843 cat $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2844 error "Can't open $DIR/$tdir/ext2-mountpoint/../d2/test_file"
2845 cleanup_test32_mount
2847 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
2851 test_mkdir -p $DIR/d32m/tmp
2852 TMP_DIR=$DIR/d32m/tmp
2853 ln -s $DIR $TMP_DIR/symlink11
2854 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
2855 $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 ||
2856 error "symlink11 not a link"
2857 $CHECKSTAT -t link $DIR/d32m/symlink01 ||
2858 error "symlink01 not a link"
2860 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
2864 test_mkdir -p $DIR/d32n/tmp
2865 TMP_DIR=$DIR/d32n/tmp
2866 ln -s $DIR $TMP_DIR/symlink11
2867 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
2868 ls -l $DIR/d32n/tmp/symlink11 || error "listing symlink11"
2869 ls -l $DIR/d32n/symlink01 || error "listing symlink01"
2871 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
2875 test_mkdir -p $DIR/d32o/tmp
2876 TMP_DIR=$DIR/d32o/tmp
2877 ln -s $DIR/$tfile $TMP_DIR/symlink12
2878 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
2879 $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 ||
2880 error "symlink12 not a link"
2881 $CHECKSTAT -t link $DIR/d32o/symlink02 || error "symlink02 not a link"
2882 $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 ||
2883 error "$DIR/d32o/tmp/symlink12 not file type"
2884 $CHECKSTAT -t file -f $DIR/d32o/symlink02 ||
2885 error "$DIR/d32o/symlink02 not file type"
2887 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
2897 test_mkdir -p $DIR/d32p/tmp
2899 TMP_DIR=$DIR/d32p/tmp
2901 ln -s $DIR/$tfile $TMP_DIR/symlink12
2903 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
2905 cat $DIR/d32p/tmp/symlink12 ||
2906 error "Can't open $DIR/d32p/tmp/symlink12"
2908 cat $DIR/d32p/symlink02 || error "Can't open $DIR/d32p/symlink02"
2911 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
2914 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2916 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2917 trap cleanup_test32_mount EXIT
2918 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2919 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
2920 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2921 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2922 ls $DIR/$tdir/ext2-mountpoint | grep "\<under_the_mount\>" && error
2923 cleanup_test32_mount
2925 run_test 32q "stat follows mountpoints in Lustre (should return error)"
2928 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2930 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2931 trap cleanup_test32_mount EXIT
2932 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2933 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
2934 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2935 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2936 ls $DIR/$tdir/ext2-mountpoint | grep -q under_the_mount && error || true
2937 cleanup_test32_mount
2939 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
2944 chmod 444 $DIR/$tfile
2945 chown $RUNAS_ID $DIR/$tfile
2947 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
2950 run_test 33aa "write file with mode 444 (should return error)"
2954 test_mkdir $DIR/$tdir
2955 chown $RUNAS_ID $DIR/$tdir
2956 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
2957 error "$RUNAS create $tdir/$tfile failed"
2958 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
2959 error "open RDWR" || true
2961 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
2965 test_mkdir $DIR/$tdir
2966 chown $RUNAS_ID $DIR/$tdir
2967 $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
2969 run_test 33b "test open file with malformed flags (No panic)"
2972 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2973 remote_ost_nodsh && skip "remote OST with nodsh"
2982 test_mkdir $DIR/$tdir
2983 # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
2986 for ostnum in $(seq $OSTCOUNT); do
2987 # test-framework's OST numbering is one-based, while Lustre's
2989 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
2990 # Parsing llobdstat's output sucks; we could grep the /proc
2991 # path, but that's likely to not be as portable as using the
2992 # llobdstat utility. So we parse lctl output instead.
2993 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
2994 obdfilter/$ostname/stats |
2995 awk '/^write_bytes/ {print $7}' )
2996 echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes"
2997 if (( ${write_bytes:-0} > 0 ))
3004 $all_zeros || return 0
3007 echo foo > $DIR/$tdir/bar
3011 # Total up write_bytes after writing. We'd better find non-zeros.
3012 for ostnum in $(seq $OSTCOUNT); do
3013 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3014 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3015 obdfilter/$ostname/stats |
3016 awk '/^write_bytes/ {print $7}' )
3017 echo "write_bytes@$OSTnum/$ostname=$write_bytes"
3018 if (( ${write_bytes:-0} > 0 ))
3027 for ostnum in $(seq $OSTCOUNT); do
3028 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3029 echo "Check that write_bytes is present in obdfilter/*/stats:"
3030 do_facet ost$ostnum lctl get_param -n \
3031 obdfilter/$ostname/stats
3033 error "OST not keeping write_bytes stats (b22312)"
3036 run_test 33c "test llobdstat and write_bytes"
3039 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3040 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3043 local remote_dir=$DIR/$tdir/remote_dir
3045 test_mkdir $DIR/$tdir
3046 $LFS mkdir -i $MDTIDX $remote_dir ||
3047 error "create remote directory failed"
3049 touch $remote_dir/$tfile
3050 chmod 444 $remote_dir/$tfile
3051 chown $RUNAS_ID $remote_dir/$tfile
3053 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3055 chown $RUNAS_ID $remote_dir
3056 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
3057 error "create" || true
3058 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
3059 error "open RDWR" || true
3060 $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
3062 run_test 33d "openfile with 444 modes and malformed flags under remote dir"
3065 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3069 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3070 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3071 mkdir $DIR/$tdir/local_dir
3073 local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3074 local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3075 local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3077 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3078 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
3080 rmdir $DIR/$tdir/* || error "rmdir failed"
3083 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3084 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3085 mkdir $DIR/$tdir/local_dir
3087 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3088 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3089 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3091 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3092 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
3094 rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
3097 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3098 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3099 mkdir $DIR/$tdir/local_dir
3101 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3102 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3103 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3105 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3106 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
3108 run_test 33e "mkdir and striped directory should have same mode"
3112 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
3116 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3117 remote_mds_nodsh && skip "remote MDS with nodsh"
3120 chmod go+rwx $DIR/$tdir
3121 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
3122 trap cleanup_33f EXIT
3124 $RUNAS lfs mkdir -i 0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
3125 error "cannot create striped directory"
3127 $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
3128 error "cannot create files in striped directory"
3130 $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
3131 error "cannot remove files in striped directory"
3133 $RUNAS rmdir $DIR/$tdir/striped_dir ||
3134 error "cannot remove striped directory"
3138 run_test 33f "nonroot user can create, access, and remove a striped directory"
3141 mkdir -p $DIR/$tdir/dir2
3143 local err=$($RUNAS mkdir $DIR/$tdir/dir2 2>&1)
3145 [[ $err =~ "exists" ]] || error "Not exists error"
3147 run_test 33g "nonroot user create already existing root created file"
3149 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
3152 $MCREATE $DIR/f34 || error "mcreate failed"
3153 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3154 error "getstripe failed"
3155 $TRUNCATE $DIR/f34 $TEST_34_SIZE || error "truncate failed"
3156 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3157 error "getstripe failed"
3158 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3159 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3161 run_test 34a "truncate file that has not been opened ==========="
3164 [ ! -f $DIR/f34 ] && test_34a
3165 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3166 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3167 $OPENFILE -f O_RDONLY $DIR/f34
3168 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3169 error "getstripe failed"
3170 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3171 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3173 run_test 34b "O_RDONLY opening file doesn't create objects ====="
3176 [ ! -f $DIR/f34 ] && test_34a
3177 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3178 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3179 $OPENFILE -f O_RDWR $DIR/f34
3180 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" && error
3181 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3182 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3184 run_test 34c "O_RDWR opening file-with-size works =============="
3187 [ ! -f $DIR/f34 ] && test_34a
3188 dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 ||
3190 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3191 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3194 run_test 34d "write to sparse file ============================="
3198 $MCREATE $DIR/f34e || error "mcreate failed"
3199 $TRUNCATE $DIR/f34e 1000 || error "truncate failed"
3200 $CHECKSTAT -s 1000 $DIR/f34e ||
3201 error "Size of $DIR/f34e not equal to 1000 bytes"
3202 $OPENFILE -f O_RDWR $DIR/f34e
3203 $CHECKSTAT -s 1000 $DIR/f34e ||
3204 error "Size of $DIR/f34e not equal to 1000 bytes"
3206 run_test 34e "create objects, some with size and some without =="
3208 test_34f() { # bug 6242, 6243
3209 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3213 $MCREATE $DIR/f34f || error "mcreate failed"
3214 $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
3215 dd if=$DIR/f34f of=$TMP/f34f
3216 $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
3217 dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
3218 cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
3219 cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
3220 rm $TMP/f34f $TMP/f34fzero $DIR/f34f
3222 run_test 34f "read from a file with no objects until EOF ======="
3225 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3227 dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE ||
3229 $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error "truncate failed"
3230 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3231 error "Size of $DIR/$tfile not equal to $((TEST_34_SIZE / 2))"
3232 cancel_lru_locks osc
3233 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3234 error "wrong size after lock cancel"
3236 $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error "truncate failed"
3237 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3238 error "expanding truncate failed"
3239 cancel_lru_locks osc
3240 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3241 error "wrong expanded size after lock cancel"
3243 run_test 34g "truncate long file ==============================="
3246 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3251 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error "dd failed"
3252 sync # Flush the cache so that multiop below does not block on cache
3253 # flush when getting the group lock
3254 $MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
3257 # Since just timed wait is not good enough, let's do a sync write
3258 # that way we are sure enough time for a roundtrip + processing
3259 # passed + 2 seconds of extra margin.
3260 dd if=/dev/zero of=$DIR/${tfile}-1 bs=$PAGE_SIZE oflag=direct count=1
3264 if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then
3265 error "Multiop blocked on ftruncate, pid=$MULTIPID"
3269 local nsz=`stat -c %s $DIR/$tfile`
3270 [[ $nsz == $sz ]] || error "New size wrong $nsz != $sz"
3272 run_test 34h "ftruncate file under grouplock should not block"
3275 cp /bin/sh $DIR/f35a
3277 chown $RUNAS_ID $DIR/f35a
3278 $RUNAS $DIR/f35a && error || true
3281 run_test 35a "exec file with mode 444 (should return and not leak)"
3285 utime $DIR/f36 || error "utime failed for MDS"
3287 run_test 36a "MDS utime check (mknod, utime)"
3291 utime $DIR/f36 || error "utime failed for OST"
3293 run_test 36b "OST utime check (open, utime)"
3298 chown $RUNAS_ID $DIR/d36
3299 $RUNAS utime $DIR/d36/f36 || error "utime failed for MDS as non-root"
3301 run_test 36c "non-root MDS utime check (mknod, utime)"
3304 [ ! -d $DIR/d36 ] && test_36c
3305 echo "" > $DIR/d36/f36
3306 $RUNAS utime $DIR/d36/f36 || error "utime failed for OST as non-root"
3308 run_test 36d "non-root OST utime check (open, utime)"
3311 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping"
3313 test_mkdir $DIR/$tdir
3314 touch $DIR/$tdir/$tfile
3315 $RUNAS utime $DIR/$tdir/$tfile &&
3316 error "utime worked, expected failure" || true
3318 run_test 36e "utime on non-owned file (should return error)"
3322 local LANG_SAVE=$LANG
3323 local LC_LANG_SAVE=$LC_LANG
3324 export LANG=C LC_LANG=C # for date language
3326 DATESTR="Dec 20 2000"
3327 test_mkdir $DIR/$tdir
3328 lctl set_param fail_loc=$fl
3330 cp /etc/hosts $DIR/$tdir/$tfile
3331 sync & # write RPC generated with "current" inode timestamp, but delayed
3333 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
3334 LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
3335 cancel_lru_locks $OSC
3336 LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object
3338 [ "$LS_BEFORE" != "$LS_AFTER" ] && \
3339 echo "BEFORE: $LS_BEFORE" && \
3340 echo "AFTER : $LS_AFTER" && \
3341 echo "WANT : $DATESTR" && \
3342 error "$DIR/$tdir/$tfile timestamps changed" || true
3344 export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE
3348 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3350 #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
3351 subr_36fh "0x80000214"
3353 run_test 36f "utime on file racing with OST BRW write =========="
3356 remote_ost_nodsh && skip "remote OST with nodsh"
3357 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3358 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
3359 skip "Need MDS version at least 2.12.51"
3364 local tgt="obdfilter"
3366 [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1"
3368 test_mkdir $DIR/$tdir
3369 fmd_max_age=$(do_facet $facet \
3370 "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \
3373 echo "FMD max age: ${fmd_max_age}s"
3374 touch $DIR/$tdir/$tfile
3375 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3376 gawk '{cnt=cnt+$1} END{print cnt}')
3377 echo "FMD before: $fmd"
3379 error "FMD wasn't create by touch"
3380 sleep $((fmd_max_age + 12))
3381 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3382 gawk '{cnt=cnt+$1} END{print cnt}')
3383 echo "FMD after: $fmd"
3385 error "FMD wasn't expired by ping"
3387 run_test 36g "FMD cache expiry ====================="
3390 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3392 #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227
3393 subr_36fh "0x80000227"
3395 run_test 36h "utime on file racing with OST BRW write =========="
3398 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3400 test_mkdir $DIR/$tdir
3401 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
3403 local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
3404 local new_mtime=$((mtime + 200))
3406 #change Modify time of striped dir
3407 touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
3408 error "change mtime failed"
3410 local got=$(stat -c%Y $DIR/$tdir/striped_dir)
3412 [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
3414 run_test 36i "change mtime on striped directory"
3416 # test_37 - duplicate with tests 32q 32r
3419 local file=$DIR/$tfile
3421 openfile -f O_DIRECTORY $file
3424 [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true
3425 [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)"
3427 run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ==="
3429 test_39a() { # was test_39
3431 touch $DIR/${tfile}2
3432 # ls -l $DIR/$tfile $DIR/${tfile}2
3433 # ls -lu $DIR/$tfile $DIR/${tfile}2
3434 # ls -lc $DIR/$tfile $DIR/${tfile}2
3436 $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
3437 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
3439 ls -l --full-time $DIR/$tfile $DIR/${tfile}2
3441 ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
3443 ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
3444 error "O_TRUNC didn't change timestamps"
3447 run_test 39a "mtime changed on create"
3450 test_mkdir -c1 $DIR/$tdir
3451 cp -p /etc/passwd $DIR/$tdir/fopen
3452 cp -p /etc/passwd $DIR/$tdir/flink
3453 cp -p /etc/passwd $DIR/$tdir/funlink
3454 cp -p /etc/passwd $DIR/$tdir/frename
3455 ln $DIR/$tdir/funlink $DIR/$tdir/funlink2
3458 echo "aaaaaa" >> $DIR/$tdir/fopen
3459 echo "aaaaaa" >> $DIR/$tdir/flink
3460 echo "aaaaaa" >> $DIR/$tdir/funlink
3461 echo "aaaaaa" >> $DIR/$tdir/frename
3463 local open_new=`stat -c %Y $DIR/$tdir/fopen`
3464 local link_new=`stat -c %Y $DIR/$tdir/flink`
3465 local unlink_new=`stat -c %Y $DIR/$tdir/funlink`
3466 local rename_new=`stat -c %Y $DIR/$tdir/frename`
3468 cat $DIR/$tdir/fopen > /dev/null
3469 ln $DIR/$tdir/flink $DIR/$tdir/flink2
3470 rm -f $DIR/$tdir/funlink2
3471 mv -f $DIR/$tdir/frename $DIR/$tdir/frename2
3473 for (( i=0; i < 2; i++ )) ; do
3474 local open_new2=`stat -c %Y $DIR/$tdir/fopen`
3475 local link_new2=`stat -c %Y $DIR/$tdir/flink`
3476 local unlink_new2=`stat -c %Y $DIR/$tdir/funlink`
3477 local rename_new2=`stat -c %Y $DIR/$tdir/frename2`
3479 [ $open_new2 -eq $open_new ] || error "open file reverses mtime"
3480 [ $link_new2 -eq $link_new ] || error "link file reverses mtime"
3481 [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime"
3482 [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime"
3484 cancel_lru_locks $OSC
3485 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3488 run_test 39b "mtime change on open, link, unlink, rename ======"
3490 # this should be set to past
3491 TEST_39_MTIME=`date -d "1 year ago" +%s`
3497 local mtime0=`stat -c %Y $DIR1/$tfile`
3499 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3500 local mtime1=`stat -c %Y $DIR1/$tfile`
3501 [ "$mtime1" = $TEST_39_MTIME ] || \
3502 error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME"
3505 echo hello >> $DIR1/$tfile
3507 local mtime2=`stat -c %Y $DIR1/$tfile`
3508 [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \
3509 error "mtime is not updated on write: $d1 <= $mtime2 <= $d2"
3511 mv $DIR1/$tfile $DIR1/$tfile-1
3513 for (( i=0; i < 2; i++ )) ; do
3514 local mtime3=`stat -c %Y $DIR1/$tfile-1`
3515 [ "$mtime2" = "$mtime3" ] || \
3516 error "mtime ($mtime2) changed (to $mtime3) on rename"
3518 cancel_lru_locks $OSC
3519 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3522 run_test 39c "mtime change on rename ==========================="
3526 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3529 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3531 for (( i=0; i < 2; i++ )) ; do
3532 local mtime=`stat -c %Y $DIR1/$tfile`
3533 [ $mtime = $TEST_39_MTIME ] || \
3534 error "mtime($mtime) is not set to $TEST_39_MTIME"
3536 cancel_lru_locks $OSC
3537 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3540 run_test 39d "create, utime, stat =============================="
3544 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3547 local mtime1=`stat -c %Y $DIR1/$tfile`
3549 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3551 for (( i=0; i < 2; i++ )) ; do
3552 local mtime2=`stat -c %Y $DIR1/$tfile`
3553 [ $mtime2 = $TEST_39_MTIME ] || \
3554 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3556 cancel_lru_locks $OSC
3557 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3560 run_test 39e "create, stat, utime, stat ========================"
3564 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3567 mtime1=`stat -c %Y $DIR1/$tfile`
3570 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3572 for (( i=0; i < 2; i++ )) ; do
3573 local mtime2=`stat -c %Y $DIR1/$tfile`
3574 [ $mtime2 = $TEST_39_MTIME ] || \
3575 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3577 cancel_lru_locks $OSC
3578 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3581 run_test 39f "create, stat, sleep, utime, stat ================="
3585 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3587 echo hello >> $DIR1/$tfile
3588 local mtime1=`stat -c %Y $DIR1/$tfile`
3591 chmod o+r $DIR1/$tfile
3593 for (( i=0; i < 2; i++ )) ; do
3594 local mtime2=`stat -c %Y $DIR1/$tfile`
3595 [ "$mtime1" = "$mtime2" ] || \
3596 error "lost mtime: $mtime2, should be $mtime1"
3598 cancel_lru_locks $OSC
3599 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3602 run_test 39g "write, chmod, stat ==============================="
3606 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3612 echo hello >> $DIR1/$tfile
3613 local mtime1=`stat -c %Y $DIR1/$tfile`
3615 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3617 if [ "$d1" != "$d2" ]; then
3618 echo "write and touch not within one second"
3620 for (( i=0; i < 2; i++ )) ; do
3621 local mtime2=`stat -c %Y $DIR1/$tfile`
3622 [ "$mtime2" = $TEST_39_MTIME ] || \
3623 error "lost mtime: $mtime2, should be $TEST_39_MTIME"
3625 cancel_lru_locks $OSC
3626 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3630 run_test 39h "write, utime within one second, stat ============="
3633 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3638 echo hello >> $DIR1/$tfile
3639 local mtime1=`stat -c %Y $DIR1/$tfile`
3641 mv $DIR1/$tfile $DIR1/$tfile-1
3643 for (( i=0; i < 2; i++ )) ; do
3644 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3646 [ "$mtime1" = "$mtime2" ] || \
3647 error "lost mtime: $mtime2, should be $mtime1"
3649 cancel_lru_locks $OSC
3650 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3653 run_test 39i "write, rename, stat =============================="
3656 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3658 start_full_debug_logging
3662 #define OBD_FAIL_OSC_DELAY_SETTIME 0x412
3663 lctl set_param fail_loc=0x80000412
3664 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c ||
3665 error "multiop failed"
3667 local mtime1=`stat -c %Y $DIR1/$tfile`
3669 mv $DIR1/$tfile $DIR1/$tfile-1
3671 kill -USR1 $multipid
3672 wait $multipid || error "multiop close failed"
3674 for (( i=0; i < 2; i++ )) ; do
3675 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3676 [ "$mtime1" = "$mtime2" ] ||
3677 error "mtime is lost on close: $mtime2, " \
3680 cancel_lru_locks $OSC
3681 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3683 lctl set_param fail_loc=0
3684 stop_full_debug_logging
3686 run_test 39j "write, rename, close, stat ======================="
3689 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3694 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed"
3696 local mtime1=`stat -c %Y $DIR1/$tfile`
3698 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3700 kill -USR1 $multipid
3701 wait $multipid || error "multiop close failed"
3703 for (( i=0; i < 2; i++ )) ; do
3704 local mtime2=`stat -c %Y $DIR1/$tfile`
3706 [ "$mtime2" = $TEST_39_MTIME ] || \
3707 error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
3709 cancel_lru_locks osc
3710 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3713 run_test 39k "write, utime, close, stat ========================"
3715 # this should be set to future
3716 TEST_39_ATIME=`date -d "1 year" +%s`
3719 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3720 remote_mds_nodsh && skip "remote MDS with nodsh"
3722 local atime_diff=$(do_facet $SINGLEMDS \
3723 lctl get_param -n mdd.*MDT0000*.atime_diff)
3727 # test setting directory atime to future
3728 touch -a -d @$TEST_39_ATIME $DIR/$tdir
3729 local atime=$(stat -c %X $DIR/$tdir)
3730 [ "$atime" = $TEST_39_ATIME ] ||
3731 error "atime is not set to future: $atime, $TEST_39_ATIME"
3733 # test setting directory atime from future to now
3734 local now=$(date +%s)
3735 touch -a -d @$now $DIR/$tdir
3737 atime=$(stat -c %X $DIR/$tdir)
3738 [ "$atime" -eq "$now" ] ||
3739 error "atime is not updated from future: $atime, $now"
3741 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=2
3744 # test setting directory atime when now > dir atime + atime_diff
3745 local d1=$(date +%s)
3747 local d2=$(date +%s)
3748 cancel_lru_locks mdc
3749 atime=$(stat -c %X $DIR/$tdir)
3750 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3751 error "atime is not updated : $atime, should be $d2"
3753 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=60
3756 # test not setting directory atime when now < dir atime + atime_diff
3758 cancel_lru_locks mdc
3759 atime=$(stat -c %X $DIR/$tdir)
3760 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3761 error "atime is updated to $atime, should remain $d1<atime<$d2"
3763 do_facet $SINGLEMDS \
3764 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3766 run_test 39l "directory atime update ==========================="
3769 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3773 local far_past_mtime=$(date -d "May 29 1953" +%s)
3774 local far_past_atime=$(date -d "Dec 17 1903" +%s)
3776 touch -m -d @$far_past_mtime $DIR1/$tfile
3777 touch -a -d @$far_past_atime $DIR1/$tfile
3779 for (( i=0; i < 2; i++ )) ; do
3780 local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
3781 [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
3782 error "atime or mtime set incorrectly"
3784 cancel_lru_locks $OSC
3785 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3788 run_test 39m "test atime and mtime before 1970"
3790 test_39n() { # LU-3832
3791 remote_mds_nodsh && skip "remote MDS with nodsh"
3793 local atime_diff=$(do_facet $SINGLEMDS \
3794 lctl get_param -n mdd.*MDT0000*.atime_diff)
3799 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
3802 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
3803 atime0=$(stat -c %X $DIR/$tfile)
3806 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3807 atime1=$(stat -c %X $DIR/$tfile)
3810 cancel_lru_locks mdc
3811 cancel_lru_locks osc
3812 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3813 atime2=$(stat -c %X $DIR/$tfile)
3815 do_facet $SINGLEMDS \
3816 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3818 [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
3819 [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
3821 run_test 39n "check that O_NOATIME is honored"
3824 TESTDIR=$DIR/$tdir/$tfile
3825 [ -e $TESTDIR ] && rm -rf $TESTDIR
3832 links2=$(stat -c %h .)
3833 [ $(($links1 + 2)) != $links2 ] &&
3834 error "wrong links count $(($links1 + 2)) != $links2"
3836 links3=$(stat -c %h .)
3837 [ $(($links1 + 1)) != $links3 ] &&
3838 error "wrong links count $links1 != $links3"
3841 run_test 39o "directory cached attributes updated after create"
3844 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3847 TESTDIR=$DIR/$tdir/$tdir
3848 [ -e $TESTDIR ] && rm -rf $TESTDIR
3849 test_mkdir -p $TESTDIR
3853 test_mkdir -i $MDTIDX $TESTDIR/remote_dir1
3854 test_mkdir -i $MDTIDX $TESTDIR/remote_dir2
3856 links2=$(stat -c %h .)
3857 [ $(($links1 + 2)) != $links2 ] &&
3858 error "wrong links count $(($links1 + 2)) != $links2"
3860 links3=$(stat -c %h .)
3861 [ $(($links1 + 1)) != $links3 ] &&
3862 error "wrong links count $links1 != $links3"
3865 run_test 39p "remote directory cached attributes updated after create ========"
3868 test_39q() { # LU-8041
3869 local testdir=$DIR/$tdir
3871 multiop_bg_pause $testdir D_c || error "multiop failed"
3873 cancel_lru_locks mdc
3874 kill -USR1 $multipid
3875 local atime=$(stat -c %X $testdir)
3876 [ "$atime" -ne 0 ] || error "atime is zero"
3878 run_test 39q "close won't zero out atime"
3881 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
3882 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
3883 error "openfile O_WRONLY:O_TRUNC $tfile failed"
3884 $CHECKSTAT -t file -s 4096 $DIR/$tfile ||
3885 error "$tfile is not 4096 bytes in size"
3887 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
3891 small_write $DIR/f41 18
3893 run_test 41 "test small file write + fstat ====================="
3895 count_ost_writes() {
3896 lctl get_param -n ${OSC}.*.stats |
3897 awk -vwrites=0 '/ost_write/ { writes += $2 } \
3898 END { printf("%0.0f", writes) }'
3905 BG_DIRTY_RATIO_SAVE=10
3906 MAX_BG_DIRTY_RATIO=25
3910 # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs,
3911 # dirty_ratio, dirty_background_ratio
3912 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
3913 sysctl -w vm.dirty_writeback_centisecs=$WRITEBACK_SAVE
3914 sysctl -w vm.dirty_background_ratio=$BG_DIRTY_RATIO_SAVE
3915 sysctl -w vm.dirty_ratio=$DIRTY_RATIO_SAVE
3917 # if file not here, we are a 2.4 kernel
3918 kill -CONT `pidof kupdated`
3923 # setup the trap first, so someone cannot exit the test at the
3924 # exact wrong time and mess up a machine
3925 trap start_writeback EXIT
3926 # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
3927 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
3928 WRITEBACK_SAVE=`sysctl -n vm.dirty_writeback_centisecs`
3929 sysctl -w vm.dirty_writeback_centisecs=0
3930 sysctl -w vm.dirty_writeback_centisecs=0
3931 # save and increase /proc/sys/vm/dirty_ratio
3932 DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_ratio`
3933 sysctl -w vm.dirty_ratio=$MAX_DIRTY_RATIO
3934 # save and increase /proc/sys/vm/dirty_background_ratio
3935 BG_DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_background_ratio`
3936 sysctl -w vm.dirty_background_ratio=$MAX_BG_DIRTY_RATIO
3938 # if file not here, we are a 2.4 kernel
3939 kill -STOP `pidof kupdated`
3943 # ensure that all stripes have some grant before we test client-side cache
3945 for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
3946 dd if=/dev/zero of=$i bs=4k count=1
3951 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
3952 # file truncation, and file removal.
3954 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3957 cancel_lru_locks $OSC
3959 sync; sleep 1; sync # just to be safe
3960 BEFOREWRITES=`count_ost_writes`
3961 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur_grant_bytes | grep "[0-9]"
3962 dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
3963 AFTERWRITES=`count_ost_writes`
3964 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
3965 error "$BEFOREWRITES < $AFTERWRITES"
3968 run_test 42a "ensure that we don't flush on close"
3971 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3974 cancel_lru_locks $OSC
3977 dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
3978 BEFOREWRITES=$(count_ost_writes)
3979 $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
3980 AFTERWRITES=$(count_ost_writes)
3981 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
3982 error "$BEFOREWRITES < $AFTERWRITES on unlink"
3984 BEFOREWRITES=$(count_ost_writes)
3985 sync || error "sync: $?"
3986 AFTERWRITES=$(count_ost_writes)
3987 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
3988 error "$BEFOREWRITES < $AFTERWRITES on sync"
3990 dmesg | grep 'error from obd_brw_async' && error 'error writing back'
3994 run_test 42b "test destroy of file with cached dirty data ======"
3996 # if these tests just want to test the effect of truncation,
3997 # they have to be very careful. consider:
3998 # - the first open gets a {0,EOF}PR lock
3999 # - the first write conflicts and gets a {0, count-1}PW
4000 # - the rest of the writes are under {count,EOF}PW
4001 # - the open for truncate tries to match a {0,EOF}PR
4002 # for the filesize and cancels the PWs.
4003 # any number of fixes (don't get {0,EOF} on open, match
4004 # composite locks, do smarter file size management) fix
4005 # this, but for now we want these tests to verify that
4006 # the cancellation with truncate intent works, so we
4007 # start the file with a full-file pw lock to match against
4008 # until the truncate.
4013 cancel_lru_locks $OSC
4015 # prime the file with 0,EOF PW to match
4019 # now the real test..
4020 dd if=/dev/zero of=$file bs=1024 count=100
4021 BEFOREWRITES=`count_ost_writes`
4022 $TRUNCATE $file $offset
4023 cancel_lru_locks $OSC
4024 AFTERWRITES=`count_ost_writes`
4029 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4032 [ $BEFOREWRITES -eq $AFTERWRITES ] &&
4033 error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
4036 run_test 42c "test partial truncate of file with cached dirty data"
4039 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4042 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
4043 error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
4046 run_test 42d "test complete truncate of file with cached dirty data"
4048 test_42e() { # bug22074
4049 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4051 local TDIR=$DIR/${tdir}e
4052 local pages=16 # hardcoded 16 pages, don't change it.
4053 local files=$((OSTCOUNT * 500)) # hopefully 500 files on each OST
4054 local proc_osc0="osc.${FSNAME}-OST0000-osc-[^MDT]*"
4058 test_mkdir $DIR/${tdir}e
4059 $SETSTRIPE -c 1 $TDIR
4060 createmany -o $TDIR/f $files
4062 max_dirty_mb=$($LCTL get_param -n $proc_osc0/max_dirty_mb)
4064 # we assume that with $OSTCOUNT files, at least one of them will
4065 # be allocated on OST0.
4066 warmup_files=$((OSTCOUNT * max_dirty_mb))
4067 createmany -o $TDIR/w $warmup_files
4069 # write a large amount of data into one file and sync, to get good
4070 # avail_grant number from OST.
4071 for ((i=0; i<$warmup_files; i++)); do
4072 idx=$($GETSTRIPE -i $TDIR/w$i)
4073 [ $idx -ne 0 ] && continue
4074 dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1
4077 [[ $i -gt $warmup_files ]] && error "OST0 is still cold"
4079 $LCTL get_param $proc_osc0/cur_dirty_bytes
4080 $LCTL get_param $proc_osc0/cur_grant_bytes
4082 # create as much dirty pages as we can while not to trigger the actual
4083 # RPCs directly. but depends on the env, VFS may trigger flush during this
4084 # period, hopefully we are good.
4085 for ((i=0; i<$warmup_files; i++)); do
4086 idx=$($GETSTRIPE -i $TDIR/w$i)
4087 [ $idx -ne 0 ] && continue
4088 dd if=/dev/zero of=$TDIR/w$i bs=1M count=1 2>/dev/null
4090 $LCTL get_param $proc_osc0/cur_dirty_bytes
4091 $LCTL get_param $proc_osc0/cur_grant_bytes
4093 # perform the real test
4094 $LCTL set_param $proc_osc0/rpc_stats 0
4095 for ((;i<$files; i++)); do
4096 [ $($GETSTRIPE -i $TDIR/f$i) -eq 0 ] || continue
4097 dd if=/dev/zero of=$TDIR/f$i bs=$PAGE_SIZE count=$pages 2>/dev/null
4100 $LCTL get_param $proc_osc0/rpc_stats
4103 local have_ppr=false
4104 $LCTL get_param $proc_osc0/rpc_stats |
4105 while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do
4106 # skip lines until we are at the RPC histogram data
4107 [ "$PPR" == "pages" ] && have_ppr=true && continue
4108 $have_ppr || continue
4110 # we only want the percent stat for < 16 pages
4111 [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break
4113 percent=$((percent + WPCT))
4114 if [[ $percent -gt 15 ]]; then
4115 error "less than 16-pages write RPCs" \
4122 run_test 42e "verify sub-RPC writes are not done synchronously"
4124 test_43A() { # was test_43
4125 test_mkdir $DIR/$tdir
4126 cp -p /bin/ls $DIR/$tdir/$tfile
4127 $MULTIOP $DIR/$tdir/$tfile Ow_c &
4129 # give multiop a chance to open
4132 $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true
4135 run_test 43A "execution of file opened for write should return -ETXTBSY"
4138 test_mkdir $DIR/$tdir
4139 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4140 $DIR/$tdir/sleep 60 &
4142 # Make sure exec of $tdir/sleep wins race with truncate
4144 $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success"
4147 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
4150 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4152 test_mkdir $DIR/$tdir
4153 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4154 $DIR/$tdir/sleep 60 &
4156 # Make sure exec of $tdir/sleep wins race with truncate
4158 $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success"
4161 run_test 43b "truncate of file being executed should return -ETXTBSY"
4164 local testdir="$DIR/$tdir"
4167 ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) |
4168 ( cd $testdir && md5sum -c )
4170 run_test 43c "md5sum of copy into lustre"
4172 test_44A() { # was test_44
4173 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4175 dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
4176 dd if=$DIR/f1 bs=4k count=1 > /dev/null
4178 run_test 44A "zero length read from a sparse stripe"
4181 local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
4183 [ -z "$nstripe" ] && skip "can't get stripe info"
4184 [[ $nstripe -gt $OSTCOUNT ]] &&
4185 skip "Wrong default_stripe_count: $nstripe OSTCOUNT: $OSTCOUNT"
4187 local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: |
4189 if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then
4190 nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: |
4194 OFFSETS="0 $((stride/2)) $((stride-1))"
4195 for offset in $OFFSETS; do
4196 for i in $(seq 0 $((nstripe-1))); do
4197 local GLOBALOFFSETS=""
4199 local size=$((((i + 2 * $nstripe )*$stride + $offset)))
4200 local myfn=$DIR/d44a-$size
4201 echo "--------writing $myfn at $size"
4202 ll_sparseness_write $myfn $size ||
4203 error "ll_sparseness_write"
4204 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4205 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4206 error "ll_sparseness_verify $GLOBALOFFSETS"
4208 for j in $(seq 0 $((nstripe-1))); do
4210 size=$((((j + $nstripe )*$stride + $offset)))
4211 ll_sparseness_write $myfn $size ||
4212 error "ll_sparseness_write"
4213 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4215 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4216 error "ll_sparseness_verify $GLOBALOFFSETS"
4221 run_test 44a "test sparse pwrite ==============================="
4225 for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
4231 before=`dirty_osc_total`
4232 echo executing "\"$*\""
4234 after=`dirty_osc_total`
4235 echo before $before, after $after
4238 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4241 # Obtain grants from OST if it supports it
4242 echo blah > ${f}_grant
4245 do_dirty_record "echo blah > $f"
4246 [[ $before -eq $after ]] && error "write wasn't cached"
4247 do_dirty_record "> $f"
4248 [[ $before -gt $after ]] || error "truncate didn't lower dirty count"
4249 do_dirty_record "echo blah > $f"
4250 [[ $before -eq $after ]] && error "write wasn't cached"
4251 do_dirty_record "sync"
4252 [[ $before -gt $after ]] || error "writeback didn't lower dirty count"
4253 do_dirty_record "echo blah > $f"
4254 [[ $before -eq $after ]] && error "write wasn't cached"
4255 do_dirty_record "cancel_lru_locks osc"
4256 [[ $before -gt $after ]] ||
4257 error "lock cancellation didn't lower dirty count"
4260 run_test 45 "osc io page accounting ============================"
4262 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this
4263 # test tickles a bug where re-dirtying a page was failing to be mapped to the
4264 # objects offset and an assert hit when an rpc was built with 1023's mapped
4265 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
4267 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4272 dd if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4274 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=1023 count=1
4275 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4279 run_test 46 "dirtying a previously written page ================"
4281 # test_47 is removed "Device nodes check" is moved to test_28
4283 test_48a() { # bug 2399
4284 [ "$mds1_FSTYPE" = "zfs" ] &&
4285 [ $MDS1_VERSION -lt $(version_code 2.3.63) ] &&
4286 skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly"
4288 test_mkdir $DIR/$tdir
4290 mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
4291 test_mkdir $DIR/$tdir
4292 touch foo || error "'touch foo' failed after recreating cwd"
4294 touch .foo || error "'touch .foo' failed after recreating cwd"
4296 ls . > /dev/null || error "'ls .' failed after recreating cwd"
4297 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4298 cd . || error "'cd .' failed after recreating cwd"
4299 mkdir . && error "'mkdir .' worked after recreating cwd"
4300 rmdir . && error "'rmdir .' worked after recreating cwd"
4301 ln -s . baz || error "'ln -s .' failed after recreating cwd"
4302 cd .. || error "'cd ..' failed after recreating cwd"
4304 run_test 48a "Access renamed working dir (should return errors)="
4306 test_48b() { # bug 2399
4308 test_mkdir $DIR/$tdir
4310 rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
4311 touch foo && error "'touch foo' worked after removing cwd"
4312 mkdir foo && error "'mkdir foo' worked after removing cwd"
4313 touch .foo && error "'touch .foo' worked after removing cwd"
4314 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
4315 ls . > /dev/null && error "'ls .' worked after removing cwd"
4316 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4317 mkdir . && error "'mkdir .' worked after removing cwd"
4318 rmdir . && error "'rmdir .' worked after removing cwd"
4319 ln -s . foo && error "'ln -s .' worked after removing cwd"
4320 cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
4322 run_test 48b "Access removed working dir (should return errors)="
4324 test_48c() { # bug 2350
4325 #lctl set_param debug=-1
4328 test_mkdir -p $DIR/$tdir/dir
4330 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4331 $TRACE touch foo && error "touch foo worked after removing cwd"
4332 $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
4333 touch .foo && error "touch .foo worked after removing cwd"
4334 mkdir .foo && error "mkdir .foo worked after removing cwd"
4335 $TRACE ls . && error "'ls .' worked after removing cwd"
4336 $TRACE ls .. || error "'ls ..' failed after removing cwd"
4337 $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
4338 $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
4339 $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
4340 $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
4342 run_test 48c "Access removed working subdir (should return errors)"
4344 test_48d() { # bug 2350
4345 #lctl set_param debug=-1
4348 test_mkdir -p $DIR/$tdir/dir
4350 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4351 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4352 $TRACE touch foo && error "'touch foo' worked after removing parent"
4353 $TRACE mkdir foo && error "mkdir foo worked after removing parent"
4354 touch .foo && error "'touch .foo' worked after removing parent"
4355 mkdir .foo && error "mkdir .foo worked after removing parent"
4356 $TRACE ls . && error "'ls .' worked after removing parent"
4357 $TRACE ls .. && error "'ls ..' worked after removing parent"
4358 $TRACE mkdir . && error "'mkdir .' worked after removing parent"
4359 $TRACE rmdir . && error "'rmdir .' worked after removing parent"
4360 $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
4363 run_test 48d "Access removed parent subdir (should return errors)"
4365 test_48e() { # bug 4134
4366 #lctl set_param debug=-1
4369 test_mkdir -p $DIR/$tdir/dir
4371 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4372 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4373 $TRACE touch $DIR/$tdir || error "'touch $DIR/$tdir' failed"
4374 $TRACE chmod +x $DIR/$tdir || error "'chmod +x $DIR/$tdir' failed"
4375 # On a buggy kernel addition of "touch foo" after cd .. will
4376 # produce kernel oops in lookup_hash_it
4377 touch ../foo && error "'cd ..' worked after recreate parent"
4379 $TRACE rm $DIR/$tdir || error "rm '$DIR/$tdir' failed"
4381 run_test 48e "Access to recreated parent subdir (should return errors)"
4383 test_49() { # LU-1030
4384 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4385 remote_ost_nodsh && skip "remote OST with nodsh"
4387 # get ost1 size - lustre-OST0000
4388 ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
4390 # write 800M at maximum
4391 [[ $ost1_size -lt 2 ]] && ost1_size=2
4392 [[ $ost1_size -gt 819200 ]] && ost1_size=819200
4394 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
4395 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) &
4398 # change max_pages_per_rpc while writing the file
4399 local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc
4400 local orig_mppc=$($LCTL get_param -n $osc1_mppc)
4401 # loop until dd process exits
4402 while ps ax -opid | grep -wq $dd_pid; do
4403 $LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1))
4404 sleep $((RANDOM % 5 + 1))
4406 # restore original max_pages_per_rpc
4407 $LCTL set_param $osc1_mppc=$orig_mppc
4408 rm $DIR/$tfile || error "rm $DIR/$tfile failed"
4410 run_test 49 "Change max_pages_per_rpc won't break osc extent"
4414 test_mkdir $DIR/$tdir
4416 ls /proc/$$/cwd || error "ls /proc/$$/cwd failed"
4418 run_test 50 "special situations: /proc symlinks ==============="
4420 test_51a() { # was test_51
4421 # bug 1516 - create an empty entry right after ".." then split dir
4422 test_mkdir -c1 $DIR/$tdir
4423 touch $DIR/$tdir/foo
4424 $MCREATE $DIR/$tdir/bar
4426 createmany -m $DIR/$tdir/longfile 201
4428 while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do
4429 $MCREATE $DIR/$tdir/longfile$FNUM
4434 ls -l $DIR/$tdir > /dev/null || error "ls -l $DIR/$tdir failed"
4436 run_test 51a "special situations: split htree with empty entry =="
4438 cleanup_print_lfs_df () {
4445 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4447 local dir=$DIR/$tdir
4448 local nrdirs=$((65536 + 100))
4450 # cleanup the directory
4457 local mdtidx=$(printf "%04x" $($LFS getstripe -m $dir))
4458 local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
4459 [[ $numfree -lt $nrdirs ]] &&
4460 skip "not enough free inodes ($numfree) on MDT$mdtidx"
4462 # need to check free space for the directories as well
4463 local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
4464 numfree=$(( blkfree / $(fs_inode_ksize) ))
4465 [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)"
4467 trap cleanup_print_lfs_df EXIT
4470 createmany -d $dir/d $nrdirs || {
4471 unlinkmany $dir/d $nrdirs
4472 error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
4476 nrdirs=$(ls -U $dir | wc -l)
4478 # unlink all but 100 subdirectories, then check it still works
4480 local delete=$((nrdirs - left))
4485 # for ldiskfs the nlink count should be 1, but this is OSD specific
4486 # and so this is listed for informational purposes only
4487 echo "nlink before: $(stat -c %h $dir), created before: $nrdirs"
4488 unlinkmany -d $dir/d $delete ||
4489 error "unlink of first $delete subdirs failed"
4491 echo "nlink between: $(stat -c %h $dir)"
4492 local found=$(ls -U $dir | wc -l)
4493 [ $found -ne $left ] &&
4494 error "can't find subdirs: found only $found, expected $left"
4496 unlinkmany -d $dir/d $delete $left ||
4497 error "unlink of second $left subdirs failed"
4498 # regardless of whether the backing filesystem tracks nlink accurately
4499 # or not, the nlink count shouldn't be more than "." and ".." here
4500 local after=$(stat -c %h $dir)
4501 [[ $after -gt 2 ]] && error "nlink after: $after > 2" ||
4502 echo "nlink after: $after"
4504 cleanup_print_lfs_df
4506 run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
4509 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4510 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
4512 test_mkdir $DIR/$tdir
4513 createmany -o $DIR/$tdir/t- 1000
4514 $LFS getstripe $DIR/$tdir > $TMP/$tfile
4515 for N in $(seq 0 $((OSTCOUNT - 1))); do
4516 OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
4517 END { printf("%0.0f", objs) }' $TMP/$tfile)
4518 OBJS0[$N]=$(grep -A 1 idx $TMP/$tfile | awk -vobjs=0 \
4519 '($1 == '$N') { objs += 1 } \
4520 END { printf("%0.0f", objs) }')
4521 log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
4523 unlinkmany $DIR/$tdir/t- 1000
4526 for N in $(seq 1 $((OSTCOUNT - 1))); do
4527 [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] &&
4528 error "OST $N has less objects vs OST $NLAST" \
4529 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4530 [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] &&
4531 error "OST $N has less objects vs OST $NLAST" \
4532 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4534 [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] &&
4535 error "OST $N has less #0 objects vs OST $NLAST" \
4536 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4537 [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] &&
4538 error "OST $N has less #0 objects vs OST $NLAST" \
4539 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4544 run_test 51d "check object distribution"
4547 if [ "$mds1_FSTYPE" != ldiskfs ]; then
4548 skip_env "ldiskfs only test"
4551 test_mkdir -c1 $DIR/$tdir
4552 test_mkdir -c1 $DIR/$tdir/d0
4554 touch $DIR/$tdir/d0/foo
4555 createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
4556 error "file exceed 65000 nlink limit!"
4557 unlinkmany $DIR/$tdir/d0/f- 65001
4560 run_test 51e "check file nlink limit"
4563 test_mkdir $DIR/$tdir
4566 local ulimit_old=$(ulimit -n)
4567 local spare=20 # number of spare fd's for scripts/libraries, etc.
4568 local mdt=$($LFS getstripe -m $DIR/$tdir)
4569 local numfree=$($LFS df -i $DIR/$tdir | awk '/MDT:'$mdt'/ { print $4 }')
4571 echo "MDT$mdt numfree=$numfree, max=$max"
4572 [[ $numfree -gt $max ]] && numfree=$max || numfree=$((numfree * 7 / 8))
4573 if [ $((numfree + spare)) -gt $ulimit_old ]; then
4574 while ! ulimit -n $((numfree + spare)); do
4575 numfree=$((numfree * 3 / 4))
4577 echo "changed ulimit from $ulimit_old to $((numfree + spare))"
4579 echo "left ulimit at $ulimit_old"
4582 createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
4583 unlinkmany $DIR/$tdir/f $numfree
4584 error "create+open $numfree files in $DIR/$tdir failed"
4586 ulimit -n $ulimit_old
4588 # if createmany exits at 120s there will be fewer than $numfree files
4589 unlinkmany $DIR/$tdir/f $numfree || true
4591 run_test 51f "check many open files limit"
4594 [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
4595 test_mkdir $DIR/$tdir
4596 touch $DIR/$tdir/foo
4597 chattr +a $DIR/$tdir/foo || error "chattr +a failed"
4598 echo bar >> $DIR/$tdir/foo || error "append bar failed"
4599 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4600 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4601 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4603 echo foo >> $DIR/$tdir/foo || error "append foo failed"
4604 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4605 lsattr $DIR/$tdir/foo | egrep -q "^-+a[-e]+ $DIR/$tdir/foo" ||
4607 chattr -a $DIR/$tdir/foo || error "chattr -a failed"
4608 cp -r $DIR/$tdir $TMP/
4609 rm -fr $DIR/$tdir $TMP/$tdir || error "cleanup rm failed"
4611 run_test 52a "append-only flag test (should return errors)"
4614 [ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo
4615 test_mkdir $DIR/$tdir
4616 touch $DIR/$tdir/foo
4617 chattr +i $DIR/$tdir/foo || error "chattr +i failed"
4618 cat test > $DIR/$tdir/foo && error "cat test worked"
4619 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4620 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4621 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4623 echo foo >> $DIR/$tdir/foo && error "echo worked"
4624 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4625 [ -f $DIR/$tdir/foo ] || error "$tdir/foo is not a file"
4626 [ -f $DIR/$tdir/foo_ren ] && error "$tdir/foo_ren is not a file"
4627 lsattr $DIR/$tdir/foo | egrep -q "^-+i[-e]+ $DIR/$tdir/foo" ||
4629 chattr -i $DIR/$tdir/foo || error "chattr failed"
4631 rm -fr $DIR/$tdir || error "unable to remove $DIR/$tdir"
4633 run_test 52b "immutable flag test (should return errors) ======="
4636 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4637 remote_mds_nodsh && skip "remote MDS with nodsh"
4638 remote_ost_nodsh && skip "remote OST with nodsh"
4651 local support_last_seq=true
4653 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
4654 support_last_seq=false
4657 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
4659 for value in $(do_facet $SINGLEMDS \
4660 $LCTL get_param osp.$mdtosc.prealloc_last_id) ; do
4661 param=$(echo ${value[0]} | cut -d "=" -f1)
4662 ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
4664 if $support_last_seq; then
4665 param_seq=$(echo $param |
4666 sed -e s/prealloc_last_id/prealloc_last_seq/g)
4667 mds_last_seq=$(do_facet $SINGLEMDS \
4668 $LCTL get_param -n $param_seq)
4670 mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
4672 ostnum=$(index_from_ostuuid ${ostname}_UUID)
4673 node=$(facet_active_host ost$((ostnum+1)))
4674 param="obdfilter.$ostname.last_id"
4675 for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
4676 echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
4677 ost_last_id=$ost_last
4679 if $support_last_seq; then
4680 ost_last_id=$(echo $ost_last |
4681 awk -F':' '{print $2}' |
4683 ost_last_seq=$(echo $ost_last |
4684 awk -F':' '{print $1}')
4685 [[ $ost_last_seq = $mds_last_seq ]] || continue
4688 if [[ $ost_last_id != $mds_last ]]; then
4689 error "$ost_last_id != $mds_last"
4696 $found || error "can not match last_seq/last_id for $mdtosc"
4699 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
4702 perl -MSocket -e ';' || skip "no Socket perl module installed"
4704 $SOCKETSERVER $DIR/socket ||
4705 error "$SOCKETSERVER $DIR/socket failed: $?"
4706 $SOCKETCLIENT $DIR/socket ||
4707 error "$SOCKETCLIENT $DIR/socket failed: $?"
4708 $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
4710 run_test 54a "unix domain socket test =========================="
4716 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1
4718 run_test 54b "char device works in lustre ======================"
4721 [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
4722 [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
4723 [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
4725 for i in $(seq 3 7); do
4726 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
4735 loopdev="$DIR/loop54c"
4738 $UMOUNT $DIR/$tdir || rc=$?
4739 losetup -d $loopdev || true
4740 losetup -d $LOOPDEV || true
4741 rm -rf $loopdev $DIR/$tfile $DIR/$tdir
4746 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4748 loopdev="$DIR/loop54c"
4751 [ -z "$LOOPNUM" ] && skip_env "couldn't find empty loop device"
4752 trap cleanup_54c EXIT
4753 mknod $loopdev b 7 $LOOPNUM
4754 echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
4755 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE seek=1024 count=1 > /dev/null
4756 losetup $loopdev $DIR/$tfile ||
4757 error "can't set up $loopdev for $DIR/$tfile"
4758 mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
4759 test_mkdir $DIR/$tdir
4760 mount -t ext2 $loopdev $DIR/$tdir ||
4761 error "error mounting $loopdev on $DIR/$tdir"
4762 dd if=/dev/zero of=$DIR/$tdir/tmp bs=$PAGE_SIZE count=30 ||
4765 dd if=$DIR/$tdir/tmp of=/dev/zero bs=$PAGE_SIZE count=30 ||
4769 run_test 54c "block device works in lustre ====================="
4775 [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string"
4777 run_test 54d "fifo device works in lustre ======================"
4782 cp -aL /dev/console $f
4783 echo $string > $f || error "echo $string to $f failed"
4785 run_test 54e "console/tty device works in lustre ======================"
4789 local dir=$DIR/$tdir
4792 test_mkdir -p $dir/dir
4793 for i in $(seq $numfiles); do
4795 touch $dir/dir/file$i
4798 local numcomp=$($LFS getstripe --component-count $dir)
4800 [[ $numcomp == 0 ]] && numcomp=1
4802 # test lfs getstripe with --recursive
4803 local filenum=$($LFS getstripe -r $dir | egrep -c "obdidx|l_ost_idx")
4805 [[ $filenum -eq $((numfiles * 2)) ]] ||
4806 error "$LFS getstripe -r: found $filenum != $((numfiles * 2))"
4807 filenum=$($LFS getstripe $dir | egrep -c "obdidx|l_ost_idx")
4808 [[ $filenum -eq $numfiles ]] ||
4809 error "$LFS getstripe $dir: found $filenum, not $numfiles"
4810 echo "$LFS getstripe showed obdidx or l_ost_idx"
4812 # test lfs getstripe with file instead of dir
4813 filenum=$($LFS getstripe $dir/file1 | egrep -c "obdidx|l_ost_idx")
4814 [[ $filenum -eq 1 ]] ||
4815 error "$LFS getstripe $dir/file1: found $filenum, not 1"
4816 echo "$LFS getstripe file1 passed"
4818 #test lfs getstripe with --verbose
4819 filenum=$($LFS getstripe --verbose $dir | grep -c lmm_magic)
4820 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
4821 error "$LFS getstripe --verbose $dir: "\
4822 "got $filenum want $((numfiles * numcomp)) lmm_magic"
4823 [[ $($LFS getstripe $dir | grep -c lmm_magic) -eq 0 ]] ||
4824 error "$LFS getstripe $dir: showed lmm_magic"
4826 #test lfs getstripe with -v prints lmm_fid
4827 filenum=$($LFS getstripe -v $dir | grep -c lmm_fid)
4828 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
4829 error "$LFS getstripe -v $dir: "\
4830 "got $filenum want $((numfiles * numcomp)) lmm_fid"
4831 [[ $($LFS getstripe $dir | grep -c lmm_fid) -eq 0 ]] ||
4832 error "$LFS getstripe $dir: showed lmm_fid by default"
4833 echo "$LFS getstripe --verbose passed"
4835 #check for FID information
4836 local fid1=$($LFS getstripe --fid $dir/file1)
4837 local fid2=$($LFS getstripe --verbose $dir/file1 |
4838 awk '/lmm_fid: / { print $2; exit; }')
4839 local fid3=$($LFS path2fid $dir/file1)
4841 [ "$fid1" != "$fid2" ] &&
4842 error "getstripe --fid '$fid1' != getstripe --verbose '$fid2'"
4843 [ "$fid1" != "$fid3" ] &&
4844 error "getstripe --fid '$fid1' != lfs path2fid '$fid3'"
4845 echo "$LFS getstripe --fid passed"
4847 #test lfs getstripe with --obd
4848 $LFS getstripe --obd wrong_uuid $dir 2>&1 | grep -q "unknown obduuid" ||
4849 error "$LFS getstripe --obd wrong_uuid: should return error"
4851 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4854 local obduuid=$(ostuuid_from_index $ostidx)
4855 local found=$($LFS getstripe -r --obd $obduuid $dir |
4856 grep 'lmm_stripe_offset:' | grep -c " $ostidx\$")
4858 filenum=$($LFS getstripe -ir $dir | grep -c "^$ostidx\$")
4859 [[ $($LFS getstripe -id $dir) -ne $ostidx ]] ||
4861 [[ $($LFS getstripe -id $dir/dir) -ne $ostidx ]] ||
4864 [[ $found -eq $filenum ]] ||
4865 error "$LFS getstripe --obd: found $found expect $filenum"
4866 [[ $($LFS getstripe -r -v --obd $obduuid $dir |
4867 sed '/^[ ]*'${ostidx}'[ ]/d' |
4868 sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] ||
4869 error "$LFS getstripe --obd: should not show file on other obd"
4870 echo "$LFS getstripe --obd passed"
4872 run_test 56a "check $LFS getstripe"
4875 local dir=$DIR/$tdir
4879 for i in $(seq $numdirs); do
4880 test_mkdir $dir/dir$i
4883 # test lfs getdirstripe default mode is non-recursion, which is
4884 # different from lfs getstripe
4885 local dircnt=$($LFS getdirstripe $dir | grep -c lmv_stripe_count)
4887 [[ $dircnt -eq 1 ]] ||
4888 error "$LFS getdirstripe: found $dircnt, not 1"
4889 dircnt=$($LFS getdirstripe --recursive $dir |
4890 grep -c lmv_stripe_count)
4891 [[ $dircnt -eq $((numdirs + 1)) ]] ||
4892 error "$LFS getdirstripe -r: $dircnt, != $((numdirs + 1))"
4894 run_test 56b "check $LFS getdirstripe"
4897 remote_ost_nodsh && skip "remote OST with nodsh"
4900 local ost_name=$(ostname_from_index $ost_idx)
4901 local old_status=$(ost_dev_status $ost_idx)
4903 [[ -z "$old_status" ]] ||
4904 skip_env "OST $ost_name is in $old_status status"
4906 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
4909 local new_status=$(ost_dev_status $ost_idx)
4911 [[ "$new_status" = "D" ]] ||
4912 error "OST $ost_name is in status of '$new_status', not 'D'"
4914 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
4917 new_status=$(ost_dev_status $ost_idx)
4918 [[ -z "$new_status" ]] ||
4919 error "OST $ost_name is in status of '$new_status', not ''"
4921 run_test 56c "check 'lfs df' showing device status"
4926 local local_tdir="$1"
4927 local local_numfiles="$2"
4928 local local_numdirs="$3"
4929 local dir_params="$4"
4930 local dir_stripe_params="$5"
4932 if [ ! -d "$local_tdir" ] ; then
4933 test_mkdir -p $dir_stripe_params $local_tdir
4934 [ "$dir_params" ] && $LFS setstripe $dir_params $local_tdir
4935 for i in $(seq $local_numfiles) ; do
4936 touch $local_tdir/file$i
4938 for i in $(seq $local_numdirs) ; do
4939 test_mkdir $dir_stripe_params $local_tdir/dir$i
4940 for j in $(seq $local_numfiles) ; do
4941 touch $local_tdir/dir$i/file$j
4947 setup_56_special() {
4949 local local_numfiles=$2
4950 local local_numdirs=$3
4952 setup_56 $local_tdir $local_numfiles $local_numdirs
4954 if [ ! -e "$local_tdir/loop${local_numfiles}b" ] ; then
4955 for i in $(seq $local_numfiles) ; do
4956 mknod $local_tdir/loop${i}b b 7 $i
4957 mknod $local_tdir/null${i}c c 1 3
4958 ln -s $local_tdir/file1 $local_tdir/link${i}
4960 for i in $(seq $local_numdirs) ; do
4961 mknod $local_tdir/dir$i/loop${i}b b 7 $i
4962 mknod $local_tdir/dir$i/null${i}c c 1 3
4963 ln -s $local_tdir/dir$i/file1 $local_tdir/dir$i/link${i}
4969 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
4970 local expected=$(($NUMDIRS + 2))
4972 setup_56 $dir $NUMFILES $NUMDIRS
4974 # test lfs find with -name
4975 for i in $(seq $NUMFILES) ; do
4976 local nums=$($LFS find -name "*$i" $dir | wc -l)
4978 [ $nums -eq $expected ] ||
4979 error "lfs find -name '*$i' $dir wrong: "\
4980 "found $nums, expected $expected"
4983 run_test 56g "check lfs find -name"
4986 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
4987 local expected=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES))
4989 setup_56 $dir $NUMFILES $NUMDIRS
4991 # test lfs find with ! -name
4992 for i in $(seq $NUMFILES) ; do
4993 local nums=$($LFS find ! -name "*$i" $dir | wc -l)
4995 [ $nums -eq $expected ] ||
4996 error "lfs find ! -name '*$i' $dir wrong: "\
4997 "found $nums, expected $expected"
5000 run_test 56h "check lfs find ! -name"
5003 local dir=$DIR/$tdir
5007 local cmd="$LFS find -ost $(ostuuid_from_index 0 $dir) $dir"
5010 [ -z "$out" ] || error "'$cmd' returned directory '$out'"
5012 run_test 56i "check 'lfs find -ost UUID' skips directories"
5015 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5017 setup_56_special $dir $NUMFILES $NUMDIRS
5019 local expected=$((NUMDIRS + 1))
5020 local cmd="$LFS find -type d $dir"
5021 local nums=$($cmd | wc -l)
5023 [ $nums -eq $expected ] ||
5024 error "'$cmd' wrong: found $nums, expected $expected"
5026 run_test 56j "check lfs find -type d"
5029 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5031 setup_56_special $dir $NUMFILES $NUMDIRS
5033 local expected=$(((NUMDIRS + 1) * NUMFILES))
5034 local cmd="$LFS find -type f $dir"
5035 local nums=$($cmd | wc -l)
5037 [ $nums -eq $expected ] ||
5038 error "'$cmd' wrong: found $nums, expected $expected"
5040 run_test 56k "check lfs find -type f"
5043 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5045 setup_56_special $dir $NUMFILES $NUMDIRS
5047 local expected=$((NUMDIRS + NUMFILES))
5048 local cmd="$LFS find -type b $dir"
5049 local nums=$($cmd | wc -l)
5051 [ $nums -eq $expected ] ||
5052 error "'$cmd' wrong: found $nums, expected $expected"
5054 run_test 56l "check lfs find -type b"
5057 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5059 setup_56_special $dir $NUMFILES $NUMDIRS
5061 local expected=$((NUMDIRS + NUMFILES))
5062 local cmd="$LFS find -type c $dir"
5063 local nums=$($cmd | wc -l)
5064 [ $nums -eq $expected ] ||
5065 error "'$cmd' wrong: found $nums, expected $expected"
5067 run_test 56m "check lfs find -type c"
5070 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5071 setup_56_special $dir $NUMFILES $NUMDIRS
5073 local expected=$((NUMDIRS + NUMFILES))
5074 local cmd="$LFS find -type l $dir"
5075 local nums=$($cmd | wc -l)
5077 [ $nums -eq $expected ] ||
5078 error "'$cmd' wrong: found $nums, expected $expected"
5080 run_test 56n "check lfs find -type l"
5083 local dir=$DIR/$tdir
5085 setup_56 $dir $NUMFILES $NUMDIRS
5086 utime $dir/file1 > /dev/null || error "utime (1)"
5087 utime $dir/file2 > /dev/null || error "utime (2)"
5088 utime $dir/dir1 > /dev/null || error "utime (3)"
5089 utime $dir/dir2 > /dev/null || error "utime (4)"
5090 utime $dir/dir1/file1 > /dev/null || error "utime (5)"
5091 dd if=/dev/zero count=1 >> $dir/dir1/file1 && sync
5094 local nums=$($LFS find -mtime +0 $dir | wc -l)
5096 [ $nums -eq $expected ] ||
5097 error "lfs find -mtime +0 $dir: found $nums expect $expected"
5100 cmd="$LFS find -mtime 0 $dir"
5101 nums=$($cmd | wc -l)
5102 [ $nums -eq $expected ] ||
5103 error "'$cmd' wrong: found $nums, expected $expected"
5105 run_test 56o "check lfs find -mtime for old files"
5108 [ $RUNAS_ID -eq $UID ] &&
5109 skip_env "RUNAS_ID = UID = $UID -- skipping"
5111 local dir=$DIR/$tdir
5113 setup_56 $dir $NUMFILES $NUMDIRS
5114 chown $RUNAS_ID $dir/file* || error "chown $DIR/${tdir}g/file$i failed"
5116 local expected=$NUMFILES
5117 local cmd="$LFS find -uid $RUNAS_ID $dir"
5118 local nums=$($cmd | wc -l)
5120 [ $nums -eq $expected ] ||
5121 error "'$cmd' wrong: found $nums, expected $expected"
5123 expected=$(((NUMFILES + 1) * NUMDIRS + 1))
5124 cmd="$LFS find ! -uid $RUNAS_ID $dir"
5125 nums=$($cmd | wc -l)
5126 [ $nums -eq $expected ] ||
5127 error "'$cmd' wrong: found $nums, expected $expected"
5129 run_test 56p "check lfs find -uid and ! -uid"
5132 [ $RUNAS_ID -eq $UID ] &&
5133 skip_env "RUNAS_ID = UID = $UID -- skipping"
5135 local dir=$DIR/$tdir
5137 setup_56 $dir $NUMFILES $NUMDIRS
5138 chgrp $RUNAS_GID $dir/file* || error "chown $dir/file$i failed"
5140 local expected=$NUMFILES
5141 local cmd="$LFS find -gid $RUNAS_GID $dir"
5142 local nums=$($cmd | wc -l)
5144 [ $nums -eq $expected ] ||
5145 error "'$cmd' wrong: found $nums, expected $expected"
5147 expected=$(( ($NUMFILES+1) * $NUMDIRS + 1))
5148 cmd="$LFS find ! -gid $RUNAS_GID $dir"
5149 nums=$($cmd | wc -l)
5150 [ $nums -eq $expected ] ||
5151 error "'$cmd' wrong: found $nums, expected $expected"
5153 run_test 56q "check lfs find -gid and ! -gid"
5156 local dir=$DIR/$tdir
5158 setup_56 $dir $NUMFILES $NUMDIRS
5161 local cmd="$LFS find -size 0 -type f -lazy $dir"
5162 local nums=$($cmd | wc -l)
5164 [ $nums -eq $expected ] ||
5165 error "'$cmd' wrong: found $nums, expected $expected"
5166 cmd="$LFS find -size 0 -type f $dir"
5167 nums=$($cmd | wc -l)
5168 [ $nums -eq $expected ] ||
5169 error "'$cmd' wrong: found $nums, expected $expected"
5172 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5173 nums=$($cmd | wc -l)
5174 [ $nums -eq $expected ] ||
5175 error "'$cmd' wrong: found $nums, expected $expected"
5176 cmd="$LFS find ! -size 0 -type f $dir"
5177 nums=$($cmd | wc -l)
5178 [ $nums -eq $expected ] ||
5179 error "'$cmd' wrong: found $nums, expected $expected"
5181 echo "test" > $dir/$tfile
5182 echo "test2" > $dir/$tfile.2 && sync
5184 cmd="$LFS find -size 5 -type f -lazy $dir"
5185 nums=$($cmd | wc -l)
5186 [ $nums -eq $expected ] ||
5187 error "'$cmd' wrong: found $nums, expected $expected"
5188 cmd="$LFS find -size 5 -type f $dir"
5189 nums=$($cmd | wc -l)
5190 [ $nums -eq $expected ] ||
5191 error "'$cmd' wrong: found $nums, expected $expected"
5194 cmd="$LFS find -size +5 -type f -lazy $dir"
5195 nums=$($cmd | wc -l)
5196 [ $nums -eq $expected ] ||
5197 error "'$cmd' wrong: found $nums, expected $expected"
5198 cmd="$LFS find -size +5 -type f $dir"
5199 nums=$($cmd | wc -l)
5200 [ $nums -eq $expected ] ||
5201 error "'$cmd' wrong: found $nums, expected $expected"
5204 cmd="$LFS find -size +0 -type f -lazy $dir"
5205 nums=$($cmd | wc -l)
5206 [ $nums -eq $expected ] ||
5207 error "'$cmd' wrong: found $nums, expected $expected"
5208 cmd="$LFS find -size +0 -type f $dir"
5209 nums=$($cmd | wc -l)
5210 [ $nums -eq $expected ] ||
5211 error "'$cmd' wrong: found $nums, expected $expected"
5214 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5215 nums=$($cmd | wc -l)
5216 [ $nums -eq $expected ] ||
5217 error "'$cmd' wrong: found $nums, expected $expected"
5218 cmd="$LFS find ! -size -5 -type f $dir"
5219 nums=$($cmd | wc -l)
5220 [ $nums -eq $expected ] ||
5221 error "'$cmd' wrong: found $nums, expected $expected"
5224 cmd="$LFS find -size -5 -type f -lazy $dir"
5225 nums=$($cmd | wc -l)
5226 [ $nums -eq $expected ] ||
5227 error "'$cmd' wrong: found $nums, expected $expected"
5228 cmd="$LFS find -size -5 -type f $dir"
5229 nums=$($cmd | wc -l)
5230 [ $nums -eq $expected ] ||
5231 error "'$cmd' wrong: found $nums, expected $expected"
5233 run_test 56r "check lfs find -size works"
5236 local dir=$DIR/$tdir
5238 [[ $OSC == "mdc" ]] && skip "DoM files" && return
5240 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5242 cancel_lru_locks $OSC
5244 local rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5246 local cmd="$LFS find -size 0 -type f -lazy $dir"
5247 local nums=$($cmd | wc -l)
5249 [ $nums -eq $expected ] ||
5250 error "'$cmd' wrong: found $nums, expected $expected"
5252 local rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5253 [ $rpcs_before -eq $rpcs_after ] ||
5254 error "'$cmd' should not send glimpse RPCs to OST"
5255 cmd="$LFS find -size 0 -type f $dir"
5256 nums=$($cmd | wc -l)
5257 [ $nums -eq $expected ] ||
5258 error "'$cmd' wrong: found $nums, expected $expected"
5259 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5260 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5261 $LCTL get_param osc.*.stats
5262 [ $rpcs_after -eq $((rpcs_before + 12)) ] ||
5263 error "'$cmd' should send 12 glimpse RPCs to OST"
5265 cancel_lru_locks $OSC
5266 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5268 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5269 nums=$($cmd | wc -l)
5270 [ $nums -eq $expected ] ||
5271 error "'$cmd' wrong: found $nums, expected $expected"
5272 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5273 $LCTL get_param mdc.*.stats
5274 [ $rpcs_before -eq $rpcs_after ] ||
5275 error "'$cmd' should not send glimpse RPCs to OST"
5276 cmd="$LFS find ! -size 0 -type f $dir"
5277 nums=$($cmd | wc -l)
5278 [ $nums -eq $expected ] ||
5279 error "'$cmd' wrong: found $nums, expected $expected"
5280 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5281 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5282 [ $rpcs_after -eq $((rpcs_before + 12)) ] ||
5283 error "'$cmd' should send 12 glimpse RPCs to OST"
5285 echo "test" > $dir/$tfile
5286 echo "test2" > $dir/$tfile.2 && sync
5287 cancel_lru_locks $OSC
5288 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5290 cmd="$LFS find -size 5 -type f -lazy $dir"
5291 nums=$($cmd | wc -l)
5292 [ $nums -eq $expected ] ||
5293 error "'$cmd' wrong: found $nums, expected $expected"
5294 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5295 [ $rpcs_before -eq $rpcs_after ] ||
5296 error "'$cmd' should not send glimpse RPCs to OST"
5297 cmd="$LFS find -size 5 -type f $dir"
5298 nums=$($cmd | wc -l)
5299 [ $nums -eq $expected ] ||
5300 error "'$cmd' wrong: found $nums, expected $expected"
5301 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5302 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5303 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5304 error "'$cmd' should send 14 glimpse RPCs to OST"
5306 cancel_lru_locks $OSC
5307 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5309 cmd="$LFS find -size +5 -type f -lazy $dir"
5310 nums=$($cmd | wc -l)
5311 [ $nums -eq $expected ] ||
5312 error "'$cmd' wrong: found $nums, expected $expected"
5313 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5314 [ $rpcs_before -eq $rpcs_after ] ||
5315 error "'$cmd' should not send glimpse RPCs to OST"
5316 cmd="$LFS find -size +5 -type f $dir"
5317 nums=$($cmd | wc -l)
5318 [ $nums -eq $expected ] ||
5319 error "'$cmd' wrong: found $nums, expected $expected"
5320 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5321 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5322 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5323 error "'$cmd' should send 14 glimpse RPCs to OST"
5325 cancel_lru_locks $OSC
5326 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5328 cmd="$LFS find -size +0 -type f -lazy $dir"
5329 nums=$($cmd | wc -l)
5330 [ $nums -eq $expected ] ||
5331 error "'$cmd' wrong: found $nums, expected $expected"
5332 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5333 [ $rpcs_before -eq $rpcs_after ] ||
5334 error "'$cmd' should not send glimpse RPCs to OST"
5335 cmd="$LFS find -size +0 -type f $dir"
5336 nums=$($cmd | wc -l)
5337 [ $nums -eq $expected ] ||
5338 error "'$cmd' wrong: found $nums, expected $expected"
5339 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5340 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5341 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5342 error "'$cmd' should send 14 glimpse RPCs to OST"
5344 cancel_lru_locks $OSC
5345 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5347 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5348 nums=$($cmd | wc -l)
5349 [ $nums -eq $expected ] ||
5350 error "'$cmd' wrong: found $nums, expected $expected"
5351 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5352 [ $rpcs_before -eq $rpcs_after ] ||
5353 error "'$cmd' should not send glimpse RPCs to OST"
5354 cmd="$LFS find ! -size -5 -type f $dir"
5355 nums=$($cmd | wc -l)
5356 [ $nums -eq $expected ] ||
5357 error "'$cmd' wrong: found $nums, expected $expected"
5358 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5359 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5360 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5361 error "'$cmd' should send 14 glimpse RPCs to OST"
5363 cancel_lru_locks $OSC
5364 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5366 cmd="$LFS find -size -5 -type f -lazy $dir"
5367 nums=$($cmd | wc -l)
5368 [ $nums -eq $expected ] ||
5369 error "'$cmd' wrong: found $nums, expected $expected"
5370 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5371 [ $rpcs_before -eq $rpcs_after ] ||
5372 error "'$cmd' should not send glimpse RPCs to OST"
5373 cmd="$LFS find -size -5 -type f $dir"
5374 nums=$($cmd | wc -l)
5375 [ $nums -eq $expected ] ||
5376 error "'$cmd' wrong: found $nums, expected $expected"
5377 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5378 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5379 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5380 error "'$cmd' should send 14 glimpse RPCs to OST"
5382 run_test 56ra "check lfs find -size -lazy works for data on OSTs"
5384 test_56s() { # LU-611 #LU-9369
5385 [[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
5387 local dir=$DIR/$tdir
5388 local onestripe=$(((NUMDIRS + 1) * NUMFILES))
5390 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5391 for i in $(seq $NUMDIRS); do
5392 $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile
5395 local expected=$NUMDIRS
5396 local cmd="$LFS find -c $OSTCOUNT $dir"
5397 local nums=$($cmd | wc -l)
5399 [ $nums -eq $expected ] || {
5400 $LFS getstripe -R $dir
5401 error "'$cmd' wrong: found $nums, expected $expected"
5404 expected=$((NUMDIRS + onestripe))
5405 cmd="$LFS find -stripe-count +0 -type f $dir"
5406 nums=$($cmd | wc -l)
5407 [ $nums -eq $expected ] || {
5408 $LFS getstripe -R $dir
5409 error "'$cmd' wrong: found $nums, expected $expected"
5413 cmd="$LFS find -stripe-count 1 -type f $dir"
5414 nums=$($cmd | wc -l)
5415 [ $nums -eq $expected ] || {
5416 $LFS getstripe -R $dir
5417 error "'$cmd' wrong: found $nums, expected $expected"
5420 cmd="$LFS find -stripe-count -2 -type f $dir"
5421 nums=$($cmd | wc -l)
5422 [ $nums -eq $expected ] || {
5423 $LFS getstripe -R $dir
5424 error "'$cmd' wrong: found $nums, expected $expected"
5428 cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir"
5429 nums=$($cmd | wc -l)
5430 [ $nums -eq $expected ] || {
5431 $LFS getstripe -R $dir
5432 error "'$cmd' wrong: found $nums, expected $expected"
5435 run_test 56s "check lfs find -stripe-count works"
5437 test_56t() { # LU-611 #LU-9369
5438 local dir=$DIR/$tdir
5440 setup_56 $dir 0 $NUMDIRS
5441 for i in $(seq $NUMDIRS); do
5442 $LFS setstripe -S 8M $dir/dir$i/$tfile
5445 local expected=$NUMDIRS
5446 local cmd="$LFS find -S 8M $dir"
5447 local nums=$($cmd | wc -l)
5449 [ $nums -eq $expected ] || {
5450 $LFS getstripe -R $dir
5451 error "'$cmd' wrong: found $nums, expected $expected"
5455 setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k"
5457 $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3}
5459 expected=$(((NUMDIRS + 1) * NUMFILES))
5460 cmd="$LFS find -stripe-size 512k -type f $dir"
5461 nums=$($cmd | wc -l)
5462 [ $nums -eq $expected ] ||
5463 error "'$cmd' wrong: found $nums, expected $expected"
5465 cmd="$LFS find -stripe-size +320k -type f $dir"
5466 nums=$($cmd | wc -l)
5467 [ $nums -eq $expected ] ||
5468 error "'$cmd' wrong: found $nums, expected $expected"
5470 expected=$(((NUMDIRS + 1) * NUMFILES + 4))
5471 cmd="$LFS find -stripe-size +200k -type f $dir"
5472 nums=$($cmd | wc -l)
5473 [ $nums -eq $expected ] ||
5474 error "'$cmd' wrong: found $nums, expected $expected"
5476 cmd="$LFS find -stripe-size -640k -type f $dir"
5477 nums=$($cmd | wc -l)
5478 [ $nums -eq $expected ] ||
5479 error "'$cmd' wrong: found $nums, expected $expected"
5482 cmd="$LFS find -stripe-size 256k -type f $dir"
5483 nums=$($cmd | wc -l)
5484 [ $nums -eq $expected ] ||
5485 error "'$cmd' wrong: found $nums, expected $expected"
5487 cmd="$LFS find -stripe-size -320k -type f $dir"
5488 nums=$($cmd | wc -l)
5489 [ $nums -eq $expected ] ||
5490 error "'$cmd' wrong: found $nums, expected $expected"
5493 cmd="$LFS find -stripe-size 1024k -type f $dir"
5494 nums=$($cmd | wc -l)
5495 [ $nums -eq $expected ] ||
5496 error "'$cmd' wrong: found $nums, expected $expected"
5498 run_test 56t "check lfs find -stripe-size works"
5500 test_56u() { # LU-611
5501 local dir=$DIR/$tdir
5503 setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1"
5505 if [[ $OSTCOUNT -gt 1 ]]; then
5506 $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3}
5512 local expected=$(((NUMDIRS + 1) * NUMFILES))
5513 local cmd="$LFS find -stripe-index 0 -type f $dir"
5514 local nums=$($cmd | wc -l)
5516 [ $nums -eq $expected ] ||
5517 error "'$cmd' wrong: found $nums, expected $expected"
5520 cmd="$LFS find -stripe-index 1 -type f $dir"
5521 nums=$($cmd | wc -l)
5522 [ $nums -eq $expected ] ||
5523 error "'$cmd' wrong: found $nums, expected $expected"
5525 cmd="$LFS find ! -stripe-index 0 -type f $dir"
5526 nums=$($cmd | wc -l)
5527 [ $nums -eq $expected ] ||
5528 error "'$cmd' wrong: found $nums, expected $expected"
5531 # This should produce an error and not return any files
5532 cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir"
5533 nums=$($cmd 2>/dev/null | wc -l)
5534 [ $nums -eq $expected ] ||
5535 error "'$cmd' wrong: found $nums, expected $expected"
5537 if [[ $OSTCOUNT -gt 1 ]]; then
5538 expected=$(((NUMDIRS + 1) * NUMFILES + onestripe))
5539 cmd="$LFS find -stripe-index 0,1 -type f $dir"
5540 nums=$($cmd | wc -l)
5541 [ $nums -eq $expected ] ||
5542 error "'$cmd' wrong: found $nums, expected $expected"
5545 run_test 56u "check lfs find -stripe-index works"
5549 local dir=$DIR/$tdir
5551 setup_56 $dir $NUMFILES $NUMDIRS
5553 UUID=$(mdtuuid_from_index $mdt_idx $dir)
5554 [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $mdt_idx"
5556 for file in $($LFS find -m $UUID $dir); do
5557 file_midx=$($LFS getstripe -m $file)
5558 [ $file_midx -eq $mdt_idx ] ||
5559 error "lfs find -m $UUID != getstripe -m $file_midx"
5562 run_test 56v "check 'lfs find -m match with lfs getstripe -m'"
5565 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5566 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5568 local dir=$DIR/$tdir
5570 setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
5572 local stripe_size=$($LFS getstripe -S -d $dir) ||
5573 error "$LFS getstripe -S -d $dir failed"
5574 stripe_size=${stripe_size%% *}
5576 local file_size=$((stripe_size * OSTCOUNT))
5577 local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
5578 local required_space=$((file_num * file_size))
5579 local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
5581 [[ $free_space -le $((required_space / 1024)) ]] &&
5582 skip_env "need $required_space, have $free_space kbytes"
5585 local dd_count=$((file_size / dd_bs))
5587 # write data into the files
5592 for i in $(seq $NUMFILES); do
5594 yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5595 error "write data into $file failed"
5597 for i in $(seq $NUMDIRS); do
5598 for j in $(seq $NUMFILES); do
5599 file=$dir/dir$i/file$j
5600 yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5601 error "write data into $file failed"
5605 # $LFS_MIGRATE will fail if hard link migration is unsupported
5606 if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then
5607 createmany -l$dir/dir1/file1 $dir/dir1/link 200 ||
5608 error "creating links to $dir/dir1/file1 failed"
5613 [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
5616 local cmd="$LFS_MIGRATE -y -c $expected $dir/file1"
5619 eval $cmd || error "$cmd failed"
5621 check_stripe_count $dir/file1 $expected
5623 if [ $MDS1_VERSION -ge $(version_code 2.6.90) ];
5625 # lfs_migrate file onto OST 0 if it is on OST 1, or onto
5626 # OST 1 if it is on OST 0. This file is small enough to
5627 # be on only one stripe.
5628 file=$dir/migr_1_ost
5629 dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
5630 error "write data into $file failed"
5631 local obdidx=$($LFS getstripe -i $file)
5632 local oldmd5=$(md5sum $file)
5635 [[ $obdidx -eq 0 ]] && newobdidx=1
5636 cmd="$LFS migrate -i $newobdidx $file"
5638 eval $cmd || error "$cmd failed"
5640 local realobdix=$($LFS getstripe -i $file)
5641 local newmd5=$(md5sum $file)
5643 [[ $newobdidx -ne $realobdix ]] &&
5644 error "new OST is different (was=$obdidx, "\
5645 "wanted=$newobdidx, got=$realobdix)"
5646 [[ "$oldmd5" != "$newmd5" ]] &&
5647 error "md5sum differ: $oldmd5, $newmd5"
5651 cmd="$LFS_MIGRATE -y -c $expected $dir/dir1"
5653 eval $cmd || error "$cmd failed"
5655 for j in $(seq $NUMFILES); do
5656 check_stripe_count $dir/dir1/file$j $expected
5659 # lfs_migrate works with lfs find
5660 cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir |
5661 $LFS_MIGRATE -y -c $expected"
5663 eval $cmd || error "$cmd failed"
5665 for i in $(seq 2 $NUMFILES); do
5666 check_stripe_count $dir/file$i $expected
5668 for i in $(seq 2 $NUMDIRS); do
5669 for j in $(seq $NUMFILES); do
5670 check_stripe_count $dir/dir$i/file$j $expected
5674 run_test 56w "check lfs_migrate -c stripe_count works"
5677 local file1=$DIR/$tdir/file1
5678 local create_pool=false
5679 local initial_pool=$($LFS getstripe -p $DIR)
5683 echo -n "Creating test dir..."
5684 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5687 echo -n "Creating test file..."
5688 touch $file1 || error "cannot create file"
5691 echo -n "Detecting existing pools..."
5692 pool_list=($($LFS pool_list $FSNAME | grep "$FSNAME\." | cut -d. -f2))
5694 if [ ${#pool_list[@]} -gt 0 ]; then
5695 echo "${pool_list[@]}"
5696 for thispool in "${pool_list[@]}"; do
5697 if [[ -z "$initial_pool" ||
5698 "$initial_pool" != "$thispool" ]]; then
5700 echo "Using existing pool '$pool'"
5705 echo "none detected."
5707 if [ -z "$pool" ]; then
5708 pool=${POOL:-testpool}
5709 [ "$initial_pool" = "$pool" ] && pool="testpool2"
5710 echo -n "Creating pool '$pool'..."
5712 pool_add $pool &> /dev/null ||
5713 error "pool_add failed"
5716 echo -n "Adding target to pool..."
5717 pool_add_targets $pool 0 0 1 &> /dev/null ||
5718 error "pool_add_targets failed"
5722 echo -n "Setting pool using -p option..."
5723 $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null ||
5724 error "migrate failed rc = $?"
5727 echo -n "Verifying test file is in pool after migrating..."
5728 [ "$($LFS getstripe -p $file1)" = $pool ] ||
5729 error "file was not migrated to pool $pool"
5732 echo -n "Removing test file from pool '$pool'..."
5733 $LFS migrate $file1 &> /dev/null ||
5734 error "cannot remove from pool"
5735 [ "$($LFS getstripe -p $file1)" ] &&
5736 error "pool still set"
5739 echo -n "Setting pool using --pool option..."
5740 $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null ||
5741 error "migrate failed rc = $?"
5746 if $create_pool; then
5747 destroy_test_pools 2> /dev/null ||
5748 error "destroy test pools failed"
5751 run_test 56wb "check lfs_migrate pool support"
5754 local file1="$DIR/$tdir/file1"
5756 echo -n "Creating test dir..."
5757 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5758 local def_stripe_size=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
5759 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
5760 error "cannot set stripe"
5763 echo -n "Setting initial stripe for test file..."
5764 $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
5765 error "cannot set stripe"
5766 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
5767 error "stripe size not set"
5770 # File currently set to -S 512K -c 1
5772 # Ensure -c and -S options are rejected when -R is set
5773 echo -n "Verifying incompatible options are detected..."
5774 $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null &&
5775 error "incompatible -c and -R options not detected"
5776 $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null &&
5777 error "incompatible -S and -R options not detected"
5780 # Ensure unrecognized options are passed through to 'lfs migrate'
5781 echo -n "Verifying -S option is passed through to lfs migrate..."
5782 $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
5783 error "migration failed"
5784 [ $($LFS getstripe -S "$file1") -eq 1048576 ] ||
5785 error "file was not restriped"
5788 # File currently set to -S 1M -c 1
5790 # Ensure long options are supported
5791 echo -n "Verifying long options supported..."
5792 $LFS_MIGRATE -y --non-block "$file1" &> /dev/null ||
5793 error "long option without argument not supported"
5794 $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
5795 error "long option with argument not supported"
5796 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
5797 error "file not restriped with --stripe-size option"
5800 # File currently set to -S 512K -c 1
5802 if [ "$OSTCOUNT" -gt 1 ]; then
5803 echo -n "Verifying explicit stripe count can be set..."
5804 $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
5805 error "migrate failed"
5806 [ $($LFS getstripe -c "$file1") -eq 2 ] ||
5807 error "file not restriped to explicit count"
5811 # File currently set to -S 512K -c 1 or -S 512K -c 2
5813 # Ensure parent striping is used if -R is set, and no stripe
5814 # count or size is specified
5815 echo -n "Setting stripe for parent directory..."
5816 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
5817 error "cannot set stripe"
5820 echo -n "Verifying restripe option uses parent stripe settings..."
5821 $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
5822 error "migrate failed"
5823 [ $($LFS getstripe -S "$file1") -eq $def_stripe_size ] ||
5824 error "file not restriped to parent settings"
5825 [ $($LFS getstripe -c "$file1") -eq 1 ] ||
5826 error "file not restriped to parent settings"
5829 # File currently set to -S 1M -c 1
5831 # Ensure striping is preserved if -R is not set, and no stripe
5832 # count or size is specified
5833 echo -n "Verifying striping size preserved when not specified..."
5834 local orig_stripe_size=$($LFS getstripe -S "$file1" 2>/dev/null)
5835 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5836 error "cannot set stripe on parent directory"
5837 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5838 error "migrate failed"
5839 [ $($LFS getstripe -S "$file1") -eq $orig_stripe_size ] ||
5840 error "file was restriped"
5843 # Ensure file name properly detected when final option has no argument
5844 echo -n "Verifying file name properly detected..."
5845 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5846 error "file name interpreted as option argument"
5852 run_test 56wc "check unrecognized options for lfs_migrate are passed through"
5855 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5857 local file1=$DIR/$tdir/file1
5859 echo -n "Creating test dir..."
5860 test_mkdir $DIR/$tdir || error "cannot create dir"
5863 echo -n "Creating test file..."
5867 # Ensure 'lfs migrate' will fail by using a non-existent option,
5868 # and make sure rsync is not called to recover
5869 echo -n "Make sure --no-rsync option works..."
5870 $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 |
5871 grep -q 'refusing to fall back to rsync' ||
5872 error "rsync was called with --no-rsync set"
5875 # Ensure rsync is called without trying 'lfs migrate' first
5876 echo -n "Make sure --rsync option works..."
5877 $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 |
5878 grep -q 'falling back to rsync' &&
5879 error "lfs migrate was called with --rsync set"
5882 echo -n "Make sure --rsync and --no-rsync options are exclusive..."
5883 $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 |
5884 grep -q 'at the same time' ||
5885 error "--rsync and --no-rsync accepted concurrently"
5891 run_test 56wd "check lfs_migrate --rsync and --no-rsync work"
5894 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5895 check_swap_layouts_support
5897 local dir=$DIR/$tdir
5898 local ref1=/etc/passwd
5899 local file1=$dir/file1
5901 test_mkdir $dir || error "creating dir $dir"
5902 $LFS setstripe -c 2 $file1
5904 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
5905 stripe=$($LFS getstripe -c $file1)
5906 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
5907 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
5912 run_test 56x "lfs migration support"
5915 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5916 check_swap_layouts_support
5918 local dir=$DIR/$tdir/$testnum
5922 local ref1=/etc/passwd
5923 local file1=$dir/file1
5925 $LFS setstripe -c 2 $file1
5927 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
5929 local stripe=$($LFS getstripe -c $file1)
5931 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
5932 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
5937 run_test 56xa "lfs migration --block support"
5939 check_migrate_links() {
5941 local file1="$dir/file1"
5944 local total_count=$(($begin + $count - 1))
5945 local symlink_count=10
5948 if [ ! -f "$file1" ]; then
5949 echo -n "creating initial file..."
5950 $LFS setstripe -c 1 -S "512k" "$file1" ||
5951 error "cannot setstripe initial file"
5954 echo -n "creating symlinks..."
5955 for s in $(seq 1 $symlink_count); do
5956 ln -s "$file1" "$dir/slink$s" ||
5957 error "cannot create symlinks"
5961 echo -n "creating nonlinked files..."
5962 createmany -o "$dir/uniq" 1 10 &> /dev/null ||
5963 error "cannot create nonlinked files"
5968 if [ ! -f "$dir/file$total_count" ]; then
5969 echo -n "creating hard links $begin:$total_count..."
5970 createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
5971 /dev/null || error "cannot create hard links"
5975 echo -n "checking number of hard links listed in xattrs..."
5976 local fid=$($LFS getstripe -F "$file1")
5977 local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
5980 if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
5981 skip "hard link list has unexpected size, skipping test"
5983 if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
5984 error "link names should exceed xattrs size"
5987 echo -n "migrating files..."
5988 local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir)
5990 [ $rc -eq 0 ] || error "migrate failed rc = $rc"
5993 # make sure all links have been properly migrated
5994 echo -n "verifying files..."
5995 fid=$($LFS getstripe -F "$file1") ||
5996 error "cannot get fid for file $file1"
5997 for i in $(seq 2 $total_count); do
5998 local fid2=$($LFS getstripe -F $dir/file$i)
6000 [ "$fid2" == "$fid" ] ||
6001 error "migrated hard link has mismatched FID"
6004 # make sure hard links were properly detected, and migration was
6005 # performed only once for the entire link set; nonlinked files should
6007 local actual=$(grep -c 'done migrate' <<< "$migrate_out")
6008 local expected=$(($uniq_count + 1))
6010 [ "$actual" -eq "$expected" ] ||
6011 error "hard links individually migrated ($actual != $expected)"
6013 # make sure the correct number of hard links are present
6014 local hardlinks=$(stat -c '%h' "$file1")
6016 [ $hardlinks -eq $total_count ] ||
6017 error "num hard links $hardlinks != $total_count"
6024 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
6025 skip "Need MDS version at least 2.10.55"
6027 local dir="$DIR/$tdir"
6029 test_mkdir "$dir" || error "cannot create dir $dir"
6031 echo "testing lfs migrate mode when all links fit within xattrs"
6032 LFS_MIGRATE_RSYNC=false check_migrate_links "$dir" 2 99
6034 echo "testing rsync mode when all links fit within xattrs"
6035 LFS_MIGRATE_RSYNC=true check_migrate_links "$dir" 2 99
6037 echo "testing lfs migrate mode when all links do not fit within xattrs"
6038 LFS_MIGRATE_RSYNC=false check_migrate_links "$dir" 101 100
6040 echo "testing rsync mode when all links do not fit within xattrs"
6041 LFS_MIGRATE_RSYNC=true check_migrate_links "$dir" 101 100
6046 run_test 56xb "lfs migration hard link support"
6049 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
6050 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
6053 local dir=$DIR/$tdir
6057 test_mkdir -p $dir || error "creating dir $dir"
6058 touch $f1 || error "creating std file $f1"
6059 $MULTIOP $f2 H2c || error "creating released file $f2"
6061 # a directory can be raid0, so ask only for files
6062 res=$($LFS find $dir -L raid0 -type f | wc -l)
6063 [[ $res == 2 ]] || error "search raid0: found $res files != 2"
6065 res=$($LFS find $dir \! -L raid0 -type f | wc -l)
6066 [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
6068 # only files can be released, so no need to force file search
6069 res=$($LFS find $dir -L released)
6070 [[ $res == $f2 ]] || error "search released: found $res != $f2"
6072 res=$($LFS find $dir -type f \! -L released)
6073 [[ $res == $f1 ]] || error "search !released: found $res != $f1"
6075 run_test 56y "lfs find -L raid0|released"
6077 test_56z() { # LU-4824
6078 # This checks to make sure 'lfs find' continues after errors
6079 # There are two classes of errors that should be caught:
6080 # - If multiple paths are provided, all should be searched even if one
6082 # - If errors are encountered during the search, it should not terminate
6084 local dir=$DIR/$tdir
6088 for i in d{0..9}; do
6091 touch $dir/d{0..9}/$tfile
6092 $LFS find $DIR/non_existent_dir $dir &&
6093 error "$LFS find did not return an error"
6094 # Make a directory unsearchable. This should NOT be the last entry in
6095 # directory order. Arbitrarily pick the 6th entry
6096 chmod 700 $($LFS find $dir -type d | sed '6!d')
6098 local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l)
6100 # The user should be able to see 10 directories and 9 files
6101 [ $count == 19 ] || error "$LFS find did not continue after error"
6103 run_test 56z "lfs find should continue after an error"
6105 test_56aa() { # LU-5937
6106 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
6108 local dir=$DIR/$tdir
6111 $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
6113 createmany -o $dir/striped_dir/${tfile}- 1024
6114 local dirs=$($LFS find --size +8k $dir/)
6116 [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
6118 run_test 56aa "lfs find --size under striped dir"
6120 test_56ab() { # LU-10705
6121 test_mkdir $DIR/$tdir
6122 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
6123 dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
6124 dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
6125 # Flush writes to ensure valid blocks. Need to be more thorough for
6126 # ZFS, since blocks are not allocated/returned to client immediately.
6128 wait_zfs_commit ost1 2
6129 cancel_lru_locks osc
6132 local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
6134 [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
6136 files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
6137 [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
6139 rm -f $DIR/$tdir/$tfile.[123]
6141 run_test 56ab "lfs find --blocks"
6144 [ $MDS1_VERSION -lt $(version_code 2.10.50) ] &&
6145 skip "Need MDS version at least 2.10.50"
6147 # Create composite files with one component
6148 local dir=$DIR/$tdir
6150 setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
6151 # Create composite files with three components
6152 setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
6153 # Create non-composite files
6154 createmany -o $dir/${tfile}- 10
6156 local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l)
6158 [[ $nfiles == 10 ]] ||
6159 error "lfs find -E 1M found $nfiles != 10 files"
6161 nfiles=$($LFS find ! -E 1M --type f $dir | wc -l)
6162 [[ $nfiles == 25 ]] ||
6163 error "lfs find ! -E 1M found $nfiles != 25 files"
6165 # All files have a component that starts at 0
6166 nfiles=$($LFS find --component-start 0 --type f $dir | wc -l)
6167 [[ $nfiles == 35 ]] ||
6168 error "lfs find --component-start 0 - $nfiles != 35 files"
6170 nfiles=$($LFS find --component-start 2M --type f $dir | wc -l)
6171 [[ $nfiles == 15 ]] ||
6172 error "lfs find --component-start 2M - $nfiles != 15 files"
6174 # All files created here have a componenet that does not starts at 2M
6175 nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l)
6176 [[ $nfiles == 35 ]] ||
6177 error "lfs find ! --component-start 2M - $nfiles != 35 files"
6179 # Find files with a specified number of components
6180 local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l)
6181 [[ $nfiles == 15 ]] ||
6182 error "lfs find --component-count 3 - $nfiles != 15 files"
6184 # Remember non-composite files have a component count of zero
6185 local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l)
6186 [[ $nfiles == 10 ]] ||
6187 error "lfs find --component-count 0 - $nfiles != 10 files"
6189 nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l)
6190 [[ $nfiles == 20 ]] ||
6191 error "lfs find ! --component-count 3 - $nfiles != 20 files"
6193 # All files have a flag called "init"
6194 local nfiles=$($LFS find --component-flags init --type f $dir | wc -l)
6195 [[ $nfiles == 35 ]] ||
6196 error "lfs find --component-flags init - $nfiles != 35 files"
6198 # Multi-component files will have a component not initialized
6199 local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l)
6200 [[ $nfiles == 15 ]] ||
6201 error "lfs find !--component-flags init - $nfiles != 15 files"
6206 run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
6209 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
6210 skip "Need MDS version at least 2.10.57"
6220 # create mirrored directories and mirrored files
6221 mkdir $td || error "mkdir $td failed"
6222 $LFS mirror create -N3 $td || error "create mirrored dir $td failed"
6223 createmany -o $tf- 10 || error "create $tf- failed"
6225 for i in $(seq 2); do
6227 mkdir $dir || error "mkdir $dir failed"
6228 $LFS mirror create -N$((3 + i)) $dir ||
6229 error "create mirrored dir $dir failed"
6230 createmany -o $dir/$tfile- 10 ||
6231 error "create $dir/$tfile- failed"
6234 # change the states of some mirrored files
6236 for i in $(seq 2); do
6238 for j in $(seq 4 9); do
6239 echo foo > $dir/$tfile-$j
6243 # find mirrored files with specific mirror count
6244 cmd="$LFS find --mirror-count 3 --type f $td"
6245 nfiles=$($cmd | wc -l)
6246 [[ $nfiles = 10 ]] || error "$cmd: $nfiles != 10 files"
6248 cmd="$LFS find ! --mirror-count 3 --type f $td"
6249 nfiles=$($cmd | wc -l)
6250 [[ $nfiles = 20 ]] || error "$cmd: $nfiles != 20 files"
6252 cmd="$LFS find --mirror-count +2 --type f $td"
6253 nfiles=$($cmd | wc -l)
6254 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6256 cmd="$LFS find --mirror-count -6 --type f $td"
6257 nfiles=$($cmd | wc -l)
6258 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6260 # find mirrored files with specific file state
6261 cmd="$LFS find --maxdepth 1 --mirror-state=^ro --type f $td"
6262 [[ $($cmd) = $tf-6 ]] || error "$cmd: didn't return $tf-6"
6264 cmd="$LFS find --mirror-state=ro --type f $td"
6265 nfiles=$($cmd | wc -l)
6266 [[ $nfiles = 17 ]] || error "$cmd: $nfiles != 17 files"
6268 cmd="$LFS find ! --mirror-state=ro --type f $td"
6269 nfiles=$($cmd | wc -l)
6270 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6272 cmd="$LFS find --mirror-state=wp --type f $td"
6273 nfiles=$($cmd | wc -l)
6274 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6276 cmd="$LFS find ! --mirror-state=sp --type f $td"
6277 nfiles=$($cmd | wc -l)
6278 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6280 run_test 56ca "check lfs find --mirror-count|-N and --mirror-state"
6283 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6284 # note test will not do anything if MDS is not local
6285 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6286 skip_env "ldiskfs only test"
6288 remote_mds_nodsh && skip "remote MDS with nodsh"
6290 local MNTDEV="osd*.*MDT*.mntdev"
6291 DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV)
6292 [ -z "$DEV" ] && error "can't access $MNTDEV"
6293 for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
6294 do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
6295 error "can't access $DEV"
6296 DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
6297 [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
6301 run_test 57a "verify MDS filesystem created with large inodes =="
6304 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6305 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6306 skip_env "ldiskfs only test"
6308 remote_mds_nodsh && skip "remote MDS with nodsh"
6310 local dir=$DIR/$tdir
6313 local fileN=$dir/f$filecount
6315 rm -rf $dir || error "removing $dir"
6317 local mdtidx=$($LFS getstripe -m $dir)
6318 local mdtname=MDT$(printf %04x $mdtidx)
6319 local facet=mds$((mdtidx + 1))
6321 echo "mcreating $filecount files"
6322 createmany -m $dir/f 1 $filecount || error "creating files in $dir"
6324 # verify that files do not have EAs yet
6325 $LFS getstripe $file1 2>&1 | grep -q "no stripe" ||
6326 error "$file1 has an EA"
6327 $LFS getstripe $fileN 2>&1 | grep -q "no stripe" ||
6328 error "$fileN has an EA"
6332 df $dir #make sure we get new statfs data
6333 local mdsfree=$(do_facet $facet \
6334 lctl get_param -n osd*.*$mdtname.kbytesfree)
6335 local mdcfree=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6338 echo "opening files to create objects/EAs"
6339 for file in $(seq -f $dir/f%g 1 $filecount); do
6340 $OPENFILE -f O_RDWR $file > /dev/null 2>&1 ||
6341 error "opening $file"
6344 # verify that files have EAs now
6345 $LFS getstripe $file1 | grep -q "obdidx" || error "$file1 missing EA"
6346 $LFS getstripe $fileN | grep -q "obdidx" || error "$fileN missing EA"
6348 sleep 1 #make sure we get new statfs data
6350 local mdsfree2=$(do_facet $facet \
6351 lctl get_param -n osd*.*$mdtname.kbytesfree)
6352 local mdcfree2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6354 if [[ $mdcfree2 -lt $((mdcfree - 16)) ]]; then
6355 if [ "$mdsfree" != "$mdsfree2" ]; then
6356 error "MDC before $mdcfree != after $mdcfree2"
6358 echo "MDC before $mdcfree != after $mdcfree2"
6359 echo "unable to confirm if MDS has large inodes"
6364 run_test 57b "default LOV EAs are stored inside large inodes ==="
6367 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6368 [ -z "$(which wiretest 2>/dev/null)" ] &&
6369 skip_env "could not find wiretest"
6373 run_test 58 "verify cross-platform wire constants =============="
6376 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6378 echo "touch 130 files"
6379 createmany -o $DIR/f59- 130
6381 unlinkmany $DIR/f59- 130
6383 # wait for commitment of removal
6384 wait_delete_completed
6386 run_test 59 "verify cancellation of llog records async ========="
6388 TEST60_HEAD="test_60 run $RANDOM"
6390 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6391 remote_mgs_nodsh && skip "remote MGS with nodsh"
6392 do_facet mgs "! which run-llog.sh &> /dev/null" &&
6393 do_facet mgs "! ls run-llog.sh &> /dev/null" &&
6394 skip_env "missing subtest run-llog.sh"
6396 log "$TEST60_HEAD - from kernel mode"
6397 do_facet mgs "$LCTL dk > /dev/null"
6398 do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed"
6399 do_facet mgs $LCTL dk > $TMP/$tfile
6401 # LU-6388: test llog_reader
6402 local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
6403 llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
6404 [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
6405 skip_env "missing llog_reader"
6406 local fstype=$(facet_fstype mgs)
6407 [ $fstype != ldiskfs -a $fstype != zfs ] &&
6408 skip_env "Only for ldiskfs or zfs type mgs"
6410 local mntpt=$(facet_mntpt mgs)
6411 local mgsdev=$(mgsdevname 1)
6423 #get fid and record list
6424 fid_list=($(awk '/9_sub.*record/ { print $NF }' /$TMP/$tfile |
6426 rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' /$TMP/$tfile |
6428 #remount mgs as ldiskfs or zfs type
6429 stop mgs || error "stop mgs failed"
6430 mount_fstype mgs || error "remount mgs failed"
6431 for ((i = 0; i < ${#fid_list[@]}; i++)); do
6434 seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
6435 oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
6440 obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
6442 obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
6444 echo "obj_file is $obj_file"
6445 do_facet mgs $llog_reader $obj_file
6447 rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
6448 awk '{ print $3 }' | sed -e "s/^type=//g")
6449 if [ $rec_type != $rec ]; then
6450 echo "FAILED test_60a wrong record type $rec_type," \
6456 #check obj path if record type is LLOG_LOGID_MAGIC
6457 if [ "$rec" == "1064553b" ]; then
6458 path=$(do_facet mgs $llog_reader $obj_file |
6459 grep "path=" | awk '{ print $NF }' |
6460 sed -e "s/^path=//g")
6461 if [ $obj_file != $mntpt/$path ]; then
6462 echo "FAILED test_60a wrong obj path" \
6463 "$montpt/$path, should be $obj_file"
6470 #restart mgs before "error", otherwise it will block the next test
6471 stop mgs || error "stop mgs failed"
6472 start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
6473 $pass || error "test failed, see FAILED test_60a messages for specifics"
6475 run_test 60a "llog_test run from kernel module and test llog_reader"
6477 test_60b() { # bug 6411
6478 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6481 LLOG_COUNT=$(do_facet mgs dmesg |
6482 awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
6483 /llog_[a-z]*.c:[0-9]/ {
6495 [[ $LLOG_COUNT -gt 120 ]] &&
6496 error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
6498 run_test 60b "limit repeated messages from CERROR/CWARN"
6501 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6503 echo "create 5000 files"
6504 createmany -o $DIR/f60c- 5000
6505 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137
6506 lctl set_param fail_loc=0x80000137
6507 unlinkmany $DIR/f60c- 5000
6508 lctl set_param fail_loc=0
6510 run_test 60c "unlink file when mds full"
6513 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6515 SAVEPRINTK=$(lctl get_param -n printk)
6516 # verify "lctl mark" is even working"
6517 MESSAGE="test message ID $RANDOM $$"
6518 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6519 dmesg | grep -q "$MESSAGE" || error "didn't find debug marker in log"
6521 lctl set_param printk=0 || error "set lnet.printk failed"
6522 lctl get_param -n printk | grep emerg || error "lnet.printk dropped emerg"
6523 MESSAGE="new test message ID $RANDOM $$"
6524 # Assume here that libcfs_debug_mark_buffer() uses D_WARNING
6525 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6526 dmesg | grep -q "$MESSAGE" && error "D_WARNING wasn't masked" || true
6528 lctl set_param -n printk="$SAVEPRINTK"
6530 run_test 60d "test printk console message masking"
6533 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6534 remote_mds_nodsh && skip "remote MDS with nodsh"
6537 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
6538 do_facet mds1 lctl set_param fail_loc=0x15b
6541 run_test 60e "no space while new llog is being created"
6546 test_mkdir -c $MDSCOUNT $DIR/$tdir
6547 $LFS setdirstripe -D -i -1 -c $MDSCOUNT $DIR/$tdir
6552 mkdir $DIR/$tdir/subdir$index 2>/dev/null
6553 rmdir $DIR/$tdir/subdir$index 2>/dev/null
6554 index=$((index + 1))
6560 for i in $(seq 100); do
6561 # define OBD_FAIL_OSD_TXN_START 0x19a
6562 do_facet mds1 lctl set_param fail_loc=0x8000019a
6568 mkdir $DIR/$tdir/new || error "mkdir failed"
6569 rmdir $DIR/$tdir/new || error "rmdir failed"
6571 run_test 60g "transaction abort won't cause MDT hung"
6574 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6577 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1 || error "dd $f failed"
6578 cancel_lru_locks osc
6579 $MULTIOP $f OSMWUc || error "$MULTIOP $f failed"
6582 run_test 61a "mmap() writes don't make sync hang ================"
6585 mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
6587 run_test 61b "mmap() of unstriped file is successful"
6589 # bug 2330 - insufficient obd_match error checking causes LBUG
6591 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6595 cancel_lru_locks osc
6596 lctl set_param fail_loc=0x405
6597 cat $f && error "cat succeeded, expect -EIO"
6598 lctl set_param fail_loc=0
6600 # This test is now irrelevant (as of bug 10718 inclusion), we no longer
6601 # match every page all of the time.
6602 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
6604 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
6605 # Though this test is irrelevant anymore, it helped to reveal some
6606 # other grant bugs (LU-4482), let's keep it.
6607 test_63a() { # was test_63
6608 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6610 MAX_DIRTY_MB=$(lctl get_param -n osc.*.max_dirty_mb | head -n 1)
6612 for i in `seq 10` ; do
6613 dd if=/dev/zero of=$DIR/f63 bs=8k &
6619 rm -f $DIR/f63 || true
6621 run_test 63a "Verify oig_wait interruption does not crash ======="
6623 # bug 2248 - async write errors didn't return to application on sync
6624 # bug 3677 - async write errors left page locked
6626 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6629 lctl set_param debug=-1
6631 # ensure we have a grant to do async writes
6632 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
6635 sync # sync lest earlier test intercept the fail_loc
6637 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
6638 lctl set_param fail_loc=0x80000406
6639 $MULTIOP $DIR/$tfile Owy && \
6640 error "sync didn't return ENOMEM"
6641 sync; sleep 2; sync # do a real sync this time to flush page
6642 lctl get_param -n llite.*.dump_page_cache | grep locked && \
6643 error "locked page left in cache after async error" || true
6646 run_test 63b "async write errors should be returned to fsync ==="
6649 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6652 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
6654 run_test 64a "verify filter grant calculations (in kernel) ====="
6657 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6659 sh oos.sh $MOUNT || error "oos.sh failed: $?"
6661 run_test 64b "check out-of-space detection on client"
6664 $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
6666 run_test 64c "verify grant shrink"
6668 # this does exactly what osc_request.c:osc_announce_cached() does in
6669 # order to calculate max amount of grants to ask from server
6673 local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc)
6674 local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight)
6676 ((rpc_in_flight ++));
6677 nrpages=$((nrpages * rpc_in_flight))
6679 local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb)
6681 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
6683 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
6684 local undirty=$((nrpages * PAGE_SIZE))
6686 local max_extent_pages
6687 max_extent_pages=$($LCTL get_param osc.${tgt}.import |
6688 grep grant_max_extent_size | awk '{print $2}')
6689 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
6690 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
6691 local grant_extent_tax
6692 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
6693 grep grant_extent_tax | awk '{print $2}')
6695 undirty=$((undirty + nrextents * grant_extent_tax))
6700 # this is size of unit for grant allocation. It should be equal to
6701 # what tgt_grant.c:tgt_grant_chunk() calculates
6705 local grant_extent_tax
6707 max_brw_size=$($LCTL get_param osc.${tgt}.import |
6708 grep max_brw_size | awk '{print $2}')
6710 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
6711 grep grant_extent_tax | awk '{print $2}')
6713 echo $(((max_brw_size + grant_extent_tax) * 2))
6717 [ $OST1_VERSION -lt $(version_code 2.10.56) ] &&
6718 skip "OST < 2.10.55 doesn't limit grants enough"
6720 local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}')
6721 local file=$DIR/$tfile
6723 [[ $($LCTL get_param osc.${tgt}.import |
6724 grep "connect_flags:.*grant_param") ]] ||
6725 skip "no grant_param connect flag"
6727 local olddebug=$($LCTL get_param -n debug 2> /dev/null)
6729 $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true
6731 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
6732 stack_trap "rm -f $file" EXIT
6734 $SETSTRIPE $file -i 0 -c 1
6735 dd if=/dev/zero of=$file bs=1M count=1000 &
6740 local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes)
6741 if [[ $cur_grant -gt $max_cur_granted ]]
6744 error "cur_grant $cur_grant > $max_cur_granted"
6747 [[ $? -ne 0 ]] && break;
6752 wait_delete_completed
6753 $LCTL set_param debug="$olddebug" 2> /dev/null || true
6755 run_test 64d "check grant limit exceed"
6757 # bug 1414 - set/get directories' stripe info
6759 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6761 test_mkdir $DIR/$tdir
6763 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
6765 run_test 65a "directory with no stripe info"
6768 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6770 test_mkdir $DIR/$tdir
6771 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
6773 $SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
6776 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
6778 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
6781 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6782 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
6784 test_mkdir $DIR/$tdir
6785 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
6787 $LFS setstripe -S $((stripesize * 4)) -i 1 \
6788 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
6790 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
6792 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
6795 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6797 test_mkdir $DIR/$tdir
6798 local STRIPECOUNT=$($GETSTRIPE -c $DIR/$tdir)
6799 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
6801 if [[ $STRIPECOUNT -le 0 ]]; then
6803 elif [[ $STRIPECOUNT -gt 2000 ]]; then
6804 #LOV_MAX_STRIPE_COUNT is 2000
6805 [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1))
6807 sc=$(($STRIPECOUNT - 1))
6809 $SETSTRIPE -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
6810 touch $DIR/$tdir/f4 $DIR/$tdir/f5
6811 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
6812 error "lverify failed"
6814 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
6817 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6819 test_mkdir $DIR/$tdir
6821 $SETSTRIPE $DIR/$tdir || error "setstripe"
6822 $GETSTRIPE -v $DIR/$tdir | grep "Default" ||
6823 error "no stripe info failed"
6825 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
6827 run_test 65e "directory setstripe defaults"
6830 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6832 test_mkdir $DIR/${tdir}f
6833 $RUNAS $SETSTRIPE $DIR/${tdir}f && error "setstripe succeeded" || true
6835 run_test 65f "dir setstripe permission (should return error) ==="
6838 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6840 test_mkdir $DIR/$tdir
6841 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
6843 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
6844 error "setstripe -S failed"
6845 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
6846 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
6847 error "delete default stripe failed"
6849 run_test 65g "directory setstripe -d"
6852 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6854 test_mkdir $DIR/$tdir
6855 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
6857 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
6858 error "setstripe -S failed"
6859 test_mkdir $DIR/$tdir/dd1
6860 [ $($LFS getstripe -c $DIR/$tdir) = $($GETSTRIPE -c $DIR/$tdir/dd1) ] ||
6861 error "stripe info inherit failed"
6863 run_test 65h "directory stripe info inherit ===================="
6866 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6868 save_layout_restore_at_exit $MOUNT
6870 # bug6367: set non-default striping on root directory
6871 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
6873 # bug12836: getstripe on -1 default directory striping
6874 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
6876 # bug12836: getstripe -v on -1 default directory striping
6877 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
6879 # bug12836: new find on -1 default directory striping
6880 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
6882 run_test 65i "various tests to set root directory striping"
6884 test_65j() { # bug6367
6885 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6889 # if we aren't already remounting for each test, do so for this test
6890 if [ "$CLEANUP" = ":" -a "$I_MOUNTED" = "yes" ]; then
6891 cleanup || error "failed to unmount"
6895 save_layout_restore_at_exit $MOUNT
6897 $SETSTRIPE -d $MOUNT || error "setstripe failed"
6899 run_test 65j "set default striping on root directory (bug 6367)="
6903 wait_delete_completed
6904 do_facet $SINGLEMDS "lctl set_param -n \
6905 osp.$ost*MDT0000.max_create_count=$max_count"
6906 do_facet $SINGLEMDS "lctl set_param -n \
6907 osp.$ost*MDT0000.create_count=$count"
6908 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
6909 echo $INACTIVE_OSC "is Activate"
6911 wait_osc_import_state mds ost$ostnum FULL
6914 test_65k() { # bug11679
6915 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6916 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6917 remote_mds_nodsh && skip "remote MDS with nodsh"
6919 local disable_precreate=true
6920 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
6921 disable_precreate=false
6923 echo "Check OST status: "
6924 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
6925 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
6927 for OSC in $MDS_OSCS; do
6928 echo $OSC "is active"
6929 do_facet $SINGLEMDS lctl --device %$OSC activate
6932 for INACTIVE_OSC in $MDS_OSCS; do
6933 local ost=$(osc_to_ost $INACTIVE_OSC)
6934 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
6935 lov.*md*.target_obd |
6936 awk -F: /$ost/'{ print $1 }' | head -n 1)
6939 $SETSTRIPE -i $ostnum -c 1 $DIR/$tdir
6940 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
6942 echo "Deactivate: " $INACTIVE_OSC
6943 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
6945 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
6946 osp.$ost*MDT0000.create_count")
6947 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
6948 osp.$ost*MDT0000.max_create_count")
6949 $disable_precreate &&
6950 do_facet $SINGLEMDS "lctl set_param -n \
6951 osp.$ost*MDT0000.max_create_count=0"
6953 for idx in $(seq 0 $((OSTCOUNT - 1))); do
6954 [ -f $DIR/$tdir/$idx ] && continue
6955 echo "$SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx"
6956 $SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx ||
6958 error "setstripe $idx should succeed"; }
6959 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
6961 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
6964 do_facet $SINGLEMDS "lctl set_param -n \
6965 osp.$ost*MDT0000.max_create_count=$max_count"
6966 do_facet $SINGLEMDS "lctl set_param -n \
6967 osp.$ost*MDT0000.create_count=$count"
6968 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
6969 echo $INACTIVE_OSC "is Activate"
6971 wait_osc_import_state mds ost$ostnum FULL
6974 run_test 65k "validate manual striping works properly with deactivated OSCs"
6976 test_65l() { # bug 12836
6977 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6979 test_mkdir -p $DIR/$tdir/test_dir
6980 $SETSTRIPE -c -1 $DIR/$tdir/test_dir
6981 $LFS find -mtime -1 $DIR/$tdir >/dev/null
6983 run_test 65l "lfs find on -1 stripe dir ========================"
6986 local layout=$(save_layout $MOUNT)
6987 $RUNAS $SETSTRIPE -c 2 $MOUNT && {
6988 restore_layout $MOUNT $layout
6989 error "setstripe should fail by non-root users"
6993 run_test 65m "normal user can't set filesystem default stripe"
6996 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.0) ]] ||
6997 skip "Need MDS version at least 2.12.0"
6998 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7000 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7001 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7002 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7004 local root_layout=$(save_layout $MOUNT)
7005 stack_trap "restore_layout $MOUNT $root_layout" EXIT
7007 # new subdirectory under root directory should not inherit
7008 # the default layout from root
7009 local dir1=$MOUNT/$tdir-1
7010 mkdir $dir1 || error "mkdir $dir1 failed"
7011 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7012 error "$dir1 shouldn't have LOV EA"
7014 # delete the default layout on root directory
7015 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7017 local dir2=$MOUNT/$tdir-2
7018 mkdir $dir2 || error "mkdir $dir2 failed"
7019 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7020 error "$dir2 shouldn't have LOV EA"
7022 # set a new striping pattern on root directory
7023 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7024 local new_def_stripe_size=$((def_stripe_size * 2))
7025 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7026 error "set stripe size on $MOUNT failed"
7028 # new file created in $dir2 should inherit the new stripe size from
7029 # the filesystem default
7030 local file2=$dir2/$tfile-2
7031 touch $file2 || error "touch $file2 failed"
7033 local file2_stripe_size=$($LFS getstripe -S $file2)
7034 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7035 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7037 local dir3=$MOUNT/$tdir-3
7038 mkdir $dir3 || error "mkdir $dir3 failed"
7039 ! getfattr -n trusted.lov $dir3 &> /dev/null ||
7040 error "$dir3 shouldn't have LOV EA"
7042 # set OST pool on root directory
7043 local pool=$TESTNAME
7044 pool_add $pool || error "add $pool failed"
7045 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7046 error "add targets to $pool failed"
7048 $LFS setstripe -p $pool $MOUNT ||
7049 error "set OST pool on $MOUNT failed"
7051 # new file created in $dir3 should inherit the pool from
7052 # the filesystem default
7053 local file3=$dir3/$tfile-3
7054 touch $file3 || error "touch $file3 failed"
7056 local file3_pool=$($LFS getstripe -p $file3)
7057 [[ "$file3_pool" = "$pool" ]] ||
7058 error "$file3 didn't inherit OST pool $pool"
7060 local dir4=$MOUNT/$tdir-4
7061 mkdir $dir4 || error "mkdir $dir4 failed"
7062 ! getfattr -n trusted.lov $dir4 &> /dev/null ||
7063 error "$dir4 shouldn't have LOV EA"
7065 # new file created in $dir4 should inherit the pool from
7066 # the filesystem default
7067 local file4=$dir4/$tfile-4
7068 touch $file4 || error "touch $file4 failed"
7070 local file4_pool=$($LFS getstripe -p $file4)
7071 [[ "$file4_pool" = "$pool" ]] ||
7072 error "$file4 didn't inherit OST pool $pool"
7074 # new subdirectory under non-root directory should inherit
7075 # the default layout from its parent directory
7076 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7077 error "set directory layout on $dir4 failed"
7079 local dir5=$dir4/$tdir-5
7080 mkdir $dir5 || error "mkdir $dir5 failed"
7082 local dir4_layout=$(get_layout_param $dir4)
7083 local dir5_layout=$(get_layout_param $dir5)
7084 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7085 error "$dir5 should inherit the default layout from $dir4"
7087 # though subdir under ROOT doesn't inherit default layout, but
7088 # its sub dir/file should be created with default layout.
7089 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
7090 [[ $MDS1_VERSION -ge $(version_code 2.12.59) ]] ||
7091 [[ $MDS1_VERSION -ge $(version_code 2.12.3) &&
7092 $MDS1_VERSION -lt $(version_code 2.12.50) ]] ||
7093 skip "Need MDS version at least 2.12.3 or 2.12.59"
7095 local default_lmv_count=$($LFS getdirstripe -D -c $MOUNT)
7096 local default_lmv_index=$($LFS getdirstripe -D -i $MOUNT)
7097 local default_lmv_hash=$($LFS getdirstripe -D -H $MOUNT)
7099 if [ $default_lmv_hash == "none" ]; then
7100 stack_trap "$LFS setdirstripe -D -d $MOUNT" EXIT
7102 stack_trap "$LFS setdirstripe -D -i $default_lmv_index \
7103 -c $default_lmv_count -H $default_lmv_hash $MOUNT" EXIT
7106 $LFS setdirstripe -D -c 2 $MOUNT ||
7107 error "setdirstripe -D -c 2 failed"
7108 mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed"
7109 local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6)
7110 [ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count"
7112 run_test 65n "don't inherit default layout from root for new subdirectories"
7114 # bug 2543 - update blocks count on client
7116 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7119 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7120 sync; sync_all_data; sync; sync_all_data
7121 cancel_lru_locks osc
7122 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7123 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7125 run_test 66 "update inode blocks count on client ==============="
7128 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7132 swapon -s | awk '($1 == "'$1'") { print $4 }'
7135 # bug5265, obdfilter oa2dentry return -ENOENT
7136 # #define OBD_FAIL_SRV_ENOENT 0x217
7138 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7139 remote_ost_nodsh && skip "remote OST with nodsh"
7142 $SETSTRIPE -c 1 -i 0 $f
7144 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
7146 do_facet ost1 lctl set_param fail_loc=0x217
7147 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
7148 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
7150 do_facet ost1 lctl set_param fail_loc=0
7151 $DIRECTIO write $f 0 2 || error "write error"
7153 cancel_lru_locks osc
7154 $DIRECTIO read $f 0 1 || error "read error"
7156 do_facet ost1 lctl set_param fail_loc=0x217
7157 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
7159 do_facet ost1 lctl set_param fail_loc=0
7162 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
7165 test_mkdir $DIR/$tdir
7166 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
7167 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
7169 run_test 71 "Running dbench on lustre (don't segment fault) ===="
7171 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
7172 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7173 [ "$RUNAS_ID" = "$UID" ] &&
7174 skip_env "RUNAS_ID = UID = $UID -- skipping"
7175 # Check that testing environment is properly set up. Skip if not
7176 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
7177 skip_env "User $RUNAS_ID does not exist - skipping"
7180 chmod 777 $DIR/$tfile
7181 chmod ug+s $DIR/$tfile
7182 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
7183 error "$RUNAS dd $DIR/$tfile failed"
7184 # See if we are still setuid/sgid
7185 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7186 error "S/gid is not dropped on write"
7187 # Now test that MDS is updated too
7188 cancel_lru_locks mdc
7189 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7190 error "S/gid is not dropped on MDS"
7193 run_test 72a "Test that remove suid works properly (bug5695) ===="
7195 test_72b() { # bug 24226 -- keep mode setting when size is not changing
7198 [ "$RUNAS_ID" = "$UID" ] &&
7199 skip_env "RUNAS_ID = UID = $UID -- skipping"
7200 [ "$RUNAS_ID" -eq 0 ] &&
7201 skip_env "RUNAS_ID = 0 -- skipping"
7202 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7203 # Check that testing environment is properly set up. Skip if not
7204 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
7205 skip_env "User $RUNAS_ID does not exist - skipping"
7207 touch $DIR/${tfile}-f{g,u}
7208 test_mkdir $DIR/${tfile}-dg
7209 test_mkdir $DIR/${tfile}-du
7210 chmod 770 $DIR/${tfile}-{f,d}{g,u}
7211 chmod g+s $DIR/${tfile}-{f,d}g
7212 chmod u+s $DIR/${tfile}-{f,d}u
7213 for perm in 777 2777 4777; do
7214 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
7215 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
7216 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
7217 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
7221 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
7223 # bug 3462 - multiple simultaneous MDC requests
7225 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7227 test_mkdir $DIR/d73-1
7228 test_mkdir $DIR/d73-2
7229 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
7232 lctl set_param fail_loc=0x80000129
7233 $MULTIOP $DIR/d73-1/f73-2 Oc &
7235 lctl set_param fail_loc=0
7237 $MULTIOP $DIR/d73-2/f73-3 Oc &
7241 wait $pid1 || return 1
7245 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
7246 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
7247 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
7251 run_test 73 "multiple MDC requests (should not deadlock)"
7253 test_74a() { # bug 6149, 6184
7254 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7257 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7259 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7260 # will spin in a tight reconnection loop
7261 $LCTL set_param fail_loc=0x8000030e
7262 # get any lock that won't be difficult - lookup works.
7264 $LCTL set_param fail_loc=0
7268 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
7270 test_74b() { # bug 13310
7271 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7273 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7275 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7276 # will spin in a tight reconnection loop
7277 $LCTL set_param fail_loc=0x8000030e
7278 # get a "difficult" lock
7280 $LCTL set_param fail_loc=0
7284 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
7287 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7289 #define OBD_FAIL_LDLM_NEW_LOCK
7290 $LCTL set_param fail_loc=0x319
7291 touch $DIR/$tfile && error "touch successful"
7292 $LCTL set_param fail_loc=0
7295 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
7298 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
7301 test_76() { # Now for bug 20433, added originally in bug 1443
7302 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7304 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
7306 cancel_lru_locks osc
7307 BEFORE_INODES=$(num_inodes)
7308 echo "before inodes: $BEFORE_INODES"
7310 [ "$SLOW" = "no" ] && COUNT=100
7311 for i in $(seq $COUNT); do
7315 cancel_lru_locks osc
7316 AFTER_INODES=$(num_inodes)
7317 echo "after inodes: $AFTER_INODES"
7319 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
7321 AFTER_INODES=$(num_inodes)
7323 echo "wait $wait seconds inodes: $AFTER_INODES"
7324 if [ $wait -gt 30 ]; then
7325 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
7329 run_test 76 "confirm clients recycle inodes properly ===="
7335 # Note: in sptlrpc modes which enable its own bulk checksum, the
7336 # original crc32_le bulk checksum will be automatically disabled,
7337 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
7338 # will be checked by sptlrpc code against sptlrpc bulk checksum.
7339 # In this case set_checksums() will not be no-op, because sptlrpc
7340 # bulk checksum will be enabled all through the test.
7342 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
7343 lctl set_param -n osc.*.checksums $1
7347 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7348 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
7349 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7350 tr -d [] | head -n1)}
7353 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
7354 log "set checksum type to $1"
7357 F77_TMP=$TMP/f77-temp
7360 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
7361 error "error writing to $F77_TMP"
7364 test_77a() { # bug 10889
7365 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7366 $GSS && skip_env "could not run with gss"
7368 [ ! -f $F77_TMP ] && setup_f77
7370 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
7374 run_test 77a "normal checksum read/write operation"
7376 test_77b() { # bug 10889
7377 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7378 $GSS && skip_env "could not run with gss"
7380 [ ! -f $F77_TMP ] && setup_f77
7381 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7382 $LCTL set_param fail_loc=0x80000409
7385 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7386 error "dd error: $?"
7387 $LCTL set_param fail_loc=0
7389 for algo in $CKSUM_TYPES; do
7390 cancel_lru_locks osc
7391 set_checksum_type $algo
7392 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7393 $LCTL set_param fail_loc=0x80000408
7394 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
7395 $LCTL set_param fail_loc=0
7398 set_checksum_type $ORIG_CSUM_TYPE
7401 run_test 77b "checksum error on client write, read"
7406 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
7408 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
7409 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
7410 $check_ost && [ -n "$ost_file_prefix" ] &&
7411 do_facet ost1 rm -f ${ost_file_prefix}\*
7415 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7416 $GSS && skip_env "could not run with gss"
7417 remote_ost_nodsh && skip "remote OST with nodsh"
7420 local osc_file_prefix
7422 local check_ost=false
7423 local ost_file_prefix
7429 # ensure corruption will occur on first OSS/OST
7430 $LFS setstripe -i 0 $DIR/$tfile
7432 [ ! -f $F77_TMP ] && setup_f77
7433 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7434 error "dd write error: $?"
7435 fid=$($LFS path2fid $DIR/$tfile)
7437 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
7440 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
7441 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
7443 echo "OSS do not support bulk pages dump upon error"
7446 osc_file_prefix=$($LCTL get_param -n debug_path)
7447 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
7449 trap cleanup_77c EXIT
7452 # enable bulk pages dump upon error on Client
7453 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
7454 # enable bulk pages dump upon error on OSS
7456 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
7458 # flush Client cache to allow next read to reach OSS
7459 cancel_lru_locks osc
7461 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7462 $LCTL set_param fail_loc=0x80000408
7463 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
7464 $LCTL set_param fail_loc=0
7468 # check cksum dump on Client
7469 osc_file=$(ls ${osc_file_prefix}*)
7470 [ -n "$osc_file" ] || error "no checksum dump file on Client"
7471 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
7472 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
7473 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
7474 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
7476 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
7477 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7478 error "dump content does not match on Client"
7480 $check_ost || skip "No need to check cksum dump on OSS"
7482 # check cksum dump on OSS
7483 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
7484 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
7485 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
7486 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
7487 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7488 error "dump content does not match on OSS"
7492 run_test 77c "checksum error on client read with debug"
7494 test_77d() { # bug 10889
7495 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7496 $GSS && skip_env "could not run with gss"
7498 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7499 $LCTL set_param fail_loc=0x80000409
7501 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7502 error "direct write: rc=$?"
7503 $LCTL set_param fail_loc=0
7506 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7507 $LCTL set_param fail_loc=0x80000408
7509 cancel_lru_locks osc
7510 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7511 error "direct read: rc=$?"
7512 $LCTL set_param fail_loc=0
7515 run_test 77d "checksum error on OST direct write, read"
7517 test_77f() { # bug 10889
7518 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7519 $GSS && skip_env "could not run with gss"
7522 for algo in $CKSUM_TYPES; do
7523 cancel_lru_locks osc
7524 set_checksum_type $algo
7525 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7526 $LCTL set_param fail_loc=0x409
7527 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
7528 error "direct write succeeded"
7529 $LCTL set_param fail_loc=0
7531 set_checksum_type $ORIG_CSUM_TYPE
7534 run_test 77f "repeat checksum error on write (expect error)"
7536 test_77g() { # bug 10889
7537 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7538 $GSS && skip_env "could not run with gss"
7539 remote_ost_nodsh && skip "remote OST with nodsh"
7541 [ ! -f $F77_TMP ] && setup_f77
7543 local file=$DIR/$tfile
7544 stack_trap "rm -f $file" EXIT
7546 $SETSTRIPE -c 1 -i 0 $file
7547 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
7548 do_facet ost1 lctl set_param fail_loc=0x8000021a
7550 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
7551 error "write error: rc=$?"
7552 do_facet ost1 lctl set_param fail_loc=0
7555 cancel_lru_locks osc
7556 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
7557 do_facet ost1 lctl set_param fail_loc=0x8000021b
7559 cmp $F77_TMP $file || error "file compare failed"
7560 do_facet ost1 lctl set_param fail_loc=0
7563 run_test 77g "checksum error on OST write, read"
7565 test_77k() { # LU-10906
7566 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7567 $GSS && skip_env "could not run with gss"
7569 local cksum_param="osc.$FSNAME*.checksums"
7570 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
7574 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
7575 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
7576 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
7580 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
7581 error "failed to set checksum=$i on MGS"
7582 wait_update $HOSTNAME "$get_checksum" $i
7584 echo "remount client, checksum should be $i"
7585 remount_client $MOUNT || "failed to remount client"
7586 checksum=$(eval $get_checksum)
7587 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7590 for opt in "checksum" "nochecksum"; do
7591 #remount with mount option
7592 echo "remount client with option $opt, checksum should be $i"
7593 umount_client $MOUNT || "failed to umount client"
7594 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
7595 "failed to mount client with option '$opt'"
7596 checksum=$(eval $get_checksum)
7597 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7601 remount_client $MOUNT || "failed to remount client"
7603 run_test 77k "enable/disable checksum correctly"
7605 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
7614 test_78() { # bug 10901
7615 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7616 remote_ost || skip_env "local OST"
7619 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
7620 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
7621 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
7622 echo "MemTotal: $MEMTOTAL"
7624 # reserve 256MB of memory for the kernel and other running processes,
7625 # and then take 1/2 of the remaining memory for the read/write buffers.
7626 if [ $MEMTOTAL -gt 512 ] ;then
7627 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
7629 # for those poor memory-starved high-end clusters...
7630 MEMTOTAL=$((MEMTOTAL / 2))
7632 echo "Mem to use for directio: $MEMTOTAL"
7634 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
7635 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
7636 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
7637 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
7639 echo "Smallest OST: $SMALLESTOST"
7640 [[ $SMALLESTOST -lt 10240 ]] &&
7641 skip "too small OSTSIZE, useless to run large O_DIRECT test"
7643 trap cleanup_test_78 EXIT
7645 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
7646 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
7648 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
7649 echo "File size: $F78SIZE"
7650 $SETSTRIPE -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
7651 for i in $(seq 1 $NSEQ); do
7652 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
7653 echo directIO rdwr round $i of $NSEQ
7654 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
7659 run_test 78 "handle large O_DIRECT writes correctly ============"
7661 test_79() { # bug 12743
7662 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7664 wait_delete_completed
7666 BKTOTAL=$(calc_osc_kbytes kbytestotal)
7667 BKFREE=$(calc_osc_kbytes kbytesfree)
7668 BKAVAIL=$(calc_osc_kbytes kbytesavail)
7670 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
7671 DFTOTAL=`echo $STRING | cut -d, -f1`
7672 DFUSED=`echo $STRING | cut -d, -f2`
7673 DFAVAIL=`echo $STRING | cut -d, -f3`
7674 DFFREE=$(($DFTOTAL - $DFUSED))
7676 ALLOWANCE=$((64 * $OSTCOUNT))
7678 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
7679 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
7680 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
7682 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
7683 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
7684 error "df free($DFFREE) mismatch OST free($BKFREE)"
7686 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
7687 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
7688 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
7691 run_test 79 "df report consistency check ======================="
7693 test_80() { # bug 10718
7694 remote_ost_nodsh && skip "remote OST with nodsh"
7695 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7697 # relax strong synchronous semantics for slow backends like ZFS
7698 local soc="obdfilter.*.sync_on_lock_cancel"
7699 local soc_old=$(do_facet ost1 lctl get_param -n $soc | head -n1)
7701 if [ "$soc_old" != "never" ] &&
7702 [ "$ost1_FSTYPE" != "ldiskfs" ]; then
7703 hosts=$(for host in $(seq -f "ost%g" 1 $OSTCOUNT); do
7704 facet_active_host $host; done | sort -u)
7705 do_nodes $hosts lctl set_param $soc=never
7708 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
7710 local BEFORE=`date +%s`
7711 cancel_lru_locks osc
7712 local AFTER=`date +%s`
7713 local DIFF=$((AFTER-BEFORE))
7714 if [ $DIFF -gt 1 ] ; then
7715 error "elapsed for 1M@1T = $DIFF"
7718 [ -n "$hosts" ] && do_nodes $hosts lctl set_param $soc=$soc_old
7722 run_test 80 "Page eviction is equally fast at high offsets too ===="
7724 test_81a() { # LU-456
7725 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7726 remote_ost_nodsh && skip "remote OST with nodsh"
7728 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
7729 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
7730 do_facet ost1 lctl set_param fail_loc=0x80000228
7732 # write should trigger a retry and success
7733 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
7734 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
7736 if [ $RC -ne 0 ] ; then
7737 error "write should success, but failed for $RC"
7740 run_test 81a "OST should retry write when get -ENOSPC ==============="
7742 test_81b() { # LU-456
7743 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7744 remote_ost_nodsh && skip "remote OST with nodsh"
7746 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
7747 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
7748 do_facet ost1 lctl set_param fail_loc=0x228
7750 # write should retry several times and return -ENOSPC finally
7751 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
7752 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
7755 if [ $RC -ne $ENOSPC ] ; then
7756 error "dd should fail for -ENOSPC, but succeed."
7759 run_test 81b "OST should return -ENOSPC when retry still fails ======="
7761 test_82() { # LU-1031
7762 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
7766 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
7768 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
7770 kill -USR1 $MULTIPID2
7772 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
7773 error "First grouplock does not block second one"
7775 echo "Second grouplock blocks first one"
7777 kill -USR1 $MULTIPID1
7781 run_test 82 "Basic grouplock test"
7784 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
7786 test_mkdir $DIR/$tdir.cvsroot
7787 chown $RUNAS_ID $DIR/$tdir.cvsroot
7790 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
7793 # some versions of cvs import exit(1) when asked to import links or
7794 # files they can't read. ignore those files.
7795 local toignore=$(find . -type l -printf '-I %f\n' -o \
7796 ! -perm /4 -printf '-I %f\n')
7797 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
7798 $tdir.reposname vtag rtag
7801 test_mkdir $DIR/$tdir.reposname
7802 chown $RUNAS_ID $DIR/$tdir.reposname
7803 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
7805 cd $DIR/$tdir.reposname
7807 $RUNAS cvs add -m 'addmsg' foo99
7809 $RUNAS cvs commit -m 'nomsg' foo99
7810 rm -fr $DIR/$tdir.cvsroot
7812 run_test 99 "cvs strange file/directory operations"
7815 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7816 [[ "$NETTYPE" =~ tcp ]] ||
7817 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
7818 remote_ost_nodsh && skip "remote OST with nodsh"
7819 remote_mds_nodsh && skip "remote MDS with nodsh"
7821 skip "useless for local single node setup"
7823 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
7824 [ "$PROT" != "tcp" ] && continue
7825 RPORT=$(echo $REMOTE | cut -d: -f2)
7826 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
7829 LPORT=`echo $LOCAL | cut -d: -f2`
7830 if [ $LPORT -ge 1024 ]; then
7831 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
7833 error_exit "local: $LPORT > 1024, remote: $RPORT"
7836 [ "$rc" = 0 ] || error_exit "privileged port not found" )
7838 run_test 100 "check local port using privileged port ==========="
7840 function get_named_value()
7849 echo $line | sed "s/^$tag[ ]*//"
7856 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
7857 awk '/^max_cached_mb/ { print $2 }')
7860 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
7865 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7866 [ $MDSCOUNT -ge 2 ] && skip_env "needs < 2 MDTs" #LU-4322
7871 local cache_limit=32
7873 $LCTL set_param -n osc.*-osc*.rpc_stats 0
7874 trap cleanup_101a EXIT
7875 $LCTL set_param -n llite.*.read_ahead_stats 0
7876 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
7879 # randomly read 10000 of 64K chunks from file 3x 32MB in size
7881 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
7882 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
7885 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
7886 get_named_value 'read but discarded' | cut -d" " -f1); do
7887 discard=$(($discard + $s))
7891 if [[ $(($discard * 10)) -gt $nreads ]]; then
7892 $LCTL get_param osc.*-osc*.rpc_stats
7893 $LCTL get_param llite.*.read_ahead_stats
7894 error "too many ($discard) discarded pages"
7896 rm -f $DIR/$tfile || true
7898 run_test 101a "check read-ahead for random reads"
7901 test_mkdir $DIR/$tdir
7902 local STRIPE_SIZE=$1
7903 local FILE_LENGTH=$2
7906 local FILE_SIZE_MB=$((FILE_LENGTH / STRIPE_SIZE))
7908 local list=$(comma_list $(osts_nodes))
7909 set_osd_param $list '' read_cache_enable 0
7910 set_osd_param $list '' writethrough_cache_enable 0
7912 trap cleanup_test101bc EXIT
7913 # prepare the read-ahead file
7914 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
7916 dd if=/dev/zero of=$DIR/$tfile bs=$STRIPE_SIZE \
7917 count=$FILE_SIZE_MB 2> /dev/null
7921 cleanup_test101bc() {
7926 local list=$(comma_list $(osts_nodes))
7927 set_osd_param $list '' read_cache_enable 1
7928 set_osd_param $list '' writethrough_cache_enable 1
7932 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
7937 local STRIPE_SIZE=$2
7938 local FILE_LENGTH=$3
7939 local RA_INC=1048576
7940 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
7941 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
7942 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
7943 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
7944 get_named_value 'read but discarded' |
7945 cut -d" " -f1 | calc_total)
7946 if [[ $DISCARD -gt $discard_limit ]]; then
7947 $LCTL get_param llite.*.read_ahead_stats
7948 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
7950 echo "Read-ahead success for size ${READ_SIZE}"
7955 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7956 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7958 local STRIPE_SIZE=1048576
7959 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
7961 if [ $SLOW == "yes" ]; then
7962 local FILE_LENGTH=$((STRIDE_SIZE * 64))
7964 local FILE_LENGTH=$((STRIDE_SIZE * 8))
7967 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
7969 # prepare the read-ahead file
7970 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
7971 cancel_lru_locks osc
7972 for BIDX in 2 4 8 16 32 64 128 256
7974 local BSIZE=$((BIDX*4096))
7975 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
7976 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
7977 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
7978 $LCTL set_param -n llite.*.read_ahead_stats 0
7979 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
7980 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
7981 cancel_lru_locks osc
7982 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
7987 run_test 101b "check stride-io mode read-ahead ================="
7990 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7992 local STRIPE_SIZE=1048576
7993 local FILE_LENGTH=$((STRIPE_SIZE*100))
7997 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
7999 cancel_lru_locks osc
8000 $LCTL set_param osc.*.rpc_stats 0
8001 $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
8002 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8003 local stats=$($LCTL get_param -n $osc_rpc_stats)
8004 local lines=$(echo "$stats" | awk 'END {print NR;}')
8007 if [ $lines -le 20 ]; then
8010 for size in 1 2 4 8; do
8011 local rpc=$(echo "$stats" |
8012 awk '($1 == "'$size':") {print $2; exit; }')
8014 error "Small $((size*4))k read IO $rpc !"
8016 echo "$osc_rpc_stats check passed!"
8021 run_test 101c "check stripe_size aligned read-ahead ================="
8024 $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
8025 $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
8029 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8031 local file=$DIR/$tfile
8032 local sz_MB=${FILESIZE_101d:-500}
8033 local ra_MB=${READAHEAD_MB:-40}
8035 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8036 [ $free_MB -lt $sz_MB ] &&
8037 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8039 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8040 $SETSTRIPE -c -1 $file || error "setstripe failed"
8042 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8043 echo Cancel LRU locks on lustre client to flush the client cache
8044 cancel_lru_locks osc
8046 echo Disable read-ahead
8047 local old_READAHEAD=$(set_read_ahead 0)
8049 echo Reading the test file $file with read-ahead disabled
8050 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8052 echo Cancel LRU locks on lustre client to flush the client cache
8053 cancel_lru_locks osc
8054 echo Enable read-ahead with ${ra_MB}MB
8055 set_read_ahead $ra_MB
8057 echo Reading the test file $file with read-ahead enabled
8058 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8060 echo "read-ahead disabled time read $raOFF"
8061 echo "read-ahead enabled time read $raON"
8063 set_read_ahead $old_READAHEAD
8065 wait_delete_completed
8067 [ $raOFF -le 1 -o $raON -lt $raOFF ] ||
8068 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8070 run_test 101d "file read with and without read-ahead enabled"
8073 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8075 local file=$DIR/$tfile
8076 local size_KB=500 #KB
8080 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8081 local need_KB=$((count * size_KB))
8082 [[ $free_KB -le $need_KB ]] &&
8083 skip_env "Need free space $need_KB, have $free_KB"
8085 echo "Creating $count ${size_KB}K test files"
8086 for ((i = 0; i < $count; i++)); do
8087 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8090 echo "Cancel LRU locks on lustre client to flush the client cache"
8091 cancel_lru_locks $OSC
8093 echo "Reset readahead stats"
8094 $LCTL set_param -n llite.*.read_ahead_stats 0
8096 for ((i = 0; i < $count; i++)); do
8097 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
8100 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8101 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8103 for ((i = 0; i < $count; i++)); do
8104 rm -rf $file.$i 2>/dev/null
8107 #10000 means 20% reads are missing in readahead
8108 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
8110 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
8113 which iozone || skip_env "no iozone installed"
8115 local old_debug=$($LCTL get_param debug)
8116 old_debug=${old_debug#*=}
8117 $LCTL set_param debug="reada mmap"
8119 # create a test file
8120 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
8122 echo Cancel LRU locks on lustre client to flush the client cache
8123 cancel_lru_locks osc
8125 echo Reset readahead stats
8126 $LCTL set_param -n llite.*.read_ahead_stats 0
8128 echo mmap read the file with small block size
8129 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
8132 echo checking missing pages
8133 $LCTL get_param llite.*.read_ahead_stats
8134 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8135 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8137 $LCTL set_param debug="$old_debug"
8138 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
8141 run_test 101f "check mmap read performance"
8143 test_101g_brw_size_test() {
8145 local pages=$((mb * 1048576 / PAGE_SIZE))
8146 local file=$DIR/$tfile
8148 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
8149 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
8150 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
8151 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
8155 stack_trap "rm -f $file" EXIT
8156 $LCTL set_param -n osc.*.rpc_stats=0
8158 # 10 RPCs should be enough for the test
8160 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
8161 { error "dd write ${mb} MB blocks failed"; return 3; }
8162 cancel_lru_locks osc
8163 dd of=/dev/null if=$file bs=${mb}M count=$count ||
8164 { error "dd write ${mb} MB blocks failed"; return 4; }
8166 # calculate number of full-sized read and write RPCs
8167 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
8168 sed -n '/pages per rpc/,/^$/p' |
8169 awk '/'$pages':/ { reads += $2; writes += $6 }; \
8170 END { print reads,writes }'))
8171 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
8173 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
8180 remote_ost_nodsh && skip "remote OST with nodsh"
8183 local osts=$(get_facets OST)
8184 local list=$(comma_list $(osts_nodes))
8185 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
8186 local brw_size="obdfilter.*.brw_size"
8188 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8190 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
8191 if [ $OST1_VERSION -ge $(version_code 2.8.52) -o \
8192 \( $OST1_VERSION -ge $(version_code 2.7.17) -a \
8193 $OST1_VERSION -lt $(version_code 2.7.50) \) ] &&
8194 [ $CLIENT_VERSION -ge $(version_code 2.8.52) -o \
8195 \( $CLIENT_VERSION -ge $(version_code 2.7.17) -a \
8196 $CLIENT_VERSION -lt $(version_code 2.7.50) \) ]; then
8197 [ $OST1_VERSION -ge $(version_code 2.9.52) ] && suffix="M"
8198 if [[ $orig_mb -lt 16 ]]; then
8199 save_lustre_params $osts "$brw_size" > $p
8200 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
8201 error "set 16MB RPC size failed"
8203 echo "remount client to enable new RPC size"
8204 remount_client $MOUNT || error "remount_client failed"
8207 test_101g_brw_size_test 16 || error "16MB RPC test failed"
8208 # should be able to set brw_size=12, but no rpc_stats for that
8209 test_101g_brw_size_test 8 || error "8MB RPC test failed"
8212 test_101g_brw_size_test 4 || error "4MB RPC test failed"
8214 if [[ $orig_mb -lt 16 ]]; then
8215 restore_lustre_params < $p
8216 remount_client $MOUNT || error "remount_client restore failed"
8219 rm -f $p $DIR/$tfile
8221 run_test 101g "Big bulk(4/16 MiB) readahead"
8224 test_mkdir $DIR/$tdir
8225 chown $RUNAS_ID $DIR/$tdir
8228 STRIPE_COUNT=$OSTCOUNT
8229 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
8231 trap cleanup_test102 EXIT
8233 $1 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
8235 for num in 1 2 3 4; do
8236 for count in $(seq 1 $STRIPE_COUNT); do
8237 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
8238 local size=`expr $STRIPE_SIZE \* $num`
8239 local file=file"$num-$idx-$count"
8240 $1 $SETSTRIPE -S $size -i $idx -c $count $file
8246 $1 tar cf $TMP/f102.tar $tdir --xattrs
8252 rm -rf $DIR/d0.sanity/d102
8256 [ "$UID" != 0 ] && skip "must run as root"
8257 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
8258 skip_env "must have user_xattr"
8260 [ -z "$(which setfattr 2>/dev/null)" ] &&
8261 skip_env "could not find setfattr"
8263 local testfile=$DIR/$tfile
8266 echo "set/get xattr..."
8267 setfattr -n trusted.name1 -v value1 $testfile ||
8268 error "setfattr -n trusted.name1=value1 $testfile failed"
8269 getfattr -n trusted.name1 $testfile 2> /dev/null |
8270 grep "trusted.name1=.value1" ||
8271 error "$testfile missing trusted.name1=value1"
8273 setfattr -n user.author1 -v author1 $testfile ||
8274 error "setfattr -n user.author1=author1 $testfile failed"
8275 getfattr -n user.author1 $testfile 2> /dev/null |
8276 grep "user.author1=.author1" ||
8277 error "$testfile missing trusted.author1=author1"
8280 setfattr -n trusted.name2 -v value2 $testfile ||
8281 error "$testfile unable to set trusted.name2"
8282 setfattr -n trusted.name3 -v value3 $testfile ||
8283 error "$testfile unable to set trusted.name3"
8284 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
8285 grep "trusted.name" | wc -l) -eq 3 ] ||
8286 error "$testfile missing 3 trusted.name xattrs"
8288 setfattr -n user.author2 -v author2 $testfile ||
8289 error "$testfile unable to set user.author2"
8290 setfattr -n user.author3 -v author3 $testfile ||
8291 error "$testfile unable to set user.author3"
8292 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
8293 grep "user.author" | wc -l) -eq 3 ] ||
8294 error "$testfile missing 3 user.author xattrs"
8296 echo "remove xattr..."
8297 setfattr -x trusted.name1 $testfile ||
8298 error "$testfile error deleting trusted.name1"
8299 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
8300 error "$testfile did not delete trusted.name1 xattr"
8302 setfattr -x user.author1 $testfile ||
8303 error "$testfile error deleting user.author1"
8304 echo "set lustre special xattr ..."
8305 $LFS setstripe -c1 $testfile
8306 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
8307 awk -F "=" '/trusted.lov/ { print $2 }' )
8308 setfattr -n "trusted.lov" -v $lovea $testfile ||
8309 error "$testfile doesn't ignore setting trusted.lov again"
8310 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
8311 error "$testfile allow setting invalid trusted.lov"
8314 run_test 102a "user xattr test =================================="
8317 [ -z "$(which setfattr 2>/dev/null)" ] &&
8318 skip_env "could not find setfattr"
8319 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8321 # b10930: get/set/list trusted.lov xattr
8322 echo "get/set/list trusted.lov xattr ..."
8323 local testfile=$DIR/$tfile
8324 $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8325 error "setstripe failed"
8326 local STRIPECOUNT=$($GETSTRIPE -c $testfile) ||
8327 error "getstripe failed"
8328 getfattr -d -m "^trusted" $testfile 2>/dev/null | grep "trusted.lov" ||
8329 error "can't get trusted.lov from $testfile"
8331 local testfile2=${testfile}2
8332 local value=$(getfattr -n trusted.lov $testfile 2>/dev/null |
8333 grep "trusted.lov" | sed -e 's/[^=]\+=//')
8336 setfattr -n trusted.lov -v $value $testfile2
8337 local stripe_size=$($GETSTRIPE -S $testfile2)
8338 local stripe_count=$($GETSTRIPE -c $testfile2)
8339 [[ $stripe_size -eq 65536 ]] ||
8340 error "stripe size $stripe_size != 65536"
8341 [[ $stripe_count -eq $STRIPECOUNT ]] ||
8342 error "stripe count $stripe_count != $STRIPECOUNT"
8345 run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
8348 [ -z "$(which setfattr 2>/dev/null)" ] &&
8349 skip_env "could not find setfattr"
8350 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8352 # b10930: get/set/list lustre.lov xattr
8353 echo "get/set/list lustre.lov xattr ..."
8354 test_mkdir $DIR/$tdir
8355 chown $RUNAS_ID $DIR/$tdir
8356 local testfile=$DIR/$tdir/$tfile
8357 $RUNAS $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8358 error "setstripe failed"
8359 local STRIPECOUNT=$($RUNAS $GETSTRIPE -c $testfile) ||
8360 error "getstripe failed"
8361 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
8362 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
8364 local testfile2=${testfile}2
8365 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
8366 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
8368 $RUNAS $MCREATE $testfile2
8369 $RUNAS setfattr -n lustre.lov -v $value $testfile2
8370 local stripe_size=$($RUNAS $GETSTRIPE -S $testfile2)
8371 local stripe_count=$($RUNAS $GETSTRIPE -c $testfile2)
8372 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
8373 [ $stripe_count -eq $STRIPECOUNT ] ||
8374 error "stripe count $stripe_count != $STRIPECOUNT"
8376 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
8378 compare_stripe_info1() {
8379 local stripe_index_all_zero=true
8381 for num in 1 2 3 4; do
8382 for count in $(seq 1 $STRIPE_COUNT); do
8383 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
8384 local size=$((STRIPE_SIZE * num))
8385 local file=file"$num-$offset-$count"
8386 stripe_size=$($LFS getstripe -S $PWD/$file)
8387 [[ $stripe_size -ne $size ]] &&
8388 error "$file: size $stripe_size != $size"
8389 stripe_count=$($LFS getstripe -c $PWD/$file)
8390 # allow fewer stripes to be created, ORI-601
8391 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
8392 error "$file: count $stripe_count != $count"
8393 stripe_index=$($LFS getstripe -i $PWD/$file)
8394 [[ $stripe_index -ne 0 ]] &&
8395 stripe_index_all_zero=false
8399 $stripe_index_all_zero &&
8400 error "all files are being extracted starting from OST index 0"
8404 have_xattrs_include() {
8405 tar --help | grep -q xattrs-include &&
8406 echo --xattrs-include="lustre.*"
8410 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8411 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8413 XINC=$(have_xattrs_include)
8415 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8417 compare_stripe_info1
8419 run_test 102d "tar restore stripe info from tarfile,not keep osts"
8422 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8423 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8425 XINC=$(have_xattrs_include)
8427 test_mkdir $DIR/$tdir.restore
8429 tar cf - --xattrs $tdir | tar xf - \
8430 -C $DIR/$tdir.restore --xattrs $XINC
8431 cd $DIR/$tdir.restore/$tdir
8432 compare_stripe_info1
8434 run_test 102f "tar copy files, not keep osts"
8437 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
8438 skip "must have user_xattr"
8439 [ -z "$(which setfattr 2>/dev/null)" ] &&
8440 skip_env "could not find setfattr"
8441 [ -z "$(which getfattr 2>/dev/null)" ] &&
8442 skip_env "could not find getfattr"
8444 local xsize=${1:-1024} # in bytes
8445 local file=$DIR/$tfile
8446 local value="$(generate_string $xsize)"
8447 local xbig=trusted.big
8450 log "save $xbig on $file"
8451 setfattr -n $xbig -v $value $file ||
8452 error "saving $xbig on $file failed"
8454 local orig=$(get_xattr_value $xbig $file)
8455 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
8457 local xsml=trusted.sml
8458 log "save $xsml on $file"
8459 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
8461 local new=$(get_xattr_value $xbig $file)
8462 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
8464 log "grow $xsml on $file"
8465 setfattr -n $xsml -v "$value" $file ||
8466 error "growing $xsml on $file failed"
8468 new=$(get_xattr_value $xbig $file)
8469 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
8470 log "$xbig still valid after growing $xsml"
8475 test_102h() { # bug 15777
8478 run_test 102h "grow xattr from inside inode to external block"
8481 large_xattr_enabled || skip_env "ea_inode feature disabled"
8483 grow_xattr $(max_xattr_size)
8485 run_test 102ha "grow xattr from inside inode to external inode"
8487 test_102i() { # bug 17038
8488 [ -z "$(which getfattr 2>/dev/null)" ] &&
8489 skip "could not find getfattr"
8492 ln -s $DIR/$tfile $DIR/${tfile}link
8493 getfattr -n trusted.lov $DIR/$tfile ||
8494 error "lgetxattr on $DIR/$tfile failed"
8495 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
8496 grep -i "no such attr" ||
8497 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
8498 rm -f $DIR/$tfile $DIR/${tfile}link
8500 run_test 102i "lgetxattr test on symbolic link ============"
8503 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8504 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8506 XINC=$(have_xattrs_include)
8507 setup_test102 "$RUNAS"
8508 chown $RUNAS_ID $DIR/$tdir
8509 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8511 compare_stripe_info1 "$RUNAS"
8513 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
8516 [ -z "$(which setfattr 2>/dev/null)" ] &&
8517 skip "could not find setfattr"
8520 # b22187 just check that does not crash for regular file.
8521 setfattr -n trusted.lov $DIR/$tfile
8522 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
8523 local test_kdir=$DIR/$tdir
8524 test_mkdir $test_kdir
8525 local default_size=$($LFS getstripe -S $test_kdir)
8526 local default_count=$($LFS getstripe -c $test_kdir)
8527 local default_offset=$($LFS getstripe -i $test_kdir)
8528 $SETSTRIPE -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
8529 error 'dir setstripe failed'
8530 setfattr -n trusted.lov $test_kdir
8531 local stripe_size=$($LFS getstripe -S $test_kdir)
8532 local stripe_count=$($LFS getstripe -c $test_kdir)
8533 local stripe_offset=$($LFS getstripe -i $test_kdir)
8534 [ $stripe_size -eq $default_size ] ||
8535 error "stripe size $stripe_size != $default_size"
8536 [ $stripe_count -eq $default_count ] ||
8537 error "stripe count $stripe_count != $default_count"
8538 [ $stripe_offset -eq $default_offset ] ||
8539 error "stripe offset $stripe_offset != $default_offset"
8540 rm -rf $DIR/$tfile $test_kdir
8542 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
8545 [ -z "$(which getfattr 2>/dev/null)" ] &&
8546 skip "could not find getfattr"
8548 # LU-532 trusted. xattr is invisible to non-root
8549 local testfile=$DIR/$tfile
8553 echo "listxattr as user..."
8554 chown $RUNAS_ID $testfile
8555 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
8556 grep -q "trusted" &&
8557 error "$testfile trusted xattrs are user visible"
8561 run_test 102l "listxattr size test =================================="
8563 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
8564 local path=$DIR/$tfile
8567 listxattr_size_check $path || error "listattr_size_check $path failed"
8569 run_test 102m "Ensure listxattr fails on small bufffer ========"
8573 getxattr() { # getxattr path name
8574 # Return the base64 encoding of the value of xattr name on path.
8578 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
8580 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8582 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8584 getfattr --absolute-names --encoding=base64 --name=$name $path |
8585 awk -F= -v name=$name '$1 == name {
8586 print substr($0, index($0, "=") + 1);
8590 test_102n() { # LU-4101 mdt: protect internal xattrs
8591 [ -z "$(which setfattr 2>/dev/null)" ] &&
8592 skip "could not find setfattr"
8593 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
8595 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
8598 local file0=$DIR/$tfile.0
8599 local file1=$DIR/$tfile.1
8600 local xattr0=$TMP/$tfile.0
8601 local xattr1=$TMP/$tfile.1
8602 local namelist="lov lma lmv link fid version som hsm"
8606 rm -rf $file0 $file1 $xattr0 $xattr1
8609 # Get 'before' xattrs of $file1.
8610 getfattr --absolute-names --dump --match=- $file1 > $xattr0
8612 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
8613 namelist+=" lfsck_namespace"
8614 for name in $namelist; do
8615 # Try to copy xattr from $file0 to $file1.
8616 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8618 setfattr --name=trusted.$name --value="$value" $file1 ||
8619 error "setxattr 'trusted.$name' failed"
8621 # Try to set a garbage xattr.
8622 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8624 if [[ x$name == "xlov" ]]; then
8625 setfattr --name=trusted.lov --value="$value" $file1 &&
8626 error "setxattr invalid 'trusted.lov' success"
8628 setfattr --name=trusted.$name --value="$value" $file1 ||
8629 error "setxattr invalid 'trusted.$name' failed"
8632 # Try to remove the xattr from $file1. We don't care if this
8633 # appears to succeed or fail, we just don't want there to be
8634 # any changes or crashes.
8635 setfattr --remove=$trusted.$name $file1 2> /dev/null
8638 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
8641 # Try to copy xattr from $file0 to $file1.
8642 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8644 setfattr --name=trusted.$name --value="$value" $file1 ||
8645 error "setxattr 'trusted.$name' failed"
8647 # Try to set a garbage xattr.
8648 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8650 setfattr --name=trusted.$name --value="$value" $file1 ||
8651 error "setxattr 'trusted.$name' failed"
8653 # Try to remove the xattr from $file1. We don't care if this
8654 # appears to succeed or fail, we just don't want there to be
8655 # any changes or crashes.
8656 setfattr --remove=$trusted.$name $file1 2> /dev/null
8659 # Get 'after' xattrs of file1.
8660 getfattr --absolute-names --dump --match=- $file1 > $xattr1
8662 if ! diff $xattr0 $xattr1; then
8663 error "before and after xattrs of '$file1' differ"
8666 rm -rf $file0 $file1 $xattr0 $xattr1
8670 run_test 102n "silently ignore setxattr on internal trusted xattrs"
8672 test_102p() { # LU-4703 setxattr did not check ownership
8673 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
8674 skip "MDS needs to be at least 2.5.56"
8676 local testfile=$DIR/$tfile
8680 echo "setfacl as user..."
8681 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
8682 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
8684 echo "setfattr as user..."
8685 setfacl -m "u:$RUNAS_ID:---" $testfile
8686 $RUNAS setfattr -x system.posix_acl_access $testfile
8687 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
8689 run_test 102p "check setxattr(2) correctly fails without permission"
8692 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
8693 skip "MDS needs to be at least 2.6.92"
8695 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
8697 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
8700 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
8701 skip "MDS needs to be at least 2.6.93"
8703 touch $DIR/$tfile || error "touch"
8704 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
8705 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
8706 rm $DIR/$tfile || error "rm"
8709 mkdir -p $DIR/$tdir || error "mkdir"
8710 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
8711 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
8712 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
8713 error "$testfile error deleting user.author1"
8714 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
8715 grep "user.$(basename $tdir)" &&
8716 error "$tdir did not delete user.$(basename $tdir)"
8717 rmdir $DIR/$tdir || error "rmdir"
8720 test_mkdir $DIR/$tdir
8721 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
8722 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
8723 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
8724 error "$testfile error deleting user.author1"
8725 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
8726 grep "user.$(basename $tdir)" &&
8727 error "$tdir did not delete user.$(basename $tdir)"
8728 rmdir $DIR/$tdir || error "rm striped dir"
8730 run_test 102r "set EAs with empty values"
8733 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
8734 skip "MDS needs to be at least 2.11.52"
8736 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
8738 save_lustre_params client "llite.*.xattr_cache" > $save
8740 for cache in 0 1; do
8741 lctl set_param llite.*.xattr_cache=$cache
8744 touch $DIR/$tfile || error "touch"
8745 for prefix in lustre security system trusted user; do
8746 # Note getxattr() may fail with 'Operation not
8747 # supported' or 'No such attribute' depending
8748 # on prefix and cache.
8749 getfattr -n $prefix.n102s $DIR/$tfile &&
8750 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
8754 restore_lustre_params < $save
8756 run_test 102s "getting nonexistent xattrs should fail"
8759 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
8760 skip "MDS needs to be at least 2.11.52"
8762 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
8764 save_lustre_params client "llite.*.xattr_cache" > $save
8766 for cache in 0 1; do
8767 lctl set_param llite.*.xattr_cache=$cache
8769 for buf_size in 0 256; do
8771 touch $DIR/$tfile || error "touch"
8772 setfattr -n user.multiop $DIR/$tfile
8773 $MULTIOP $DIR/$tfile oa$buf_size ||
8774 error "cannot get zero length xattr value (buf_size = $buf_size)"
8778 restore_lustre_params < $save
8780 run_test 102t "zero length xattr values handled correctly"
8784 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
8789 [ "$UID" != 0 ] && skip "must run as root"
8790 $GSS && skip_env "could not run under gss"
8791 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
8792 skip_env "must have acl enabled"
8793 [ -z "$(which setfacl 2>/dev/null)" ] &&
8794 skip_env "could not find setfacl"
8795 remote_mds_nodsh && skip "remote MDS with nodsh"
8797 gpasswd -a daemon bin # LU-5641
8798 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
8800 declare -a identity_old
8802 for num in $(seq $MDSCOUNT); do
8803 switch_identity $num true || identity_old[$num]=$?
8811 echo "performing cp ..."
8812 run_acl_subtest cp || error "run_acl_subtest cp failed"
8813 echo "performing getfacl-noacl..."
8814 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
8815 echo "performing misc..."
8816 run_acl_subtest misc || error "misc test failed"
8817 echo "performing permissions..."
8818 run_acl_subtest permissions || error "permissions failed"
8819 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
8820 if [ $MDS1_VERSION -gt $(version_code 2.8.55) -o \
8821 \( $MDS1_VERSION -lt $(version_code 2.6) -a \
8822 $MDS1_VERSION -ge $(version_code 2.5.29) \) ]
8824 echo "performing permissions xattr..."
8825 run_acl_subtest permissions_xattr ||
8826 error "permissions_xattr failed"
8828 echo "performing setfacl..."
8829 run_acl_subtest setfacl || error "setfacl test failed"
8831 # inheritance test got from HP
8832 echo "performing inheritance..."
8833 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
8834 chmod +x make-tree || error "chmod +x failed"
8835 run_acl_subtest inheritance || error "inheritance test failed"
8838 echo "LU-974 ignore umask when acl is enabled..."
8839 run_acl_subtest 974 || error "LU-974 umask test failed"
8840 if [ $MDSCOUNT -ge 2 ]; then
8841 run_acl_subtest 974_remote ||
8842 error "LU-974 umask test failed under remote dir"
8845 echo "LU-2561 newly created file is same size as directory..."
8846 if [ "$mds1_FSTYPE" != "zfs" ]; then
8847 run_acl_subtest 2561 || error "LU-2561 test failed"
8849 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
8852 run_acl_subtest 4924 || error "LU-4924 test failed"
8857 for num in $(seq $MDSCOUNT); do
8858 if [ "${identity_old[$num]}" = 1 ]; then
8859 switch_identity $num false || identity_old[$num]=$?
8863 run_test 103a "acl test"
8869 for U in {0..511}; do
8871 local O=$(printf "%04o" $U)
8873 umask $(printf "%04o" $((511 ^ $O)))
8874 $LFS setstripe -c 1 $DIR/$tfile.s$O
8875 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
8877 (( $S == ($O & 0666) )) ||
8878 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
8880 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
8881 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
8882 (( $S == ($O & 0666) )) ||
8883 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
8885 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
8886 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
8887 (( $S == ($O & 0666) )) ||
8888 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
8889 rm -f $DIR/$tfile.[smp]$0
8893 # limit the concurrently running threads to 64. LU-11878
8894 local idx=$((U % 64))
8895 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
8900 run_test 103b "umask lfs setstripe"
8904 cp -rp $DIR/$tdir $DIR/$tdir.bak
8906 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
8907 error "$DIR/$tdir shouldn't contain default ACL"
8908 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
8909 error "$DIR/$tdir.bak shouldn't contain default ACL"
8912 run_test 103c "'cp -rp' won't set empty acl"
8915 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8918 lfs df || error "lfs df failed"
8919 lfs df -ih || error "lfs df -ih failed"
8920 lfs df -h $DIR || error "lfs df -h $DIR failed"
8921 lfs df -i $DIR || error "lfs df -i $DIR failed"
8922 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
8923 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
8925 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
8926 lctl --device %$OSC deactivate
8927 lfs df || error "lfs df with deactivated OSC failed"
8928 lctl --device %$OSC activate
8929 # wait the osc back to normal
8930 wait_osc_import_ready client ost
8932 lfs df || error "lfs df with reactivated OSC failed"
8935 run_test 104a "lfs df [-ih] [path] test ========================="
8938 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8939 [ $RUNAS_ID -eq $UID ] &&
8940 skip_env "RUNAS_ID = UID = $UID -- skipping"
8942 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
8943 grep "Permission denied" | wc -l)))
8944 if [ $denied_cnt -ne 0 ]; then
8945 error "lfs check servers test failed"
8948 run_test 104b "$RUNAS lfs check servers test ===================="
8951 # doesn't work on 2.4 kernels
8953 if $(flock_is_enabled); then
8954 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
8956 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
8960 run_test 105a "flock when mounted without -o flock test ========"
8964 if $(flock_is_enabled); then
8965 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
8967 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
8971 run_test 105b "fcntl when mounted without -o flock test ========"
8975 if $(flock_is_enabled); then
8976 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
8978 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
8982 run_test 105c "lockf when mounted without -o flock test"
8984 test_105d() { # bug 15924
8985 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8987 test_mkdir $DIR/$tdir
8988 flock_is_enabled || skip_env "mount w/o flock enabled"
8989 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
8990 $LCTL set_param fail_loc=0x80000315
8991 flocks_test 2 $DIR/$tdir
8993 run_test 105d "flock race (should not freeze) ========"
8995 test_105e() { # bug 22660 && 22040
8996 flock_is_enabled || skip_env "mount w/o flock enabled"
8999 flocks_test 3 $DIR/$tfile
9001 run_test 105e "Two conflicting flocks from same process"
9003 test_106() { #bug 10921
9004 test_mkdir $DIR/$tdir
9005 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9006 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9008 run_test 106 "attempt exec of dir followed by chown of that dir"
9011 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9019 local save_pattern=$(sysctl -n kernel.core_pattern)
9020 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9021 sysctl -w kernel.core_pattern=$file
9022 sysctl -w kernel.core_uses_pid=0
9030 kill -s 11 $SLEEPPID
9032 if [ -e $file ]; then
9033 size=`stat -c%s $file`
9034 [ $size -eq 0 ] && error "Fail to create core file $file"
9036 error "Fail to create core file $file"
9039 sysctl -w kernel.core_pattern=$save_pattern
9040 sysctl -w kernel.core_uses_pid=$save_uses_pid
9043 run_test 107 "Coredump on SIG"
9046 test_mkdir $DIR/$tdir
9047 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9048 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9049 error "mkdir with 256 char should fail, but did not"
9050 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9051 error "create with 255 char failed"
9052 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9053 error "create with 256 char should fail, but did not"
9058 run_test 110 "filename length checking"
9061 # Purpose: To verify dynamic thread (OSS) creation.
9064 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9065 remote_ost_nodsh && skip "remote OST with nodsh"
9067 # Lustre does not stop service threads once they are started.
9068 # Reset number of running threads to default.
9073 local save_params="$TMP/sanity-$TESTNAME.parameters"
9075 # Get ll_ost_io count before I/O
9076 OSTIO_pre=$(do_facet ost1 \
9077 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9078 # Exit if lustre is not running (ll_ost_io not running).
9079 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9081 echo "Starting with $OSTIO_pre threads"
9082 local thread_max=$((OSTIO_pre * 2))
9083 local rpc_in_flight=$((thread_max * 2))
9084 # Number of I/O Process proposed to be started.
9086 local facets=$(get_facets OST)
9088 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9089 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9091 # Set in_flight to $rpc_in_flight
9092 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9093 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9094 nfiles=${rpc_in_flight}
9095 # Set ost thread_max to $thread_max
9096 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9098 # 5 Minutes should be sufficient for max number of OSS
9099 # threads(thread_max) to be created.
9103 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9104 test_mkdir $DIR/$tdir
9105 for i in $(seq $nfiles); do
9106 local file=$DIR/$tdir/${tfile}-$i
9107 $LFS setstripe -c -1 -i 0 $file
9108 ($WTL $file $timeout)&
9111 # I/O Started - Wait for thread_started to reach thread_max or report
9112 # error if thread_started is more than thread_max.
9113 echo "Waiting for thread_started to reach thread_max"
9114 local thread_started=0
9115 local end_time=$((SECONDS + timeout))
9117 while [ $SECONDS -le $end_time ] ; do
9119 # Get ost i/o thread_started count.
9120 thread_started=$(do_facet ost1 \
9122 ost.OSS.ost_io.threads_started | cut -d= -f2")
9123 # Break out if thread_started is equal/greater than thread_max
9124 if [[ $thread_started -ge $thread_max ]]; then
9125 echo ll_ost_io thread_started $thread_started, \
9126 equal/greater than thread_max $thread_max
9132 # Cleanup - We have the numbers, Kill i/o jobs if running.
9133 jobcount=($(jobs -p))
9134 for i in $(seq 0 $((${#jobcount[@]}-1)))
9136 kill -9 ${jobcount[$i]}
9137 if [ $? -ne 0 ] ; then
9139 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
9143 # Cleanup files left by WTL binary.
9144 for i in $(seq $nfiles); do
9145 local file=$DIR/$tdir/${tfile}-$i
9147 if [ $? -ne 0 ] ; then
9148 echo "Warning: Failed to delete file $file"
9152 restore_lustre_params <$save_params
9153 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
9155 # Error out if no new thread has started or Thread started is greater
9157 if [[ $thread_started -le $OSTIO_pre ||
9158 $thread_started -gt $thread_max ]]; then
9159 error "ll_ost_io: thread_started $thread_started" \
9160 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
9161 "No new thread started or thread started greater " \
9165 run_test 115 "verify dynamic thread creation===================="
9168 wait_delete_completed
9169 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
9170 echo "OST kbytes available: ${AVAIL[@]}"
9175 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
9176 #echo OST $i: ${AVAIL[i]}kb
9177 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
9181 if [[ ${AVAIL[i]} -lt $MINV ]]; then
9186 echo "Min free space: OST $MINI: $MINV"
9187 echo "Max free space: OST $MAXI: $MAXV"
9190 test_116a() { # was previously test_116()
9191 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9192 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9193 remote_mds_nodsh && skip "remote MDS with nodsh"
9195 echo -n "Free space priority "
9196 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
9201 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
9202 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
9203 trap simple_cleanup_common EXIT
9205 # Check if we need to generate uneven OSTs
9206 test_mkdir -p $DIR/$tdir/OST${MINI}
9207 local FILL=$((MINV / 4))
9208 local DIFF=$((MAXV - MINV))
9209 local DIFF2=$((DIFF * 100 / MINV))
9211 local threshold=$(do_facet $SINGLEMDS \
9212 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
9213 threshold=${threshold%%%}
9214 echo -n "Check for uneven OSTs: "
9215 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
9217 if [[ $DIFF2 -gt $threshold ]]; then
9219 echo "Don't need to fill OST$MINI"
9221 # generate uneven OSTs. Write 2% over the QOS threshold value
9223 DIFF=$((threshold - DIFF2 + 2))
9224 DIFF2=$((MINV * DIFF / 100))
9225 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
9226 $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
9227 error "setstripe failed"
9228 DIFF=$((DIFF2 / 2048))
9230 while [ $i -lt $DIFF ]; do
9232 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
9233 bs=2M count=1 2>/dev/null
9242 DIFF=$((MAXV - MINV))
9243 DIFF2=$((DIFF * 100 / MINV))
9244 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
9245 if [ $DIFF2 -gt $threshold ]; then
9248 echo "failed - QOS mode won't be used"
9249 simple_cleanup_common
9250 skip "QOS imbalance criteria not met"
9258 # now fill using QOS
9259 $SETSTRIPE -c 1 $DIR/$tdir
9260 FILL=$((FILL / 200))
9261 if [ $FILL -gt 600 ]; then
9264 echo "writing $FILL files to QOS-assigned OSTs"
9266 while [ $i -lt $FILL ]; do
9268 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
9272 echo "wrote $i 200k files"
9276 echo "Note: free space may not be updated, so measurements might be off"
9278 DIFF2=$((MAXV - MINV))
9279 echo "free space delta: orig $DIFF final $DIFF2"
9280 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
9281 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
9282 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
9283 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
9284 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
9285 if [[ $DIFF -gt 0 ]]; then
9286 FILL=$((DIFF2 * 100 / DIFF - 100))
9287 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
9290 # Figure out which files were written where
9291 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9292 awk '/'$MINI1': / {print $2; exit}')
9294 MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9295 echo "$MINC files created on smaller OST $MINI1"
9296 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9297 awk '/'$MAXI1': / {print $2; exit}')
9299 MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9300 echo "$MAXC files created on larger OST $MAXI1"
9301 if [[ $MINC -gt 0 ]]; then
9302 FILL=$((MAXC * 100 / MINC - 100))
9303 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
9305 [[ $MAXC -gt $MINC ]] ||
9306 error_ignore LU-9 "stripe QOS didn't balance free space"
9307 simple_cleanup_common
9309 run_test 116a "stripe QOS: free space balance ==================="
9311 test_116b() { # LU-2093
9312 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9313 remote_mds_nodsh && skip "remote MDS with nodsh"
9315 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
9316 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
9317 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
9318 [ -z "$old_rr" ] && skip "no QOS"
9319 do_facet $SINGLEMDS lctl set_param \
9320 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
9322 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
9323 createmany -o $DIR/$tdir/f- 20 || error "can't create"
9324 do_facet $SINGLEMDS lctl set_param fail_loc=0
9326 do_facet $SINGLEMDS lctl set_param \
9327 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
9329 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
9331 test_117() # bug 10891
9333 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9335 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
9336 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
9337 lctl set_param fail_loc=0x21e
9338 > $DIR/$tfile || error "truncate failed"
9339 lctl set_param fail_loc=0
9340 echo "Truncate succeeded."
9343 run_test 117 "verify osd extend =========="
9345 NO_SLOW_RESENDCOUNT=4
9346 export OLD_RESENDCOUNT=""
9347 set_resend_count () {
9348 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
9349 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
9350 lctl set_param -n $PROC_RESENDCOUNT $1
9351 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
9354 # for reduce test_118* time (b=14842)
9355 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9357 # Reset async IO behavior after error case
9359 FILE=$DIR/reset_async
9361 # Ensure all OSCs are cleared
9362 $SETSTRIPE -c -1 $FILE
9363 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
9368 test_118a() #bug 11710
9370 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9374 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9375 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9376 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9378 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9379 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9384 run_test 118a "verify O_SYNC works =========="
9388 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9389 remote_ost_nodsh && skip "remote OST with nodsh"
9393 #define OBD_FAIL_SRV_ENOENT 0x217
9394 set_nodes_failloc "$(osts_nodes)" 0x217
9395 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9397 set_nodes_failloc "$(osts_nodes)" 0
9398 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9399 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9402 if [[ $RC -eq 0 ]]; then
9403 error "Must return error due to dropped pages, rc=$RC"
9407 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9408 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9412 echo "Dirty pages not leaked on ENOENT"
9414 # Due to the above error the OSC will issue all RPCs syncronously
9415 # until a subsequent RPC completes successfully without error.
9416 $MULTIOP $DIR/$tfile Ow4096yc
9421 run_test 118b "Reclaim dirty pages on fatal error =========="
9425 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9427 # for 118c, restore the original resend count, LU-1940
9428 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
9429 set_resend_count $OLD_RESENDCOUNT
9430 remote_ost_nodsh && skip "remote OST with nodsh"
9434 #define OBD_FAIL_OST_EROFS 0x216
9435 set_nodes_failloc "$(osts_nodes)" 0x216
9437 # multiop should block due to fsync until pages are written
9438 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9442 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9443 error "Multiop failed to block on fsync, pid=$MULTIPID"
9446 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9448 if [[ $WRITEBACK -eq 0 ]]; then
9449 error "No page in writeback, writeback=$WRITEBACK"
9452 set_nodes_failloc "$(osts_nodes)" 0
9455 if [[ $RC -ne 0 ]]; then
9456 error "Multiop fsync failed, rc=$RC"
9459 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9460 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9462 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9463 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9467 echo "Dirty pages flushed via fsync on EROFS"
9470 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
9472 # continue to use small resend count to reduce test_118* time (b=14842)
9473 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9477 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9478 remote_ost_nodsh && skip "remote OST with nodsh"
9482 #define OBD_FAIL_OST_BRW_PAUSE_BULK
9483 set_nodes_failloc "$(osts_nodes)" 0x214
9484 # multiop should block due to fsync until pages are written
9485 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9489 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9490 error "Multiop failed to block on fsync, pid=$MULTIPID"
9493 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9495 if [[ $WRITEBACK -eq 0 ]]; then
9496 error "No page in writeback, writeback=$WRITEBACK"
9499 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
9500 set_nodes_failloc "$(osts_nodes)" 0
9502 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9503 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9505 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9506 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9510 echo "Dirty pages gaurenteed flushed via fsync"
9513 run_test 118d "Fsync validation inject a delay of the bulk =========="
9516 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9520 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
9521 lctl set_param fail_loc=0x8000040a
9523 # Should simulate EINVAL error which is fatal
9524 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9526 if [[ $RC -eq 0 ]]; then
9527 error "Must return error due to dropped pages, rc=$RC"
9530 lctl set_param fail_loc=0x0
9532 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9533 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9534 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9536 if [[ $LOCKED -ne 0 ]]; then
9537 error "Locked pages remain in cache, locked=$LOCKED"
9540 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9541 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9545 echo "No pages locked after fsync"
9550 run_test 118f "Simulate unrecoverable OSC side error =========="
9553 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9557 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
9558 lctl set_param fail_loc=0x406
9560 # simulate local -ENOMEM
9561 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9564 lctl set_param fail_loc=0
9565 if [[ $RC -eq 0 ]]; then
9566 error "Must return error due to dropped pages, rc=$RC"
9569 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9570 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9571 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9573 if [[ $LOCKED -ne 0 ]]; then
9574 error "Locked pages remain in cache, locked=$LOCKED"
9577 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9578 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9582 echo "No pages locked after fsync"
9587 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
9590 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9591 remote_ost_nodsh && skip "remote OST with nodsh"
9595 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9596 set_nodes_failloc "$(osts_nodes)" 0x20e
9597 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9598 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9601 set_nodes_failloc "$(osts_nodes)" 0
9602 if [[ $RC -eq 0 ]]; then
9603 error "Must return error due to dropped pages, rc=$RC"
9606 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9607 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9608 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9610 if [[ $LOCKED -ne 0 ]]; then
9611 error "Locked pages remain in cache, locked=$LOCKED"
9614 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9615 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9619 echo "No pages locked after fsync"
9623 run_test 118h "Verify timeout in handling recoverables errors =========="
9625 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
9628 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9629 remote_ost_nodsh && skip "remote OST with nodsh"
9633 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9634 set_nodes_failloc "$(osts_nodes)" 0x20e
9636 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9637 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9640 set_nodes_failloc "$(osts_nodes)" 0
9644 if [[ $RC -ne 0 ]]; then
9645 error "got error, but should be not, rc=$RC"
9648 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9649 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9650 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9651 if [[ $LOCKED -ne 0 ]]; then
9652 error "Locked pages remain in cache, locked=$LOCKED"
9655 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9656 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9660 echo "No pages locked after fsync"
9664 run_test 118i "Fix error before timeout in recoverable error =========="
9666 [ "$SLOW" = "no" ] && set_resend_count 4
9669 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9670 remote_ost_nodsh && skip "remote OST with nodsh"
9674 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
9675 set_nodes_failloc "$(osts_nodes)" 0x220
9677 # return -EIO from OST
9678 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9680 set_nodes_failloc "$(osts_nodes)" 0x0
9681 if [[ $RC -eq 0 ]]; then
9682 error "Must return error due to dropped pages, rc=$RC"
9685 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9686 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9687 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9688 if [[ $LOCKED -ne 0 ]]; then
9689 error "Locked pages remain in cache, locked=$LOCKED"
9692 # in recoverable error on OST we want resend and stay until it finished
9693 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9694 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9698 echo "No pages locked after fsync"
9702 run_test 118j "Simulate unrecoverable OST side error =========="
9706 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9707 remote_ost_nodsh && skip "remote OSTs with nodsh"
9709 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9710 set_nodes_failloc "$(osts_nodes)" 0x20e
9711 test_mkdir $DIR/$tdir
9713 for ((i=0;i<10;i++)); do
9714 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
9715 error "dd to $DIR/$tdir/$tfile-$i failed" )&
9722 set_nodes_failloc "$(osts_nodes)" 0
9725 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
9727 test_118l() # LU-646
9729 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9731 test_mkdir $DIR/$tdir
9732 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
9735 run_test 118l "fsync dir"
9737 test_118m() # LU-3066
9739 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9741 test_mkdir $DIR/$tdir
9742 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
9745 run_test 118m "fdatasync dir ========="
9747 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
9754 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9755 remote_ost_nodsh && skip "remote OSTs with nodsh"
9757 # Sleep to avoid a cached response.
9758 #define OBD_STATFS_CACHE_SECONDS 1
9761 # Inject a 10 second delay in the OST_STATFS handler.
9762 #define OBD_FAIL_OST_STATFS_DELAY 0x242
9763 set_nodes_failloc "$(osts_nodes)" 0x242
9766 stat --file-system $MOUNT > /dev/null
9769 set_nodes_failloc "$(osts_nodes)" 0
9771 if ((end - begin > 20)); then
9772 error "statfs took $((end - begin)) seconds, expected 10"
9775 run_test 118n "statfs() sends OST_STATFS requests in parallel"
9777 test_119a() # bug 11737
9779 BSIZE=$((512 * 1024))
9780 directio write $DIR/$tfile 0 1 $BSIZE
9781 # We ask to read two blocks, which is more than a file size.
9782 # directio will indicate an error when requested and actual
9783 # sizes aren't equeal (a normal situation in this case) and
9784 # print actual read amount.
9785 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
9786 if [ "$NOB" != "$BSIZE" ]; then
9787 error "read $NOB bytes instead of $BSIZE"
9791 run_test 119a "Short directIO read must return actual read amount"
9793 test_119b() # bug 11737
9795 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9797 $SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed"
9798 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
9800 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
9801 error "direct read failed"
9804 run_test 119b "Sparse directIO read must return actual read amount"
9806 test_119c() # bug 13099
9809 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
9810 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
9813 run_test 119c "Testing for direct read hitting hole"
9815 test_119d() # bug 15950
9817 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9819 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
9820 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
9822 $SETSTRIPE $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
9823 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
9824 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
9825 lctl set_param fail_loc=0x40d
9826 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
9829 cat $DIR/$tfile > /dev/null &
9830 lctl set_param fail_loc=0
9833 log "the DIO writes have completed, now wait for the reads (should not block very long)"
9835 [ -n "`ps h -p $pid_reads -o comm`" ] && \
9836 error "the read rpcs have not completed in 2s"
9838 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
9840 run_test 119d "The DIO path should try to send a new rpc once one is completed"
9843 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9844 remote_mds_nodsh && skip "remote MDS with nodsh"
9845 test_mkdir $DIR/$tdir
9846 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
9847 skip_env "no early lock cancel on server"
9849 lru_resize_disable mdc
9850 lru_resize_disable osc
9851 cancel_lru_locks mdc
9852 # asynchronous object destroy at MDT could cause bl ast to client
9853 cancel_lru_locks osc
9855 stat $DIR/$tdir > /dev/null
9856 can1=$(do_facet $SINGLEMDS \
9857 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9858 awk '/ldlm_cancel/ {print $2}')
9859 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9860 awk '/ldlm_bl_callback/ {print $2}')
9861 test_mkdir -c1 $DIR/$tdir/d1
9862 can2=$(do_facet $SINGLEMDS \
9863 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9864 awk '/ldlm_cancel/ {print $2}')
9865 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9866 awk '/ldlm_bl_callback/ {print $2}')
9867 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
9868 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
9869 lru_resize_enable mdc
9870 lru_resize_enable osc
9872 run_test 120a "Early Lock Cancel: mkdir test"
9875 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9876 remote_mds_nodsh && skip "remote MDS with nodsh"
9877 test_mkdir $DIR/$tdir
9878 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
9879 skip_env "no early lock cancel on server"
9881 lru_resize_disable mdc
9882 lru_resize_disable osc
9883 cancel_lru_locks mdc
9884 stat $DIR/$tdir > /dev/null
9885 can1=$(do_facet $SINGLEMDS \
9886 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9887 awk '/ldlm_cancel/ {print $2}')
9888 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9889 awk '/ldlm_bl_callback/ {print $2}')
9891 can2=$(do_facet $SINGLEMDS \
9892 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9893 awk '/ldlm_cancel/ {print $2}')
9894 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9895 awk '/ldlm_bl_callback/ {print $2}')
9896 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
9897 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
9898 lru_resize_enable mdc
9899 lru_resize_enable osc
9901 run_test 120b "Early Lock Cancel: create test"
9904 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9905 remote_mds_nodsh && skip "remote MDS with nodsh"
9906 test_mkdir -c1 $DIR/$tdir
9907 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
9908 skip "no early lock cancel on server"
9910 lru_resize_disable mdc
9911 lru_resize_disable osc
9912 test_mkdir -c1 $DIR/$tdir/d1
9913 test_mkdir -c1 $DIR/$tdir/d2
9914 touch $DIR/$tdir/d1/f1
9915 cancel_lru_locks mdc
9916 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
9917 can1=$(do_facet $SINGLEMDS \
9918 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9919 awk '/ldlm_cancel/ {print $2}')
9920 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9921 awk '/ldlm_bl_callback/ {print $2}')
9922 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
9923 can2=$(do_facet $SINGLEMDS \
9924 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9925 awk '/ldlm_cancel/ {print $2}')
9926 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9927 awk '/ldlm_bl_callback/ {print $2}')
9928 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
9929 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
9930 lru_resize_enable mdc
9931 lru_resize_enable osc
9933 run_test 120c "Early Lock Cancel: link test"
9936 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9937 remote_mds_nodsh && skip "remote MDS with nodsh"
9938 test_mkdir -c1 $DIR/$tdir
9939 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
9940 skip_env "no early lock cancel on server"
9942 lru_resize_disable mdc
9943 lru_resize_disable osc
9945 cancel_lru_locks mdc
9946 stat $DIR/$tdir > /dev/null
9947 can1=$(do_facet $SINGLEMDS \
9948 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9949 awk '/ldlm_cancel/ {print $2}')
9950 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9951 awk '/ldlm_bl_callback/ {print $2}')
9952 chmod a+x $DIR/$tdir
9953 can2=$(do_facet $SINGLEMDS \
9954 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9955 awk '/ldlm_cancel/ {print $2}')
9956 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9957 awk '/ldlm_bl_callback/ {print $2}')
9958 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
9959 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
9960 lru_resize_enable mdc
9961 lru_resize_enable osc
9963 run_test 120d "Early Lock Cancel: setattr test"
9966 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9967 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
9968 skip_env "no early lock cancel on server"
9969 remote_mds_nodsh && skip "remote MDS with nodsh"
9971 local dlmtrace_set=false
9973 test_mkdir -c1 $DIR/$tdir
9974 lru_resize_disable mdc
9975 lru_resize_disable osc
9976 ! $LCTL get_param debug | grep -q dlmtrace &&
9977 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
9978 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
9979 cancel_lru_locks mdc
9980 cancel_lru_locks osc
9981 dd if=$DIR/$tdir/f1 of=/dev/null
9982 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
9983 # XXX client can not do early lock cancel of OST lock
9984 # during unlink (LU-4206), so cancel osc lock now.
9986 cancel_lru_locks osc
9987 can1=$(do_facet $SINGLEMDS \
9988 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9989 awk '/ldlm_cancel/ {print $2}')
9990 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9991 awk '/ldlm_bl_callback/ {print $2}')
9992 unlink $DIR/$tdir/f1
9994 can2=$(do_facet $SINGLEMDS \
9995 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9996 awk '/ldlm_cancel/ {print $2}')
9997 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9998 awk '/ldlm_bl_callback/ {print $2}')
9999 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10000 $LCTL dk $TMP/cancel.debug.txt
10001 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10002 $LCTL dk $TMP/blocking.debug.txt
10003 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10004 lru_resize_enable mdc
10005 lru_resize_enable osc
10007 run_test 120e "Early Lock Cancel: unlink test"
10010 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10011 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10012 skip_env "no early lock cancel on server"
10013 remote_mds_nodsh && skip "remote MDS with nodsh"
10015 test_mkdir -c1 $DIR/$tdir
10016 lru_resize_disable mdc
10017 lru_resize_disable osc
10018 test_mkdir -c1 $DIR/$tdir/d1
10019 test_mkdir -c1 $DIR/$tdir/d2
10020 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10021 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10022 cancel_lru_locks mdc
10023 cancel_lru_locks osc
10024 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10025 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10026 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10027 # XXX client can not do early lock cancel of OST lock
10028 # during rename (LU-4206), so cancel osc lock now.
10030 cancel_lru_locks osc
10031 can1=$(do_facet $SINGLEMDS \
10032 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10033 awk '/ldlm_cancel/ {print $2}')
10034 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10035 awk '/ldlm_bl_callback/ {print $2}')
10036 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10038 can2=$(do_facet $SINGLEMDS \
10039 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10040 awk '/ldlm_cancel/ {print $2}')
10041 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10042 awk '/ldlm_bl_callback/ {print $2}')
10043 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10044 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10045 lru_resize_enable mdc
10046 lru_resize_enable osc
10048 run_test 120f "Early Lock Cancel: rename test"
10051 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10052 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10053 skip_env "no early lock cancel on server"
10054 remote_mds_nodsh && skip "remote MDS with nodsh"
10056 lru_resize_disable mdc
10057 lru_resize_disable osc
10059 echo create $count files
10060 test_mkdir $DIR/$tdir
10061 cancel_lru_locks mdc
10062 cancel_lru_locks osc
10065 can0=$(do_facet $SINGLEMDS \
10066 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10067 awk '/ldlm_cancel/ {print $2}')
10068 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10069 awk '/ldlm_bl_callback/ {print $2}')
10070 createmany -o $DIR/$tdir/f $count
10072 can1=$(do_facet $SINGLEMDS \
10073 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10074 awk '/ldlm_cancel/ {print $2}')
10075 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10076 awk '/ldlm_bl_callback/ {print $2}')
10078 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10079 echo rm $count files
10082 can2=$(do_facet $SINGLEMDS \
10083 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10084 awk '/ldlm_cancel/ {print $2}')
10085 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10086 awk '/ldlm_bl_callback/ {print $2}')
10088 echo total: $count removes in $((t2-t1))
10089 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10091 # wait for commitment of removal
10092 lru_resize_enable mdc
10093 lru_resize_enable osc
10095 run_test 120g "Early Lock Cancel: performance test"
10097 test_121() { #bug #10589
10098 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10101 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10102 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10103 lctl set_param fail_loc=0x310
10104 cancel_lru_locks osc > /dev/null
10105 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10106 lctl set_param fail_loc=0
10107 [[ $reads -eq $writes ]] ||
10108 error "read $reads blocks, must be $writes blocks"
10110 run_test 121 "read cancel race ========="
10112 test_123a() { # was test 123, statahead(bug 11401)
10113 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10116 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10117 log "testing UP system. Performance may be lower than expected."
10122 test_mkdir $DIR/$tdir
10123 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10124 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10126 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10127 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10129 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10130 lctl set_param -n llite.*.statahead_max 0
10131 lctl get_param llite.*.statahead_max
10132 cancel_lru_locks mdc
10133 cancel_lru_locks osc
10135 time ls -l $DIR/$tdir | wc -l
10137 delta=$((etime - stime))
10138 log "ls $i files without statahead: $delta sec"
10139 lctl set_param llite.*.statahead_max=$max
10141 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10142 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
10143 cancel_lru_locks mdc
10144 cancel_lru_locks osc
10146 time ls -l $DIR/$tdir | wc -l
10148 delta_sa=$((etime - stime))
10149 log "ls $i files with statahead: $delta_sa sec"
10150 lctl get_param -n llite.*.statahead_stats
10151 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10153 [[ $swrong -lt $ewrong ]] &&
10154 log "statahead was stopped, maybe too many locks held!"
10155 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
10157 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10158 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10159 lctl set_param -n llite.*.statahead_max 0
10160 lctl get_param llite.*.statahead_max
10161 cancel_lru_locks mdc
10162 cancel_lru_locks osc
10164 time ls -l $DIR/$tdir | wc -l
10166 delta=$((etime - stime))
10167 log "ls $i files again without statahead: $delta sec"
10168 lctl set_param llite.*.statahead_max=$max
10169 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10170 if [ $SLOWOK -eq 0 ]; then
10171 error "ls $i files is slower with statahead!"
10173 log "ls $i files is slower with statahead!"
10179 [ $delta -gt 20 ] && break
10180 [ $delta -gt 8 ] && MULT=$((50 / delta))
10181 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
10189 delta=$((etime - stime))
10190 log "rm -r $DIR/$tdir/: $delta seconds"
10192 lctl get_param -n llite.*.statahead_stats
10194 run_test 123a "verify statahead work"
10196 test_123b () { # statahead(bug 15027)
10197 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10199 test_mkdir $DIR/$tdir
10200 createmany -o $DIR/$tdir/$tfile-%d 1000
10202 cancel_lru_locks mdc
10203 cancel_lru_locks osc
10205 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
10206 lctl set_param fail_loc=0x80000803
10207 ls -lR $DIR/$tdir > /dev/null
10209 lctl set_param fail_loc=0x0
10210 lctl get_param -n llite.*.statahead_stats
10215 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
10218 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10219 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10220 skip_env "no lru resize on server"
10224 test_mkdir $DIR/$tdir
10226 log "create $NR files at $DIR/$tdir"
10227 createmany -o $DIR/$tdir/f $NR ||
10228 error "failed to create $NR files in $DIR/$tdir"
10230 cancel_lru_locks mdc
10231 ls -l $DIR/$tdir > /dev/null
10235 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
10236 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
10237 LRU_SIZE=$($LCTL get_param -n $PARAM)
10238 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
10239 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
10241 log "NS=$(basename $NSDIR)"
10246 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
10247 skip "Not enough cached locks created!"
10249 log "LRU=$LRU_SIZE"
10253 # We know that lru resize allows one client to hold $LIMIT locks
10254 # for 10h. After that locks begin to be killed by client.
10256 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
10258 if [ $LIMIT -lt $LRU_SIZE ]; then
10259 skip "Limit is too small $LIMIT"
10262 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
10263 # killing locks. Some time was spent for creating locks. This means
10264 # that up to the moment of sleep finish we must have killed some of
10265 # them (10-100 locks). This depends on how fast ther were created.
10266 # Many of them were touched in almost the same moment and thus will
10267 # be killed in groups.
10268 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
10270 # Use $LRU_SIZE_B here to take into account real number of locks
10271 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
10272 local LRU_SIZE_B=$LRU_SIZE
10274 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
10275 log "OLD_LVF=$OLD_LVF"
10276 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
10278 # Let's make sure that we really have some margin. Client checks
10279 # cached locks every 10 sec.
10280 SLEEP=$((SLEEP+20))
10281 log "Sleep ${SLEEP} sec"
10283 while ((SEC<$SLEEP)); do
10287 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
10288 echo -n "$LRU_SIZE"
10291 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
10292 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
10294 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
10295 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
10296 unlinkmany $DIR/$tdir/f $NR
10300 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
10301 log "unlink $NR files at $DIR/$tdir"
10302 unlinkmany $DIR/$tdir/f $NR
10304 run_test 124a "lru resize ======================================="
10306 get_max_pool_limit()
10308 local limit=$($LCTL get_param \
10309 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
10311 for l in $limit; do
10312 if [[ $l -gt $max ]]; then
10320 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10321 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10322 skip_env "no lru resize on server"
10324 LIMIT=$(get_max_pool_limit)
10326 NR=$(($(default_lru_size)*20))
10327 if [[ $NR -gt $LIMIT ]]; then
10328 log "Limit lock number by $LIMIT locks"
10332 IFree=$(mdsrate_inodes_available)
10333 if [ $IFree -lt $NR ]; then
10334 log "Limit lock number by $IFree inodes"
10338 lru_resize_disable mdc
10339 test_mkdir -p $DIR/$tdir/disable_lru_resize
10341 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
10342 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
10343 cancel_lru_locks mdc
10346 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10349 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10352 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10356 nolruresize_delta=$((etime-stime))
10357 log "ls -la time: $nolruresize_delta seconds"
10358 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10359 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
10361 lru_resize_enable mdc
10362 test_mkdir -p $DIR/$tdir/enable_lru_resize
10364 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
10365 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
10366 cancel_lru_locks mdc
10369 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10372 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10375 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10379 lruresize_delta=$((etime-stime))
10380 log "ls -la time: $lruresize_delta seconds"
10381 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10383 if [ $lruresize_delta -gt $nolruresize_delta ]; then
10384 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
10385 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
10386 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
10388 log "lru resize performs the same with no lru resize"
10390 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
10392 run_test 124b "lru resize (performance test) ======================="
10395 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10396 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10397 skip_env "no lru resize on server"
10399 # cache ununsed locks on client
10401 cancel_lru_locks mdc
10402 test_mkdir $DIR/$tdir
10403 createmany -o $DIR/$tdir/f $nr ||
10404 error "failed to create $nr files in $DIR/$tdir"
10405 ls -l $DIR/$tdir > /dev/null
10407 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10408 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10409 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10410 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10411 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10413 # set lru_max_age to 1 sec
10414 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10415 echo "sleep $((recalc_p * 2)) seconds..."
10416 sleep $((recalc_p * 2))
10418 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10419 # restore lru_max_age
10420 $LCTL set_param -n $nsdir.lru_max_age $max_age
10421 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10422 unlinkmany $DIR/$tdir/f $nr
10424 run_test 124c "LRUR cancel very aged locks"
10427 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10428 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10429 skip_env "no lru resize on server"
10431 # cache ununsed locks on client
10434 lru_resize_disable mdc
10435 stack_trap "lru_resize_enable mdc" EXIT
10437 cancel_lru_locks mdc
10439 # asynchronous object destroy at MDT could cause bl ast to client
10440 test_mkdir $DIR/$tdir
10441 createmany -o $DIR/$tdir/f $nr ||
10442 error "failed to create $nr files in $DIR/$tdir"
10443 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
10445 ls -l $DIR/$tdir > /dev/null
10447 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10448 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10449 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10450 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10452 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10454 # set lru_max_age to 1 sec
10455 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10456 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
10458 echo "sleep $((recalc_p * 2)) seconds..."
10459 sleep $((recalc_p * 2))
10461 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10463 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10465 run_test 124d "cancel very aged locks if lru-resize diasbaled"
10467 test_125() { # 13358
10468 $LCTL get_param -n llite.*.client_type | grep -q local ||
10469 skip "must run as local client"
10470 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
10471 skip_env "must have acl enabled"
10472 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
10474 test_mkdir $DIR/$tdir
10475 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
10476 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
10477 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
10479 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
10481 test_126() { # bug 12829/13455
10482 $GSS && skip_env "must run as gss disabled"
10483 $LCTL get_param -n llite.*.client_type | grep -q local ||
10484 skip "must run as local client"
10485 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
10487 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
10488 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
10490 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
10492 run_test 126 "check that the fsgid provided by the client is taken into account"
10494 test_127a() { # bug 15521
10495 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10497 $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
10498 $LCTL set_param osc.*.stats=0
10499 FSIZE=$((2048 * 1024))
10500 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
10501 cancel_lru_locks osc
10502 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
10504 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
10505 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
10506 echo "got $COUNT $NAME"
10507 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
10508 eval $NAME=$COUNT || error "Wrong proc format"
10511 read_bytes|write_bytes)
10512 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
10513 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
10514 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
10515 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
10516 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
10517 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
10518 error "sumsquare is too small: $SUMSQ"
10519 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
10520 error "sumsquare is too big: $SUMSQ"
10524 done < $DIR/${tfile}.tmp
10526 #check that we actually got some stats
10527 [ "$read_bytes" ] || error "Missing read_bytes stats"
10528 [ "$write_bytes" ] || error "Missing write_bytes stats"
10529 [ "$read_bytes" != 0 ] || error "no read done"
10530 [ "$write_bytes" != 0 ] || error "no write done"
10532 run_test 127a "verify the client stats are sane"
10534 test_127b() { # bug LU-333
10535 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10536 local name count samp unit min max sum sumsq
10538 $LCTL set_param llite.*.stats=0
10540 # perform 2 reads and writes so MAX is different from SUM.
10541 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10542 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10543 cancel_lru_locks osc
10544 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10545 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10547 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
10548 while read name count samp unit min max sum sumsq; do
10549 echo "got $count $name"
10550 eval $name=$count || error "Wrong proc format"
10554 [ $count -ne 2 ] && error "count is not 2: $count"
10555 [ $min -ne $PAGE_SIZE ] &&
10556 error "min is not $PAGE_SIZE: $min"
10557 [ $max -ne $PAGE_SIZE ] &&
10558 error "max is incorrect: $max"
10559 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10560 error "sum is wrong: $sum"
10563 [ $count -ne 2 ] && error "count is not 2: $count"
10564 [ $min -ne $PAGE_SIZE ] &&
10565 error "min is not $PAGE_SIZE: $min"
10566 [ $max -ne $PAGE_SIZE ] &&
10567 error "max is incorrect: $max"
10568 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10569 error "sum is wrong: $sum"
10573 done < $TMP/$tfile.tmp
10575 #check that we actually got some stats
10576 [ "$read_bytes" ] || error "Missing read_bytes stats"
10577 [ "$write_bytes" ] || error "Missing write_bytes stats"
10578 [ "$read_bytes" != 0 ] || error "no read done"
10579 [ "$write_bytes" != 0 ] || error "no write done"
10581 rm -f $TMP/${tfile}.tmp
10583 run_test 127b "verify the llite client stats are sane"
10585 test_127c() { # LU-12394
10586 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
10593 $LCTL set_param llite.*.extents_stats=1
10594 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
10596 # Use two stripes so there is enough space in default config
10597 $LFS setstripe -c 2 $DIR/$tfile
10599 # Extent stats start at 0-4K and go in power of two buckets
10600 # LL_HIST_START = 12 --> 2^12 = 4K
10601 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
10602 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
10604 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
10606 # Write and read, 2x each, second time at a non-zero offset
10607 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
10608 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
10609 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
10610 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
10614 $LCTL get_param llite.*.extents_stats
10617 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
10619 local bucket=$($LCTL get_param -n llite.*.extents_stats |
10621 reads=$(echo $bucket | awk '{print $5}')
10622 writes=$(echo $bucket | awk '{print $9}')
10623 [ "$reads" -eq $count ] ||
10624 error "$reads reads in < $bsize bucket, expect $count"
10625 [ "$writes" -eq $count ] ||
10626 error "$writes writes in < $bsize bucket, expect $count"
10629 # Test mmap write and read
10630 $LCTL set_param llite.*.extents_stats=c
10632 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
10633 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
10634 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
10636 $LCTL get_param llite.*.extents_stats
10638 count=$(((size*1024) / PAGE_SIZE))
10640 bsize=$((2 * PAGE_SIZE / 1024))K
10642 bucket=$($LCTL get_param -n llite.*.extents_stats |
10644 reads=$(echo $bucket | awk '{print $5}')
10645 writes=$(echo $bucket | awk '{print $9}')
10646 # mmap writes fault in the page first, creating an additonal read
10647 [ "$reads" -eq $((2 * count)) ] ||
10648 error "$reads reads in < $bsize bucket, expect $count"
10649 [ "$writes" -eq $count ] ||
10650 error "$writes writes in < $bsize bucket, expect $count"
10652 run_test 127c "test llite extent stats with regular & mmap i/o"
10654 test_128() { # bug 15212
10656 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
10661 result=$(grep error $TMP/$tfile.log)
10662 rm -f $DIR/$tfile $TMP/$tfile.log
10663 [ -z "$result" ] ||
10664 error "consecutive find's under interactive lfs failed"
10666 run_test 128 "interactive lfs for 2 consecutive find's"
10668 set_dir_limits () {
10673 local ldproc=/proc/fs/ldiskfs
10674 local facets=$(get_facets MDS)
10676 for facet in ${facets//,/ }; do
10677 canondev=$(ldiskfs_canon \
10678 *.$(convert_facet2label $facet).mntdev $facet)
10679 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
10680 ldproc=/sys/fs/ldiskfs
10681 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
10682 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
10686 check_mds_dmesg() {
10687 local facets=$(get_facets MDS)
10688 for facet in ${facets//,/ }; do
10689 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
10695 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10696 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
10697 skip "Need MDS version with at least 2.5.56"
10698 if [ "$mds1_FSTYPE" != ldiskfs ]; then
10699 skip_env "ldiskfs only test"
10701 remote_mds_nodsh && skip "remote MDS with nodsh"
10705 local has_warning=false
10708 mkdir -p $DIR/$tdir
10710 # block size of mds1
10711 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
10712 set_dir_limits $maxsize $maxsize
10713 local dirsize=$(stat -c%s "$DIR/$tdir")
10715 while [[ $dirsize -le $maxsize ]]; do
10716 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
10718 if ! $has_warning; then
10719 check_mds_dmesg '"is approaching"' && has_warning=true
10721 # check two errors:
10722 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
10723 # EFBIG for previous versions included in ldiskfs series
10724 if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
10726 echo "return code $rc received as expected"
10728 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
10729 error_exit "create failed w/o dir size limit"
10731 check_mds_dmesg '"has reached"' ||
10732 error_exit "reached message should be output"
10734 [ $has_warning = "false" ] &&
10735 error_exit "warning message should be output"
10737 dirsize=$(stat -c%s "$DIR/$tdir")
10739 [[ $dirsize -ge $maxsize ]] && return 0
10740 error_exit "current dir size $dirsize, " \
10741 "previous limit $maxsize"
10742 elif [ $rc -ne 0 ]; then
10744 error_exit "return $rc received instead of expected " \
10745 "$EFBIG or $ENOSPC, files in dir $dirsize"
10747 nfiles=$((nfiles + 1))
10748 dirsize=$(stat -c%s "$DIR/$tdir")
10752 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
10754 run_test 129 "test directory size limit ========================"
10763 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
10764 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
10766 trap cleanup_130 EXIT RETURN
10768 local fm_file=$DIR/$tfile
10769 $SETSTRIPE -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
10770 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
10771 error "dd failed for $fm_file"
10773 # LU-1795: test filefrag/FIEMAP once, even if unsupported
10774 filefrag -ves $fm_file
10776 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
10777 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
10778 [ $RC != 0 ] && error "filefrag $fm_file failed"
10780 filefrag_op=$(filefrag -ve -k $fm_file |
10781 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
10782 lun=$($GETSTRIPE -i $fm_file)
10784 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
10787 for line in $filefrag_op
10789 frag_lun=`echo $line | cut -d: -f5`
10790 ext_len=`echo $line | cut -d: -f4`
10791 if (( $frag_lun != $lun )); then
10793 error "FIEMAP on 1-stripe file($fm_file) failed"
10796 (( tot_len += ext_len ))
10799 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
10801 error "FIEMAP on 1-stripe file($fm_file) failed;"
10807 echo "FIEMAP on single striped file succeeded"
10809 run_test 130a "FIEMAP (1-stripe file)"
10812 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
10814 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
10815 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
10817 trap cleanup_130 EXIT RETURN
10819 local fm_file=$DIR/$tfile
10820 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
10821 error "setstripe on $fm_file"
10822 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
10823 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
10825 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
10826 error "dd failed on $fm_file"
10828 filefrag -ves $fm_file || error "filefrag $fm_file failed"
10829 filefrag_op=$(filefrag -ve -k $fm_file |
10830 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
10832 last_lun=$(echo $filefrag_op | cut -d: -f5 |
10833 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
10838 for line in $filefrag_op
10840 frag_lun=$(echo $line | cut -d: -f5 |
10841 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
10842 ext_len=$(echo $line | cut -d: -f4)
10843 if (( $frag_lun != $last_lun )); then
10844 if (( tot_len != 1024 )); then
10846 error "FIEMAP on $fm_file failed; returned " \
10847 "len $tot_len for OST $last_lun instead of 1024"
10850 (( num_luns += 1 ))
10854 (( tot_len += ext_len ))
10857 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
10859 error "FIEMAP on $fm_file failed; returned wrong number of " \
10860 "luns or wrong len for OST $last_lun"
10866 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
10868 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
10871 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10873 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
10874 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
10876 trap cleanup_130 EXIT RETURN
10878 local fm_file=$DIR/$tfile
10879 $SETSTRIPE -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
10880 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
10881 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
10883 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
10884 error "dd failed on $fm_file"
10886 filefrag -ves $fm_file || error "filefrag $fm_file failed"
10887 filefrag_op=$(filefrag -ve -k $fm_file |
10888 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
10890 last_lun=$(echo $filefrag_op | cut -d: -f5 |
10891 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
10896 for line in $filefrag_op
10898 frag_lun=$(echo $line | cut -d: -f5 |
10899 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
10900 ext_len=$(echo $line | cut -d: -f4)
10901 if (( $frag_lun != $last_lun )); then
10902 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
10903 if (( logical != 512 )); then
10905 error "FIEMAP on $fm_file failed; returned " \
10906 "logical start for lun $logical instead of 512"
10909 if (( tot_len != 512 )); then
10911 error "FIEMAP on $fm_file failed; returned " \
10912 "len $tot_len for OST $last_lun instead of 1024"
10915 (( num_luns += 1 ))
10919 (( tot_len += ext_len ))
10922 if (( num_luns != 2 || tot_len != 512 )); then
10924 error "FIEMAP on $fm_file failed; returned wrong number of " \
10925 "luns or wrong len for OST $last_lun"
10931 echo "FIEMAP on 2-stripe file with hole succeeded"
10933 run_test 130c "FIEMAP (2-stripe file with hole)"
10936 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
10938 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
10939 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
10941 trap cleanup_130 EXIT RETURN
10943 local fm_file=$DIR/$tfile
10944 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
10945 error "setstripe on $fm_file"
10946 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
10947 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
10949 local actual_stripe_count=$($GETSTRIPE -c $fm_file)
10950 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
10951 error "dd failed on $fm_file"
10953 filefrag -ves $fm_file || error "filefrag $fm_file failed"
10954 filefrag_op=$(filefrag -ve -k $fm_file |
10955 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
10957 last_lun=$(echo $filefrag_op | cut -d: -f5 |
10958 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
10963 for line in $filefrag_op
10965 frag_lun=$(echo $line | cut -d: -f5 |
10966 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
10967 ext_len=$(echo $line | cut -d: -f4)
10968 if (( $frag_lun != $last_lun )); then
10969 if (( tot_len != 1024 )); then
10971 error "FIEMAP on $fm_file failed; returned " \
10972 "len $tot_len for OST $last_lun instead of 1024"
10975 (( num_luns += 1 ))
10979 (( tot_len += ext_len ))
10982 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
10984 error "FIEMAP on $fm_file failed; returned wrong number of " \
10985 "luns or wrong len for OST $last_lun"
10991 echo "FIEMAP on N-stripe file succeeded"
10993 run_test 130d "FIEMAP (N-stripe file)"
10996 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10998 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
10999 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11001 trap cleanup_130 EXIT RETURN
11003 local fm_file=$DIR/$tfile
11004 $SETSTRIPE -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11005 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11006 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11009 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11010 for ((i = 0; i < $NUM_BLKS; i++))
11012 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11015 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11016 filefrag_op=$(filefrag -ve -k $fm_file |
11017 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11019 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11020 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11025 for line in $filefrag_op
11027 frag_lun=$(echo $line | cut -d: -f5 |
11028 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11029 ext_len=$(echo $line | cut -d: -f4)
11030 if (( $frag_lun != $last_lun )); then
11031 if (( tot_len != $EXPECTED_LEN )); then
11033 error "FIEMAP on $fm_file failed; returned " \
11034 "len $tot_len for OST $last_lun instead " \
11038 (( num_luns += 1 ))
11042 (( tot_len += ext_len ))
11045 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11047 error "FIEMAP on $fm_file failed; returned wrong number " \
11048 "of luns or wrong len for OST $last_lun"
11054 echo "FIEMAP with continuation calls succeeded"
11056 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11059 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11060 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11062 local fm_file=$DIR/$tfile
11063 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11064 error "multiop create with lov_delay_create on $fm_file"
11066 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11067 filefrag_extents=$(filefrag -vek $fm_file |
11068 awk '/extents? found/ { print $2 }')
11069 if [[ "$filefrag_extents" != "0" ]]; then
11070 error "FIEMAP on $fm_file failed; " \
11071 "returned $filefrag_extents expected 0"
11076 run_test 130f "FIEMAP (unstriped file)"
11078 # Test for writev/readv
11080 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11081 error "writev test failed"
11082 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11083 error "readv failed"
11086 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11089 local fsize=$((524288 + 1048576 + 1572864))
11090 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11091 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11092 error "append writev test failed"
11094 ((fsize += 1572864 + 1048576))
11095 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11096 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11097 error "append writev test failed"
11100 run_test 131b "test append writev"
11103 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11106 run_test 131c "test read/write on file w/o objects"
11109 rwv -f $DIR/$tfile -w -n 1 1572864
11110 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11111 if [ "$NOB" != 1572864 ]; then
11112 error "Short read filed: read $NOB bytes instead of 1572864"
11116 run_test 131d "test short read"
11119 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11120 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11121 error "read hitting hole failed"
11124 run_test 131e "test read hitting hole"
11133 mds*) res=$(do_facet $facet \
11134 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11136 ost*) res=$(do_facet $facet \
11137 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
11139 *) error "Wrong facet '$facet'" ;;
11141 [ "$res" ] || error "The counter for $op on $facet was not incremented"
11142 # if the argument $3 is zero, it means any stat increment is ok.
11143 if [[ $want -gt 0 ]]; then
11144 local count=$(echo $res | awk '{ print $2 }')
11145 [[ $count -ne $want ]] &&
11146 error "The $op counter on $facet is $count, not $want"
11151 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11152 remote_ost_nodsh && skip "remote OST with nodsh"
11153 remote_mds_nodsh && skip "remote MDS with nodsh"
11154 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11155 skip_env "MDS doesn't support rename stats"
11157 local testdir=$DIR/${tdir}/stats_testdir
11159 mkdir -p $DIR/${tdir}
11162 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11163 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11165 # verify mdt stats first.
11166 mkdir ${testdir} || error "mkdir failed"
11167 check_stats $SINGLEMDS "mkdir" 1
11168 touch ${testdir}/${tfile} || error "touch failed"
11169 check_stats $SINGLEMDS "open" 1
11170 check_stats $SINGLEMDS "close" 1
11171 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
11172 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
11173 check_stats $SINGLEMDS "mknod" 2
11175 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
11176 check_stats $SINGLEMDS "unlink" 1
11177 rm -f ${testdir}/${tfile} || error "file remove failed"
11178 check_stats $SINGLEMDS "unlink" 2
11180 # remove working dir and check mdt stats again.
11181 rmdir ${testdir} || error "rmdir failed"
11182 check_stats $SINGLEMDS "rmdir" 1
11184 local testdir1=$DIR/${tdir}/stats_testdir1
11185 mkdir -p ${testdir}
11186 mkdir -p ${testdir1}
11187 touch ${testdir1}/test1
11188 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
11189 check_stats $SINGLEMDS "crossdir_rename" 1
11191 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
11192 check_stats $SINGLEMDS "samedir_rename" 1
11194 rm -rf $DIR/${tdir}
11196 run_test 133a "Verifying MDT stats ========================================"
11201 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11202 remote_ost_nodsh && skip "remote OST with nodsh"
11203 remote_mds_nodsh && skip "remote MDS with nodsh"
11205 local testdir=$DIR/${tdir}/stats_testdir
11207 mkdir -p ${testdir} || error "mkdir failed"
11208 touch ${testdir}/${tfile} || error "touch failed"
11209 cancel_lru_locks mdc
11212 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11213 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11215 # extra mdt stats verification.
11216 chmod 444 ${testdir}/${tfile} || error "chmod failed"
11217 check_stats $SINGLEMDS "setattr" 1
11218 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11219 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
11221 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
11222 check_stats $SINGLEMDS "getattr" 1
11224 rm -rf $DIR/${tdir}
11226 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
11227 # so the check below is not reliable
11228 [ $MDSCOUNT -eq 1 ] || return 0
11230 # Sleep to avoid a cached response.
11231 #define OBD_STATFS_CACHE_SECONDS 1
11233 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11234 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11235 $LFS df || error "lfs failed"
11236 check_stats $SINGLEMDS "statfs" 1
11238 # check aggregated statfs (LU-10018)
11239 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
11241 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
11244 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11245 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11247 check_stats $SINGLEMDS "statfs" 1
11249 # We want to check that the client didn't send OST_STATFS to
11250 # ost1 but the MDT also uses OST_STATFS for precreate. So some
11251 # extra care is needed here.
11252 if remote_mds; then
11253 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
11254 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
11256 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
11257 [ "$res" ] && error "OST got STATFS"
11262 run_test 133b "Verifying extra MDT stats =================================="
11265 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11266 remote_ost_nodsh && skip "remote OST with nodsh"
11267 remote_mds_nodsh && skip "remote MDS with nodsh"
11269 local testdir=$DIR/$tdir/stats_testdir
11271 test_mkdir -p $testdir
11273 # verify obdfilter stats.
11274 $SETSTRIPE -c 1 -i 0 $testdir/$tfile
11276 cancel_lru_locks osc
11277 wait_delete_completed
11280 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11281 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11283 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
11286 cancel_lru_locks osc
11287 check_stats ost1 "write" 1
11289 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
11290 check_stats ost1 "read" 1
11292 > $testdir/$tfile || error "truncate failed"
11293 check_stats ost1 "punch" 1
11295 rm -f $testdir/$tfile || error "file remove failed"
11296 wait_delete_completed
11297 check_stats ost1 "destroy" 1
11301 run_test 133c "Verifying OST stats ========================================"
11308 while [ $value -ge 2 ]; do
11313 if [ $orig -gt $order ]; then
11321 local size=('K' 'M' 'G' 'T');
11323 local size_string=$value
11325 while [ $value -ge 1024 ]; do
11326 if [ $i -gt 3 ]; then
11327 #T is the biggest unit we get here, if that is bigger,
11329 size_string=${value}T
11332 value=$((value >> 10))
11333 if [ $value -lt 1024 ]; then
11334 size_string=${value}${size[$i]}
11343 get_rename_size() {
11345 local context=${2:-.}
11346 local sample=$(do_facet $SINGLEMDS $LCTL \
11347 get_param mdt.$FSNAME-MDT0000.rename_stats |
11348 grep -A1 $context |
11349 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
11354 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11355 remote_ost_nodsh && skip "remote OST with nodsh"
11356 remote_mds_nodsh && skip "remote MDS with nodsh"
11357 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11358 skip_env "MDS doesn't support rename stats"
11360 local testdir1=$DIR/${tdir}/stats_testdir1
11361 local testdir2=$DIR/${tdir}/stats_testdir2
11362 mkdir -p $DIR/${tdir}
11364 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11366 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
11367 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
11369 createmany -o $testdir1/test 512 || error "createmany failed"
11371 # check samedir rename size
11372 mv ${testdir1}/test0 ${testdir1}/test_0
11374 local testdir1_size=$(ls -l $DIR/${tdir} |
11375 awk '/stats_testdir1/ {print $5}')
11376 local testdir2_size=$(ls -l $DIR/${tdir} |
11377 awk '/stats_testdir2/ {print $5}')
11379 testdir1_size=$(order_2 $testdir1_size)
11380 testdir2_size=$(order_2 $testdir2_size)
11382 testdir1_size=$(size_in_KMGT $testdir1_size)
11383 testdir2_size=$(size_in_KMGT $testdir2_size)
11385 echo "source rename dir size: ${testdir1_size}"
11386 echo "target rename dir size: ${testdir2_size}"
11388 local cmd="do_facet $SINGLEMDS $LCTL "
11389 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
11391 eval $cmd || error "$cmd failed"
11392 local samedir=$($cmd | grep 'same_dir')
11393 local same_sample=$(get_rename_size $testdir1_size)
11394 [ -z "$samedir" ] && error "samedir_rename_size count error"
11395 [[ $same_sample -eq 1 ]] ||
11396 error "samedir_rename_size error $same_sample"
11397 echo "Check same dir rename stats success"
11399 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11401 # check crossdir rename size
11402 mv ${testdir1}/test_0 ${testdir2}/test_0
11404 testdir1_size=$(ls -l $DIR/${tdir} |
11405 awk '/stats_testdir1/ {print $5}')
11406 testdir2_size=$(ls -l $DIR/${tdir} |
11407 awk '/stats_testdir2/ {print $5}')
11409 testdir1_size=$(order_2 $testdir1_size)
11410 testdir2_size=$(order_2 $testdir2_size)
11412 testdir1_size=$(size_in_KMGT $testdir1_size)
11413 testdir2_size=$(size_in_KMGT $testdir2_size)
11415 echo "source rename dir size: ${testdir1_size}"
11416 echo "target rename dir size: ${testdir2_size}"
11418 eval $cmd || error "$cmd failed"
11419 local crossdir=$($cmd | grep 'crossdir')
11420 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
11421 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
11422 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
11423 [[ $src_sample -eq 1 ]] ||
11424 error "crossdir_rename_size error $src_sample"
11425 [[ $tgt_sample -eq 1 ]] ||
11426 error "crossdir_rename_size error $tgt_sample"
11427 echo "Check cross dir rename stats success"
11428 rm -rf $DIR/${tdir}
11430 run_test 133d "Verifying rename_stats ========================================"
11433 remote_mds_nodsh && skip "remote MDS with nodsh"
11434 remote_ost_nodsh && skip "remote OST with nodsh"
11435 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11437 local testdir=$DIR/${tdir}/stats_testdir
11438 local ctr f0 f1 bs=32768 count=42 sum
11440 mkdir -p ${testdir} || error "mkdir failed"
11442 $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
11444 for ctr in {write,read}_bytes; do
11446 cancel_lru_locks osc
11448 do_facet ost1 $LCTL set_param -n \
11449 "obdfilter.*.exports.clear=clear"
11451 if [ $ctr = write_bytes ]; then
11453 f1=${testdir}/${tfile}
11455 f0=${testdir}/${tfile}
11459 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
11462 cancel_lru_locks osc
11464 sum=$(do_facet ost1 $LCTL get_param \
11465 "obdfilter.*.exports.*.stats" |
11466 awk -v ctr=$ctr 'BEGIN { sum = 0 }
11467 $1 == ctr { sum += $7 }
11468 END { printf("%0.0f", sum) }')
11470 if ((sum != bs * count)); then
11471 error "Bad $ctr sum, expected $((bs * count)), got $sum"
11475 rm -rf $DIR/${tdir}
11477 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
11479 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
11481 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
11482 # not honor the -ignore_readdir_race option correctly. So we call
11483 # error_ignore() rather than error() in these cases. See LU-11152.
11485 if (find --version; do_facet mds1 find --version) |
11486 grep -q '\b4\.5\.1[1-4]\b'; then
11487 error_ignore LU-11152 "$@"
11494 # First without trusting modes.
11495 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
11496 echo "proc_dirs='$proc_dirs'"
11497 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
11498 find $proc_dirs -exec cat '{}' \; &> /dev/null
11500 # Second verifying readability.
11501 $LCTL get_param -R '*' &> /dev/null
11503 # Verifing writability with badarea_io.
11505 -ignore_readdir_race \
11507 -not -name force_lbug \
11508 -not -name changelog_mask \
11509 -exec badarea_io '{}' \; ||
11510 error_133 "find $proc_dirs failed"
11512 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
11515 remote_mds_nodsh && skip "remote MDS with nodsh"
11516 remote_ost_nodsh && skip "remote OST with nodsh"
11518 # eventually, this can also be replaced with "lctl get_param -R",
11519 # but not until that option is always available on the server
11521 for facet in mds1 ost1; do
11522 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
11523 skip_noexit "Too old lustre on $facet"
11524 local facet_proc_dirs=$(do_facet $facet \
11525 \\\ls -d $proc_regexp 2>/dev/null)
11526 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11527 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11528 do_facet $facet find $facet_proc_dirs \
11529 ! -name req_history \
11530 -exec cat '{}' \\\; &> /dev/null
11532 do_facet $facet find $facet_proc_dirs \
11533 ! -name req_history \
11535 -exec cat '{}' \\\; &> /dev/null ||
11536 error "proc file read failed"
11538 do_facet $facet find $facet_proc_dirs \
11539 -ignore_readdir_race \
11541 -not -name force_lbug \
11542 -not -name changelog_mask \
11543 -exec badarea_io '{}' \\\; ||
11544 error_133 "$facet find $facet_proc_dirs failed"
11547 # remount the FS in case writes/reads /proc break the FS
11548 cleanup || error "failed to unmount"
11549 setup || error "failed to setup"
11552 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
11555 remote_mds_nodsh && skip "remote MDS with nodsh"
11556 remote_ost_nodsh && skip "remote OST with nodsh"
11557 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
11558 skip "Need MDS version at least 2.9.54"
11562 for facet in client mds1 ost1; do
11563 local facet_proc_dirs=$(do_facet $facet \
11564 \\\ls -d $proc_regexp 2> /dev/null)
11565 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11566 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11567 # Get the list of files that are missing the terminating newline
11568 local missing=($(do_facet $facet \
11569 find ${facet_proc_dirs} -type f \| \
11570 while read F\; do \
11571 awk -v FS='\v' -v RS='\v\v' \
11572 "'END { if(NR>0 && \
11573 \\\$NF !~ /.*\\\n\$/) \
11574 print FILENAME}'" \
11577 [ ${#missing[*]} -eq 0 ] ||
11578 error "files do not end with newline: ${missing[*]}"
11581 run_test 133h "Proc files should end with newlines"
11584 remote_mds_nodsh && skip "remote MDS with nodsh"
11585 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11586 skip "Need MDS version at least 2.7.54"
11588 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11589 cancel_lru_locks mdc
11591 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
11592 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11593 [ $unused -eq 0 ] || error "$unused locks are not cleared"
11596 createmany -o $DIR/$tdir/f $nr ||
11597 error "failed to create $nr files in $DIR/$tdir"
11598 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11600 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
11601 do_facet mds1 $LCTL set_param fail_loc=0x327
11602 do_facet mds1 $LCTL set_param fail_val=500
11605 echo "sleep 10 seconds ..."
11607 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
11609 do_facet mds1 $LCTL set_param fail_loc=0
11610 do_facet mds1 $LCTL set_param fail_val=0
11611 [ $lck_cnt -lt $unused ] ||
11612 error "No locks reclaimed, before:$unused, after:$lck_cnt"
11615 unlinkmany $DIR/$tdir/f $nr
11617 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
11620 remote_mds_nodsh && skip "remote MDS with nodsh"
11621 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11622 skip "Need MDS version at least 2.7.54"
11624 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11625 cancel_lru_locks mdc
11627 local low_wm=$(do_facet mds1 $LCTL get_param -n \
11628 ldlm.lock_reclaim_threshold_mb)
11629 # disable reclaim temporarily
11630 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
11632 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
11633 do_facet mds1 $LCTL set_param fail_loc=0x328
11634 do_facet mds1 $LCTL set_param fail_val=500
11636 $LCTL set_param debug=+trace
11639 createmany -o $DIR/$tdir/f $nr &
11640 local create_pid=$!
11642 echo "Sleep $TIMEOUT seconds ..."
11644 if ! ps -p $create_pid > /dev/null 2>&1; then
11645 do_facet mds1 $LCTL set_param fail_loc=0
11646 do_facet mds1 $LCTL set_param fail_val=0
11647 do_facet mds1 $LCTL set_param \
11648 ldlm.lock_reclaim_threshold_mb=${low_wm}m
11649 error "createmany finished incorrectly!"
11651 do_facet mds1 $LCTL set_param fail_loc=0
11652 do_facet mds1 $LCTL set_param fail_val=0
11653 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
11654 wait $create_pid || return 1
11656 unlinkmany $DIR/$tdir/f $nr
11658 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
11660 test_140() { #bug-17379
11661 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11663 test_mkdir $DIR/$tdir
11664 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
11665 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
11667 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
11668 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
11670 while i=$((i + 1)); do
11672 cd $i || error "Changing to $i"
11673 ln -s ../stat stat || error "Creating stat symlink"
11674 # Read the symlink until ELOOP present,
11675 # not LBUGing the system is considered success,
11676 # we didn't overrun the stack.
11677 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
11678 if [ $ret -ne 0 ]; then
11679 if [ $ret -eq 40 ]; then
11682 error "Open stat symlink"
11688 echo "The symlink depth = $i"
11689 [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] ||
11690 error "Invalid symlink depth"
11692 # Test recursive symlink
11693 ln -s symlink_self symlink_self
11694 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
11695 echo "open symlink_self returns $ret"
11696 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
11698 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
11701 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11703 local TF="$TMP/$tfile"
11705 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
11707 cancel_lru_locks $OSC
11708 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
11709 remount_client $MOUNT
11711 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
11714 $TRUNCATE $DIR/$tfile 6000
11715 cancel_lru_locks $OSC
11716 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
11719 echo "12345" >>$DIR/$tfile
11720 cancel_lru_locks $OSC
11721 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
11724 echo "12345" >>$DIR/$tfile
11725 cancel_lru_locks $OSC
11726 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
11731 run_test 150 "truncate/append tests"
11733 #LU-2902 roc_hit was not able to read all values from lproc
11734 function roc_hit_init() {
11735 local list=$(comma_list $(osts_nodes))
11736 local dir=$DIR/$tdir-check
11737 local file=$dir/$tfile
11743 #use setstripe to do a write to every ost
11744 for i in $(seq 0 $((OSTCOUNT-1))); do
11745 $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
11746 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
11747 idx=$(printf %04x $i)
11748 BEFORE=$(get_osd_param $list *OST*$idx stats |
11749 awk '$1 == "cache_access" {sum += $7}
11750 END { printf("%0.0f", sum) }')
11752 cancel_lru_locks osc
11753 cat $file >/dev/null
11755 AFTER=$(get_osd_param $list *OST*$idx stats |
11756 awk '$1 == "cache_access" {sum += $7}
11757 END { printf("%0.0f", sum) }')
11759 echo BEFORE:$BEFORE AFTER:$AFTER
11760 if ! let "AFTER - BEFORE == 4"; then
11762 error "roc_hit is not safe to use"
11770 function roc_hit() {
11771 local list=$(comma_list $(osts_nodes))
11772 echo $(get_osd_param $list '' stats |
11773 awk '$1 == "cache_hit" {sum += $7}
11774 END { printf("%0.0f", sum) }')
11777 function set_cache() {
11780 if [ "$2" == "off" ]; then
11783 local list=$(comma_list $(osts_nodes))
11784 set_osd_param $list '' $1_cache_enable $on
11786 cancel_lru_locks osc
11790 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11791 remote_ost_nodsh && skip "remote OST with nodsh"
11794 local list=$(comma_list $(osts_nodes))
11796 # check whether obdfilter is cache capable at all
11797 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
11798 skip "not cache-capable obdfilter"
11801 # check cache is enabled on all obdfilters
11802 if get_osd_param $list '' read_cache_enable | grep 0; then
11803 skip "oss cache is disabled"
11806 set_osd_param $list '' writethrough_cache_enable 1
11808 # check write cache is enabled on all obdfilters
11809 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
11810 skip "oss write cache is NOT enabled"
11815 #define OBD_FAIL_OBD_NO_LRU 0x609
11816 do_nodes $list $LCTL set_param fail_loc=0x609
11818 # pages should be in the case right after write
11819 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
11822 local BEFORE=$(roc_hit)
11823 cancel_lru_locks osc
11824 cat $DIR/$tfile >/dev/null
11825 local AFTER=$(roc_hit)
11827 do_nodes $list $LCTL set_param fail_loc=0
11829 if ! let "AFTER - BEFORE == CPAGES"; then
11830 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
11833 # the following read invalidates the cache
11834 cancel_lru_locks osc
11835 set_osd_param $list '' read_cache_enable 0
11836 cat $DIR/$tfile >/dev/null
11838 # now data shouldn't be found in the cache
11840 cancel_lru_locks osc
11841 cat $DIR/$tfile >/dev/null
11843 if let "AFTER - BEFORE != 0"; then
11844 error "IN CACHE: before: $BEFORE, after: $AFTER"
11847 set_osd_param $list '' read_cache_enable 1
11850 run_test 151 "test cache on oss and controls ==============================="
11853 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11855 local TF="$TMP/$tfile"
11857 # simulate ENOMEM during write
11858 #define OBD_FAIL_OST_NOMEM 0x226
11859 lctl set_param fail_loc=0x80000226
11860 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
11862 sync || error "sync failed"
11863 lctl set_param fail_loc=0
11865 # discard client's cache
11866 cancel_lru_locks osc
11868 # simulate ENOMEM during read
11869 lctl set_param fail_loc=0x80000226
11870 cmp $TF $DIR/$tfile || error "cmp failed"
11871 lctl set_param fail_loc=0
11875 run_test 152 "test read/write with enomem ============================"
11878 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
11880 run_test 153 "test if fdatasync does not crash ======================="
11882 dot_lustre_fid_permission_check() {
11884 local ffid=$MOUNT/.lustre/fid/$fid
11887 echo "stat fid $fid"
11888 stat $ffid > /dev/null || error "stat $ffid failed."
11889 echo "touch fid $fid"
11890 touch $ffid || error "touch $ffid failed."
11891 echo "write to fid $fid"
11892 cat /etc/hosts > $ffid || error "write $ffid failed."
11893 echo "read fid $fid"
11894 diff /etc/hosts $ffid || error "read $ffid failed."
11895 echo "append write to fid $fid"
11896 cat /etc/hosts >> $ffid || error "append write $ffid failed."
11897 echo "rename fid $fid"
11898 mv $ffid $test_dir/$tfile.1 &&
11899 error "rename $ffid to $tfile.1 should fail."
11900 touch $test_dir/$tfile.1
11901 mv $test_dir/$tfile.1 $ffid &&
11902 error "rename $tfile.1 to $ffid should fail."
11903 rm -f $test_dir/$tfile.1
11904 echo "truncate fid $fid"
11905 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
11906 echo "link fid $fid"
11907 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
11908 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
11909 echo "setfacl fid $fid"
11910 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
11911 echo "getfacl fid $fid"
11912 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
11914 echo "unlink fid $fid"
11915 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
11916 echo "mknod fid $fid"
11917 mknod $ffid c 1 3 && error "mknod $ffid should fail."
11919 fid=[0xf00000400:0x1:0x0]
11920 ffid=$MOUNT/.lustre/fid/$fid
11922 echo "stat non-exist fid $fid"
11923 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
11924 echo "write to non-exist fid $fid"
11925 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
11926 echo "link new fid $fid"
11927 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
11929 mkdir -p $test_dir/$tdir
11930 touch $test_dir/$tdir/$tfile
11931 fid=$($LFS path2fid $test_dir/$tdir)
11934 error "error: could not get fid for $test_dir/$dir/$tfile."
11936 ffid=$MOUNT/.lustre/fid/$fid
11939 ls $ffid > /dev/null || error "ls $ffid failed."
11940 echo "touch $fid/$tfile.1"
11941 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
11943 echo "touch $MOUNT/.lustre/fid/$tfile"
11944 touch $MOUNT/.lustre/fid/$tfile && \
11945 error "touch $MOUNT/.lustre/fid/$tfile should fail."
11947 echo "setxattr to $MOUNT/.lustre/fid"
11948 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
11950 echo "listxattr for $MOUNT/.lustre/fid"
11951 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
11953 echo "delxattr from $MOUNT/.lustre/fid"
11954 setfattr -x trusted.name1 $MOUNT/.lustre/fid
11956 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
11957 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
11958 error "touch invalid fid should fail."
11960 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
11961 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
11962 error "touch non-normal fid should fail."
11964 echo "rename $tdir to $MOUNT/.lustre/fid"
11965 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
11966 error "rename to $MOUNT/.lustre/fid should fail."
11968 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
11970 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
11971 local new_obf_mode=777
11973 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
11974 chmod $new_obf_mode $DIR/.lustre/fid ||
11975 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
11977 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
11978 [ $obf_mode -eq $new_obf_mode ] ||
11979 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
11981 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
11982 chmod $old_obf_mode $DIR/.lustre/fid ||
11983 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
11986 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
11987 fid=$($LFS path2fid $test_dir/$tfile-2)
11989 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
11991 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
11992 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
11993 error "create lov data thru .lustre failed"
11995 echo "cp /etc/passwd $test_dir/$tfile-2"
11996 cp /etc/passwd $test_dir/$tfile-2 ||
11997 error "copy to $test_dir/$tfile-2 failed."
11998 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
11999 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12000 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12002 rm -rf $test_dir/tfile.lnk
12003 rm -rf $test_dir/$tfile-2
12007 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12008 skip "Need MDS version at least 2.4.1"
12010 local tf=$DIR/$tfile
12013 local fid=$($LFS path2fid $tf)
12014 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12016 # check that we get the same pathname back
12017 local found=$($LFS fid2path $MOUNT "$fid")
12018 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12019 [ "$found" == "$tf" ] ||
12020 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12022 run_test 154A "lfs path2fid and fid2path basic checks"
12025 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12026 skip "Need MDS version at least 2.4.1"
12028 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12029 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12030 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12031 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12033 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12034 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12036 # check that we get the same pathname
12037 echo "PFID: $PFID, name: $name"
12038 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12039 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12040 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12041 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12043 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12045 run_test 154B "verify the ll_decode_linkea tool"
12048 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12049 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12050 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12051 skip "Need MDS version at least 2.2.51"
12052 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12054 cp /etc/hosts $DIR/$tfile
12056 fid=$($LFS path2fid $DIR/$tfile)
12058 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12060 dot_lustre_fid_permission_check "$fid" $DIR ||
12061 error "dot lustre permission check $fid failed"
12063 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12065 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12067 touch $MOUNT/.lustre/file &&
12068 error "creation is not allowed under .lustre"
12070 mkdir $MOUNT/.lustre/dir &&
12071 error "mkdir is not allowed under .lustre"
12075 run_test 154a "Open-by-FID"
12078 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12079 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12080 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12081 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12082 skip "Need MDS version at least 2.2.51"
12084 local remote_dir=$DIR/$tdir/remote_dir
12088 mkdir -p $DIR/$tdir
12089 $LFS mkdir -i $MDTIDX $remote_dir ||
12090 error "create remote directory failed"
12092 cp /etc/hosts $remote_dir/$tfile
12094 fid=$($LFS path2fid $remote_dir/$tfile)
12096 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12098 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12099 error "dot lustre permission check $fid failed"
12102 run_test 154b "Open-by-FID for remote directory"
12105 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12106 skip "Need MDS version at least 2.4.1"
12108 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12109 local FID1=$($LFS path2fid $DIR/$tfile.1)
12110 local FID2=$($LFS path2fid $DIR/$tfile.2)
12111 local FID3=$($LFS path2fid $DIR/$tfile.3)
12114 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12115 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12116 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12118 [ "$FID" = "${!want}" ] ||
12119 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12123 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12125 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12126 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12130 run_test 154c "lfs path2fid and fid2path multiple arguments"
12133 remote_mds_nodsh && skip "remote MDS with nodsh"
12134 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12135 skip "Need MDS version at least 2.5.53"
12137 if remote_mds; then
12138 nid=$($LCTL list_nids | sed "s/\./\\\./g")
12142 local proc_ofile="mdt.*.exports.'$nid'.open_files"
12149 local fid=$($LFS path2fid $DIR/$tfile)
12152 cmd="exec $fd<$DIR/$tfile"
12154 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
12155 echo "$fid_list" | grep "$fid"
12158 cmd="exec $fd>/dev/null"
12160 if [ $rc -ne 0 ]; then
12161 error "FID $fid not found in open files list $fid_list"
12164 run_test 154d "Verify open file fid"
12168 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
12169 skip "Need MDS version at least 2.6.50"
12171 if ls -a $MOUNT | grep -q '^\.lustre$'; then
12172 error ".lustre returned by readdir"
12175 run_test 154e ".lustre is not returned by readdir"
12178 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12180 # create parent directory on a single MDT to avoid cross-MDT hardlinks
12181 test_mkdir -p -c1 $DIR/$tdir/d
12182 # test dirs inherit from its stripe
12183 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
12184 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
12185 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
12186 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
12189 # get fid of parents
12190 local FID0=$($LFS path2fid $DIR/$tdir/d)
12191 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
12192 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
12193 local FID3=$($LFS path2fid $DIR)
12195 # check that path2fid --parents returns expected <parent_fid>/name
12196 # 1) test for a directory (single parent)
12197 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
12198 [ "$parent" == "$FID0/foo1" ] ||
12199 error "expected parent: $FID0/foo1, got: $parent"
12201 # 2) test for a file with nlink > 1 (multiple parents)
12202 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
12203 echo "$parent" | grep -F "$FID1/$tfile" ||
12204 error "$FID1/$tfile not returned in parent list"
12205 echo "$parent" | grep -F "$FID2/link" ||
12206 error "$FID2/link not returned in parent list"
12208 # 3) get parent by fid
12209 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
12210 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12211 echo "$parent" | grep -F "$FID1/$tfile" ||
12212 error "$FID1/$tfile not returned in parent list (by fid)"
12213 echo "$parent" | grep -F "$FID2/link" ||
12214 error "$FID2/link not returned in parent list (by fid)"
12216 # 4) test for entry in root directory
12217 parent=$($LFS path2fid --parents $DIR/f)
12218 echo "$parent" | grep -F "$FID3/f" ||
12219 error "$FID3/f not returned in parent list"
12221 # 5) test it on root directory
12222 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
12223 error "$MOUNT should not have parents"
12225 # enable xattr caching and check that linkea is correctly updated
12226 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
12227 save_lustre_params client "llite.*.xattr_cache" > $save
12228 lctl set_param llite.*.xattr_cache 1
12230 # 6.1) linkea update on rename
12231 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
12233 # get parents by fid
12234 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12235 # foo1 should no longer be returned in parent list
12236 echo "$parent" | grep -F "$FID1" &&
12237 error "$FID1 should no longer be in parent list"
12238 # the new path should appear
12239 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
12240 error "$FID2/$tfile.moved is not in parent list"
12242 # 6.2) linkea update on unlink
12243 rm -f $DIR/$tdir/d/foo2/link
12244 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12245 # foo2/link should no longer be returned in parent list
12246 echo "$parent" | grep -F "$FID2/link" &&
12247 error "$FID2/link should no longer be in parent list"
12251 restore_lustre_params < $save
12254 run_test 154f "get parent fids by reading link ea"
12258 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12259 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
12260 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
12261 skip "Need MDS version at least 2.6.92"
12263 mkdir -p $DIR/$tdir
12264 llapi_fid_test -d $DIR/$tdir
12266 run_test 154g "various llapi FID tests"
12268 test_155_small_load() {
12269 local temp=$TMP/$tfile
12270 local file=$DIR/$tfile
12272 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
12273 error "dd of=$temp bs=6096 count=1 failed"
12275 cancel_lru_locks $OSC
12276 cmp $temp $file || error "$temp $file differ"
12278 $TRUNCATE $temp 6000
12279 $TRUNCATE $file 6000
12280 cmp $temp $file || error "$temp $file differ (truncate1)"
12282 echo "12345" >>$temp
12283 echo "12345" >>$file
12284 cmp $temp $file || error "$temp $file differ (append1)"
12286 echo "12345" >>$temp
12287 echo "12345" >>$file
12288 cmp $temp $file || error "$temp $file differ (append2)"
12294 test_155_big_load() {
12295 remote_ost_nodsh && skip "remote OST with nodsh"
12297 local temp=$TMP/$tfile
12298 local file=$DIR/$tfile
12301 local cache_size=$(do_facet ost$((MAXI+1)) \
12302 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
12303 local large_file_size=$((cache_size * 2))
12305 echo "OSS cache size: $cache_size KB"
12306 echo "Large file size: $large_file_size KB"
12308 [ $MAXV -le $large_file_size ] &&
12309 skip_env "max available OST size needs > $large_file_size KB"
12311 $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed"
12313 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
12314 error "dd of=$temp bs=$large_file_size count=1k failed"
12317 cancel_lru_locks osc
12318 cmp $temp $file || error "$temp $file differ"
12324 save_writethrough() {
12325 local facets=$(get_facets OST)
12327 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
12331 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12333 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12335 save_writethrough $p
12338 set_cache writethrough on
12339 test_155_small_load
12340 restore_lustre_params < $p
12343 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
12346 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12348 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12350 save_writethrough $p
12353 set_cache writethrough off
12354 test_155_small_load
12355 restore_lustre_params < $p
12358 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
12361 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12363 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12365 save_writethrough $p
12368 set_cache writethrough on
12369 test_155_small_load
12370 restore_lustre_params < $p
12373 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
12376 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12378 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12380 save_writethrough $p
12383 set_cache writethrough off
12384 test_155_small_load
12385 restore_lustre_params < $p
12388 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
12391 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12393 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12395 save_writethrough $p
12398 set_cache writethrough on
12400 restore_lustre_params < $p
12403 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
12406 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12408 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12410 save_writethrough $p
12413 set_cache writethrough off
12415 restore_lustre_params < $p
12418 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
12421 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12423 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12425 save_writethrough $p
12428 set_cache writethrough on
12430 restore_lustre_params < $p
12433 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
12436 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12438 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12440 save_writethrough $p
12443 set_cache writethrough off
12445 restore_lustre_params < $p
12448 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
12451 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12452 remote_ost_nodsh && skip "remote OST with nodsh"
12453 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
12454 skip "stats not implemented on old servers"
12455 [ "$ost1_FSTYPE" = "zfs" ] &&
12456 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
12461 local file="$DIR/$tfile"
12462 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12464 save_writethrough $p
12467 log "Turn on read and write cache"
12469 set_cache writethrough on
12471 log "Write data and read it back."
12472 log "Read should be satisfied from the cache."
12473 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12475 cancel_lru_locks osc
12476 cat $file >/dev/null
12478 if ! let "AFTER - BEFORE == CPAGES"; then
12479 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12481 log "cache hits:: before: $BEFORE, after: $AFTER"
12484 log "Read again; it should be satisfied from the cache."
12486 cancel_lru_locks osc
12487 cat $file >/dev/null
12489 if ! let "AFTER - BEFORE == CPAGES"; then
12490 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12492 log "cache hits:: before: $BEFORE, after: $AFTER"
12495 log "Turn off the read cache and turn on the write cache"
12497 set_cache writethrough on
12499 log "Read again; it should be satisfied from the cache."
12501 cancel_lru_locks osc
12502 cat $file >/dev/null
12504 if ! let "AFTER - BEFORE == CPAGES"; then
12505 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12507 log "cache hits:: before: $BEFORE, after: $AFTER"
12510 log "Read again; it should not be satisfied from the cache."
12512 cancel_lru_locks osc
12513 cat $file >/dev/null
12515 if ! let "AFTER - BEFORE == 0"; then
12516 error "IN CACHE: before: $BEFORE, after: $AFTER"
12518 log "cache hits:: before: $BEFORE, after: $AFTER"
12521 log "Write data and read it back."
12522 log "Read should be satisfied from the cache."
12523 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12525 cancel_lru_locks osc
12526 cat $file >/dev/null
12528 if ! let "AFTER - BEFORE == CPAGES"; then
12529 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12531 log "cache hits:: before: $BEFORE, after: $AFTER"
12534 log "Read again; it should not be satisfied from the cache."
12536 cancel_lru_locks osc
12537 cat $file >/dev/null
12539 if ! let "AFTER - BEFORE == 0"; then
12540 error "IN CACHE: before: $BEFORE, after: $AFTER"
12542 log "cache hits:: before: $BEFORE, after: $AFTER"
12545 log "Turn off read and write cache"
12547 set_cache writethrough off
12549 log "Write data and read it back"
12550 log "It should not be satisfied from the cache."
12552 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12553 cancel_lru_locks osc
12555 cat $file >/dev/null
12557 if ! let "AFTER - BEFORE == 0"; then
12558 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12560 log "cache hits:: before: $BEFORE, after: $AFTER"
12563 log "Turn on the read cache and turn off the write cache"
12565 set_cache writethrough off
12567 log "Write data and read it back"
12568 log "It should not be satisfied from the cache."
12570 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12572 cancel_lru_locks osc
12573 cat $file >/dev/null
12575 if ! let "AFTER - BEFORE == 0"; then
12576 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12578 log "cache hits:: before: $BEFORE, after: $AFTER"
12581 log "Read again; it should be satisfied from the cache."
12583 cancel_lru_locks osc
12584 cat $file >/dev/null
12586 if ! let "AFTER - BEFORE == CPAGES"; then
12587 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12589 log "cache hits:: before: $BEFORE, after: $AFTER"
12592 restore_lustre_params < $p
12595 run_test 156 "Verification of tunables"
12598 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12599 remote_mds_nodsh && skip "remote MDS with nodsh"
12600 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
12601 skip "Need MDS version at least 2.2.0"
12603 changelog_register || error "changelog_register failed"
12604 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
12605 changelog_users $SINGLEMDS | grep -q $cl_user ||
12606 error "User $cl_user not found in changelog_users"
12609 test_mkdir -p $DIR/$tdir/pics/2008/zachy
12610 changelog_clear 0 || error "changelog_clear failed"
12611 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
12612 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
12613 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
12614 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
12615 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
12616 rm $DIR/$tdir/pics/desktop.jpg
12618 changelog_dump | tail -10
12620 echo "verifying changelog mask"
12621 changelog_chmask "-MKDIR"
12622 changelog_chmask "-CLOSE"
12624 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
12625 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
12627 changelog_chmask "+MKDIR"
12628 changelog_chmask "+CLOSE"
12630 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
12631 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
12633 changelog_dump | tail -10
12634 MKDIRS=$(changelog_dump | grep -c "MKDIR")
12635 CLOSES=$(changelog_dump | grep -c "CLOSE")
12636 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
12637 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
12640 echo "verifying target fid"
12641 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
12642 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
12643 [ "$fidc" == "$fidf" ] ||
12644 error "changelog '$tfile' fid $fidc != file fid $fidf"
12645 echo "verifying parent fid"
12646 # The FID returned from the Changelog may be the directory shard on
12647 # a different MDT, and not the FID returned by path2fid on the parent.
12648 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
12649 # since this is what will matter when recreating this file in the tree.
12650 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
12651 local pathp=$($LFS fid2path $MOUNT "$fidp")
12652 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
12653 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
12655 echo "getting records for $cl_user"
12656 changelog_users $SINGLEMDS
12657 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
12659 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
12660 error "changelog_clear failed"
12661 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
12662 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
12663 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
12664 error "user index expect $user_rec1 + $nclr != $user_rec2"
12666 local min0_rec=$(changelog_users $SINGLEMDS |
12667 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
12668 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
12669 awk '{ print $1; exit; }')
12671 changelog_dump | tail -n 5
12672 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
12673 [ $first_rec == $((min0_rec + 1)) ] ||
12674 error "first index should be $min0_rec + 1 not $first_rec"
12676 # LU-3446 changelog index reset on MDT restart
12677 local cur_rec1=$(changelog_users $SINGLEMDS |
12678 awk '/^current.index:/ { print $NF }')
12679 changelog_clear 0 ||
12680 error "clear all changelog records for $cl_user failed"
12681 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
12682 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
12683 error "Fail to start $SINGLEMDS"
12684 local cur_rec2=$(changelog_users $SINGLEMDS |
12685 awk '/^current.index:/ { print $NF }')
12686 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
12687 [ $cur_rec1 == $cur_rec2 ] ||
12688 error "current index should be $cur_rec1 not $cur_rec2"
12690 echo "verifying users from this test are deregistered"
12691 changelog_deregister || error "changelog_deregister failed"
12692 changelog_users $SINGLEMDS | grep -q $cl_user &&
12693 error "User '$cl_user' still in changelog_users"
12695 # lctl get_param -n mdd.*.changelog_users
12696 # current index: 144
12697 # ID index (idle seconds)
12699 if ! changelog_users $SINGLEMDS | grep "^cl"; then
12700 # this is the normal case where all users were deregistered
12701 # make sure no new records are added when no users are present
12702 local last_rec1=$(changelog_users $SINGLEMDS |
12703 awk '/^current.index:/ { print $NF }')
12704 touch $DIR/$tdir/chloe
12705 local last_rec2=$(changelog_users $SINGLEMDS |
12706 awk '/^current.index:/ { print $NF }')
12707 echo "verify changelogs are off: $last_rec1 == $last_rec2"
12708 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
12710 # any changelog users must be leftovers from a previous test
12711 changelog_users $SINGLEMDS
12712 echo "other changelog users; can't verify off"
12715 run_test 160a "changelog sanity"
12717 test_160b() { # LU-3587
12718 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12719 remote_mds_nodsh && skip "remote MDS with nodsh"
12720 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
12721 skip "Need MDS version at least 2.2.0"
12723 changelog_register || error "changelog_register failed"
12724 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
12725 changelog_users $SINGLEMDS | grep -q $cl_user ||
12726 error "User '$cl_user' not found in changelog_users"
12728 local longname1=$(str_repeat a 255)
12729 local longname2=$(str_repeat b 255)
12732 echo "creating very long named file"
12733 touch $longname1 || error "create of '$longname1' failed"
12734 echo "renaming very long named file"
12735 mv $longname1 $longname2
12737 changelog_dump | grep RENME | tail -n 5
12740 run_test 160b "Verify that very long rename doesn't crash in changelog"
12743 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12744 remote_mds_nodsh && skip "remote MDS with nodsh"
12746 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
12747 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
12748 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
12749 skip "Need MDS version at least 2.5.58 or 2.5.2+"
12753 # Registration step
12754 changelog_register || error "changelog_register failed"
12757 mkdir -p $DIR/$tdir
12758 $MCREATE $DIR/$tdir/foo_160c
12759 changelog_chmask "-TRUNC"
12760 $TRUNCATE $DIR/$tdir/foo_160c 200
12761 changelog_chmask "+TRUNC"
12762 $TRUNCATE $DIR/$tdir/foo_160c 199
12763 changelog_dump | tail -n 5
12764 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
12765 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
12767 run_test 160c "verify that changelog log catch the truncate event"
12770 remote_mds_nodsh && skip "remote MDS with nodsh"
12771 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12772 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12773 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
12774 skip "Need MDS version at least 2.7.60"
12776 # Registration step
12777 changelog_register || error "changelog_register failed"
12779 mkdir -p $DIR/$tdir/migrate_dir
12780 changelog_clear 0 || error "changelog_clear failed"
12782 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
12783 changelog_dump | tail -n 5
12784 local migrates=$(changelog_dump | grep -c "MIGRT")
12785 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
12787 run_test 160d "verify that changelog log catch the migrate event"
12790 remote_mds_nodsh && skip "remote MDS with nodsh"
12793 changelog_register || error "changelog_register failed"
12795 # Delete a future user (expect fail)
12796 local MDT0=$(facet_svc $SINGLEMDS)
12797 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
12800 if [ $rc -eq 0 ]; then
12801 error "Deleted non-existant user cl77"
12802 elif [ $rc -ne 2 ]; then
12803 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
12806 # Clear to a bad index (1 billion should be safe)
12807 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
12810 if [ $rc -eq 0 ]; then
12811 error "Successfully cleared to invalid CL index"
12812 elif [ $rc -ne 22 ]; then
12813 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
12816 run_test 160e "changelog negative testing (should return errors)"
12819 remote_mds_nodsh && skip "remote MDS with nodsh" && return
12820 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
12821 skip "Need MDS version at least 2.10.56"
12823 local mdts=$(comma_list $(mdts_nodes))
12826 changelog_register || error "first changelog_register failed"
12827 changelog_register || error "second changelog_register failed"
12829 declare -A cl_user1
12830 declare -A cl_user2
12835 # generate some changelog records to accumulate on each MDT
12836 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
12837 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
12838 error "create $DIR/$tdir/$tfile failed"
12840 # check changelogs have been generated
12841 local nbcl=$(changelog_dump | wc -l)
12842 [[ $nbcl -eq 0 ]] && error "no changelogs found"
12844 for param in "changelog_max_idle_time=10" \
12846 "changelog_min_gc_interval=2" \
12847 "changelog_min_free_cat_entries=3"; do
12848 local MDT0=$(facet_svc $SINGLEMDS)
12849 local var="${param%=*}"
12850 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
12852 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
12853 do_nodes $mdts $LCTL set_param mdd.*.$param
12856 # force cl_user2 to be idle (1st part)
12859 # simulate changelog catalog almost full
12860 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
12861 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
12863 for i in $(seq $MDSCOUNT); do
12864 cl_users=(${CL_USERS[mds$i]})
12865 cl_user1[mds$i]="${cl_users[0]}"
12866 cl_user2[mds$i]="${cl_users[1]}"
12868 [ -n "${cl_user1[mds$i]}" ] ||
12869 error "mds$i: no user registered"
12870 [ -n "${cl_user2[mds$i]}" ] ||
12871 error "mds$i: only ${cl_user2[mds$i]} is registered"
12873 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
12874 [ -n "$user_rec1" ] ||
12875 error "mds$i: User ${cl_user1[mds$i]} not registered"
12876 __changelog_clear mds$i ${cl_user1[mds$i]} +2
12877 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
12878 [ -n "$user_rec2" ] ||
12879 error "mds$i: User ${cl_user1[mds$i]} not registered"
12880 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
12881 "$user_rec1 + 2 == $user_rec2"
12882 [ $((user_rec1 + 2)) == $user_rec2 ] ||
12883 error "mds$i: user ${cl_user1[mds$i]} index expected " \
12884 "$user_rec1 + 2, but is $user_rec2"
12885 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
12886 [ -n "$user_rec2" ] ||
12887 error "mds$i: User ${cl_user2[mds$i]} not registered"
12888 [ $user_rec1 == $user_rec2 ] ||
12889 error "mds$i: user ${cl_user2[mds$i]} index expected " \
12890 "$user_rec1, but is $user_rec2"
12893 # force cl_user2 to be idle (2nd part) and to reach
12894 # changelog_max_idle_time
12897 # generate one more changelog to trigger fail_loc
12898 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
12899 error "create $DIR/$tdir/${tfile}bis failed"
12901 # ensure gc thread is done
12902 for i in $(mdts_nodes); do
12904 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
12905 error "$i: GC-thread not done"
12909 for i in $(seq $MDSCOUNT); do
12910 # check cl_user1 still registered
12911 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
12912 error "mds$i: User ${cl_user1[mds$i]} not registered"
12913 # check cl_user2 unregistered
12914 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
12915 error "mds$i: User ${cl_user2[mds$i]} still registered"
12917 # check changelogs are present and starting at $user_rec1 + 1
12918 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
12919 [ -n "$user_rec1" ] ||
12920 error "mds$i: User ${cl_user1[mds$i]} not registered"
12921 first_rec=$($LFS changelog $(facet_svc mds$i) |
12922 awk '{ print $1; exit; }')
12924 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
12925 [ $((user_rec1 + 1)) == $first_rec ] ||
12926 error "mds$i: first index should be $user_rec1 + 1, " \
12927 "but is $first_rec"
12930 run_test 160f "changelog garbage collect (timestamped users)"
12933 remote_mds_nodsh && skip "remote MDS with nodsh"
12934 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
12935 skip "Need MDS version at least 2.10.56"
12937 local mdts=$(comma_list $(mdts_nodes))
12939 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
12940 do_nodes $mdts $LCTL set_param fail_loc=0x1314
12943 changelog_register || error "first changelog_register failed"
12944 changelog_register || error "second changelog_register failed"
12946 declare -A cl_user1
12947 declare -A cl_user2
12952 # generate some changelog records to accumulate on each MDT
12953 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
12954 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
12955 error "create $DIR/$tdir/$tfile failed"
12957 # check changelogs have been generated
12958 local nbcl=$(changelog_dump | wc -l)
12959 [[ $nbcl -eq 0 ]] && error "no changelogs found"
12961 # reduce the max_idle_indexes value to make sure we exceed it
12962 max_ndx=$((nbcl / 2 - 1))
12964 for param in "changelog_max_idle_indexes=$max_ndx" \
12966 "changelog_min_gc_interval=2" \
12967 "changelog_min_free_cat_entries=3"; do
12968 local MDT0=$(facet_svc $SINGLEMDS)
12969 local var="${param%=*}"
12970 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
12972 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
12973 do_nodes $mdts $LCTL set_param mdd.*.$param ||
12974 error "unable to set mdd.*.$param"
12977 # simulate changelog catalog almost full
12978 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
12979 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
12981 for i in $(seq $MDSCOUNT); do
12982 cl_users=(${CL_USERS[mds$i]})
12983 cl_user1[mds$i]="${cl_users[0]}"
12984 cl_user2[mds$i]="${cl_users[1]}"
12986 [ -n "${cl_user1[mds$i]}" ] ||
12987 error "mds$i: no user registered"
12988 [ -n "${cl_user2[mds$i]}" ] ||
12989 error "mds$i: only ${cl_user1[mds$i]} is registered"
12991 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
12992 [ -n "$user_rec1" ] ||
12993 error "mds$i: User ${cl_user1[mds$i]} not registered"
12994 __changelog_clear mds$i ${cl_user1[mds$i]} +2
12995 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
12996 [ -n "$user_rec2" ] ||
12997 error "mds$i: User ${cl_user1[mds$i]} not registered"
12998 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
12999 "$user_rec1 + 2 == $user_rec2"
13000 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13001 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13002 "$user_rec1 + 2, but is $user_rec2"
13003 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13004 [ -n "$user_rec2" ] ||
13005 error "mds$i: User ${cl_user2[mds$i]} not registered"
13006 [ $user_rec1 == $user_rec2 ] ||
13007 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13008 "$user_rec1, but is $user_rec2"
13011 # ensure we are past the previous changelog_min_gc_interval set above
13014 # generate one more changelog to trigger fail_loc
13015 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13016 error "create $DIR/$tdir/${tfile}bis failed"
13018 # ensure gc thread is done
13019 for i in $(mdts_nodes); do
13021 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13022 error "$i: GC-thread not done"
13026 for i in $(seq $MDSCOUNT); do
13027 # check cl_user1 still registered
13028 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13029 error "mds$i: User ${cl_user1[mds$i]} not registered"
13030 # check cl_user2 unregistered
13031 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13032 error "mds$i: User ${cl_user2[mds$i]} still registered"
13034 # check changelogs are present and starting at $user_rec1 + 1
13035 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13036 [ -n "$user_rec1" ] ||
13037 error "mds$i: User ${cl_user1[mds$i]} not registered"
13038 first_rec=$($LFS changelog $(facet_svc mds$i) |
13039 awk '{ print $1; exit; }')
13041 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13042 [ $((user_rec1 + 1)) == $first_rec ] ||
13043 error "mds$i: first index should be $user_rec1 + 1, " \
13044 "but is $first_rec"
13047 run_test 160g "changelog garbage collect (old users)"
13050 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13051 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13052 skip "Need MDS version at least 2.10.56"
13054 local mdts=$(comma_list $(mdts_nodes))
13057 changelog_register || error "first changelog_register failed"
13058 changelog_register || error "second changelog_register failed"
13060 declare -A cl_user1
13061 declare -A cl_user2
13066 # generate some changelog records to accumulate on each MDT
13067 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13068 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13069 error "create $DIR/$tdir/$tfile failed"
13071 # check changelogs have been generated
13072 local nbcl=$(changelog_dump | wc -l)
13073 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13075 for param in "changelog_max_idle_time=10" \
13077 "changelog_min_gc_interval=2"; do
13078 local MDT0=$(facet_svc $SINGLEMDS)
13079 local var="${param%=*}"
13080 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13082 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13083 do_nodes $mdts $LCTL set_param mdd.*.$param
13086 # force cl_user2 to be idle (1st part)
13089 for i in $(seq $MDSCOUNT); do
13090 cl_users=(${CL_USERS[mds$i]})
13091 cl_user1[mds$i]="${cl_users[0]}"
13092 cl_user2[mds$i]="${cl_users[1]}"
13094 [ -n "${cl_user1[mds$i]}" ] ||
13095 error "mds$i: no user registered"
13096 [ -n "${cl_user2[mds$i]}" ] ||
13097 error "mds$i: only ${cl_user2[mds$i]} is registered"
13099 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13100 [ -n "$user_rec1" ] ||
13101 error "mds$i: User ${cl_user1[mds$i]} not registered"
13102 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13103 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13104 [ -n "$user_rec2" ] ||
13105 error "mds$i: User ${cl_user1[mds$i]} not registered"
13106 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13107 "$user_rec1 + 2 == $user_rec2"
13108 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13109 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13110 "$user_rec1 + 2, but is $user_rec2"
13111 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13112 [ -n "$user_rec2" ] ||
13113 error "mds$i: User ${cl_user2[mds$i]} not registered"
13114 [ $user_rec1 == $user_rec2 ] ||
13115 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13116 "$user_rec1, but is $user_rec2"
13119 # force cl_user2 to be idle (2nd part) and to reach
13120 # changelog_max_idle_time
13123 # force each GC-thread start and block then
13124 # one per MDT/MDD, set fail_val accordingly
13125 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13126 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13128 # generate more changelogs to trigger fail_loc
13129 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13130 error "create $DIR/$tdir/${tfile}bis failed"
13132 # stop MDT to stop GC-thread, should be done in back-ground as it will
13133 # block waiting for the thread to be released and exit
13134 declare -A stop_pids
13135 for i in $(seq $MDSCOUNT); do
13137 stop_pids[mds$i]=$!
13140 for i in $(mdts_nodes); do
13143 local facets=$(facets_up_on_host $i)
13145 for facet in ${facets//,/ }; do
13146 if [[ $facet == mds* ]]; then
13150 # ensure each MDS's gc threads are still present and all in "R"
13151 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
13152 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
13153 error "$i: expected $nb GC-thread"
13155 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
13157 error "$i: GC-thread not found in R-state"
13158 # check umounts of each MDT on MDS have reached kthread_stop()
13159 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
13160 error "$i: expected $nb umount"
13162 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
13163 error "$i: umount not found in D-state"
13166 # release all GC-threads
13167 do_nodes $mdts $LCTL set_param fail_loc=0
13169 # wait for MDT stop to complete
13170 for i in $(seq $MDSCOUNT); do
13171 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
13175 # may try to check if any orphan changelog records are present
13176 # via ldiskfs/zfs and llog_reader...
13178 # re-start/mount MDTs
13179 for i in $(seq $MDSCOUNT); do
13180 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
13181 error "Fail to start mds$i"
13185 for i in $(seq $MDSCOUNT); do
13186 # check cl_user1 still registered
13187 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13188 error "mds$i: User ${cl_user1[mds$i]} not registered"
13189 # check cl_user2 unregistered
13190 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13191 error "mds$i: User ${cl_user2[mds$i]} still registered"
13193 # check changelogs are present and starting at $user_rec1 + 1
13194 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13195 [ -n "$user_rec1" ] ||
13196 error "mds$i: User ${cl_user1[mds$i]} not registered"
13197 first_rec=$($LFS changelog $(facet_svc mds$i) |
13198 awk '{ print $1; exit; }')
13200 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13201 [ $((user_rec1 + 1)) == $first_rec ] ||
13202 error "mds$i: first index should be $user_rec1 + 1, " \
13203 "but is $first_rec"
13206 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
13211 local mdts=$(comma_list $(mdts_nodes))
13213 changelog_register || error "first changelog_register failed"
13215 # generate some changelog records to accumulate on each MDT
13216 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13217 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13218 error "create $DIR/$tdir/$tfile failed"
13220 # check changelogs have been generated
13221 local nbcl=$(changelog_dump | wc -l)
13222 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13224 # simulate race between register and unregister
13225 # XXX as fail_loc is set per-MDS, with DNE configs the race
13226 # simulation will only occur for one MDT per MDS and for the
13227 # others the normal race scenario will take place
13228 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
13229 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
13230 do_nodes $mdts $LCTL set_param fail_val=1
13232 # unregister 1st user
13233 changelog_deregister &
13235 # wait some time for deregister work to reach race rdv
13237 # register 2nd user
13238 changelog_register || error "2nd user register failed"
13240 wait $pid1 || error "1st user deregister failed"
13244 declare -A LAST_REC
13245 for i in $(seq $MDSCOUNT); do
13246 if changelog_users mds$i | grep "^cl"; then
13247 # make sure new records are added with one user present
13248 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
13249 awk '/^current.index:/ { print $NF }')
13251 error "mds$i has no user registered"
13255 # generate more changelog records to accumulate on each MDT
13256 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13257 error "create $DIR/$tdir/${tfile}bis failed"
13259 for i in $(seq $MDSCOUNT); do
13260 last_rec=$(changelog_users $SINGLEMDS |
13261 awk '/^current.index:/ { print $NF }')
13262 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
13263 [ $last_rec != ${LAST_REC[mds$i]} ] ||
13264 error "changelogs are off on mds$i"
13267 run_test 160i "changelog user register/unregister race"
13270 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13271 remote_mds_nodsh && skip "remote MDS with nodsh"
13273 mkdir -p $DIR/$tdir/1/1
13275 changelog_register || error "changelog_register failed"
13276 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13278 changelog_users $SINGLEMDS | grep -q $cl_user ||
13279 error "User '$cl_user' not found in changelog_users"
13280 #define OBD_FAIL_MDS_CHANGELOG_REORDER 0x15d
13281 do_facet mds1 $LCTL set_param fail_loc=0x8000015d fail_val=3
13282 rmdir $DIR/$tdir/1/1 & sleep 1
13284 touch $DIR/$tdir/2/2
13285 rm -rf $DIR/$tdir/2
13290 changelog_dump | grep rmdir || error "rmdir not recorded"
13293 changelog_deregister
13295 run_test 160k "Verify that changelog records are not lost"
13298 remote_mds_nodsh && skip "remote MDS with nodsh"
13299 [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] &&
13300 skip "Need MDS version at least 2.12.56"
13302 mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
13304 changelog_register || error "first changelog_register failed"
13306 # generate some changelog
13307 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13308 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13309 error "create $DIR/$tdir/${tfile}bis failed"
13311 # open the changelog device
13312 exec 3>/dev/changelog-$FSNAME-MDT0000
13313 exec 4</dev/changelog-$FSNAME-MDT0000
13315 # umount the first lustre mount
13319 cat <&4 >/dev/null || error "read changelog failed"
13322 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13323 changelog_users $SINGLEMDS | grep -q $cl_user ||
13324 error "User $cl_user not found in changelog_users"
13326 printf 'clear:'$cl_user':0' >&3
13333 changelog_deregister || error "changelog_deregister failed"
13336 mount_client $MOUNT || error "mount_client on $MOUNT failed"
13338 run_test 160j "client can be umounted while its chanangelog is being used"
13341 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13343 test_mkdir -c1 $DIR/$tdir
13344 cp /etc/hosts $DIR/$tdir/$tfile
13345 test_mkdir -c1 $DIR/$tdir/foo1
13346 test_mkdir -c1 $DIR/$tdir/foo2
13347 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
13348 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
13349 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
13350 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
13351 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
13352 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13353 $LFS fid2path $DIR $FID
13354 error "bad link ea"
13357 rm $DIR/$tdir/foo2/zachary
13359 rm $DIR/$tdir/foo2/thor
13361 rm $DIR/$tdir/$tfile
13363 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
13364 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
13365 { $LFS fid2path $DIR $FID; error "bad link rename"; }
13366 rm $DIR/$tdir/foo2/maggie
13369 local longname=$tfile.avg_len_is_thirty_two_
13370 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
13371 error_noexit 'failed to unlink many hardlinks'" EXIT
13372 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
13373 error "failed to hardlink many files"
13374 links=$($LFS fid2path $DIR $FID | wc -l)
13375 echo -n "${links}/1000 links in link EA"
13376 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
13378 run_test 161a "link ea sanity"
13381 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13382 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
13385 local remote_dir=$DIR/$tdir/remote_dir
13387 mkdir -p $DIR/$tdir
13388 $LFS mkdir -i $MDTIDX $remote_dir ||
13389 error "create remote directory failed"
13391 cp /etc/hosts $remote_dir/$tfile
13392 mkdir -p $remote_dir/foo1
13393 mkdir -p $remote_dir/foo2
13394 ln $remote_dir/$tfile $remote_dir/foo1/sofia
13395 ln $remote_dir/$tfile $remote_dir/foo2/zachary
13396 ln $remote_dir/$tfile $remote_dir/foo1/luna
13397 ln $remote_dir/$tfile $remote_dir/foo2/thor
13399 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
13401 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13402 $LFS fid2path $DIR $FID
13403 error "bad link ea"
13406 rm $remote_dir/foo2/zachary
13408 rm $remote_dir/foo2/thor
13410 rm $remote_dir/$tfile
13412 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
13413 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
13414 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
13415 $LFS fid2path $DIR $FID
13416 error "bad link rename"
13418 rm $remote_dir/foo2/maggie
13421 local longname=filename_avg_len_is_thirty_two_
13422 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
13423 error "failed to hardlink many files"
13424 links=$($LFS fid2path $DIR $FID | wc -l)
13425 echo -n "${links}/1000 links in link EA"
13426 [[ ${links} -gt 60 ]] ||
13427 error "expected at least 60 links in link EA"
13428 unlinkmany $remote_dir/foo2/$longname 1000 ||
13429 error "failed to unlink many hardlinks"
13431 run_test 161b "link ea sanity under remote directory"
13434 remote_mds_nodsh && skip "remote MDS with nodsh"
13435 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13436 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
13437 skip "Need MDS version at least 2.1.5"
13439 # define CLF_RENAME_LAST 0x0001
13440 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
13441 changelog_register || error "changelog_register failed"
13444 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
13445 touch $DIR/$tdir/foo_161c
13446 touch $DIR/$tdir/bar_161c
13447 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13448 changelog_dump | grep RENME | tail -n 5
13449 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13450 changelog_clear 0 || error "changelog_clear failed"
13451 if [ x$flags != "x0x1" ]; then
13452 error "flag $flags is not 0x1"
13455 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
13456 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
13457 touch $DIR/$tdir/foo_161c
13458 touch $DIR/$tdir/bar_161c
13459 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13460 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13461 changelog_dump | grep RENME | tail -n 5
13462 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13463 changelog_clear 0 || error "changelog_clear failed"
13464 if [ x$flags != "x0x0" ]; then
13465 error "flag $flags is not 0x0"
13467 echo "rename overwrite a target having nlink > 1," \
13468 "changelog record has flags of $flags"
13470 # rename doesn't overwrite a target (changelog flag 0x0)
13471 touch $DIR/$tdir/foo_161c
13472 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
13473 changelog_dump | grep RENME | tail -n 5
13474 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
13475 changelog_clear 0 || error "changelog_clear failed"
13476 if [ x$flags != "x0x0" ]; then
13477 error "flag $flags is not 0x0"
13479 echo "rename doesn't overwrite a target," \
13480 "changelog record has flags of $flags"
13482 # define CLF_UNLINK_LAST 0x0001
13483 # unlink a file having nlink = 1 (changelog flag 0x1)
13484 rm -f $DIR/$tdir/foo2_161c
13485 changelog_dump | grep UNLNK | tail -n 5
13486 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13487 changelog_clear 0 || error "changelog_clear failed"
13488 if [ x$flags != "x0x1" ]; then
13489 error "flag $flags is not 0x1"
13491 echo "unlink a file having nlink = 1," \
13492 "changelog record has flags of $flags"
13494 # unlink a file having nlink > 1 (changelog flag 0x0)
13495 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13496 rm -f $DIR/$tdir/foobar_161c
13497 changelog_dump | grep UNLNK | tail -n 5
13498 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13499 changelog_clear 0 || error "changelog_clear failed"
13500 if [ x$flags != "x0x0" ]; then
13501 error "flag $flags is not 0x0"
13503 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
13505 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
13508 remote_mds_nodsh && skip "remote MDS with nodsh"
13513 changelog_register || error "changelog_register failed"
13515 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
13516 # interfer with $MOUNT/.lustre/fid/ access
13518 [[ $? -eq 0 ]] || error "mkdir failed"
13520 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
13521 $LCTL set_param fail_loc=0x8000140c
13523 $LCTL set_param fail_val=5
13526 echo foofoo > $DIR/$tdir/$tfile &
13529 # wait for create to be delayed
13533 [[ $? -eq 0 ]] || error "create should be blocked"
13535 local tempfile=$(mktemp)
13536 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
13537 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
13538 # some delay may occur during ChangeLog publishing and file read just
13539 # above, that could allow file write to happen finally
13540 [[ -s $tempfile ]] && echo "file should be empty"
13542 $LCTL set_param fail_loc=0
13545 [[ $? -eq 0 ]] || error "create failed"
13547 run_test 161d "create with concurrent .lustre/fid access"
13550 local expected="$1"
13555 path=$($LFS fid2path "$@")
13558 if [ $rc -ne 0 ]; then
13559 error "path looked up of '$expected' failed: rc=$rc"
13560 elif [ "$path" != "$expected" ]; then
13561 error "path looked up '$path' instead of '$expected'"
13563 echo "FID '$fid' resolves to path '$path' as expected"
13567 test_162a() { # was test_162
13568 test_mkdir -p -c1 $DIR/$tdir/d2
13569 touch $DIR/$tdir/d2/$tfile
13570 touch $DIR/$tdir/d2/x1
13571 touch $DIR/$tdir/d2/x2
13572 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
13573 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
13575 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
13576 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
13579 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
13580 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
13581 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
13583 # softlink to wrong file
13584 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
13585 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
13586 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
13589 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
13590 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
13591 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
13592 # fid2path dir/fsname should both work
13593 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
13594 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
13596 # hardlink count: check that there are 2 links
13597 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
13598 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
13600 # hardlink indexing: remove the first link
13601 rm $DIR/$tdir/d2/p/q/r/hlink
13602 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
13604 run_test 162a "path lookup sanity"
13607 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13608 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13611 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
13612 error "create striped dir failed"
13614 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
13615 tail -n 1 | awk '{print $2}')
13616 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
13618 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
13619 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
13622 for ((i=0;i<5;i++)); do
13623 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
13624 error "get fid for f$i failed"
13625 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
13627 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
13628 error "get fid for d$i failed"
13629 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
13634 run_test 162b "striped directory path lookup sanity"
13636 # LU-4239: Verify fid2path works with paths 100 or more directories deep
13638 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
13639 skip "Need MDS version at least 2.7.51"
13641 local lpath=$tdir.local
13642 local rpath=$tdir.remote
13644 test_mkdir $DIR/$lpath
13645 test_mkdir $DIR/$rpath
13647 for ((i = 0; i <= 101; i++)); do
13650 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
13651 error "get fid for local directory $DIR/$lpath failed"
13652 check_path "$DIR/$lpath" $MOUNT $FID --link 0
13655 test_mkdir $DIR/$rpath
13656 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
13657 error "get fid for remote directory $DIR/$rpath failed"
13658 check_path "$DIR/$rpath" $MOUNT $FID --link 0
13663 run_test 162c "fid2path works with paths 100 or more directories deep"
13666 # do directio so as not to populate the page cache
13667 log "creating a 10 Mb file"
13668 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
13669 log "starting reads"
13670 dd if=$DIR/$tfile of=/dev/null bs=4096 &
13671 log "truncating the file"
13672 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
13674 kill %+ || true # reads might have finished
13675 echo "wait until dd is finished"
13677 log "removing the temporary file"
13678 rm -rf $DIR/$tfile || error "tmp file removal failed"
13680 run_test 169 "parallel read and truncate should not deadlock"
13683 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13685 $LCTL clear # bug 18514
13686 $LCTL debug_daemon start $TMP/${tfile}_log_good
13688 $LCTL debug_daemon stop
13689 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
13690 error "sed failed to read log_good"
13692 $LCTL debug_daemon start $TMP/${tfile}_log_good
13694 $LCTL debug_daemon stop
13696 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
13697 error "lctl df log_bad failed"
13699 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
13700 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
13702 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
13703 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
13705 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
13706 error "bad_line good_line1 good_line2 are empty"
13708 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
13709 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
13710 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
13712 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
13713 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
13714 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
13716 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
13717 error "bad_line_new good_line_new are empty"
13719 local expected_good=$((good_line1 + good_line2*2))
13721 rm -f $TMP/${tfile}*
13722 # LU-231, short malformed line may not be counted into bad lines
13723 if [ $bad_line -ne $bad_line_new ] &&
13724 [ $bad_line -ne $((bad_line_new - 1)) ]; then
13725 error "expected $bad_line bad lines, but got $bad_line_new"
13729 if [ $expected_good -ne $good_line_new ]; then
13730 error "expected $expected_good good lines, but got $good_line_new"
13735 run_test 170 "test lctl df to handle corrupted log ====================="
13737 test_171() { # bug20592
13738 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13740 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
13741 $LCTL set_param fail_loc=0x50e
13742 $LCTL set_param fail_val=3000
13743 multiop_bg_pause $DIR/$tfile O_s || true
13745 kill -USR1 $MULTIPID
13749 if dmesg | grep "recursive fault"; then
13750 error "caught a recursive fault"
13752 $LCTL set_param fail_loc=0
13755 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
13757 # it would be good to share it with obdfilter-survey/iokit-libecho code
13758 setup_obdecho_osc () {
13761 local obdfilter_name=$2
13762 echo "Creating new osc for $obdfilter_name on $ost_nid"
13763 # make sure we can find loopback nid
13764 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
13766 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
13767 ${obdfilter_name}_osc_UUID || rc=2; }
13768 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
13769 ${obdfilter_name}_UUID $ost_nid || rc=3; }
13773 cleanup_obdecho_osc () {
13774 local obdfilter_name=$1
13775 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
13776 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
13783 local pages=${3:-64}
13788 local obd_size=$(get_obd_size $node $OBD)
13789 local page_size=$(get_page_size $node)
13790 if [[ -n "$obd_size" ]]; then
13791 local new_count=$((obd_size / (pages * page_size / 1024)))
13792 [[ $new_count -ge $count ]] || count=$new_count
13795 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
13796 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
13798 if [ $rc -eq 0 ]; then
13799 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
13800 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
13802 echo "New object id is $id"
13803 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
13805 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
13806 "test_brw $count w v $pages $id" || rc=4; }
13807 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
13809 [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
13810 "cleanup" || rc=5; }
13811 [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \
13812 "detach" || rc=6; }
13813 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
13818 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13820 if ! module_loaded obdecho; then
13821 load_module obdecho/obdecho &&
13822 stack_trap "rmmod obdecho" EXIT ||
13823 error "unable to load obdecho on client"
13826 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
13827 local host=$($LCTL get_param -n osc.$osc.import |
13828 awk '/current_connection:/ { print $2 }' )
13829 local target=$($LCTL get_param -n osc.$osc.import |
13830 awk '/target:/ { print $2 }' )
13831 target=${target%_UUID}
13833 if [ -n "$target" ]; then
13834 setup_obdecho_osc $host $target &&
13835 stack_trap "cleanup_obdecho_osc $target" EXIT ||
13836 { error "obdecho setup failed with $?"; return; }
13838 obdecho_test ${target}_osc client ||
13839 error "obdecho_test failed on ${target}_osc"
13841 $LCTL get_param osc.$osc.import
13842 error "there is no osc.$osc.import target"
13845 run_test 180a "test obdecho on osc"
13848 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13849 remote_ost_nodsh && skip "remote OST with nodsh"
13851 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
13852 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
13853 error "failed to load module obdecho"
13855 local target=$(do_facet ost1 $LCTL dl |
13856 awk '/obdfilter/ { print $4; exit; }')
13858 if [ -n "$target" ]; then
13859 obdecho_test $target ost1 || error "obdecho_test failed with $?"
13861 do_facet ost1 $LCTL dl
13862 error "there is no obdfilter target on ost1"
13865 run_test 180b "test obdecho directly on obdfilter"
13867 test_180c() { # LU-2598
13868 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13869 remote_ost_nodsh && skip "remote OST with nodsh"
13870 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
13871 skip "Need MDS version at least 2.4.0"
13873 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
13874 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
13875 error "failed to load module obdecho"
13877 local target=$(do_facet ost1 $LCTL dl |
13878 awk '/obdfilter/ { print $4; exit; }')
13880 if [ -n "$target" ]; then
13881 local pages=16384 # 64MB bulk I/O RPC size
13883 obdecho_test "$target" ost1 "$pages" ||
13884 error "obdecho_test with pages=$pages failed with $?"
13886 do_facet ost1 $LCTL dl
13887 error "there is no obdfilter target on ost1"
13890 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
13892 test_181() { # bug 22177
13893 test_mkdir $DIR/$tdir
13894 # create enough files to index the directory
13895 createmany -o $DIR/$tdir/foobar 4000
13896 # print attributes for debug purpose
13899 multiop_bg_pause $DIR/$tdir D_Sc || return 1
13901 # remove the files & current working dir
13902 unlinkmany $DIR/$tdir/foobar 4000
13904 kill -USR1 $MULTIPID
13906 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
13909 run_test 181 "Test open-unlinked dir ========================"
13915 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
13917 $LCTL set_param mdc.*.rpc_stats=clear
13919 for (( i = 0; i < $tcount; i++ )) ; do
13920 mkdir $DIR/$tdir/$i
13923 for (( i = 0; i < $tcount; i++ )) ; do
13924 createmany -o $DIR/$tdir/$i/f- $fcount &
13928 for (( i = 0; i < $tcount; i++ )) ; do
13929 unlinkmany $DIR/$tdir/$i/f- $fcount &
13933 $LCTL get_param mdc.*.rpc_stats
13937 run_test 182 "Test parallel modify metadata operations ================"
13939 test_183() { # LU-2275
13940 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13941 remote_mds_nodsh && skip "remote MDS with nodsh"
13942 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
13943 skip "Need MDS version at least 2.3.56"
13945 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
13946 echo aaa > $DIR/$tdir/$tfile
13948 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
13949 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
13951 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
13952 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
13954 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
13956 # Flush negative dentry cache
13957 touch $DIR/$tdir/$tfile
13959 # We are not checking for any leaked references here, they'll
13960 # become evident next time we do cleanup with module unload.
13963 run_test 183 "No crash or request leak in case of strange dispositions ========"
13965 # test suite 184 is for LU-2016, LU-2017
13967 check_swap_layouts_support
13969 dir0=$DIR/$tdir/$testnum
13970 test_mkdir -p -c1 $dir0
13975 $SETSTRIPE -c1 $file1
13977 $SETSTRIPE -c2 $file2
13979 gen1=$($GETSTRIPE -g $file1)
13980 gen2=$($GETSTRIPE -g $file2)
13982 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
13983 gen=$($GETSTRIPE -g $file1)
13984 [[ $gen1 != $gen ]] ||
13985 "Layout generation on $file1 does not change"
13986 gen=$($GETSTRIPE -g $file2)
13987 [[ $gen2 != $gen ]] ||
13988 "Layout generation on $file2 does not change"
13990 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
13991 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
13993 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
13995 run_test 184a "Basic layout swap"
13998 check_swap_layouts_support
14000 dir0=$DIR/$tdir/$testnum
14001 mkdir -p $dir0 || error "creating dir $dir0"
14008 $SETSTRIPE -c1 $file1
14009 $SETSTRIPE -c2 $file2
14010 $SETSTRIPE -c1 $file3
14011 chown $RUNAS_ID $file3
14012 gen1=$($GETSTRIPE -g $file1)
14013 gen2=$($GETSTRIPE -g $file2)
14015 $LFS swap_layouts $dir1 $dir2 &&
14016 error "swap of directories layouts should fail"
14017 $LFS swap_layouts $dir1 $file1 &&
14018 error "swap of directory and file layouts should fail"
14019 $RUNAS $LFS swap_layouts $file1 $file2 &&
14020 error "swap of file we cannot write should fail"
14021 $LFS swap_layouts $file1 $file3 &&
14022 error "swap of file with different owner should fail"
14023 /bin/true # to clear error code
14025 run_test 184b "Forbidden layout swap (will generate errors)"
14028 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14029 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14030 check_swap_layouts_support
14032 local dir0=$DIR/$tdir/$testnum
14033 mkdir -p $dir0 || error "creating dir $dir0"
14035 local ref1=$dir0/ref1
14036 local ref2=$dir0/ref2
14037 local file1=$dir0/file1
14038 local file2=$dir0/file2
14039 # create a file large enough for the concurrent test
14040 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14041 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14042 echo "ref file size: ref1($(stat -c %s $ref1))," \
14043 "ref2($(stat -c %s $ref2))"
14046 dd if=$ref1 of=$file1 bs=16k &
14049 # Make sure dd starts to copy file
14050 while [ ! -f $file1 ]; do sleep 0.1; done
14052 $LFS swap_layouts $file1 $file2
14055 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14056 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14058 # how many bytes copied before swapping layout
14059 local copied=$(stat -c %s $file2)
14060 local remaining=$(stat -c %s $ref1)
14061 remaining=$((remaining - copied))
14062 echo "Copied $copied bytes before swapping layout..."
14064 cmp -n $copied $file1 $ref2 | grep differ &&
14065 error "Content mismatch [0, $copied) of ref2 and file1"
14066 cmp -n $copied $file2 $ref1 ||
14067 error "Content mismatch [0, $copied) of ref1 and file2"
14068 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14069 error "Content mismatch [$copied, EOF) of ref1 and file1"
14072 rm -f $ref1 $ref2 $file1 $file2
14074 run_test 184c "Concurrent write and layout swap"
14077 check_swap_layouts_support
14078 [ -z "$(which getfattr 2>/dev/null)" ] &&
14079 skip_env "no getfattr command"
14081 local file1=$DIR/$tdir/$tfile-1
14082 local file2=$DIR/$tdir/$tfile-2
14083 local file3=$DIR/$tdir/$tfile-3
14087 mkdir -p $DIR/$tdir
14088 touch $file1 || error "create $file1 failed"
14089 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14090 error "create $file2 failed"
14091 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14092 error "create $file3 failed"
14093 lovea1=$(get_layout_param $file1)
14095 $LFS swap_layouts $file2 $file3 ||
14096 error "swap $file2 $file3 layouts failed"
14097 $LFS swap_layouts $file1 $file2 ||
14098 error "swap $file1 $file2 layouts failed"
14100 lovea2=$(get_layout_param $file2)
14103 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14105 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14106 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14108 run_test 184d "allow stripeless layouts swap"
14111 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14112 skip "Need MDS version at least 2.6.94"
14113 check_swap_layouts_support
14114 [ -z "$(which getfattr 2>/dev/null)" ] &&
14115 skip_env "no getfattr command"
14117 local file1=$DIR/$tdir/$tfile-1
14118 local file2=$DIR/$tdir/$tfile-2
14119 local file3=$DIR/$tdir/$tfile-3
14122 mkdir -p $DIR/$tdir
14123 touch $file1 || error "create $file1 failed"
14124 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14125 error "create $file2 failed"
14126 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14127 error "create $file3 failed"
14129 $LFS swap_layouts $file1 $file2 ||
14130 error "swap $file1 $file2 layouts failed"
14132 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14133 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14135 echo 123 > $file1 || error "Should be able to write into $file1"
14137 $LFS swap_layouts $file1 $file3 ||
14138 error "swap $file1 $file3 layouts failed"
14140 echo 123 > $file1 || error "Should be able to write into $file1"
14142 rm -rf $file1 $file2 $file3
14144 run_test 184e "Recreate layout after stripeless layout swaps"
14147 # Create a file with name longer than sizeof(struct stat) ==
14148 # 144 to see if we can get chars from the file name to appear
14149 # in the returned striping. Note that 'f' == 0x66.
14150 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
14152 mkdir -p $DIR/$tdir
14153 mcreate $DIR/$tdir/$file
14154 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
14155 error "IOC_MDC_GETFILEINFO returned garbage striping"
14158 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
14160 test_185() { # LU-2441
14161 # LU-3553 - no volatile file support in old servers
14162 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
14163 skip "Need MDS version at least 2.3.60"
14165 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14166 touch $DIR/$tdir/spoo
14167 local mtime1=$(stat -c "%Y" $DIR/$tdir)
14168 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
14169 error "cannot create/write a volatile file"
14170 [ "$FILESET" == "" ] &&
14171 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
14172 error "FID is still valid after close"
14174 multiop_bg_pause $DIR/$tdir vVw4096_c
14181 # assume that the next FID for this client is sequential, since stdout
14182 # is unfortunately eaten by multiop_bg_pause
14183 local n=$((${fidv[1]} + 1))
14184 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
14185 if [ "$FILESET" == "" ]; then
14186 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
14187 error "FID is missing before close"
14189 kill -USR1 $multi_pid
14190 # 1 second delay, so if mtime change we will see it
14192 local mtime2=$(stat -c "%Y" $DIR/$tdir)
14193 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
14195 run_test 185 "Volatile file support"
14197 function create_check_volatile() {
14201 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
14204 local FID=$(cat /tmp/${tfile}.fid)
14205 [ "$FID" == "" ] && error "can't get FID for volatile"
14206 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
14207 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
14208 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
14212 cancel_lru_locks mdc # flush opencache
14213 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
14218 # LU-12516 - volatile creation via .lustre
14219 [[ $MDS1_VERSION -ge $(version_code 2.12.2) ]] ||
14220 skip "Need MDS version at least 2.12.2"
14222 create_check_volatile 0
14223 [ $MDSCOUNT -lt 2 ] && return 0
14226 create_check_volatile 1
14230 run_test 185a "Volatile file creation in .lustre/fid/"
14233 remote_mds_nodsh && skip "remote MDS with nodsh"
14234 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14235 skip "Need MDS version at least 2.3.0"
14237 local dir0=$DIR/$tdir/$testnum
14238 mkdir -p $dir0 || error "creating dir $dir0"
14240 local file=$dir0/file1
14241 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
14242 local dv1=$($LFS data_version $file)
14243 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
14244 local dv2=$($LFS data_version $file)
14245 [[ $dv1 != $dv2 ]] ||
14246 error "data version did not change on write $dv1 == $dv2"
14251 run_test 187a "Test data version change"
14254 remote_mds_nodsh && skip "remote MDS with nodsh"
14255 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14256 skip "Need MDS version at least 2.3.0"
14258 local dir0=$DIR/$tdir/$testnum
14259 mkdir -p $dir0 || error "creating dir $dir0"
14261 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
14262 [[ ${DV[0]} != ${DV[1]} ]] ||
14263 error "data version did not change on write"\
14264 " ${DV[0]} == ${DV[1]}"
14269 run_test 187b "Test data version change on volatile file"
14272 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14273 remote_mgs_nodsh && skip "remote MGS with nodsh"
14274 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
14276 local POOL=${POOL:-cea1}
14277 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
14278 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
14281 local last_ost=$(($OSTCOUNT - 1))
14283 local ost_list=$(seq $first_ost $ost_step $last_ost)
14284 local ost_range="$first_ost $last_ost $ost_step"
14285 local test_path=$POOL_ROOT/$POOL_DIR_NAME
14286 local file_dir=$POOL_ROOT/file_tst
14287 local subdir=$test_path/subdir
14291 # former test_200a test_200b
14292 pool_add $POOL || { rc=$? ; break; }
14293 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
14294 # former test_200c test_200d
14295 mkdir -p $test_path
14296 pool_set_dir $POOL $test_path || { rc=$? ; break; }
14297 pool_check_dir $POOL $test_path || { rc=$? ; break; }
14299 pool_check_dir $POOL $subdir || { rc=$? ; break; }
14300 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
14301 || { rc=$? ; break; }
14302 # former test_200e test_200f
14303 local files=$((OSTCOUNT*3))
14304 pool_alloc_files $POOL $test_path $files "$ost_list" \
14305 || { rc=$? ; break; }
14306 pool_create_files $POOL $file_dir $files "$ost_list" \
14307 || { rc=$? ; break; }
14308 # former test_200g test_200h
14309 pool_lfs_df $POOL || { rc=$? ; break; }
14310 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
14312 # former test_201a test_201b test_201c
14313 pool_remove_first_target $POOL || { rc=$? ; break; }
14315 local f=$test_path/$tfile
14316 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
14317 pool_remove $POOL $f || { rc=$? ; break; }
14325 run_test 200 "OST pools"
14327 # usage: default_attr <count | size | offset>
14329 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
14332 # usage: check_default_stripe_attr
14333 check_default_stripe_attr() {
14334 ACTUAL=$($GETSTRIPE $* $DIR/$tdir)
14337 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
14339 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
14343 error "unknown getstripe attr '$1'"
14346 [ $ACTUAL == $EXPECTED ] ||
14347 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
14351 test_mkdir $DIR/$tdir
14352 $SETSTRIPE --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
14354 check_default_stripe_attr --stripe-count
14355 check_default_stripe_attr --stripe-size
14356 check_default_stripe_attr --stripe-index
14358 run_test 204a "Print default stripe attributes"
14361 test_mkdir $DIR/$tdir
14362 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14364 check_default_stripe_attr --stripe-size
14365 check_default_stripe_attr --stripe-index
14367 run_test 204b "Print default stripe size and offset"
14370 test_mkdir $DIR/$tdir
14371 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14373 check_default_stripe_attr --stripe-count
14374 check_default_stripe_attr --stripe-index
14376 run_test 204c "Print default stripe count and offset"
14379 test_mkdir $DIR/$tdir
14380 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14382 check_default_stripe_attr --stripe-count
14383 check_default_stripe_attr --stripe-size
14385 run_test 204d "Print default stripe count and size"
14388 test_mkdir $DIR/$tdir
14389 $SETSTRIPE -d $DIR/$tdir
14391 check_default_stripe_attr --stripe-count --raw
14392 check_default_stripe_attr --stripe-size --raw
14393 check_default_stripe_attr --stripe-index --raw
14395 run_test 204e "Print raw stripe attributes"
14398 test_mkdir $DIR/$tdir
14399 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14401 check_default_stripe_attr --stripe-size --raw
14402 check_default_stripe_attr --stripe-index --raw
14404 run_test 204f "Print raw stripe size and offset"
14407 test_mkdir $DIR/$tdir
14408 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14410 check_default_stripe_attr --stripe-count --raw
14411 check_default_stripe_attr --stripe-index --raw
14413 run_test 204g "Print raw stripe count and offset"
14416 test_mkdir $DIR/$tdir
14417 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14419 check_default_stripe_attr --stripe-count --raw
14420 check_default_stripe_attr --stripe-size --raw
14422 run_test 204h "Print raw stripe count and size"
14424 # Figure out which job scheduler is being used, if any,
14425 # or use a fake one
14426 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
14427 JOBENV=SLURM_JOB_ID
14428 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
14430 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
14432 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
14433 JOBENV=LOADL_STEP_ID
14434 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
14437 $LCTL list_param jobid_name > /dev/null 2>&1
14438 if [ $? -eq 0 ]; then
14444 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
14446 verify_jobstats() {
14451 # we don't really need to clear the stats for this test to work, since each
14452 # command has a unique jobid, but it makes debugging easier if needed.
14453 # for facet in $facets; do
14454 # local dev=$(convert_facet2label $facet)
14455 # # clear old jobstats
14456 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
14459 # use a new JobID for each test, or we might see an old one
14460 [ "$JOBENV" = "FAKE_JOBID" ] &&
14461 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
14463 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
14465 [ "$JOBENV" = "nodelocal" ] && {
14466 FAKE_JOBID=id.$testnum.%e.$RANDOM
14467 $LCTL set_param jobid_name=$FAKE_JOBID
14468 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
14471 log "Test: ${cmd[*]}"
14472 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
14474 if [ $JOBENV = "FAKE_JOBID" ]; then
14475 FAKE_JOBID=$JOBVAL ${cmd[*]}
14480 # all files are created on OST0000
14481 for facet in $facets; do
14482 local stats="*.$(convert_facet2label $facet).job_stats"
14484 # strip out libtool wrappers for in-tree executables
14485 if [ $(do_facet $facet lctl get_param $stats |
14486 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
14487 do_facet $facet lctl get_param $stats
14488 error "No jobstats for $JOBVAL found on $facet::$stats"
14494 local new_jobenv=$1
14496 set_persistent_param_and_check client "jobid_var" \
14497 "$FSNAME.sys.jobid_var" $new_jobenv
14500 test_205() { # Job stats
14501 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14502 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
14503 skip "Need MDS version with at least 2.7.1"
14504 remote_mgs_nodsh && skip "remote MGS with nodsh"
14505 remote_mds_nodsh && skip "remote MDS with nodsh"
14506 remote_ost_nodsh && skip "remote OST with nodsh"
14507 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
14508 skip "Server doesn't support jobstats"
14509 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
14511 local old_jobenv=$($LCTL get_param -n jobid_var)
14512 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
14514 if [[ $PERM_CMD = *"set_param -P"* ]]; then
14515 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
14517 stack_trap "do_facet mgs $PERM_CMD \
14518 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
14522 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
14523 mdt.*.job_cleanup_interval | head -n 1)
14524 local new_interval=5
14525 do_facet $SINGLEMDS \
14526 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
14527 stack_trap "do_facet $SINGLEMDS \
14528 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
14529 local start=$SECONDS
14533 cmd="mkdir $DIR/$tdir"
14534 verify_jobstats "$cmd" "$SINGLEMDS"
14536 cmd="rmdir $DIR/$tdir"
14537 verify_jobstats "$cmd" "$SINGLEMDS"
14538 # mkdir on secondary MDT
14539 if [ $MDSCOUNT -gt 1 ]; then
14540 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
14541 verify_jobstats "$cmd" "mds2"
14544 cmd="mknod $DIR/$tfile c 1 3"
14545 verify_jobstats "$cmd" "$SINGLEMDS"
14547 cmd="rm -f $DIR/$tfile"
14548 verify_jobstats "$cmd" "$SINGLEMDS"
14549 # create all files on OST0000 so verify_jobstats can find OST stats
14551 cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile"
14552 verify_jobstats "$cmd" "$SINGLEMDS"
14554 cmd="touch $DIR/$tfile"
14555 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14557 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
14558 verify_jobstats "$cmd" "ost1"
14560 cancel_lru_locks osc
14561 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
14562 verify_jobstats "$cmd" "ost1"
14564 cmd="$TRUNCATE $DIR/$tfile 0"
14565 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14567 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
14568 verify_jobstats "$cmd" "$SINGLEMDS"
14569 # jobstats expiry - sleep until old stats should be expired
14570 local left=$((new_interval + 5 - (SECONDS - start)))
14571 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
14572 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
14574 cmd="mkdir $DIR/$tdir.expire"
14575 verify_jobstats "$cmd" "$SINGLEMDS"
14576 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
14577 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
14579 # Ensure that jobid are present in changelog (if supported by MDS)
14580 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
14581 changelog_dump | tail -10
14582 jobids=$(changelog_dump | tail -9 | grep -c "j=")
14583 [ $jobids -eq 9 ] ||
14584 error "Wrong changelog jobid count $jobids != 9"
14588 jobstats_set $JOBENV
14590 changelog_dump | grep $tfile
14591 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
14592 [ $jobids -eq 0 ] ||
14593 error "Unexpected jobids when jobid_var=$JOBENV"
14596 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
14597 JOBENV="JOBCOMPLEX"
14598 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
14600 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
14602 run_test 205 "Verify job stats"
14604 # LU-1480, LU-1773 and LU-1657
14606 mkdir -p $DIR/$tdir
14607 $SETSTRIPE -c -1 $DIR/$tdir
14608 #define OBD_FAIL_LOV_INIT 0x1403
14609 $LCTL set_param fail_loc=0xa0001403
14610 $LCTL set_param fail_val=1
14611 touch $DIR/$tdir/$tfile || true
14613 run_test 206 "fail lov_init_raid0() doesn't lbug"
14616 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14617 local fsz=`stat -c %s $DIR/$tfile`
14618 cancel_lru_locks mdc
14620 # do not return layout in getattr intent
14621 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
14622 $LCTL set_param fail_loc=0x170
14623 local sz=`stat -c %s $DIR/$tfile`
14625 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
14629 run_test 207a "can refresh layout at glimpse"
14632 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14633 local cksum=`md5sum $DIR/$tfile`
14634 local fsz=`stat -c %s $DIR/$tfile`
14635 cancel_lru_locks mdc
14636 cancel_lru_locks osc
14638 # do not return layout in getattr intent
14639 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
14640 $LCTL set_param fail_loc=0x171
14642 # it will refresh layout after the file is opened but before read issues
14643 echo checksum is "$cksum"
14644 echo "$cksum" |md5sum -c --quiet || error "file differs"
14648 run_test 207b "can refresh layout at open"
14651 # FIXME: in this test suite, only RD lease is used. This is okay
14652 # for now as only exclusive open is supported. After generic lease
14653 # is done, this test suite should be revised. - Jinshan
14655 remote_mds_nodsh && skip "remote MDS with nodsh"
14656 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
14657 skip "Need MDS version at least 2.4.52"
14659 echo "==== test 1: verify get lease work"
14660 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
14662 echo "==== test 2: verify lease can be broken by upcoming open"
14663 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
14667 $MULTIOP $DIR/$tfile oO_RDONLY:c
14668 kill -USR1 $PID && wait $PID || error "break lease error"
14670 echo "==== test 3: verify lease can't be granted if an open already exists"
14671 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
14675 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
14676 kill -USR1 $PID && wait $PID || error "open file error"
14678 echo "==== test 4: lease can sustain over recovery"
14679 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
14685 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
14687 echo "==== test 5: lease broken can't be regained by replay"
14688 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
14692 # open file to break lease and then recovery
14693 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
14696 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
14700 run_test 208 "Exclusive open"
14703 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
14704 skip_env "must have disp_stripe"
14707 sync; sleep 5; sync;
14709 echo 3 > /proc/sys/vm/drop_caches
14710 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
14712 # open/close 500 times
14713 for i in $(seq 500); do
14717 echo 3 > /proc/sys/vm/drop_caches
14718 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
14720 echo "before: $req_before, after: $req_after"
14721 [ $((req_after - req_before)) -ge 300 ] &&
14722 error "open/close requests are not freed"
14725 run_test 209 "read-only open/close requests should be freed promptly"
14729 size=$((size % 8192 + 1))
14730 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
14731 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
14732 rm -f $DIR/f212 $DIR/f212.xyz
14734 run_test 212 "Sendfile test ============================================"
14737 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
14738 cancel_lru_locks osc
14739 lctl set_param fail_loc=0x8000040f
14740 # generate a read lock
14741 cat $DIR/$tfile > /dev/null
14742 # write to the file, it will try to cancel the above read lock.
14743 cat /etc/hosts >> $DIR/$tfile
14745 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
14747 test_214() { # for bug 20133
14748 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
14749 for (( i=0; i < 340; i++ )) ; do
14750 touch $DIR/$tdir/d214c/a$i
14753 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
14754 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
14755 ls $DIR/d214c || error "ls $DIR/d214c failed"
14756 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
14757 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
14759 run_test 214 "hash-indexed directory test - bug 20133"
14761 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
14762 create_lnet_proc_files() {
14763 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
14766 # counterpart of create_lnet_proc_files
14767 remove_lnet_proc_files() {
14768 rm -f $TMP/lnet_$1.sys
14771 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
14772 # 3rd arg as regexp for body
14773 check_lnet_proc_stats() {
14774 local l=$(cat "$TMP/lnet_$1" |wc -l)
14775 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
14777 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
14780 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
14781 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
14782 # optional and can be regexp for 2nd line (lnet.routes case)
14783 check_lnet_proc_entry() {
14784 local blp=2 # blp stands for 'position of 1st line of body'
14785 [ -z "$5" ] || blp=3 # lnet.routes case
14787 local l=$(cat "$TMP/lnet_$1" |wc -l)
14788 # subtracting one from $blp because the body can be empty
14789 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
14791 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
14792 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
14794 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
14795 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
14797 # bail out if any unexpected line happened
14798 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
14799 [ "$?" != 0 ] || error "$2 misformatted"
14802 test_215() { # for bugs 18102, 21079, 21517
14803 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14805 local N='(0|[1-9][0-9]*)' # non-negative numeric
14806 local P='[1-9][0-9]*' # positive numeric
14807 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
14808 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
14809 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
14810 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
14812 local L1 # regexp for 1st line
14813 local L2 # regexp for 2nd line (optional)
14814 local BR # regexp for the rest (body)
14816 # lnet.stats should look as 11 space-separated non-negative numerics
14817 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
14818 create_lnet_proc_files "stats"
14819 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
14820 remove_lnet_proc_files "stats"
14822 # lnet.routes should look like this:
14823 # Routing disabled/enabled
14824 # net hops priority state router
14825 # where net is a string like tcp0, hops > 0, priority >= 0,
14826 # state is up/down,
14827 # router is a string like 192.168.1.1@tcp2
14828 L1="^Routing (disabled|enabled)$"
14829 L2="^net +hops +priority +state +router$"
14830 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
14831 create_lnet_proc_files "routes"
14832 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
14833 remove_lnet_proc_files "routes"
14835 # lnet.routers should look like this:
14836 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
14837 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
14838 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
14839 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
14840 L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
14841 BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
14842 create_lnet_proc_files "routers"
14843 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
14844 remove_lnet_proc_files "routers"
14846 # lnet.peers should look like this:
14847 # nid refs state last max rtr min tx min queue
14848 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
14849 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
14850 # numeric (0 or >0 or <0), queue >= 0.
14851 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
14852 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
14853 create_lnet_proc_files "peers"
14854 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
14855 remove_lnet_proc_files "peers"
14857 # lnet.buffers should look like this:
14858 # pages count credits min
14859 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
14860 L1="^pages +count +credits +min$"
14861 BR="^ +$N +$N +$I +$I$"
14862 create_lnet_proc_files "buffers"
14863 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
14864 remove_lnet_proc_files "buffers"
14866 # lnet.nis should look like this:
14867 # nid status alive refs peer rtr max tx min
14868 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
14869 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
14870 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
14871 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
14872 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
14873 create_lnet_proc_files "nis"
14874 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
14875 remove_lnet_proc_files "nis"
14877 # can we successfully write to lnet.stats?
14878 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
14880 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
14882 test_216() { # bug 20317
14883 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14884 remote_ost_nodsh && skip "remote OST with nodsh"
14887 local facets=$(get_facets OST)
14888 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
14890 save_lustre_params client "osc.*.contention_seconds" > $p
14891 save_lustre_params $facets \
14892 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
14893 save_lustre_params $facets \
14894 "ldlm.namespaces.filter-*.contended_locks" >> $p
14895 save_lustre_params $facets \
14896 "ldlm.namespaces.filter-*.contention_seconds" >> $p
14897 clear_stats osc.*.osc_stats
14899 # agressive lockless i/o settings
14900 do_nodes $(comma_list $(osts_nodes)) \
14901 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
14902 ldlm.namespaces.filter-*.contended_locks=0 \
14903 ldlm.namespaces.filter-*.contention_seconds=60"
14904 lctl set_param -n osc.*.contention_seconds=60
14906 $DIRECTIO write $DIR/$tfile 0 10 4096
14907 $CHECKSTAT -s 40960 $DIR/$tfile
14909 # disable lockless i/o
14910 do_nodes $(comma_list $(osts_nodes)) \
14911 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
14912 ldlm.namespaces.filter-*.contended_locks=32 \
14913 ldlm.namespaces.filter-*.contention_seconds=0"
14914 lctl set_param -n osc.*.contention_seconds=0
14915 clear_stats osc.*.osc_stats
14917 dd if=/dev/zero of=$DIR/$tfile count=0
14918 $CHECKSTAT -s 0 $DIR/$tfile
14920 restore_lustre_params <$p
14924 run_test 216 "check lockless direct write updates file size and kms correctly"
14926 test_217() { # bug 22430
14927 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14932 for node in $(nodes_list); do
14933 nid=$(host_nids_address $node $NETTYPE)
14934 if [[ $nid = *-* ]] ; then
14935 echo "lctl ping $(h2nettype $nid)"
14936 lctl ping $(h2nettype $nid)
14938 echo "skipping $node (no hyphen detected)"
14942 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
14945 # do directio so as not to populate the page cache
14946 log "creating a 10 Mb file"
14947 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
14948 log "starting reads"
14949 dd if=$DIR/$tfile of=/dev/null bs=4096 &
14950 log "truncating the file"
14951 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
14953 kill %+ || true # reads might have finished
14954 echo "wait until dd is finished"
14956 log "removing the temporary file"
14957 rm -rf $DIR/$tfile || error "tmp file removal failed"
14959 run_test 218 "parallel read and truncate should not deadlock"
14962 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14964 # write one partial page
14965 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
14966 # set no grant so vvp_io_commit_write will do sync write
14967 $LCTL set_param fail_loc=0x411
14968 # write a full page at the end of file
14969 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
14971 $LCTL set_param fail_loc=0
14972 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
14973 $LCTL set_param fail_loc=0x411
14974 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
14977 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
14978 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
14980 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
14982 test_220() { #LU-325
14983 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14984 remote_ost_nodsh && skip "remote OST with nodsh"
14985 remote_mds_nodsh && skip "remote MDS with nodsh"
14986 remote_mgs_nodsh && skip "remote MGS with nodsh"
14990 # create on MDT0000 so the last_id and next_id are correct
14992 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
14996 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
14997 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
14998 osp.$mdtosc_proc1.prealloc_last_id)
14999 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15000 osp.$mdtosc_proc1.prealloc_next_id)
15004 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15005 #define OBD_FAIL_OST_ENOINO 0x229
15006 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15007 create_pool $FSNAME.$TESTNAME || return 1
15008 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15010 $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15012 MDSOBJS=$((last_id - next_id))
15013 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15015 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15016 echo "OST still has $count kbytes free"
15018 echo "create $MDSOBJS files @next_id..."
15019 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15021 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15022 osp.$mdtosc_proc1.prealloc_last_id)
15023 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15024 osp.$mdtosc_proc1.prealloc_next_id)
15026 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15031 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15032 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15034 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15035 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15036 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15037 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15038 echo "unlink $MDSOBJS files @$next_id..."
15039 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15041 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15044 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15046 dd if=`which date` of=$MOUNT/date oflag=sync
15047 chmod +x $MOUNT/date
15049 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15050 $LCTL set_param fail_loc=0x80001401
15052 $MOUNT/date > /dev/null
15055 run_test 221 "make sure fault and truncate race to not cause OOM"
15058 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15061 test_mkdir $DIR/$tdir
15062 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15063 createmany -o $DIR/$tdir/$tfile 10
15064 cancel_lru_locks mdc
15065 cancel_lru_locks osc
15066 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15067 $LCTL set_param fail_loc=0x31a
15068 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15069 $LCTL set_param fail_loc=0
15072 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15075 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15078 test_mkdir $DIR/$tdir
15079 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15080 createmany -o $DIR/$tdir/$tfile 10
15081 cancel_lru_locks mdc
15082 cancel_lru_locks osc
15083 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15084 $LCTL set_param fail_loc=0x31a
15085 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15086 $LCTL set_param fail_loc=0
15088 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15091 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15094 test_mkdir $DIR/$tdir
15095 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15096 createmany -o $DIR/$tdir/$tfile 10
15097 cancel_lru_locks mdc
15098 cancel_lru_locks osc
15099 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15100 $LCTL set_param fail_loc=0x31b
15101 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15102 $LCTL set_param fail_loc=0
15105 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15107 test_224a() { # LU-1039, MRP-303
15108 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15110 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15111 $LCTL set_param fail_loc=0x508
15112 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15113 $LCTL set_param fail_loc=0
15116 run_test 224a "Don't panic on bulk IO failure"
15118 test_224b() { # LU-1039, MRP-303
15119 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15121 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15122 cancel_lru_locks osc
15123 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15124 $LCTL set_param fail_loc=0x515
15125 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15126 $LCTL set_param fail_loc=0
15129 run_test 224b "Don't panic on bulk IO failure"
15131 test_224c() { # LU-6441
15132 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15133 remote_mds_nodsh && skip "remote MDS with nodsh"
15135 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15136 save_writethrough $p
15137 set_cache writethrough on
15139 local pages_per_rpc=$($LCTL get_param \
15140 osc.*.max_pages_per_rpc)
15141 local at_max=$($LCTL get_param -n at_max)
15142 local timeout=$($LCTL get_param -n timeout)
15143 local test_at="at_max"
15144 local param_at="$FSNAME.sys.at_max"
15145 local test_timeout="timeout"
15146 local param_timeout="$FSNAME.sys.timeout"
15148 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
15150 set_persistent_param_and_check client "$test_at" "$param_at" 0
15151 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
15153 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
15154 do_facet ost1 $LCTL set_param fail_loc=0x520
15155 $LFS setstripe -c 1 -i 0 $DIR/$tfile
15156 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
15158 do_facet ost1 $LCTL set_param fail_loc=0
15160 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
15161 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
15164 $LCTL set_param -n $pages_per_rpc
15165 restore_lustre_params < $p
15168 run_test 224c "Don't hang if one of md lost during large bulk RPC"
15170 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
15172 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15173 if [ -z ${MDSSURVEY} ]; then
15174 skip_env "mds-survey not found"
15176 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15177 skip "Need MDS version at least 2.2.51"
15179 local mds=$(facet_host $SINGLEMDS)
15180 local target=$(do_nodes $mds 'lctl dl' |
15181 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15183 local cmd1="file_count=1000 thrhi=4"
15184 local cmd2="dir_count=2 layer=mdd stripe_count=0"
15185 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15186 local cmd="$cmd1 $cmd2 $cmd3"
15188 rm -f ${TMP}/mds_survey*
15190 eval $cmd || error "mds-survey with zero-stripe failed"
15191 cat ${TMP}/mds_survey*
15192 rm -f ${TMP}/mds_survey*
15194 run_test 225a "Metadata survey sanity with zero-stripe"
15197 if [ -z ${MDSSURVEY} ]; then
15198 skip_env "mds-survey not found"
15200 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15201 skip "Need MDS version at least 2.2.51"
15202 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15203 remote_mds_nodsh && skip "remote MDS with nodsh"
15204 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
15205 skip_env "Need to mount OST to test"
15208 local mds=$(facet_host $SINGLEMDS)
15209 local target=$(do_nodes $mds 'lctl dl' |
15210 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15212 local cmd1="file_count=1000 thrhi=4"
15213 local cmd2="dir_count=2 layer=mdd stripe_count=1"
15214 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15215 local cmd="$cmd1 $cmd2 $cmd3"
15217 rm -f ${TMP}/mds_survey*
15219 eval $cmd || error "mds-survey with stripe_count failed"
15220 cat ${TMP}/mds_survey*
15221 rm -f ${TMP}/mds_survey*
15223 run_test 225b "Metadata survey sanity with stripe_count = 1"
15225 mcreate_path2fid () {
15231 local path=$DIR/$tdir/$name
15236 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
15237 error "cannot create $desc"
15239 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
15241 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
15243 fid_path=$($LFS fid2path $MOUNT $fid)
15245 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
15247 [ "$path" == "$fid_path" ] ||
15248 error "fid2path returned $fid_path, expected $path"
15250 echo "pass with $path and $fid"
15255 mkdir -p $DIR/$tdir
15257 mcreate_path2fid 0010666 0 0 fifo "FIFO"
15258 mcreate_path2fid 0020666 1 3 null "character special file (null)"
15259 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
15260 mcreate_path2fid 0040666 0 0 dir "directory"
15261 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
15262 mcreate_path2fid 0100666 0 0 file "regular file"
15263 mcreate_path2fid 0120666 0 0 link "symbolic link"
15264 mcreate_path2fid 0140666 0 0 sock "socket"
15266 run_test 226a "call path2fid and fid2path on files of all type"
15269 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15274 mkdir -p $DIR/$tdir
15275 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
15276 error "create remote directory failed"
15277 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
15278 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
15279 "character special file (null)"
15280 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
15281 "character special file (no device)"
15282 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
15283 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
15284 "block special file (loop)"
15285 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
15286 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
15287 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
15289 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
15291 # LU-1299 Executing or running ldd on a truncated executable does not
15292 # cause an out-of-memory condition.
15294 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15295 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
15297 dd if=$(which date) of=$MOUNT/date bs=1k count=1
15298 chmod +x $MOUNT/date
15300 $MOUNT/date > /dev/null
15301 ldd $MOUNT/date > /dev/null
15304 run_test 227 "running truncated executable does not cause OOM"
15306 # LU-1512 try to reuse idle OI blocks
15308 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15309 remote_mds_nodsh && skip "remote MDS with nodsh"
15310 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15312 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15313 local myDIR=$DIR/$tdir
15316 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15317 $LCTL set_param fail_loc=0x80001002
15318 createmany -o $myDIR/t- 10000
15319 $LCTL set_param fail_loc=0
15320 # The guard is current the largest FID holder
15322 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15324 local IDX=$(($SEQ % 64))
15326 do_facet $SINGLEMDS sync
15327 # Make sure journal flushed.
15329 local blk1=$(do_facet $SINGLEMDS \
15330 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15331 grep Blockcount | awk '{print $4}')
15333 # Remove old files, some OI blocks will become idle.
15334 unlinkmany $myDIR/t- 10000
15335 # Create new files, idle OI blocks should be reused.
15336 createmany -o $myDIR/t- 2000
15337 do_facet $SINGLEMDS sync
15338 # Make sure journal flushed.
15340 local blk2=$(do_facet $SINGLEMDS \
15341 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15342 grep Blockcount | awk '{print $4}')
15344 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15346 run_test 228a "try to reuse idle OI blocks"
15349 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15350 remote_mds_nodsh && skip "remote MDS with nodsh"
15351 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15353 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15354 local myDIR=$DIR/$tdir
15357 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15358 $LCTL set_param fail_loc=0x80001002
15359 createmany -o $myDIR/t- 10000
15360 $LCTL set_param fail_loc=0
15361 # The guard is current the largest FID holder
15363 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15365 local IDX=$(($SEQ % 64))
15367 do_facet $SINGLEMDS sync
15368 # Make sure journal flushed.
15370 local blk1=$(do_facet $SINGLEMDS \
15371 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15372 grep Blockcount | awk '{print $4}')
15374 # Remove old files, some OI blocks will become idle.
15375 unlinkmany $myDIR/t- 10000
15378 stop $SINGLEMDS || error "Fail to stop MDT."
15380 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
15382 df $MOUNT || error "Fail to df."
15383 # Create new files, idle OI blocks should be reused.
15384 createmany -o $myDIR/t- 2000
15385 do_facet $SINGLEMDS sync
15386 # Make sure journal flushed.
15388 local blk2=$(do_facet $SINGLEMDS \
15389 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15390 grep Blockcount | awk '{print $4}')
15392 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15394 run_test 228b "idle OI blocks can be reused after MDT restart"
15398 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15399 remote_mds_nodsh && skip "remote MDS with nodsh"
15400 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15402 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15403 local myDIR=$DIR/$tdir
15406 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15407 $LCTL set_param fail_loc=0x80001002
15408 # 20000 files can guarantee there are index nodes in the OI file
15409 createmany -o $myDIR/t- 20000
15410 $LCTL set_param fail_loc=0
15411 # The guard is current the largest FID holder
15413 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15415 local IDX=$(($SEQ % 64))
15417 do_facet $SINGLEMDS sync
15418 # Make sure journal flushed.
15420 local blk1=$(do_facet $SINGLEMDS \
15421 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15422 grep Blockcount | awk '{print $4}')
15424 # Remove old files, some OI blocks will become idle.
15425 unlinkmany $myDIR/t- 20000
15427 # The OI file should become empty now
15429 # Create new files, idle OI blocks should be reused.
15430 createmany -o $myDIR/t- 2000
15431 do_facet $SINGLEMDS sync
15432 # Make sure journal flushed.
15434 local blk2=$(do_facet $SINGLEMDS \
15435 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15436 grep Blockcount | awk '{print $4}')
15438 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15440 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
15442 test_229() { # LU-2482, LU-3448
15443 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15444 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
15445 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
15446 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
15450 # Create a file with a released layout and stripe count 2.
15451 $MULTIOP $DIR/$tfile H2c ||
15452 error "failed to create file with released layout"
15454 $GETSTRIPE -v $DIR/$tfile
15456 local pattern=$($GETSTRIPE -L $DIR/$tfile)
15457 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
15459 local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
15460 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
15461 stat $DIR/$tfile || error "failed to stat released file"
15463 chown $RUNAS_ID $DIR/$tfile ||
15464 error "chown $RUNAS_ID $DIR/$tfile failed"
15466 chgrp $RUNAS_ID $DIR/$tfile ||
15467 error "chgrp $RUNAS_ID $DIR/$tfile failed"
15469 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
15470 rm $DIR/$tfile || error "failed to remove released file"
15472 run_test 229 "getstripe/stat/rm/attr changes work on released files"
15475 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15476 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15477 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15478 skip "Need MDS version at least 2.11.52"
15482 test_mkdir $DIR/$tdir
15483 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
15484 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
15485 [ $mdt_idx -ne 0 ] &&
15486 error "create local directory on wrong MDT $mdt_idx"
15488 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
15489 error "create remote directory failed"
15490 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
15491 [ $mdt_idx -ne $MDTIDX ] &&
15492 error "create remote directory on wrong MDT $mdt_idx"
15494 createmany -o $DIR/$tdir/test_230/t- 10 ||
15495 error "create files on remote directory failed"
15496 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
15497 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
15498 rm -r $DIR/$tdir || error "unlink remote directory failed"
15500 run_test 230a "Create remote directory and files under the remote directory"
15503 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15504 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15505 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15506 skip "Need MDS version at least 2.11.52"
15514 local migrate_dir=$DIR/$tdir/migrate_dir
15515 local other_dir=$DIR/$tdir/other_dir
15517 test_mkdir $DIR/$tdir
15518 test_mkdir -i0 -c1 $migrate_dir
15519 test_mkdir -i0 -c1 $other_dir
15520 for ((i=0; i<10; i++)); do
15521 mkdir -p $migrate_dir/dir_${i}
15522 createmany -o $migrate_dir/dir_${i}/f 10 ||
15523 error "create files under remote dir failed $i"
15526 cp /etc/passwd $migrate_dir/$tfile
15527 cp /etc/passwd $other_dir/$tfile
15528 chattr +SAD $migrate_dir
15529 chattr +SAD $migrate_dir/$tfile
15531 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15532 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15533 local old_dir_mode=$(stat -c%f $migrate_dir)
15534 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
15536 mkdir -p $migrate_dir/dir_default_stripe2
15537 $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2
15538 $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2
15540 mkdir -p $other_dir
15541 ln $migrate_dir/$tfile $other_dir/luna
15542 ln $migrate_dir/$tfile $migrate_dir/sofia
15543 ln $other_dir/$tfile $migrate_dir/david
15544 ln -s $migrate_dir/$tfile $other_dir/zachary
15545 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
15546 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
15548 $LFS migrate -m $MDTIDX $migrate_dir ||
15549 error "fails on migrating remote dir to MDT1"
15551 echo "migratate to MDT1, then checking.."
15552 for ((i = 0; i < 10; i++)); do
15553 for file in $(find $migrate_dir/dir_${i}); do
15554 mdt_index=$($LFS getstripe -m $file)
15555 [ $mdt_index == $MDTIDX ] ||
15556 error "$file is not on MDT${MDTIDX}"
15560 # the multiple link file should still in MDT0
15561 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
15562 [ $mdt_index == 0 ] ||
15563 error "$file is not on MDT${MDTIDX}"
15565 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15566 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15567 error " expect $old_dir_flag get $new_dir_flag"
15569 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15570 [ "$old_file_flag" = "$new_file_flag" ] ||
15571 error " expect $old_file_flag get $new_file_flag"
15573 local new_dir_mode=$(stat -c%f $migrate_dir)
15574 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15575 error "expect mode $old_dir_mode get $new_dir_mode"
15577 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15578 [ "$old_file_mode" = "$new_file_mode" ] ||
15579 error "expect mode $old_file_mode get $new_file_mode"
15581 diff /etc/passwd $migrate_dir/$tfile ||
15582 error "$tfile different after migration"
15584 diff /etc/passwd $other_dir/luna ||
15585 error "luna different after migration"
15587 diff /etc/passwd $migrate_dir/sofia ||
15588 error "sofia different after migration"
15590 diff /etc/passwd $migrate_dir/david ||
15591 error "david different after migration"
15593 diff /etc/passwd $other_dir/zachary ||
15594 error "zachary different after migration"
15596 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15597 error "${tfile}_ln different after migration"
15599 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15600 error "${tfile}_ln_other different after migration"
15602 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
15603 [ $stripe_count = 2 ] ||
15604 error "dir strpe_count $d != 2 after migration."
15606 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
15607 [ $stripe_count = 2 ] ||
15608 error "file strpe_count $d != 2 after migration."
15610 #migrate back to MDT0
15613 $LFS migrate -m $MDTIDX $migrate_dir ||
15614 error "fails on migrating remote dir to MDT0"
15616 echo "migrate back to MDT0, checking.."
15617 for file in $(find $migrate_dir); do
15618 mdt_index=$($LFS getstripe -m $file)
15619 [ $mdt_index == $MDTIDX ] ||
15620 error "$file is not on MDT${MDTIDX}"
15623 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15624 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15625 error " expect $old_dir_flag get $new_dir_flag"
15627 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15628 [ "$old_file_flag" = "$new_file_flag" ] ||
15629 error " expect $old_file_flag get $new_file_flag"
15631 local new_dir_mode=$(stat -c%f $migrate_dir)
15632 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15633 error "expect mode $old_dir_mode get $new_dir_mode"
15635 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15636 [ "$old_file_mode" = "$new_file_mode" ] ||
15637 error "expect mode $old_file_mode get $new_file_mode"
15639 diff /etc/passwd ${migrate_dir}/$tfile ||
15640 error "$tfile different after migration"
15642 diff /etc/passwd ${other_dir}/luna ||
15643 error "luna different after migration"
15645 diff /etc/passwd ${migrate_dir}/sofia ||
15646 error "sofia different after migration"
15648 diff /etc/passwd ${other_dir}/zachary ||
15649 error "zachary different after migration"
15651 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15652 error "${tfile}_ln different after migration"
15654 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15655 error "${tfile}_ln_other different after migration"
15657 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
15658 [ $stripe_count = 2 ] ||
15659 error "dir strpe_count $d != 2 after migration."
15661 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
15662 [ $stripe_count = 2 ] ||
15663 error "file strpe_count $d != 2 after migration."
15665 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15667 run_test 230b "migrate directory"
15670 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15671 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15672 remote_mds_nodsh && skip "remote MDS with nodsh"
15673 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15674 skip "Need MDS version at least 2.11.52"
15680 local migrate_dir=$DIR/$tdir/migrate_dir
15682 #If migrating directory fails in the middle, all entries of
15683 #the directory is still accessiable.
15684 test_mkdir $DIR/$tdir
15685 test_mkdir -i0 -c1 $migrate_dir
15686 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
15688 createmany -o $migrate_dir/f $total ||
15689 error "create files under ${migrate_dir} failed"
15691 # fail after migrating top dir, and this will fail only once, so the
15692 # first sub file migration will fail (currently f3), others succeed.
15693 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
15694 do_facet mds1 lctl set_param fail_loc=0x1801
15695 local t=$(ls $migrate_dir | wc -l)
15696 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
15697 error "migrate should fail"
15698 local u=$(ls $migrate_dir | wc -l)
15699 [ "$u" == "$t" ] || error "$u != $t during migration"
15701 # add new dir/file should succeed
15702 mkdir $migrate_dir/dir ||
15703 error "mkdir failed under migrating directory"
15704 touch $migrate_dir/file ||
15705 error "create file failed under migrating directory"
15707 # add file with existing name should fail
15708 for file in $migrate_dir/f*; do
15709 stat $file > /dev/null || error "stat $file failed"
15710 $OPENFILE -f O_CREAT:O_EXCL $file &&
15711 error "open(O_CREAT|O_EXCL) $file should fail"
15712 $MULTIOP $file m && error "create $file should fail"
15713 touch $DIR/$tdir/remote_dir/$tfile ||
15714 error "touch $tfile failed"
15715 ln $DIR/$tdir/remote_dir/$tfile $file &&
15716 error "link $file should fail"
15717 mdt_index=$($LFS getstripe -m $file)
15718 if [ $mdt_index == 0 ]; then
15719 # file failed to migrate is not allowed to rename to
15720 mv $DIR/$tdir/remote_dir/$tfile $file &&
15721 error "rename to $file should fail"
15723 mv $DIR/$tdir/remote_dir/$tfile $file ||
15724 error "rename to $file failed"
15726 echo hello >> $file || error "write $file failed"
15729 # resume migration with different options should fail
15730 $LFS migrate -m 0 $migrate_dir &&
15731 error "migrate -m 0 $migrate_dir should fail"
15733 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
15734 error "migrate -c 2 $migrate_dir should fail"
15736 # resume migration should succeed
15737 $LFS migrate -m $MDTIDX $migrate_dir ||
15738 error "migrate $migrate_dir failed"
15740 echo "Finish migration, then checking.."
15741 for file in $(find $migrate_dir); do
15742 mdt_index=$($LFS getstripe -m $file)
15743 [ $mdt_index == $MDTIDX ] ||
15744 error "$file is not on MDT${MDTIDX}"
15747 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15749 run_test 230c "check directory accessiblity if migration failed"
15752 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15753 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15754 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15755 skip "Need MDS version at least 2.11.52"
15757 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
15759 local migrate_dir=$DIR/$tdir/migrate_dir
15769 old_index=$((RANDOM % MDSCOUNT))
15770 old_count=$((MDSCOUNT - old_index))
15771 new_index=$((RANDOM % MDSCOUNT))
15772 new_count=$((MDSCOUNT - new_index))
15773 new_hash="all_char"
15775 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
15776 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
15778 test_mkdir $DIR/$tdir
15779 test_mkdir -i $old_index -c $old_count $migrate_dir
15781 for ((i=0; i<100; i++)); do
15782 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
15783 createmany -o $migrate_dir/dir_${i}/f 100 ||
15784 error "create files under remote dir failed $i"
15787 echo -n "Migrate from MDT$old_index "
15788 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
15789 echo -n "to MDT$new_index"
15790 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
15793 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
15794 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
15795 error "migrate remote dir error"
15797 echo "Finish migration, then checking.."
15798 for file in $(find $migrate_dir); do
15799 mdt_index=$($LFS getstripe -m $file)
15800 if [ $mdt_index -lt $new_index ] ||
15801 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
15802 error "$file is on MDT$mdt_index"
15806 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15808 run_test 230d "check migrate big directory"
15811 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15812 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15813 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15814 skip "Need MDS version at least 2.11.52"
15821 mkdir -p $DIR/$tdir
15822 mkdir $DIR/$tdir/migrate_dir
15823 mkdir $DIR/$tdir/other_dir
15824 touch $DIR/$tdir/migrate_dir/a
15825 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
15826 ls $DIR/$tdir/other_dir
15828 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
15829 error "migrate dir fails"
15831 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
15832 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
15834 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
15835 [ $mdt_index == 0 ] || error "a is not on MDT0"
15837 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
15838 error "migrate dir fails"
15840 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
15841 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
15843 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
15844 [ $mdt_index == 1 ] || error "a is not on MDT1"
15846 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
15847 [ $mdt_index == 1 ] || error "b is not on MDT1"
15849 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
15850 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
15852 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
15854 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15856 run_test 230e "migrate mulitple local link files"
15859 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15860 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15861 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15862 skip "Need MDS version at least 2.11.52"
15867 mkdir -p $DIR/$tdir
15868 mkdir $DIR/$tdir/migrate_dir
15869 $LFS mkdir -i1 $DIR/$tdir/other_dir
15870 touch $DIR/$tdir/migrate_dir/a
15871 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
15872 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
15873 ls $DIR/$tdir/other_dir
15875 # a should be migrated to MDT1, since no other links on MDT0
15876 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
15877 error "#1 migrate dir fails"
15878 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
15879 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
15880 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
15881 [ $mdt_index == 1 ] || error "a is not on MDT1"
15883 # a should stay on MDT1, because it is a mulitple link file
15884 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
15885 error "#2 migrate dir fails"
15886 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
15887 [ $mdt_index == 1 ] || error "a is not on MDT1"
15889 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
15890 error "#3 migrate dir fails"
15892 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
15893 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
15894 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
15896 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
15897 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
15899 # a should be migrated to MDT0, since no other links on MDT1
15900 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
15901 error "#4 migrate dir fails"
15902 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
15903 [ $mdt_index == 0 ] || error "a is not on MDT0"
15905 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15907 run_test 230f "migrate mulitple remote link files"
15910 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15911 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15912 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15913 skip "Need MDS version at least 2.11.52"
15915 mkdir -p $DIR/$tdir/migrate_dir
15917 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
15918 error "migrating dir to non-exist MDT succeeds"
15921 run_test 230g "migrate dir to non-exist MDT"
15924 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15925 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15926 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15927 skip "Need MDS version at least 2.11.52"
15931 mkdir -p $DIR/$tdir/migrate_dir
15933 $LFS migrate -m1 $DIR &&
15934 error "migrating mountpoint1 should fail"
15936 $LFS migrate -m1 $DIR/$tdir/.. &&
15937 error "migrating mountpoint2 should fail"
15940 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
15941 error "migrating $tdir/migrate_dir/.. should fail"
15945 run_test 230h "migrate .. and root"
15948 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15949 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15950 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15951 skip "Need MDS version at least 2.11.52"
15953 mkdir -p $DIR/$tdir/migrate_dir
15955 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
15956 error "migration fails with a tailing slash"
15958 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
15959 error "migration fails with two tailing slashes"
15961 run_test 230i "lfs migrate -m tolerates trailing slashes"
15964 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
15965 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15966 skip "Need MDS version at least 2.11.52"
15968 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
15969 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
15970 error "create $tfile failed"
15971 cat /etc/passwd > $DIR/$tdir/$tfile
15973 $LFS migrate -m 1 $DIR/$tdir
15975 cmp /etc/passwd $DIR/$tdir/$tfile ||
15976 error "DoM file mismatch after migration"
15978 run_test 230j "DoM file data not changed after dir migration"
15981 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
15982 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
15983 skip "Need MDS version at least 2.11.56"
15986 local files_on_starting_mdt=0
15988 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
15989 $LFS getdirstripe $DIR/$tdir
15990 for i in $(seq $total); do
15991 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
15992 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
15993 files_on_starting_mdt=$((files_on_starting_mdt + 1))
15996 echo "$files_on_starting_mdt files on MDT0"
15998 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
15999 $LFS getdirstripe $DIR/$tdir
16001 files_on_starting_mdt=0
16002 for i in $(seq $total); do
16003 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16004 error "file $tfile.$i mismatch after migration"
16005 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16006 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16009 echo "$files_on_starting_mdt files on MDT1 after migration"
16010 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16012 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16013 $LFS getdirstripe $DIR/$tdir
16015 files_on_starting_mdt=0
16016 for i in $(seq $total); do
16017 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16018 error "file $tfile.$i mismatch after 2nd migration"
16019 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16020 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16023 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
16024 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16028 run_test 230k "file data not changed after dir migration"
16031 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16032 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16033 skip "Need MDS version at least 2.11.56"
16035 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16036 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16037 error "create files under remote dir failed $i"
16038 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16040 run_test 230l "readdir between MDTs won't crash"
16044 # For simplicity this test assumes that max_pages_per_rpc
16045 # is the same across all OSCs
16046 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16047 local bulk_size=$((max_pages * PAGE_SIZE))
16048 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16051 mkdir -p $DIR/$tdir
16052 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16053 error "failed to set stripe with -S ${brw_size}M option"
16055 # clear the OSC stats
16056 $LCTL set_param osc.*.stats=0 &>/dev/null
16059 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16060 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16061 oflag=direct &>/dev/null || error "dd failed"
16063 sync; sleep 1; sync # just to be safe
16064 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16065 if [ x$nrpcs != "x1" ]; then
16066 $LCTL get_param osc.*.stats
16067 error "found $nrpcs ost_write RPCs, not 1 as expected"
16071 # Drop the OSC cache, otherwise we will read from it
16072 cancel_lru_locks osc
16074 # clear the OSC stats
16075 $LCTL set_param osc.*.stats=0 &>/dev/null
16077 # Client reads $bulk_size.
16078 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16079 iflag=direct &>/dev/null || error "dd failed"
16081 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16082 if [ x$nrpcs != "x1" ]; then
16083 $LCTL get_param osc.*.stats
16084 error "found $nrpcs ost_read RPCs, not 1 as expected"
16087 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16090 mkdir -p $DIR/$tdir
16092 for i in {0..1023}; do
16093 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16094 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16095 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16099 run_test 231b "must not assert on fully utilized OST request buffer"
16102 mkdir -p $DIR/$tdir
16103 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16105 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16106 do_facet ost1 $LCTL set_param fail_loc=0x31c
16108 # ignore dd failure
16109 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16111 do_facet ost1 $LCTL set_param fail_loc=0
16112 umount_client $MOUNT || error "umount failed"
16113 mount_client $MOUNT || error "mount failed"
16114 stop ost1 || error "cannot stop ost1"
16115 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16117 run_test 232a "failed lock should not block umount"
16120 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16121 skip "Need MDS version at least 2.10.58"
16123 mkdir -p $DIR/$tdir
16124 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16125 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16127 cancel_lru_locks osc
16129 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16130 do_facet ost1 $LCTL set_param fail_loc=0x31c
16133 $LFS data_version $DIR/$tdir/$tfile || true
16135 do_facet ost1 $LCTL set_param fail_loc=0
16136 umount_client $MOUNT || error "umount failed"
16137 mount_client $MOUNT || error "mount failed"
16138 stop ost1 || error "cannot stop ost1"
16139 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16141 run_test 232b "failed data version lock should not block umount"
16144 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
16145 skip "Need MDS version at least 2.3.64"
16146 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16148 local fid=$($LFS path2fid $MOUNT)
16150 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16151 error "cannot access $MOUNT using its FID '$fid'"
16153 run_test 233a "checking that OBF of the FS root succeeds"
16156 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
16157 skip "Need MDS version at least 2.5.90"
16158 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16160 local fid=$($LFS path2fid $MOUNT/.lustre)
16162 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16163 error "cannot access $MOUNT/.lustre using its FID '$fid'"
16165 fid=$($LFS path2fid $MOUNT/.lustre/fid)
16166 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16167 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
16169 run_test 233b "checking that OBF of the FS .lustre succeeds"
16172 local p="$TMP/sanityN-$TESTNAME.parameters"
16173 save_lustre_params client "llite.*.xattr_cache" > $p
16174 lctl set_param llite.*.xattr_cache 1 ||
16175 skip_env "xattr cache is not supported"
16177 mkdir -p $DIR/$tdir || error "mkdir failed"
16178 touch $DIR/$tdir/$tfile || error "touch failed"
16179 # OBD_FAIL_LLITE_XATTR_ENOMEM
16180 $LCTL set_param fail_loc=0x1405
16181 getfattr -n user.attr $DIR/$tdir/$tfile &&
16182 error "getfattr should have failed with ENOMEM"
16183 $LCTL set_param fail_loc=0x0
16186 restore_lustre_params < $p
16189 run_test 234 "xattr cache should not crash on ENOMEM"
16192 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
16193 skip "Need MDS version at least 2.4.52"
16195 flock_deadlock $DIR/$tfile
16200 124) error "process hangs on a deadlock"
16202 *) error "error executing flock_deadlock $DIR/$tfile"
16206 run_test 235 "LU-1715: flock deadlock detection does not work properly"
16210 check_swap_layouts_support
16212 local ref1=/etc/passwd
16213 local ref2=/etc/group
16214 local file1=$DIR/$tdir/f1
16215 local file2=$DIR/$tdir/f2
16217 test_mkdir -c1 $DIR/$tdir
16218 $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
16219 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
16220 $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
16221 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
16222 local fd=$(free_fd)
16223 local cmd="exec $fd<>$file2"
16226 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
16227 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
16230 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
16235 run_test 236 "Layout swap on open unlinked file"
16237 # LU-4659 linkea consistency
16239 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
16240 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
16241 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
16242 skip "Need MDS version at least 2.5.58 or 2.5.2+"
16245 ln $DIR/$tfile $DIR/$tfile.lnk
16246 touch $DIR/$tfile.new
16247 mv $DIR/$tfile.new $DIR/$tfile
16248 local fid1=$($LFS path2fid $DIR/$tfile)
16249 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
16250 local path1=$($LFS fid2path $FSNAME "$fid1")
16251 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
16252 local path2=$($LFS fid2path $FSNAME "$fid2")
16253 [ $tfile.lnk == $path2 ] ||
16254 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
16257 run_test 238 "Verify linkea consistency"
16259 test_239A() { # was test_239
16260 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
16261 skip "Need MDS version at least 2.5.60"
16263 local list=$(comma_list $(mdts_nodes))
16265 mkdir -p $DIR/$tdir
16266 createmany -o $DIR/$tdir/f- 5000
16267 unlinkmany $DIR/$tdir/f- 5000
16268 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
16269 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
16270 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
16271 osp.*MDT*.sync_in_flight" | calc_sum)
16272 [ "$changes" -eq 0 ] || error "$changes not synced"
16274 run_test 239A "osp_sync test"
16276 test_239a() { #LU-5297
16277 remote_mds_nodsh && skip "remote MDS with nodsh"
16280 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
16281 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
16282 chgrp $RUNAS_GID $DIR/$tfile
16283 wait_delete_completed
16285 run_test 239a "process invalid osp sync record correctly"
16287 test_239b() { #LU-5297
16288 remote_mds_nodsh && skip "remote MDS with nodsh"
16291 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
16292 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
16293 chgrp $RUNAS_GID $DIR/$tfile1
16294 wait_delete_completed
16295 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
16297 chgrp $RUNAS_GID $DIR/$tfile2
16298 wait_delete_completed
16300 run_test 239b "process osp sync record with ENOMEM error correctly"
16303 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16304 remote_mds_nodsh && skip "remote MDS with nodsh"
16306 mkdir -p $DIR/$tdir
16308 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
16309 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
16310 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
16311 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
16313 umount_client $MOUNT || error "umount failed"
16314 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
16315 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
16316 mount_client $MOUNT || error "failed to mount client"
16318 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
16319 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
16321 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
16327 for LOOP in $(seq $count); do
16328 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
16329 cancel_lru_locks $OSC || true
16337 for LOOP in $(seq $1); do
16338 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
16343 test_241a() { # was test_241
16344 local bsize=$PAGE_SIZE
16346 (( bsize < 40960 )) && bsize=40960
16347 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16349 cancel_lru_locks $OSC
16350 test_241_bio 1000 $bsize &
16352 test_241_dio 1000 $bsize
16355 run_test 241a "bio vs dio"
16358 local bsize=$PAGE_SIZE
16360 (( bsize < 40960 )) && bsize=40960
16361 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16363 test_241_dio 1000 $bsize &
16365 test_241_dio 1000 $bsize
16368 run_test 241b "dio vs dio"
16371 remote_mds_nodsh && skip "remote MDS with nodsh"
16373 mkdir -p $DIR/$tdir
16374 touch $DIR/$tdir/$tfile
16376 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
16377 do_facet mds1 lctl set_param fail_loc=0x105
16378 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
16380 do_facet mds1 lctl set_param fail_loc=0
16381 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
16383 run_test 242 "mdt_readpage failure should not cause directory unreadable"
16387 test_mkdir $DIR/$tdir
16388 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
16390 run_test 243 "various group lock tests"
16394 test_mkdir $DIR/$tdir
16395 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
16396 sendfile_grouplock $DIR/$tdir/$tfile || \
16397 error "sendfile+grouplock failed"
16400 run_test 244 "sendfile with group lock tests"
16403 local flagname="multi_mod_rpcs"
16404 local connect_data_name="max_mod_rpcs"
16407 # check if multiple modify RPCs flag is set
16408 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
16409 grep "connect_flags:")
16412 echo "$out" | grep -qw $flagname
16413 if [ $? -ne 0 ]; then
16414 echo "connect flag $flagname is not set"
16418 # check if multiple modify RPCs data is set
16419 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
16422 echo "$out" | grep -qw $connect_data_name ||
16423 error "import should have connect data $connect_data_name"
16425 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
16427 test_246() { # LU-7371
16428 remote_ost_nodsh && skip "remote OST with nodsh"
16429 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
16430 skip "Need OST version >= 2.7.62"
16432 do_facet ost1 $LCTL set_param fail_val=4095
16433 #define OBD_FAIL_OST_READ_SIZE 0x234
16434 do_facet ost1 $LCTL set_param fail_loc=0x234
16435 $LFS setstripe $DIR/$tfile -i 0 -c 1
16436 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
16437 cancel_lru_locks $FSNAME-OST0000
16438 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
16440 run_test 246 "Read file of size 4095 should return right length"
16446 umount_client $submount
16451 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16453 skip_env "Fileset feature is not supported"
16455 local submount=${MOUNT}_$tdir
16458 mkdir -p $submount || error "mkdir $submount failed"
16459 FILESET="$FILESET/$tdir" mount_client $submount ||
16460 error "mount $submount failed"
16461 trap "cleanup_247 $submount" EXIT
16462 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
16463 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
16464 error "read $MOUNT/$tdir/$tfile failed"
16465 cleanup_247 $submount
16467 run_test 247a "mount subdir as fileset"
16470 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16471 skip_env "Fileset feature is not supported"
16473 local submount=${MOUNT}_$tdir
16475 rm -rf $MOUNT/$tdir
16476 mkdir -p $submount || error "mkdir $submount failed"
16478 FILESET="$FILESET/$tdir" mount_client $submount &&
16479 error "mount $submount should fail"
16482 run_test 247b "mount subdir that dose not exist"
16485 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16486 skip_env "Fileset feature is not supported"
16488 local submount=${MOUNT}_$tdir
16490 mkdir -p $MOUNT/$tdir/dir1
16491 mkdir -p $submount || error "mkdir $submount failed"
16492 trap "cleanup_247 $submount" EXIT
16493 FILESET="$FILESET/$tdir" mount_client $submount ||
16494 error "mount $submount failed"
16495 local fid=$($LFS path2fid $MOUNT/)
16496 $LFS fid2path $submount $fid && error "fid2path should fail"
16497 cleanup_247 $submount
16499 run_test 247c "running fid2path outside root"
16502 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16503 skip "Fileset feature is not supported"
16505 local submount=${MOUNT}_$tdir
16507 mkdir -p $MOUNT/$tdir/dir1
16508 mkdir -p $submount || error "mkdir $submount failed"
16509 FILESET="$FILESET/$tdir" mount_client $submount ||
16510 error "mount $submount failed"
16511 trap "cleanup_247 $submount" EXIT
16512 local fid=$($LFS path2fid $submount/dir1)
16513 $LFS fid2path $submount $fid || error "fid2path should succeed"
16514 cleanup_247 $submount
16516 run_test 247d "running fid2path inside root"
16520 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16522 skip "Fileset feature is not supported"
16524 local submount=${MOUNT}_$tdir
16527 mkdir -p $submount || error "mkdir $submount failed"
16528 FILESET="$FILESET/.." mount_client $submount &&
16529 error "mount $submount should fail"
16532 run_test 247e "mount .. as fileset"
16535 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
16536 [ -z "$fast_read_sav" ] && skip "no fast read support"
16538 # create a large file for fast read verification
16539 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
16541 # make sure the file is created correctly
16542 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
16543 { rm -f $DIR/$tfile; skip "file creation error"; }
16545 echo "Test 1: verify that fast read is 4 times faster on cache read"
16547 # small read with fast read enabled
16548 $LCTL set_param -n llite.*.fast_read=1
16549 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16550 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16551 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16552 # small read with fast read disabled
16553 $LCTL set_param -n llite.*.fast_read=0
16554 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16555 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16556 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16558 # verify that fast read is 4 times faster for cache read
16559 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
16560 error_not_in_vm "fast read was not 4 times faster: " \
16561 "$t_fast vs $t_slow"
16563 echo "Test 2: verify the performance between big and small read"
16564 $LCTL set_param -n llite.*.fast_read=1
16566 # 1k non-cache read
16567 cancel_lru_locks osc
16568 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16569 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16570 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16572 # 1M non-cache read
16573 cancel_lru_locks osc
16574 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16575 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16576 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16578 # verify that big IO is not 4 times faster than small IO
16579 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
16580 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
16582 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
16585 run_test 248 "fast read verification"
16587 test_249() { # LU-7890
16588 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
16589 skip "Need at least version 2.8.54"
16592 $SETSTRIPE -c 1 $DIR/$tfile
16593 # Offset 2T == 4k * 512M
16594 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
16595 error "dd to 2T offset failed"
16597 run_test 249 "Write above 2T file size"
16600 [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
16601 && skip "no 16TB file size limit on ZFS"
16603 $SETSTRIPE -c 1 $DIR/$tfile
16604 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
16605 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
16606 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
16607 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
16608 conv=notrunc,fsync && error "append succeeded"
16611 run_test 250 "Write above 16T limit"
16614 $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile
16616 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
16617 #Skip once - writing the first stripe will succeed
16618 $LCTL set_param fail_loc=0xa0001407 fail_val=1
16619 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
16620 error "short write happened"
16622 $LCTL set_param fail_loc=0xa0001407 fail_val=1
16623 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
16624 error "short read happened"
16628 run_test 251 "Handling short read and write correctly"
16631 remote_mds_nodsh && skip "remote MDS with nodsh"
16632 remote_ost_nodsh && skip "remote OST with nodsh"
16633 if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then
16634 skip_env "ldiskfs only test"
16644 # check lr_reader on OST0000
16646 dev=$(facet_device $tgt)
16647 out=$(do_facet $tgt $LR_READER $dev)
16648 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
16650 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
16651 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
16652 error "Invalid uuid returned by $LR_READER on target $tgt"
16653 echo -e "uuid returned by $LR_READER is '$uuid'\n"
16655 # check lr_reader -c on MDT0000
16657 dev=$(facet_device $tgt)
16658 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
16659 skip "$LR_READER does not support additional options"
16661 out=$(do_facet $tgt $LR_READER -c $dev)
16662 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
16664 num=$(echo "$out" | grep -c "mdtlov")
16665 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
16666 error "Invalid number of mdtlov clients returned by $LR_READER"
16667 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
16669 # check lr_reader -cr on MDT0000
16670 out=$(do_facet $tgt $LR_READER -cr $dev)
16671 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
16673 echo "$out" | grep -q "^reply_data:$" ||
16674 error "$LR_READER should have returned 'reply_data' section"
16675 num=$(echo "$out" | grep -c "client_generation")
16676 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
16678 run_test 252 "check lr_reader tool"
16680 test_253_fill_ost() {
16681 local size_mb #how many MB should we write to pass watermark
16682 local lwm=$3 #low watermark
16683 local free_10mb #10% of free space
16685 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
16686 size_mb=$((free_kb / 1024 - lwm))
16687 free_10mb=$((free_kb / 10240))
16688 #If 10% of free space cross low watermark use it
16689 if (( free_10mb > size_mb )); then
16692 #At least we need to store 1.1 of difference between
16693 #free space and low watermark
16694 size_mb=$((size_mb + size_mb / 10))
16696 if (( lwm <= $((free_kb / 1024)) )) || [ ! -f $DIR/$tdir/1 ]; then
16697 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M count=$size_mb \
16698 oflag=append conv=notrunc
16703 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
16704 echo "OST still has $((free_kb / 1024)) mbytes free"
16708 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16709 remote_mds_nodsh && skip "remote MDS with nodsh"
16710 remote_mgs_nodsh && skip "remote MGS with nodsh"
16715 local ost_name=$($LFS osts |
16716 sed -n 's/^'$ostidx': \(.*\)_UUID .*/\1/p')
16718 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
16719 do_facet $SINGLEMDS $LCTL get_param -n \
16720 osp.$mdtosc_proc1.reserved_mb_high ||
16721 skip "remote MDS does not support reserved_mb_high"
16725 wait_delete_completed
16728 local last_wm_h=$(do_facet $SINGLEMDS $LCTL get_param -n \
16729 osp.$mdtosc_proc1.reserved_mb_high)
16730 local last_wm_l=$(do_facet $SINGLEMDS $LCTL get_param -n \
16731 osp.$mdtosc_proc1.reserved_mb_low)
16732 echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l"
16734 create_pool $FSNAME.$TESTNAME || error "Pool creation failed"
16735 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name ||
16736 error "Adding $ost_name to pool failed"
16738 # Wait for client to see a OST at pool
16739 wait_update $HOSTNAME "$LCTL get_param -n
16740 lov.$FSNAME-*.pools.$TESTNAME | sort -u |
16741 grep $ost_name" "$ost_name""_UUID" $((TIMEOUT/2)) ||
16742 error "Client can not see the pool"
16743 $SETSTRIPE $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
16744 error "Setstripe failed"
16746 dd if=/dev/zero of=$DIR/$tdir/0 bs=1M count=10
16747 local blocks=$($LFS df $MOUNT | grep $ost_name | awk '{ print $4 }')
16748 echo "OST still has $((blocks/1024)) mbytes free"
16750 local new_lwm=$((blocks/1024-10))
16751 do_facet $SINGLEMDS $LCTL set_param \
16752 osp.$mdtosc_proc1.reserved_mb_high=$((new_lwm+5))
16753 do_facet $SINGLEMDS $LCTL set_param \
16754 osp.$mdtosc_proc1.reserved_mb_low=$new_lwm
16756 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
16758 #First enospc could execute orphan deletion so repeat.
16759 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
16761 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
16762 osp.$mdtosc_proc1.prealloc_status)
16763 echo "prealloc_status $oa_status"
16765 dd if=/dev/zero of=$DIR/$tdir/2 bs=1M count=1 &&
16766 error "File creation should fail"
16767 #object allocation was stopped, but we still able to append files
16768 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M seek=6 count=5 oflag=append ||
16769 error "Append failed"
16770 rm -f $DIR/$tdir/1 $DIR/$tdir/0 $DIR/$tdir/r*
16772 wait_delete_completed
16776 for i in $(seq 10 12); do
16777 dd if=/dev/zero of=$DIR/$tdir/$i bs=1M count=1 2>/dev/null ||
16778 error "File creation failed after rm";
16781 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
16782 osp.$mdtosc_proc1.prealloc_status)
16783 echo "prealloc_status $oa_status"
16785 if (( oa_status != 0 )); then
16786 error "Object allocation still disable after rm"
16788 do_facet $SINGLEMDS $LCTL set_param \
16789 osp.$mdtosc_proc1.reserved_mb_high=$last_wm_h
16790 do_facet $SINGLEMDS $LCTL set_param \
16791 osp.$mdtosc_proc1.reserved_mb_low=$last_wm_l
16794 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $ost_name ||
16795 error "Remove $ost_name from pool failed"
16796 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
16797 error "Pool destroy fialed"
16799 run_test 253 "Check object allocation limit"
16802 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16803 remote_mds_nodsh && skip "remote MDS with nodsh"
16804 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
16805 skip "MDS does not support changelog_size"
16808 local MDT0=$(facet_svc $SINGLEMDS)
16810 changelog_register || error "changelog_register failed"
16812 changelog_clear 0 || error "changelog_clear failed"
16814 local size1=$(do_facet $SINGLEMDS \
16815 $LCTL get_param -n mdd.$MDT0.changelog_size)
16816 echo "Changelog size $size1"
16819 $LFS mkdir -i 0 $DIR/$tdir
16821 mkdir -p $DIR/$tdir/pics/2008/zachy
16822 touch $DIR/$tdir/pics/2008/zachy/timestamp
16823 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
16824 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
16825 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
16826 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
16827 rm $DIR/$tdir/pics/desktop.jpg
16829 local size2=$(do_facet $SINGLEMDS \
16830 $LCTL get_param -n mdd.$MDT0.changelog_size)
16831 echo "Changelog size after work $size2"
16833 (( $size2 > $size1 )) ||
16834 error "new Changelog size=$size2 less than old size=$size1"
16836 run_test 254 "Check changelog size"
16843 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
16844 awk -F: '{print $2}' | grep $type > /dev/null
16845 if [ $? -ne 0 ]; then
16855 lfs ladvise -a willread $file > /dev/null 2>&1
16856 if [ $? -eq 0 ]; then
16860 lfs ladvise -a willread $file 2>&1 |
16861 grep "Inappropriate ioctl for device" > /dev/null
16862 if [ $? -eq 0 ]; then
16869 bc <<<"scale=2; ($1 - $2) * 100 / $2"
16872 # run a random read IO workload
16873 # usage: random_read_iops <filename> <filesize> <iosize>
16874 random_read_iops() {
16877 local iosize=${3:-4096}
16879 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
16880 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
16883 drop_file_oss_cache() {
16887 $LFS ladvise -a dontneed $file 2>/dev/null ||
16888 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
16891 ladvise_willread_performance()
16894 local average_origin=0
16895 local average_cache=0
16896 local average_ladvise=0
16898 for ((i = 1; i <= $repeat; i++)); do
16899 echo "Iter $i/$repeat: reading without willread hint"
16900 cancel_lru_locks osc
16901 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
16902 local speed_origin=$(random_read_iops $DIR/$tfile $size)
16903 echo "Iter $i/$repeat: uncached speed: $speed_origin"
16904 average_origin=$(bc <<<"$average_origin + $speed_origin")
16906 cancel_lru_locks osc
16907 local speed_cache=$(random_read_iops $DIR/$tfile $size)
16908 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
16909 average_cache=$(bc <<<"$average_cache + $speed_cache")
16911 cancel_lru_locks osc
16912 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
16913 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
16914 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
16915 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
16916 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
16918 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
16919 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
16920 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
16922 speedup_cache=$(percent $average_cache $average_origin)
16923 speedup_ladvise=$(percent $average_ladvise $average_origin)
16925 echo "Average uncached read: $average_origin"
16926 echo "Average speedup with OSS cached read: " \
16927 "$average_cache = +$speedup_cache%"
16928 echo "Average speedup with ladvise willread: " \
16929 "$average_ladvise = +$speedup_ladvise%"
16931 local lowest_speedup=20
16932 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
16933 echo "Speedup with OSS cached read less than $lowest_speedup%," \
16934 "got $average_cache%. Skipping ladvise willread check."
16938 # the test won't work on ZFS until it supports 'ladvise dontneed', but
16939 # it is still good to run until then to exercise 'ladvise willread'
16940 ! $LFS ladvise -a dontneed $DIR/$tfile &&
16941 [ "$ost1_FSTYPE" = "zfs" ] &&
16942 echo "osd-zfs does not support dontneed or drop_caches" &&
16945 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
16946 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
16947 error_not_in_vm "Speedup with willread is less than " \
16948 "$lowest_speedup%, got $average_ladvise%"
16952 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
16953 skip "lustre < 2.8.54 does not support ladvise "
16954 remote_ost_nodsh && skip "remote OST with nodsh"
16956 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
16958 ladvise_no_type willread $DIR/$tfile &&
16959 skip "willread ladvise is not supported"
16961 ladvise_no_ioctl $DIR/$tfile &&
16962 skip "ladvise ioctl is not supported"
16965 local size=$((size_mb * 1048576))
16966 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
16967 error "dd to $DIR/$tfile failed"
16969 lfs ladvise -a willread $DIR/$tfile ||
16970 error "Ladvise failed with no range argument"
16972 lfs ladvise -a willread -s 0 $DIR/$tfile ||
16973 error "Ladvise failed with no -l or -e argument"
16975 lfs ladvise -a willread -e 1 $DIR/$tfile ||
16976 error "Ladvise failed with only -e argument"
16978 lfs ladvise -a willread -l 1 $DIR/$tfile ||
16979 error "Ladvise failed with only -l argument"
16981 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
16982 error "End offset should not be smaller than start offset"
16984 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
16985 error "End offset should not be equal to start offset"
16987 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
16988 error "Ladvise failed with overflowing -s argument"
16990 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
16991 error "Ladvise failed with overflowing -e argument"
16993 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
16994 error "Ladvise failed with overflowing -l argument"
16996 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
16997 error "Ladvise succeeded with conflicting -l and -e arguments"
16999 echo "Synchronous ladvise should wait"
17001 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17002 do_nodes $(comma_list $(osts_nodes)) \
17003 $LCTL set_param fail_val=$delay fail_loc=0x237
17005 local start_ts=$SECONDS
17006 lfs ladvise -a willread $DIR/$tfile ||
17007 error "Ladvise failed with no range argument"
17008 local end_ts=$SECONDS
17009 local inteval_ts=$((end_ts - start_ts))
17011 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17012 error "Synchronous advice didn't wait reply"
17015 echo "Asynchronous ladvise shouldn't wait"
17016 local start_ts=$SECONDS
17017 lfs ladvise -a willread -b $DIR/$tfile ||
17018 error "Ladvise failed with no range argument"
17019 local end_ts=$SECONDS
17020 local inteval_ts=$((end_ts - start_ts))
17022 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17023 error "Asynchronous advice blocked"
17026 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17027 ladvise_willread_performance
17029 run_test 255a "check 'lfs ladvise -a willread'"
17035 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17039 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17040 skip "lustre < 2.8.54 does not support ladvise "
17041 remote_ost_nodsh && skip "remote OST with nodsh"
17043 lfs setstripe -c 1 -i 0 $DIR/$tfile
17045 ladvise_no_type dontneed $DIR/$tfile &&
17046 skip "dontneed ladvise is not supported"
17048 ladvise_no_ioctl $DIR/$tfile &&
17049 skip "ladvise ioctl is not supported"
17051 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17052 [ "$ost1_FSTYPE" = "zfs" ] &&
17053 skip "zfs-osd does not support 'ladvise dontneed'"
17056 local size=$((size_mb * 1048576))
17057 # In order to prevent disturbance of other processes, only check 3/4
17058 # of the memory usage
17059 local kibibytes=$((size_mb * 1024 * 3 / 4))
17061 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17062 error "dd to $DIR/$tfile failed"
17064 #force write to complete before dropping OST cache & checking memory
17067 local total=$(facet_meminfo ost1 MemTotal)
17068 echo "Total memory: $total KiB"
17070 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17071 local before_read=$(facet_meminfo ost1 Cached)
17072 echo "Cache used before read: $before_read KiB"
17074 lfs ladvise -a willread $DIR/$tfile ||
17075 error "Ladvise willread failed"
17076 local after_read=$(facet_meminfo ost1 Cached)
17077 echo "Cache used after read: $after_read KiB"
17079 lfs ladvise -a dontneed $DIR/$tfile ||
17080 error "Ladvise dontneed again failed"
17081 local no_read=$(facet_meminfo ost1 Cached)
17082 echo "Cache used after dontneed ladvise: $no_read KiB"
17084 if [ $total -lt $((before_read + kibibytes)) ]; then
17085 echo "Memory is too small, abort checking"
17089 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17090 error "Ladvise willread should use more memory" \
17091 "than $kibibytes KiB"
17094 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17095 error "Ladvise dontneed should release more memory" \
17096 "than $kibibytes KiB"
17099 run_test 255b "check 'lfs ladvise -a dontneed'"
17102 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17103 skip "lustre < 2.10.53 does not support lockahead"
17111 test_mkdir -p $DIR/$tdir
17112 $SETSTRIPE -i 0 $DIR/$tdir
17114 #test 10 returns only success/failure
17116 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17118 if [ $rc -eq 255 ]; then
17119 error "Ladvise test${i} failed, ${rc}"
17122 #test 11 counts lock enqueue requests, all others count new locks
17124 count=$(do_facet ost1 \
17125 $LCTL get_param -n ost.OSS.ost.stats)
17126 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17128 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17130 if [ $rc -eq 255 ]; then
17131 error "Ladvise test${i} failed, ${rc}"
17134 new_count=$(do_facet ost1 \
17135 $LCTL get_param -n ost.OSS.ost.stats)
17136 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17137 awk '{ print $2 }')
17139 difference="$((new_count - count))"
17140 if [ $difference -ne $rc ]; then
17141 error "Ladvise test${i}, bad enqueue count, returned " \
17142 "${rc}, actual ${difference}"
17145 for i in $(seq 12 21); do
17146 # If we do not do this, we run the risk of having too many
17147 # locks and starting lock cancellation while we are checking
17149 cancel_lru_locks osc
17151 count=$($LCTL get_param -n \
17152 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17154 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17156 if [ $rc -eq 255 ]; then
17157 error "Ladvise test ${i} failed, ${rc}"
17160 new_count=$($LCTL get_param -n \
17161 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17162 difference="$((new_count - count))"
17164 # Test 15 output is divided by 100 to map down to valid return
17165 if [ $i -eq 15 ]; then
17169 if [ $difference -ne $rc ]; then
17170 error "Ladvise test ${i}, bad lock count, returned " \
17171 "${rc}, actual ${difference}"
17175 #test 22 returns only success/failure
17177 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17179 if [ $rc -eq 255 ]; then
17180 error "Ladvise test${i} failed, ${rc}"
17183 run_test 255c "suite of ladvise lockahead tests"
17186 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17187 remote_mds_nodsh && skip "remote MDS with nodsh"
17188 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17189 changelog_users $SINGLEMDS | grep "^cl" &&
17190 skip "active changelog user"
17196 mdt_dev=$(mdsdevname 1)
17199 changelog_register || error "changelog_register failed"
17202 mkdir -p $DIR/$tdir
17204 changelog_clear 0 || error "changelog_clear failed"
17207 touch $DIR/$tdir/{1..10}
17210 stop $SINGLEMDS || error "Fail to stop MDT"
17214 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
17216 #after mount new plainllog is used
17217 touch $DIR/$tdir/{11..19}
17218 local tmpfile=$(mktemp -u $tfile.XXXXXX)
17219 cat_sl=$(do_facet $SINGLEMDS "sync; \
17220 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17221 llog_reader $tmpfile | grep -c type=1064553b")
17222 do_facet $SINGLEMDS llog_reader $tmpfile
17224 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
17226 changelog_clear 0 || error "changelog_clear failed"
17228 cat_sl=$(do_facet $SINGLEMDS "sync; \
17229 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17230 llog_reader $tmpfile | grep -c type=1064553b; rm -f $tmpfile")
17232 if (( cat_sl == 2 )); then
17233 error "Empty plain llog was not deleted from changelog catalog"
17234 elif (( cat_sl != 1 )); then
17235 error "Active plain llog shouldn't be deleted from catalog"
17238 run_test 256 "Check llog delete for empty and not full state"
17241 remote_mds_nodsh && skip "remote MDS with nodsh"
17242 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
17243 skip "Need MDS version at least 2.8.55"
17245 test_mkdir $DIR/$tdir
17247 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
17248 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
17251 #define OBD_FAIL_MDS_XATTR_REP 0x161
17252 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17253 local facet=mds$((mdtidx + 1))
17254 set_nodes_failloc $(facet_active_host $facet) 0x80000161
17255 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
17257 stop $facet || error "stop MDS failed"
17258 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
17259 error "start MDS fail"
17261 run_test 257 "xattr locks are not lost"
17263 # Verify we take the i_mutex when security requires it
17265 #define OBD_FAIL_IMUTEX_SEC 0x141c
17266 $LCTL set_param fail_loc=0x141c
17268 chmod u+s $DIR/$tfile
17269 chmod a+rwx $DIR/$tfile
17270 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17272 if [ $RC -ne 0 ]; then
17273 error "error, failed to take i_mutex, rc=$?"
17277 run_test 258a "verify i_mutex security behavior when suid attributes is set"
17279 # Verify we do NOT take the i_mutex in the normal case
17281 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
17282 $LCTL set_param fail_loc=0x141d
17285 chmod a+rw $DIR/$tfile
17286 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17288 if [ $RC -ne 0 ]; then
17289 error "error, took i_mutex unnecessarily, rc=$?"
17294 run_test 258b "verify i_mutex security behavior"
17297 local file=$DIR/$tfile
17301 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17303 stack_trap "rm -f $file" EXIT
17305 wait_delete_completed
17306 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17307 echo "before: $before"
17309 $LFS setstripe -i 0 -c 1 $file
17310 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
17312 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17313 echo "after write: $after"
17315 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
17316 do_facet ost1 $LCTL set_param fail_loc=0x2301
17318 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17319 echo "after truncate: $after"
17322 do_facet ost1 $LCTL set_param fail_loc=0
17323 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17325 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17326 echo "after restart: $after"
17327 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
17328 error "missing truncate?"
17332 run_test 259 "crash at delayed truncate"
17335 #define OBD_FAIL_MDC_CLOSE 0x806
17336 $LCTL set_param fail_loc=0x80000806
17340 run_test 260 "Check mdc_close fail"
17342 ### Data-on-MDT sanity tests ###
17344 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17345 skip "Need MDS version at least 2.10.55 for DoM"
17348 local dom=$DIR/$tdir/dom_file
17349 local tmp=$DIR/$tdir/tmp_file
17351 mkdir -p $DIR/$tdir
17353 # basic checks for DoM component creation
17354 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
17355 error "Can set MDT layout to non-first entry"
17357 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
17358 error "Can define multiple entries as MDT layout"
17360 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
17362 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
17363 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
17364 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
17366 local mdtidx=$($LFS getstripe -m $dom)
17367 local mdtname=MDT$(printf %04x $mdtidx)
17368 local facet=mds$((mdtidx + 1))
17369 local space_check=1
17371 # Skip free space checks with ZFS
17372 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
17376 local size_tmp=$((65536 * 3))
17377 local mdtfree1=$(do_facet $facet \
17378 lctl get_param -n osd*.*$mdtname.kbytesfree)
17380 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17381 # check also direct IO along write
17382 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
17383 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17385 cmp $tmp $dom || error "file data is different"
17386 [ $(stat -c%s $dom) == $size_tmp ] ||
17387 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17388 if [ $space_check == 1 ]; then
17389 local mdtfree2=$(do_facet $facet \
17390 lctl get_param -n osd*.*$mdtname.kbytesfree)
17392 # increase in usage from by $size_tmp
17393 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17394 error "MDT free space wrong after write: " \
17395 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17399 local size_dom=10000
17401 $TRUNCATE $dom $size_dom
17402 [ $(stat -c%s $dom) == $size_dom ] ||
17403 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
17404 if [ $space_check == 1 ]; then
17405 mdtfree1=$(do_facet $facet \
17406 lctl get_param -n osd*.*$mdtname.kbytesfree)
17407 # decrease in usage from $size_tmp to new $size_dom
17408 [ $(($mdtfree1 - $mdtfree2)) -ge \
17409 $(((size_tmp - size_dom) / 1024)) ] ||
17410 error "MDT free space is wrong after truncate: " \
17411 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
17417 size_dom=$((size_dom + size_tmp))
17418 [ $(stat -c%s $dom) == $size_dom ] ||
17419 error "bad size after append: $(stat -c%s $dom) != $size_dom"
17420 if [ $space_check == 1 ]; then
17421 mdtfree2=$(do_facet $facet \
17422 lctl get_param -n osd*.*$mdtname.kbytesfree)
17423 # increase in usage by $size_tmp from previous
17424 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17425 error "MDT free space is wrong after append: " \
17426 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17431 if [ $space_check == 1 ]; then
17432 mdtfree1=$(do_facet $facet \
17433 lctl get_param -n osd*.*$mdtname.kbytesfree)
17434 # decrease in usage by $size_dom from previous
17435 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
17436 error "MDT free space is wrong after removal: " \
17437 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
17440 # combined striping
17441 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
17442 error "Can't create DoM + OST striping"
17444 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
17445 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17446 # check also direct IO along write
17447 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17449 cmp $tmp $dom || error "file data is different"
17450 [ $(stat -c%s $dom) == $size_tmp ] ||
17451 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17456 run_test 270a "DoM: basic functionality tests"
17459 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17460 skip "Need MDS version at least 2.10.55"
17462 local dom=$DIR/$tdir/dom_file
17463 local max_size=1048576
17465 mkdir -p $DIR/$tdir
17466 $LFS setstripe -E $max_size -L mdt $dom
17468 # truncate over the limit
17469 $TRUNCATE $dom $(($max_size + 1)) &&
17470 error "successful truncate over the maximum size"
17471 # write over the limit
17472 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
17473 error "successful write over the maximum size"
17474 # append over the limit
17475 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
17476 echo "12345" >> $dom && error "successful append over the maximum size"
17481 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
17484 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17485 skip "Need MDS version at least 2.10.55"
17487 mkdir -p $DIR/$tdir
17488 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17490 # check files inherit DoM EA
17491 touch $DIR/$tdir/first
17492 [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] ||
17493 error "bad pattern"
17494 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
17495 error "bad stripe count"
17496 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
17497 error "bad stripe size"
17499 # check directory inherits DoM EA and uses it as default
17500 mkdir $DIR/$tdir/subdir
17501 touch $DIR/$tdir/subdir/second
17502 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
17503 error "bad pattern in sub-directory"
17504 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
17505 error "bad stripe count in sub-directory"
17506 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
17507 error "bad stripe size in sub-directory"
17510 run_test 270c "DoM: DoM EA inheritance tests"
17513 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17514 skip "Need MDS version at least 2.10.55"
17516 mkdir -p $DIR/$tdir
17517 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17519 # inherit default DoM striping
17520 mkdir $DIR/$tdir/subdir
17521 touch $DIR/$tdir/subdir/f1
17523 # change default directory striping
17524 $LFS setstripe -c 1 $DIR/$tdir/subdir
17525 touch $DIR/$tdir/subdir/f2
17526 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
17527 error "wrong default striping in file 2"
17528 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
17529 error "bad pattern in file 2"
17532 run_test 270d "DoM: change striping from DoM to RAID0"
17535 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17536 skip "Need MDS version at least 2.10.55"
17538 mkdir -p $DIR/$tdir/dom
17539 mkdir -p $DIR/$tdir/norm
17542 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
17543 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
17545 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
17546 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
17548 # find DoM files by layout
17549 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
17550 [ $NUM -eq $DOMFILES ] ||
17551 error "lfs find -L: found $NUM, expected $DOMFILES"
17552 echo "Test 1: lfs find 20 DOM files by layout: OK"
17554 # there should be 1 dir with default DOM striping
17555 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
17557 error "lfs find -L: found $NUM, expected 1 dir"
17558 echo "Test 2: lfs find 1 DOM dir by layout: OK"
17560 # find DoM files by stripe size
17561 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
17562 [ $NUM -eq $DOMFILES ] ||
17563 error "lfs find -S: found $NUM, expected $DOMFILES"
17564 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
17566 # find files by stripe offset except DoM files
17567 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
17568 [ $NUM -eq $NORMFILES ] ||
17569 error "lfs find -i: found $NUM, expected $NORMFILES"
17570 echo "Test 5: lfs find no DOM files by stripe index: OK"
17573 run_test 270e "DoM: lfs find with DoM files test"
17576 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17577 skip "Need MDS version at least 2.10.55"
17579 local mdtname=${FSNAME}-MDT0000-mdtlov
17580 local dom=$DIR/$tdir/dom_file
17581 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
17582 lod.$mdtname.dom_stripesize)
17583 local dom_limit=131072
17585 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
17586 local dom_current=$(do_facet mds1 $LCTL get_param -n \
17587 lod.$mdtname.dom_stripesize)
17588 [ ${dom_limit} -eq ${dom_current} ] ||
17589 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
17591 $LFS mkdir -i 0 -c 1 $DIR/$tdir
17592 $LFS setstripe -d $DIR/$tdir
17593 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
17594 error "Can't set directory default striping"
17596 # exceed maximum stripe size
17597 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
17598 error "Can't create file with $((dom_limit * 2)) DoM stripe"
17599 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
17600 error "Able to create DoM component size more than LOD limit"
17602 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
17603 dom_current=$(do_facet mds1 $LCTL get_param -n \
17604 lod.$mdtname.dom_stripesize)
17605 [ 0 -eq ${dom_current} ] ||
17606 error "Can't set zero DoM stripe limit"
17609 # attempt to create DoM file on server with disabled DoM should
17610 # remove DoM entry from layout and be succeed
17611 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
17612 error "Can't create DoM file (DoM is disabled)"
17613 [ $($LFS getstripe -L $dom) == "mdt" ] &&
17614 error "File has DoM component while DoM is disabled"
17617 # attempt to create DoM file with only DoM stripe should return error
17618 $LFS setstripe -E $dom_limit -L mdt $dom &&
17619 error "Able to create DoM-only file while DoM is disabled"
17621 # too low values to be aligned with smallest stripe size 64K
17622 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
17623 dom_current=$(do_facet mds1 $LCTL get_param -n \
17624 lod.$mdtname.dom_stripesize)
17625 [ 30000 -eq ${dom_current} ] &&
17626 error "Can set too small DoM stripe limit"
17628 # 64K is a minimal stripe size in Lustre, expect limit of that size
17629 [ 65536 -eq ${dom_current} ] ||
17630 error "Limit is not set to 64K but ${dom_current}"
17632 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
17633 dom_current=$(do_facet mds1 $LCTL get_param -n \
17634 lod.$mdtname.dom_stripesize)
17636 [ 2147483648 -eq ${dom_current} ] &&
17637 error "Can set too large DoM stripe limit"
17639 do_facet mds1 $LCTL set_param -n \
17640 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
17641 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
17642 error "Can't create DoM component size after limit change"
17643 do_facet mds1 $LCTL set_param -n \
17644 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
17645 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
17646 error "Can't create DoM file after limit decrease"
17647 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
17648 error "Can create big DoM component after limit decrease"
17649 touch ${dom}_def ||
17650 error "Can't create file with old default layout"
17652 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
17655 run_test 270f "DoM: maximum DoM stripe size checks"
17658 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17659 skip "Need MDS version at least 2.10.55"
17661 local dom=$DIR/$tdir/dom
17663 mkdir -p $DIR/$tdir
17665 $LFS setstripe -E 1024K -L mdt $dom
17667 lctl set_param -n mdc.*.stats=clear
17668 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
17669 cat $dom > /dev/null
17670 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
17671 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
17675 run_test 271a "DoM: data is cached for read after write"
17678 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17679 skip "Need MDS version at least 2.10.55"
17681 local dom=$DIR/$tdir/dom
17683 mkdir -p $DIR/$tdir
17685 $LFS setstripe -E 1024K -L mdt -E EOF $dom
17687 lctl set_param -n mdc.*.stats=clear
17688 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
17689 cancel_lru_locks mdc
17690 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
17691 # second stat to check size is cached on client
17692 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
17693 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
17694 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
17697 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
17700 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17701 skip "Need MDS version at least 2.10.55"
17703 local dom=$DIR/$tdir/dom
17705 mkdir -p $DIR/$tdir
17707 $LFS setstripe -E 1024K -L mdt -E EOF $dom
17709 lctl set_param -n mdc.*.stats=clear
17710 lctl set_param -n osc.*.stats=clear
17711 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
17712 cancel_lru_locks mdc
17713 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
17714 # second stat to check size is cached on client
17715 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
17716 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
17717 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
17718 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
17719 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
17722 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
17728 local mdt=MDT$(printf %04x $mdtidx)
17730 if [ -z $param ]; then
17731 lctl get_param -n mdc.*$mdt*.stats
17733 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
17738 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17739 skip "Need MDS version at least 2.10.55"
17741 local dom=$DIR/$tdir/dom
17743 mkdir -p $DIR/$tdir
17745 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17747 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17748 local facet=mds$((mdtidx + 1))
17750 cancel_lru_locks mdc
17751 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
17752 createmany -o $dom 1000
17753 lctl set_param -n mdc.*.stats=clear
17754 smalliomany -w $dom 1000 200
17755 get_mdc_stats $mdtidx
17756 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
17757 # Each file has 1 open, 1 IO enqueues, total 2000
17758 # but now we have also +1 getxattr for security.capability, total 3000
17759 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
17760 unlinkmany $dom 1000
17762 cancel_lru_locks mdc
17763 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
17764 createmany -o $dom 1000
17765 lctl set_param -n mdc.*.stats=clear
17766 smalliomany -w $dom 1000 200
17767 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
17768 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
17769 # for OPEN and IO lock.
17770 [ $((enq - enq_2)) -ge 1000 ] ||
17771 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
17772 unlinkmany $dom 1000
17775 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
17777 cleanup_271def_tests() {
17783 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
17784 skip "Need MDS version at least 2.10.57"
17786 local dom=$DIR/$tdir/dom
17787 local tmp=$TMP/$tfile
17788 trap "cleanup_271def_tests $tmp" EXIT
17790 mkdir -p $DIR/$tdir
17792 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17794 local mdtidx=$($GETSTRIPE -M $DIR/$tdir)
17796 cancel_lru_locks mdc
17797 dd if=/dev/urandom of=$tmp bs=1000 count=1
17798 dd if=$tmp of=$dom bs=1000 count=1
17799 cancel_lru_locks mdc
17801 cat /etc/hosts >> $tmp
17802 lctl set_param -n mdc.*.stats=clear
17804 # append data to the same file it should update local page
17805 echo "Append to the same page"
17806 cat /etc/hosts >> $dom
17807 local num=$(get_mdc_stats $mdtidx ost_read)
17808 local ra=$(get_mdc_stats $mdtidx req_active)
17809 local rw=$(get_mdc_stats $mdtidx req_waittime)
17811 [ -z $num ] || error "$num READ RPC occured"
17812 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
17816 cmp $tmp $dom || error "file miscompare"
17818 cancel_lru_locks mdc
17819 lctl set_param -n mdc.*.stats=clear
17821 echo "Open and read file"
17822 cat $dom > /dev/null
17823 local num=$(get_mdc_stats $mdtidx ost_read)
17824 local ra=$(get_mdc_stats $mdtidx req_active)
17825 local rw=$(get_mdc_stats $mdtidx req_waittime)
17827 [ -z $num ] || error "$num READ RPC occured"
17828 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
17832 cmp $tmp $dom || error "file miscompare"
17836 run_test 271d "DoM: read on open (1K file in reply buffer)"
17839 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
17840 skip "Need MDS version at least 2.10.57"
17842 local dom=$DIR/$tdir/dom
17843 local tmp=$TMP/$tfile
17844 trap "cleanup_271def_tests $tmp" EXIT
17846 mkdir -p $DIR/$tdir
17848 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17850 local mdtidx=$($GETSTRIPE -M $DIR/$tdir)
17852 cancel_lru_locks mdc
17853 dd if=/dev/urandom of=$tmp bs=200000 count=1
17854 dd if=$tmp of=$dom bs=200000 count=1
17855 cancel_lru_locks mdc
17856 cat /etc/hosts >> $tmp
17857 lctl set_param -n mdc.*.stats=clear
17859 echo "Append to the same page"
17860 cat /etc/hosts >> $dom
17861 local num=$(get_mdc_stats $mdtidx ost_read)
17862 local ra=$(get_mdc_stats $mdtidx req_active)
17863 local rw=$(get_mdc_stats $mdtidx req_waittime)
17865 [ -z $num ] || error "$num READ RPC occured"
17866 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
17870 cmp $tmp $dom || error "file miscompare"
17872 cancel_lru_locks mdc
17873 lctl set_param -n mdc.*.stats=clear
17875 echo "Open and read file"
17876 cat $dom > /dev/null
17877 local num=$(get_mdc_stats $mdtidx ost_read)
17878 local ra=$(get_mdc_stats $mdtidx req_active)
17879 local rw=$(get_mdc_stats $mdtidx req_waittime)
17881 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
17882 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
17886 cmp $tmp $dom || error "file miscompare"
17890 run_test 271f "DoM: read on open (200K file and read tail)"
17893 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
17894 skip "Skipping due to old client or server version"
17896 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
17898 $CHECKSTAT -t file $DIR1/$tfile
17900 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
17903 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
17904 $LCTL set_param fail_loc=0x80000314
17905 rm $DIR1/$tfile || error "Unlink fails"
17907 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
17908 [ $RC -eq 0 ] || error "Failed write to stale object"
17910 run_test 271g "Discard DoM data vs client flush race"
17913 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
17914 skip "Need MDS version at least 2.11.50"
17916 local dom=$DIR/$tdir/dom
17917 mkdir -p $DIR/$tdir
17919 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
17920 dd if=/dev/urandom of=$dom bs=512K count=1 ||
17921 error "failed to write data into $dom"
17922 local old_md5=$(md5sum $dom)
17924 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
17925 error "failed to migrate to the same DoM component"
17927 [ $($LFS getstripe -c $dom) -eq 2 ] ||
17928 error "layout was not changed silently"
17930 local new_md5=$(md5sum $dom)
17932 [ "$old_md5" != "$new_md5" ] &&
17933 error "md5sum differ: $old_md5, $new_md5"
17936 run_test 272a "DoM migration: new layout with the same DOM component"
17939 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
17940 skip "Need MDS version at least 2.11.50"
17942 local dom=$DIR/$tdir/dom
17943 mkdir -p $DIR/$tdir
17944 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
17946 local mdtidx=$($LFS getstripe -m $dom)
17947 local mdtname=MDT$(printf %04x $mdtidx)
17948 local facet=mds$((mdtidx + 1))
17950 local mdtfree1=$(do_facet $facet \
17951 lctl get_param -n osd*.*$mdtname.kbytesfree)
17952 dd if=/dev/urandom of=$dom bs=2M count=1 ||
17953 error "failed to write data into $dom"
17954 local old_md5=$(md5sum $dom)
17955 cancel_lru_locks mdc
17956 local mdtfree1=$(do_facet $facet \
17957 lctl get_param -n osd*.*$mdtname.kbytesfree)
17959 $LFS migrate -c2 $dom ||
17960 error "failed to migrate to the new composite layout"
17961 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
17962 error "MDT stripe was not removed"
17964 cancel_lru_locks mdc
17965 local new_md5=$(md5sum $dom)
17966 [ "$old_md5" != "$new_md5" ] &&
17967 error "$old_md5 != $new_md5"
17969 # Skip free space checks with ZFS
17970 if [ "$(facet_fstype $facet)" != "zfs" ]; then
17971 local mdtfree2=$(do_facet $facet \
17972 lctl get_param -n osd*.*$mdtname.kbytesfree)
17973 [ $mdtfree2 -gt $mdtfree1 ] ||
17974 error "MDT space is not freed after migration"
17978 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
17981 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
17982 skip "Need MDS version at least 2.11.50"
17984 local dom=$DIR/$tdir/$tfile
17985 mkdir -p $DIR/$tdir
17986 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
17988 local mdtidx=$($LFS getstripe -m $dom)
17989 local mdtname=MDT$(printf %04x $mdtidx)
17990 local facet=mds$((mdtidx + 1))
17992 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
17993 error "failed to write data into $dom"
17994 local old_md5=$(md5sum $dom)
17995 cancel_lru_locks mdc
17996 local mdtfree1=$(do_facet $facet \
17997 lctl get_param -n osd*.*$mdtname.kbytesfree)
17999 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18000 error "failed to migrate to the new composite layout"
18001 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18002 error "MDT stripe was not removed"
18004 cancel_lru_locks mdc
18005 local new_md5=$(md5sum $dom)
18006 [ "$old_md5" != "$new_md5" ] &&
18007 error "$old_md5 != $new_md5"
18009 # Skip free space checks with ZFS
18010 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18011 local mdtfree2=$(do_facet $facet \
18012 lctl get_param -n osd*.*$mdtname.kbytesfree)
18013 [ $mdtfree2 -gt $mdtfree1 ] ||
18014 error "MDS space is not freed after migration"
18018 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18021 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18022 skip "Need MDS version at least 2.11.50"
18024 # Layout swap cannot be done if either file has DOM component,
18025 # this will never be supported, migration should be used instead
18027 local dom=$DIR/$tdir/$tfile
18028 mkdir -p $DIR/$tdir
18030 $LFS setstripe -c2 ${dom}_plain
18031 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18032 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18033 error "can swap layout with DoM component"
18034 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18035 error "can swap layout with DoM component"
18037 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18038 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18039 error "can swap layout with DoM component"
18040 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18041 error "can swap layout with DoM component"
18044 run_test 273a "DoM: layout swapping should fail with DOM"
18047 remote_ost_nodsh && skip "remote OST with nodsh"
18048 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18049 skip "Need OST version >= 2.10.57"
18051 local file=$DIR/$tfile
18054 oss=$(comma_list $(osts_nodes))
18056 dd if=/dev/urandom of=$file bs=1M count=2 ||
18057 error "failed to create a file"
18058 cancel_lru_locks osc
18061 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18062 error "failed to read a file"
18064 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
18065 $LCTL set_param fail_loc=0x8000031f
18067 cancel_lru_locks osc &
18070 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
18071 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
18072 #IO takes another lock, but matches the PENDING one
18073 #and places it to the IO RPC
18074 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18075 error "failed to read a file with PENDING lock"
18077 run_test 275 "Read on a canceled duplicate lock"
18080 remote_ost_nodsh && skip "remote OST with nodsh"
18083 do_facet ost1 "(while true; do \
18084 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
18085 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
18088 for LOOP in $(seq 20); do
18090 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
18093 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
18094 rm $TMP/sanity_276_pid"
18096 run_test 276 "Race between mount and obd_statfs"
18098 cleanup_test_300() {
18102 test_striped_dir() {
18107 mkdir -p $DIR/$tdir
18109 SAVE_UMASK=$(umask)
18110 trap cleanup_test_300 RETURN EXIT
18112 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
18113 $DIR/$tdir/striped_dir ||
18114 error "set striped dir error"
18116 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
18117 [ "$mode" = "755" ] || error "expect 755 got $mode"
18119 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
18120 error "getdirstripe failed"
18121 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
18122 if [ "$stripe_count" != "2" ]; then
18123 error "1:stripe_count is $stripe_count, expect 2"
18125 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
18126 if [ "$stripe_count" != "2" ]; then
18127 error "2:stripe_count is $stripe_count, expect 2"
18130 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
18131 if [ "$stripe_index" != "$mdt_index" ]; then
18132 error "stripe_index is $stripe_index, expect $mdt_index"
18135 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18136 error "nlink error after create striped dir"
18138 mkdir $DIR/$tdir/striped_dir/a
18139 mkdir $DIR/$tdir/striped_dir/b
18141 stat $DIR/$tdir/striped_dir/a ||
18142 error "create dir under striped dir failed"
18143 stat $DIR/$tdir/striped_dir/b ||
18144 error "create dir under striped dir failed"
18146 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
18147 error "nlink error after mkdir"
18149 rmdir $DIR/$tdir/striped_dir/a
18150 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
18151 error "nlink error after rmdir"
18153 rmdir $DIR/$tdir/striped_dir/b
18154 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18155 error "nlink error after rmdir"
18157 chattr +i $DIR/$tdir/striped_dir
18158 createmany -o $DIR/$tdir/striped_dir/f 10 &&
18159 error "immutable flags not working under striped dir!"
18160 chattr -i $DIR/$tdir/striped_dir
18162 rmdir $DIR/$tdir/striped_dir ||
18163 error "rmdir striped dir error"
18171 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18172 skip "skipped for lustre < 2.7.0"
18173 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18174 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18176 test_striped_dir 0 || error "failed on striped dir on MDT0"
18177 test_striped_dir 1 || error "failed on striped dir on MDT0"
18179 run_test 300a "basic striped dir sanity test"
18182 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18183 skip "skipped for lustre < 2.7.0"
18184 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18185 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18192 test_mkdir $DIR/$tdir || error "mkdir fail"
18193 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18194 error "set striped dir error"
18195 for i in {0..9}; do
18196 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
18198 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
18199 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
18200 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
18202 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
18203 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
18204 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
18208 run_test 300b "check ctime/mtime for striped dir"
18211 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18212 skip "skipped for lustre < 2.7.0"
18213 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18214 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18218 mkdir -p $DIR/$tdir
18219 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
18220 error "set striped dir error"
18222 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
18223 error "chown striped dir failed"
18225 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
18226 error "create 5k files failed"
18228 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
18230 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
18234 run_test 300c "chown && check ls under striped directory"
18237 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18238 skip "skipped for lustre < 2.7.0"
18239 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18240 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18245 mkdir -p $DIR/$tdir
18246 $SETSTRIPE -c 2 $DIR/$tdir
18248 #local striped directory
18249 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18250 error "set striped dir error"
18251 createmany -o $DIR/$tdir/striped_dir/f 10 ||
18252 error "create 10 files failed"
18254 #remote striped directory
18255 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
18256 error "set striped dir error"
18257 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
18258 error "create 10 files failed"
18260 for file in $(find $DIR/$tdir); do
18261 stripe_count=$($LFS getstripe -c $file)
18262 [ $stripe_count -eq 2 ] ||
18263 error "wrong stripe $stripe_count for $file"
18268 run_test 300d "check default stripe under striped directory"
18271 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18272 skip "Need MDS version at least 2.7.55"
18273 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18274 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18279 mkdir -p $DIR/$tdir
18281 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18282 error "set striped dir error"
18284 touch $DIR/$tdir/striped_dir/a
18285 touch $DIR/$tdir/striped_dir/b
18286 touch $DIR/$tdir/striped_dir/c
18288 mkdir $DIR/$tdir/striped_dir/dir_a
18289 mkdir $DIR/$tdir/striped_dir/dir_b
18290 mkdir $DIR/$tdir/striped_dir/dir_c
18292 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
18293 error "set striped adir under striped dir error"
18295 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
18296 error "set striped bdir under striped dir error"
18298 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
18299 error "set striped cdir under striped dir error"
18301 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
18302 error "rename dir under striped dir fails"
18304 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
18305 error "rename dir under different stripes fails"
18307 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
18308 error "rename file under striped dir should succeed"
18310 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
18311 error "rename dir under striped dir should succeed"
18315 run_test 300e "check rename under striped directory"
18318 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18319 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18320 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18321 skip "Need MDS version at least 2.7.55"
18327 mkdir -p $DIR/$tdir
18329 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18330 error "set striped dir error"
18332 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
18333 error "set striped dir error"
18335 touch $DIR/$tdir/striped_dir/a
18336 mkdir $DIR/$tdir/striped_dir/dir_a
18337 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
18338 error "create striped dir under striped dir fails"
18340 touch $DIR/$tdir/striped_dir1/b
18341 mkdir $DIR/$tdir/striped_dir1/dir_b
18342 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
18343 error "create striped dir under striped dir fails"
18345 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
18346 error "rename dir under different striped dir should fail"
18348 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
18349 error "rename striped dir under diff striped dir should fail"
18351 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
18352 error "rename file under diff striped dirs fails"
18356 run_test 300f "check rename cross striped directory"
18358 test_300_check_default_striped_dir()
18361 local default_count=$2
18362 local default_index=$3
18365 local dir_stripe_index
18368 echo "checking $dirname $default_count $default_index"
18369 $LFS setdirstripe -D -c $default_count -i $default_index \
18370 -t all_char $DIR/$tdir/$dirname ||
18371 error "set default stripe on striped dir error"
18372 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
18373 [ $stripe_count -eq $default_count ] ||
18374 error "expect $default_count get $stripe_count for $dirname"
18376 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
18377 [ $stripe_index -eq $default_index ] ||
18378 error "expect $default_index get $stripe_index for $dirname"
18380 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
18381 error "create dirs failed"
18383 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
18384 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
18385 for dir in $(find $DIR/$tdir/$dirname/*); do
18386 stripe_count=$($LFS getdirstripe -c $dir)
18387 [ $stripe_count -eq $default_count ] ||
18388 [ $stripe_count -eq 0 -o $default_count -eq 1 ] ||
18389 error "stripe count $default_count != $stripe_count for $dir"
18391 stripe_index=$($LFS getdirstripe -i $dir)
18392 [ $default_index -eq -1 -o $stripe_index -eq $default_index ] ||
18393 error "$stripe_index != $default_index for $dir"
18395 #check default stripe
18396 stripe_count=$($LFS getdirstripe -D -c $dir)
18397 [ $stripe_count -eq $default_count ] ||
18398 error "default count $default_count != $stripe_count for $dir"
18400 stripe_index=$($LFS getdirstripe -D -i $dir)
18401 [ $stripe_index -eq $default_index ] ||
18402 error "default index $default_index != $stripe_index for $dir"
18404 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
18408 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18409 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18410 skip "Need MDS version at least 2.7.55"
18417 mkdir $DIR/$tdir/normal_dir
18419 #Checking when client cache stripe index
18420 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
18421 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
18422 error "create striped_dir failed"
18424 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
18425 error "create dir0 fails"
18426 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
18427 [ $stripe_index -eq 0 ] ||
18428 error "dir0 expect index 0 got $stripe_index"
18430 mkdir $DIR/$tdir/striped_dir/dir1 ||
18431 error "create dir1 fails"
18432 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
18433 [ $stripe_index -eq 1 ] ||
18434 error "dir1 expect index 1 got $stripe_index"
18436 #check default stripe count/stripe index
18437 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
18438 test_300_check_default_striped_dir normal_dir 1 0
18439 test_300_check_default_striped_dir normal_dir 2 1
18440 test_300_check_default_striped_dir normal_dir 2 -1
18442 #delete default stripe information
18443 echo "delete default stripeEA"
18444 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
18445 error "set default stripe on striped dir error"
18447 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
18448 for dir in $(find $DIR/$tdir/normal_dir/*); do
18449 stripe_count=$($LFS getdirstripe -c $dir)
18450 [ $stripe_count -eq 0 ] ||
18451 error "expect 1 get $stripe_count for $dir"
18452 stripe_index=$($LFS getdirstripe -i $dir)
18453 [ $stripe_index -eq 0 ] ||
18454 error "expect 0 get $stripe_index for $dir"
18457 run_test 300g "check default striped directory for normal directory"
18460 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18461 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18462 skip "Need MDS version at least 2.7.55"
18468 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18469 error "set striped dir error"
18471 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
18472 test_300_check_default_striped_dir striped_dir 1 0
18473 test_300_check_default_striped_dir striped_dir 2 1
18474 test_300_check_default_striped_dir striped_dir 2 -1
18476 #delete default stripe information
18477 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
18478 error "set default stripe on striped dir error"
18480 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
18481 for dir in $(find $DIR/$tdir/striped_dir/*); do
18482 stripe_count=$($LFS getdirstripe -c $dir)
18483 [ $stripe_count -eq 0 ] ||
18484 error "expect 1 get $stripe_count for $dir"
18487 run_test 300h "check default striped directory for striped directory"
18490 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18491 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18492 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18493 skip "Need MDS version at least 2.7.55"
18500 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18501 error "set striped dir error"
18503 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18504 error "create files under striped dir failed"
18506 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
18507 error "set striped hashdir error"
18509 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
18510 error "create dir0 under hash dir failed"
18511 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
18512 error "create dir1 under hash dir failed"
18514 # unfortunately, we need to umount to clear dir layout cache for now
18515 # once we fully implement dir layout, we can drop this
18516 umount_client $MOUNT || error "umount failed"
18517 mount_client $MOUNT || error "mount failed"
18519 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
18520 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
18521 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
18523 #set the stripe to be unknown hash type
18524 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
18525 $LCTL set_param fail_loc=0x1901
18526 for ((i = 0; i < 10; i++)); do
18527 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
18528 error "stat f-$i failed"
18529 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
18532 touch $DIR/$tdir/striped_dir/f0 &&
18533 error "create under striped dir with unknown hash should fail"
18535 $LCTL set_param fail_loc=0
18537 umount_client $MOUNT || error "umount failed"
18538 mount_client $MOUNT || error "mount failed"
18542 run_test 300i "client handle unknown hash type striped directory"
18545 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18546 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18547 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18548 skip "Need MDS version at least 2.7.55"
18555 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
18556 $LCTL set_param fail_loc=0x1702
18557 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18558 error "set striped dir error"
18560 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18561 error "create files under striped dir failed"
18563 $LCTL set_param fail_loc=0
18565 rm -rf $DIR/$tdir || error "unlink striped dir fails"
18569 run_test 300j "test large update record"
18572 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18573 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18574 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18575 skip "Need MDS version at least 2.7.55"
18582 #define OBD_FAIL_LARGE_STRIPE 0x1703
18583 $LCTL set_param fail_loc=0x1703
18584 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
18585 error "set striped dir error"
18586 $LCTL set_param fail_loc=0
18588 $LFS getdirstripe $DIR/$tdir/striped_dir ||
18589 error "getstripeddir fails"
18590 rm -rf $DIR/$tdir/striped_dir ||
18591 error "unlink striped dir fails"
18595 run_test 300k "test large striped directory"
18598 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18599 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18600 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18601 skip "Need MDS version at least 2.7.55"
18605 test_mkdir -p $DIR/$tdir/striped_dir
18606 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
18607 error "chown $RUNAS_ID failed"
18608 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
18609 error "set default striped dir failed"
18611 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
18612 $LCTL set_param fail_loc=0x80000158
18613 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
18615 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
18616 [ $stripe_index -eq 1 ] ||
18617 error "expect 1 get $stripe_index for $dir"
18619 run_test 300l "non-root user to create dir under striped dir with stale layout"
18622 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18623 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
18624 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18625 skip "Need MDS version at least 2.7.55"
18627 mkdir -p $DIR/$tdir/striped_dir
18628 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
18629 error "set default stripes dir error"
18631 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
18633 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
18634 [ $stripe_count -eq 0 ] ||
18635 error "expect 0 get $stripe_count for a"
18637 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
18638 error "set default stripes dir error"
18640 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
18642 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
18643 [ $stripe_count -eq 0 ] ||
18644 error "expect 0 get $stripe_count for b"
18646 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
18647 error "set default stripes dir error"
18649 mkdir $DIR/$tdir/striped_dir/c &&
18650 error "default stripe_index is invalid, mkdir c should fails"
18652 rm -rf $DIR/$tdir || error "rmdir fails"
18654 run_test 300m "setstriped directory on single MDT FS"
18657 local list=$(comma_list $(mdts_nodes))
18660 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
18664 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18665 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18666 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18667 skip "Need MDS version at least 2.7.55"
18668 remote_mds_nodsh && skip "remote MDS with nodsh"
18671 local list=$(comma_list $(mdts_nodes))
18673 trap cleanup_300n RETURN EXIT
18674 mkdir -p $DIR/$tdir
18675 chmod 777 $DIR/$tdir
18676 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
18677 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
18678 error "create striped dir succeeds with gid=0"
18680 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
18681 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
18682 error "create striped dir fails with gid=-1"
18684 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
18685 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
18686 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
18687 error "set default striped dir succeeds with gid=0"
18690 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
18691 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
18692 error "set default striped dir fails with gid=-1"
18695 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
18696 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
18697 error "create test_dir fails"
18698 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
18699 error "create test_dir1 fails"
18700 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
18701 error "create test_dir2 fails"
18704 run_test 300n "non-root user to create dir under striped dir with default EA"
18707 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18708 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18709 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18710 skip "Need MDS version at least 2.7.55"
18715 mkdir -p $DIR/$tdir
18717 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
18718 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
18719 if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then
18720 skip "not enough free inodes $numfree1 $numfree2"
18723 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
18724 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
18725 if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then
18726 skip "not enough free space $numfree1 $numfree2"
18729 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
18730 error "setdirstripe fails"
18732 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
18733 error "create dirs fails"
18735 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
18736 ls $DIR/$tdir/striped_dir > /dev/null ||
18737 error "ls striped dir fails"
18738 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
18739 error "unlink big striped dir fails"
18741 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
18744 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18745 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18746 remote_mds_nodsh && skip "remote MDS with nodsh"
18748 mkdir -p $DIR/$tdir
18750 #define OBD_FAIL_OUT_ENOSPC 0x1704
18751 do_facet mds2 lctl set_param fail_loc=0x80001704
18752 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
18753 && error "create striped directory should fail"
18755 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
18757 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
18760 run_test 300p "create striped directory without space"
18763 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18764 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18766 local fd=$(free_fd)
18767 local cmd="exec $fd<$tdir"
18769 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
18772 trap "eval $cmd" EXIT
18773 cd $tdir || error "cd $tdir fails"
18774 rmdir ../$tdir || error "rmdir $tdir fails"
18775 mkdir local_dir && error "create dir succeeds"
18776 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
18780 run_test 300q "create remote directory under orphan directory"
18783 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
18784 skip "Need MDS version at least 2.7.55" && return
18785 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
18789 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
18790 error "set striped dir error"
18792 $LFS getdirstripe $DIR/$tdir/striped_dir ||
18793 error "getstripeddir fails"
18796 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
18797 awk '/lmv_stripe_count:/ { print $2 }')
18799 [ $MDSCOUNT -ne $stripe_count ] &&
18800 error "wrong stripe count $stripe_count expected $MDSCOUNT"
18802 rm -rf $DIR/$tdir/striped_dir ||
18803 error "unlink striped dir fails"
18805 run_test 300r "test -1 striped directory"
18807 prepare_remote_file() {
18808 mkdir $DIR/$tdir/src_dir ||
18809 error "create remote source failed"
18811 cp /etc/hosts $DIR/$tdir/src_dir/a ||
18812 error "cp to remote source failed"
18813 touch $DIR/$tdir/src_dir/a
18815 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
18816 error "create remote target dir failed"
18818 touch $DIR/$tdir/tgt_dir/b
18820 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
18821 error "rename dir cross MDT failed!"
18823 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
18824 error "src_child still exists after rename"
18826 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
18827 error "missing file(a) after rename"
18829 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
18830 error "diff after rename"
18834 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
18835 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18837 local remote_file=$DIR/$tdir/tgt_dir/b
18839 mkdir -p $DIR/$tdir
18841 prepare_remote_file || error "prepare remote file failed"
18844 $OPENUNLINK $remote_file $remote_file ||
18845 error "openunlink $remote_file failed"
18846 $CHECKSTAT -a $remote_file || error "$remote_file exists"
18848 run_test 310a "open unlink remote file"
18851 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
18852 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18854 local remote_file=$DIR/$tdir/tgt_dir/b
18856 mkdir -p $DIR/$tdir
18858 prepare_remote_file || error "prepare remote file failed"
18860 ln $remote_file $DIR/$tfile || error "link failed for remote file"
18861 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
18862 $CHECKSTAT -t file $remote_file || error "check file failed"
18864 run_test 310b "unlink remote file with multiple links while open"
18867 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18868 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
18870 local remote_file=$DIR/$tdir/tgt_dir/b
18872 mkdir -p $DIR/$tdir
18874 prepare_remote_file || error "prepare remote file failed"
18876 ln $remote_file $DIR/$tfile || error "link failed for remote file"
18877 multiop_bg_pause $remote_file O_uc ||
18878 error "mulitop failed for remote file"
18880 $MULTIOP $DIR/$tfile Ouc
18881 kill -USR1 $MULTIPID
18884 run_test 310c "open-unlink remote file with multiple links"
18888 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18889 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
18890 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
18891 skip "lustre < 2.8.54 does not contain LU-4825 fix"
18892 remote_mds_nodsh && skip "remote MDS with nodsh"
18894 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
18895 local mdts=$(comma_list $(mdts_nodes))
18897 mkdir -p $DIR/$tdir
18898 $SETSTRIPE -i 0 -c 1 $DIR/$tdir
18899 createmany -o $DIR/$tdir/$tfile. 1000
18901 # statfs data is not real time, let's just calculate it
18902 old_iused=$((old_iused + 1000))
18904 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
18905 osp.*OST0000*MDT0000.create_count")
18906 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
18907 osp.*OST0000*MDT0000.max_create_count")
18908 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
18910 $SETSTRIPE -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
18911 local index=$($GETSTRIPE -i $DIR/$tdir/$tfile)
18912 [ $index -ne 0 ] || error "$tfile stripe index is 0"
18914 unlinkmany $DIR/$tdir/$tfile. 1000
18916 do_nodes $mdts "$LCTL set_param -n \
18917 osp.*OST0000*.max_create_count=$max_count"
18918 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
18919 do_nodes $mdts "$LCTL set_param -n \
18920 osp.*OST0000*.create_count=$count"
18921 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
18922 grep "=0" && error "create_count is zero"
18925 for i in $(seq 120); do
18926 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
18927 # system may be too busy to destroy all objs in time, use
18928 # a somewhat small value to not fail autotest
18929 [ $((old_iused - new_iused)) -gt 400 ] && break
18933 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
18934 [ $((old_iused - new_iused)) -gt 400 ] ||
18935 error "objs not destroyed after unlink"
18937 run_test 311 "disable OSP precreate, and unlink should destroy objs"
18944 local vdevdir=$(dirname $(facet_vdevice $ost))
18945 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
18946 local zfs_zapid=$(do_facet $ost $cmd |
18947 grep -w "/O/0/d$((objid%32))" -C 5 |
18948 awk '/Object/{getline; print $1}')
18949 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
18950 awk "/$objid = /"'{printf $3}')
18955 zfs_object_blksz() {
18959 local vdevdir=$(dirname $(facet_vdevice $ost))
18960 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
18961 local blksz=$(do_facet $ost $cmd $objid |
18962 awk '/dblk/{getline; printf $4}')
18964 case "${blksz: -1}" in
18965 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
18966 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
18973 test_312() { # LU-4856
18974 remote_ost_nodsh && skip "remote OST with nodsh"
18975 [ "$ost1_FSTYPE" = "zfs" ] ||
18976 skip_env "the test only applies to zfs"
18978 local max_blksz=$(do_facet ost1 \
18979 $ZFS get -p recordsize $(facet_device ost1) |
18980 awk '!/VALUE/{print $3}')
18982 # to make life a little bit easier
18983 $LFS mkdir -c 1 -i 0 $DIR/$tdir
18984 $LFS setstripe -c 1 -i 0 $DIR/$tdir
18986 local tf=$DIR/$tdir/$tfile
18988 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
18990 # Get ZFS object id
18991 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
18992 # block size change by sequential overwrite
18995 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
18996 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
18998 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
18999 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19003 # block size change by sequential append write
19004 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19005 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19006 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19009 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19010 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19011 oflag=sync conv=notrunc
19013 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19014 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19015 error "blksz error, actual $blksz, " \
19016 "expected: 2 * $count * $PAGE_SIZE"
19022 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19023 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19025 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
19026 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19027 [ $blksz -eq $PAGE_SIZE ] ||
19028 error "blksz error: $blksz, expected: $PAGE_SIZE"
19030 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
19031 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19032 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
19034 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
19035 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19036 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
19038 run_test 312 "make sure ZFS adjusts its block size by write pattern"
19041 remote_ost_nodsh && skip "remote OST with nodsh"
19043 local file=$DIR/$tfile
19046 $SETSTRIPE -c 1 -i 0 $file || error "setstripe failed"
19048 # define OBD_FAIL_TGT_RCVD_EIO 0x720
19049 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19050 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
19051 error "write should failed"
19052 do_facet ost1 "$LCTL set_param fail_loc=0"
19055 run_test 313 "io should fail after last_rcvd update fail"
19058 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19060 $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
19061 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19063 wait_delete_completed
19064 do_facet ost1 "$LCTL set_param fail_loc=0"
19066 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
19068 test_315() { # LU-618
19069 local file=$DIR/$tfile
19072 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
19073 error "multiop file write failed"
19074 $MULTIOP $file oO_RDONLY:r4063232_c &
19079 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
19082 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
19085 run_test 315 "read should be accounted"
19088 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19089 large_xattr_enabled || skip_env "ea_inode feature disabled"
19091 rm -rf $DIR/$tdir/d
19092 mkdir -p $DIR/$tdir/d
19093 chown nobody $DIR/$tdir/d
19094 touch $DIR/$tdir/d/file
19096 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
19098 run_test 316 "lfs mv"
19101 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
19102 skip "Need MDS version at least 2.11.53"
19103 if [ "$ost1_FSTYPE" == "zfs" ]; then
19104 skip "LU-10370: no implementation for ZFS"
19108 local grant_blk_size
19110 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
19111 awk '/grant_block_size:/ { print $2; exit; }')
19113 # Create File of size 5M. Truncate it to below size's and verify
19116 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
19117 error "Create file $DIR/$tfile failed"
19118 stack_trap "rm -f $DIR/$tfile" EXIT
19120 for trunc_sz in 2097152 4097 4000 509 0; do
19121 $TRUNCATE $DIR/$tfile $trunc_sz ||
19122 error "truncate $tfile to $trunc_sz failed"
19123 local sz=$(stat --format=%s $DIR/$tfile)
19124 local blk=$(stat --format=%b $DIR/$tfile)
19125 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
19126 grant_blk_size) * 8))
19128 if [[ $blk -ne $trunc_blk ]]; then
19129 $(which stat) $DIR/$tfile
19130 error "Expected Block $trunc_blk got $blk for $tfile"
19133 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19134 error "Expected Size $trunc_sz got $sz for $tfile"
19139 # Create file with a hole and write actual two blocks. Block count
19142 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
19143 conv=fsync || error "Create file : $DIR/$tfile"
19145 # Calculate the final truncate size.
19146 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
19149 # truncate to size $trunc_sz bytes. Strip the last block
19150 # The block count must drop to 8
19152 $TRUNCATE $DIR/$tfile $trunc_sz ||
19153 error "truncate $tfile to $trunc_sz failed"
19155 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
19156 sz=$(stat --format=%s $DIR/$tfile)
19157 blk=$(stat --format=%b $DIR/$tfile)
19159 if [[ $blk -ne $trunc_bsz ]]; then
19160 $(which stat) $DIR/$tfile
19161 error "Expected Block $trunc_bsz got $blk for $tfile"
19164 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19165 error "Expected Size $trunc_sz got $sz for $tfile"
19167 run_test 317 "Verify blocks get correctly update after truncate"
19170 local read_write=$1
19171 if [ "$read_write" = "write" ]; then
19172 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
19173 elif [ "$read_write" = "read" ]; then
19174 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
19176 error "argument error"
19179 # turn off debug for performance testing
19180 local saved_debug=$($LCTL get_param -n debug)
19181 $LCTL set_param debug=0
19183 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
19185 # get ost1 size - lustre-OST0000
19186 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
19187 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
19188 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
19190 if [ "$read_write" = "read" ]; then
19191 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
19194 local start_time=$(date +%s.%N)
19195 $dd_cmd bs=1M count=$blocks oflag=sync ||
19196 error "real dd $read_write error"
19197 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
19199 if [ "$read_write" = "write" ]; then
19203 # define OBD_FAIL_OST_FAKE_RW 0x238
19204 do_facet ost1 $LCTL set_param fail_loc=0x238
19206 local start_time=$(date +%s.%N)
19207 $dd_cmd bs=1M count=$blocks oflag=sync ||
19208 error "fake dd $read_write error"
19209 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
19211 if [ "$read_write" = "write" ]; then
19213 cancel_lru_locks osc
19214 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
19215 error "$tfile size not $blocks MB"
19217 do_facet ost1 $LCTL set_param fail_loc=0
19219 echo "fake $read_write $duration_fake vs. normal $read_write" \
19220 "$duration in seconds"
19221 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
19222 error_not_in_vm "fake write is slower"
19224 $LCTL set_param -n debug="$saved_debug"
19227 test_399a() { # LU-7655 for OST fake write
19228 remote_ost_nodsh && skip "remote OST with nodsh"
19232 run_test 399a "fake write should not be slower than normal write"
19234 test_399b() { # LU-8726 for OST fake read
19235 remote_ost_nodsh && skip "remote OST with nodsh"
19236 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
19237 skip_env "ldiskfs only test"
19242 run_test 399b "fake read should not be slower than normal read"
19244 test_400a() { # LU-1606, was conf-sanity test_74
19245 if ! which $CC > /dev/null 2>&1; then
19246 skip_env "$CC is not installed"
19249 local extra_flags=''
19250 local out=$TMP/$tfile
19251 local prefix=/usr/include/lustre
19254 if ! [[ -d $prefix ]]; then
19255 # Assume we're running in tree and fixup the include path.
19256 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
19257 extra_flags+=" -L$LUSTRE/utils/.lib"
19260 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
19261 $CC -Wall -Werror $extra_flags -o $out $prog -llustreapi ||
19262 error "client api broken"
19266 run_test 400a "Lustre client api program can compile and link"
19268 test_400b() { # LU-1606, LU-5011
19270 local out=$TMP/$tfile
19271 local prefix=/usr/include/linux/lustre
19273 # We use a hard coded prefix so that this test will not fail
19274 # when run in tree. There are headers in lustre/include/lustre/
19275 # that are not packaged (like lustre_idl.h) and have more
19276 # complicated include dependencies (like config.h and lnet/types.h).
19277 # Since this test about correct packaging we just skip them when
19278 # they don't exist (see below) rather than try to fixup cppflags.
19280 if ! which $CC > /dev/null 2>&1; then
19281 skip_env "$CC is not installed"
19284 for header in $prefix/*.h; do
19285 if ! [[ -f "$header" ]]; then
19289 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
19290 continue # lustre_ioctl.h is internal header
19293 $CC -Wall -Werror -include $header -c -x c /dev/null -o $out ||
19294 error "cannot compile '$header'"
19298 run_test 400b "packaged headers can be compiled"
19300 test_401a() { #LU-7437
19301 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
19302 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
19304 #count the number of parameters by "list_param -R"
19305 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
19306 #count the number of parameters by listing proc files
19307 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
19308 echo "proc_dirs='$proc_dirs'"
19309 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
19310 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
19313 [ $params -eq $procs ] ||
19314 error "found $params parameters vs. $procs proc files"
19316 # test the list_param -D option only returns directories
19317 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
19318 #count the number of parameters by listing proc directories
19319 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
19322 [ $params -eq $procs ] ||
19323 error "found $params parameters vs. $procs proc files"
19325 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
19328 local save=$($LCTL get_param -n jobid_var)
19331 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
19332 error "no error returned when setting bad parameters"
19334 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
19335 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
19337 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
19338 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
19339 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
19341 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
19344 local jobid_var_old=$($LCTL get_param -n jobid_var)
19345 local jobid_var_new
19347 $LCTL set_param jobid_var= &&
19348 error "no error returned for 'set_param a='"
19350 jobid_var_new=$($LCTL get_param -n jobid_var)
19351 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19352 error "jobid_var was changed by setting without value"
19354 $LCTL set_param jobid_var &&
19355 error "no error returned for 'set_param a'"
19357 jobid_var_new=$($LCTL get_param -n jobid_var)
19358 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19359 error "jobid_var was changed by setting without value"
19361 run_test 401c "Verify 'lctl set_param' without value fails in either format."
19364 local jobid_var_old=$($LCTL get_param -n jobid_var)
19365 local jobid_var_new
19366 local new_value="foo=bar"
19368 $LCTL set_param jobid_var=$new_value ||
19369 error "'set_param a=b' did not accept a value containing '='"
19371 jobid_var_new=$($LCTL get_param -n jobid_var)
19372 [[ "$jobid_var_new" == "$new_value" ]] ||
19373 error "'set_param a=b' failed on a value containing '='"
19375 # Reset the jobid_var to test the other format
19376 $LCTL set_param jobid_var=$jobid_var_old
19377 jobid_var_new=$($LCTL get_param -n jobid_var)
19378 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19379 error "failed to reset jobid_var"
19381 $LCTL set_param jobid_var $new_value ||
19382 error "'set_param a b' did not accept a value containing '='"
19384 jobid_var_new=$($LCTL get_param -n jobid_var)
19385 [[ "$jobid_var_new" == "$new_value" ]] ||
19386 error "'set_param a b' failed on a value containing '='"
19388 $LCTL set_param jobid_var $jobid_var_old
19389 jobid_var_new=$($LCTL get_param -n jobid_var)
19390 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19391 error "failed to reset jobid_var"
19393 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
19396 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
19397 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
19398 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
19399 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
19400 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
19401 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
19402 remote_mds_nodsh && skip "remote MDS with nodsh"
19404 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
19405 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
19406 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
19407 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
19408 echo "Touch failed - OK"
19410 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
19413 local file1=$DIR/$tfile.1
19414 local file2=$DIR/$tfile.2
19415 local tfile=$TMP/$tfile
19417 rm -f $file1 $file2 $tfile
19422 # 30 sec OBD_TIMEOUT in ll_getattr()
19423 # right before populating st_nlink
19424 $LCTL set_param fail_loc=0x80001409
19425 stat -c %h $file1 > $tfile &
19427 # create an alias, drop all locks and reclaim the dentry
19429 cancel_lru_locks mdc
19430 cancel_lru_locks osc
19431 sysctl -w vm.drop_caches=2
19435 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
19437 rm -f $tfile $file1 $file2
19439 run_test 403 "i_nlink should not drop to zero due to aliasing"
19441 test_404() { # LU-6601
19442 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
19443 skip "Need server version newer than 2.8.52"
19444 remote_mds_nodsh && skip "remote MDS with nodsh"
19446 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
19447 awk '/osp .*-osc-MDT/ { print $4}')
19450 for osp in $mosps; do
19451 echo "Deactivate: " $osp
19452 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
19453 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19454 awk -vp=$osp '$4 == p { print $2 }')
19455 [ $stat = IN ] || {
19456 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19457 error "deactivate error"
19459 echo "Activate: " $osp
19460 do_facet $SINGLEMDS $LCTL --device %$osp activate
19461 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19462 awk -vp=$osp '$4 == p { print $2 }')
19463 [ $stat = UP ] || {
19464 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19465 error "activate error"
19469 run_test 404 "validate manual {de}activated works properly for OSPs"
19472 [ $MDS1_VERSION -lt $(version_code 2.6.92) -o \
19473 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
19474 skip "Layout swap lock is not supported"
19475 check_swap_layouts_support
19477 test_mkdir $DIR/$tdir
19478 swap_lock_test -d $DIR/$tdir ||
19479 error "One layout swap locked test failed"
19481 run_test 405 "Various layout swap lock tests"
19484 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19485 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
19486 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
19487 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19488 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
19489 skip "Need MDS version at least 2.8.50"
19491 local def_stripe_size=$($LFS getstripe -S $MOUNT)
19492 local test_pool=$TESTNAME
19494 pool_add $test_pool || error "pool_add failed"
19495 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
19496 error "pool_add_targets failed"
19498 save_layout_restore_at_exit $MOUNT
19500 # parent set default stripe count only, child will stripe from both
19501 # parent and fs default
19502 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
19503 error "setstripe $MOUNT failed"
19504 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
19505 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
19506 for i in $(seq 10); do
19507 local f=$DIR/$tdir/$tfile.$i
19508 touch $f || error "touch failed"
19509 local count=$($LFS getstripe -c $f)
19510 [ $count -eq $OSTCOUNT ] ||
19511 error "$f stripe count $count != $OSTCOUNT"
19512 local offset=$($LFS getstripe -i $f)
19513 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
19514 local size=$($LFS getstripe -S $f)
19515 [ $size -eq $((def_stripe_size * 2)) ] ||
19516 error "$f stripe size $size != $((def_stripe_size * 2))"
19517 local pool=$($LFS getstripe -p $f)
19518 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
19521 # change fs default striping, delete parent default striping, now child
19522 # will stripe from new fs default striping only
19523 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
19524 error "change $MOUNT default stripe failed"
19525 $LFS setstripe -c 0 $DIR/$tdir ||
19526 error "delete $tdir default stripe failed"
19527 for i in $(seq 11 20); do
19528 local f=$DIR/$tdir/$tfile.$i
19529 touch $f || error "touch $f failed"
19530 local count=$($LFS getstripe -c $f)
19531 [ $count -eq 1 ] || error "$f stripe count $count != 1"
19532 local offset=$($LFS getstripe -i $f)
19533 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
19534 local size=$($LFS getstripe -S $f)
19535 [ $size -eq $def_stripe_size ] ||
19536 error "$f stripe size $size != $def_stripe_size"
19537 local pool=$($LFS getstripe -p $f)
19538 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
19541 unlinkmany $DIR/$tdir/$tfile. 1 20
19543 local f=$DIR/$tdir/$tfile
19544 pool_remove_all_targets $test_pool $f
19545 pool_remove $test_pool $f
19547 run_test 406 "DNE support fs default striping"
19550 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19551 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
19552 skip "Need MDS version at least 2.8.55"
19553 remote_mds_nodsh && skip "remote MDS with nodsh"
19555 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
19556 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
19557 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
19558 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
19559 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
19561 #define OBD_FAIL_DT_TXN_STOP 0x2019
19562 for idx in $(seq $MDSCOUNT); do
19563 do_facet mds$idx "lctl set_param fail_loc=0x2019"
19565 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
19566 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
19567 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
19570 run_test 407 "transaction fail should cause operation fail"
19573 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
19575 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
19576 lctl set_param fail_loc=0x8000040a
19577 # let ll_prepare_partial_page() fail
19578 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
19582 # create at least 100 unused inodes so that
19583 # shrink_icache_memory(0) should not return 0
19584 touch $DIR/$tfile-{0..100}
19585 rm -f $DIR/$tfile-{0..100}
19588 echo 2 > /proc/sys/vm/drop_caches
19590 run_test 408 "drop_caches should not hang due to page leaks"
19594 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19595 check_mount_and_prep
19597 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
19598 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
19599 touch $DIR/$tdir/guard || error "(2) Fail to create"
19601 local PREFIX=$(str_repeat 'A' 128)
19602 echo "Create 1K hard links start at $(date)"
19603 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
19604 error "(3) Fail to hard link"
19606 echo "Links count should be right although linkEA overflow"
19607 stat $DIR/$tdir/guard || error "(4) Fail to stat"
19608 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
19609 [ $linkcount -eq 1001 ] ||
19610 error "(5) Unexpected hard links count: $linkcount"
19612 echo "List all links start at $(date)"
19613 ls -l $DIR/$tdir/foo > /dev/null ||
19614 error "(6) Fail to list $DIR/$tdir/foo"
19616 echo "Unlink hard links start at $(date)"
19617 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
19618 error "(7) Fail to unlink"
19620 run_test 409 "Large amount of cross-MDTs hard links on the same file"
19624 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
19625 skip "Need client version at least 2.9.59"
19627 # Create a file, and stat it from the kernel
19628 local testfile=$DIR/$tfile
19631 local run_id=$RANDOM
19632 local my_ino=$(stat --format "%i" $testfile)
19634 # Try to insert the module. This will always fail as the
19635 # module is designed to not be inserted.
19636 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
19639 # Anything but success is a test failure
19641 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
19642 error "no inode match"
19644 run_test 410 "Test inode number returned from kernel thread"
19646 cleanup_test411_cgroup() {
19652 local cg_basedir=/sys/fs/cgroup/memory
19654 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
19655 skip "no setup for cgroup"
19657 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
19658 error "test file creation failed"
19659 cancel_lru_locks osc
19661 # Create a very small memory cgroup to force a slab allocation error
19662 local cgdir=$cg_basedir/osc_slab_alloc
19663 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
19664 trap "cleanup_test411_cgroup $cgdir" EXIT
19665 echo 2M > $cgdir/memory.kmem.limit_in_bytes
19666 echo 1M > $cgdir/memory.limit_in_bytes
19668 # Should not LBUG, just be killed by oom-killer
19669 # dd will return 0 even allocation failure in some environment.
19670 # So don't check return value
19671 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
19672 cleanup_test411_cgroup $cgdir
19676 run_test 411 "Slab allocation error with cgroup does not LBUG"
19679 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19680 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
19681 skip "Need server version at least 2.10.55"
19684 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
19685 error "mkdir failed"
19686 $LFS getdirstripe $DIR/$tdir
19687 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
19688 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
19689 error "expect $((MDSCOUT - 1)) get $stripe_index"
19690 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
19691 [ $stripe_count -eq 2 ] ||
19692 error "expect 2 get $stripe_count"
19694 run_test 412 "mkdir on specific MDTs"
19697 [ $MDSCOUNT -lt 2 ] &&
19698 skip "We need at least 2 MDTs for this test"
19700 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
19701 skip "Need server version at least 2.10.55"
19704 mkdir $DIR/$tdir || error "mkdir failed"
19706 # find MDT that is the most full
19707 local max=$($LFS df | grep MDT |
19716 END { split(b, c, ":")
19721 for i in $(seq $((MDSCOUNT - 1))); do
19722 $LFS mkdir -c $i $DIR/$tdir/d$i ||
19723 error "mkdir d$i failed"
19724 $LFS getdirstripe $DIR/$tdir/d$i
19725 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
19726 [ $stripe_index -ne $max ] ||
19727 error "don't expect $max"
19730 run_test 413 "mkdir on less full MDTs"
19733 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
19734 $LCTL set_param fail_loc=0x80000521
19735 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
19738 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
19741 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19742 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
19743 skip "Need server version at least 2.11.52"
19753 # this test may be slow on ZFS
19754 [ "$mds1_FSTYPE" == "zfs" ] && total=100
19756 # though this test is designed for striped directory, let's test normal
19757 # directory too since lock is always saved as CoS lock.
19758 test_mkdir $DIR/$tdir || error "mkdir $tdir"
19759 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
19768 start_time=$(date +%s)
19769 for i in $(seq $total); do
19770 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
19773 end_time=$(date +%s)
19774 duration=$((end_time - start_time))
19776 kill -9 $setattr_pid
19778 echo "rename $total files took $duration sec"
19779 [ $duration -lt 100 ] || error "rename took $duration sec"
19781 run_test 415 "lock revoke is not missing"
19784 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
19785 skip "Need server version at least 2.11.55"
19787 # define OBD_FAIL_OSD_TXN_START 0x19a
19788 do_facet mds1 lctl set_param fail_loc=0x19a
19790 lfs mkdir -c $MDSCOUNT $DIR/$tdir
19794 run_test 416 "transaction start failure won't cause system hung"
19798 do_nodes $(comma_list $(mdts_nodes)) \
19799 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
19800 do_nodes $(comma_list $(mdts_nodes)) \
19801 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
19802 do_nodes $(comma_list $(mdts_nodes)) \
19803 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
19807 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19808 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
19809 skip "Need MDS version at least 2.11.56"
19811 trap cleanup_417 RETURN EXIT
19813 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
19814 do_nodes $(comma_list $(mdts_nodes)) \
19815 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
19816 $LFS migrate -m 0 $DIR/$tdir.1 &&
19817 error "migrate dir $tdir.1 should fail"
19819 do_nodes $(comma_list $(mdts_nodes)) \
19820 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
19821 $LFS mkdir -i 1 $DIR/$tdir.2 &&
19822 error "create remote dir $tdir.2 should fail"
19824 do_nodes $(comma_list $(mdts_nodes)) \
19825 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
19826 $LFS mkdir -c 2 $DIR/$tdir.3 &&
19827 error "create striped dir $tdir.3 should fail"
19830 run_test 417 "disable remote dir, striped dir and dir migration"
19832 # Checks that the outputs of df [-i] and lfs df [-i] match
19834 # usage: check_lfs_df <blocks | inodes> <mountpoint>
19844 [ "$1" == "blocks" ] && inodes= || inodes="-i"
19846 for count in {1..100}; do
19850 # read the lines of interest
19851 df_out=($(df -P $inodes $dir | tail -n +2)) ||
19852 error "df $inodes $dir | tail -n +2 failed"
19853 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
19854 error "lfs df $inodes $dir | grep summary: failed"
19856 # skip first substrings of each output as they are different
19857 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
19858 # compare the remaining fields of the two outputs
19860 for i in {1..5}; do
19861 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
19869 lfs df $inodes $dir
19870 error "df and lfs df $1 output mismatch: " \
19871 "df ${inodes}: ${df_out[*]}, " \
19872 "lfs df ${inodes}: ${lfs_df_out[*]}"
19877 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19879 local dir=$DIR/$tdir
19880 local numfiles=$((RANDOM % 4096 + 2))
19881 local numblocks=$((RANDOM % 256 + 1))
19883 wait_delete_completed
19886 # check block output
19887 check_lfs_df blocks $dir
19888 # check inode output
19889 check_lfs_df inodes $dir
19891 # create a single file and retest
19892 echo "Creating a single file and testing"
19893 createmany -o $dir/$tfile- 1 &>/dev/null ||
19894 error "creating 1 file in $dir failed"
19895 check_lfs_df blocks $dir
19896 check_lfs_df inodes $dir
19898 # create a random number of files
19899 echo "Creating $((numfiles - 1)) files and testing"
19900 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
19901 error "creating $((numfiles - 1)) files in $dir failed"
19903 # write a random number of blocks to the first test file
19904 echo "Writing $numblocks 4K blocks and testing"
19905 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
19906 count=$numblocks &>/dev/null ||
19907 error "dd to $dir/${tfile}-0 failed"
19910 check_lfs_df blocks $dir
19911 check_lfs_df inodes $dir
19913 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
19914 error "unlinking $numfiles files in $dir failed"
19916 run_test 418 "df and lfs df outputs match"
19920 local dir=$DIR/$tdir
19925 cancel_lru_locks mdc
19927 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
19928 $LCTL set_param fail_loc=0x1410
19930 $LCTL set_param fail_loc=0
19933 run_test 419 "Verify open file by name doesn't crash kernel"
19937 [[ $MDS1_VERSION -ge $(version_code 2.12.1) ]] ||
19938 skip "Need MDS version at least 2.12.1"
19940 local SAVE_UMASK=$(umask)
19941 local dir=$DIR/$tdir
19942 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
19946 mkdir -m03777 $dir/testdir
19947 ls -dn $dir/testdir
19948 # Need to remove trailing '.' when SELinux is enabled
19949 local dirperms=$(ls -dn $dir/testdir |
19950 awk '{ sub(/\.$/, "", $1); print $1}')
19951 [ $dirperms == "drwxrwsrwt" ] ||
19952 error "incorrect perms on $dir/testdir"
19954 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
19955 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
19956 ls -n $dir/testdir/testfile
19957 local fileperms=$(ls -n $dir/testdir/testfile |
19958 awk '{ sub(/\.$/, "", $1); print $1}')
19959 [ $fileperms == "-rwxr-xr-x" ] ||
19960 error "incorrect perms on $dir/testdir/testfile"
19964 run_test 420 "clear SGID bit on non-directories for non-members"
19971 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
19972 skip "Need MDS version at least 2.12.2"
19974 test_mkdir $DIR/$tdir
19975 createmany -o $DIR/$tdir/f 3
19976 cnt=$(ls -1 $DIR/$tdir | wc -l)
19977 [ $cnt != 3 ] && error "unexpected #files: $cnt"
19979 fid1=$(lfs path2fid $DIR/$tdir/f1)
19980 fid2=$(lfs path2fid $DIR/$tdir/f2)
19981 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
19983 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
19984 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
19986 cnt=$(ls -1 $DIR/$tdir | wc -l)
19987 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
19989 rm -f $DIR/$tdir/f3 || error "can't remove f3"
19990 createmany -o $DIR/$tdir/f 3
19991 cnt=$(ls -1 $DIR/$tdir | wc -l)
19992 [ $cnt != 3 ] && error "unexpected #files: $cnt"
19994 fid1=$(lfs path2fid $DIR/$tdir/f1)
19995 fid2=$(lfs path2fid $DIR/$tdir/f2)
19996 echo "remove using fsname $FSNAME"
19997 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
19999 cnt=$(ls -1 $DIR/$tdir | wc -l)
20000 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20002 run_test 421a "simple rm by fid"
20009 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20010 skip "Need MDS version at least 2.12.2"
20012 test_mkdir $DIR/$tdir
20013 createmany -o $DIR/$tdir/f 3
20014 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
20017 FID1=$(lfs path2fid $DIR/$tdir/f1)
20018 FID2=$(lfs path2fid $DIR/$tdir/f2)
20019 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
20021 kill -USR1 $MULTIPID
20024 cnt=$(ls $DIR/$tdir | wc -l)
20025 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
20027 run_test 421b "rm by fid on open file"
20033 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20034 skip "Need MDS version at least 2.12.2"
20036 test_mkdir $DIR/$tdir
20037 createmany -o $DIR/$tdir/f 3
20038 touch $DIR/$tdir/$tfile
20039 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
20040 cnt=$(ls -1 $DIR/$tdir | wc -l)
20041 [ $cnt != 184 ] && error "unexpected #files: $cnt"
20043 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
20044 $LFS rmfid $DIR $FID1 || error "rmfid failed"
20046 cnt=$(ls $DIR/$tdir | wc -l)
20047 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
20049 run_test 421c "rm by fid against hardlinked files"
20055 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20056 skip "Need MDS version at least 2.12.2"
20058 test_mkdir $DIR/$tdir
20059 createmany -o $DIR/$tdir/f 4097
20060 cnt=$(ls -1 $DIR/$tdir | wc -l)
20061 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
20063 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
20064 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20066 cnt=$(ls $DIR/$tdir | wc -l)
20068 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20070 run_test 421d "rmfid en masse"
20076 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20077 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20078 skip "Need MDS version at least 2.12.2"
20080 mkdir -p $DIR/$tdir
20081 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20082 createmany -o $DIR/$tdir/striped_dir/f 512
20083 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20084 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20086 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20087 sed "s/[/][^:]*://g")
20088 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20090 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20092 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20094 run_test 421e "rmfid in DNE"
20100 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20101 skip "Need MDS version at least 2.12.2"
20103 test_mkdir $DIR/$tdir
20105 cnt=$(ls -1 $DIR/$tdir | wc -l)
20106 [ $cnt != 1 ] && error "unexpected #files: $cnt"
20108 FID=$(lfs path2fid $DIR/$tdir/f)
20109 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
20110 # rmfid should fail
20111 cnt=$(ls -1 $DIR/$tdir | wc -l)
20112 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
20114 chmod a+rw $DIR/$tdir
20116 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
20117 # rmfid should fail
20118 cnt=$(ls -1 $DIR/$tdir | wc -l)
20119 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
20122 $RUNAS touch $DIR/$tdir/f
20123 FID=$(lfs path2fid $DIR/$tdir/f)
20124 echo "rmfid as root"
20125 $LFS rmfid $DIR $FID || error "rmfid as root failed"
20126 cnt=$(ls -1 $DIR/$tdir | wc -l)
20127 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
20130 $RUNAS touch $DIR/$tdir/f
20131 cnt=$(ls -1 $DIR/$tdir | wc -l)
20132 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
20133 FID=$(lfs path2fid $DIR/$tdir/f)
20134 # rmfid w/o user_fid2path mount option should fail
20135 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
20136 cnt=$(ls -1 $DIR/$tdir | wc -l)
20137 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
20139 umount_client $MOUNT || "failed to umount client"
20140 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
20141 "failed to mount client'"
20143 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
20144 # rmfid should succeed
20145 cnt=$(ls -1 $DIR/$tdir | wc -l)
20146 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
20148 # rmfid shouldn't allow to remove files due to dir's permission
20149 chmod a+rwx $DIR/$tdir
20152 FID=$(lfs path2fid $DIR/$tdir/f)
20153 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
20155 umount_client $MOUNT || "failed to umount client"
20156 mount_client $MOUNT "$MOUNT_OPTS" ||
20157 "failed to mount client'"
20160 run_test 421f "rmfid checks permissions"
20166 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20167 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20168 skip "Need MDS version at least 2.12.2"
20170 mkdir -p $DIR/$tdir
20171 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20172 createmany -o $DIR/$tdir/striped_dir/f 512
20173 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20174 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20176 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20177 sed "s/[/][^:]*://g")
20179 rm -f $DIR/$tdir/striped_dir/f1*
20180 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20181 removed=$((512 - cnt))
20183 # few files have been just removed, so we expect
20184 # rmfid to fail on their fids
20185 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
20186 [ $removed != $errors ] && error "$errors != $removed"
20188 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20190 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20192 run_test 421g "rmfid to return errors properly"
20195 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20196 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20197 skip "Need server version at least 2.9.55"
20199 start_full_debug_logging
20203 stop_full_debug_logging
20207 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20208 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20209 awk '/The barrier for/ { print $7 }')
20212 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
20217 barrier_expired() {
20220 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20221 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20222 awk '/will be expired/ { print $7 }')
20224 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
20233 echo "Start barrier_freeze at: $(date)"
20234 #define OBD_FAIL_BARRIER_DELAY 0x2202
20235 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20236 # Do not reduce barrier time - See LU-11873
20237 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
20240 local b_status=$(barrier_stat)
20241 echo "Got barrier status at: $(date)"
20242 [ "$b_status" = "'freezing_p1'" ] ||
20243 error "(1) unexpected barrier status $b_status"
20245 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20247 b_status=$(barrier_stat)
20248 [ "$b_status" = "'frozen'" ] ||
20249 error "(2) unexpected barrier status $b_status"
20251 local expired=$(barrier_expired)
20252 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
20253 sleep $((expired + 3))
20255 b_status=$(barrier_stat)
20256 [ "$b_status" = "'expired'" ] ||
20257 error "(3) unexpected barrier status $b_status"
20259 # Do not reduce barrier time - See LU-11873
20260 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
20261 error "(4) fail to freeze barrier"
20263 b_status=$(barrier_stat)
20264 [ "$b_status" = "'frozen'" ] ||
20265 error "(5) unexpected barrier status $b_status"
20267 echo "Start barrier_thaw at: $(date)"
20268 #define OBD_FAIL_BARRIER_DELAY 0x2202
20269 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20270 do_facet mgs $LCTL barrier_thaw $FSNAME &
20273 b_status=$(barrier_stat)
20274 echo "Got barrier status at: $(date)"
20275 [ "$b_status" = "'thawing'" ] ||
20276 error "(6) unexpected barrier status $b_status"
20278 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20280 b_status=$(barrier_stat)
20281 [ "$b_status" = "'thawed'" ] ||
20282 error "(7) unexpected barrier status $b_status"
20284 #define OBD_FAIL_BARRIER_FAILURE 0x2203
20285 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
20286 do_facet mgs $LCTL barrier_freeze $FSNAME
20288 b_status=$(barrier_stat)
20289 [ "$b_status" = "'failed'" ] ||
20290 error "(8) unexpected barrier status $b_status"
20292 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
20293 do_facet mgs $LCTL barrier_thaw $FSNAME
20297 run_test 801a "write barrier user interfaces and stat machine"
20302 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20303 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
20304 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
20305 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
20306 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
20308 cancel_lru_locks mdc
20310 # 180 seconds should be long enough
20311 do_facet mgs $LCTL barrier_freeze $FSNAME 180
20313 local b_status=$(barrier_stat)
20314 [ "$b_status" = "'frozen'" ] ||
20315 error "(6) unexpected barrier status $b_status"
20317 mkdir $DIR/$tdir/d0/d10 &
20320 touch $DIR/$tdir/d1/f13 &
20323 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
20326 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
20329 rm -f $DIR/$tdir/d4/f12 &
20332 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
20334 # To guarantee taht the 'stat' is not blocked
20335 b_status=$(barrier_stat)
20336 [ "$b_status" = "'frozen'" ] ||
20337 error "(8) unexpected barrier status $b_status"
20339 # let above commands to run at background
20342 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
20343 ps -p $touch_pid || error "(10) touch should be blocked"
20344 ps -p $ln_pid || error "(11) link should be blocked"
20345 ps -p $mv_pid || error "(12) rename should be blocked"
20346 ps -p $rm_pid || error "(13) unlink should be blocked"
20348 b_status=$(barrier_stat)
20349 [ "$b_status" = "'frozen'" ] ||
20350 error "(14) unexpected barrier status $b_status"
20352 do_facet mgs $LCTL barrier_thaw $FSNAME
20353 b_status=$(barrier_stat)
20354 [ "$b_status" = "'thawed'" ] ||
20355 error "(15) unexpected barrier status $b_status"
20357 wait $mkdir_pid || error "(16) mkdir should succeed"
20358 wait $touch_pid || error "(17) touch should succeed"
20359 wait $ln_pid || error "(18) link should succeed"
20360 wait $mv_pid || error "(19) rename should succeed"
20361 wait $rm_pid || error "(20) unlink should succeed"
20365 run_test 801b "modification will be blocked by write barrier"
20368 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20372 stop mds2 || error "(1) Fail to stop mds2"
20374 do_facet mgs $LCTL barrier_freeze $FSNAME 30
20376 local b_status=$(barrier_stat)
20377 [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || {
20378 do_facet mgs $LCTL barrier_thaw $FSNAME
20379 error "(2) unexpected barrier status $b_status"
20382 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20383 error "(3) Fail to rescan barrier bitmap"
20385 # Do not reduce barrier time - See LU-11873
20386 do_facet mgs $LCTL barrier_freeze $FSNAME 20
20388 b_status=$(barrier_stat)
20389 [ "$b_status" = "'frozen'" ] ||
20390 error "(4) unexpected barrier status $b_status"
20392 do_facet mgs $LCTL barrier_thaw $FSNAME
20393 b_status=$(barrier_stat)
20394 [ "$b_status" = "'thawed'" ] ||
20395 error "(5) unexpected barrier status $b_status"
20397 local devname=$(mdsdevname 2)
20399 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
20401 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20402 error "(7) Fail to rescan barrier bitmap"
20406 run_test 801c "rescan barrier bitmap"
20408 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
20409 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
20410 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
20411 saved_MOUNT_OPTS=$MOUNT_OPTS
20417 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
20418 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
20419 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
20420 MOUNT_OPTS=$saved_MOUNT_OPTS
20426 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20427 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20428 skip "Need server version at least 2.9.55"
20430 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
20432 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20434 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
20435 error "(2) Fail to copy"
20437 trap cleanup_802 EXIT
20439 # sync by force before remount as readonly
20440 sync; sync_all_data; sleep 3; sync_all_data
20444 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
20445 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
20446 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
20448 echo "Mount the server as read only"
20449 setupall server_only || error "(3) Fail to start servers"
20451 echo "Mount client without ro should fail"
20452 mount_client $MOUNT &&
20453 error "(4) Mount client without 'ro' should fail"
20455 echo "Mount client with ro should succeed"
20456 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
20457 mount_client $MOUNT ||
20458 error "(5) Mount client with 'ro' should succeed"
20460 echo "Modify should be refused"
20461 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
20463 echo "Read should be allowed"
20464 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
20465 error "(7) Read should succeed under ro mode"
20469 run_test 802 "simulate readonly device"
20472 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20473 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20474 skip "MDS needs to be newer than 2.10.54"
20476 mkdir -p $DIR/$tdir
20477 # Create some objects on all MDTs to trigger related logs objects
20478 for idx in $(seq $MDSCOUNT); do
20479 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
20480 $DIR/$tdir/dir${idx} ||
20481 error "Fail to create $DIR/$tdir/dir${idx}"
20485 wait_delete_completed # ensure old test cleanups are finished
20486 echo "before create:"
20488 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20490 for i in {1..10}; do
20491 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
20492 error "Fail to create $DIR/$tdir/foo$i"
20496 echo "after create:"
20498 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20500 # allow for an llog to be cleaned up during the test
20501 [ $after_used -ge $((before_used + 10 - 1)) ] ||
20502 error "before ($before_used) + 10 > after ($after_used)"
20504 for i in {1..10}; do
20505 rm -rf $DIR/$tdir/foo$i ||
20506 error "Fail to remove $DIR/$tdir/foo$i"
20509 sleep 3 # avoid MDT return cached statfs
20510 wait_delete_completed
20511 echo "after unlink:"
20513 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20515 # allow for an llog to be created during the test
20516 [ $after_used -le $((before_used + 1)) ] ||
20517 error "after ($after_used) > before ($before_used) + 1"
20519 run_test 803 "verify agent object for remote object"
20522 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20523 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20524 skip "MDS needs to be newer than 2.10.54"
20525 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
20527 mkdir -p $DIR/$tdir
20528 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
20529 error "Fail to create $DIR/$tdir/dir0"
20531 local fid=$($LFS path2fid $DIR/$tdir/dir0)
20532 local dev=$(mdsdevname 2)
20534 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20535 grep ${fid} || error "NOT found agent entry for dir0"
20537 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
20538 error "Fail to create $DIR/$tdir/dir1"
20540 touch $DIR/$tdir/dir1/foo0 ||
20541 error "Fail to create $DIR/$tdir/dir1/foo0"
20542 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
20545 for idx in $(seq $MDSCOUNT); do
20546 dev=$(mdsdevname $idx)
20547 do_facet mds${idx} \
20548 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20549 grep ${fid} && rc=$idx
20552 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
20553 error "Fail to rename foo0 to foo1"
20554 if [ $rc -eq 0 ]; then
20555 for idx in $(seq $MDSCOUNT); do
20556 dev=$(mdsdevname $idx)
20557 do_facet mds${idx} \
20558 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20559 grep ${fid} && rc=$idx
20563 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
20564 error "Fail to rename foo1 to foo2"
20565 if [ $rc -eq 0 ]; then
20566 for idx in $(seq $MDSCOUNT); do
20567 dev=$(mdsdevname $idx)
20568 do_facet mds${idx} \
20569 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20570 grep ${fid} && rc=$idx
20574 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
20576 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
20577 error "Fail to link to $DIR/$tdir/dir1/foo2"
20578 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
20579 error "Fail to rename foo2 to foo0"
20580 unlink $DIR/$tdir/dir1/foo0 ||
20581 error "Fail to unlink $DIR/$tdir/dir1/foo0"
20582 rm -rf $DIR/$tdir/dir0 ||
20583 error "Fail to rm $DIR/$tdir/dir0"
20585 for idx in $(seq $MDSCOUNT); do
20586 dev=$(mdsdevname $idx)
20590 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
20592 start mds${idx} $dev $MDS_MOUNT_OPTS ||
20593 error "mount mds$idx failed"
20594 df $MOUNT > /dev/null 2>&1
20596 # e2fsck should not return error
20598 error "e2fsck detected error on MDT${idx}: rc=$rc"
20601 run_test 804 "verify agent entry for remote entry"
20604 do_facet $SINGLEMDS zfs set quota=$old $fsset
20605 unlinkmany $DIR/$tdir/f- 1000000
20610 local zfs_version=$(do_node $SINGLEMDS cat /sys/module/zfs/version)
20611 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
20612 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
20613 skip "netfree not implemented before 0.7"
20614 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
20615 skip "Need MDS version at least 2.10.57"
20622 local pref="osd-zfs.lustre-MDT0000."
20624 # limit available space on MDS dataset to meet nospace issue
20625 # quickly. then ZFS 0.7.2 can use reserved space if asked
20626 # properly (using netfree flag in osd_declare_destroy()
20627 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
20628 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
20630 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
20631 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
20632 let "usedkb=usedkb-freekb"
20633 let "freekb=freekb/2"
20634 if let "freekb > 5000"; then
20637 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
20638 trap cleanup_805 EXIT
20640 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
20641 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
20642 rm -rf $DIR/$tdir || error "not able to remove"
20643 do_facet $SINGLEMDS zfs set quota=$old $fsset
20646 run_test 805 "ZFS can remove from full fs"
20652 local size=$($LFS getsom -s $file)
20653 local expect=$(stat -c %s $file)
20655 [[ $size == $expect ]] ||
20656 error "$file expected size: $expect, got: $size"
20658 local blocks=$($LFS getsom -b $file)
20659 expect=$(stat -c %b $file)
20660 [[ $blocks == $expect ]] ||
20661 error "$file expected blocks: $expect, got: $blocks"
20666 local size=$($LFS getsom -s $1)
20669 [[ $size == $expect ]] ||
20670 error "$file expected size: $expect, got: $size"
20674 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
20675 skip "Need MDS version at least 2.11.52"
20679 touch $DIR/$tfile || error "touch $tfile failed"
20681 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
20682 save_lustre_params client "llite.*.xattr_cache" > $save
20683 lctl set_param llite.*.xattr_cache=0
20684 stack_trap "restore_lustre_params < $save" EXIT
20686 # single-threaded write
20687 echo "Test SOM for single-threaded write"
20688 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
20689 error "write $tfile failed"
20690 check_lsom_size $DIR/$tfile $bs
20693 local size=$(($num * $bs))
20697 echo "Test SOM for single client multi-threaded($num) write"
20698 $TRUNCATE $DIR/$tfile 0
20699 for ((i = 0; i < $num; i++)); do
20700 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
20702 offset=$((offset + $bs))
20704 for (( i=0; i < $num; i++ )); do
20707 check_lsom_size $DIR/$tfile $size
20709 $TRUNCATE $DIR/$tfile 0
20710 for ((i = 0; i < $num; i++)); do
20711 offset=$((offset - $bs))
20712 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
20715 for (( i=0; i < $num; i++ )); do
20718 check_lsom_size $DIR/$tfile $size
20720 # multi-client writes
20721 num=$(get_node_count ${CLIENTS//,/ })
20722 size=$(($num * $bs))
20726 echo "Test SOM for multi-client ($num) writes"
20727 $TRUNCATE $DIR/$tfile 0
20728 for client in ${CLIENTS//,/ }; do
20729 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
20732 offset=$((offset + $bs))
20734 for (( i=0; i < $num; i++ )); do
20737 check_lsom_size $DIR/$tfile $offset
20740 $TRUNCATE $DIR/$tfile 0
20741 for client in ${CLIENTS//,/ }; do
20742 offset=$((offset - $bs))
20743 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
20747 for (( i=0; i < $num; i++ )); do
20750 check_lsom_size $DIR/$tfile $size
20753 echo "Test SOM for truncate"
20754 $TRUNCATE $DIR/$tfile 1048576
20755 check_lsom_size $DIR/$tfile 1048576
20756 $TRUNCATE $DIR/$tfile 1234
20757 check_lsom_size $DIR/$tfile 1234
20759 # verify SOM blocks count
20760 echo "Verify SOM block count"
20761 $TRUNCATE $DIR/$tfile 0
20762 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
20763 error "failed to write file $tfile"
20764 check_lsom_data $DIR/$tfile
20766 run_test 806 "Verify Lazy Size on MDS"
20769 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
20770 skip "Need MDS version at least 2.11.52"
20772 # Registration step
20773 changelog_register || error "changelog_register failed"
20774 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
20775 changelog_users $SINGLEMDS | grep -q $cl_user ||
20776 error "User $cl_user not found in changelog_users"
20778 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
20779 save_lustre_params client "llite.*.xattr_cache" > $save
20780 lctl set_param llite.*.xattr_cache=0
20781 stack_trap "restore_lustre_params < $save" EXIT
20783 rm -rf $DIR/$tdir || error "rm $tdir failed"
20784 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
20785 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
20786 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
20787 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
20788 error "truncate $tdir/trunc failed"
20791 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
20792 error "write $tfile failed"
20794 # multi-client wirtes
20795 local num=$(get_node_count ${CLIENTS//,/ })
20799 echo "Test SOM for multi-client ($num) writes"
20800 touch $DIR/$tfile || error "touch $tfile failed"
20801 $TRUNCATE $DIR/$tfile 0
20802 for client in ${CLIENTS//,/ }; do
20803 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
20806 offset=$((offset + $bs))
20808 for (( i=0; i < $num; i++ )); do
20813 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
20814 check_lsom_data $DIR/$tdir/trunc
20815 check_lsom_data $DIR/$tdir/single_dd
20816 check_lsom_data $DIR/$tfile
20819 # Deregistration step
20820 changelog_deregister || error "changelog_deregister failed"
20822 run_test 807 "verify LSOM syncing tool"
20824 check_som_nologged()
20826 local lines=$($LFS changelog $FSNAME-MDT0000 |
20827 grep 'x=trusted.som' | wc -l)
20828 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
20832 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
20833 skip "Need MDS version at least 2.11.55"
20835 # Registration step
20836 changelog_register || error "changelog_register failed"
20838 touch $DIR/$tfile || error "touch $tfile failed"
20841 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
20842 error "write $tfile failed"
20845 $TRUNCATE $DIR/$tfile 1234
20848 $TRUNCATE $DIR/$tfile 1048576
20851 # Deregistration step
20852 changelog_deregister || error "changelog_deregister failed"
20854 run_test 808 "Check trusted.som xattr not logged in Changelogs"
20859 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
20863 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
20864 skip "Need MDS version at least 2.11.56"
20866 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
20867 error "failed to create DoM-only file $DIR/$tfile"
20868 touch $DIR/$tfile || error "touch $tfile failed"
20869 check_som_nodata $DIR/$tfile
20871 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
20872 error "write $tfile failed"
20873 check_som_nodata $DIR/$tfile
20875 $TRUNCATE $DIR/$tfile 1234
20876 check_som_nodata $DIR/$tfile
20878 $TRUNCATE $DIR/$tfile 4097
20879 check_som_nodata $DIR/$file
20881 run_test 809 "Verify no SOM xattr store for DoM-only files"
20884 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20885 $GSS && skip_env "could not run with gss"
20888 stack_trap "set_checksums $ORIG_CSUM" EXIT
20889 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
20894 for csum in $CKSUM_TYPES; do
20895 #define OBD_FAIL_OSC_NO_GRANT 0x411
20896 $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411
20897 for i in "10240 0" "10000 0" "4000 1" "500 1"; do
20899 dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2
20900 before=$(md5sum $DIR/$tfile)
20901 $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear
20902 after=$(md5sum $DIR/$tfile)
20903 [ "$before" == "$after" ] ||
20904 error "$csum: $before != $after bs=$1 seek=$2"
20908 run_test 810 "partial page writes on ZFS (LU-11663)"
20911 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
20912 skip "Need MDS version at least 2.11.56"
20914 #define OBD_FAIL_MDS_ORPHAN_DELETE 0x165
20915 do_facet mds1 $LCTL set_param fail_loc=0x165
20916 $MULTIOP $DIR/$tfile Ouc || error "multiop failed"
20919 start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
20922 [[ $(do_facet mds1 pgrep orph_.*-MDD | wc -l) -eq 0 ]] ||
20923 error "MDD orphan cleanup thread not quit"
20925 run_test 811 "orphan name stub can be cleaned up in startup"
20928 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
20929 skip "OST < 2.12.51 doesn't support this fail_loc"
20930 [ "$SHARED_KEY" = true ] &&
20931 skip "OSC connections never go IDLE with Shared-Keys enabled"
20933 $LFS setstripe -c 1 -i 0 $DIR/$tfile
20934 # ensure ost1 is connected
20935 stat $DIR/$tfile >/dev/null || error "can't stat"
20936 wait_osc_import_state client ost1 FULL
20937 # no locks, no reqs to let the connection idle
20938 cancel_lru_locks osc
20940 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
20941 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
20942 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
20943 wait_osc_import_state client ost1 CONNECTING
20944 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
20946 stat $DIR/$tfile >/dev/null || error "can't stat file"
20948 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
20952 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
20953 echo -n y >> $DIR/$tfile
20954 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
20955 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
20957 run_test 814 "sparse cp works as expected (LU-12361)"
20961 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
20962 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
20964 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
20967 [ "$SHARED_KEY" = true ] &&
20968 skip "OSC connections never go IDLE with Shared-Keys enabled"
20970 $LFS setstripe -c 1 -i 0 $DIR/$tfile
20971 # ensure ost1 is connected
20972 stat $DIR/$tfile >/dev/null || error "can't stat"
20973 wait_osc_import_state client ost1 FULL
20974 # no locks, no reqs to let the connection idle
20975 cancel_lru_locks osc
20976 lru_resize_disable osc
20979 before=$($LCTL get_param -n \
20980 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
20982 wait_osc_import_state client ost1 IDLE
20983 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
20984 now=$($LCTL get_param -n \
20985 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
20986 [ $before == $now ] || error "lru_size changed $before != $now"
20988 run_test 816 "do not reset lru_resize on idle reconnect"
20991 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
20992 cancel_lru_locks osc
20993 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
20994 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
20995 dd if=$DIR/$tfile of=/dev/null bs=1M count=1
20998 run_test 819a "too big niobuf in read"
21001 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21002 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21003 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21004 cancel_lru_locks osc
21008 run_test 819b "too big niobuf in write"
21012 $LFS setstripe -c1 -i0 $DIR/$tfile
21013 $LFS setstripe -c1 -i1 $DIR/$tfile
21015 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
21016 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
21017 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
21018 error "start $SINGLEMDS failed"
21021 run_test 818 "unlink with failed llog"
21024 # tests that do cleanup/setup should be run at the end
21028 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21031 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
21032 $LCTL set_param fail_loc=0x903
21034 cancel_lru_locks MGC
21036 FAIL_ON_ERROR=true cleanup
21037 FAIL_ON_ERROR=true setup
21039 run_test 900 "umount should not race with any mgc requeue thread"
21042 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
21043 check_and_cleanup_lustre
21044 if [ "$I_MOUNTED" != "yes" ]; then
21045 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true