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:
79 ALWAYS_EXCEPT="$ALWAYS_EXCEPT "
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"
2377 [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.12.57) ]] &&
2378 skip "Need MDS version >= than 2.12.57"
2379 remote_mds_nodsh && skip "remote MDS with nodsh"
2380 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2382 test_mkdir $DIR/$tdir
2384 # Set default striping on directory
2385 $LFS setstripe -C 4 $DIR/$tdir
2387 echo 1 > $DIR/$tdir/${tfile}.1
2388 local count=$($LFS getstripe -c $DIR/$tdir/${tfile}.1)
2390 [ $count -eq $setcount ] ||
2391 error "(1) stripe count $count, should be $setcount"
2393 # Capture existing append_stripe_count setting for restore
2394 local orig_count=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_stripe_count)
2395 local mdts=$(comma_list $(mdts_nodes))
2396 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=$orig_count" EXIT
2398 local appendcount=$orig_count
2399 echo 1 >> $DIR/$tdir/${tfile}.2_append
2400 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.2_append)
2401 [ $count -eq $appendcount ] ||
2402 error "(2)stripe count $count, should be $appendcount for append"
2404 # Disable O_APPEND striping, verify it works
2405 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2407 # Should now get the default striping, which is 4
2409 echo 1 >> $DIR/$tdir/${tfile}.3_append
2410 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.3_append)
2411 [ $count -eq $setcount ] ||
2412 error "(3) stripe count $count, should be $setcount"
2414 # Try changing the stripe count for append files
2415 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=2
2417 # Append striping is now 2 (directory default is still 4)
2419 echo 1 >> $DIR/$tdir/${tfile}.4_append
2420 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.4_append)
2421 [ $count -eq $appendcount ] ||
2422 error "(4) stripe count $count, should be $appendcount for append"
2424 # Test append stripe count of -1
2425 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=-1
2426 appendcount=$OSTCOUNT
2427 echo 1 >> $DIR/$tdir/${tfile}.5
2428 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.5)
2429 [ $count -eq $appendcount ] ||
2430 error "(5) stripe count $count, should be $appendcount for append"
2432 # Set append striping back to default of 1
2433 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=1
2435 # Try a new default striping, PFL + DOM
2436 $LFS setstripe -L mdt -E 1M -E -1 -c 2 $DIR/$tdir
2438 # Create normal DOM file, DOM returns stripe count == 0
2440 touch $DIR/$tdir/${tfile}.6
2441 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.6)
2442 [ $count -eq $setcount ] ||
2443 error "(6) stripe count $count, should be $setcount"
2447 echo 1 >> $DIR/$tdir/${tfile}.7_append
2448 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.7_append)
2449 [ $count -eq $appendcount ] ||
2450 error "(7) stripe count $count, should be $appendcount for append"
2452 # Clean up DOM layout
2453 $LFS setstripe -d $DIR/$tdir
2455 # Now test that append striping works when layout is from root
2456 $LFS setstripe -c 2 $MOUNT
2457 # Make a special directory for this
2458 mkdir $DIR/${tdir}/${tdir}.2
2459 stack_trap "$LFS setstripe -d $MOUNT" EXIT
2461 # Verify for normal file
2463 echo 1 > $DIR/${tdir}/${tdir}.2/${tfile}.8
2464 count=$($LFS getstripe -c $DIR/$tdir/${tdir}.2/${tfile}.8)
2465 [ $count -eq $setcount ] ||
2466 error "(8) stripe count $count, should be $setcount"
2469 echo 1 >> $DIR/${tdir}/${tdir}.2/${tfile}.9_append
2470 count=$($LFS getstripe -c $DIR/${tdir}/${tdir}.2/${tfile}.9_append)
2471 [ $count -eq $appendcount ] ||
2472 error "(9) stripe count $count, should be $appendcount for append"
2474 # Now test O_APPEND striping with pools
2475 do_nodes $mdts $LCTL set_param mdd.*.append_pool="$TESTNAME"
2476 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'" EXIT
2479 pool_add $TESTNAME || error "pool creation failed"
2480 pool_add_targets $TESTNAME 0 1 || error "Pool add targets failed"
2482 echo 1 >> $DIR/$tdir/${tfile}.10_append
2484 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.10_append)
2485 [ "$pool" = "$TESTNAME" ] || error "(10) incorrect pool: $pool"
2487 # Check that count is still correct
2489 echo 1 >> $DIR/$tdir/${tfile}.11_append
2490 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.11_append)
2491 [ $count -eq $appendcount ] ||
2492 error "(11) stripe count $count, should be $appendcount for append"
2494 # Disable O_APPEND stripe count, verify pool works separately
2495 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2497 echo 1 >> $DIR/$tdir/${tfile}.12_append
2499 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.12_append)
2500 [ "$pool" = "$TESTNAME" ] || error "(12) incorrect pool: $pool"
2502 # Remove pool setting, verify it's not applied
2503 do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'
2505 echo 1 >> $DIR/$tdir/${tfile}.13_append
2507 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.13_append)
2508 [ "$pool" = "" ] || error "(13) pool found: $pool"
2510 run_test 27M "test O_APPEND striping"
2512 # createtest also checks that device nodes are created and
2513 # then visible correctly (#2091)
2514 test_28() { # bug 2091
2516 $CREATETEST $DIR/d28/ct || error "createtest failed"
2518 run_test 28 "create/mknod/mkdir with bad file types ============"
2521 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2523 sync; sleep 1; sync # flush out any dirty pages from previous tests
2530 declare -i LOCKCOUNTORIG=0
2531 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2532 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
2534 [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
2536 declare -i LOCKUNUSEDCOUNTORIG=0
2537 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2538 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
2545 declare -i LOCKCOUNTCURRENT=0
2546 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2547 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
2550 declare -i LOCKUNUSEDCOUNTCURRENT=0
2551 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2552 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
2555 if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
2556 $LCTL set_param -n ldlm.dump_namespaces ""
2557 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
2558 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2559 log "dumped log to $TMP/test_29.dk (bug 5793)"
2562 if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
2563 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
2564 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2565 log "dumped log to $TMP/test_29.dk (bug 5793)"
2569 run_test 29 "IT_GETATTR regression ============================"
2571 test_30a() { # was test_30
2572 cp $(which ls) $DIR || cp /bin/ls $DIR
2573 $DIR/ls / || error "Can't execute binary from lustre"
2576 run_test 30a "execute binary from Lustre (execve) =============="
2579 cp `which ls` $DIR || cp /bin/ls $DIR
2581 $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
2584 run_test 30b "execute binary from Lustre as non-root ==========="
2586 test_30c() { # b=22376
2587 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2589 cp `which ls` $DIR || cp /bin/ls $DIR
2591 cancel_lru_locks mdc
2592 cancel_lru_locks osc
2593 $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
2596 run_test 30c "execute binary from Lustre without read perms ===="
2599 $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
2600 $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
2602 run_test 31a "open-unlink file =================================="
2605 touch $DIR/f31 || error "touch $DIR/f31 failed"
2606 ln $DIR/f31 $DIR/f31b || error "ln failed"
2607 $MULTIOP $DIR/f31b Ouc || error "multiop failed"
2608 $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
2610 run_test 31b "unlink file with multiple links while open ======="
2613 touch $DIR/f31 || error "touch $DIR/f31 failed"
2614 ln $DIR/f31 $DIR/f31c || error "ln failed"
2615 multiop_bg_pause $DIR/f31 O_uc ||
2616 error "multiop_bg_pause for $DIR/f31 failed"
2618 $MULTIOP $DIR/f31c Ouc
2619 kill -USR1 $MULTIPID
2622 run_test 31c "open-unlink file with multiple links ============="
2625 opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
2626 $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
2628 run_test 31d "remove of open directory ========================="
2630 test_31e() { # bug 2904
2631 openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
2633 run_test 31e "remove of open non-empty directory ==============="
2635 test_31f() { # bug 4554
2636 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2639 test_mkdir $DIR/d31f
2640 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2641 cp /etc/hosts $DIR/d31f
2643 $GETSTRIPE $DIR/d31f/hosts
2644 multiop_bg_pause $DIR/d31f D_c || return 1
2647 rm -rv $DIR/d31f || error "first of $DIR/d31f"
2648 test_mkdir $DIR/d31f
2649 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2650 cp /etc/hosts $DIR/d31f
2652 $GETSTRIPE $DIR/d31f/hosts
2653 multiop_bg_pause $DIR/d31f D_c || return 1
2656 kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
2657 wait $MULTIPID || error "first opendir $MULTIPID failed"
2661 kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
2662 wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
2665 run_test 31f "remove of open directory with open-unlink file ==="
2668 echo "-- cross directory link --"
2669 test_mkdir -c1 $DIR/${tdir}ga
2670 test_mkdir -c1 $DIR/${tdir}gb
2671 touch $DIR/${tdir}ga/f
2672 ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
2673 $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
2674 [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
2675 $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
2676 [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
2678 run_test 31g "cross directory link==============="
2681 echo "-- cross directory link --"
2682 test_mkdir -c1 $DIR/${tdir}
2683 test_mkdir -c1 $DIR/${tdir}/dir
2684 touch $DIR/${tdir}/f
2685 ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
2686 $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
2687 [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
2688 $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
2689 [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
2691 run_test 31h "cross directory link under child==============="
2694 echo "-- cross directory link --"
2695 test_mkdir -c1 $DIR/$tdir
2696 test_mkdir -c1 $DIR/$tdir/dir
2697 touch $DIR/$tdir/dir/f
2698 ln $DIR/$tdir/dir/f $DIR/$tdir/g
2699 $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
2700 [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
2701 $CHECKSTAT -t file $DIR/$tdir/g || error "target"
2702 [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
2704 run_test 31i "cross directory link under parent==============="
2707 test_mkdir -c1 -p $DIR/$tdir
2708 test_mkdir -c1 -p $DIR/$tdir/dir1
2709 ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
2710 link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
2711 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
2712 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
2715 run_test 31j "link for directory==============="
2718 test_mkdir -c1 -p $DIR/$tdir
2720 touch $DIR/$tdir/exist
2721 mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
2722 mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
2723 mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
2724 mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
2725 mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
2726 mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
2727 mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
2730 run_test 31k "link to file: the same, non-existing, dir==============="
2736 touch $DIR/d31m2/exist
2737 mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
2738 mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
2739 mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
2740 mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
2741 mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
2742 mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
2745 run_test 31m "link to file: the same, non-existing, dir==============="
2748 touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
2749 nlink=$(stat --format=%h $DIR/$tfile)
2750 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2752 local cmd="exec $fd<$DIR/$tfile"
2755 trap "eval $cmd" EXIT
2756 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2757 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2758 rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
2759 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2760 [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
2763 run_test 31n "check link count of unlinked file"
2766 local TEMPNAME=$(mktemp $1_XXXXXX)
2767 mlink $TEMPNAME $1 2> /dev/null &&
2768 echo "$BASHPID: link $TEMPNAME to $1 succeeded"
2772 test_31o() { # LU-2901
2773 test_mkdir $DIR/$tdir
2774 for LOOP in $(seq 100); do
2775 rm -f $DIR/$tdir/$tfile*
2776 for THREAD in $(seq 8); do
2777 link_one $DIR/$tdir/$tfile.$LOOP &
2780 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
2781 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
2782 error "$LINKS duplicate links to $tfile.$LOOP" &&
2786 run_test 31o "duplicate hard links with same filename"
2789 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
2791 test_mkdir $DIR/$tdir
2792 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
2793 $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
2795 opendirunlink $DIR/$tdir/striped_dir/test1 ||
2796 error "open unlink test1 failed"
2797 opendirunlink $DIR/$tdir/striped_dir/test2 ||
2798 error "open unlink test2 failed"
2800 $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
2801 error "test1 still exists"
2802 $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
2803 error "test2 still exists"
2805 run_test 31p "remove of open striped directory"
2807 cleanup_test32_mount() {
2810 local loopdev=$(losetup -a | grep $EXT2_DEV | sed -ne 's/:.*$//p')
2811 $UMOUNT $DIR/$tdir/ext2-mountpoint || rc=$?
2812 losetup -d $loopdev || true
2818 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2820 echo "== more mountpoints and symlinks ================="
2821 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2822 trap cleanup_test32_mount EXIT
2823 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2824 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2825 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2826 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/.. ||
2827 error "$DIR/$tdir/ext2-mountpoint/.. not dir type"
2828 cleanup_test32_mount
2830 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
2833 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2835 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2836 trap cleanup_test32_mount EXIT
2837 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2838 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2839 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2840 ls -al $DIR/$tdir/ext2-mountpoint/.. ||
2841 error "Can't list $DIR/$tdir/ext2-mountpoint/.."
2842 cleanup_test32_mount
2844 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
2847 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2849 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2850 trap cleanup_test32_mount EXIT
2851 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2852 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2853 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2854 test_mkdir -p $DIR/$tdir/d2/test_dir
2855 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2856 error "$DIR/$tdir/ext2-mountpoint/../d2/test_dir not dir type"
2857 cleanup_test32_mount
2859 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
2862 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2864 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2865 trap cleanup_test32_mount EXIT
2866 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2867 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2868 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2869 test_mkdir -p $DIR/$tdir/d2/test_dir
2870 ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2871 error "Can't list $DIR/$tdir/ext2-mountpoint/../d2/test_dir"
2872 cleanup_test32_mount
2874 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
2878 test_mkdir -p $DIR/$tdir/tmp
2879 local tmp_dir=$DIR/$tdir/tmp
2880 ln -s $DIR/$tdir $tmp_dir/symlink11
2881 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2882 $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2883 $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
2885 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
2889 test_mkdir -p $DIR/$tdir/tmp
2890 local tmp_dir=$DIR/$tdir/tmp
2891 ln -s $DIR/$tdir $tmp_dir/symlink11
2892 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2893 ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2894 ls $DIR/$tdir/symlink01 || error "symlink01 bad"
2896 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
2899 local tmp_dir=$DIR/$tdir/tmp
2900 test_mkdir -p $tmp_dir
2901 test_mkdir $DIR/${tdir}2
2902 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2903 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2904 $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
2905 $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
2906 $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
2907 $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
2909 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2912 rm -fr $DIR/$tdir $DIR/${tdir}2
2913 tmp_dir=$DIR/$tdir/tmp
2914 test_mkdir -p $tmp_dir
2915 test_mkdir $DIR/${tdir}2
2916 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2917 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2918 ls $tmp_dir/symlink12 || error "listing symlink12"
2919 ls $DIR/$tdir/symlink02 || error "listing symlink02"
2921 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2924 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2926 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2927 trap cleanup_test32_mount EXIT
2928 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2929 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2930 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2931 touch $DIR/$tdir/test_file
2932 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../test_file ||
2933 error "$DIR/$tdir/ext2-mountpoint/../test_file not file type"
2934 cleanup_test32_mount
2936 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
2939 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2941 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2942 trap cleanup_test32_mount EXIT
2943 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2944 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2945 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2946 touch $DIR/$tdir/test_file
2947 cat $DIR/$tdir/ext2-mountpoint/../test_file ||
2948 error "Can't open $DIR/$tdir/ext2-mountpoint/../test_file"
2949 cleanup_test32_mount
2951 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
2954 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2957 trap cleanup_test32_mount EXIT
2958 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2959 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2960 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2961 test_mkdir -p $DIR/$tdir/d2
2962 touch $DIR/$tdir/d2/test_file || error "touch failed"
2963 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2964 error "$DIR/$tdir/ext2-mountpoint/../d2/test_file not file type"
2965 cleanup_test32_mount
2967 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
2970 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2973 trap cleanup_test32_mount EXIT
2974 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2975 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2976 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2977 test_mkdir -p $DIR/$tdir/d2
2978 touch $DIR/$tdir/d2/test_file || error "touch failed"
2979 cat $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2980 error "Can't open $DIR/$tdir/ext2-mountpoint/../d2/test_file"
2981 cleanup_test32_mount
2983 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
2987 test_mkdir -p $DIR/d32m/tmp
2988 TMP_DIR=$DIR/d32m/tmp
2989 ln -s $DIR $TMP_DIR/symlink11
2990 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
2991 $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 ||
2992 error "symlink11 not a link"
2993 $CHECKSTAT -t link $DIR/d32m/symlink01 ||
2994 error "symlink01 not a link"
2996 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
3000 test_mkdir -p $DIR/d32n/tmp
3001 TMP_DIR=$DIR/d32n/tmp
3002 ln -s $DIR $TMP_DIR/symlink11
3003 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3004 ls -l $DIR/d32n/tmp/symlink11 || error "listing symlink11"
3005 ls -l $DIR/d32n/symlink01 || error "listing symlink01"
3007 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
3011 test_mkdir -p $DIR/d32o/tmp
3012 TMP_DIR=$DIR/d32o/tmp
3013 ln -s $DIR/$tfile $TMP_DIR/symlink12
3014 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3015 $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 ||
3016 error "symlink12 not a link"
3017 $CHECKSTAT -t link $DIR/d32o/symlink02 || error "symlink02 not a link"
3018 $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 ||
3019 error "$DIR/d32o/tmp/symlink12 not file type"
3020 $CHECKSTAT -t file -f $DIR/d32o/symlink02 ||
3021 error "$DIR/d32o/symlink02 not file type"
3023 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
3033 test_mkdir -p $DIR/d32p/tmp
3035 TMP_DIR=$DIR/d32p/tmp
3037 ln -s $DIR/$tfile $TMP_DIR/symlink12
3039 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3041 cat $DIR/d32p/tmp/symlink12 ||
3042 error "Can't open $DIR/d32p/tmp/symlink12"
3044 cat $DIR/d32p/symlink02 || error "Can't open $DIR/d32p/symlink02"
3047 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
3050 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3052 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3053 trap cleanup_test32_mount EXIT
3054 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3055 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3056 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3057 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3058 ls $DIR/$tdir/ext2-mountpoint | grep "\<under_the_mount\>" && error
3059 cleanup_test32_mount
3061 run_test 32q "stat follows mountpoints in Lustre (should return error)"
3064 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3066 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3067 trap cleanup_test32_mount EXIT
3068 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3069 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3070 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3071 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3072 ls $DIR/$tdir/ext2-mountpoint | grep -q under_the_mount && error || true
3073 cleanup_test32_mount
3075 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
3080 chmod 444 $DIR/$tfile
3081 chown $RUNAS_ID $DIR/$tfile
3083 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3086 run_test 33aa "write file with mode 444 (should return error)"
3090 test_mkdir $DIR/$tdir
3091 chown $RUNAS_ID $DIR/$tdir
3092 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
3093 error "$RUNAS create $tdir/$tfile failed"
3094 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
3095 error "open RDWR" || true
3097 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
3101 test_mkdir $DIR/$tdir
3102 chown $RUNAS_ID $DIR/$tdir
3103 $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
3105 run_test 33b "test open file with malformed flags (No panic)"
3108 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3109 remote_ost_nodsh && skip "remote OST with nodsh"
3118 test_mkdir $DIR/$tdir
3119 # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
3122 for ostnum in $(seq $OSTCOUNT); do
3123 # test-framework's OST numbering is one-based, while Lustre's
3125 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3126 # Parsing llobdstat's output sucks; we could grep the /proc
3127 # path, but that's likely to not be as portable as using the
3128 # llobdstat utility. So we parse lctl output instead.
3129 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3130 obdfilter/$ostname/stats |
3131 awk '/^write_bytes/ {print $7}' )
3132 echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes"
3133 if (( ${write_bytes:-0} > 0 ))
3140 $all_zeros || return 0
3143 echo foo > $DIR/$tdir/bar
3147 # Total up write_bytes after writing. We'd better find non-zeros.
3148 for ostnum in $(seq $OSTCOUNT); do
3149 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3150 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3151 obdfilter/$ostname/stats |
3152 awk '/^write_bytes/ {print $7}' )
3153 echo "write_bytes@$OSTnum/$ostname=$write_bytes"
3154 if (( ${write_bytes:-0} > 0 ))
3163 for ostnum in $(seq $OSTCOUNT); do
3164 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3165 echo "Check that write_bytes is present in obdfilter/*/stats:"
3166 do_facet ost$ostnum lctl get_param -n \
3167 obdfilter/$ostname/stats
3169 error "OST not keeping write_bytes stats (b22312)"
3172 run_test 33c "test llobdstat and write_bytes"
3175 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3176 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3179 local remote_dir=$DIR/$tdir/remote_dir
3181 test_mkdir $DIR/$tdir
3182 $LFS mkdir -i $MDTIDX $remote_dir ||
3183 error "create remote directory failed"
3185 touch $remote_dir/$tfile
3186 chmod 444 $remote_dir/$tfile
3187 chown $RUNAS_ID $remote_dir/$tfile
3189 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3191 chown $RUNAS_ID $remote_dir
3192 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
3193 error "create" || true
3194 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
3195 error "open RDWR" || true
3196 $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
3198 run_test 33d "openfile with 444 modes and malformed flags under remote dir"
3201 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3205 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3206 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3207 mkdir $DIR/$tdir/local_dir
3209 local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3210 local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3211 local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3213 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3214 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
3216 rmdir $DIR/$tdir/* || error "rmdir failed"
3219 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3220 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3221 mkdir $DIR/$tdir/local_dir
3223 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3224 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3225 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3227 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3228 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
3230 rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
3233 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3234 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3235 mkdir $DIR/$tdir/local_dir
3237 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3238 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3239 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3241 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3242 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
3244 run_test 33e "mkdir and striped directory should have same mode"
3248 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
3252 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3253 remote_mds_nodsh && skip "remote MDS with nodsh"
3256 chmod go+rwx $DIR/$tdir
3257 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
3258 trap cleanup_33f EXIT
3260 $RUNAS lfs mkdir -i 0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
3261 error "cannot create striped directory"
3263 $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
3264 error "cannot create files in striped directory"
3266 $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
3267 error "cannot remove files in striped directory"
3269 $RUNAS rmdir $DIR/$tdir/striped_dir ||
3270 error "cannot remove striped directory"
3274 run_test 33f "nonroot user can create, access, and remove a striped directory"
3277 mkdir -p $DIR/$tdir/dir2
3279 local err=$($RUNAS mkdir $DIR/$tdir/dir2 2>&1)
3281 [[ $err =~ "exists" ]] || error "Not exists error"
3283 run_test 33g "nonroot user create already existing root created file"
3285 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
3288 $MCREATE $DIR/f34 || error "mcreate failed"
3289 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3290 error "getstripe failed"
3291 $TRUNCATE $DIR/f34 $TEST_34_SIZE || error "truncate failed"
3292 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3293 error "getstripe failed"
3294 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3295 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3297 run_test 34a "truncate file that has not been opened ==========="
3300 [ ! -f $DIR/f34 ] && test_34a
3301 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3302 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3303 $OPENFILE -f O_RDONLY $DIR/f34
3304 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3305 error "getstripe failed"
3306 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3307 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3309 run_test 34b "O_RDONLY opening file doesn't create objects ====="
3312 [ ! -f $DIR/f34 ] && test_34a
3313 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3314 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3315 $OPENFILE -f O_RDWR $DIR/f34
3316 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" && error
3317 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3318 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3320 run_test 34c "O_RDWR opening file-with-size works =============="
3323 [ ! -f $DIR/f34 ] && test_34a
3324 dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 ||
3326 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3327 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3330 run_test 34d "write to sparse file ============================="
3334 $MCREATE $DIR/f34e || error "mcreate failed"
3335 $TRUNCATE $DIR/f34e 1000 || error "truncate failed"
3336 $CHECKSTAT -s 1000 $DIR/f34e ||
3337 error "Size of $DIR/f34e not equal to 1000 bytes"
3338 $OPENFILE -f O_RDWR $DIR/f34e
3339 $CHECKSTAT -s 1000 $DIR/f34e ||
3340 error "Size of $DIR/f34e not equal to 1000 bytes"
3342 run_test 34e "create objects, some with size and some without =="
3344 test_34f() { # bug 6242, 6243
3345 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3349 $MCREATE $DIR/f34f || error "mcreate failed"
3350 $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
3351 dd if=$DIR/f34f of=$TMP/f34f
3352 $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
3353 dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
3354 cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
3355 cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
3356 rm $TMP/f34f $TMP/f34fzero $DIR/f34f
3358 run_test 34f "read from a file with no objects until EOF ======="
3361 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3363 dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE ||
3365 $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error "truncate failed"
3366 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3367 error "Size of $DIR/$tfile not equal to $((TEST_34_SIZE / 2))"
3368 cancel_lru_locks osc
3369 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3370 error "wrong size after lock cancel"
3372 $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error "truncate failed"
3373 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3374 error "expanding truncate failed"
3375 cancel_lru_locks osc
3376 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3377 error "wrong expanded size after lock cancel"
3379 run_test 34g "truncate long file ==============================="
3382 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3387 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error "dd failed"
3388 sync # Flush the cache so that multiop below does not block on cache
3389 # flush when getting the group lock
3390 $MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
3393 # Since just timed wait is not good enough, let's do a sync write
3394 # that way we are sure enough time for a roundtrip + processing
3395 # passed + 2 seconds of extra margin.
3396 dd if=/dev/zero of=$DIR/${tfile}-1 bs=$PAGE_SIZE oflag=direct count=1
3400 if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then
3401 error "Multiop blocked on ftruncate, pid=$MULTIPID"
3405 local nsz=`stat -c %s $DIR/$tfile`
3406 [[ $nsz == $sz ]] || error "New size wrong $nsz != $sz"
3408 run_test 34h "ftruncate file under grouplock should not block"
3411 cp /bin/sh $DIR/f35a
3413 chown $RUNAS_ID $DIR/f35a
3414 $RUNAS $DIR/f35a && error || true
3417 run_test 35a "exec file with mode 444 (should return and not leak)"
3421 utime $DIR/f36 || error "utime failed for MDS"
3423 run_test 36a "MDS utime check (mknod, utime)"
3427 utime $DIR/f36 || error "utime failed for OST"
3429 run_test 36b "OST utime check (open, utime)"
3434 chown $RUNAS_ID $DIR/d36
3435 $RUNAS utime $DIR/d36/f36 || error "utime failed for MDS as non-root"
3437 run_test 36c "non-root MDS utime check (mknod, utime)"
3440 [ ! -d $DIR/d36 ] && test_36c
3441 echo "" > $DIR/d36/f36
3442 $RUNAS utime $DIR/d36/f36 || error "utime failed for OST as non-root"
3444 run_test 36d "non-root OST utime check (open, utime)"
3447 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping"
3449 test_mkdir $DIR/$tdir
3450 touch $DIR/$tdir/$tfile
3451 $RUNAS utime $DIR/$tdir/$tfile &&
3452 error "utime worked, expected failure" || true
3454 run_test 36e "utime on non-owned file (should return error)"
3458 local LANG_SAVE=$LANG
3459 local LC_LANG_SAVE=$LC_LANG
3460 export LANG=C LC_LANG=C # for date language
3462 DATESTR="Dec 20 2000"
3463 test_mkdir $DIR/$tdir
3464 lctl set_param fail_loc=$fl
3466 cp /etc/hosts $DIR/$tdir/$tfile
3467 sync & # write RPC generated with "current" inode timestamp, but delayed
3469 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
3470 LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
3471 cancel_lru_locks $OSC
3472 LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object
3474 [ "$LS_BEFORE" != "$LS_AFTER" ] && \
3475 echo "BEFORE: $LS_BEFORE" && \
3476 echo "AFTER : $LS_AFTER" && \
3477 echo "WANT : $DATESTR" && \
3478 error "$DIR/$tdir/$tfile timestamps changed" || true
3480 export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE
3484 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3486 #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
3487 subr_36fh "0x80000214"
3489 run_test 36f "utime on file racing with OST BRW write =========="
3492 remote_ost_nodsh && skip "remote OST with nodsh"
3493 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3494 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
3495 skip "Need MDS version at least 2.12.51"
3500 local tgt="obdfilter"
3502 [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1"
3504 test_mkdir $DIR/$tdir
3505 fmd_max_age=$(do_facet $facet \
3506 "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \
3509 echo "FMD max age: ${fmd_max_age}s"
3510 touch $DIR/$tdir/$tfile
3511 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3512 gawk '{cnt=cnt+$1} END{print cnt}')
3513 echo "FMD before: $fmd"
3515 error "FMD wasn't create by touch"
3516 sleep $((fmd_max_age + 12))
3517 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3518 gawk '{cnt=cnt+$1} END{print cnt}')
3519 echo "FMD after: $fmd"
3521 error "FMD wasn't expired by ping"
3523 run_test 36g "FMD cache expiry ====================="
3526 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3528 #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227
3529 subr_36fh "0x80000227"
3531 run_test 36h "utime on file racing with OST BRW write =========="
3534 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3536 test_mkdir $DIR/$tdir
3537 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
3539 local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
3540 local new_mtime=$((mtime + 200))
3542 #change Modify time of striped dir
3543 touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
3544 error "change mtime failed"
3546 local got=$(stat -c%Y $DIR/$tdir/striped_dir)
3548 [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
3550 run_test 36i "change mtime on striped directory"
3552 # test_37 - duplicate with tests 32q 32r
3555 local file=$DIR/$tfile
3557 openfile -f O_DIRECTORY $file
3560 [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true
3561 [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)"
3563 run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ==="
3565 test_39a() { # was test_39
3567 touch $DIR/${tfile}2
3568 # ls -l $DIR/$tfile $DIR/${tfile}2
3569 # ls -lu $DIR/$tfile $DIR/${tfile}2
3570 # ls -lc $DIR/$tfile $DIR/${tfile}2
3572 $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
3573 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
3575 ls -l --full-time $DIR/$tfile $DIR/${tfile}2
3577 ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
3579 ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
3580 error "O_TRUNC didn't change timestamps"
3583 run_test 39a "mtime changed on create"
3586 test_mkdir -c1 $DIR/$tdir
3587 cp -p /etc/passwd $DIR/$tdir/fopen
3588 cp -p /etc/passwd $DIR/$tdir/flink
3589 cp -p /etc/passwd $DIR/$tdir/funlink
3590 cp -p /etc/passwd $DIR/$tdir/frename
3591 ln $DIR/$tdir/funlink $DIR/$tdir/funlink2
3594 echo "aaaaaa" >> $DIR/$tdir/fopen
3595 echo "aaaaaa" >> $DIR/$tdir/flink
3596 echo "aaaaaa" >> $DIR/$tdir/funlink
3597 echo "aaaaaa" >> $DIR/$tdir/frename
3599 local open_new=`stat -c %Y $DIR/$tdir/fopen`
3600 local link_new=`stat -c %Y $DIR/$tdir/flink`
3601 local unlink_new=`stat -c %Y $DIR/$tdir/funlink`
3602 local rename_new=`stat -c %Y $DIR/$tdir/frename`
3604 cat $DIR/$tdir/fopen > /dev/null
3605 ln $DIR/$tdir/flink $DIR/$tdir/flink2
3606 rm -f $DIR/$tdir/funlink2
3607 mv -f $DIR/$tdir/frename $DIR/$tdir/frename2
3609 for (( i=0; i < 2; i++ )) ; do
3610 local open_new2=`stat -c %Y $DIR/$tdir/fopen`
3611 local link_new2=`stat -c %Y $DIR/$tdir/flink`
3612 local unlink_new2=`stat -c %Y $DIR/$tdir/funlink`
3613 local rename_new2=`stat -c %Y $DIR/$tdir/frename2`
3615 [ $open_new2 -eq $open_new ] || error "open file reverses mtime"
3616 [ $link_new2 -eq $link_new ] || error "link file reverses mtime"
3617 [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime"
3618 [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime"
3620 cancel_lru_locks $OSC
3621 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3624 run_test 39b "mtime change on open, link, unlink, rename ======"
3626 # this should be set to past
3627 TEST_39_MTIME=`date -d "1 year ago" +%s`
3633 local mtime0=`stat -c %Y $DIR1/$tfile`
3635 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3636 local mtime1=`stat -c %Y $DIR1/$tfile`
3637 [ "$mtime1" = $TEST_39_MTIME ] || \
3638 error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME"
3641 echo hello >> $DIR1/$tfile
3643 local mtime2=`stat -c %Y $DIR1/$tfile`
3644 [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \
3645 error "mtime is not updated on write: $d1 <= $mtime2 <= $d2"
3647 mv $DIR1/$tfile $DIR1/$tfile-1
3649 for (( i=0; i < 2; i++ )) ; do
3650 local mtime3=`stat -c %Y $DIR1/$tfile-1`
3651 [ "$mtime2" = "$mtime3" ] || \
3652 error "mtime ($mtime2) changed (to $mtime3) on rename"
3654 cancel_lru_locks $OSC
3655 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3658 run_test 39c "mtime change on rename ==========================="
3662 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3665 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3667 for (( i=0; i < 2; i++ )) ; do
3668 local mtime=`stat -c %Y $DIR1/$tfile`
3669 [ $mtime = $TEST_39_MTIME ] || \
3670 error "mtime($mtime) is not set to $TEST_39_MTIME"
3672 cancel_lru_locks $OSC
3673 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3676 run_test 39d "create, utime, stat =============================="
3680 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3683 local mtime1=`stat -c %Y $DIR1/$tfile`
3685 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3687 for (( i=0; i < 2; i++ )) ; do
3688 local mtime2=`stat -c %Y $DIR1/$tfile`
3689 [ $mtime2 = $TEST_39_MTIME ] || \
3690 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3692 cancel_lru_locks $OSC
3693 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3696 run_test 39e "create, stat, utime, stat ========================"
3700 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3703 mtime1=`stat -c %Y $DIR1/$tfile`
3706 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3708 for (( i=0; i < 2; i++ )) ; do
3709 local mtime2=`stat -c %Y $DIR1/$tfile`
3710 [ $mtime2 = $TEST_39_MTIME ] || \
3711 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3713 cancel_lru_locks $OSC
3714 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3717 run_test 39f "create, stat, sleep, utime, stat ================="
3721 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3723 echo hello >> $DIR1/$tfile
3724 local mtime1=`stat -c %Y $DIR1/$tfile`
3727 chmod o+r $DIR1/$tfile
3729 for (( i=0; i < 2; i++ )) ; do
3730 local mtime2=`stat -c %Y $DIR1/$tfile`
3731 [ "$mtime1" = "$mtime2" ] || \
3732 error "lost mtime: $mtime2, should be $mtime1"
3734 cancel_lru_locks $OSC
3735 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3738 run_test 39g "write, chmod, stat ==============================="
3742 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3748 echo hello >> $DIR1/$tfile
3749 local mtime1=`stat -c %Y $DIR1/$tfile`
3751 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3753 if [ "$d1" != "$d2" ]; then
3754 echo "write and touch not within one second"
3756 for (( i=0; i < 2; i++ )) ; do
3757 local mtime2=`stat -c %Y $DIR1/$tfile`
3758 [ "$mtime2" = $TEST_39_MTIME ] || \
3759 error "lost mtime: $mtime2, should be $TEST_39_MTIME"
3761 cancel_lru_locks $OSC
3762 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3766 run_test 39h "write, utime within one second, stat ============="
3769 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3774 echo hello >> $DIR1/$tfile
3775 local mtime1=`stat -c %Y $DIR1/$tfile`
3777 mv $DIR1/$tfile $DIR1/$tfile-1
3779 for (( i=0; i < 2; i++ )) ; do
3780 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3782 [ "$mtime1" = "$mtime2" ] || \
3783 error "lost mtime: $mtime2, should be $mtime1"
3785 cancel_lru_locks $OSC
3786 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3789 run_test 39i "write, rename, stat =============================="
3792 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3794 start_full_debug_logging
3798 #define OBD_FAIL_OSC_DELAY_SETTIME 0x412
3799 lctl set_param fail_loc=0x80000412
3800 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c ||
3801 error "multiop failed"
3803 local mtime1=`stat -c %Y $DIR1/$tfile`
3805 mv $DIR1/$tfile $DIR1/$tfile-1
3807 kill -USR1 $multipid
3808 wait $multipid || error "multiop close failed"
3810 for (( i=0; i < 2; i++ )) ; do
3811 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3812 [ "$mtime1" = "$mtime2" ] ||
3813 error "mtime is lost on close: $mtime2, " \
3816 cancel_lru_locks $OSC
3817 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3819 lctl set_param fail_loc=0
3820 stop_full_debug_logging
3822 run_test 39j "write, rename, close, stat ======================="
3825 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3830 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed"
3832 local mtime1=`stat -c %Y $DIR1/$tfile`
3834 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3836 kill -USR1 $multipid
3837 wait $multipid || error "multiop close failed"
3839 for (( i=0; i < 2; i++ )) ; do
3840 local mtime2=`stat -c %Y $DIR1/$tfile`
3842 [ "$mtime2" = $TEST_39_MTIME ] || \
3843 error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
3845 cancel_lru_locks osc
3846 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3849 run_test 39k "write, utime, close, stat ========================"
3851 # this should be set to future
3852 TEST_39_ATIME=`date -d "1 year" +%s`
3855 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3856 remote_mds_nodsh && skip "remote MDS with nodsh"
3858 local atime_diff=$(do_facet $SINGLEMDS \
3859 lctl get_param -n mdd.*MDT0000*.atime_diff)
3863 # test setting directory atime to future
3864 touch -a -d @$TEST_39_ATIME $DIR/$tdir
3865 local atime=$(stat -c %X $DIR/$tdir)
3866 [ "$atime" = $TEST_39_ATIME ] ||
3867 error "atime is not set to future: $atime, $TEST_39_ATIME"
3869 # test setting directory atime from future to now
3870 local now=$(date +%s)
3871 touch -a -d @$now $DIR/$tdir
3873 atime=$(stat -c %X $DIR/$tdir)
3874 [ "$atime" -eq "$now" ] ||
3875 error "atime is not updated from future: $atime, $now"
3877 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=2
3880 # test setting directory atime when now > dir atime + atime_diff
3881 local d1=$(date +%s)
3883 local d2=$(date +%s)
3884 cancel_lru_locks mdc
3885 atime=$(stat -c %X $DIR/$tdir)
3886 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3887 error "atime is not updated : $atime, should be $d2"
3889 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=60
3892 # test not setting directory atime when now < dir atime + atime_diff
3894 cancel_lru_locks mdc
3895 atime=$(stat -c %X $DIR/$tdir)
3896 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3897 error "atime is updated to $atime, should remain $d1<atime<$d2"
3899 do_facet $SINGLEMDS \
3900 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3902 run_test 39l "directory atime update ==========================="
3905 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3909 local far_past_mtime=$(date -d "May 29 1953" +%s)
3910 local far_past_atime=$(date -d "Dec 17 1903" +%s)
3912 touch -m -d @$far_past_mtime $DIR1/$tfile
3913 touch -a -d @$far_past_atime $DIR1/$tfile
3915 for (( i=0; i < 2; i++ )) ; do
3916 local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
3917 [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
3918 error "atime or mtime set incorrectly"
3920 cancel_lru_locks $OSC
3921 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3924 run_test 39m "test atime and mtime before 1970"
3926 test_39n() { # LU-3832
3927 remote_mds_nodsh && skip "remote MDS with nodsh"
3929 local atime_diff=$(do_facet $SINGLEMDS \
3930 lctl get_param -n mdd.*MDT0000*.atime_diff)
3935 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
3938 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
3939 atime0=$(stat -c %X $DIR/$tfile)
3942 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3943 atime1=$(stat -c %X $DIR/$tfile)
3946 cancel_lru_locks mdc
3947 cancel_lru_locks osc
3948 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3949 atime2=$(stat -c %X $DIR/$tfile)
3951 do_facet $SINGLEMDS \
3952 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3954 [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
3955 [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
3957 run_test 39n "check that O_NOATIME is honored"
3960 TESTDIR=$DIR/$tdir/$tfile
3961 [ -e $TESTDIR ] && rm -rf $TESTDIR
3968 links2=$(stat -c %h .)
3969 [ $(($links1 + 2)) != $links2 ] &&
3970 error "wrong links count $(($links1 + 2)) != $links2"
3972 links3=$(stat -c %h .)
3973 [ $(($links1 + 1)) != $links3 ] &&
3974 error "wrong links count $links1 != $links3"
3977 run_test 39o "directory cached attributes updated after create"
3980 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3983 TESTDIR=$DIR/$tdir/$tdir
3984 [ -e $TESTDIR ] && rm -rf $TESTDIR
3985 test_mkdir -p $TESTDIR
3989 test_mkdir -i $MDTIDX $TESTDIR/remote_dir1
3990 test_mkdir -i $MDTIDX $TESTDIR/remote_dir2
3992 links2=$(stat -c %h .)
3993 [ $(($links1 + 2)) != $links2 ] &&
3994 error "wrong links count $(($links1 + 2)) != $links2"
3996 links3=$(stat -c %h .)
3997 [ $(($links1 + 1)) != $links3 ] &&
3998 error "wrong links count $links1 != $links3"
4001 run_test 39p "remote directory cached attributes updated after create ========"
4004 test_39q() { # LU-8041
4005 local testdir=$DIR/$tdir
4007 multiop_bg_pause $testdir D_c || error "multiop failed"
4009 cancel_lru_locks mdc
4010 kill -USR1 $multipid
4011 local atime=$(stat -c %X $testdir)
4012 [ "$atime" -ne 0 ] || error "atime is zero"
4014 run_test 39q "close won't zero out atime"
4017 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
4018 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
4019 error "openfile O_WRONLY:O_TRUNC $tfile failed"
4020 $CHECKSTAT -t file -s 4096 $DIR/$tfile ||
4021 error "$tfile is not 4096 bytes in size"
4023 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
4027 small_write $DIR/f41 18
4029 run_test 41 "test small file write + fstat ====================="
4031 count_ost_writes() {
4032 lctl get_param -n ${OSC}.*.stats |
4033 awk -vwrites=0 '/ost_write/ { writes += $2 } \
4034 END { printf("%0.0f", writes) }'
4041 BG_DIRTY_RATIO_SAVE=10
4042 MAX_BG_DIRTY_RATIO=25
4046 # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs,
4047 # dirty_ratio, dirty_background_ratio
4048 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4049 sysctl -w vm.dirty_writeback_centisecs=$WRITEBACK_SAVE
4050 sysctl -w vm.dirty_background_ratio=$BG_DIRTY_RATIO_SAVE
4051 sysctl -w vm.dirty_ratio=$DIRTY_RATIO_SAVE
4053 # if file not here, we are a 2.4 kernel
4054 kill -CONT `pidof kupdated`
4059 # setup the trap first, so someone cannot exit the test at the
4060 # exact wrong time and mess up a machine
4061 trap start_writeback EXIT
4062 # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
4063 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4064 WRITEBACK_SAVE=`sysctl -n vm.dirty_writeback_centisecs`
4065 sysctl -w vm.dirty_writeback_centisecs=0
4066 sysctl -w vm.dirty_writeback_centisecs=0
4067 # save and increase /proc/sys/vm/dirty_ratio
4068 DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_ratio`
4069 sysctl -w vm.dirty_ratio=$MAX_DIRTY_RATIO
4070 # save and increase /proc/sys/vm/dirty_background_ratio
4071 BG_DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_background_ratio`
4072 sysctl -w vm.dirty_background_ratio=$MAX_BG_DIRTY_RATIO
4074 # if file not here, we are a 2.4 kernel
4075 kill -STOP `pidof kupdated`
4079 # ensure that all stripes have some grant before we test client-side cache
4081 for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
4082 dd if=/dev/zero of=$i bs=4k count=1
4087 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
4088 # file truncation, and file removal.
4090 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4093 cancel_lru_locks $OSC
4095 sync; sleep 1; sync # just to be safe
4096 BEFOREWRITES=`count_ost_writes`
4097 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur_grant_bytes | grep "[0-9]"
4098 dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
4099 AFTERWRITES=`count_ost_writes`
4100 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
4101 error "$BEFOREWRITES < $AFTERWRITES"
4104 run_test 42a "ensure that we don't flush on close"
4107 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4110 cancel_lru_locks $OSC
4113 dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
4114 BEFOREWRITES=$(count_ost_writes)
4115 $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
4116 AFTERWRITES=$(count_ost_writes)
4117 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4118 error "$BEFOREWRITES < $AFTERWRITES on unlink"
4120 BEFOREWRITES=$(count_ost_writes)
4121 sync || error "sync: $?"
4122 AFTERWRITES=$(count_ost_writes)
4123 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4124 error "$BEFOREWRITES < $AFTERWRITES on sync"
4126 dmesg | grep 'error from obd_brw_async' && error 'error writing back'
4130 run_test 42b "test destroy of file with cached dirty data ======"
4132 # if these tests just want to test the effect of truncation,
4133 # they have to be very careful. consider:
4134 # - the first open gets a {0,EOF}PR lock
4135 # - the first write conflicts and gets a {0, count-1}PW
4136 # - the rest of the writes are under {count,EOF}PW
4137 # - the open for truncate tries to match a {0,EOF}PR
4138 # for the filesize and cancels the PWs.
4139 # any number of fixes (don't get {0,EOF} on open, match
4140 # composite locks, do smarter file size management) fix
4141 # this, but for now we want these tests to verify that
4142 # the cancellation with truncate intent works, so we
4143 # start the file with a full-file pw lock to match against
4144 # until the truncate.
4149 cancel_lru_locks $OSC
4151 # prime the file with 0,EOF PW to match
4155 # now the real test..
4156 dd if=/dev/zero of=$file bs=1024 count=100
4157 BEFOREWRITES=`count_ost_writes`
4158 $TRUNCATE $file $offset
4159 cancel_lru_locks $OSC
4160 AFTERWRITES=`count_ost_writes`
4165 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4168 [ $BEFOREWRITES -eq $AFTERWRITES ] &&
4169 error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
4172 run_test 42c "test partial truncate of file with cached dirty data"
4175 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4178 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
4179 error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
4182 run_test 42d "test complete truncate of file with cached dirty data"
4184 test_42e() { # bug22074
4185 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4187 local TDIR=$DIR/${tdir}e
4188 local pages=16 # hardcoded 16 pages, don't change it.
4189 local files=$((OSTCOUNT * 500)) # hopefully 500 files on each OST
4190 local proc_osc0="osc.${FSNAME}-OST0000-osc-[^MDT]*"
4194 test_mkdir $DIR/${tdir}e
4195 $SETSTRIPE -c 1 $TDIR
4196 createmany -o $TDIR/f $files
4198 max_dirty_mb=$($LCTL get_param -n $proc_osc0/max_dirty_mb)
4200 # we assume that with $OSTCOUNT files, at least one of them will
4201 # be allocated on OST0.
4202 warmup_files=$((OSTCOUNT * max_dirty_mb))
4203 createmany -o $TDIR/w $warmup_files
4205 # write a large amount of data into one file and sync, to get good
4206 # avail_grant number from OST.
4207 for ((i=0; i<$warmup_files; i++)); do
4208 idx=$($GETSTRIPE -i $TDIR/w$i)
4209 [ $idx -ne 0 ] && continue
4210 dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1
4213 [[ $i -gt $warmup_files ]] && error "OST0 is still cold"
4215 $LCTL get_param $proc_osc0/cur_dirty_bytes
4216 $LCTL get_param $proc_osc0/cur_grant_bytes
4218 # create as much dirty pages as we can while not to trigger the actual
4219 # RPCs directly. but depends on the env, VFS may trigger flush during this
4220 # period, hopefully we are good.
4221 for ((i=0; i<$warmup_files; i++)); do
4222 idx=$($GETSTRIPE -i $TDIR/w$i)
4223 [ $idx -ne 0 ] && continue
4224 dd if=/dev/zero of=$TDIR/w$i bs=1M count=1 2>/dev/null
4226 $LCTL get_param $proc_osc0/cur_dirty_bytes
4227 $LCTL get_param $proc_osc0/cur_grant_bytes
4229 # perform the real test
4230 $LCTL set_param $proc_osc0/rpc_stats 0
4231 for ((;i<$files; i++)); do
4232 [ $($GETSTRIPE -i $TDIR/f$i) -eq 0 ] || continue
4233 dd if=/dev/zero of=$TDIR/f$i bs=$PAGE_SIZE count=$pages 2>/dev/null
4236 $LCTL get_param $proc_osc0/rpc_stats
4239 local have_ppr=false
4240 $LCTL get_param $proc_osc0/rpc_stats |
4241 while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do
4242 # skip lines until we are at the RPC histogram data
4243 [ "$PPR" == "pages" ] && have_ppr=true && continue
4244 $have_ppr || continue
4246 # we only want the percent stat for < 16 pages
4247 [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break
4249 percent=$((percent + WPCT))
4250 if [[ $percent -gt 15 ]]; then
4251 error "less than 16-pages write RPCs" \
4258 run_test 42e "verify sub-RPC writes are not done synchronously"
4260 test_43A() { # was test_43
4261 test_mkdir $DIR/$tdir
4262 cp -p /bin/ls $DIR/$tdir/$tfile
4263 $MULTIOP $DIR/$tdir/$tfile Ow_c &
4265 # give multiop a chance to open
4268 $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true
4271 run_test 43A "execution of file opened for write should return -ETXTBSY"
4274 test_mkdir $DIR/$tdir
4275 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4276 $DIR/$tdir/sleep 60 &
4278 # Make sure exec of $tdir/sleep wins race with truncate
4280 $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success"
4283 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
4286 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4288 test_mkdir $DIR/$tdir
4289 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4290 $DIR/$tdir/sleep 60 &
4292 # Make sure exec of $tdir/sleep wins race with truncate
4294 $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success"
4297 run_test 43b "truncate of file being executed should return -ETXTBSY"
4300 local testdir="$DIR/$tdir"
4303 ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) |
4304 ( cd $testdir && md5sum -c )
4306 run_test 43c "md5sum of copy into lustre"
4308 test_44A() { # was test_44
4309 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4311 dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
4312 dd if=$DIR/f1 bs=4k count=1 > /dev/null
4314 run_test 44A "zero length read from a sparse stripe"
4317 local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
4319 [ -z "$nstripe" ] && skip "can't get stripe info"
4320 [[ $nstripe -gt $OSTCOUNT ]] &&
4321 skip "Wrong default_stripe_count: $nstripe OSTCOUNT: $OSTCOUNT"
4323 local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: |
4325 if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then
4326 nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: |
4330 OFFSETS="0 $((stride/2)) $((stride-1))"
4331 for offset in $OFFSETS; do
4332 for i in $(seq 0 $((nstripe-1))); do
4333 local GLOBALOFFSETS=""
4335 local size=$((((i + 2 * $nstripe )*$stride + $offset)))
4336 local myfn=$DIR/d44a-$size
4337 echo "--------writing $myfn at $size"
4338 ll_sparseness_write $myfn $size ||
4339 error "ll_sparseness_write"
4340 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4341 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4342 error "ll_sparseness_verify $GLOBALOFFSETS"
4344 for j in $(seq 0 $((nstripe-1))); do
4346 size=$((((j + $nstripe )*$stride + $offset)))
4347 ll_sparseness_write $myfn $size ||
4348 error "ll_sparseness_write"
4349 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4351 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4352 error "ll_sparseness_verify $GLOBALOFFSETS"
4357 run_test 44a "test sparse pwrite ==============================="
4361 for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
4367 before=`dirty_osc_total`
4368 echo executing "\"$*\""
4370 after=`dirty_osc_total`
4371 echo before $before, after $after
4374 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4377 # Obtain grants from OST if it supports it
4378 echo blah > ${f}_grant
4381 do_dirty_record "echo blah > $f"
4382 [[ $before -eq $after ]] && error "write wasn't cached"
4383 do_dirty_record "> $f"
4384 [[ $before -gt $after ]] || error "truncate didn't lower dirty count"
4385 do_dirty_record "echo blah > $f"
4386 [[ $before -eq $after ]] && error "write wasn't cached"
4387 do_dirty_record "sync"
4388 [[ $before -gt $after ]] || error "writeback didn't lower dirty count"
4389 do_dirty_record "echo blah > $f"
4390 [[ $before -eq $after ]] && error "write wasn't cached"
4391 do_dirty_record "cancel_lru_locks osc"
4392 [[ $before -gt $after ]] ||
4393 error "lock cancellation didn't lower dirty count"
4396 run_test 45 "osc io page accounting ============================"
4398 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this
4399 # test tickles a bug where re-dirtying a page was failing to be mapped to the
4400 # objects offset and an assert hit when an rpc was built with 1023's mapped
4401 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
4403 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4408 dd if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4410 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=1023 count=1
4411 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4415 run_test 46 "dirtying a previously written page ================"
4417 # test_47 is removed "Device nodes check" is moved to test_28
4419 test_48a() { # bug 2399
4420 [ "$mds1_FSTYPE" = "zfs" ] &&
4421 [ $MDS1_VERSION -lt $(version_code 2.3.63) ] &&
4422 skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly"
4424 test_mkdir $DIR/$tdir
4426 mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
4427 test_mkdir $DIR/$tdir
4428 touch foo || error "'touch foo' failed after recreating cwd"
4430 touch .foo || error "'touch .foo' failed after recreating cwd"
4432 ls . > /dev/null || error "'ls .' failed after recreating cwd"
4433 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4434 cd . || error "'cd .' failed after recreating cwd"
4435 mkdir . && error "'mkdir .' worked after recreating cwd"
4436 rmdir . && error "'rmdir .' worked after recreating cwd"
4437 ln -s . baz || error "'ln -s .' failed after recreating cwd"
4438 cd .. || error "'cd ..' failed after recreating cwd"
4440 run_test 48a "Access renamed working dir (should return errors)="
4442 test_48b() { # bug 2399
4444 test_mkdir $DIR/$tdir
4446 rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
4447 touch foo && error "'touch foo' worked after removing cwd"
4448 mkdir foo && error "'mkdir foo' worked after removing cwd"
4449 touch .foo && error "'touch .foo' worked after removing cwd"
4450 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
4451 ls . > /dev/null && error "'ls .' worked after removing cwd"
4452 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4453 mkdir . && error "'mkdir .' worked after removing cwd"
4454 rmdir . && error "'rmdir .' worked after removing cwd"
4455 ln -s . foo && error "'ln -s .' worked after removing cwd"
4456 cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
4458 run_test 48b "Access removed working dir (should return errors)="
4460 test_48c() { # bug 2350
4461 #lctl set_param debug=-1
4464 test_mkdir -p $DIR/$tdir/dir
4466 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4467 $TRACE touch foo && error "touch foo worked after removing cwd"
4468 $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
4469 touch .foo && error "touch .foo worked after removing cwd"
4470 mkdir .foo && error "mkdir .foo worked after removing cwd"
4471 $TRACE ls . && error "'ls .' worked after removing cwd"
4472 $TRACE ls .. || error "'ls ..' failed after removing cwd"
4473 $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
4474 $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
4475 $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
4476 $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
4478 run_test 48c "Access removed working subdir (should return errors)"
4480 test_48d() { # bug 2350
4481 #lctl set_param debug=-1
4484 test_mkdir -p $DIR/$tdir/dir
4486 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4487 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4488 $TRACE touch foo && error "'touch foo' worked after removing parent"
4489 $TRACE mkdir foo && error "mkdir foo worked after removing parent"
4490 touch .foo && error "'touch .foo' worked after removing parent"
4491 mkdir .foo && error "mkdir .foo worked after removing parent"
4492 $TRACE ls . && error "'ls .' worked after removing parent"
4493 $TRACE ls .. && error "'ls ..' worked after removing parent"
4494 $TRACE mkdir . && error "'mkdir .' worked after removing parent"
4495 $TRACE rmdir . && error "'rmdir .' worked after removing parent"
4496 $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
4499 run_test 48d "Access removed parent subdir (should return errors)"
4501 test_48e() { # bug 4134
4502 #lctl set_param debug=-1
4505 test_mkdir -p $DIR/$tdir/dir
4507 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4508 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4509 $TRACE touch $DIR/$tdir || error "'touch $DIR/$tdir' failed"
4510 $TRACE chmod +x $DIR/$tdir || error "'chmod +x $DIR/$tdir' failed"
4511 # On a buggy kernel addition of "touch foo" after cd .. will
4512 # produce kernel oops in lookup_hash_it
4513 touch ../foo && error "'cd ..' worked after recreate parent"
4515 $TRACE rm $DIR/$tdir || error "rm '$DIR/$tdir' failed"
4517 run_test 48e "Access to recreated parent subdir (should return errors)"
4519 test_49() { # LU-1030
4520 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4521 remote_ost_nodsh && skip "remote OST with nodsh"
4523 # get ost1 size - lustre-OST0000
4524 ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
4526 # write 800M at maximum
4527 [[ $ost1_size -lt 2 ]] && ost1_size=2
4528 [[ $ost1_size -gt 819200 ]] && ost1_size=819200
4530 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
4531 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) &
4534 # change max_pages_per_rpc while writing the file
4535 local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc
4536 local orig_mppc=$($LCTL get_param -n $osc1_mppc)
4537 # loop until dd process exits
4538 while ps ax -opid | grep -wq $dd_pid; do
4539 $LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1))
4540 sleep $((RANDOM % 5 + 1))
4542 # restore original max_pages_per_rpc
4543 $LCTL set_param $osc1_mppc=$orig_mppc
4544 rm $DIR/$tfile || error "rm $DIR/$tfile failed"
4546 run_test 49 "Change max_pages_per_rpc won't break osc extent"
4550 test_mkdir $DIR/$tdir
4552 ls /proc/$$/cwd || error "ls /proc/$$/cwd failed"
4554 run_test 50 "special situations: /proc symlinks ==============="
4556 test_51a() { # was test_51
4557 # bug 1516 - create an empty entry right after ".." then split dir
4558 test_mkdir -c1 $DIR/$tdir
4559 touch $DIR/$tdir/foo
4560 $MCREATE $DIR/$tdir/bar
4562 createmany -m $DIR/$tdir/longfile 201
4564 while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do
4565 $MCREATE $DIR/$tdir/longfile$FNUM
4570 ls -l $DIR/$tdir > /dev/null || error "ls -l $DIR/$tdir failed"
4572 run_test 51a "special situations: split htree with empty entry =="
4574 cleanup_print_lfs_df () {
4581 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4583 local dir=$DIR/$tdir
4584 local nrdirs=$((65536 + 100))
4586 # cleanup the directory
4593 local mdtidx=$(printf "%04x" $($LFS getstripe -m $dir))
4594 local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
4595 [[ $numfree -lt $nrdirs ]] &&
4596 skip "not enough free inodes ($numfree) on MDT$mdtidx"
4598 # need to check free space for the directories as well
4599 local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
4600 numfree=$(( blkfree / $(fs_inode_ksize) ))
4601 [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)"
4603 trap cleanup_print_lfs_df EXIT
4606 createmany -d $dir/d $nrdirs || {
4607 unlinkmany $dir/d $nrdirs
4608 error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
4612 nrdirs=$(ls -U $dir | wc -l)
4614 # unlink all but 100 subdirectories, then check it still works
4616 local delete=$((nrdirs - left))
4621 # for ldiskfs the nlink count should be 1, but this is OSD specific
4622 # and so this is listed for informational purposes only
4623 echo "nlink before: $(stat -c %h $dir), created before: $nrdirs"
4624 unlinkmany -d $dir/d $delete ||
4625 error "unlink of first $delete subdirs failed"
4627 echo "nlink between: $(stat -c %h $dir)"
4628 local found=$(ls -U $dir | wc -l)
4629 [ $found -ne $left ] &&
4630 error "can't find subdirs: found only $found, expected $left"
4632 unlinkmany -d $dir/d $delete $left ||
4633 error "unlink of second $left subdirs failed"
4634 # regardless of whether the backing filesystem tracks nlink accurately
4635 # or not, the nlink count shouldn't be more than "." and ".." here
4636 local after=$(stat -c %h $dir)
4637 [[ $after -gt 2 ]] && error "nlink after: $after > 2" ||
4638 echo "nlink after: $after"
4640 cleanup_print_lfs_df
4642 run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
4645 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4646 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
4648 test_mkdir $DIR/$tdir
4649 createmany -o $DIR/$tdir/t- 1000
4650 $LFS getstripe $DIR/$tdir > $TMP/$tfile
4651 for N in $(seq 0 $((OSTCOUNT - 1))); do
4652 OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
4653 END { printf("%0.0f", objs) }' $TMP/$tfile)
4654 OBJS0[$N]=$(grep -A 1 idx $TMP/$tfile | awk -vobjs=0 \
4655 '($1 == '$N') { objs += 1 } \
4656 END { printf("%0.0f", objs) }')
4657 log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
4659 unlinkmany $DIR/$tdir/t- 1000
4662 for N in $(seq 1 $((OSTCOUNT - 1))); do
4663 [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] &&
4664 error "OST $N has less objects vs OST $NLAST" \
4665 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4666 [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] &&
4667 error "OST $N has less objects vs OST $NLAST" \
4668 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4670 [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] &&
4671 error "OST $N has less #0 objects vs OST $NLAST" \
4672 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4673 [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] &&
4674 error "OST $N has less #0 objects vs OST $NLAST" \
4675 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4680 run_test 51d "check object distribution"
4683 if [ "$mds1_FSTYPE" != ldiskfs ]; then
4684 skip_env "ldiskfs only test"
4687 test_mkdir -c1 $DIR/$tdir
4688 test_mkdir -c1 $DIR/$tdir/d0
4690 touch $DIR/$tdir/d0/foo
4691 createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
4692 error "file exceed 65000 nlink limit!"
4693 unlinkmany $DIR/$tdir/d0/f- 65001
4696 run_test 51e "check file nlink limit"
4699 test_mkdir $DIR/$tdir
4702 local ulimit_old=$(ulimit -n)
4703 local spare=20 # number of spare fd's for scripts/libraries, etc.
4704 local mdt=$($LFS getstripe -m $DIR/$tdir)
4705 local numfree=$($LFS df -i $DIR/$tdir | awk '/MDT:'$mdt'/ { print $4 }')
4707 echo "MDT$mdt numfree=$numfree, max=$max"
4708 [[ $numfree -gt $max ]] && numfree=$max || numfree=$((numfree * 7 / 8))
4709 if [ $((numfree + spare)) -gt $ulimit_old ]; then
4710 while ! ulimit -n $((numfree + spare)); do
4711 numfree=$((numfree * 3 / 4))
4713 echo "changed ulimit from $ulimit_old to $((numfree + spare))"
4715 echo "left ulimit at $ulimit_old"
4718 createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
4719 unlinkmany $DIR/$tdir/f $numfree
4720 error "create+open $numfree files in $DIR/$tdir failed"
4722 ulimit -n $ulimit_old
4724 # if createmany exits at 120s there will be fewer than $numfree files
4725 unlinkmany $DIR/$tdir/f $numfree || true
4727 run_test 51f "check many open files limit"
4730 [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
4731 test_mkdir $DIR/$tdir
4732 touch $DIR/$tdir/foo
4733 chattr +a $DIR/$tdir/foo || error "chattr +a failed"
4734 echo bar >> $DIR/$tdir/foo || error "append bar failed"
4735 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4736 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4737 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4739 echo foo >> $DIR/$tdir/foo || error "append foo failed"
4740 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4741 lsattr $DIR/$tdir/foo | egrep -q "^-+a[-e]+ $DIR/$tdir/foo" ||
4743 chattr -a $DIR/$tdir/foo || error "chattr -a failed"
4744 cp -r $DIR/$tdir $TMP/
4745 rm -fr $DIR/$tdir $TMP/$tdir || error "cleanup rm failed"
4747 run_test 52a "append-only flag test (should return errors)"
4750 [ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo
4751 test_mkdir $DIR/$tdir
4752 touch $DIR/$tdir/foo
4753 chattr +i $DIR/$tdir/foo || error "chattr +i failed"
4754 cat test > $DIR/$tdir/foo && error "cat test worked"
4755 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4756 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4757 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4759 echo foo >> $DIR/$tdir/foo && error "echo worked"
4760 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4761 [ -f $DIR/$tdir/foo ] || error "$tdir/foo is not a file"
4762 [ -f $DIR/$tdir/foo_ren ] && error "$tdir/foo_ren is not a file"
4763 lsattr $DIR/$tdir/foo | egrep -q "^-+i[-e]+ $DIR/$tdir/foo" ||
4765 chattr -i $DIR/$tdir/foo || error "chattr failed"
4767 rm -fr $DIR/$tdir || error "unable to remove $DIR/$tdir"
4769 run_test 52b "immutable flag test (should return errors) ======="
4772 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4773 remote_mds_nodsh && skip "remote MDS with nodsh"
4774 remote_ost_nodsh && skip "remote OST with nodsh"
4787 local support_last_seq=true
4789 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
4790 support_last_seq=false
4793 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
4795 for value in $(do_facet $SINGLEMDS \
4796 $LCTL get_param osp.$mdtosc.prealloc_last_id) ; do
4797 param=$(echo ${value[0]} | cut -d "=" -f1)
4798 ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
4800 if $support_last_seq; then
4801 param_seq=$(echo $param |
4802 sed -e s/prealloc_last_id/prealloc_last_seq/g)
4803 mds_last_seq=$(do_facet $SINGLEMDS \
4804 $LCTL get_param -n $param_seq)
4806 mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
4808 ostnum=$(index_from_ostuuid ${ostname}_UUID)
4809 node=$(facet_active_host ost$((ostnum+1)))
4810 param="obdfilter.$ostname.last_id"
4811 for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
4812 echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
4813 ost_last_id=$ost_last
4815 if $support_last_seq; then
4816 ost_last_id=$(echo $ost_last |
4817 awk -F':' '{print $2}' |
4819 ost_last_seq=$(echo $ost_last |
4820 awk -F':' '{print $1}')
4821 [[ $ost_last_seq = $mds_last_seq ]] || continue
4824 if [[ $ost_last_id != $mds_last ]]; then
4825 error "$ost_last_id != $mds_last"
4832 $found || error "can not match last_seq/last_id for $mdtosc"
4835 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
4838 perl -MSocket -e ';' || skip "no Socket perl module installed"
4840 $SOCKETSERVER $DIR/socket ||
4841 error "$SOCKETSERVER $DIR/socket failed: $?"
4842 $SOCKETCLIENT $DIR/socket ||
4843 error "$SOCKETCLIENT $DIR/socket failed: $?"
4844 $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
4846 run_test 54a "unix domain socket test =========================="
4852 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1
4854 run_test 54b "char device works in lustre ======================"
4857 [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
4858 [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
4859 [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
4861 for i in $(seq 3 7); do
4862 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
4871 loopdev="$DIR/loop54c"
4874 $UMOUNT $DIR/$tdir || rc=$?
4875 losetup -d $loopdev || true
4876 losetup -d $LOOPDEV || true
4877 rm -rf $loopdev $DIR/$tfile $DIR/$tdir
4882 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4884 loopdev="$DIR/loop54c"
4887 [ -z "$LOOPNUM" ] && skip_env "couldn't find empty loop device"
4888 trap cleanup_54c EXIT
4889 mknod $loopdev b 7 $LOOPNUM
4890 echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
4891 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE seek=1024 count=1 > /dev/null
4892 losetup $loopdev $DIR/$tfile ||
4893 error "can't set up $loopdev for $DIR/$tfile"
4894 mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
4895 test_mkdir $DIR/$tdir
4896 mount -t ext2 $loopdev $DIR/$tdir ||
4897 error "error mounting $loopdev on $DIR/$tdir"
4898 dd if=/dev/zero of=$DIR/$tdir/tmp bs=$PAGE_SIZE count=30 ||
4901 dd if=$DIR/$tdir/tmp of=/dev/zero bs=$PAGE_SIZE count=30 ||
4905 run_test 54c "block device works in lustre ====================="
4911 [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string"
4913 run_test 54d "fifo device works in lustre ======================"
4918 cp -aL /dev/console $f
4919 echo $string > $f || error "echo $string to $f failed"
4921 run_test 54e "console/tty device works in lustre ======================"
4925 local dir=$DIR/$tdir
4928 test_mkdir -p $dir/dir
4929 for i in $(seq $numfiles); do
4931 touch $dir/dir/file$i
4934 local numcomp=$($LFS getstripe --component-count $dir)
4936 [[ $numcomp == 0 ]] && numcomp=1
4938 # test lfs getstripe with --recursive
4939 local filenum=$($LFS getstripe -r $dir | egrep -c "obdidx|l_ost_idx")
4941 [[ $filenum -eq $((numfiles * 2)) ]] ||
4942 error "$LFS getstripe -r: found $filenum != $((numfiles * 2))"
4943 filenum=$($LFS getstripe $dir | egrep -c "obdidx|l_ost_idx")
4944 [[ $filenum -eq $numfiles ]] ||
4945 error "$LFS getstripe $dir: found $filenum, not $numfiles"
4946 echo "$LFS getstripe showed obdidx or l_ost_idx"
4948 # test lfs getstripe with file instead of dir
4949 filenum=$($LFS getstripe $dir/file1 | egrep -c "obdidx|l_ost_idx")
4950 [[ $filenum -eq 1 ]] ||
4951 error "$LFS getstripe $dir/file1: found $filenum, not 1"
4952 echo "$LFS getstripe file1 passed"
4954 #test lfs getstripe with --verbose
4955 filenum=$($LFS getstripe --verbose $dir | grep -c lmm_magic)
4956 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
4957 error "$LFS getstripe --verbose $dir: "\
4958 "got $filenum want $((numfiles * numcomp)) lmm_magic"
4959 [[ $($LFS getstripe $dir | grep -c lmm_magic) -eq 0 ]] ||
4960 error "$LFS getstripe $dir: showed lmm_magic"
4962 #test lfs getstripe with -v prints lmm_fid
4963 filenum=$($LFS getstripe -v $dir | grep -c lmm_fid)
4964 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
4965 error "$LFS getstripe -v $dir: "\
4966 "got $filenum want $((numfiles * numcomp)) lmm_fid"
4967 [[ $($LFS getstripe $dir | grep -c lmm_fid) -eq 0 ]] ||
4968 error "$LFS getstripe $dir: showed lmm_fid by default"
4969 echo "$LFS getstripe --verbose passed"
4971 #check for FID information
4972 local fid1=$($LFS getstripe --fid $dir/file1)
4973 local fid2=$($LFS getstripe --verbose $dir/file1 |
4974 awk '/lmm_fid: / { print $2; exit; }')
4975 local fid3=$($LFS path2fid $dir/file1)
4977 [ "$fid1" != "$fid2" ] &&
4978 error "getstripe --fid '$fid1' != getstripe --verbose '$fid2'"
4979 [ "$fid1" != "$fid3" ] &&
4980 error "getstripe --fid '$fid1' != lfs path2fid '$fid3'"
4981 echo "$LFS getstripe --fid passed"
4983 #test lfs getstripe with --obd
4984 $LFS getstripe --obd wrong_uuid $dir 2>&1 | grep -q "unknown obduuid" ||
4985 error "$LFS getstripe --obd wrong_uuid: should return error"
4987 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4990 local obduuid=$(ostuuid_from_index $ostidx)
4991 local found=$($LFS getstripe -r --obd $obduuid $dir |
4992 grep 'lmm_stripe_offset:' | grep -c " $ostidx\$")
4994 filenum=$($LFS getstripe -ir $dir | grep -c "^$ostidx\$")
4995 [[ $($LFS getstripe -id $dir) -ne $ostidx ]] ||
4997 [[ $($LFS getstripe -id $dir/dir) -ne $ostidx ]] ||
5000 [[ $found -eq $filenum ]] ||
5001 error "$LFS getstripe --obd: found $found expect $filenum"
5002 [[ $($LFS getstripe -r -v --obd $obduuid $dir |
5003 sed '/^[ ]*'${ostidx}'[ ]/d' |
5004 sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] ||
5005 error "$LFS getstripe --obd: should not show file on other obd"
5006 echo "$LFS getstripe --obd passed"
5008 run_test 56a "check $LFS getstripe"
5011 local dir=$DIR/$tdir
5015 for i in $(seq $numdirs); do
5016 test_mkdir $dir/dir$i
5019 # test lfs getdirstripe default mode is non-recursion, which is
5020 # different from lfs getstripe
5021 local dircnt=$($LFS getdirstripe $dir | grep -c lmv_stripe_count)
5023 [[ $dircnt -eq 1 ]] ||
5024 error "$LFS getdirstripe: found $dircnt, not 1"
5025 dircnt=$($LFS getdirstripe --recursive $dir |
5026 grep -c lmv_stripe_count)
5027 [[ $dircnt -eq $((numdirs + 1)) ]] ||
5028 error "$LFS getdirstripe -r: $dircnt, != $((numdirs + 1))"
5030 run_test 56b "check $LFS getdirstripe"
5033 remote_ost_nodsh && skip "remote OST with nodsh"
5036 local ost_name=$(ostname_from_index $ost_idx)
5037 local old_status=$(ost_dev_status $ost_idx)
5039 [[ -z "$old_status" ]] ||
5040 skip_env "OST $ost_name is in $old_status status"
5042 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
5043 [[ $OST1_VERSION -ge $(version_code 2.12.3) ]] && do_facet ost1 \
5044 $LCTL set_param -n obdfilter.$ost_name.no_precreate=1
5047 local new_status=$(ost_dev_status $ost_idx)
5049 [[ "$new_status" =~ "D" ]] ||
5050 error "$ost_name status is '$new_status', missing 'D'"
5051 if [[ $OST1_VERSION -ge $(version_code 2.12.3) ]]; then
5052 [[ "$new_status" =~ "N" ]] ||
5053 error "$ost_name status is '$new_status', missing 'N'"
5056 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
5057 [[ $OST1_VERSION -ge $(version_code 2.12.3) ]] && do_facet ost1 \
5058 $LCTL set_param -n obdfilter.$ost_name.no_precreate=0
5061 new_status=$(ost_dev_status $ost_idx)
5062 [[ ! "$new_status" =~ "D" && ! "$new_status" =~ "N" ]] ||
5063 error "$ost_name status is '$new_status', has 'D' and/or 'N'"
5065 run_test 56c "check 'lfs df' showing device status"
5070 local local_tdir="$1"
5071 local local_numfiles="$2"
5072 local local_numdirs="$3"
5073 local dir_params="$4"
5074 local dir_stripe_params="$5"
5076 if [ ! -d "$local_tdir" ] ; then
5077 test_mkdir -p $dir_stripe_params $local_tdir
5078 [ "$dir_params" ] && $LFS setstripe $dir_params $local_tdir
5079 for i in $(seq $local_numfiles) ; do
5080 touch $local_tdir/file$i
5082 for i in $(seq $local_numdirs) ; do
5083 test_mkdir $dir_stripe_params $local_tdir/dir$i
5084 for j in $(seq $local_numfiles) ; do
5085 touch $local_tdir/dir$i/file$j
5091 setup_56_special() {
5093 local local_numfiles=$2
5094 local local_numdirs=$3
5096 setup_56 $local_tdir $local_numfiles $local_numdirs
5098 if [ ! -e "$local_tdir/loop${local_numfiles}b" ] ; then
5099 for i in $(seq $local_numfiles) ; do
5100 mknod $local_tdir/loop${i}b b 7 $i
5101 mknod $local_tdir/null${i}c c 1 3
5102 ln -s $local_tdir/file1 $local_tdir/link${i}
5104 for i in $(seq $local_numdirs) ; do
5105 mknod $local_tdir/dir$i/loop${i}b b 7 $i
5106 mknod $local_tdir/dir$i/null${i}c c 1 3
5107 ln -s $local_tdir/dir$i/file1 $local_tdir/dir$i/link${i}
5113 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5114 local expected=$(($NUMDIRS + 2))
5116 setup_56 $dir $NUMFILES $NUMDIRS
5118 # test lfs find with -name
5119 for i in $(seq $NUMFILES) ; do
5120 local nums=$($LFS find -name "*$i" $dir | wc -l)
5122 [ $nums -eq $expected ] ||
5123 error "lfs find -name '*$i' $dir wrong: "\
5124 "found $nums, expected $expected"
5127 run_test 56g "check lfs find -name"
5130 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5131 local expected=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES))
5133 setup_56 $dir $NUMFILES $NUMDIRS
5135 # test lfs find with ! -name
5136 for i in $(seq $NUMFILES) ; do
5137 local nums=$($LFS find ! -name "*$i" $dir | wc -l)
5139 [ $nums -eq $expected ] ||
5140 error "lfs find ! -name '*$i' $dir wrong: "\
5141 "found $nums, expected $expected"
5144 run_test 56h "check lfs find ! -name"
5147 local dir=$DIR/$tdir
5151 local cmd="$LFS find -ost $(ostuuid_from_index 0 $dir) $dir"
5154 [ -z "$out" ] || error "'$cmd' returned directory '$out'"
5156 run_test 56i "check 'lfs find -ost UUID' skips directories"
5159 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5161 setup_56_special $dir $NUMFILES $NUMDIRS
5163 local expected=$((NUMDIRS + 1))
5164 local cmd="$LFS find -type d $dir"
5165 local nums=$($cmd | wc -l)
5167 [ $nums -eq $expected ] ||
5168 error "'$cmd' wrong: found $nums, expected $expected"
5170 run_test 56j "check lfs find -type d"
5173 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5175 setup_56_special $dir $NUMFILES $NUMDIRS
5177 local expected=$(((NUMDIRS + 1) * NUMFILES))
5178 local cmd="$LFS find -type f $dir"
5179 local nums=$($cmd | wc -l)
5181 [ $nums -eq $expected ] ||
5182 error "'$cmd' wrong: found $nums, expected $expected"
5184 run_test 56k "check lfs find -type f"
5187 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5189 setup_56_special $dir $NUMFILES $NUMDIRS
5191 local expected=$((NUMDIRS + NUMFILES))
5192 local cmd="$LFS find -type b $dir"
5193 local nums=$($cmd | wc -l)
5195 [ $nums -eq $expected ] ||
5196 error "'$cmd' wrong: found $nums, expected $expected"
5198 run_test 56l "check lfs find -type b"
5201 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5203 setup_56_special $dir $NUMFILES $NUMDIRS
5205 local expected=$((NUMDIRS + NUMFILES))
5206 local cmd="$LFS find -type c $dir"
5207 local nums=$($cmd | wc -l)
5208 [ $nums -eq $expected ] ||
5209 error "'$cmd' wrong: found $nums, expected $expected"
5211 run_test 56m "check lfs find -type c"
5214 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5215 setup_56_special $dir $NUMFILES $NUMDIRS
5217 local expected=$((NUMDIRS + NUMFILES))
5218 local cmd="$LFS find -type l $dir"
5219 local nums=$($cmd | wc -l)
5221 [ $nums -eq $expected ] ||
5222 error "'$cmd' wrong: found $nums, expected $expected"
5224 run_test 56n "check lfs find -type l"
5227 local dir=$DIR/$tdir
5229 setup_56 $dir $NUMFILES $NUMDIRS
5230 utime $dir/file1 > /dev/null || error "utime (1)"
5231 utime $dir/file2 > /dev/null || error "utime (2)"
5232 utime $dir/dir1 > /dev/null || error "utime (3)"
5233 utime $dir/dir2 > /dev/null || error "utime (4)"
5234 utime $dir/dir1/file1 > /dev/null || error "utime (5)"
5235 dd if=/dev/zero count=1 >> $dir/dir1/file1 && sync
5238 local nums=$($LFS find -mtime +0 $dir | wc -l)
5240 [ $nums -eq $expected ] ||
5241 error "lfs find -mtime +0 $dir: found $nums expect $expected"
5244 cmd="$LFS find -mtime 0 $dir"
5245 nums=$($cmd | wc -l)
5246 [ $nums -eq $expected ] ||
5247 error "'$cmd' wrong: found $nums, expected $expected"
5249 run_test 56o "check lfs find -mtime for old files"
5252 [ $RUNAS_ID -eq $UID ] &&
5253 skip_env "RUNAS_ID = UID = $UID -- skipping"
5255 local dir=$DIR/$tdir
5257 setup_56 $dir $NUMFILES $NUMDIRS
5258 chown $RUNAS_ID $dir/file* || error "chown $DIR/${tdir}g/file$i failed"
5260 local expected=$NUMFILES
5261 local cmd="$LFS find -uid $RUNAS_ID $dir"
5262 local nums=$($cmd | wc -l)
5264 [ $nums -eq $expected ] ||
5265 error "'$cmd' wrong: found $nums, expected $expected"
5267 expected=$(((NUMFILES + 1) * NUMDIRS + 1))
5268 cmd="$LFS find ! -uid $RUNAS_ID $dir"
5269 nums=$($cmd | wc -l)
5270 [ $nums -eq $expected ] ||
5271 error "'$cmd' wrong: found $nums, expected $expected"
5273 run_test 56p "check lfs find -uid and ! -uid"
5276 [ $RUNAS_ID -eq $UID ] &&
5277 skip_env "RUNAS_ID = UID = $UID -- skipping"
5279 local dir=$DIR/$tdir
5281 setup_56 $dir $NUMFILES $NUMDIRS
5282 chgrp $RUNAS_GID $dir/file* || error "chown $dir/file$i failed"
5284 local expected=$NUMFILES
5285 local cmd="$LFS find -gid $RUNAS_GID $dir"
5286 local nums=$($cmd | wc -l)
5288 [ $nums -eq $expected ] ||
5289 error "'$cmd' wrong: found $nums, expected $expected"
5291 expected=$(( ($NUMFILES+1) * $NUMDIRS + 1))
5292 cmd="$LFS find ! -gid $RUNAS_GID $dir"
5293 nums=$($cmd | wc -l)
5294 [ $nums -eq $expected ] ||
5295 error "'$cmd' wrong: found $nums, expected $expected"
5297 run_test 56q "check lfs find -gid and ! -gid"
5300 local dir=$DIR/$tdir
5302 setup_56 $dir $NUMFILES $NUMDIRS
5305 local cmd="$LFS find -size 0 -type f -lazy $dir"
5306 local nums=$($cmd | wc -l)
5308 [ $nums -eq $expected ] ||
5309 error "'$cmd' wrong: found $nums, expected $expected"
5310 cmd="$LFS find -size 0 -type f $dir"
5311 nums=$($cmd | wc -l)
5312 [ $nums -eq $expected ] ||
5313 error "'$cmd' wrong: found $nums, expected $expected"
5316 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5317 nums=$($cmd | wc -l)
5318 [ $nums -eq $expected ] ||
5319 error "'$cmd' wrong: found $nums, expected $expected"
5320 cmd="$LFS find ! -size 0 -type f $dir"
5321 nums=$($cmd | wc -l)
5322 [ $nums -eq $expected ] ||
5323 error "'$cmd' wrong: found $nums, expected $expected"
5325 echo "test" > $dir/$tfile
5326 echo "test2" > $dir/$tfile.2 && sync
5328 cmd="$LFS find -size 5 -type f -lazy $dir"
5329 nums=$($cmd | wc -l)
5330 [ $nums -eq $expected ] ||
5331 error "'$cmd' wrong: found $nums, expected $expected"
5332 cmd="$LFS find -size 5 -type f $dir"
5333 nums=$($cmd | wc -l)
5334 [ $nums -eq $expected ] ||
5335 error "'$cmd' wrong: found $nums, expected $expected"
5338 cmd="$LFS find -size +5 -type f -lazy $dir"
5339 nums=$($cmd | wc -l)
5340 [ $nums -eq $expected ] ||
5341 error "'$cmd' wrong: found $nums, expected $expected"
5342 cmd="$LFS find -size +5 -type f $dir"
5343 nums=$($cmd | wc -l)
5344 [ $nums -eq $expected ] ||
5345 error "'$cmd' wrong: found $nums, expected $expected"
5348 cmd="$LFS find -size +0 -type f -lazy $dir"
5349 nums=$($cmd | wc -l)
5350 [ $nums -eq $expected ] ||
5351 error "'$cmd' wrong: found $nums, expected $expected"
5352 cmd="$LFS find -size +0 -type f $dir"
5353 nums=$($cmd | wc -l)
5354 [ $nums -eq $expected ] ||
5355 error "'$cmd' wrong: found $nums, expected $expected"
5358 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5359 nums=$($cmd | wc -l)
5360 [ $nums -eq $expected ] ||
5361 error "'$cmd' wrong: found $nums, expected $expected"
5362 cmd="$LFS find ! -size -5 -type f $dir"
5363 nums=$($cmd | wc -l)
5364 [ $nums -eq $expected ] ||
5365 error "'$cmd' wrong: found $nums, expected $expected"
5368 cmd="$LFS find -size -5 -type f -lazy $dir"
5369 nums=$($cmd | wc -l)
5370 [ $nums -eq $expected ] ||
5371 error "'$cmd' wrong: found $nums, expected $expected"
5372 cmd="$LFS find -size -5 -type f $dir"
5373 nums=$($cmd | wc -l)
5374 [ $nums -eq $expected ] ||
5375 error "'$cmd' wrong: found $nums, expected $expected"
5377 run_test 56r "check lfs find -size works"
5380 local dir=$DIR/$tdir
5382 [[ $OSC == "mdc" ]] && skip "DoM files" && return
5384 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5386 cancel_lru_locks $OSC
5388 local rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5390 local cmd="$LFS find -size 0 -type f -lazy $dir"
5391 local nums=$($cmd | wc -l)
5393 [ $nums -eq $expected ] ||
5394 error "'$cmd' wrong: found $nums, expected $expected"
5396 local rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5397 [ $rpcs_before -eq $rpcs_after ] ||
5398 error "'$cmd' should not send glimpse RPCs to OST"
5399 cmd="$LFS find -size 0 -type f $dir"
5400 nums=$($cmd | wc -l)
5401 [ $nums -eq $expected ] ||
5402 error "'$cmd' wrong: found $nums, expected $expected"
5403 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5404 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5405 $LCTL get_param osc.*.stats
5406 [ $rpcs_after -eq $((rpcs_before + 12)) ] ||
5407 error "'$cmd' should send 12 glimpse RPCs to OST"
5409 cancel_lru_locks $OSC
5410 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5412 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5413 nums=$($cmd | wc -l)
5414 [ $nums -eq $expected ] ||
5415 error "'$cmd' wrong: found $nums, expected $expected"
5416 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5417 $LCTL get_param mdc.*.stats
5418 [ $rpcs_before -eq $rpcs_after ] ||
5419 error "'$cmd' should not send glimpse RPCs to OST"
5420 cmd="$LFS find ! -size 0 -type f $dir"
5421 nums=$($cmd | wc -l)
5422 [ $nums -eq $expected ] ||
5423 error "'$cmd' wrong: found $nums, expected $expected"
5424 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5425 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5426 [ $rpcs_after -eq $((rpcs_before + 12)) ] ||
5427 error "'$cmd' should send 12 glimpse RPCs to OST"
5429 echo "test" > $dir/$tfile
5430 echo "test2" > $dir/$tfile.2 && sync
5431 cancel_lru_locks $OSC
5432 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5434 cmd="$LFS find -size 5 -type f -lazy $dir"
5435 nums=$($cmd | wc -l)
5436 [ $nums -eq $expected ] ||
5437 error "'$cmd' wrong: found $nums, expected $expected"
5438 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5439 [ $rpcs_before -eq $rpcs_after ] ||
5440 error "'$cmd' should not send glimpse RPCs to OST"
5441 cmd="$LFS find -size 5 -type f $dir"
5442 nums=$($cmd | wc -l)
5443 [ $nums -eq $expected ] ||
5444 error "'$cmd' wrong: found $nums, expected $expected"
5445 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5446 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5447 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5448 error "'$cmd' should send 14 glimpse RPCs to OST"
5450 cancel_lru_locks $OSC
5451 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5453 cmd="$LFS find -size +5 -type f -lazy $dir"
5454 nums=$($cmd | wc -l)
5455 [ $nums -eq $expected ] ||
5456 error "'$cmd' wrong: found $nums, expected $expected"
5457 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5458 [ $rpcs_before -eq $rpcs_after ] ||
5459 error "'$cmd' should not send glimpse RPCs to OST"
5460 cmd="$LFS find -size +5 -type f $dir"
5461 nums=$($cmd | wc -l)
5462 [ $nums -eq $expected ] ||
5463 error "'$cmd' wrong: found $nums, expected $expected"
5464 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5465 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5466 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5467 error "'$cmd' should send 14 glimpse RPCs to OST"
5469 cancel_lru_locks $OSC
5470 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5472 cmd="$LFS find -size +0 -type f -lazy $dir"
5473 nums=$($cmd | wc -l)
5474 [ $nums -eq $expected ] ||
5475 error "'$cmd' wrong: found $nums, expected $expected"
5476 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5477 [ $rpcs_before -eq $rpcs_after ] ||
5478 error "'$cmd' should not send glimpse RPCs to OST"
5479 cmd="$LFS find -size +0 -type f $dir"
5480 nums=$($cmd | wc -l)
5481 [ $nums -eq $expected ] ||
5482 error "'$cmd' wrong: found $nums, expected $expected"
5483 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5484 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5485 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5486 error "'$cmd' should send 14 glimpse RPCs to OST"
5488 cancel_lru_locks $OSC
5489 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5491 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5492 nums=$($cmd | wc -l)
5493 [ $nums -eq $expected ] ||
5494 error "'$cmd' wrong: found $nums, expected $expected"
5495 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5496 [ $rpcs_before -eq $rpcs_after ] ||
5497 error "'$cmd' should not send glimpse RPCs to OST"
5498 cmd="$LFS find ! -size -5 -type f $dir"
5499 nums=$($cmd | wc -l)
5500 [ $nums -eq $expected ] ||
5501 error "'$cmd' wrong: found $nums, expected $expected"
5502 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5503 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5504 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5505 error "'$cmd' should send 14 glimpse RPCs to OST"
5507 cancel_lru_locks $OSC
5508 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5510 cmd="$LFS find -size -5 -type f -lazy $dir"
5511 nums=$($cmd | wc -l)
5512 [ $nums -eq $expected ] ||
5513 error "'$cmd' wrong: found $nums, expected $expected"
5514 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5515 [ $rpcs_before -eq $rpcs_after ] ||
5516 error "'$cmd' should not send glimpse RPCs to OST"
5517 cmd="$LFS find -size -5 -type f $dir"
5518 nums=$($cmd | wc -l)
5519 [ $nums -eq $expected ] ||
5520 error "'$cmd' wrong: found $nums, expected $expected"
5521 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5522 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5523 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5524 error "'$cmd' should send 14 glimpse RPCs to OST"
5526 run_test 56ra "check lfs find -size -lazy works for data on OSTs"
5528 test_56s() { # LU-611 #LU-9369
5529 [[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
5531 local dir=$DIR/$tdir
5532 local onestripe=$(((NUMDIRS + 1) * NUMFILES))
5534 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5535 for i in $(seq $NUMDIRS); do
5536 $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile
5539 local expected=$NUMDIRS
5540 local cmd="$LFS find -c $OSTCOUNT $dir"
5541 local nums=$($cmd | wc -l)
5543 [ $nums -eq $expected ] || {
5544 $LFS getstripe -R $dir
5545 error "'$cmd' wrong: found $nums, expected $expected"
5548 expected=$((NUMDIRS + onestripe))
5549 cmd="$LFS find -stripe-count +0 -type f $dir"
5550 nums=$($cmd | wc -l)
5551 [ $nums -eq $expected ] || {
5552 $LFS getstripe -R $dir
5553 error "'$cmd' wrong: found $nums, expected $expected"
5557 cmd="$LFS find -stripe-count 1 -type f $dir"
5558 nums=$($cmd | wc -l)
5559 [ $nums -eq $expected ] || {
5560 $LFS getstripe -R $dir
5561 error "'$cmd' wrong: found $nums, expected $expected"
5564 cmd="$LFS find -stripe-count -2 -type f $dir"
5565 nums=$($cmd | wc -l)
5566 [ $nums -eq $expected ] || {
5567 $LFS getstripe -R $dir
5568 error "'$cmd' wrong: found $nums, expected $expected"
5572 cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir"
5573 nums=$($cmd | wc -l)
5574 [ $nums -eq $expected ] || {
5575 $LFS getstripe -R $dir
5576 error "'$cmd' wrong: found $nums, expected $expected"
5579 run_test 56s "check lfs find -stripe-count works"
5581 test_56t() { # LU-611 #LU-9369
5582 local dir=$DIR/$tdir
5584 setup_56 $dir 0 $NUMDIRS
5585 for i in $(seq $NUMDIRS); do
5586 $LFS setstripe -S 8M $dir/dir$i/$tfile
5589 local expected=$NUMDIRS
5590 local cmd="$LFS find -S 8M $dir"
5591 local nums=$($cmd | wc -l)
5593 [ $nums -eq $expected ] || {
5594 $LFS getstripe -R $dir
5595 error "'$cmd' wrong: found $nums, expected $expected"
5599 setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k"
5601 $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3}
5603 expected=$(((NUMDIRS + 1) * NUMFILES))
5604 cmd="$LFS find -stripe-size 512k -type f $dir"
5605 nums=$($cmd | wc -l)
5606 [ $nums -eq $expected ] ||
5607 error "'$cmd' wrong: found $nums, expected $expected"
5609 cmd="$LFS find -stripe-size +320k -type f $dir"
5610 nums=$($cmd | wc -l)
5611 [ $nums -eq $expected ] ||
5612 error "'$cmd' wrong: found $nums, expected $expected"
5614 expected=$(((NUMDIRS + 1) * NUMFILES + 4))
5615 cmd="$LFS find -stripe-size +200k -type f $dir"
5616 nums=$($cmd | wc -l)
5617 [ $nums -eq $expected ] ||
5618 error "'$cmd' wrong: found $nums, expected $expected"
5620 cmd="$LFS find -stripe-size -640k -type f $dir"
5621 nums=$($cmd | wc -l)
5622 [ $nums -eq $expected ] ||
5623 error "'$cmd' wrong: found $nums, expected $expected"
5626 cmd="$LFS find -stripe-size 256k -type f $dir"
5627 nums=$($cmd | wc -l)
5628 [ $nums -eq $expected ] ||
5629 error "'$cmd' wrong: found $nums, expected $expected"
5631 cmd="$LFS find -stripe-size -320k -type f $dir"
5632 nums=$($cmd | wc -l)
5633 [ $nums -eq $expected ] ||
5634 error "'$cmd' wrong: found $nums, expected $expected"
5637 cmd="$LFS find -stripe-size 1024k -type f $dir"
5638 nums=$($cmd | wc -l)
5639 [ $nums -eq $expected ] ||
5640 error "'$cmd' wrong: found $nums, expected $expected"
5642 run_test 56t "check lfs find -stripe-size works"
5644 test_56u() { # LU-611
5645 local dir=$DIR/$tdir
5647 setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1"
5649 if [[ $OSTCOUNT -gt 1 ]]; then
5650 $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3}
5656 local expected=$(((NUMDIRS + 1) * NUMFILES))
5657 local cmd="$LFS find -stripe-index 0 -type f $dir"
5658 local nums=$($cmd | wc -l)
5660 [ $nums -eq $expected ] ||
5661 error "'$cmd' wrong: found $nums, expected $expected"
5664 cmd="$LFS find -stripe-index 1 -type f $dir"
5665 nums=$($cmd | wc -l)
5666 [ $nums -eq $expected ] ||
5667 error "'$cmd' wrong: found $nums, expected $expected"
5669 cmd="$LFS find ! -stripe-index 0 -type f $dir"
5670 nums=$($cmd | wc -l)
5671 [ $nums -eq $expected ] ||
5672 error "'$cmd' wrong: found $nums, expected $expected"
5675 # This should produce an error and not return any files
5676 cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir"
5677 nums=$($cmd 2>/dev/null | wc -l)
5678 [ $nums -eq $expected ] ||
5679 error "'$cmd' wrong: found $nums, expected $expected"
5681 if [[ $OSTCOUNT -gt 1 ]]; then
5682 expected=$(((NUMDIRS + 1) * NUMFILES + onestripe))
5683 cmd="$LFS find -stripe-index 0,1 -type f $dir"
5684 nums=$($cmd | wc -l)
5685 [ $nums -eq $expected ] ||
5686 error "'$cmd' wrong: found $nums, expected $expected"
5689 run_test 56u "check lfs find -stripe-index works"
5693 local dir=$DIR/$tdir
5695 setup_56 $dir $NUMFILES $NUMDIRS
5697 UUID=$(mdtuuid_from_index $mdt_idx $dir)
5698 [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $mdt_idx"
5700 for file in $($LFS find -m $UUID $dir); do
5701 file_midx=$($LFS getstripe -m $file)
5702 [ $file_midx -eq $mdt_idx ] ||
5703 error "lfs find -m $UUID != getstripe -m $file_midx"
5706 run_test 56v "check 'lfs find -m match with lfs getstripe -m'"
5709 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5710 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5712 local dir=$DIR/$tdir
5714 setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
5716 local stripe_size=$($LFS getstripe -S -d $dir) ||
5717 error "$LFS getstripe -S -d $dir failed"
5718 stripe_size=${stripe_size%% *}
5720 local file_size=$((stripe_size * OSTCOUNT))
5721 local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
5722 local required_space=$((file_num * file_size))
5723 local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
5725 [[ $free_space -le $((required_space / 1024)) ]] &&
5726 skip_env "need $required_space, have $free_space kbytes"
5729 local dd_count=$((file_size / dd_bs))
5731 # write data into the files
5736 for i in $(seq $NUMFILES); do
5738 yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5739 error "write data into $file failed"
5741 for i in $(seq $NUMDIRS); do
5742 for j in $(seq $NUMFILES); do
5743 file=$dir/dir$i/file$j
5744 yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5745 error "write data into $file failed"
5749 # $LFS_MIGRATE will fail if hard link migration is unsupported
5750 if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then
5751 createmany -l$dir/dir1/file1 $dir/dir1/link 200 ||
5752 error "creating links to $dir/dir1/file1 failed"
5757 [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
5760 local cmd="$LFS_MIGRATE -y -c $expected $dir/file1"
5763 eval $cmd || error "$cmd failed"
5765 check_stripe_count $dir/file1 $expected
5767 if [ $MDS1_VERSION -ge $(version_code 2.6.90) ];
5769 # lfs_migrate file onto OST 0 if it is on OST 1, or onto
5770 # OST 1 if it is on OST 0. This file is small enough to
5771 # be on only one stripe.
5772 file=$dir/migr_1_ost
5773 dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
5774 error "write data into $file failed"
5775 local obdidx=$($LFS getstripe -i $file)
5776 local oldmd5=$(md5sum $file)
5779 [[ $obdidx -eq 0 ]] && newobdidx=1
5780 cmd="$LFS migrate -i $newobdidx $file"
5782 eval $cmd || error "$cmd failed"
5784 local realobdix=$($LFS getstripe -i $file)
5785 local newmd5=$(md5sum $file)
5787 [[ $newobdidx -ne $realobdix ]] &&
5788 error "new OST is different (was=$obdidx, "\
5789 "wanted=$newobdidx, got=$realobdix)"
5790 [[ "$oldmd5" != "$newmd5" ]] &&
5791 error "md5sum differ: $oldmd5, $newmd5"
5795 cmd="$LFS_MIGRATE -y -c $expected $dir/dir1"
5797 eval $cmd || error "$cmd failed"
5799 for j in $(seq $NUMFILES); do
5800 check_stripe_count $dir/dir1/file$j $expected
5803 # lfs_migrate works with lfs find
5804 cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir |
5805 $LFS_MIGRATE -y -c $expected"
5807 eval $cmd || error "$cmd failed"
5809 for i in $(seq 2 $NUMFILES); do
5810 check_stripe_count $dir/file$i $expected
5812 for i in $(seq 2 $NUMDIRS); do
5813 for j in $(seq $NUMFILES); do
5814 check_stripe_count $dir/dir$i/file$j $expected
5818 run_test 56w "check lfs_migrate -c stripe_count works"
5821 local file1=$DIR/$tdir/file1
5822 local create_pool=false
5823 local initial_pool=$($LFS getstripe -p $DIR)
5827 echo -n "Creating test dir..."
5828 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5831 echo -n "Creating test file..."
5832 touch $file1 || error "cannot create file"
5835 echo -n "Detecting existing pools..."
5836 pool_list=($($LFS pool_list $FSNAME | grep "$FSNAME\." | cut -d. -f2))
5838 if [ ${#pool_list[@]} -gt 0 ]; then
5839 echo "${pool_list[@]}"
5840 for thispool in "${pool_list[@]}"; do
5841 if [[ -z "$initial_pool" ||
5842 "$initial_pool" != "$thispool" ]]; then
5844 echo "Using existing pool '$pool'"
5849 echo "none detected."
5851 if [ -z "$pool" ]; then
5852 pool=${POOL:-testpool}
5853 [ "$initial_pool" = "$pool" ] && pool="testpool2"
5854 echo -n "Creating pool '$pool'..."
5856 pool_add $pool &> /dev/null ||
5857 error "pool_add failed"
5860 echo -n "Adding target to pool..."
5861 pool_add_targets $pool 0 0 1 &> /dev/null ||
5862 error "pool_add_targets failed"
5866 echo -n "Setting pool using -p option..."
5867 $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null ||
5868 error "migrate failed rc = $?"
5871 echo -n "Verifying test file is in pool after migrating..."
5872 [ "$($LFS getstripe -p $file1)" = $pool ] ||
5873 error "file was not migrated to pool $pool"
5876 echo -n "Removing test file from pool '$pool'..."
5877 # "lfs migrate $file" won't remove the file from the pool
5878 # until some striping information is changed.
5879 $LFS migrate -c 1 $file1 &> /dev/null ||
5880 error "cannot remove from pool"
5881 [ "$($LFS getstripe -p $file1)" ] &&
5882 error "pool still set"
5885 echo -n "Setting pool using --pool option..."
5886 $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null ||
5887 error "migrate failed rc = $?"
5892 if $create_pool; then
5893 destroy_test_pools 2> /dev/null ||
5894 error "destroy test pools failed"
5897 run_test 56wb "check lfs_migrate pool support"
5900 local file1="$DIR/$tdir/file1"
5907 echo -n "Creating test dir..."
5908 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5909 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
5910 error "cannot set stripe by '-S 1M -c 1'"
5913 echo -n "Setting initial stripe for test file..."
5914 $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
5915 error "cannot set stripe"
5916 cur_ssize=$($LFS getstripe -S "$file1")
5917 [ $cur_ssize -eq 524288 ] || error "setstripe -S $cur_ssize != 524288"
5920 # File currently set to -S 512K -c 1
5922 # Ensure -c and -S options are rejected when -R is set
5923 echo -n "Verifying incompatible options are detected..."
5924 $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null &&
5925 error "incompatible -c and -R options not detected"
5926 $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null &&
5927 error "incompatible -S and -R options not detected"
5930 # Ensure unrecognized options are passed through to 'lfs migrate'
5931 echo -n "Verifying -S option is passed through to lfs migrate..."
5932 $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
5933 error "migration failed"
5934 cur_ssize=$($LFS getstripe -S "$file1")
5935 [ $cur_ssize -eq 1048576 ] || error "migrate -S $cur_ssize != 1048576"
5938 # File currently set to -S 1M -c 1
5940 # Ensure long options are supported
5941 echo -n "Verifying long options supported..."
5942 $LFS_MIGRATE -y --non-block "$file1" &> /dev/null ||
5943 error "long option without argument not supported"
5944 $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
5945 error "long option with argument not supported"
5946 cur_ssize=$($LFS getstripe -S "$file1")
5947 [ $cur_ssize -eq 524288 ] ||
5948 error "migrate --stripe-size $cur_ssize != 524288"
5951 # File currently set to -S 512K -c 1
5953 if [ "$OSTCOUNT" -gt 1 ]; then
5954 echo -n "Verifying explicit stripe count can be set..."
5955 $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
5956 error "migrate failed"
5957 cur_scount=$($LFS getstripe -c "$file1")
5958 [ $cur_scount -eq 2 ] || error "migrate -c $cur_scount != 2"
5962 # File currently set to -S 512K -c 1 or -S 512K -c 2
5964 # Ensure parent striping is used if -R is set, and no stripe
5965 # count or size is specified
5966 echo -n "Setting stripe for parent directory..."
5967 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5968 error "cannot set stripe '-S 2M -c 1'"
5971 echo -n "Verifying restripe option uses parent stripe settings..."
5972 parent_ssize=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
5973 parent_scount=$($LFS getstripe -c $DIR/$tdir 2>/dev/null)
5974 $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
5975 error "migrate failed"
5976 cur_ssize=$($LFS getstripe -S "$file1")
5977 [ $cur_ssize -eq $parent_ssize ] ||
5978 error "migrate -R stripe_size $cur_ssize != $parent_ssize"
5979 cur_scount=$($LFS getstripe -c "$file1")
5980 [ $cur_scount -eq $parent_scount ] ||
5981 error "migrate -R stripe_count $cur_scount != $parent_scount"
5984 # File currently set to -S 1M -c 1
5986 # Ensure striping is preserved if -R is not set, and no stripe
5987 # count or size is specified
5988 echo -n "Verifying striping size preserved when not specified..."
5989 orig_ssize=$($LFS getstripe -S "$file1" 2>/dev/null)
5990 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5991 error "cannot set stripe on parent directory"
5992 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5993 error "migrate failed"
5994 cur_ssize=$($LFS getstripe -S "$file1")
5995 [ $cur_ssize -eq $orig_ssize ] ||
5996 error "migrate by default $cur_ssize != $orig_ssize"
5999 # Ensure file name properly detected when final option has no argument
6000 echo -n "Verifying file name properly detected..."
6001 $LFS_MIGRATE -y "$file1" &> /dev/null ||
6002 error "file name interpreted as option argument"
6008 run_test 56wc "check unrecognized options for lfs_migrate are passed through"
6011 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6013 local file1=$DIR/$tdir/file1
6015 echo -n "Creating test dir..."
6016 test_mkdir $DIR/$tdir || error "cannot create dir"
6019 echo -n "Creating test file..."
6023 # Ensure 'lfs migrate' will fail by using a non-existent option,
6024 # and make sure rsync is not called to recover
6025 echo -n "Make sure --no-rsync option works..."
6026 $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 |
6027 grep -q 'refusing to fall back to rsync' ||
6028 error "rsync was called with --no-rsync set"
6031 # Ensure rsync is called without trying 'lfs migrate' first
6032 echo -n "Make sure --rsync option works..."
6033 $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 |
6034 grep -q 'falling back to rsync' &&
6035 error "lfs migrate was called with --rsync set"
6038 echo -n "Make sure --rsync and --no-rsync options are exclusive..."
6039 $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 |
6040 grep -q 'at the same time' ||
6041 error "--rsync and --no-rsync accepted concurrently"
6047 run_test 56wd "check lfs_migrate --rsync and --no-rsync work"
6050 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6051 check_swap_layouts_support
6053 local dir=$DIR/$tdir
6054 local ref1=/etc/passwd
6055 local file1=$dir/file1
6057 test_mkdir $dir || error "creating dir $dir"
6058 $LFS setstripe -c 2 $file1
6060 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
6061 stripe=$($LFS getstripe -c $file1)
6062 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6063 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6068 run_test 56x "lfs migration support"
6071 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6072 check_swap_layouts_support
6074 local dir=$DIR/$tdir/$testnum
6078 local ref1=/etc/passwd
6079 local file1=$dir/file1
6081 $LFS setstripe -c 2 $file1
6083 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
6085 local stripe=$($LFS getstripe -c $file1)
6087 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6088 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6093 run_test 56xa "lfs migration --block support"
6095 check_migrate_links() {
6097 local file1="$dir/file1"
6100 local total_count=$(($begin + $count - 1))
6101 local symlink_count=10
6104 if [ ! -f "$file1" ]; then
6105 echo -n "creating initial file..."
6106 $LFS setstripe -c 1 -S "512k" "$file1" ||
6107 error "cannot setstripe initial file"
6110 echo -n "creating symlinks..."
6111 for s in $(seq 1 $symlink_count); do
6112 ln -s "$file1" "$dir/slink$s" ||
6113 error "cannot create symlinks"
6117 echo -n "creating nonlinked files..."
6118 createmany -o "$dir/uniq" 1 10 &> /dev/null ||
6119 error "cannot create nonlinked files"
6124 if [ ! -f "$dir/file$total_count" ]; then
6125 echo -n "creating hard links $begin:$total_count..."
6126 createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
6127 /dev/null || error "cannot create hard links"
6131 echo -n "checking number of hard links listed in xattrs..."
6132 local fid=$($LFS getstripe -F "$file1")
6133 local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
6136 if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
6137 skip "hard link list has unexpected size, skipping test"
6139 if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
6140 error "link names should exceed xattrs size"
6143 echo -n "migrating files..."
6144 local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir)
6146 [ $rc -eq 0 ] || error "migrate failed rc = $rc"
6149 # make sure all links have been properly migrated
6150 echo -n "verifying files..."
6151 fid=$($LFS getstripe -F "$file1") ||
6152 error "cannot get fid for file $file1"
6153 for i in $(seq 2 $total_count); do
6154 local fid2=$($LFS getstripe -F $dir/file$i)
6156 [ "$fid2" == "$fid" ] ||
6157 error "migrated hard link has mismatched FID"
6160 # make sure hard links were properly detected, and migration was
6161 # performed only once for the entire link set; nonlinked files should
6163 local actual=$(grep -c 'done' <<< "$migrate_out")
6164 local expected=$(($uniq_count + 1))
6166 [ "$actual" -eq "$expected" ] ||
6167 error "hard links individually migrated ($actual != $expected)"
6169 # make sure the correct number of hard links are present
6170 local hardlinks=$(stat -c '%h' "$file1")
6172 [ $hardlinks -eq $total_count ] ||
6173 error "num hard links $hardlinks != $total_count"
6180 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
6181 skip "Need MDS version at least 2.10.55"
6183 local dir="$DIR/$tdir"
6185 test_mkdir "$dir" || error "cannot create dir $dir"
6187 echo "testing lfs migrate mode when all links fit within xattrs"
6188 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 2 99
6190 echo "testing rsync mode when all links fit within xattrs"
6191 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 2 99
6193 echo "testing lfs migrate mode when all links do not fit within xattrs"
6194 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100
6196 echo "testing rsync mode when all links do not fit within xattrs"
6197 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 101 100
6203 run_test 56xb "lfs migration hard link support"
6206 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6208 local dir="$DIR/$tdir"
6210 test_mkdir "$dir" || error "cannot create dir $dir"
6212 # Test 1: ensure file < 1 GB is always migrated with 1 stripe
6213 echo -n "Setting initial stripe for 20MB test file..."
6214 $LFS setstripe -c 2 -i 0 "$dir/20mb" ||
6215 error "cannot setstripe 20MB file"
6217 echo -n "Sizing 20MB test file..."
6218 truncate "$dir/20mb" 20971520 || error "cannot create 20MB test file"
6220 echo -n "Verifying small file autostripe count is 1..."
6221 $LFS_MIGRATE -y -A -C 1 "$dir/20mb" ||
6222 error "cannot migrate 20MB file"
6223 local stripe_count=$($LFS getstripe -c "$dir/20mb") ||
6224 error "cannot get stripe for $dir/20mb"
6225 [ $stripe_count -eq 1 ] ||
6226 error "unexpected stripe count $stripe_count for 20MB file"
6230 # Test 2: File is small enough to fit within the available space on
6231 # sqrt(size_in_gb) + 1 OSTs but is larger than 1GB. The file must
6232 # have at least an additional 1KB for each desired stripe for test 3
6233 echo -n "Setting stripe for 1GB test file..."
6234 $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe 1GB file"
6236 echo -n "Sizing 1GB test file..."
6237 # File size is 1GB + 3KB
6238 truncate "$dir/1gb" 1073744896 || error "cannot create 1GB test file"
6241 # need at least 512MB per OST for 1GB file to fit in 2 stripes
6242 local avail=$($LCTL get_param -n llite.$FSNAME*.kbytesavail)
6243 if (( avail > 524288 * OSTCOUNT )); then
6244 echo -n "Migrating 1GB file..."
6245 $LFS_MIGRATE -y -A -C 1 "$dir/1gb" ||
6246 error "cannot migrate 1GB file"
6248 echo -n "Verifying autostripe count is sqrt(n) + 1..."
6249 stripe_count=$($LFS getstripe -c "$dir/1gb") ||
6250 error "cannot getstripe for 1GB file"
6251 [ $stripe_count -eq 2 ] ||
6252 error "unexpected stripe count $stripe_count != 2"
6256 # Test 3: File is too large to fit within the available space on
6257 # sqrt(n) + 1 OSTs. Simulate limited available space with -X
6258 if [ $OSTCOUNT -ge 3 ]; then
6259 # The required available space is calculated as
6260 # file size (1GB + 3KB) / OST count (3).
6261 local kb_per_ost=349526
6263 echo -n "Migrating 1GB file with limit..."
6264 $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" ||
6265 error "cannot migrate 1GB file with limit"
6268 stripe_count=$($LFS getstripe -c "$dir/1gb")
6269 echo -n "Verifying 1GB autostripe count with limited space..."
6270 [ "$stripe_count" -a $stripe_count -ge 3 ] ||
6271 error "unexpected stripe count $stripe_count (min 3)"
6278 run_test 56xc "lfs migration autostripe"
6281 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6283 local dir=$DIR/$tdir
6284 local f_mgrt=$dir/$tfile.mgrt
6285 local f_yaml=$dir/$tfile.yaml
6286 local f_copy=$dir/$tfile.copy
6287 local layout_yaml="-E 1M -S 512K -c 1 -E -1 -S 1M -c 2 -i 0"
6288 local layout_copy="-c 2 -S 2M -i 1"
6289 local yamlfile=$dir/yamlfile
6290 local layout_before;
6293 test_mkdir "$dir" || error "cannot create dir $dir"
6294 $LFS setstripe $layout_yaml $f_yaml ||
6295 error "cannot setstripe $f_yaml with layout $layout_yaml"
6296 $LFS getstripe --yaml $f_yaml > $yamlfile
6297 $LFS setstripe $layout_copy $f_copy ||
6298 error "cannot setstripe $f_copy with layout $layout_copy"
6300 dd if=/dev/zero of=$f_mgrt bs=1M count=4
6302 # 1. test option --yaml
6303 $LFS_MIGRATE -y --yaml $yamlfile $f_mgrt ||
6304 error "cannot migrate $f_mgrt with --yaml $yamlfile"
6305 layout_before=$(get_layout_param $f_yaml)
6306 layout_after=$(get_layout_param $f_mgrt)
6307 [ "$layout_after" == "$layout_before" ] ||
6308 error "lfs_migrate --yaml: $layout_after != $layout_before"
6310 # 2. test option --copy
6311 $LFS_MIGRATE -y --copy $f_copy $f_mgrt ||
6312 error "cannot migrate $f_mgrt with --copy $f_copy"
6313 layout_before=$(get_layout_param $f_copy)
6314 layout_after=$(get_layout_param $f_mgrt)
6315 [ "$layout_after" == "$layout_before" ] ||
6316 error "lfs_migrate --copy: $layout_after != $layout_before"
6318 run_test 56xd "check lfs_migrate --yaml and --copy support"
6321 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6323 local dir=$DIR/$tdir
6324 local f_comp=$dir/$tfile
6325 local layout="-E 1M -S 512K -c 1 -E -1 -S 1M -c 2 -i 0"
6326 local layout_before=""
6327 local layout_after=""
6329 test_mkdir "$dir" || error "cannot create dir $dir"
6330 $LFS setstripe $layout $f_comp ||
6331 error "cannot setstripe $f_comp with layout $layout"
6332 layout_before=$(get_layout_param $f_comp)
6333 dd if=/dev/zero of=$f_comp bs=1M count=4
6335 # 1. migrate a comp layout file by lfs_migrate
6336 $LFS_MIGRATE -y $f_comp || error "cannot migrate $f_comp by lfs_migrate"
6337 layout_after=$(get_layout_param $f_comp)
6338 [ "$layout_before" == "$layout_after" ] ||
6339 error "lfs_migrate: $layout_before != $layout_after"
6341 # 2. migrate a comp layout file by lfs migrate
6342 $LFS migrate $f_comp || error "cannot migrate $f_comp by lfs migrate"
6343 layout_after=$(get_layout_param $f_comp)
6344 [ "$layout_before" == "$layout_after" ] ||
6345 error "lfs migrate: $layout_before != $layout_after"
6347 run_test 56xe "migrate a composite layout file"
6350 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
6351 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
6354 local dir=$DIR/$tdir
6358 test_mkdir -p $dir || error "creating dir $dir"
6359 touch $f1 || error "creating std file $f1"
6360 $MULTIOP $f2 H2c || error "creating released file $f2"
6362 # a directory can be raid0, so ask only for files
6363 res=$($LFS find $dir -L raid0 -type f | wc -l)
6364 [[ $res == 2 ]] || error "search raid0: found $res files != 2"
6366 res=$($LFS find $dir \! -L raid0 -type f | wc -l)
6367 [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
6369 # only files can be released, so no need to force file search
6370 res=$($LFS find $dir -L released)
6371 [[ $res == $f2 ]] || error "search released: found $res != $f2"
6373 res=$($LFS find $dir -type f \! -L released)
6374 [[ $res == $f1 ]] || error "search !released: found $res != $f1"
6376 run_test 56y "lfs find -L raid0|released"
6378 test_56z() { # LU-4824
6379 # This checks to make sure 'lfs find' continues after errors
6380 # There are two classes of errors that should be caught:
6381 # - If multiple paths are provided, all should be searched even if one
6383 # - If errors are encountered during the search, it should not terminate
6385 local dir=$DIR/$tdir
6389 for i in d{0..9}; do
6391 touch $dir/$i/$tfile
6393 $LFS find $DIR/non_existent_dir $dir &&
6394 error "$LFS find did not return an error"
6395 # Make a directory unsearchable. This should NOT be the last entry in
6396 # directory order. Arbitrarily pick the 6th entry
6397 chmod 700 $($LFS find $dir -type d | sed '6!d')
6399 $RUNAS $LFS find $DIR/non_existent $dir
6400 local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l)
6402 # The user should be able to see 10 directories and 9 files
6403 (( count == 19 )) ||
6404 error "$LFS find found $count != 19 entries after error"
6406 run_test 56z "lfs find should continue after an error"
6408 test_56aa() { # LU-5937
6409 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
6411 local dir=$DIR/$tdir
6414 $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
6416 createmany -o $dir/striped_dir/${tfile}- 1024
6417 local dirs=$($LFS find --size +8k $dir/)
6419 [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
6421 run_test 56aa "lfs find --size under striped dir"
6423 test_56ab() { # LU-10705
6424 test_mkdir $DIR/$tdir
6425 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
6426 dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
6427 dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
6428 # Flush writes to ensure valid blocks. Need to be more thorough for
6429 # ZFS, since blocks are not allocated/returned to client immediately.
6431 wait_zfs_commit ost1 2
6432 cancel_lru_locks osc
6435 local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
6437 [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
6439 files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
6440 [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
6442 rm -f $DIR/$tdir/$tfile.[123]
6444 run_test 56ab "lfs find --blocks"
6447 [ $MDS1_VERSION -lt $(version_code 2.10.50) ] &&
6448 skip "Need MDS version at least 2.10.50"
6450 # Create composite files with one component
6451 local dir=$DIR/$tdir
6453 setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
6454 # Create composite files with three components
6455 setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
6456 # Create non-composite files
6457 createmany -o $dir/${tfile}- 10
6459 local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l)
6461 [[ $nfiles == 10 ]] ||
6462 error "lfs find -E 1M found $nfiles != 10 files"
6464 nfiles=$($LFS find ! -E 1M --type f $dir | wc -l)
6465 [[ $nfiles == 25 ]] ||
6466 error "lfs find ! -E 1M found $nfiles != 25 files"
6468 # All files have a component that starts at 0
6469 nfiles=$($LFS find --component-start 0 --type f $dir | wc -l)
6470 [[ $nfiles == 35 ]] ||
6471 error "lfs find --component-start 0 - $nfiles != 35 files"
6473 nfiles=$($LFS find --component-start 2M --type f $dir | wc -l)
6474 [[ $nfiles == 15 ]] ||
6475 error "lfs find --component-start 2M - $nfiles != 15 files"
6477 # All files created here have a componenet that does not starts at 2M
6478 nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l)
6479 [[ $nfiles == 35 ]] ||
6480 error "lfs find ! --component-start 2M - $nfiles != 35 files"
6482 # Find files with a specified number of components
6483 local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l)
6484 [[ $nfiles == 15 ]] ||
6485 error "lfs find --component-count 3 - $nfiles != 15 files"
6487 # Remember non-composite files have a component count of zero
6488 local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l)
6489 [[ $nfiles == 10 ]] ||
6490 error "lfs find --component-count 0 - $nfiles != 10 files"
6492 nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l)
6493 [[ $nfiles == 20 ]] ||
6494 error "lfs find ! --component-count 3 - $nfiles != 20 files"
6496 # All files have a flag called "init"
6497 local nfiles=$($LFS find --component-flags init --type f $dir | wc -l)
6498 [[ $nfiles == 35 ]] ||
6499 error "lfs find --component-flags init - $nfiles != 35 files"
6501 # Multi-component files will have a component not initialized
6502 local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l)
6503 [[ $nfiles == 15 ]] ||
6504 error "lfs find !--component-flags init - $nfiles != 15 files"
6509 run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
6512 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
6513 skip "Need MDS version at least 2.10.57"
6523 # create mirrored directories and mirrored files
6524 mkdir $td || error "mkdir $td failed"
6525 $LFS mirror create -N3 $td || error "create mirrored dir $td failed"
6526 createmany -o $tf- 10 || error "create $tf- failed"
6528 for i in $(seq 2); do
6530 mkdir $dir || error "mkdir $dir failed"
6531 $LFS mirror create -N$((3 + i)) $dir ||
6532 error "create mirrored dir $dir failed"
6533 createmany -o $dir/$tfile- 10 ||
6534 error "create $dir/$tfile- failed"
6537 # change the states of some mirrored files
6539 for i in $(seq 2); do
6541 for j in $(seq 4 9); do
6542 echo foo > $dir/$tfile-$j
6546 # find mirrored files with specific mirror count
6547 cmd="$LFS find --mirror-count 3 --type f $td"
6548 nfiles=$($cmd | wc -l)
6549 [[ $nfiles = 10 ]] || error "$cmd: $nfiles != 10 files"
6551 cmd="$LFS find ! --mirror-count 3 --type f $td"
6552 nfiles=$($cmd | wc -l)
6553 [[ $nfiles = 20 ]] || error "$cmd: $nfiles != 20 files"
6555 cmd="$LFS find --mirror-count +2 --type f $td"
6556 nfiles=$($cmd | wc -l)
6557 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6559 cmd="$LFS find --mirror-count -6 --type f $td"
6560 nfiles=$($cmd | wc -l)
6561 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6563 # find mirrored files with specific file state
6564 cmd="$LFS find --maxdepth 1 --mirror-state=^ro --type f $td"
6565 [[ $($cmd) = $tf-6 ]] || error "$cmd: didn't return $tf-6"
6567 cmd="$LFS find --mirror-state=ro --type f $td"
6568 nfiles=$($cmd | wc -l)
6569 [[ $nfiles = 17 ]] || error "$cmd: $nfiles != 17 files"
6571 cmd="$LFS find ! --mirror-state=ro --type f $td"
6572 nfiles=$($cmd | wc -l)
6573 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6575 cmd="$LFS find --mirror-state=wp --type f $td"
6576 nfiles=$($cmd | wc -l)
6577 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6579 cmd="$LFS find ! --mirror-state=sp --type f $td"
6580 nfiles=$($cmd | wc -l)
6581 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6583 run_test 56ca "check lfs find --mirror-count|-N and --mirror-state"
6586 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6587 # note test will not do anything if MDS is not local
6588 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6589 skip_env "ldiskfs only test"
6591 remote_mds_nodsh && skip "remote MDS with nodsh"
6593 local MNTDEV="osd*.*MDT*.mntdev"
6594 DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV)
6595 [ -z "$DEV" ] && error "can't access $MNTDEV"
6596 for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
6597 do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
6598 error "can't access $DEV"
6599 DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
6600 [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
6604 run_test 57a "verify MDS filesystem created with large inodes =="
6607 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6608 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6609 skip_env "ldiskfs only test"
6611 remote_mds_nodsh && skip "remote MDS with nodsh"
6613 local dir=$DIR/$tdir
6616 local fileN=$dir/f$filecount
6618 rm -rf $dir || error "removing $dir"
6620 local mdtidx=$($LFS getstripe -m $dir)
6621 local mdtname=MDT$(printf %04x $mdtidx)
6622 local facet=mds$((mdtidx + 1))
6624 echo "mcreating $filecount files"
6625 createmany -m $dir/f 1 $filecount || error "creating files in $dir"
6627 # verify that files do not have EAs yet
6628 $LFS getstripe $file1 2>&1 | grep -q "no stripe" ||
6629 error "$file1 has an EA"
6630 $LFS getstripe $fileN 2>&1 | grep -q "no stripe" ||
6631 error "$fileN has an EA"
6635 df $dir #make sure we get new statfs data
6636 local mdsfree=$(do_facet $facet \
6637 lctl get_param -n osd*.*$mdtname.kbytesfree)
6638 local mdcfree=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6641 echo "opening files to create objects/EAs"
6642 for file in $(seq -f $dir/f%g 1 $filecount); do
6643 $OPENFILE -f O_RDWR $file > /dev/null 2>&1 ||
6644 error "opening $file"
6647 # verify that files have EAs now
6648 $LFS getstripe $file1 | grep -q "obdidx" || error "$file1 missing EA"
6649 $LFS getstripe $fileN | grep -q "obdidx" || error "$fileN missing EA"
6651 sleep 1 #make sure we get new statfs data
6653 local mdsfree2=$(do_facet $facet \
6654 lctl get_param -n osd*.*$mdtname.kbytesfree)
6655 local mdcfree2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6657 if [[ $mdcfree2 -lt $((mdcfree - 16)) ]]; then
6658 if [ "$mdsfree" != "$mdsfree2" ]; then
6659 error "MDC before $mdcfree != after $mdcfree2"
6661 echo "MDC before $mdcfree != after $mdcfree2"
6662 echo "unable to confirm if MDS has large inodes"
6667 run_test 57b "default LOV EAs are stored inside large inodes ==="
6670 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6671 [ -z "$(which wiretest 2>/dev/null)" ] &&
6672 skip_env "could not find wiretest"
6676 run_test 58 "verify cross-platform wire constants =============="
6679 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6681 echo "touch 130 files"
6682 createmany -o $DIR/f59- 130
6684 unlinkmany $DIR/f59- 130
6686 # wait for commitment of removal
6687 wait_delete_completed
6689 run_test 59 "verify cancellation of llog records async ========="
6691 TEST60_HEAD="test_60 run $RANDOM"
6693 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6694 remote_mgs_nodsh && skip "remote MGS with nodsh"
6695 do_facet mgs "! which run-llog.sh &> /dev/null" &&
6696 do_facet mgs "! ls run-llog.sh &> /dev/null" &&
6697 skip_env "missing subtest run-llog.sh"
6699 log "$TEST60_HEAD - from kernel mode"
6700 do_facet mgs "$LCTL dk > /dev/null"
6701 do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed"
6702 do_facet mgs $LCTL dk > $TMP/$tfile
6704 # LU-6388: test llog_reader
6705 local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
6706 llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
6707 [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
6708 skip_env "missing llog_reader"
6709 local fstype=$(facet_fstype mgs)
6710 [ $fstype != ldiskfs -a $fstype != zfs ] &&
6711 skip_env "Only for ldiskfs or zfs type mgs"
6713 local mntpt=$(facet_mntpt mgs)
6714 local mgsdev=$(mgsdevname 1)
6726 #get fid and record list
6727 fid_list=($(awk '/9_sub.*record/ { print $NF }' /$TMP/$tfile |
6729 rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' /$TMP/$tfile |
6731 #remount mgs as ldiskfs or zfs type
6732 stop mgs || error "stop mgs failed"
6733 mount_fstype mgs || error "remount mgs failed"
6734 for ((i = 0; i < ${#fid_list[@]}; i++)); do
6737 seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
6738 oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
6743 obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
6745 obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
6747 echo "obj_file is $obj_file"
6748 do_facet mgs $llog_reader $obj_file
6750 rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
6751 awk '{ print $3 }' | sed -e "s/^type=//g")
6752 if [ $rec_type != $rec ]; then
6753 echo "FAILED test_60a wrong record type $rec_type," \
6759 #check obj path if record type is LLOG_LOGID_MAGIC
6760 if [ "$rec" == "1064553b" ]; then
6761 path=$(do_facet mgs $llog_reader $obj_file |
6762 grep "path=" | awk '{ print $NF }' |
6763 sed -e "s/^path=//g")
6764 if [ $obj_file != $mntpt/$path ]; then
6765 echo "FAILED test_60a wrong obj path" \
6766 "$montpt/$path, should be $obj_file"
6773 #restart mgs before "error", otherwise it will block the next test
6774 stop mgs || error "stop mgs failed"
6775 start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
6776 $pass || error "test failed, see FAILED test_60a messages for specifics"
6778 run_test 60a "llog_test run from kernel module and test llog_reader"
6780 test_60b() { # bug 6411
6781 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6784 LLOG_COUNT=$(do_facet mgs dmesg |
6785 awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
6786 /llog_[a-z]*.c:[0-9]/ {
6798 [[ $LLOG_COUNT -gt 120 ]] &&
6799 error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
6801 run_test 60b "limit repeated messages from CERROR/CWARN"
6804 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6806 echo "create 5000 files"
6807 createmany -o $DIR/f60c- 5000
6808 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137
6809 lctl set_param fail_loc=0x80000137
6810 unlinkmany $DIR/f60c- 5000
6811 lctl set_param fail_loc=0
6813 run_test 60c "unlink file when mds full"
6816 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6818 SAVEPRINTK=$(lctl get_param -n printk)
6819 # verify "lctl mark" is even working"
6820 MESSAGE="test message ID $RANDOM $$"
6821 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6822 dmesg | grep -q "$MESSAGE" || error "didn't find debug marker in log"
6824 lctl set_param printk=0 || error "set lnet.printk failed"
6825 lctl get_param -n printk | grep emerg || error "lnet.printk dropped emerg"
6826 MESSAGE="new test message ID $RANDOM $$"
6827 # Assume here that libcfs_debug_mark_buffer() uses D_WARNING
6828 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6829 dmesg | grep -q "$MESSAGE" && error "D_WARNING wasn't masked" || true
6831 lctl set_param -n printk="$SAVEPRINTK"
6833 run_test 60d "test printk console message masking"
6836 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6837 remote_mds_nodsh && skip "remote MDS with nodsh"
6840 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
6841 do_facet mds1 lctl set_param fail_loc=0x15b
6844 run_test 60e "no space while new llog is being created"
6849 test_mkdir -c $MDSCOUNT $DIR/$tdir
6850 $LFS setdirstripe -D -i -1 -c $MDSCOUNT $DIR/$tdir
6855 mkdir $DIR/$tdir/subdir$index 2>/dev/null
6856 rmdir $DIR/$tdir/subdir$index 2>/dev/null
6857 index=$((index + 1))
6863 for i in $(seq 100); do
6864 # define OBD_FAIL_OSD_TXN_START 0x19a
6865 do_facet mds1 lctl set_param fail_loc=0x8000019a
6871 mkdir $DIR/$tdir/new || error "mkdir failed"
6872 rmdir $DIR/$tdir/new || error "rmdir failed"
6874 run_test 60g "transaction abort won't cause MDT hung"
6877 [ $MDS1_VERSION -le $(version_code 2.12.52) ] ||
6878 skip "Need MDS version at least 2.12.52"
6879 [ $MDSCOUNT -le 2 ] && skip "Need >= 2 MDTs"
6883 #define OBD_FAIL_MDS_STRIPE_CREATE 0x188
6884 #define OBD_FAIL_MDS_STRIPE_FID 0x189
6885 for fail_loc in 0x80000188 0x80000189; do
6886 do_facet mds1 "$LCTL set_param fail_loc=$fail_loc"
6887 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir-$fail_loc ||
6888 error "mkdir $dir-$fail_loc failed"
6889 for i in {0..10}; do
6890 # create may fail on missing stripe
6891 echo $i > $DIR/$tdir-$fail_loc/$i
6893 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6894 error "getdirstripe $tdir-$fail_loc failed"
6895 $LFS migrate -m 1 $DIR/$tdir-$fail_loc ||
6896 error "migrate $tdir-$fail_loc failed"
6897 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6898 error "getdirstripe $tdir-$fail_loc failed"
6899 pushd $DIR/$tdir-$fail_loc
6901 echo $f | cmp $f - || error "$f data mismatch"
6904 rm -rf $DIR/$tdir-$fail_loc
6907 run_test 60h "striped directory with missing stripes can be accessed"
6910 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6913 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1 || error "dd $f failed"
6914 cancel_lru_locks osc
6915 $MULTIOP $f OSMWUc || error "$MULTIOP $f failed"
6918 run_test 61a "mmap() writes don't make sync hang ================"
6921 mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
6923 run_test 61b "mmap() of unstriped file is successful"
6925 # bug 2330 - insufficient obd_match error checking causes LBUG
6927 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6931 cancel_lru_locks osc
6932 lctl set_param fail_loc=0x405
6933 cat $f && error "cat succeeded, expect -EIO"
6934 lctl set_param fail_loc=0
6936 # This test is now irrelevant (as of bug 10718 inclusion), we no longer
6937 # match every page all of the time.
6938 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
6940 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
6941 # Though this test is irrelevant anymore, it helped to reveal some
6942 # other grant bugs (LU-4482), let's keep it.
6943 test_63a() { # was test_63
6944 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6946 MAX_DIRTY_MB=$(lctl get_param -n osc.*.max_dirty_mb | head -n 1)
6948 for i in `seq 10` ; do
6949 dd if=/dev/zero of=$DIR/f63 bs=8k &
6955 rm -f $DIR/f63 || true
6957 run_test 63a "Verify oig_wait interruption does not crash ======="
6959 # bug 2248 - async write errors didn't return to application on sync
6960 # bug 3677 - async write errors left page locked
6962 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6965 lctl set_param debug=-1
6967 # ensure we have a grant to do async writes
6968 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
6971 sync # sync lest earlier test intercept the fail_loc
6973 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
6974 lctl set_param fail_loc=0x80000406
6975 $MULTIOP $DIR/$tfile Owy && \
6976 error "sync didn't return ENOMEM"
6977 sync; sleep 2; sync # do a real sync this time to flush page
6978 lctl get_param -n llite.*.dump_page_cache | grep locked && \
6979 error "locked page left in cache after async error" || true
6982 run_test 63b "async write errors should be returned to fsync ==="
6985 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6988 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
6990 run_test 64a "verify filter grant calculations (in kernel) ====="
6993 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6995 sh oos.sh $MOUNT || error "oos.sh failed: $?"
6997 run_test 64b "check out-of-space detection on client"
7000 $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
7002 run_test 64c "verify grant shrink"
7004 # this does exactly what osc_request.c:osc_announce_cached() does in
7005 # order to calculate max amount of grants to ask from server
7009 local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc)
7010 local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight)
7012 ((rpc_in_flight ++));
7013 nrpages=$((nrpages * rpc_in_flight))
7015 local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb)
7017 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
7019 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
7020 local undirty=$((nrpages * PAGE_SIZE))
7022 local max_extent_pages
7023 max_extent_pages=$($LCTL get_param osc.${tgt}.import |
7024 grep grant_max_extent_size | awk '{print $2}')
7025 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
7026 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
7027 local grant_extent_tax
7028 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
7029 grep grant_extent_tax | awk '{print $2}')
7031 undirty=$((undirty + nrextents * grant_extent_tax))
7036 # this is size of unit for grant allocation. It should be equal to
7037 # what tgt_grant.c:tgt_grant_chunk() calculates
7041 local grant_extent_tax
7043 max_brw_size=$($LCTL get_param osc.${tgt}.import |
7044 grep max_brw_size | awk '{print $2}')
7046 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
7047 grep grant_extent_tax | awk '{print $2}')
7049 echo $(((max_brw_size + grant_extent_tax) * 2))
7053 [ $OST1_VERSION -lt $(version_code 2.10.56) ] &&
7054 skip "OST < 2.10.55 doesn't limit grants enough"
7056 local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}')
7057 local file=$DIR/$tfile
7059 [[ $($LCTL get_param osc.${tgt}.import |
7060 grep "connect_flags:.*grant_param") ]] ||
7061 skip "no grant_param connect flag"
7063 local olddebug=$($LCTL get_param -n debug 2> /dev/null)
7065 $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true
7067 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
7068 stack_trap "rm -f $file" EXIT
7070 $SETSTRIPE $file -i 0 -c 1
7071 dd if=/dev/zero of=$file bs=1M count=1000 &
7076 local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes)
7077 if [[ $cur_grant -gt $max_cur_granted ]]
7080 error "cur_grant $cur_grant > $max_cur_granted"
7083 [[ $? -ne 0 ]] && break;
7088 wait_delete_completed
7089 $LCTL set_param debug="$olddebug" 2> /dev/null || true
7091 run_test 64d "check grant limit exceed"
7093 # bug 1414 - set/get directories' stripe info
7095 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7097 test_mkdir $DIR/$tdir
7099 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
7101 run_test 65a "directory with no stripe info"
7104 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7106 test_mkdir $DIR/$tdir
7107 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7109 $SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7112 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
7114 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
7117 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7118 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
7120 test_mkdir $DIR/$tdir
7121 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
7123 $LFS setstripe -S $((stripesize * 4)) -i 1 \
7124 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
7126 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
7128 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
7131 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7133 test_mkdir $DIR/$tdir
7134 local STRIPECOUNT=$($GETSTRIPE -c $DIR/$tdir)
7135 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7137 if [[ $STRIPECOUNT -le 0 ]]; then
7139 elif [[ $STRIPECOUNT -gt 2000 ]]; then
7140 #LOV_MAX_STRIPE_COUNT is 2000
7141 [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1))
7143 sc=$(($STRIPECOUNT - 1))
7145 $SETSTRIPE -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
7146 touch $DIR/$tdir/f4 $DIR/$tdir/f5
7147 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
7148 error "lverify failed"
7150 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
7153 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7155 test_mkdir $DIR/$tdir
7157 $SETSTRIPE $DIR/$tdir || error "setstripe"
7158 $GETSTRIPE -v $DIR/$tdir | grep "Default" ||
7159 error "no stripe info failed"
7161 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
7163 run_test 65e "directory setstripe defaults"
7166 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7168 test_mkdir $DIR/${tdir}f
7169 $RUNAS $SETSTRIPE $DIR/${tdir}f && error "setstripe succeeded" || true
7171 run_test 65f "dir setstripe permission (should return error) ==="
7174 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7176 test_mkdir $DIR/$tdir
7177 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7179 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7180 error "setstripe -S failed"
7181 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
7182 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7183 error "delete default stripe failed"
7185 run_test 65g "directory setstripe -d"
7188 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7190 test_mkdir $DIR/$tdir
7191 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7193 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7194 error "setstripe -S failed"
7195 test_mkdir $DIR/$tdir/dd1
7196 [ $($LFS getstripe -c $DIR/$tdir) = $($GETSTRIPE -c $DIR/$tdir/dd1) ] ||
7197 error "stripe info inherit failed"
7199 run_test 65h "directory stripe info inherit ===================="
7202 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7204 save_layout_restore_at_exit $MOUNT
7206 # bug6367: set non-default striping on root directory
7207 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
7209 # bug12836: getstripe on -1 default directory striping
7210 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
7212 # bug12836: getstripe -v on -1 default directory striping
7213 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
7215 # bug12836: new find on -1 default directory striping
7216 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
7218 run_test 65i "various tests to set root directory striping"
7220 test_65j() { # bug6367
7221 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7225 # if we aren't already remounting for each test, do so for this test
7226 if [ "$CLEANUP" = ":" -a "$I_MOUNTED" = "yes" ]; then
7227 cleanup || error "failed to unmount"
7231 save_layout_restore_at_exit $MOUNT
7233 $SETSTRIPE -d $MOUNT || error "setstripe failed"
7235 run_test 65j "set default striping on root directory (bug 6367)="
7239 wait_delete_completed
7240 do_facet $SINGLEMDS "lctl set_param -n \
7241 osp.$ost*MDT0000.max_create_count=$max_count"
7242 do_facet $SINGLEMDS "lctl set_param -n \
7243 osp.$ost*MDT0000.create_count=$count"
7244 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7245 echo $INACTIVE_OSC "is Activate"
7247 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7250 test_65k() { # bug11679
7251 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7252 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7253 remote_mds_nodsh && skip "remote MDS with nodsh"
7255 local disable_precreate=true
7256 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
7257 disable_precreate=false
7259 echo "Check OST status: "
7260 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
7261 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
7263 for OSC in $MDS_OSCS; do
7264 echo $OSC "is active"
7265 do_facet $SINGLEMDS lctl --device %$OSC activate
7268 for INACTIVE_OSC in $MDS_OSCS; do
7269 local ost=$(osc_to_ost $INACTIVE_OSC)
7270 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
7271 lov.*md*.target_obd |
7272 awk -F: /$ost/'{ print $1 }' | head -n 1)
7275 $SETSTRIPE -i $ostnum -c 1 $DIR/$tdir
7276 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
7278 echo "Deactivate: " $INACTIVE_OSC
7279 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
7281 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
7282 osp.$ost*MDT0000.create_count")
7283 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
7284 osp.$ost*MDT0000.max_create_count")
7285 $disable_precreate &&
7286 do_facet $SINGLEMDS "lctl set_param -n \
7287 osp.$ost*MDT0000.max_create_count=0"
7289 for idx in $(seq 0 $((OSTCOUNT - 1))); do
7290 [ -f $DIR/$tdir/$idx ] && continue
7291 echo "$SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx"
7292 $SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx ||
7294 error "setstripe $idx should succeed"; }
7295 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
7297 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
7300 do_facet $SINGLEMDS "lctl set_param -n \
7301 osp.$ost*MDT0000.max_create_count=$max_count"
7302 do_facet $SINGLEMDS "lctl set_param -n \
7303 osp.$ost*MDT0000.create_count=$count"
7304 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7305 echo $INACTIVE_OSC "is Activate"
7307 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7310 run_test 65k "validate manual striping works properly with deactivated OSCs"
7312 test_65l() { # bug 12836
7313 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7315 test_mkdir -p $DIR/$tdir/test_dir
7316 $SETSTRIPE -c -1 $DIR/$tdir/test_dir
7317 $LFS find -mtime -1 $DIR/$tdir >/dev/null
7319 run_test 65l "lfs find on -1 stripe dir ========================"
7322 local layout=$(save_layout $MOUNT)
7323 $RUNAS $SETSTRIPE -c 2 $MOUNT && {
7324 restore_layout $MOUNT $layout
7325 error "setstripe should fail by non-root users"
7329 run_test 65m "normal user can't set filesystem default stripe"
7332 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.0) ]] ||
7333 skip "Need MDS version at least 2.12.0"
7334 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7336 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7337 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7338 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7340 local root_layout=$(save_layout $MOUNT)
7341 stack_trap "restore_layout $MOUNT $root_layout" EXIT
7343 # new subdirectory under root directory should not inherit
7344 # the default layout from root
7345 local dir1=$MOUNT/$tdir-1
7346 mkdir $dir1 || error "mkdir $dir1 failed"
7347 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7348 error "$dir1 shouldn't have LOV EA"
7350 # delete the default layout on root directory
7351 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7353 local dir2=$MOUNT/$tdir-2
7354 mkdir $dir2 || error "mkdir $dir2 failed"
7355 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7356 error "$dir2 shouldn't have LOV EA"
7358 # set a new striping pattern on root directory
7359 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7360 local new_def_stripe_size=$((def_stripe_size * 2))
7361 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7362 error "set stripe size on $MOUNT failed"
7364 # new file created in $dir2 should inherit the new stripe size from
7365 # the filesystem default
7366 local file2=$dir2/$tfile-2
7367 touch $file2 || error "touch $file2 failed"
7369 local file2_stripe_size=$($LFS getstripe -S $file2)
7370 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7371 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7373 local dir3=$MOUNT/$tdir-3
7374 mkdir $dir3 || error "mkdir $dir3 failed"
7375 # $dir3 shouldn't have LOV EA, but "lfs getstripe -d $dir3" should show
7376 # the root layout, which is the actual default layout that will be used
7377 # when new files are created in $dir3.
7378 local dir3_layout=$(get_layout_param $dir3)
7379 local root_dir_layout=$(get_layout_param $MOUNT)
7380 [[ "$dir3_layout" = "$root_dir_layout" ]] ||
7381 error "$dir3 should show the default layout from $MOUNT"
7383 # set OST pool on root directory
7384 local pool=$TESTNAME
7385 pool_add $pool || error "add $pool failed"
7386 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7387 error "add targets to $pool failed"
7389 $LFS setstripe -p $pool $MOUNT ||
7390 error "set OST pool on $MOUNT failed"
7392 # new file created in $dir3 should inherit the pool from
7393 # the filesystem default
7394 local file3=$dir3/$tfile-3
7395 touch $file3 || error "touch $file3 failed"
7397 local file3_pool=$($LFS getstripe -p $file3)
7398 [[ "$file3_pool" = "$pool" ]] ||
7399 error "$file3 didn't inherit OST pool $pool"
7401 local dir4=$MOUNT/$tdir-4
7402 mkdir $dir4 || error "mkdir $dir4 failed"
7403 local dir4_layout=$(get_layout_param $dir4)
7404 root_dir_layout=$(get_layout_param $MOUNT)
7405 echo "$LFS getstripe -d $dir4"
7406 $LFS getstripe -d $dir4
7407 echo "$LFS getstripe -d $MOUNT"
7408 $LFS getstripe -d $MOUNT
7409 [[ "$dir4_layout" = "$root_dir_layout" ]] ||
7410 error "$dir4 should show the default layout from $MOUNT"
7412 # new file created in $dir4 should inherit the pool from
7413 # the filesystem default
7414 local file4=$dir4/$tfile-4
7415 touch $file4 || error "touch $file4 failed"
7417 local file4_pool=$($LFS getstripe -p $file4)
7418 [[ "$file4_pool" = "$pool" ]] ||
7419 error "$file4 didn't inherit OST pool $pool"
7421 # new subdirectory under non-root directory should inherit
7422 # the default layout from its parent directory
7423 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7424 error "set directory layout on $dir4 failed"
7426 local dir5=$dir4/$tdir-5
7427 mkdir $dir5 || error "mkdir $dir5 failed"
7429 dir4_layout=$(get_layout_param $dir4)
7430 local dir5_layout=$(get_layout_param $dir5)
7431 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7432 error "$dir5 should inherit the default layout from $dir4"
7434 # though subdir under ROOT doesn't inherit default layout, but
7435 # its sub dir/file should be created with default layout.
7436 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
7437 [[ $MDS1_VERSION -ge $(version_code 2.12.59) ]] ||
7438 [[ $MDS1_VERSION -ge $(version_code 2.12.3) &&
7439 $MDS1_VERSION -lt $(version_code 2.12.50) ]] ||
7440 skip "Need MDS version at least 2.12.3 or 2.12.59"
7442 local default_lmv_count=$($LFS getdirstripe -D -c $MOUNT)
7443 local default_lmv_index=$($LFS getdirstripe -D -i $MOUNT)
7444 local default_lmv_hash=$($LFS getdirstripe -D -H $MOUNT)
7446 if [ $default_lmv_hash == "none" ]; then
7447 stack_trap "$LFS setdirstripe -D -d $MOUNT" EXIT
7449 stack_trap "$LFS setdirstripe -D -i $default_lmv_index \
7450 -c $default_lmv_count -H $default_lmv_hash $MOUNT" EXIT
7453 $LFS setdirstripe -D -c 2 $MOUNT ||
7454 error "setdirstripe -D -c 2 failed"
7455 mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed"
7456 local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6)
7457 [ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count"
7459 run_test 65n "don't inherit default layout from root for new subdirectories"
7461 # bug 2543 - update blocks count on client
7463 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7466 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7467 sync; sync_all_data; sync; sync_all_data
7468 cancel_lru_locks osc
7469 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7470 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7472 run_test 66 "update inode blocks count on client ==============="
7475 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7479 swapon -s | awk '($1 == "'$1'") { print $4 }'
7482 # bug5265, obdfilter oa2dentry return -ENOENT
7483 # #define OBD_FAIL_SRV_ENOENT 0x217
7485 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7486 remote_ost_nodsh && skip "remote OST with nodsh"
7489 $SETSTRIPE -c 1 -i 0 $f
7491 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
7493 do_facet ost1 lctl set_param fail_loc=0x217
7494 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
7495 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
7497 do_facet ost1 lctl set_param fail_loc=0
7498 $DIRECTIO write $f 0 2 || error "write error"
7500 cancel_lru_locks osc
7501 $DIRECTIO read $f 0 1 || error "read error"
7503 do_facet ost1 lctl set_param fail_loc=0x217
7504 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
7506 do_facet ost1 lctl set_param fail_loc=0
7509 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
7512 test_mkdir $DIR/$tdir
7513 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
7514 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
7516 run_test 71 "Running dbench on lustre (don't segment fault) ===="
7518 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
7519 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7520 [ "$RUNAS_ID" = "$UID" ] &&
7521 skip_env "RUNAS_ID = UID = $UID -- skipping"
7522 # Check that testing environment is properly set up. Skip if not
7523 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
7524 skip_env "User $RUNAS_ID does not exist - skipping"
7527 chmod 777 $DIR/$tfile
7528 chmod ug+s $DIR/$tfile
7529 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
7530 error "$RUNAS dd $DIR/$tfile failed"
7531 # See if we are still setuid/sgid
7532 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7533 error "S/gid is not dropped on write"
7534 # Now test that MDS is updated too
7535 cancel_lru_locks mdc
7536 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7537 error "S/gid is not dropped on MDS"
7540 run_test 72a "Test that remove suid works properly (bug5695) ===="
7542 test_72b() { # bug 24226 -- keep mode setting when size is not changing
7545 [ "$RUNAS_ID" = "$UID" ] &&
7546 skip_env "RUNAS_ID = UID = $UID -- skipping"
7547 [ "$RUNAS_ID" -eq 0 ] &&
7548 skip_env "RUNAS_ID = 0 -- skipping"
7549 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7550 # Check that testing environment is properly set up. Skip if not
7551 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
7552 skip_env "User $RUNAS_ID does not exist - skipping"
7554 touch $DIR/${tfile}-f{g,u}
7555 test_mkdir $DIR/${tfile}-dg
7556 test_mkdir $DIR/${tfile}-du
7557 chmod 770 $DIR/${tfile}-{f,d}{g,u}
7558 chmod g+s $DIR/${tfile}-{f,d}g
7559 chmod u+s $DIR/${tfile}-{f,d}u
7560 for perm in 777 2777 4777; do
7561 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
7562 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
7563 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
7564 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
7568 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
7570 # bug 3462 - multiple simultaneous MDC requests
7572 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7574 test_mkdir $DIR/d73-1
7575 test_mkdir $DIR/d73-2
7576 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
7579 lctl set_param fail_loc=0x80000129
7580 $MULTIOP $DIR/d73-1/f73-2 Oc &
7582 lctl set_param fail_loc=0
7584 $MULTIOP $DIR/d73-2/f73-3 Oc &
7588 wait $pid1 || return 1
7592 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
7593 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
7594 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
7598 run_test 73 "multiple MDC requests (should not deadlock)"
7600 test_74a() { # bug 6149, 6184
7601 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7604 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7606 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7607 # will spin in a tight reconnection loop
7608 $LCTL set_param fail_loc=0x8000030e
7609 # get any lock that won't be difficult - lookup works.
7611 $LCTL set_param fail_loc=0
7615 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
7617 test_74b() { # bug 13310
7618 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7620 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7622 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7623 # will spin in a tight reconnection loop
7624 $LCTL set_param fail_loc=0x8000030e
7625 # get a "difficult" lock
7627 $LCTL set_param fail_loc=0
7631 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
7634 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7636 #define OBD_FAIL_LDLM_NEW_LOCK
7637 $LCTL set_param fail_loc=0x319
7638 touch $DIR/$tfile && error "touch successful"
7639 $LCTL set_param fail_loc=0
7642 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
7645 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
7648 test_76() { # Now for bug 20433, added originally in bug 1443
7649 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7651 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
7653 cancel_lru_locks osc
7654 BEFORE_INODES=$(num_inodes)
7655 echo "before inodes: $BEFORE_INODES"
7657 [ "$SLOW" = "no" ] && COUNT=100
7658 for i in $(seq $COUNT); do
7662 cancel_lru_locks osc
7663 AFTER_INODES=$(num_inodes)
7664 echo "after inodes: $AFTER_INODES"
7666 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
7668 AFTER_INODES=$(num_inodes)
7670 echo "wait $wait seconds inodes: $AFTER_INODES"
7671 if [ $wait -gt 30 ]; then
7672 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
7676 run_test 76 "confirm clients recycle inodes properly ===="
7682 # Note: in sptlrpc modes which enable its own bulk checksum, the
7683 # original crc32_le bulk checksum will be automatically disabled,
7684 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
7685 # will be checked by sptlrpc code against sptlrpc bulk checksum.
7686 # In this case set_checksums() will not be no-op, because sptlrpc
7687 # bulk checksum will be enabled all through the test.
7689 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
7690 lctl set_param -n osc.*.checksums $1
7694 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7695 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
7696 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7697 tr -d [] | head -n1)}
7700 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
7701 log "set checksum type to $1"
7704 F77_TMP=$TMP/f77-temp
7707 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
7708 error "error writing to $F77_TMP"
7711 test_77a() { # bug 10889
7712 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7713 $GSS && skip_env "could not run with gss"
7715 [ ! -f $F77_TMP ] && setup_f77
7717 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
7721 run_test 77a "normal checksum read/write operation"
7723 test_77b() { # bug 10889
7724 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7725 $GSS && skip_env "could not run with gss"
7727 [ ! -f $F77_TMP ] && setup_f77
7728 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7729 $LCTL set_param fail_loc=0x80000409
7732 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7733 error "dd error: $?"
7734 $LCTL set_param fail_loc=0
7736 for algo in $CKSUM_TYPES; do
7737 cancel_lru_locks osc
7738 set_checksum_type $algo
7739 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7740 $LCTL set_param fail_loc=0x80000408
7741 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
7742 $LCTL set_param fail_loc=0
7745 set_checksum_type $ORIG_CSUM_TYPE
7748 run_test 77b "checksum error on client write, read"
7753 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
7755 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
7756 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
7757 $check_ost && [ -n "$ost_file_prefix" ] &&
7758 do_facet ost1 rm -f ${ost_file_prefix}\*
7762 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7763 $GSS && skip_env "could not run with gss"
7764 remote_ost_nodsh && skip "remote OST with nodsh"
7767 local osc_file_prefix
7769 local check_ost=false
7770 local ost_file_prefix
7776 # ensure corruption will occur on first OSS/OST
7777 $LFS setstripe -i 0 $DIR/$tfile
7779 [ ! -f $F77_TMP ] && setup_f77
7780 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7781 error "dd write error: $?"
7782 fid=$($LFS path2fid $DIR/$tfile)
7784 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
7787 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
7788 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
7790 echo "OSS do not support bulk pages dump upon error"
7793 osc_file_prefix=$($LCTL get_param -n debug_path)
7794 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
7796 trap cleanup_77c EXIT
7799 # enable bulk pages dump upon error on Client
7800 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
7801 # enable bulk pages dump upon error on OSS
7803 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
7805 # flush Client cache to allow next read to reach OSS
7806 cancel_lru_locks osc
7808 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7809 $LCTL set_param fail_loc=0x80000408
7810 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
7811 $LCTL set_param fail_loc=0
7815 # check cksum dump on Client
7816 osc_file=$(ls ${osc_file_prefix}*)
7817 [ -n "$osc_file" ] || error "no checksum dump file on Client"
7818 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
7819 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
7820 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
7821 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
7823 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
7824 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7825 error "dump content does not match on Client"
7827 $check_ost || skip "No need to check cksum dump on OSS"
7829 # check cksum dump on OSS
7830 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
7831 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
7832 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
7833 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
7834 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7835 error "dump content does not match on OSS"
7839 run_test 77c "checksum error on client read with debug"
7841 test_77d() { # bug 10889
7842 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7843 $GSS && skip_env "could not run with gss"
7845 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7846 $LCTL set_param fail_loc=0x80000409
7848 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7849 error "direct write: rc=$?"
7850 $LCTL set_param fail_loc=0
7853 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7854 $LCTL set_param fail_loc=0x80000408
7856 cancel_lru_locks osc
7857 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7858 error "direct read: rc=$?"
7859 $LCTL set_param fail_loc=0
7862 run_test 77d "checksum error on OST direct write, read"
7864 test_77f() { # bug 10889
7865 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7866 $GSS && skip_env "could not run with gss"
7869 for algo in $CKSUM_TYPES; do
7870 cancel_lru_locks osc
7871 set_checksum_type $algo
7872 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7873 $LCTL set_param fail_loc=0x409
7874 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
7875 error "direct write succeeded"
7876 $LCTL set_param fail_loc=0
7878 set_checksum_type $ORIG_CSUM_TYPE
7881 run_test 77f "repeat checksum error on write (expect error)"
7883 test_77g() { # bug 10889
7884 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7885 $GSS && skip_env "could not run with gss"
7886 remote_ost_nodsh && skip "remote OST with nodsh"
7888 [ ! -f $F77_TMP ] && setup_f77
7890 local file=$DIR/$tfile
7891 stack_trap "rm -f $file" EXIT
7893 $SETSTRIPE -c 1 -i 0 $file
7894 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
7895 do_facet ost1 lctl set_param fail_loc=0x8000021a
7897 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
7898 error "write error: rc=$?"
7899 do_facet ost1 lctl set_param fail_loc=0
7902 cancel_lru_locks osc
7903 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
7904 do_facet ost1 lctl set_param fail_loc=0x8000021b
7906 cmp $F77_TMP $file || error "file compare failed"
7907 do_facet ost1 lctl set_param fail_loc=0
7910 run_test 77g "checksum error on OST write, read"
7912 test_77k() { # LU-10906
7913 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7914 $GSS && skip_env "could not run with gss"
7916 local cksum_param="osc.$FSNAME*.checksums"
7917 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
7921 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
7922 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
7923 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
7927 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
7928 error "failed to set checksum=$i on MGS"
7929 wait_update $HOSTNAME "$get_checksum" $i
7931 echo "remount client, checksum should be $i"
7932 remount_client $MOUNT || "failed to remount client"
7933 checksum=$(eval $get_checksum)
7934 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7937 for opt in "checksum" "nochecksum"; do
7938 #remount with mount option
7939 echo "remount client with option $opt, checksum should be $i"
7940 umount_client $MOUNT || "failed to umount client"
7941 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
7942 "failed to mount client with option '$opt'"
7943 checksum=$(eval $get_checksum)
7944 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7948 remount_client $MOUNT || "failed to remount client"
7950 run_test 77k "enable/disable checksum correctly"
7952 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
7961 test_78() { # bug 10901
7962 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7963 remote_ost || skip_env "local OST"
7966 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
7967 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
7968 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
7969 echo "MemTotal: $MEMTOTAL"
7971 # reserve 256MB of memory for the kernel and other running processes,
7972 # and then take 1/2 of the remaining memory for the read/write buffers.
7973 if [ $MEMTOTAL -gt 512 ] ;then
7974 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
7976 # for those poor memory-starved high-end clusters...
7977 MEMTOTAL=$((MEMTOTAL / 2))
7979 echo "Mem to use for directio: $MEMTOTAL"
7981 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
7982 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
7983 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
7984 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
7986 echo "Smallest OST: $SMALLESTOST"
7987 [[ $SMALLESTOST -lt 10240 ]] &&
7988 skip "too small OSTSIZE, useless to run large O_DIRECT test"
7990 trap cleanup_test_78 EXIT
7992 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
7993 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
7995 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
7996 echo "File size: $F78SIZE"
7997 $SETSTRIPE -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
7998 for i in $(seq 1 $NSEQ); do
7999 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
8000 echo directIO rdwr round $i of $NSEQ
8001 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
8006 run_test 78 "handle large O_DIRECT writes correctly ============"
8008 test_79() { # bug 12743
8009 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8011 wait_delete_completed
8013 BKTOTAL=$(calc_osc_kbytes kbytestotal)
8014 BKFREE=$(calc_osc_kbytes kbytesfree)
8015 BKAVAIL=$(calc_osc_kbytes kbytesavail)
8017 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
8018 DFTOTAL=`echo $STRING | cut -d, -f1`
8019 DFUSED=`echo $STRING | cut -d, -f2`
8020 DFAVAIL=`echo $STRING | cut -d, -f3`
8021 DFFREE=$(($DFTOTAL - $DFUSED))
8023 ALLOWANCE=$((64 * $OSTCOUNT))
8025 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
8026 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
8027 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
8029 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
8030 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
8031 error "df free($DFFREE) mismatch OST free($BKFREE)"
8033 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
8034 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
8035 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
8038 run_test 79 "df report consistency check ======================="
8040 test_80() { # bug 10718
8041 remote_ost_nodsh && skip "remote OST with nodsh"
8042 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8044 # relax strong synchronous semantics for slow backends like ZFS
8045 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
8046 local soc="obdfilter.*.sync_lock_cancel"
8047 local save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
8049 # "sync_on_lock_cancel" was broken by v2_11_55_0-26-g7059644e9a
8050 if [ -z "$save" ]; then
8051 soc="obdfilter.*.sync_on_lock_cancel"
8052 save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
8055 if [ "$save" != "never" ]; then
8056 local hosts=$(comma_list $(osts_nodes))
8058 do_nodes $hosts $LCTL set_param $soc=never
8059 stack_trap "do_nodes $hosts $LCTL set_param $soc=$save"
8063 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
8065 local before=$(date +%s)
8066 cancel_lru_locks osc
8067 local after=$(date +%s)
8068 local diff=$((after - before))
8069 [ $diff -le 1 ] || error "elapsed for 1M@1T = $diff"
8073 run_test 80 "Page eviction is equally fast at high offsets too"
8075 test_81a() { # LU-456
8076 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8077 remote_ost_nodsh && skip "remote OST with nodsh"
8079 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8080 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
8081 do_facet ost1 lctl set_param fail_loc=0x80000228
8083 # write should trigger a retry and success
8084 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
8085 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8087 if [ $RC -ne 0 ] ; then
8088 error "write should success, but failed for $RC"
8091 run_test 81a "OST should retry write when get -ENOSPC ==============="
8093 test_81b() { # LU-456
8094 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8095 remote_ost_nodsh && skip "remote OST with nodsh"
8097 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8098 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
8099 do_facet ost1 lctl set_param fail_loc=0x228
8101 # write should retry several times and return -ENOSPC finally
8102 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
8103 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8106 if [ $RC -ne $ENOSPC ] ; then
8107 error "dd should fail for -ENOSPC, but succeed."
8110 run_test 81b "OST should return -ENOSPC when retry still fails ======="
8112 test_82() { # LU-1031
8113 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
8117 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
8119 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
8121 kill -USR1 $MULTIPID2
8123 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
8124 error "First grouplock does not block second one"
8126 echo "Second grouplock blocks first one"
8128 kill -USR1 $MULTIPID1
8132 run_test 82 "Basic grouplock test"
8135 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
8137 test_mkdir $DIR/$tdir.cvsroot
8138 chown $RUNAS_ID $DIR/$tdir.cvsroot
8141 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
8144 # some versions of cvs import exit(1) when asked to import links or
8145 # files they can't read. ignore those files.
8146 local toignore=$(find . -type l -printf '-I %f\n' -o \
8147 ! -perm /4 -printf '-I %f\n')
8148 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
8149 $tdir.reposname vtag rtag
8152 test_mkdir $DIR/$tdir.reposname
8153 chown $RUNAS_ID $DIR/$tdir.reposname
8154 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
8156 cd $DIR/$tdir.reposname
8158 $RUNAS cvs add -m 'addmsg' foo99
8160 $RUNAS cvs commit -m 'nomsg' foo99
8161 rm -fr $DIR/$tdir.cvsroot
8163 run_test 99 "cvs strange file/directory operations"
8166 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8167 [[ "$NETTYPE" =~ tcp ]] ||
8168 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
8169 remote_ost_nodsh && skip "remote OST with nodsh"
8170 remote_mds_nodsh && skip "remote MDS with nodsh"
8172 skip "useless for local single node setup"
8174 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
8175 [ "$PROT" != "tcp" ] && continue
8176 RPORT=$(echo $REMOTE | cut -d: -f2)
8177 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
8180 LPORT=`echo $LOCAL | cut -d: -f2`
8181 if [ $LPORT -ge 1024 ]; then
8182 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
8184 error_exit "local: $LPORT > 1024, remote: $RPORT"
8187 [ "$rc" = 0 ] || error_exit "privileged port not found" )
8189 run_test 100 "check local port using privileged port ==========="
8191 function get_named_value()
8200 echo $line | sed "s/^$tag[ ]*//"
8207 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
8208 awk '/^max_cached_mb/ { print $2 }')
8211 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
8216 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8217 [ $MDSCOUNT -ge 2 ] && skip_env "needs < 2 MDTs" #LU-4322
8222 local cache_limit=32
8224 $LCTL set_param -n osc.*-osc*.rpc_stats 0
8225 trap cleanup_101a EXIT
8226 $LCTL set_param -n llite.*.read_ahead_stats 0
8227 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
8230 # randomly read 10000 of 64K chunks from file 3x 32MB in size
8232 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
8233 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
8236 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
8237 get_named_value 'read but discarded' | cut -d" " -f1); do
8238 discard=$(($discard + $s))
8242 if [[ $(($discard * 10)) -gt $nreads ]]; then
8243 $LCTL get_param osc.*-osc*.rpc_stats
8244 $LCTL get_param llite.*.read_ahead_stats
8245 error "too many ($discard) discarded pages"
8247 rm -f $DIR/$tfile || true
8249 run_test 101a "check read-ahead for random reads"
8252 test_mkdir $DIR/$tdir
8253 local STRIPE_SIZE=$1
8254 local FILE_LENGTH=$2
8257 local FILE_SIZE_MB=$((FILE_LENGTH / STRIPE_SIZE))
8259 local list=$(comma_list $(osts_nodes))
8260 set_osd_param $list '' read_cache_enable 0
8261 set_osd_param $list '' writethrough_cache_enable 0
8263 trap cleanup_test101bc EXIT
8264 # prepare the read-ahead file
8265 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
8267 dd if=/dev/zero of=$DIR/$tfile bs=$STRIPE_SIZE \
8268 count=$FILE_SIZE_MB 2> /dev/null
8272 cleanup_test101bc() {
8277 local list=$(comma_list $(osts_nodes))
8278 set_osd_param $list '' read_cache_enable 1
8279 set_osd_param $list '' writethrough_cache_enable 1
8283 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
8288 local STRIPE_SIZE=$2
8289 local FILE_LENGTH=$3
8290 local RA_INC=1048576
8291 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
8292 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
8293 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
8294 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
8295 get_named_value 'read but discarded' |
8296 cut -d" " -f1 | calc_total)
8297 if [[ $DISCARD -gt $discard_limit ]]; then
8298 $LCTL get_param llite.*.read_ahead_stats
8299 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
8301 echo "Read-ahead success for size ${READ_SIZE}"
8306 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8307 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8309 local STRIPE_SIZE=1048576
8310 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
8312 if [ $SLOW == "yes" ]; then
8313 local FILE_LENGTH=$((STRIDE_SIZE * 64))
8315 local FILE_LENGTH=$((STRIDE_SIZE * 8))
8318 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
8320 # prepare the read-ahead file
8321 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8322 cancel_lru_locks osc
8323 for BIDX in 2 4 8 16 32 64 128 256
8325 local BSIZE=$((BIDX*4096))
8326 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
8327 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
8328 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
8329 $LCTL set_param -n llite.*.read_ahead_stats 0
8330 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
8331 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
8332 cancel_lru_locks osc
8333 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
8338 run_test 101b "check stride-io mode read-ahead ================="
8341 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8343 local STRIPE_SIZE=1048576
8344 local FILE_LENGTH=$((STRIPE_SIZE*100))
8348 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8350 cancel_lru_locks osc
8351 $LCTL set_param osc.*.rpc_stats 0
8352 $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
8353 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8354 local stats=$($LCTL get_param -n $osc_rpc_stats)
8355 local lines=$(echo "$stats" | awk 'END {print NR;}')
8358 if [ $lines -le 20 ]; then
8361 for size in 1 2 4 8; do
8362 local rpc=$(echo "$stats" |
8363 awk '($1 == "'$size':") {print $2; exit; }')
8365 error "Small $((size*4))k read IO $rpc !"
8367 echo "$osc_rpc_stats check passed!"
8372 run_test 101c "check stripe_size aligned read-ahead ================="
8375 $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
8376 $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
8380 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8382 local file=$DIR/$tfile
8383 local sz_MB=${FILESIZE_101d:-500}
8384 local ra_MB=${READAHEAD_MB:-40}
8386 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8387 [ $free_MB -lt $sz_MB ] &&
8388 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8390 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8391 $SETSTRIPE -c -1 $file || error "setstripe failed"
8393 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8394 echo Cancel LRU locks on lustre client to flush the client cache
8395 cancel_lru_locks osc
8397 echo Disable read-ahead
8398 local old_READAHEAD=$(set_read_ahead 0)
8400 echo Reading the test file $file with read-ahead disabled
8401 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8403 echo Cancel LRU locks on lustre client to flush the client cache
8404 cancel_lru_locks osc
8405 echo Enable read-ahead with ${ra_MB}MB
8406 set_read_ahead $ra_MB
8408 echo Reading the test file $file with read-ahead enabled
8409 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8411 echo "read-ahead disabled time read $raOFF"
8412 echo "read-ahead enabled time read $raON"
8414 set_read_ahead $old_READAHEAD
8416 wait_delete_completed
8418 [ $raOFF -le 1 -o $raON -lt $raOFF ] ||
8419 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8421 run_test 101d "file read with and without read-ahead enabled"
8424 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8426 local file=$DIR/$tfile
8427 local size_KB=500 #KB
8431 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8432 local need_KB=$((count * size_KB))
8433 [[ $free_KB -le $need_KB ]] &&
8434 skip_env "Need free space $need_KB, have $free_KB"
8436 echo "Creating $count ${size_KB}K test files"
8437 for ((i = 0; i < $count; i++)); do
8438 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8441 echo "Cancel LRU locks on lustre client to flush the client cache"
8442 cancel_lru_locks $OSC
8444 echo "Reset readahead stats"
8445 $LCTL set_param -n llite.*.read_ahead_stats 0
8447 for ((i = 0; i < $count; i++)); do
8448 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
8451 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8452 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8454 for ((i = 0; i < $count; i++)); do
8455 rm -rf $file.$i 2>/dev/null
8458 #10000 means 20% reads are missing in readahead
8459 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
8461 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
8464 which iozone || skip_env "no iozone installed"
8466 local old_debug=$($LCTL get_param debug)
8467 old_debug=${old_debug#*=}
8468 $LCTL set_param debug="reada mmap"
8470 # create a test file
8471 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
8473 echo Cancel LRU locks on lustre client to flush the client cache
8474 cancel_lru_locks osc
8476 echo Reset readahead stats
8477 $LCTL set_param -n llite.*.read_ahead_stats 0
8479 echo mmap read the file with small block size
8480 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
8483 echo checking missing pages
8484 $LCTL get_param llite.*.read_ahead_stats
8485 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8486 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8488 $LCTL set_param debug="$old_debug"
8489 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
8492 run_test 101f "check mmap read performance"
8494 test_101g_brw_size_test() {
8496 local pages=$((mb * 1048576 / PAGE_SIZE))
8497 local file=$DIR/$tfile
8499 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
8500 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
8501 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
8502 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
8506 stack_trap "rm -f $file" EXIT
8507 $LCTL set_param -n osc.*.rpc_stats=0
8509 # 10 RPCs should be enough for the test
8511 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
8512 { error "dd write ${mb} MB blocks failed"; return 3; }
8513 cancel_lru_locks osc
8514 dd of=/dev/null if=$file bs=${mb}M count=$count ||
8515 { error "dd write ${mb} MB blocks failed"; return 4; }
8517 # calculate number of full-sized read and write RPCs
8518 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
8519 sed -n '/pages per rpc/,/^$/p' |
8520 awk '/'$pages':/ { reads += $2; writes += $6 }; \
8521 END { print reads,writes }'))
8522 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
8524 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
8531 remote_ost_nodsh && skip "remote OST with nodsh"
8534 local osts=$(get_facets OST)
8535 local list=$(comma_list $(osts_nodes))
8536 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
8537 local brw_size="obdfilter.*.brw_size"
8539 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8541 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
8542 if [ $OST1_VERSION -ge $(version_code 2.8.52) -o \
8543 \( $OST1_VERSION -ge $(version_code 2.7.17) -a \
8544 $OST1_VERSION -lt $(version_code 2.7.50) \) ] &&
8545 [ $CLIENT_VERSION -ge $(version_code 2.8.52) -o \
8546 \( $CLIENT_VERSION -ge $(version_code 2.7.17) -a \
8547 $CLIENT_VERSION -lt $(version_code 2.7.50) \) ]; then
8548 [ $OST1_VERSION -ge $(version_code 2.9.52) ] && suffix="M"
8549 if [[ $orig_mb -lt 16 ]]; then
8550 save_lustre_params $osts "$brw_size" > $p
8551 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
8552 error "set 16MB RPC size failed"
8554 echo "remount client to enable new RPC size"
8555 remount_client $MOUNT || error "remount_client failed"
8558 test_101g_brw_size_test 16 || error "16MB RPC test failed"
8559 # should be able to set brw_size=12, but no rpc_stats for that
8560 test_101g_brw_size_test 8 || error "8MB RPC test failed"
8563 test_101g_brw_size_test 4 || error "4MB RPC test failed"
8565 if [[ $orig_mb -lt 16 ]]; then
8566 restore_lustre_params < $p
8567 remount_client $MOUNT || error "remount_client restore failed"
8570 rm -f $p $DIR/$tfile
8572 run_test 101g "Big bulk(4/16 MiB) readahead"
8575 test_mkdir $DIR/$tdir
8576 chown $RUNAS_ID $DIR/$tdir
8579 STRIPE_COUNT=$OSTCOUNT
8580 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
8582 trap cleanup_test102 EXIT
8584 $1 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
8586 for num in 1 2 3 4; do
8587 for count in $(seq 1 $STRIPE_COUNT); do
8588 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
8589 local size=`expr $STRIPE_SIZE \* $num`
8590 local file=file"$num-$idx-$count"
8591 $1 $SETSTRIPE -S $size -i $idx -c $count $file
8597 $1 tar cf $TMP/f102.tar $tdir --xattrs
8603 rm -rf $DIR/d0.sanity/d102
8607 [ "$UID" != 0 ] && skip "must run as root"
8608 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
8609 skip_env "must have user_xattr"
8611 [ -z "$(which setfattr 2>/dev/null)" ] &&
8612 skip_env "could not find setfattr"
8614 local testfile=$DIR/$tfile
8617 echo "set/get xattr..."
8618 setfattr -n trusted.name1 -v value1 $testfile ||
8619 error "setfattr -n trusted.name1=value1 $testfile failed"
8620 getfattr -n trusted.name1 $testfile 2> /dev/null |
8621 grep "trusted.name1=.value1" ||
8622 error "$testfile missing trusted.name1=value1"
8624 setfattr -n user.author1 -v author1 $testfile ||
8625 error "setfattr -n user.author1=author1 $testfile failed"
8626 getfattr -n user.author1 $testfile 2> /dev/null |
8627 grep "user.author1=.author1" ||
8628 error "$testfile missing trusted.author1=author1"
8631 setfattr -n trusted.name2 -v value2 $testfile ||
8632 error "$testfile unable to set trusted.name2"
8633 setfattr -n trusted.name3 -v value3 $testfile ||
8634 error "$testfile unable to set trusted.name3"
8635 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
8636 grep "trusted.name" | wc -l) -eq 3 ] ||
8637 error "$testfile missing 3 trusted.name xattrs"
8639 setfattr -n user.author2 -v author2 $testfile ||
8640 error "$testfile unable to set user.author2"
8641 setfattr -n user.author3 -v author3 $testfile ||
8642 error "$testfile unable to set user.author3"
8643 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
8644 grep "user.author" | wc -l) -eq 3 ] ||
8645 error "$testfile missing 3 user.author xattrs"
8647 echo "remove xattr..."
8648 setfattr -x trusted.name1 $testfile ||
8649 error "$testfile error deleting trusted.name1"
8650 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
8651 error "$testfile did not delete trusted.name1 xattr"
8653 setfattr -x user.author1 $testfile ||
8654 error "$testfile error deleting user.author1"
8655 echo "set lustre special xattr ..."
8656 $LFS setstripe -c1 $testfile
8657 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
8658 awk -F "=" '/trusted.lov/ { print $2 }' )
8659 setfattr -n "trusted.lov" -v $lovea $testfile ||
8660 error "$testfile doesn't ignore setting trusted.lov again"
8661 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
8662 error "$testfile allow setting invalid trusted.lov"
8665 run_test 102a "user xattr test =================================="
8668 [ -z "$(which setfattr 2>/dev/null)" ] &&
8669 skip_env "could not find setfattr"
8670 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8672 # b10930: get/set/list trusted.lov xattr
8673 echo "get/set/list trusted.lov xattr ..."
8674 local testfile=$DIR/$tfile
8675 $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8676 error "setstripe failed"
8677 local STRIPECOUNT=$($GETSTRIPE -c $testfile) ||
8678 error "getstripe failed"
8679 getfattr -d -m "^trusted" $testfile 2>/dev/null | grep "trusted.lov" ||
8680 error "can't get trusted.lov from $testfile"
8682 local testfile2=${testfile}2
8683 local value=$(getfattr -n trusted.lov $testfile 2>/dev/null |
8684 grep "trusted.lov" | sed -e 's/[^=]\+=//')
8687 setfattr -n trusted.lov -v $value $testfile2
8688 local stripe_size=$($GETSTRIPE -S $testfile2)
8689 local stripe_count=$($GETSTRIPE -c $testfile2)
8690 [[ $stripe_size -eq 65536 ]] ||
8691 error "stripe size $stripe_size != 65536"
8692 [[ $stripe_count -eq $STRIPECOUNT ]] ||
8693 error "stripe count $stripe_count != $STRIPECOUNT"
8696 run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
8699 [ -z "$(which setfattr 2>/dev/null)" ] &&
8700 skip_env "could not find setfattr"
8701 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8703 # b10930: get/set/list lustre.lov xattr
8704 echo "get/set/list lustre.lov xattr ..."
8705 test_mkdir $DIR/$tdir
8706 chown $RUNAS_ID $DIR/$tdir
8707 local testfile=$DIR/$tdir/$tfile
8708 $RUNAS $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8709 error "setstripe failed"
8710 local STRIPECOUNT=$($RUNAS $GETSTRIPE -c $testfile) ||
8711 error "getstripe failed"
8712 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
8713 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
8715 local testfile2=${testfile}2
8716 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
8717 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
8719 $RUNAS $MCREATE $testfile2
8720 $RUNAS setfattr -n lustre.lov -v $value $testfile2
8721 local stripe_size=$($RUNAS $GETSTRIPE -S $testfile2)
8722 local stripe_count=$($RUNAS $GETSTRIPE -c $testfile2)
8723 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
8724 [ $stripe_count -eq $STRIPECOUNT ] ||
8725 error "stripe count $stripe_count != $STRIPECOUNT"
8727 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
8729 compare_stripe_info1() {
8730 local stripe_index_all_zero=true
8732 for num in 1 2 3 4; do
8733 for count in $(seq 1 $STRIPE_COUNT); do
8734 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
8735 local size=$((STRIPE_SIZE * num))
8736 local file=file"$num-$offset-$count"
8737 stripe_size=$($LFS getstripe -S $PWD/$file)
8738 [[ $stripe_size -ne $size ]] &&
8739 error "$file: size $stripe_size != $size"
8740 stripe_count=$($LFS getstripe -c $PWD/$file)
8741 # allow fewer stripes to be created, ORI-601
8742 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
8743 error "$file: count $stripe_count != $count"
8744 stripe_index=$($LFS getstripe -i $PWD/$file)
8745 [[ $stripe_index -ne 0 ]] &&
8746 stripe_index_all_zero=false
8750 $stripe_index_all_zero &&
8751 error "all files are being extracted starting from OST index 0"
8755 have_xattrs_include() {
8756 tar --help | grep -q xattrs-include &&
8757 echo --xattrs-include="lustre.*"
8761 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8762 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8764 XINC=$(have_xattrs_include)
8766 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8768 compare_stripe_info1
8770 run_test 102d "tar restore stripe info from tarfile,not keep osts"
8773 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8774 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8776 XINC=$(have_xattrs_include)
8778 test_mkdir $DIR/$tdir.restore
8780 tar cf - --xattrs $tdir | tar xf - \
8781 -C $DIR/$tdir.restore --xattrs $XINC
8782 cd $DIR/$tdir.restore/$tdir
8783 compare_stripe_info1
8785 run_test 102f "tar copy files, not keep osts"
8788 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
8789 skip "must have user_xattr"
8790 [ -z "$(which setfattr 2>/dev/null)" ] &&
8791 skip_env "could not find setfattr"
8792 [ -z "$(which getfattr 2>/dev/null)" ] &&
8793 skip_env "could not find getfattr"
8795 local xsize=${1:-1024} # in bytes
8796 local file=$DIR/$tfile
8797 local value="$(generate_string $xsize)"
8798 local xbig=trusted.big
8801 log "save $xbig on $file"
8802 setfattr -n $xbig -v $value $file ||
8803 error "saving $xbig on $file failed"
8805 local orig=$(get_xattr_value $xbig $file)
8806 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
8808 local xsml=trusted.sml
8809 log "save $xsml on $file"
8810 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
8812 local new=$(get_xattr_value $xbig $file)
8813 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
8815 log "grow $xsml on $file"
8816 setfattr -n $xsml -v "$value" $file ||
8817 error "growing $xsml on $file failed"
8819 new=$(get_xattr_value $xbig $file)
8820 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
8821 log "$xbig still valid after growing $xsml"
8826 test_102h() { # bug 15777
8829 run_test 102h "grow xattr from inside inode to external block"
8832 large_xattr_enabled || skip_env "ea_inode feature disabled"
8834 grow_xattr $(max_xattr_size)
8836 run_test 102ha "grow xattr from inside inode to external inode"
8838 test_102i() { # bug 17038
8839 [ -z "$(which getfattr 2>/dev/null)" ] &&
8840 skip "could not find getfattr"
8843 ln -s $DIR/$tfile $DIR/${tfile}link
8844 getfattr -n trusted.lov $DIR/$tfile ||
8845 error "lgetxattr on $DIR/$tfile failed"
8846 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
8847 grep -i "no such attr" ||
8848 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
8849 rm -f $DIR/$tfile $DIR/${tfile}link
8851 run_test 102i "lgetxattr test on symbolic link ============"
8854 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8855 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8857 XINC=$(have_xattrs_include)
8858 setup_test102 "$RUNAS"
8859 chown $RUNAS_ID $DIR/$tdir
8860 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8862 compare_stripe_info1 "$RUNAS"
8864 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
8867 [ -z "$(which setfattr 2>/dev/null)" ] &&
8868 skip "could not find setfattr"
8871 # b22187 just check that does not crash for regular file.
8872 setfattr -n trusted.lov $DIR/$tfile
8873 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
8874 local test_kdir=$DIR/$tdir
8875 test_mkdir $test_kdir
8876 local default_size=$($LFS getstripe -S $test_kdir)
8877 local default_count=$($LFS getstripe -c $test_kdir)
8878 local default_offset=$($LFS getstripe -i $test_kdir)
8879 $SETSTRIPE -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
8880 error 'dir setstripe failed'
8881 setfattr -n trusted.lov $test_kdir
8882 local stripe_size=$($LFS getstripe -S $test_kdir)
8883 local stripe_count=$($LFS getstripe -c $test_kdir)
8884 local stripe_offset=$($LFS getstripe -i $test_kdir)
8885 [ $stripe_size -eq $default_size ] ||
8886 error "stripe size $stripe_size != $default_size"
8887 [ $stripe_count -eq $default_count ] ||
8888 error "stripe count $stripe_count != $default_count"
8889 [ $stripe_offset -eq $default_offset ] ||
8890 error "stripe offset $stripe_offset != $default_offset"
8891 rm -rf $DIR/$tfile $test_kdir
8893 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
8896 [ -z "$(which getfattr 2>/dev/null)" ] &&
8897 skip "could not find getfattr"
8899 # LU-532 trusted. xattr is invisible to non-root
8900 local testfile=$DIR/$tfile
8904 echo "listxattr as user..."
8905 chown $RUNAS_ID $testfile
8906 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
8907 grep -q "trusted" &&
8908 error "$testfile trusted xattrs are user visible"
8912 run_test 102l "listxattr size test =================================="
8914 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
8915 local path=$DIR/$tfile
8918 listxattr_size_check $path || error "listattr_size_check $path failed"
8920 run_test 102m "Ensure listxattr fails on small bufffer ========"
8924 getxattr() { # getxattr path name
8925 # Return the base64 encoding of the value of xattr name on path.
8929 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
8931 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8933 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8935 getfattr --absolute-names --encoding=base64 --name=$name $path |
8936 awk -F= -v name=$name '$1 == name {
8937 print substr($0, index($0, "=") + 1);
8941 test_102n() { # LU-4101 mdt: protect internal xattrs
8942 [ -z "$(which setfattr 2>/dev/null)" ] &&
8943 skip "could not find setfattr"
8944 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
8946 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
8949 local file0=$DIR/$tfile.0
8950 local file1=$DIR/$tfile.1
8951 local xattr0=$TMP/$tfile.0
8952 local xattr1=$TMP/$tfile.1
8953 local namelist="lov lma lmv link fid version som hsm"
8957 rm -rf $file0 $file1 $xattr0 $xattr1
8960 # Get 'before' xattrs of $file1.
8961 getfattr --absolute-names --dump --match=- $file1 > $xattr0
8963 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
8964 namelist+=" lfsck_namespace"
8965 for name in $namelist; do
8966 # Try to copy xattr from $file0 to $file1.
8967 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8969 setfattr --name=trusted.$name --value="$value" $file1 ||
8970 error "setxattr 'trusted.$name' failed"
8972 # Try to set a garbage xattr.
8973 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8975 if [[ x$name == "xlov" ]]; then
8976 setfattr --name=trusted.lov --value="$value" $file1 &&
8977 error "setxattr invalid 'trusted.lov' success"
8979 setfattr --name=trusted.$name --value="$value" $file1 ||
8980 error "setxattr invalid 'trusted.$name' failed"
8983 # Try to remove the xattr from $file1. We don't care if this
8984 # appears to succeed or fail, we just don't want there to be
8985 # any changes or crashes.
8986 setfattr --remove=$trusted.$name $file1 2> /dev/null
8989 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
8992 # Try to copy xattr from $file0 to $file1.
8993 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8995 setfattr --name=trusted.$name --value="$value" $file1 ||
8996 error "setxattr 'trusted.$name' failed"
8998 # Try to set a garbage xattr.
8999 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9001 setfattr --name=trusted.$name --value="$value" $file1 ||
9002 error "setxattr 'trusted.$name' failed"
9004 # Try to remove the xattr from $file1. We don't care if this
9005 # appears to succeed or fail, we just don't want there to be
9006 # any changes or crashes.
9007 setfattr --remove=$trusted.$name $file1 2> /dev/null
9010 # Get 'after' xattrs of file1.
9011 getfattr --absolute-names --dump --match=- $file1 > $xattr1
9013 if ! diff $xattr0 $xattr1; then
9014 error "before and after xattrs of '$file1' differ"
9017 rm -rf $file0 $file1 $xattr0 $xattr1
9021 run_test 102n "silently ignore setxattr on internal trusted xattrs"
9023 test_102p() { # LU-4703 setxattr did not check ownership
9024 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
9025 skip "MDS needs to be at least 2.5.56"
9027 local testfile=$DIR/$tfile
9031 echo "setfacl as user..."
9032 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
9033 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
9035 echo "setfattr as user..."
9036 setfacl -m "u:$RUNAS_ID:---" $testfile
9037 $RUNAS setfattr -x system.posix_acl_access $testfile
9038 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
9040 run_test 102p "check setxattr(2) correctly fails without permission"
9043 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
9044 skip "MDS needs to be at least 2.6.92"
9046 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
9048 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
9051 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
9052 skip "MDS needs to be at least 2.6.93"
9054 touch $DIR/$tfile || error "touch"
9055 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
9056 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
9057 rm $DIR/$tfile || error "rm"
9060 mkdir -p $DIR/$tdir || error "mkdir"
9061 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9062 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9063 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9064 error "$testfile error deleting user.author1"
9065 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9066 grep "user.$(basename $tdir)" &&
9067 error "$tdir did not delete user.$(basename $tdir)"
9068 rmdir $DIR/$tdir || error "rmdir"
9071 test_mkdir $DIR/$tdir
9072 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9073 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9074 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9075 error "$testfile error deleting user.author1"
9076 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9077 grep "user.$(basename $tdir)" &&
9078 error "$tdir did not delete user.$(basename $tdir)"
9079 rmdir $DIR/$tdir || error "rm striped dir"
9081 run_test 102r "set EAs with empty values"
9084 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9085 skip "MDS needs to be at least 2.11.52"
9087 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9089 save_lustre_params client "llite.*.xattr_cache" > $save
9091 for cache in 0 1; do
9092 lctl set_param llite.*.xattr_cache=$cache
9095 touch $DIR/$tfile || error "touch"
9096 for prefix in lustre security system trusted user; do
9097 # Note getxattr() may fail with 'Operation not
9098 # supported' or 'No such attribute' depending
9099 # on prefix and cache.
9100 getfattr -n $prefix.n102s $DIR/$tfile &&
9101 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
9105 restore_lustre_params < $save
9107 run_test 102s "getting nonexistent xattrs should fail"
9110 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9111 skip "MDS needs to be at least 2.11.52"
9113 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9115 save_lustre_params client "llite.*.xattr_cache" > $save
9117 for cache in 0 1; do
9118 lctl set_param llite.*.xattr_cache=$cache
9120 for buf_size in 0 256; do
9122 touch $DIR/$tfile || error "touch"
9123 setfattr -n user.multiop $DIR/$tfile
9124 $MULTIOP $DIR/$tfile oa$buf_size ||
9125 error "cannot get zero length xattr value (buf_size = $buf_size)"
9129 restore_lustre_params < $save
9131 run_test 102t "zero length xattr values handled correctly"
9135 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
9140 [ "$UID" != 0 ] && skip "must run as root"
9141 $GSS && skip_env "could not run under gss"
9142 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
9143 skip_env "must have acl enabled"
9144 [ -z "$(which setfacl 2>/dev/null)" ] &&
9145 skip_env "could not find setfacl"
9146 remote_mds_nodsh && skip "remote MDS with nodsh"
9148 gpasswd -a daemon bin # LU-5641
9149 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
9151 declare -a identity_old
9153 for num in $(seq $MDSCOUNT); do
9154 switch_identity $num true || identity_old[$num]=$?
9162 echo "performing cp ..."
9163 run_acl_subtest cp || error "run_acl_subtest cp failed"
9164 echo "performing getfacl-noacl..."
9165 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
9166 echo "performing misc..."
9167 run_acl_subtest misc || error "misc test failed"
9168 echo "performing permissions..."
9169 run_acl_subtest permissions || error "permissions failed"
9170 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
9171 if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] ||
9172 { [ $MDS1_VERSION -lt $(version_code 2.6) ] &&
9173 [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; }
9175 echo "performing permissions xattr..."
9176 run_acl_subtest permissions_xattr ||
9177 error "permissions_xattr failed"
9179 echo "performing setfacl..."
9180 run_acl_subtest setfacl || error "setfacl test failed"
9182 # inheritance test got from HP
9183 echo "performing inheritance..."
9184 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
9185 chmod +x make-tree || error "chmod +x failed"
9186 run_acl_subtest inheritance || error "inheritance test failed"
9189 echo "LU-974 ignore umask when acl is enabled..."
9190 run_acl_subtest 974 || error "LU-974 umask test failed"
9191 if [ $MDSCOUNT -ge 2 ]; then
9192 run_acl_subtest 974_remote ||
9193 error "LU-974 umask test failed under remote dir"
9196 echo "LU-2561 newly created file is same size as directory..."
9197 if [ "$mds1_FSTYPE" != "zfs" ]; then
9198 run_acl_subtest 2561 || error "LU-2561 test failed"
9200 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
9203 run_acl_subtest 4924 || error "LU-4924 test failed"
9208 for num in $(seq $MDSCOUNT); do
9209 if [ "${identity_old[$num]}" = 1 ]; then
9210 switch_identity $num false || identity_old[$num]=$?
9214 run_test 103a "acl test"
9220 for U in {0..511}; do
9222 local O=$(printf "%04o" $U)
9224 umask $(printf "%04o" $((511 ^ $O)))
9225 $LFS setstripe -c 1 $DIR/$tfile.s$O
9226 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
9228 (( $S == ($O & 0666) )) ||
9229 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
9231 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
9232 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
9233 (( $S == ($O & 0666) )) ||
9234 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
9236 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
9237 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
9238 (( $S == ($O & 0666) )) ||
9239 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
9240 rm -f $DIR/$tfile.[smp]$0
9244 # limit the concurrently running threads to 64. LU-11878
9245 local idx=$((U % 64))
9246 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
9251 run_test 103b "umask lfs setstripe"
9255 cp -rp $DIR/$tdir $DIR/$tdir.bak
9257 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
9258 error "$DIR/$tdir shouldn't contain default ACL"
9259 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
9260 error "$DIR/$tdir.bak shouldn't contain default ACL"
9263 run_test 103c "'cp -rp' won't set empty acl"
9266 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9269 lfs df || error "lfs df failed"
9270 lfs df -ih || error "lfs df -ih failed"
9271 lfs df -h $DIR || error "lfs df -h $DIR failed"
9272 lfs df -i $DIR || error "lfs df -i $DIR failed"
9273 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
9274 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
9276 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
9277 lctl --device %$OSC deactivate
9278 lfs df || error "lfs df with deactivated OSC failed"
9279 lctl --device %$OSC activate
9280 # wait the osc back to normal
9281 wait_osc_import_ready client ost
9283 lfs df || error "lfs df with reactivated OSC failed"
9286 run_test 104a "lfs df [-ih] [path] test ========================="
9289 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9290 [ $RUNAS_ID -eq $UID ] &&
9291 skip_env "RUNAS_ID = UID = $UID -- skipping"
9293 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
9294 grep "Permission denied" | wc -l)))
9295 if [ $denied_cnt -ne 0 ]; then
9296 error "lfs check servers test failed"
9299 run_test 104b "$RUNAS lfs check servers test ===================="
9302 # doesn't work on 2.4 kernels
9304 if $(flock_is_enabled); then
9305 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
9307 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
9311 run_test 105a "flock when mounted without -o flock test ========"
9315 if $(flock_is_enabled); then
9316 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
9318 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
9322 run_test 105b "fcntl when mounted without -o flock test ========"
9326 if $(flock_is_enabled); then
9327 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
9329 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
9333 run_test 105c "lockf when mounted without -o flock test"
9335 test_105d() { # bug 15924
9336 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9338 test_mkdir $DIR/$tdir
9339 flock_is_enabled || skip_env "mount w/o flock enabled"
9340 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
9341 $LCTL set_param fail_loc=0x80000315
9342 flocks_test 2 $DIR/$tdir
9344 run_test 105d "flock race (should not freeze) ========"
9346 test_105e() { # bug 22660 && 22040
9347 flock_is_enabled || skip_env "mount w/o flock enabled"
9350 flocks_test 3 $DIR/$tfile
9352 run_test 105e "Two conflicting flocks from same process"
9354 test_106() { #bug 10921
9355 test_mkdir $DIR/$tdir
9356 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9357 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9359 run_test 106 "attempt exec of dir followed by chown of that dir"
9362 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9370 local save_pattern=$(sysctl -n kernel.core_pattern)
9371 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9372 sysctl -w kernel.core_pattern=$file
9373 sysctl -w kernel.core_uses_pid=0
9381 kill -s 11 $SLEEPPID
9383 if [ -e $file ]; then
9384 size=`stat -c%s $file`
9385 [ $size -eq 0 ] && error "Fail to create core file $file"
9387 error "Fail to create core file $file"
9390 sysctl -w kernel.core_pattern=$save_pattern
9391 sysctl -w kernel.core_uses_pid=$save_uses_pid
9394 run_test 107 "Coredump on SIG"
9397 test_mkdir $DIR/$tdir
9398 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9399 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9400 error "mkdir with 256 char should fail, but did not"
9401 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9402 error "create with 255 char failed"
9403 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9404 error "create with 256 char should fail, but did not"
9409 run_test 110 "filename length checking"
9412 # Purpose: To verify dynamic thread (OSS) creation.
9415 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9416 remote_ost_nodsh && skip "remote OST with nodsh"
9418 # Lustre does not stop service threads once they are started.
9419 # Reset number of running threads to default.
9424 local save_params="$TMP/sanity-$TESTNAME.parameters"
9426 # Get ll_ost_io count before I/O
9427 OSTIO_pre=$(do_facet ost1 \
9428 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9429 # Exit if lustre is not running (ll_ost_io not running).
9430 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9432 echo "Starting with $OSTIO_pre threads"
9433 local thread_max=$((OSTIO_pre * 2))
9434 local rpc_in_flight=$((thread_max * 2))
9435 # Number of I/O Process proposed to be started.
9437 local facets=$(get_facets OST)
9439 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9440 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9442 # Set in_flight to $rpc_in_flight
9443 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9444 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9445 nfiles=${rpc_in_flight}
9446 # Set ost thread_max to $thread_max
9447 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9449 # 5 Minutes should be sufficient for max number of OSS
9450 # threads(thread_max) to be created.
9454 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9455 test_mkdir $DIR/$tdir
9456 for i in $(seq $nfiles); do
9457 local file=$DIR/$tdir/${tfile}-$i
9458 $LFS setstripe -c -1 -i 0 $file
9459 ($WTL $file $timeout)&
9462 # I/O Started - Wait for thread_started to reach thread_max or report
9463 # error if thread_started is more than thread_max.
9464 echo "Waiting for thread_started to reach thread_max"
9465 local thread_started=0
9466 local end_time=$((SECONDS + timeout))
9468 while [ $SECONDS -le $end_time ] ; do
9470 # Get ost i/o thread_started count.
9471 thread_started=$(do_facet ost1 \
9473 ost.OSS.ost_io.threads_started | cut -d= -f2")
9474 # Break out if thread_started is equal/greater than thread_max
9475 if [[ $thread_started -ge $thread_max ]]; then
9476 echo ll_ost_io thread_started $thread_started, \
9477 equal/greater than thread_max $thread_max
9483 # Cleanup - We have the numbers, Kill i/o jobs if running.
9484 jobcount=($(jobs -p))
9485 for i in $(seq 0 $((${#jobcount[@]}-1)))
9487 kill -9 ${jobcount[$i]}
9488 if [ $? -ne 0 ] ; then
9490 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
9494 # Cleanup files left by WTL binary.
9495 for i in $(seq $nfiles); do
9496 local file=$DIR/$tdir/${tfile}-$i
9498 if [ $? -ne 0 ] ; then
9499 echo "Warning: Failed to delete file $file"
9503 restore_lustre_params <$save_params
9504 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
9506 # Error out if no new thread has started or Thread started is greater
9508 if [[ $thread_started -le $OSTIO_pre ||
9509 $thread_started -gt $thread_max ]]; then
9510 error "ll_ost_io: thread_started $thread_started" \
9511 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
9512 "No new thread started or thread started greater " \
9516 run_test 115 "verify dynamic thread creation===================="
9519 wait_delete_completed
9520 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
9521 echo "OST kbytes available: ${AVAIL[@]}"
9526 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
9527 #echo OST $i: ${AVAIL[i]}kb
9528 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
9532 if [[ ${AVAIL[i]} -lt $MINV ]]; then
9537 echo "Min free space: OST $MINI: $MINV"
9538 echo "Max free space: OST $MAXI: $MAXV"
9541 test_116a() { # was previously test_116()
9542 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9543 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9544 remote_mds_nodsh && skip "remote MDS with nodsh"
9546 echo -n "Free space priority "
9547 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
9552 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
9553 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
9554 trap simple_cleanup_common EXIT
9556 # Check if we need to generate uneven OSTs
9557 test_mkdir -p $DIR/$tdir/OST${MINI}
9558 local FILL=$((MINV / 4))
9559 local DIFF=$((MAXV - MINV))
9560 local DIFF2=$((DIFF * 100 / MINV))
9562 local threshold=$(do_facet $SINGLEMDS \
9563 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
9564 threshold=${threshold%%%}
9565 echo -n "Check for uneven OSTs: "
9566 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
9568 if [[ $DIFF2 -gt $threshold ]]; then
9570 echo "Don't need to fill OST$MINI"
9572 # generate uneven OSTs. Write 2% over the QOS threshold value
9574 DIFF=$((threshold - DIFF2 + 2))
9575 DIFF2=$((MINV * DIFF / 100))
9576 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
9577 $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
9578 error "setstripe failed"
9579 DIFF=$((DIFF2 / 2048))
9581 while [ $i -lt $DIFF ]; do
9583 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
9584 bs=2M count=1 2>/dev/null
9593 DIFF=$((MAXV - MINV))
9594 DIFF2=$((DIFF * 100 / MINV))
9595 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
9596 if [ $DIFF2 -gt $threshold ]; then
9599 echo "failed - QOS mode won't be used"
9600 simple_cleanup_common
9601 skip "QOS imbalance criteria not met"
9609 # now fill using QOS
9610 $SETSTRIPE -c 1 $DIR/$tdir
9611 FILL=$((FILL / 200))
9612 if [ $FILL -gt 600 ]; then
9615 echo "writing $FILL files to QOS-assigned OSTs"
9617 while [ $i -lt $FILL ]; do
9619 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
9623 echo "wrote $i 200k files"
9627 echo "Note: free space may not be updated, so measurements might be off"
9629 DIFF2=$((MAXV - MINV))
9630 echo "free space delta: orig $DIFF final $DIFF2"
9631 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
9632 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
9633 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
9634 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
9635 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
9636 if [[ $DIFF -gt 0 ]]; then
9637 FILL=$((DIFF2 * 100 / DIFF - 100))
9638 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
9641 # Figure out which files were written where
9642 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9643 awk '/'$MINI1': / {print $2; exit}')
9645 MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9646 echo "$MINC files created on smaller OST $MINI1"
9647 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9648 awk '/'$MAXI1': / {print $2; exit}')
9650 MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9651 echo "$MAXC files created on larger OST $MAXI1"
9652 if [[ $MINC -gt 0 ]]; then
9653 FILL=$((MAXC * 100 / MINC - 100))
9654 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
9656 [[ $MAXC -gt $MINC ]] ||
9657 error_ignore LU-9 "stripe QOS didn't balance free space"
9658 simple_cleanup_common
9660 run_test 116a "stripe QOS: free space balance ==================="
9662 test_116b() { # LU-2093
9663 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9664 remote_mds_nodsh && skip "remote MDS with nodsh"
9666 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
9667 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
9668 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
9669 [ -z "$old_rr" ] && skip "no QOS"
9670 do_facet $SINGLEMDS lctl set_param \
9671 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
9673 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
9674 createmany -o $DIR/$tdir/f- 20 || error "can't create"
9675 do_facet $SINGLEMDS lctl set_param fail_loc=0
9677 do_facet $SINGLEMDS lctl set_param \
9678 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
9680 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
9682 test_117() # bug 10891
9684 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9686 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
9687 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
9688 lctl set_param fail_loc=0x21e
9689 > $DIR/$tfile || error "truncate failed"
9690 lctl set_param fail_loc=0
9691 echo "Truncate succeeded."
9694 run_test 117 "verify osd extend =========="
9696 NO_SLOW_RESENDCOUNT=4
9697 export OLD_RESENDCOUNT=""
9698 set_resend_count () {
9699 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
9700 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
9701 lctl set_param -n $PROC_RESENDCOUNT $1
9702 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
9705 # for reduce test_118* time (b=14842)
9706 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9708 # Reset async IO behavior after error case
9710 FILE=$DIR/reset_async
9712 # Ensure all OSCs are cleared
9713 $SETSTRIPE -c -1 $FILE
9714 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
9719 test_118a() #bug 11710
9721 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9725 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9726 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9727 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9729 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9730 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9735 run_test 118a "verify O_SYNC works =========="
9739 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9740 remote_ost_nodsh && skip "remote OST with nodsh"
9744 #define OBD_FAIL_SRV_ENOENT 0x217
9745 set_nodes_failloc "$(osts_nodes)" 0x217
9746 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9748 set_nodes_failloc "$(osts_nodes)" 0
9749 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9750 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9753 if [[ $RC -eq 0 ]]; then
9754 error "Must return error due to dropped pages, rc=$RC"
9758 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9759 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9763 echo "Dirty pages not leaked on ENOENT"
9765 # Due to the above error the OSC will issue all RPCs syncronously
9766 # until a subsequent RPC completes successfully without error.
9767 $MULTIOP $DIR/$tfile Ow4096yc
9772 run_test 118b "Reclaim dirty pages on fatal error =========="
9776 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9778 # for 118c, restore the original resend count, LU-1940
9779 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
9780 set_resend_count $OLD_RESENDCOUNT
9781 remote_ost_nodsh && skip "remote OST with nodsh"
9785 #define OBD_FAIL_OST_EROFS 0x216
9786 set_nodes_failloc "$(osts_nodes)" 0x216
9788 # multiop should block due to fsync until pages are written
9789 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9793 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9794 error "Multiop failed to block on fsync, pid=$MULTIPID"
9797 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9799 if [[ $WRITEBACK -eq 0 ]]; then
9800 error "No page in writeback, writeback=$WRITEBACK"
9803 set_nodes_failloc "$(osts_nodes)" 0
9806 if [[ $RC -ne 0 ]]; then
9807 error "Multiop fsync failed, rc=$RC"
9810 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9811 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9813 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9814 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9818 echo "Dirty pages flushed via fsync on EROFS"
9821 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
9823 # continue to use small resend count to reduce test_118* time (b=14842)
9824 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9828 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9829 remote_ost_nodsh && skip "remote OST with nodsh"
9833 #define OBD_FAIL_OST_BRW_PAUSE_BULK
9834 set_nodes_failloc "$(osts_nodes)" 0x214
9835 # multiop should block due to fsync until pages are written
9836 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9840 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9841 error "Multiop failed to block on fsync, pid=$MULTIPID"
9844 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9846 if [[ $WRITEBACK -eq 0 ]]; then
9847 error "No page in writeback, writeback=$WRITEBACK"
9850 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
9851 set_nodes_failloc "$(osts_nodes)" 0
9853 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9854 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9856 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9857 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9861 echo "Dirty pages gaurenteed flushed via fsync"
9864 run_test 118d "Fsync validation inject a delay of the bulk =========="
9867 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9871 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
9872 lctl set_param fail_loc=0x8000040a
9874 # Should simulate EINVAL error which is fatal
9875 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9877 if [[ $RC -eq 0 ]]; then
9878 error "Must return error due to dropped pages, rc=$RC"
9881 lctl set_param fail_loc=0x0
9883 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9884 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9885 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9887 if [[ $LOCKED -ne 0 ]]; then
9888 error "Locked pages remain in cache, locked=$LOCKED"
9891 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9892 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9896 echo "No pages locked after fsync"
9901 run_test 118f "Simulate unrecoverable OSC side error =========="
9904 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9908 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
9909 lctl set_param fail_loc=0x406
9911 # simulate local -ENOMEM
9912 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9915 lctl set_param fail_loc=0
9916 if [[ $RC -eq 0 ]]; then
9917 error "Must return error due to dropped pages, rc=$RC"
9920 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9921 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9922 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9924 if [[ $LOCKED -ne 0 ]]; then
9925 error "Locked pages remain in cache, locked=$LOCKED"
9928 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9929 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9933 echo "No pages locked after fsync"
9938 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
9941 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9942 remote_ost_nodsh && skip "remote OST with nodsh"
9946 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9947 set_nodes_failloc "$(osts_nodes)" 0x20e
9948 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9949 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9952 set_nodes_failloc "$(osts_nodes)" 0
9953 if [[ $RC -eq 0 ]]; then
9954 error "Must return error due to dropped pages, rc=$RC"
9957 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9958 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9959 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9961 if [[ $LOCKED -ne 0 ]]; then
9962 error "Locked pages remain in cache, locked=$LOCKED"
9965 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9966 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9970 echo "No pages locked after fsync"
9974 run_test 118h "Verify timeout in handling recoverables errors =========="
9976 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
9979 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9980 remote_ost_nodsh && skip "remote OST with nodsh"
9984 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9985 set_nodes_failloc "$(osts_nodes)" 0x20e
9987 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9988 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9991 set_nodes_failloc "$(osts_nodes)" 0
9995 if [[ $RC -ne 0 ]]; then
9996 error "got error, but should be not, rc=$RC"
9999 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10000 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10001 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10002 if [[ $LOCKED -ne 0 ]]; then
10003 error "Locked pages remain in cache, locked=$LOCKED"
10006 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10007 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10011 echo "No pages locked after fsync"
10015 run_test 118i "Fix error before timeout in recoverable error =========="
10017 [ "$SLOW" = "no" ] && set_resend_count 4
10020 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10021 remote_ost_nodsh && skip "remote OST with nodsh"
10025 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
10026 set_nodes_failloc "$(osts_nodes)" 0x220
10028 # return -EIO from OST
10029 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10031 set_nodes_failloc "$(osts_nodes)" 0x0
10032 if [[ $RC -eq 0 ]]; then
10033 error "Must return error due to dropped pages, rc=$RC"
10036 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10037 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10038 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10039 if [[ $LOCKED -ne 0 ]]; then
10040 error "Locked pages remain in cache, locked=$LOCKED"
10043 # in recoverable error on OST we want resend and stay until it finished
10044 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10045 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10049 echo "No pages locked after fsync"
10053 run_test 118j "Simulate unrecoverable OST side error =========="
10057 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10058 remote_ost_nodsh && skip "remote OSTs with nodsh"
10060 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10061 set_nodes_failloc "$(osts_nodes)" 0x20e
10062 test_mkdir $DIR/$tdir
10064 for ((i=0;i<10;i++)); do
10065 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
10066 error "dd to $DIR/$tdir/$tfile-$i failed" )&
10073 set_nodes_failloc "$(osts_nodes)" 0
10076 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
10078 test_118l() # LU-646
10080 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10082 test_mkdir $DIR/$tdir
10083 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
10086 run_test 118l "fsync dir"
10088 test_118m() # LU-3066
10090 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10092 test_mkdir $DIR/$tdir
10093 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
10096 run_test 118m "fdatasync dir ========="
10098 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10105 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10106 remote_ost_nodsh && skip "remote OSTs with nodsh"
10108 # Sleep to avoid a cached response.
10109 #define OBD_STATFS_CACHE_SECONDS 1
10112 # Inject a 10 second delay in the OST_STATFS handler.
10113 #define OBD_FAIL_OST_STATFS_DELAY 0x242
10114 set_nodes_failloc "$(osts_nodes)" 0x242
10117 stat --file-system $MOUNT > /dev/null
10120 set_nodes_failloc "$(osts_nodes)" 0
10122 if ((end - begin > 20)); then
10123 error "statfs took $((end - begin)) seconds, expected 10"
10126 run_test 118n "statfs() sends OST_STATFS requests in parallel"
10128 test_119a() # bug 11737
10130 BSIZE=$((512 * 1024))
10131 directio write $DIR/$tfile 0 1 $BSIZE
10132 # We ask to read two blocks, which is more than a file size.
10133 # directio will indicate an error when requested and actual
10134 # sizes aren't equeal (a normal situation in this case) and
10135 # print actual read amount.
10136 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
10137 if [ "$NOB" != "$BSIZE" ]; then
10138 error "read $NOB bytes instead of $BSIZE"
10142 run_test 119a "Short directIO read must return actual read amount"
10144 test_119b() # bug 11737
10146 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10148 $SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed"
10149 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
10151 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
10152 error "direct read failed"
10155 run_test 119b "Sparse directIO read must return actual read amount"
10157 test_119c() # bug 13099
10160 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
10161 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
10164 run_test 119c "Testing for direct read hitting hole"
10166 test_119d() # bug 15950
10168 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10170 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
10171 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
10173 $SETSTRIPE $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
10174 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
10175 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
10176 lctl set_param fail_loc=0x40d
10177 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
10180 cat $DIR/$tfile > /dev/null &
10181 lctl set_param fail_loc=0
10184 log "the DIO writes have completed, now wait for the reads (should not block very long)"
10186 [ -n "`ps h -p $pid_reads -o comm`" ] && \
10187 error "the read rpcs have not completed in 2s"
10189 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
10191 run_test 119d "The DIO path should try to send a new rpc once one is completed"
10194 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10195 remote_mds_nodsh && skip "remote MDS with nodsh"
10196 test_mkdir $DIR/$tdir
10197 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10198 skip_env "no early lock cancel on server"
10200 lru_resize_disable mdc
10201 lru_resize_disable osc
10202 cancel_lru_locks mdc
10203 # asynchronous object destroy at MDT could cause bl ast to client
10204 cancel_lru_locks osc
10206 stat $DIR/$tdir > /dev/null
10207 can1=$(do_facet $SINGLEMDS \
10208 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10209 awk '/ldlm_cancel/ {print $2}')
10210 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10211 awk '/ldlm_bl_callback/ {print $2}')
10212 test_mkdir -c1 $DIR/$tdir/d1
10213 can2=$(do_facet $SINGLEMDS \
10214 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10215 awk '/ldlm_cancel/ {print $2}')
10216 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10217 awk '/ldlm_bl_callback/ {print $2}')
10218 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10219 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10220 lru_resize_enable mdc
10221 lru_resize_enable osc
10223 run_test 120a "Early Lock Cancel: mkdir test"
10226 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10227 remote_mds_nodsh && skip "remote MDS with nodsh"
10228 test_mkdir $DIR/$tdir
10229 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10230 skip_env "no early lock cancel on server"
10232 lru_resize_disable mdc
10233 lru_resize_disable osc
10234 cancel_lru_locks mdc
10235 stat $DIR/$tdir > /dev/null
10236 can1=$(do_facet $SINGLEMDS \
10237 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10238 awk '/ldlm_cancel/ {print $2}')
10239 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10240 awk '/ldlm_bl_callback/ {print $2}')
10241 touch $DIR/$tdir/f1
10242 can2=$(do_facet $SINGLEMDS \
10243 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10244 awk '/ldlm_cancel/ {print $2}')
10245 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10246 awk '/ldlm_bl_callback/ {print $2}')
10247 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10248 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10249 lru_resize_enable mdc
10250 lru_resize_enable osc
10252 run_test 120b "Early Lock Cancel: create test"
10255 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10256 remote_mds_nodsh && skip "remote MDS with nodsh"
10257 test_mkdir -c1 $DIR/$tdir
10258 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10259 skip "no early lock cancel on server"
10261 lru_resize_disable mdc
10262 lru_resize_disable osc
10263 test_mkdir -c1 $DIR/$tdir/d1
10264 test_mkdir -c1 $DIR/$tdir/d2
10265 touch $DIR/$tdir/d1/f1
10266 cancel_lru_locks mdc
10267 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
10268 can1=$(do_facet $SINGLEMDS \
10269 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10270 awk '/ldlm_cancel/ {print $2}')
10271 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10272 awk '/ldlm_bl_callback/ {print $2}')
10273 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10274 can2=$(do_facet $SINGLEMDS \
10275 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10276 awk '/ldlm_cancel/ {print $2}')
10277 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10278 awk '/ldlm_bl_callback/ {print $2}')
10279 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10280 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10281 lru_resize_enable mdc
10282 lru_resize_enable osc
10284 run_test 120c "Early Lock Cancel: link test"
10287 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10288 remote_mds_nodsh && skip "remote MDS with nodsh"
10289 test_mkdir -c1 $DIR/$tdir
10290 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10291 skip_env "no early lock cancel on server"
10293 lru_resize_disable mdc
10294 lru_resize_disable osc
10296 cancel_lru_locks mdc
10297 stat $DIR/$tdir > /dev/null
10298 can1=$(do_facet $SINGLEMDS \
10299 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10300 awk '/ldlm_cancel/ {print $2}')
10301 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10302 awk '/ldlm_bl_callback/ {print $2}')
10303 chmod a+x $DIR/$tdir
10304 can2=$(do_facet $SINGLEMDS \
10305 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10306 awk '/ldlm_cancel/ {print $2}')
10307 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10308 awk '/ldlm_bl_callback/ {print $2}')
10309 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10310 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10311 lru_resize_enable mdc
10312 lru_resize_enable osc
10314 run_test 120d "Early Lock Cancel: setattr test"
10317 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10318 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10319 skip_env "no early lock cancel on server"
10320 remote_mds_nodsh && skip "remote MDS with nodsh"
10322 local dlmtrace_set=false
10324 test_mkdir -c1 $DIR/$tdir
10325 lru_resize_disable mdc
10326 lru_resize_disable osc
10327 ! $LCTL get_param debug | grep -q dlmtrace &&
10328 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
10329 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
10330 cancel_lru_locks mdc
10331 cancel_lru_locks osc
10332 dd if=$DIR/$tdir/f1 of=/dev/null
10333 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
10334 # XXX client can not do early lock cancel of OST lock
10335 # during unlink (LU-4206), so cancel osc lock now.
10337 cancel_lru_locks osc
10338 can1=$(do_facet $SINGLEMDS \
10339 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10340 awk '/ldlm_cancel/ {print $2}')
10341 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10342 awk '/ldlm_bl_callback/ {print $2}')
10343 unlink $DIR/$tdir/f1
10345 can2=$(do_facet $SINGLEMDS \
10346 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10347 awk '/ldlm_cancel/ {print $2}')
10348 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10349 awk '/ldlm_bl_callback/ {print $2}')
10350 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10351 $LCTL dk $TMP/cancel.debug.txt
10352 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10353 $LCTL dk $TMP/blocking.debug.txt
10354 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10355 lru_resize_enable mdc
10356 lru_resize_enable osc
10358 run_test 120e "Early Lock Cancel: unlink test"
10361 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10362 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10363 skip_env "no early lock cancel on server"
10364 remote_mds_nodsh && skip "remote MDS with nodsh"
10366 test_mkdir -c1 $DIR/$tdir
10367 lru_resize_disable mdc
10368 lru_resize_disable osc
10369 test_mkdir -c1 $DIR/$tdir/d1
10370 test_mkdir -c1 $DIR/$tdir/d2
10371 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10372 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10373 cancel_lru_locks mdc
10374 cancel_lru_locks osc
10375 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10376 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10377 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10378 # XXX client can not do early lock cancel of OST lock
10379 # during rename (LU-4206), so cancel osc lock now.
10381 cancel_lru_locks osc
10382 can1=$(do_facet $SINGLEMDS \
10383 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10384 awk '/ldlm_cancel/ {print $2}')
10385 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10386 awk '/ldlm_bl_callback/ {print $2}')
10387 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10389 can2=$(do_facet $SINGLEMDS \
10390 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10391 awk '/ldlm_cancel/ {print $2}')
10392 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10393 awk '/ldlm_bl_callback/ {print $2}')
10394 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10395 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10396 lru_resize_enable mdc
10397 lru_resize_enable osc
10399 run_test 120f "Early Lock Cancel: rename test"
10402 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10403 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10404 skip_env "no early lock cancel on server"
10405 remote_mds_nodsh && skip "remote MDS with nodsh"
10407 lru_resize_disable mdc
10408 lru_resize_disable osc
10410 echo create $count files
10411 test_mkdir $DIR/$tdir
10412 cancel_lru_locks mdc
10413 cancel_lru_locks osc
10416 can0=$(do_facet $SINGLEMDS \
10417 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10418 awk '/ldlm_cancel/ {print $2}')
10419 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10420 awk '/ldlm_bl_callback/ {print $2}')
10421 createmany -o $DIR/$tdir/f $count
10423 can1=$(do_facet $SINGLEMDS \
10424 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10425 awk '/ldlm_cancel/ {print $2}')
10426 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10427 awk '/ldlm_bl_callback/ {print $2}')
10429 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10430 echo rm $count files
10433 can2=$(do_facet $SINGLEMDS \
10434 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10435 awk '/ldlm_cancel/ {print $2}')
10436 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10437 awk '/ldlm_bl_callback/ {print $2}')
10439 echo total: $count removes in $((t2-t1))
10440 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10442 # wait for commitment of removal
10443 lru_resize_enable mdc
10444 lru_resize_enable osc
10446 run_test 120g "Early Lock Cancel: performance test"
10448 test_121() { #bug #10589
10449 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10452 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10453 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10454 lctl set_param fail_loc=0x310
10455 cancel_lru_locks osc > /dev/null
10456 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10457 lctl set_param fail_loc=0
10458 [[ $reads -eq $writes ]] ||
10459 error "read $reads blocks, must be $writes blocks"
10461 run_test 121 "read cancel race ========="
10463 test_123a() { # was test 123, statahead(bug 11401)
10464 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10467 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10468 log "testing UP system. Performance may be lower than expected."
10473 test_mkdir $DIR/$tdir
10474 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10475 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10477 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10478 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10480 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10481 lctl set_param -n llite.*.statahead_max 0
10482 lctl get_param llite.*.statahead_max
10483 cancel_lru_locks mdc
10484 cancel_lru_locks osc
10486 time ls -l $DIR/$tdir | wc -l
10488 delta=$((etime - stime))
10489 log "ls $i files without statahead: $delta sec"
10490 lctl set_param llite.*.statahead_max=$max
10492 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10493 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
10494 cancel_lru_locks mdc
10495 cancel_lru_locks osc
10497 time ls -l $DIR/$tdir | wc -l
10499 delta_sa=$((etime - stime))
10500 log "ls $i files with statahead: $delta_sa sec"
10501 lctl get_param -n llite.*.statahead_stats
10502 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10504 [[ $swrong -lt $ewrong ]] &&
10505 log "statahead was stopped, maybe too many locks held!"
10506 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
10508 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10509 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10510 lctl set_param -n llite.*.statahead_max 0
10511 lctl get_param llite.*.statahead_max
10512 cancel_lru_locks mdc
10513 cancel_lru_locks osc
10515 time ls -l $DIR/$tdir | wc -l
10517 delta=$((etime - stime))
10518 log "ls $i files again without statahead: $delta sec"
10519 lctl set_param llite.*.statahead_max=$max
10520 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10521 if [ $SLOWOK -eq 0 ]; then
10522 error "ls $i files is slower with statahead!"
10524 log "ls $i files is slower with statahead!"
10530 [ $delta -gt 20 ] && break
10531 [ $delta -gt 8 ] && MULT=$((50 / delta))
10532 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
10540 delta=$((etime - stime))
10541 log "rm -r $DIR/$tdir/: $delta seconds"
10543 lctl get_param -n llite.*.statahead_stats
10545 run_test 123a "verify statahead work"
10547 test_123b () { # statahead(bug 15027)
10548 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10550 test_mkdir $DIR/$tdir
10551 createmany -o $DIR/$tdir/$tfile-%d 1000
10553 cancel_lru_locks mdc
10554 cancel_lru_locks osc
10556 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
10557 lctl set_param fail_loc=0x80000803
10558 ls -lR $DIR/$tdir > /dev/null
10560 lctl set_param fail_loc=0x0
10561 lctl get_param -n llite.*.statahead_stats
10566 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
10569 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
10571 test_mkdir -i 0 -c 1 $DIR/$tdir.0
10572 test_mkdir -i 1 -c 1 $DIR/$tdir.1
10573 touch $DIR/$tdir.1/{1..3}
10574 mv $DIR/$tdir.1/{1..3} $DIR/$tdir.0
10576 remount_client $MOUNT
10578 $MULTIOP $DIR/$tdir.0 Q
10580 # let statahead to complete
10581 ls -l $DIR/$tdir.0 > /dev/null
10583 testid=$(echo $TESTNAME | tr '_' ' ')
10584 dmesg | tac | sed "/$testid/,$ d" | grep "Can not initialize inode" &&
10585 error "statahead warning" || true
10587 run_test 123c "Can not initialize inode warning on DNE statahead"
10590 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10591 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10592 skip_env "no lru resize on server"
10596 test_mkdir $DIR/$tdir
10598 log "create $NR files at $DIR/$tdir"
10599 createmany -o $DIR/$tdir/f $NR ||
10600 error "failed to create $NR files in $DIR/$tdir"
10602 cancel_lru_locks mdc
10603 ls -l $DIR/$tdir > /dev/null
10607 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
10608 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
10609 LRU_SIZE=$($LCTL get_param -n $PARAM)
10610 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
10611 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
10613 log "NS=$(basename $NSDIR)"
10618 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
10619 skip "Not enough cached locks created!"
10621 log "LRU=$LRU_SIZE"
10625 # We know that lru resize allows one client to hold $LIMIT locks
10626 # for 10h. After that locks begin to be killed by client.
10628 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
10630 if [ $LIMIT -lt $LRU_SIZE ]; then
10631 skip "Limit is too small $LIMIT"
10634 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
10635 # killing locks. Some time was spent for creating locks. This means
10636 # that up to the moment of sleep finish we must have killed some of
10637 # them (10-100 locks). This depends on how fast ther were created.
10638 # Many of them were touched in almost the same moment and thus will
10639 # be killed in groups.
10640 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
10642 # Use $LRU_SIZE_B here to take into account real number of locks
10643 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
10644 local LRU_SIZE_B=$LRU_SIZE
10646 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
10647 log "OLD_LVF=$OLD_LVF"
10648 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
10650 # Let's make sure that we really have some margin. Client checks
10651 # cached locks every 10 sec.
10652 SLEEP=$((SLEEP+20))
10653 log "Sleep ${SLEEP} sec"
10655 while ((SEC<$SLEEP)); do
10659 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
10660 echo -n "$LRU_SIZE"
10663 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
10664 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
10666 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
10667 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
10668 unlinkmany $DIR/$tdir/f $NR
10672 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
10673 log "unlink $NR files at $DIR/$tdir"
10674 unlinkmany $DIR/$tdir/f $NR
10676 run_test 124a "lru resize ======================================="
10678 get_max_pool_limit()
10680 local limit=$($LCTL get_param \
10681 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
10683 for l in $limit; do
10684 if [[ $l -gt $max ]]; then
10692 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10693 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10694 skip_env "no lru resize on server"
10696 LIMIT=$(get_max_pool_limit)
10698 NR=$(($(default_lru_size)*20))
10699 if [[ $NR -gt $LIMIT ]]; then
10700 log "Limit lock number by $LIMIT locks"
10704 IFree=$(mdsrate_inodes_available)
10705 if [ $IFree -lt $NR ]; then
10706 log "Limit lock number by $IFree inodes"
10710 lru_resize_disable mdc
10711 test_mkdir -p $DIR/$tdir/disable_lru_resize
10713 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
10714 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
10715 cancel_lru_locks mdc
10718 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10721 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10724 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10728 nolruresize_delta=$((etime-stime))
10729 log "ls -la time: $nolruresize_delta seconds"
10730 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10731 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
10733 lru_resize_enable mdc
10734 test_mkdir -p $DIR/$tdir/enable_lru_resize
10736 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
10737 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
10738 cancel_lru_locks mdc
10741 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10744 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10747 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10751 lruresize_delta=$((etime-stime))
10752 log "ls -la time: $lruresize_delta seconds"
10753 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10755 if [ $lruresize_delta -gt $nolruresize_delta ]; then
10756 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
10757 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
10758 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
10760 log "lru resize performs the same with no lru resize"
10762 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
10764 run_test 124b "lru resize (performance test) ======================="
10767 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10768 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10769 skip_env "no lru resize on server"
10771 # cache ununsed locks on client
10773 cancel_lru_locks mdc
10774 test_mkdir $DIR/$tdir
10775 createmany -o $DIR/$tdir/f $nr ||
10776 error "failed to create $nr files in $DIR/$tdir"
10777 ls -l $DIR/$tdir > /dev/null
10779 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10780 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10781 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10782 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10783 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10785 # set lru_max_age to 1 sec
10786 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10787 echo "sleep $((recalc_p * 2)) seconds..."
10788 sleep $((recalc_p * 2))
10790 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10791 # restore lru_max_age
10792 $LCTL set_param -n $nsdir.lru_max_age $max_age
10793 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10794 unlinkmany $DIR/$tdir/f $nr
10796 run_test 124c "LRUR cancel very aged locks"
10799 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10800 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10801 skip_env "no lru resize on server"
10803 # cache ununsed locks on client
10806 lru_resize_disable mdc
10807 stack_trap "lru_resize_enable mdc" EXIT
10809 cancel_lru_locks mdc
10811 # asynchronous object destroy at MDT could cause bl ast to client
10812 test_mkdir $DIR/$tdir
10813 createmany -o $DIR/$tdir/f $nr ||
10814 error "failed to create $nr files in $DIR/$tdir"
10815 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
10817 ls -l $DIR/$tdir > /dev/null
10819 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10820 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10821 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10822 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10824 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10826 # set lru_max_age to 1 sec
10827 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10828 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
10830 echo "sleep $((recalc_p * 2)) seconds..."
10831 sleep $((recalc_p * 2))
10833 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10835 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10837 run_test 124d "cancel very aged locks if lru-resize diasbaled"
10839 test_125() { # 13358
10840 $LCTL get_param -n llite.*.client_type | grep -q local ||
10841 skip "must run as local client"
10842 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
10843 skip_env "must have acl enabled"
10844 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
10846 test_mkdir $DIR/$tdir
10847 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
10848 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
10849 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
10851 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
10853 test_126() { # bug 12829/13455
10854 $GSS && skip_env "must run as gss disabled"
10855 $LCTL get_param -n llite.*.client_type | grep -q local ||
10856 skip "must run as local client"
10857 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
10859 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
10860 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
10862 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
10864 run_test 126 "check that the fsgid provided by the client is taken into account"
10866 test_127a() { # bug 15521
10867 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10869 $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
10870 $LCTL set_param osc.*.stats=0
10871 FSIZE=$((2048 * 1024))
10872 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
10873 cancel_lru_locks osc
10874 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
10876 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
10877 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
10878 echo "got $COUNT $NAME"
10879 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
10880 eval $NAME=$COUNT || error "Wrong proc format"
10883 read_bytes|write_bytes)
10884 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
10885 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
10886 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
10887 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
10888 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
10889 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
10890 error "sumsquare is too small: $SUMSQ"
10891 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
10892 error "sumsquare is too big: $SUMSQ"
10896 done < $DIR/${tfile}.tmp
10898 #check that we actually got some stats
10899 [ "$read_bytes" ] || error "Missing read_bytes stats"
10900 [ "$write_bytes" ] || error "Missing write_bytes stats"
10901 [ "$read_bytes" != 0 ] || error "no read done"
10902 [ "$write_bytes" != 0 ] || error "no write done"
10904 run_test 127a "verify the client stats are sane"
10906 test_127b() { # bug LU-333
10907 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10908 local name count samp unit min max sum sumsq
10910 $LCTL set_param llite.*.stats=0
10912 # perform 2 reads and writes so MAX is different from SUM.
10913 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10914 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10915 cancel_lru_locks osc
10916 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10917 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10919 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
10920 while read name count samp unit min max sum sumsq; do
10921 echo "got $count $name"
10922 eval $name=$count || error "Wrong proc format"
10926 [ $count -ne 2 ] && error "count is not 2: $count"
10927 [ $min -ne $PAGE_SIZE ] &&
10928 error "min is not $PAGE_SIZE: $min"
10929 [ $max -ne $PAGE_SIZE ] &&
10930 error "max is incorrect: $max"
10931 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10932 error "sum is wrong: $sum"
10935 [ $count -ne 2 ] && error "count is not 2: $count"
10936 [ $min -ne $PAGE_SIZE ] &&
10937 error "min is not $PAGE_SIZE: $min"
10938 [ $max -ne $PAGE_SIZE ] &&
10939 error "max is incorrect: $max"
10940 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10941 error "sum is wrong: $sum"
10945 done < $TMP/$tfile.tmp
10947 #check that we actually got some stats
10948 [ "$read_bytes" ] || error "Missing read_bytes stats"
10949 [ "$write_bytes" ] || error "Missing write_bytes stats"
10950 [ "$read_bytes" != 0 ] || error "no read done"
10951 [ "$write_bytes" != 0 ] || error "no write done"
10953 rm -f $TMP/${tfile}.tmp
10955 run_test 127b "verify the llite client stats are sane"
10957 test_127c() { # LU-12394
10958 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
10965 $LCTL set_param llite.*.extents_stats=1
10966 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
10968 # Use two stripes so there is enough space in default config
10969 $LFS setstripe -c 2 $DIR/$tfile
10971 # Extent stats start at 0-4K and go in power of two buckets
10972 # LL_HIST_START = 12 --> 2^12 = 4K
10973 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
10974 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
10976 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
10978 # Write and read, 2x each, second time at a non-zero offset
10979 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
10980 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
10981 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
10982 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
10986 $LCTL get_param llite.*.extents_stats
10989 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
10991 local bucket=$($LCTL get_param -n llite.*.extents_stats |
10993 reads=$(echo $bucket | awk '{print $5}')
10994 writes=$(echo $bucket | awk '{print $9}')
10995 [ "$reads" -eq $count ] ||
10996 error "$reads reads in < $bsize bucket, expect $count"
10997 [ "$writes" -eq $count ] ||
10998 error "$writes writes in < $bsize bucket, expect $count"
11001 # Test mmap write and read
11002 $LCTL set_param llite.*.extents_stats=c
11004 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
11005 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
11006 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
11008 $LCTL get_param llite.*.extents_stats
11010 count=$(((size*1024) / PAGE_SIZE))
11012 bsize=$((2 * PAGE_SIZE / 1024))K
11014 bucket=$($LCTL get_param -n llite.*.extents_stats |
11016 reads=$(echo $bucket | awk '{print $5}')
11017 writes=$(echo $bucket | awk '{print $9}')
11018 # mmap writes fault in the page first, creating an additonal read
11019 [ "$reads" -eq $((2 * count)) ] ||
11020 error "$reads reads in < $bsize bucket, expect $count"
11021 [ "$writes" -eq $count ] ||
11022 error "$writes writes in < $bsize bucket, expect $count"
11024 run_test 127c "test llite extent stats with regular & mmap i/o"
11026 test_128() { # bug 15212
11028 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
11033 result=$(grep error $TMP/$tfile.log)
11034 rm -f $DIR/$tfile $TMP/$tfile.log
11035 [ -z "$result" ] ||
11036 error "consecutive find's under interactive lfs failed"
11038 run_test 128 "interactive lfs for 2 consecutive find's"
11040 set_dir_limits () {
11045 local ldproc=/proc/fs/ldiskfs
11046 local facets=$(get_facets MDS)
11048 for facet in ${facets//,/ }; do
11049 canondev=$(ldiskfs_canon \
11050 *.$(convert_facet2label $facet).mntdev $facet)
11051 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
11052 ldproc=/sys/fs/ldiskfs
11053 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
11054 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
11058 check_mds_dmesg() {
11059 local facets=$(get_facets MDS)
11060 for facet in ${facets//,/ }; do
11061 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
11067 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11068 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
11069 skip "Need MDS version with at least 2.5.56"
11070 if [ "$mds1_FSTYPE" != ldiskfs ]; then
11071 skip_env "ldiskfs only test"
11073 remote_mds_nodsh && skip "remote MDS with nodsh"
11077 local has_warning=false
11080 mkdir -p $DIR/$tdir
11082 # block size of mds1
11083 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
11084 set_dir_limits $maxsize $maxsize
11085 local dirsize=$(stat -c%s "$DIR/$tdir")
11087 while [[ $dirsize -le $maxsize ]]; do
11088 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
11090 if ! $has_warning; then
11091 check_mds_dmesg '"is approaching"' && has_warning=true
11093 # check two errors:
11094 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
11095 # EFBIG for previous versions included in ldiskfs series
11096 if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
11098 echo "return code $rc received as expected"
11100 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
11101 error_exit "create failed w/o dir size limit"
11103 check_mds_dmesg '"has reached"' ||
11104 error_exit "reached message should be output"
11106 [ $has_warning = "false" ] &&
11107 error_exit "warning message should be output"
11109 dirsize=$(stat -c%s "$DIR/$tdir")
11111 [[ $dirsize -ge $maxsize ]] && return 0
11112 error_exit "current dir size $dirsize, " \
11113 "previous limit $maxsize"
11114 elif [ $rc -ne 0 ]; then
11116 error_exit "return $rc received instead of expected " \
11117 "$EFBIG or $ENOSPC, files in dir $dirsize"
11119 nfiles=$((nfiles + 1))
11120 dirsize=$(stat -c%s "$DIR/$tdir")
11124 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
11126 run_test 129 "test directory size limit ========================"
11135 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11136 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11138 trap cleanup_130 EXIT RETURN
11140 local fm_file=$DIR/$tfile
11141 $SETSTRIPE -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
11142 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
11143 error "dd failed for $fm_file"
11145 # LU-1795: test filefrag/FIEMAP once, even if unsupported
11146 filefrag -ves $fm_file
11148 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11149 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11150 [ $RC != 0 ] && error "filefrag $fm_file failed"
11152 filefrag_op=$(filefrag -ve -k $fm_file |
11153 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11154 lun=$($GETSTRIPE -i $fm_file)
11156 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
11159 for line in $filefrag_op
11161 frag_lun=`echo $line | cut -d: -f5`
11162 ext_len=`echo $line | cut -d: -f4`
11163 if (( $frag_lun != $lun )); then
11165 error "FIEMAP on 1-stripe file($fm_file) failed"
11168 (( tot_len += ext_len ))
11171 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
11173 error "FIEMAP on 1-stripe file($fm_file) failed;"
11179 echo "FIEMAP on single striped file succeeded"
11181 run_test 130a "FIEMAP (1-stripe file)"
11184 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11186 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11187 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11189 trap cleanup_130 EXIT RETURN
11191 local fm_file=$DIR/$tfile
11192 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11193 error "setstripe on $fm_file"
11194 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11195 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11197 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
11198 error "dd failed on $fm_file"
11200 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11201 filefrag_op=$(filefrag -ve -k $fm_file |
11202 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11204 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11205 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11210 for line in $filefrag_op
11212 frag_lun=$(echo $line | cut -d: -f5 |
11213 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11214 ext_len=$(echo $line | cut -d: -f4)
11215 if (( $frag_lun != $last_lun )); then
11216 if (( tot_len != 1024 )); then
11218 error "FIEMAP on $fm_file failed; returned " \
11219 "len $tot_len for OST $last_lun instead of 1024"
11222 (( num_luns += 1 ))
11226 (( tot_len += ext_len ))
11229 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
11231 error "FIEMAP on $fm_file failed; returned wrong number of " \
11232 "luns or wrong len for OST $last_lun"
11238 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
11240 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
11243 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11245 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11246 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11248 trap cleanup_130 EXIT RETURN
11250 local fm_file=$DIR/$tfile
11251 $SETSTRIPE -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
11252 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11253 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11255 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
11256 error "dd failed on $fm_file"
11258 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11259 filefrag_op=$(filefrag -ve -k $fm_file |
11260 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11262 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11263 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11268 for line in $filefrag_op
11270 frag_lun=$(echo $line | cut -d: -f5 |
11271 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11272 ext_len=$(echo $line | cut -d: -f4)
11273 if (( $frag_lun != $last_lun )); then
11274 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
11275 if (( logical != 512 )); then
11277 error "FIEMAP on $fm_file failed; returned " \
11278 "logical start for lun $logical instead of 512"
11281 if (( tot_len != 512 )); then
11283 error "FIEMAP on $fm_file failed; returned " \
11284 "len $tot_len for OST $last_lun instead of 1024"
11287 (( num_luns += 1 ))
11291 (( tot_len += ext_len ))
11294 if (( num_luns != 2 || tot_len != 512 )); then
11296 error "FIEMAP on $fm_file failed; returned wrong number of " \
11297 "luns or wrong len for OST $last_lun"
11303 echo "FIEMAP on 2-stripe file with hole succeeded"
11305 run_test 130c "FIEMAP (2-stripe file with hole)"
11308 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
11310 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11311 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11313 trap cleanup_130 EXIT RETURN
11315 local fm_file=$DIR/$tfile
11316 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11317 error "setstripe on $fm_file"
11318 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11319 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11321 local actual_stripe_count=$($GETSTRIPE -c $fm_file)
11322 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
11323 error "dd failed on $fm_file"
11325 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11326 filefrag_op=$(filefrag -ve -k $fm_file |
11327 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11329 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11330 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11335 for line in $filefrag_op
11337 frag_lun=$(echo $line | cut -d: -f5 |
11338 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11339 ext_len=$(echo $line | cut -d: -f4)
11340 if (( $frag_lun != $last_lun )); then
11341 if (( tot_len != 1024 )); then
11343 error "FIEMAP on $fm_file failed; returned " \
11344 "len $tot_len for OST $last_lun instead of 1024"
11347 (( num_luns += 1 ))
11351 (( tot_len += ext_len ))
11354 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
11356 error "FIEMAP on $fm_file failed; returned wrong number of " \
11357 "luns or wrong len for OST $last_lun"
11363 echo "FIEMAP on N-stripe file succeeded"
11365 run_test 130d "FIEMAP (N-stripe file)"
11368 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11370 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11371 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11373 trap cleanup_130 EXIT RETURN
11375 local fm_file=$DIR/$tfile
11376 $SETSTRIPE -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11377 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11378 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11381 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11382 for ((i = 0; i < $NUM_BLKS; i++))
11384 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11387 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11388 filefrag_op=$(filefrag -ve -k $fm_file |
11389 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11391 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11392 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11397 for line in $filefrag_op
11399 frag_lun=$(echo $line | cut -d: -f5 |
11400 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11401 ext_len=$(echo $line | cut -d: -f4)
11402 if (( $frag_lun != $last_lun )); then
11403 if (( tot_len != $EXPECTED_LEN )); then
11405 error "FIEMAP on $fm_file failed; returned " \
11406 "len $tot_len for OST $last_lun instead " \
11410 (( num_luns += 1 ))
11414 (( tot_len += ext_len ))
11417 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11419 error "FIEMAP on $fm_file failed; returned wrong number " \
11420 "of luns or wrong len for OST $last_lun"
11426 echo "FIEMAP with continuation calls succeeded"
11428 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11431 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11432 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11434 local fm_file=$DIR/$tfile
11435 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11436 error "multiop create with lov_delay_create on $fm_file"
11438 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11439 filefrag_extents=$(filefrag -vek $fm_file |
11440 awk '/extents? found/ { print $2 }')
11441 if [[ "$filefrag_extents" != "0" ]]; then
11442 error "FIEMAP on $fm_file failed; " \
11443 "returned $filefrag_extents expected 0"
11448 run_test 130f "FIEMAP (unstriped file)"
11450 # Test for writev/readv
11452 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11453 error "writev test failed"
11454 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11455 error "readv failed"
11458 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11461 local fsize=$((524288 + 1048576 + 1572864))
11462 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11463 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11464 error "append writev test failed"
11466 ((fsize += 1572864 + 1048576))
11467 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11468 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11469 error "append writev test failed"
11472 run_test 131b "test append writev"
11475 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11478 run_test 131c "test read/write on file w/o objects"
11481 rwv -f $DIR/$tfile -w -n 1 1572864
11482 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11483 if [ "$NOB" != 1572864 ]; then
11484 error "Short read filed: read $NOB bytes instead of 1572864"
11488 run_test 131d "test short read"
11491 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11492 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11493 error "read hitting hole failed"
11496 run_test 131e "test read hitting hole"
11505 mds*) res=$(do_facet $facet \
11506 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11508 ost*) res=$(do_facet $facet \
11509 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
11511 *) error "Wrong facet '$facet'" ;;
11513 [ "$res" ] || error "The counter for $op on $facet was not incremented"
11514 # if the argument $3 is zero, it means any stat increment is ok.
11515 if [[ $want -gt 0 ]]; then
11516 local count=$(echo $res | awk '{ print $2 }')
11517 [[ $count -ne $want ]] &&
11518 error "The $op counter on $facet is $count, not $want"
11523 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11524 remote_ost_nodsh && skip "remote OST with nodsh"
11525 remote_mds_nodsh && skip "remote MDS with nodsh"
11526 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11527 skip_env "MDS doesn't support rename stats"
11529 local testdir=$DIR/${tdir}/stats_testdir
11531 mkdir -p $DIR/${tdir}
11534 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11535 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11537 # verify mdt stats first.
11538 mkdir ${testdir} || error "mkdir failed"
11539 check_stats $SINGLEMDS "mkdir" 1
11540 touch ${testdir}/${tfile} || error "touch failed"
11541 check_stats $SINGLEMDS "open" 1
11542 check_stats $SINGLEMDS "close" 1
11543 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
11544 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
11545 check_stats $SINGLEMDS "mknod" 2
11547 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
11548 check_stats $SINGLEMDS "unlink" 1
11549 rm -f ${testdir}/${tfile} || error "file remove failed"
11550 check_stats $SINGLEMDS "unlink" 2
11552 # remove working dir and check mdt stats again.
11553 rmdir ${testdir} || error "rmdir failed"
11554 check_stats $SINGLEMDS "rmdir" 1
11556 local testdir1=$DIR/${tdir}/stats_testdir1
11557 mkdir -p ${testdir}
11558 mkdir -p ${testdir1}
11559 touch ${testdir1}/test1
11560 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
11561 check_stats $SINGLEMDS "crossdir_rename" 1
11563 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
11564 check_stats $SINGLEMDS "samedir_rename" 1
11566 rm -rf $DIR/${tdir}
11568 run_test 133a "Verifying MDT stats ========================================"
11573 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11574 remote_ost_nodsh && skip "remote OST with nodsh"
11575 remote_mds_nodsh && skip "remote MDS with nodsh"
11577 local testdir=$DIR/${tdir}/stats_testdir
11579 mkdir -p ${testdir} || error "mkdir failed"
11580 touch ${testdir}/${tfile} || error "touch failed"
11581 cancel_lru_locks mdc
11584 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11585 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11587 # extra mdt stats verification.
11588 chmod 444 ${testdir}/${tfile} || error "chmod failed"
11589 check_stats $SINGLEMDS "setattr" 1
11590 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11591 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
11593 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
11594 check_stats $SINGLEMDS "getattr" 1
11596 rm -rf $DIR/${tdir}
11598 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
11599 # so the check below is not reliable
11600 [ $MDSCOUNT -eq 1 ] || return 0
11602 # Sleep to avoid a cached response.
11603 #define OBD_STATFS_CACHE_SECONDS 1
11605 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11606 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11607 $LFS df || error "lfs failed"
11608 check_stats $SINGLEMDS "statfs" 1
11610 # check aggregated statfs (LU-10018)
11611 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
11613 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
11616 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11617 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11619 check_stats $SINGLEMDS "statfs" 1
11621 # We want to check that the client didn't send OST_STATFS to
11622 # ost1 but the MDT also uses OST_STATFS for precreate. So some
11623 # extra care is needed here.
11624 if remote_mds; then
11625 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
11626 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
11628 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
11629 [ "$res" ] && error "OST got STATFS"
11634 run_test 133b "Verifying extra MDT stats =================================="
11637 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11638 remote_ost_nodsh && skip "remote OST with nodsh"
11639 remote_mds_nodsh && skip "remote MDS with nodsh"
11641 local testdir=$DIR/$tdir/stats_testdir
11643 test_mkdir -p $testdir
11645 # verify obdfilter stats.
11646 $SETSTRIPE -c 1 -i 0 $testdir/$tfile
11648 cancel_lru_locks osc
11649 wait_delete_completed
11652 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11653 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11655 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
11658 cancel_lru_locks osc
11659 check_stats ost1 "write" 1
11661 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
11662 check_stats ost1 "read" 1
11664 > $testdir/$tfile || error "truncate failed"
11665 check_stats ost1 "punch" 1
11667 rm -f $testdir/$tfile || error "file remove failed"
11668 wait_delete_completed
11669 check_stats ost1 "destroy" 1
11673 run_test 133c "Verifying OST stats ========================================"
11680 while [ $value -ge 2 ]; do
11685 if [ $orig -gt $order ]; then
11693 local size=('K' 'M' 'G' 'T');
11695 local size_string=$value
11697 while [ $value -ge 1024 ]; do
11698 if [ $i -gt 3 ]; then
11699 #T is the biggest unit we get here, if that is bigger,
11701 size_string=${value}T
11704 value=$((value >> 10))
11705 if [ $value -lt 1024 ]; then
11706 size_string=${value}${size[$i]}
11715 get_rename_size() {
11717 local context=${2:-.}
11718 local sample=$(do_facet $SINGLEMDS $LCTL \
11719 get_param mdt.$FSNAME-MDT0000.rename_stats |
11720 grep -A1 $context |
11721 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
11726 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11727 remote_ost_nodsh && skip "remote OST with nodsh"
11728 remote_mds_nodsh && skip "remote MDS with nodsh"
11729 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11730 skip_env "MDS doesn't support rename stats"
11732 local testdir1=$DIR/${tdir}/stats_testdir1
11733 local testdir2=$DIR/${tdir}/stats_testdir2
11734 mkdir -p $DIR/${tdir}
11736 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11738 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
11739 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
11741 createmany -o $testdir1/test 512 || error "createmany failed"
11743 # check samedir rename size
11744 mv ${testdir1}/test0 ${testdir1}/test_0
11746 local testdir1_size=$(ls -l $DIR/${tdir} |
11747 awk '/stats_testdir1/ {print $5}')
11748 local testdir2_size=$(ls -l $DIR/${tdir} |
11749 awk '/stats_testdir2/ {print $5}')
11751 testdir1_size=$(order_2 $testdir1_size)
11752 testdir2_size=$(order_2 $testdir2_size)
11754 testdir1_size=$(size_in_KMGT $testdir1_size)
11755 testdir2_size=$(size_in_KMGT $testdir2_size)
11757 echo "source rename dir size: ${testdir1_size}"
11758 echo "target rename dir size: ${testdir2_size}"
11760 local cmd="do_facet $SINGLEMDS $LCTL "
11761 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
11763 eval $cmd || error "$cmd failed"
11764 local samedir=$($cmd | grep 'same_dir')
11765 local same_sample=$(get_rename_size $testdir1_size)
11766 [ -z "$samedir" ] && error "samedir_rename_size count error"
11767 [[ $same_sample -eq 1 ]] ||
11768 error "samedir_rename_size error $same_sample"
11769 echo "Check same dir rename stats success"
11771 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11773 # check crossdir rename size
11774 mv ${testdir1}/test_0 ${testdir2}/test_0
11776 testdir1_size=$(ls -l $DIR/${tdir} |
11777 awk '/stats_testdir1/ {print $5}')
11778 testdir2_size=$(ls -l $DIR/${tdir} |
11779 awk '/stats_testdir2/ {print $5}')
11781 testdir1_size=$(order_2 $testdir1_size)
11782 testdir2_size=$(order_2 $testdir2_size)
11784 testdir1_size=$(size_in_KMGT $testdir1_size)
11785 testdir2_size=$(size_in_KMGT $testdir2_size)
11787 echo "source rename dir size: ${testdir1_size}"
11788 echo "target rename dir size: ${testdir2_size}"
11790 eval $cmd || error "$cmd failed"
11791 local crossdir=$($cmd | grep 'crossdir')
11792 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
11793 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
11794 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
11795 [[ $src_sample -eq 1 ]] ||
11796 error "crossdir_rename_size error $src_sample"
11797 [[ $tgt_sample -eq 1 ]] ||
11798 error "crossdir_rename_size error $tgt_sample"
11799 echo "Check cross dir rename stats success"
11800 rm -rf $DIR/${tdir}
11802 run_test 133d "Verifying rename_stats ========================================"
11805 remote_mds_nodsh && skip "remote MDS with nodsh"
11806 remote_ost_nodsh && skip "remote OST with nodsh"
11807 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11809 local testdir=$DIR/${tdir}/stats_testdir
11810 local ctr f0 f1 bs=32768 count=42 sum
11812 mkdir -p ${testdir} || error "mkdir failed"
11814 $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
11816 for ctr in {write,read}_bytes; do
11818 cancel_lru_locks osc
11820 do_facet ost1 $LCTL set_param -n \
11821 "obdfilter.*.exports.clear=clear"
11823 if [ $ctr = write_bytes ]; then
11825 f1=${testdir}/${tfile}
11827 f0=${testdir}/${tfile}
11831 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
11834 cancel_lru_locks osc
11836 sum=$(do_facet ost1 $LCTL get_param \
11837 "obdfilter.*.exports.*.stats" |
11838 awk -v ctr=$ctr 'BEGIN { sum = 0 }
11839 $1 == ctr { sum += $7 }
11840 END { printf("%0.0f", sum) }')
11842 if ((sum != bs * count)); then
11843 error "Bad $ctr sum, expected $((bs * count)), got $sum"
11847 rm -rf $DIR/${tdir}
11849 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
11851 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
11853 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
11854 # not honor the -ignore_readdir_race option correctly. So we call
11855 # error_ignore() rather than error() in these cases. See LU-11152.
11857 if (find --version; do_facet mds1 find --version) |
11858 grep -q '\b4\.5\.1[1-4]\b'; then
11859 error_ignore LU-11152 "$@"
11866 # First without trusting modes.
11867 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
11868 echo "proc_dirs='$proc_dirs'"
11869 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
11870 find $proc_dirs -exec cat '{}' \; &> /dev/null
11872 # Second verifying readability.
11873 $LCTL get_param -R '*' &> /dev/null
11875 # Verifing writability with badarea_io.
11877 -ignore_readdir_race \
11879 -not -name force_lbug \
11880 -not -name changelog_mask \
11881 -exec badarea_io '{}' \; ||
11882 error_133 "find $proc_dirs failed"
11884 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
11887 remote_mds_nodsh && skip "remote MDS with nodsh"
11888 remote_ost_nodsh && skip "remote OST with nodsh"
11890 # eventually, this can also be replaced with "lctl get_param -R",
11891 # but not until that option is always available on the server
11893 for facet in mds1 ost1; do
11894 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
11895 skip_noexit "Too old lustre on $facet"
11896 local facet_proc_dirs=$(do_facet $facet \
11897 \\\ls -d $proc_regexp 2>/dev/null)
11898 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11899 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11900 do_facet $facet find $facet_proc_dirs \
11901 ! -name req_history \
11902 -exec cat '{}' \\\; &> /dev/null
11904 do_facet $facet find $facet_proc_dirs \
11905 ! -name req_history \
11907 -exec cat '{}' \\\; &> /dev/null ||
11908 error "proc file read failed"
11910 do_facet $facet find $facet_proc_dirs \
11911 -ignore_readdir_race \
11913 -not -name force_lbug \
11914 -not -name changelog_mask \
11915 -exec badarea_io '{}' \\\; ||
11916 error_133 "$facet find $facet_proc_dirs failed"
11919 # remount the FS in case writes/reads /proc break the FS
11920 cleanup || error "failed to unmount"
11921 setup || error "failed to setup"
11924 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
11927 remote_mds_nodsh && skip "remote MDS with nodsh"
11928 remote_ost_nodsh && skip "remote OST with nodsh"
11929 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
11930 skip "Need MDS version at least 2.9.54"
11934 for facet in client mds1 ost1; do
11935 local facet_proc_dirs=$(do_facet $facet \
11936 \\\ls -d $proc_regexp 2> /dev/null)
11937 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11938 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11939 # Get the list of files that are missing the terminating newline
11940 local missing=($(do_facet $facet \
11941 find ${facet_proc_dirs} -type f \| \
11942 while read F\; do \
11943 awk -v FS='\v' -v RS='\v\v' \
11944 "'END { if(NR>0 && \
11945 \\\$NF !~ /.*\\\n\$/) \
11946 print FILENAME}'" \
11949 [ ${#missing[*]} -eq 0 ] ||
11950 error "files do not end with newline: ${missing[*]}"
11953 run_test 133h "Proc files should end with newlines"
11956 remote_mds_nodsh && skip "remote MDS with nodsh"
11957 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11958 skip "Need MDS version at least 2.7.54"
11960 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11961 cancel_lru_locks mdc
11963 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
11964 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11965 [ $unused -eq 0 ] || error "$unused locks are not cleared"
11968 createmany -o $DIR/$tdir/f $nr ||
11969 error "failed to create $nr files in $DIR/$tdir"
11970 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11972 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
11973 do_facet mds1 $LCTL set_param fail_loc=0x327
11974 do_facet mds1 $LCTL set_param fail_val=500
11977 echo "sleep 10 seconds ..."
11979 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
11981 do_facet mds1 $LCTL set_param fail_loc=0
11982 do_facet mds1 $LCTL set_param fail_val=0
11983 [ $lck_cnt -lt $unused ] ||
11984 error "No locks reclaimed, before:$unused, after:$lck_cnt"
11987 unlinkmany $DIR/$tdir/f $nr
11989 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
11992 remote_mds_nodsh && skip "remote MDS with nodsh"
11993 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11994 skip "Need MDS version at least 2.7.54"
11996 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11997 cancel_lru_locks mdc
11999 local low_wm=$(do_facet mds1 $LCTL get_param -n \
12000 ldlm.lock_reclaim_threshold_mb)
12001 # disable reclaim temporarily
12002 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
12004 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
12005 do_facet mds1 $LCTL set_param fail_loc=0x328
12006 do_facet mds1 $LCTL set_param fail_val=500
12008 $LCTL set_param debug=+trace
12011 createmany -o $DIR/$tdir/f $nr &
12012 local create_pid=$!
12014 echo "Sleep $TIMEOUT seconds ..."
12016 if ! ps -p $create_pid > /dev/null 2>&1; then
12017 do_facet mds1 $LCTL set_param fail_loc=0
12018 do_facet mds1 $LCTL set_param fail_val=0
12019 do_facet mds1 $LCTL set_param \
12020 ldlm.lock_reclaim_threshold_mb=${low_wm}m
12021 error "createmany finished incorrectly!"
12023 do_facet mds1 $LCTL set_param fail_loc=0
12024 do_facet mds1 $LCTL set_param fail_val=0
12025 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
12026 wait $create_pid || return 1
12028 unlinkmany $DIR/$tdir/f $nr
12030 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
12032 test_140() { #bug-17379
12033 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12035 test_mkdir $DIR/$tdir
12036 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
12037 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
12039 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
12040 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
12042 while i=$((i + 1)); do
12044 cd $i || error "Changing to $i"
12045 ln -s ../stat stat || error "Creating stat symlink"
12046 # Read the symlink until ELOOP present,
12047 # not LBUGing the system is considered success,
12048 # we didn't overrun the stack.
12049 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
12050 if [ $ret -ne 0 ]; then
12051 if [ $ret -eq 40 ]; then
12054 error "Open stat symlink"
12060 echo "The symlink depth = $i"
12061 [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] ||
12062 error "Invalid symlink depth"
12064 # Test recursive symlink
12065 ln -s symlink_self symlink_self
12066 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
12067 echo "open symlink_self returns $ret"
12068 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
12070 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
12073 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12075 local TF="$TMP/$tfile"
12077 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12079 cancel_lru_locks $OSC
12080 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
12081 remount_client $MOUNT
12083 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
12086 $TRUNCATE $DIR/$tfile 6000
12087 cancel_lru_locks $OSC
12088 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
12091 echo "12345" >>$DIR/$tfile
12092 cancel_lru_locks $OSC
12093 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
12096 echo "12345" >>$DIR/$tfile
12097 cancel_lru_locks $OSC
12098 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
12103 run_test 150 "truncate/append tests"
12105 #LU-2902 roc_hit was not able to read all values from lproc
12106 function roc_hit_init() {
12107 local list=$(comma_list $(osts_nodes))
12108 local dir=$DIR/$tdir-check
12109 local file=$dir/$tfile
12115 #use setstripe to do a write to every ost
12116 for i in $(seq 0 $((OSTCOUNT-1))); do
12117 $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
12118 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
12119 idx=$(printf %04x $i)
12120 BEFORE=$(get_osd_param $list *OST*$idx stats |
12121 awk '$1 == "cache_access" {sum += $7}
12122 END { printf("%0.0f", sum) }')
12124 cancel_lru_locks osc
12125 cat $file >/dev/null
12127 AFTER=$(get_osd_param $list *OST*$idx stats |
12128 awk '$1 == "cache_access" {sum += $7}
12129 END { printf("%0.0f", sum) }')
12131 echo BEFORE:$BEFORE AFTER:$AFTER
12132 if ! let "AFTER - BEFORE == 4"; then
12134 error "roc_hit is not safe to use"
12142 function roc_hit() {
12143 local list=$(comma_list $(osts_nodes))
12144 echo $(get_osd_param $list '' stats |
12145 awk '$1 == "cache_hit" {sum += $7}
12146 END { printf("%0.0f", sum) }')
12149 function set_cache() {
12152 if [ "$2" == "off" ]; then
12155 local list=$(comma_list $(osts_nodes))
12156 set_osd_param $list '' $1_cache_enable $on
12158 cancel_lru_locks osc
12162 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12163 remote_ost_nodsh && skip "remote OST with nodsh"
12166 local list=$(comma_list $(osts_nodes))
12168 # check whether obdfilter is cache capable at all
12169 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
12170 skip "not cache-capable obdfilter"
12173 # check cache is enabled on all obdfilters
12174 if get_osd_param $list '' read_cache_enable | grep 0; then
12175 skip "oss cache is disabled"
12178 set_osd_param $list '' writethrough_cache_enable 1
12180 # check write cache is enabled on all obdfilters
12181 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
12182 skip "oss write cache is NOT enabled"
12187 #define OBD_FAIL_OBD_NO_LRU 0x609
12188 do_nodes $list $LCTL set_param fail_loc=0x609
12190 # pages should be in the case right after write
12191 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
12194 local BEFORE=$(roc_hit)
12195 cancel_lru_locks osc
12196 cat $DIR/$tfile >/dev/null
12197 local AFTER=$(roc_hit)
12199 do_nodes $list $LCTL set_param fail_loc=0
12201 if ! let "AFTER - BEFORE == CPAGES"; then
12202 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12205 # the following read invalidates the cache
12206 cancel_lru_locks osc
12207 set_osd_param $list '' read_cache_enable 0
12208 cat $DIR/$tfile >/dev/null
12210 # now data shouldn't be found in the cache
12212 cancel_lru_locks osc
12213 cat $DIR/$tfile >/dev/null
12215 if let "AFTER - BEFORE != 0"; then
12216 error "IN CACHE: before: $BEFORE, after: $AFTER"
12219 set_osd_param $list '' read_cache_enable 1
12222 run_test 151 "test cache on oss and controls ==============================="
12225 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12227 local TF="$TMP/$tfile"
12229 # simulate ENOMEM during write
12230 #define OBD_FAIL_OST_NOMEM 0x226
12231 lctl set_param fail_loc=0x80000226
12232 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12234 sync || error "sync failed"
12235 lctl set_param fail_loc=0
12237 # discard client's cache
12238 cancel_lru_locks osc
12240 # simulate ENOMEM during read
12241 lctl set_param fail_loc=0x80000226
12242 cmp $TF $DIR/$tfile || error "cmp failed"
12243 lctl set_param fail_loc=0
12247 run_test 152 "test read/write with enomem ============================"
12250 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
12252 run_test 153 "test if fdatasync does not crash ======================="
12254 dot_lustre_fid_permission_check() {
12256 local ffid=$MOUNT/.lustre/fid/$fid
12259 echo "stat fid $fid"
12260 stat $ffid > /dev/null || error "stat $ffid failed."
12261 echo "touch fid $fid"
12262 touch $ffid || error "touch $ffid failed."
12263 echo "write to fid $fid"
12264 cat /etc/hosts > $ffid || error "write $ffid failed."
12265 echo "read fid $fid"
12266 diff /etc/hosts $ffid || error "read $ffid failed."
12267 echo "append write to fid $fid"
12268 cat /etc/hosts >> $ffid || error "append write $ffid failed."
12269 echo "rename fid $fid"
12270 mv $ffid $test_dir/$tfile.1 &&
12271 error "rename $ffid to $tfile.1 should fail."
12272 touch $test_dir/$tfile.1
12273 mv $test_dir/$tfile.1 $ffid &&
12274 error "rename $tfile.1 to $ffid should fail."
12275 rm -f $test_dir/$tfile.1
12276 echo "truncate fid $fid"
12277 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
12278 echo "link fid $fid"
12279 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
12280 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
12281 echo "setfacl fid $fid"
12282 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
12283 echo "getfacl fid $fid"
12284 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
12286 echo "unlink fid $fid"
12287 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
12288 echo "mknod fid $fid"
12289 mknod $ffid c 1 3 && error "mknod $ffid should fail."
12291 fid=[0xf00000400:0x1:0x0]
12292 ffid=$MOUNT/.lustre/fid/$fid
12294 echo "stat non-exist fid $fid"
12295 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
12296 echo "write to non-exist fid $fid"
12297 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
12298 echo "link new fid $fid"
12299 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
12301 mkdir -p $test_dir/$tdir
12302 touch $test_dir/$tdir/$tfile
12303 fid=$($LFS path2fid $test_dir/$tdir)
12306 error "error: could not get fid for $test_dir/$dir/$tfile."
12308 ffid=$MOUNT/.lustre/fid/$fid
12311 ls $ffid > /dev/null || error "ls $ffid failed."
12312 echo "touch $fid/$tfile.1"
12313 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
12315 echo "touch $MOUNT/.lustre/fid/$tfile"
12316 touch $MOUNT/.lustre/fid/$tfile && \
12317 error "touch $MOUNT/.lustre/fid/$tfile should fail."
12319 echo "setxattr to $MOUNT/.lustre/fid"
12320 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
12322 echo "listxattr for $MOUNT/.lustre/fid"
12323 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
12325 echo "delxattr from $MOUNT/.lustre/fid"
12326 setfattr -x trusted.name1 $MOUNT/.lustre/fid
12328 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
12329 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
12330 error "touch invalid fid should fail."
12332 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
12333 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
12334 error "touch non-normal fid should fail."
12336 echo "rename $tdir to $MOUNT/.lustre/fid"
12337 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
12338 error "rename to $MOUNT/.lustre/fid should fail."
12340 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
12342 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
12343 local new_obf_mode=777
12345 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
12346 chmod $new_obf_mode $DIR/.lustre/fid ||
12347 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
12349 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
12350 [ $obf_mode -eq $new_obf_mode ] ||
12351 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
12353 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
12354 chmod $old_obf_mode $DIR/.lustre/fid ||
12355 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
12358 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
12359 fid=$($LFS path2fid $test_dir/$tfile-2)
12361 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
12363 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
12364 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
12365 error "create lov data thru .lustre failed"
12367 echo "cp /etc/passwd $test_dir/$tfile-2"
12368 cp /etc/passwd $test_dir/$tfile-2 ||
12369 error "copy to $test_dir/$tfile-2 failed."
12370 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
12371 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12372 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12374 rm -rf $test_dir/tfile.lnk
12375 rm -rf $test_dir/$tfile-2
12379 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12380 skip "Need MDS version at least 2.4.1"
12382 local tf=$DIR/$tfile
12385 local fid=$($LFS path2fid $tf)
12386 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12388 # check that we get the same pathname back
12389 local found=$($LFS fid2path $MOUNT "$fid")
12390 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12391 [ "$found" == "$tf" ] ||
12392 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12394 run_test 154A "lfs path2fid and fid2path basic checks"
12397 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12398 skip "Need MDS version at least 2.4.1"
12400 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12401 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12402 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12403 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12405 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12406 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12408 # check that we get the same pathname
12409 echo "PFID: $PFID, name: $name"
12410 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12411 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12412 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12413 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12415 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12417 run_test 154B "verify the ll_decode_linkea tool"
12420 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12421 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12422 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12423 skip "Need MDS version at least 2.2.51"
12424 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12426 cp /etc/hosts $DIR/$tfile
12428 fid=$($LFS path2fid $DIR/$tfile)
12430 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12432 dot_lustre_fid_permission_check "$fid" $DIR ||
12433 error "dot lustre permission check $fid failed"
12435 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12437 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12439 touch $MOUNT/.lustre/file &&
12440 error "creation is not allowed under .lustre"
12442 mkdir $MOUNT/.lustre/dir &&
12443 error "mkdir is not allowed under .lustre"
12447 run_test 154a "Open-by-FID"
12450 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12451 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12452 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12453 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12454 skip "Need MDS version at least 2.2.51"
12456 local remote_dir=$DIR/$tdir/remote_dir
12460 mkdir -p $DIR/$tdir
12461 $LFS mkdir -i $MDTIDX $remote_dir ||
12462 error "create remote directory failed"
12464 cp /etc/hosts $remote_dir/$tfile
12466 fid=$($LFS path2fid $remote_dir/$tfile)
12468 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12470 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12471 error "dot lustre permission check $fid failed"
12474 run_test 154b "Open-by-FID for remote directory"
12477 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12478 skip "Need MDS version at least 2.4.1"
12480 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12481 local FID1=$($LFS path2fid $DIR/$tfile.1)
12482 local FID2=$($LFS path2fid $DIR/$tfile.2)
12483 local FID3=$($LFS path2fid $DIR/$tfile.3)
12486 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12487 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12488 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12490 [ "$FID" = "${!want}" ] ||
12491 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12495 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12497 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12498 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12502 run_test 154c "lfs path2fid and fid2path multiple arguments"
12505 remote_mds_nodsh && skip "remote MDS with nodsh"
12506 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12507 skip "Need MDS version at least 2.5.53"
12509 if remote_mds; then
12510 nid=$($LCTL list_nids | sed "s/\./\\\./g")
12514 local proc_ofile="mdt.*.exports.'$nid'.open_files"
12521 local fid=$($LFS path2fid $DIR/$tfile)
12524 cmd="exec $fd<$DIR/$tfile"
12526 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
12527 echo "$fid_list" | grep "$fid"
12530 cmd="exec $fd>/dev/null"
12532 if [ $rc -ne 0 ]; then
12533 error "FID $fid not found in open files list $fid_list"
12536 run_test 154d "Verify open file fid"
12540 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
12541 skip "Need MDS version at least 2.6.50"
12543 if ls -a $MOUNT | grep -q '^\.lustre$'; then
12544 error ".lustre returned by readdir"
12547 run_test 154e ".lustre is not returned by readdir"
12550 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12552 # create parent directory on a single MDT to avoid cross-MDT hardlinks
12553 test_mkdir -p -c1 $DIR/$tdir/d
12554 # test dirs inherit from its stripe
12555 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
12556 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
12557 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
12558 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
12561 # get fid of parents
12562 local FID0=$($LFS path2fid $DIR/$tdir/d)
12563 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
12564 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
12565 local FID3=$($LFS path2fid $DIR)
12567 # check that path2fid --parents returns expected <parent_fid>/name
12568 # 1) test for a directory (single parent)
12569 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
12570 [ "$parent" == "$FID0/foo1" ] ||
12571 error "expected parent: $FID0/foo1, got: $parent"
12573 # 2) test for a file with nlink > 1 (multiple parents)
12574 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
12575 echo "$parent" | grep -F "$FID1/$tfile" ||
12576 error "$FID1/$tfile not returned in parent list"
12577 echo "$parent" | grep -F "$FID2/link" ||
12578 error "$FID2/link not returned in parent list"
12580 # 3) get parent by fid
12581 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
12582 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12583 echo "$parent" | grep -F "$FID1/$tfile" ||
12584 error "$FID1/$tfile not returned in parent list (by fid)"
12585 echo "$parent" | grep -F "$FID2/link" ||
12586 error "$FID2/link not returned in parent list (by fid)"
12588 # 4) test for entry in root directory
12589 parent=$($LFS path2fid --parents $DIR/f)
12590 echo "$parent" | grep -F "$FID3/f" ||
12591 error "$FID3/f not returned in parent list"
12593 # 5) test it on root directory
12594 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
12595 error "$MOUNT should not have parents"
12597 # enable xattr caching and check that linkea is correctly updated
12598 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
12599 save_lustre_params client "llite.*.xattr_cache" > $save
12600 lctl set_param llite.*.xattr_cache 1
12602 # 6.1) linkea update on rename
12603 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
12605 # get parents by fid
12606 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12607 # foo1 should no longer be returned in parent list
12608 echo "$parent" | grep -F "$FID1" &&
12609 error "$FID1 should no longer be in parent list"
12610 # the new path should appear
12611 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
12612 error "$FID2/$tfile.moved is not in parent list"
12614 # 6.2) linkea update on unlink
12615 rm -f $DIR/$tdir/d/foo2/link
12616 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12617 # foo2/link should no longer be returned in parent list
12618 echo "$parent" | grep -F "$FID2/link" &&
12619 error "$FID2/link should no longer be in parent list"
12623 restore_lustre_params < $save
12626 run_test 154f "get parent fids by reading link ea"
12630 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12631 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
12632 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
12633 skip "Need MDS version at least 2.6.92"
12635 mkdir -p $DIR/$tdir
12636 llapi_fid_test -d $DIR/$tdir
12638 run_test 154g "various llapi FID tests"
12640 test_155_small_load() {
12641 local temp=$TMP/$tfile
12642 local file=$DIR/$tfile
12644 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
12645 error "dd of=$temp bs=6096 count=1 failed"
12647 cancel_lru_locks $OSC
12648 cmp $temp $file || error "$temp $file differ"
12650 $TRUNCATE $temp 6000
12651 $TRUNCATE $file 6000
12652 cmp $temp $file || error "$temp $file differ (truncate1)"
12654 echo "12345" >>$temp
12655 echo "12345" >>$file
12656 cmp $temp $file || error "$temp $file differ (append1)"
12658 echo "12345" >>$temp
12659 echo "12345" >>$file
12660 cmp $temp $file || error "$temp $file differ (append2)"
12666 test_155_big_load() {
12667 remote_ost_nodsh && skip "remote OST with nodsh"
12669 local temp=$TMP/$tfile
12670 local file=$DIR/$tfile
12673 local cache_size=$(do_facet ost$((MAXI+1)) \
12674 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
12675 local large_file_size=$((cache_size * 2))
12677 echo "OSS cache size: $cache_size KB"
12678 echo "Large file size: $large_file_size KB"
12680 [ $MAXV -le $large_file_size ] &&
12681 skip_env "max available OST size needs > $large_file_size KB"
12683 $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed"
12685 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
12686 error "dd of=$temp bs=$large_file_size count=1k failed"
12689 cancel_lru_locks osc
12690 cmp $temp $file || error "$temp $file differ"
12696 save_writethrough() {
12697 local facets=$(get_facets OST)
12699 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
12703 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12705 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12707 save_writethrough $p
12710 set_cache writethrough on
12711 test_155_small_load
12712 restore_lustre_params < $p
12715 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
12718 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12720 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12722 save_writethrough $p
12725 set_cache writethrough off
12726 test_155_small_load
12727 restore_lustre_params < $p
12730 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
12733 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12735 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12737 save_writethrough $p
12740 set_cache writethrough on
12741 test_155_small_load
12742 restore_lustre_params < $p
12745 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
12748 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12750 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12752 save_writethrough $p
12755 set_cache writethrough off
12756 test_155_small_load
12757 restore_lustre_params < $p
12760 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
12763 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12765 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12767 save_writethrough $p
12770 set_cache writethrough on
12772 restore_lustre_params < $p
12775 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
12778 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12780 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12782 save_writethrough $p
12785 set_cache writethrough off
12787 restore_lustre_params < $p
12790 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
12793 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12795 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12797 save_writethrough $p
12800 set_cache writethrough on
12802 restore_lustre_params < $p
12805 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
12808 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12810 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12812 save_writethrough $p
12815 set_cache writethrough off
12817 restore_lustre_params < $p
12820 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
12823 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12824 remote_ost_nodsh && skip "remote OST with nodsh"
12825 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
12826 skip "stats not implemented on old servers"
12827 [ "$ost1_FSTYPE" = "zfs" ] &&
12828 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
12833 local file="$DIR/$tfile"
12834 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12836 save_writethrough $p
12839 log "Turn on read and write cache"
12841 set_cache writethrough on
12843 log "Write data and read it back."
12844 log "Read should be satisfied from the cache."
12845 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12847 cancel_lru_locks osc
12848 cat $file >/dev/null
12850 if ! let "AFTER - BEFORE == CPAGES"; then
12851 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12853 log "cache hits:: before: $BEFORE, after: $AFTER"
12856 log "Read again; it should be satisfied from the cache."
12858 cancel_lru_locks osc
12859 cat $file >/dev/null
12861 if ! let "AFTER - BEFORE == CPAGES"; then
12862 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12864 log "cache hits:: before: $BEFORE, after: $AFTER"
12867 log "Turn off the read cache and turn on the write cache"
12869 set_cache writethrough on
12871 log "Read again; it should be satisfied from the cache."
12873 cancel_lru_locks osc
12874 cat $file >/dev/null
12876 if ! let "AFTER - BEFORE == CPAGES"; then
12877 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12879 log "cache hits:: before: $BEFORE, after: $AFTER"
12882 log "Read again; it should not be satisfied from the cache."
12884 cancel_lru_locks osc
12885 cat $file >/dev/null
12887 if ! let "AFTER - BEFORE == 0"; then
12888 error "IN CACHE: before: $BEFORE, after: $AFTER"
12890 log "cache hits:: before: $BEFORE, after: $AFTER"
12893 log "Write data and read it back."
12894 log "Read should be satisfied from the cache."
12895 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12897 cancel_lru_locks osc
12898 cat $file >/dev/null
12900 if ! let "AFTER - BEFORE == CPAGES"; then
12901 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12903 log "cache hits:: before: $BEFORE, after: $AFTER"
12906 log "Read again; it should not be satisfied from the cache."
12908 cancel_lru_locks osc
12909 cat $file >/dev/null
12911 if ! let "AFTER - BEFORE == 0"; then
12912 error "IN CACHE: before: $BEFORE, after: $AFTER"
12914 log "cache hits:: before: $BEFORE, after: $AFTER"
12917 log "Turn off read and write cache"
12919 set_cache writethrough off
12921 log "Write data and read it back"
12922 log "It should not be satisfied from the cache."
12924 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12925 cancel_lru_locks osc
12927 cat $file >/dev/null
12929 if ! let "AFTER - BEFORE == 0"; then
12930 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12932 log "cache hits:: before: $BEFORE, after: $AFTER"
12935 log "Turn on the read cache and turn off the write cache"
12937 set_cache writethrough off
12939 log "Write data and read it back"
12940 log "It should not be satisfied from the cache."
12942 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12944 cancel_lru_locks osc
12945 cat $file >/dev/null
12947 if ! let "AFTER - BEFORE == 0"; then
12948 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12950 log "cache hits:: before: $BEFORE, after: $AFTER"
12953 log "Read again; it should be satisfied from the cache."
12955 cancel_lru_locks osc
12956 cat $file >/dev/null
12958 if ! let "AFTER - BEFORE == CPAGES"; then
12959 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12961 log "cache hits:: before: $BEFORE, after: $AFTER"
12964 restore_lustre_params < $p
12967 run_test 156 "Verification of tunables"
12970 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12971 remote_mds_nodsh && skip "remote MDS with nodsh"
12972 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
12973 skip "Need MDS version at least 2.2.0"
12975 changelog_register || error "changelog_register failed"
12976 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
12977 changelog_users $SINGLEMDS | grep -q $cl_user ||
12978 error "User $cl_user not found in changelog_users"
12981 test_mkdir -p $DIR/$tdir/pics/2008/zachy
12982 changelog_clear 0 || error "changelog_clear failed"
12983 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
12984 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
12985 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
12986 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
12987 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
12988 rm $DIR/$tdir/pics/desktop.jpg
12990 changelog_dump | tail -10
12992 echo "verifying changelog mask"
12993 changelog_chmask "-MKDIR"
12994 changelog_chmask "-CLOSE"
12996 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
12997 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
12999 changelog_chmask "+MKDIR"
13000 changelog_chmask "+CLOSE"
13002 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
13003 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
13005 changelog_dump | tail -10
13006 MKDIRS=$(changelog_dump | grep -c "MKDIR")
13007 CLOSES=$(changelog_dump | grep -c "CLOSE")
13008 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
13009 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
13012 echo "verifying target fid"
13013 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
13014 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
13015 [ "$fidc" == "$fidf" ] ||
13016 error "changelog '$tfile' fid $fidc != file fid $fidf"
13017 echo "verifying parent fid"
13018 # The FID returned from the Changelog may be the directory shard on
13019 # a different MDT, and not the FID returned by path2fid on the parent.
13020 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
13021 # since this is what will matter when recreating this file in the tree.
13022 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
13023 local pathp=$($LFS fid2path $MOUNT "$fidp")
13024 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
13025 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
13027 echo "getting records for $cl_user"
13028 changelog_users $SINGLEMDS
13029 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
13031 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
13032 error "changelog_clear failed"
13033 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
13034 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
13035 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
13036 error "user index expect $user_rec1 + $nclr != $user_rec2"
13038 local min0_rec=$(changelog_users $SINGLEMDS |
13039 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
13040 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
13041 awk '{ print $1; exit; }')
13043 changelog_dump | tail -n 5
13044 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
13045 [ $first_rec == $((min0_rec + 1)) ] ||
13046 error "first index should be $min0_rec + 1 not $first_rec"
13048 # LU-3446 changelog index reset on MDT restart
13049 local cur_rec1=$(changelog_users $SINGLEMDS |
13050 awk '/^current.index:/ { print $NF }')
13051 changelog_clear 0 ||
13052 error "clear all changelog records for $cl_user failed"
13053 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
13054 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
13055 error "Fail to start $SINGLEMDS"
13056 local cur_rec2=$(changelog_users $SINGLEMDS |
13057 awk '/^current.index:/ { print $NF }')
13058 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
13059 [ $cur_rec1 == $cur_rec2 ] ||
13060 error "current index should be $cur_rec1 not $cur_rec2"
13062 echo "verifying users from this test are deregistered"
13063 changelog_deregister || error "changelog_deregister failed"
13064 changelog_users $SINGLEMDS | grep -q $cl_user &&
13065 error "User '$cl_user' still in changelog_users"
13067 # lctl get_param -n mdd.*.changelog_users
13068 # current index: 144
13069 # ID index (idle seconds)
13071 if ! changelog_users $SINGLEMDS | grep "^cl"; then
13072 # this is the normal case where all users were deregistered
13073 # make sure no new records are added when no users are present
13074 local last_rec1=$(changelog_users $SINGLEMDS |
13075 awk '/^current.index:/ { print $NF }')
13076 touch $DIR/$tdir/chloe
13077 local last_rec2=$(changelog_users $SINGLEMDS |
13078 awk '/^current.index:/ { print $NF }')
13079 echo "verify changelogs are off: $last_rec1 == $last_rec2"
13080 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
13082 # any changelog users must be leftovers from a previous test
13083 changelog_users $SINGLEMDS
13084 echo "other changelog users; can't verify off"
13087 run_test 160a "changelog sanity"
13089 test_160b() { # LU-3587
13090 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13091 remote_mds_nodsh && skip "remote MDS with nodsh"
13092 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13093 skip "Need MDS version at least 2.2.0"
13095 changelog_register || error "changelog_register failed"
13096 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13097 changelog_users $SINGLEMDS | grep -q $cl_user ||
13098 error "User '$cl_user' not found in changelog_users"
13100 local longname1=$(str_repeat a 255)
13101 local longname2=$(str_repeat b 255)
13104 echo "creating very long named file"
13105 touch $longname1 || error "create of '$longname1' failed"
13106 echo "renaming very long named file"
13107 mv $longname1 $longname2
13109 changelog_dump | grep RENME | tail -n 5
13112 run_test 160b "Verify that very long rename doesn't crash in changelog"
13115 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13116 remote_mds_nodsh && skip "remote MDS with nodsh"
13118 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
13119 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
13120 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
13121 skip "Need MDS version at least 2.5.58 or 2.5.2+"
13125 # Registration step
13126 changelog_register || error "changelog_register failed"
13129 mkdir -p $DIR/$tdir
13130 $MCREATE $DIR/$tdir/foo_160c
13131 changelog_chmask "-TRUNC"
13132 $TRUNCATE $DIR/$tdir/foo_160c 200
13133 changelog_chmask "+TRUNC"
13134 $TRUNCATE $DIR/$tdir/foo_160c 199
13135 changelog_dump | tail -n 5
13136 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
13137 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
13139 run_test 160c "verify that changelog log catch the truncate event"
13142 remote_mds_nodsh && skip "remote MDS with nodsh"
13143 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13144 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13145 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
13146 skip "Need MDS version at least 2.7.60"
13148 # Registration step
13149 changelog_register || error "changelog_register failed"
13151 mkdir -p $DIR/$tdir/migrate_dir
13152 changelog_clear 0 || error "changelog_clear failed"
13154 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
13155 changelog_dump | tail -n 5
13156 local migrates=$(changelog_dump | grep -c "MIGRT")
13157 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
13159 run_test 160d "verify that changelog log catch the migrate event"
13162 remote_mds_nodsh && skip "remote MDS with nodsh"
13165 changelog_register || error "changelog_register failed"
13167 # Delete a future user (expect fail)
13168 local MDT0=$(facet_svc $SINGLEMDS)
13169 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
13172 if [ $rc -eq 0 ]; then
13173 error "Deleted non-existant user cl77"
13174 elif [ $rc -ne 2 ]; then
13175 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
13178 # Clear to a bad index (1 billion should be safe)
13179 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
13182 if [ $rc -eq 0 ]; then
13183 error "Successfully cleared to invalid CL index"
13184 elif [ $rc -ne 22 ]; then
13185 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
13188 run_test 160e "changelog negative testing (should return errors)"
13191 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13192 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13193 skip "Need MDS version at least 2.10.56"
13195 local mdts=$(comma_list $(mdts_nodes))
13198 changelog_register || error "first changelog_register failed"
13199 changelog_register || error "second changelog_register failed"
13201 declare -A cl_user1
13202 declare -A cl_user2
13207 # generate some changelog records to accumulate on each MDT
13208 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13209 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13210 error "create $DIR/$tdir/$tfile failed"
13212 # check changelogs have been generated
13213 local nbcl=$(changelog_dump | wc -l)
13214 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13216 for param in "changelog_max_idle_time=10" \
13218 "changelog_min_gc_interval=2" \
13219 "changelog_min_free_cat_entries=3"; do
13220 local MDT0=$(facet_svc $SINGLEMDS)
13221 local var="${param%=*}"
13222 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13224 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13225 do_nodes $mdts $LCTL set_param mdd.*.$param
13228 # force cl_user2 to be idle (1st part)
13231 # simulate changelog catalog almost full
13232 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13233 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13235 for i in $(seq $MDSCOUNT); do
13236 cl_users=(${CL_USERS[mds$i]})
13237 cl_user1[mds$i]="${cl_users[0]}"
13238 cl_user2[mds$i]="${cl_users[1]}"
13240 [ -n "${cl_user1[mds$i]}" ] ||
13241 error "mds$i: no user registered"
13242 [ -n "${cl_user2[mds$i]}" ] ||
13243 error "mds$i: only ${cl_user2[mds$i]} is registered"
13245 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13246 [ -n "$user_rec1" ] ||
13247 error "mds$i: User ${cl_user1[mds$i]} not registered"
13248 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13249 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13250 [ -n "$user_rec2" ] ||
13251 error "mds$i: User ${cl_user1[mds$i]} not registered"
13252 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13253 "$user_rec1 + 2 == $user_rec2"
13254 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13255 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13256 "$user_rec1 + 2, but is $user_rec2"
13257 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13258 [ -n "$user_rec2" ] ||
13259 error "mds$i: User ${cl_user2[mds$i]} not registered"
13260 [ $user_rec1 == $user_rec2 ] ||
13261 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13262 "$user_rec1, but is $user_rec2"
13265 # force cl_user2 to be idle (2nd part) and to reach
13266 # changelog_max_idle_time
13269 # generate one more changelog to trigger fail_loc
13270 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13271 error "create $DIR/$tdir/${tfile}bis failed"
13273 # ensure gc thread is done
13274 for i in $(mdts_nodes); do
13276 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13277 error "$i: GC-thread not done"
13281 for i in $(seq $MDSCOUNT); do
13282 # check cl_user1 still registered
13283 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13284 error "mds$i: User ${cl_user1[mds$i]} not registered"
13285 # check cl_user2 unregistered
13286 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13287 error "mds$i: User ${cl_user2[mds$i]} still registered"
13289 # check changelogs are present and starting at $user_rec1 + 1
13290 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13291 [ -n "$user_rec1" ] ||
13292 error "mds$i: User ${cl_user1[mds$i]} not registered"
13293 first_rec=$($LFS changelog $(facet_svc mds$i) |
13294 awk '{ print $1; exit; }')
13296 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13297 [ $((user_rec1 + 1)) == $first_rec ] ||
13298 error "mds$i: first index should be $user_rec1 + 1, " \
13299 "but is $first_rec"
13302 run_test 160f "changelog garbage collect (timestamped users)"
13305 remote_mds_nodsh && skip "remote MDS with nodsh"
13306 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13307 skip "Need MDS version at least 2.10.56"
13309 local mdts=$(comma_list $(mdts_nodes))
13311 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
13312 do_nodes $mdts $LCTL set_param fail_loc=0x1314
13315 changelog_register || error "first changelog_register failed"
13316 changelog_register || error "second changelog_register failed"
13318 declare -A cl_user1
13319 declare -A cl_user2
13324 # generate some changelog records to accumulate on each MDT
13325 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13326 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13327 error "create $DIR/$tdir/$tfile failed"
13329 # check changelogs have been generated
13330 local nbcl=$(changelog_dump | wc -l)
13331 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13333 # reduce the max_idle_indexes value to make sure we exceed it
13334 max_ndx=$((nbcl / 2 - 1))
13336 for param in "changelog_max_idle_indexes=$max_ndx" \
13338 "changelog_min_gc_interval=2" \
13339 "changelog_min_free_cat_entries=3"; do
13340 local MDT0=$(facet_svc $SINGLEMDS)
13341 local var="${param%=*}"
13342 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13344 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13345 do_nodes $mdts $LCTL set_param mdd.*.$param ||
13346 error "unable to set mdd.*.$param"
13349 # simulate changelog catalog almost full
13350 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13351 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13353 for i in $(seq $MDSCOUNT); do
13354 cl_users=(${CL_USERS[mds$i]})
13355 cl_user1[mds$i]="${cl_users[0]}"
13356 cl_user2[mds$i]="${cl_users[1]}"
13358 [ -n "${cl_user1[mds$i]}" ] ||
13359 error "mds$i: no user registered"
13360 [ -n "${cl_user2[mds$i]}" ] ||
13361 error "mds$i: only ${cl_user1[mds$i]} is registered"
13363 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13364 [ -n "$user_rec1" ] ||
13365 error "mds$i: User ${cl_user1[mds$i]} not registered"
13366 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13367 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13368 [ -n "$user_rec2" ] ||
13369 error "mds$i: User ${cl_user1[mds$i]} not registered"
13370 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13371 "$user_rec1 + 2 == $user_rec2"
13372 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13373 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13374 "$user_rec1 + 2, but is $user_rec2"
13375 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13376 [ -n "$user_rec2" ] ||
13377 error "mds$i: User ${cl_user2[mds$i]} not registered"
13378 [ $user_rec1 == $user_rec2 ] ||
13379 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13380 "$user_rec1, but is $user_rec2"
13383 # ensure we are past the previous changelog_min_gc_interval set above
13386 # generate one more changelog to trigger fail_loc
13387 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13388 error "create $DIR/$tdir/${tfile}bis failed"
13390 # ensure gc thread is done
13391 for i in $(mdts_nodes); do
13393 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13394 error "$i: GC-thread not done"
13398 for i in $(seq $MDSCOUNT); do
13399 # check cl_user1 still registered
13400 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13401 error "mds$i: User ${cl_user1[mds$i]} not registered"
13402 # check cl_user2 unregistered
13403 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13404 error "mds$i: User ${cl_user2[mds$i]} still registered"
13406 # check changelogs are present and starting at $user_rec1 + 1
13407 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13408 [ -n "$user_rec1" ] ||
13409 error "mds$i: User ${cl_user1[mds$i]} not registered"
13410 first_rec=$($LFS changelog $(facet_svc mds$i) |
13411 awk '{ print $1; exit; }')
13413 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13414 [ $((user_rec1 + 1)) == $first_rec ] ||
13415 error "mds$i: first index should be $user_rec1 + 1, " \
13416 "but is $first_rec"
13419 run_test 160g "changelog garbage collect (old users)"
13422 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13423 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13424 skip "Need MDS version at least 2.10.56"
13426 local mdts=$(comma_list $(mdts_nodes))
13429 changelog_register || error "first changelog_register failed"
13430 changelog_register || error "second changelog_register failed"
13432 declare -A cl_user1
13433 declare -A cl_user2
13438 # generate some changelog records to accumulate on each MDT
13439 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13440 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13441 error "create $DIR/$tdir/$tfile failed"
13443 # check changelogs have been generated
13444 local nbcl=$(changelog_dump | wc -l)
13445 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13447 for param in "changelog_max_idle_time=10" \
13449 "changelog_min_gc_interval=2"; do
13450 local MDT0=$(facet_svc $SINGLEMDS)
13451 local var="${param%=*}"
13452 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13454 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13455 do_nodes $mdts $LCTL set_param mdd.*.$param
13458 # force cl_user2 to be idle (1st part)
13461 for i in $(seq $MDSCOUNT); do
13462 cl_users=(${CL_USERS[mds$i]})
13463 cl_user1[mds$i]="${cl_users[0]}"
13464 cl_user2[mds$i]="${cl_users[1]}"
13466 [ -n "${cl_user1[mds$i]}" ] ||
13467 error "mds$i: no user registered"
13468 [ -n "${cl_user2[mds$i]}" ] ||
13469 error "mds$i: only ${cl_user2[mds$i]} is registered"
13471 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13472 [ -n "$user_rec1" ] ||
13473 error "mds$i: User ${cl_user1[mds$i]} not registered"
13474 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13475 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13476 [ -n "$user_rec2" ] ||
13477 error "mds$i: User ${cl_user1[mds$i]} not registered"
13478 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13479 "$user_rec1 + 2 == $user_rec2"
13480 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13481 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13482 "$user_rec1 + 2, but is $user_rec2"
13483 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13484 [ -n "$user_rec2" ] ||
13485 error "mds$i: User ${cl_user2[mds$i]} not registered"
13486 [ $user_rec1 == $user_rec2 ] ||
13487 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13488 "$user_rec1, but is $user_rec2"
13491 # force cl_user2 to be idle (2nd part) and to reach
13492 # changelog_max_idle_time
13495 # force each GC-thread start and block then
13496 # one per MDT/MDD, set fail_val accordingly
13497 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13498 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13500 # generate more changelogs to trigger fail_loc
13501 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13502 error "create $DIR/$tdir/${tfile}bis failed"
13504 # stop MDT to stop GC-thread, should be done in back-ground as it will
13505 # block waiting for the thread to be released and exit
13506 declare -A stop_pids
13507 for i in $(seq $MDSCOUNT); do
13509 stop_pids[mds$i]=$!
13512 for i in $(mdts_nodes); do
13515 local facets=$(facets_up_on_host $i)
13517 for facet in ${facets//,/ }; do
13518 if [[ $facet == mds* ]]; then
13522 # ensure each MDS's gc threads are still present and all in "R"
13523 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
13524 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
13525 error "$i: expected $nb GC-thread"
13527 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
13529 error "$i: GC-thread not found in R-state"
13530 # check umounts of each MDT on MDS have reached kthread_stop()
13531 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
13532 error "$i: expected $nb umount"
13534 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
13535 error "$i: umount not found in D-state"
13538 # release all GC-threads
13539 do_nodes $mdts $LCTL set_param fail_loc=0
13541 # wait for MDT stop to complete
13542 for i in $(seq $MDSCOUNT); do
13543 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
13547 # may try to check if any orphan changelog records are present
13548 # via ldiskfs/zfs and llog_reader...
13550 # re-start/mount MDTs
13551 for i in $(seq $MDSCOUNT); do
13552 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
13553 error "Fail to start mds$i"
13557 for i in $(seq $MDSCOUNT); do
13558 # check cl_user1 still registered
13559 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13560 error "mds$i: User ${cl_user1[mds$i]} not registered"
13561 # check cl_user2 unregistered
13562 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13563 error "mds$i: User ${cl_user2[mds$i]} still registered"
13565 # check changelogs are present and starting at $user_rec1 + 1
13566 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13567 [ -n "$user_rec1" ] ||
13568 error "mds$i: User ${cl_user1[mds$i]} not registered"
13569 first_rec=$($LFS changelog $(facet_svc mds$i) |
13570 awk '{ print $1; exit; }')
13572 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13573 [ $((user_rec1 + 1)) == $first_rec ] ||
13574 error "mds$i: first index should be $user_rec1 + 1, " \
13575 "but is $first_rec"
13578 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
13583 local mdts=$(comma_list $(mdts_nodes))
13585 changelog_register || error "first changelog_register failed"
13587 # generate some changelog records to accumulate on each MDT
13588 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13589 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13590 error "create $DIR/$tdir/$tfile failed"
13592 # check changelogs have been generated
13593 local nbcl=$(changelog_dump | wc -l)
13594 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13596 # simulate race between register and unregister
13597 # XXX as fail_loc is set per-MDS, with DNE configs the race
13598 # simulation will only occur for one MDT per MDS and for the
13599 # others the normal race scenario will take place
13600 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
13601 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
13602 do_nodes $mdts $LCTL set_param fail_val=1
13604 # unregister 1st user
13605 changelog_deregister &
13607 # wait some time for deregister work to reach race rdv
13609 # register 2nd user
13610 changelog_register || error "2nd user register failed"
13612 wait $pid1 || error "1st user deregister failed"
13616 declare -A LAST_REC
13617 for i in $(seq $MDSCOUNT); do
13618 if changelog_users mds$i | grep "^cl"; then
13619 # make sure new records are added with one user present
13620 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
13621 awk '/^current.index:/ { print $NF }')
13623 error "mds$i has no user registered"
13627 # generate more changelog records to accumulate on each MDT
13628 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13629 error "create $DIR/$tdir/${tfile}bis failed"
13631 for i in $(seq $MDSCOUNT); do
13632 last_rec=$(changelog_users $SINGLEMDS |
13633 awk '/^current.index:/ { print $NF }')
13634 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
13635 [ $last_rec != ${LAST_REC[mds$i]} ] ||
13636 error "changelogs are off on mds$i"
13639 run_test 160i "changelog user register/unregister race"
13642 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13643 remote_mds_nodsh && skip "remote MDS with nodsh"
13645 mkdir -p $DIR/$tdir/1/1
13647 changelog_register || error "changelog_register failed"
13648 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13650 changelog_users $SINGLEMDS | grep -q $cl_user ||
13651 error "User '$cl_user' not found in changelog_users"
13652 #define OBD_FAIL_MDS_CHANGELOG_REORDER 0x15d
13653 do_facet mds1 $LCTL set_param fail_loc=0x8000015d fail_val=3
13654 rmdir $DIR/$tdir/1/1 & sleep 1
13656 touch $DIR/$tdir/2/2
13657 rm -rf $DIR/$tdir/2
13662 changelog_dump | grep rmdir || error "rmdir not recorded"
13665 changelog_deregister
13667 run_test 160k "Verify that changelog records are not lost"
13670 remote_mds_nodsh && skip "remote MDS with nodsh"
13671 [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] &&
13672 skip "Need MDS version at least 2.12.56"
13674 mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
13676 changelog_register || error "first changelog_register failed"
13678 # generate some changelog
13679 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13680 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13681 error "create $DIR/$tdir/${tfile}bis failed"
13683 # open the changelog device
13684 exec 3>/dev/changelog-$FSNAME-MDT0000
13685 exec 4</dev/changelog-$FSNAME-MDT0000
13687 # umount the first lustre mount
13691 cat <&4 >/dev/null || error "read changelog failed"
13694 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13695 changelog_users $SINGLEMDS | grep -q $cl_user ||
13696 error "User $cl_user not found in changelog_users"
13698 printf 'clear:'$cl_user':0' >&3
13705 changelog_deregister || error "changelog_deregister failed"
13708 mount_client $MOUNT || error "mount_client on $MOUNT failed"
13710 run_test 160j "client can be umounted while its chanangelog is being used"
13713 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13715 test_mkdir -c1 $DIR/$tdir
13716 cp /etc/hosts $DIR/$tdir/$tfile
13717 test_mkdir -c1 $DIR/$tdir/foo1
13718 test_mkdir -c1 $DIR/$tdir/foo2
13719 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
13720 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
13721 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
13722 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
13723 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
13724 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13725 $LFS fid2path $DIR $FID
13726 error "bad link ea"
13729 rm $DIR/$tdir/foo2/zachary
13731 rm $DIR/$tdir/foo2/thor
13733 rm $DIR/$tdir/$tfile
13735 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
13736 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
13737 { $LFS fid2path $DIR $FID; error "bad link rename"; }
13738 rm $DIR/$tdir/foo2/maggie
13741 local longname=$tfile.avg_len_is_thirty_two_
13742 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
13743 error_noexit 'failed to unlink many hardlinks'" EXIT
13744 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
13745 error "failed to hardlink many files"
13746 links=$($LFS fid2path $DIR $FID | wc -l)
13747 echo -n "${links}/1000 links in link EA"
13748 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
13750 run_test 161a "link ea sanity"
13753 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13754 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
13757 local remote_dir=$DIR/$tdir/remote_dir
13759 mkdir -p $DIR/$tdir
13760 $LFS mkdir -i $MDTIDX $remote_dir ||
13761 error "create remote directory failed"
13763 cp /etc/hosts $remote_dir/$tfile
13764 mkdir -p $remote_dir/foo1
13765 mkdir -p $remote_dir/foo2
13766 ln $remote_dir/$tfile $remote_dir/foo1/sofia
13767 ln $remote_dir/$tfile $remote_dir/foo2/zachary
13768 ln $remote_dir/$tfile $remote_dir/foo1/luna
13769 ln $remote_dir/$tfile $remote_dir/foo2/thor
13771 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
13773 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13774 $LFS fid2path $DIR $FID
13775 error "bad link ea"
13778 rm $remote_dir/foo2/zachary
13780 rm $remote_dir/foo2/thor
13782 rm $remote_dir/$tfile
13784 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
13785 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
13786 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
13787 $LFS fid2path $DIR $FID
13788 error "bad link rename"
13790 rm $remote_dir/foo2/maggie
13793 local longname=filename_avg_len_is_thirty_two_
13794 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
13795 error "failed to hardlink many files"
13796 links=$($LFS fid2path $DIR $FID | wc -l)
13797 echo -n "${links}/1000 links in link EA"
13798 [[ ${links} -gt 60 ]] ||
13799 error "expected at least 60 links in link EA"
13800 unlinkmany $remote_dir/foo2/$longname 1000 ||
13801 error "failed to unlink many hardlinks"
13803 run_test 161b "link ea sanity under remote directory"
13806 remote_mds_nodsh && skip "remote MDS with nodsh"
13807 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13808 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
13809 skip "Need MDS version at least 2.1.5"
13811 # define CLF_RENAME_LAST 0x0001
13812 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
13813 changelog_register || error "changelog_register failed"
13816 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
13817 touch $DIR/$tdir/foo_161c
13818 touch $DIR/$tdir/bar_161c
13819 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13820 changelog_dump | grep RENME | tail -n 5
13821 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13822 changelog_clear 0 || error "changelog_clear failed"
13823 if [ x$flags != "x0x1" ]; then
13824 error "flag $flags is not 0x1"
13827 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
13828 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
13829 touch $DIR/$tdir/foo_161c
13830 touch $DIR/$tdir/bar_161c
13831 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13832 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13833 changelog_dump | grep RENME | tail -n 5
13834 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13835 changelog_clear 0 || error "changelog_clear failed"
13836 if [ x$flags != "x0x0" ]; then
13837 error "flag $flags is not 0x0"
13839 echo "rename overwrite a target having nlink > 1," \
13840 "changelog record has flags of $flags"
13842 # rename doesn't overwrite a target (changelog flag 0x0)
13843 touch $DIR/$tdir/foo_161c
13844 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
13845 changelog_dump | grep RENME | tail -n 5
13846 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
13847 changelog_clear 0 || error "changelog_clear failed"
13848 if [ x$flags != "x0x0" ]; then
13849 error "flag $flags is not 0x0"
13851 echo "rename doesn't overwrite a target," \
13852 "changelog record has flags of $flags"
13854 # define CLF_UNLINK_LAST 0x0001
13855 # unlink a file having nlink = 1 (changelog flag 0x1)
13856 rm -f $DIR/$tdir/foo2_161c
13857 changelog_dump | grep UNLNK | tail -n 5
13858 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13859 changelog_clear 0 || error "changelog_clear failed"
13860 if [ x$flags != "x0x1" ]; then
13861 error "flag $flags is not 0x1"
13863 echo "unlink a file having nlink = 1," \
13864 "changelog record has flags of $flags"
13866 # unlink a file having nlink > 1 (changelog flag 0x0)
13867 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13868 rm -f $DIR/$tdir/foobar_161c
13869 changelog_dump | grep UNLNK | tail -n 5
13870 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13871 changelog_clear 0 || error "changelog_clear failed"
13872 if [ x$flags != "x0x0" ]; then
13873 error "flag $flags is not 0x0"
13875 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
13877 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
13880 remote_mds_nodsh && skip "remote MDS with nodsh"
13885 changelog_register || error "changelog_register failed"
13887 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
13888 # interfer with $MOUNT/.lustre/fid/ access
13890 [[ $? -eq 0 ]] || error "mkdir failed"
13892 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
13893 $LCTL set_param fail_loc=0x8000140c
13895 $LCTL set_param fail_val=5
13898 echo foofoo > $DIR/$tdir/$tfile &
13901 # wait for create to be delayed
13905 [[ $? -eq 0 ]] || error "create should be blocked"
13907 local tempfile=$(mktemp)
13908 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
13909 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
13910 # some delay may occur during ChangeLog publishing and file read just
13911 # above, that could allow file write to happen finally
13912 [[ -s $tempfile ]] && echo "file should be empty"
13914 $LCTL set_param fail_loc=0
13917 [[ $? -eq 0 ]] || error "create failed"
13919 run_test 161d "create with concurrent .lustre/fid access"
13922 local expected="$1"
13927 path=$($LFS fid2path "$@")
13930 if [ $rc -ne 0 ]; then
13931 error "path looked up of '$expected' failed: rc=$rc"
13932 elif [ "$path" != "$expected" ]; then
13933 error "path looked up '$path' instead of '$expected'"
13935 echo "FID '$fid' resolves to path '$path' as expected"
13939 test_162a() { # was test_162
13940 test_mkdir -p -c1 $DIR/$tdir/d2
13941 touch $DIR/$tdir/d2/$tfile
13942 touch $DIR/$tdir/d2/x1
13943 touch $DIR/$tdir/d2/x2
13944 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
13945 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
13947 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
13948 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
13951 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
13952 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
13953 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
13955 # softlink to wrong file
13956 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
13957 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
13958 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
13961 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
13962 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
13963 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
13964 # fid2path dir/fsname should both work
13965 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
13966 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
13968 # hardlink count: check that there are 2 links
13969 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
13970 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
13972 # hardlink indexing: remove the first link
13973 rm $DIR/$tdir/d2/p/q/r/hlink
13974 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
13976 run_test 162a "path lookup sanity"
13979 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13980 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13983 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
13984 error "create striped dir failed"
13986 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
13987 tail -n 1 | awk '{print $2}')
13988 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
13990 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
13991 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
13994 for ((i=0;i<5;i++)); do
13995 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
13996 error "get fid for f$i failed"
13997 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
13999 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
14000 error "get fid for d$i failed"
14001 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
14006 run_test 162b "striped directory path lookup sanity"
14008 # LU-4239: Verify fid2path works with paths 100 or more directories deep
14010 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
14011 skip "Need MDS version at least 2.7.51"
14013 local lpath=$tdir.local
14014 local rpath=$tdir.remote
14016 test_mkdir $DIR/$lpath
14017 test_mkdir $DIR/$rpath
14019 for ((i = 0; i <= 101; i++)); do
14022 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
14023 error "get fid for local directory $DIR/$lpath failed"
14024 check_path "$DIR/$lpath" $MOUNT $FID --link 0
14027 test_mkdir $DIR/$rpath
14028 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
14029 error "get fid for remote directory $DIR/$rpath failed"
14030 check_path "$DIR/$rpath" $MOUNT $FID --link 0
14035 run_test 162c "fid2path works with paths 100 or more directories deep"
14038 # do directio so as not to populate the page cache
14039 log "creating a 10 Mb file"
14040 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
14041 log "starting reads"
14042 dd if=$DIR/$tfile of=/dev/null bs=4096 &
14043 log "truncating the file"
14044 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
14046 kill %+ || true # reads might have finished
14047 echo "wait until dd is finished"
14049 log "removing the temporary file"
14050 rm -rf $DIR/$tfile || error "tmp file removal failed"
14052 run_test 169 "parallel read and truncate should not deadlock"
14055 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14057 $LCTL clear # bug 18514
14058 $LCTL debug_daemon start $TMP/${tfile}_log_good
14060 $LCTL debug_daemon stop
14061 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
14062 error "sed failed to read log_good"
14064 $LCTL debug_daemon start $TMP/${tfile}_log_good
14066 $LCTL debug_daemon stop
14068 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
14069 error "lctl df log_bad failed"
14071 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14072 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14074 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
14075 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
14077 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
14078 error "bad_line good_line1 good_line2 are empty"
14080 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14081 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
14082 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14084 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
14085 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14086 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14088 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
14089 error "bad_line_new good_line_new are empty"
14091 local expected_good=$((good_line1 + good_line2*2))
14093 rm -f $TMP/${tfile}*
14094 # LU-231, short malformed line may not be counted into bad lines
14095 if [ $bad_line -ne $bad_line_new ] &&
14096 [ $bad_line -ne $((bad_line_new - 1)) ]; then
14097 error "expected $bad_line bad lines, but got $bad_line_new"
14101 if [ $expected_good -ne $good_line_new ]; then
14102 error "expected $expected_good good lines, but got $good_line_new"
14107 run_test 170 "test lctl df to handle corrupted log ====================="
14109 test_171() { # bug20592
14110 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14112 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
14113 $LCTL set_param fail_loc=0x50e
14114 $LCTL set_param fail_val=3000
14115 multiop_bg_pause $DIR/$tfile O_s || true
14117 kill -USR1 $MULTIPID
14121 if dmesg | grep "recursive fault"; then
14122 error "caught a recursive fault"
14124 $LCTL set_param fail_loc=0
14127 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
14129 # it would be good to share it with obdfilter-survey/iokit-libecho code
14130 setup_obdecho_osc () {
14133 local obdfilter_name=$2
14134 echo "Creating new osc for $obdfilter_name on $ost_nid"
14135 # make sure we can find loopback nid
14136 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
14138 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
14139 ${obdfilter_name}_osc_UUID || rc=2; }
14140 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
14141 ${obdfilter_name}_UUID $ost_nid || rc=3; }
14145 cleanup_obdecho_osc () {
14146 local obdfilter_name=$1
14147 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
14148 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
14155 local pages=${3:-64}
14160 local obd_size=$(get_obd_size $node $OBD)
14161 local page_size=$(get_page_size $node)
14162 if [[ -n "$obd_size" ]]; then
14163 local new_count=$((obd_size / (pages * page_size / 1024)))
14164 [[ $new_count -ge $count ]] || count=$new_count
14167 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
14168 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
14170 if [ $rc -eq 0 ]; then
14171 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
14172 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
14174 echo "New object id is $id"
14175 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
14177 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
14178 "test_brw $count w v $pages $id" || rc=4; }
14179 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
14181 [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
14182 "cleanup" || rc=5; }
14183 [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \
14184 "detach" || rc=6; }
14185 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
14190 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14192 if ! module_loaded obdecho; then
14193 load_module obdecho/obdecho &&
14194 stack_trap "rmmod obdecho" EXIT ||
14195 error "unable to load obdecho on client"
14198 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
14199 local host=$($LCTL get_param -n osc.$osc.import |
14200 awk '/current_connection:/ { print $2 }' )
14201 local target=$($LCTL get_param -n osc.$osc.import |
14202 awk '/target:/ { print $2 }' )
14203 target=${target%_UUID}
14205 if [ -n "$target" ]; then
14206 setup_obdecho_osc $host $target &&
14207 stack_trap "cleanup_obdecho_osc $target" EXIT ||
14208 { error "obdecho setup failed with $?"; return; }
14210 obdecho_test ${target}_osc client ||
14211 error "obdecho_test failed on ${target}_osc"
14213 $LCTL get_param osc.$osc.import
14214 error "there is no osc.$osc.import target"
14217 run_test 180a "test obdecho on osc"
14220 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14221 remote_ost_nodsh && skip "remote OST with nodsh"
14223 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14224 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14225 error "failed to load module obdecho"
14227 local target=$(do_facet ost1 $LCTL dl |
14228 awk '/obdfilter/ { print $4; exit; }')
14230 if [ -n "$target" ]; then
14231 obdecho_test $target ost1 || error "obdecho_test failed with $?"
14233 do_facet ost1 $LCTL dl
14234 error "there is no obdfilter target on ost1"
14237 run_test 180b "test obdecho directly on obdfilter"
14239 test_180c() { # LU-2598
14240 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14241 remote_ost_nodsh && skip "remote OST with nodsh"
14242 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
14243 skip "Need MDS version at least 2.4.0"
14245 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14246 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14247 error "failed to load module obdecho"
14249 local target=$(do_facet ost1 $LCTL dl |
14250 awk '/obdfilter/ { print $4; exit; }')
14252 if [ -n "$target" ]; then
14253 local pages=16384 # 64MB bulk I/O RPC size
14255 obdecho_test "$target" ost1 "$pages" ||
14256 error "obdecho_test with pages=$pages failed with $?"
14258 do_facet ost1 $LCTL dl
14259 error "there is no obdfilter target on ost1"
14262 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
14264 test_181() { # bug 22177
14265 test_mkdir $DIR/$tdir
14266 # create enough files to index the directory
14267 createmany -o $DIR/$tdir/foobar 4000
14268 # print attributes for debug purpose
14271 multiop_bg_pause $DIR/$tdir D_Sc || return 1
14273 # remove the files & current working dir
14274 unlinkmany $DIR/$tdir/foobar 4000
14276 kill -USR1 $MULTIPID
14278 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
14281 run_test 181 "Test open-unlinked dir ========================"
14287 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14289 $LCTL set_param mdc.*.rpc_stats=clear
14291 for (( i = 0; i < $tcount; i++ )) ; do
14292 mkdir $DIR/$tdir/$i
14295 for (( i = 0; i < $tcount; i++ )) ; do
14296 createmany -o $DIR/$tdir/$i/f- $fcount &
14300 for (( i = 0; i < $tcount; i++ )) ; do
14301 unlinkmany $DIR/$tdir/$i/f- $fcount &
14305 $LCTL get_param mdc.*.rpc_stats
14309 run_test 182 "Test parallel modify metadata operations ================"
14311 test_183() { # LU-2275
14312 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14313 remote_mds_nodsh && skip "remote MDS with nodsh"
14314 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
14315 skip "Need MDS version at least 2.3.56"
14317 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14318 echo aaa > $DIR/$tdir/$tfile
14320 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
14321 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
14323 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
14324 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
14326 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
14328 # Flush negative dentry cache
14329 touch $DIR/$tdir/$tfile
14331 # We are not checking for any leaked references here, they'll
14332 # become evident next time we do cleanup with module unload.
14335 run_test 183 "No crash or request leak in case of strange dispositions ========"
14337 # test suite 184 is for LU-2016, LU-2017
14339 check_swap_layouts_support
14341 dir0=$DIR/$tdir/$testnum
14342 test_mkdir -p -c1 $dir0
14347 $SETSTRIPE -c1 $file1
14349 $SETSTRIPE -c2 $file2
14351 gen1=$($GETSTRIPE -g $file1)
14352 gen2=$($GETSTRIPE -g $file2)
14354 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
14355 gen=$($GETSTRIPE -g $file1)
14356 [[ $gen1 != $gen ]] ||
14357 "Layout generation on $file1 does not change"
14358 gen=$($GETSTRIPE -g $file2)
14359 [[ $gen2 != $gen ]] ||
14360 "Layout generation on $file2 does not change"
14362 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
14363 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
14365 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
14367 run_test 184a "Basic layout swap"
14370 check_swap_layouts_support
14372 dir0=$DIR/$tdir/$testnum
14373 mkdir -p $dir0 || error "creating dir $dir0"
14380 $SETSTRIPE -c1 $file1
14381 $SETSTRIPE -c2 $file2
14382 $SETSTRIPE -c1 $file3
14383 chown $RUNAS_ID $file3
14384 gen1=$($GETSTRIPE -g $file1)
14385 gen2=$($GETSTRIPE -g $file2)
14387 $LFS swap_layouts $dir1 $dir2 &&
14388 error "swap of directories layouts should fail"
14389 $LFS swap_layouts $dir1 $file1 &&
14390 error "swap of directory and file layouts should fail"
14391 $RUNAS $LFS swap_layouts $file1 $file2 &&
14392 error "swap of file we cannot write should fail"
14393 $LFS swap_layouts $file1 $file3 &&
14394 error "swap of file with different owner should fail"
14395 /bin/true # to clear error code
14397 run_test 184b "Forbidden layout swap (will generate errors)"
14400 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14401 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14402 check_swap_layouts_support
14404 local dir0=$DIR/$tdir/$testnum
14405 mkdir -p $dir0 || error "creating dir $dir0"
14407 local ref1=$dir0/ref1
14408 local ref2=$dir0/ref2
14409 local file1=$dir0/file1
14410 local file2=$dir0/file2
14411 # create a file large enough for the concurrent test
14412 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14413 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14414 echo "ref file size: ref1($(stat -c %s $ref1))," \
14415 "ref2($(stat -c %s $ref2))"
14418 dd if=$ref1 of=$file1 bs=16k &
14421 # Make sure dd starts to copy file
14422 while [ ! -f $file1 ]; do sleep 0.1; done
14424 $LFS swap_layouts $file1 $file2
14427 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14428 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14430 # how many bytes copied before swapping layout
14431 local copied=$(stat -c %s $file2)
14432 local remaining=$(stat -c %s $ref1)
14433 remaining=$((remaining - copied))
14434 echo "Copied $copied bytes before swapping layout..."
14436 cmp -n $copied $file1 $ref2 | grep differ &&
14437 error "Content mismatch [0, $copied) of ref2 and file1"
14438 cmp -n $copied $file2 $ref1 ||
14439 error "Content mismatch [0, $copied) of ref1 and file2"
14440 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14441 error "Content mismatch [$copied, EOF) of ref1 and file1"
14444 rm -f $ref1 $ref2 $file1 $file2
14446 run_test 184c "Concurrent write and layout swap"
14449 check_swap_layouts_support
14450 [ -z "$(which getfattr 2>/dev/null)" ] &&
14451 skip_env "no getfattr command"
14453 local file1=$DIR/$tdir/$tfile-1
14454 local file2=$DIR/$tdir/$tfile-2
14455 local file3=$DIR/$tdir/$tfile-3
14459 mkdir -p $DIR/$tdir
14460 touch $file1 || error "create $file1 failed"
14461 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14462 error "create $file2 failed"
14463 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14464 error "create $file3 failed"
14465 lovea1=$(get_layout_param $file1)
14467 $LFS swap_layouts $file2 $file3 ||
14468 error "swap $file2 $file3 layouts failed"
14469 $LFS swap_layouts $file1 $file2 ||
14470 error "swap $file1 $file2 layouts failed"
14472 lovea2=$(get_layout_param $file2)
14475 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14477 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14478 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14480 run_test 184d "allow stripeless layouts swap"
14483 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14484 skip "Need MDS version at least 2.6.94"
14485 check_swap_layouts_support
14486 [ -z "$(which getfattr 2>/dev/null)" ] &&
14487 skip_env "no getfattr command"
14489 local file1=$DIR/$tdir/$tfile-1
14490 local file2=$DIR/$tdir/$tfile-2
14491 local file3=$DIR/$tdir/$tfile-3
14494 mkdir -p $DIR/$tdir
14495 touch $file1 || error "create $file1 failed"
14496 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14497 error "create $file2 failed"
14498 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14499 error "create $file3 failed"
14501 $LFS swap_layouts $file1 $file2 ||
14502 error "swap $file1 $file2 layouts failed"
14504 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14505 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14507 echo 123 > $file1 || error "Should be able to write into $file1"
14509 $LFS swap_layouts $file1 $file3 ||
14510 error "swap $file1 $file3 layouts failed"
14512 echo 123 > $file1 || error "Should be able to write into $file1"
14514 rm -rf $file1 $file2 $file3
14516 run_test 184e "Recreate layout after stripeless layout swaps"
14519 # Create a file with name longer than sizeof(struct stat) ==
14520 # 144 to see if we can get chars from the file name to appear
14521 # in the returned striping. Note that 'f' == 0x66.
14522 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
14524 mkdir -p $DIR/$tdir
14525 mcreate $DIR/$tdir/$file
14526 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
14527 error "IOC_MDC_GETFILEINFO returned garbage striping"
14530 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
14532 test_185() { # LU-2441
14533 # LU-3553 - no volatile file support in old servers
14534 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
14535 skip "Need MDS version at least 2.3.60"
14537 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14538 touch $DIR/$tdir/spoo
14539 local mtime1=$(stat -c "%Y" $DIR/$tdir)
14540 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
14541 error "cannot create/write a volatile file"
14542 [ "$FILESET" == "" ] &&
14543 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
14544 error "FID is still valid after close"
14546 multiop_bg_pause $DIR/$tdir vVw4096_c
14553 # assume that the next FID for this client is sequential, since stdout
14554 # is unfortunately eaten by multiop_bg_pause
14555 local n=$((${fidv[1]} + 1))
14556 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
14557 if [ "$FILESET" == "" ]; then
14558 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
14559 error "FID is missing before close"
14561 kill -USR1 $multi_pid
14562 # 1 second delay, so if mtime change we will see it
14564 local mtime2=$(stat -c "%Y" $DIR/$tdir)
14565 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
14567 run_test 185 "Volatile file support"
14569 function create_check_volatile() {
14573 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
14576 local FID=$(cat /tmp/${tfile}.fid)
14577 [ "$FID" == "" ] && error "can't get FID for volatile"
14578 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
14579 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
14580 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
14584 cancel_lru_locks mdc # flush opencache
14585 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
14590 # LU-12516 - volatile creation via .lustre
14591 [[ $MDS1_VERSION -ge $(version_code 2.12.2) ]] ||
14592 skip "Need MDS version at least 2.12.2"
14594 create_check_volatile 0
14595 [ $MDSCOUNT -lt 2 ] && return 0
14598 create_check_volatile 1
14602 run_test 185a "Volatile file creation in .lustre/fid/"
14605 remote_mds_nodsh && skip "remote MDS with nodsh"
14606 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14607 skip "Need MDS version at least 2.3.0"
14609 local dir0=$DIR/$tdir/$testnum
14610 mkdir -p $dir0 || error "creating dir $dir0"
14612 local file=$dir0/file1
14613 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
14614 local dv1=$($LFS data_version $file)
14615 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
14616 local dv2=$($LFS data_version $file)
14617 [[ $dv1 != $dv2 ]] ||
14618 error "data version did not change on write $dv1 == $dv2"
14623 run_test 187a "Test data version change"
14626 remote_mds_nodsh && skip "remote MDS with nodsh"
14627 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14628 skip "Need MDS version at least 2.3.0"
14630 local dir0=$DIR/$tdir/$testnum
14631 mkdir -p $dir0 || error "creating dir $dir0"
14633 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
14634 [[ ${DV[0]} != ${DV[1]} ]] ||
14635 error "data version did not change on write"\
14636 " ${DV[0]} == ${DV[1]}"
14641 run_test 187b "Test data version change on volatile file"
14644 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14645 remote_mgs_nodsh && skip "remote MGS with nodsh"
14646 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
14648 local POOL=${POOL:-cea1}
14649 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
14650 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
14653 local last_ost=$(($OSTCOUNT - 1))
14655 local ost_list=$(seq $first_ost $ost_step $last_ost)
14656 local ost_range="$first_ost $last_ost $ost_step"
14657 local test_path=$POOL_ROOT/$POOL_DIR_NAME
14658 local file_dir=$POOL_ROOT/file_tst
14659 local subdir=$test_path/subdir
14663 # former test_200a test_200b
14664 pool_add $POOL || { rc=$? ; break; }
14665 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
14666 # former test_200c test_200d
14667 mkdir -p $test_path
14668 pool_set_dir $POOL $test_path || { rc=$? ; break; }
14669 pool_check_dir $POOL $test_path || { rc=$? ; break; }
14671 pool_check_dir $POOL $subdir || { rc=$? ; break; }
14672 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
14673 || { rc=$? ; break; }
14674 # former test_200e test_200f
14675 local files=$((OSTCOUNT*3))
14676 pool_alloc_files $POOL $test_path $files "$ost_list" \
14677 || { rc=$? ; break; }
14678 pool_create_files $POOL $file_dir $files "$ost_list" \
14679 || { rc=$? ; break; }
14680 # former test_200g test_200h
14681 pool_lfs_df $POOL || { rc=$? ; break; }
14682 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
14684 # former test_201a test_201b test_201c
14685 pool_remove_first_target $POOL || { rc=$? ; break; }
14687 local f=$test_path/$tfile
14688 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
14689 pool_remove $POOL $f || { rc=$? ; break; }
14697 run_test 200 "OST pools"
14699 # usage: default_attr <count | size | offset>
14701 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
14704 # usage: check_default_stripe_attr
14705 check_default_stripe_attr() {
14706 ACTUAL=$($GETSTRIPE $* $DIR/$tdir)
14709 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
14711 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
14715 error "unknown getstripe attr '$1'"
14718 [ $ACTUAL == $EXPECTED ] ||
14719 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
14723 test_mkdir $DIR/$tdir
14724 $SETSTRIPE --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
14726 check_default_stripe_attr --stripe-count
14727 check_default_stripe_attr --stripe-size
14728 check_default_stripe_attr --stripe-index
14730 run_test 204a "Print default stripe attributes"
14733 test_mkdir $DIR/$tdir
14734 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14736 check_default_stripe_attr --stripe-size
14737 check_default_stripe_attr --stripe-index
14739 run_test 204b "Print default stripe size and offset"
14742 test_mkdir $DIR/$tdir
14743 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14745 check_default_stripe_attr --stripe-count
14746 check_default_stripe_attr --stripe-index
14748 run_test 204c "Print default stripe count and offset"
14751 test_mkdir $DIR/$tdir
14752 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14754 check_default_stripe_attr --stripe-count
14755 check_default_stripe_attr --stripe-size
14757 run_test 204d "Print default stripe count and size"
14760 test_mkdir $DIR/$tdir
14761 $SETSTRIPE -d $DIR/$tdir
14763 check_default_stripe_attr --stripe-count --raw
14764 check_default_stripe_attr --stripe-size --raw
14765 check_default_stripe_attr --stripe-index --raw
14767 run_test 204e "Print raw stripe attributes"
14770 test_mkdir $DIR/$tdir
14771 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14773 check_default_stripe_attr --stripe-size --raw
14774 check_default_stripe_attr --stripe-index --raw
14776 run_test 204f "Print raw stripe size and offset"
14779 test_mkdir $DIR/$tdir
14780 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14782 check_default_stripe_attr --stripe-count --raw
14783 check_default_stripe_attr --stripe-index --raw
14785 run_test 204g "Print raw stripe count and offset"
14788 test_mkdir $DIR/$tdir
14789 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14791 check_default_stripe_attr --stripe-count --raw
14792 check_default_stripe_attr --stripe-size --raw
14794 run_test 204h "Print raw stripe count and size"
14796 # Figure out which job scheduler is being used, if any,
14797 # or use a fake one
14798 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
14799 JOBENV=SLURM_JOB_ID
14800 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
14802 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
14804 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
14805 JOBENV=LOADL_STEP_ID
14806 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
14809 $LCTL list_param jobid_name > /dev/null 2>&1
14810 if [ $? -eq 0 ]; then
14816 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
14818 verify_jobstats() {
14823 # we don't really need to clear the stats for this test to work, since each
14824 # command has a unique jobid, but it makes debugging easier if needed.
14825 # for facet in $facets; do
14826 # local dev=$(convert_facet2label $facet)
14827 # # clear old jobstats
14828 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
14831 # use a new JobID for each test, or we might see an old one
14832 [ "$JOBENV" = "FAKE_JOBID" ] &&
14833 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
14835 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
14837 [ "$JOBENV" = "nodelocal" ] && {
14838 FAKE_JOBID=id.$testnum.%e.$RANDOM
14839 $LCTL set_param jobid_name=$FAKE_JOBID
14840 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
14843 log "Test: ${cmd[*]}"
14844 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
14846 if [ $JOBENV = "FAKE_JOBID" ]; then
14847 FAKE_JOBID=$JOBVAL ${cmd[*]}
14852 # all files are created on OST0000
14853 for facet in $facets; do
14854 local stats="*.$(convert_facet2label $facet).job_stats"
14856 # strip out libtool wrappers for in-tree executables
14857 if [ $(do_facet $facet lctl get_param $stats |
14858 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
14859 do_facet $facet lctl get_param $stats
14860 error "No jobstats for $JOBVAL found on $facet::$stats"
14866 local new_jobenv=$1
14868 set_persistent_param_and_check client "jobid_var" \
14869 "$FSNAME.sys.jobid_var" $new_jobenv
14872 test_205a() { # Job stats
14873 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14874 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
14875 skip "Need MDS version with at least 2.7.1"
14876 remote_mgs_nodsh && skip "remote MGS with nodsh"
14877 remote_mds_nodsh && skip "remote MDS with nodsh"
14878 remote_ost_nodsh && skip "remote OST with nodsh"
14879 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
14880 skip "Server doesn't support jobstats"
14881 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
14883 local old_jobenv=$($LCTL get_param -n jobid_var)
14884 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
14886 if [[ $PERM_CMD = *"set_param -P"* ]]; then
14887 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
14889 stack_trap "do_facet mgs $PERM_CMD \
14890 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
14894 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
14895 mdt.*.job_cleanup_interval | head -n 1)
14896 local new_interval=5
14897 do_facet $SINGLEMDS \
14898 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
14899 stack_trap "do_facet $SINGLEMDS \
14900 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
14901 local start=$SECONDS
14905 cmd="mkdir $DIR/$tdir"
14906 verify_jobstats "$cmd" "$SINGLEMDS"
14908 cmd="rmdir $DIR/$tdir"
14909 verify_jobstats "$cmd" "$SINGLEMDS"
14910 # mkdir on secondary MDT
14911 if [ $MDSCOUNT -gt 1 ]; then
14912 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
14913 verify_jobstats "$cmd" "mds2"
14916 cmd="mknod $DIR/$tfile c 1 3"
14917 verify_jobstats "$cmd" "$SINGLEMDS"
14919 cmd="rm -f $DIR/$tfile"
14920 verify_jobstats "$cmd" "$SINGLEMDS"
14921 # create all files on OST0000 so verify_jobstats can find OST stats
14923 cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile"
14924 verify_jobstats "$cmd" "$SINGLEMDS"
14926 cmd="touch $DIR/$tfile"
14927 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14929 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
14930 verify_jobstats "$cmd" "ost1"
14932 cancel_lru_locks osc
14933 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
14934 verify_jobstats "$cmd" "ost1"
14936 cmd="$TRUNCATE $DIR/$tfile 0"
14937 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14939 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
14940 verify_jobstats "$cmd" "$SINGLEMDS"
14941 # jobstats expiry - sleep until old stats should be expired
14942 local left=$((new_interval + 5 - (SECONDS - start)))
14943 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
14944 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
14946 cmd="mkdir $DIR/$tdir.expire"
14947 verify_jobstats "$cmd" "$SINGLEMDS"
14948 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
14949 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
14951 # Ensure that jobid are present in changelog (if supported by MDS)
14952 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
14953 changelog_dump | tail -10
14954 jobids=$(changelog_dump | tail -9 | grep -c "j=")
14955 [ $jobids -eq 9 ] ||
14956 error "Wrong changelog jobid count $jobids != 9"
14960 jobstats_set $JOBENV
14962 changelog_dump | grep $tfile
14963 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
14964 [ $jobids -eq 0 ] ||
14965 error "Unexpected jobids when jobid_var=$JOBENV"
14968 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
14969 JOBENV="JOBCOMPLEX"
14970 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
14972 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
14974 run_test 205a "Verify job stats"
14978 $LCTL set_param jobid_var=USER jobid_name="%e.%u"
14979 env -i USERTESTJOBSTATS=foolish touch $DIR/$tfile.1
14980 do_facet $SINGLEMDS $LCTL get_param mdt.*.job_stats |
14981 grep job_id: | grep foolish &&
14982 error "Unexpected jobid found"
14985 run_test 205b "Verify job stats jobid parsing"
14987 # LU-1480, LU-1773 and LU-1657
14989 mkdir -p $DIR/$tdir
14990 $SETSTRIPE -c -1 $DIR/$tdir
14991 #define OBD_FAIL_LOV_INIT 0x1403
14992 $LCTL set_param fail_loc=0xa0001403
14993 $LCTL set_param fail_val=1
14994 touch $DIR/$tdir/$tfile || true
14996 run_test 206 "fail lov_init_raid0() doesn't lbug"
14999 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15000 local fsz=`stat -c %s $DIR/$tfile`
15001 cancel_lru_locks mdc
15003 # do not return layout in getattr intent
15004 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
15005 $LCTL set_param fail_loc=0x170
15006 local sz=`stat -c %s $DIR/$tfile`
15008 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
15012 run_test 207a "can refresh layout at glimpse"
15015 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15016 local cksum=`md5sum $DIR/$tfile`
15017 local fsz=`stat -c %s $DIR/$tfile`
15018 cancel_lru_locks mdc
15019 cancel_lru_locks osc
15021 # do not return layout in getattr intent
15022 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
15023 $LCTL set_param fail_loc=0x171
15025 # it will refresh layout after the file is opened but before read issues
15026 echo checksum is "$cksum"
15027 echo "$cksum" |md5sum -c --quiet || error "file differs"
15031 run_test 207b "can refresh layout at open"
15034 # FIXME: in this test suite, only RD lease is used. This is okay
15035 # for now as only exclusive open is supported. After generic lease
15036 # is done, this test suite should be revised. - Jinshan
15038 remote_mds_nodsh && skip "remote MDS with nodsh"
15039 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
15040 skip "Need MDS version at least 2.4.52"
15042 echo "==== test 1: verify get lease work"
15043 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
15045 echo "==== test 2: verify lease can be broken by upcoming open"
15046 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15050 $MULTIOP $DIR/$tfile oO_RDONLY:c
15051 kill -USR1 $PID && wait $PID || error "break lease error"
15053 echo "==== test 3: verify lease can't be granted if an open already exists"
15054 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
15058 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
15059 kill -USR1 $PID && wait $PID || error "open file error"
15061 echo "==== test 4: lease can sustain over recovery"
15062 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
15068 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
15070 echo "==== test 5: lease broken can't be regained by replay"
15071 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15075 # open file to break lease and then recovery
15076 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
15079 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
15083 run_test 208 "Exclusive open"
15086 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
15087 skip_env "must have disp_stripe"
15090 sync; sleep 5; sync;
15092 echo 3 > /proc/sys/vm/drop_caches
15093 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15095 # open/close 500 times
15096 for i in $(seq 500); do
15100 echo 3 > /proc/sys/vm/drop_caches
15101 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15103 echo "before: $req_before, after: $req_after"
15104 [ $((req_after - req_before)) -ge 300 ] &&
15105 error "open/close requests are not freed"
15108 run_test 209 "read-only open/close requests should be freed promptly"
15112 size=$((size % 8192 + 1))
15113 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
15114 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
15115 rm -f $DIR/f212 $DIR/f212.xyz
15117 run_test 212 "Sendfile test ============================================"
15120 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
15121 cancel_lru_locks osc
15122 lctl set_param fail_loc=0x8000040f
15123 # generate a read lock
15124 cat $DIR/$tfile > /dev/null
15125 # write to the file, it will try to cancel the above read lock.
15126 cat /etc/hosts >> $DIR/$tfile
15128 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
15130 test_214() { # for bug 20133
15131 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
15132 for (( i=0; i < 340; i++ )) ; do
15133 touch $DIR/$tdir/d214c/a$i
15136 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
15137 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
15138 ls $DIR/d214c || error "ls $DIR/d214c failed"
15139 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
15140 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
15142 run_test 214 "hash-indexed directory test - bug 20133"
15144 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
15145 create_lnet_proc_files() {
15146 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
15149 # counterpart of create_lnet_proc_files
15150 remove_lnet_proc_files() {
15151 rm -f $TMP/lnet_$1.sys
15154 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15155 # 3rd arg as regexp for body
15156 check_lnet_proc_stats() {
15157 local l=$(cat "$TMP/lnet_$1" |wc -l)
15158 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
15160 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
15163 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15164 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
15165 # optional and can be regexp for 2nd line (lnet.routes case)
15166 check_lnet_proc_entry() {
15167 local blp=2 # blp stands for 'position of 1st line of body'
15168 [ -z "$5" ] || blp=3 # lnet.routes case
15170 local l=$(cat "$TMP/lnet_$1" |wc -l)
15171 # subtracting one from $blp because the body can be empty
15172 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
15174 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
15175 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
15177 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
15178 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
15180 # bail out if any unexpected line happened
15181 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
15182 [ "$?" != 0 ] || error "$2 misformatted"
15185 test_215() { # for bugs 18102, 21079, 21517
15186 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15188 local N='(0|[1-9][0-9]*)' # non-negative numeric
15189 local P='[1-9][0-9]*' # positive numeric
15190 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
15191 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
15192 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
15193 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
15195 local L1 # regexp for 1st line
15196 local L2 # regexp for 2nd line (optional)
15197 local BR # regexp for the rest (body)
15199 # lnet.stats should look as 11 space-separated non-negative numerics
15200 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
15201 create_lnet_proc_files "stats"
15202 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
15203 remove_lnet_proc_files "stats"
15205 # lnet.routes should look like this:
15206 # Routing disabled/enabled
15207 # net hops priority state router
15208 # where net is a string like tcp0, hops > 0, priority >= 0,
15209 # state is up/down,
15210 # router is a string like 192.168.1.1@tcp2
15211 L1="^Routing (disabled|enabled)$"
15212 L2="^net +hops +priority +state +router$"
15213 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
15214 create_lnet_proc_files "routes"
15215 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
15216 remove_lnet_proc_files "routes"
15218 # lnet.routers should look like this:
15219 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
15220 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
15221 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
15222 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
15223 L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
15224 BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
15225 create_lnet_proc_files "routers"
15226 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
15227 remove_lnet_proc_files "routers"
15229 # lnet.peers should look like this:
15230 # nid refs state last max rtr min tx min queue
15231 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
15232 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
15233 # numeric (0 or >0 or <0), queue >= 0.
15234 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
15235 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
15236 create_lnet_proc_files "peers"
15237 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
15238 remove_lnet_proc_files "peers"
15240 # lnet.buffers should look like this:
15241 # pages count credits min
15242 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
15243 L1="^pages +count +credits +min$"
15244 BR="^ +$N +$N +$I +$I$"
15245 create_lnet_proc_files "buffers"
15246 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
15247 remove_lnet_proc_files "buffers"
15249 # lnet.nis should look like this:
15250 # nid status alive refs peer rtr max tx min
15251 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
15252 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
15253 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
15254 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
15255 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
15256 create_lnet_proc_files "nis"
15257 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
15258 remove_lnet_proc_files "nis"
15260 # can we successfully write to lnet.stats?
15261 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
15263 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
15265 test_216() { # bug 20317
15266 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15267 remote_ost_nodsh && skip "remote OST with nodsh"
15270 local facets=$(get_facets OST)
15271 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15273 save_lustre_params client "osc.*.contention_seconds" > $p
15274 save_lustre_params $facets \
15275 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
15276 save_lustre_params $facets \
15277 "ldlm.namespaces.filter-*.contended_locks" >> $p
15278 save_lustre_params $facets \
15279 "ldlm.namespaces.filter-*.contention_seconds" >> $p
15280 clear_stats osc.*.osc_stats
15282 # agressive lockless i/o settings
15283 do_nodes $(comma_list $(osts_nodes)) \
15284 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
15285 ldlm.namespaces.filter-*.contended_locks=0 \
15286 ldlm.namespaces.filter-*.contention_seconds=60"
15287 lctl set_param -n osc.*.contention_seconds=60
15289 $DIRECTIO write $DIR/$tfile 0 10 4096
15290 $CHECKSTAT -s 40960 $DIR/$tfile
15292 # disable lockless i/o
15293 do_nodes $(comma_list $(osts_nodes)) \
15294 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
15295 ldlm.namespaces.filter-*.contended_locks=32 \
15296 ldlm.namespaces.filter-*.contention_seconds=0"
15297 lctl set_param -n osc.*.contention_seconds=0
15298 clear_stats osc.*.osc_stats
15300 dd if=/dev/zero of=$DIR/$tfile count=0
15301 $CHECKSTAT -s 0 $DIR/$tfile
15303 restore_lustre_params <$p
15307 run_test 216 "check lockless direct write updates file size and kms correctly"
15309 test_217() { # bug 22430
15310 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15315 for node in $(nodes_list); do
15316 nid=$(host_nids_address $node $NETTYPE)
15317 if [[ $nid = *-* ]] ; then
15318 echo "lctl ping $(h2nettype $nid)"
15319 lctl ping $(h2nettype $nid)
15321 echo "skipping $node (no hyphen detected)"
15325 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
15328 # do directio so as not to populate the page cache
15329 log "creating a 10 Mb file"
15330 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
15331 log "starting reads"
15332 dd if=$DIR/$tfile of=/dev/null bs=4096 &
15333 log "truncating the file"
15334 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
15336 kill %+ || true # reads might have finished
15337 echo "wait until dd is finished"
15339 log "removing the temporary file"
15340 rm -rf $DIR/$tfile || error "tmp file removal failed"
15342 run_test 218 "parallel read and truncate should not deadlock"
15345 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15347 # write one partial page
15348 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
15349 # set no grant so vvp_io_commit_write will do sync write
15350 $LCTL set_param fail_loc=0x411
15351 # write a full page at the end of file
15352 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
15354 $LCTL set_param fail_loc=0
15355 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
15356 $LCTL set_param fail_loc=0x411
15357 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
15360 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
15361 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
15363 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
15365 test_220() { #LU-325
15366 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15367 remote_ost_nodsh && skip "remote OST with nodsh"
15368 remote_mds_nodsh && skip "remote MDS with nodsh"
15369 remote_mgs_nodsh && skip "remote MGS with nodsh"
15373 # create on MDT0000 so the last_id and next_id are correct
15375 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
15379 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
15380 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
15381 osp.$mdtosc_proc1.prealloc_last_id)
15382 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15383 osp.$mdtosc_proc1.prealloc_next_id)
15387 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15388 #define OBD_FAIL_OST_ENOINO 0x229
15389 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15390 create_pool $FSNAME.$TESTNAME || return 1
15391 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15393 $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15395 MDSOBJS=$((last_id - next_id))
15396 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15398 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15399 echo "OST still has $count kbytes free"
15401 echo "create $MDSOBJS files @next_id..."
15402 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15404 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15405 osp.$mdtosc_proc1.prealloc_last_id)
15406 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15407 osp.$mdtosc_proc1.prealloc_next_id)
15409 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15414 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15415 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15417 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15418 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15419 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15420 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15421 echo "unlink $MDSOBJS files @$next_id..."
15422 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15424 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15427 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15429 dd if=`which date` of=$MOUNT/date oflag=sync
15430 chmod +x $MOUNT/date
15432 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15433 $LCTL set_param fail_loc=0x80001401
15435 $MOUNT/date > /dev/null
15438 run_test 221 "make sure fault and truncate race to not cause OOM"
15441 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15444 test_mkdir $DIR/$tdir
15445 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15446 createmany -o $DIR/$tdir/$tfile 10
15447 cancel_lru_locks mdc
15448 cancel_lru_locks osc
15449 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15450 $LCTL set_param fail_loc=0x31a
15451 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15452 $LCTL set_param fail_loc=0
15455 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15458 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15461 test_mkdir $DIR/$tdir
15462 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15463 createmany -o $DIR/$tdir/$tfile 10
15464 cancel_lru_locks mdc
15465 cancel_lru_locks osc
15466 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15467 $LCTL set_param fail_loc=0x31a
15468 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15469 $LCTL set_param fail_loc=0
15471 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15474 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15477 test_mkdir $DIR/$tdir
15478 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15479 createmany -o $DIR/$tdir/$tfile 10
15480 cancel_lru_locks mdc
15481 cancel_lru_locks osc
15482 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15483 $LCTL set_param fail_loc=0x31b
15484 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15485 $LCTL set_param fail_loc=0
15488 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15490 test_224a() { # LU-1039, MRP-303
15491 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15493 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15494 $LCTL set_param fail_loc=0x508
15495 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15496 $LCTL set_param fail_loc=0
15499 run_test 224a "Don't panic on bulk IO failure"
15501 test_224b() { # LU-1039, MRP-303
15502 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15504 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15505 cancel_lru_locks osc
15506 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15507 $LCTL set_param fail_loc=0x515
15508 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15509 $LCTL set_param fail_loc=0
15512 run_test 224b "Don't panic on bulk IO failure"
15514 test_224c() { # LU-6441
15515 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15516 remote_mds_nodsh && skip "remote MDS with nodsh"
15518 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15519 save_writethrough $p
15520 set_cache writethrough on
15522 local pages_per_rpc=$($LCTL get_param \
15523 osc.*.max_pages_per_rpc)
15524 local at_max=$($LCTL get_param -n at_max)
15525 local timeout=$($LCTL get_param -n timeout)
15526 local test_at="at_max"
15527 local param_at="$FSNAME.sys.at_max"
15528 local test_timeout="timeout"
15529 local param_timeout="$FSNAME.sys.timeout"
15531 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
15533 set_persistent_param_and_check client "$test_at" "$param_at" 0
15534 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
15536 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
15537 do_facet ost1 $LCTL set_param fail_loc=0x520
15538 $LFS setstripe -c 1 -i 0 $DIR/$tfile
15539 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
15541 do_facet ost1 $LCTL set_param fail_loc=0
15543 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
15544 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
15547 $LCTL set_param -n $pages_per_rpc
15548 restore_lustre_params < $p
15551 run_test 224c "Don't hang if one of md lost during large bulk RPC"
15553 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
15555 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15556 if [ -z ${MDSSURVEY} ]; then
15557 skip_env "mds-survey not found"
15559 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15560 skip "Need MDS version at least 2.2.51"
15562 local mds=$(facet_host $SINGLEMDS)
15563 local target=$(do_nodes $mds 'lctl dl' |
15564 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15566 local cmd1="file_count=1000 thrhi=4"
15567 local cmd2="dir_count=2 layer=mdd stripe_count=0"
15568 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15569 local cmd="$cmd1 $cmd2 $cmd3"
15571 rm -f ${TMP}/mds_survey*
15573 eval $cmd || error "mds-survey with zero-stripe failed"
15574 cat ${TMP}/mds_survey*
15575 rm -f ${TMP}/mds_survey*
15577 run_test 225a "Metadata survey sanity with zero-stripe"
15580 if [ -z ${MDSSURVEY} ]; then
15581 skip_env "mds-survey not found"
15583 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15584 skip "Need MDS version at least 2.2.51"
15585 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15586 remote_mds_nodsh && skip "remote MDS with nodsh"
15587 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
15588 skip_env "Need to mount OST to test"
15591 local mds=$(facet_host $SINGLEMDS)
15592 local target=$(do_nodes $mds 'lctl dl' |
15593 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15595 local cmd1="file_count=1000 thrhi=4"
15596 local cmd2="dir_count=2 layer=mdd stripe_count=1"
15597 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15598 local cmd="$cmd1 $cmd2 $cmd3"
15600 rm -f ${TMP}/mds_survey*
15602 eval $cmd || error "mds-survey with stripe_count failed"
15603 cat ${TMP}/mds_survey*
15604 rm -f ${TMP}/mds_survey*
15606 run_test 225b "Metadata survey sanity with stripe_count = 1"
15608 mcreate_path2fid () {
15614 local path=$DIR/$tdir/$name
15619 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
15620 error "cannot create $desc"
15622 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
15624 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
15626 fid_path=$($LFS fid2path $MOUNT $fid)
15628 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
15630 [ "$path" == "$fid_path" ] ||
15631 error "fid2path returned $fid_path, expected $path"
15633 echo "pass with $path and $fid"
15638 mkdir -p $DIR/$tdir
15640 mcreate_path2fid 0010666 0 0 fifo "FIFO"
15641 mcreate_path2fid 0020666 1 3 null "character special file (null)"
15642 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
15643 mcreate_path2fid 0040666 0 0 dir "directory"
15644 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
15645 mcreate_path2fid 0100666 0 0 file "regular file"
15646 mcreate_path2fid 0120666 0 0 link "symbolic link"
15647 mcreate_path2fid 0140666 0 0 sock "socket"
15649 run_test 226a "call path2fid and fid2path on files of all type"
15652 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15657 mkdir -p $DIR/$tdir
15658 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
15659 error "create remote directory failed"
15660 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
15661 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
15662 "character special file (null)"
15663 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
15664 "character special file (no device)"
15665 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
15666 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
15667 "block special file (loop)"
15668 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
15669 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
15670 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
15672 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
15674 # LU-1299 Executing or running ldd on a truncated executable does not
15675 # cause an out-of-memory condition.
15677 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15678 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
15680 dd if=$(which date) of=$MOUNT/date bs=1k count=1
15681 chmod +x $MOUNT/date
15683 $MOUNT/date > /dev/null
15684 ldd $MOUNT/date > /dev/null
15687 run_test 227 "running truncated executable does not cause OOM"
15689 # LU-1512 try to reuse idle OI blocks
15691 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15692 remote_mds_nodsh && skip "remote MDS with nodsh"
15693 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15695 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15696 local myDIR=$DIR/$tdir
15699 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15700 $LCTL set_param fail_loc=0x80001002
15701 createmany -o $myDIR/t- 10000
15702 $LCTL set_param fail_loc=0
15703 # The guard is current the largest FID holder
15705 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15707 local IDX=$(($SEQ % 64))
15709 do_facet $SINGLEMDS sync
15710 # Make sure journal flushed.
15712 local blk1=$(do_facet $SINGLEMDS \
15713 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15714 grep Blockcount | awk '{print $4}')
15716 # Remove old files, some OI blocks will become idle.
15717 unlinkmany $myDIR/t- 10000
15718 # Create new files, idle OI blocks should be reused.
15719 createmany -o $myDIR/t- 2000
15720 do_facet $SINGLEMDS sync
15721 # Make sure journal flushed.
15723 local blk2=$(do_facet $SINGLEMDS \
15724 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15725 grep Blockcount | awk '{print $4}')
15727 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15729 run_test 228a "try to reuse idle OI blocks"
15732 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15733 remote_mds_nodsh && skip "remote MDS with nodsh"
15734 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15736 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15737 local myDIR=$DIR/$tdir
15740 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15741 $LCTL set_param fail_loc=0x80001002
15742 createmany -o $myDIR/t- 10000
15743 $LCTL set_param fail_loc=0
15744 # The guard is current the largest FID holder
15746 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15748 local IDX=$(($SEQ % 64))
15750 do_facet $SINGLEMDS sync
15751 # Make sure journal flushed.
15753 local blk1=$(do_facet $SINGLEMDS \
15754 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15755 grep Blockcount | awk '{print $4}')
15757 # Remove old files, some OI blocks will become idle.
15758 unlinkmany $myDIR/t- 10000
15761 stop $SINGLEMDS || error "Fail to stop MDT."
15763 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
15765 df $MOUNT || error "Fail to df."
15766 # Create new files, idle OI blocks should be reused.
15767 createmany -o $myDIR/t- 2000
15768 do_facet $SINGLEMDS sync
15769 # Make sure journal flushed.
15771 local blk2=$(do_facet $SINGLEMDS \
15772 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15773 grep Blockcount | awk '{print $4}')
15775 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15777 run_test 228b "idle OI blocks can be reused after MDT restart"
15781 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15782 remote_mds_nodsh && skip "remote MDS with nodsh"
15783 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15785 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15786 local myDIR=$DIR/$tdir
15789 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15790 $LCTL set_param fail_loc=0x80001002
15791 # 20000 files can guarantee there are index nodes in the OI file
15792 createmany -o $myDIR/t- 20000
15793 $LCTL set_param fail_loc=0
15794 # The guard is current the largest FID holder
15796 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15798 local IDX=$(($SEQ % 64))
15800 do_facet $SINGLEMDS sync
15801 # Make sure journal flushed.
15803 local blk1=$(do_facet $SINGLEMDS \
15804 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15805 grep Blockcount | awk '{print $4}')
15807 # Remove old files, some OI blocks will become idle.
15808 unlinkmany $myDIR/t- 20000
15810 # The OI file should become empty now
15812 # Create new files, idle OI blocks should be reused.
15813 createmany -o $myDIR/t- 2000
15814 do_facet $SINGLEMDS sync
15815 # Make sure journal flushed.
15817 local blk2=$(do_facet $SINGLEMDS \
15818 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15819 grep Blockcount | awk '{print $4}')
15821 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15823 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
15825 test_229() { # LU-2482, LU-3448
15826 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15827 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
15828 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
15829 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
15833 # Create a file with a released layout and stripe count 2.
15834 $MULTIOP $DIR/$tfile H2c ||
15835 error "failed to create file with released layout"
15837 $GETSTRIPE -v $DIR/$tfile
15839 local pattern=$($GETSTRIPE -L $DIR/$tfile)
15840 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
15842 local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
15843 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
15844 stat $DIR/$tfile || error "failed to stat released file"
15846 chown $RUNAS_ID $DIR/$tfile ||
15847 error "chown $RUNAS_ID $DIR/$tfile failed"
15849 chgrp $RUNAS_ID $DIR/$tfile ||
15850 error "chgrp $RUNAS_ID $DIR/$tfile failed"
15852 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
15853 rm $DIR/$tfile || error "failed to remove released file"
15855 run_test 229 "getstripe/stat/rm/attr changes work on released files"
15858 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15859 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15860 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15861 skip "Need MDS version at least 2.11.52"
15865 test_mkdir $DIR/$tdir
15866 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
15867 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
15868 [ $mdt_idx -ne 0 ] &&
15869 error "create local directory on wrong MDT $mdt_idx"
15871 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
15872 error "create remote directory failed"
15873 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
15874 [ $mdt_idx -ne $MDTIDX ] &&
15875 error "create remote directory on wrong MDT $mdt_idx"
15877 createmany -o $DIR/$tdir/test_230/t- 10 ||
15878 error "create files on remote directory failed"
15879 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
15880 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
15881 rm -r $DIR/$tdir || error "unlink remote directory failed"
15883 run_test 230a "Create remote directory and files under the remote directory"
15886 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15887 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15888 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15889 skip "Need MDS version at least 2.11.52"
15897 local migrate_dir=$DIR/$tdir/migrate_dir
15898 local other_dir=$DIR/$tdir/other_dir
15900 test_mkdir $DIR/$tdir
15901 test_mkdir -i0 -c1 $migrate_dir
15902 test_mkdir -i0 -c1 $other_dir
15903 for ((i=0; i<10; i++)); do
15904 mkdir -p $migrate_dir/dir_${i}
15905 createmany -o $migrate_dir/dir_${i}/f 10 ||
15906 error "create files under remote dir failed $i"
15909 cp /etc/passwd $migrate_dir/$tfile
15910 cp /etc/passwd $other_dir/$tfile
15911 chattr +SAD $migrate_dir
15912 chattr +SAD $migrate_dir/$tfile
15914 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15915 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15916 local old_dir_mode=$(stat -c%f $migrate_dir)
15917 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
15919 mkdir -p $migrate_dir/dir_default_stripe2
15920 $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2
15921 $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2
15923 mkdir -p $other_dir
15924 ln $migrate_dir/$tfile $other_dir/luna
15925 ln $migrate_dir/$tfile $migrate_dir/sofia
15926 ln $other_dir/$tfile $migrate_dir/david
15927 ln -s $migrate_dir/$tfile $other_dir/zachary
15928 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
15929 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
15931 $LFS migrate -m $MDTIDX $migrate_dir ||
15932 error "fails on migrating remote dir to MDT1"
15934 echo "migratate to MDT1, then checking.."
15935 for ((i = 0; i < 10; i++)); do
15936 for file in $(find $migrate_dir/dir_${i}); do
15937 mdt_index=$($LFS getstripe -m $file)
15938 [ $mdt_index == $MDTIDX ] ||
15939 error "$file is not on MDT${MDTIDX}"
15943 # the multiple link file should still in MDT0
15944 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
15945 [ $mdt_index == 0 ] ||
15946 error "$file is not on MDT${MDTIDX}"
15948 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15949 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15950 error " expect $old_dir_flag get $new_dir_flag"
15952 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15953 [ "$old_file_flag" = "$new_file_flag" ] ||
15954 error " expect $old_file_flag get $new_file_flag"
15956 local new_dir_mode=$(stat -c%f $migrate_dir)
15957 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15958 error "expect mode $old_dir_mode get $new_dir_mode"
15960 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15961 [ "$old_file_mode" = "$new_file_mode" ] ||
15962 error "expect mode $old_file_mode get $new_file_mode"
15964 diff /etc/passwd $migrate_dir/$tfile ||
15965 error "$tfile different after migration"
15967 diff /etc/passwd $other_dir/luna ||
15968 error "luna different after migration"
15970 diff /etc/passwd $migrate_dir/sofia ||
15971 error "sofia different after migration"
15973 diff /etc/passwd $migrate_dir/david ||
15974 error "david different after migration"
15976 diff /etc/passwd $other_dir/zachary ||
15977 error "zachary different after migration"
15979 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15980 error "${tfile}_ln different after migration"
15982 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15983 error "${tfile}_ln_other different after migration"
15985 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
15986 [ $stripe_count = 2 ] ||
15987 error "dir strpe_count $d != 2 after migration."
15989 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
15990 [ $stripe_count = 2 ] ||
15991 error "file strpe_count $d != 2 after migration."
15993 #migrate back to MDT0
15996 $LFS migrate -m $MDTIDX $migrate_dir ||
15997 error "fails on migrating remote dir to MDT0"
15999 echo "migrate back to MDT0, checking.."
16000 for file in $(find $migrate_dir); do
16001 mdt_index=$($LFS getstripe -m $file)
16002 [ $mdt_index == $MDTIDX ] ||
16003 error "$file is not on MDT${MDTIDX}"
16006 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16007 [ "$old_dir_flag" = "$new_dir_flag" ] ||
16008 error " expect $old_dir_flag get $new_dir_flag"
16010 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16011 [ "$old_file_flag" = "$new_file_flag" ] ||
16012 error " expect $old_file_flag get $new_file_flag"
16014 local new_dir_mode=$(stat -c%f $migrate_dir)
16015 [ "$old_dir_mode" = "$new_dir_mode" ] ||
16016 error "expect mode $old_dir_mode get $new_dir_mode"
16018 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
16019 [ "$old_file_mode" = "$new_file_mode" ] ||
16020 error "expect mode $old_file_mode get $new_file_mode"
16022 diff /etc/passwd ${migrate_dir}/$tfile ||
16023 error "$tfile different after migration"
16025 diff /etc/passwd ${other_dir}/luna ||
16026 error "luna different after migration"
16028 diff /etc/passwd ${migrate_dir}/sofia ||
16029 error "sofia different after migration"
16031 diff /etc/passwd ${other_dir}/zachary ||
16032 error "zachary different after migration"
16034 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16035 error "${tfile}_ln different after migration"
16037 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16038 error "${tfile}_ln_other different after migration"
16040 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
16041 [ $stripe_count = 2 ] ||
16042 error "dir strpe_count $d != 2 after migration."
16044 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
16045 [ $stripe_count = 2 ] ||
16046 error "file strpe_count $d != 2 after migration."
16048 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16050 run_test 230b "migrate directory"
16053 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16054 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16055 remote_mds_nodsh && skip "remote MDS with nodsh"
16056 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16057 skip "Need MDS version at least 2.11.52"
16063 local migrate_dir=$DIR/$tdir/migrate_dir
16065 #If migrating directory fails in the middle, all entries of
16066 #the directory is still accessiable.
16067 test_mkdir $DIR/$tdir
16068 test_mkdir -i0 -c1 $migrate_dir
16069 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
16071 createmany -o $migrate_dir/f $total ||
16072 error "create files under ${migrate_dir} failed"
16074 # fail after migrating top dir, and this will fail only once, so the
16075 # first sub file migration will fail (currently f3), others succeed.
16076 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
16077 do_facet mds1 lctl set_param fail_loc=0x1801
16078 local t=$(ls $migrate_dir | wc -l)
16079 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
16080 error "migrate should fail"
16081 local u=$(ls $migrate_dir | wc -l)
16082 [ "$u" == "$t" ] || error "$u != $t during migration"
16084 # add new dir/file should succeed
16085 mkdir $migrate_dir/dir ||
16086 error "mkdir failed under migrating directory"
16087 touch $migrate_dir/file ||
16088 error "create file failed under migrating directory"
16090 # add file with existing name should fail
16091 for file in $migrate_dir/f*; do
16092 stat $file > /dev/null || error "stat $file failed"
16093 $OPENFILE -f O_CREAT:O_EXCL $file &&
16094 error "open(O_CREAT|O_EXCL) $file should fail"
16095 $MULTIOP $file m && error "create $file should fail"
16096 touch $DIR/$tdir/remote_dir/$tfile ||
16097 error "touch $tfile failed"
16098 ln $DIR/$tdir/remote_dir/$tfile $file &&
16099 error "link $file should fail"
16100 mdt_index=$($LFS getstripe -m $file)
16101 if [ $mdt_index == 0 ]; then
16102 # file failed to migrate is not allowed to rename to
16103 mv $DIR/$tdir/remote_dir/$tfile $file &&
16104 error "rename to $file should fail"
16106 mv $DIR/$tdir/remote_dir/$tfile $file ||
16107 error "rename to $file failed"
16109 echo hello >> $file || error "write $file failed"
16112 # resume migration with different options should fail
16113 $LFS migrate -m 0 $migrate_dir &&
16114 error "migrate -m 0 $migrate_dir should fail"
16116 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
16117 error "migrate -c 2 $migrate_dir should fail"
16119 # resume migration should succeed
16120 $LFS migrate -m $MDTIDX $migrate_dir ||
16121 error "migrate $migrate_dir failed"
16123 echo "Finish migration, then checking.."
16124 for file in $(find $migrate_dir); do
16125 mdt_index=$($LFS getstripe -m $file)
16126 [ $mdt_index == $MDTIDX ] ||
16127 error "$file is not on MDT${MDTIDX}"
16130 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16132 run_test 230c "check directory accessiblity if migration failed"
16135 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16136 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16137 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16138 skip "Need MDS version at least 2.11.52"
16140 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
16142 local migrate_dir=$DIR/$tdir/migrate_dir
16152 old_index=$((RANDOM % MDSCOUNT))
16153 old_count=$((MDSCOUNT - old_index))
16154 new_index=$((RANDOM % MDSCOUNT))
16155 new_count=$((MDSCOUNT - new_index))
16156 new_hash="all_char"
16158 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
16159 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
16161 test_mkdir $DIR/$tdir
16162 test_mkdir -i $old_index -c $old_count $migrate_dir
16164 for ((i=0; i<100; i++)); do
16165 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
16166 createmany -o $migrate_dir/dir_${i}/f 100 ||
16167 error "create files under remote dir failed $i"
16170 echo -n "Migrate from MDT$old_index "
16171 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
16172 echo -n "to MDT$new_index"
16173 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
16176 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
16177 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
16178 error "migrate remote dir error"
16180 echo "Finish migration, then checking.."
16181 for file in $(find $migrate_dir); do
16182 mdt_index=$($LFS getstripe -m $file)
16183 if [ $mdt_index -lt $new_index ] ||
16184 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
16185 error "$file is on MDT$mdt_index"
16189 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16191 run_test 230d "check migrate big directory"
16194 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16195 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16196 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16197 skip "Need MDS version at least 2.11.52"
16204 mkdir -p $DIR/$tdir
16205 mkdir $DIR/$tdir/migrate_dir
16206 mkdir $DIR/$tdir/other_dir
16207 touch $DIR/$tdir/migrate_dir/a
16208 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
16209 ls $DIR/$tdir/other_dir
16211 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16212 error "migrate dir fails"
16214 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16215 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16217 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16218 [ $mdt_index == 0 ] || error "a is not on MDT0"
16220 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
16221 error "migrate dir fails"
16223 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
16224 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
16226 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16227 [ $mdt_index == 1 ] || error "a is not on MDT1"
16229 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
16230 [ $mdt_index == 1 ] || error "b is not on MDT1"
16232 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16233 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
16235 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
16237 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16239 run_test 230e "migrate mulitple local link files"
16242 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16243 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16244 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16245 skip "Need MDS version at least 2.11.52"
16250 mkdir -p $DIR/$tdir
16251 mkdir $DIR/$tdir/migrate_dir
16252 $LFS mkdir -i1 $DIR/$tdir/other_dir
16253 touch $DIR/$tdir/migrate_dir/a
16254 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
16255 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
16256 ls $DIR/$tdir/other_dir
16258 # a should be migrated to MDT1, since no other links on MDT0
16259 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16260 error "#1 migrate dir fails"
16261 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16262 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16263 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16264 [ $mdt_index == 1 ] || error "a is not on MDT1"
16266 # a should stay on MDT1, because it is a mulitple link file
16267 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16268 error "#2 migrate dir fails"
16269 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16270 [ $mdt_index == 1 ] || error "a is not on MDT1"
16272 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16273 error "#3 migrate dir fails"
16275 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16276 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
16277 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
16279 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
16280 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
16282 # a should be migrated to MDT0, since no other links on MDT1
16283 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16284 error "#4 migrate dir fails"
16285 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16286 [ $mdt_index == 0 ] || error "a is not on MDT0"
16288 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16290 run_test 230f "migrate mulitple remote link files"
16293 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16294 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16295 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16296 skip "Need MDS version at least 2.11.52"
16298 mkdir -p $DIR/$tdir/migrate_dir
16300 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
16301 error "migrating dir to non-exist MDT succeeds"
16304 run_test 230g "migrate dir to non-exist MDT"
16307 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16308 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16309 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16310 skip "Need MDS version at least 2.11.52"
16314 mkdir -p $DIR/$tdir/migrate_dir
16316 $LFS migrate -m1 $DIR &&
16317 error "migrating mountpoint1 should fail"
16319 $LFS migrate -m1 $DIR/$tdir/.. &&
16320 error "migrating mountpoint2 should fail"
16323 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
16324 error "migrating $tdir/migrate_dir/.. should fail"
16328 run_test 230h "migrate .. and root"
16331 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16332 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16333 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16334 skip "Need MDS version at least 2.11.52"
16336 mkdir -p $DIR/$tdir/migrate_dir
16338 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
16339 error "migration fails with a tailing slash"
16341 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
16342 error "migration fails with two tailing slashes"
16344 run_test 230i "lfs migrate -m tolerates trailing slashes"
16347 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16348 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16349 skip "Need MDS version at least 2.11.52"
16351 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
16352 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
16353 error "create $tfile failed"
16354 cat /etc/passwd > $DIR/$tdir/$tfile
16356 $LFS migrate -m 1 $DIR/$tdir
16358 cmp /etc/passwd $DIR/$tdir/$tfile ||
16359 error "DoM file mismatch after migration"
16361 run_test 230j "DoM file data not changed after dir migration"
16364 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
16365 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16366 skip "Need MDS version at least 2.11.56"
16369 local files_on_starting_mdt=0
16371 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
16372 $LFS getdirstripe $DIR/$tdir
16373 for i in $(seq $total); do
16374 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
16375 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16376 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16379 echo "$files_on_starting_mdt files on MDT0"
16381 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
16382 $LFS getdirstripe $DIR/$tdir
16384 files_on_starting_mdt=0
16385 for i in $(seq $total); do
16386 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16387 error "file $tfile.$i mismatch after migration"
16388 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16389 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16392 echo "$files_on_starting_mdt files on MDT1 after migration"
16393 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16395 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16396 $LFS getdirstripe $DIR/$tdir
16398 files_on_starting_mdt=0
16399 for i in $(seq $total); do
16400 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16401 error "file $tfile.$i mismatch after 2nd migration"
16402 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16403 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16406 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
16407 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16411 run_test 230k "file data not changed after dir migration"
16414 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16415 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16416 skip "Need MDS version at least 2.11.56"
16418 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16419 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16420 error "create files under remote dir failed $i"
16421 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16423 run_test 230l "readdir between MDTs won't crash"
16426 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16427 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16428 skip "Need MDS version at least 2.11.56"
16431 local mig_dir=$DIR/$tdir/migrate_dir
16432 local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16436 echo "Creating files and dirs with xattrs"
16437 test_mkdir $DIR/$tdir
16438 test_mkdir -i0 -c1 $mig_dir
16440 setfattr -n user.attr1 -v $longstr $mig_dir/dir ||
16441 error "cannot set xattr attr1 on dir"
16442 setfattr -n user.attr2 -v $shortstr $mig_dir/dir ||
16443 error "cannot set xattr attr2 on dir"
16444 touch $mig_dir/dir/f0
16445 setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 ||
16446 error "cannot set xattr attr1 on file"
16447 setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 ||
16448 error "cannot set xattr attr2 on file"
16449 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16450 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16451 [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir"
16452 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16453 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir"
16454 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16455 [ "$val" = $longstr ] || error "xattr attr1 not set properly on file"
16456 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16457 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file"
16459 echo "Migrating to MDT1"
16460 $LFS migrate -m $MDTIDX $mig_dir ||
16461 error "fails on migrating dir to MDT1"
16463 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16464 echo "Checking xattrs"
16465 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16466 [ "$val" = $longstr ] ||
16467 error "expecting xattr1 $longstr on dir, found $val"
16468 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16469 [ "$val" = $shortstr ] ||
16470 error "expecting xattr2 $shortstr on dir, found $val"
16471 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16472 [ "$val" = $longstr ] ||
16473 error "expecting xattr1 $longstr on file, found $val"
16474 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16475 [ "$val" = $shortstr ] ||
16476 error "expecting xattr2 $shortstr on file, found $val"
16478 run_test 230m "xattrs not changed after dir migration"
16482 # For simplicity this test assumes that max_pages_per_rpc
16483 # is the same across all OSCs
16484 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16485 local bulk_size=$((max_pages * PAGE_SIZE))
16486 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16489 mkdir -p $DIR/$tdir
16490 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16491 error "failed to set stripe with -S ${brw_size}M option"
16493 # clear the OSC stats
16494 $LCTL set_param osc.*.stats=0 &>/dev/null
16497 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16498 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16499 oflag=direct &>/dev/null || error "dd failed"
16501 sync; sleep 1; sync # just to be safe
16502 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16503 if [ x$nrpcs != "x1" ]; then
16504 $LCTL get_param osc.*.stats
16505 error "found $nrpcs ost_write RPCs, not 1 as expected"
16509 # Drop the OSC cache, otherwise we will read from it
16510 cancel_lru_locks osc
16512 # clear the OSC stats
16513 $LCTL set_param osc.*.stats=0 &>/dev/null
16515 # Client reads $bulk_size.
16516 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16517 iflag=direct &>/dev/null || error "dd failed"
16519 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16520 if [ x$nrpcs != "x1" ]; then
16521 $LCTL get_param osc.*.stats
16522 error "found $nrpcs ost_read RPCs, not 1 as expected"
16525 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16528 mkdir -p $DIR/$tdir
16530 for i in {0..1023}; do
16531 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16532 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16533 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16537 run_test 231b "must not assert on fully utilized OST request buffer"
16540 mkdir -p $DIR/$tdir
16541 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16543 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16544 do_facet ost1 $LCTL set_param fail_loc=0x31c
16546 # ignore dd failure
16547 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16549 do_facet ost1 $LCTL set_param fail_loc=0
16550 umount_client $MOUNT || error "umount failed"
16551 mount_client $MOUNT || error "mount failed"
16552 stop ost1 || error "cannot stop ost1"
16553 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16555 run_test 232a "failed lock should not block umount"
16558 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16559 skip "Need MDS version at least 2.10.58"
16561 mkdir -p $DIR/$tdir
16562 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16563 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16565 cancel_lru_locks osc
16567 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16568 do_facet ost1 $LCTL set_param fail_loc=0x31c
16571 $LFS data_version $DIR/$tdir/$tfile || true
16573 do_facet ost1 $LCTL set_param fail_loc=0
16574 umount_client $MOUNT || error "umount failed"
16575 mount_client $MOUNT || error "mount failed"
16576 stop ost1 || error "cannot stop ost1"
16577 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16579 run_test 232b "failed data version lock should not block umount"
16582 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
16583 skip "Need MDS version at least 2.3.64"
16584 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16586 local fid=$($LFS path2fid $MOUNT)
16588 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16589 error "cannot access $MOUNT using its FID '$fid'"
16591 run_test 233a "checking that OBF of the FS root succeeds"
16594 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
16595 skip "Need MDS version at least 2.5.90"
16596 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16598 local fid=$($LFS path2fid $MOUNT/.lustre)
16600 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16601 error "cannot access $MOUNT/.lustre using its FID '$fid'"
16603 fid=$($LFS path2fid $MOUNT/.lustre/fid)
16604 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16605 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
16607 run_test 233b "checking that OBF of the FS .lustre succeeds"
16610 local p="$TMP/sanityN-$TESTNAME.parameters"
16611 save_lustre_params client "llite.*.xattr_cache" > $p
16612 lctl set_param llite.*.xattr_cache 1 ||
16613 skip_env "xattr cache is not supported"
16615 mkdir -p $DIR/$tdir || error "mkdir failed"
16616 touch $DIR/$tdir/$tfile || error "touch failed"
16617 # OBD_FAIL_LLITE_XATTR_ENOMEM
16618 $LCTL set_param fail_loc=0x1405
16619 getfattr -n user.attr $DIR/$tdir/$tfile &&
16620 error "getfattr should have failed with ENOMEM"
16621 $LCTL set_param fail_loc=0x0
16624 restore_lustre_params < $p
16627 run_test 234 "xattr cache should not crash on ENOMEM"
16630 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
16631 skip "Need MDS version at least 2.4.52"
16633 flock_deadlock $DIR/$tfile
16638 124) error "process hangs on a deadlock"
16640 *) error "error executing flock_deadlock $DIR/$tfile"
16644 run_test 235 "LU-1715: flock deadlock detection does not work properly"
16648 check_swap_layouts_support
16650 local ref1=/etc/passwd
16651 local ref2=/etc/group
16652 local file1=$DIR/$tdir/f1
16653 local file2=$DIR/$tdir/f2
16655 test_mkdir -c1 $DIR/$tdir
16656 $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
16657 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
16658 $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
16659 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
16660 local fd=$(free_fd)
16661 local cmd="exec $fd<>$file2"
16664 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
16665 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
16668 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
16673 run_test 236 "Layout swap on open unlinked file"
16675 # LU-4659 linkea consistency
16677 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
16678 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
16679 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
16680 skip "Need MDS version at least 2.5.58 or 2.5.2+"
16683 ln $DIR/$tfile $DIR/$tfile.lnk
16684 touch $DIR/$tfile.new
16685 mv $DIR/$tfile.new $DIR/$tfile
16686 local fid1=$($LFS path2fid $DIR/$tfile)
16687 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
16688 local path1=$($LFS fid2path $FSNAME "$fid1")
16689 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
16690 local path2=$($LFS fid2path $FSNAME "$fid2")
16691 [ $tfile.lnk == $path2 ] ||
16692 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
16695 run_test 238 "Verify linkea consistency"
16697 test_239A() { # was test_239
16698 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
16699 skip "Need MDS version at least 2.5.60"
16701 local list=$(comma_list $(mdts_nodes))
16703 mkdir -p $DIR/$tdir
16704 createmany -o $DIR/$tdir/f- 5000
16705 unlinkmany $DIR/$tdir/f- 5000
16706 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
16707 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
16708 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
16709 osp.*MDT*.sync_in_flight" | calc_sum)
16710 [ "$changes" -eq 0 ] || error "$changes not synced"
16712 run_test 239A "osp_sync test"
16714 test_239a() { #LU-5297
16715 remote_mds_nodsh && skip "remote MDS with nodsh"
16718 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
16719 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
16720 chgrp $RUNAS_GID $DIR/$tfile
16721 wait_delete_completed
16723 run_test 239a "process invalid osp sync record correctly"
16725 test_239b() { #LU-5297
16726 remote_mds_nodsh && skip "remote MDS with nodsh"
16729 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
16730 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
16731 chgrp $RUNAS_GID $DIR/$tfile1
16732 wait_delete_completed
16733 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
16735 chgrp $RUNAS_GID $DIR/$tfile2
16736 wait_delete_completed
16738 run_test 239b "process osp sync record with ENOMEM error correctly"
16741 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16742 remote_mds_nodsh && skip "remote MDS with nodsh"
16744 mkdir -p $DIR/$tdir
16746 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
16747 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
16748 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
16749 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
16751 umount_client $MOUNT || error "umount failed"
16752 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
16753 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
16754 mount_client $MOUNT || error "failed to mount client"
16756 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
16757 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
16759 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
16765 for LOOP in $(seq $count); do
16766 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
16767 cancel_lru_locks $OSC || true
16775 for LOOP in $(seq $1); do
16776 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
16781 test_241a() { # was test_241
16782 local bsize=$PAGE_SIZE
16784 (( bsize < 40960 )) && bsize=40960
16785 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16787 cancel_lru_locks $OSC
16788 test_241_bio 1000 $bsize &
16790 test_241_dio 1000 $bsize
16793 run_test 241a "bio vs dio"
16796 local bsize=$PAGE_SIZE
16798 (( bsize < 40960 )) && bsize=40960
16799 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16801 test_241_dio 1000 $bsize &
16803 test_241_dio 1000 $bsize
16806 run_test 241b "dio vs dio"
16809 remote_mds_nodsh && skip "remote MDS with nodsh"
16811 mkdir -p $DIR/$tdir
16812 touch $DIR/$tdir/$tfile
16814 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
16815 do_facet mds1 lctl set_param fail_loc=0x105
16816 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
16818 do_facet mds1 lctl set_param fail_loc=0
16819 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
16821 run_test 242 "mdt_readpage failure should not cause directory unreadable"
16825 test_mkdir $DIR/$tdir
16826 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
16828 run_test 243 "various group lock tests"
16832 test_mkdir $DIR/$tdir
16833 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
16834 sendfile_grouplock $DIR/$tdir/$tfile || \
16835 error "sendfile+grouplock failed"
16838 run_test 244 "sendfile with group lock tests"
16841 local flagname="multi_mod_rpcs"
16842 local connect_data_name="max_mod_rpcs"
16845 # check if multiple modify RPCs flag is set
16846 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
16847 grep "connect_flags:")
16850 echo "$out" | grep -qw $flagname
16851 if [ $? -ne 0 ]; then
16852 echo "connect flag $flagname is not set"
16856 # check if multiple modify RPCs data is set
16857 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
16860 echo "$out" | grep -qw $connect_data_name ||
16861 error "import should have connect data $connect_data_name"
16863 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
16865 test_246() { # LU-7371
16866 remote_ost_nodsh && skip "remote OST with nodsh"
16867 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
16868 skip "Need OST version >= 2.7.62"
16870 do_facet ost1 $LCTL set_param fail_val=4095
16871 #define OBD_FAIL_OST_READ_SIZE 0x234
16872 do_facet ost1 $LCTL set_param fail_loc=0x234
16873 $LFS setstripe $DIR/$tfile -i 0 -c 1
16874 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
16875 cancel_lru_locks $FSNAME-OST0000
16876 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
16878 run_test 246 "Read file of size 4095 should return right length"
16884 umount_client $submount
16889 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16891 skip_env "Fileset feature is not supported"
16893 local submount=${MOUNT}_$tdir
16896 mkdir -p $submount || error "mkdir $submount failed"
16897 FILESET="$FILESET/$tdir" mount_client $submount ||
16898 error "mount $submount failed"
16899 trap "cleanup_247 $submount" EXIT
16900 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
16901 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
16902 error "read $MOUNT/$tdir/$tfile failed"
16903 cleanup_247 $submount
16905 run_test 247a "mount subdir as fileset"
16908 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16909 skip_env "Fileset feature is not supported"
16911 local submount=${MOUNT}_$tdir
16913 rm -rf $MOUNT/$tdir
16914 mkdir -p $submount || error "mkdir $submount failed"
16916 FILESET="$FILESET/$tdir" mount_client $submount &&
16917 error "mount $submount should fail"
16920 run_test 247b "mount subdir that dose not exist"
16923 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16924 skip_env "Fileset feature is not supported"
16926 local submount=${MOUNT}_$tdir
16928 mkdir -p $MOUNT/$tdir/dir1
16929 mkdir -p $submount || error "mkdir $submount failed"
16930 trap "cleanup_247 $submount" EXIT
16931 FILESET="$FILESET/$tdir" mount_client $submount ||
16932 error "mount $submount failed"
16933 local fid=$($LFS path2fid $MOUNT/)
16934 $LFS fid2path $submount $fid && error "fid2path should fail"
16935 cleanup_247 $submount
16937 run_test 247c "running fid2path outside root"
16940 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16941 skip "Fileset feature is not supported"
16943 local submount=${MOUNT}_$tdir
16945 mkdir -p $MOUNT/$tdir/dir1
16946 mkdir -p $submount || error "mkdir $submount failed"
16947 FILESET="$FILESET/$tdir" mount_client $submount ||
16948 error "mount $submount failed"
16949 trap "cleanup_247 $submount" EXIT
16950 local fid=$($LFS path2fid $submount/dir1)
16951 $LFS fid2path $submount $fid || error "fid2path should succeed"
16952 cleanup_247 $submount
16954 run_test 247d "running fid2path inside root"
16958 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16960 skip "Fileset feature is not supported"
16962 local submount=${MOUNT}_$tdir
16965 mkdir -p $submount || error "mkdir $submount failed"
16966 FILESET="$FILESET/.." mount_client $submount &&
16967 error "mount $submount should fail"
16970 run_test 247e "mount .. as fileset"
16973 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
16974 [ -z "$fast_read_sav" ] && skip "no fast read support"
16976 # create a large file for fast read verification
16977 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
16979 # make sure the file is created correctly
16980 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
16981 { rm -f $DIR/$tfile; skip "file creation error"; }
16983 echo "Test 1: verify that fast read is 4 times faster on cache read"
16985 # small read with fast read enabled
16986 $LCTL set_param -n llite.*.fast_read=1
16987 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16988 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16989 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16990 # small read with fast read disabled
16991 $LCTL set_param -n llite.*.fast_read=0
16992 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16993 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16994 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16996 # verify that fast read is 4 times faster for cache read
16997 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
16998 error_not_in_vm "fast read was not 4 times faster: " \
16999 "$t_fast vs $t_slow"
17001 echo "Test 2: verify the performance between big and small read"
17002 $LCTL set_param -n llite.*.fast_read=1
17004 # 1k non-cache read
17005 cancel_lru_locks osc
17006 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17007 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17008 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17010 # 1M non-cache read
17011 cancel_lru_locks osc
17012 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17013 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17014 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17016 # verify that big IO is not 4 times faster than small IO
17017 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
17018 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
17020 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
17023 run_test 248 "fast read verification"
17025 test_249() { # LU-7890
17026 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
17027 skip "Need at least version 2.8.54"
17030 $SETSTRIPE -c 1 $DIR/$tfile
17031 # Offset 2T == 4k * 512M
17032 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
17033 error "dd to 2T offset failed"
17035 run_test 249 "Write above 2T file size"
17038 [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
17039 && skip "no 16TB file size limit on ZFS"
17041 $SETSTRIPE -c 1 $DIR/$tfile
17042 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
17043 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
17044 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
17045 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
17046 conv=notrunc,fsync && error "append succeeded"
17049 run_test 250 "Write above 16T limit"
17052 $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile
17054 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
17055 #Skip once - writing the first stripe will succeed
17056 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17057 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
17058 error "short write happened"
17060 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17061 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
17062 error "short read happened"
17066 run_test 251 "Handling short read and write correctly"
17069 remote_mds_nodsh && skip "remote MDS with nodsh"
17070 remote_ost_nodsh && skip "remote OST with nodsh"
17071 if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then
17072 skip_env "ldiskfs only test"
17082 # check lr_reader on OST0000
17084 dev=$(facet_device $tgt)
17085 out=$(do_facet $tgt $LR_READER $dev)
17086 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17088 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
17089 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
17090 error "Invalid uuid returned by $LR_READER on target $tgt"
17091 echo -e "uuid returned by $LR_READER is '$uuid'\n"
17093 # check lr_reader -c on MDT0000
17095 dev=$(facet_device $tgt)
17096 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
17097 skip "$LR_READER does not support additional options"
17099 out=$(do_facet $tgt $LR_READER -c $dev)
17100 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17102 num=$(echo "$out" | grep -c "mdtlov")
17103 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
17104 error "Invalid number of mdtlov clients returned by $LR_READER"
17105 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
17107 # check lr_reader -cr on MDT0000
17108 out=$(do_facet $tgt $LR_READER -cr $dev)
17109 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17111 echo "$out" | grep -q "^reply_data:$" ||
17112 error "$LR_READER should have returned 'reply_data' section"
17113 num=$(echo "$out" | grep -c "client_generation")
17114 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
17116 run_test 252 "check lr_reader tool"
17118 test_253_fill_ost() {
17119 local size_mb #how many MB should we write to pass watermark
17120 local lwm=$3 #low watermark
17121 local free_10mb #10% of free space
17123 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17124 size_mb=$((free_kb / 1024 - lwm))
17125 free_10mb=$((free_kb / 10240))
17126 #If 10% of free space cross low watermark use it
17127 if (( free_10mb > size_mb )); then
17130 #At least we need to store 1.1 of difference between
17131 #free space and low watermark
17132 size_mb=$((size_mb + size_mb / 10))
17134 if (( lwm <= $((free_kb / 1024)) )) || [ ! -f $DIR/$tdir/1 ]; then
17135 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M count=$size_mb \
17136 oflag=append conv=notrunc
17141 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17142 echo "OST still has $((free_kb / 1024)) mbytes free"
17146 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17147 remote_mds_nodsh && skip "remote MDS with nodsh"
17148 remote_mgs_nodsh && skip "remote MGS with nodsh"
17153 local ost_name=$($LFS osts |
17154 sed -n 's/^'$ostidx': \(.*\)_UUID .*/\1/p')
17156 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
17157 do_facet $SINGLEMDS $LCTL get_param -n \
17158 osp.$mdtosc_proc1.reserved_mb_high ||
17159 skip "remote MDS does not support reserved_mb_high"
17163 wait_delete_completed
17166 local last_wm_h=$(do_facet $SINGLEMDS $LCTL get_param -n \
17167 osp.$mdtosc_proc1.reserved_mb_high)
17168 local last_wm_l=$(do_facet $SINGLEMDS $LCTL get_param -n \
17169 osp.$mdtosc_proc1.reserved_mb_low)
17170 echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l"
17172 create_pool $FSNAME.$TESTNAME || error "Pool creation failed"
17173 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name ||
17174 error "Adding $ost_name to pool failed"
17176 # Wait for client to see a OST at pool
17177 wait_update $HOSTNAME "$LCTL get_param -n
17178 lov.$FSNAME-*.pools.$TESTNAME | sort -u |
17179 grep $ost_name" "$ost_name""_UUID" $((TIMEOUT/2)) ||
17180 error "Client can not see the pool"
17181 $SETSTRIPE $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
17182 error "Setstripe failed"
17184 dd if=/dev/zero of=$DIR/$tdir/0 bs=1M count=10
17185 local blocks=$($LFS df $MOUNT | grep $ost_name | awk '{ print $4 }')
17186 echo "OST still has $((blocks/1024)) mbytes free"
17188 local new_lwm=$((blocks/1024-10))
17189 do_facet $SINGLEMDS $LCTL set_param \
17190 osp.$mdtosc_proc1.reserved_mb_high=$((new_lwm+5))
17191 do_facet $SINGLEMDS $LCTL set_param \
17192 osp.$mdtosc_proc1.reserved_mb_low=$new_lwm
17194 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17196 #First enospc could execute orphan deletion so repeat.
17197 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17199 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17200 osp.$mdtosc_proc1.prealloc_status)
17201 echo "prealloc_status $oa_status"
17203 dd if=/dev/zero of=$DIR/$tdir/2 bs=1M count=1 &&
17204 error "File creation should fail"
17205 #object allocation was stopped, but we still able to append files
17206 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M seek=6 count=5 oflag=append ||
17207 error "Append failed"
17208 rm -f $DIR/$tdir/1 $DIR/$tdir/0 $DIR/$tdir/r*
17210 wait_delete_completed
17214 for i in $(seq 10 12); do
17215 dd if=/dev/zero of=$DIR/$tdir/$i bs=1M count=1 2>/dev/null ||
17216 error "File creation failed after rm";
17219 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17220 osp.$mdtosc_proc1.prealloc_status)
17221 echo "prealloc_status $oa_status"
17223 if (( oa_status != 0 )); then
17224 error "Object allocation still disable after rm"
17226 do_facet $SINGLEMDS $LCTL set_param \
17227 osp.$mdtosc_proc1.reserved_mb_high=$last_wm_h
17228 do_facet $SINGLEMDS $LCTL set_param \
17229 osp.$mdtosc_proc1.reserved_mb_low=$last_wm_l
17232 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $ost_name ||
17233 error "Remove $ost_name from pool failed"
17234 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
17235 error "Pool destroy fialed"
17237 run_test 253 "Check object allocation limit"
17240 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17241 remote_mds_nodsh && skip "remote MDS with nodsh"
17242 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
17243 skip "MDS does not support changelog_size"
17246 local MDT0=$(facet_svc $SINGLEMDS)
17248 changelog_register || error "changelog_register failed"
17250 changelog_clear 0 || error "changelog_clear failed"
17252 local size1=$(do_facet $SINGLEMDS \
17253 $LCTL get_param -n mdd.$MDT0.changelog_size)
17254 echo "Changelog size $size1"
17257 $LFS mkdir -i 0 $DIR/$tdir
17259 mkdir -p $DIR/$tdir/pics/2008/zachy
17260 touch $DIR/$tdir/pics/2008/zachy/timestamp
17261 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
17262 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
17263 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
17264 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
17265 rm $DIR/$tdir/pics/desktop.jpg
17267 local size2=$(do_facet $SINGLEMDS \
17268 $LCTL get_param -n mdd.$MDT0.changelog_size)
17269 echo "Changelog size after work $size2"
17271 (( $size2 > $size1 )) ||
17272 error "new Changelog size=$size2 less than old size=$size1"
17274 run_test 254 "Check changelog size"
17281 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
17282 awk -F: '{print $2}' | grep $type > /dev/null
17283 if [ $? -ne 0 ]; then
17293 lfs ladvise -a willread $file > /dev/null 2>&1
17294 if [ $? -eq 0 ]; then
17298 lfs ladvise -a willread $file 2>&1 |
17299 grep "Inappropriate ioctl for device" > /dev/null
17300 if [ $? -eq 0 ]; then
17307 bc <<<"scale=2; ($1 - $2) * 100 / $2"
17310 # run a random read IO workload
17311 # usage: random_read_iops <filename> <filesize> <iosize>
17312 random_read_iops() {
17315 local iosize=${3:-4096}
17317 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
17318 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
17321 drop_file_oss_cache() {
17325 $LFS ladvise -a dontneed $file 2>/dev/null ||
17326 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
17329 ladvise_willread_performance()
17332 local average_origin=0
17333 local average_cache=0
17334 local average_ladvise=0
17336 for ((i = 1; i <= $repeat; i++)); do
17337 echo "Iter $i/$repeat: reading without willread hint"
17338 cancel_lru_locks osc
17339 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17340 local speed_origin=$(random_read_iops $DIR/$tfile $size)
17341 echo "Iter $i/$repeat: uncached speed: $speed_origin"
17342 average_origin=$(bc <<<"$average_origin + $speed_origin")
17344 cancel_lru_locks osc
17345 local speed_cache=$(random_read_iops $DIR/$tfile $size)
17346 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
17347 average_cache=$(bc <<<"$average_cache + $speed_cache")
17349 cancel_lru_locks osc
17350 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17351 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
17352 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
17353 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
17354 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
17356 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
17357 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
17358 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
17360 speedup_cache=$(percent $average_cache $average_origin)
17361 speedup_ladvise=$(percent $average_ladvise $average_origin)
17363 echo "Average uncached read: $average_origin"
17364 echo "Average speedup with OSS cached read: " \
17365 "$average_cache = +$speedup_cache%"
17366 echo "Average speedup with ladvise willread: " \
17367 "$average_ladvise = +$speedup_ladvise%"
17369 local lowest_speedup=20
17370 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
17371 echo "Speedup with OSS cached read less than $lowest_speedup%," \
17372 "got $average_cache%. Skipping ladvise willread check."
17376 # the test won't work on ZFS until it supports 'ladvise dontneed', but
17377 # it is still good to run until then to exercise 'ladvise willread'
17378 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17379 [ "$ost1_FSTYPE" = "zfs" ] &&
17380 echo "osd-zfs does not support dontneed or drop_caches" &&
17383 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
17384 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
17385 error_not_in_vm "Speedup with willread is less than " \
17386 "$lowest_speedup%, got $average_ladvise%"
17390 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17391 skip "lustre < 2.8.54 does not support ladvise "
17392 remote_ost_nodsh && skip "remote OST with nodsh"
17394 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
17396 ladvise_no_type willread $DIR/$tfile &&
17397 skip "willread ladvise is not supported"
17399 ladvise_no_ioctl $DIR/$tfile &&
17400 skip "ladvise ioctl is not supported"
17403 local size=$((size_mb * 1048576))
17404 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17405 error "dd to $DIR/$tfile failed"
17407 lfs ladvise -a willread $DIR/$tfile ||
17408 error "Ladvise failed with no range argument"
17410 lfs ladvise -a willread -s 0 $DIR/$tfile ||
17411 error "Ladvise failed with no -l or -e argument"
17413 lfs ladvise -a willread -e 1 $DIR/$tfile ||
17414 error "Ladvise failed with only -e argument"
17416 lfs ladvise -a willread -l 1 $DIR/$tfile ||
17417 error "Ladvise failed with only -l argument"
17419 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
17420 error "End offset should not be smaller than start offset"
17422 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
17423 error "End offset should not be equal to start offset"
17425 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
17426 error "Ladvise failed with overflowing -s argument"
17428 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
17429 error "Ladvise failed with overflowing -e argument"
17431 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
17432 error "Ladvise failed with overflowing -l argument"
17434 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
17435 error "Ladvise succeeded with conflicting -l and -e arguments"
17437 echo "Synchronous ladvise should wait"
17439 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17440 do_nodes $(comma_list $(osts_nodes)) \
17441 $LCTL set_param fail_val=$delay fail_loc=0x237
17443 local start_ts=$SECONDS
17444 lfs ladvise -a willread $DIR/$tfile ||
17445 error "Ladvise failed with no range argument"
17446 local end_ts=$SECONDS
17447 local inteval_ts=$((end_ts - start_ts))
17449 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17450 error "Synchronous advice didn't wait reply"
17453 echo "Asynchronous ladvise shouldn't wait"
17454 local start_ts=$SECONDS
17455 lfs ladvise -a willread -b $DIR/$tfile ||
17456 error "Ladvise failed with no range argument"
17457 local end_ts=$SECONDS
17458 local inteval_ts=$((end_ts - start_ts))
17460 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17461 error "Asynchronous advice blocked"
17464 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17465 ladvise_willread_performance
17467 run_test 255a "check 'lfs ladvise -a willread'"
17473 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17477 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17478 skip "lustre < 2.8.54 does not support ladvise "
17479 remote_ost_nodsh && skip "remote OST with nodsh"
17481 lfs setstripe -c 1 -i 0 $DIR/$tfile
17483 ladvise_no_type dontneed $DIR/$tfile &&
17484 skip "dontneed ladvise is not supported"
17486 ladvise_no_ioctl $DIR/$tfile &&
17487 skip "ladvise ioctl is not supported"
17489 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17490 [ "$ost1_FSTYPE" = "zfs" ] &&
17491 skip "zfs-osd does not support 'ladvise dontneed'"
17494 local size=$((size_mb * 1048576))
17495 # In order to prevent disturbance of other processes, only check 3/4
17496 # of the memory usage
17497 local kibibytes=$((size_mb * 1024 * 3 / 4))
17499 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17500 error "dd to $DIR/$tfile failed"
17502 #force write to complete before dropping OST cache & checking memory
17505 local total=$(facet_meminfo ost1 MemTotal)
17506 echo "Total memory: $total KiB"
17508 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17509 local before_read=$(facet_meminfo ost1 Cached)
17510 echo "Cache used before read: $before_read KiB"
17512 lfs ladvise -a willread $DIR/$tfile ||
17513 error "Ladvise willread failed"
17514 local after_read=$(facet_meminfo ost1 Cached)
17515 echo "Cache used after read: $after_read KiB"
17517 lfs ladvise -a dontneed $DIR/$tfile ||
17518 error "Ladvise dontneed again failed"
17519 local no_read=$(facet_meminfo ost1 Cached)
17520 echo "Cache used after dontneed ladvise: $no_read KiB"
17522 if [ $total -lt $((before_read + kibibytes)) ]; then
17523 echo "Memory is too small, abort checking"
17527 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17528 error "Ladvise willread should use more memory" \
17529 "than $kibibytes KiB"
17532 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17533 error "Ladvise dontneed should release more memory" \
17534 "than $kibibytes KiB"
17537 run_test 255b "check 'lfs ladvise -a dontneed'"
17540 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17541 skip "lustre < 2.10.50 does not support lockahead"
17549 test_mkdir -p $DIR/$tdir
17550 $SETSTRIPE -i 0 $DIR/$tdir
17552 #test 10 returns only success/failure
17554 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17556 if [ $rc -eq 255 ]; then
17557 error "Ladvise test${i} failed, ${rc}"
17560 #test 11 counts lock enqueue requests, all others count new locks
17562 count=$(do_facet ost1 \
17563 $LCTL get_param -n ost.OSS.ost.stats)
17564 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17566 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17568 if [ $rc -eq 255 ]; then
17569 error "Ladvise test${i} failed, ${rc}"
17572 new_count=$(do_facet ost1 \
17573 $LCTL get_param -n ost.OSS.ost.stats)
17574 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17575 awk '{ print $2 }')
17577 difference="$((new_count - count))"
17578 if [ $difference -ne $rc ]; then
17579 error "Ladvise test${i}, bad enqueue count, returned " \
17580 "${rc}, actual ${difference}"
17583 for i in $(seq 12 21); do
17584 # If we do not do this, we run the risk of having too many
17585 # locks and starting lock cancellation while we are checking
17587 cancel_lru_locks osc
17589 count=$($LCTL get_param -n \
17590 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17592 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17594 if [ $rc -eq 255 ]; then
17595 error "Ladvise test ${i} failed, ${rc}"
17598 new_count=$($LCTL get_param -n \
17599 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17600 difference="$((new_count - count))"
17602 # Test 15 output is divided by 100 to map down to valid return
17603 if [ $i -eq 15 ]; then
17607 if [ $difference -ne $rc ]; then
17608 error "Ladvise test ${i}, bad lock count, returned " \
17609 "${rc}, actual ${difference}"
17613 #test 22 returns only success/failure
17615 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17617 if [ $rc -eq 255 ]; then
17618 error "Ladvise test${i} failed, ${rc}"
17621 run_test 255c "suite of ladvise lockahead tests"
17624 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17625 remote_mds_nodsh && skip "remote MDS with nodsh"
17626 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17627 changelog_users $SINGLEMDS | grep "^cl" &&
17628 skip "active changelog user"
17634 mdt_dev=$(mdsdevname 1)
17637 changelog_register || error "changelog_register failed"
17640 mkdir -p $DIR/$tdir
17642 changelog_clear 0 || error "changelog_clear failed"
17645 touch $DIR/$tdir/{1..10}
17648 stop $SINGLEMDS || error "Fail to stop MDT"
17652 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
17654 #after mount new plainllog is used
17655 touch $DIR/$tdir/{11..19}
17656 local tmpfile=$(mktemp -u $tfile.XXXXXX)
17657 cat_sl=$(do_facet $SINGLEMDS "sync; \
17658 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17659 llog_reader $tmpfile | grep -c type=1064553b")
17660 do_facet $SINGLEMDS llog_reader $tmpfile
17662 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
17664 changelog_clear 0 || error "changelog_clear failed"
17666 cat_sl=$(do_facet $SINGLEMDS "sync; \
17667 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17668 llog_reader $tmpfile | grep -c type=1064553b; rm -f $tmpfile")
17670 if (( cat_sl == 2 )); then
17671 error "Empty plain llog was not deleted from changelog catalog"
17672 elif (( cat_sl != 1 )); then
17673 error "Active plain llog shouldn't be deleted from catalog"
17676 run_test 256 "Check llog delete for empty and not full state"
17679 remote_mds_nodsh && skip "remote MDS with nodsh"
17680 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
17681 skip "Need MDS version at least 2.8.55"
17683 test_mkdir $DIR/$tdir
17685 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
17686 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
17689 #define OBD_FAIL_MDS_XATTR_REP 0x161
17690 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17691 local facet=mds$((mdtidx + 1))
17692 set_nodes_failloc $(facet_active_host $facet) 0x80000161
17693 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
17695 stop $facet || error "stop MDS failed"
17696 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
17697 error "start MDS fail"
17699 run_test 257 "xattr locks are not lost"
17701 # Verify we take the i_mutex when security requires it
17703 #define OBD_FAIL_IMUTEX_SEC 0x141c
17704 $LCTL set_param fail_loc=0x141c
17706 chmod u+s $DIR/$tfile
17707 chmod a+rwx $DIR/$tfile
17708 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17710 if [ $RC -ne 0 ]; then
17711 error "error, failed to take i_mutex, rc=$?"
17715 run_test 258a "verify i_mutex security behavior when suid attributes is set"
17717 # Verify we do NOT take the i_mutex in the normal case
17719 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
17720 $LCTL set_param fail_loc=0x141d
17723 chmod a+rw $DIR/$tfile
17724 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17726 if [ $RC -ne 0 ]; then
17727 error "error, took i_mutex unnecessarily, rc=$?"
17732 run_test 258b "verify i_mutex security behavior"
17735 local file=$DIR/$tfile
17739 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17741 stack_trap "rm -f $file" EXIT
17743 wait_delete_completed
17744 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17745 echo "before: $before"
17747 $LFS setstripe -i 0 -c 1 $file
17748 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
17750 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17751 echo "after write: $after"
17753 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
17754 do_facet ost1 $LCTL set_param fail_loc=0x2301
17756 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17757 echo "after truncate: $after"
17760 do_facet ost1 $LCTL set_param fail_loc=0
17761 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17763 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17764 echo "after restart: $after"
17765 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
17766 error "missing truncate?"
17770 run_test 259 "crash at delayed truncate"
17773 #define OBD_FAIL_MDC_CLOSE 0x806
17774 $LCTL set_param fail_loc=0x80000806
17778 run_test 260 "Check mdc_close fail"
17780 ### Data-on-MDT sanity tests ###
17782 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17783 skip "Need MDS version at least 2.10.55 for DoM"
17786 local dom=$DIR/$tdir/dom_file
17787 local tmp=$DIR/$tdir/tmp_file
17789 mkdir -p $DIR/$tdir
17791 # basic checks for DoM component creation
17792 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
17793 error "Can set MDT layout to non-first entry"
17795 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
17796 error "Can define multiple entries as MDT layout"
17798 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
17800 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
17801 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
17802 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
17804 local mdtidx=$($LFS getstripe -m $dom)
17805 local mdtname=MDT$(printf %04x $mdtidx)
17806 local facet=mds$((mdtidx + 1))
17807 local space_check=1
17809 # Skip free space checks with ZFS
17810 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
17814 local size_tmp=$((65536 * 3))
17815 local mdtfree1=$(do_facet $facet \
17816 lctl get_param -n osd*.*$mdtname.kbytesfree)
17818 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17819 # check also direct IO along write
17820 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
17821 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17823 cmp $tmp $dom || error "file data is different"
17824 [ $(stat -c%s $dom) == $size_tmp ] ||
17825 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17826 if [ $space_check == 1 ]; then
17827 local mdtfree2=$(do_facet $facet \
17828 lctl get_param -n osd*.*$mdtname.kbytesfree)
17830 # increase in usage from by $size_tmp
17831 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17832 error "MDT free space wrong after write: " \
17833 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17837 local size_dom=10000
17839 $TRUNCATE $dom $size_dom
17840 [ $(stat -c%s $dom) == $size_dom ] ||
17841 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
17842 if [ $space_check == 1 ]; then
17843 mdtfree1=$(do_facet $facet \
17844 lctl get_param -n osd*.*$mdtname.kbytesfree)
17845 # decrease in usage from $size_tmp to new $size_dom
17846 [ $(($mdtfree1 - $mdtfree2)) -ge \
17847 $(((size_tmp - size_dom) / 1024)) ] ||
17848 error "MDT free space is wrong after truncate: " \
17849 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
17855 size_dom=$((size_dom + size_tmp))
17856 [ $(stat -c%s $dom) == $size_dom ] ||
17857 error "bad size after append: $(stat -c%s $dom) != $size_dom"
17858 if [ $space_check == 1 ]; then
17859 mdtfree2=$(do_facet $facet \
17860 lctl get_param -n osd*.*$mdtname.kbytesfree)
17861 # increase in usage by $size_tmp from previous
17862 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17863 error "MDT free space is wrong after append: " \
17864 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17869 if [ $space_check == 1 ]; then
17870 mdtfree1=$(do_facet $facet \
17871 lctl get_param -n osd*.*$mdtname.kbytesfree)
17872 # decrease in usage by $size_dom from previous
17873 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
17874 error "MDT free space is wrong after removal: " \
17875 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
17878 # combined striping
17879 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
17880 error "Can't create DoM + OST striping"
17882 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
17883 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17884 # check also direct IO along write
17885 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17887 cmp $tmp $dom || error "file data is different"
17888 [ $(stat -c%s $dom) == $size_tmp ] ||
17889 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17894 run_test 270a "DoM: basic functionality tests"
17897 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17898 skip "Need MDS version at least 2.10.55"
17900 local dom=$DIR/$tdir/dom_file
17901 local max_size=1048576
17903 mkdir -p $DIR/$tdir
17904 $LFS setstripe -E $max_size -L mdt $dom
17906 # truncate over the limit
17907 $TRUNCATE $dom $(($max_size + 1)) &&
17908 error "successful truncate over the maximum size"
17909 # write over the limit
17910 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
17911 error "successful write over the maximum size"
17912 # append over the limit
17913 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
17914 echo "12345" >> $dom && error "successful append over the maximum size"
17919 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
17922 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17923 skip "Need MDS version at least 2.10.55"
17925 mkdir -p $DIR/$tdir
17926 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17928 # check files inherit DoM EA
17929 touch $DIR/$tdir/first
17930 [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] ||
17931 error "bad pattern"
17932 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
17933 error "bad stripe count"
17934 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
17935 error "bad stripe size"
17937 # check directory inherits DoM EA and uses it as default
17938 mkdir $DIR/$tdir/subdir
17939 touch $DIR/$tdir/subdir/second
17940 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
17941 error "bad pattern in sub-directory"
17942 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
17943 error "bad stripe count in sub-directory"
17944 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
17945 error "bad stripe size in sub-directory"
17948 run_test 270c "DoM: DoM EA inheritance tests"
17951 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17952 skip "Need MDS version at least 2.10.55"
17954 mkdir -p $DIR/$tdir
17955 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17957 # inherit default DoM striping
17958 mkdir $DIR/$tdir/subdir
17959 touch $DIR/$tdir/subdir/f1
17961 # change default directory striping
17962 $LFS setstripe -c 1 $DIR/$tdir/subdir
17963 touch $DIR/$tdir/subdir/f2
17964 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
17965 error "wrong default striping in file 2"
17966 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
17967 error "bad pattern in file 2"
17970 run_test 270d "DoM: change striping from DoM to RAID0"
17973 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17974 skip "Need MDS version at least 2.10.55"
17976 mkdir -p $DIR/$tdir/dom
17977 mkdir -p $DIR/$tdir/norm
17980 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
17981 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
17983 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
17984 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
17986 # find DoM files by layout
17987 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
17988 [ $NUM -eq $DOMFILES ] ||
17989 error "lfs find -L: found $NUM, expected $DOMFILES"
17990 echo "Test 1: lfs find 20 DOM files by layout: OK"
17992 # there should be 1 dir with default DOM striping
17993 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
17995 error "lfs find -L: found $NUM, expected 1 dir"
17996 echo "Test 2: lfs find 1 DOM dir by layout: OK"
17998 # find DoM files by stripe size
17999 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
18000 [ $NUM -eq $DOMFILES ] ||
18001 error "lfs find -S: found $NUM, expected $DOMFILES"
18002 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
18004 # find files by stripe offset except DoM files
18005 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
18006 [ $NUM -eq $NORMFILES ] ||
18007 error "lfs find -i: found $NUM, expected $NORMFILES"
18008 echo "Test 5: lfs find no DOM files by stripe index: OK"
18011 run_test 270e "DoM: lfs find with DoM files test"
18014 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18015 skip "Need MDS version at least 2.10.55"
18017 local mdtname=${FSNAME}-MDT0000-mdtlov
18018 local dom=$DIR/$tdir/dom_file
18019 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
18020 lod.$mdtname.dom_stripesize)
18021 local dom_limit=131072
18023 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
18024 local dom_current=$(do_facet mds1 $LCTL get_param -n \
18025 lod.$mdtname.dom_stripesize)
18026 [ ${dom_limit} -eq ${dom_current} ] ||
18027 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
18029 $LFS mkdir -i 0 -c 1 $DIR/$tdir
18030 $LFS setstripe -d $DIR/$tdir
18031 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
18032 error "Can't set directory default striping"
18034 # exceed maximum stripe size
18035 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18036 error "Can't create file with $((dom_limit * 2)) DoM stripe"
18037 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
18038 error "Able to create DoM component size more than LOD limit"
18040 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
18041 dom_current=$(do_facet mds1 $LCTL get_param -n \
18042 lod.$mdtname.dom_stripesize)
18043 [ 0 -eq ${dom_current} ] ||
18044 error "Can't set zero DoM stripe limit"
18047 # attempt to create DoM file on server with disabled DoM should
18048 # remove DoM entry from layout and be succeed
18049 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
18050 error "Can't create DoM file (DoM is disabled)"
18051 [ $($LFS getstripe -L $dom) == "mdt" ] &&
18052 error "File has DoM component while DoM is disabled"
18055 # attempt to create DoM file with only DoM stripe should return error
18056 $LFS setstripe -E $dom_limit -L mdt $dom &&
18057 error "Able to create DoM-only file while DoM is disabled"
18059 # too low values to be aligned with smallest stripe size 64K
18060 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
18061 dom_current=$(do_facet mds1 $LCTL get_param -n \
18062 lod.$mdtname.dom_stripesize)
18063 [ 30000 -eq ${dom_current} ] &&
18064 error "Can set too small DoM stripe limit"
18066 # 64K is a minimal stripe size in Lustre, expect limit of that size
18067 [ 65536 -eq ${dom_current} ] ||
18068 error "Limit is not set to 64K but ${dom_current}"
18070 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
18071 dom_current=$(do_facet mds1 $LCTL get_param -n \
18072 lod.$mdtname.dom_stripesize)
18074 [ 2147483648 -eq ${dom_current} ] &&
18075 error "Can set too large DoM stripe limit"
18077 do_facet mds1 $LCTL set_param -n \
18078 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
18079 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18080 error "Can't create DoM component size after limit change"
18081 do_facet mds1 $LCTL set_param -n \
18082 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
18083 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
18084 error "Can't create DoM file after limit decrease"
18085 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
18086 error "Can create big DoM component after limit decrease"
18087 touch ${dom}_def ||
18088 error "Can't create file with old default layout"
18090 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
18093 run_test 270f "DoM: maximum DoM stripe size checks"
18096 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18097 skip "Need MDS version at least 2.10.55"
18099 local dom=$DIR/$tdir/dom
18101 mkdir -p $DIR/$tdir
18103 $LFS setstripe -E 1024K -L mdt $dom
18105 lctl set_param -n mdc.*.stats=clear
18106 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18107 cat $dom > /dev/null
18108 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
18109 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
18113 run_test 271a "DoM: data is cached for read after write"
18116 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18117 skip "Need MDS version at least 2.10.55"
18119 local dom=$DIR/$tdir/dom
18121 mkdir -p $DIR/$tdir
18123 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18125 lctl set_param -n mdc.*.stats=clear
18126 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18127 cancel_lru_locks mdc
18128 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
18129 # second stat to check size is cached on client
18130 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
18131 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18132 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
18135 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
18138 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18139 skip "Need MDS version at least 2.10.55"
18141 local dom=$DIR/$tdir/dom
18143 mkdir -p $DIR/$tdir
18145 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18147 lctl set_param -n mdc.*.stats=clear
18148 lctl set_param -n osc.*.stats=clear
18149 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
18150 cancel_lru_locks mdc
18151 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18152 # second stat to check size is cached on client
18153 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18154 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18155 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
18156 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
18157 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
18160 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
18166 local mdt=MDT$(printf %04x $mdtidx)
18168 if [ -z $param ]; then
18169 lctl get_param -n mdc.*$mdt*.stats
18171 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
18176 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18177 skip "Need MDS version at least 2.10.55"
18179 local dom=$DIR/$tdir/dom
18181 mkdir -p $DIR/$tdir
18183 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18185 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18186 local facet=mds$((mdtidx + 1))
18188 cancel_lru_locks mdc
18189 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
18190 createmany -o $dom 1000
18191 lctl set_param -n mdc.*.stats=clear
18192 smalliomany -w $dom 1000 200
18193 get_mdc_stats $mdtidx
18194 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18195 # Each file has 1 open, 1 IO enqueues, total 2000
18196 # but now we have also +1 getxattr for security.capability, total 3000
18197 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
18198 unlinkmany $dom 1000
18200 cancel_lru_locks mdc
18201 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
18202 createmany -o $dom 1000
18203 lctl set_param -n mdc.*.stats=clear
18204 smalliomany -w $dom 1000 200
18205 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18206 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
18207 # for OPEN and IO lock.
18208 [ $((enq - enq_2)) -ge 1000 ] ||
18209 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
18210 unlinkmany $dom 1000
18213 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
18215 cleanup_271def_tests() {
18221 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18222 skip "Need MDS version at least 2.10.57"
18224 local dom=$DIR/$tdir/dom
18225 local tmp=$TMP/$tfile
18226 trap "cleanup_271def_tests $tmp" EXIT
18228 mkdir -p $DIR/$tdir
18230 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18232 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18234 cancel_lru_locks mdc
18235 dd if=/dev/urandom of=$tmp bs=1000 count=1
18236 dd if=$tmp of=$dom bs=1000 count=1
18237 cancel_lru_locks mdc
18239 cat /etc/hosts >> $tmp
18240 lctl set_param -n mdc.*.stats=clear
18242 # append data to the same file it should update local page
18243 echo "Append to the same page"
18244 cat /etc/hosts >> $dom
18245 local num=$(get_mdc_stats $mdtidx ost_read)
18246 local ra=$(get_mdc_stats $mdtidx req_active)
18247 local rw=$(get_mdc_stats $mdtidx req_waittime)
18249 [ -z $num ] || error "$num READ RPC occured"
18250 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18254 cmp $tmp $dom || error "file miscompare"
18256 cancel_lru_locks mdc
18257 lctl set_param -n mdc.*.stats=clear
18259 echo "Open and read file"
18260 cat $dom > /dev/null
18261 local num=$(get_mdc_stats $mdtidx ost_read)
18262 local ra=$(get_mdc_stats $mdtidx req_active)
18263 local rw=$(get_mdc_stats $mdtidx req_waittime)
18265 [ -z $num ] || error "$num READ RPC occured"
18266 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18270 cmp $tmp $dom || error "file miscompare"
18274 run_test 271d "DoM: read on open (1K file in reply buffer)"
18277 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18278 skip "Need MDS version at least 2.10.57"
18280 local dom=$DIR/$tdir/dom
18281 local tmp=$TMP/$tfile
18282 trap "cleanup_271def_tests $tmp" EXIT
18284 mkdir -p $DIR/$tdir
18286 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18288 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18290 cancel_lru_locks mdc
18291 dd if=/dev/urandom of=$tmp bs=200000 count=1
18292 dd if=$tmp of=$dom bs=200000 count=1
18293 cancel_lru_locks mdc
18294 cat /etc/hosts >> $tmp
18295 lctl set_param -n mdc.*.stats=clear
18297 echo "Append to the same page"
18298 cat /etc/hosts >> $dom
18299 local num=$(get_mdc_stats $mdtidx ost_read)
18300 local ra=$(get_mdc_stats $mdtidx req_active)
18301 local rw=$(get_mdc_stats $mdtidx req_waittime)
18303 [ -z $num ] || error "$num READ RPC occured"
18304 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18308 cmp $tmp $dom || error "file miscompare"
18310 cancel_lru_locks mdc
18311 lctl set_param -n mdc.*.stats=clear
18313 echo "Open and read file"
18314 cat $dom > /dev/null
18315 local num=$(get_mdc_stats $mdtidx ost_read)
18316 local ra=$(get_mdc_stats $mdtidx req_active)
18317 local rw=$(get_mdc_stats $mdtidx req_waittime)
18319 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
18320 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18324 cmp $tmp $dom || error "file miscompare"
18328 run_test 271f "DoM: read on open (200K file and read tail)"
18331 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
18332 skip "Skipping due to old client or server version"
18334 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
18336 $CHECKSTAT -t file $DIR1/$tfile
18338 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
18341 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
18342 $LCTL set_param fail_loc=0x80000314
18343 rm $DIR1/$tfile || error "Unlink fails"
18345 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
18346 [ $RC -eq 0 ] || error "Failed write to stale object"
18348 run_test 271g "Discard DoM data vs client flush race"
18351 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18352 skip "Need MDS version at least 2.11.50"
18354 local dom=$DIR/$tdir/dom
18355 mkdir -p $DIR/$tdir
18357 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
18358 dd if=/dev/urandom of=$dom bs=512K count=1 ||
18359 error "failed to write data into $dom"
18360 local old_md5=$(md5sum $dom)
18362 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
18363 error "failed to migrate to the same DoM component"
18365 [ $($LFS getstripe -c $dom) -eq 2 ] ||
18366 error "layout was not changed silently"
18368 local new_md5=$(md5sum $dom)
18370 [ "$old_md5" != "$new_md5" ] &&
18371 error "md5sum differ: $old_md5, $new_md5"
18374 run_test 272a "DoM migration: new layout with the same DOM component"
18377 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18378 skip "Need MDS version at least 2.11.50"
18380 local dom=$DIR/$tdir/dom
18381 mkdir -p $DIR/$tdir
18382 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18384 local mdtidx=$($LFS getstripe -m $dom)
18385 local mdtname=MDT$(printf %04x $mdtidx)
18386 local facet=mds$((mdtidx + 1))
18388 local mdtfree1=$(do_facet $facet \
18389 lctl get_param -n osd*.*$mdtname.kbytesfree)
18390 dd if=/dev/urandom of=$dom bs=2M count=1 ||
18391 error "failed to write data into $dom"
18392 local old_md5=$(md5sum $dom)
18393 cancel_lru_locks mdc
18394 local mdtfree1=$(do_facet $facet \
18395 lctl get_param -n osd*.*$mdtname.kbytesfree)
18397 $LFS migrate -c2 $dom ||
18398 error "failed to migrate to the new composite layout"
18399 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18400 error "MDT stripe was not removed"
18402 cancel_lru_locks mdc
18403 local new_md5=$(md5sum $dom)
18404 [ "$old_md5" != "$new_md5" ] &&
18405 error "$old_md5 != $new_md5"
18407 # Skip free space checks with ZFS
18408 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18409 local mdtfree2=$(do_facet $facet \
18410 lctl get_param -n osd*.*$mdtname.kbytesfree)
18411 [ $mdtfree2 -gt $mdtfree1 ] ||
18412 error "MDT space is not freed after migration"
18416 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
18419 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18420 skip "Need MDS version at least 2.11.50"
18422 local dom=$DIR/$tdir/$tfile
18423 mkdir -p $DIR/$tdir
18424 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18426 local mdtidx=$($LFS getstripe -m $dom)
18427 local mdtname=MDT$(printf %04x $mdtidx)
18428 local facet=mds$((mdtidx + 1))
18430 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18431 error "failed to write data into $dom"
18432 local old_md5=$(md5sum $dom)
18433 cancel_lru_locks mdc
18434 local mdtfree1=$(do_facet $facet \
18435 lctl get_param -n osd*.*$mdtname.kbytesfree)
18437 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18438 error "failed to migrate to the new composite layout"
18439 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18440 error "MDT stripe was not removed"
18442 cancel_lru_locks mdc
18443 local new_md5=$(md5sum $dom)
18444 [ "$old_md5" != "$new_md5" ] &&
18445 error "$old_md5 != $new_md5"
18447 # Skip free space checks with ZFS
18448 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18449 local mdtfree2=$(do_facet $facet \
18450 lctl get_param -n osd*.*$mdtname.kbytesfree)
18451 [ $mdtfree2 -gt $mdtfree1 ] ||
18452 error "MDS space is not freed after migration"
18456 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18459 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18460 skip "Need MDS version at least 2.11.50"
18462 # Layout swap cannot be done if either file has DOM component,
18463 # this will never be supported, migration should be used instead
18465 local dom=$DIR/$tdir/$tfile
18466 mkdir -p $DIR/$tdir
18468 $LFS setstripe -c2 ${dom}_plain
18469 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18470 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18471 error "can swap layout with DoM component"
18472 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18473 error "can swap layout with DoM component"
18475 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18476 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18477 error "can swap layout with DoM component"
18478 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18479 error "can swap layout with DoM component"
18482 run_test 273a "DoM: layout swapping should fail with DOM"
18485 remote_ost_nodsh && skip "remote OST with nodsh"
18486 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18487 skip "Need OST version >= 2.10.57"
18489 local file=$DIR/$tfile
18492 oss=$(comma_list $(osts_nodes))
18494 dd if=/dev/urandom of=$file bs=1M count=2 ||
18495 error "failed to create a file"
18496 cancel_lru_locks osc
18499 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18500 error "failed to read a file"
18502 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
18503 $LCTL set_param fail_loc=0x8000031f
18505 cancel_lru_locks osc &
18508 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
18509 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
18510 #IO takes another lock, but matches the PENDING one
18511 #and places it to the IO RPC
18512 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18513 error "failed to read a file with PENDING lock"
18515 run_test 275 "Read on a canceled duplicate lock"
18518 remote_ost_nodsh && skip "remote OST with nodsh"
18521 do_facet ost1 "(while true; do \
18522 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
18523 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
18526 for LOOP in $(seq 20); do
18528 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
18531 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
18532 rm $TMP/sanity_276_pid"
18534 run_test 276 "Race between mount and obd_statfs"
18536 cleanup_test_300() {
18540 test_striped_dir() {
18545 mkdir -p $DIR/$tdir
18547 SAVE_UMASK=$(umask)
18548 trap cleanup_test_300 RETURN EXIT
18550 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
18551 $DIR/$tdir/striped_dir ||
18552 error "set striped dir error"
18554 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
18555 [ "$mode" = "755" ] || error "expect 755 got $mode"
18557 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
18558 error "getdirstripe failed"
18559 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
18560 if [ "$stripe_count" != "2" ]; then
18561 error "1:stripe_count is $stripe_count, expect 2"
18563 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
18564 if [ "$stripe_count" != "2" ]; then
18565 error "2:stripe_count is $stripe_count, expect 2"
18568 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
18569 if [ "$stripe_index" != "$mdt_index" ]; then
18570 error "stripe_index is $stripe_index, expect $mdt_index"
18573 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18574 error "nlink error after create striped dir"
18576 mkdir $DIR/$tdir/striped_dir/a
18577 mkdir $DIR/$tdir/striped_dir/b
18579 stat $DIR/$tdir/striped_dir/a ||
18580 error "create dir under striped dir failed"
18581 stat $DIR/$tdir/striped_dir/b ||
18582 error "create dir under striped dir failed"
18584 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
18585 error "nlink error after mkdir"
18587 rmdir $DIR/$tdir/striped_dir/a
18588 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
18589 error "nlink error after rmdir"
18591 rmdir $DIR/$tdir/striped_dir/b
18592 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18593 error "nlink error after rmdir"
18595 chattr +i $DIR/$tdir/striped_dir
18596 createmany -o $DIR/$tdir/striped_dir/f 10 &&
18597 error "immutable flags not working under striped dir!"
18598 chattr -i $DIR/$tdir/striped_dir
18600 rmdir $DIR/$tdir/striped_dir ||
18601 error "rmdir striped dir error"
18609 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18610 skip "skipped for lustre < 2.7.0"
18611 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18612 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18614 test_striped_dir 0 || error "failed on striped dir on MDT0"
18615 test_striped_dir 1 || error "failed on striped dir on MDT0"
18617 run_test 300a "basic striped dir sanity test"
18620 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18621 skip "skipped for lustre < 2.7.0"
18622 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18623 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18630 test_mkdir $DIR/$tdir || error "mkdir fail"
18631 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18632 error "set striped dir error"
18633 for i in {0..9}; do
18634 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
18636 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
18637 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
18638 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
18640 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
18641 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
18642 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
18646 run_test 300b "check ctime/mtime for striped dir"
18649 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18650 skip "skipped for lustre < 2.7.0"
18651 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18652 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18656 mkdir -p $DIR/$tdir
18657 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
18658 error "set striped dir error"
18660 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
18661 error "chown striped dir failed"
18663 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
18664 error "create 5k files failed"
18666 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
18668 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
18672 run_test 300c "chown && check ls under striped directory"
18675 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18676 skip "skipped for lustre < 2.7.0"
18677 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18678 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18683 mkdir -p $DIR/$tdir
18684 $SETSTRIPE -c 2 $DIR/$tdir
18686 #local striped directory
18687 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18688 error "set striped dir error"
18689 createmany -o $DIR/$tdir/striped_dir/f 10 ||
18690 error "create 10 files failed"
18692 #remote striped directory
18693 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
18694 error "set striped dir error"
18695 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
18696 error "create 10 files failed"
18698 for file in $(find $DIR/$tdir); do
18699 stripe_count=$($LFS getstripe -c $file)
18700 [ $stripe_count -eq 2 ] ||
18701 error "wrong stripe $stripe_count for $file"
18706 run_test 300d "check default stripe under striped directory"
18709 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18710 skip "Need MDS version at least 2.7.55"
18711 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18712 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18717 mkdir -p $DIR/$tdir
18719 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18720 error "set striped dir error"
18722 touch $DIR/$tdir/striped_dir/a
18723 touch $DIR/$tdir/striped_dir/b
18724 touch $DIR/$tdir/striped_dir/c
18726 mkdir $DIR/$tdir/striped_dir/dir_a
18727 mkdir $DIR/$tdir/striped_dir/dir_b
18728 mkdir $DIR/$tdir/striped_dir/dir_c
18730 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
18731 error "set striped adir under striped dir error"
18733 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
18734 error "set striped bdir under striped dir error"
18736 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
18737 error "set striped cdir under striped dir error"
18739 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
18740 error "rename dir under striped dir fails"
18742 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
18743 error "rename dir under different stripes fails"
18745 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
18746 error "rename file under striped dir should succeed"
18748 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
18749 error "rename dir under striped dir should succeed"
18753 run_test 300e "check rename under striped directory"
18756 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18757 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18758 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18759 skip "Need MDS version at least 2.7.55"
18765 mkdir -p $DIR/$tdir
18767 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18768 error "set striped dir error"
18770 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
18771 error "set striped dir error"
18773 touch $DIR/$tdir/striped_dir/a
18774 mkdir $DIR/$tdir/striped_dir/dir_a
18775 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
18776 error "create striped dir under striped dir fails"
18778 touch $DIR/$tdir/striped_dir1/b
18779 mkdir $DIR/$tdir/striped_dir1/dir_b
18780 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
18781 error "create striped dir under striped dir fails"
18783 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
18784 error "rename dir under different striped dir should fail"
18786 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
18787 error "rename striped dir under diff striped dir should fail"
18789 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
18790 error "rename file under diff striped dirs fails"
18794 run_test 300f "check rename cross striped directory"
18796 test_300_check_default_striped_dir()
18799 local default_count=$2
18800 local default_index=$3
18803 local dir_stripe_index
18806 echo "checking $dirname $default_count $default_index"
18807 $LFS setdirstripe -D -c $default_count -i $default_index \
18808 -t all_char $DIR/$tdir/$dirname ||
18809 error "set default stripe on striped dir error"
18810 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
18811 [ $stripe_count -eq $default_count ] ||
18812 error "expect $default_count get $stripe_count for $dirname"
18814 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
18815 [ $stripe_index -eq $default_index ] ||
18816 error "expect $default_index get $stripe_index for $dirname"
18818 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
18819 error "create dirs failed"
18821 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
18822 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
18823 for dir in $(find $DIR/$tdir/$dirname/*); do
18824 stripe_count=$($LFS getdirstripe -c $dir)
18825 [ $stripe_count -eq $default_count ] ||
18826 [ $stripe_count -eq 0 -o $default_count -eq 1 ] ||
18827 error "stripe count $default_count != $stripe_count for $dir"
18829 stripe_index=$($LFS getdirstripe -i $dir)
18830 [ $default_index -eq -1 -o $stripe_index -eq $default_index ] ||
18831 error "$stripe_index != $default_index for $dir"
18833 #check default stripe
18834 stripe_count=$($LFS getdirstripe -D -c $dir)
18835 [ $stripe_count -eq $default_count ] ||
18836 error "default count $default_count != $stripe_count for $dir"
18838 stripe_index=$($LFS getdirstripe -D -i $dir)
18839 [ $stripe_index -eq $default_index ] ||
18840 error "default index $default_index != $stripe_index for $dir"
18842 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
18846 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18847 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18848 skip "Need MDS version at least 2.7.55"
18855 mkdir $DIR/$tdir/normal_dir
18857 #Checking when client cache stripe index
18858 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
18859 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
18860 error "create striped_dir failed"
18862 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
18863 error "create dir0 fails"
18864 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
18865 [ $stripe_index -eq 0 ] ||
18866 error "dir0 expect index 0 got $stripe_index"
18868 mkdir $DIR/$tdir/striped_dir/dir1 ||
18869 error "create dir1 fails"
18870 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
18871 [ $stripe_index -eq 1 ] ||
18872 error "dir1 expect index 1 got $stripe_index"
18874 #check default stripe count/stripe index
18875 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
18876 test_300_check_default_striped_dir normal_dir 1 0
18877 test_300_check_default_striped_dir normal_dir 2 1
18878 test_300_check_default_striped_dir normal_dir 2 -1
18880 #delete default stripe information
18881 echo "delete default stripeEA"
18882 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
18883 error "set default stripe on striped dir error"
18885 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
18886 for dir in $(find $DIR/$tdir/normal_dir/*); do
18887 stripe_count=$($LFS getdirstripe -c $dir)
18888 [ $stripe_count -eq 0 ] ||
18889 error "expect 1 get $stripe_count for $dir"
18890 stripe_index=$($LFS getdirstripe -i $dir)
18891 [ $stripe_index -eq 0 ] ||
18892 error "expect 0 get $stripe_index for $dir"
18895 run_test 300g "check default striped directory for normal directory"
18898 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18899 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18900 skip "Need MDS version at least 2.7.55"
18906 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18907 error "set striped dir error"
18909 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
18910 test_300_check_default_striped_dir striped_dir 1 0
18911 test_300_check_default_striped_dir striped_dir 2 1
18912 test_300_check_default_striped_dir striped_dir 2 -1
18914 #delete default stripe information
18915 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
18916 error "set default stripe on striped dir error"
18918 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
18919 for dir in $(find $DIR/$tdir/striped_dir/*); do
18920 stripe_count=$($LFS getdirstripe -c $dir)
18921 [ $stripe_count -eq 0 ] ||
18922 error "expect 1 get $stripe_count for $dir"
18925 run_test 300h "check default striped directory for striped directory"
18928 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18929 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18930 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18931 skip "Need MDS version at least 2.7.55"
18938 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18939 error "set striped dir error"
18941 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18942 error "create files under striped dir failed"
18944 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
18945 error "set striped hashdir error"
18947 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
18948 error "create dir0 under hash dir failed"
18949 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
18950 error "create dir1 under hash dir failed"
18952 # unfortunately, we need to umount to clear dir layout cache for now
18953 # once we fully implement dir layout, we can drop this
18954 umount_client $MOUNT || error "umount failed"
18955 mount_client $MOUNT || error "mount failed"
18957 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
18958 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
18959 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
18961 #set the stripe to be unknown hash type
18962 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
18963 $LCTL set_param fail_loc=0x1901
18964 for ((i = 0; i < 10; i++)); do
18965 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
18966 error "stat f-$i failed"
18967 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
18970 touch $DIR/$tdir/striped_dir/f0 &&
18971 error "create under striped dir with unknown hash should fail"
18973 $LCTL set_param fail_loc=0
18975 umount_client $MOUNT || error "umount failed"
18976 mount_client $MOUNT || error "mount failed"
18980 run_test 300i "client handle unknown hash type striped directory"
18983 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18984 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18985 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18986 skip "Need MDS version at least 2.7.55"
18993 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
18994 $LCTL set_param fail_loc=0x1702
18995 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18996 error "set striped dir error"
18998 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18999 error "create files under striped dir failed"
19001 $LCTL set_param fail_loc=0
19003 rm -rf $DIR/$tdir || error "unlink striped dir fails"
19007 run_test 300j "test large update record"
19010 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19011 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19012 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19013 skip "Need MDS version at least 2.7.55"
19020 #define OBD_FAIL_LARGE_STRIPE 0x1703
19021 $LCTL set_param fail_loc=0x1703
19022 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
19023 error "set striped dir error"
19024 $LCTL set_param fail_loc=0
19026 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19027 error "getstripeddir fails"
19028 rm -rf $DIR/$tdir/striped_dir ||
19029 error "unlink striped dir fails"
19033 run_test 300k "test large striped directory"
19036 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19037 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19038 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19039 skip "Need MDS version at least 2.7.55"
19043 test_mkdir -p $DIR/$tdir/striped_dir
19044 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
19045 error "chown $RUNAS_ID failed"
19046 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
19047 error "set default striped dir failed"
19049 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
19050 $LCTL set_param fail_loc=0x80000158
19051 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
19053 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
19054 [ $stripe_index -eq 1 ] ||
19055 error "expect 1 get $stripe_index for $dir"
19057 run_test 300l "non-root user to create dir under striped dir with stale layout"
19060 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19061 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
19062 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19063 skip "Need MDS version at least 2.7.55"
19065 mkdir -p $DIR/$tdir/striped_dir
19066 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
19067 error "set default stripes dir error"
19069 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
19071 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
19072 [ $stripe_count -eq 0 ] ||
19073 error "expect 0 get $stripe_count for a"
19075 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
19076 error "set default stripes dir error"
19078 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
19080 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
19081 [ $stripe_count -eq 0 ] ||
19082 error "expect 0 get $stripe_count for b"
19084 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
19085 error "set default stripes dir error"
19087 mkdir $DIR/$tdir/striped_dir/c &&
19088 error "default stripe_index is invalid, mkdir c should fails"
19090 rm -rf $DIR/$tdir || error "rmdir fails"
19092 run_test 300m "setstriped directory on single MDT FS"
19095 local list=$(comma_list $(mdts_nodes))
19098 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19102 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19103 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19104 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19105 skip "Need MDS version at least 2.7.55"
19106 remote_mds_nodsh && skip "remote MDS with nodsh"
19109 local list=$(comma_list $(mdts_nodes))
19111 trap cleanup_300n RETURN EXIT
19112 mkdir -p $DIR/$tdir
19113 chmod 777 $DIR/$tdir
19114 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
19115 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19116 error "create striped dir succeeds with gid=0"
19118 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19119 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
19120 error "create striped dir fails with gid=-1"
19122 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19123 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
19124 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19125 error "set default striped dir succeeds with gid=0"
19128 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19129 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
19130 error "set default striped dir fails with gid=-1"
19133 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19134 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
19135 error "create test_dir fails"
19136 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
19137 error "create test_dir1 fails"
19138 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
19139 error "create test_dir2 fails"
19142 run_test 300n "non-root user to create dir under striped dir with default EA"
19145 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19146 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19147 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19148 skip "Need MDS version at least 2.7.55"
19153 mkdir -p $DIR/$tdir
19155 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
19156 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
19157 if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then
19158 skip "not enough free inodes $numfree1 $numfree2"
19161 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
19162 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
19163 if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then
19164 skip "not enough free space $numfree1 $numfree2"
19167 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
19168 error "setdirstripe fails"
19170 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
19171 error "create dirs fails"
19173 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
19174 ls $DIR/$tdir/striped_dir > /dev/null ||
19175 error "ls striped dir fails"
19176 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
19177 error "unlink big striped dir fails"
19179 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
19182 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19183 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19184 remote_mds_nodsh && skip "remote MDS with nodsh"
19186 mkdir -p $DIR/$tdir
19188 #define OBD_FAIL_OUT_ENOSPC 0x1704
19189 do_facet mds2 lctl set_param fail_loc=0x80001704
19190 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
19191 && error "create striped directory should fail"
19193 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
19195 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
19198 run_test 300p "create striped directory without space"
19201 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19202 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19204 local fd=$(free_fd)
19205 local cmd="exec $fd<$tdir"
19207 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
19210 trap "eval $cmd" EXIT
19211 cd $tdir || error "cd $tdir fails"
19212 rmdir ../$tdir || error "rmdir $tdir fails"
19213 mkdir local_dir && error "create dir succeeds"
19214 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
19218 run_test 300q "create remote directory under orphan directory"
19221 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
19222 skip "Need MDS version at least 2.7.55" && return
19223 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19227 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
19228 error "set striped dir error"
19230 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19231 error "getstripeddir fails"
19234 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
19235 awk '/lmv_stripe_count:/ { print $2 }')
19237 [ $MDSCOUNT -ne $stripe_count ] &&
19238 error "wrong stripe count $stripe_count expected $MDSCOUNT"
19240 rm -rf $DIR/$tdir/striped_dir ||
19241 error "unlink striped dir fails"
19243 run_test 300r "test -1 striped directory"
19245 prepare_remote_file() {
19246 mkdir $DIR/$tdir/src_dir ||
19247 error "create remote source failed"
19249 cp /etc/hosts $DIR/$tdir/src_dir/a ||
19250 error "cp to remote source failed"
19251 touch $DIR/$tdir/src_dir/a
19253 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
19254 error "create remote target dir failed"
19256 touch $DIR/$tdir/tgt_dir/b
19258 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
19259 error "rename dir cross MDT failed!"
19261 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
19262 error "src_child still exists after rename"
19264 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
19265 error "missing file(a) after rename"
19267 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
19268 error "diff after rename"
19272 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19273 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19275 local remote_file=$DIR/$tdir/tgt_dir/b
19277 mkdir -p $DIR/$tdir
19279 prepare_remote_file || error "prepare remote file failed"
19282 $OPENUNLINK $remote_file $remote_file ||
19283 error "openunlink $remote_file failed"
19284 $CHECKSTAT -a $remote_file || error "$remote_file exists"
19286 run_test 310a "open unlink remote file"
19289 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19290 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19292 local remote_file=$DIR/$tdir/tgt_dir/b
19294 mkdir -p $DIR/$tdir
19296 prepare_remote_file || error "prepare remote file failed"
19298 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19299 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
19300 $CHECKSTAT -t file $remote_file || error "check file failed"
19302 run_test 310b "unlink remote file with multiple links while open"
19305 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19306 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
19308 local remote_file=$DIR/$tdir/tgt_dir/b
19310 mkdir -p $DIR/$tdir
19312 prepare_remote_file || error "prepare remote file failed"
19314 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19315 multiop_bg_pause $remote_file O_uc ||
19316 error "mulitop failed for remote file"
19318 $MULTIOP $DIR/$tfile Ouc
19319 kill -USR1 $MULTIPID
19322 run_test 310c "open-unlink remote file with multiple links"
19326 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19327 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19328 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
19329 skip "lustre < 2.8.54 does not contain LU-4825 fix"
19330 remote_mds_nodsh && skip "remote MDS with nodsh"
19332 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19333 local mdts=$(comma_list $(mdts_nodes))
19335 mkdir -p $DIR/$tdir
19336 $SETSTRIPE -i 0 -c 1 $DIR/$tdir
19337 createmany -o $DIR/$tdir/$tfile. 1000
19339 # statfs data is not real time, let's just calculate it
19340 old_iused=$((old_iused + 1000))
19342 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19343 osp.*OST0000*MDT0000.create_count")
19344 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19345 osp.*OST0000*MDT0000.max_create_count")
19346 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
19348 $SETSTRIPE -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
19349 local index=$($GETSTRIPE -i $DIR/$tdir/$tfile)
19350 [ $index -ne 0 ] || error "$tfile stripe index is 0"
19352 unlinkmany $DIR/$tdir/$tfile. 1000
19354 do_nodes $mdts "$LCTL set_param -n \
19355 osp.*OST0000*.max_create_count=$max_count"
19356 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
19357 do_nodes $mdts "$LCTL set_param -n \
19358 osp.*OST0000*.create_count=$count"
19359 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
19360 grep "=0" && error "create_count is zero"
19363 for i in $(seq 120); do
19364 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19365 # system may be too busy to destroy all objs in time, use
19366 # a somewhat small value to not fail autotest
19367 [ $((old_iused - new_iused)) -gt 400 ] && break
19371 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
19372 [ $((old_iused - new_iused)) -gt 400 ] ||
19373 error "objs not destroyed after unlink"
19375 run_test 311 "disable OSP precreate, and unlink should destroy objs"
19382 local vdevdir=$(dirname $(facet_vdevice $ost))
19383 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
19384 local zfs_zapid=$(do_facet $ost $cmd |
19385 grep -w "/O/0/d$((objid%32))" -C 5 |
19386 awk '/Object/{getline; print $1}')
19387 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
19388 awk "/$objid = /"'{printf $3}')
19393 zfs_object_blksz() {
19397 local vdevdir=$(dirname $(facet_vdevice $ost))
19398 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
19399 local blksz=$(do_facet $ost $cmd $objid |
19400 awk '/dblk/{getline; printf $4}')
19402 case "${blksz: -1}" in
19403 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
19404 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
19411 test_312() { # LU-4856
19412 remote_ost_nodsh && skip "remote OST with nodsh"
19413 [ "$ost1_FSTYPE" = "zfs" ] ||
19414 skip_env "the test only applies to zfs"
19416 local max_blksz=$(do_facet ost1 \
19417 $ZFS get -p recordsize $(facet_device ost1) |
19418 awk '!/VALUE/{print $3}')
19420 # to make life a little bit easier
19421 $LFS mkdir -c 1 -i 0 $DIR/$tdir
19422 $LFS setstripe -c 1 -i 0 $DIR/$tdir
19424 local tf=$DIR/$tdir/$tfile
19426 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19428 # Get ZFS object id
19429 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19430 # block size change by sequential overwrite
19433 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
19434 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
19436 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
19437 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19441 # block size change by sequential append write
19442 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19443 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19444 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19447 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19448 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19449 oflag=sync conv=notrunc
19451 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19452 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19453 error "blksz error, actual $blksz, " \
19454 "expected: 2 * $count * $PAGE_SIZE"
19460 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19461 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19463 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
19464 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19465 [ $blksz -eq $PAGE_SIZE ] ||
19466 error "blksz error: $blksz, expected: $PAGE_SIZE"
19468 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
19469 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19470 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
19472 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
19473 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19474 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
19476 run_test 312 "make sure ZFS adjusts its block size by write pattern"
19479 remote_ost_nodsh && skip "remote OST with nodsh"
19481 local file=$DIR/$tfile
19484 $SETSTRIPE -c 1 -i 0 $file || error "setstripe failed"
19486 # define OBD_FAIL_TGT_RCVD_EIO 0x720
19487 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19488 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
19489 error "write should failed"
19490 do_facet ost1 "$LCTL set_param fail_loc=0"
19493 run_test 313 "io should fail after last_rcvd update fail"
19496 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19498 $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
19499 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19501 wait_delete_completed
19502 do_facet ost1 "$LCTL set_param fail_loc=0"
19504 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
19506 test_315() { # LU-618
19507 local file=$DIR/$tfile
19510 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
19511 error "multiop file write failed"
19512 $MULTIOP $file oO_RDONLY:r4063232_c &
19517 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
19520 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
19523 run_test 315 "read should be accounted"
19526 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19527 large_xattr_enabled || skip_env "ea_inode feature disabled"
19529 rm -rf $DIR/$tdir/d
19530 mkdir -p $DIR/$tdir/d
19531 chown nobody $DIR/$tdir/d
19532 touch $DIR/$tdir/d/file
19534 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
19536 run_test 316 "lfs mv"
19539 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
19540 skip "Need MDS version at least 2.11.53"
19541 if [ "$ost1_FSTYPE" == "zfs" ]; then
19542 skip "LU-10370: no implementation for ZFS"
19546 local grant_blk_size
19548 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
19549 awk '/grant_block_size:/ { print $2; exit; }')
19551 # Create File of size 5M. Truncate it to below size's and verify
19554 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
19555 error "Create file $DIR/$tfile failed"
19556 stack_trap "rm -f $DIR/$tfile" EXIT
19558 for trunc_sz in 2097152 4097 4000 509 0; do
19559 $TRUNCATE $DIR/$tfile $trunc_sz ||
19560 error "truncate $tfile to $trunc_sz failed"
19561 local sz=$(stat --format=%s $DIR/$tfile)
19562 local blk=$(stat --format=%b $DIR/$tfile)
19563 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
19564 grant_blk_size) * 8))
19566 if [[ $blk -ne $trunc_blk ]]; then
19567 $(which stat) $DIR/$tfile
19568 error "Expected Block $trunc_blk got $blk for $tfile"
19571 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19572 error "Expected Size $trunc_sz got $sz for $tfile"
19577 # Create file with a hole and write actual two blocks. Block count
19580 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
19581 conv=fsync || error "Create file : $DIR/$tfile"
19583 # Calculate the final truncate size.
19584 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
19587 # truncate to size $trunc_sz bytes. Strip the last block
19588 # The block count must drop to 8
19590 $TRUNCATE $DIR/$tfile $trunc_sz ||
19591 error "truncate $tfile to $trunc_sz failed"
19593 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
19594 sz=$(stat --format=%s $DIR/$tfile)
19595 blk=$(stat --format=%b $DIR/$tfile)
19597 if [[ $blk -ne $trunc_bsz ]]; then
19598 $(which stat) $DIR/$tfile
19599 error "Expected Block $trunc_bsz got $blk for $tfile"
19602 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19603 error "Expected Size $trunc_sz got $sz for $tfile"
19605 run_test 317 "Verify blocks get correctly update after truncate"
19608 local read_write=$1
19609 if [ "$read_write" = "write" ]; then
19610 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
19611 elif [ "$read_write" = "read" ]; then
19612 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
19614 error "argument error"
19617 # turn off debug for performance testing
19618 local saved_debug=$($LCTL get_param -n debug)
19619 $LCTL set_param debug=0
19621 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
19623 # get ost1 size - lustre-OST0000
19624 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
19625 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
19626 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
19628 if [ "$read_write" = "read" ]; then
19629 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
19632 local start_time=$(date +%s.%N)
19633 $dd_cmd bs=1M count=$blocks oflag=sync ||
19634 error "real dd $read_write error"
19635 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
19637 if [ "$read_write" = "write" ]; then
19641 # define OBD_FAIL_OST_FAKE_RW 0x238
19642 do_facet ost1 $LCTL set_param fail_loc=0x238
19644 local start_time=$(date +%s.%N)
19645 $dd_cmd bs=1M count=$blocks oflag=sync ||
19646 error "fake dd $read_write error"
19647 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
19649 if [ "$read_write" = "write" ]; then
19651 cancel_lru_locks osc
19652 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
19653 error "$tfile size not $blocks MB"
19655 do_facet ost1 $LCTL set_param fail_loc=0
19657 echo "fake $read_write $duration_fake vs. normal $read_write" \
19658 "$duration in seconds"
19659 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
19660 error_not_in_vm "fake write is slower"
19662 $LCTL set_param -n debug="$saved_debug"
19665 test_399a() { # LU-7655 for OST fake write
19666 remote_ost_nodsh && skip "remote OST with nodsh"
19670 run_test 399a "fake write should not be slower than normal write"
19672 test_399b() { # LU-8726 for OST fake read
19673 remote_ost_nodsh && skip "remote OST with nodsh"
19674 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
19675 skip_env "ldiskfs only test"
19680 run_test 399b "fake read should not be slower than normal read"
19682 test_400a() { # LU-1606, was conf-sanity test_74
19683 if ! which $CC > /dev/null 2>&1; then
19684 skip_env "$CC is not installed"
19687 local extra_flags=''
19688 local out=$TMP/$tfile
19689 local prefix=/usr/include/lustre
19692 # Oleg removes c files in his test rig so test if any c files exist
19693 [ -z "$(ls -A $LUSTRE_TESTS_API_DIR)" ] && \
19694 skip_env "Needed c test files are missing"
19696 if ! [[ -d $prefix ]]; then
19697 # Assume we're running in tree and fixup the include path.
19698 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
19699 extra_flags+=" -L$LUSTRE/utils/.lib"
19702 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
19703 $CC -Wall -Werror -std=c99 $extra_flags -o $out $prog -llustreapi ||
19704 error "client api broken"
19708 run_test 400a "Lustre client api program can compile and link"
19710 test_400b() { # LU-1606, LU-5011
19712 local out=$TMP/$tfile
19713 local prefix=/usr/include/linux/lustre
19715 # We use a hard coded prefix so that this test will not fail
19716 # when run in tree. There are headers in lustre/include/lustre/
19717 # that are not packaged (like lustre_idl.h) and have more
19718 # complicated include dependencies (like config.h and lnet/types.h).
19719 # Since this test about correct packaging we just skip them when
19720 # they don't exist (see below) rather than try to fixup cppflags.
19722 if ! which $CC > /dev/null 2>&1; then
19723 skip_env "$CC is not installed"
19726 for header in $prefix/*.h; do
19727 if ! [[ -f "$header" ]]; then
19731 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
19732 continue # lustre_ioctl.h is internal header
19735 $CC -Wall -Werror -std=c99 -include $header -c -x c /dev/null -o $out ||
19736 error "cannot compile '$header'"
19740 run_test 400b "packaged headers can be compiled"
19742 test_401a() { #LU-7437
19743 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
19744 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
19746 #count the number of parameters by "list_param -R"
19747 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
19748 #count the number of parameters by listing proc files
19749 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
19750 echo "proc_dirs='$proc_dirs'"
19751 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
19752 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
19755 [ $params -eq $procs ] ||
19756 error "found $params parameters vs. $procs proc files"
19758 # test the list_param -D option only returns directories
19759 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
19760 #count the number of parameters by listing proc directories
19761 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
19764 [ $params -eq $procs ] ||
19765 error "found $params parameters vs. $procs proc files"
19767 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
19770 local save=$($LCTL get_param -n jobid_var)
19773 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
19774 error "no error returned when setting bad parameters"
19776 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
19777 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
19779 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
19780 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
19781 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
19783 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
19786 local jobid_var_old=$($LCTL get_param -n jobid_var)
19787 local jobid_var_new
19789 $LCTL set_param jobid_var= &&
19790 error "no error returned for 'set_param a='"
19792 jobid_var_new=$($LCTL get_param -n jobid_var)
19793 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19794 error "jobid_var was changed by setting without value"
19796 $LCTL set_param jobid_var &&
19797 error "no error returned for 'set_param a'"
19799 jobid_var_new=$($LCTL get_param -n jobid_var)
19800 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19801 error "jobid_var was changed by setting without value"
19803 run_test 401c "Verify 'lctl set_param' without value fails in either format."
19806 local jobid_var_old=$($LCTL get_param -n jobid_var)
19807 local jobid_var_new
19808 local new_value="foo=bar"
19810 $LCTL set_param jobid_var=$new_value ||
19811 error "'set_param a=b' did not accept a value containing '='"
19813 jobid_var_new=$($LCTL get_param -n jobid_var)
19814 [[ "$jobid_var_new" == "$new_value" ]] ||
19815 error "'set_param a=b' failed on a value containing '='"
19817 # Reset the jobid_var to test the other format
19818 $LCTL set_param jobid_var=$jobid_var_old
19819 jobid_var_new=$($LCTL get_param -n jobid_var)
19820 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19821 error "failed to reset jobid_var"
19823 $LCTL set_param jobid_var $new_value ||
19824 error "'set_param a b' did not accept a value containing '='"
19826 jobid_var_new=$($LCTL get_param -n jobid_var)
19827 [[ "$jobid_var_new" == "$new_value" ]] ||
19828 error "'set_param a b' failed on a value containing '='"
19830 $LCTL set_param jobid_var $jobid_var_old
19831 jobid_var_new=$($LCTL get_param -n jobid_var)
19832 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19833 error "failed to reset jobid_var"
19835 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
19838 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
19839 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
19840 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
19841 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
19842 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
19843 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
19844 remote_mds_nodsh && skip "remote MDS with nodsh"
19846 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
19847 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
19848 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
19849 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
19850 echo "Touch failed - OK"
19852 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
19855 local file1=$DIR/$tfile.1
19856 local file2=$DIR/$tfile.2
19857 local tfile=$TMP/$tfile
19859 rm -f $file1 $file2 $tfile
19864 # 30 sec OBD_TIMEOUT in ll_getattr()
19865 # right before populating st_nlink
19866 $LCTL set_param fail_loc=0x80001409
19867 stat -c %h $file1 > $tfile &
19869 # create an alias, drop all locks and reclaim the dentry
19871 cancel_lru_locks mdc
19872 cancel_lru_locks osc
19873 sysctl -w vm.drop_caches=2
19877 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
19879 rm -f $tfile $file1 $file2
19881 run_test 403 "i_nlink should not drop to zero due to aliasing"
19883 test_404() { # LU-6601
19884 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
19885 skip "Need server version newer than 2.8.52"
19886 remote_mds_nodsh && skip "remote MDS with nodsh"
19888 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
19889 awk '/osp .*-osc-MDT/ { print $4}')
19892 for osp in $mosps; do
19893 echo "Deactivate: " $osp
19894 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
19895 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19896 awk -vp=$osp '$4 == p { print $2 }')
19897 [ $stat = IN ] || {
19898 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19899 error "deactivate error"
19901 echo "Activate: " $osp
19902 do_facet $SINGLEMDS $LCTL --device %$osp activate
19903 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19904 awk -vp=$osp '$4 == p { print $2 }')
19905 [ $stat = UP ] || {
19906 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19907 error "activate error"
19911 run_test 404 "validate manual {de}activated works properly for OSPs"
19914 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] ||
19915 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
19916 skip "Layout swap lock is not supported"
19918 check_swap_layouts_support
19920 test_mkdir $DIR/$tdir
19921 swap_lock_test -d $DIR/$tdir ||
19922 error "One layout swap locked test failed"
19924 run_test 405 "Various layout swap lock tests"
19927 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19928 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
19929 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
19930 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19931 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
19932 skip "Need MDS version at least 2.8.50"
19934 local def_stripe_size=$($LFS getstripe -S $MOUNT)
19935 local test_pool=$TESTNAME
19937 pool_add $test_pool || error "pool_add failed"
19938 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
19939 error "pool_add_targets failed"
19941 save_layout_restore_at_exit $MOUNT
19943 # parent set default stripe count only, child will stripe from both
19944 # parent and fs default
19945 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
19946 error "setstripe $MOUNT failed"
19947 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
19948 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
19949 for i in $(seq 10); do
19950 local f=$DIR/$tdir/$tfile.$i
19951 touch $f || error "touch failed"
19952 local count=$($LFS getstripe -c $f)
19953 [ $count -eq $OSTCOUNT ] ||
19954 error "$f stripe count $count != $OSTCOUNT"
19955 local offset=$($LFS getstripe -i $f)
19956 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
19957 local size=$($LFS getstripe -S $f)
19958 [ $size -eq $((def_stripe_size * 2)) ] ||
19959 error "$f stripe size $size != $((def_stripe_size * 2))"
19960 local pool=$($LFS getstripe -p $f)
19961 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
19964 # change fs default striping, delete parent default striping, now child
19965 # will stripe from new fs default striping only
19966 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
19967 error "change $MOUNT default stripe failed"
19968 $LFS setstripe -c 0 $DIR/$tdir ||
19969 error "delete $tdir default stripe failed"
19970 for i in $(seq 11 20); do
19971 local f=$DIR/$tdir/$tfile.$i
19972 touch $f || error "touch $f failed"
19973 local count=$($LFS getstripe -c $f)
19974 [ $count -eq 1 ] || error "$f stripe count $count != 1"
19975 local offset=$($LFS getstripe -i $f)
19976 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
19977 local size=$($LFS getstripe -S $f)
19978 [ $size -eq $def_stripe_size ] ||
19979 error "$f stripe size $size != $def_stripe_size"
19980 local pool=$($LFS getstripe -p $f)
19981 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
19984 unlinkmany $DIR/$tdir/$tfile. 1 20
19986 local f=$DIR/$tdir/$tfile
19987 pool_remove_all_targets $test_pool $f
19988 pool_remove $test_pool $f
19990 run_test 406 "DNE support fs default striping"
19993 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19994 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
19995 skip "Need MDS version at least 2.8.55"
19996 remote_mds_nodsh && skip "remote MDS with nodsh"
19998 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
19999 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
20000 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
20001 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
20002 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
20004 #define OBD_FAIL_DT_TXN_STOP 0x2019
20005 for idx in $(seq $MDSCOUNT); do
20006 do_facet mds$idx "lctl set_param fail_loc=0x2019"
20008 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
20009 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
20010 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
20013 run_test 407 "transaction fail should cause operation fail"
20016 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
20018 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
20019 lctl set_param fail_loc=0x8000040a
20020 # let ll_prepare_partial_page() fail
20021 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
20025 # create at least 100 unused inodes so that
20026 # shrink_icache_memory(0) should not return 0
20027 touch $DIR/$tfile-{0..100}
20028 rm -f $DIR/$tfile-{0..100}
20031 echo 2 > /proc/sys/vm/drop_caches
20033 run_test 408 "drop_caches should not hang due to page leaks"
20037 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20038 check_mount_and_prep
20040 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
20041 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
20042 touch $DIR/$tdir/guard || error "(2) Fail to create"
20044 local PREFIX=$(str_repeat 'A' 128)
20045 echo "Create 1K hard links start at $(date)"
20046 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20047 error "(3) Fail to hard link"
20049 echo "Links count should be right although linkEA overflow"
20050 stat $DIR/$tdir/guard || error "(4) Fail to stat"
20051 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
20052 [ $linkcount -eq 1001 ] ||
20053 error "(5) Unexpected hard links count: $linkcount"
20055 echo "List all links start at $(date)"
20056 ls -l $DIR/$tdir/foo > /dev/null ||
20057 error "(6) Fail to list $DIR/$tdir/foo"
20059 echo "Unlink hard links start at $(date)"
20060 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20061 error "(7) Fail to unlink"
20063 run_test 409 "Large amount of cross-MDTs hard links on the same file"
20067 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
20068 skip "Need client version at least 2.9.59"
20070 # Create a file, and stat it from the kernel
20071 local testfile=$DIR/$tfile
20074 local run_id=$RANDOM
20075 local my_ino=$(stat --format "%i" $testfile)
20077 # Try to insert the module. This will always fail as the
20078 # module is designed to not be inserted.
20079 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
20082 # Anything but success is a test failure
20084 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
20085 error "no inode match"
20087 run_test 410 "Test inode number returned from kernel thread"
20089 cleanup_test411_cgroup() {
20095 local cg_basedir=/sys/fs/cgroup/memory
20097 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
20098 skip "no setup for cgroup"
20100 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
20101 error "test file creation failed"
20102 cancel_lru_locks osc
20104 # Create a very small memory cgroup to force a slab allocation error
20105 local cgdir=$cg_basedir/osc_slab_alloc
20106 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
20107 trap "cleanup_test411_cgroup $cgdir" EXIT
20108 echo 2M > $cgdir/memory.kmem.limit_in_bytes
20109 echo 1M > $cgdir/memory.limit_in_bytes
20111 # Should not LBUG, just be killed by oom-killer
20112 # dd will return 0 even allocation failure in some environment.
20113 # So don't check return value
20114 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
20115 cleanup_test411_cgroup $cgdir
20119 run_test 411 "Slab allocation error with cgroup does not LBUG"
20122 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20123 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20124 skip "Need server version at least 2.10.55"
20127 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
20128 error "mkdir failed"
20129 $LFS getdirstripe $DIR/$tdir
20130 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
20131 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
20132 error "expect $((MDSCOUT - 1)) get $stripe_index"
20133 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
20134 [ $stripe_count -eq 2 ] ||
20135 error "expect 2 get $stripe_count"
20137 run_test 412 "mkdir on specific MDTs"
20140 [ $MDSCOUNT -lt 2 ] &&
20141 skip "We need at least 2 MDTs for this test"
20143 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20144 skip "Need server version at least 2.10.55"
20147 mkdir $DIR/$tdir || error "mkdir failed"
20149 # find MDT that is the most full
20150 local max=$($LFS df | grep MDT |
20159 END { split(b, c, ":")
20164 for i in $(seq $((MDSCOUNT - 1))); do
20165 $LFS mkdir -c $i $DIR/$tdir/d$i ||
20166 error "mkdir d$i failed"
20167 $LFS getdirstripe $DIR/$tdir/d$i
20168 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
20169 [ $stripe_index -ne $max ] ||
20170 error "don't expect $max"
20173 run_test 413 "mkdir on less full MDTs"
20176 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
20177 $LCTL set_param fail_loc=0x80000521
20178 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
20181 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
20184 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20185 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
20186 skip "Need server version at least 2.11.52"
20196 # this test may be slow on ZFS
20197 [ "$mds1_FSTYPE" == "zfs" ] && total=100
20199 # though this test is designed for striped directory, let's test normal
20200 # directory too since lock is always saved as CoS lock.
20201 test_mkdir $DIR/$tdir || error "mkdir $tdir"
20202 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
20211 start_time=$(date +%s)
20212 for i in $(seq $total); do
20213 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
20216 end_time=$(date +%s)
20217 duration=$((end_time - start_time))
20219 kill -9 $setattr_pid
20221 echo "rename $total files took $duration sec"
20222 [ $duration -lt 100 ] || error "rename took $duration sec"
20224 run_test 415 "lock revoke is not missing"
20227 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
20228 skip "Need server version at least 2.11.55"
20230 # define OBD_FAIL_OSD_TXN_START 0x19a
20231 do_facet mds1 lctl set_param fail_loc=0x19a
20233 lfs mkdir -c $MDSCOUNT $DIR/$tdir
20237 run_test 416 "transaction start failure won't cause system hung"
20241 do_nodes $(comma_list $(mdts_nodes)) \
20242 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
20243 do_nodes $(comma_list $(mdts_nodes)) \
20244 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
20245 do_nodes $(comma_list $(mdts_nodes)) \
20246 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
20250 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20251 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
20252 skip "Need MDS version at least 2.11.56"
20254 trap cleanup_417 RETURN EXIT
20256 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
20257 do_nodes $(comma_list $(mdts_nodes)) \
20258 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
20259 $LFS migrate -m 0 $DIR/$tdir.1 &&
20260 error "migrate dir $tdir.1 should fail"
20262 do_nodes $(comma_list $(mdts_nodes)) \
20263 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
20264 $LFS mkdir -i 1 $DIR/$tdir.2 &&
20265 error "create remote dir $tdir.2 should fail"
20267 do_nodes $(comma_list $(mdts_nodes)) \
20268 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
20269 $LFS mkdir -c 2 $DIR/$tdir.3 &&
20270 error "create striped dir $tdir.3 should fail"
20273 run_test 417 "disable remote dir, striped dir and dir migration"
20275 # Checks that the outputs of df [-i] and lfs df [-i] match
20277 # usage: check_lfs_df <blocks | inodes> <mountpoint>
20287 [ "$1" == "blocks" ] && inodes= || inodes="-i"
20289 for count in {1..100}; do
20293 # read the lines of interest
20294 df_out=($(df -P $inodes $dir | tail -n +2)) ||
20295 error "df $inodes $dir | tail -n +2 failed"
20296 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
20297 error "lfs df $inodes $dir | grep summary: failed"
20299 # skip first substrings of each output as they are different
20300 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
20301 # compare the remaining fields of the two outputs
20303 for i in {1..5}; do
20304 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
20312 lfs df $inodes $dir
20313 error "df and lfs df $1 output mismatch: " \
20314 "df ${inodes}: ${df_out[*]}, " \
20315 "lfs df ${inodes}: ${lfs_df_out[*]}"
20320 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20322 local dir=$DIR/$tdir
20323 local numfiles=$((RANDOM % 4096 + 2))
20324 local numblocks=$((RANDOM % 256 + 1))
20326 wait_delete_completed
20329 # check block output
20330 check_lfs_df blocks $dir
20331 # check inode output
20332 check_lfs_df inodes $dir
20334 # create a single file and retest
20335 echo "Creating a single file and testing"
20336 createmany -o $dir/$tfile- 1 &>/dev/null ||
20337 error "creating 1 file in $dir failed"
20338 check_lfs_df blocks $dir
20339 check_lfs_df inodes $dir
20341 # create a random number of files
20342 echo "Creating $((numfiles - 1)) files and testing"
20343 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
20344 error "creating $((numfiles - 1)) files in $dir failed"
20346 # write a random number of blocks to the first test file
20347 echo "Writing $numblocks 4K blocks and testing"
20348 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
20349 count=$numblocks &>/dev/null ||
20350 error "dd to $dir/${tfile}-0 failed"
20353 check_lfs_df blocks $dir
20354 check_lfs_df inodes $dir
20356 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
20357 error "unlinking $numfiles files in $dir failed"
20359 run_test 418 "df and lfs df outputs match"
20363 local dir=$DIR/$tdir
20368 cancel_lru_locks mdc
20370 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
20371 $LCTL set_param fail_loc=0x1410
20373 $LCTL set_param fail_loc=0
20376 run_test 419 "Verify open file by name doesn't crash kernel"
20380 [[ $MDS1_VERSION -ge $(version_code 2.12.1) ]] ||
20381 skip "Need MDS version at least 2.12.1"
20383 local SAVE_UMASK=$(umask)
20384 local dir=$DIR/$tdir
20385 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
20389 mkdir -m03777 $dir/testdir
20390 ls -dn $dir/testdir
20391 # Need to remove trailing '.' when SELinux is enabled
20392 local dirperms=$(ls -dn $dir/testdir |
20393 awk '{ sub(/\.$/, "", $1); print $1}')
20394 [ $dirperms == "drwxrwsrwt" ] ||
20395 error "incorrect perms on $dir/testdir"
20397 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
20398 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
20399 ls -n $dir/testdir/testfile
20400 local fileperms=$(ls -n $dir/testdir/testfile |
20401 awk '{ sub(/\.$/, "", $1); print $1}')
20402 [ $fileperms == "-rwxr-xr-x" ] ||
20403 error "incorrect perms on $dir/testdir/testfile"
20407 run_test 420 "clear SGID bit on non-directories for non-members"
20414 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20415 skip "Need MDS version at least 2.12.2"
20417 test_mkdir $DIR/$tdir
20418 createmany -o $DIR/$tdir/f 3
20419 cnt=$(ls -1 $DIR/$tdir | wc -l)
20420 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20422 fid1=$(lfs path2fid $DIR/$tdir/f1)
20423 fid2=$(lfs path2fid $DIR/$tdir/f2)
20424 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
20426 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
20427 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
20429 cnt=$(ls -1 $DIR/$tdir | wc -l)
20430 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20432 rm -f $DIR/$tdir/f3 || error "can't remove f3"
20433 createmany -o $DIR/$tdir/f 3
20434 cnt=$(ls -1 $DIR/$tdir | wc -l)
20435 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20437 fid1=$(lfs path2fid $DIR/$tdir/f1)
20438 fid2=$(lfs path2fid $DIR/$tdir/f2)
20439 echo "remove using fsname $FSNAME"
20440 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
20442 cnt=$(ls -1 $DIR/$tdir | wc -l)
20443 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20445 run_test 421a "simple rm by fid"
20452 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20453 skip "Need MDS version at least 2.12.2"
20455 test_mkdir $DIR/$tdir
20456 createmany -o $DIR/$tdir/f 3
20457 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
20460 FID1=$(lfs path2fid $DIR/$tdir/f1)
20461 FID2=$(lfs path2fid $DIR/$tdir/f2)
20462 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
20464 kill -USR1 $MULTIPID
20467 cnt=$(ls $DIR/$tdir | wc -l)
20468 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
20470 run_test 421b "rm by fid on open file"
20476 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20477 skip "Need MDS version at least 2.12.2"
20479 test_mkdir $DIR/$tdir
20480 createmany -o $DIR/$tdir/f 3
20481 touch $DIR/$tdir/$tfile
20482 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
20483 cnt=$(ls -1 $DIR/$tdir | wc -l)
20484 [ $cnt != 184 ] && error "unexpected #files: $cnt"
20486 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
20487 $LFS rmfid $DIR $FID1 || error "rmfid failed"
20489 cnt=$(ls $DIR/$tdir | wc -l)
20490 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
20492 run_test 421c "rm by fid against hardlinked files"
20498 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20499 skip "Need MDS version at least 2.12.2"
20501 test_mkdir $DIR/$tdir
20502 createmany -o $DIR/$tdir/f 4097
20503 cnt=$(ls -1 $DIR/$tdir | wc -l)
20504 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
20506 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
20507 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20509 cnt=$(ls $DIR/$tdir | wc -l)
20511 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20513 run_test 421d "rmfid en masse"
20519 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20520 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20521 skip "Need MDS version at least 2.12.2"
20523 mkdir -p $DIR/$tdir
20524 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20525 createmany -o $DIR/$tdir/striped_dir/f 512
20526 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20527 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20529 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20530 sed "s/[/][^:]*://g")
20531 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20533 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20535 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20537 run_test 421e "rmfid in DNE"
20543 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20544 skip "Need MDS version at least 2.12.2"
20546 test_mkdir $DIR/$tdir
20548 cnt=$(ls -1 $DIR/$tdir | wc -l)
20549 [ $cnt != 1 ] && error "unexpected #files: $cnt"
20551 FID=$(lfs path2fid $DIR/$tdir/f)
20552 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
20553 # rmfid should fail
20554 cnt=$(ls -1 $DIR/$tdir | wc -l)
20555 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
20557 chmod a+rw $DIR/$tdir
20559 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
20560 # rmfid should fail
20561 cnt=$(ls -1 $DIR/$tdir | wc -l)
20562 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
20565 $RUNAS touch $DIR/$tdir/f
20566 FID=$(lfs path2fid $DIR/$tdir/f)
20567 echo "rmfid as root"
20568 $LFS rmfid $DIR $FID || error "rmfid as root failed"
20569 cnt=$(ls -1 $DIR/$tdir | wc -l)
20570 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
20573 $RUNAS touch $DIR/$tdir/f
20574 cnt=$(ls -1 $DIR/$tdir | wc -l)
20575 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
20576 FID=$(lfs path2fid $DIR/$tdir/f)
20577 # rmfid w/o user_fid2path mount option should fail
20578 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
20579 cnt=$(ls -1 $DIR/$tdir | wc -l)
20580 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
20582 umount_client $MOUNT || "failed to umount client"
20583 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
20584 "failed to mount client'"
20586 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
20587 # rmfid should succeed
20588 cnt=$(ls -1 $DIR/$tdir | wc -l)
20589 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
20591 # rmfid shouldn't allow to remove files due to dir's permission
20592 chmod a+rwx $DIR/$tdir
20595 FID=$(lfs path2fid $DIR/$tdir/f)
20596 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
20598 umount_client $MOUNT || "failed to umount client"
20599 mount_client $MOUNT "$MOUNT_OPTS" ||
20600 "failed to mount client'"
20603 run_test 421f "rmfid checks permissions"
20609 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20610 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20611 skip "Need MDS version at least 2.12.2"
20613 mkdir -p $DIR/$tdir
20614 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20615 createmany -o $DIR/$tdir/striped_dir/f 512
20616 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20617 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20619 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20620 sed "s/[/][^:]*://g")
20622 rm -f $DIR/$tdir/striped_dir/f1*
20623 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20624 removed=$((512 - cnt))
20626 # few files have been just removed, so we expect
20627 # rmfid to fail on their fids
20628 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
20629 [ $removed != $errors ] && error "$errors != $removed"
20631 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20633 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20635 run_test 421g "rmfid to return errors properly"
20648 # ensure statfs cache is expired
20651 _stats=$(stat_test | grep $MOUNT | sort -u | wc -l)
20652 [[ ${_stats} -ne 1 ]] && error "statfs wrong"
20656 run_test 423 "statfs should return a right data"
20659 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20660 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20661 skip "Need server version at least 2.9.55"
20663 start_full_debug_logging
20667 stop_full_debug_logging
20671 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20672 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20673 awk '/The barrier for/ { print $7 }')
20676 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
20681 barrier_expired() {
20684 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20685 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20686 awk '/will be expired/ { print $7 }')
20688 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
20697 echo "Start barrier_freeze at: $(date)"
20698 #define OBD_FAIL_BARRIER_DELAY 0x2202
20699 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20700 # Do not reduce barrier time - See LU-11873
20701 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
20704 local b_status=$(barrier_stat)
20705 echo "Got barrier status at: $(date)"
20706 [ "$b_status" = "'freezing_p1'" ] ||
20707 error "(1) unexpected barrier status $b_status"
20709 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20711 b_status=$(barrier_stat)
20712 [ "$b_status" = "'frozen'" ] ||
20713 error "(2) unexpected barrier status $b_status"
20715 local expired=$(barrier_expired)
20716 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
20717 sleep $((expired + 3))
20719 b_status=$(barrier_stat)
20720 [ "$b_status" = "'expired'" ] ||
20721 error "(3) unexpected barrier status $b_status"
20723 # Do not reduce barrier time - See LU-11873
20724 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
20725 error "(4) fail to freeze barrier"
20727 b_status=$(barrier_stat)
20728 [ "$b_status" = "'frozen'" ] ||
20729 error "(5) unexpected barrier status $b_status"
20731 echo "Start barrier_thaw at: $(date)"
20732 #define OBD_FAIL_BARRIER_DELAY 0x2202
20733 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20734 do_facet mgs $LCTL barrier_thaw $FSNAME &
20737 b_status=$(barrier_stat)
20738 echo "Got barrier status at: $(date)"
20739 [ "$b_status" = "'thawing'" ] ||
20740 error "(6) unexpected barrier status $b_status"
20742 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20744 b_status=$(barrier_stat)
20745 [ "$b_status" = "'thawed'" ] ||
20746 error "(7) unexpected barrier status $b_status"
20748 #define OBD_FAIL_BARRIER_FAILURE 0x2203
20749 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
20750 do_facet mgs $LCTL barrier_freeze $FSNAME
20752 b_status=$(barrier_stat)
20753 [ "$b_status" = "'failed'" ] ||
20754 error "(8) unexpected barrier status $b_status"
20756 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
20757 do_facet mgs $LCTL barrier_thaw $FSNAME
20761 run_test 801a "write barrier user interfaces and stat machine"
20766 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20767 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
20768 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
20769 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
20770 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
20772 cancel_lru_locks mdc
20774 # 180 seconds should be long enough
20775 do_facet mgs $LCTL barrier_freeze $FSNAME 180
20777 local b_status=$(barrier_stat)
20778 [ "$b_status" = "'frozen'" ] ||
20779 error "(6) unexpected barrier status $b_status"
20781 mkdir $DIR/$tdir/d0/d10 &
20784 touch $DIR/$tdir/d1/f13 &
20787 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
20790 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
20793 rm -f $DIR/$tdir/d4/f12 &
20796 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
20798 # To guarantee taht the 'stat' is not blocked
20799 b_status=$(barrier_stat)
20800 [ "$b_status" = "'frozen'" ] ||
20801 error "(8) unexpected barrier status $b_status"
20803 # let above commands to run at background
20806 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
20807 ps -p $touch_pid || error "(10) touch should be blocked"
20808 ps -p $ln_pid || error "(11) link should be blocked"
20809 ps -p $mv_pid || error "(12) rename should be blocked"
20810 ps -p $rm_pid || error "(13) unlink should be blocked"
20812 b_status=$(barrier_stat)
20813 [ "$b_status" = "'frozen'" ] ||
20814 error "(14) unexpected barrier status $b_status"
20816 do_facet mgs $LCTL barrier_thaw $FSNAME
20817 b_status=$(barrier_stat)
20818 [ "$b_status" = "'thawed'" ] ||
20819 error "(15) unexpected barrier status $b_status"
20821 wait $mkdir_pid || error "(16) mkdir should succeed"
20822 wait $touch_pid || error "(17) touch should succeed"
20823 wait $ln_pid || error "(18) link should succeed"
20824 wait $mv_pid || error "(19) rename should succeed"
20825 wait $rm_pid || error "(20) unlink should succeed"
20829 run_test 801b "modification will be blocked by write barrier"
20832 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20836 stop mds2 || error "(1) Fail to stop mds2"
20838 do_facet mgs $LCTL barrier_freeze $FSNAME 30
20840 local b_status=$(barrier_stat)
20841 [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || {
20842 do_facet mgs $LCTL barrier_thaw $FSNAME
20843 error "(2) unexpected barrier status $b_status"
20846 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20847 error "(3) Fail to rescan barrier bitmap"
20849 # Do not reduce barrier time - See LU-11873
20850 do_facet mgs $LCTL barrier_freeze $FSNAME 20
20852 b_status=$(barrier_stat)
20853 [ "$b_status" = "'frozen'" ] ||
20854 error "(4) unexpected barrier status $b_status"
20856 do_facet mgs $LCTL barrier_thaw $FSNAME
20857 b_status=$(barrier_stat)
20858 [ "$b_status" = "'thawed'" ] ||
20859 error "(5) unexpected barrier status $b_status"
20861 local devname=$(mdsdevname 2)
20863 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
20865 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20866 error "(7) Fail to rescan barrier bitmap"
20870 run_test 801c "rescan barrier bitmap"
20872 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
20873 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
20874 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
20875 saved_MOUNT_OPTS=$MOUNT_OPTS
20881 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
20882 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
20883 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
20884 MOUNT_OPTS=$saved_MOUNT_OPTS
20890 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20891 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20892 skip "Need server version at least 2.9.55"
20894 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
20896 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20898 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
20899 error "(2) Fail to copy"
20901 trap cleanup_802 EXIT
20903 # sync by force before remount as readonly
20904 sync; sync_all_data; sleep 3; sync_all_data
20908 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
20909 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
20910 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
20912 echo "Mount the server as read only"
20913 setupall server_only || error "(3) Fail to start servers"
20915 echo "Mount client without ro should fail"
20916 mount_client $MOUNT &&
20917 error "(4) Mount client without 'ro' should fail"
20919 echo "Mount client with ro should succeed"
20920 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
20921 mount_client $MOUNT ||
20922 error "(5) Mount client with 'ro' should succeed"
20924 echo "Modify should be refused"
20925 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
20927 echo "Read should be allowed"
20928 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
20929 error "(7) Read should succeed under ro mode"
20933 run_test 802 "simulate readonly device"
20936 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20937 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20938 skip "MDS needs to be newer than 2.10.54"
20940 mkdir -p $DIR/$tdir
20941 # Create some objects on all MDTs to trigger related logs objects
20942 for idx in $(seq $MDSCOUNT); do
20943 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
20944 $DIR/$tdir/dir${idx} ||
20945 error "Fail to create $DIR/$tdir/dir${idx}"
20949 wait_delete_completed # ensure old test cleanups are finished
20950 echo "before create:"
20952 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20954 for i in {1..10}; do
20955 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
20956 error "Fail to create $DIR/$tdir/foo$i"
20960 echo "after create:"
20962 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20964 # allow for an llog to be cleaned up during the test
20965 [ $after_used -ge $((before_used + 10 - 1)) ] ||
20966 error "before ($before_used) + 10 > after ($after_used)"
20968 for i in {1..10}; do
20969 rm -rf $DIR/$tdir/foo$i ||
20970 error "Fail to remove $DIR/$tdir/foo$i"
20973 sleep 3 # avoid MDT return cached statfs
20974 wait_delete_completed
20975 echo "after unlink:"
20977 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20979 # allow for an llog to be created during the test
20980 [ $after_used -le $((before_used + 1)) ] ||
20981 error "after ($after_used) > before ($before_used) + 1"
20983 run_test 803 "verify agent object for remote object"
20986 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20987 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20988 skip "MDS needs to be newer than 2.10.54"
20989 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
20991 mkdir -p $DIR/$tdir
20992 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
20993 error "Fail to create $DIR/$tdir/dir0"
20995 local fid=$($LFS path2fid $DIR/$tdir/dir0)
20996 local dev=$(mdsdevname 2)
20998 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20999 grep ${fid} || error "NOT found agent entry for dir0"
21001 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
21002 error "Fail to create $DIR/$tdir/dir1"
21004 touch $DIR/$tdir/dir1/foo0 ||
21005 error "Fail to create $DIR/$tdir/dir1/foo0"
21006 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
21009 for idx in $(seq $MDSCOUNT); do
21010 dev=$(mdsdevname $idx)
21011 do_facet mds${idx} \
21012 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21013 grep ${fid} && rc=$idx
21016 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
21017 error "Fail to rename foo0 to foo1"
21018 if [ $rc -eq 0 ]; then
21019 for idx in $(seq $MDSCOUNT); do
21020 dev=$(mdsdevname $idx)
21021 do_facet mds${idx} \
21022 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21023 grep ${fid} && rc=$idx
21027 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
21028 error "Fail to rename foo1 to foo2"
21029 if [ $rc -eq 0 ]; then
21030 for idx in $(seq $MDSCOUNT); do
21031 dev=$(mdsdevname $idx)
21032 do_facet mds${idx} \
21033 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21034 grep ${fid} && rc=$idx
21038 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
21040 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
21041 error "Fail to link to $DIR/$tdir/dir1/foo2"
21042 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
21043 error "Fail to rename foo2 to foo0"
21044 unlink $DIR/$tdir/dir1/foo0 ||
21045 error "Fail to unlink $DIR/$tdir/dir1/foo0"
21046 rm -rf $DIR/$tdir/dir0 ||
21047 error "Fail to rm $DIR/$tdir/dir0"
21049 for idx in $(seq $MDSCOUNT); do
21050 dev=$(mdsdevname $idx)
21054 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
21056 start mds${idx} $dev $MDS_MOUNT_OPTS ||
21057 error "mount mds$idx failed"
21058 df $MOUNT > /dev/null 2>&1
21060 # e2fsck should not return error
21062 error "e2fsck detected error on MDT${idx}: rc=$rc"
21065 run_test 804 "verify agent entry for remote entry"
21068 do_facet $SINGLEMDS zfs set quota=$old $fsset
21069 unlinkmany $DIR/$tdir/f- 1000000
21074 local zfs_version=$(do_node $SINGLEMDS cat /sys/module/zfs/version)
21075 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
21076 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
21077 skip "netfree not implemented before 0.7"
21078 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
21079 skip "Need MDS version at least 2.10.57"
21086 local pref="osd-zfs.lustre-MDT0000."
21088 # limit available space on MDS dataset to meet nospace issue
21089 # quickly. then ZFS 0.7.2 can use reserved space if asked
21090 # properly (using netfree flag in osd_declare_destroy()
21091 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
21092 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
21094 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
21095 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
21096 let "usedkb=usedkb-freekb"
21097 let "freekb=freekb/2"
21098 if let "freekb > 5000"; then
21101 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
21102 trap cleanup_805 EXIT
21104 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
21105 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
21106 rm -rf $DIR/$tdir || error "not able to remove"
21107 do_facet $SINGLEMDS zfs set quota=$old $fsset
21110 run_test 805 "ZFS can remove from full fs"
21116 local size=$($LFS getsom -s $file)
21117 local expect=$(stat -c %s $file)
21119 [[ $size == $expect ]] ||
21120 error "$file expected size: $expect, got: $size"
21122 local blocks=$($LFS getsom -b $file)
21123 expect=$(stat -c %b $file)
21124 [[ $blocks == $expect ]] ||
21125 error "$file expected blocks: $expect, got: $blocks"
21130 local size=$($LFS getsom -s $1)
21133 [[ $size == $expect ]] ||
21134 error "$file expected size: $expect, got: $size"
21138 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21139 skip "Need MDS version at least 2.11.52"
21143 touch $DIR/$tfile || error "touch $tfile failed"
21145 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21146 save_lustre_params client "llite.*.xattr_cache" > $save
21147 lctl set_param llite.*.xattr_cache=0
21148 stack_trap "restore_lustre_params < $save" EXIT
21150 # single-threaded write
21151 echo "Test SOM for single-threaded write"
21152 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
21153 error "write $tfile failed"
21154 check_lsom_size $DIR/$tfile $bs
21157 local size=$(($num * $bs))
21161 echo "Test SOM for single client multi-threaded($num) write"
21162 $TRUNCATE $DIR/$tfile 0
21163 for ((i = 0; i < $num; i++)); do
21164 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21166 offset=$((offset + $bs))
21168 for (( i=0; i < $num; i++ )); do
21171 check_lsom_size $DIR/$tfile $size
21173 $TRUNCATE $DIR/$tfile 0
21174 for ((i = 0; i < $num; i++)); do
21175 offset=$((offset - $bs))
21176 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21179 for (( i=0; i < $num; i++ )); do
21182 check_lsom_size $DIR/$tfile $size
21184 # multi-client writes
21185 num=$(get_node_count ${CLIENTS//,/ })
21186 size=$(($num * $bs))
21190 echo "Test SOM for multi-client ($num) writes"
21191 $TRUNCATE $DIR/$tfile 0
21192 for client in ${CLIENTS//,/ }; do
21193 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21196 offset=$((offset + $bs))
21198 for (( i=0; i < $num; i++ )); do
21201 check_lsom_size $DIR/$tfile $offset
21204 $TRUNCATE $DIR/$tfile 0
21205 for client in ${CLIENTS//,/ }; do
21206 offset=$((offset - $bs))
21207 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21211 for (( i=0; i < $num; i++ )); do
21214 check_lsom_size $DIR/$tfile $size
21217 echo "Test SOM for truncate"
21218 $TRUNCATE $DIR/$tfile 1048576
21219 check_lsom_size $DIR/$tfile 1048576
21220 $TRUNCATE $DIR/$tfile 1234
21221 check_lsom_size $DIR/$tfile 1234
21223 # verify SOM blocks count
21224 echo "Verify SOM block count"
21225 $TRUNCATE $DIR/$tfile 0
21226 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
21227 error "failed to write file $tfile"
21228 check_lsom_data $DIR/$tfile
21230 run_test 806 "Verify Lazy Size on MDS"
21233 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21234 skip "Need MDS version at least 2.11.52"
21236 # Registration step
21237 changelog_register || error "changelog_register failed"
21238 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
21239 changelog_users $SINGLEMDS | grep -q $cl_user ||
21240 error "User $cl_user not found in changelog_users"
21242 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21243 save_lustre_params client "llite.*.xattr_cache" > $save
21244 lctl set_param llite.*.xattr_cache=0
21245 stack_trap "restore_lustre_params < $save" EXIT
21247 rm -rf $DIR/$tdir || error "rm $tdir failed"
21248 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
21249 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
21250 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
21251 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
21252 error "truncate $tdir/trunc failed"
21255 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
21256 error "write $tfile failed"
21258 # multi-client wirtes
21259 local num=$(get_node_count ${CLIENTS//,/ })
21263 echo "Test SOM for multi-client ($num) writes"
21264 touch $DIR/$tfile || error "touch $tfile failed"
21265 $TRUNCATE $DIR/$tfile 0
21266 for client in ${CLIENTS//,/ }; do
21267 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21270 offset=$((offset + $bs))
21272 for (( i=0; i < $num; i++ )); do
21277 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
21278 check_lsom_data $DIR/$tdir/trunc
21279 check_lsom_data $DIR/$tdir/single_dd
21280 check_lsom_data $DIR/$tfile
21283 # Deregistration step
21284 changelog_deregister || error "changelog_deregister failed"
21286 run_test 807 "verify LSOM syncing tool"
21288 check_som_nologged()
21290 local lines=$($LFS changelog $FSNAME-MDT0000 |
21291 grep 'x=trusted.som' | wc -l)
21292 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
21296 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
21297 skip "Need MDS version at least 2.11.55"
21299 # Registration step
21300 changelog_register || error "changelog_register failed"
21302 touch $DIR/$tfile || error "touch $tfile failed"
21305 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
21306 error "write $tfile failed"
21309 $TRUNCATE $DIR/$tfile 1234
21312 $TRUNCATE $DIR/$tfile 1048576
21315 # Deregistration step
21316 changelog_deregister || error "changelog_deregister failed"
21318 run_test 808 "Check trusted.som xattr not logged in Changelogs"
21323 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
21327 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
21328 skip "Need MDS version at least 2.11.56"
21330 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
21331 error "failed to create DoM-only file $DIR/$tfile"
21332 touch $DIR/$tfile || error "touch $tfile failed"
21333 check_som_nodata $DIR/$tfile
21335 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
21336 error "write $tfile failed"
21337 check_som_nodata $DIR/$tfile
21339 $TRUNCATE $DIR/$tfile 1234
21340 check_som_nodata $DIR/$tfile
21342 $TRUNCATE $DIR/$tfile 4097
21343 check_som_nodata $DIR/$file
21345 run_test 809 "Verify no SOM xattr store for DoM-only files"
21348 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21349 $GSS && skip_env "could not run with gss"
21352 stack_trap "set_checksums $ORIG_CSUM" EXIT
21353 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
21358 for csum in $CKSUM_TYPES; do
21359 #define OBD_FAIL_OSC_NO_GRANT 0x411
21360 $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411
21361 for i in "10240 0" "10000 0" "4000 1" "500 1"; do
21363 dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2
21364 before=$(md5sum $DIR/$tfile)
21365 $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear
21366 after=$(md5sum $DIR/$tfile)
21367 [ "$before" == "$after" ] ||
21368 error "$csum: $before != $after bs=$1 seek=$2"
21372 run_test 810 "partial page writes on ZFS (LU-11663)"
21375 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
21376 skip "Need MDS version at least 2.11.56"
21378 #define OBD_FAIL_MDS_ORPHAN_DELETE 0x165
21379 do_facet mds1 $LCTL set_param fail_loc=0x165
21380 $MULTIOP $DIR/$tfile Ouc || error "multiop failed"
21383 start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
21386 [[ $(do_facet mds1 pgrep orph_.*-MDD | wc -l) -eq 0 ]] ||
21387 error "MDD orphan cleanup thread not quit"
21389 run_test 811 "orphan name stub can be cleaned up in startup"
21392 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
21393 skip "OST < 2.12.51 doesn't support this fail_loc"
21394 [ "$SHARED_KEY" = true ] &&
21395 skip "OSC connections never go IDLE with Shared-Keys enabled"
21397 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21398 # ensure ost1 is connected
21399 stat $DIR/$tfile >/dev/null || error "can't stat"
21400 wait_osc_import_state client ost1 FULL
21401 # no locks, no reqs to let the connection idle
21402 cancel_lru_locks osc
21404 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
21405 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
21406 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
21407 wait_osc_import_state client ost1 CONNECTING
21408 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
21410 stat $DIR/$tfile >/dev/null || error "can't stat file"
21412 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
21416 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
21417 echo -n y >> $DIR/$tfile
21418 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
21419 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
21421 run_test 814 "sparse cp works as expected (LU-12361)"
21425 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
21426 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
21428 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
21431 [ "$SHARED_KEY" = true ] &&
21432 skip "OSC connections never go IDLE with Shared-Keys enabled"
21434 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21435 # ensure ost1 is connected
21436 stat $DIR/$tfile >/dev/null || error "can't stat"
21437 wait_osc_import_state client ost1 FULL
21438 # no locks, no reqs to let the connection idle
21439 cancel_lru_locks osc
21440 lru_resize_disable osc
21443 before=$($LCTL get_param -n \
21444 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21446 wait_osc_import_state client ost1 IDLE
21447 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
21448 now=$($LCTL get_param -n \
21449 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21450 [ $before == $now ] || error "lru_size changed $before != $now"
21452 run_test 816 "do not reset lru_resize on idle reconnect"
21456 exportfs -u localhost:$DIR/nfsexp
21461 systemctl restart nfs-server.service || skip "failed to restart nfsd"
21463 mkdir -p $DIR/nfsexp
21464 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
21465 error "failed to export nfs"
21467 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
21468 stack_trap cleanup_817 EXIT
21470 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
21471 error "failed to mount nfs to $tmpdir"
21473 cp /bin/true $tmpdir
21474 $DIR/nfsexp/true || error "failed to execute 'true' command"
21476 run_test 817 "nfsd won't cache write lock for exec file"
21479 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21480 cancel_lru_locks osc
21481 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21482 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21483 dd if=$DIR/$tfile of=/dev/null bs=1M count=1
21486 run_test 819a "too big niobuf in read"
21489 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21490 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21491 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21492 cancel_lru_locks osc
21496 run_test 819b "too big niobuf in write"
21500 $LFS setstripe -c1 -i0 $DIR/$tfile
21501 $LFS setstripe -c1 -i1 $DIR/$tfile
21503 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
21504 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
21505 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
21506 error "start $SINGLEMDS failed"
21509 run_test 818 "unlink with failed llog"
21512 # tests that do cleanup/setup should be run at the end
21516 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21519 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
21520 $LCTL set_param fail_loc=0x903
21522 cancel_lru_locks MGC
21524 FAIL_ON_ERROR=true cleanup
21525 FAIL_ON_ERROR=true setup
21527 run_test 900 "umount should not race with any mgc requeue thread"
21530 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
21531 check_and_cleanup_lustre
21532 if [ "$I_MOUNTED" != "yes" ]; then
21533 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true