2 # -*- tab-width: 8; indent-tabs-mode: t; -*-
4 # Run select tests by setting ONLY, or as arguments to the script.
5 # Skip specific tests by setting EXCEPT.
7 # e.g. ONLY="22 23" or ONLY="`seq 32 39`" or EXCEPT="31"
11 # bug number for skipped test: LU-9693 LU-6493 LU-9693 LU-11058
12 ALWAYS_EXCEPT="$SANITY_EXCEPT 42a 42b 42c 77k"
13 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
15 # skipped tests: LU-8411 LU-9096 LU-9054 ..
16 ALWAYS_EXCEPT=" 407 253 312 $ALWAYS_EXCEPT"
19 # bug number for skipped tests: LU-9795 (all below)
20 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 17n 60a 133g 300f"
23 if [[ $(uname -m) = aarch64 ]]; then
24 # bug number: LU-11596 (all below)
25 ALWAYS_EXCEPT+=" 42d 42e 63a 63b 64a 64b 64c"
26 # bug number: LU-11671 LU-11665 LU-11594 LU-11667 LU-11729
27 ALWAYS_EXCEPT+=" 45 101c 103a 317 810"
30 # Check Grants after these tests
31 GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c"
32 SRCDIR=$(cd $(dirname $0); echo $PWD)
33 export PATH=$PATH:/sbin
39 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
40 CREATETEST=${CREATETEST:-createtest}
42 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
44 OPENFILE=${OPENFILE:-openfile}
45 OPENUNLINK=${OPENUNLINK:-openunlink}
46 export MULTIOP=${MULTIOP:-multiop}
47 READS=${READS:-"reads"}
48 MUNLINK=${MUNLINK:-munlink}
49 SOCKETSERVER=${SOCKETSERVER:-socketserver}
50 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
51 MEMHOG=${MEMHOG:-memhog}
52 DIRECTIO=${DIRECTIO:-directio}
53 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
55 CHECK_GRANT=${CHECK_GRANT:-"yes"}
56 GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
57 export PARALLEL=${PARALLEL:-"no"}
59 export NAME=${NAME:-local}
66 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
67 LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
68 . $LUSTRE/tests/test-framework.sh
70 . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh}
75 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
77 if [ "$mds1_FSTYPE" = "zfs" ]; then
78 # bug number for skipped test: LU-1957
79 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 180"
81 [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
84 # Get the SLES distro version
86 # Returns a version string that should only be used in comparing
87 # strings returned by version_code()
90 local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2)
92 # All SuSE Linux versions have one decimal. version_code expects two
93 local sles_version=$version.0
94 version_code $sles_version
97 # Check if we are running on Ubuntu or SLES so we can make decisions on
99 if [ -r /etc/SuSE-release ]; then
100 sles_version=$(sles_version_code)
101 [ $sles_version -lt $(version_code 11.4.0) ] &&
102 # bug number for skipped test: LU-4341
103 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170"
104 [ $sles_version -lt $(version_code 12.0.0) ] &&
105 # bug number for skipped test: LU-3703
106 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234"
107 elif [ -r /etc/os-release ]; then
108 if grep -qi ubuntu /etc/os-release; then
109 ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
110 -e 's/^VERSION=//p' \
114 if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
115 # bug number for skipped test:
117 ALWAYS_EXCEPT+=" 103a 410"
126 pgrep ll_sa > /dev/null && { echo "There are ll_sa thread not exit!"; exit 20; }
127 cleanupall ${FORCE} $* || { echo "FAILed to clean up"; exit 20; }
136 check_swap_layouts_support()
138 $LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
139 skip "Does not support layout lock."
142 check_and_setup_lustre
146 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
148 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
149 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
150 rm -rf $DIR/[Rdfs][0-9]*
152 # $RUNAS_ID may get set incorrectly somewhere else
153 [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] &&
154 error "\$RUNAS_ID set to 0, but \$UID is also 0!"
156 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
160 if [ "${ONLY}" = "MOUNT" ] ; then
161 echo "Lustre is up, please go on"
165 echo "preparing for tests involving mounts"
166 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
168 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
169 echo # add a newline after mke2fs.
173 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
174 lctl set_param debug=-1 2> /dev/null || true
177 $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
179 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
181 run_test 0a "touch; rm ====================="
184 chmod 0755 $DIR || error "chmod 0755 $DIR failed"
185 $CHECKSTAT -p 0755 $DIR || error "$DIR permission is not 0755"
187 run_test 0b "chmod 0755 $DIR ============================="
190 $LCTL get_param mdc.*.import | grep "state: FULL" ||
191 error "import not FULL"
192 $LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" ||
195 run_test 0c "check import proc"
197 test_0d() { # LU-3397
198 [ $MGS_VERSION -lt $(version_code 2.10.57) ] &&
199 skip "proc exports not supported before 2.10.57"
201 local mgs_exp="mgs.MGS.exports"
202 local client_uuid=$($LCTL get_param -n mgc.*.uuid)
204 local exp_client_version
207 local temp_imp=$DIR/$tfile.import
208 local temp_exp=$DIR/$tfile.export
210 # save mgc import file to $temp_imp
211 $LCTL get_param mgc.*.import | tee $temp_imp
212 # Check if client uuid is found in MGS export
213 for exp_client_nid in $(do_facet mgs $LCTL get_param -N $mgs_exp.*); do
214 [ $(do_facet mgs $LCTL get_param -n $exp_client_nid.uuid) == \
218 # save mgs export file to $temp_exp
219 do_facet mgs $LCTL get_param $exp_client_nid.export | tee $temp_exp
221 # Compare the value of field "connect_flags"
222 imp_val=$(grep "connect_flags" $temp_imp)
223 exp_val=$(grep "connect_flags" $temp_exp)
224 [ "$exp_val" == "$imp_val" ] ||
225 error "export flags '$exp_val' != import flags '$imp_val'"
227 # Compare the value of client version
228 exp_client_version=$(awk '/target_version:/ { print $2 }' $temp_exp)
229 exp_val=$(version_code $exp_client_version)
230 imp_val=$CLIENT_VERSION
231 [ "$exp_val" == "$imp_val" ] ||
232 error "export client version '$exp_val' != '$imp_val'"
234 run_test 0d "check export proc ============================="
237 test_mkdir $DIR/$tdir
238 test_mkdir $DIR/$tdir/d2
239 mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
240 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir"
243 $CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed"
245 run_test 1 "mkdir; remkdir; rmdir"
248 test_mkdir $DIR/$tdir
249 touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed"
250 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
252 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed"
254 run_test 2 "mkdir; touch; rmdir; check file"
257 test_mkdir $DIR/$tdir
258 $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
259 touch $DIR/$tdir/$tfile
260 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
262 $CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed"
264 run_test 3 "mkdir; touch; rmdir; check dir"
266 # LU-4471 - failed rmdir on remote directories still removes directory on MDT0
268 test_mkdir -i 1 $DIR/$tdir
270 touch $DIR/$tdir/$tfile ||
271 error "Create file under remote directory failed"
274 error "Expect error removing in-use dir $DIR/$tdir"
276 test -d $DIR/$tdir || error "Remote directory disappeared"
278 rm -rf $DIR/$tdir || error "remove remote dir error"
280 run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
283 test_mkdir $DIR/$tdir
284 test_mkdir $DIR/$tdir/d2
285 chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed"
286 $CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707"
287 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
289 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2"
292 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
293 chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
294 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
295 error "$tfile does not have perm 0666 or UID $UID"
296 $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
297 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
298 error "$tfile should be 0666 and owned by UID $UID"
300 run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
303 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
306 chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
307 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
308 error "$tfile should be owned by UID $RUNAS_ID"
309 $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
310 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
311 error "$tfile should be owned by UID $RUNAS_ID"
313 run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
316 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
319 chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
320 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
321 error "$tfile should be owned by GID $UID"
322 $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
323 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
324 error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
326 run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)"
329 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
331 test_mkdir $DIR/$tdir
332 chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed"
333 $RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
334 chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed"
335 test_mkdir $DIR/$tdir/d/subdir
336 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir ||
337 error "$tdir/d/subdir should be GID $RUNAS_GID"
338 if [[ $MDSCOUNT -gt 1 ]]; then
339 # check remote dir sgid inherite
340 $LFS mkdir -i 0 $DIR/$tdir.local ||
341 error "mkdir $tdir.local failed"
342 chmod g+s $DIR/$tdir.local ||
343 error "chmod $tdir.local failed"
344 chgrp $RUNAS_GID $DIR/$tdir.local ||
345 error "chgrp $tdir.local failed"
346 $LFS mkdir -i 1 $DIR/$tdir.local/$tdir.remote ||
347 error "mkdir $tdir.remote failed"
348 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir.local/$tdir.remote ||
349 error "$tdir.remote should be owned by $UID.$RUNAS_ID"
350 $CHECKSTAT -p 02755 $DIR/$tdir.local/$tdir.remote ||
351 error "$tdir.remote should be mode 02755"
354 run_test 6g "verify new dir in sgid dir inherits group"
356 test_6h() { # bug 7331
357 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
359 touch $DIR/$tfile || error "touch failed"
360 chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile || error "initial chown failed"
361 $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/$tfile &&
362 error "chown $RUNAS_ID:0 $tfile worked as GID $RUNAS_GID"
363 $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile ||
364 error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID"
366 run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)"
369 test_mkdir $DIR/$tdir
370 $MCREATE $DIR/$tdir/$tfile
371 chmod 0666 $DIR/$tdir/$tfile
372 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
373 error "$tdir/$tfile should be mode 0666"
375 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
378 if [ ! -d $DIR/$tdir ]; then
379 test_mkdir $DIR/$tdir
381 $MCREATE $DIR/$tdir/$tfile
382 echo -n foo > $DIR/$tdir/$tfile
383 [ "$(cat $DIR/$tdir/$tfile)" = "foo" ] || error "$tdir/$tfile not 'foo'"
384 $CHECKSTAT -t file -s 3 $DIR/$tdir/$tfile || error "$tfile size not 3"
386 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
389 test_mkdir $DIR/$tdir
390 touch $DIR/$tdir/$tfile
391 chmod 0666 $DIR/$tdir/$tfile
392 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
393 error "$tfile mode not 0666"
395 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
398 test_mkdir $DIR/$tdir
399 test_mkdir $DIR/$tdir/d2
400 test_mkdir $DIR/$tdir/d2/d3
401 $CHECKSTAT -t dir $DIR/$tdir/d2/d3 || error "$tdir/d2/d3 not a dir"
403 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
406 test_mkdir $DIR/$tdir
407 test_mkdir $DIR/$tdir/d2
408 touch $DIR/$tdir/d2/$tfile
409 $CHECKSTAT -t file $DIR/$tdir/d2/$tfile ||
410 error "$tdir/d2/$tfile not a file"
412 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
415 test_mkdir $DIR/$tdir
416 test_mkdir $DIR/$tdir/d2
417 chmod 0666 $DIR/$tdir/d2
418 chmod 0705 $DIR/$tdir/d2
419 $CHECKSTAT -t dir -p 0705 $DIR/$tdir/d2 ||
420 error "$tdir/d2 mode not 0705"
422 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
425 test_mkdir $DIR/$tdir
426 touch $DIR/$tdir/$tfile
427 chmod 0666 $DIR/$tdir/$tfile
428 chmod 0654 $DIR/$tdir/$tfile
429 $CHECKSTAT -t file -p 0654 $DIR/$tdir/$tfile ||
430 error "$tdir/d2 mode not 0654"
432 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
435 test_mkdir $DIR/$tdir
436 dd if=/dev/zero of=$DIR/$tdir/$tfile count=10
438 $CHECKSTAT -t file -s 0 $DIR/$tdir/$tfile ||
439 error "$tdir/$tfile size not 0 after truncate"
441 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
444 test_mkdir $DIR/$tdir
445 touch $DIR/$tdir/$tfile
447 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
449 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
452 test_mkdir $DIR/$tdir
453 touch $DIR/$tdir/$tfile
454 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
455 $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
456 error "$tdir/${tfile_2} not a file after rename"
457 rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
459 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
462 test_mkdir $DIR/$tdir
463 touch $DIR/$tdir/$tfile
464 rm -rf $DIR/$tdir/$tfile
465 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
467 run_test 16 "touch .../d16/f; rm -rf .../d16/f"
470 test_mkdir $DIR/$tdir
471 touch $DIR/$tdir/$tfile
472 ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist
474 $CHECKSTAT -l $DIR/$tdir/$tfile $DIR/$tdir/l-exist ||
475 error "$tdir/l-exist not a symlink"
476 $CHECKSTAT -f -t f $DIR/$tdir/l-exist ||
477 error "$tdir/l-exist not referencing a file"
478 rm -f $DIR/$tdir/l-exist
479 $CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed"
481 run_test 17a "symlinks: create, remove (real)"
484 test_mkdir $DIR/$tdir
485 ln -s no-such-file $DIR/$tdir/l-dangle
487 $CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle ||
488 error "$tdir/l-dangle not referencing no-such-file"
489 $CHECKSTAT -fa $DIR/$tdir/l-dangle ||
490 error "$tdir/l-dangle not referencing non-existent file"
491 rm -f $DIR/$tdir/l-dangle
492 $CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed"
494 run_test 17b "symlinks: create, remove (dangling)"
496 test_17c() { # bug 3440 - don't save failed open RPC for replay
497 test_mkdir $DIR/$tdir
498 ln -s foo $DIR/$tdir/$tfile
499 cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true
501 run_test 17c "symlinks: open dangling (should return error)"
504 test_mkdir $DIR/$tdir
505 ln -s foo $DIR/$tdir/$tfile
506 touch $DIR/$tdir/$tfile || error "creating to new symlink"
508 run_test 17d "symlinks: create dangling"
511 test_mkdir $DIR/$tdir
512 local foo=$DIR/$tdir/$tfile
513 ln -s $foo $foo || error "create symlink failed"
514 ls -l $foo || error "ls -l failed"
515 ls $foo && error "ls not failed" || true
517 run_test 17e "symlinks: create recursive symlink (should return error)"
520 test_mkdir $DIR/$tdir
521 ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
522 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
523 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
524 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
525 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
526 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/$tdir/666
529 run_test 17f "symlinks: long and very long symlink name"
531 # str_repeat(S, N) generate a string that is string S repeated N times
536 while [ $((n -= 1)) -ge 0 ]; do
542 # Long symlinks and LU-2241
544 test_mkdir $DIR/$tdir
545 local TESTS="59 60 61 4094 4095"
547 # Fix for inode size boundary in 2.1.4
548 [ $MDS1_VERSION -lt $(version_code 2.1.4) ] &&
551 # Patch not applied to 2.2 or 2.3 branches
552 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
553 [ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
556 # skip long symlink name for rhel6.5.
557 # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
558 grep -q '6.5' /etc/redhat-release &>/dev/null &&
559 TESTS="59 60 61 4062 4063"
562 local SYMNAME=$(str_repeat 'x' $i)
563 ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
564 readlink $DIR/$tdir/f$i || error "failed $i-char readlink"
567 run_test 17g "symlinks: really long symlink name and inode boundaries"
569 test_17h() { #bug 17378
570 [ $PARALLEL == "yes" ] && skip "skip parallel run"
571 remote_mds_nodsh && skip "remote MDS with nodsh"
575 test_mkdir $DIR/$tdir
576 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
577 $LFS setstripe -c -1 $DIR/$tdir
578 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
579 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
580 touch $DIR/$tdir/$tfile || true
582 run_test 17h "create objects: lov_free_memmd() doesn't lbug"
584 test_17i() { #bug 20018
585 [ $PARALLEL == "yes" ] && skip "skip parallel run"
586 remote_mds_nodsh && skip "remote MDS with nodsh"
588 local foo=$DIR/$tdir/$tfile
591 test_mkdir -c1 $DIR/$tdir
592 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
593 ln -s $foo $foo || error "create symlink failed"
594 #define OBD_FAIL_MDS_READLINK_EPROTO 0x143
595 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000143
596 ls -l $foo && error "error not detected"
599 run_test 17i "don't panic on short symlink (should return error)"
601 test_17k() { #bug 22301
602 [ $PARALLEL == "yes" ] && skip "skip parallel run"
603 [[ -z "$(which rsync 2>/dev/null)" ]] &&
604 skip "no rsync command"
605 rsync --help | grep -q xattr ||
606 skip_env "$(rsync --version | head -n1) does not support xattrs"
607 test_mkdir $DIR/$tdir
608 test_mkdir $DIR/$tdir.new
609 touch $DIR/$tdir/$tfile
610 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
611 rsync -av -X $DIR/$tdir/ $DIR/$tdir.new ||
612 error "rsync failed with xattrs enabled"
614 run_test 17k "symlinks: rsync with xattrs enabled"
616 test_17l() { # LU-279
617 [[ -z "$(which getfattr 2>/dev/null)" ]] &&
618 skip "no getfattr command"
620 test_mkdir $DIR/$tdir
621 touch $DIR/$tdir/$tfile
622 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
623 for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
624 # -h to not follow symlinks. -m '' to list all the xattrs.
625 # grep to remove first line: '# file: $path'.
626 for xattr in `getfattr -hm '' $path 2>/dev/null | grep -v '^#'`;
628 lgetxattr_size_check $path $xattr ||
629 error "lgetxattr_size_check $path $xattr failed"
633 run_test 17l "Ensure lgetxattr's returned xattr size is consistent"
637 [ $PARALLEL == "yes" ] && skip "skip parallel run"
638 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
639 remote_mds_nodsh && skip "remote MDS with nodsh"
640 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
641 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
642 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
644 local short_sym="0123456789"
645 local wdir=$DIR/$tdir
650 # create a long symlink file
651 for ((i = 0; i < 4; ++i)); do
652 long_sym=${long_sym}${long_sym}
655 echo "create 512 short and long symlink files under $wdir"
656 for ((i = 0; i < 256; ++i)); do
657 ln -sf ${long_sym}"a5a5" $wdir/long-$i
658 ln -sf ${short_sym}"a5a5" $wdir/short-$i
664 wait_delete_completed
666 echo "recreate the 512 symlink files with a shorter string"
667 for ((i = 0; i < 512; ++i)); do
668 # rewrite the symlink file with a shorter string
669 ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed"
670 ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed"
673 local mds_index=$(($($LFS getstripe -m $wdir) + 1))
674 local devname=$(mdsdevname $mds_index)
676 echo "stop and checking mds${mds_index}:"
677 # e2fsck should not return error
679 run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
682 start mds${mds_index} $devname $MDS_MOUNT_OPTS ||
683 error "start mds${mds_index} failed"
684 df $MOUNT > /dev/null 2>&1
686 error "e2fsck detected error for short/long symlink: rc=$rc"
689 run_test 17m "run e2fsck against MDT which contains short/long symlink"
691 check_fs_consistency_17n() {
695 # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
696 # so it only check MDT1/MDT2 instead of all of MDTs.
697 for mdt_index in 1 2; do
698 local devname=$(mdsdevname $mdt_index)
699 # e2fsck should not return error
701 run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
704 start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
705 error "mount mds$mdt_index failed"
706 df $MOUNT > /dev/null 2>&1
712 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
713 [ $PARALLEL == "yes" ] && skip "skip parallel run"
714 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
715 remote_mds_nodsh && skip "remote MDS with nodsh"
716 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
717 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
718 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
722 test_mkdir $DIR/$tdir
723 for ((i=0; i<10; i++)); do
724 $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
725 error "create remote dir error $i"
726 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
727 error "create files under remote dir failed $i"
730 check_fs_consistency_17n ||
731 error "e2fsck report error after create files under remote dir"
733 for ((i = 0; i < 10; i++)); do
734 rm -rf $DIR/$tdir/remote_dir_${i} ||
735 error "destroy remote dir error $i"
738 check_fs_consistency_17n ||
739 error "e2fsck report error after unlink files under remote dir"
741 [ $MDS1_VERSION -lt $(version_code 2.4.50) ] &&
742 skip "lustre < 2.4.50 does not support migrate mv"
744 for ((i = 0; i < 10; i++)); do
745 mkdir -p $DIR/$tdir/remote_dir_${i}
746 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
747 error "create files under remote dir failed $i"
748 $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
749 error "migrate remote dir error $i"
751 check_fs_consistency_17n || error "e2fsck report error after migration"
753 for ((i = 0; i < 10; i++)); do
754 rm -rf $DIR/$tdir/remote_dir_${i} ||
755 error "destroy remote dir error $i"
758 check_fs_consistency_17n || error "e2fsck report error after unlink"
760 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
763 remote_mds_nodsh && skip "remote MDS with nodsh"
764 [ $MDS1_VERSION -lt $(version_code 2.3.64) ] &&
765 skip "Need MDS version at least 2.3.64"
767 local wdir=$DIR/${tdir}o
773 mdt_index=$($LFS getstripe -m $wdir/$tfile)
774 mdt_index=$((mdt_index + 1))
777 #fail mds will wait the failover finish then set
778 #following fail_loc to avoid interfer the recovery process.
781 #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
782 do_facet mds${mdt_index} lctl set_param fail_loc=0x194
783 ls -l $wdir/$tfile && rc=1
784 do_facet mds${mdt_index} lctl set_param fail_loc=0
785 [[ $rc -eq 0 ]] || error "stat file should fail"
787 run_test 17o "stat file with incompat LMA feature"
790 touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
791 ls $DIR || error "Failed to ls $DIR: $?"
793 run_test 18 "touch .../f ; ls ... =============================="
799 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
801 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
804 ls -l $DIR/$tfile && error "ls -l $tfile failed"|| true
806 run_test 19b "ls -l .../f19 (should return error) =============="
809 [ $RUNAS_ID -eq $UID ] &&
810 skip_env "RUNAS_ID = UID = $UID -- skipping"
812 $RUNAS touch $DIR/$tfile && error "create non-root file failed" || true
814 run_test 19c "$RUNAS touch .../f19 (should return error) =="
817 cat $DIR/f19 && error || true
819 run_test 19d "cat .../f19 (should return error) =============="
828 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
830 run_test 20 "touch .../f ; ls -l ..."
833 test_mkdir $DIR/$tdir
834 [ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle
835 ln -s dangle $DIR/$tdir/link
836 echo foo >> $DIR/$tdir/link
837 cat $DIR/$tdir/dangle
838 $CHECKSTAT -t link $DIR/$tdir/link || error "$tdir/link not a link"
839 $CHECKSTAT -f -t file $DIR/$tdir/link ||
840 error "$tdir/link not linked to a file"
842 run_test 21 "write to dangling link"
845 local wdir=$DIR/$tdir
847 chown $RUNAS_ID:$RUNAS_GID $wdir
848 (cd $wdir || error "cd $wdir failed";
849 $RUNAS tar cf - /etc/hosts /etc/sysconfig/network |
851 ls -lR $wdir/etc || error "ls -lR $wdir/etc failed"
852 $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed"
853 $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc ||
854 error "checkstat -u failed"
856 run_test 22 "unpack tar archive as non-root user"
860 test_mkdir $DIR/$tdir
861 local file=$DIR/$tdir/$tfile
863 openfile -f O_CREAT:O_EXCL $file || error "$file create failed"
864 openfile -f O_CREAT:O_EXCL $file &&
865 error "$file recreate succeeded" || true
867 run_test 23a "O_CREAT|O_EXCL in subdir"
869 test_23b() { # bug 18988
870 test_mkdir $DIR/$tdir
871 local file=$DIR/$tdir/$tfile
874 echo foo > $file || error "write filed"
875 echo bar >> $file || error "append filed"
876 $CHECKSTAT -s 8 $file || error "wrong size"
879 run_test 23b "O_APPEND check"
881 # LU-9409, size with O_APPEND and tiny writes
883 local file=$DIR/$tfile
886 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800
887 $CHECKSTAT -s 6400 $file || error "wrong size, expected 6400"
891 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
892 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
894 $CHECKSTAT -s 12800 $file || error "wrong size, expected 12800"
897 #racing tiny & normal writes
898 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4096 count=4 &
899 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=100 &
901 $CHECKSTAT -s 17184 $file || error "wrong size, expected 17184"
904 #racing tiny & normal writes 2, ugly numbers
905 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4099 count=11 &
906 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=17 count=173 &
908 $CHECKSTAT -s 48030 $file || error "wrong size, expected 48030"
911 run_test 23c "O_APPEND size checks for tiny writes"
913 # LU-11069 file offset is correct after appending writes
915 local file=$DIR/$tfile
918 echo CentaurHauls > $file
919 offset=$($MULTIOP $file oO_WRONLY:O_APPEND:w13Zp)
920 if ((offset != 26)); then
921 error "wrong offset, expected 26, got '$offset'"
924 run_test 23d "file offset is correct after appending writes"
928 echo '-- same directory rename'
929 test_mkdir $DIR/$tdir
930 touch $DIR/$tdir/$tfile.1
931 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
932 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
934 run_test 24a "rename file to non-existent target"
937 test_mkdir $DIR/$tdir
938 touch $DIR/$tdir/$tfile.{1,2}
939 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
940 $CHECKSTAT -a $DIR/$tdir/$tfile.1 || error "$tfile.1 exists"
941 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
943 run_test 24b "rename file to existing target"
946 test_mkdir $DIR/$tdir
947 test_mkdir $DIR/$tdir/d$testnum.1
948 mv $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
949 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
950 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
952 run_test 24c "rename directory to non-existent target"
955 test_mkdir -c1 $DIR/$tdir
956 test_mkdir -c1 $DIR/$tdir/d$testnum.1
957 test_mkdir -c1 $DIR/$tdir/d$testnum.2
958 mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
959 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
960 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
962 run_test 24d "rename directory to existing target"
965 echo '-- cross directory renames --'
969 mv $DIR/R5a/f $DIR/R5b/g
970 $CHECKSTAT -a $DIR/R5a/f || error "$DIR/R5a/f exists"
971 $CHECKSTAT -t file $DIR/R5b/g || error "$DIR/R5b/g not file type"
973 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
978 touch $DIR/R6a/f $DIR/R6b/g
979 mv $DIR/R6a/f $DIR/R6b/g
980 $CHECKSTAT -a $DIR/R6a/f || error "$DIR/R6a/f exists"
981 $CHECKSTAT -t file $DIR/R6b/g || error "$DIR/R6b/g not file type"
983 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
988 test_mkdir $DIR/R7a/d
989 mv $DIR/R7a/d $DIR/R7b/e
990 $CHECKSTAT -a $DIR/R7a/d || error "$DIR/R7a/d exists"
991 $CHECKSTAT -t dir $DIR/R7b/e || error "$DIR/R7b/e not dir type"
993 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
996 test_mkdir -c1 $DIR/R8a
997 test_mkdir -c1 $DIR/R8b
998 test_mkdir -c1 $DIR/R8a/d
999 test_mkdir -c1 $DIR/R8b/e
1000 mrename $DIR/R8a/d $DIR/R8b/e
1001 $CHECKSTAT -a $DIR/R8a/d || error "$DIR/R8a/d exists"
1002 $CHECKSTAT -t dir $DIR/R8b/e || error "$DIR/R8b/e not dir type"
1004 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
1007 echo "-- rename error cases"
1009 test_mkdir $DIR/R9/a
1011 mrename $DIR/R9/f $DIR/R9/a
1012 $CHECKSTAT -t file $DIR/R9/f || error "$DIR/R9/f not file type"
1013 $CHECKSTAT -t dir $DIR/R9/a || error "$DIR/R9/a not dir type"
1014 $CHECKSTAT -a $DIR/R9/a/f || error "$DIR/R9/a/f exists"
1016 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
1020 mrename $DIR/R10/f $DIR/R10/g
1021 $CHECKSTAT -t dir $DIR/R10 || error "$DIR/R10 not dir type"
1022 $CHECKSTAT -a $DIR/R10/f || error "$DIR/R10/f exists"
1023 $CHECKSTAT -a $DIR/R10/g || error "$DIR/R10/g exists"
1025 run_test 24j "source does not exist ============================"
1028 test_mkdir $DIR/R11a
1029 test_mkdir $DIR/R11a/d
1031 mv $DIR/R11a/f $DIR/R11a/d
1032 $CHECKSTAT -a $DIR/R11a/f || error "$DIR/R11a/f exists"
1033 $CHECKSTAT -t file $DIR/R11a/d/f || error "$DIR/R11a/d/f not file type"
1035 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
1037 # bug 2429 - rename foo foo foo creates invalid file
1040 $MULTIOP $f OcNs || error "rename of ${f} to itself failed"
1042 run_test 24l "Renaming a file to itself ========================"
1046 $MULTIOP $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
1047 # on ext3 this does not remove either the source or target files
1048 # though the "expected" operation would be to remove the source
1049 $CHECKSTAT -t file ${f} || error "${f} missing"
1050 $CHECKSTAT -t file ${f}2 || error "${f}2 missing"
1052 run_test 24m "Renaming a file to a hard link to itself ========="
1056 # this stats the old file after it was renamed, so it should fail
1058 $CHECKSTAT ${f} || error "${f} missing"
1060 $CHECKSTAT ${f}.rename || error "${f}.rename missing"
1061 $CHECKSTAT -a ${f} || error "${f} exists"
1063 run_test 24n "Statting the old file after renaming (Posix rename 2)"
1066 test_mkdir $DIR/$tdir
1067 rename_many -s random -v -n 10 $DIR/$tdir
1069 run_test 24o "rename of files during htree split"
1072 test_mkdir $DIR/R12a
1073 test_mkdir $DIR/R12b
1074 DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
1075 mrename $DIR/R12a $DIR/R12b
1076 $CHECKSTAT -a $DIR/R12a || error "$DIR/R12a exists"
1077 $CHECKSTAT -t dir $DIR/R12b || error "$DIR/R12b not dir type"
1078 DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
1079 [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
1081 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
1083 cleanup_multiop_pause() {
1085 kill -USR1 $MULTIPID
1089 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1091 test_mkdir $DIR/R13a
1092 test_mkdir $DIR/R13b
1093 local DIRINO=$(ls -lid $DIR/R13a | awk '{ print $1 }')
1094 multiop_bg_pause $DIR/R13b D_c || error "multiop failed to start"
1097 trap cleanup_multiop_pause EXIT
1098 mrename $DIR/R13a $DIR/R13b
1099 $CHECKSTAT -a $DIR/R13a || error "R13a still exists"
1100 $CHECKSTAT -t dir $DIR/R13b || error "R13b does not exist"
1101 local DIRINO2=$(ls -lid $DIR/R13b | awk '{ print $1 }')
1102 [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
1103 cleanup_multiop_pause
1104 wait $MULTIPID || error "multiop close failed"
1106 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
1108 test_24r() { #bug 3789
1109 test_mkdir $DIR/R14a
1110 test_mkdir $DIR/R14a/b
1111 mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
1112 $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
1113 $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
1115 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
1118 test_mkdir $DIR/R15a
1119 test_mkdir $DIR/R15a/b
1120 test_mkdir $DIR/R15a/b/c
1121 mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
1122 $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
1123 $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
1125 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
1127 test_mkdir $DIR/R16a
1128 test_mkdir $DIR/R16a/b
1129 test_mkdir $DIR/R16a/b/c
1130 mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
1131 $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
1132 $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
1134 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
1136 test_24u() { # bug12192
1137 $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error "multiop failed"
1138 $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
1140 run_test 24u "create stripe file"
1142 simple_cleanup_common() {
1145 [ -z "$DIR" -o -z "$tdir" ] && return 0
1147 local start=$SECONDS
1150 wait_delete_completed
1151 echo "cleanup time $((SECONDS - start))"
1155 max_pages_per_rpc() {
1156 local mdtname="$(printf "MDT%04x" ${1:-0})"
1157 $LCTL get_param -n mdc.*$mdtname*.max_pages_per_rpc
1161 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1163 local nrfiles=${COUNT:-100000}
1164 local fname="$DIR/$tdir/$tfile"
1166 # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
1167 [ "$mds1_FSTYPE" = "zfs" ] && nrfiles=${COUNT:-10000}
1169 test_mkdir "$(dirname $fname)"
1170 # assume MDT0000 has the fewest inodes
1171 local stripes=$($LFS getdirstripe -c $(dirname $fname))
1172 local free_inodes=$(($(mdt_free_inodes 0) * stripes))
1173 [[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
1175 trap simple_cleanup_common EXIT
1177 createmany -m "$fname" $nrfiles
1179 cancel_lru_locks mdc
1180 lctl set_param mdc.*.stats clear
1182 # was previously test_24D: LU-6101
1183 # readdir() returns correct number of entries after cursor reload
1184 local num_ls=$(ls $DIR/$tdir | wc -l)
1185 local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l)
1186 local num_all=$(ls -a $DIR/$tdir | wc -l)
1187 if [ $num_ls -ne $nrfiles -o $num_uniq -ne $nrfiles -o \
1188 $num_all -ne $((nrfiles + 2)) ]; then
1189 error "Expected $nrfiles files, got $num_ls " \
1190 "($num_uniq unique $num_all .&..)"
1192 # LU-5 large readdir
1193 # dirent_size = 32 bytes for sizeof(struct lu_dirent) +
1194 # N bytes for name (len($nrfiles) rounded to 8 bytes) +
1195 # 8 bytes for luda_type (4 bytes rounded to 8 bytes)
1196 # take into account of overhead in lu_dirpage header and end mark in
1197 # each page, plus one in rpc_num calculation.
1198 local dirent_size=$((32 + (${#tfile} | 7) + 1 + 8))
1199 local page_entries=$(((PAGE_SIZE - 24) / dirent_size))
1200 local mdt_idx=$($LFS getdirstripe -i $(dirname $fname))
1201 local rpc_pages=$(max_pages_per_rpc $mdt_idx)
1202 local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
1203 local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
1204 echo "readpages: $mds_readpage rpc_max: $rpc_max"
1205 (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
1206 error "large readdir doesn't take effect: " \
1207 "$mds_readpage should be about $rpc_max"
1209 simple_cleanup_common
1211 run_test 24v "list large directory (test hash collision, b=17560)"
1213 test_24w() { # bug21506
1215 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
1216 dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
1217 dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
1218 SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
1219 [[ "$SZ1" -eq "$SZ2" ]] ||
1220 error "Error reading at the end of the file $tfile"
1222 run_test 24w "Reading a file larger than 4Gb"
1225 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1226 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1227 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1228 skip "Need MDS version at least 2.7.56"
1231 local remote_dir=$DIR/$tdir/remote_dir
1233 test_mkdir $DIR/$tdir
1234 $LFS mkdir -i $MDTIDX $remote_dir ||
1235 error "create remote directory failed"
1237 test_mkdir $DIR/$tdir/src_dir
1238 touch $DIR/$tdir/src_file
1239 test_mkdir $remote_dir/tgt_dir
1240 touch $remote_dir/tgt_file
1242 mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
1243 error "rename dir cross MDT failed!"
1245 mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
1246 error "rename file cross MDT failed!"
1248 touch $DIR/$tdir/ln_file
1249 ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
1250 error "ln file cross MDT failed"
1252 rm -rf $DIR/$tdir || error "Can not delete directories"
1254 run_test 24x "cross MDT rename/link"
1257 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1258 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1260 local remote_dir=$DIR/$tdir/remote_dir
1263 test_mkdir $DIR/$tdir
1264 $LFS mkdir -i $mdtidx $remote_dir ||
1265 error "create remote directory failed"
1267 test_mkdir $remote_dir/src_dir
1268 touch $remote_dir/src_file
1269 test_mkdir $remote_dir/tgt_dir
1270 touch $remote_dir/tgt_file
1272 mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
1273 error "rename subdir in the same remote dir failed!"
1275 mrename $remote_dir/src_file $remote_dir/tgt_file ||
1276 error "rename files in the same remote dir failed!"
1278 ln $remote_dir/tgt_file $remote_dir/tgt_file1 ||
1279 error "link files in the same remote dir failed!"
1281 rm -rf $DIR/$tdir || error "Can not delete directories"
1283 run_test 24y "rename/link on the same dir should succeed"
1286 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1287 [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] &&
1288 skip "Need MDS version at least 2.12.51"
1292 for index in 0 1; do
1293 $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed"
1294 touch $DIR/$tdir.0/$tfile.$index || error "touch failed"
1297 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed"
1299 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0)
1300 [ $index -eq 0 ] || error "$tfile.0 is on MDT$index"
1302 local mdts=$(comma_list $(mdts_nodes))
1304 do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0
1305 stack_trap "do_nodes $mdts $LCTL \
1306 set_param mdt.*.enable_remote_rename=1" EXIT
1308 mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed"
1310 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1)
1311 [ $index -eq 1 ] || error "$tfile.1 is on MDT$index"
1313 run_test 24z "cross-MDT rename is done as cp"
1315 test_24A() { # LU-3182
1319 test_mkdir $DIR/$tdir
1320 trap simple_cleanup_common EXIT
1321 createmany -m $DIR/$tdir/$tfile $NFILES
1322 local t=$(ls $DIR/$tdir | wc -l)
1323 local u=$(ls $DIR/$tdir | sort -u | wc -l)
1324 local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
1325 if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then
1326 error "Expected $NFILES files, got $t ($u unique $v .&..)"
1329 simple_cleanup_common || error "Can not delete directories"
1331 run_test 24A "readdir() returns correct number of entries."
1333 test_24B() { # LU-4805
1334 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1338 test_mkdir $DIR/$tdir
1339 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
1340 error "create striped dir failed"
1342 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1343 [ $count -eq 2 ] || error "Expected 2, got $count"
1345 touch $DIR/$tdir/striped_dir/a
1347 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1348 [ $count -eq 3 ] || error "Expected 3, got $count"
1350 touch $DIR/$tdir/striped_dir/.f
1352 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1353 [ $count -eq 4 ] || error "Expected 4, got $count"
1355 rm -rf $DIR/$tdir || error "Can not delete directories"
1357 run_test 24B "readdir for striped dir return correct number of entries"
1360 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1366 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
1367 error "create striped dir failed"
1369 cd $DIR/$tdir/d0/striped_dir
1371 local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
1372 local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
1373 local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1375 [ "$d0_ino" = "$parent_ino" ] ||
1376 error ".. wrong, expect $d0_ino, get $parent_ino"
1378 mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
1379 error "mv striped dir failed"
1381 parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1383 [ "$d1_ino" = "$parent_ino" ] ||
1384 error ".. wrong after mv, expect $d1_ino, get $parent_ino"
1386 run_test 24C "check .. in striped dir"
1389 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
1390 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1393 mkdir $DIR/$tdir/src_dir
1394 $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
1395 error "create remote source failed"
1397 touch $DIR/$tdir/src_dir/src_child/a
1399 $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
1400 error "create remote target dir failed"
1402 $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
1403 error "create remote target child failed"
1405 mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
1406 error "rename dir cross MDT failed!"
1410 $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
1411 error "src_child still exists after rename"
1413 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
1414 error "missing file(a) after rename"
1416 rm -rf $DIR/$tdir || error "Can not delete directories"
1418 run_test 24E "cross MDT rename/link"
1421 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
1424 [ "$SLOW" = "no" ] && repeats=100
1428 echo "$repeats repeats"
1429 for ((i = 0; i < repeats; i++)); do
1430 $LFS mkdir -i0 -c2 $DIR/$tdir/test || error "mkdir fails"
1431 touch $DIR/$tdir/test/a || error "touch fails"
1432 mkdir $DIR/$tdir/test/b || error "mkdir fails"
1433 rm -rf $DIR/$tdir/test || error "rmdir fails"
1438 run_test 24F "hash order vs readdir (LU-11330)"
1441 echo '== symlink sanity ============================================='
1445 touch $DIR/s25/foo ||
1446 error "File creation in symlinked directory failed"
1448 run_test 25a "create file in symlinked directory ==============="
1451 [ ! -d $DIR/d25 ] && test_25a
1452 $CHECKSTAT -t file $DIR/s25/foo || error "$DIR/s25/foo not file type"
1454 run_test 25b "lookup file in symlinked directory ==============="
1458 test_mkdir $DIR/d26/d26-2
1459 ln -s d26/d26-2 $DIR/s26
1460 touch $DIR/s26/foo || error "File creation failed"
1462 run_test 26a "multiple component symlink ======================="
1465 test_mkdir -p $DIR/$tdir/d26-2
1466 ln -s $tdir/d26-2/foo $DIR/s26-2
1467 touch $DIR/s26-2 || error "File creation failed"
1469 run_test 26b "multiple component symlink at end of lookup ======"
1472 test_mkdir $DIR/d26.2
1473 touch $DIR/d26.2/foo
1474 ln -s d26.2 $DIR/s26.2-1
1475 ln -s s26.2-1 $DIR/s26.2-2
1476 ln -s s26.2-2 $DIR/s26.2-3
1477 chmod 0666 $DIR/s26.2-3/foo
1479 run_test 26c "chain of symlinks"
1481 # recursive symlinks (bug 439)
1483 ln -s d26-3/foo $DIR/d26-3
1485 run_test 26d "create multiple component recursive symlink"
1488 [ ! -h $DIR/d26-3 ] && test_26d
1491 run_test 26e "unlink multiple component recursive symlink"
1493 # recursive symlinks (bug 7022)
1495 test_mkdir $DIR/$tdir
1496 test_mkdir $DIR/$tdir/$tfile
1497 cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed"
1498 test_mkdir -p lndir/bar1
1499 test_mkdir $DIR/$tdir/$tfile/$tfile
1500 cd $tfile || error "cd $tfile failed"
1501 ln -s .. dotdot || error "ln dotdot failed"
1502 ln -s dotdot/lndir lndir || error "ln lndir failed"
1503 cd $DIR/$tdir || error "cd $DIR/$tdir failed"
1504 output=`ls $tfile/$tfile/lndir/bar1`
1505 [ "$output" = bar1 ] && error "unexpected output"
1506 rm -r $tfile || error "rm $tfile failed"
1507 $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
1509 run_test 26f "rm -r of a directory which has recursive symlink"
1512 test_mkdir $DIR/$tdir
1513 $LFS getstripe $DIR/$tdir
1514 $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed"
1515 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1516 cp /etc/hosts $DIR/$tdir/$tfile || error "Can't copy to one stripe file"
1518 run_test 27a "one stripe file"
1521 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1523 test_mkdir $DIR/$tdir
1524 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1525 $LFS getstripe -c $DIR/$tdir/$tfile
1526 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
1527 error "two-stripe file doesn't have two stripes"
1529 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1531 run_test 27b "create and write to two stripe file"
1534 test_mkdir $DIR/$tdir
1535 $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
1536 error "setstripe failed"
1537 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1538 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1540 run_test 27d "create file with default settings"
1543 # LU-5839 adds check for existed layout before setting it
1544 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1545 skip "Need MDS version at least 2.7.56"
1547 test_mkdir $DIR/$tdir
1548 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1549 $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice"
1550 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1552 run_test 27e "setstripe existing file (should return error)"
1555 test_mkdir $DIR/$tdir
1556 $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
1557 error "$SETSTRIPE $DIR/$tdir/$tfile failed"
1558 $CHECKSTAT -t file $DIR/$tdir/$tfile &&
1559 error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
1560 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1561 $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed"
1563 run_test 27f "setstripe with bad stripe size (should return error)"
1566 test_mkdir $DIR/$tdir
1567 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1568 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" ||
1569 error "$DIR/$tdir/$tfile has object"
1571 run_test 27g "$LFS getstripe with no objects"
1574 test_mkdir $DIR/$tdir
1575 touch $DIR/$tdir/$tfile || error "touch failed"
1576 ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed"
1577 $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2
1579 (( rc == 2 )) || error "getstripe did not return ENOENT"
1581 run_test 27ga "$LFS getstripe with missing file (should return error)"
1584 test_mkdir $DIR/$tdir
1585 touch $DIR/$tdir/$tfile || error "touch failed"
1586 [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] ||
1587 error "missing objects"
1589 run_test 27i "$LFS getstripe with some objects"
1592 test_mkdir $DIR/$tdir
1593 $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile &&
1594 error "setstripe failed" || true
1596 run_test 27j "setstripe with bad stripe offset (should return error)"
1598 test_27k() { # bug 2844
1599 test_mkdir $DIR/$tdir
1600 local file=$DIR/$tdir/$tfile
1601 local ll_max_blksize=$((4 * 1024 * 1024))
1602 $LFS setstripe -S 67108864 $file || error "setstripe failed"
1603 local blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1604 [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize"
1605 dd if=/dev/zero of=$file bs=4k count=1
1606 blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1607 [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize"
1609 run_test 27k "limit i_blksize for broken user apps"
1612 mcreate $DIR/$tfile || error "creating file"
1613 $RUNAS $LFS setstripe -c 1 $DIR/$tfile &&
1614 error "setstripe should have failed" || true
1616 run_test 27l "check setstripe permissions (should return error)"
1619 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1621 ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
1623 if [[ $ORIGFREE -gt $MAXFREE ]]; then
1624 skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
1626 trap simple_cleanup_common EXIT
1627 test_mkdir $DIR/$tdir
1628 $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
1629 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
1630 error "dd should fill OST0"
1632 while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do
1634 [ $i -gt 256 ] && break
1637 touch $DIR/$tdir/$tfile.$i
1638 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1639 awk '{print $1}'| grep -w "0") ] &&
1640 error "OST0 was full but new created file still use it"
1642 touch $DIR/$tdir/$tfile.$i
1643 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1644 awk '{print $1}'| grep -w "0") ] &&
1645 error "OST0 was full but new created file still use it"
1646 simple_cleanup_common
1648 run_test 27m "create file while OST0 was full"
1651 local delay=$(do_facet $SINGLEMDS lctl get_param -n lo[vd].*.qos_maxage |
1652 awk '{ print $1 * 2; exit; }')
1656 # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage)
1657 # if the OST isn't full anymore.
1659 local OSTIDX=${1:-""}
1661 local list=$(comma_list $(osts_nodes))
1662 [ "$OSTIDX" ] && list=$(facet_host ost$((OSTIDX + 1)))
1664 do_nodes $list lctl set_param fail_loc=0
1665 sync # initiate all OST_DESTROYs from MDS to OST
1669 exhaust_precreations() {
1672 local FAILIDX=${3:-$OSTIDX}
1673 local ofacet=ost$((OSTIDX + 1))
1675 test_mkdir -p -c1 $DIR/$tdir
1676 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
1677 local mfacet=mds$((mdtidx + 1))
1678 echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
1680 local OST=$(ostname_from_index $OSTIDX)
1683 local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST)
1684 local last_id=$(do_facet $mfacet lctl get_param -n \
1685 osp.$mdtosc_proc1.prealloc_last_id)
1686 local next_id=$(do_facet $mfacet lctl get_param -n \
1687 osp.$mdtosc_proc1.prealloc_next_id)
1689 local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet)
1690 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1692 test_mkdir -p $DIR/$tdir/${OST}
1693 $SETSTRIPE -i $OSTIDX -c 1 $DIR/$tdir/${OST}
1694 #define OBD_FAIL_OST_ENOSPC 0x215
1695 do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215
1696 echo "Creating to objid $last_id on ost $OST..."
1697 createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
1698 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1699 do_facet $ofacet lctl set_param fail_loc=$FAILLOC
1703 exhaust_all_precreations() {
1705 for (( i=0; i < OSTCOUNT; i++ )) ; do
1706 exhaust_precreations $i $1 -1
1711 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1712 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1713 remote_mds_nodsh && skip "remote MDS with nodsh"
1714 remote_ost_nodsh && skip "remote OST with nodsh"
1717 rm -f $DIR/$tdir/$tfile
1718 exhaust_precreations 0 0x80000215
1719 $LFS setstripe -c -1 $DIR/$tdir || error "setstripe failed"
1720 touch $DIR/$tdir/$tfile || error "touch failed"
1721 $LFS getstripe $DIR/$tdir/$tfile
1724 run_test 27n "create file with some full OSTs"
1727 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1728 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1729 remote_mds_nodsh && skip "remote MDS with nodsh"
1730 remote_ost_nodsh && skip "remote OST with nodsh"
1733 rm -f $DIR/$tdir/$tfile
1734 exhaust_all_precreations 0x215
1736 touch $DIR/$tdir/$tfile && error "able to create $DIR/$tdir/$tfile"
1741 run_test 27o "create file with all full OSTs (should error)"
1744 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1745 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1746 remote_mds_nodsh && skip "remote MDS with nodsh"
1747 remote_ost_nodsh && skip "remote OST with nodsh"
1750 rm -f $DIR/$tdir/$tfile
1751 test_mkdir $DIR/$tdir
1753 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1754 $TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed"
1755 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1757 exhaust_precreations 0 0x80000215
1758 echo foo >> $DIR/$tdir/$tfile || error "append failed"
1759 $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed"
1760 $LFS getstripe $DIR/$tdir/$tfile
1764 run_test 27p "append to a truncated file with some full OSTs"
1767 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1768 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1769 remote_mds_nodsh && skip "remote MDS with nodsh"
1770 remote_ost_nodsh && skip "remote OST with nodsh"
1773 rm -f $DIR/$tdir/$tfile
1775 test_mkdir $DIR/$tdir
1776 $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
1777 $TRUNCATE $DIR/$tdir/$tfile 80000000 ||
1778 error "truncate $DIR/$tdir/$tfile failed"
1779 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1781 exhaust_all_precreations 0x215
1783 echo foo >> $DIR/$tdir/$tfile && error "append succeeded"
1784 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat 2 failed"
1788 run_test 27q "append to truncated file with all OSTs full (should error)"
1791 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1792 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1793 remote_mds_nodsh && skip "remote MDS with nodsh"
1794 remote_ost_nodsh && skip "remote OST with nodsh"
1797 rm -f $DIR/$tdir/$tfile
1798 exhaust_precreations 0 0x80000215
1800 $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1804 run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
1806 test_27s() { # bug 10725
1807 test_mkdir $DIR/$tdir
1808 local stripe_size=$((4096 * 1024 * 1024)) # 2^32
1809 local stripe_count=0
1810 [ $OSTCOUNT -eq 1 ] || stripe_count=2
1811 $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir &&
1812 error "stripe width >= 2^32 succeeded" || true
1815 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
1817 test_27t() { # bug 10864
1822 $WLFS getstripe $tfile
1825 run_test 27t "check that utils parse path correctly"
1827 test_27u() { # bug 4900
1828 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1829 remote_mds_nodsh && skip "remote MDS with nodsh"
1832 local list=$(comma_list $(mdts_nodes))
1834 #define OBD_FAIL_MDS_OSC_PRECREATE 0x139
1835 do_nodes $list $LCTL set_param fail_loc=0x139
1836 test_mkdir -p $DIR/$tdir
1837 trap simple_cleanup_common EXIT
1838 createmany -o $DIR/$tdir/t- 1000
1839 do_nodes $list $LCTL set_param fail_loc=0
1841 TLOG=$TMP/$tfile.getstripe
1842 $LFS getstripe $DIR/$tdir > $TLOG
1843 OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
1844 unlinkmany $DIR/$tdir/t- 1000
1846 [[ $OBJS -gt 0 ]] &&
1847 error "$OBJS objects created on OST-0. See $TLOG" ||
1850 run_test 27u "skip object creation on OSC w/o objects"
1852 test_27v() { # bug 4900
1853 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1854 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1855 remote_mds_nodsh && skip "remote MDS with nodsh"
1856 remote_ost_nodsh && skip "remote OST with nodsh"
1858 exhaust_all_precreations 0x215
1861 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1863 touch $DIR/$tdir/$tfile
1864 #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
1866 for (( i=1; i < OSTCOUNT; i++ )); do
1867 do_facet ost$i lctl set_param fail_loc=0x705
1869 local START=`date +%s`
1870 createmany -o $DIR/$tdir/$tfile 32
1872 local FINISH=`date +%s`
1873 local TIMEOUT=`lctl get_param -n timeout`
1874 local PROCESS=$((FINISH - START))
1875 [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
1876 error "$FINISH - $START >= $TIMEOUT / 2"
1877 sleep $((TIMEOUT / 2 - PROCESS))
1880 run_test 27v "skip object creation on slow OST"
1882 test_27w() { # bug 10997
1883 test_mkdir $DIR/$tdir
1884 $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
1885 [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
1886 error "stripe size $size != 65536" || true
1887 [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
1888 error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
1890 run_test 27w "check $LFS setstripe -S and getstrip -d options"
1893 [[ $OSTCOUNT -lt 2 ]] &&
1894 skip_env "skipping multiple stripe count/offset test"
1896 test_mkdir $DIR/$tdir
1897 for i in $(seq 1 $OSTCOUNT); do
1899 $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i ||
1900 error "setstripe -c $i -i $offset failed"
1901 count=$($LFS getstripe -c $DIR/$tdir/f$i)
1902 index=$($LFS getstripe -i $DIR/$tdir/f$i)
1903 [ $count -ne $i ] && error "stripe count $count != $i" || true
1904 [ $index -ne $offset ] &&
1905 error "stripe offset $index != $offset" || true
1908 run_test 27wa "check $LFS setstripe -c -i options"
1911 remote_ost_nodsh && skip "remote OST with nodsh"
1912 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1913 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1915 OFFSET=$(($OSTCOUNT - 1))
1917 local OST=$(ostname_from_index $OSTIDX)
1919 test_mkdir $DIR/$tdir
1920 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file
1921 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1
1923 createmany -o $DIR/$tdir/$tfile $OSTCOUNT
1924 for i in $(seq 0 $OFFSET); do
1925 [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx |
1926 awk '{print $1}' | grep -w "$OSTIDX") ] &&
1927 error "OST0 was degraded but new created file still use it"
1929 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0
1931 run_test 27x "create files while OST0 is degraded"
1934 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1935 remote_mds_nodsh && skip "remote MDS with nodsh"
1936 remote_ost_nodsh && skip "remote OST with nodsh"
1937 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1939 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
1940 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
1941 osp.$mdtosc.prealloc_last_id)
1942 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
1943 osp.$mdtosc.prealloc_next_id)
1944 local fcount=$((last_id - next_id))
1945 [[ $fcount -eq 0 ]] && skip "not enough space on OST0"
1946 [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
1948 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
1949 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
1950 local OST_DEACTIVE_IDX=-1
1955 for OSC in $MDS_OSCS; do
1956 OST=$(osc_to_ost $OSC)
1957 OSTIDX=$(index_from_ostuuid $OST)
1958 if [ $OST_DEACTIVE_IDX == -1 ]; then
1959 OST_DEACTIVE_IDX=$OSTIDX
1961 if [ $OSTIDX != $OST_DEACTIVE_IDX ]; then
1962 echo $OSC "is Deactivated:"
1963 do_facet $SINGLEMDS lctl --device %$OSC deactivate
1967 OSTIDX=$(index_from_ostuuid $OST)
1968 test_mkdir $DIR/$tdir
1969 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1971 for OSC in $MDS_OSCS; do
1972 OST=$(osc_to_ost $OSC)
1973 OSTIDX=$(index_from_ostuuid $OST)
1974 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
1975 echo $OST "is degraded:"
1976 do_facet ost$((OSTIDX+1)) lctl set_param -n \
1977 obdfilter.$OST.degraded=1
1982 createmany -o $DIR/$tdir/$tfile $fcount
1984 for OSC in $MDS_OSCS; do
1985 OST=$(osc_to_ost $OSC)
1986 OSTIDX=$(index_from_ostuuid $OST)
1987 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
1988 echo $OST "is recovered from degraded:"
1989 do_facet ost$((OSTIDX+1)) lctl set_param -n \
1990 obdfilter.$OST.degraded=0
1992 do_facet $SINGLEMDS lctl --device %$OSC activate
1996 # all osp devices get activated, hence -1 stripe count restored
1997 local stripe_count=0
1999 # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp
2000 # devices get activated.
2002 $LFS setstripe -c -1 $DIR/$tfile
2003 stripe_count=$($LFS getstripe -c $DIR/$tfile)
2005 [ $stripe_count -ne $OSTCOUNT ] &&
2006 error "Of $OSTCOUNT OSTs, only $stripe_count is available"
2009 run_test 27y "create files while OST0 is degraded and the rest inactive"
2015 lmm_count=$($GETSTRIPE -c $1)
2016 lmm_seq=$($GETSTRIPE -v $1 | awk '/lmm_seq/ { print $2 }')
2017 lmm_oid=$($GETSTRIPE -v $1 | awk '/lmm_object_id/ { print $2 }')
2019 local old_ifs="$IFS"
2021 fid=($($LFS path2fid $1))
2024 log "FID seq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}"
2025 log "LOV seq $lmm_seq, oid $lmm_oid, count: $lmm_count"
2027 # compare lmm_seq and lu_fid->f_seq
2028 [ $lmm_seq = ${fid[1]} ] || { error "SEQ mismatch"; return 1; }
2029 # compare lmm_object_id and lu_fid->oid
2030 [ $lmm_oid = ${fid[2]} ] || { error "OID mismatch"; return 2; }
2032 # check the trusted.fid attribute of the OST objects of the file
2033 local have_obdidx=false
2035 $GETSTRIPE $1 | while read obdidx oid hex seq; do
2036 # skip lines up to and including "obdidx"
2037 [ -z "$obdidx" ] && break
2038 [ "$obdidx" = "obdidx" ] && have_obdidx=true && continue
2039 $have_obdidx || continue
2041 local ost=$((obdidx + 1))
2042 local dev=$(ostdevname $ost)
2045 log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
2047 seq=$(echo $seq | sed -e "s/^0x//g")
2048 if [ $seq == 0 ] || [ $(facet_fstype ost$ost) == zfs ]; then
2049 oid_hex=$(echo $oid)
2051 oid_hex=$(echo $hex | sed -e "s/^0x//g")
2053 local obj_file="O/$seq/d$((oid %32))/$oid_hex"
2057 # Don't unmount/remount the OSTs if we don't need to do that.
2058 # LU-2577 changes filter_fid to be smaller, so debugfs needs
2059 # update too, until that use mount/ll_decode_filter_fid/mount.
2060 # Re-enable when debugfs will understand new filter_fid.
2062 if [ $(facet_fstype ost$ost) == ldiskfs ]; then
2063 ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
2064 $dev 2>/dev/null" | grep "parent=")
2066 if [ -z "$ff" ]; then
2068 mount_fstype ost$ost
2069 ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
2070 $(facet_mntpt ost$ost)/$obj_file)
2071 unmount_fstype ost$ost
2072 start ost$ost $dev $OST_MOUNT_OPTS
2076 [ -z "$ff" ] && error "$obj_file: no filter_fid info"
2078 echo "$ff" | sed -e 's#.*objid=#got: objid=#'
2080 # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
2081 # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
2083 # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \
2084 # stripe_size=1048576 component_id=1 component_start=0 \
2085 # component_end=33554432
2086 local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff)
2087 local ff_pseq=$(cut -d: -f1 <<<$ff_parent)
2088 local ff_poid=$(cut -d: -f2 <<<$ff_parent)
2090 if grep -q 'stripe=' <<<$ff; then
2091 ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff)
2093 # $LL_DECODE_FILTER_FID does not print "stripe="; look
2094 # into f_ver in this case. See comment on ff_parent.
2095 ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//')
2098 # compare lmm_seq and filter_fid->ff_parent.f_seq
2099 [ $ff_pseq = $lmm_seq ] ||
2100 error "FF parent SEQ $ff_pseq != $lmm_seq"
2101 # compare lmm_object_id and filter_fid->ff_parent.f_oid
2102 [ $ff_poid = $lmm_oid ] ||
2103 error "FF parent OID $ff_poid != $lmm_oid"
2104 (($ff_pstripe == $stripe_nr)) ||
2105 error "FF stripe $ff_pstripe != $stripe_nr"
2107 stripe_nr=$((stripe_nr + 1))
2108 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2110 if grep -q 'stripe_count=' <<<$ff; then
2111 local ff_scnt=$(sed -e 's/.*stripe_count=//' \
2112 -e 's/ .*//' <<<$ff)
2113 [ $lmm_count = $ff_scnt ] ||
2114 error "FF stripe count $lmm_count != $ff_scnt"
2120 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2121 remote_ost_nodsh && skip "remote OST with nodsh"
2123 test_mkdir $DIR/$tdir
2124 $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
2125 { error "setstripe -c -1 failed"; return 1; }
2126 # We need to send a write to every object to get parent FID info set.
2127 # This _should_ also work for setattr, but does not currently.
2128 # touch $DIR/$tdir/$tfile-1 ||
2129 dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
2130 { error "dd $tfile-1 failed"; return 2; }
2131 $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
2132 { error "setstripe -c -1 failed"; return 3; }
2133 dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
2134 { error "dd $tfile-2 failed"; return 4; }
2136 # make sure write RPCs have been sent to OSTs
2139 check_seq_oid $DIR/$tdir/$tfile-1 || return 5
2140 check_seq_oid $DIR/$tdir/$tfile-2 || return 6
2142 run_test 27z "check SEQ/OID on the MDT and OST filesystems"
2144 test_27A() { # b=19102
2145 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2147 save_layout_restore_at_exit $MOUNT
2148 $LFS setstripe -c 0 -i -1 -S 0 $MOUNT
2149 wait_update $HOSTNAME "$GETSTRIPE -c $MOUNT | sed 's/ *//g'" "1" 20 ||
2150 error "stripe count $($GETSTRIPE -c $MOUNT) != 1"
2151 local default_size=$($GETSTRIPE -S $MOUNT)
2152 local default_offset=$($GETSTRIPE -i $MOUNT)
2153 local dsize=$(do_facet $SINGLEMDS \
2154 "$LCTL get_param -n lod.$(facet_svc $SINGLEMDS)*.stripesize")
2155 [ $default_size -eq $dsize ] ||
2156 error "stripe size $default_size != $dsize"
2157 [ $default_offset -eq -1 ] ||
2158 error "stripe offset $default_offset != -1"
2160 run_test 27A "check filesystem-wide default LOV EA values"
2162 test_27B() { # LU-2523
2163 test_mkdir $DIR/$tdir
2164 rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
2166 # open f1 with O_LOV_DELAY_CREATE
2168 # call setstripe ioctl on open file descriptor for f1
2170 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:nB1c \
2174 # open f1 with O_LOV_DELAY_CREATE
2176 # call setstripe ioctl on open file descriptor for f1
2178 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:uB1c
2180 # Allow multiop to fail in imitation of NFS's busted semantics.
2183 run_test 27B "call setstripe on open unlinked file/rename victim"
2185 test_27C() { #LU-2871
2186 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2194 test_mkdir $DIR/$tdir
2196 for i in $(seq 0 $((OSTCOUNT - 1))); do
2197 # set stripe across all OSTs starting from OST$i
2198 $SETSTRIPE -i $i -c -1 $tfile$i
2199 # get striping information
2200 ost_idx=($($GETSTRIPE $tfile$i |
2201 tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
2205 [ ${#ost_idx[@]} -eq $OSTCOUNT ] ||
2206 error "${#ost_idx[@]} != $OSTCOUNT"
2208 for index in $(seq 0 $((OSTCOUNT - 1))); do
2210 for j in $(echo ${ost_idx[@]}); do
2211 if [ $index -eq $j ]; then
2217 error "Can not find $index in ${ost_idx[@]}"
2221 run_test 27C "check full striping across all OSTs"
2224 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2225 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2226 remote_mds_nodsh && skip "remote MDS with nodsh"
2228 local POOL=${POOL:-testpool}
2230 local last_ost=$(($OSTCOUNT - 1))
2232 local ost_list=$(seq $first_ost $ost_step $last_ost)
2233 local ost_range="$first_ost $last_ost $ost_step"
2235 test_mkdir $DIR/$tdir
2236 pool_add $POOL || error "pool_add failed"
2237 pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
2240 [ $MDS1_VERSION -lt $(version_code 2.8.55) ] &&
2242 [ $MDS1_VERSION -lt $(version_code 2.9.55) -o \
2243 $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2244 skip27D+=" -s 30,31"
2245 llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
2246 error "llapi_layout_test failed"
2248 destroy_test_pools || error "destroy test pools failed"
2250 run_test 27D "validate llapi_layout API"
2252 # Verify that default_easize is increased from its initial value after
2253 # accessing a widely striped file.
2255 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2256 [ $CLIENT_VERSION -lt $(version_code 2.5.57) ] &&
2257 skip "client does not have LU-3338 fix"
2259 # 72 bytes is the minimum space required to store striping
2260 # information for a file striped across one OST:
2261 # (sizeof(struct lov_user_md_v3) +
2262 # sizeof(struct lov_user_ost_data_v1))
2264 $LCTL set_param -n llite.*.default_easize $min_easize ||
2265 error "lctl set_param failed"
2266 local easize=$($LCTL get_param -n llite.*.default_easize)
2268 [ $easize -eq $min_easize ] ||
2269 error "failed to set default_easize"
2271 $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
2272 error "setstripe failed"
2276 easize=$($LCTL get_param -n llite.*.default_easize)
2278 [ $easize -gt $min_easize ] ||
2279 error "default_easize not updated"
2281 run_test 27E "check that default extended attribute size properly increases"
2283 test_27F() { # LU-5346/LU-7975
2284 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2285 [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs"
2286 [[ $MDS1_VERSION -lt $(version_code 2.8.51) ]] &&
2287 skip "Need MDS version at least 2.8.51"
2288 remote_ost_nodsh && skip "remote OST with nodsh"
2290 test_mkdir $DIR/$tdir
2292 $SETSTRIPE -c 2 $DIR/$tdir
2294 # stop all OSTs to reproduce situation for LU-7975 ticket
2295 for num in $(seq $OSTCOUNT); do
2299 # open/create f0 with O_LOV_DELAY_CREATE
2300 # truncate f0 to a non-0 size
2302 multiop $DIR/$tdir/f0 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T1050000c
2304 $CHECKSTAT -s 1050000 $DIR/$tdir/f0 || error "checkstat failed"
2305 # open/write it again to force delayed layout creation
2306 cat /etc/hosts > $DIR/$tdir/f0 &
2310 for num in $(seq $OSTCOUNT); do
2311 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS ||
2312 error "ost$num failed to start"
2315 wait $catpid || error "cat failed"
2317 cmp /etc/hosts $DIR/$tdir/f0 || error "cmp failed"
2318 [[ $($GETSTRIPE -c $DIR/$tdir/f0) == 2 ]] || error "wrong stripecount"
2321 run_test 27F "Client resend delayed layout creation with non-zero size"
2323 test_27G() { #LU-10629
2324 [ $MDS1_VERSION -lt $(version_code 2.11.51) ] &&
2325 skip "Need MDS version at least 2.11.51"
2326 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2327 remote_mds_nodsh && skip "remote MDS with nodsh"
2328 local POOL=${POOL:-testpool}
2329 local ostrange="0 0 1"
2331 test_mkdir $DIR/$tdir
2332 pool_add $POOL || error "pool_add failed"
2333 pool_add_targets $POOL $ostrange || error "pool_add_targets failed"
2334 $LFS setstripe -p $POOL $DIR/$tdir
2336 local pool=$($LFS getstripe -p $DIR/$tdir)
2338 [ "$pool" = "$POOL" ] || error "Striping failed got '$pool' not '$POOL'"
2340 $LFS setstripe -d $DIR/$tdir
2342 pool=$($LFS getstripe -p $DIR/$tdir)
2346 [ -z "$pool" ] || error "'$pool' is not empty"
2348 run_test 27G "Clear OST pool from stripe"
2351 [[ $MDS1_VERSION -le $(version_code 2.11.54) ]] &&
2352 skip "Need MDS version newer than 2.11.54"
2353 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
2354 test_mkdir $DIR/$tdir
2355 $LFS setstripe -o 0 -o 2 $DIR/$tdir || error "setstripe failed"
2356 touch $DIR/$tdir/$tfile
2357 $LFS getstripe -c $DIR/$tdir/$tfile
2358 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
2359 error "two-stripe file doesn't have two stripes"
2361 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
2362 $LFS getstripe -y $DIR/$tdir/$tfile
2363 (( $($LFS getstripe -y $DIR/$tdir/$tfile |
2364 egrep -c "l_ost_idx: [02]$") == "2" )) ||
2365 error "expected l_ost_idx: [02]$ not matched"
2367 # make sure ost list have been cleared
2368 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
2369 $LFS setstripe -S $((stripesize * 4)) -i 1 \
2370 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
2372 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
2374 run_test 27H "Set specific OSTs stripe"
2376 # createtest also checks that device nodes are created and
2377 # then visible correctly (#2091)
2378 test_28() { # bug 2091
2380 $CREATETEST $DIR/d28/ct || error "createtest failed"
2382 run_test 28 "create/mknod/mkdir with bad file types ============"
2385 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2387 sync; sleep 1; sync # flush out any dirty pages from previous tests
2394 declare -i LOCKCOUNTORIG=0
2395 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2396 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
2398 [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
2400 declare -i LOCKUNUSEDCOUNTORIG=0
2401 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2402 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
2409 declare -i LOCKCOUNTCURRENT=0
2410 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2411 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
2414 declare -i LOCKUNUSEDCOUNTCURRENT=0
2415 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2416 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
2419 if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
2420 $LCTL set_param -n ldlm.dump_namespaces ""
2421 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
2422 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2423 log "dumped log to $TMP/test_29.dk (bug 5793)"
2426 if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
2427 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
2428 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2429 log "dumped log to $TMP/test_29.dk (bug 5793)"
2433 run_test 29 "IT_GETATTR regression ============================"
2435 test_30a() { # was test_30
2436 cp $(which ls) $DIR || cp /bin/ls $DIR
2437 $DIR/ls / || error "Can't execute binary from lustre"
2440 run_test 30a "execute binary from Lustre (execve) =============="
2443 cp `which ls` $DIR || cp /bin/ls $DIR
2445 $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
2448 run_test 30b "execute binary from Lustre as non-root ==========="
2450 test_30c() { # b=22376
2451 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2453 cp `which ls` $DIR || cp /bin/ls $DIR
2455 cancel_lru_locks mdc
2456 cancel_lru_locks osc
2457 $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
2460 run_test 30c "execute binary from Lustre without read perms ===="
2463 $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
2464 $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
2466 run_test 31a "open-unlink file =================================="
2469 touch $DIR/f31 || error "touch $DIR/f31 failed"
2470 ln $DIR/f31 $DIR/f31b || error "ln failed"
2471 $MULTIOP $DIR/f31b Ouc || error "multiop failed"
2472 $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
2474 run_test 31b "unlink file with multiple links while open ======="
2477 touch $DIR/f31 || error "touch $DIR/f31 failed"
2478 ln $DIR/f31 $DIR/f31c || error "ln failed"
2479 multiop_bg_pause $DIR/f31 O_uc ||
2480 error "multiop_bg_pause for $DIR/f31 failed"
2482 $MULTIOP $DIR/f31c Ouc
2483 kill -USR1 $MULTIPID
2486 run_test 31c "open-unlink file with multiple links ============="
2489 opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
2490 $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
2492 run_test 31d "remove of open directory ========================="
2494 test_31e() { # bug 2904
2495 openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
2497 run_test 31e "remove of open non-empty directory ==============="
2499 test_31f() { # bug 4554
2500 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2503 test_mkdir $DIR/d31f
2504 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2505 cp /etc/hosts $DIR/d31f
2507 $GETSTRIPE $DIR/d31f/hosts
2508 multiop_bg_pause $DIR/d31f D_c || return 1
2511 rm -rv $DIR/d31f || error "first of $DIR/d31f"
2512 test_mkdir $DIR/d31f
2513 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2514 cp /etc/hosts $DIR/d31f
2516 $GETSTRIPE $DIR/d31f/hosts
2517 multiop_bg_pause $DIR/d31f D_c || return 1
2520 kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
2521 wait $MULTIPID || error "first opendir $MULTIPID failed"
2525 kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
2526 wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
2529 run_test 31f "remove of open directory with open-unlink file ==="
2532 echo "-- cross directory link --"
2533 test_mkdir -c1 $DIR/${tdir}ga
2534 test_mkdir -c1 $DIR/${tdir}gb
2535 touch $DIR/${tdir}ga/f
2536 ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
2537 $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
2538 [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
2539 $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
2540 [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
2542 run_test 31g "cross directory link==============="
2545 echo "-- cross directory link --"
2546 test_mkdir -c1 $DIR/${tdir}
2547 test_mkdir -c1 $DIR/${tdir}/dir
2548 touch $DIR/${tdir}/f
2549 ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
2550 $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
2551 [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
2552 $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
2553 [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
2555 run_test 31h "cross directory link under child==============="
2558 echo "-- cross directory link --"
2559 test_mkdir -c1 $DIR/$tdir
2560 test_mkdir -c1 $DIR/$tdir/dir
2561 touch $DIR/$tdir/dir/f
2562 ln $DIR/$tdir/dir/f $DIR/$tdir/g
2563 $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
2564 [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
2565 $CHECKSTAT -t file $DIR/$tdir/g || error "target"
2566 [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
2568 run_test 31i "cross directory link under parent==============="
2571 test_mkdir -c1 -p $DIR/$tdir
2572 test_mkdir -c1 -p $DIR/$tdir/dir1
2573 ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
2574 link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
2575 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
2576 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
2579 run_test 31j "link for directory==============="
2582 test_mkdir -c1 -p $DIR/$tdir
2584 touch $DIR/$tdir/exist
2585 mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
2586 mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
2587 mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
2588 mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
2589 mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
2590 mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
2591 mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
2594 run_test 31k "link to file: the same, non-existing, dir==============="
2600 touch $DIR/d31m2/exist
2601 mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
2602 mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
2603 mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
2604 mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
2605 mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
2606 mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
2609 run_test 31m "link to file: the same, non-existing, dir==============="
2612 touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
2613 nlink=$(stat --format=%h $DIR/$tfile)
2614 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2616 local cmd="exec $fd<$DIR/$tfile"
2619 trap "eval $cmd" EXIT
2620 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2621 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2622 rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
2623 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2624 [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
2627 run_test 31n "check link count of unlinked file"
2630 local TEMPNAME=$(mktemp $1_XXXXXX)
2631 mlink $TEMPNAME $1 2> /dev/null &&
2632 echo "$BASHPID: link $TEMPNAME to $1 succeeded"
2636 test_31o() { # LU-2901
2637 test_mkdir $DIR/$tdir
2638 for LOOP in $(seq 100); do
2639 rm -f $DIR/$tdir/$tfile*
2640 for THREAD in $(seq 8); do
2641 link_one $DIR/$tdir/$tfile.$LOOP &
2644 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
2645 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
2646 error "$LINKS duplicate links to $tfile.$LOOP" &&
2650 run_test 31o "duplicate hard links with same filename"
2653 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
2655 test_mkdir $DIR/$tdir
2656 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
2657 $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
2659 opendirunlink $DIR/$tdir/striped_dir/test1 ||
2660 error "open unlink test1 failed"
2661 opendirunlink $DIR/$tdir/striped_dir/test2 ||
2662 error "open unlink test2 failed"
2664 $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
2665 error "test1 still exists"
2666 $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
2667 error "test2 still exists"
2669 run_test 31p "remove of open striped directory"
2671 cleanup_test32_mount() {
2674 local loopdev=$(losetup -a | grep $EXT2_DEV | sed -ne 's/:.*$//p')
2675 $UMOUNT $DIR/$tdir/ext2-mountpoint || rc=$?
2676 losetup -d $loopdev || true
2682 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2684 echo "== more mountpoints and symlinks ================="
2685 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2686 trap cleanup_test32_mount EXIT
2687 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2688 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2689 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2690 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/.. ||
2691 error "$DIR/$tdir/ext2-mountpoint/.. not dir type"
2692 cleanup_test32_mount
2694 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
2697 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2699 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2700 trap cleanup_test32_mount EXIT
2701 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2702 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2703 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2704 ls -al $DIR/$tdir/ext2-mountpoint/.. ||
2705 error "Can't list $DIR/$tdir/ext2-mountpoint/.."
2706 cleanup_test32_mount
2708 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
2711 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2713 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2714 trap cleanup_test32_mount EXIT
2715 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2716 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2717 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2718 test_mkdir -p $DIR/$tdir/d2/test_dir
2719 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2720 error "$DIR/$tdir/ext2-mountpoint/../d2/test_dir not dir type"
2721 cleanup_test32_mount
2723 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
2726 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2728 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2729 trap cleanup_test32_mount EXIT
2730 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2731 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2732 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2733 test_mkdir -p $DIR/$tdir/d2/test_dir
2734 ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2735 error "Can't list $DIR/$tdir/ext2-mountpoint/../d2/test_dir"
2736 cleanup_test32_mount
2738 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
2742 test_mkdir -p $DIR/$tdir/tmp
2743 local tmp_dir=$DIR/$tdir/tmp
2744 ln -s $DIR/$tdir $tmp_dir/symlink11
2745 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2746 $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2747 $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
2749 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
2753 test_mkdir -p $DIR/$tdir/tmp
2754 local tmp_dir=$DIR/$tdir/tmp
2755 ln -s $DIR/$tdir $tmp_dir/symlink11
2756 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2757 ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2758 ls $DIR/$tdir/symlink01 || error "symlink01 bad"
2760 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
2763 local tmp_dir=$DIR/$tdir/tmp
2764 test_mkdir -p $tmp_dir
2765 test_mkdir $DIR/${tdir}2
2766 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2767 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2768 $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
2769 $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
2770 $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
2771 $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
2773 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2776 rm -fr $DIR/$tdir $DIR/${tdir}2
2777 tmp_dir=$DIR/$tdir/tmp
2778 test_mkdir -p $tmp_dir
2779 test_mkdir $DIR/${tdir}2
2780 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2781 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2782 ls $tmp_dir/symlink12 || error "listing symlink12"
2783 ls $DIR/$tdir/symlink02 || error "listing symlink02"
2785 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2788 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2790 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2791 trap cleanup_test32_mount EXIT
2792 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2793 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2794 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2795 touch $DIR/$tdir/test_file
2796 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../test_file ||
2797 error "$DIR/$tdir/ext2-mountpoint/../test_file not file type"
2798 cleanup_test32_mount
2800 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
2803 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2805 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2806 trap cleanup_test32_mount EXIT
2807 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2808 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2809 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2810 touch $DIR/$tdir/test_file
2811 cat $DIR/$tdir/ext2-mountpoint/../test_file ||
2812 error "Can't open $DIR/$tdir/ext2-mountpoint/../test_file"
2813 cleanup_test32_mount
2815 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
2818 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2821 trap cleanup_test32_mount EXIT
2822 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2823 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2824 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2825 test_mkdir -p $DIR/$tdir/d2
2826 touch $DIR/$tdir/d2/test_file || error "touch failed"
2827 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2828 error "$DIR/$tdir/ext2-mountpoint/../d2/test_file not file type"
2829 cleanup_test32_mount
2831 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
2834 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2837 trap cleanup_test32_mount EXIT
2838 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2839 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2840 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2841 test_mkdir -p $DIR/$tdir/d2
2842 touch $DIR/$tdir/d2/test_file || error "touch failed"
2843 cat $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2844 error "Can't open $DIR/$tdir/ext2-mountpoint/../d2/test_file"
2845 cleanup_test32_mount
2847 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
2851 test_mkdir -p $DIR/d32m/tmp
2852 TMP_DIR=$DIR/d32m/tmp
2853 ln -s $DIR $TMP_DIR/symlink11
2854 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
2855 $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 ||
2856 error "symlink11 not a link"
2857 $CHECKSTAT -t link $DIR/d32m/symlink01 ||
2858 error "symlink01 not a link"
2860 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
2864 test_mkdir -p $DIR/d32n/tmp
2865 TMP_DIR=$DIR/d32n/tmp
2866 ln -s $DIR $TMP_DIR/symlink11
2867 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
2868 ls -l $DIR/d32n/tmp/symlink11 || error "listing symlink11"
2869 ls -l $DIR/d32n/symlink01 || error "listing symlink01"
2871 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
2875 test_mkdir -p $DIR/d32o/tmp
2876 TMP_DIR=$DIR/d32o/tmp
2877 ln -s $DIR/$tfile $TMP_DIR/symlink12
2878 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
2879 $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 ||
2880 error "symlink12 not a link"
2881 $CHECKSTAT -t link $DIR/d32o/symlink02 || error "symlink02 not a link"
2882 $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 ||
2883 error "$DIR/d32o/tmp/symlink12 not file type"
2884 $CHECKSTAT -t file -f $DIR/d32o/symlink02 ||
2885 error "$DIR/d32o/symlink02 not file type"
2887 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
2897 test_mkdir -p $DIR/d32p/tmp
2899 TMP_DIR=$DIR/d32p/tmp
2901 ln -s $DIR/$tfile $TMP_DIR/symlink12
2903 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
2905 cat $DIR/d32p/tmp/symlink12 ||
2906 error "Can't open $DIR/d32p/tmp/symlink12"
2908 cat $DIR/d32p/symlink02 || error "Can't open $DIR/d32p/symlink02"
2911 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
2914 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2916 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2917 trap cleanup_test32_mount EXIT
2918 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2919 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
2920 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2921 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2922 ls $DIR/$tdir/ext2-mountpoint | grep "\<under_the_mount\>" && error
2923 cleanup_test32_mount
2925 run_test 32q "stat follows mountpoints in Lustre (should return error)"
2928 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2930 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2931 trap cleanup_test32_mount EXIT
2932 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2933 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
2934 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2935 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2936 ls $DIR/$tdir/ext2-mountpoint | grep -q under_the_mount && error || true
2937 cleanup_test32_mount
2939 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
2944 chmod 444 $DIR/$tfile
2945 chown $RUNAS_ID $DIR/$tfile
2947 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
2950 run_test 33aa "write file with mode 444 (should return error)"
2954 test_mkdir $DIR/$tdir
2955 chown $RUNAS_ID $DIR/$tdir
2956 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
2957 error "$RUNAS create $tdir/$tfile failed"
2958 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
2959 error "open RDWR" || true
2961 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
2965 test_mkdir $DIR/$tdir
2966 chown $RUNAS_ID $DIR/$tdir
2967 $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
2969 run_test 33b "test open file with malformed flags (No panic)"
2972 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2973 remote_ost_nodsh && skip "remote OST with nodsh"
2982 test_mkdir $DIR/$tdir
2983 # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
2986 for ostnum in $(seq $OSTCOUNT); do
2987 # test-framework's OST numbering is one-based, while Lustre's
2989 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
2990 # Parsing llobdstat's output sucks; we could grep the /proc
2991 # path, but that's likely to not be as portable as using the
2992 # llobdstat utility. So we parse lctl output instead.
2993 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
2994 obdfilter/$ostname/stats |
2995 awk '/^write_bytes/ {print $7}' )
2996 echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes"
2997 if (( ${write_bytes:-0} > 0 ))
3004 $all_zeros || return 0
3007 echo foo > $DIR/$tdir/bar
3011 # Total up write_bytes after writing. We'd better find non-zeros.
3012 for ostnum in $(seq $OSTCOUNT); do
3013 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3014 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3015 obdfilter/$ostname/stats |
3016 awk '/^write_bytes/ {print $7}' )
3017 echo "write_bytes@$OSTnum/$ostname=$write_bytes"
3018 if (( ${write_bytes:-0} > 0 ))
3027 for ostnum in $(seq $OSTCOUNT); do
3028 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3029 echo "Check that write_bytes is present in obdfilter/*/stats:"
3030 do_facet ost$ostnum lctl get_param -n \
3031 obdfilter/$ostname/stats
3033 error "OST not keeping write_bytes stats (b22312)"
3036 run_test 33c "test llobdstat and write_bytes"
3039 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3040 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3043 local remote_dir=$DIR/$tdir/remote_dir
3045 test_mkdir $DIR/$tdir
3046 $LFS mkdir -i $MDTIDX $remote_dir ||
3047 error "create remote directory failed"
3049 touch $remote_dir/$tfile
3050 chmod 444 $remote_dir/$tfile
3051 chown $RUNAS_ID $remote_dir/$tfile
3053 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3055 chown $RUNAS_ID $remote_dir
3056 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
3057 error "create" || true
3058 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
3059 error "open RDWR" || true
3060 $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
3062 run_test 33d "openfile with 444 modes and malformed flags under remote dir"
3065 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3069 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3070 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3071 mkdir $DIR/$tdir/local_dir
3073 local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3074 local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3075 local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3077 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3078 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
3080 rmdir $DIR/$tdir/* || error "rmdir failed"
3083 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3084 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3085 mkdir $DIR/$tdir/local_dir
3087 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3088 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3089 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3091 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3092 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
3094 rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
3097 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3098 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3099 mkdir $DIR/$tdir/local_dir
3101 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3102 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3103 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3105 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3106 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
3108 run_test 33e "mkdir and striped directory should have same mode"
3112 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
3116 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3117 remote_mds_nodsh && skip "remote MDS with nodsh"
3120 chmod go+rwx $DIR/$tdir
3121 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
3122 trap cleanup_33f EXIT
3124 $RUNAS lfs mkdir -i 0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
3125 error "cannot create striped directory"
3127 $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
3128 error "cannot create files in striped directory"
3130 $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
3131 error "cannot remove files in striped directory"
3133 $RUNAS rmdir $DIR/$tdir/striped_dir ||
3134 error "cannot remove striped directory"
3138 run_test 33f "nonroot user can create, access, and remove a striped directory"
3141 mkdir -p $DIR/$tdir/dir2
3143 local err=$($RUNAS mkdir $DIR/$tdir/dir2 2>&1)
3145 [[ $err =~ "exists" ]] || error "Not exists error"
3147 run_test 33g "nonroot user create already existing root created file"
3149 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
3152 $MCREATE $DIR/f34 || error "mcreate failed"
3153 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3154 error "getstripe failed"
3155 $TRUNCATE $DIR/f34 $TEST_34_SIZE || error "truncate failed"
3156 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3157 error "getstripe failed"
3158 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3159 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3161 run_test 34a "truncate file that has not been opened ==========="
3164 [ ! -f $DIR/f34 ] && test_34a
3165 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3166 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3167 $OPENFILE -f O_RDONLY $DIR/f34
3168 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3169 error "getstripe failed"
3170 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3171 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3173 run_test 34b "O_RDONLY opening file doesn't create objects ====="
3176 [ ! -f $DIR/f34 ] && test_34a
3177 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3178 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3179 $OPENFILE -f O_RDWR $DIR/f34
3180 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" && error
3181 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3182 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3184 run_test 34c "O_RDWR opening file-with-size works =============="
3187 [ ! -f $DIR/f34 ] && test_34a
3188 dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 ||
3190 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3191 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3194 run_test 34d "write to sparse file ============================="
3198 $MCREATE $DIR/f34e || error "mcreate failed"
3199 $TRUNCATE $DIR/f34e 1000 || error "truncate failed"
3200 $CHECKSTAT -s 1000 $DIR/f34e ||
3201 error "Size of $DIR/f34e not equal to 1000 bytes"
3202 $OPENFILE -f O_RDWR $DIR/f34e
3203 $CHECKSTAT -s 1000 $DIR/f34e ||
3204 error "Size of $DIR/f34e not equal to 1000 bytes"
3206 run_test 34e "create objects, some with size and some without =="
3208 test_34f() { # bug 6242, 6243
3209 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3213 $MCREATE $DIR/f34f || error "mcreate failed"
3214 $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
3215 dd if=$DIR/f34f of=$TMP/f34f
3216 $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
3217 dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
3218 cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
3219 cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
3220 rm $TMP/f34f $TMP/f34fzero $DIR/f34f
3222 run_test 34f "read from a file with no objects until EOF ======="
3225 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3227 dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE ||
3229 $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error "truncate failed"
3230 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3231 error "Size of $DIR/$tfile not equal to $((TEST_34_SIZE / 2))"
3232 cancel_lru_locks osc
3233 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3234 error "wrong size after lock cancel"
3236 $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error "truncate failed"
3237 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3238 error "expanding truncate failed"
3239 cancel_lru_locks osc
3240 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3241 error "wrong expanded size after lock cancel"
3243 run_test 34g "truncate long file ==============================="
3246 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3251 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error "dd failed"
3252 sync # Flush the cache so that multiop below does not block on cache
3253 # flush when getting the group lock
3254 $MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
3257 # Since just timed wait is not good enough, let's do a sync write
3258 # that way we are sure enough time for a roundtrip + processing
3259 # passed + 2 seconds of extra margin.
3260 dd if=/dev/zero of=$DIR/${tfile}-1 bs=$PAGE_SIZE oflag=direct count=1
3264 if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then
3265 error "Multiop blocked on ftruncate, pid=$MULTIPID"
3269 local nsz=`stat -c %s $DIR/$tfile`
3270 [[ $nsz == $sz ]] || error "New size wrong $nsz != $sz"
3272 run_test 34h "ftruncate file under grouplock should not block"
3275 cp /bin/sh $DIR/f35a
3277 chown $RUNAS_ID $DIR/f35a
3278 $RUNAS $DIR/f35a && error || true
3281 run_test 35a "exec file with mode 444 (should return and not leak)"
3285 utime $DIR/f36 || error "utime failed for MDS"
3287 run_test 36a "MDS utime check (mknod, utime)"
3291 utime $DIR/f36 || error "utime failed for OST"
3293 run_test 36b "OST utime check (open, utime)"
3298 chown $RUNAS_ID $DIR/d36
3299 $RUNAS utime $DIR/d36/f36 || error "utime failed for MDS as non-root"
3301 run_test 36c "non-root MDS utime check (mknod, utime)"
3304 [ ! -d $DIR/d36 ] && test_36c
3305 echo "" > $DIR/d36/f36
3306 $RUNAS utime $DIR/d36/f36 || error "utime failed for OST as non-root"
3308 run_test 36d "non-root OST utime check (open, utime)"
3311 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping"
3313 test_mkdir $DIR/$tdir
3314 touch $DIR/$tdir/$tfile
3315 $RUNAS utime $DIR/$tdir/$tfile &&
3316 error "utime worked, expected failure" || true
3318 run_test 36e "utime on non-owned file (should return error)"
3322 local LANG_SAVE=$LANG
3323 local LC_LANG_SAVE=$LC_LANG
3324 export LANG=C LC_LANG=C # for date language
3326 DATESTR="Dec 20 2000"
3327 test_mkdir $DIR/$tdir
3328 lctl set_param fail_loc=$fl
3330 cp /etc/hosts $DIR/$tdir/$tfile
3331 sync & # write RPC generated with "current" inode timestamp, but delayed
3333 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
3334 LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
3335 cancel_lru_locks $OSC
3336 LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object
3338 [ "$LS_BEFORE" != "$LS_AFTER" ] && \
3339 echo "BEFORE: $LS_BEFORE" && \
3340 echo "AFTER : $LS_AFTER" && \
3341 echo "WANT : $DATESTR" && \
3342 error "$DIR/$tdir/$tfile timestamps changed" || true
3344 export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE
3348 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3350 #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
3351 subr_36fh "0x80000214"
3353 run_test 36f "utime on file racing with OST BRW write =========="
3356 remote_ost_nodsh && skip "remote OST with nodsh"
3357 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3358 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
3359 skip "Need MDS version at least 2.12.51"
3364 local tgt="obdfilter"
3366 [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1"
3368 test_mkdir $DIR/$tdir
3369 fmd_max_age=$(do_facet $facet \
3370 "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \
3373 echo "FMD max age: ${fmd_max_age}s"
3374 touch $DIR/$tdir/$tfile
3375 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3376 gawk '{cnt=cnt+$1} END{print cnt}')
3377 echo "FMD before: $fmd"
3379 error "FMD wasn't create by touch"
3380 sleep $((fmd_max_age + 12))
3381 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3382 gawk '{cnt=cnt+$1} END{print cnt}')
3383 echo "FMD after: $fmd"
3385 error "FMD wasn't expired by ping"
3387 run_test 36g "FMD cache expiry ====================="
3390 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3392 #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227
3393 subr_36fh "0x80000227"
3395 run_test 36h "utime on file racing with OST BRW write =========="
3398 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3400 test_mkdir $DIR/$tdir
3401 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
3403 local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
3404 local new_mtime=$((mtime + 200))
3406 #change Modify time of striped dir
3407 touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
3408 error "change mtime failed"
3410 local got=$(stat -c%Y $DIR/$tdir/striped_dir)
3412 [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
3414 run_test 36i "change mtime on striped directory"
3416 # test_37 - duplicate with tests 32q 32r
3419 local file=$DIR/$tfile
3421 openfile -f O_DIRECTORY $file
3424 [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true
3425 [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)"
3427 run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ==="
3429 test_39a() { # was test_39
3431 touch $DIR/${tfile}2
3432 # ls -l $DIR/$tfile $DIR/${tfile}2
3433 # ls -lu $DIR/$tfile $DIR/${tfile}2
3434 # ls -lc $DIR/$tfile $DIR/${tfile}2
3436 $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
3437 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
3439 ls -l --full-time $DIR/$tfile $DIR/${tfile}2
3441 ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
3443 ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
3444 error "O_TRUNC didn't change timestamps"
3447 run_test 39a "mtime changed on create"
3450 test_mkdir -c1 $DIR/$tdir
3451 cp -p /etc/passwd $DIR/$tdir/fopen
3452 cp -p /etc/passwd $DIR/$tdir/flink
3453 cp -p /etc/passwd $DIR/$tdir/funlink
3454 cp -p /etc/passwd $DIR/$tdir/frename
3455 ln $DIR/$tdir/funlink $DIR/$tdir/funlink2
3458 echo "aaaaaa" >> $DIR/$tdir/fopen
3459 echo "aaaaaa" >> $DIR/$tdir/flink
3460 echo "aaaaaa" >> $DIR/$tdir/funlink
3461 echo "aaaaaa" >> $DIR/$tdir/frename
3463 local open_new=`stat -c %Y $DIR/$tdir/fopen`
3464 local link_new=`stat -c %Y $DIR/$tdir/flink`
3465 local unlink_new=`stat -c %Y $DIR/$tdir/funlink`
3466 local rename_new=`stat -c %Y $DIR/$tdir/frename`
3468 cat $DIR/$tdir/fopen > /dev/null
3469 ln $DIR/$tdir/flink $DIR/$tdir/flink2
3470 rm -f $DIR/$tdir/funlink2
3471 mv -f $DIR/$tdir/frename $DIR/$tdir/frename2
3473 for (( i=0; i < 2; i++ )) ; do
3474 local open_new2=`stat -c %Y $DIR/$tdir/fopen`
3475 local link_new2=`stat -c %Y $DIR/$tdir/flink`
3476 local unlink_new2=`stat -c %Y $DIR/$tdir/funlink`
3477 local rename_new2=`stat -c %Y $DIR/$tdir/frename2`
3479 [ $open_new2 -eq $open_new ] || error "open file reverses mtime"
3480 [ $link_new2 -eq $link_new ] || error "link file reverses mtime"
3481 [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime"
3482 [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime"
3484 cancel_lru_locks $OSC
3485 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3488 run_test 39b "mtime change on open, link, unlink, rename ======"
3490 # this should be set to past
3491 TEST_39_MTIME=`date -d "1 year ago" +%s`
3497 local mtime0=`stat -c %Y $DIR1/$tfile`
3499 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3500 local mtime1=`stat -c %Y $DIR1/$tfile`
3501 [ "$mtime1" = $TEST_39_MTIME ] || \
3502 error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME"
3505 echo hello >> $DIR1/$tfile
3507 local mtime2=`stat -c %Y $DIR1/$tfile`
3508 [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \
3509 error "mtime is not updated on write: $d1 <= $mtime2 <= $d2"
3511 mv $DIR1/$tfile $DIR1/$tfile-1
3513 for (( i=0; i < 2; i++ )) ; do
3514 local mtime3=`stat -c %Y $DIR1/$tfile-1`
3515 [ "$mtime2" = "$mtime3" ] || \
3516 error "mtime ($mtime2) changed (to $mtime3) on rename"
3518 cancel_lru_locks $OSC
3519 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3522 run_test 39c "mtime change on rename ==========================="
3526 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3529 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3531 for (( i=0; i < 2; i++ )) ; do
3532 local mtime=`stat -c %Y $DIR1/$tfile`
3533 [ $mtime = $TEST_39_MTIME ] || \
3534 error "mtime($mtime) is not set to $TEST_39_MTIME"
3536 cancel_lru_locks $OSC
3537 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3540 run_test 39d "create, utime, stat =============================="
3544 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3547 local mtime1=`stat -c %Y $DIR1/$tfile`
3549 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3551 for (( i=0; i < 2; i++ )) ; do
3552 local mtime2=`stat -c %Y $DIR1/$tfile`
3553 [ $mtime2 = $TEST_39_MTIME ] || \
3554 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3556 cancel_lru_locks $OSC
3557 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3560 run_test 39e "create, stat, utime, stat ========================"
3564 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3567 mtime1=`stat -c %Y $DIR1/$tfile`
3570 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3572 for (( i=0; i < 2; i++ )) ; do
3573 local mtime2=`stat -c %Y $DIR1/$tfile`
3574 [ $mtime2 = $TEST_39_MTIME ] || \
3575 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3577 cancel_lru_locks $OSC
3578 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3581 run_test 39f "create, stat, sleep, utime, stat ================="
3585 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3587 echo hello >> $DIR1/$tfile
3588 local mtime1=`stat -c %Y $DIR1/$tfile`
3591 chmod o+r $DIR1/$tfile
3593 for (( i=0; i < 2; i++ )) ; do
3594 local mtime2=`stat -c %Y $DIR1/$tfile`
3595 [ "$mtime1" = "$mtime2" ] || \
3596 error "lost mtime: $mtime2, should be $mtime1"
3598 cancel_lru_locks $OSC
3599 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3602 run_test 39g "write, chmod, stat ==============================="
3606 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3612 echo hello >> $DIR1/$tfile
3613 local mtime1=`stat -c %Y $DIR1/$tfile`
3615 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3617 if [ "$d1" != "$d2" ]; then
3618 echo "write and touch not within one second"
3620 for (( i=0; i < 2; i++ )) ; do
3621 local mtime2=`stat -c %Y $DIR1/$tfile`
3622 [ "$mtime2" = $TEST_39_MTIME ] || \
3623 error "lost mtime: $mtime2, should be $TEST_39_MTIME"
3625 cancel_lru_locks $OSC
3626 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3630 run_test 39h "write, utime within one second, stat ============="
3633 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3638 echo hello >> $DIR1/$tfile
3639 local mtime1=`stat -c %Y $DIR1/$tfile`
3641 mv $DIR1/$tfile $DIR1/$tfile-1
3643 for (( i=0; i < 2; i++ )) ; do
3644 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3646 [ "$mtime1" = "$mtime2" ] || \
3647 error "lost mtime: $mtime2, should be $mtime1"
3649 cancel_lru_locks $OSC
3650 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3653 run_test 39i "write, rename, stat =============================="
3656 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3658 start_full_debug_logging
3662 #define OBD_FAIL_OSC_DELAY_SETTIME 0x412
3663 lctl set_param fail_loc=0x80000412
3664 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c ||
3665 error "multiop failed"
3667 local mtime1=`stat -c %Y $DIR1/$tfile`
3669 mv $DIR1/$tfile $DIR1/$tfile-1
3671 kill -USR1 $multipid
3672 wait $multipid || error "multiop close failed"
3674 for (( i=0; i < 2; i++ )) ; do
3675 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3676 [ "$mtime1" = "$mtime2" ] ||
3677 error "mtime is lost on close: $mtime2, " \
3680 cancel_lru_locks $OSC
3681 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3683 lctl set_param fail_loc=0
3684 stop_full_debug_logging
3686 run_test 39j "write, rename, close, stat ======================="
3689 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3694 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed"
3696 local mtime1=`stat -c %Y $DIR1/$tfile`
3698 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3700 kill -USR1 $multipid
3701 wait $multipid || error "multiop close failed"
3703 for (( i=0; i < 2; i++ )) ; do
3704 local mtime2=`stat -c %Y $DIR1/$tfile`
3706 [ "$mtime2" = $TEST_39_MTIME ] || \
3707 error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
3709 cancel_lru_locks osc
3710 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3713 run_test 39k "write, utime, close, stat ========================"
3715 # this should be set to future
3716 TEST_39_ATIME=`date -d "1 year" +%s`
3719 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3720 remote_mds_nodsh && skip "remote MDS with nodsh"
3722 local atime_diff=$(do_facet $SINGLEMDS \
3723 lctl get_param -n mdd.*MDT0000*.atime_diff)
3727 # test setting directory atime to future
3728 touch -a -d @$TEST_39_ATIME $DIR/$tdir
3729 local atime=$(stat -c %X $DIR/$tdir)
3730 [ "$atime" = $TEST_39_ATIME ] ||
3731 error "atime is not set to future: $atime, $TEST_39_ATIME"
3733 # test setting directory atime from future to now
3734 local now=$(date +%s)
3735 touch -a -d @$now $DIR/$tdir
3737 atime=$(stat -c %X $DIR/$tdir)
3738 [ "$atime" -eq "$now" ] ||
3739 error "atime is not updated from future: $atime, $now"
3741 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=2
3744 # test setting directory atime when now > dir atime + atime_diff
3745 local d1=$(date +%s)
3747 local d2=$(date +%s)
3748 cancel_lru_locks mdc
3749 atime=$(stat -c %X $DIR/$tdir)
3750 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3751 error "atime is not updated : $atime, should be $d2"
3753 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=60
3756 # test not setting directory atime when now < dir atime + atime_diff
3758 cancel_lru_locks mdc
3759 atime=$(stat -c %X $DIR/$tdir)
3760 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3761 error "atime is updated to $atime, should remain $d1<atime<$d2"
3763 do_facet $SINGLEMDS \
3764 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3766 run_test 39l "directory atime update ==========================="
3769 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3773 local far_past_mtime=$(date -d "May 29 1953" +%s)
3774 local far_past_atime=$(date -d "Dec 17 1903" +%s)
3776 touch -m -d @$far_past_mtime $DIR1/$tfile
3777 touch -a -d @$far_past_atime $DIR1/$tfile
3779 for (( i=0; i < 2; i++ )) ; do
3780 local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
3781 [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
3782 error "atime or mtime set incorrectly"
3784 cancel_lru_locks $OSC
3785 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3788 run_test 39m "test atime and mtime before 1970"
3790 test_39n() { # LU-3832
3791 remote_mds_nodsh && skip "remote MDS with nodsh"
3793 local atime_diff=$(do_facet $SINGLEMDS \
3794 lctl get_param -n mdd.*MDT0000*.atime_diff)
3799 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
3802 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
3803 atime0=$(stat -c %X $DIR/$tfile)
3806 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3807 atime1=$(stat -c %X $DIR/$tfile)
3810 cancel_lru_locks mdc
3811 cancel_lru_locks osc
3812 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3813 atime2=$(stat -c %X $DIR/$tfile)
3815 do_facet $SINGLEMDS \
3816 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3818 [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
3819 [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
3821 run_test 39n "check that O_NOATIME is honored"
3824 TESTDIR=$DIR/$tdir/$tfile
3825 [ -e $TESTDIR ] && rm -rf $TESTDIR
3832 links2=$(stat -c %h .)
3833 [ $(($links1 + 2)) != $links2 ] &&
3834 error "wrong links count $(($links1 + 2)) != $links2"
3836 links3=$(stat -c %h .)
3837 [ $(($links1 + 1)) != $links3 ] &&
3838 error "wrong links count $links1 != $links3"
3841 run_test 39o "directory cached attributes updated after create"
3844 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3847 TESTDIR=$DIR/$tdir/$tdir
3848 [ -e $TESTDIR ] && rm -rf $TESTDIR
3849 test_mkdir -p $TESTDIR
3853 test_mkdir -i $MDTIDX $TESTDIR/remote_dir1
3854 test_mkdir -i $MDTIDX $TESTDIR/remote_dir2
3856 links2=$(stat -c %h .)
3857 [ $(($links1 + 2)) != $links2 ] &&
3858 error "wrong links count $(($links1 + 2)) != $links2"
3860 links3=$(stat -c %h .)
3861 [ $(($links1 + 1)) != $links3 ] &&
3862 error "wrong links count $links1 != $links3"
3865 run_test 39p "remote directory cached attributes updated after create ========"
3868 test_39q() { # LU-8041
3869 local testdir=$DIR/$tdir
3871 multiop_bg_pause $testdir D_c || error "multiop failed"
3873 cancel_lru_locks mdc
3874 kill -USR1 $multipid
3875 local atime=$(stat -c %X $testdir)
3876 [ "$atime" -ne 0 ] || error "atime is zero"
3878 run_test 39q "close won't zero out atime"
3881 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
3882 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
3883 error "openfile O_WRONLY:O_TRUNC $tfile failed"
3884 $CHECKSTAT -t file -s 4096 $DIR/$tfile ||
3885 error "$tfile is not 4096 bytes in size"
3887 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
3891 small_write $DIR/f41 18
3893 run_test 41 "test small file write + fstat ====================="
3895 count_ost_writes() {
3896 lctl get_param -n ${OSC}.*.stats |
3897 awk -vwrites=0 '/ost_write/ { writes += $2 } \
3898 END { printf("%0.0f", writes) }'
3905 BG_DIRTY_RATIO_SAVE=10
3906 MAX_BG_DIRTY_RATIO=25
3910 # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs,
3911 # dirty_ratio, dirty_background_ratio
3912 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
3913 sysctl -w vm.dirty_writeback_centisecs=$WRITEBACK_SAVE
3914 sysctl -w vm.dirty_background_ratio=$BG_DIRTY_RATIO_SAVE
3915 sysctl -w vm.dirty_ratio=$DIRTY_RATIO_SAVE
3917 # if file not here, we are a 2.4 kernel
3918 kill -CONT `pidof kupdated`
3923 # setup the trap first, so someone cannot exit the test at the
3924 # exact wrong time and mess up a machine
3925 trap start_writeback EXIT
3926 # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
3927 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
3928 WRITEBACK_SAVE=`sysctl -n vm.dirty_writeback_centisecs`
3929 sysctl -w vm.dirty_writeback_centisecs=0
3930 sysctl -w vm.dirty_writeback_centisecs=0
3931 # save and increase /proc/sys/vm/dirty_ratio
3932 DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_ratio`
3933 sysctl -w vm.dirty_ratio=$MAX_DIRTY_RATIO
3934 # save and increase /proc/sys/vm/dirty_background_ratio
3935 BG_DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_background_ratio`
3936 sysctl -w vm.dirty_background_ratio=$MAX_BG_DIRTY_RATIO
3938 # if file not here, we are a 2.4 kernel
3939 kill -STOP `pidof kupdated`
3943 # ensure that all stripes have some grant before we test client-side cache
3945 for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
3946 dd if=/dev/zero of=$i bs=4k count=1
3951 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
3952 # file truncation, and file removal.
3954 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3957 cancel_lru_locks $OSC
3959 sync; sleep 1; sync # just to be safe
3960 BEFOREWRITES=`count_ost_writes`
3961 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur_grant_bytes | grep "[0-9]"
3962 dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
3963 AFTERWRITES=`count_ost_writes`
3964 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
3965 error "$BEFOREWRITES < $AFTERWRITES"
3968 run_test 42a "ensure that we don't flush on close"
3971 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3974 cancel_lru_locks $OSC
3977 dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
3978 BEFOREWRITES=$(count_ost_writes)
3979 $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
3980 AFTERWRITES=$(count_ost_writes)
3981 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
3982 error "$BEFOREWRITES < $AFTERWRITES on unlink"
3984 BEFOREWRITES=$(count_ost_writes)
3985 sync || error "sync: $?"
3986 AFTERWRITES=$(count_ost_writes)
3987 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
3988 error "$BEFOREWRITES < $AFTERWRITES on sync"
3990 dmesg | grep 'error from obd_brw_async' && error 'error writing back'
3994 run_test 42b "test destroy of file with cached dirty data ======"
3996 # if these tests just want to test the effect of truncation,
3997 # they have to be very careful. consider:
3998 # - the first open gets a {0,EOF}PR lock
3999 # - the first write conflicts and gets a {0, count-1}PW
4000 # - the rest of the writes are under {count,EOF}PW
4001 # - the open for truncate tries to match a {0,EOF}PR
4002 # for the filesize and cancels the PWs.
4003 # any number of fixes (don't get {0,EOF} on open, match
4004 # composite locks, do smarter file size management) fix
4005 # this, but for now we want these tests to verify that
4006 # the cancellation with truncate intent works, so we
4007 # start the file with a full-file pw lock to match against
4008 # until the truncate.
4013 cancel_lru_locks $OSC
4015 # prime the file with 0,EOF PW to match
4019 # now the real test..
4020 dd if=/dev/zero of=$file bs=1024 count=100
4021 BEFOREWRITES=`count_ost_writes`
4022 $TRUNCATE $file $offset
4023 cancel_lru_locks $OSC
4024 AFTERWRITES=`count_ost_writes`
4029 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4032 [ $BEFOREWRITES -eq $AFTERWRITES ] &&
4033 error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
4036 run_test 42c "test partial truncate of file with cached dirty data"
4039 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4042 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
4043 error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
4046 run_test 42d "test complete truncate of file with cached dirty data"
4048 test_42e() { # bug22074
4049 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4051 local TDIR=$DIR/${tdir}e
4052 local pages=16 # hardcoded 16 pages, don't change it.
4053 local files=$((OSTCOUNT * 500)) # hopefully 500 files on each OST
4054 local proc_osc0="osc.${FSNAME}-OST0000-osc-[^MDT]*"
4058 test_mkdir $DIR/${tdir}e
4059 $SETSTRIPE -c 1 $TDIR
4060 createmany -o $TDIR/f $files
4062 max_dirty_mb=$($LCTL get_param -n $proc_osc0/max_dirty_mb)
4064 # we assume that with $OSTCOUNT files, at least one of them will
4065 # be allocated on OST0.
4066 warmup_files=$((OSTCOUNT * max_dirty_mb))
4067 createmany -o $TDIR/w $warmup_files
4069 # write a large amount of data into one file and sync, to get good
4070 # avail_grant number from OST.
4071 for ((i=0; i<$warmup_files; i++)); do
4072 idx=$($GETSTRIPE -i $TDIR/w$i)
4073 [ $idx -ne 0 ] && continue
4074 dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1
4077 [[ $i -gt $warmup_files ]] && error "OST0 is still cold"
4079 $LCTL get_param $proc_osc0/cur_dirty_bytes
4080 $LCTL get_param $proc_osc0/cur_grant_bytes
4082 # create as much dirty pages as we can while not to trigger the actual
4083 # RPCs directly. but depends on the env, VFS may trigger flush during this
4084 # period, hopefully we are good.
4085 for ((i=0; i<$warmup_files; i++)); do
4086 idx=$($GETSTRIPE -i $TDIR/w$i)
4087 [ $idx -ne 0 ] && continue
4088 dd if=/dev/zero of=$TDIR/w$i bs=1M count=1 2>/dev/null
4090 $LCTL get_param $proc_osc0/cur_dirty_bytes
4091 $LCTL get_param $proc_osc0/cur_grant_bytes
4093 # perform the real test
4094 $LCTL set_param $proc_osc0/rpc_stats 0
4095 for ((;i<$files; i++)); do
4096 [ $($GETSTRIPE -i $TDIR/f$i) -eq 0 ] || continue
4097 dd if=/dev/zero of=$TDIR/f$i bs=$PAGE_SIZE count=$pages 2>/dev/null
4100 $LCTL get_param $proc_osc0/rpc_stats
4103 local have_ppr=false
4104 $LCTL get_param $proc_osc0/rpc_stats |
4105 while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do
4106 # skip lines until we are at the RPC histogram data
4107 [ "$PPR" == "pages" ] && have_ppr=true && continue
4108 $have_ppr || continue
4110 # we only want the percent stat for < 16 pages
4111 [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break
4113 percent=$((percent + WPCT))
4114 if [[ $percent -gt 15 ]]; then
4115 error "less than 16-pages write RPCs" \
4122 run_test 42e "verify sub-RPC writes are not done synchronously"
4124 test_43A() { # was test_43
4125 test_mkdir $DIR/$tdir
4126 cp -p /bin/ls $DIR/$tdir/$tfile
4127 $MULTIOP $DIR/$tdir/$tfile Ow_c &
4129 # give multiop a chance to open
4132 $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true
4135 run_test 43A "execution of file opened for write should return -ETXTBSY"
4138 test_mkdir $DIR/$tdir
4139 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4140 $DIR/$tdir/sleep 60 &
4142 # Make sure exec of $tdir/sleep wins race with truncate
4144 $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success"
4147 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
4150 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4152 test_mkdir $DIR/$tdir
4153 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4154 $DIR/$tdir/sleep 60 &
4156 # Make sure exec of $tdir/sleep wins race with truncate
4158 $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success"
4161 run_test 43b "truncate of file being executed should return -ETXTBSY"
4164 local testdir="$DIR/$tdir"
4167 ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) |
4168 ( cd $testdir && md5sum -c )
4170 run_test 43c "md5sum of copy into lustre"
4172 test_44A() { # was test_44
4173 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4175 dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
4176 dd if=$DIR/f1 bs=4k count=1 > /dev/null
4178 run_test 44A "zero length read from a sparse stripe"
4181 local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
4183 [ -z "$nstripe" ] && skip "can't get stripe info"
4184 [[ $nstripe -gt $OSTCOUNT ]] &&
4185 skip "Wrong default_stripe_count: $nstripe OSTCOUNT: $OSTCOUNT"
4187 local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: |
4189 if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then
4190 nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: |
4194 OFFSETS="0 $((stride/2)) $((stride-1))"
4195 for offset in $OFFSETS; do
4196 for i in $(seq 0 $((nstripe-1))); do
4197 local GLOBALOFFSETS=""
4199 local size=$((((i + 2 * $nstripe )*$stride + $offset)))
4200 local myfn=$DIR/d44a-$size
4201 echo "--------writing $myfn at $size"
4202 ll_sparseness_write $myfn $size ||
4203 error "ll_sparseness_write"
4204 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4205 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4206 error "ll_sparseness_verify $GLOBALOFFSETS"
4208 for j in $(seq 0 $((nstripe-1))); do
4210 size=$((((j + $nstripe )*$stride + $offset)))
4211 ll_sparseness_write $myfn $size ||
4212 error "ll_sparseness_write"
4213 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4215 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4216 error "ll_sparseness_verify $GLOBALOFFSETS"
4221 run_test 44a "test sparse pwrite ==============================="
4225 for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
4231 before=`dirty_osc_total`
4232 echo executing "\"$*\""
4234 after=`dirty_osc_total`
4235 echo before $before, after $after
4238 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4241 # Obtain grants from OST if it supports it
4242 echo blah > ${f}_grant
4245 do_dirty_record "echo blah > $f"
4246 [[ $before -eq $after ]] && error "write wasn't cached"
4247 do_dirty_record "> $f"
4248 [[ $before -gt $after ]] || error "truncate didn't lower dirty count"
4249 do_dirty_record "echo blah > $f"
4250 [[ $before -eq $after ]] && error "write wasn't cached"
4251 do_dirty_record "sync"
4252 [[ $before -gt $after ]] || error "writeback didn't lower dirty count"
4253 do_dirty_record "echo blah > $f"
4254 [[ $before -eq $after ]] && error "write wasn't cached"
4255 do_dirty_record "cancel_lru_locks osc"
4256 [[ $before -gt $after ]] ||
4257 error "lock cancellation didn't lower dirty count"
4260 run_test 45 "osc io page accounting ============================"
4262 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this
4263 # test tickles a bug where re-dirtying a page was failing to be mapped to the
4264 # objects offset and an assert hit when an rpc was built with 1023's mapped
4265 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
4267 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4272 dd if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4274 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=1023 count=1
4275 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4279 run_test 46 "dirtying a previously written page ================"
4281 # test_47 is removed "Device nodes check" is moved to test_28
4283 test_48a() { # bug 2399
4284 [ "$mds1_FSTYPE" = "zfs" ] &&
4285 [ $MDS1_VERSION -lt $(version_code 2.3.63) ] &&
4286 skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly"
4288 test_mkdir $DIR/$tdir
4290 mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
4291 test_mkdir $DIR/$tdir
4292 touch foo || error "'touch foo' failed after recreating cwd"
4294 touch .foo || error "'touch .foo' failed after recreating cwd"
4296 ls . > /dev/null || error "'ls .' failed after recreating cwd"
4297 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4298 cd . || error "'cd .' failed after recreating cwd"
4299 mkdir . && error "'mkdir .' worked after recreating cwd"
4300 rmdir . && error "'rmdir .' worked after recreating cwd"
4301 ln -s . baz || error "'ln -s .' failed after recreating cwd"
4302 cd .. || error "'cd ..' failed after recreating cwd"
4304 run_test 48a "Access renamed working dir (should return errors)="
4306 test_48b() { # bug 2399
4308 test_mkdir $DIR/$tdir
4310 rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
4311 touch foo && error "'touch foo' worked after removing cwd"
4312 mkdir foo && error "'mkdir foo' worked after removing cwd"
4313 touch .foo && error "'touch .foo' worked after removing cwd"
4314 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
4315 ls . > /dev/null && error "'ls .' worked after removing cwd"
4316 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4317 mkdir . && error "'mkdir .' worked after removing cwd"
4318 rmdir . && error "'rmdir .' worked after removing cwd"
4319 ln -s . foo && error "'ln -s .' worked after removing cwd"
4320 cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
4322 run_test 48b "Access removed working dir (should return errors)="
4324 test_48c() { # bug 2350
4325 #lctl set_param debug=-1
4328 test_mkdir -p $DIR/$tdir/dir
4330 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4331 $TRACE touch foo && error "touch foo worked after removing cwd"
4332 $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
4333 touch .foo && error "touch .foo worked after removing cwd"
4334 mkdir .foo && error "mkdir .foo worked after removing cwd"
4335 $TRACE ls . && error "'ls .' worked after removing cwd"
4336 $TRACE ls .. || error "'ls ..' failed after removing cwd"
4337 $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
4338 $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
4339 $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
4340 $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
4342 run_test 48c "Access removed working subdir (should return errors)"
4344 test_48d() { # bug 2350
4345 #lctl set_param debug=-1
4348 test_mkdir -p $DIR/$tdir/dir
4350 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4351 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4352 $TRACE touch foo && error "'touch foo' worked after removing parent"
4353 $TRACE mkdir foo && error "mkdir foo worked after removing parent"
4354 touch .foo && error "'touch .foo' worked after removing parent"
4355 mkdir .foo && error "mkdir .foo worked after removing parent"
4356 $TRACE ls . && error "'ls .' worked after removing parent"
4357 $TRACE ls .. && error "'ls ..' worked after removing parent"
4358 $TRACE mkdir . && error "'mkdir .' worked after removing parent"
4359 $TRACE rmdir . && error "'rmdir .' worked after removing parent"
4360 $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
4363 run_test 48d "Access removed parent subdir (should return errors)"
4365 test_48e() { # bug 4134
4366 #lctl set_param debug=-1
4369 test_mkdir -p $DIR/$tdir/dir
4371 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4372 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4373 $TRACE touch $DIR/$tdir || error "'touch $DIR/$tdir' failed"
4374 $TRACE chmod +x $DIR/$tdir || error "'chmod +x $DIR/$tdir' failed"
4375 # On a buggy kernel addition of "touch foo" after cd .. will
4376 # produce kernel oops in lookup_hash_it
4377 touch ../foo && error "'cd ..' worked after recreate parent"
4379 $TRACE rm $DIR/$tdir || error "rm '$DIR/$tdir' failed"
4381 run_test 48e "Access to recreated parent subdir (should return errors)"
4383 test_49() { # LU-1030
4384 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4385 remote_ost_nodsh && skip "remote OST with nodsh"
4387 # get ost1 size - lustre-OST0000
4388 ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
4390 # write 800M at maximum
4391 [[ $ost1_size -lt 2 ]] && ost1_size=2
4392 [[ $ost1_size -gt 819200 ]] && ost1_size=819200
4394 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
4395 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) &
4398 # change max_pages_per_rpc while writing the file
4399 local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc
4400 local orig_mppc=$($LCTL get_param -n $osc1_mppc)
4401 # loop until dd process exits
4402 while ps ax -opid | grep -wq $dd_pid; do
4403 $LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1))
4404 sleep $((RANDOM % 5 + 1))
4406 # restore original max_pages_per_rpc
4407 $LCTL set_param $osc1_mppc=$orig_mppc
4408 rm $DIR/$tfile || error "rm $DIR/$tfile failed"
4410 run_test 49 "Change max_pages_per_rpc won't break osc extent"
4414 test_mkdir $DIR/$tdir
4416 ls /proc/$$/cwd || error "ls /proc/$$/cwd failed"
4418 run_test 50 "special situations: /proc symlinks ==============="
4420 test_51a() { # was test_51
4421 # bug 1516 - create an empty entry right after ".." then split dir
4422 test_mkdir -c1 $DIR/$tdir
4423 touch $DIR/$tdir/foo
4424 $MCREATE $DIR/$tdir/bar
4426 createmany -m $DIR/$tdir/longfile 201
4428 while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do
4429 $MCREATE $DIR/$tdir/longfile$FNUM
4434 ls -l $DIR/$tdir > /dev/null || error "ls -l $DIR/$tdir failed"
4436 run_test 51a "special situations: split htree with empty entry =="
4438 cleanup_print_lfs_df () {
4445 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4447 local dir=$DIR/$tdir
4448 local nrdirs=$((65536 + 100))
4450 # cleanup the directory
4457 local mdtidx=$(printf "%04x" $($LFS getstripe -m $dir))
4458 local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
4459 [[ $numfree -lt $nrdirs ]] &&
4460 skip "not enough free inodes ($numfree) on MDT$mdtidx"
4462 # need to check free space for the directories as well
4463 local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
4464 numfree=$(( blkfree / $(fs_inode_ksize) ))
4465 [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)"
4467 trap cleanup_print_lfs_df EXIT
4470 createmany -d $dir/d $nrdirs || {
4471 unlinkmany $dir/d $nrdirs
4472 error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
4476 nrdirs=$(ls -U $dir | wc -l)
4478 # unlink all but 100 subdirectories, then check it still works
4480 local delete=$((nrdirs - left))
4485 # for ldiskfs the nlink count should be 1, but this is OSD specific
4486 # and so this is listed for informational purposes only
4487 echo "nlink before: $(stat -c %h $dir), created before: $nrdirs"
4488 unlinkmany -d $dir/d $delete ||
4489 error "unlink of first $delete subdirs failed"
4491 echo "nlink between: $(stat -c %h $dir)"
4492 local found=$(ls -U $dir | wc -l)
4493 [ $found -ne $left ] &&
4494 error "can't find subdirs: found only $found, expected $left"
4496 unlinkmany -d $dir/d $delete $left ||
4497 error "unlink of second $left subdirs failed"
4498 # regardless of whether the backing filesystem tracks nlink accurately
4499 # or not, the nlink count shouldn't be more than "." and ".." here
4500 local after=$(stat -c %h $dir)
4501 [[ $after -gt 2 ]] && error "nlink after: $after > 2" ||
4502 echo "nlink after: $after"
4504 cleanup_print_lfs_df
4506 run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
4509 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4510 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
4512 test_mkdir $DIR/$tdir
4513 createmany -o $DIR/$tdir/t- 1000
4514 $LFS getstripe $DIR/$tdir > $TMP/$tfile
4515 for N in $(seq 0 $((OSTCOUNT - 1))); do
4516 OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
4517 END { printf("%0.0f", objs) }' $TMP/$tfile)
4518 OBJS0[$N]=$(grep -A 1 idx $TMP/$tfile | awk -vobjs=0 \
4519 '($1 == '$N') { objs += 1 } \
4520 END { printf("%0.0f", objs) }')
4521 log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
4523 unlinkmany $DIR/$tdir/t- 1000
4526 for N in $(seq 1 $((OSTCOUNT - 1))); do
4527 [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] &&
4528 error "OST $N has less objects vs OST $NLAST" \
4529 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4530 [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] &&
4531 error "OST $N has less objects vs OST $NLAST" \
4532 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4534 [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] &&
4535 error "OST $N has less #0 objects vs OST $NLAST" \
4536 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4537 [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] &&
4538 error "OST $N has less #0 objects vs OST $NLAST" \
4539 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4544 run_test 51d "check object distribution"
4547 if [ "$mds1_FSTYPE" != ldiskfs ]; then
4548 skip_env "ldiskfs only test"
4551 test_mkdir -c1 $DIR/$tdir
4552 test_mkdir -c1 $DIR/$tdir/d0
4554 touch $DIR/$tdir/d0/foo
4555 createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
4556 error "file exceed 65000 nlink limit!"
4557 unlinkmany $DIR/$tdir/d0/f- 65001
4560 run_test 51e "check file nlink limit"
4563 test_mkdir $DIR/$tdir
4566 local ulimit_old=$(ulimit -n)
4567 local spare=20 # number of spare fd's for scripts/libraries, etc.
4568 local mdt=$($LFS getstripe -m $DIR/$tdir)
4569 local numfree=$($LFS df -i $DIR/$tdir | awk '/MDT:'$mdt'/ { print $4 }')
4571 echo "MDT$mdt numfree=$numfree, max=$max"
4572 [[ $numfree -gt $max ]] && numfree=$max || numfree=$((numfree * 7 / 8))
4573 if [ $((numfree + spare)) -gt $ulimit_old ]; then
4574 while ! ulimit -n $((numfree + spare)); do
4575 numfree=$((numfree * 3 / 4))
4577 echo "changed ulimit from $ulimit_old to $((numfree + spare))"
4579 echo "left ulimit at $ulimit_old"
4582 createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
4583 unlinkmany $DIR/$tdir/f $numfree
4584 error "create+open $numfree files in $DIR/$tdir failed"
4586 ulimit -n $ulimit_old
4588 # if createmany exits at 120s there will be fewer than $numfree files
4589 unlinkmany $DIR/$tdir/f $numfree || true
4591 run_test 51f "check many open files limit"
4594 [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
4595 test_mkdir $DIR/$tdir
4596 touch $DIR/$tdir/foo
4597 chattr +a $DIR/$tdir/foo || error "chattr +a failed"
4598 echo bar >> $DIR/$tdir/foo || error "append bar failed"
4599 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4600 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4601 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4603 echo foo >> $DIR/$tdir/foo || error "append foo failed"
4604 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4605 lsattr $DIR/$tdir/foo | egrep -q "^-+a[-e]+ $DIR/$tdir/foo" ||
4607 chattr -a $DIR/$tdir/foo || error "chattr -a failed"
4608 cp -r $DIR/$tdir $TMP/
4609 rm -fr $DIR/$tdir $TMP/$tdir || error "cleanup rm failed"
4611 run_test 52a "append-only flag test (should return errors)"
4614 [ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo
4615 test_mkdir $DIR/$tdir
4616 touch $DIR/$tdir/foo
4617 chattr +i $DIR/$tdir/foo || error "chattr +i failed"
4618 cat test > $DIR/$tdir/foo && error "cat test worked"
4619 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4620 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4621 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4623 echo foo >> $DIR/$tdir/foo && error "echo worked"
4624 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4625 [ -f $DIR/$tdir/foo ] || error "$tdir/foo is not a file"
4626 [ -f $DIR/$tdir/foo_ren ] && error "$tdir/foo_ren is not a file"
4627 lsattr $DIR/$tdir/foo | egrep -q "^-+i[-e]+ $DIR/$tdir/foo" ||
4629 chattr -i $DIR/$tdir/foo || error "chattr failed"
4631 rm -fr $DIR/$tdir || error "unable to remove $DIR/$tdir"
4633 run_test 52b "immutable flag test (should return errors) ======="
4636 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4637 remote_mds_nodsh && skip "remote MDS with nodsh"
4638 remote_ost_nodsh && skip "remote OST with nodsh"
4651 local support_last_seq=true
4653 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
4654 support_last_seq=false
4657 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
4659 for value in $(do_facet $SINGLEMDS \
4660 $LCTL get_param osp.$mdtosc.prealloc_last_id) ; do
4661 param=$(echo ${value[0]} | cut -d "=" -f1)
4662 ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
4664 if $support_last_seq; then
4665 param_seq=$(echo $param |
4666 sed -e s/prealloc_last_id/prealloc_last_seq/g)
4667 mds_last_seq=$(do_facet $SINGLEMDS \
4668 $LCTL get_param -n $param_seq)
4670 mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
4672 ostnum=$(index_from_ostuuid ${ostname}_UUID)
4673 node=$(facet_active_host ost$((ostnum+1)))
4674 param="obdfilter.$ostname.last_id"
4675 for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
4676 echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
4677 ost_last_id=$ost_last
4679 if $support_last_seq; then
4680 ost_last_id=$(echo $ost_last |
4681 awk -F':' '{print $2}' |
4683 ost_last_seq=$(echo $ost_last |
4684 awk -F':' '{print $1}')
4685 [[ $ost_last_seq = $mds_last_seq ]] || continue
4688 if [[ $ost_last_id != $mds_last ]]; then
4689 error "$ost_last_id != $mds_last"
4696 $found || error "can not match last_seq/last_id for $mdtosc"
4699 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
4702 perl -MSocket -e ';' || skip "no Socket perl module installed"
4704 $SOCKETSERVER $DIR/socket ||
4705 error "$SOCKETSERVER $DIR/socket failed: $?"
4706 $SOCKETCLIENT $DIR/socket ||
4707 error "$SOCKETCLIENT $DIR/socket failed: $?"
4708 $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
4710 run_test 54a "unix domain socket test =========================="
4716 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1
4718 run_test 54b "char device works in lustre ======================"
4721 [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
4722 [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
4723 [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
4725 for i in $(seq 3 7); do
4726 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
4735 loopdev="$DIR/loop54c"
4738 $UMOUNT $DIR/$tdir || rc=$?
4739 losetup -d $loopdev || true
4740 losetup -d $LOOPDEV || true
4741 rm -rf $loopdev $DIR/$tfile $DIR/$tdir
4746 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4748 loopdev="$DIR/loop54c"
4751 [ -z "$LOOPNUM" ] && skip_env "couldn't find empty loop device"
4752 trap cleanup_54c EXIT
4753 mknod $loopdev b 7 $LOOPNUM
4754 echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
4755 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE seek=1024 count=1 > /dev/null
4756 losetup $loopdev $DIR/$tfile ||
4757 error "can't set up $loopdev for $DIR/$tfile"
4758 mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
4759 test_mkdir $DIR/$tdir
4760 mount -t ext2 $loopdev $DIR/$tdir ||
4761 error "error mounting $loopdev on $DIR/$tdir"
4762 dd if=/dev/zero of=$DIR/$tdir/tmp bs=$PAGE_SIZE count=30 ||
4765 dd if=$DIR/$tdir/tmp of=/dev/zero bs=$PAGE_SIZE count=30 ||
4769 run_test 54c "block device works in lustre ====================="
4775 [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string"
4777 run_test 54d "fifo device works in lustre ======================"
4782 cp -aL /dev/console $f
4783 echo $string > $f || error "echo $string to $f failed"
4785 run_test 54e "console/tty device works in lustre ======================"
4789 local dir=$DIR/$tdir
4792 test_mkdir -p $dir/dir
4793 for i in $(seq $numfiles); do
4795 touch $dir/dir/file$i
4798 local numcomp=$($LFS getstripe --component-count $dir)
4800 [[ $numcomp == 0 ]] && numcomp=1
4802 # test lfs getstripe with --recursive
4803 local filenum=$($LFS getstripe -r $dir | egrep -c "obdidx|l_ost_idx")
4805 [[ $filenum -eq $((numfiles * 2)) ]] ||
4806 error "$LFS getstripe -r: found $filenum != $((numfiles * 2))"
4807 filenum=$($LFS getstripe $dir | egrep -c "obdidx|l_ost_idx")
4808 [[ $filenum -eq $numfiles ]] ||
4809 error "$LFS getstripe $dir: found $filenum, not $numfiles"
4810 echo "$LFS getstripe showed obdidx or l_ost_idx"
4812 # test lfs getstripe with file instead of dir
4813 filenum=$($LFS getstripe $dir/file1 | egrep -c "obdidx|l_ost_idx")
4814 [[ $filenum -eq 1 ]] ||
4815 error "$LFS getstripe $dir/file1: found $filenum, not 1"
4816 echo "$LFS getstripe file1 passed"
4818 #test lfs getstripe with --verbose
4819 filenum=$($LFS getstripe --verbose $dir | grep -c lmm_magic)
4820 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
4821 error "$LFS getstripe --verbose $dir: "\
4822 "got $filenum want $((numfiles * numcomp)) lmm_magic"
4823 [[ $($LFS getstripe $dir | grep -c lmm_magic) -eq 0 ]] ||
4824 error "$LFS getstripe $dir: showed lmm_magic"
4826 #test lfs getstripe with -v prints lmm_fid
4827 filenum=$($LFS getstripe -v $dir | grep -c lmm_fid)
4828 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
4829 error "$LFS getstripe -v $dir: "\
4830 "got $filenum want $((numfiles * numcomp)) lmm_fid"
4831 [[ $($LFS getstripe $dir | grep -c lmm_fid) -eq 0 ]] ||
4832 error "$LFS getstripe $dir: showed lmm_fid by default"
4833 echo "$LFS getstripe --verbose passed"
4835 #check for FID information
4836 local fid1=$($LFS getstripe --fid $dir/file1)
4837 local fid2=$($LFS getstripe --verbose $dir/file1 |
4838 awk '/lmm_fid: / { print $2; exit; }')
4839 local fid3=$($LFS path2fid $dir/file1)
4841 [ "$fid1" != "$fid2" ] &&
4842 error "getstripe --fid '$fid1' != getstripe --verbose '$fid2'"
4843 [ "$fid1" != "$fid3" ] &&
4844 error "getstripe --fid '$fid1' != lfs path2fid '$fid3'"
4845 echo "$LFS getstripe --fid passed"
4847 #test lfs getstripe with --obd
4848 $LFS getstripe --obd wrong_uuid $dir 2>&1 | grep -q "unknown obduuid" ||
4849 error "$LFS getstripe --obd wrong_uuid: should return error"
4851 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4854 local obduuid=$(ostuuid_from_index $ostidx)
4855 local found=$($LFS getstripe -r --obd $obduuid $dir |
4856 grep 'lmm_stripe_offset:' | grep -c " $ostidx\$")
4858 filenum=$($LFS getstripe -ir $dir | grep -c "^$ostidx\$")
4859 [[ $($LFS getstripe -id $dir) -ne $ostidx ]] ||
4861 [[ $($LFS getstripe -id $dir/dir) -ne $ostidx ]] ||
4864 [[ $found -eq $filenum ]] ||
4865 error "$LFS getstripe --obd: found $found expect $filenum"
4866 [[ $($LFS getstripe -r -v --obd $obduuid $dir |
4867 sed '/^[ ]*'${ostidx}'[ ]/d' |
4868 sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] ||
4869 error "$LFS getstripe --obd: should not show file on other obd"
4870 echo "$LFS getstripe --obd passed"
4872 run_test 56a "check $LFS getstripe"
4875 local dir=$DIR/$tdir
4879 for i in $(seq $numdirs); do
4880 test_mkdir $dir/dir$i
4883 # test lfs getdirstripe default mode is non-recursion, which is
4884 # different from lfs getstripe
4885 local dircnt=$($LFS getdirstripe $dir | grep -c lmv_stripe_count)
4887 [[ $dircnt -eq 1 ]] ||
4888 error "$LFS getdirstripe: found $dircnt, not 1"
4889 dircnt=$($LFS getdirstripe --recursive $dir |
4890 grep -c lmv_stripe_count)
4891 [[ $dircnt -eq $((numdirs + 1)) ]] ||
4892 error "$LFS getdirstripe -r: $dircnt, != $((numdirs + 1))"
4894 run_test 56b "check $LFS getdirstripe"
4897 remote_ost_nodsh && skip "remote OST with nodsh"
4900 local ost_name=$(ostname_from_index $ost_idx)
4901 local old_status=$(ost_dev_status $ost_idx)
4903 [[ -z "$old_status" ]] ||
4904 skip_env "OST $ost_name is in $old_status status"
4906 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
4907 [[ $OST1_VERSION -ge $(version_code 2.12.3) ]] && do_facet ost1 \
4908 $LCTL set_param -n obdfilter.$ost_name.no_precreate=1
4911 local new_status=$(ost_dev_status $ost_idx)
4913 [[ "$new_status" =~ "D" ]] ||
4914 error "$ost_name status is '$new_status', missing 'D'"
4915 if [[ $OST1_VERSION -ge $(version_code 2.12.3) ]]; then
4916 [[ "$new_status" =~ "N" ]] ||
4917 error "$ost_name status is '$new_status', missing 'N'"
4920 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
4921 [[ $OST1_VERSION -ge $(version_code 2.12.3) ]] && do_facet ost1 \
4922 $LCTL set_param -n obdfilter.$ost_name.no_precreate=0
4925 new_status=$(ost_dev_status $ost_idx)
4926 [[ ! "$new_status" =~ "D" && ! "$new_status" =~ "N" ]] ||
4927 error "$ost_name status is '$new_status', has 'D' and/or 'N'"
4929 run_test 56c "check 'lfs df' showing device status"
4934 local local_tdir="$1"
4935 local local_numfiles="$2"
4936 local local_numdirs="$3"
4937 local dir_params="$4"
4938 local dir_stripe_params="$5"
4940 if [ ! -d "$local_tdir" ] ; then
4941 test_mkdir -p $dir_stripe_params $local_tdir
4942 [ "$dir_params" ] && $LFS setstripe $dir_params $local_tdir
4943 for i in $(seq $local_numfiles) ; do
4944 touch $local_tdir/file$i
4946 for i in $(seq $local_numdirs) ; do
4947 test_mkdir $dir_stripe_params $local_tdir/dir$i
4948 for j in $(seq $local_numfiles) ; do
4949 touch $local_tdir/dir$i/file$j
4955 setup_56_special() {
4957 local local_numfiles=$2
4958 local local_numdirs=$3
4960 setup_56 $local_tdir $local_numfiles $local_numdirs
4962 if [ ! -e "$local_tdir/loop${local_numfiles}b" ] ; then
4963 for i in $(seq $local_numfiles) ; do
4964 mknod $local_tdir/loop${i}b b 7 $i
4965 mknod $local_tdir/null${i}c c 1 3
4966 ln -s $local_tdir/file1 $local_tdir/link${i}
4968 for i in $(seq $local_numdirs) ; do
4969 mknod $local_tdir/dir$i/loop${i}b b 7 $i
4970 mknod $local_tdir/dir$i/null${i}c c 1 3
4971 ln -s $local_tdir/dir$i/file1 $local_tdir/dir$i/link${i}
4977 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
4978 local expected=$(($NUMDIRS + 2))
4980 setup_56 $dir $NUMFILES $NUMDIRS
4982 # test lfs find with -name
4983 for i in $(seq $NUMFILES) ; do
4984 local nums=$($LFS find -name "*$i" $dir | wc -l)
4986 [ $nums -eq $expected ] ||
4987 error "lfs find -name '*$i' $dir wrong: "\
4988 "found $nums, expected $expected"
4991 run_test 56g "check lfs find -name"
4994 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
4995 local expected=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES))
4997 setup_56 $dir $NUMFILES $NUMDIRS
4999 # test lfs find with ! -name
5000 for i in $(seq $NUMFILES) ; do
5001 local nums=$($LFS find ! -name "*$i" $dir | wc -l)
5003 [ $nums -eq $expected ] ||
5004 error "lfs find ! -name '*$i' $dir wrong: "\
5005 "found $nums, expected $expected"
5008 run_test 56h "check lfs find ! -name"
5011 local dir=$DIR/$tdir
5015 local cmd="$LFS find -ost $(ostuuid_from_index 0 $dir) $dir"
5018 [ -z "$out" ] || error "'$cmd' returned directory '$out'"
5020 run_test 56i "check 'lfs find -ost UUID' skips directories"
5023 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5025 setup_56_special $dir $NUMFILES $NUMDIRS
5027 local expected=$((NUMDIRS + 1))
5028 local cmd="$LFS find -type d $dir"
5029 local nums=$($cmd | wc -l)
5031 [ $nums -eq $expected ] ||
5032 error "'$cmd' wrong: found $nums, expected $expected"
5034 run_test 56j "check lfs find -type d"
5037 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5039 setup_56_special $dir $NUMFILES $NUMDIRS
5041 local expected=$(((NUMDIRS + 1) * NUMFILES))
5042 local cmd="$LFS find -type f $dir"
5043 local nums=$($cmd | wc -l)
5045 [ $nums -eq $expected ] ||
5046 error "'$cmd' wrong: found $nums, expected $expected"
5048 run_test 56k "check lfs find -type f"
5051 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5053 setup_56_special $dir $NUMFILES $NUMDIRS
5055 local expected=$((NUMDIRS + NUMFILES))
5056 local cmd="$LFS find -type b $dir"
5057 local nums=$($cmd | wc -l)
5059 [ $nums -eq $expected ] ||
5060 error "'$cmd' wrong: found $nums, expected $expected"
5062 run_test 56l "check lfs find -type b"
5065 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5067 setup_56_special $dir $NUMFILES $NUMDIRS
5069 local expected=$((NUMDIRS + NUMFILES))
5070 local cmd="$LFS find -type c $dir"
5071 local nums=$($cmd | wc -l)
5072 [ $nums -eq $expected ] ||
5073 error "'$cmd' wrong: found $nums, expected $expected"
5075 run_test 56m "check lfs find -type c"
5078 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5079 setup_56_special $dir $NUMFILES $NUMDIRS
5081 local expected=$((NUMDIRS + NUMFILES))
5082 local cmd="$LFS find -type l $dir"
5083 local nums=$($cmd | wc -l)
5085 [ $nums -eq $expected ] ||
5086 error "'$cmd' wrong: found $nums, expected $expected"
5088 run_test 56n "check lfs find -type l"
5091 local dir=$DIR/$tdir
5093 setup_56 $dir $NUMFILES $NUMDIRS
5094 utime $dir/file1 > /dev/null || error "utime (1)"
5095 utime $dir/file2 > /dev/null || error "utime (2)"
5096 utime $dir/dir1 > /dev/null || error "utime (3)"
5097 utime $dir/dir2 > /dev/null || error "utime (4)"
5098 utime $dir/dir1/file1 > /dev/null || error "utime (5)"
5099 dd if=/dev/zero count=1 >> $dir/dir1/file1 && sync
5102 local nums=$($LFS find -mtime +0 $dir | wc -l)
5104 [ $nums -eq $expected ] ||
5105 error "lfs find -mtime +0 $dir: found $nums expect $expected"
5108 cmd="$LFS find -mtime 0 $dir"
5109 nums=$($cmd | wc -l)
5110 [ $nums -eq $expected ] ||
5111 error "'$cmd' wrong: found $nums, expected $expected"
5113 run_test 56o "check lfs find -mtime for old files"
5116 [ $RUNAS_ID -eq $UID ] &&
5117 skip_env "RUNAS_ID = UID = $UID -- skipping"
5119 local dir=$DIR/$tdir
5121 setup_56 $dir $NUMFILES $NUMDIRS
5122 chown $RUNAS_ID $dir/file* || error "chown $DIR/${tdir}g/file$i failed"
5124 local expected=$NUMFILES
5125 local cmd="$LFS find -uid $RUNAS_ID $dir"
5126 local nums=$($cmd | wc -l)
5128 [ $nums -eq $expected ] ||
5129 error "'$cmd' wrong: found $nums, expected $expected"
5131 expected=$(((NUMFILES + 1) * NUMDIRS + 1))
5132 cmd="$LFS find ! -uid $RUNAS_ID $dir"
5133 nums=$($cmd | wc -l)
5134 [ $nums -eq $expected ] ||
5135 error "'$cmd' wrong: found $nums, expected $expected"
5137 run_test 56p "check lfs find -uid and ! -uid"
5140 [ $RUNAS_ID -eq $UID ] &&
5141 skip_env "RUNAS_ID = UID = $UID -- skipping"
5143 local dir=$DIR/$tdir
5145 setup_56 $dir $NUMFILES $NUMDIRS
5146 chgrp $RUNAS_GID $dir/file* || error "chown $dir/file$i failed"
5148 local expected=$NUMFILES
5149 local cmd="$LFS find -gid $RUNAS_GID $dir"
5150 local nums=$($cmd | wc -l)
5152 [ $nums -eq $expected ] ||
5153 error "'$cmd' wrong: found $nums, expected $expected"
5155 expected=$(( ($NUMFILES+1) * $NUMDIRS + 1))
5156 cmd="$LFS find ! -gid $RUNAS_GID $dir"
5157 nums=$($cmd | wc -l)
5158 [ $nums -eq $expected ] ||
5159 error "'$cmd' wrong: found $nums, expected $expected"
5161 run_test 56q "check lfs find -gid and ! -gid"
5164 local dir=$DIR/$tdir
5166 setup_56 $dir $NUMFILES $NUMDIRS
5169 local cmd="$LFS find -size 0 -type f -lazy $dir"
5170 local nums=$($cmd | wc -l)
5172 [ $nums -eq $expected ] ||
5173 error "'$cmd' wrong: found $nums, expected $expected"
5174 cmd="$LFS find -size 0 -type f $dir"
5175 nums=$($cmd | wc -l)
5176 [ $nums -eq $expected ] ||
5177 error "'$cmd' wrong: found $nums, expected $expected"
5180 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5181 nums=$($cmd | wc -l)
5182 [ $nums -eq $expected ] ||
5183 error "'$cmd' wrong: found $nums, expected $expected"
5184 cmd="$LFS find ! -size 0 -type f $dir"
5185 nums=$($cmd | wc -l)
5186 [ $nums -eq $expected ] ||
5187 error "'$cmd' wrong: found $nums, expected $expected"
5189 echo "test" > $dir/$tfile
5190 echo "test2" > $dir/$tfile.2 && sync
5192 cmd="$LFS find -size 5 -type f -lazy $dir"
5193 nums=$($cmd | wc -l)
5194 [ $nums -eq $expected ] ||
5195 error "'$cmd' wrong: found $nums, expected $expected"
5196 cmd="$LFS find -size 5 -type f $dir"
5197 nums=$($cmd | wc -l)
5198 [ $nums -eq $expected ] ||
5199 error "'$cmd' wrong: found $nums, expected $expected"
5202 cmd="$LFS find -size +5 -type f -lazy $dir"
5203 nums=$($cmd | wc -l)
5204 [ $nums -eq $expected ] ||
5205 error "'$cmd' wrong: found $nums, expected $expected"
5206 cmd="$LFS find -size +5 -type f $dir"
5207 nums=$($cmd | wc -l)
5208 [ $nums -eq $expected ] ||
5209 error "'$cmd' wrong: found $nums, expected $expected"
5212 cmd="$LFS find -size +0 -type f -lazy $dir"
5213 nums=$($cmd | wc -l)
5214 [ $nums -eq $expected ] ||
5215 error "'$cmd' wrong: found $nums, expected $expected"
5216 cmd="$LFS find -size +0 -type f $dir"
5217 nums=$($cmd | wc -l)
5218 [ $nums -eq $expected ] ||
5219 error "'$cmd' wrong: found $nums, expected $expected"
5222 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5223 nums=$($cmd | wc -l)
5224 [ $nums -eq $expected ] ||
5225 error "'$cmd' wrong: found $nums, expected $expected"
5226 cmd="$LFS find ! -size -5 -type f $dir"
5227 nums=$($cmd | wc -l)
5228 [ $nums -eq $expected ] ||
5229 error "'$cmd' wrong: found $nums, expected $expected"
5232 cmd="$LFS find -size -5 -type f -lazy $dir"
5233 nums=$($cmd | wc -l)
5234 [ $nums -eq $expected ] ||
5235 error "'$cmd' wrong: found $nums, expected $expected"
5236 cmd="$LFS find -size -5 -type f $dir"
5237 nums=$($cmd | wc -l)
5238 [ $nums -eq $expected ] ||
5239 error "'$cmd' wrong: found $nums, expected $expected"
5241 run_test 56r "check lfs find -size works"
5244 local dir=$DIR/$tdir
5246 [[ $OSC == "mdc" ]] && skip "DoM files" && return
5248 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5250 cancel_lru_locks $OSC
5252 local rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5254 local cmd="$LFS find -size 0 -type f -lazy $dir"
5255 local nums=$($cmd | wc -l)
5257 [ $nums -eq $expected ] ||
5258 error "'$cmd' wrong: found $nums, expected $expected"
5260 local rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5261 [ $rpcs_before -eq $rpcs_after ] ||
5262 error "'$cmd' should not send glimpse RPCs to OST"
5263 cmd="$LFS find -size 0 -type f $dir"
5264 nums=$($cmd | wc -l)
5265 [ $nums -eq $expected ] ||
5266 error "'$cmd' wrong: found $nums, expected $expected"
5267 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5268 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5269 $LCTL get_param osc.*.stats
5270 [ $rpcs_after -eq $((rpcs_before + 12)) ] ||
5271 error "'$cmd' should send 12 glimpse RPCs to OST"
5273 cancel_lru_locks $OSC
5274 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5276 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5277 nums=$($cmd | wc -l)
5278 [ $nums -eq $expected ] ||
5279 error "'$cmd' wrong: found $nums, expected $expected"
5280 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5281 $LCTL get_param mdc.*.stats
5282 [ $rpcs_before -eq $rpcs_after ] ||
5283 error "'$cmd' should not send glimpse RPCs to OST"
5284 cmd="$LFS find ! -size 0 -type f $dir"
5285 nums=$($cmd | wc -l)
5286 [ $nums -eq $expected ] ||
5287 error "'$cmd' wrong: found $nums, expected $expected"
5288 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5289 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5290 [ $rpcs_after -eq $((rpcs_before + 12)) ] ||
5291 error "'$cmd' should send 12 glimpse RPCs to OST"
5293 echo "test" > $dir/$tfile
5294 echo "test2" > $dir/$tfile.2 && sync
5295 cancel_lru_locks $OSC
5296 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5298 cmd="$LFS find -size 5 -type f -lazy $dir"
5299 nums=$($cmd | wc -l)
5300 [ $nums -eq $expected ] ||
5301 error "'$cmd' wrong: found $nums, expected $expected"
5302 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5303 [ $rpcs_before -eq $rpcs_after ] ||
5304 error "'$cmd' should not send glimpse RPCs to OST"
5305 cmd="$LFS find -size 5 -type f $dir"
5306 nums=$($cmd | wc -l)
5307 [ $nums -eq $expected ] ||
5308 error "'$cmd' wrong: found $nums, expected $expected"
5309 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5310 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5311 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5312 error "'$cmd' should send 14 glimpse RPCs to OST"
5314 cancel_lru_locks $OSC
5315 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5317 cmd="$LFS find -size +5 -type f -lazy $dir"
5318 nums=$($cmd | wc -l)
5319 [ $nums -eq $expected ] ||
5320 error "'$cmd' wrong: found $nums, expected $expected"
5321 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5322 [ $rpcs_before -eq $rpcs_after ] ||
5323 error "'$cmd' should not send glimpse RPCs to OST"
5324 cmd="$LFS find -size +5 -type f $dir"
5325 nums=$($cmd | wc -l)
5326 [ $nums -eq $expected ] ||
5327 error "'$cmd' wrong: found $nums, expected $expected"
5328 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5329 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5330 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5331 error "'$cmd' should send 14 glimpse RPCs to OST"
5333 cancel_lru_locks $OSC
5334 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5336 cmd="$LFS find -size +0 -type f -lazy $dir"
5337 nums=$($cmd | wc -l)
5338 [ $nums -eq $expected ] ||
5339 error "'$cmd' wrong: found $nums, expected $expected"
5340 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5341 [ $rpcs_before -eq $rpcs_after ] ||
5342 error "'$cmd' should not send glimpse RPCs to OST"
5343 cmd="$LFS find -size +0 -type f $dir"
5344 nums=$($cmd | wc -l)
5345 [ $nums -eq $expected ] ||
5346 error "'$cmd' wrong: found $nums, expected $expected"
5347 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5348 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5349 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5350 error "'$cmd' should send 14 glimpse RPCs to OST"
5352 cancel_lru_locks $OSC
5353 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5355 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5356 nums=$($cmd | wc -l)
5357 [ $nums -eq $expected ] ||
5358 error "'$cmd' wrong: found $nums, expected $expected"
5359 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5360 [ $rpcs_before -eq $rpcs_after ] ||
5361 error "'$cmd' should not send glimpse RPCs to OST"
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"
5366 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5367 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5368 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5369 error "'$cmd' should send 14 glimpse RPCs to OST"
5371 cancel_lru_locks $OSC
5372 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5374 cmd="$LFS find -size -5 -type f -lazy $dir"
5375 nums=$($cmd | wc -l)
5376 [ $nums -eq $expected ] ||
5377 error "'$cmd' wrong: found $nums, expected $expected"
5378 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5379 [ $rpcs_before -eq $rpcs_after ] ||
5380 error "'$cmd' should not send glimpse RPCs to OST"
5381 cmd="$LFS find -size -5 -type f $dir"
5382 nums=$($cmd | wc -l)
5383 [ $nums -eq $expected ] ||
5384 error "'$cmd' wrong: found $nums, expected $expected"
5385 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5386 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5387 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5388 error "'$cmd' should send 14 glimpse RPCs to OST"
5390 run_test 56ra "check lfs find -size -lazy works for data on OSTs"
5392 test_56s() { # LU-611 #LU-9369
5393 [[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
5395 local dir=$DIR/$tdir
5396 local onestripe=$(((NUMDIRS + 1) * NUMFILES))
5398 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5399 for i in $(seq $NUMDIRS); do
5400 $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile
5403 local expected=$NUMDIRS
5404 local cmd="$LFS find -c $OSTCOUNT $dir"
5405 local nums=$($cmd | wc -l)
5407 [ $nums -eq $expected ] || {
5408 $LFS getstripe -R $dir
5409 error "'$cmd' wrong: found $nums, expected $expected"
5412 expected=$((NUMDIRS + onestripe))
5413 cmd="$LFS find -stripe-count +0 -type f $dir"
5414 nums=$($cmd | wc -l)
5415 [ $nums -eq $expected ] || {
5416 $LFS getstripe -R $dir
5417 error "'$cmd' wrong: found $nums, expected $expected"
5421 cmd="$LFS find -stripe-count 1 -type f $dir"
5422 nums=$($cmd | wc -l)
5423 [ $nums -eq $expected ] || {
5424 $LFS getstripe -R $dir
5425 error "'$cmd' wrong: found $nums, expected $expected"
5428 cmd="$LFS find -stripe-count -2 -type f $dir"
5429 nums=$($cmd | wc -l)
5430 [ $nums -eq $expected ] || {
5431 $LFS getstripe -R $dir
5432 error "'$cmd' wrong: found $nums, expected $expected"
5436 cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir"
5437 nums=$($cmd | wc -l)
5438 [ $nums -eq $expected ] || {
5439 $LFS getstripe -R $dir
5440 error "'$cmd' wrong: found $nums, expected $expected"
5443 run_test 56s "check lfs find -stripe-count works"
5445 test_56t() { # LU-611 #LU-9369
5446 local dir=$DIR/$tdir
5448 setup_56 $dir 0 $NUMDIRS
5449 for i in $(seq $NUMDIRS); do
5450 $LFS setstripe -S 8M $dir/dir$i/$tfile
5453 local expected=$NUMDIRS
5454 local cmd="$LFS find -S 8M $dir"
5455 local nums=$($cmd | wc -l)
5457 [ $nums -eq $expected ] || {
5458 $LFS getstripe -R $dir
5459 error "'$cmd' wrong: found $nums, expected $expected"
5463 setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k"
5465 $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3}
5467 expected=$(((NUMDIRS + 1) * NUMFILES))
5468 cmd="$LFS find -stripe-size 512k -type f $dir"
5469 nums=$($cmd | wc -l)
5470 [ $nums -eq $expected ] ||
5471 error "'$cmd' wrong: found $nums, expected $expected"
5473 cmd="$LFS find -stripe-size +320k -type f $dir"
5474 nums=$($cmd | wc -l)
5475 [ $nums -eq $expected ] ||
5476 error "'$cmd' wrong: found $nums, expected $expected"
5478 expected=$(((NUMDIRS + 1) * NUMFILES + 4))
5479 cmd="$LFS find -stripe-size +200k -type f $dir"
5480 nums=$($cmd | wc -l)
5481 [ $nums -eq $expected ] ||
5482 error "'$cmd' wrong: found $nums, expected $expected"
5484 cmd="$LFS find -stripe-size -640k -type f $dir"
5485 nums=$($cmd | wc -l)
5486 [ $nums -eq $expected ] ||
5487 error "'$cmd' wrong: found $nums, expected $expected"
5490 cmd="$LFS find -stripe-size 256k -type f $dir"
5491 nums=$($cmd | wc -l)
5492 [ $nums -eq $expected ] ||
5493 error "'$cmd' wrong: found $nums, expected $expected"
5495 cmd="$LFS find -stripe-size -320k -type f $dir"
5496 nums=$($cmd | wc -l)
5497 [ $nums -eq $expected ] ||
5498 error "'$cmd' wrong: found $nums, expected $expected"
5501 cmd="$LFS find -stripe-size 1024k -type f $dir"
5502 nums=$($cmd | wc -l)
5503 [ $nums -eq $expected ] ||
5504 error "'$cmd' wrong: found $nums, expected $expected"
5506 run_test 56t "check lfs find -stripe-size works"
5508 test_56u() { # LU-611
5509 local dir=$DIR/$tdir
5511 setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1"
5513 if [[ $OSTCOUNT -gt 1 ]]; then
5514 $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3}
5520 local expected=$(((NUMDIRS + 1) * NUMFILES))
5521 local cmd="$LFS find -stripe-index 0 -type f $dir"
5522 local nums=$($cmd | wc -l)
5524 [ $nums -eq $expected ] ||
5525 error "'$cmd' wrong: found $nums, expected $expected"
5528 cmd="$LFS find -stripe-index 1 -type f $dir"
5529 nums=$($cmd | wc -l)
5530 [ $nums -eq $expected ] ||
5531 error "'$cmd' wrong: found $nums, expected $expected"
5533 cmd="$LFS find ! -stripe-index 0 -type f $dir"
5534 nums=$($cmd | wc -l)
5535 [ $nums -eq $expected ] ||
5536 error "'$cmd' wrong: found $nums, expected $expected"
5539 # This should produce an error and not return any files
5540 cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir"
5541 nums=$($cmd 2>/dev/null | wc -l)
5542 [ $nums -eq $expected ] ||
5543 error "'$cmd' wrong: found $nums, expected $expected"
5545 if [[ $OSTCOUNT -gt 1 ]]; then
5546 expected=$(((NUMDIRS + 1) * NUMFILES + onestripe))
5547 cmd="$LFS find -stripe-index 0,1 -type f $dir"
5548 nums=$($cmd | wc -l)
5549 [ $nums -eq $expected ] ||
5550 error "'$cmd' wrong: found $nums, expected $expected"
5553 run_test 56u "check lfs find -stripe-index works"
5557 local dir=$DIR/$tdir
5559 setup_56 $dir $NUMFILES $NUMDIRS
5561 UUID=$(mdtuuid_from_index $mdt_idx $dir)
5562 [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $mdt_idx"
5564 for file in $($LFS find -m $UUID $dir); do
5565 file_midx=$($LFS getstripe -m $file)
5566 [ $file_midx -eq $mdt_idx ] ||
5567 error "lfs find -m $UUID != getstripe -m $file_midx"
5570 run_test 56v "check 'lfs find -m match with lfs getstripe -m'"
5573 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5574 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5576 local dir=$DIR/$tdir
5578 setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
5580 local stripe_size=$($LFS getstripe -S -d $dir) ||
5581 error "$LFS getstripe -S -d $dir failed"
5582 stripe_size=${stripe_size%% *}
5584 local file_size=$((stripe_size * OSTCOUNT))
5585 local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
5586 local required_space=$((file_num * file_size))
5587 local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
5589 [[ $free_space -le $((required_space / 1024)) ]] &&
5590 skip_env "need $required_space, have $free_space kbytes"
5593 local dd_count=$((file_size / dd_bs))
5595 # write data into the files
5600 for i in $(seq $NUMFILES); do
5602 yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5603 error "write data into $file failed"
5605 for i in $(seq $NUMDIRS); do
5606 for j in $(seq $NUMFILES); do
5607 file=$dir/dir$i/file$j
5608 yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5609 error "write data into $file failed"
5613 # $LFS_MIGRATE will fail if hard link migration is unsupported
5614 if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then
5615 createmany -l$dir/dir1/file1 $dir/dir1/link 200 ||
5616 error "creating links to $dir/dir1/file1 failed"
5621 [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
5624 local cmd="$LFS_MIGRATE -y -c $expected $dir/file1"
5627 eval $cmd || error "$cmd failed"
5629 check_stripe_count $dir/file1 $expected
5631 if [ $MDS1_VERSION -ge $(version_code 2.6.90) ];
5633 # lfs_migrate file onto OST 0 if it is on OST 1, or onto
5634 # OST 1 if it is on OST 0. This file is small enough to
5635 # be on only one stripe.
5636 file=$dir/migr_1_ost
5637 dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
5638 error "write data into $file failed"
5639 local obdidx=$($LFS getstripe -i $file)
5640 local oldmd5=$(md5sum $file)
5643 [[ $obdidx -eq 0 ]] && newobdidx=1
5644 cmd="$LFS migrate -i $newobdidx $file"
5646 eval $cmd || error "$cmd failed"
5648 local realobdix=$($LFS getstripe -i $file)
5649 local newmd5=$(md5sum $file)
5651 [[ $newobdidx -ne $realobdix ]] &&
5652 error "new OST is different (was=$obdidx, "\
5653 "wanted=$newobdidx, got=$realobdix)"
5654 [[ "$oldmd5" != "$newmd5" ]] &&
5655 error "md5sum differ: $oldmd5, $newmd5"
5659 cmd="$LFS_MIGRATE -y -c $expected $dir/dir1"
5661 eval $cmd || error "$cmd failed"
5663 for j in $(seq $NUMFILES); do
5664 check_stripe_count $dir/dir1/file$j $expected
5667 # lfs_migrate works with lfs find
5668 cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir |
5669 $LFS_MIGRATE -y -c $expected"
5671 eval $cmd || error "$cmd failed"
5673 for i in $(seq 2 $NUMFILES); do
5674 check_stripe_count $dir/file$i $expected
5676 for i in $(seq 2 $NUMDIRS); do
5677 for j in $(seq $NUMFILES); do
5678 check_stripe_count $dir/dir$i/file$j $expected
5682 run_test 56w "check lfs_migrate -c stripe_count works"
5685 local file1=$DIR/$tdir/file1
5686 local create_pool=false
5687 local initial_pool=$($LFS getstripe -p $DIR)
5691 echo -n "Creating test dir..."
5692 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5695 echo -n "Creating test file..."
5696 touch $file1 || error "cannot create file"
5699 echo -n "Detecting existing pools..."
5700 pool_list=($($LFS pool_list $FSNAME | grep "$FSNAME\." | cut -d. -f2))
5702 if [ ${#pool_list[@]} -gt 0 ]; then
5703 echo "${pool_list[@]}"
5704 for thispool in "${pool_list[@]}"; do
5705 if [[ -z "$initial_pool" ||
5706 "$initial_pool" != "$thispool" ]]; then
5708 echo "Using existing pool '$pool'"
5713 echo "none detected."
5715 if [ -z "$pool" ]; then
5716 pool=${POOL:-testpool}
5717 [ "$initial_pool" = "$pool" ] && pool="testpool2"
5718 echo -n "Creating pool '$pool'..."
5720 pool_add $pool &> /dev/null ||
5721 error "pool_add failed"
5724 echo -n "Adding target to pool..."
5725 pool_add_targets $pool 0 0 1 &> /dev/null ||
5726 error "pool_add_targets failed"
5730 echo -n "Setting pool using -p option..."
5731 $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null ||
5732 error "migrate failed rc = $?"
5735 echo -n "Verifying test file is in pool after migrating..."
5736 [ "$($LFS getstripe -p $file1)" = $pool ] ||
5737 error "file was not migrated to pool $pool"
5740 echo -n "Removing test file from pool '$pool'..."
5741 $LFS migrate $file1 &> /dev/null ||
5742 error "cannot remove from pool"
5743 [ "$($LFS getstripe -p $file1)" ] &&
5744 error "pool still set"
5747 echo -n "Setting pool using --pool option..."
5748 $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null ||
5749 error "migrate failed rc = $?"
5754 if $create_pool; then
5755 destroy_test_pools 2> /dev/null ||
5756 error "destroy test pools failed"
5759 run_test 56wb "check lfs_migrate pool support"
5762 local file1="$DIR/$tdir/file1"
5764 echo -n "Creating test dir..."
5765 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5766 local def_stripe_size=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
5767 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
5768 error "cannot set stripe"
5771 echo -n "Setting initial stripe for test file..."
5772 $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
5773 error "cannot set stripe"
5774 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
5775 error "stripe size not set"
5778 # File currently set to -S 512K -c 1
5780 # Ensure -c and -S options are rejected when -R is set
5781 echo -n "Verifying incompatible options are detected..."
5782 $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null &&
5783 error "incompatible -c and -R options not detected"
5784 $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null &&
5785 error "incompatible -S and -R options not detected"
5788 # Ensure unrecognized options are passed through to 'lfs migrate'
5789 echo -n "Verifying -S option is passed through to lfs migrate..."
5790 $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
5791 error "migration failed"
5792 [ $($LFS getstripe -S "$file1") -eq 1048576 ] ||
5793 error "file was not restriped"
5796 # File currently set to -S 1M -c 1
5798 # Ensure long options are supported
5799 echo -n "Verifying long options supported..."
5800 $LFS_MIGRATE -y --non-block "$file1" &> /dev/null ||
5801 error "long option without argument not supported"
5802 $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
5803 error "long option with argument not supported"
5804 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
5805 error "file not restriped with --stripe-size option"
5808 # File currently set to -S 512K -c 1
5810 if [ "$OSTCOUNT" -gt 1 ]; then
5811 echo -n "Verifying explicit stripe count can be set..."
5812 $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
5813 error "migrate failed"
5814 [ $($LFS getstripe -c "$file1") -eq 2 ] ||
5815 error "file not restriped to explicit count"
5819 # File currently set to -S 512K -c 1 or -S 512K -c 2
5821 # Ensure parent striping is used if -R is set, and no stripe
5822 # count or size is specified
5823 echo -n "Setting stripe for parent directory..."
5824 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
5825 error "cannot set stripe"
5828 echo -n "Verifying restripe option uses parent stripe settings..."
5829 $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
5830 error "migrate failed"
5831 [ $($LFS getstripe -S "$file1") -eq $def_stripe_size ] ||
5832 error "file not restriped to parent settings"
5833 [ $($LFS getstripe -c "$file1") -eq 1 ] ||
5834 error "file not restriped to parent settings"
5837 # File currently set to -S 1M -c 1
5839 # Ensure striping is preserved if -R is not set, and no stripe
5840 # count or size is specified
5841 echo -n "Verifying striping size preserved when not specified..."
5842 local orig_stripe_size=$($LFS getstripe -S "$file1" 2>/dev/null)
5843 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5844 error "cannot set stripe on parent directory"
5845 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5846 error "migrate failed"
5847 [ $($LFS getstripe -S "$file1") -eq $orig_stripe_size ] ||
5848 error "file was restriped"
5851 # Ensure file name properly detected when final option has no argument
5852 echo -n "Verifying file name properly detected..."
5853 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5854 error "file name interpreted as option argument"
5860 run_test 56wc "check unrecognized options for lfs_migrate are passed through"
5863 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5865 local file1=$DIR/$tdir/file1
5867 echo -n "Creating test dir..."
5868 test_mkdir $DIR/$tdir || error "cannot create dir"
5871 echo -n "Creating test file..."
5875 # Ensure 'lfs migrate' will fail by using a non-existent option,
5876 # and make sure rsync is not called to recover
5877 echo -n "Make sure --no-rsync option works..."
5878 $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 |
5879 grep -q 'refusing to fall back to rsync' ||
5880 error "rsync was called with --no-rsync set"
5883 # Ensure rsync is called without trying 'lfs migrate' first
5884 echo -n "Make sure --rsync option works..."
5885 $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 |
5886 grep -q 'falling back to rsync' &&
5887 error "lfs migrate was called with --rsync set"
5890 echo -n "Make sure --rsync and --no-rsync options are exclusive..."
5891 $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 |
5892 grep -q 'at the same time' ||
5893 error "--rsync and --no-rsync accepted concurrently"
5899 run_test 56wd "check lfs_migrate --rsync and --no-rsync work"
5902 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5903 check_swap_layouts_support
5905 local dir=$DIR/$tdir
5906 local ref1=/etc/passwd
5907 local file1=$dir/file1
5909 test_mkdir $dir || error "creating dir $dir"
5910 $LFS setstripe -c 2 $file1
5912 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
5913 stripe=$($LFS getstripe -c $file1)
5914 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
5915 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
5920 run_test 56x "lfs migration support"
5923 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5924 check_swap_layouts_support
5926 local dir=$DIR/$tdir/$testnum
5930 local ref1=/etc/passwd
5931 local file1=$dir/file1
5933 $LFS setstripe -c 2 $file1
5935 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
5937 local stripe=$($LFS getstripe -c $file1)
5939 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
5940 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
5945 run_test 56xa "lfs migration --block support"
5947 check_migrate_links() {
5949 local file1="$dir/file1"
5952 local total_count=$(($begin + $count - 1))
5953 local symlink_count=10
5956 if [ ! -f "$file1" ]; then
5957 echo -n "creating initial file..."
5958 $LFS setstripe -c 1 -S "512k" "$file1" ||
5959 error "cannot setstripe initial file"
5962 echo -n "creating symlinks..."
5963 for s in $(seq 1 $symlink_count); do
5964 ln -s "$file1" "$dir/slink$s" ||
5965 error "cannot create symlinks"
5969 echo -n "creating nonlinked files..."
5970 createmany -o "$dir/uniq" 1 10 &> /dev/null ||
5971 error "cannot create nonlinked files"
5976 if [ ! -f "$dir/file$total_count" ]; then
5977 echo -n "creating hard links $begin:$total_count..."
5978 createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
5979 /dev/null || error "cannot create hard links"
5983 echo -n "checking number of hard links listed in xattrs..."
5984 local fid=$($LFS getstripe -F "$file1")
5985 local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
5988 if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
5989 skip "hard link list has unexpected size, skipping test"
5991 if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
5992 error "link names should exceed xattrs size"
5995 echo -n "migrating files..."
5996 local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir)
5998 [ $rc -eq 0 ] || error "migrate failed rc = $rc"
6001 # make sure all links have been properly migrated
6002 echo -n "verifying files..."
6003 fid=$($LFS getstripe -F "$file1") ||
6004 error "cannot get fid for file $file1"
6005 for i in $(seq 2 $total_count); do
6006 local fid2=$($LFS getstripe -F $dir/file$i)
6008 [ "$fid2" == "$fid" ] ||
6009 error "migrated hard link has mismatched FID"
6012 # make sure hard links were properly detected, and migration was
6013 # performed only once for the entire link set; nonlinked files should
6015 local actual=$(grep -c 'done migrate' <<< "$migrate_out")
6016 local expected=$(($uniq_count + 1))
6018 [ "$actual" -eq "$expected" ] ||
6019 error "hard links individually migrated ($actual != $expected)"
6021 # make sure the correct number of hard links are present
6022 local hardlinks=$(stat -c '%h' "$file1")
6024 [ $hardlinks -eq $total_count ] ||
6025 error "num hard links $hardlinks != $total_count"
6032 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
6033 skip "Need MDS version at least 2.10.55"
6035 local dir="$DIR/$tdir"
6037 test_mkdir "$dir" || error "cannot create dir $dir"
6039 echo "testing lfs migrate mode when all links fit within xattrs"
6040 LFS_MIGRATE_RSYNC=false check_migrate_links "$dir" 2 99
6042 echo "testing rsync mode when all links fit within xattrs"
6043 LFS_MIGRATE_RSYNC=true check_migrate_links "$dir" 2 99
6045 echo "testing lfs migrate mode when all links do not fit within xattrs"
6046 LFS_MIGRATE_RSYNC=false check_migrate_links "$dir" 101 100
6048 echo "testing rsync mode when all links do not fit within xattrs"
6049 LFS_MIGRATE_RSYNC=true check_migrate_links "$dir" 101 100
6054 run_test 56xb "lfs migration hard link support"
6057 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
6058 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
6061 local dir=$DIR/$tdir
6065 test_mkdir -p $dir || error "creating dir $dir"
6066 touch $f1 || error "creating std file $f1"
6067 $MULTIOP $f2 H2c || error "creating released file $f2"
6069 # a directory can be raid0, so ask only for files
6070 res=$($LFS find $dir -L raid0 -type f | wc -l)
6071 [[ $res == 2 ]] || error "search raid0: found $res files != 2"
6073 res=$($LFS find $dir \! -L raid0 -type f | wc -l)
6074 [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
6076 # only files can be released, so no need to force file search
6077 res=$($LFS find $dir -L released)
6078 [[ $res == $f2 ]] || error "search released: found $res != $f2"
6080 res=$($LFS find $dir -type f \! -L released)
6081 [[ $res == $f1 ]] || error "search !released: found $res != $f1"
6083 run_test 56y "lfs find -L raid0|released"
6085 test_56z() { # LU-4824
6086 # This checks to make sure 'lfs find' continues after errors
6087 # There are two classes of errors that should be caught:
6088 # - If multiple paths are provided, all should be searched even if one
6090 # - If errors are encountered during the search, it should not terminate
6092 local dir=$DIR/$tdir
6096 for i in d{0..9}; do
6099 touch $dir/d{0..9}/$tfile
6100 $LFS find $DIR/non_existent_dir $dir &&
6101 error "$LFS find did not return an error"
6102 # Make a directory unsearchable. This should NOT be the last entry in
6103 # directory order. Arbitrarily pick the 6th entry
6104 chmod 700 $($LFS find $dir -type d | sed '6!d')
6106 local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l)
6108 # The user should be able to see 10 directories and 9 files
6109 [ $count == 19 ] || error "$LFS find did not continue after error"
6111 run_test 56z "lfs find should continue after an error"
6113 test_56aa() { # LU-5937
6114 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
6116 local dir=$DIR/$tdir
6119 $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
6121 createmany -o $dir/striped_dir/${tfile}- 1024
6122 local dirs=$($LFS find --size +8k $dir/)
6124 [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
6126 run_test 56aa "lfs find --size under striped dir"
6128 test_56ab() { # LU-10705
6129 test_mkdir $DIR/$tdir
6130 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
6131 dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
6132 dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
6133 # Flush writes to ensure valid blocks. Need to be more thorough for
6134 # ZFS, since blocks are not allocated/returned to client immediately.
6136 wait_zfs_commit ost1 2
6137 cancel_lru_locks osc
6140 local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
6142 [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
6144 files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
6145 [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
6147 rm -f $DIR/$tdir/$tfile.[123]
6149 run_test 56ab "lfs find --blocks"
6152 [ $MDS1_VERSION -lt $(version_code 2.10.50) ] &&
6153 skip "Need MDS version at least 2.10.50"
6155 # Create composite files with one component
6156 local dir=$DIR/$tdir
6158 setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
6159 # Create composite files with three components
6160 setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
6161 # Create non-composite files
6162 createmany -o $dir/${tfile}- 10
6164 local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l)
6166 [[ $nfiles == 10 ]] ||
6167 error "lfs find -E 1M found $nfiles != 10 files"
6169 nfiles=$($LFS find ! -E 1M --type f $dir | wc -l)
6170 [[ $nfiles == 25 ]] ||
6171 error "lfs find ! -E 1M found $nfiles != 25 files"
6173 # All files have a component that starts at 0
6174 nfiles=$($LFS find --component-start 0 --type f $dir | wc -l)
6175 [[ $nfiles == 35 ]] ||
6176 error "lfs find --component-start 0 - $nfiles != 35 files"
6178 nfiles=$($LFS find --component-start 2M --type f $dir | wc -l)
6179 [[ $nfiles == 15 ]] ||
6180 error "lfs find --component-start 2M - $nfiles != 15 files"
6182 # All files created here have a componenet that does not starts at 2M
6183 nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l)
6184 [[ $nfiles == 35 ]] ||
6185 error "lfs find ! --component-start 2M - $nfiles != 35 files"
6187 # Find files with a specified number of components
6188 local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l)
6189 [[ $nfiles == 15 ]] ||
6190 error "lfs find --component-count 3 - $nfiles != 15 files"
6192 # Remember non-composite files have a component count of zero
6193 local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l)
6194 [[ $nfiles == 10 ]] ||
6195 error "lfs find --component-count 0 - $nfiles != 10 files"
6197 nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l)
6198 [[ $nfiles == 20 ]] ||
6199 error "lfs find ! --component-count 3 - $nfiles != 20 files"
6201 # All files have a flag called "init"
6202 local nfiles=$($LFS find --component-flags init --type f $dir | wc -l)
6203 [[ $nfiles == 35 ]] ||
6204 error "lfs find --component-flags init - $nfiles != 35 files"
6206 # Multi-component files will have a component not initialized
6207 local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l)
6208 [[ $nfiles == 15 ]] ||
6209 error "lfs find !--component-flags init - $nfiles != 15 files"
6214 run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
6217 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
6218 skip "Need MDS version at least 2.10.57"
6228 # create mirrored directories and mirrored files
6229 mkdir $td || error "mkdir $td failed"
6230 $LFS mirror create -N3 $td || error "create mirrored dir $td failed"
6231 createmany -o $tf- 10 || error "create $tf- failed"
6233 for i in $(seq 2); do
6235 mkdir $dir || error "mkdir $dir failed"
6236 $LFS mirror create -N$((3 + i)) $dir ||
6237 error "create mirrored dir $dir failed"
6238 createmany -o $dir/$tfile- 10 ||
6239 error "create $dir/$tfile- failed"
6242 # change the states of some mirrored files
6244 for i in $(seq 2); do
6246 for j in $(seq 4 9); do
6247 echo foo > $dir/$tfile-$j
6251 # find mirrored files with specific mirror count
6252 cmd="$LFS find --mirror-count 3 --type f $td"
6253 nfiles=$($cmd | wc -l)
6254 [[ $nfiles = 10 ]] || error "$cmd: $nfiles != 10 files"
6256 cmd="$LFS find ! --mirror-count 3 --type f $td"
6257 nfiles=$($cmd | wc -l)
6258 [[ $nfiles = 20 ]] || error "$cmd: $nfiles != 20 files"
6260 cmd="$LFS find --mirror-count +2 --type f $td"
6261 nfiles=$($cmd | wc -l)
6262 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6264 cmd="$LFS find --mirror-count -6 --type f $td"
6265 nfiles=$($cmd | wc -l)
6266 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6268 # find mirrored files with specific file state
6269 cmd="$LFS find --maxdepth 1 --mirror-state=^ro --type f $td"
6270 [[ $($cmd) = $tf-6 ]] || error "$cmd: didn't return $tf-6"
6272 cmd="$LFS find --mirror-state=ro --type f $td"
6273 nfiles=$($cmd | wc -l)
6274 [[ $nfiles = 17 ]] || error "$cmd: $nfiles != 17 files"
6276 cmd="$LFS find ! --mirror-state=ro --type f $td"
6277 nfiles=$($cmd | wc -l)
6278 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6280 cmd="$LFS find --mirror-state=wp --type f $td"
6281 nfiles=$($cmd | wc -l)
6282 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6284 cmd="$LFS find ! --mirror-state=sp --type f $td"
6285 nfiles=$($cmd | wc -l)
6286 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6288 run_test 56ca "check lfs find --mirror-count|-N and --mirror-state"
6291 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6292 # note test will not do anything if MDS is not local
6293 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6294 skip_env "ldiskfs only test"
6296 remote_mds_nodsh && skip "remote MDS with nodsh"
6298 local MNTDEV="osd*.*MDT*.mntdev"
6299 DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV)
6300 [ -z "$DEV" ] && error "can't access $MNTDEV"
6301 for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
6302 do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
6303 error "can't access $DEV"
6304 DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
6305 [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
6309 run_test 57a "verify MDS filesystem created with large inodes =="
6312 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6313 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6314 skip_env "ldiskfs only test"
6316 remote_mds_nodsh && skip "remote MDS with nodsh"
6318 local dir=$DIR/$tdir
6321 local fileN=$dir/f$filecount
6323 rm -rf $dir || error "removing $dir"
6325 local mdtidx=$($LFS getstripe -m $dir)
6326 local mdtname=MDT$(printf %04x $mdtidx)
6327 local facet=mds$((mdtidx + 1))
6329 echo "mcreating $filecount files"
6330 createmany -m $dir/f 1 $filecount || error "creating files in $dir"
6332 # verify that files do not have EAs yet
6333 $LFS getstripe $file1 2>&1 | grep -q "no stripe" ||
6334 error "$file1 has an EA"
6335 $LFS getstripe $fileN 2>&1 | grep -q "no stripe" ||
6336 error "$fileN has an EA"
6340 df $dir #make sure we get new statfs data
6341 local mdsfree=$(do_facet $facet \
6342 lctl get_param -n osd*.*$mdtname.kbytesfree)
6343 local mdcfree=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6346 echo "opening files to create objects/EAs"
6347 for file in $(seq -f $dir/f%g 1 $filecount); do
6348 $OPENFILE -f O_RDWR $file > /dev/null 2>&1 ||
6349 error "opening $file"
6352 # verify that files have EAs now
6353 $LFS getstripe $file1 | grep -q "obdidx" || error "$file1 missing EA"
6354 $LFS getstripe $fileN | grep -q "obdidx" || error "$fileN missing EA"
6356 sleep 1 #make sure we get new statfs data
6358 local mdsfree2=$(do_facet $facet \
6359 lctl get_param -n osd*.*$mdtname.kbytesfree)
6360 local mdcfree2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6362 if [[ $mdcfree2 -lt $((mdcfree - 16)) ]]; then
6363 if [ "$mdsfree" != "$mdsfree2" ]; then
6364 error "MDC before $mdcfree != after $mdcfree2"
6366 echo "MDC before $mdcfree != after $mdcfree2"
6367 echo "unable to confirm if MDS has large inodes"
6372 run_test 57b "default LOV EAs are stored inside large inodes ==="
6375 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6376 [ -z "$(which wiretest 2>/dev/null)" ] &&
6377 skip_env "could not find wiretest"
6381 run_test 58 "verify cross-platform wire constants =============="
6384 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6386 echo "touch 130 files"
6387 createmany -o $DIR/f59- 130
6389 unlinkmany $DIR/f59- 130
6391 # wait for commitment of removal
6392 wait_delete_completed
6394 run_test 59 "verify cancellation of llog records async ========="
6396 TEST60_HEAD="test_60 run $RANDOM"
6398 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6399 remote_mgs_nodsh && skip "remote MGS with nodsh"
6400 do_facet mgs "! which run-llog.sh &> /dev/null" &&
6401 do_facet mgs "! ls run-llog.sh &> /dev/null" &&
6402 skip_env "missing subtest run-llog.sh"
6404 log "$TEST60_HEAD - from kernel mode"
6405 do_facet mgs "$LCTL dk > /dev/null"
6406 do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed"
6407 do_facet mgs $LCTL dk > $TMP/$tfile
6409 # LU-6388: test llog_reader
6410 local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
6411 llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
6412 [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
6413 skip_env "missing llog_reader"
6414 local fstype=$(facet_fstype mgs)
6415 [ $fstype != ldiskfs -a $fstype != zfs ] &&
6416 skip_env "Only for ldiskfs or zfs type mgs"
6418 local mntpt=$(facet_mntpt mgs)
6419 local mgsdev=$(mgsdevname 1)
6431 #get fid and record list
6432 fid_list=($(awk '/9_sub.*record/ { print $NF }' /$TMP/$tfile |
6434 rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' /$TMP/$tfile |
6436 #remount mgs as ldiskfs or zfs type
6437 stop mgs || error "stop mgs failed"
6438 mount_fstype mgs || error "remount mgs failed"
6439 for ((i = 0; i < ${#fid_list[@]}; i++)); do
6442 seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
6443 oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
6448 obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
6450 obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
6452 echo "obj_file is $obj_file"
6453 do_facet mgs $llog_reader $obj_file
6455 rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
6456 awk '{ print $3 }' | sed -e "s/^type=//g")
6457 if [ $rec_type != $rec ]; then
6458 echo "FAILED test_60a wrong record type $rec_type," \
6464 #check obj path if record type is LLOG_LOGID_MAGIC
6465 if [ "$rec" == "1064553b" ]; then
6466 path=$(do_facet mgs $llog_reader $obj_file |
6467 grep "path=" | awk '{ print $NF }' |
6468 sed -e "s/^path=//g")
6469 if [ $obj_file != $mntpt/$path ]; then
6470 echo "FAILED test_60a wrong obj path" \
6471 "$montpt/$path, should be $obj_file"
6478 #restart mgs before "error", otherwise it will block the next test
6479 stop mgs || error "stop mgs failed"
6480 start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
6481 $pass || error "test failed, see FAILED test_60a messages for specifics"
6483 run_test 60a "llog_test run from kernel module and test llog_reader"
6485 test_60b() { # bug 6411
6486 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6489 LLOG_COUNT=$(do_facet mgs dmesg |
6490 awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
6491 /llog_[a-z]*.c:[0-9]/ {
6503 [[ $LLOG_COUNT -gt 120 ]] &&
6504 error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
6506 run_test 60b "limit repeated messages from CERROR/CWARN"
6509 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6511 echo "create 5000 files"
6512 createmany -o $DIR/f60c- 5000
6513 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137
6514 lctl set_param fail_loc=0x80000137
6515 unlinkmany $DIR/f60c- 5000
6516 lctl set_param fail_loc=0
6518 run_test 60c "unlink file when mds full"
6521 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6523 SAVEPRINTK=$(lctl get_param -n printk)
6524 # verify "lctl mark" is even working"
6525 MESSAGE="test message ID $RANDOM $$"
6526 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6527 dmesg | grep -q "$MESSAGE" || error "didn't find debug marker in log"
6529 lctl set_param printk=0 || error "set lnet.printk failed"
6530 lctl get_param -n printk | grep emerg || error "lnet.printk dropped emerg"
6531 MESSAGE="new test message ID $RANDOM $$"
6532 # Assume here that libcfs_debug_mark_buffer() uses D_WARNING
6533 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6534 dmesg | grep -q "$MESSAGE" && error "D_WARNING wasn't masked" || true
6536 lctl set_param -n printk="$SAVEPRINTK"
6538 run_test 60d "test printk console message masking"
6541 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6542 remote_mds_nodsh && skip "remote MDS with nodsh"
6545 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
6546 do_facet mds1 lctl set_param fail_loc=0x15b
6549 run_test 60e "no space while new llog is being created"
6554 test_mkdir -c $MDSCOUNT $DIR/$tdir
6555 $LFS setdirstripe -D -i -1 -c $MDSCOUNT $DIR/$tdir
6560 mkdir $DIR/$tdir/subdir$index 2>/dev/null
6561 rmdir $DIR/$tdir/subdir$index 2>/dev/null
6562 index=$((index + 1))
6568 for i in $(seq 100); do
6569 # define OBD_FAIL_OSD_TXN_START 0x19a
6570 do_facet mds1 lctl set_param fail_loc=0x8000019a
6576 mkdir $DIR/$tdir/new || error "mkdir failed"
6577 rmdir $DIR/$tdir/new || error "rmdir failed"
6579 run_test 60g "transaction abort won't cause MDT hung"
6582 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6585 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1 || error "dd $f failed"
6586 cancel_lru_locks osc
6587 $MULTIOP $f OSMWUc || error "$MULTIOP $f failed"
6590 run_test 61a "mmap() writes don't make sync hang ================"
6593 mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
6595 run_test 61b "mmap() of unstriped file is successful"
6597 # bug 2330 - insufficient obd_match error checking causes LBUG
6599 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6603 cancel_lru_locks osc
6604 lctl set_param fail_loc=0x405
6605 cat $f && error "cat succeeded, expect -EIO"
6606 lctl set_param fail_loc=0
6608 # This test is now irrelevant (as of bug 10718 inclusion), we no longer
6609 # match every page all of the time.
6610 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
6612 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
6613 # Though this test is irrelevant anymore, it helped to reveal some
6614 # other grant bugs (LU-4482), let's keep it.
6615 test_63a() { # was test_63
6616 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6618 MAX_DIRTY_MB=$(lctl get_param -n osc.*.max_dirty_mb | head -n 1)
6620 for i in `seq 10` ; do
6621 dd if=/dev/zero of=$DIR/f63 bs=8k &
6627 rm -f $DIR/f63 || true
6629 run_test 63a "Verify oig_wait interruption does not crash ======="
6631 # bug 2248 - async write errors didn't return to application on sync
6632 # bug 3677 - async write errors left page locked
6634 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6637 lctl set_param debug=-1
6639 # ensure we have a grant to do async writes
6640 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
6643 sync # sync lest earlier test intercept the fail_loc
6645 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
6646 lctl set_param fail_loc=0x80000406
6647 $MULTIOP $DIR/$tfile Owy && \
6648 error "sync didn't return ENOMEM"
6649 sync; sleep 2; sync # do a real sync this time to flush page
6650 lctl get_param -n llite.*.dump_page_cache | grep locked && \
6651 error "locked page left in cache after async error" || true
6654 run_test 63b "async write errors should be returned to fsync ==="
6657 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6660 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
6662 run_test 64a "verify filter grant calculations (in kernel) ====="
6665 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6667 sh oos.sh $MOUNT || error "oos.sh failed: $?"
6669 run_test 64b "check out-of-space detection on client"
6672 $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
6674 run_test 64c "verify grant shrink"
6676 # this does exactly what osc_request.c:osc_announce_cached() does in
6677 # order to calculate max amount of grants to ask from server
6681 local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc)
6682 local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight)
6684 ((rpc_in_flight ++));
6685 nrpages=$((nrpages * rpc_in_flight))
6687 local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb)
6689 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
6691 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
6692 local undirty=$((nrpages * PAGE_SIZE))
6694 local max_extent_pages
6695 max_extent_pages=$($LCTL get_param osc.${tgt}.import |
6696 grep grant_max_extent_size | awk '{print $2}')
6697 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
6698 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
6699 local grant_extent_tax
6700 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
6701 grep grant_extent_tax | awk '{print $2}')
6703 undirty=$((undirty + nrextents * grant_extent_tax))
6708 # this is size of unit for grant allocation. It should be equal to
6709 # what tgt_grant.c:tgt_grant_chunk() calculates
6713 local grant_extent_tax
6715 max_brw_size=$($LCTL get_param osc.${tgt}.import |
6716 grep max_brw_size | awk '{print $2}')
6718 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
6719 grep grant_extent_tax | awk '{print $2}')
6721 echo $(((max_brw_size + grant_extent_tax) * 2))
6725 [ $OST1_VERSION -lt $(version_code 2.10.56) ] &&
6726 skip "OST < 2.10.55 doesn't limit grants enough"
6728 local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}')
6729 local file=$DIR/$tfile
6731 [[ $($LCTL get_param osc.${tgt}.import |
6732 grep "connect_flags:.*grant_param") ]] ||
6733 skip "no grant_param connect flag"
6735 local olddebug=$($LCTL get_param -n debug 2> /dev/null)
6737 $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true
6739 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
6740 stack_trap "rm -f $file" EXIT
6742 $SETSTRIPE $file -i 0 -c 1
6743 dd if=/dev/zero of=$file bs=1M count=1000 &
6748 local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes)
6749 if [[ $cur_grant -gt $max_cur_granted ]]
6752 error "cur_grant $cur_grant > $max_cur_granted"
6755 [[ $? -ne 0 ]] && break;
6760 wait_delete_completed
6761 $LCTL set_param debug="$olddebug" 2> /dev/null || true
6763 run_test 64d "check grant limit exceed"
6765 # bug 1414 - set/get directories' stripe info
6767 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6769 test_mkdir $DIR/$tdir
6771 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
6773 run_test 65a "directory with no stripe info"
6776 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6778 test_mkdir $DIR/$tdir
6779 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
6781 $SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
6784 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
6786 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
6789 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6790 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
6792 test_mkdir $DIR/$tdir
6793 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
6795 $LFS setstripe -S $((stripesize * 4)) -i 1 \
6796 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
6798 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
6800 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
6803 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6805 test_mkdir $DIR/$tdir
6806 local STRIPECOUNT=$($GETSTRIPE -c $DIR/$tdir)
6807 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
6809 if [[ $STRIPECOUNT -le 0 ]]; then
6811 elif [[ $STRIPECOUNT -gt 2000 ]]; then
6812 #LOV_MAX_STRIPE_COUNT is 2000
6813 [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1))
6815 sc=$(($STRIPECOUNT - 1))
6817 $SETSTRIPE -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
6818 touch $DIR/$tdir/f4 $DIR/$tdir/f5
6819 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
6820 error "lverify failed"
6822 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
6825 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6827 test_mkdir $DIR/$tdir
6829 $SETSTRIPE $DIR/$tdir || error "setstripe"
6830 $GETSTRIPE -v $DIR/$tdir | grep "Default" ||
6831 error "no stripe info failed"
6833 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
6835 run_test 65e "directory setstripe defaults"
6838 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6840 test_mkdir $DIR/${tdir}f
6841 $RUNAS $SETSTRIPE $DIR/${tdir}f && error "setstripe succeeded" || true
6843 run_test 65f "dir setstripe permission (should return error) ==="
6846 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6848 test_mkdir $DIR/$tdir
6849 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
6851 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
6852 error "setstripe -S failed"
6853 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
6854 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
6855 error "delete default stripe failed"
6857 run_test 65g "directory setstripe -d"
6860 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6862 test_mkdir $DIR/$tdir
6863 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
6865 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
6866 error "setstripe -S failed"
6867 test_mkdir $DIR/$tdir/dd1
6868 [ $($LFS getstripe -c $DIR/$tdir) = $($GETSTRIPE -c $DIR/$tdir/dd1) ] ||
6869 error "stripe info inherit failed"
6871 run_test 65h "directory stripe info inherit ===================="
6874 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6876 save_layout_restore_at_exit $MOUNT
6878 # bug6367: set non-default striping on root directory
6879 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
6881 # bug12836: getstripe on -1 default directory striping
6882 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
6884 # bug12836: getstripe -v on -1 default directory striping
6885 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
6887 # bug12836: new find on -1 default directory striping
6888 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
6890 run_test 65i "various tests to set root directory striping"
6892 test_65j() { # bug6367
6893 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6897 # if we aren't already remounting for each test, do so for this test
6898 if [ "$CLEANUP" = ":" -a "$I_MOUNTED" = "yes" ]; then
6899 cleanup || error "failed to unmount"
6903 save_layout_restore_at_exit $MOUNT
6905 $SETSTRIPE -d $MOUNT || error "setstripe failed"
6907 run_test 65j "set default striping on root directory (bug 6367)="
6911 wait_delete_completed
6912 do_facet $SINGLEMDS "lctl set_param -n \
6913 osp.$ost*MDT0000.max_create_count=$max_count"
6914 do_facet $SINGLEMDS "lctl set_param -n \
6915 osp.$ost*MDT0000.create_count=$count"
6916 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
6917 echo $INACTIVE_OSC "is Activate"
6919 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
6922 test_65k() { # bug11679
6923 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6924 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6925 remote_mds_nodsh && skip "remote MDS with nodsh"
6927 local disable_precreate=true
6928 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
6929 disable_precreate=false
6931 echo "Check OST status: "
6932 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
6933 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
6935 for OSC in $MDS_OSCS; do
6936 echo $OSC "is active"
6937 do_facet $SINGLEMDS lctl --device %$OSC activate
6940 for INACTIVE_OSC in $MDS_OSCS; do
6941 local ost=$(osc_to_ost $INACTIVE_OSC)
6942 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
6943 lov.*md*.target_obd |
6944 awk -F: /$ost/'{ print $1 }' | head -n 1)
6947 $SETSTRIPE -i $ostnum -c 1 $DIR/$tdir
6948 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
6950 echo "Deactivate: " $INACTIVE_OSC
6951 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
6953 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
6954 osp.$ost*MDT0000.create_count")
6955 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
6956 osp.$ost*MDT0000.max_create_count")
6957 $disable_precreate &&
6958 do_facet $SINGLEMDS "lctl set_param -n \
6959 osp.$ost*MDT0000.max_create_count=0"
6961 for idx in $(seq 0 $((OSTCOUNT - 1))); do
6962 [ -f $DIR/$tdir/$idx ] && continue
6963 echo "$SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx"
6964 $SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx ||
6966 error "setstripe $idx should succeed"; }
6967 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
6969 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
6972 do_facet $SINGLEMDS "lctl set_param -n \
6973 osp.$ost*MDT0000.max_create_count=$max_count"
6974 do_facet $SINGLEMDS "lctl set_param -n \
6975 osp.$ost*MDT0000.create_count=$count"
6976 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
6977 echo $INACTIVE_OSC "is Activate"
6979 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
6982 run_test 65k "validate manual striping works properly with deactivated OSCs"
6984 test_65l() { # bug 12836
6985 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6987 test_mkdir -p $DIR/$tdir/test_dir
6988 $SETSTRIPE -c -1 $DIR/$tdir/test_dir
6989 $LFS find -mtime -1 $DIR/$tdir >/dev/null
6991 run_test 65l "lfs find on -1 stripe dir ========================"
6994 local layout=$(save_layout $MOUNT)
6995 $RUNAS $SETSTRIPE -c 2 $MOUNT && {
6996 restore_layout $MOUNT $layout
6997 error "setstripe should fail by non-root users"
7001 run_test 65m "normal user can't set filesystem default stripe"
7004 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.0) ]] ||
7005 skip "Need MDS version at least 2.12.0"
7006 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7008 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7009 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7010 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7012 local root_layout=$(save_layout $MOUNT)
7013 stack_trap "restore_layout $MOUNT $root_layout" EXIT
7015 # new subdirectory under root directory should not inherit
7016 # the default layout from root
7017 local dir1=$MOUNT/$tdir-1
7018 mkdir $dir1 || error "mkdir $dir1 failed"
7019 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7020 error "$dir1 shouldn't have LOV EA"
7022 # delete the default layout on root directory
7023 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7025 local dir2=$MOUNT/$tdir-2
7026 mkdir $dir2 || error "mkdir $dir2 failed"
7027 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7028 error "$dir2 shouldn't have LOV EA"
7030 # set a new striping pattern on root directory
7031 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7032 local new_def_stripe_size=$((def_stripe_size * 2))
7033 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7034 error "set stripe size on $MOUNT failed"
7036 # new file created in $dir2 should inherit the new stripe size from
7037 # the filesystem default
7038 local file2=$dir2/$tfile-2
7039 touch $file2 || error "touch $file2 failed"
7041 local file2_stripe_size=$($LFS getstripe -S $file2)
7042 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7043 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7045 local dir3=$MOUNT/$tdir-3
7046 mkdir $dir3 || error "mkdir $dir3 failed"
7047 ! getfattr -n trusted.lov $dir3 &> /dev/null ||
7048 error "$dir3 shouldn't have LOV EA"
7050 # set OST pool on root directory
7051 local pool=$TESTNAME
7052 pool_add $pool || error "add $pool failed"
7053 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7054 error "add targets to $pool failed"
7056 $LFS setstripe -p $pool $MOUNT ||
7057 error "set OST pool on $MOUNT failed"
7059 # new file created in $dir3 should inherit the pool from
7060 # the filesystem default
7061 local file3=$dir3/$tfile-3
7062 touch $file3 || error "touch $file3 failed"
7064 local file3_pool=$($LFS getstripe -p $file3)
7065 [[ "$file3_pool" = "$pool" ]] ||
7066 error "$file3 didn't inherit OST pool $pool"
7068 local dir4=$MOUNT/$tdir-4
7069 mkdir $dir4 || error "mkdir $dir4 failed"
7070 ! getfattr -n trusted.lov $dir4 &> /dev/null ||
7071 error "$dir4 shouldn't have LOV EA"
7073 # new file created in $dir4 should inherit the pool from
7074 # the filesystem default
7075 local file4=$dir4/$tfile-4
7076 touch $file4 || error "touch $file4 failed"
7078 local file4_pool=$($LFS getstripe -p $file4)
7079 [[ "$file4_pool" = "$pool" ]] ||
7080 error "$file4 didn't inherit OST pool $pool"
7082 # new subdirectory under non-root directory should inherit
7083 # the default layout from its parent directory
7084 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7085 error "set directory layout on $dir4 failed"
7087 local dir5=$dir4/$tdir-5
7088 mkdir $dir5 || error "mkdir $dir5 failed"
7090 local dir4_layout=$(get_layout_param $dir4)
7091 local dir5_layout=$(get_layout_param $dir5)
7092 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7093 error "$dir5 should inherit the default layout from $dir4"
7095 # though subdir under ROOT doesn't inherit default layout, but
7096 # its sub dir/file should be created with default layout.
7097 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
7098 [[ $MDS1_VERSION -ge $(version_code 2.12.59) ]] ||
7099 [[ $MDS1_VERSION -ge $(version_code 2.12.3) &&
7100 $MDS1_VERSION -lt $(version_code 2.12.50) ]] ||
7101 skip "Need MDS version at least 2.12.3 or 2.12.59"
7103 local default_lmv_count=$($LFS getdirstripe -D -c $MOUNT)
7104 local default_lmv_index=$($LFS getdirstripe -D -i $MOUNT)
7105 local default_lmv_hash=$($LFS getdirstripe -D -H $MOUNT)
7107 if [ $default_lmv_hash == "none" ]; then
7108 stack_trap "$LFS setdirstripe -D -d $MOUNT" EXIT
7110 stack_trap "$LFS setdirstripe -D -i $default_lmv_index \
7111 -c $default_lmv_count -H $default_lmv_hash $MOUNT" EXIT
7114 $LFS setdirstripe -D -c 2 $MOUNT ||
7115 error "setdirstripe -D -c 2 failed"
7116 mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed"
7117 local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6)
7118 [ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count"
7120 run_test 65n "don't inherit default layout from root for new subdirectories"
7122 # bug 2543 - update blocks count on client
7124 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7127 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7128 sync; sync_all_data; sync; sync_all_data
7129 cancel_lru_locks osc
7130 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7131 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7133 run_test 66 "update inode blocks count on client ==============="
7136 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7140 swapon -s | awk '($1 == "'$1'") { print $4 }'
7143 # bug5265, obdfilter oa2dentry return -ENOENT
7144 # #define OBD_FAIL_SRV_ENOENT 0x217
7146 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7147 remote_ost_nodsh && skip "remote OST with nodsh"
7150 $SETSTRIPE -c 1 -i 0 $f
7152 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
7154 do_facet ost1 lctl set_param fail_loc=0x217
7155 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
7156 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
7158 do_facet ost1 lctl set_param fail_loc=0
7159 $DIRECTIO write $f 0 2 || error "write error"
7161 cancel_lru_locks osc
7162 $DIRECTIO read $f 0 1 || error "read error"
7164 do_facet ost1 lctl set_param fail_loc=0x217
7165 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
7167 do_facet ost1 lctl set_param fail_loc=0
7170 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
7173 test_mkdir $DIR/$tdir
7174 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
7175 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
7177 run_test 71 "Running dbench on lustre (don't segment fault) ===="
7179 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
7180 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7181 [ "$RUNAS_ID" = "$UID" ] &&
7182 skip_env "RUNAS_ID = UID = $UID -- skipping"
7183 # Check that testing environment is properly set up. Skip if not
7184 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
7185 skip_env "User $RUNAS_ID does not exist - skipping"
7188 chmod 777 $DIR/$tfile
7189 chmod ug+s $DIR/$tfile
7190 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
7191 error "$RUNAS dd $DIR/$tfile failed"
7192 # See if we are still setuid/sgid
7193 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7194 error "S/gid is not dropped on write"
7195 # Now test that MDS is updated too
7196 cancel_lru_locks mdc
7197 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7198 error "S/gid is not dropped on MDS"
7201 run_test 72a "Test that remove suid works properly (bug5695) ===="
7203 test_72b() { # bug 24226 -- keep mode setting when size is not changing
7206 [ "$RUNAS_ID" = "$UID" ] &&
7207 skip_env "RUNAS_ID = UID = $UID -- skipping"
7208 [ "$RUNAS_ID" -eq 0 ] &&
7209 skip_env "RUNAS_ID = 0 -- skipping"
7210 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7211 # Check that testing environment is properly set up. Skip if not
7212 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
7213 skip_env "User $RUNAS_ID does not exist - skipping"
7215 touch $DIR/${tfile}-f{g,u}
7216 test_mkdir $DIR/${tfile}-dg
7217 test_mkdir $DIR/${tfile}-du
7218 chmod 770 $DIR/${tfile}-{f,d}{g,u}
7219 chmod g+s $DIR/${tfile}-{f,d}g
7220 chmod u+s $DIR/${tfile}-{f,d}u
7221 for perm in 777 2777 4777; do
7222 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
7223 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
7224 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
7225 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
7229 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
7231 # bug 3462 - multiple simultaneous MDC requests
7233 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7235 test_mkdir $DIR/d73-1
7236 test_mkdir $DIR/d73-2
7237 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
7240 lctl set_param fail_loc=0x80000129
7241 $MULTIOP $DIR/d73-1/f73-2 Oc &
7243 lctl set_param fail_loc=0
7245 $MULTIOP $DIR/d73-2/f73-3 Oc &
7249 wait $pid1 || return 1
7253 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
7254 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
7255 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
7259 run_test 73 "multiple MDC requests (should not deadlock)"
7261 test_74a() { # bug 6149, 6184
7262 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7265 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7267 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7268 # will spin in a tight reconnection loop
7269 $LCTL set_param fail_loc=0x8000030e
7270 # get any lock that won't be difficult - lookup works.
7272 $LCTL set_param fail_loc=0
7276 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
7278 test_74b() { # bug 13310
7279 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7281 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7283 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7284 # will spin in a tight reconnection loop
7285 $LCTL set_param fail_loc=0x8000030e
7286 # get a "difficult" lock
7288 $LCTL set_param fail_loc=0
7292 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
7295 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7297 #define OBD_FAIL_LDLM_NEW_LOCK
7298 $LCTL set_param fail_loc=0x319
7299 touch $DIR/$tfile && error "touch successful"
7300 $LCTL set_param fail_loc=0
7303 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
7306 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
7309 test_76() { # Now for bug 20433, added originally in bug 1443
7310 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7312 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
7314 cancel_lru_locks osc
7315 BEFORE_INODES=$(num_inodes)
7316 echo "before inodes: $BEFORE_INODES"
7318 [ "$SLOW" = "no" ] && COUNT=100
7319 for i in $(seq $COUNT); do
7323 cancel_lru_locks osc
7324 AFTER_INODES=$(num_inodes)
7325 echo "after inodes: $AFTER_INODES"
7327 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
7329 AFTER_INODES=$(num_inodes)
7331 echo "wait $wait seconds inodes: $AFTER_INODES"
7332 if [ $wait -gt 30 ]; then
7333 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
7337 run_test 76 "confirm clients recycle inodes properly ===="
7343 # Note: in sptlrpc modes which enable its own bulk checksum, the
7344 # original crc32_le bulk checksum will be automatically disabled,
7345 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
7346 # will be checked by sptlrpc code against sptlrpc bulk checksum.
7347 # In this case set_checksums() will not be no-op, because sptlrpc
7348 # bulk checksum will be enabled all through the test.
7350 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
7351 lctl set_param -n osc.*.checksums $1
7355 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7356 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
7357 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7358 tr -d [] | head -n1)}
7361 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
7362 log "set checksum type to $1"
7365 F77_TMP=$TMP/f77-temp
7368 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
7369 error "error writing to $F77_TMP"
7372 test_77a() { # bug 10889
7373 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7374 $GSS && skip_env "could not run with gss"
7376 [ ! -f $F77_TMP ] && setup_f77
7378 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
7382 run_test 77a "normal checksum read/write operation"
7384 test_77b() { # bug 10889
7385 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7386 $GSS && skip_env "could not run with gss"
7388 [ ! -f $F77_TMP ] && setup_f77
7389 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7390 $LCTL set_param fail_loc=0x80000409
7393 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7394 error "dd error: $?"
7395 $LCTL set_param fail_loc=0
7397 for algo in $CKSUM_TYPES; do
7398 cancel_lru_locks osc
7399 set_checksum_type $algo
7400 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7401 $LCTL set_param fail_loc=0x80000408
7402 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
7403 $LCTL set_param fail_loc=0
7406 set_checksum_type $ORIG_CSUM_TYPE
7409 run_test 77b "checksum error on client write, read"
7414 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
7416 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
7417 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
7418 $check_ost && [ -n "$ost_file_prefix" ] &&
7419 do_facet ost1 rm -f ${ost_file_prefix}\*
7423 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7424 $GSS && skip_env "could not run with gss"
7425 remote_ost_nodsh && skip "remote OST with nodsh"
7428 local osc_file_prefix
7430 local check_ost=false
7431 local ost_file_prefix
7437 # ensure corruption will occur on first OSS/OST
7438 $LFS setstripe -i 0 $DIR/$tfile
7440 [ ! -f $F77_TMP ] && setup_f77
7441 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7442 error "dd write error: $?"
7443 fid=$($LFS path2fid $DIR/$tfile)
7445 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
7448 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
7449 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
7451 echo "OSS do not support bulk pages dump upon error"
7454 osc_file_prefix=$($LCTL get_param -n debug_path)
7455 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
7457 trap cleanup_77c EXIT
7460 # enable bulk pages dump upon error on Client
7461 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
7462 # enable bulk pages dump upon error on OSS
7464 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
7466 # flush Client cache to allow next read to reach OSS
7467 cancel_lru_locks osc
7469 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7470 $LCTL set_param fail_loc=0x80000408
7471 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
7472 $LCTL set_param fail_loc=0
7476 # check cksum dump on Client
7477 osc_file=$(ls ${osc_file_prefix}*)
7478 [ -n "$osc_file" ] || error "no checksum dump file on Client"
7479 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
7480 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
7481 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
7482 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
7484 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
7485 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7486 error "dump content does not match on Client"
7488 $check_ost || skip "No need to check cksum dump on OSS"
7490 # check cksum dump on OSS
7491 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
7492 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
7493 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
7494 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
7495 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7496 error "dump content does not match on OSS"
7500 run_test 77c "checksum error on client read with debug"
7502 test_77d() { # bug 10889
7503 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7504 $GSS && skip_env "could not run with gss"
7506 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7507 $LCTL set_param fail_loc=0x80000409
7509 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7510 error "direct write: rc=$?"
7511 $LCTL set_param fail_loc=0
7514 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7515 $LCTL set_param fail_loc=0x80000408
7517 cancel_lru_locks osc
7518 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7519 error "direct read: rc=$?"
7520 $LCTL set_param fail_loc=0
7523 run_test 77d "checksum error on OST direct write, read"
7525 test_77f() { # bug 10889
7526 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7527 $GSS && skip_env "could not run with gss"
7530 for algo in $CKSUM_TYPES; do
7531 cancel_lru_locks osc
7532 set_checksum_type $algo
7533 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7534 $LCTL set_param fail_loc=0x409
7535 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
7536 error "direct write succeeded"
7537 $LCTL set_param fail_loc=0
7539 set_checksum_type $ORIG_CSUM_TYPE
7542 run_test 77f "repeat checksum error on write (expect error)"
7544 test_77g() { # bug 10889
7545 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7546 $GSS && skip_env "could not run with gss"
7547 remote_ost_nodsh && skip "remote OST with nodsh"
7549 [ ! -f $F77_TMP ] && setup_f77
7551 local file=$DIR/$tfile
7552 stack_trap "rm -f $file" EXIT
7554 $SETSTRIPE -c 1 -i 0 $file
7555 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
7556 do_facet ost1 lctl set_param fail_loc=0x8000021a
7558 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
7559 error "write error: rc=$?"
7560 do_facet ost1 lctl set_param fail_loc=0
7563 cancel_lru_locks osc
7564 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
7565 do_facet ost1 lctl set_param fail_loc=0x8000021b
7567 cmp $F77_TMP $file || error "file compare failed"
7568 do_facet ost1 lctl set_param fail_loc=0
7571 run_test 77g "checksum error on OST write, read"
7573 test_77k() { # LU-10906
7574 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7575 $GSS && skip_env "could not run with gss"
7577 local cksum_param="osc.$FSNAME*.checksums"
7578 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
7582 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
7583 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
7584 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
7588 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
7589 error "failed to set checksum=$i on MGS"
7590 wait_update $HOSTNAME "$get_checksum" $i
7592 echo "remount client, checksum should be $i"
7593 remount_client $MOUNT || "failed to remount client"
7594 checksum=$(eval $get_checksum)
7595 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7598 for opt in "checksum" "nochecksum"; do
7599 #remount with mount option
7600 echo "remount client with option $opt, checksum should be $i"
7601 umount_client $MOUNT || "failed to umount client"
7602 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
7603 "failed to mount client with option '$opt'"
7604 checksum=$(eval $get_checksum)
7605 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7609 remount_client $MOUNT || "failed to remount client"
7611 run_test 77k "enable/disable checksum correctly"
7613 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
7622 test_78() { # bug 10901
7623 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7624 remote_ost || skip_env "local OST"
7627 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
7628 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
7629 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
7630 echo "MemTotal: $MEMTOTAL"
7632 # reserve 256MB of memory for the kernel and other running processes,
7633 # and then take 1/2 of the remaining memory for the read/write buffers.
7634 if [ $MEMTOTAL -gt 512 ] ;then
7635 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
7637 # for those poor memory-starved high-end clusters...
7638 MEMTOTAL=$((MEMTOTAL / 2))
7640 echo "Mem to use for directio: $MEMTOTAL"
7642 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
7643 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
7644 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
7645 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
7647 echo "Smallest OST: $SMALLESTOST"
7648 [[ $SMALLESTOST -lt 10240 ]] &&
7649 skip "too small OSTSIZE, useless to run large O_DIRECT test"
7651 trap cleanup_test_78 EXIT
7653 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
7654 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
7656 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
7657 echo "File size: $F78SIZE"
7658 $SETSTRIPE -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
7659 for i in $(seq 1 $NSEQ); do
7660 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
7661 echo directIO rdwr round $i of $NSEQ
7662 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
7667 run_test 78 "handle large O_DIRECT writes correctly ============"
7669 test_79() { # bug 12743
7670 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7672 wait_delete_completed
7674 BKTOTAL=$(calc_osc_kbytes kbytestotal)
7675 BKFREE=$(calc_osc_kbytes kbytesfree)
7676 BKAVAIL=$(calc_osc_kbytes kbytesavail)
7678 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
7679 DFTOTAL=`echo $STRING | cut -d, -f1`
7680 DFUSED=`echo $STRING | cut -d, -f2`
7681 DFAVAIL=`echo $STRING | cut -d, -f3`
7682 DFFREE=$(($DFTOTAL - $DFUSED))
7684 ALLOWANCE=$((64 * $OSTCOUNT))
7686 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
7687 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
7688 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
7690 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
7691 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
7692 error "df free($DFFREE) mismatch OST free($BKFREE)"
7694 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
7695 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
7696 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
7699 run_test 79 "df report consistency check ======================="
7701 test_80() { # bug 10718
7702 remote_ost_nodsh && skip "remote OST with nodsh"
7703 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7705 # relax strong synchronous semantics for slow backends like ZFS
7706 local soc="obdfilter.*.sync_on_lock_cancel"
7707 local soc_old=$(do_facet ost1 lctl get_param -n $soc | head -n1)
7709 if [ "$soc_old" != "never" ] &&
7710 [ "$ost1_FSTYPE" != "ldiskfs" ]; then
7711 hosts=$(for host in $(seq -f "ost%g" 1 $OSTCOUNT); do
7712 facet_active_host $host; done | sort -u)
7713 do_nodes $hosts lctl set_param $soc=never
7716 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
7718 local BEFORE=`date +%s`
7719 cancel_lru_locks osc
7720 local AFTER=`date +%s`
7721 local DIFF=$((AFTER-BEFORE))
7722 if [ $DIFF -gt 1 ] ; then
7723 error "elapsed for 1M@1T = $DIFF"
7726 [ -n "$hosts" ] && do_nodes $hosts lctl set_param $soc=$soc_old
7730 run_test 80 "Page eviction is equally fast at high offsets too ===="
7732 test_81a() { # LU-456
7733 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7734 remote_ost_nodsh && skip "remote OST with nodsh"
7736 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
7737 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
7738 do_facet ost1 lctl set_param fail_loc=0x80000228
7740 # write should trigger a retry and success
7741 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
7742 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
7744 if [ $RC -ne 0 ] ; then
7745 error "write should success, but failed for $RC"
7748 run_test 81a "OST should retry write when get -ENOSPC ==============="
7750 test_81b() { # LU-456
7751 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7752 remote_ost_nodsh && skip "remote OST with nodsh"
7754 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
7755 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
7756 do_facet ost1 lctl set_param fail_loc=0x228
7758 # write should retry several times and return -ENOSPC finally
7759 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
7760 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
7763 if [ $RC -ne $ENOSPC ] ; then
7764 error "dd should fail for -ENOSPC, but succeed."
7767 run_test 81b "OST should return -ENOSPC when retry still fails ======="
7769 test_82() { # LU-1031
7770 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
7774 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
7776 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
7778 kill -USR1 $MULTIPID2
7780 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
7781 error "First grouplock does not block second one"
7783 echo "Second grouplock blocks first one"
7785 kill -USR1 $MULTIPID1
7789 run_test 82 "Basic grouplock test"
7792 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
7794 test_mkdir $DIR/$tdir.cvsroot
7795 chown $RUNAS_ID $DIR/$tdir.cvsroot
7798 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
7801 # some versions of cvs import exit(1) when asked to import links or
7802 # files they can't read. ignore those files.
7803 local toignore=$(find . -type l -printf '-I %f\n' -o \
7804 ! -perm /4 -printf '-I %f\n')
7805 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
7806 $tdir.reposname vtag rtag
7809 test_mkdir $DIR/$tdir.reposname
7810 chown $RUNAS_ID $DIR/$tdir.reposname
7811 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
7813 cd $DIR/$tdir.reposname
7815 $RUNAS cvs add -m 'addmsg' foo99
7817 $RUNAS cvs commit -m 'nomsg' foo99
7818 rm -fr $DIR/$tdir.cvsroot
7820 run_test 99 "cvs strange file/directory operations"
7823 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7824 [[ "$NETTYPE" =~ tcp ]] ||
7825 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
7826 remote_ost_nodsh && skip "remote OST with nodsh"
7827 remote_mds_nodsh && skip "remote MDS with nodsh"
7829 skip "useless for local single node setup"
7831 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
7832 [ "$PROT" != "tcp" ] && continue
7833 RPORT=$(echo $REMOTE | cut -d: -f2)
7834 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
7837 LPORT=`echo $LOCAL | cut -d: -f2`
7838 if [ $LPORT -ge 1024 ]; then
7839 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
7841 error_exit "local: $LPORT > 1024, remote: $RPORT"
7844 [ "$rc" = 0 ] || error_exit "privileged port not found" )
7846 run_test 100 "check local port using privileged port ==========="
7848 function get_named_value()
7857 echo $line | sed "s/^$tag[ ]*//"
7864 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
7865 awk '/^max_cached_mb/ { print $2 }')
7868 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
7873 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7874 [ $MDSCOUNT -ge 2 ] && skip_env "needs < 2 MDTs" #LU-4322
7879 local cache_limit=32
7881 $LCTL set_param -n osc.*-osc*.rpc_stats 0
7882 trap cleanup_101a EXIT
7883 $LCTL set_param -n llite.*.read_ahead_stats 0
7884 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
7887 # randomly read 10000 of 64K chunks from file 3x 32MB in size
7889 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
7890 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
7893 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
7894 get_named_value 'read but discarded' | cut -d" " -f1); do
7895 discard=$(($discard + $s))
7899 if [[ $(($discard * 10)) -gt $nreads ]]; then
7900 $LCTL get_param osc.*-osc*.rpc_stats
7901 $LCTL get_param llite.*.read_ahead_stats
7902 error "too many ($discard) discarded pages"
7904 rm -f $DIR/$tfile || true
7906 run_test 101a "check read-ahead for random reads"
7909 test_mkdir $DIR/$tdir
7910 local STRIPE_SIZE=$1
7911 local FILE_LENGTH=$2
7914 local FILE_SIZE_MB=$((FILE_LENGTH / STRIPE_SIZE))
7916 local list=$(comma_list $(osts_nodes))
7917 set_osd_param $list '' read_cache_enable 0
7918 set_osd_param $list '' writethrough_cache_enable 0
7920 trap cleanup_test101bc EXIT
7921 # prepare the read-ahead file
7922 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
7924 dd if=/dev/zero of=$DIR/$tfile bs=$STRIPE_SIZE \
7925 count=$FILE_SIZE_MB 2> /dev/null
7929 cleanup_test101bc() {
7934 local list=$(comma_list $(osts_nodes))
7935 set_osd_param $list '' read_cache_enable 1
7936 set_osd_param $list '' writethrough_cache_enable 1
7940 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
7945 local STRIPE_SIZE=$2
7946 local FILE_LENGTH=$3
7947 local RA_INC=1048576
7948 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
7949 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
7950 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
7951 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
7952 get_named_value 'read but discarded' |
7953 cut -d" " -f1 | calc_total)
7954 if [[ $DISCARD -gt $discard_limit ]]; then
7955 $LCTL get_param llite.*.read_ahead_stats
7956 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
7958 echo "Read-ahead success for size ${READ_SIZE}"
7963 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7964 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7966 local STRIPE_SIZE=1048576
7967 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
7969 if [ $SLOW == "yes" ]; then
7970 local FILE_LENGTH=$((STRIDE_SIZE * 64))
7972 local FILE_LENGTH=$((STRIDE_SIZE * 8))
7975 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
7977 # prepare the read-ahead file
7978 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
7979 cancel_lru_locks osc
7980 for BIDX in 2 4 8 16 32 64 128 256
7982 local BSIZE=$((BIDX*4096))
7983 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
7984 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
7985 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
7986 $LCTL set_param -n llite.*.read_ahead_stats 0
7987 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
7988 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
7989 cancel_lru_locks osc
7990 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
7995 run_test 101b "check stride-io mode read-ahead ================="
7998 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8000 local STRIPE_SIZE=1048576
8001 local FILE_LENGTH=$((STRIPE_SIZE*100))
8005 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8007 cancel_lru_locks osc
8008 $LCTL set_param osc.*.rpc_stats 0
8009 $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
8010 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8011 local stats=$($LCTL get_param -n $osc_rpc_stats)
8012 local lines=$(echo "$stats" | awk 'END {print NR;}')
8015 if [ $lines -le 20 ]; then
8018 for size in 1 2 4 8; do
8019 local rpc=$(echo "$stats" |
8020 awk '($1 == "'$size':") {print $2; exit; }')
8022 error "Small $((size*4))k read IO $rpc !"
8024 echo "$osc_rpc_stats check passed!"
8029 run_test 101c "check stripe_size aligned read-ahead ================="
8032 $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
8033 $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
8037 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8039 local file=$DIR/$tfile
8040 local sz_MB=${FILESIZE_101d:-500}
8041 local ra_MB=${READAHEAD_MB:-40}
8043 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8044 [ $free_MB -lt $sz_MB ] &&
8045 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8047 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8048 $SETSTRIPE -c -1 $file || error "setstripe failed"
8050 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8051 echo Cancel LRU locks on lustre client to flush the client cache
8052 cancel_lru_locks osc
8054 echo Disable read-ahead
8055 local old_READAHEAD=$(set_read_ahead 0)
8057 echo Reading the test file $file with read-ahead disabled
8058 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8060 echo Cancel LRU locks on lustre client to flush the client cache
8061 cancel_lru_locks osc
8062 echo Enable read-ahead with ${ra_MB}MB
8063 set_read_ahead $ra_MB
8065 echo Reading the test file $file with read-ahead enabled
8066 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8068 echo "read-ahead disabled time read $raOFF"
8069 echo "read-ahead enabled time read $raON"
8071 set_read_ahead $old_READAHEAD
8073 wait_delete_completed
8075 [ $raOFF -le 1 -o $raON -lt $raOFF ] ||
8076 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8078 run_test 101d "file read with and without read-ahead enabled"
8081 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8083 local file=$DIR/$tfile
8084 local size_KB=500 #KB
8088 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8089 local need_KB=$((count * size_KB))
8090 [[ $free_KB -le $need_KB ]] &&
8091 skip_env "Need free space $need_KB, have $free_KB"
8093 echo "Creating $count ${size_KB}K test files"
8094 for ((i = 0; i < $count; i++)); do
8095 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8098 echo "Cancel LRU locks on lustre client to flush the client cache"
8099 cancel_lru_locks $OSC
8101 echo "Reset readahead stats"
8102 $LCTL set_param -n llite.*.read_ahead_stats 0
8104 for ((i = 0; i < $count; i++)); do
8105 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
8108 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8109 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8111 for ((i = 0; i < $count; i++)); do
8112 rm -rf $file.$i 2>/dev/null
8115 #10000 means 20% reads are missing in readahead
8116 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
8118 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
8121 which iozone || skip_env "no iozone installed"
8123 local old_debug=$($LCTL get_param debug)
8124 old_debug=${old_debug#*=}
8125 $LCTL set_param debug="reada mmap"
8127 # create a test file
8128 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
8130 echo Cancel LRU locks on lustre client to flush the client cache
8131 cancel_lru_locks osc
8133 echo Reset readahead stats
8134 $LCTL set_param -n llite.*.read_ahead_stats 0
8136 echo mmap read the file with small block size
8137 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
8140 echo checking missing pages
8141 $LCTL get_param llite.*.read_ahead_stats
8142 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8143 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8145 $LCTL set_param debug="$old_debug"
8146 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
8149 run_test 101f "check mmap read performance"
8151 test_101g_brw_size_test() {
8153 local pages=$((mb * 1048576 / PAGE_SIZE))
8154 local file=$DIR/$tfile
8156 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
8157 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
8158 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
8159 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
8163 stack_trap "rm -f $file" EXIT
8164 $LCTL set_param -n osc.*.rpc_stats=0
8166 # 10 RPCs should be enough for the test
8168 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
8169 { error "dd write ${mb} MB blocks failed"; return 3; }
8170 cancel_lru_locks osc
8171 dd of=/dev/null if=$file bs=${mb}M count=$count ||
8172 { error "dd write ${mb} MB blocks failed"; return 4; }
8174 # calculate number of full-sized read and write RPCs
8175 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
8176 sed -n '/pages per rpc/,/^$/p' |
8177 awk '/'$pages':/ { reads += $2; writes += $6 }; \
8178 END { print reads,writes }'))
8179 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
8181 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
8188 remote_ost_nodsh && skip "remote OST with nodsh"
8191 local osts=$(get_facets OST)
8192 local list=$(comma_list $(osts_nodes))
8193 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
8194 local brw_size="obdfilter.*.brw_size"
8196 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8198 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
8199 if [ $OST1_VERSION -ge $(version_code 2.8.52) -o \
8200 \( $OST1_VERSION -ge $(version_code 2.7.17) -a \
8201 $OST1_VERSION -lt $(version_code 2.7.50) \) ] &&
8202 [ $CLIENT_VERSION -ge $(version_code 2.8.52) -o \
8203 \( $CLIENT_VERSION -ge $(version_code 2.7.17) -a \
8204 $CLIENT_VERSION -lt $(version_code 2.7.50) \) ]; then
8205 [ $OST1_VERSION -ge $(version_code 2.9.52) ] && suffix="M"
8206 if [[ $orig_mb -lt 16 ]]; then
8207 save_lustre_params $osts "$brw_size" > $p
8208 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
8209 error "set 16MB RPC size failed"
8211 echo "remount client to enable new RPC size"
8212 remount_client $MOUNT || error "remount_client failed"
8215 test_101g_brw_size_test 16 || error "16MB RPC test failed"
8216 # should be able to set brw_size=12, but no rpc_stats for that
8217 test_101g_brw_size_test 8 || error "8MB RPC test failed"
8220 test_101g_brw_size_test 4 || error "4MB RPC test failed"
8222 if [[ $orig_mb -lt 16 ]]; then
8223 restore_lustre_params < $p
8224 remount_client $MOUNT || error "remount_client restore failed"
8227 rm -f $p $DIR/$tfile
8229 run_test 101g "Big bulk(4/16 MiB) readahead"
8232 test_mkdir $DIR/$tdir
8233 chown $RUNAS_ID $DIR/$tdir
8236 STRIPE_COUNT=$OSTCOUNT
8237 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
8239 trap cleanup_test102 EXIT
8241 $1 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
8243 for num in 1 2 3 4; do
8244 for count in $(seq 1 $STRIPE_COUNT); do
8245 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
8246 local size=`expr $STRIPE_SIZE \* $num`
8247 local file=file"$num-$idx-$count"
8248 $1 $SETSTRIPE -S $size -i $idx -c $count $file
8254 $1 tar cf $TMP/f102.tar $tdir --xattrs
8260 rm -rf $DIR/d0.sanity/d102
8264 [ "$UID" != 0 ] && skip "must run as root"
8265 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
8266 skip_env "must have user_xattr"
8268 [ -z "$(which setfattr 2>/dev/null)" ] &&
8269 skip_env "could not find setfattr"
8271 local testfile=$DIR/$tfile
8274 echo "set/get xattr..."
8275 setfattr -n trusted.name1 -v value1 $testfile ||
8276 error "setfattr -n trusted.name1=value1 $testfile failed"
8277 getfattr -n trusted.name1 $testfile 2> /dev/null |
8278 grep "trusted.name1=.value1" ||
8279 error "$testfile missing trusted.name1=value1"
8281 setfattr -n user.author1 -v author1 $testfile ||
8282 error "setfattr -n user.author1=author1 $testfile failed"
8283 getfattr -n user.author1 $testfile 2> /dev/null |
8284 grep "user.author1=.author1" ||
8285 error "$testfile missing trusted.author1=author1"
8288 setfattr -n trusted.name2 -v value2 $testfile ||
8289 error "$testfile unable to set trusted.name2"
8290 setfattr -n trusted.name3 -v value3 $testfile ||
8291 error "$testfile unable to set trusted.name3"
8292 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
8293 grep "trusted.name" | wc -l) -eq 3 ] ||
8294 error "$testfile missing 3 trusted.name xattrs"
8296 setfattr -n user.author2 -v author2 $testfile ||
8297 error "$testfile unable to set user.author2"
8298 setfattr -n user.author3 -v author3 $testfile ||
8299 error "$testfile unable to set user.author3"
8300 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
8301 grep "user.author" | wc -l) -eq 3 ] ||
8302 error "$testfile missing 3 user.author xattrs"
8304 echo "remove xattr..."
8305 setfattr -x trusted.name1 $testfile ||
8306 error "$testfile error deleting trusted.name1"
8307 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
8308 error "$testfile did not delete trusted.name1 xattr"
8310 setfattr -x user.author1 $testfile ||
8311 error "$testfile error deleting user.author1"
8312 echo "set lustre special xattr ..."
8313 $LFS setstripe -c1 $testfile
8314 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
8315 awk -F "=" '/trusted.lov/ { print $2 }' )
8316 setfattr -n "trusted.lov" -v $lovea $testfile ||
8317 error "$testfile doesn't ignore setting trusted.lov again"
8318 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
8319 error "$testfile allow setting invalid trusted.lov"
8322 run_test 102a "user xattr test =================================="
8325 [ -z "$(which setfattr 2>/dev/null)" ] &&
8326 skip_env "could not find setfattr"
8327 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8329 # b10930: get/set/list trusted.lov xattr
8330 echo "get/set/list trusted.lov xattr ..."
8331 local testfile=$DIR/$tfile
8332 $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8333 error "setstripe failed"
8334 local STRIPECOUNT=$($GETSTRIPE -c $testfile) ||
8335 error "getstripe failed"
8336 getfattr -d -m "^trusted" $testfile 2>/dev/null | grep "trusted.lov" ||
8337 error "can't get trusted.lov from $testfile"
8339 local testfile2=${testfile}2
8340 local value=$(getfattr -n trusted.lov $testfile 2>/dev/null |
8341 grep "trusted.lov" | sed -e 's/[^=]\+=//')
8344 setfattr -n trusted.lov -v $value $testfile2
8345 local stripe_size=$($GETSTRIPE -S $testfile2)
8346 local stripe_count=$($GETSTRIPE -c $testfile2)
8347 [[ $stripe_size -eq 65536 ]] ||
8348 error "stripe size $stripe_size != 65536"
8349 [[ $stripe_count -eq $STRIPECOUNT ]] ||
8350 error "stripe count $stripe_count != $STRIPECOUNT"
8353 run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
8356 [ -z "$(which setfattr 2>/dev/null)" ] &&
8357 skip_env "could not find setfattr"
8358 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8360 # b10930: get/set/list lustre.lov xattr
8361 echo "get/set/list lustre.lov xattr ..."
8362 test_mkdir $DIR/$tdir
8363 chown $RUNAS_ID $DIR/$tdir
8364 local testfile=$DIR/$tdir/$tfile
8365 $RUNAS $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8366 error "setstripe failed"
8367 local STRIPECOUNT=$($RUNAS $GETSTRIPE -c $testfile) ||
8368 error "getstripe failed"
8369 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
8370 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
8372 local testfile2=${testfile}2
8373 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
8374 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
8376 $RUNAS $MCREATE $testfile2
8377 $RUNAS setfattr -n lustre.lov -v $value $testfile2
8378 local stripe_size=$($RUNAS $GETSTRIPE -S $testfile2)
8379 local stripe_count=$($RUNAS $GETSTRIPE -c $testfile2)
8380 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
8381 [ $stripe_count -eq $STRIPECOUNT ] ||
8382 error "stripe count $stripe_count != $STRIPECOUNT"
8384 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
8386 compare_stripe_info1() {
8387 local stripe_index_all_zero=true
8389 for num in 1 2 3 4; do
8390 for count in $(seq 1 $STRIPE_COUNT); do
8391 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
8392 local size=$((STRIPE_SIZE * num))
8393 local file=file"$num-$offset-$count"
8394 stripe_size=$($LFS getstripe -S $PWD/$file)
8395 [[ $stripe_size -ne $size ]] &&
8396 error "$file: size $stripe_size != $size"
8397 stripe_count=$($LFS getstripe -c $PWD/$file)
8398 # allow fewer stripes to be created, ORI-601
8399 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
8400 error "$file: count $stripe_count != $count"
8401 stripe_index=$($LFS getstripe -i $PWD/$file)
8402 [[ $stripe_index -ne 0 ]] &&
8403 stripe_index_all_zero=false
8407 $stripe_index_all_zero &&
8408 error "all files are being extracted starting from OST index 0"
8412 have_xattrs_include() {
8413 tar --help | grep -q xattrs-include &&
8414 echo --xattrs-include="lustre.*"
8418 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8419 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8421 XINC=$(have_xattrs_include)
8423 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8425 compare_stripe_info1
8427 run_test 102d "tar restore stripe info from tarfile,not keep osts"
8430 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8431 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8433 XINC=$(have_xattrs_include)
8435 test_mkdir $DIR/$tdir.restore
8437 tar cf - --xattrs $tdir | tar xf - \
8438 -C $DIR/$tdir.restore --xattrs $XINC
8439 cd $DIR/$tdir.restore/$tdir
8440 compare_stripe_info1
8442 run_test 102f "tar copy files, not keep osts"
8445 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
8446 skip "must have user_xattr"
8447 [ -z "$(which setfattr 2>/dev/null)" ] &&
8448 skip_env "could not find setfattr"
8449 [ -z "$(which getfattr 2>/dev/null)" ] &&
8450 skip_env "could not find getfattr"
8452 local xsize=${1:-1024} # in bytes
8453 local file=$DIR/$tfile
8454 local value="$(generate_string $xsize)"
8455 local xbig=trusted.big
8458 log "save $xbig on $file"
8459 setfattr -n $xbig -v $value $file ||
8460 error "saving $xbig on $file failed"
8462 local orig=$(get_xattr_value $xbig $file)
8463 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
8465 local xsml=trusted.sml
8466 log "save $xsml on $file"
8467 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
8469 local new=$(get_xattr_value $xbig $file)
8470 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
8472 log "grow $xsml on $file"
8473 setfattr -n $xsml -v "$value" $file ||
8474 error "growing $xsml on $file failed"
8476 new=$(get_xattr_value $xbig $file)
8477 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
8478 log "$xbig still valid after growing $xsml"
8483 test_102h() { # bug 15777
8486 run_test 102h "grow xattr from inside inode to external block"
8489 large_xattr_enabled || skip_env "ea_inode feature disabled"
8491 grow_xattr $(max_xattr_size)
8493 run_test 102ha "grow xattr from inside inode to external inode"
8495 test_102i() { # bug 17038
8496 [ -z "$(which getfattr 2>/dev/null)" ] &&
8497 skip "could not find getfattr"
8500 ln -s $DIR/$tfile $DIR/${tfile}link
8501 getfattr -n trusted.lov $DIR/$tfile ||
8502 error "lgetxattr on $DIR/$tfile failed"
8503 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
8504 grep -i "no such attr" ||
8505 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
8506 rm -f $DIR/$tfile $DIR/${tfile}link
8508 run_test 102i "lgetxattr test on symbolic link ============"
8511 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8512 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8514 XINC=$(have_xattrs_include)
8515 setup_test102 "$RUNAS"
8516 chown $RUNAS_ID $DIR/$tdir
8517 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8519 compare_stripe_info1 "$RUNAS"
8521 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
8524 [ -z "$(which setfattr 2>/dev/null)" ] &&
8525 skip "could not find setfattr"
8528 # b22187 just check that does not crash for regular file.
8529 setfattr -n trusted.lov $DIR/$tfile
8530 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
8531 local test_kdir=$DIR/$tdir
8532 test_mkdir $test_kdir
8533 local default_size=$($LFS getstripe -S $test_kdir)
8534 local default_count=$($LFS getstripe -c $test_kdir)
8535 local default_offset=$($LFS getstripe -i $test_kdir)
8536 $SETSTRIPE -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
8537 error 'dir setstripe failed'
8538 setfattr -n trusted.lov $test_kdir
8539 local stripe_size=$($LFS getstripe -S $test_kdir)
8540 local stripe_count=$($LFS getstripe -c $test_kdir)
8541 local stripe_offset=$($LFS getstripe -i $test_kdir)
8542 [ $stripe_size -eq $default_size ] ||
8543 error "stripe size $stripe_size != $default_size"
8544 [ $stripe_count -eq $default_count ] ||
8545 error "stripe count $stripe_count != $default_count"
8546 [ $stripe_offset -eq $default_offset ] ||
8547 error "stripe offset $stripe_offset != $default_offset"
8548 rm -rf $DIR/$tfile $test_kdir
8550 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
8553 [ -z "$(which getfattr 2>/dev/null)" ] &&
8554 skip "could not find getfattr"
8556 # LU-532 trusted. xattr is invisible to non-root
8557 local testfile=$DIR/$tfile
8561 echo "listxattr as user..."
8562 chown $RUNAS_ID $testfile
8563 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
8564 grep -q "trusted" &&
8565 error "$testfile trusted xattrs are user visible"
8569 run_test 102l "listxattr size test =================================="
8571 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
8572 local path=$DIR/$tfile
8575 listxattr_size_check $path || error "listattr_size_check $path failed"
8577 run_test 102m "Ensure listxattr fails on small bufffer ========"
8581 getxattr() { # getxattr path name
8582 # Return the base64 encoding of the value of xattr name on path.
8586 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
8588 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8590 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8592 getfattr --absolute-names --encoding=base64 --name=$name $path |
8593 awk -F= -v name=$name '$1 == name {
8594 print substr($0, index($0, "=") + 1);
8598 test_102n() { # LU-4101 mdt: protect internal xattrs
8599 [ -z "$(which setfattr 2>/dev/null)" ] &&
8600 skip "could not find setfattr"
8601 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
8603 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
8606 local file0=$DIR/$tfile.0
8607 local file1=$DIR/$tfile.1
8608 local xattr0=$TMP/$tfile.0
8609 local xattr1=$TMP/$tfile.1
8610 local namelist="lov lma lmv link fid version som hsm"
8614 rm -rf $file0 $file1 $xattr0 $xattr1
8617 # Get 'before' xattrs of $file1.
8618 getfattr --absolute-names --dump --match=- $file1 > $xattr0
8620 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
8621 namelist+=" lfsck_namespace"
8622 for name in $namelist; do
8623 # Try to copy xattr from $file0 to $file1.
8624 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8626 setfattr --name=trusted.$name --value="$value" $file1 ||
8627 error "setxattr 'trusted.$name' failed"
8629 # Try to set a garbage xattr.
8630 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8632 if [[ x$name == "xlov" ]]; then
8633 setfattr --name=trusted.lov --value="$value" $file1 &&
8634 error "setxattr invalid 'trusted.lov' success"
8636 setfattr --name=trusted.$name --value="$value" $file1 ||
8637 error "setxattr invalid 'trusted.$name' failed"
8640 # Try to remove the xattr from $file1. We don't care if this
8641 # appears to succeed or fail, we just don't want there to be
8642 # any changes or crashes.
8643 setfattr --remove=$trusted.$name $file1 2> /dev/null
8646 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
8649 # Try to copy xattr from $file0 to $file1.
8650 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8652 setfattr --name=trusted.$name --value="$value" $file1 ||
8653 error "setxattr 'trusted.$name' failed"
8655 # Try to set a garbage xattr.
8656 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8658 setfattr --name=trusted.$name --value="$value" $file1 ||
8659 error "setxattr 'trusted.$name' failed"
8661 # Try to remove the xattr from $file1. We don't care if this
8662 # appears to succeed or fail, we just don't want there to be
8663 # any changes or crashes.
8664 setfattr --remove=$trusted.$name $file1 2> /dev/null
8667 # Get 'after' xattrs of file1.
8668 getfattr --absolute-names --dump --match=- $file1 > $xattr1
8670 if ! diff $xattr0 $xattr1; then
8671 error "before and after xattrs of '$file1' differ"
8674 rm -rf $file0 $file1 $xattr0 $xattr1
8678 run_test 102n "silently ignore setxattr on internal trusted xattrs"
8680 test_102p() { # LU-4703 setxattr did not check ownership
8681 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
8682 skip "MDS needs to be at least 2.5.56"
8684 local testfile=$DIR/$tfile
8688 echo "setfacl as user..."
8689 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
8690 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
8692 echo "setfattr as user..."
8693 setfacl -m "u:$RUNAS_ID:---" $testfile
8694 $RUNAS setfattr -x system.posix_acl_access $testfile
8695 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
8697 run_test 102p "check setxattr(2) correctly fails without permission"
8700 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
8701 skip "MDS needs to be at least 2.6.92"
8703 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
8705 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
8708 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
8709 skip "MDS needs to be at least 2.6.93"
8711 touch $DIR/$tfile || error "touch"
8712 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
8713 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
8714 rm $DIR/$tfile || error "rm"
8717 mkdir -p $DIR/$tdir || error "mkdir"
8718 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
8719 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
8720 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
8721 error "$testfile error deleting user.author1"
8722 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
8723 grep "user.$(basename $tdir)" &&
8724 error "$tdir did not delete user.$(basename $tdir)"
8725 rmdir $DIR/$tdir || error "rmdir"
8728 test_mkdir $DIR/$tdir
8729 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
8730 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
8731 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
8732 error "$testfile error deleting user.author1"
8733 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
8734 grep "user.$(basename $tdir)" &&
8735 error "$tdir did not delete user.$(basename $tdir)"
8736 rmdir $DIR/$tdir || error "rm striped dir"
8738 run_test 102r "set EAs with empty values"
8741 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
8742 skip "MDS needs to be at least 2.11.52"
8744 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
8746 save_lustre_params client "llite.*.xattr_cache" > $save
8748 for cache in 0 1; do
8749 lctl set_param llite.*.xattr_cache=$cache
8752 touch $DIR/$tfile || error "touch"
8753 for prefix in lustre security system trusted user; do
8754 # Note getxattr() may fail with 'Operation not
8755 # supported' or 'No such attribute' depending
8756 # on prefix and cache.
8757 getfattr -n $prefix.n102s $DIR/$tfile &&
8758 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
8762 restore_lustre_params < $save
8764 run_test 102s "getting nonexistent xattrs should fail"
8767 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
8768 skip "MDS needs to be at least 2.11.52"
8770 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
8772 save_lustre_params client "llite.*.xattr_cache" > $save
8774 for cache in 0 1; do
8775 lctl set_param llite.*.xattr_cache=$cache
8777 for buf_size in 0 256; do
8779 touch $DIR/$tfile || error "touch"
8780 setfattr -n user.multiop $DIR/$tfile
8781 $MULTIOP $DIR/$tfile oa$buf_size ||
8782 error "cannot get zero length xattr value (buf_size = $buf_size)"
8786 restore_lustre_params < $save
8788 run_test 102t "zero length xattr values handled correctly"
8792 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
8797 [ "$UID" != 0 ] && skip "must run as root"
8798 $GSS && skip_env "could not run under gss"
8799 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
8800 skip_env "must have acl enabled"
8801 [ -z "$(which setfacl 2>/dev/null)" ] &&
8802 skip_env "could not find setfacl"
8803 remote_mds_nodsh && skip "remote MDS with nodsh"
8805 gpasswd -a daemon bin # LU-5641
8806 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
8808 declare -a identity_old
8810 for num in $(seq $MDSCOUNT); do
8811 switch_identity $num true || identity_old[$num]=$?
8819 echo "performing cp ..."
8820 run_acl_subtest cp || error "run_acl_subtest cp failed"
8821 echo "performing getfacl-noacl..."
8822 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
8823 echo "performing misc..."
8824 run_acl_subtest misc || error "misc test failed"
8825 echo "performing permissions..."
8826 run_acl_subtest permissions || error "permissions failed"
8827 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
8828 if [ $MDS1_VERSION -gt $(version_code 2.8.55) -o \
8829 \( $MDS1_VERSION -lt $(version_code 2.6) -a \
8830 $MDS1_VERSION -ge $(version_code 2.5.29) \) ]
8832 echo "performing permissions xattr..."
8833 run_acl_subtest permissions_xattr ||
8834 error "permissions_xattr failed"
8836 echo "performing setfacl..."
8837 run_acl_subtest setfacl || error "setfacl test failed"
8839 # inheritance test got from HP
8840 echo "performing inheritance..."
8841 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
8842 chmod +x make-tree || error "chmod +x failed"
8843 run_acl_subtest inheritance || error "inheritance test failed"
8846 echo "LU-974 ignore umask when acl is enabled..."
8847 run_acl_subtest 974 || error "LU-974 umask test failed"
8848 if [ $MDSCOUNT -ge 2 ]; then
8849 run_acl_subtest 974_remote ||
8850 error "LU-974 umask test failed under remote dir"
8853 echo "LU-2561 newly created file is same size as directory..."
8854 if [ "$mds1_FSTYPE" != "zfs" ]; then
8855 run_acl_subtest 2561 || error "LU-2561 test failed"
8857 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
8860 run_acl_subtest 4924 || error "LU-4924 test failed"
8865 for num in $(seq $MDSCOUNT); do
8866 if [ "${identity_old[$num]}" = 1 ]; then
8867 switch_identity $num false || identity_old[$num]=$?
8871 run_test 103a "acl test"
8877 for U in {0..511}; do
8879 local O=$(printf "%04o" $U)
8881 umask $(printf "%04o" $((511 ^ $O)))
8882 $LFS setstripe -c 1 $DIR/$tfile.s$O
8883 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
8885 (( $S == ($O & 0666) )) ||
8886 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
8888 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
8889 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
8890 (( $S == ($O & 0666) )) ||
8891 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
8893 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
8894 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
8895 (( $S == ($O & 0666) )) ||
8896 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
8897 rm -f $DIR/$tfile.[smp]$0
8901 # limit the concurrently running threads to 64. LU-11878
8902 local idx=$((U % 64))
8903 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
8908 run_test 103b "umask lfs setstripe"
8912 cp -rp $DIR/$tdir $DIR/$tdir.bak
8914 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
8915 error "$DIR/$tdir shouldn't contain default ACL"
8916 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
8917 error "$DIR/$tdir.bak shouldn't contain default ACL"
8920 run_test 103c "'cp -rp' won't set empty acl"
8923 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8926 lfs df || error "lfs df failed"
8927 lfs df -ih || error "lfs df -ih failed"
8928 lfs df -h $DIR || error "lfs df -h $DIR failed"
8929 lfs df -i $DIR || error "lfs df -i $DIR failed"
8930 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
8931 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
8933 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
8934 lctl --device %$OSC deactivate
8935 lfs df || error "lfs df with deactivated OSC failed"
8936 lctl --device %$OSC activate
8937 # wait the osc back to normal
8938 wait_osc_import_ready client ost
8940 lfs df || error "lfs df with reactivated OSC failed"
8943 run_test 104a "lfs df [-ih] [path] test ========================="
8946 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8947 [ $RUNAS_ID -eq $UID ] &&
8948 skip_env "RUNAS_ID = UID = $UID -- skipping"
8950 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
8951 grep "Permission denied" | wc -l)))
8952 if [ $denied_cnt -ne 0 ]; then
8953 error "lfs check servers test failed"
8956 run_test 104b "$RUNAS lfs check servers test ===================="
8959 # doesn't work on 2.4 kernels
8961 if $(flock_is_enabled); then
8962 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
8964 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
8968 run_test 105a "flock when mounted without -o flock test ========"
8972 if $(flock_is_enabled); then
8973 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
8975 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
8979 run_test 105b "fcntl when mounted without -o flock test ========"
8983 if $(flock_is_enabled); then
8984 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
8986 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
8990 run_test 105c "lockf when mounted without -o flock test"
8992 test_105d() { # bug 15924
8993 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8995 test_mkdir $DIR/$tdir
8996 flock_is_enabled || skip_env "mount w/o flock enabled"
8997 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
8998 $LCTL set_param fail_loc=0x80000315
8999 flocks_test 2 $DIR/$tdir
9001 run_test 105d "flock race (should not freeze) ========"
9003 test_105e() { # bug 22660 && 22040
9004 flock_is_enabled || skip_env "mount w/o flock enabled"
9007 flocks_test 3 $DIR/$tfile
9009 run_test 105e "Two conflicting flocks from same process"
9011 test_106() { #bug 10921
9012 test_mkdir $DIR/$tdir
9013 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9014 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9016 run_test 106 "attempt exec of dir followed by chown of that dir"
9019 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9027 local save_pattern=$(sysctl -n kernel.core_pattern)
9028 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9029 sysctl -w kernel.core_pattern=$file
9030 sysctl -w kernel.core_uses_pid=0
9038 kill -s 11 $SLEEPPID
9040 if [ -e $file ]; then
9041 size=`stat -c%s $file`
9042 [ $size -eq 0 ] && error "Fail to create core file $file"
9044 error "Fail to create core file $file"
9047 sysctl -w kernel.core_pattern=$save_pattern
9048 sysctl -w kernel.core_uses_pid=$save_uses_pid
9051 run_test 107 "Coredump on SIG"
9054 test_mkdir $DIR/$tdir
9055 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9056 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9057 error "mkdir with 256 char should fail, but did not"
9058 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9059 error "create with 255 char failed"
9060 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9061 error "create with 256 char should fail, but did not"
9066 run_test 110 "filename length checking"
9069 # Purpose: To verify dynamic thread (OSS) creation.
9072 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9073 remote_ost_nodsh && skip "remote OST with nodsh"
9075 # Lustre does not stop service threads once they are started.
9076 # Reset number of running threads to default.
9081 local save_params="$TMP/sanity-$TESTNAME.parameters"
9083 # Get ll_ost_io count before I/O
9084 OSTIO_pre=$(do_facet ost1 \
9085 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9086 # Exit if lustre is not running (ll_ost_io not running).
9087 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9089 echo "Starting with $OSTIO_pre threads"
9090 local thread_max=$((OSTIO_pre * 2))
9091 local rpc_in_flight=$((thread_max * 2))
9092 # Number of I/O Process proposed to be started.
9094 local facets=$(get_facets OST)
9096 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9097 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9099 # Set in_flight to $rpc_in_flight
9100 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9101 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9102 nfiles=${rpc_in_flight}
9103 # Set ost thread_max to $thread_max
9104 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9106 # 5 Minutes should be sufficient for max number of OSS
9107 # threads(thread_max) to be created.
9111 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9112 test_mkdir $DIR/$tdir
9113 for i in $(seq $nfiles); do
9114 local file=$DIR/$tdir/${tfile}-$i
9115 $LFS setstripe -c -1 -i 0 $file
9116 ($WTL $file $timeout)&
9119 # I/O Started - Wait for thread_started to reach thread_max or report
9120 # error if thread_started is more than thread_max.
9121 echo "Waiting for thread_started to reach thread_max"
9122 local thread_started=0
9123 local end_time=$((SECONDS + timeout))
9125 while [ $SECONDS -le $end_time ] ; do
9127 # Get ost i/o thread_started count.
9128 thread_started=$(do_facet ost1 \
9130 ost.OSS.ost_io.threads_started | cut -d= -f2")
9131 # Break out if thread_started is equal/greater than thread_max
9132 if [[ $thread_started -ge $thread_max ]]; then
9133 echo ll_ost_io thread_started $thread_started, \
9134 equal/greater than thread_max $thread_max
9140 # Cleanup - We have the numbers, Kill i/o jobs if running.
9141 jobcount=($(jobs -p))
9142 for i in $(seq 0 $((${#jobcount[@]}-1)))
9144 kill -9 ${jobcount[$i]}
9145 if [ $? -ne 0 ] ; then
9147 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
9151 # Cleanup files left by WTL binary.
9152 for i in $(seq $nfiles); do
9153 local file=$DIR/$tdir/${tfile}-$i
9155 if [ $? -ne 0 ] ; then
9156 echo "Warning: Failed to delete file $file"
9160 restore_lustre_params <$save_params
9161 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
9163 # Error out if no new thread has started or Thread started is greater
9165 if [[ $thread_started -le $OSTIO_pre ||
9166 $thread_started -gt $thread_max ]]; then
9167 error "ll_ost_io: thread_started $thread_started" \
9168 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
9169 "No new thread started or thread started greater " \
9173 run_test 115 "verify dynamic thread creation===================="
9176 wait_delete_completed
9177 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
9178 echo "OST kbytes available: ${AVAIL[@]}"
9183 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
9184 #echo OST $i: ${AVAIL[i]}kb
9185 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
9189 if [[ ${AVAIL[i]} -lt $MINV ]]; then
9194 echo "Min free space: OST $MINI: $MINV"
9195 echo "Max free space: OST $MAXI: $MAXV"
9198 test_116a() { # was previously test_116()
9199 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9200 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9201 remote_mds_nodsh && skip "remote MDS with nodsh"
9203 echo -n "Free space priority "
9204 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
9209 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
9210 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
9211 trap simple_cleanup_common EXIT
9213 # Check if we need to generate uneven OSTs
9214 test_mkdir -p $DIR/$tdir/OST${MINI}
9215 local FILL=$((MINV / 4))
9216 local DIFF=$((MAXV - MINV))
9217 local DIFF2=$((DIFF * 100 / MINV))
9219 local threshold=$(do_facet $SINGLEMDS \
9220 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
9221 threshold=${threshold%%%}
9222 echo -n "Check for uneven OSTs: "
9223 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
9225 if [[ $DIFF2 -gt $threshold ]]; then
9227 echo "Don't need to fill OST$MINI"
9229 # generate uneven OSTs. Write 2% over the QOS threshold value
9231 DIFF=$((threshold - DIFF2 + 2))
9232 DIFF2=$((MINV * DIFF / 100))
9233 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
9234 $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
9235 error "setstripe failed"
9236 DIFF=$((DIFF2 / 2048))
9238 while [ $i -lt $DIFF ]; do
9240 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
9241 bs=2M count=1 2>/dev/null
9250 DIFF=$((MAXV - MINV))
9251 DIFF2=$((DIFF * 100 / MINV))
9252 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
9253 if [ $DIFF2 -gt $threshold ]; then
9256 echo "failed - QOS mode won't be used"
9257 simple_cleanup_common
9258 skip "QOS imbalance criteria not met"
9266 # now fill using QOS
9267 $SETSTRIPE -c 1 $DIR/$tdir
9268 FILL=$((FILL / 200))
9269 if [ $FILL -gt 600 ]; then
9272 echo "writing $FILL files to QOS-assigned OSTs"
9274 while [ $i -lt $FILL ]; do
9276 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
9280 echo "wrote $i 200k files"
9284 echo "Note: free space may not be updated, so measurements might be off"
9286 DIFF2=$((MAXV - MINV))
9287 echo "free space delta: orig $DIFF final $DIFF2"
9288 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
9289 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
9290 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
9291 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
9292 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
9293 if [[ $DIFF -gt 0 ]]; then
9294 FILL=$((DIFF2 * 100 / DIFF - 100))
9295 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
9298 # Figure out which files were written where
9299 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9300 awk '/'$MINI1': / {print $2; exit}')
9302 MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9303 echo "$MINC files created on smaller OST $MINI1"
9304 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9305 awk '/'$MAXI1': / {print $2; exit}')
9307 MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9308 echo "$MAXC files created on larger OST $MAXI1"
9309 if [[ $MINC -gt 0 ]]; then
9310 FILL=$((MAXC * 100 / MINC - 100))
9311 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
9313 [[ $MAXC -gt $MINC ]] ||
9314 error_ignore LU-9 "stripe QOS didn't balance free space"
9315 simple_cleanup_common
9317 run_test 116a "stripe QOS: free space balance ==================="
9319 test_116b() { # LU-2093
9320 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9321 remote_mds_nodsh && skip "remote MDS with nodsh"
9323 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
9324 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
9325 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
9326 [ -z "$old_rr" ] && skip "no QOS"
9327 do_facet $SINGLEMDS lctl set_param \
9328 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
9330 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
9331 createmany -o $DIR/$tdir/f- 20 || error "can't create"
9332 do_facet $SINGLEMDS lctl set_param fail_loc=0
9334 do_facet $SINGLEMDS lctl set_param \
9335 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
9337 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
9339 test_117() # bug 10891
9341 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9343 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
9344 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
9345 lctl set_param fail_loc=0x21e
9346 > $DIR/$tfile || error "truncate failed"
9347 lctl set_param fail_loc=0
9348 echo "Truncate succeeded."
9351 run_test 117 "verify osd extend =========="
9353 NO_SLOW_RESENDCOUNT=4
9354 export OLD_RESENDCOUNT=""
9355 set_resend_count () {
9356 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
9357 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
9358 lctl set_param -n $PROC_RESENDCOUNT $1
9359 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
9362 # for reduce test_118* time (b=14842)
9363 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9365 # Reset async IO behavior after error case
9367 FILE=$DIR/reset_async
9369 # Ensure all OSCs are cleared
9370 $SETSTRIPE -c -1 $FILE
9371 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
9376 test_118a() #bug 11710
9378 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9382 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9383 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9384 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9386 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9387 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9392 run_test 118a "verify O_SYNC works =========="
9396 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9397 remote_ost_nodsh && skip "remote OST with nodsh"
9401 #define OBD_FAIL_SRV_ENOENT 0x217
9402 set_nodes_failloc "$(osts_nodes)" 0x217
9403 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9405 set_nodes_failloc "$(osts_nodes)" 0
9406 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9407 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9410 if [[ $RC -eq 0 ]]; then
9411 error "Must return error due to dropped pages, rc=$RC"
9415 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9416 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9420 echo "Dirty pages not leaked on ENOENT"
9422 # Due to the above error the OSC will issue all RPCs syncronously
9423 # until a subsequent RPC completes successfully without error.
9424 $MULTIOP $DIR/$tfile Ow4096yc
9429 run_test 118b "Reclaim dirty pages on fatal error =========="
9433 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9435 # for 118c, restore the original resend count, LU-1940
9436 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
9437 set_resend_count $OLD_RESENDCOUNT
9438 remote_ost_nodsh && skip "remote OST with nodsh"
9442 #define OBD_FAIL_OST_EROFS 0x216
9443 set_nodes_failloc "$(osts_nodes)" 0x216
9445 # multiop should block due to fsync until pages are written
9446 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9450 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9451 error "Multiop failed to block on fsync, pid=$MULTIPID"
9454 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9456 if [[ $WRITEBACK -eq 0 ]]; then
9457 error "No page in writeback, writeback=$WRITEBACK"
9460 set_nodes_failloc "$(osts_nodes)" 0
9463 if [[ $RC -ne 0 ]]; then
9464 error "Multiop fsync failed, rc=$RC"
9467 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9468 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9470 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9471 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9475 echo "Dirty pages flushed via fsync on EROFS"
9478 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
9480 # continue to use small resend count to reduce test_118* time (b=14842)
9481 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9485 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9486 remote_ost_nodsh && skip "remote OST with nodsh"
9490 #define OBD_FAIL_OST_BRW_PAUSE_BULK
9491 set_nodes_failloc "$(osts_nodes)" 0x214
9492 # multiop should block due to fsync until pages are written
9493 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9497 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9498 error "Multiop failed to block on fsync, pid=$MULTIPID"
9501 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9503 if [[ $WRITEBACK -eq 0 ]]; then
9504 error "No page in writeback, writeback=$WRITEBACK"
9507 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
9508 set_nodes_failloc "$(osts_nodes)" 0
9510 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9511 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9513 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9514 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9518 echo "Dirty pages gaurenteed flushed via fsync"
9521 run_test 118d "Fsync validation inject a delay of the bulk =========="
9524 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9528 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
9529 lctl set_param fail_loc=0x8000040a
9531 # Should simulate EINVAL error which is fatal
9532 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9534 if [[ $RC -eq 0 ]]; then
9535 error "Must return error due to dropped pages, rc=$RC"
9538 lctl set_param fail_loc=0x0
9540 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9541 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9542 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9544 if [[ $LOCKED -ne 0 ]]; then
9545 error "Locked pages remain in cache, locked=$LOCKED"
9548 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9549 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9553 echo "No pages locked after fsync"
9558 run_test 118f "Simulate unrecoverable OSC side error =========="
9561 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9565 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
9566 lctl set_param fail_loc=0x406
9568 # simulate local -ENOMEM
9569 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9572 lctl set_param fail_loc=0
9573 if [[ $RC -eq 0 ]]; then
9574 error "Must return error due to dropped pages, rc=$RC"
9577 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9578 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9579 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9581 if [[ $LOCKED -ne 0 ]]; then
9582 error "Locked pages remain in cache, locked=$LOCKED"
9585 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9586 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9590 echo "No pages locked after fsync"
9595 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
9598 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9599 remote_ost_nodsh && skip "remote OST with nodsh"
9603 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9604 set_nodes_failloc "$(osts_nodes)" 0x20e
9605 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9606 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9609 set_nodes_failloc "$(osts_nodes)" 0
9610 if [[ $RC -eq 0 ]]; then
9611 error "Must return error due to dropped pages, rc=$RC"
9614 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9615 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9616 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9618 if [[ $LOCKED -ne 0 ]]; then
9619 error "Locked pages remain in cache, locked=$LOCKED"
9622 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9623 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9627 echo "No pages locked after fsync"
9631 run_test 118h "Verify timeout in handling recoverables errors =========="
9633 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
9636 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9637 remote_ost_nodsh && skip "remote OST with nodsh"
9641 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9642 set_nodes_failloc "$(osts_nodes)" 0x20e
9644 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9645 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9648 set_nodes_failloc "$(osts_nodes)" 0
9652 if [[ $RC -ne 0 ]]; then
9653 error "got error, but should be not, rc=$RC"
9656 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9657 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9658 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9659 if [[ $LOCKED -ne 0 ]]; then
9660 error "Locked pages remain in cache, locked=$LOCKED"
9663 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9664 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9668 echo "No pages locked after fsync"
9672 run_test 118i "Fix error before timeout in recoverable error =========="
9674 [ "$SLOW" = "no" ] && set_resend_count 4
9677 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9678 remote_ost_nodsh && skip "remote OST with nodsh"
9682 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
9683 set_nodes_failloc "$(osts_nodes)" 0x220
9685 # return -EIO from OST
9686 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9688 set_nodes_failloc "$(osts_nodes)" 0x0
9689 if [[ $RC -eq 0 ]]; then
9690 error "Must return error due to dropped pages, rc=$RC"
9693 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9694 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9695 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9696 if [[ $LOCKED -ne 0 ]]; then
9697 error "Locked pages remain in cache, locked=$LOCKED"
9700 # in recoverable error on OST we want resend and stay until it finished
9701 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9702 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9706 echo "No pages locked after fsync"
9710 run_test 118j "Simulate unrecoverable OST side error =========="
9714 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9715 remote_ost_nodsh && skip "remote OSTs with nodsh"
9717 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9718 set_nodes_failloc "$(osts_nodes)" 0x20e
9719 test_mkdir $DIR/$tdir
9721 for ((i=0;i<10;i++)); do
9722 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
9723 error "dd to $DIR/$tdir/$tfile-$i failed" )&
9730 set_nodes_failloc "$(osts_nodes)" 0
9733 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
9735 test_118l() # LU-646
9737 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9739 test_mkdir $DIR/$tdir
9740 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
9743 run_test 118l "fsync dir"
9745 test_118m() # LU-3066
9747 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9749 test_mkdir $DIR/$tdir
9750 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
9753 run_test 118m "fdatasync dir ========="
9755 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
9762 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9763 remote_ost_nodsh && skip "remote OSTs with nodsh"
9765 # Sleep to avoid a cached response.
9766 #define OBD_STATFS_CACHE_SECONDS 1
9769 # Inject a 10 second delay in the OST_STATFS handler.
9770 #define OBD_FAIL_OST_STATFS_DELAY 0x242
9771 set_nodes_failloc "$(osts_nodes)" 0x242
9774 stat --file-system $MOUNT > /dev/null
9777 set_nodes_failloc "$(osts_nodes)" 0
9779 if ((end - begin > 20)); then
9780 error "statfs took $((end - begin)) seconds, expected 10"
9783 run_test 118n "statfs() sends OST_STATFS requests in parallel"
9785 test_119a() # bug 11737
9787 BSIZE=$((512 * 1024))
9788 directio write $DIR/$tfile 0 1 $BSIZE
9789 # We ask to read two blocks, which is more than a file size.
9790 # directio will indicate an error when requested and actual
9791 # sizes aren't equeal (a normal situation in this case) and
9792 # print actual read amount.
9793 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
9794 if [ "$NOB" != "$BSIZE" ]; then
9795 error "read $NOB bytes instead of $BSIZE"
9799 run_test 119a "Short directIO read must return actual read amount"
9801 test_119b() # bug 11737
9803 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9805 $SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed"
9806 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
9808 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
9809 error "direct read failed"
9812 run_test 119b "Sparse directIO read must return actual read amount"
9814 test_119c() # bug 13099
9817 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
9818 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
9821 run_test 119c "Testing for direct read hitting hole"
9823 test_119d() # bug 15950
9825 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9827 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
9828 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
9830 $SETSTRIPE $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
9831 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
9832 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
9833 lctl set_param fail_loc=0x40d
9834 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
9837 cat $DIR/$tfile > /dev/null &
9838 lctl set_param fail_loc=0
9841 log "the DIO writes have completed, now wait for the reads (should not block very long)"
9843 [ -n "`ps h -p $pid_reads -o comm`" ] && \
9844 error "the read rpcs have not completed in 2s"
9846 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
9848 run_test 119d "The DIO path should try to send a new rpc once one is completed"
9851 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9852 remote_mds_nodsh && skip "remote MDS with nodsh"
9853 test_mkdir $DIR/$tdir
9854 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
9855 skip_env "no early lock cancel on server"
9857 lru_resize_disable mdc
9858 lru_resize_disable osc
9859 cancel_lru_locks mdc
9860 # asynchronous object destroy at MDT could cause bl ast to client
9861 cancel_lru_locks osc
9863 stat $DIR/$tdir > /dev/null
9864 can1=$(do_facet $SINGLEMDS \
9865 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9866 awk '/ldlm_cancel/ {print $2}')
9867 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9868 awk '/ldlm_bl_callback/ {print $2}')
9869 test_mkdir -c1 $DIR/$tdir/d1
9870 can2=$(do_facet $SINGLEMDS \
9871 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9872 awk '/ldlm_cancel/ {print $2}')
9873 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9874 awk '/ldlm_bl_callback/ {print $2}')
9875 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
9876 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
9877 lru_resize_enable mdc
9878 lru_resize_enable osc
9880 run_test 120a "Early Lock Cancel: mkdir test"
9883 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9884 remote_mds_nodsh && skip "remote MDS with nodsh"
9885 test_mkdir $DIR/$tdir
9886 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
9887 skip_env "no early lock cancel on server"
9889 lru_resize_disable mdc
9890 lru_resize_disable osc
9891 cancel_lru_locks mdc
9892 stat $DIR/$tdir > /dev/null
9893 can1=$(do_facet $SINGLEMDS \
9894 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9895 awk '/ldlm_cancel/ {print $2}')
9896 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9897 awk '/ldlm_bl_callback/ {print $2}')
9899 can2=$(do_facet $SINGLEMDS \
9900 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9901 awk '/ldlm_cancel/ {print $2}')
9902 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9903 awk '/ldlm_bl_callback/ {print $2}')
9904 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
9905 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
9906 lru_resize_enable mdc
9907 lru_resize_enable osc
9909 run_test 120b "Early Lock Cancel: create test"
9912 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9913 remote_mds_nodsh && skip "remote MDS with nodsh"
9914 test_mkdir -c1 $DIR/$tdir
9915 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
9916 skip "no early lock cancel on server"
9918 lru_resize_disable mdc
9919 lru_resize_disable osc
9920 test_mkdir -c1 $DIR/$tdir/d1
9921 test_mkdir -c1 $DIR/$tdir/d2
9922 touch $DIR/$tdir/d1/f1
9923 cancel_lru_locks mdc
9924 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
9925 can1=$(do_facet $SINGLEMDS \
9926 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9927 awk '/ldlm_cancel/ {print $2}')
9928 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9929 awk '/ldlm_bl_callback/ {print $2}')
9930 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
9931 can2=$(do_facet $SINGLEMDS \
9932 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9933 awk '/ldlm_cancel/ {print $2}')
9934 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9935 awk '/ldlm_bl_callback/ {print $2}')
9936 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
9937 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
9938 lru_resize_enable mdc
9939 lru_resize_enable osc
9941 run_test 120c "Early Lock Cancel: link test"
9944 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9945 remote_mds_nodsh && skip "remote MDS with nodsh"
9946 test_mkdir -c1 $DIR/$tdir
9947 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
9948 skip_env "no early lock cancel on server"
9950 lru_resize_disable mdc
9951 lru_resize_disable osc
9953 cancel_lru_locks mdc
9954 stat $DIR/$tdir > /dev/null
9955 can1=$(do_facet $SINGLEMDS \
9956 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9957 awk '/ldlm_cancel/ {print $2}')
9958 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9959 awk '/ldlm_bl_callback/ {print $2}')
9960 chmod a+x $DIR/$tdir
9961 can2=$(do_facet $SINGLEMDS \
9962 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9963 awk '/ldlm_cancel/ {print $2}')
9964 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9965 awk '/ldlm_bl_callback/ {print $2}')
9966 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
9967 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
9968 lru_resize_enable mdc
9969 lru_resize_enable osc
9971 run_test 120d "Early Lock Cancel: setattr test"
9974 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9975 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
9976 skip_env "no early lock cancel on server"
9977 remote_mds_nodsh && skip "remote MDS with nodsh"
9979 local dlmtrace_set=false
9981 test_mkdir -c1 $DIR/$tdir
9982 lru_resize_disable mdc
9983 lru_resize_disable osc
9984 ! $LCTL get_param debug | grep -q dlmtrace &&
9985 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
9986 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
9987 cancel_lru_locks mdc
9988 cancel_lru_locks osc
9989 dd if=$DIR/$tdir/f1 of=/dev/null
9990 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
9991 # XXX client can not do early lock cancel of OST lock
9992 # during unlink (LU-4206), so cancel osc lock now.
9994 cancel_lru_locks osc
9995 can1=$(do_facet $SINGLEMDS \
9996 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
9997 awk '/ldlm_cancel/ {print $2}')
9998 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
9999 awk '/ldlm_bl_callback/ {print $2}')
10000 unlink $DIR/$tdir/f1
10002 can2=$(do_facet $SINGLEMDS \
10003 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10004 awk '/ldlm_cancel/ {print $2}')
10005 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10006 awk '/ldlm_bl_callback/ {print $2}')
10007 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10008 $LCTL dk $TMP/cancel.debug.txt
10009 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10010 $LCTL dk $TMP/blocking.debug.txt
10011 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10012 lru_resize_enable mdc
10013 lru_resize_enable osc
10015 run_test 120e "Early Lock Cancel: unlink test"
10018 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10019 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10020 skip_env "no early lock cancel on server"
10021 remote_mds_nodsh && skip "remote MDS with nodsh"
10023 test_mkdir -c1 $DIR/$tdir
10024 lru_resize_disable mdc
10025 lru_resize_disable osc
10026 test_mkdir -c1 $DIR/$tdir/d1
10027 test_mkdir -c1 $DIR/$tdir/d2
10028 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10029 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10030 cancel_lru_locks mdc
10031 cancel_lru_locks osc
10032 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10033 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10034 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10035 # XXX client can not do early lock cancel of OST lock
10036 # during rename (LU-4206), so cancel osc lock now.
10038 cancel_lru_locks osc
10039 can1=$(do_facet $SINGLEMDS \
10040 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10041 awk '/ldlm_cancel/ {print $2}')
10042 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10043 awk '/ldlm_bl_callback/ {print $2}')
10044 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10046 can2=$(do_facet $SINGLEMDS \
10047 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10048 awk '/ldlm_cancel/ {print $2}')
10049 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10050 awk '/ldlm_bl_callback/ {print $2}')
10051 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10052 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10053 lru_resize_enable mdc
10054 lru_resize_enable osc
10056 run_test 120f "Early Lock Cancel: rename test"
10059 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10060 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10061 skip_env "no early lock cancel on server"
10062 remote_mds_nodsh && skip "remote MDS with nodsh"
10064 lru_resize_disable mdc
10065 lru_resize_disable osc
10067 echo create $count files
10068 test_mkdir $DIR/$tdir
10069 cancel_lru_locks mdc
10070 cancel_lru_locks osc
10073 can0=$(do_facet $SINGLEMDS \
10074 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10075 awk '/ldlm_cancel/ {print $2}')
10076 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10077 awk '/ldlm_bl_callback/ {print $2}')
10078 createmany -o $DIR/$tdir/f $count
10080 can1=$(do_facet $SINGLEMDS \
10081 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10082 awk '/ldlm_cancel/ {print $2}')
10083 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10084 awk '/ldlm_bl_callback/ {print $2}')
10086 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10087 echo rm $count files
10090 can2=$(do_facet $SINGLEMDS \
10091 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10092 awk '/ldlm_cancel/ {print $2}')
10093 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10094 awk '/ldlm_bl_callback/ {print $2}')
10096 echo total: $count removes in $((t2-t1))
10097 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10099 # wait for commitment of removal
10100 lru_resize_enable mdc
10101 lru_resize_enable osc
10103 run_test 120g "Early Lock Cancel: performance test"
10105 test_121() { #bug #10589
10106 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10109 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10110 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10111 lctl set_param fail_loc=0x310
10112 cancel_lru_locks osc > /dev/null
10113 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10114 lctl set_param fail_loc=0
10115 [[ $reads -eq $writes ]] ||
10116 error "read $reads blocks, must be $writes blocks"
10118 run_test 121 "read cancel race ========="
10120 test_123a() { # was test 123, statahead(bug 11401)
10121 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10124 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10125 log "testing UP system. Performance may be lower than expected."
10130 test_mkdir $DIR/$tdir
10131 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10132 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10134 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10135 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10137 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10138 lctl set_param -n llite.*.statahead_max 0
10139 lctl get_param llite.*.statahead_max
10140 cancel_lru_locks mdc
10141 cancel_lru_locks osc
10143 time ls -l $DIR/$tdir | wc -l
10145 delta=$((etime - stime))
10146 log "ls $i files without statahead: $delta sec"
10147 lctl set_param llite.*.statahead_max=$max
10149 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10150 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
10151 cancel_lru_locks mdc
10152 cancel_lru_locks osc
10154 time ls -l $DIR/$tdir | wc -l
10156 delta_sa=$((etime - stime))
10157 log "ls $i files with statahead: $delta_sa sec"
10158 lctl get_param -n llite.*.statahead_stats
10159 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10161 [[ $swrong -lt $ewrong ]] &&
10162 log "statahead was stopped, maybe too many locks held!"
10163 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
10165 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10166 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10167 lctl set_param -n llite.*.statahead_max 0
10168 lctl get_param llite.*.statahead_max
10169 cancel_lru_locks mdc
10170 cancel_lru_locks osc
10172 time ls -l $DIR/$tdir | wc -l
10174 delta=$((etime - stime))
10175 log "ls $i files again without statahead: $delta sec"
10176 lctl set_param llite.*.statahead_max=$max
10177 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10178 if [ $SLOWOK -eq 0 ]; then
10179 error "ls $i files is slower with statahead!"
10181 log "ls $i files is slower with statahead!"
10187 [ $delta -gt 20 ] && break
10188 [ $delta -gt 8 ] && MULT=$((50 / delta))
10189 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
10197 delta=$((etime - stime))
10198 log "rm -r $DIR/$tdir/: $delta seconds"
10200 lctl get_param -n llite.*.statahead_stats
10202 run_test 123a "verify statahead work"
10204 test_123b () { # statahead(bug 15027)
10205 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10207 test_mkdir $DIR/$tdir
10208 createmany -o $DIR/$tdir/$tfile-%d 1000
10210 cancel_lru_locks mdc
10211 cancel_lru_locks osc
10213 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
10214 lctl set_param fail_loc=0x80000803
10215 ls -lR $DIR/$tdir > /dev/null
10217 lctl set_param fail_loc=0x0
10218 lctl get_param -n llite.*.statahead_stats
10223 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
10226 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10227 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10228 skip_env "no lru resize on server"
10232 test_mkdir $DIR/$tdir
10234 log "create $NR files at $DIR/$tdir"
10235 createmany -o $DIR/$tdir/f $NR ||
10236 error "failed to create $NR files in $DIR/$tdir"
10238 cancel_lru_locks mdc
10239 ls -l $DIR/$tdir > /dev/null
10243 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
10244 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
10245 LRU_SIZE=$($LCTL get_param -n $PARAM)
10246 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
10247 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
10249 log "NS=$(basename $NSDIR)"
10254 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
10255 skip "Not enough cached locks created!"
10257 log "LRU=$LRU_SIZE"
10261 # We know that lru resize allows one client to hold $LIMIT locks
10262 # for 10h. After that locks begin to be killed by client.
10264 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
10266 if [ $LIMIT -lt $LRU_SIZE ]; then
10267 skip "Limit is too small $LIMIT"
10270 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
10271 # killing locks. Some time was spent for creating locks. This means
10272 # that up to the moment of sleep finish we must have killed some of
10273 # them (10-100 locks). This depends on how fast ther were created.
10274 # Many of them were touched in almost the same moment and thus will
10275 # be killed in groups.
10276 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
10278 # Use $LRU_SIZE_B here to take into account real number of locks
10279 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
10280 local LRU_SIZE_B=$LRU_SIZE
10282 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
10283 log "OLD_LVF=$OLD_LVF"
10284 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
10286 # Let's make sure that we really have some margin. Client checks
10287 # cached locks every 10 sec.
10288 SLEEP=$((SLEEP+20))
10289 log "Sleep ${SLEEP} sec"
10291 while ((SEC<$SLEEP)); do
10295 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
10296 echo -n "$LRU_SIZE"
10299 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
10300 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
10302 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
10303 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
10304 unlinkmany $DIR/$tdir/f $NR
10308 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
10309 log "unlink $NR files at $DIR/$tdir"
10310 unlinkmany $DIR/$tdir/f $NR
10312 run_test 124a "lru resize ======================================="
10314 get_max_pool_limit()
10316 local limit=$($LCTL get_param \
10317 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
10319 for l in $limit; do
10320 if [[ $l -gt $max ]]; then
10328 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10329 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10330 skip_env "no lru resize on server"
10332 LIMIT=$(get_max_pool_limit)
10334 NR=$(($(default_lru_size)*20))
10335 if [[ $NR -gt $LIMIT ]]; then
10336 log "Limit lock number by $LIMIT locks"
10340 IFree=$(mdsrate_inodes_available)
10341 if [ $IFree -lt $NR ]; then
10342 log "Limit lock number by $IFree inodes"
10346 lru_resize_disable mdc
10347 test_mkdir -p $DIR/$tdir/disable_lru_resize
10349 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
10350 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
10351 cancel_lru_locks mdc
10354 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10357 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10360 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10364 nolruresize_delta=$((etime-stime))
10365 log "ls -la time: $nolruresize_delta seconds"
10366 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10367 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
10369 lru_resize_enable mdc
10370 test_mkdir -p $DIR/$tdir/enable_lru_resize
10372 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
10373 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
10374 cancel_lru_locks mdc
10377 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10380 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10383 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10387 lruresize_delta=$((etime-stime))
10388 log "ls -la time: $lruresize_delta seconds"
10389 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10391 if [ $lruresize_delta -gt $nolruresize_delta ]; then
10392 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
10393 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
10394 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
10396 log "lru resize performs the same with no lru resize"
10398 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
10400 run_test 124b "lru resize (performance test) ======================="
10403 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10404 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10405 skip_env "no lru resize on server"
10407 # cache ununsed locks on client
10409 cancel_lru_locks mdc
10410 test_mkdir $DIR/$tdir
10411 createmany -o $DIR/$tdir/f $nr ||
10412 error "failed to create $nr files in $DIR/$tdir"
10413 ls -l $DIR/$tdir > /dev/null
10415 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10416 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10417 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10418 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10419 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10421 # set lru_max_age to 1 sec
10422 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10423 echo "sleep $((recalc_p * 2)) seconds..."
10424 sleep $((recalc_p * 2))
10426 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10427 # restore lru_max_age
10428 $LCTL set_param -n $nsdir.lru_max_age $max_age
10429 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10430 unlinkmany $DIR/$tdir/f $nr
10432 run_test 124c "LRUR cancel very aged locks"
10435 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10436 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10437 skip_env "no lru resize on server"
10439 # cache ununsed locks on client
10442 lru_resize_disable mdc
10443 stack_trap "lru_resize_enable mdc" EXIT
10445 cancel_lru_locks mdc
10447 # asynchronous object destroy at MDT could cause bl ast to client
10448 test_mkdir $DIR/$tdir
10449 createmany -o $DIR/$tdir/f $nr ||
10450 error "failed to create $nr files in $DIR/$tdir"
10451 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
10453 ls -l $DIR/$tdir > /dev/null
10455 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10456 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10457 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10458 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10460 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10462 # set lru_max_age to 1 sec
10463 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10464 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
10466 echo "sleep $((recalc_p * 2)) seconds..."
10467 sleep $((recalc_p * 2))
10469 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10471 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10473 run_test 124d "cancel very aged locks if lru-resize diasbaled"
10475 test_125() { # 13358
10476 $LCTL get_param -n llite.*.client_type | grep -q local ||
10477 skip "must run as local client"
10478 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
10479 skip_env "must have acl enabled"
10480 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
10482 test_mkdir $DIR/$tdir
10483 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
10484 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
10485 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
10487 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
10489 test_126() { # bug 12829/13455
10490 $GSS && skip_env "must run as gss disabled"
10491 $LCTL get_param -n llite.*.client_type | grep -q local ||
10492 skip "must run as local client"
10493 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
10495 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
10496 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
10498 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
10500 run_test 126 "check that the fsgid provided by the client is taken into account"
10502 test_127a() { # bug 15521
10503 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10505 $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
10506 $LCTL set_param osc.*.stats=0
10507 FSIZE=$((2048 * 1024))
10508 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
10509 cancel_lru_locks osc
10510 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
10512 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
10513 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
10514 echo "got $COUNT $NAME"
10515 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
10516 eval $NAME=$COUNT || error "Wrong proc format"
10519 read_bytes|write_bytes)
10520 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
10521 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
10522 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
10523 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
10524 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
10525 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
10526 error "sumsquare is too small: $SUMSQ"
10527 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
10528 error "sumsquare is too big: $SUMSQ"
10532 done < $DIR/${tfile}.tmp
10534 #check that we actually got some stats
10535 [ "$read_bytes" ] || error "Missing read_bytes stats"
10536 [ "$write_bytes" ] || error "Missing write_bytes stats"
10537 [ "$read_bytes" != 0 ] || error "no read done"
10538 [ "$write_bytes" != 0 ] || error "no write done"
10540 run_test 127a "verify the client stats are sane"
10542 test_127b() { # bug LU-333
10543 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10544 local name count samp unit min max sum sumsq
10546 $LCTL set_param llite.*.stats=0
10548 # perform 2 reads and writes so MAX is different from SUM.
10549 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10550 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10551 cancel_lru_locks osc
10552 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10553 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10555 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
10556 while read name count samp unit min max sum sumsq; do
10557 echo "got $count $name"
10558 eval $name=$count || error "Wrong proc format"
10562 [ $count -ne 2 ] && error "count is not 2: $count"
10563 [ $min -ne $PAGE_SIZE ] &&
10564 error "min is not $PAGE_SIZE: $min"
10565 [ $max -ne $PAGE_SIZE ] &&
10566 error "max is incorrect: $max"
10567 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10568 error "sum is wrong: $sum"
10571 [ $count -ne 2 ] && error "count is not 2: $count"
10572 [ $min -ne $PAGE_SIZE ] &&
10573 error "min is not $PAGE_SIZE: $min"
10574 [ $max -ne $PAGE_SIZE ] &&
10575 error "max is incorrect: $max"
10576 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10577 error "sum is wrong: $sum"
10581 done < $TMP/$tfile.tmp
10583 #check that we actually got some stats
10584 [ "$read_bytes" ] || error "Missing read_bytes stats"
10585 [ "$write_bytes" ] || error "Missing write_bytes stats"
10586 [ "$read_bytes" != 0 ] || error "no read done"
10587 [ "$write_bytes" != 0 ] || error "no write done"
10589 rm -f $TMP/${tfile}.tmp
10591 run_test 127b "verify the llite client stats are sane"
10593 test_127c() { # LU-12394
10594 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
10601 $LCTL set_param llite.*.extents_stats=1
10602 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
10604 # Use two stripes so there is enough space in default config
10605 $LFS setstripe -c 2 $DIR/$tfile
10607 # Extent stats start at 0-4K and go in power of two buckets
10608 # LL_HIST_START = 12 --> 2^12 = 4K
10609 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
10610 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
10612 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
10614 # Write and read, 2x each, second time at a non-zero offset
10615 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
10616 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
10617 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
10618 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
10622 $LCTL get_param llite.*.extents_stats
10625 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
10627 local bucket=$($LCTL get_param -n llite.*.extents_stats |
10629 reads=$(echo $bucket | awk '{print $5}')
10630 writes=$(echo $bucket | awk '{print $9}')
10631 [ "$reads" -eq $count ] ||
10632 error "$reads reads in < $bsize bucket, expect $count"
10633 [ "$writes" -eq $count ] ||
10634 error "$writes writes in < $bsize bucket, expect $count"
10637 # Test mmap write and read
10638 $LCTL set_param llite.*.extents_stats=c
10640 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
10641 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
10642 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
10644 $LCTL get_param llite.*.extents_stats
10646 count=$(((size*1024) / PAGE_SIZE))
10648 bsize=$((2 * PAGE_SIZE / 1024))K
10650 bucket=$($LCTL get_param -n llite.*.extents_stats |
10652 reads=$(echo $bucket | awk '{print $5}')
10653 writes=$(echo $bucket | awk '{print $9}')
10654 # mmap writes fault in the page first, creating an additonal read
10655 [ "$reads" -eq $((2 * count)) ] ||
10656 error "$reads reads in < $bsize bucket, expect $count"
10657 [ "$writes" -eq $count ] ||
10658 error "$writes writes in < $bsize bucket, expect $count"
10660 run_test 127c "test llite extent stats with regular & mmap i/o"
10662 test_128() { # bug 15212
10664 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
10669 result=$(grep error $TMP/$tfile.log)
10670 rm -f $DIR/$tfile $TMP/$tfile.log
10671 [ -z "$result" ] ||
10672 error "consecutive find's under interactive lfs failed"
10674 run_test 128 "interactive lfs for 2 consecutive find's"
10676 set_dir_limits () {
10681 local ldproc=/proc/fs/ldiskfs
10682 local facets=$(get_facets MDS)
10684 for facet in ${facets//,/ }; do
10685 canondev=$(ldiskfs_canon \
10686 *.$(convert_facet2label $facet).mntdev $facet)
10687 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
10688 ldproc=/sys/fs/ldiskfs
10689 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
10690 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
10694 check_mds_dmesg() {
10695 local facets=$(get_facets MDS)
10696 for facet in ${facets//,/ }; do
10697 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
10703 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10704 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
10705 skip "Need MDS version with at least 2.5.56"
10706 if [ "$mds1_FSTYPE" != ldiskfs ]; then
10707 skip_env "ldiskfs only test"
10709 remote_mds_nodsh && skip "remote MDS with nodsh"
10713 local has_warning=false
10716 mkdir -p $DIR/$tdir
10718 # block size of mds1
10719 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
10720 set_dir_limits $maxsize $maxsize
10721 local dirsize=$(stat -c%s "$DIR/$tdir")
10723 while [[ $dirsize -le $maxsize ]]; do
10724 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
10726 if ! $has_warning; then
10727 check_mds_dmesg '"is approaching"' && has_warning=true
10729 # check two errors:
10730 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
10731 # EFBIG for previous versions included in ldiskfs series
10732 if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
10734 echo "return code $rc received as expected"
10736 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
10737 error_exit "create failed w/o dir size limit"
10739 check_mds_dmesg '"has reached"' ||
10740 error_exit "reached message should be output"
10742 [ $has_warning = "false" ] &&
10743 error_exit "warning message should be output"
10745 dirsize=$(stat -c%s "$DIR/$tdir")
10747 [[ $dirsize -ge $maxsize ]] && return 0
10748 error_exit "current dir size $dirsize, " \
10749 "previous limit $maxsize"
10750 elif [ $rc -ne 0 ]; then
10752 error_exit "return $rc received instead of expected " \
10753 "$EFBIG or $ENOSPC, files in dir $dirsize"
10755 nfiles=$((nfiles + 1))
10756 dirsize=$(stat -c%s "$DIR/$tdir")
10760 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
10762 run_test 129 "test directory size limit ========================"
10771 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
10772 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
10774 trap cleanup_130 EXIT RETURN
10776 local fm_file=$DIR/$tfile
10777 $SETSTRIPE -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
10778 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
10779 error "dd failed for $fm_file"
10781 # LU-1795: test filefrag/FIEMAP once, even if unsupported
10782 filefrag -ves $fm_file
10784 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
10785 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
10786 [ $RC != 0 ] && error "filefrag $fm_file failed"
10788 filefrag_op=$(filefrag -ve -k $fm_file |
10789 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
10790 lun=$($GETSTRIPE -i $fm_file)
10792 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
10795 for line in $filefrag_op
10797 frag_lun=`echo $line | cut -d: -f5`
10798 ext_len=`echo $line | cut -d: -f4`
10799 if (( $frag_lun != $lun )); then
10801 error "FIEMAP on 1-stripe file($fm_file) failed"
10804 (( tot_len += ext_len ))
10807 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
10809 error "FIEMAP on 1-stripe file($fm_file) failed;"
10815 echo "FIEMAP on single striped file succeeded"
10817 run_test 130a "FIEMAP (1-stripe file)"
10820 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
10822 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
10823 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
10825 trap cleanup_130 EXIT RETURN
10827 local fm_file=$DIR/$tfile
10828 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
10829 error "setstripe on $fm_file"
10830 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
10831 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
10833 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
10834 error "dd failed on $fm_file"
10836 filefrag -ves $fm_file || error "filefrag $fm_file failed"
10837 filefrag_op=$(filefrag -ve -k $fm_file |
10838 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
10840 last_lun=$(echo $filefrag_op | cut -d: -f5 |
10841 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
10846 for line in $filefrag_op
10848 frag_lun=$(echo $line | cut -d: -f5 |
10849 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
10850 ext_len=$(echo $line | cut -d: -f4)
10851 if (( $frag_lun != $last_lun )); then
10852 if (( tot_len != 1024 )); then
10854 error "FIEMAP on $fm_file failed; returned " \
10855 "len $tot_len for OST $last_lun instead of 1024"
10858 (( num_luns += 1 ))
10862 (( tot_len += ext_len ))
10865 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
10867 error "FIEMAP on $fm_file failed; returned wrong number of " \
10868 "luns or wrong len for OST $last_lun"
10874 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
10876 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
10879 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10881 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
10882 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
10884 trap cleanup_130 EXIT RETURN
10886 local fm_file=$DIR/$tfile
10887 $SETSTRIPE -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
10888 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
10889 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
10891 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
10892 error "dd failed on $fm_file"
10894 filefrag -ves $fm_file || error "filefrag $fm_file failed"
10895 filefrag_op=$(filefrag -ve -k $fm_file |
10896 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
10898 last_lun=$(echo $filefrag_op | cut -d: -f5 |
10899 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
10904 for line in $filefrag_op
10906 frag_lun=$(echo $line | cut -d: -f5 |
10907 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
10908 ext_len=$(echo $line | cut -d: -f4)
10909 if (( $frag_lun != $last_lun )); then
10910 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
10911 if (( logical != 512 )); then
10913 error "FIEMAP on $fm_file failed; returned " \
10914 "logical start for lun $logical instead of 512"
10917 if (( tot_len != 512 )); then
10919 error "FIEMAP on $fm_file failed; returned " \
10920 "len $tot_len for OST $last_lun instead of 1024"
10923 (( num_luns += 1 ))
10927 (( tot_len += ext_len ))
10930 if (( num_luns != 2 || tot_len != 512 )); then
10932 error "FIEMAP on $fm_file failed; returned wrong number of " \
10933 "luns or wrong len for OST $last_lun"
10939 echo "FIEMAP on 2-stripe file with hole succeeded"
10941 run_test 130c "FIEMAP (2-stripe file with hole)"
10944 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
10946 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
10947 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
10949 trap cleanup_130 EXIT RETURN
10951 local fm_file=$DIR/$tfile
10952 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
10953 error "setstripe on $fm_file"
10954 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
10955 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
10957 local actual_stripe_count=$($GETSTRIPE -c $fm_file)
10958 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
10959 error "dd failed on $fm_file"
10961 filefrag -ves $fm_file || error "filefrag $fm_file failed"
10962 filefrag_op=$(filefrag -ve -k $fm_file |
10963 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
10965 last_lun=$(echo $filefrag_op | cut -d: -f5 |
10966 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
10971 for line in $filefrag_op
10973 frag_lun=$(echo $line | cut -d: -f5 |
10974 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
10975 ext_len=$(echo $line | cut -d: -f4)
10976 if (( $frag_lun != $last_lun )); then
10977 if (( tot_len != 1024 )); then
10979 error "FIEMAP on $fm_file failed; returned " \
10980 "len $tot_len for OST $last_lun instead of 1024"
10983 (( num_luns += 1 ))
10987 (( tot_len += ext_len ))
10990 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
10992 error "FIEMAP on $fm_file failed; returned wrong number of " \
10993 "luns or wrong len for OST $last_lun"
10999 echo "FIEMAP on N-stripe file succeeded"
11001 run_test 130d "FIEMAP (N-stripe file)"
11004 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11006 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11007 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11009 trap cleanup_130 EXIT RETURN
11011 local fm_file=$DIR/$tfile
11012 $SETSTRIPE -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11013 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11014 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11017 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11018 for ((i = 0; i < $NUM_BLKS; i++))
11020 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11023 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11024 filefrag_op=$(filefrag -ve -k $fm_file |
11025 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11027 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11028 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11033 for line in $filefrag_op
11035 frag_lun=$(echo $line | cut -d: -f5 |
11036 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11037 ext_len=$(echo $line | cut -d: -f4)
11038 if (( $frag_lun != $last_lun )); then
11039 if (( tot_len != $EXPECTED_LEN )); then
11041 error "FIEMAP on $fm_file failed; returned " \
11042 "len $tot_len for OST $last_lun instead " \
11046 (( num_luns += 1 ))
11050 (( tot_len += ext_len ))
11053 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11055 error "FIEMAP on $fm_file failed; returned wrong number " \
11056 "of luns or wrong len for OST $last_lun"
11062 echo "FIEMAP with continuation calls succeeded"
11064 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11067 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11068 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11070 local fm_file=$DIR/$tfile
11071 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11072 error "multiop create with lov_delay_create on $fm_file"
11074 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11075 filefrag_extents=$(filefrag -vek $fm_file |
11076 awk '/extents? found/ { print $2 }')
11077 if [[ "$filefrag_extents" != "0" ]]; then
11078 error "FIEMAP on $fm_file failed; " \
11079 "returned $filefrag_extents expected 0"
11084 run_test 130f "FIEMAP (unstriped file)"
11086 # Test for writev/readv
11088 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11089 error "writev test failed"
11090 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11091 error "readv failed"
11094 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11097 local fsize=$((524288 + 1048576 + 1572864))
11098 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11099 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11100 error "append writev test failed"
11102 ((fsize += 1572864 + 1048576))
11103 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11104 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11105 error "append writev test failed"
11108 run_test 131b "test append writev"
11111 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11114 run_test 131c "test read/write on file w/o objects"
11117 rwv -f $DIR/$tfile -w -n 1 1572864
11118 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11119 if [ "$NOB" != 1572864 ]; then
11120 error "Short read filed: read $NOB bytes instead of 1572864"
11124 run_test 131d "test short read"
11127 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11128 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11129 error "read hitting hole failed"
11132 run_test 131e "test read hitting hole"
11141 mds*) res=$(do_facet $facet \
11142 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11144 ost*) res=$(do_facet $facet \
11145 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
11147 *) error "Wrong facet '$facet'" ;;
11149 [ "$res" ] || error "The counter for $op on $facet was not incremented"
11150 # if the argument $3 is zero, it means any stat increment is ok.
11151 if [[ $want -gt 0 ]]; then
11152 local count=$(echo $res | awk '{ print $2 }')
11153 [[ $count -ne $want ]] &&
11154 error "The $op counter on $facet is $count, not $want"
11159 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11160 remote_ost_nodsh && skip "remote OST with nodsh"
11161 remote_mds_nodsh && skip "remote MDS with nodsh"
11162 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11163 skip_env "MDS doesn't support rename stats"
11165 local testdir=$DIR/${tdir}/stats_testdir
11167 mkdir -p $DIR/${tdir}
11170 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11171 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11173 # verify mdt stats first.
11174 mkdir ${testdir} || error "mkdir failed"
11175 check_stats $SINGLEMDS "mkdir" 1
11176 touch ${testdir}/${tfile} || error "touch failed"
11177 check_stats $SINGLEMDS "open" 1
11178 check_stats $SINGLEMDS "close" 1
11179 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
11180 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
11181 check_stats $SINGLEMDS "mknod" 2
11183 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
11184 check_stats $SINGLEMDS "unlink" 1
11185 rm -f ${testdir}/${tfile} || error "file remove failed"
11186 check_stats $SINGLEMDS "unlink" 2
11188 # remove working dir and check mdt stats again.
11189 rmdir ${testdir} || error "rmdir failed"
11190 check_stats $SINGLEMDS "rmdir" 1
11192 local testdir1=$DIR/${tdir}/stats_testdir1
11193 mkdir -p ${testdir}
11194 mkdir -p ${testdir1}
11195 touch ${testdir1}/test1
11196 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
11197 check_stats $SINGLEMDS "crossdir_rename" 1
11199 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
11200 check_stats $SINGLEMDS "samedir_rename" 1
11202 rm -rf $DIR/${tdir}
11204 run_test 133a "Verifying MDT stats ========================================"
11209 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11210 remote_ost_nodsh && skip "remote OST with nodsh"
11211 remote_mds_nodsh && skip "remote MDS with nodsh"
11213 local testdir=$DIR/${tdir}/stats_testdir
11215 mkdir -p ${testdir} || error "mkdir failed"
11216 touch ${testdir}/${tfile} || error "touch failed"
11217 cancel_lru_locks mdc
11220 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11221 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11223 # extra mdt stats verification.
11224 chmod 444 ${testdir}/${tfile} || error "chmod failed"
11225 check_stats $SINGLEMDS "setattr" 1
11226 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11227 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
11229 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
11230 check_stats $SINGLEMDS "getattr" 1
11232 rm -rf $DIR/${tdir}
11234 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
11235 # so the check below is not reliable
11236 [ $MDSCOUNT -eq 1 ] || return 0
11238 # Sleep to avoid a cached response.
11239 #define OBD_STATFS_CACHE_SECONDS 1
11241 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11242 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11243 $LFS df || error "lfs failed"
11244 check_stats $SINGLEMDS "statfs" 1
11246 # check aggregated statfs (LU-10018)
11247 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
11249 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
11252 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11253 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11255 check_stats $SINGLEMDS "statfs" 1
11257 # We want to check that the client didn't send OST_STATFS to
11258 # ost1 but the MDT also uses OST_STATFS for precreate. So some
11259 # extra care is needed here.
11260 if remote_mds; then
11261 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
11262 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
11264 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
11265 [ "$res" ] && error "OST got STATFS"
11270 run_test 133b "Verifying extra MDT stats =================================="
11273 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11274 remote_ost_nodsh && skip "remote OST with nodsh"
11275 remote_mds_nodsh && skip "remote MDS with nodsh"
11277 local testdir=$DIR/$tdir/stats_testdir
11279 test_mkdir -p $testdir
11281 # verify obdfilter stats.
11282 $SETSTRIPE -c 1 -i 0 $testdir/$tfile
11284 cancel_lru_locks osc
11285 wait_delete_completed
11288 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11289 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11291 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
11294 cancel_lru_locks osc
11295 check_stats ost1 "write" 1
11297 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
11298 check_stats ost1 "read" 1
11300 > $testdir/$tfile || error "truncate failed"
11301 check_stats ost1 "punch" 1
11303 rm -f $testdir/$tfile || error "file remove failed"
11304 wait_delete_completed
11305 check_stats ost1 "destroy" 1
11309 run_test 133c "Verifying OST stats ========================================"
11316 while [ $value -ge 2 ]; do
11321 if [ $orig -gt $order ]; then
11329 local size=('K' 'M' 'G' 'T');
11331 local size_string=$value
11333 while [ $value -ge 1024 ]; do
11334 if [ $i -gt 3 ]; then
11335 #T is the biggest unit we get here, if that is bigger,
11337 size_string=${value}T
11340 value=$((value >> 10))
11341 if [ $value -lt 1024 ]; then
11342 size_string=${value}${size[$i]}
11351 get_rename_size() {
11353 local context=${2:-.}
11354 local sample=$(do_facet $SINGLEMDS $LCTL \
11355 get_param mdt.$FSNAME-MDT0000.rename_stats |
11356 grep -A1 $context |
11357 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
11362 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11363 remote_ost_nodsh && skip "remote OST with nodsh"
11364 remote_mds_nodsh && skip "remote MDS with nodsh"
11365 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11366 skip_env "MDS doesn't support rename stats"
11368 local testdir1=$DIR/${tdir}/stats_testdir1
11369 local testdir2=$DIR/${tdir}/stats_testdir2
11370 mkdir -p $DIR/${tdir}
11372 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11374 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
11375 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
11377 createmany -o $testdir1/test 512 || error "createmany failed"
11379 # check samedir rename size
11380 mv ${testdir1}/test0 ${testdir1}/test_0
11382 local testdir1_size=$(ls -l $DIR/${tdir} |
11383 awk '/stats_testdir1/ {print $5}')
11384 local testdir2_size=$(ls -l $DIR/${tdir} |
11385 awk '/stats_testdir2/ {print $5}')
11387 testdir1_size=$(order_2 $testdir1_size)
11388 testdir2_size=$(order_2 $testdir2_size)
11390 testdir1_size=$(size_in_KMGT $testdir1_size)
11391 testdir2_size=$(size_in_KMGT $testdir2_size)
11393 echo "source rename dir size: ${testdir1_size}"
11394 echo "target rename dir size: ${testdir2_size}"
11396 local cmd="do_facet $SINGLEMDS $LCTL "
11397 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
11399 eval $cmd || error "$cmd failed"
11400 local samedir=$($cmd | grep 'same_dir')
11401 local same_sample=$(get_rename_size $testdir1_size)
11402 [ -z "$samedir" ] && error "samedir_rename_size count error"
11403 [[ $same_sample -eq 1 ]] ||
11404 error "samedir_rename_size error $same_sample"
11405 echo "Check same dir rename stats success"
11407 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11409 # check crossdir rename size
11410 mv ${testdir1}/test_0 ${testdir2}/test_0
11412 testdir1_size=$(ls -l $DIR/${tdir} |
11413 awk '/stats_testdir1/ {print $5}')
11414 testdir2_size=$(ls -l $DIR/${tdir} |
11415 awk '/stats_testdir2/ {print $5}')
11417 testdir1_size=$(order_2 $testdir1_size)
11418 testdir2_size=$(order_2 $testdir2_size)
11420 testdir1_size=$(size_in_KMGT $testdir1_size)
11421 testdir2_size=$(size_in_KMGT $testdir2_size)
11423 echo "source rename dir size: ${testdir1_size}"
11424 echo "target rename dir size: ${testdir2_size}"
11426 eval $cmd || error "$cmd failed"
11427 local crossdir=$($cmd | grep 'crossdir')
11428 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
11429 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
11430 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
11431 [[ $src_sample -eq 1 ]] ||
11432 error "crossdir_rename_size error $src_sample"
11433 [[ $tgt_sample -eq 1 ]] ||
11434 error "crossdir_rename_size error $tgt_sample"
11435 echo "Check cross dir rename stats success"
11436 rm -rf $DIR/${tdir}
11438 run_test 133d "Verifying rename_stats ========================================"
11441 remote_mds_nodsh && skip "remote MDS with nodsh"
11442 remote_ost_nodsh && skip "remote OST with nodsh"
11443 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11445 local testdir=$DIR/${tdir}/stats_testdir
11446 local ctr f0 f1 bs=32768 count=42 sum
11448 mkdir -p ${testdir} || error "mkdir failed"
11450 $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
11452 for ctr in {write,read}_bytes; do
11454 cancel_lru_locks osc
11456 do_facet ost1 $LCTL set_param -n \
11457 "obdfilter.*.exports.clear=clear"
11459 if [ $ctr = write_bytes ]; then
11461 f1=${testdir}/${tfile}
11463 f0=${testdir}/${tfile}
11467 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
11470 cancel_lru_locks osc
11472 sum=$(do_facet ost1 $LCTL get_param \
11473 "obdfilter.*.exports.*.stats" |
11474 awk -v ctr=$ctr 'BEGIN { sum = 0 }
11475 $1 == ctr { sum += $7 }
11476 END { printf("%0.0f", sum) }')
11478 if ((sum != bs * count)); then
11479 error "Bad $ctr sum, expected $((bs * count)), got $sum"
11483 rm -rf $DIR/${tdir}
11485 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
11487 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
11489 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
11490 # not honor the -ignore_readdir_race option correctly. So we call
11491 # error_ignore() rather than error() in these cases. See LU-11152.
11493 if (find --version; do_facet mds1 find --version) |
11494 grep -q '\b4\.5\.1[1-4]\b'; then
11495 error_ignore LU-11152 "$@"
11502 # First without trusting modes.
11503 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
11504 echo "proc_dirs='$proc_dirs'"
11505 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
11506 find $proc_dirs -exec cat '{}' \; &> /dev/null
11508 # Second verifying readability.
11509 $LCTL get_param -R '*' &> /dev/null
11511 # Verifing writability with badarea_io.
11513 -ignore_readdir_race \
11515 -not -name force_lbug \
11516 -not -name changelog_mask \
11517 -exec badarea_io '{}' \; ||
11518 error_133 "find $proc_dirs failed"
11520 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
11523 remote_mds_nodsh && skip "remote MDS with nodsh"
11524 remote_ost_nodsh && skip "remote OST with nodsh"
11526 # eventually, this can also be replaced with "lctl get_param -R",
11527 # but not until that option is always available on the server
11529 for facet in mds1 ost1; do
11530 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
11531 skip_noexit "Too old lustre on $facet"
11532 local facet_proc_dirs=$(do_facet $facet \
11533 \\\ls -d $proc_regexp 2>/dev/null)
11534 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11535 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11536 do_facet $facet find $facet_proc_dirs \
11537 ! -name req_history \
11538 -exec cat '{}' \\\; &> /dev/null
11540 do_facet $facet find $facet_proc_dirs \
11541 ! -name req_history \
11543 -exec cat '{}' \\\; &> /dev/null ||
11544 error "proc file read failed"
11546 do_facet $facet find $facet_proc_dirs \
11547 -ignore_readdir_race \
11549 -not -name force_lbug \
11550 -not -name changelog_mask \
11551 -exec badarea_io '{}' \\\; ||
11552 error_133 "$facet find $facet_proc_dirs failed"
11555 # remount the FS in case writes/reads /proc break the FS
11556 cleanup || error "failed to unmount"
11557 setup || error "failed to setup"
11560 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
11563 remote_mds_nodsh && skip "remote MDS with nodsh"
11564 remote_ost_nodsh && skip "remote OST with nodsh"
11565 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
11566 skip "Need MDS version at least 2.9.54"
11570 for facet in client mds1 ost1; do
11571 local facet_proc_dirs=$(do_facet $facet \
11572 \\\ls -d $proc_regexp 2> /dev/null)
11573 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11574 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11575 # Get the list of files that are missing the terminating newline
11576 local missing=($(do_facet $facet \
11577 find ${facet_proc_dirs} -type f \| \
11578 while read F\; do \
11579 awk -v FS='\v' -v RS='\v\v' \
11580 "'END { if(NR>0 && \
11581 \\\$NF !~ /.*\\\n\$/) \
11582 print FILENAME}'" \
11585 [ ${#missing[*]} -eq 0 ] ||
11586 error "files do not end with newline: ${missing[*]}"
11589 run_test 133h "Proc files should end with newlines"
11592 remote_mds_nodsh && skip "remote MDS with nodsh"
11593 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11594 skip "Need MDS version at least 2.7.54"
11596 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11597 cancel_lru_locks mdc
11599 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
11600 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11601 [ $unused -eq 0 ] || error "$unused locks are not cleared"
11604 createmany -o $DIR/$tdir/f $nr ||
11605 error "failed to create $nr files in $DIR/$tdir"
11606 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11608 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
11609 do_facet mds1 $LCTL set_param fail_loc=0x327
11610 do_facet mds1 $LCTL set_param fail_val=500
11613 echo "sleep 10 seconds ..."
11615 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
11617 do_facet mds1 $LCTL set_param fail_loc=0
11618 do_facet mds1 $LCTL set_param fail_val=0
11619 [ $lck_cnt -lt $unused ] ||
11620 error "No locks reclaimed, before:$unused, after:$lck_cnt"
11623 unlinkmany $DIR/$tdir/f $nr
11625 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
11628 remote_mds_nodsh && skip "remote MDS with nodsh"
11629 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11630 skip "Need MDS version at least 2.7.54"
11632 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11633 cancel_lru_locks mdc
11635 local low_wm=$(do_facet mds1 $LCTL get_param -n \
11636 ldlm.lock_reclaim_threshold_mb)
11637 # disable reclaim temporarily
11638 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
11640 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
11641 do_facet mds1 $LCTL set_param fail_loc=0x328
11642 do_facet mds1 $LCTL set_param fail_val=500
11644 $LCTL set_param debug=+trace
11647 createmany -o $DIR/$tdir/f $nr &
11648 local create_pid=$!
11650 echo "Sleep $TIMEOUT seconds ..."
11652 if ! ps -p $create_pid > /dev/null 2>&1; then
11653 do_facet mds1 $LCTL set_param fail_loc=0
11654 do_facet mds1 $LCTL set_param fail_val=0
11655 do_facet mds1 $LCTL set_param \
11656 ldlm.lock_reclaim_threshold_mb=${low_wm}m
11657 error "createmany finished incorrectly!"
11659 do_facet mds1 $LCTL set_param fail_loc=0
11660 do_facet mds1 $LCTL set_param fail_val=0
11661 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
11662 wait $create_pid || return 1
11664 unlinkmany $DIR/$tdir/f $nr
11666 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
11668 test_140() { #bug-17379
11669 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11671 test_mkdir $DIR/$tdir
11672 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
11673 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
11675 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
11676 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
11678 while i=$((i + 1)); do
11680 cd $i || error "Changing to $i"
11681 ln -s ../stat stat || error "Creating stat symlink"
11682 # Read the symlink until ELOOP present,
11683 # not LBUGing the system is considered success,
11684 # we didn't overrun the stack.
11685 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
11686 if [ $ret -ne 0 ]; then
11687 if [ $ret -eq 40 ]; then
11690 error "Open stat symlink"
11696 echo "The symlink depth = $i"
11697 [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] ||
11698 error "Invalid symlink depth"
11700 # Test recursive symlink
11701 ln -s symlink_self symlink_self
11702 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
11703 echo "open symlink_self returns $ret"
11704 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
11706 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
11709 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11711 local TF="$TMP/$tfile"
11713 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
11715 cancel_lru_locks $OSC
11716 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
11717 remount_client $MOUNT
11719 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
11722 $TRUNCATE $DIR/$tfile 6000
11723 cancel_lru_locks $OSC
11724 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
11727 echo "12345" >>$DIR/$tfile
11728 cancel_lru_locks $OSC
11729 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
11732 echo "12345" >>$DIR/$tfile
11733 cancel_lru_locks $OSC
11734 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
11739 run_test 150 "truncate/append tests"
11741 #LU-2902 roc_hit was not able to read all values from lproc
11742 function roc_hit_init() {
11743 local list=$(comma_list $(osts_nodes))
11744 local dir=$DIR/$tdir-check
11745 local file=$dir/$tfile
11751 #use setstripe to do a write to every ost
11752 for i in $(seq 0 $((OSTCOUNT-1))); do
11753 $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
11754 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
11755 idx=$(printf %04x $i)
11756 BEFORE=$(get_osd_param $list *OST*$idx stats |
11757 awk '$1 == "cache_access" {sum += $7}
11758 END { printf("%0.0f", sum) }')
11760 cancel_lru_locks osc
11761 cat $file >/dev/null
11763 AFTER=$(get_osd_param $list *OST*$idx stats |
11764 awk '$1 == "cache_access" {sum += $7}
11765 END { printf("%0.0f", sum) }')
11767 echo BEFORE:$BEFORE AFTER:$AFTER
11768 if ! let "AFTER - BEFORE == 4"; then
11770 error "roc_hit is not safe to use"
11778 function roc_hit() {
11779 local list=$(comma_list $(osts_nodes))
11780 echo $(get_osd_param $list '' stats |
11781 awk '$1 == "cache_hit" {sum += $7}
11782 END { printf("%0.0f", sum) }')
11785 function set_cache() {
11788 if [ "$2" == "off" ]; then
11791 local list=$(comma_list $(osts_nodes))
11792 set_osd_param $list '' $1_cache_enable $on
11794 cancel_lru_locks osc
11798 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11799 remote_ost_nodsh && skip "remote OST with nodsh"
11802 local list=$(comma_list $(osts_nodes))
11804 # check whether obdfilter is cache capable at all
11805 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
11806 skip "not cache-capable obdfilter"
11809 # check cache is enabled on all obdfilters
11810 if get_osd_param $list '' read_cache_enable | grep 0; then
11811 skip "oss cache is disabled"
11814 set_osd_param $list '' writethrough_cache_enable 1
11816 # check write cache is enabled on all obdfilters
11817 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
11818 skip "oss write cache is NOT enabled"
11823 #define OBD_FAIL_OBD_NO_LRU 0x609
11824 do_nodes $list $LCTL set_param fail_loc=0x609
11826 # pages should be in the case right after write
11827 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
11830 local BEFORE=$(roc_hit)
11831 cancel_lru_locks osc
11832 cat $DIR/$tfile >/dev/null
11833 local AFTER=$(roc_hit)
11835 do_nodes $list $LCTL set_param fail_loc=0
11837 if ! let "AFTER - BEFORE == CPAGES"; then
11838 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
11841 # the following read invalidates the cache
11842 cancel_lru_locks osc
11843 set_osd_param $list '' read_cache_enable 0
11844 cat $DIR/$tfile >/dev/null
11846 # now data shouldn't be found in the cache
11848 cancel_lru_locks osc
11849 cat $DIR/$tfile >/dev/null
11851 if let "AFTER - BEFORE != 0"; then
11852 error "IN CACHE: before: $BEFORE, after: $AFTER"
11855 set_osd_param $list '' read_cache_enable 1
11858 run_test 151 "test cache on oss and controls ==============================="
11861 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11863 local TF="$TMP/$tfile"
11865 # simulate ENOMEM during write
11866 #define OBD_FAIL_OST_NOMEM 0x226
11867 lctl set_param fail_loc=0x80000226
11868 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
11870 sync || error "sync failed"
11871 lctl set_param fail_loc=0
11873 # discard client's cache
11874 cancel_lru_locks osc
11876 # simulate ENOMEM during read
11877 lctl set_param fail_loc=0x80000226
11878 cmp $TF $DIR/$tfile || error "cmp failed"
11879 lctl set_param fail_loc=0
11883 run_test 152 "test read/write with enomem ============================"
11886 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
11888 run_test 153 "test if fdatasync does not crash ======================="
11890 dot_lustre_fid_permission_check() {
11892 local ffid=$MOUNT/.lustre/fid/$fid
11895 echo "stat fid $fid"
11896 stat $ffid > /dev/null || error "stat $ffid failed."
11897 echo "touch fid $fid"
11898 touch $ffid || error "touch $ffid failed."
11899 echo "write to fid $fid"
11900 cat /etc/hosts > $ffid || error "write $ffid failed."
11901 echo "read fid $fid"
11902 diff /etc/hosts $ffid || error "read $ffid failed."
11903 echo "append write to fid $fid"
11904 cat /etc/hosts >> $ffid || error "append write $ffid failed."
11905 echo "rename fid $fid"
11906 mv $ffid $test_dir/$tfile.1 &&
11907 error "rename $ffid to $tfile.1 should fail."
11908 touch $test_dir/$tfile.1
11909 mv $test_dir/$tfile.1 $ffid &&
11910 error "rename $tfile.1 to $ffid should fail."
11911 rm -f $test_dir/$tfile.1
11912 echo "truncate fid $fid"
11913 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
11914 echo "link fid $fid"
11915 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
11916 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
11917 echo "setfacl fid $fid"
11918 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
11919 echo "getfacl fid $fid"
11920 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
11922 echo "unlink fid $fid"
11923 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
11924 echo "mknod fid $fid"
11925 mknod $ffid c 1 3 && error "mknod $ffid should fail."
11927 fid=[0xf00000400:0x1:0x0]
11928 ffid=$MOUNT/.lustre/fid/$fid
11930 echo "stat non-exist fid $fid"
11931 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
11932 echo "write to non-exist fid $fid"
11933 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
11934 echo "link new fid $fid"
11935 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
11937 mkdir -p $test_dir/$tdir
11938 touch $test_dir/$tdir/$tfile
11939 fid=$($LFS path2fid $test_dir/$tdir)
11942 error "error: could not get fid for $test_dir/$dir/$tfile."
11944 ffid=$MOUNT/.lustre/fid/$fid
11947 ls $ffid > /dev/null || error "ls $ffid failed."
11948 echo "touch $fid/$tfile.1"
11949 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
11951 echo "touch $MOUNT/.lustre/fid/$tfile"
11952 touch $MOUNT/.lustre/fid/$tfile && \
11953 error "touch $MOUNT/.lustre/fid/$tfile should fail."
11955 echo "setxattr to $MOUNT/.lustre/fid"
11956 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
11958 echo "listxattr for $MOUNT/.lustre/fid"
11959 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
11961 echo "delxattr from $MOUNT/.lustre/fid"
11962 setfattr -x trusted.name1 $MOUNT/.lustre/fid
11964 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
11965 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
11966 error "touch invalid fid should fail."
11968 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
11969 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
11970 error "touch non-normal fid should fail."
11972 echo "rename $tdir to $MOUNT/.lustre/fid"
11973 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
11974 error "rename to $MOUNT/.lustre/fid should fail."
11976 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
11978 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
11979 local new_obf_mode=777
11981 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
11982 chmod $new_obf_mode $DIR/.lustre/fid ||
11983 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
11985 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
11986 [ $obf_mode -eq $new_obf_mode ] ||
11987 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
11989 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
11990 chmod $old_obf_mode $DIR/.lustre/fid ||
11991 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
11994 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
11995 fid=$($LFS path2fid $test_dir/$tfile-2)
11997 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
11999 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
12000 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
12001 error "create lov data thru .lustre failed"
12003 echo "cp /etc/passwd $test_dir/$tfile-2"
12004 cp /etc/passwd $test_dir/$tfile-2 ||
12005 error "copy to $test_dir/$tfile-2 failed."
12006 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
12007 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12008 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12010 rm -rf $test_dir/tfile.lnk
12011 rm -rf $test_dir/$tfile-2
12015 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12016 skip "Need MDS version at least 2.4.1"
12018 local tf=$DIR/$tfile
12021 local fid=$($LFS path2fid $tf)
12022 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12024 # check that we get the same pathname back
12025 local found=$($LFS fid2path $MOUNT "$fid")
12026 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12027 [ "$found" == "$tf" ] ||
12028 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12030 run_test 154A "lfs path2fid and fid2path basic checks"
12033 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12034 skip "Need MDS version at least 2.4.1"
12036 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12037 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12038 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12039 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12041 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12042 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12044 # check that we get the same pathname
12045 echo "PFID: $PFID, name: $name"
12046 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12047 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12048 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12049 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12051 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12053 run_test 154B "verify the ll_decode_linkea tool"
12056 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12057 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12058 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12059 skip "Need MDS version at least 2.2.51"
12060 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12062 cp /etc/hosts $DIR/$tfile
12064 fid=$($LFS path2fid $DIR/$tfile)
12066 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12068 dot_lustre_fid_permission_check "$fid" $DIR ||
12069 error "dot lustre permission check $fid failed"
12071 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12073 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12075 touch $MOUNT/.lustre/file &&
12076 error "creation is not allowed under .lustre"
12078 mkdir $MOUNT/.lustre/dir &&
12079 error "mkdir is not allowed under .lustre"
12083 run_test 154a "Open-by-FID"
12086 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12087 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12088 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12089 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12090 skip "Need MDS version at least 2.2.51"
12092 local remote_dir=$DIR/$tdir/remote_dir
12096 mkdir -p $DIR/$tdir
12097 $LFS mkdir -i $MDTIDX $remote_dir ||
12098 error "create remote directory failed"
12100 cp /etc/hosts $remote_dir/$tfile
12102 fid=$($LFS path2fid $remote_dir/$tfile)
12104 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12106 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12107 error "dot lustre permission check $fid failed"
12110 run_test 154b "Open-by-FID for remote directory"
12113 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12114 skip "Need MDS version at least 2.4.1"
12116 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12117 local FID1=$($LFS path2fid $DIR/$tfile.1)
12118 local FID2=$($LFS path2fid $DIR/$tfile.2)
12119 local FID3=$($LFS path2fid $DIR/$tfile.3)
12122 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12123 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12124 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12126 [ "$FID" = "${!want}" ] ||
12127 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12131 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12133 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12134 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12138 run_test 154c "lfs path2fid and fid2path multiple arguments"
12141 remote_mds_nodsh && skip "remote MDS with nodsh"
12142 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12143 skip "Need MDS version at least 2.5.53"
12145 if remote_mds; then
12146 nid=$($LCTL list_nids | sed "s/\./\\\./g")
12150 local proc_ofile="mdt.*.exports.'$nid'.open_files"
12157 local fid=$($LFS path2fid $DIR/$tfile)
12160 cmd="exec $fd<$DIR/$tfile"
12162 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
12163 echo "$fid_list" | grep "$fid"
12166 cmd="exec $fd>/dev/null"
12168 if [ $rc -ne 0 ]; then
12169 error "FID $fid not found in open files list $fid_list"
12172 run_test 154d "Verify open file fid"
12176 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
12177 skip "Need MDS version at least 2.6.50"
12179 if ls -a $MOUNT | grep -q '^\.lustre$'; then
12180 error ".lustre returned by readdir"
12183 run_test 154e ".lustre is not returned by readdir"
12186 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12188 # create parent directory on a single MDT to avoid cross-MDT hardlinks
12189 test_mkdir -p -c1 $DIR/$tdir/d
12190 # test dirs inherit from its stripe
12191 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
12192 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
12193 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
12194 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
12197 # get fid of parents
12198 local FID0=$($LFS path2fid $DIR/$tdir/d)
12199 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
12200 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
12201 local FID3=$($LFS path2fid $DIR)
12203 # check that path2fid --parents returns expected <parent_fid>/name
12204 # 1) test for a directory (single parent)
12205 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
12206 [ "$parent" == "$FID0/foo1" ] ||
12207 error "expected parent: $FID0/foo1, got: $parent"
12209 # 2) test for a file with nlink > 1 (multiple parents)
12210 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
12211 echo "$parent" | grep -F "$FID1/$tfile" ||
12212 error "$FID1/$tfile not returned in parent list"
12213 echo "$parent" | grep -F "$FID2/link" ||
12214 error "$FID2/link not returned in parent list"
12216 # 3) get parent by fid
12217 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
12218 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12219 echo "$parent" | grep -F "$FID1/$tfile" ||
12220 error "$FID1/$tfile not returned in parent list (by fid)"
12221 echo "$parent" | grep -F "$FID2/link" ||
12222 error "$FID2/link not returned in parent list (by fid)"
12224 # 4) test for entry in root directory
12225 parent=$($LFS path2fid --parents $DIR/f)
12226 echo "$parent" | grep -F "$FID3/f" ||
12227 error "$FID3/f not returned in parent list"
12229 # 5) test it on root directory
12230 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
12231 error "$MOUNT should not have parents"
12233 # enable xattr caching and check that linkea is correctly updated
12234 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
12235 save_lustre_params client "llite.*.xattr_cache" > $save
12236 lctl set_param llite.*.xattr_cache 1
12238 # 6.1) linkea update on rename
12239 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
12241 # get parents by fid
12242 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12243 # foo1 should no longer be returned in parent list
12244 echo "$parent" | grep -F "$FID1" &&
12245 error "$FID1 should no longer be in parent list"
12246 # the new path should appear
12247 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
12248 error "$FID2/$tfile.moved is not in parent list"
12250 # 6.2) linkea update on unlink
12251 rm -f $DIR/$tdir/d/foo2/link
12252 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12253 # foo2/link should no longer be returned in parent list
12254 echo "$parent" | grep -F "$FID2/link" &&
12255 error "$FID2/link should no longer be in parent list"
12259 restore_lustre_params < $save
12262 run_test 154f "get parent fids by reading link ea"
12266 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12267 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
12268 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
12269 skip "Need MDS version at least 2.6.92"
12271 mkdir -p $DIR/$tdir
12272 llapi_fid_test -d $DIR/$tdir
12274 run_test 154g "various llapi FID tests"
12276 test_155_small_load() {
12277 local temp=$TMP/$tfile
12278 local file=$DIR/$tfile
12280 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
12281 error "dd of=$temp bs=6096 count=1 failed"
12283 cancel_lru_locks $OSC
12284 cmp $temp $file || error "$temp $file differ"
12286 $TRUNCATE $temp 6000
12287 $TRUNCATE $file 6000
12288 cmp $temp $file || error "$temp $file differ (truncate1)"
12290 echo "12345" >>$temp
12291 echo "12345" >>$file
12292 cmp $temp $file || error "$temp $file differ (append1)"
12294 echo "12345" >>$temp
12295 echo "12345" >>$file
12296 cmp $temp $file || error "$temp $file differ (append2)"
12302 test_155_big_load() {
12303 remote_ost_nodsh && skip "remote OST with nodsh"
12305 local temp=$TMP/$tfile
12306 local file=$DIR/$tfile
12309 local cache_size=$(do_facet ost$((MAXI+1)) \
12310 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
12311 local large_file_size=$((cache_size * 2))
12313 echo "OSS cache size: $cache_size KB"
12314 echo "Large file size: $large_file_size KB"
12316 [ $MAXV -le $large_file_size ] &&
12317 skip_env "max available OST size needs > $large_file_size KB"
12319 $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed"
12321 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
12322 error "dd of=$temp bs=$large_file_size count=1k failed"
12325 cancel_lru_locks osc
12326 cmp $temp $file || error "$temp $file differ"
12332 save_writethrough() {
12333 local facets=$(get_facets OST)
12335 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
12339 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12341 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12343 save_writethrough $p
12346 set_cache writethrough on
12347 test_155_small_load
12348 restore_lustre_params < $p
12351 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
12354 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12356 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12358 save_writethrough $p
12361 set_cache writethrough off
12362 test_155_small_load
12363 restore_lustre_params < $p
12366 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
12369 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12371 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12373 save_writethrough $p
12376 set_cache writethrough on
12377 test_155_small_load
12378 restore_lustre_params < $p
12381 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
12384 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12386 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12388 save_writethrough $p
12391 set_cache writethrough off
12392 test_155_small_load
12393 restore_lustre_params < $p
12396 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
12399 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12401 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12403 save_writethrough $p
12406 set_cache writethrough on
12408 restore_lustre_params < $p
12411 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
12414 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12416 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12418 save_writethrough $p
12421 set_cache writethrough off
12423 restore_lustre_params < $p
12426 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
12429 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12431 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12433 save_writethrough $p
12436 set_cache writethrough on
12438 restore_lustre_params < $p
12441 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
12444 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12446 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12448 save_writethrough $p
12451 set_cache writethrough off
12453 restore_lustre_params < $p
12456 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
12459 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12460 remote_ost_nodsh && skip "remote OST with nodsh"
12461 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
12462 skip "stats not implemented on old servers"
12463 [ "$ost1_FSTYPE" = "zfs" ] &&
12464 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
12469 local file="$DIR/$tfile"
12470 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12472 save_writethrough $p
12475 log "Turn on read and write cache"
12477 set_cache writethrough on
12479 log "Write data and read it back."
12480 log "Read should be satisfied from the cache."
12481 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12483 cancel_lru_locks osc
12484 cat $file >/dev/null
12486 if ! let "AFTER - BEFORE == CPAGES"; then
12487 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12489 log "cache hits:: before: $BEFORE, after: $AFTER"
12492 log "Read again; it should be satisfied from the cache."
12494 cancel_lru_locks osc
12495 cat $file >/dev/null
12497 if ! let "AFTER - BEFORE == CPAGES"; then
12498 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12500 log "cache hits:: before: $BEFORE, after: $AFTER"
12503 log "Turn off the read cache and turn on the write cache"
12505 set_cache writethrough on
12507 log "Read again; it should be satisfied from the cache."
12509 cancel_lru_locks osc
12510 cat $file >/dev/null
12512 if ! let "AFTER - BEFORE == CPAGES"; then
12513 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12515 log "cache hits:: before: $BEFORE, after: $AFTER"
12518 log "Read again; it should not be satisfied from the cache."
12520 cancel_lru_locks osc
12521 cat $file >/dev/null
12523 if ! let "AFTER - BEFORE == 0"; then
12524 error "IN CACHE: before: $BEFORE, after: $AFTER"
12526 log "cache hits:: before: $BEFORE, after: $AFTER"
12529 log "Write data and read it back."
12530 log "Read should be satisfied from the cache."
12531 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12533 cancel_lru_locks osc
12534 cat $file >/dev/null
12536 if ! let "AFTER - BEFORE == CPAGES"; then
12537 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12539 log "cache hits:: before: $BEFORE, after: $AFTER"
12542 log "Read again; it should not be satisfied from the cache."
12544 cancel_lru_locks osc
12545 cat $file >/dev/null
12547 if ! let "AFTER - BEFORE == 0"; then
12548 error "IN CACHE: before: $BEFORE, after: $AFTER"
12550 log "cache hits:: before: $BEFORE, after: $AFTER"
12553 log "Turn off read and write cache"
12555 set_cache writethrough off
12557 log "Write data and read it back"
12558 log "It should not be satisfied from the cache."
12560 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12561 cancel_lru_locks osc
12563 cat $file >/dev/null
12565 if ! let "AFTER - BEFORE == 0"; then
12566 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12568 log "cache hits:: before: $BEFORE, after: $AFTER"
12571 log "Turn on the read cache and turn off the write cache"
12573 set_cache writethrough off
12575 log "Write data and read it back"
12576 log "It should not be satisfied from the cache."
12578 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12580 cancel_lru_locks osc
12581 cat $file >/dev/null
12583 if ! let "AFTER - BEFORE == 0"; then
12584 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12586 log "cache hits:: before: $BEFORE, after: $AFTER"
12589 log "Read again; it should be satisfied from the cache."
12591 cancel_lru_locks osc
12592 cat $file >/dev/null
12594 if ! let "AFTER - BEFORE == CPAGES"; then
12595 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12597 log "cache hits:: before: $BEFORE, after: $AFTER"
12600 restore_lustre_params < $p
12603 run_test 156 "Verification of tunables"
12606 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12607 remote_mds_nodsh && skip "remote MDS with nodsh"
12608 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
12609 skip "Need MDS version at least 2.2.0"
12611 changelog_register || error "changelog_register failed"
12612 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
12613 changelog_users $SINGLEMDS | grep -q $cl_user ||
12614 error "User $cl_user not found in changelog_users"
12617 test_mkdir -p $DIR/$tdir/pics/2008/zachy
12618 changelog_clear 0 || error "changelog_clear failed"
12619 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
12620 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
12621 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
12622 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
12623 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
12624 rm $DIR/$tdir/pics/desktop.jpg
12626 changelog_dump | tail -10
12628 echo "verifying changelog mask"
12629 changelog_chmask "-MKDIR"
12630 changelog_chmask "-CLOSE"
12632 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
12633 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
12635 changelog_chmask "+MKDIR"
12636 changelog_chmask "+CLOSE"
12638 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
12639 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
12641 changelog_dump | tail -10
12642 MKDIRS=$(changelog_dump | grep -c "MKDIR")
12643 CLOSES=$(changelog_dump | grep -c "CLOSE")
12644 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
12645 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
12648 echo "verifying target fid"
12649 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
12650 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
12651 [ "$fidc" == "$fidf" ] ||
12652 error "changelog '$tfile' fid $fidc != file fid $fidf"
12653 echo "verifying parent fid"
12654 # The FID returned from the Changelog may be the directory shard on
12655 # a different MDT, and not the FID returned by path2fid on the parent.
12656 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
12657 # since this is what will matter when recreating this file in the tree.
12658 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
12659 local pathp=$($LFS fid2path $MOUNT "$fidp")
12660 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
12661 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
12663 echo "getting records for $cl_user"
12664 changelog_users $SINGLEMDS
12665 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
12667 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
12668 error "changelog_clear failed"
12669 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
12670 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
12671 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
12672 error "user index expect $user_rec1 + $nclr != $user_rec2"
12674 local min0_rec=$(changelog_users $SINGLEMDS |
12675 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
12676 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
12677 awk '{ print $1; exit; }')
12679 changelog_dump | tail -n 5
12680 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
12681 [ $first_rec == $((min0_rec + 1)) ] ||
12682 error "first index should be $min0_rec + 1 not $first_rec"
12684 # LU-3446 changelog index reset on MDT restart
12685 local cur_rec1=$(changelog_users $SINGLEMDS |
12686 awk '/^current.index:/ { print $NF }')
12687 changelog_clear 0 ||
12688 error "clear all changelog records for $cl_user failed"
12689 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
12690 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
12691 error "Fail to start $SINGLEMDS"
12692 local cur_rec2=$(changelog_users $SINGLEMDS |
12693 awk '/^current.index:/ { print $NF }')
12694 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
12695 [ $cur_rec1 == $cur_rec2 ] ||
12696 error "current index should be $cur_rec1 not $cur_rec2"
12698 echo "verifying users from this test are deregistered"
12699 changelog_deregister || error "changelog_deregister failed"
12700 changelog_users $SINGLEMDS | grep -q $cl_user &&
12701 error "User '$cl_user' still in changelog_users"
12703 # lctl get_param -n mdd.*.changelog_users
12704 # current index: 144
12705 # ID index (idle seconds)
12707 if ! changelog_users $SINGLEMDS | grep "^cl"; then
12708 # this is the normal case where all users were deregistered
12709 # make sure no new records are added when no users are present
12710 local last_rec1=$(changelog_users $SINGLEMDS |
12711 awk '/^current.index:/ { print $NF }')
12712 touch $DIR/$tdir/chloe
12713 local last_rec2=$(changelog_users $SINGLEMDS |
12714 awk '/^current.index:/ { print $NF }')
12715 echo "verify changelogs are off: $last_rec1 == $last_rec2"
12716 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
12718 # any changelog users must be leftovers from a previous test
12719 changelog_users $SINGLEMDS
12720 echo "other changelog users; can't verify off"
12723 run_test 160a "changelog sanity"
12725 test_160b() { # LU-3587
12726 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12727 remote_mds_nodsh && skip "remote MDS with nodsh"
12728 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
12729 skip "Need MDS version at least 2.2.0"
12731 changelog_register || error "changelog_register failed"
12732 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
12733 changelog_users $SINGLEMDS | grep -q $cl_user ||
12734 error "User '$cl_user' not found in changelog_users"
12736 local longname1=$(str_repeat a 255)
12737 local longname2=$(str_repeat b 255)
12740 echo "creating very long named file"
12741 touch $longname1 || error "create of '$longname1' failed"
12742 echo "renaming very long named file"
12743 mv $longname1 $longname2
12745 changelog_dump | grep RENME | tail -n 5
12748 run_test 160b "Verify that very long rename doesn't crash in changelog"
12751 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12752 remote_mds_nodsh && skip "remote MDS with nodsh"
12754 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
12755 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
12756 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
12757 skip "Need MDS version at least 2.5.58 or 2.5.2+"
12761 # Registration step
12762 changelog_register || error "changelog_register failed"
12765 mkdir -p $DIR/$tdir
12766 $MCREATE $DIR/$tdir/foo_160c
12767 changelog_chmask "-TRUNC"
12768 $TRUNCATE $DIR/$tdir/foo_160c 200
12769 changelog_chmask "+TRUNC"
12770 $TRUNCATE $DIR/$tdir/foo_160c 199
12771 changelog_dump | tail -n 5
12772 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
12773 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
12775 run_test 160c "verify that changelog log catch the truncate event"
12778 remote_mds_nodsh && skip "remote MDS with nodsh"
12779 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12780 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12781 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
12782 skip "Need MDS version at least 2.7.60"
12784 # Registration step
12785 changelog_register || error "changelog_register failed"
12787 mkdir -p $DIR/$tdir/migrate_dir
12788 changelog_clear 0 || error "changelog_clear failed"
12790 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
12791 changelog_dump | tail -n 5
12792 local migrates=$(changelog_dump | grep -c "MIGRT")
12793 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
12795 run_test 160d "verify that changelog log catch the migrate event"
12798 remote_mds_nodsh && skip "remote MDS with nodsh"
12801 changelog_register || error "changelog_register failed"
12803 # Delete a future user (expect fail)
12804 local MDT0=$(facet_svc $SINGLEMDS)
12805 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
12808 if [ $rc -eq 0 ]; then
12809 error "Deleted non-existant user cl77"
12810 elif [ $rc -ne 2 ]; then
12811 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
12814 # Clear to a bad index (1 billion should be safe)
12815 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
12818 if [ $rc -eq 0 ]; then
12819 error "Successfully cleared to invalid CL index"
12820 elif [ $rc -ne 22 ]; then
12821 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
12824 run_test 160e "changelog negative testing (should return errors)"
12827 remote_mds_nodsh && skip "remote MDS with nodsh" && return
12828 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
12829 skip "Need MDS version at least 2.10.56"
12831 local mdts=$(comma_list $(mdts_nodes))
12834 changelog_register || error "first changelog_register failed"
12835 changelog_register || error "second changelog_register failed"
12837 declare -A cl_user1
12838 declare -A cl_user2
12843 # generate some changelog records to accumulate on each MDT
12844 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
12845 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
12846 error "create $DIR/$tdir/$tfile failed"
12848 # check changelogs have been generated
12849 local nbcl=$(changelog_dump | wc -l)
12850 [[ $nbcl -eq 0 ]] && error "no changelogs found"
12852 for param in "changelog_max_idle_time=10" \
12854 "changelog_min_gc_interval=2" \
12855 "changelog_min_free_cat_entries=3"; do
12856 local MDT0=$(facet_svc $SINGLEMDS)
12857 local var="${param%=*}"
12858 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
12860 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
12861 do_nodes $mdts $LCTL set_param mdd.*.$param
12864 # force cl_user2 to be idle (1st part)
12867 # simulate changelog catalog almost full
12868 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
12869 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
12871 for i in $(seq $MDSCOUNT); do
12872 cl_users=(${CL_USERS[mds$i]})
12873 cl_user1[mds$i]="${cl_users[0]}"
12874 cl_user2[mds$i]="${cl_users[1]}"
12876 [ -n "${cl_user1[mds$i]}" ] ||
12877 error "mds$i: no user registered"
12878 [ -n "${cl_user2[mds$i]}" ] ||
12879 error "mds$i: only ${cl_user2[mds$i]} is registered"
12881 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
12882 [ -n "$user_rec1" ] ||
12883 error "mds$i: User ${cl_user1[mds$i]} not registered"
12884 __changelog_clear mds$i ${cl_user1[mds$i]} +2
12885 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
12886 [ -n "$user_rec2" ] ||
12887 error "mds$i: User ${cl_user1[mds$i]} not registered"
12888 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
12889 "$user_rec1 + 2 == $user_rec2"
12890 [ $((user_rec1 + 2)) == $user_rec2 ] ||
12891 error "mds$i: user ${cl_user1[mds$i]} index expected " \
12892 "$user_rec1 + 2, but is $user_rec2"
12893 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
12894 [ -n "$user_rec2" ] ||
12895 error "mds$i: User ${cl_user2[mds$i]} not registered"
12896 [ $user_rec1 == $user_rec2 ] ||
12897 error "mds$i: user ${cl_user2[mds$i]} index expected " \
12898 "$user_rec1, but is $user_rec2"
12901 # force cl_user2 to be idle (2nd part) and to reach
12902 # changelog_max_idle_time
12905 # generate one more changelog to trigger fail_loc
12906 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
12907 error "create $DIR/$tdir/${tfile}bis failed"
12909 # ensure gc thread is done
12910 for i in $(mdts_nodes); do
12912 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
12913 error "$i: GC-thread not done"
12917 for i in $(seq $MDSCOUNT); do
12918 # check cl_user1 still registered
12919 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
12920 error "mds$i: User ${cl_user1[mds$i]} not registered"
12921 # check cl_user2 unregistered
12922 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
12923 error "mds$i: User ${cl_user2[mds$i]} still registered"
12925 # check changelogs are present and starting at $user_rec1 + 1
12926 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
12927 [ -n "$user_rec1" ] ||
12928 error "mds$i: User ${cl_user1[mds$i]} not registered"
12929 first_rec=$($LFS changelog $(facet_svc mds$i) |
12930 awk '{ print $1; exit; }')
12932 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
12933 [ $((user_rec1 + 1)) == $first_rec ] ||
12934 error "mds$i: first index should be $user_rec1 + 1, " \
12935 "but is $first_rec"
12938 run_test 160f "changelog garbage collect (timestamped users)"
12941 remote_mds_nodsh && skip "remote MDS with nodsh"
12942 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
12943 skip "Need MDS version at least 2.10.56"
12945 local mdts=$(comma_list $(mdts_nodes))
12947 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
12948 do_nodes $mdts $LCTL set_param fail_loc=0x1314
12951 changelog_register || error "first changelog_register failed"
12952 changelog_register || error "second changelog_register failed"
12954 declare -A cl_user1
12955 declare -A cl_user2
12960 # generate some changelog records to accumulate on each MDT
12961 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
12962 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
12963 error "create $DIR/$tdir/$tfile failed"
12965 # check changelogs have been generated
12966 local nbcl=$(changelog_dump | wc -l)
12967 [[ $nbcl -eq 0 ]] && error "no changelogs found"
12969 # reduce the max_idle_indexes value to make sure we exceed it
12970 max_ndx=$((nbcl / 2 - 1))
12972 for param in "changelog_max_idle_indexes=$max_ndx" \
12974 "changelog_min_gc_interval=2" \
12975 "changelog_min_free_cat_entries=3"; do
12976 local MDT0=$(facet_svc $SINGLEMDS)
12977 local var="${param%=*}"
12978 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
12980 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
12981 do_nodes $mdts $LCTL set_param mdd.*.$param ||
12982 error "unable to set mdd.*.$param"
12985 # simulate changelog catalog almost full
12986 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
12987 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
12989 for i in $(seq $MDSCOUNT); do
12990 cl_users=(${CL_USERS[mds$i]})
12991 cl_user1[mds$i]="${cl_users[0]}"
12992 cl_user2[mds$i]="${cl_users[1]}"
12994 [ -n "${cl_user1[mds$i]}" ] ||
12995 error "mds$i: no user registered"
12996 [ -n "${cl_user2[mds$i]}" ] ||
12997 error "mds$i: only ${cl_user1[mds$i]} is registered"
12999 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13000 [ -n "$user_rec1" ] ||
13001 error "mds$i: User ${cl_user1[mds$i]} not registered"
13002 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13003 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13004 [ -n "$user_rec2" ] ||
13005 error "mds$i: User ${cl_user1[mds$i]} not registered"
13006 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13007 "$user_rec1 + 2 == $user_rec2"
13008 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13009 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13010 "$user_rec1 + 2, but is $user_rec2"
13011 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13012 [ -n "$user_rec2" ] ||
13013 error "mds$i: User ${cl_user2[mds$i]} not registered"
13014 [ $user_rec1 == $user_rec2 ] ||
13015 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13016 "$user_rec1, but is $user_rec2"
13019 # ensure we are past the previous changelog_min_gc_interval set above
13022 # generate one more changelog to trigger fail_loc
13023 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13024 error "create $DIR/$tdir/${tfile}bis failed"
13026 # ensure gc thread is done
13027 for i in $(mdts_nodes); do
13029 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13030 error "$i: GC-thread not done"
13034 for i in $(seq $MDSCOUNT); do
13035 # check cl_user1 still registered
13036 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13037 error "mds$i: User ${cl_user1[mds$i]} not registered"
13038 # check cl_user2 unregistered
13039 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13040 error "mds$i: User ${cl_user2[mds$i]} still registered"
13042 # check changelogs are present and starting at $user_rec1 + 1
13043 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13044 [ -n "$user_rec1" ] ||
13045 error "mds$i: User ${cl_user1[mds$i]} not registered"
13046 first_rec=$($LFS changelog $(facet_svc mds$i) |
13047 awk '{ print $1; exit; }')
13049 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13050 [ $((user_rec1 + 1)) == $first_rec ] ||
13051 error "mds$i: first index should be $user_rec1 + 1, " \
13052 "but is $first_rec"
13055 run_test 160g "changelog garbage collect (old users)"
13058 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13059 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13060 skip "Need MDS version at least 2.10.56"
13062 local mdts=$(comma_list $(mdts_nodes))
13065 changelog_register || error "first changelog_register failed"
13066 changelog_register || error "second changelog_register failed"
13068 declare -A cl_user1
13069 declare -A cl_user2
13074 # generate some changelog records to accumulate on each MDT
13075 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13076 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13077 error "create $DIR/$tdir/$tfile failed"
13079 # check changelogs have been generated
13080 local nbcl=$(changelog_dump | wc -l)
13081 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13083 for param in "changelog_max_idle_time=10" \
13085 "changelog_min_gc_interval=2"; do
13086 local MDT0=$(facet_svc $SINGLEMDS)
13087 local var="${param%=*}"
13088 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13090 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13091 do_nodes $mdts $LCTL set_param mdd.*.$param
13094 # force cl_user2 to be idle (1st part)
13097 for i in $(seq $MDSCOUNT); do
13098 cl_users=(${CL_USERS[mds$i]})
13099 cl_user1[mds$i]="${cl_users[0]}"
13100 cl_user2[mds$i]="${cl_users[1]}"
13102 [ -n "${cl_user1[mds$i]}" ] ||
13103 error "mds$i: no user registered"
13104 [ -n "${cl_user2[mds$i]}" ] ||
13105 error "mds$i: only ${cl_user2[mds$i]} is registered"
13107 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13108 [ -n "$user_rec1" ] ||
13109 error "mds$i: User ${cl_user1[mds$i]} not registered"
13110 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13111 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13112 [ -n "$user_rec2" ] ||
13113 error "mds$i: User ${cl_user1[mds$i]} not registered"
13114 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13115 "$user_rec1 + 2 == $user_rec2"
13116 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13117 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13118 "$user_rec1 + 2, but is $user_rec2"
13119 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13120 [ -n "$user_rec2" ] ||
13121 error "mds$i: User ${cl_user2[mds$i]} not registered"
13122 [ $user_rec1 == $user_rec2 ] ||
13123 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13124 "$user_rec1, but is $user_rec2"
13127 # force cl_user2 to be idle (2nd part) and to reach
13128 # changelog_max_idle_time
13131 # force each GC-thread start and block then
13132 # one per MDT/MDD, set fail_val accordingly
13133 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13134 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13136 # generate more changelogs to trigger fail_loc
13137 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13138 error "create $DIR/$tdir/${tfile}bis failed"
13140 # stop MDT to stop GC-thread, should be done in back-ground as it will
13141 # block waiting for the thread to be released and exit
13142 declare -A stop_pids
13143 for i in $(seq $MDSCOUNT); do
13145 stop_pids[mds$i]=$!
13148 for i in $(mdts_nodes); do
13151 local facets=$(facets_up_on_host $i)
13153 for facet in ${facets//,/ }; do
13154 if [[ $facet == mds* ]]; then
13158 # ensure each MDS's gc threads are still present and all in "R"
13159 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
13160 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
13161 error "$i: expected $nb GC-thread"
13163 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
13165 error "$i: GC-thread not found in R-state"
13166 # check umounts of each MDT on MDS have reached kthread_stop()
13167 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
13168 error "$i: expected $nb umount"
13170 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
13171 error "$i: umount not found in D-state"
13174 # release all GC-threads
13175 do_nodes $mdts $LCTL set_param fail_loc=0
13177 # wait for MDT stop to complete
13178 for i in $(seq $MDSCOUNT); do
13179 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
13183 # may try to check if any orphan changelog records are present
13184 # via ldiskfs/zfs and llog_reader...
13186 # re-start/mount MDTs
13187 for i in $(seq $MDSCOUNT); do
13188 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
13189 error "Fail to start mds$i"
13193 for i in $(seq $MDSCOUNT); do
13194 # check cl_user1 still registered
13195 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13196 error "mds$i: User ${cl_user1[mds$i]} not registered"
13197 # check cl_user2 unregistered
13198 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13199 error "mds$i: User ${cl_user2[mds$i]} still registered"
13201 # check changelogs are present and starting at $user_rec1 + 1
13202 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13203 [ -n "$user_rec1" ] ||
13204 error "mds$i: User ${cl_user1[mds$i]} not registered"
13205 first_rec=$($LFS changelog $(facet_svc mds$i) |
13206 awk '{ print $1; exit; }')
13208 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13209 [ $((user_rec1 + 1)) == $first_rec ] ||
13210 error "mds$i: first index should be $user_rec1 + 1, " \
13211 "but is $first_rec"
13214 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
13219 local mdts=$(comma_list $(mdts_nodes))
13221 changelog_register || error "first changelog_register failed"
13223 # generate some changelog records to accumulate on each MDT
13224 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13225 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13226 error "create $DIR/$tdir/$tfile failed"
13228 # check changelogs have been generated
13229 local nbcl=$(changelog_dump | wc -l)
13230 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13232 # simulate race between register and unregister
13233 # XXX as fail_loc is set per-MDS, with DNE configs the race
13234 # simulation will only occur for one MDT per MDS and for the
13235 # others the normal race scenario will take place
13236 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
13237 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
13238 do_nodes $mdts $LCTL set_param fail_val=1
13240 # unregister 1st user
13241 changelog_deregister &
13243 # wait some time for deregister work to reach race rdv
13245 # register 2nd user
13246 changelog_register || error "2nd user register failed"
13248 wait $pid1 || error "1st user deregister failed"
13252 declare -A LAST_REC
13253 for i in $(seq $MDSCOUNT); do
13254 if changelog_users mds$i | grep "^cl"; then
13255 # make sure new records are added with one user present
13256 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
13257 awk '/^current.index:/ { print $NF }')
13259 error "mds$i has no user registered"
13263 # generate more changelog records to accumulate on each MDT
13264 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13265 error "create $DIR/$tdir/${tfile}bis failed"
13267 for i in $(seq $MDSCOUNT); do
13268 last_rec=$(changelog_users $SINGLEMDS |
13269 awk '/^current.index:/ { print $NF }')
13270 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
13271 [ $last_rec != ${LAST_REC[mds$i]} ] ||
13272 error "changelogs are off on mds$i"
13275 run_test 160i "changelog user register/unregister race"
13278 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13279 remote_mds_nodsh && skip "remote MDS with nodsh"
13281 mkdir -p $DIR/$tdir/1/1
13283 changelog_register || error "changelog_register failed"
13284 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13286 changelog_users $SINGLEMDS | grep -q $cl_user ||
13287 error "User '$cl_user' not found in changelog_users"
13288 #define OBD_FAIL_MDS_CHANGELOG_REORDER 0x15d
13289 do_facet mds1 $LCTL set_param fail_loc=0x8000015d fail_val=3
13290 rmdir $DIR/$tdir/1/1 & sleep 1
13292 touch $DIR/$tdir/2/2
13293 rm -rf $DIR/$tdir/2
13298 changelog_dump | grep rmdir || error "rmdir not recorded"
13301 changelog_deregister
13303 run_test 160k "Verify that changelog records are not lost"
13306 remote_mds_nodsh && skip "remote MDS with nodsh"
13307 [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] &&
13308 skip "Need MDS version at least 2.12.56"
13310 mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
13312 changelog_register || error "first changelog_register failed"
13314 # generate some changelog
13315 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13316 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13317 error "create $DIR/$tdir/${tfile}bis failed"
13319 # open the changelog device
13320 exec 3>/dev/changelog-$FSNAME-MDT0000
13321 exec 4</dev/changelog-$FSNAME-MDT0000
13323 # umount the first lustre mount
13327 cat <&4 >/dev/null || error "read changelog failed"
13330 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13331 changelog_users $SINGLEMDS | grep -q $cl_user ||
13332 error "User $cl_user not found in changelog_users"
13334 printf 'clear:'$cl_user':0' >&3
13341 changelog_deregister || error "changelog_deregister failed"
13344 mount_client $MOUNT || error "mount_client on $MOUNT failed"
13346 run_test 160j "client can be umounted while its chanangelog is being used"
13349 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13351 test_mkdir -c1 $DIR/$tdir
13352 cp /etc/hosts $DIR/$tdir/$tfile
13353 test_mkdir -c1 $DIR/$tdir/foo1
13354 test_mkdir -c1 $DIR/$tdir/foo2
13355 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
13356 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
13357 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
13358 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
13359 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
13360 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13361 $LFS fid2path $DIR $FID
13362 error "bad link ea"
13365 rm $DIR/$tdir/foo2/zachary
13367 rm $DIR/$tdir/foo2/thor
13369 rm $DIR/$tdir/$tfile
13371 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
13372 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
13373 { $LFS fid2path $DIR $FID; error "bad link rename"; }
13374 rm $DIR/$tdir/foo2/maggie
13377 local longname=$tfile.avg_len_is_thirty_two_
13378 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
13379 error_noexit 'failed to unlink many hardlinks'" EXIT
13380 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
13381 error "failed to hardlink many files"
13382 links=$($LFS fid2path $DIR $FID | wc -l)
13383 echo -n "${links}/1000 links in link EA"
13384 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
13386 run_test 161a "link ea sanity"
13389 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13390 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
13393 local remote_dir=$DIR/$tdir/remote_dir
13395 mkdir -p $DIR/$tdir
13396 $LFS mkdir -i $MDTIDX $remote_dir ||
13397 error "create remote directory failed"
13399 cp /etc/hosts $remote_dir/$tfile
13400 mkdir -p $remote_dir/foo1
13401 mkdir -p $remote_dir/foo2
13402 ln $remote_dir/$tfile $remote_dir/foo1/sofia
13403 ln $remote_dir/$tfile $remote_dir/foo2/zachary
13404 ln $remote_dir/$tfile $remote_dir/foo1/luna
13405 ln $remote_dir/$tfile $remote_dir/foo2/thor
13407 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
13409 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13410 $LFS fid2path $DIR $FID
13411 error "bad link ea"
13414 rm $remote_dir/foo2/zachary
13416 rm $remote_dir/foo2/thor
13418 rm $remote_dir/$tfile
13420 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
13421 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
13422 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
13423 $LFS fid2path $DIR $FID
13424 error "bad link rename"
13426 rm $remote_dir/foo2/maggie
13429 local longname=filename_avg_len_is_thirty_two_
13430 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
13431 error "failed to hardlink many files"
13432 links=$($LFS fid2path $DIR $FID | wc -l)
13433 echo -n "${links}/1000 links in link EA"
13434 [[ ${links} -gt 60 ]] ||
13435 error "expected at least 60 links in link EA"
13436 unlinkmany $remote_dir/foo2/$longname 1000 ||
13437 error "failed to unlink many hardlinks"
13439 run_test 161b "link ea sanity under remote directory"
13442 remote_mds_nodsh && skip "remote MDS with nodsh"
13443 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13444 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
13445 skip "Need MDS version at least 2.1.5"
13447 # define CLF_RENAME_LAST 0x0001
13448 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
13449 changelog_register || error "changelog_register failed"
13452 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
13453 touch $DIR/$tdir/foo_161c
13454 touch $DIR/$tdir/bar_161c
13455 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13456 changelog_dump | grep RENME | tail -n 5
13457 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13458 changelog_clear 0 || error "changelog_clear failed"
13459 if [ x$flags != "x0x1" ]; then
13460 error "flag $flags is not 0x1"
13463 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
13464 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
13465 touch $DIR/$tdir/foo_161c
13466 touch $DIR/$tdir/bar_161c
13467 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13468 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13469 changelog_dump | grep RENME | tail -n 5
13470 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13471 changelog_clear 0 || error "changelog_clear failed"
13472 if [ x$flags != "x0x0" ]; then
13473 error "flag $flags is not 0x0"
13475 echo "rename overwrite a target having nlink > 1," \
13476 "changelog record has flags of $flags"
13478 # rename doesn't overwrite a target (changelog flag 0x0)
13479 touch $DIR/$tdir/foo_161c
13480 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
13481 changelog_dump | grep RENME | tail -n 5
13482 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
13483 changelog_clear 0 || error "changelog_clear failed"
13484 if [ x$flags != "x0x0" ]; then
13485 error "flag $flags is not 0x0"
13487 echo "rename doesn't overwrite a target," \
13488 "changelog record has flags of $flags"
13490 # define CLF_UNLINK_LAST 0x0001
13491 # unlink a file having nlink = 1 (changelog flag 0x1)
13492 rm -f $DIR/$tdir/foo2_161c
13493 changelog_dump | grep UNLNK | tail -n 5
13494 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13495 changelog_clear 0 || error "changelog_clear failed"
13496 if [ x$flags != "x0x1" ]; then
13497 error "flag $flags is not 0x1"
13499 echo "unlink a file having nlink = 1," \
13500 "changelog record has flags of $flags"
13502 # unlink a file having nlink > 1 (changelog flag 0x0)
13503 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13504 rm -f $DIR/$tdir/foobar_161c
13505 changelog_dump | grep UNLNK | tail -n 5
13506 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13507 changelog_clear 0 || error "changelog_clear failed"
13508 if [ x$flags != "x0x0" ]; then
13509 error "flag $flags is not 0x0"
13511 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
13513 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
13516 remote_mds_nodsh && skip "remote MDS with nodsh"
13521 changelog_register || error "changelog_register failed"
13523 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
13524 # interfer with $MOUNT/.lustre/fid/ access
13526 [[ $? -eq 0 ]] || error "mkdir failed"
13528 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
13529 $LCTL set_param fail_loc=0x8000140c
13531 $LCTL set_param fail_val=5
13534 echo foofoo > $DIR/$tdir/$tfile &
13537 # wait for create to be delayed
13541 [[ $? -eq 0 ]] || error "create should be blocked"
13543 local tempfile=$(mktemp)
13544 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
13545 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
13546 # some delay may occur during ChangeLog publishing and file read just
13547 # above, that could allow file write to happen finally
13548 [[ -s $tempfile ]] && echo "file should be empty"
13550 $LCTL set_param fail_loc=0
13553 [[ $? -eq 0 ]] || error "create failed"
13555 run_test 161d "create with concurrent .lustre/fid access"
13558 local expected="$1"
13563 path=$($LFS fid2path "$@")
13566 if [ $rc -ne 0 ]; then
13567 error "path looked up of '$expected' failed: rc=$rc"
13568 elif [ "$path" != "$expected" ]; then
13569 error "path looked up '$path' instead of '$expected'"
13571 echo "FID '$fid' resolves to path '$path' as expected"
13575 test_162a() { # was test_162
13576 test_mkdir -p -c1 $DIR/$tdir/d2
13577 touch $DIR/$tdir/d2/$tfile
13578 touch $DIR/$tdir/d2/x1
13579 touch $DIR/$tdir/d2/x2
13580 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
13581 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
13583 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
13584 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
13587 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
13588 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
13589 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
13591 # softlink to wrong file
13592 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
13593 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
13594 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
13597 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
13598 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
13599 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
13600 # fid2path dir/fsname should both work
13601 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
13602 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
13604 # hardlink count: check that there are 2 links
13605 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
13606 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
13608 # hardlink indexing: remove the first link
13609 rm $DIR/$tdir/d2/p/q/r/hlink
13610 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
13612 run_test 162a "path lookup sanity"
13615 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13616 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13619 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
13620 error "create striped dir failed"
13622 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
13623 tail -n 1 | awk '{print $2}')
13624 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
13626 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
13627 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
13630 for ((i=0;i<5;i++)); do
13631 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
13632 error "get fid for f$i failed"
13633 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
13635 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
13636 error "get fid for d$i failed"
13637 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
13642 run_test 162b "striped directory path lookup sanity"
13644 # LU-4239: Verify fid2path works with paths 100 or more directories deep
13646 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
13647 skip "Need MDS version at least 2.7.51"
13649 local lpath=$tdir.local
13650 local rpath=$tdir.remote
13652 test_mkdir $DIR/$lpath
13653 test_mkdir $DIR/$rpath
13655 for ((i = 0; i <= 101; i++)); do
13658 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
13659 error "get fid for local directory $DIR/$lpath failed"
13660 check_path "$DIR/$lpath" $MOUNT $FID --link 0
13663 test_mkdir $DIR/$rpath
13664 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
13665 error "get fid for remote directory $DIR/$rpath failed"
13666 check_path "$DIR/$rpath" $MOUNT $FID --link 0
13671 run_test 162c "fid2path works with paths 100 or more directories deep"
13674 # do directio so as not to populate the page cache
13675 log "creating a 10 Mb file"
13676 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
13677 log "starting reads"
13678 dd if=$DIR/$tfile of=/dev/null bs=4096 &
13679 log "truncating the file"
13680 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
13682 kill %+ || true # reads might have finished
13683 echo "wait until dd is finished"
13685 log "removing the temporary file"
13686 rm -rf $DIR/$tfile || error "tmp file removal failed"
13688 run_test 169 "parallel read and truncate should not deadlock"
13691 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13693 $LCTL clear # bug 18514
13694 $LCTL debug_daemon start $TMP/${tfile}_log_good
13696 $LCTL debug_daemon stop
13697 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
13698 error "sed failed to read log_good"
13700 $LCTL debug_daemon start $TMP/${tfile}_log_good
13702 $LCTL debug_daemon stop
13704 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
13705 error "lctl df log_bad failed"
13707 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
13708 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
13710 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
13711 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
13713 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
13714 error "bad_line good_line1 good_line2 are empty"
13716 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
13717 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
13718 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
13720 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
13721 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
13722 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
13724 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
13725 error "bad_line_new good_line_new are empty"
13727 local expected_good=$((good_line1 + good_line2*2))
13729 rm -f $TMP/${tfile}*
13730 # LU-231, short malformed line may not be counted into bad lines
13731 if [ $bad_line -ne $bad_line_new ] &&
13732 [ $bad_line -ne $((bad_line_new - 1)) ]; then
13733 error "expected $bad_line bad lines, but got $bad_line_new"
13737 if [ $expected_good -ne $good_line_new ]; then
13738 error "expected $expected_good good lines, but got $good_line_new"
13743 run_test 170 "test lctl df to handle corrupted log ====================="
13745 test_171() { # bug20592
13746 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13748 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
13749 $LCTL set_param fail_loc=0x50e
13750 $LCTL set_param fail_val=3000
13751 multiop_bg_pause $DIR/$tfile O_s || true
13753 kill -USR1 $MULTIPID
13757 if dmesg | grep "recursive fault"; then
13758 error "caught a recursive fault"
13760 $LCTL set_param fail_loc=0
13763 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
13765 # it would be good to share it with obdfilter-survey/iokit-libecho code
13766 setup_obdecho_osc () {
13769 local obdfilter_name=$2
13770 echo "Creating new osc for $obdfilter_name on $ost_nid"
13771 # make sure we can find loopback nid
13772 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
13774 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
13775 ${obdfilter_name}_osc_UUID || rc=2; }
13776 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
13777 ${obdfilter_name}_UUID $ost_nid || rc=3; }
13781 cleanup_obdecho_osc () {
13782 local obdfilter_name=$1
13783 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
13784 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
13791 local pages=${3:-64}
13796 local obd_size=$(get_obd_size $node $OBD)
13797 local page_size=$(get_page_size $node)
13798 if [[ -n "$obd_size" ]]; then
13799 local new_count=$((obd_size / (pages * page_size / 1024)))
13800 [[ $new_count -ge $count ]] || count=$new_count
13803 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
13804 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
13806 if [ $rc -eq 0 ]; then
13807 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
13808 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
13810 echo "New object id is $id"
13811 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
13813 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
13814 "test_brw $count w v $pages $id" || rc=4; }
13815 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
13817 [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
13818 "cleanup" || rc=5; }
13819 [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \
13820 "detach" || rc=6; }
13821 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
13826 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13828 if ! module_loaded obdecho; then
13829 load_module obdecho/obdecho &&
13830 stack_trap "rmmod obdecho" EXIT ||
13831 error "unable to load obdecho on client"
13834 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
13835 local host=$($LCTL get_param -n osc.$osc.import |
13836 awk '/current_connection:/ { print $2 }' )
13837 local target=$($LCTL get_param -n osc.$osc.import |
13838 awk '/target:/ { print $2 }' )
13839 target=${target%_UUID}
13841 if [ -n "$target" ]; then
13842 setup_obdecho_osc $host $target &&
13843 stack_trap "cleanup_obdecho_osc $target" EXIT ||
13844 { error "obdecho setup failed with $?"; return; }
13846 obdecho_test ${target}_osc client ||
13847 error "obdecho_test failed on ${target}_osc"
13849 $LCTL get_param osc.$osc.import
13850 error "there is no osc.$osc.import target"
13853 run_test 180a "test obdecho on osc"
13856 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13857 remote_ost_nodsh && skip "remote OST with nodsh"
13859 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
13860 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
13861 error "failed to load module obdecho"
13863 local target=$(do_facet ost1 $LCTL dl |
13864 awk '/obdfilter/ { print $4; exit; }')
13866 if [ -n "$target" ]; then
13867 obdecho_test $target ost1 || error "obdecho_test failed with $?"
13869 do_facet ost1 $LCTL dl
13870 error "there is no obdfilter target on ost1"
13873 run_test 180b "test obdecho directly on obdfilter"
13875 test_180c() { # LU-2598
13876 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13877 remote_ost_nodsh && skip "remote OST with nodsh"
13878 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
13879 skip "Need MDS version at least 2.4.0"
13881 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
13882 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
13883 error "failed to load module obdecho"
13885 local target=$(do_facet ost1 $LCTL dl |
13886 awk '/obdfilter/ { print $4; exit; }')
13888 if [ -n "$target" ]; then
13889 local pages=16384 # 64MB bulk I/O RPC size
13891 obdecho_test "$target" ost1 "$pages" ||
13892 error "obdecho_test with pages=$pages failed with $?"
13894 do_facet ost1 $LCTL dl
13895 error "there is no obdfilter target on ost1"
13898 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
13900 test_181() { # bug 22177
13901 test_mkdir $DIR/$tdir
13902 # create enough files to index the directory
13903 createmany -o $DIR/$tdir/foobar 4000
13904 # print attributes for debug purpose
13907 multiop_bg_pause $DIR/$tdir D_Sc || return 1
13909 # remove the files & current working dir
13910 unlinkmany $DIR/$tdir/foobar 4000
13912 kill -USR1 $MULTIPID
13914 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
13917 run_test 181 "Test open-unlinked dir ========================"
13923 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
13925 $LCTL set_param mdc.*.rpc_stats=clear
13927 for (( i = 0; i < $tcount; i++ )) ; do
13928 mkdir $DIR/$tdir/$i
13931 for (( i = 0; i < $tcount; i++ )) ; do
13932 createmany -o $DIR/$tdir/$i/f- $fcount &
13936 for (( i = 0; i < $tcount; i++ )) ; do
13937 unlinkmany $DIR/$tdir/$i/f- $fcount &
13941 $LCTL get_param mdc.*.rpc_stats
13945 run_test 182 "Test parallel modify metadata operations ================"
13947 test_183() { # LU-2275
13948 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13949 remote_mds_nodsh && skip "remote MDS with nodsh"
13950 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
13951 skip "Need MDS version at least 2.3.56"
13953 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
13954 echo aaa > $DIR/$tdir/$tfile
13956 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
13957 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
13959 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
13960 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
13962 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
13964 # Flush negative dentry cache
13965 touch $DIR/$tdir/$tfile
13967 # We are not checking for any leaked references here, they'll
13968 # become evident next time we do cleanup with module unload.
13971 run_test 183 "No crash or request leak in case of strange dispositions ========"
13973 # test suite 184 is for LU-2016, LU-2017
13975 check_swap_layouts_support
13977 dir0=$DIR/$tdir/$testnum
13978 test_mkdir -p -c1 $dir0
13983 $SETSTRIPE -c1 $file1
13985 $SETSTRIPE -c2 $file2
13987 gen1=$($GETSTRIPE -g $file1)
13988 gen2=$($GETSTRIPE -g $file2)
13990 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
13991 gen=$($GETSTRIPE -g $file1)
13992 [[ $gen1 != $gen ]] ||
13993 "Layout generation on $file1 does not change"
13994 gen=$($GETSTRIPE -g $file2)
13995 [[ $gen2 != $gen ]] ||
13996 "Layout generation on $file2 does not change"
13998 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
13999 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
14001 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
14003 run_test 184a "Basic layout swap"
14006 check_swap_layouts_support
14008 dir0=$DIR/$tdir/$testnum
14009 mkdir -p $dir0 || error "creating dir $dir0"
14016 $SETSTRIPE -c1 $file1
14017 $SETSTRIPE -c2 $file2
14018 $SETSTRIPE -c1 $file3
14019 chown $RUNAS_ID $file3
14020 gen1=$($GETSTRIPE -g $file1)
14021 gen2=$($GETSTRIPE -g $file2)
14023 $LFS swap_layouts $dir1 $dir2 &&
14024 error "swap of directories layouts should fail"
14025 $LFS swap_layouts $dir1 $file1 &&
14026 error "swap of directory and file layouts should fail"
14027 $RUNAS $LFS swap_layouts $file1 $file2 &&
14028 error "swap of file we cannot write should fail"
14029 $LFS swap_layouts $file1 $file3 &&
14030 error "swap of file with different owner should fail"
14031 /bin/true # to clear error code
14033 run_test 184b "Forbidden layout swap (will generate errors)"
14036 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14037 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14038 check_swap_layouts_support
14040 local dir0=$DIR/$tdir/$testnum
14041 mkdir -p $dir0 || error "creating dir $dir0"
14043 local ref1=$dir0/ref1
14044 local ref2=$dir0/ref2
14045 local file1=$dir0/file1
14046 local file2=$dir0/file2
14047 # create a file large enough for the concurrent test
14048 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14049 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14050 echo "ref file size: ref1($(stat -c %s $ref1))," \
14051 "ref2($(stat -c %s $ref2))"
14054 dd if=$ref1 of=$file1 bs=16k &
14057 # Make sure dd starts to copy file
14058 while [ ! -f $file1 ]; do sleep 0.1; done
14060 $LFS swap_layouts $file1 $file2
14063 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14064 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14066 # how many bytes copied before swapping layout
14067 local copied=$(stat -c %s $file2)
14068 local remaining=$(stat -c %s $ref1)
14069 remaining=$((remaining - copied))
14070 echo "Copied $copied bytes before swapping layout..."
14072 cmp -n $copied $file1 $ref2 | grep differ &&
14073 error "Content mismatch [0, $copied) of ref2 and file1"
14074 cmp -n $copied $file2 $ref1 ||
14075 error "Content mismatch [0, $copied) of ref1 and file2"
14076 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14077 error "Content mismatch [$copied, EOF) of ref1 and file1"
14080 rm -f $ref1 $ref2 $file1 $file2
14082 run_test 184c "Concurrent write and layout swap"
14085 check_swap_layouts_support
14086 [ -z "$(which getfattr 2>/dev/null)" ] &&
14087 skip_env "no getfattr command"
14089 local file1=$DIR/$tdir/$tfile-1
14090 local file2=$DIR/$tdir/$tfile-2
14091 local file3=$DIR/$tdir/$tfile-3
14095 mkdir -p $DIR/$tdir
14096 touch $file1 || error "create $file1 failed"
14097 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14098 error "create $file2 failed"
14099 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14100 error "create $file3 failed"
14101 lovea1=$(get_layout_param $file1)
14103 $LFS swap_layouts $file2 $file3 ||
14104 error "swap $file2 $file3 layouts failed"
14105 $LFS swap_layouts $file1 $file2 ||
14106 error "swap $file1 $file2 layouts failed"
14108 lovea2=$(get_layout_param $file2)
14111 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14113 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14114 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14116 run_test 184d "allow stripeless layouts swap"
14119 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14120 skip "Need MDS version at least 2.6.94"
14121 check_swap_layouts_support
14122 [ -z "$(which getfattr 2>/dev/null)" ] &&
14123 skip_env "no getfattr command"
14125 local file1=$DIR/$tdir/$tfile-1
14126 local file2=$DIR/$tdir/$tfile-2
14127 local file3=$DIR/$tdir/$tfile-3
14130 mkdir -p $DIR/$tdir
14131 touch $file1 || error "create $file1 failed"
14132 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14133 error "create $file2 failed"
14134 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14135 error "create $file3 failed"
14137 $LFS swap_layouts $file1 $file2 ||
14138 error "swap $file1 $file2 layouts failed"
14140 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14141 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14143 echo 123 > $file1 || error "Should be able to write into $file1"
14145 $LFS swap_layouts $file1 $file3 ||
14146 error "swap $file1 $file3 layouts failed"
14148 echo 123 > $file1 || error "Should be able to write into $file1"
14150 rm -rf $file1 $file2 $file3
14152 run_test 184e "Recreate layout after stripeless layout swaps"
14155 # Create a file with name longer than sizeof(struct stat) ==
14156 # 144 to see if we can get chars from the file name to appear
14157 # in the returned striping. Note that 'f' == 0x66.
14158 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
14160 mkdir -p $DIR/$tdir
14161 mcreate $DIR/$tdir/$file
14162 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
14163 error "IOC_MDC_GETFILEINFO returned garbage striping"
14166 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
14168 test_185() { # LU-2441
14169 # LU-3553 - no volatile file support in old servers
14170 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
14171 skip "Need MDS version at least 2.3.60"
14173 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14174 touch $DIR/$tdir/spoo
14175 local mtime1=$(stat -c "%Y" $DIR/$tdir)
14176 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
14177 error "cannot create/write a volatile file"
14178 [ "$FILESET" == "" ] &&
14179 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
14180 error "FID is still valid after close"
14182 multiop_bg_pause $DIR/$tdir vVw4096_c
14189 # assume that the next FID for this client is sequential, since stdout
14190 # is unfortunately eaten by multiop_bg_pause
14191 local n=$((${fidv[1]} + 1))
14192 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
14193 if [ "$FILESET" == "" ]; then
14194 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
14195 error "FID is missing before close"
14197 kill -USR1 $multi_pid
14198 # 1 second delay, so if mtime change we will see it
14200 local mtime2=$(stat -c "%Y" $DIR/$tdir)
14201 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
14203 run_test 185 "Volatile file support"
14205 function create_check_volatile() {
14209 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
14212 local FID=$(cat /tmp/${tfile}.fid)
14213 [ "$FID" == "" ] && error "can't get FID for volatile"
14214 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
14215 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
14216 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
14220 cancel_lru_locks mdc # flush opencache
14221 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
14226 # LU-12516 - volatile creation via .lustre
14227 [[ $MDS1_VERSION -ge $(version_code 2.12.2) ]] ||
14228 skip "Need MDS version at least 2.12.2"
14230 create_check_volatile 0
14231 [ $MDSCOUNT -lt 2 ] && return 0
14234 create_check_volatile 1
14238 run_test 185a "Volatile file creation in .lustre/fid/"
14241 remote_mds_nodsh && skip "remote MDS with nodsh"
14242 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14243 skip "Need MDS version at least 2.3.0"
14245 local dir0=$DIR/$tdir/$testnum
14246 mkdir -p $dir0 || error "creating dir $dir0"
14248 local file=$dir0/file1
14249 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
14250 local dv1=$($LFS data_version $file)
14251 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
14252 local dv2=$($LFS data_version $file)
14253 [[ $dv1 != $dv2 ]] ||
14254 error "data version did not change on write $dv1 == $dv2"
14259 run_test 187a "Test data version change"
14262 remote_mds_nodsh && skip "remote MDS with nodsh"
14263 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14264 skip "Need MDS version at least 2.3.0"
14266 local dir0=$DIR/$tdir/$testnum
14267 mkdir -p $dir0 || error "creating dir $dir0"
14269 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
14270 [[ ${DV[0]} != ${DV[1]} ]] ||
14271 error "data version did not change on write"\
14272 " ${DV[0]} == ${DV[1]}"
14277 run_test 187b "Test data version change on volatile file"
14280 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14281 remote_mgs_nodsh && skip "remote MGS with nodsh"
14282 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
14284 local POOL=${POOL:-cea1}
14285 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
14286 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
14289 local last_ost=$(($OSTCOUNT - 1))
14291 local ost_list=$(seq $first_ost $ost_step $last_ost)
14292 local ost_range="$first_ost $last_ost $ost_step"
14293 local test_path=$POOL_ROOT/$POOL_DIR_NAME
14294 local file_dir=$POOL_ROOT/file_tst
14295 local subdir=$test_path/subdir
14299 # former test_200a test_200b
14300 pool_add $POOL || { rc=$? ; break; }
14301 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
14302 # former test_200c test_200d
14303 mkdir -p $test_path
14304 pool_set_dir $POOL $test_path || { rc=$? ; break; }
14305 pool_check_dir $POOL $test_path || { rc=$? ; break; }
14307 pool_check_dir $POOL $subdir || { rc=$? ; break; }
14308 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
14309 || { rc=$? ; break; }
14310 # former test_200e test_200f
14311 local files=$((OSTCOUNT*3))
14312 pool_alloc_files $POOL $test_path $files "$ost_list" \
14313 || { rc=$? ; break; }
14314 pool_create_files $POOL $file_dir $files "$ost_list" \
14315 || { rc=$? ; break; }
14316 # former test_200g test_200h
14317 pool_lfs_df $POOL || { rc=$? ; break; }
14318 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
14320 # former test_201a test_201b test_201c
14321 pool_remove_first_target $POOL || { rc=$? ; break; }
14323 local f=$test_path/$tfile
14324 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
14325 pool_remove $POOL $f || { rc=$? ; break; }
14333 run_test 200 "OST pools"
14335 # usage: default_attr <count | size | offset>
14337 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
14340 # usage: check_default_stripe_attr
14341 check_default_stripe_attr() {
14342 ACTUAL=$($GETSTRIPE $* $DIR/$tdir)
14345 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
14347 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
14351 error "unknown getstripe attr '$1'"
14354 [ $ACTUAL == $EXPECTED ] ||
14355 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
14359 test_mkdir $DIR/$tdir
14360 $SETSTRIPE --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
14362 check_default_stripe_attr --stripe-count
14363 check_default_stripe_attr --stripe-size
14364 check_default_stripe_attr --stripe-index
14366 run_test 204a "Print default stripe attributes"
14369 test_mkdir $DIR/$tdir
14370 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14372 check_default_stripe_attr --stripe-size
14373 check_default_stripe_attr --stripe-index
14375 run_test 204b "Print default stripe size and offset"
14378 test_mkdir $DIR/$tdir
14379 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14381 check_default_stripe_attr --stripe-count
14382 check_default_stripe_attr --stripe-index
14384 run_test 204c "Print default stripe count and offset"
14387 test_mkdir $DIR/$tdir
14388 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14390 check_default_stripe_attr --stripe-count
14391 check_default_stripe_attr --stripe-size
14393 run_test 204d "Print default stripe count and size"
14396 test_mkdir $DIR/$tdir
14397 $SETSTRIPE -d $DIR/$tdir
14399 check_default_stripe_attr --stripe-count --raw
14400 check_default_stripe_attr --stripe-size --raw
14401 check_default_stripe_attr --stripe-index --raw
14403 run_test 204e "Print raw stripe attributes"
14406 test_mkdir $DIR/$tdir
14407 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14409 check_default_stripe_attr --stripe-size --raw
14410 check_default_stripe_attr --stripe-index --raw
14412 run_test 204f "Print raw stripe size and offset"
14415 test_mkdir $DIR/$tdir
14416 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14418 check_default_stripe_attr --stripe-count --raw
14419 check_default_stripe_attr --stripe-index --raw
14421 run_test 204g "Print raw stripe count and offset"
14424 test_mkdir $DIR/$tdir
14425 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14427 check_default_stripe_attr --stripe-count --raw
14428 check_default_stripe_attr --stripe-size --raw
14430 run_test 204h "Print raw stripe count and size"
14432 # Figure out which job scheduler is being used, if any,
14433 # or use a fake one
14434 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
14435 JOBENV=SLURM_JOB_ID
14436 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
14438 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
14440 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
14441 JOBENV=LOADL_STEP_ID
14442 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
14445 $LCTL list_param jobid_name > /dev/null 2>&1
14446 if [ $? -eq 0 ]; then
14452 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
14454 verify_jobstats() {
14459 # we don't really need to clear the stats for this test to work, since each
14460 # command has a unique jobid, but it makes debugging easier if needed.
14461 # for facet in $facets; do
14462 # local dev=$(convert_facet2label $facet)
14463 # # clear old jobstats
14464 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
14467 # use a new JobID for each test, or we might see an old one
14468 [ "$JOBENV" = "FAKE_JOBID" ] &&
14469 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
14471 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
14473 [ "$JOBENV" = "nodelocal" ] && {
14474 FAKE_JOBID=id.$testnum.%e.$RANDOM
14475 $LCTL set_param jobid_name=$FAKE_JOBID
14476 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
14479 log "Test: ${cmd[*]}"
14480 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
14482 if [ $JOBENV = "FAKE_JOBID" ]; then
14483 FAKE_JOBID=$JOBVAL ${cmd[*]}
14488 # all files are created on OST0000
14489 for facet in $facets; do
14490 local stats="*.$(convert_facet2label $facet).job_stats"
14492 # strip out libtool wrappers for in-tree executables
14493 if [ $(do_facet $facet lctl get_param $stats |
14494 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
14495 do_facet $facet lctl get_param $stats
14496 error "No jobstats for $JOBVAL found on $facet::$stats"
14502 local new_jobenv=$1
14504 set_persistent_param_and_check client "jobid_var" \
14505 "$FSNAME.sys.jobid_var" $new_jobenv
14508 test_205() { # Job stats
14509 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14510 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
14511 skip "Need MDS version with at least 2.7.1"
14512 remote_mgs_nodsh && skip "remote MGS with nodsh"
14513 remote_mds_nodsh && skip "remote MDS with nodsh"
14514 remote_ost_nodsh && skip "remote OST with nodsh"
14515 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
14516 skip "Server doesn't support jobstats"
14517 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
14519 local old_jobenv=$($LCTL get_param -n jobid_var)
14520 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
14522 if [[ $PERM_CMD = *"set_param -P"* ]]; then
14523 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
14525 stack_trap "do_facet mgs $PERM_CMD \
14526 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
14530 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
14531 mdt.*.job_cleanup_interval | head -n 1)
14532 local new_interval=5
14533 do_facet $SINGLEMDS \
14534 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
14535 stack_trap "do_facet $SINGLEMDS \
14536 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
14537 local start=$SECONDS
14541 cmd="mkdir $DIR/$tdir"
14542 verify_jobstats "$cmd" "$SINGLEMDS"
14544 cmd="rmdir $DIR/$tdir"
14545 verify_jobstats "$cmd" "$SINGLEMDS"
14546 # mkdir on secondary MDT
14547 if [ $MDSCOUNT -gt 1 ]; then
14548 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
14549 verify_jobstats "$cmd" "mds2"
14552 cmd="mknod $DIR/$tfile c 1 3"
14553 verify_jobstats "$cmd" "$SINGLEMDS"
14555 cmd="rm -f $DIR/$tfile"
14556 verify_jobstats "$cmd" "$SINGLEMDS"
14557 # create all files on OST0000 so verify_jobstats can find OST stats
14559 cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile"
14560 verify_jobstats "$cmd" "$SINGLEMDS"
14562 cmd="touch $DIR/$tfile"
14563 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14565 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
14566 verify_jobstats "$cmd" "ost1"
14568 cancel_lru_locks osc
14569 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
14570 verify_jobstats "$cmd" "ost1"
14572 cmd="$TRUNCATE $DIR/$tfile 0"
14573 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14575 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
14576 verify_jobstats "$cmd" "$SINGLEMDS"
14577 # jobstats expiry - sleep until old stats should be expired
14578 local left=$((new_interval + 5 - (SECONDS - start)))
14579 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
14580 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
14582 cmd="mkdir $DIR/$tdir.expire"
14583 verify_jobstats "$cmd" "$SINGLEMDS"
14584 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
14585 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
14587 # Ensure that jobid are present in changelog (if supported by MDS)
14588 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
14589 changelog_dump | tail -10
14590 jobids=$(changelog_dump | tail -9 | grep -c "j=")
14591 [ $jobids -eq 9 ] ||
14592 error "Wrong changelog jobid count $jobids != 9"
14596 jobstats_set $JOBENV
14598 changelog_dump | grep $tfile
14599 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
14600 [ $jobids -eq 0 ] ||
14601 error "Unexpected jobids when jobid_var=$JOBENV"
14604 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
14605 JOBENV="JOBCOMPLEX"
14606 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
14608 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
14610 run_test 205 "Verify job stats"
14612 # LU-1480, LU-1773 and LU-1657
14614 mkdir -p $DIR/$tdir
14615 $SETSTRIPE -c -1 $DIR/$tdir
14616 #define OBD_FAIL_LOV_INIT 0x1403
14617 $LCTL set_param fail_loc=0xa0001403
14618 $LCTL set_param fail_val=1
14619 touch $DIR/$tdir/$tfile || true
14621 run_test 206 "fail lov_init_raid0() doesn't lbug"
14624 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14625 local fsz=`stat -c %s $DIR/$tfile`
14626 cancel_lru_locks mdc
14628 # do not return layout in getattr intent
14629 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
14630 $LCTL set_param fail_loc=0x170
14631 local sz=`stat -c %s $DIR/$tfile`
14633 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
14637 run_test 207a "can refresh layout at glimpse"
14640 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14641 local cksum=`md5sum $DIR/$tfile`
14642 local fsz=`stat -c %s $DIR/$tfile`
14643 cancel_lru_locks mdc
14644 cancel_lru_locks osc
14646 # do not return layout in getattr intent
14647 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
14648 $LCTL set_param fail_loc=0x171
14650 # it will refresh layout after the file is opened but before read issues
14651 echo checksum is "$cksum"
14652 echo "$cksum" |md5sum -c --quiet || error "file differs"
14656 run_test 207b "can refresh layout at open"
14659 # FIXME: in this test suite, only RD lease is used. This is okay
14660 # for now as only exclusive open is supported. After generic lease
14661 # is done, this test suite should be revised. - Jinshan
14663 remote_mds_nodsh && skip "remote MDS with nodsh"
14664 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
14665 skip "Need MDS version at least 2.4.52"
14667 echo "==== test 1: verify get lease work"
14668 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
14670 echo "==== test 2: verify lease can be broken by upcoming open"
14671 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
14675 $MULTIOP $DIR/$tfile oO_RDONLY:c
14676 kill -USR1 $PID && wait $PID || error "break lease error"
14678 echo "==== test 3: verify lease can't be granted if an open already exists"
14679 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
14683 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
14684 kill -USR1 $PID && wait $PID || error "open file error"
14686 echo "==== test 4: lease can sustain over recovery"
14687 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
14693 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
14695 echo "==== test 5: lease broken can't be regained by replay"
14696 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
14700 # open file to break lease and then recovery
14701 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
14704 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
14708 run_test 208 "Exclusive open"
14711 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
14712 skip_env "must have disp_stripe"
14715 sync; sleep 5; sync;
14717 echo 3 > /proc/sys/vm/drop_caches
14718 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
14720 # open/close 500 times
14721 for i in $(seq 500); do
14725 echo 3 > /proc/sys/vm/drop_caches
14726 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
14728 echo "before: $req_before, after: $req_after"
14729 [ $((req_after - req_before)) -ge 300 ] &&
14730 error "open/close requests are not freed"
14733 run_test 209 "read-only open/close requests should be freed promptly"
14737 size=$((size % 8192 + 1))
14738 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
14739 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
14740 rm -f $DIR/f212 $DIR/f212.xyz
14742 run_test 212 "Sendfile test ============================================"
14745 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
14746 cancel_lru_locks osc
14747 lctl set_param fail_loc=0x8000040f
14748 # generate a read lock
14749 cat $DIR/$tfile > /dev/null
14750 # write to the file, it will try to cancel the above read lock.
14751 cat /etc/hosts >> $DIR/$tfile
14753 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
14755 test_214() { # for bug 20133
14756 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
14757 for (( i=0; i < 340; i++ )) ; do
14758 touch $DIR/$tdir/d214c/a$i
14761 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
14762 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
14763 ls $DIR/d214c || error "ls $DIR/d214c failed"
14764 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
14765 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
14767 run_test 214 "hash-indexed directory test - bug 20133"
14769 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
14770 create_lnet_proc_files() {
14771 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
14774 # counterpart of create_lnet_proc_files
14775 remove_lnet_proc_files() {
14776 rm -f $TMP/lnet_$1.sys
14779 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
14780 # 3rd arg as regexp for body
14781 check_lnet_proc_stats() {
14782 local l=$(cat "$TMP/lnet_$1" |wc -l)
14783 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
14785 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
14788 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
14789 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
14790 # optional and can be regexp for 2nd line (lnet.routes case)
14791 check_lnet_proc_entry() {
14792 local blp=2 # blp stands for 'position of 1st line of body'
14793 [ -z "$5" ] || blp=3 # lnet.routes case
14795 local l=$(cat "$TMP/lnet_$1" |wc -l)
14796 # subtracting one from $blp because the body can be empty
14797 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
14799 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
14800 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
14802 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
14803 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
14805 # bail out if any unexpected line happened
14806 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
14807 [ "$?" != 0 ] || error "$2 misformatted"
14810 test_215() { # for bugs 18102, 21079, 21517
14811 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14813 local N='(0|[1-9][0-9]*)' # non-negative numeric
14814 local P='[1-9][0-9]*' # positive numeric
14815 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
14816 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
14817 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
14818 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
14820 local L1 # regexp for 1st line
14821 local L2 # regexp for 2nd line (optional)
14822 local BR # regexp for the rest (body)
14824 # lnet.stats should look as 11 space-separated non-negative numerics
14825 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
14826 create_lnet_proc_files "stats"
14827 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
14828 remove_lnet_proc_files "stats"
14830 # lnet.routes should look like this:
14831 # Routing disabled/enabled
14832 # net hops priority state router
14833 # where net is a string like tcp0, hops > 0, priority >= 0,
14834 # state is up/down,
14835 # router is a string like 192.168.1.1@tcp2
14836 L1="^Routing (disabled|enabled)$"
14837 L2="^net +hops +priority +state +router$"
14838 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
14839 create_lnet_proc_files "routes"
14840 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
14841 remove_lnet_proc_files "routes"
14843 # lnet.routers should look like this:
14844 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
14845 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
14846 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
14847 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
14848 L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
14849 BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
14850 create_lnet_proc_files "routers"
14851 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
14852 remove_lnet_proc_files "routers"
14854 # lnet.peers should look like this:
14855 # nid refs state last max rtr min tx min queue
14856 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
14857 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
14858 # numeric (0 or >0 or <0), queue >= 0.
14859 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
14860 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
14861 create_lnet_proc_files "peers"
14862 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
14863 remove_lnet_proc_files "peers"
14865 # lnet.buffers should look like this:
14866 # pages count credits min
14867 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
14868 L1="^pages +count +credits +min$"
14869 BR="^ +$N +$N +$I +$I$"
14870 create_lnet_proc_files "buffers"
14871 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
14872 remove_lnet_proc_files "buffers"
14874 # lnet.nis should look like this:
14875 # nid status alive refs peer rtr max tx min
14876 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
14877 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
14878 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
14879 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
14880 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
14881 create_lnet_proc_files "nis"
14882 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
14883 remove_lnet_proc_files "nis"
14885 # can we successfully write to lnet.stats?
14886 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
14888 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
14890 test_216() { # bug 20317
14891 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14892 remote_ost_nodsh && skip "remote OST with nodsh"
14895 local facets=$(get_facets OST)
14896 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
14898 save_lustre_params client "osc.*.contention_seconds" > $p
14899 save_lustre_params $facets \
14900 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
14901 save_lustre_params $facets \
14902 "ldlm.namespaces.filter-*.contended_locks" >> $p
14903 save_lustre_params $facets \
14904 "ldlm.namespaces.filter-*.contention_seconds" >> $p
14905 clear_stats osc.*.osc_stats
14907 # agressive lockless i/o settings
14908 do_nodes $(comma_list $(osts_nodes)) \
14909 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
14910 ldlm.namespaces.filter-*.contended_locks=0 \
14911 ldlm.namespaces.filter-*.contention_seconds=60"
14912 lctl set_param -n osc.*.contention_seconds=60
14914 $DIRECTIO write $DIR/$tfile 0 10 4096
14915 $CHECKSTAT -s 40960 $DIR/$tfile
14917 # disable lockless i/o
14918 do_nodes $(comma_list $(osts_nodes)) \
14919 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
14920 ldlm.namespaces.filter-*.contended_locks=32 \
14921 ldlm.namespaces.filter-*.contention_seconds=0"
14922 lctl set_param -n osc.*.contention_seconds=0
14923 clear_stats osc.*.osc_stats
14925 dd if=/dev/zero of=$DIR/$tfile count=0
14926 $CHECKSTAT -s 0 $DIR/$tfile
14928 restore_lustre_params <$p
14932 run_test 216 "check lockless direct write updates file size and kms correctly"
14934 test_217() { # bug 22430
14935 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14940 for node in $(nodes_list); do
14941 nid=$(host_nids_address $node $NETTYPE)
14942 if [[ $nid = *-* ]] ; then
14943 echo "lctl ping $(h2nettype $nid)"
14944 lctl ping $(h2nettype $nid)
14946 echo "skipping $node (no hyphen detected)"
14950 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
14953 # do directio so as not to populate the page cache
14954 log "creating a 10 Mb file"
14955 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
14956 log "starting reads"
14957 dd if=$DIR/$tfile of=/dev/null bs=4096 &
14958 log "truncating the file"
14959 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
14961 kill %+ || true # reads might have finished
14962 echo "wait until dd is finished"
14964 log "removing the temporary file"
14965 rm -rf $DIR/$tfile || error "tmp file removal failed"
14967 run_test 218 "parallel read and truncate should not deadlock"
14970 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14972 # write one partial page
14973 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
14974 # set no grant so vvp_io_commit_write will do sync write
14975 $LCTL set_param fail_loc=0x411
14976 # write a full page at the end of file
14977 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
14979 $LCTL set_param fail_loc=0
14980 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
14981 $LCTL set_param fail_loc=0x411
14982 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
14985 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
14986 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
14988 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
14990 test_220() { #LU-325
14991 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14992 remote_ost_nodsh && skip "remote OST with nodsh"
14993 remote_mds_nodsh && skip "remote MDS with nodsh"
14994 remote_mgs_nodsh && skip "remote MGS with nodsh"
14998 # create on MDT0000 so the last_id and next_id are correct
15000 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
15004 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
15005 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
15006 osp.$mdtosc_proc1.prealloc_last_id)
15007 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15008 osp.$mdtosc_proc1.prealloc_next_id)
15012 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15013 #define OBD_FAIL_OST_ENOINO 0x229
15014 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15015 create_pool $FSNAME.$TESTNAME || return 1
15016 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15018 $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15020 MDSOBJS=$((last_id - next_id))
15021 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15023 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15024 echo "OST still has $count kbytes free"
15026 echo "create $MDSOBJS files @next_id..."
15027 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15029 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15030 osp.$mdtosc_proc1.prealloc_last_id)
15031 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15032 osp.$mdtosc_proc1.prealloc_next_id)
15034 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15039 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15040 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15042 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15043 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15044 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15045 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15046 echo "unlink $MDSOBJS files @$next_id..."
15047 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15049 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15052 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15054 dd if=`which date` of=$MOUNT/date oflag=sync
15055 chmod +x $MOUNT/date
15057 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15058 $LCTL set_param fail_loc=0x80001401
15060 $MOUNT/date > /dev/null
15063 run_test 221 "make sure fault and truncate race to not cause OOM"
15066 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15069 test_mkdir $DIR/$tdir
15070 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15071 createmany -o $DIR/$tdir/$tfile 10
15072 cancel_lru_locks mdc
15073 cancel_lru_locks osc
15074 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15075 $LCTL set_param fail_loc=0x31a
15076 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15077 $LCTL set_param fail_loc=0
15080 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15083 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15086 test_mkdir $DIR/$tdir
15087 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15088 createmany -o $DIR/$tdir/$tfile 10
15089 cancel_lru_locks mdc
15090 cancel_lru_locks osc
15091 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15092 $LCTL set_param fail_loc=0x31a
15093 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15094 $LCTL set_param fail_loc=0
15096 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15099 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15102 test_mkdir $DIR/$tdir
15103 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15104 createmany -o $DIR/$tdir/$tfile 10
15105 cancel_lru_locks mdc
15106 cancel_lru_locks osc
15107 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15108 $LCTL set_param fail_loc=0x31b
15109 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15110 $LCTL set_param fail_loc=0
15113 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15115 test_224a() { # LU-1039, MRP-303
15116 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15118 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15119 $LCTL set_param fail_loc=0x508
15120 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15121 $LCTL set_param fail_loc=0
15124 run_test 224a "Don't panic on bulk IO failure"
15126 test_224b() { # LU-1039, MRP-303
15127 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15129 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15130 cancel_lru_locks osc
15131 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15132 $LCTL set_param fail_loc=0x515
15133 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15134 $LCTL set_param fail_loc=0
15137 run_test 224b "Don't panic on bulk IO failure"
15139 test_224c() { # LU-6441
15140 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15141 remote_mds_nodsh && skip "remote MDS with nodsh"
15143 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15144 save_writethrough $p
15145 set_cache writethrough on
15147 local pages_per_rpc=$($LCTL get_param \
15148 osc.*.max_pages_per_rpc)
15149 local at_max=$($LCTL get_param -n at_max)
15150 local timeout=$($LCTL get_param -n timeout)
15151 local test_at="at_max"
15152 local param_at="$FSNAME.sys.at_max"
15153 local test_timeout="timeout"
15154 local param_timeout="$FSNAME.sys.timeout"
15156 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
15158 set_persistent_param_and_check client "$test_at" "$param_at" 0
15159 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
15161 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
15162 do_facet ost1 $LCTL set_param fail_loc=0x520
15163 $LFS setstripe -c 1 -i 0 $DIR/$tfile
15164 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
15166 do_facet ost1 $LCTL set_param fail_loc=0
15168 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
15169 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
15172 $LCTL set_param -n $pages_per_rpc
15173 restore_lustre_params < $p
15176 run_test 224c "Don't hang if one of md lost during large bulk RPC"
15178 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
15180 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15181 if [ -z ${MDSSURVEY} ]; then
15182 skip_env "mds-survey not found"
15184 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15185 skip "Need MDS version at least 2.2.51"
15187 local mds=$(facet_host $SINGLEMDS)
15188 local target=$(do_nodes $mds 'lctl dl' |
15189 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15191 local cmd1="file_count=1000 thrhi=4"
15192 local cmd2="dir_count=2 layer=mdd stripe_count=0"
15193 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15194 local cmd="$cmd1 $cmd2 $cmd3"
15196 rm -f ${TMP}/mds_survey*
15198 eval $cmd || error "mds-survey with zero-stripe failed"
15199 cat ${TMP}/mds_survey*
15200 rm -f ${TMP}/mds_survey*
15202 run_test 225a "Metadata survey sanity with zero-stripe"
15205 if [ -z ${MDSSURVEY} ]; then
15206 skip_env "mds-survey not found"
15208 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15209 skip "Need MDS version at least 2.2.51"
15210 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15211 remote_mds_nodsh && skip "remote MDS with nodsh"
15212 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
15213 skip_env "Need to mount OST to test"
15216 local mds=$(facet_host $SINGLEMDS)
15217 local target=$(do_nodes $mds 'lctl dl' |
15218 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15220 local cmd1="file_count=1000 thrhi=4"
15221 local cmd2="dir_count=2 layer=mdd stripe_count=1"
15222 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15223 local cmd="$cmd1 $cmd2 $cmd3"
15225 rm -f ${TMP}/mds_survey*
15227 eval $cmd || error "mds-survey with stripe_count failed"
15228 cat ${TMP}/mds_survey*
15229 rm -f ${TMP}/mds_survey*
15231 run_test 225b "Metadata survey sanity with stripe_count = 1"
15233 mcreate_path2fid () {
15239 local path=$DIR/$tdir/$name
15244 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
15245 error "cannot create $desc"
15247 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
15249 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
15251 fid_path=$($LFS fid2path $MOUNT $fid)
15253 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
15255 [ "$path" == "$fid_path" ] ||
15256 error "fid2path returned $fid_path, expected $path"
15258 echo "pass with $path and $fid"
15263 mkdir -p $DIR/$tdir
15265 mcreate_path2fid 0010666 0 0 fifo "FIFO"
15266 mcreate_path2fid 0020666 1 3 null "character special file (null)"
15267 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
15268 mcreate_path2fid 0040666 0 0 dir "directory"
15269 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
15270 mcreate_path2fid 0100666 0 0 file "regular file"
15271 mcreate_path2fid 0120666 0 0 link "symbolic link"
15272 mcreate_path2fid 0140666 0 0 sock "socket"
15274 run_test 226a "call path2fid and fid2path on files of all type"
15277 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15282 mkdir -p $DIR/$tdir
15283 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
15284 error "create remote directory failed"
15285 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
15286 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
15287 "character special file (null)"
15288 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
15289 "character special file (no device)"
15290 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
15291 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
15292 "block special file (loop)"
15293 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
15294 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
15295 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
15297 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
15299 # LU-1299 Executing or running ldd on a truncated executable does not
15300 # cause an out-of-memory condition.
15302 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15303 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
15305 dd if=$(which date) of=$MOUNT/date bs=1k count=1
15306 chmod +x $MOUNT/date
15308 $MOUNT/date > /dev/null
15309 ldd $MOUNT/date > /dev/null
15312 run_test 227 "running truncated executable does not cause OOM"
15314 # LU-1512 try to reuse idle OI blocks
15316 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15317 remote_mds_nodsh && skip "remote MDS with nodsh"
15318 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15320 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15321 local myDIR=$DIR/$tdir
15324 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15325 $LCTL set_param fail_loc=0x80001002
15326 createmany -o $myDIR/t- 10000
15327 $LCTL set_param fail_loc=0
15328 # The guard is current the largest FID holder
15330 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15332 local IDX=$(($SEQ % 64))
15334 do_facet $SINGLEMDS sync
15335 # Make sure journal flushed.
15337 local blk1=$(do_facet $SINGLEMDS \
15338 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15339 grep Blockcount | awk '{print $4}')
15341 # Remove old files, some OI blocks will become idle.
15342 unlinkmany $myDIR/t- 10000
15343 # Create new files, idle OI blocks should be reused.
15344 createmany -o $myDIR/t- 2000
15345 do_facet $SINGLEMDS sync
15346 # Make sure journal flushed.
15348 local blk2=$(do_facet $SINGLEMDS \
15349 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15350 grep Blockcount | awk '{print $4}')
15352 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15354 run_test 228a "try to reuse idle OI blocks"
15357 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15358 remote_mds_nodsh && skip "remote MDS with nodsh"
15359 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15361 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15362 local myDIR=$DIR/$tdir
15365 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15366 $LCTL set_param fail_loc=0x80001002
15367 createmany -o $myDIR/t- 10000
15368 $LCTL set_param fail_loc=0
15369 # The guard is current the largest FID holder
15371 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15373 local IDX=$(($SEQ % 64))
15375 do_facet $SINGLEMDS sync
15376 # Make sure journal flushed.
15378 local blk1=$(do_facet $SINGLEMDS \
15379 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15380 grep Blockcount | awk '{print $4}')
15382 # Remove old files, some OI blocks will become idle.
15383 unlinkmany $myDIR/t- 10000
15386 stop $SINGLEMDS || error "Fail to stop MDT."
15388 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
15390 df $MOUNT || error "Fail to df."
15391 # Create new files, idle OI blocks should be reused.
15392 createmany -o $myDIR/t- 2000
15393 do_facet $SINGLEMDS sync
15394 # Make sure journal flushed.
15396 local blk2=$(do_facet $SINGLEMDS \
15397 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15398 grep Blockcount | awk '{print $4}')
15400 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15402 run_test 228b "idle OI blocks can be reused after MDT restart"
15406 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15407 remote_mds_nodsh && skip "remote MDS with nodsh"
15408 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15410 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15411 local myDIR=$DIR/$tdir
15414 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15415 $LCTL set_param fail_loc=0x80001002
15416 # 20000 files can guarantee there are index nodes in the OI file
15417 createmany -o $myDIR/t- 20000
15418 $LCTL set_param fail_loc=0
15419 # The guard is current the largest FID holder
15421 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15423 local IDX=$(($SEQ % 64))
15425 do_facet $SINGLEMDS sync
15426 # Make sure journal flushed.
15428 local blk1=$(do_facet $SINGLEMDS \
15429 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15430 grep Blockcount | awk '{print $4}')
15432 # Remove old files, some OI blocks will become idle.
15433 unlinkmany $myDIR/t- 20000
15435 # The OI file should become empty now
15437 # Create new files, idle OI blocks should be reused.
15438 createmany -o $myDIR/t- 2000
15439 do_facet $SINGLEMDS sync
15440 # Make sure journal flushed.
15442 local blk2=$(do_facet $SINGLEMDS \
15443 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15444 grep Blockcount | awk '{print $4}')
15446 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15448 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
15450 test_229() { # LU-2482, LU-3448
15451 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15452 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
15453 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
15454 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
15458 # Create a file with a released layout and stripe count 2.
15459 $MULTIOP $DIR/$tfile H2c ||
15460 error "failed to create file with released layout"
15462 $GETSTRIPE -v $DIR/$tfile
15464 local pattern=$($GETSTRIPE -L $DIR/$tfile)
15465 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
15467 local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
15468 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
15469 stat $DIR/$tfile || error "failed to stat released file"
15471 chown $RUNAS_ID $DIR/$tfile ||
15472 error "chown $RUNAS_ID $DIR/$tfile failed"
15474 chgrp $RUNAS_ID $DIR/$tfile ||
15475 error "chgrp $RUNAS_ID $DIR/$tfile failed"
15477 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
15478 rm $DIR/$tfile || error "failed to remove released file"
15480 run_test 229 "getstripe/stat/rm/attr changes work on released files"
15483 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15484 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15485 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15486 skip "Need MDS version at least 2.11.52"
15490 test_mkdir $DIR/$tdir
15491 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
15492 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
15493 [ $mdt_idx -ne 0 ] &&
15494 error "create local directory on wrong MDT $mdt_idx"
15496 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
15497 error "create remote directory failed"
15498 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
15499 [ $mdt_idx -ne $MDTIDX ] &&
15500 error "create remote directory on wrong MDT $mdt_idx"
15502 createmany -o $DIR/$tdir/test_230/t- 10 ||
15503 error "create files on remote directory failed"
15504 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
15505 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
15506 rm -r $DIR/$tdir || error "unlink remote directory failed"
15508 run_test 230a "Create remote directory and files under the remote directory"
15511 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15512 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15513 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15514 skip "Need MDS version at least 2.11.52"
15522 local migrate_dir=$DIR/$tdir/migrate_dir
15523 local other_dir=$DIR/$tdir/other_dir
15525 test_mkdir $DIR/$tdir
15526 test_mkdir -i0 -c1 $migrate_dir
15527 test_mkdir -i0 -c1 $other_dir
15528 for ((i=0; i<10; i++)); do
15529 mkdir -p $migrate_dir/dir_${i}
15530 createmany -o $migrate_dir/dir_${i}/f 10 ||
15531 error "create files under remote dir failed $i"
15534 cp /etc/passwd $migrate_dir/$tfile
15535 cp /etc/passwd $other_dir/$tfile
15536 chattr +SAD $migrate_dir
15537 chattr +SAD $migrate_dir/$tfile
15539 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15540 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15541 local old_dir_mode=$(stat -c%f $migrate_dir)
15542 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
15544 mkdir -p $migrate_dir/dir_default_stripe2
15545 $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2
15546 $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2
15548 mkdir -p $other_dir
15549 ln $migrate_dir/$tfile $other_dir/luna
15550 ln $migrate_dir/$tfile $migrate_dir/sofia
15551 ln $other_dir/$tfile $migrate_dir/david
15552 ln -s $migrate_dir/$tfile $other_dir/zachary
15553 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
15554 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
15556 $LFS migrate -m $MDTIDX $migrate_dir ||
15557 error "fails on migrating remote dir to MDT1"
15559 echo "migratate to MDT1, then checking.."
15560 for ((i = 0; i < 10; i++)); do
15561 for file in $(find $migrate_dir/dir_${i}); do
15562 mdt_index=$($LFS getstripe -m $file)
15563 [ $mdt_index == $MDTIDX ] ||
15564 error "$file is not on MDT${MDTIDX}"
15568 # the multiple link file should still in MDT0
15569 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
15570 [ $mdt_index == 0 ] ||
15571 error "$file is not on MDT${MDTIDX}"
15573 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15574 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15575 error " expect $old_dir_flag get $new_dir_flag"
15577 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15578 [ "$old_file_flag" = "$new_file_flag" ] ||
15579 error " expect $old_file_flag get $new_file_flag"
15581 local new_dir_mode=$(stat -c%f $migrate_dir)
15582 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15583 error "expect mode $old_dir_mode get $new_dir_mode"
15585 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15586 [ "$old_file_mode" = "$new_file_mode" ] ||
15587 error "expect mode $old_file_mode get $new_file_mode"
15589 diff /etc/passwd $migrate_dir/$tfile ||
15590 error "$tfile different after migration"
15592 diff /etc/passwd $other_dir/luna ||
15593 error "luna different after migration"
15595 diff /etc/passwd $migrate_dir/sofia ||
15596 error "sofia different after migration"
15598 diff /etc/passwd $migrate_dir/david ||
15599 error "david different after migration"
15601 diff /etc/passwd $other_dir/zachary ||
15602 error "zachary different after migration"
15604 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15605 error "${tfile}_ln different after migration"
15607 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15608 error "${tfile}_ln_other different after migration"
15610 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
15611 [ $stripe_count = 2 ] ||
15612 error "dir strpe_count $d != 2 after migration."
15614 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
15615 [ $stripe_count = 2 ] ||
15616 error "file strpe_count $d != 2 after migration."
15618 #migrate back to MDT0
15621 $LFS migrate -m $MDTIDX $migrate_dir ||
15622 error "fails on migrating remote dir to MDT0"
15624 echo "migrate back to MDT0, checking.."
15625 for file in $(find $migrate_dir); do
15626 mdt_index=$($LFS getstripe -m $file)
15627 [ $mdt_index == $MDTIDX ] ||
15628 error "$file is not on MDT${MDTIDX}"
15631 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15632 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15633 error " expect $old_dir_flag get $new_dir_flag"
15635 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15636 [ "$old_file_flag" = "$new_file_flag" ] ||
15637 error " expect $old_file_flag get $new_file_flag"
15639 local new_dir_mode=$(stat -c%f $migrate_dir)
15640 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15641 error "expect mode $old_dir_mode get $new_dir_mode"
15643 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15644 [ "$old_file_mode" = "$new_file_mode" ] ||
15645 error "expect mode $old_file_mode get $new_file_mode"
15647 diff /etc/passwd ${migrate_dir}/$tfile ||
15648 error "$tfile different after migration"
15650 diff /etc/passwd ${other_dir}/luna ||
15651 error "luna different after migration"
15653 diff /etc/passwd ${migrate_dir}/sofia ||
15654 error "sofia different after migration"
15656 diff /etc/passwd ${other_dir}/zachary ||
15657 error "zachary different after migration"
15659 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15660 error "${tfile}_ln different after migration"
15662 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15663 error "${tfile}_ln_other different after migration"
15665 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
15666 [ $stripe_count = 2 ] ||
15667 error "dir strpe_count $d != 2 after migration."
15669 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
15670 [ $stripe_count = 2 ] ||
15671 error "file strpe_count $d != 2 after migration."
15673 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15675 run_test 230b "migrate directory"
15678 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15679 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15680 remote_mds_nodsh && skip "remote MDS with nodsh"
15681 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15682 skip "Need MDS version at least 2.11.52"
15688 local migrate_dir=$DIR/$tdir/migrate_dir
15690 #If migrating directory fails in the middle, all entries of
15691 #the directory is still accessiable.
15692 test_mkdir $DIR/$tdir
15693 test_mkdir -i0 -c1 $migrate_dir
15694 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
15696 createmany -o $migrate_dir/f $total ||
15697 error "create files under ${migrate_dir} failed"
15699 # fail after migrating top dir, and this will fail only once, so the
15700 # first sub file migration will fail (currently f3), others succeed.
15701 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
15702 do_facet mds1 lctl set_param fail_loc=0x1801
15703 local t=$(ls $migrate_dir | wc -l)
15704 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
15705 error "migrate should fail"
15706 local u=$(ls $migrate_dir | wc -l)
15707 [ "$u" == "$t" ] || error "$u != $t during migration"
15709 # add new dir/file should succeed
15710 mkdir $migrate_dir/dir ||
15711 error "mkdir failed under migrating directory"
15712 touch $migrate_dir/file ||
15713 error "create file failed under migrating directory"
15715 # add file with existing name should fail
15716 for file in $migrate_dir/f*; do
15717 stat $file > /dev/null || error "stat $file failed"
15718 $OPENFILE -f O_CREAT:O_EXCL $file &&
15719 error "open(O_CREAT|O_EXCL) $file should fail"
15720 $MULTIOP $file m && error "create $file should fail"
15721 touch $DIR/$tdir/remote_dir/$tfile ||
15722 error "touch $tfile failed"
15723 ln $DIR/$tdir/remote_dir/$tfile $file &&
15724 error "link $file should fail"
15725 mdt_index=$($LFS getstripe -m $file)
15726 if [ $mdt_index == 0 ]; then
15727 # file failed to migrate is not allowed to rename to
15728 mv $DIR/$tdir/remote_dir/$tfile $file &&
15729 error "rename to $file should fail"
15731 mv $DIR/$tdir/remote_dir/$tfile $file ||
15732 error "rename to $file failed"
15734 echo hello >> $file || error "write $file failed"
15737 # resume migration with different options should fail
15738 $LFS migrate -m 0 $migrate_dir &&
15739 error "migrate -m 0 $migrate_dir should fail"
15741 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
15742 error "migrate -c 2 $migrate_dir should fail"
15744 # resume migration should succeed
15745 $LFS migrate -m $MDTIDX $migrate_dir ||
15746 error "migrate $migrate_dir failed"
15748 echo "Finish migration, then checking.."
15749 for file in $(find $migrate_dir); do
15750 mdt_index=$($LFS getstripe -m $file)
15751 [ $mdt_index == $MDTIDX ] ||
15752 error "$file is not on MDT${MDTIDX}"
15755 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15757 run_test 230c "check directory accessiblity if migration failed"
15760 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15761 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15762 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15763 skip "Need MDS version at least 2.11.52"
15765 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
15767 local migrate_dir=$DIR/$tdir/migrate_dir
15777 old_index=$((RANDOM % MDSCOUNT))
15778 old_count=$((MDSCOUNT - old_index))
15779 new_index=$((RANDOM % MDSCOUNT))
15780 new_count=$((MDSCOUNT - new_index))
15781 new_hash="all_char"
15783 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
15784 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
15786 test_mkdir $DIR/$tdir
15787 test_mkdir -i $old_index -c $old_count $migrate_dir
15789 for ((i=0; i<100; i++)); do
15790 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
15791 createmany -o $migrate_dir/dir_${i}/f 100 ||
15792 error "create files under remote dir failed $i"
15795 echo -n "Migrate from MDT$old_index "
15796 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
15797 echo -n "to MDT$new_index"
15798 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
15801 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
15802 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
15803 error "migrate remote dir error"
15805 echo "Finish migration, then checking.."
15806 for file in $(find $migrate_dir); do
15807 mdt_index=$($LFS getstripe -m $file)
15808 if [ $mdt_index -lt $new_index ] ||
15809 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
15810 error "$file is on MDT$mdt_index"
15814 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15816 run_test 230d "check migrate big directory"
15819 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15820 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15821 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15822 skip "Need MDS version at least 2.11.52"
15829 mkdir -p $DIR/$tdir
15830 mkdir $DIR/$tdir/migrate_dir
15831 mkdir $DIR/$tdir/other_dir
15832 touch $DIR/$tdir/migrate_dir/a
15833 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
15834 ls $DIR/$tdir/other_dir
15836 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
15837 error "migrate dir fails"
15839 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
15840 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
15842 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
15843 [ $mdt_index == 0 ] || error "a is not on MDT0"
15845 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
15846 error "migrate dir fails"
15848 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
15849 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
15851 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
15852 [ $mdt_index == 1 ] || error "a is not on MDT1"
15854 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
15855 [ $mdt_index == 1 ] || error "b is not on MDT1"
15857 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
15858 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
15860 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
15862 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15864 run_test 230e "migrate mulitple local link files"
15867 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15868 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15869 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15870 skip "Need MDS version at least 2.11.52"
15875 mkdir -p $DIR/$tdir
15876 mkdir $DIR/$tdir/migrate_dir
15877 $LFS mkdir -i1 $DIR/$tdir/other_dir
15878 touch $DIR/$tdir/migrate_dir/a
15879 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
15880 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
15881 ls $DIR/$tdir/other_dir
15883 # a should be migrated to MDT1, since no other links on MDT0
15884 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
15885 error "#1 migrate dir fails"
15886 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
15887 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
15888 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
15889 [ $mdt_index == 1 ] || error "a is not on MDT1"
15891 # a should stay on MDT1, because it is a mulitple link file
15892 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
15893 error "#2 migrate dir fails"
15894 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
15895 [ $mdt_index == 1 ] || error "a is not on MDT1"
15897 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
15898 error "#3 migrate dir fails"
15900 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
15901 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
15902 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
15904 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
15905 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
15907 # a should be migrated to MDT0, since no other links on MDT1
15908 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
15909 error "#4 migrate dir fails"
15910 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
15911 [ $mdt_index == 0 ] || error "a is not on MDT0"
15913 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15915 run_test 230f "migrate mulitple remote link files"
15918 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15919 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15920 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15921 skip "Need MDS version at least 2.11.52"
15923 mkdir -p $DIR/$tdir/migrate_dir
15925 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
15926 error "migrating dir to non-exist MDT succeeds"
15929 run_test 230g "migrate dir to non-exist MDT"
15932 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15933 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15934 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15935 skip "Need MDS version at least 2.11.52"
15939 mkdir -p $DIR/$tdir/migrate_dir
15941 $LFS migrate -m1 $DIR &&
15942 error "migrating mountpoint1 should fail"
15944 $LFS migrate -m1 $DIR/$tdir/.. &&
15945 error "migrating mountpoint2 should fail"
15948 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
15949 error "migrating $tdir/migrate_dir/.. should fail"
15953 run_test 230h "migrate .. and root"
15956 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15957 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15958 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15959 skip "Need MDS version at least 2.11.52"
15961 mkdir -p $DIR/$tdir/migrate_dir
15963 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
15964 error "migration fails with a tailing slash"
15966 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
15967 error "migration fails with two tailing slashes"
15969 run_test 230i "lfs migrate -m tolerates trailing slashes"
15972 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
15973 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15974 skip "Need MDS version at least 2.11.52"
15976 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
15977 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
15978 error "create $tfile failed"
15979 cat /etc/passwd > $DIR/$tdir/$tfile
15981 $LFS migrate -m 1 $DIR/$tdir
15983 cmp /etc/passwd $DIR/$tdir/$tfile ||
15984 error "DoM file mismatch after migration"
15986 run_test 230j "DoM file data not changed after dir migration"
15989 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
15990 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
15991 skip "Need MDS version at least 2.11.56"
15994 local files_on_starting_mdt=0
15996 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
15997 $LFS getdirstripe $DIR/$tdir
15998 for i in $(seq $total); do
15999 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
16000 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16001 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16004 echo "$files_on_starting_mdt files on MDT0"
16006 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
16007 $LFS getdirstripe $DIR/$tdir
16009 files_on_starting_mdt=0
16010 for i in $(seq $total); do
16011 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16012 error "file $tfile.$i mismatch after migration"
16013 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16014 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16017 echo "$files_on_starting_mdt files on MDT1 after migration"
16018 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16020 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16021 $LFS getdirstripe $DIR/$tdir
16023 files_on_starting_mdt=0
16024 for i in $(seq $total); do
16025 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16026 error "file $tfile.$i mismatch after 2nd migration"
16027 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16028 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16031 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
16032 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16036 run_test 230k "file data not changed after dir migration"
16039 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16040 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16041 skip "Need MDS version at least 2.11.56"
16043 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16044 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16045 error "create files under remote dir failed $i"
16046 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16048 run_test 230l "readdir between MDTs won't crash"
16052 # For simplicity this test assumes that max_pages_per_rpc
16053 # is the same across all OSCs
16054 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16055 local bulk_size=$((max_pages * PAGE_SIZE))
16056 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16059 mkdir -p $DIR/$tdir
16060 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16061 error "failed to set stripe with -S ${brw_size}M option"
16063 # clear the OSC stats
16064 $LCTL set_param osc.*.stats=0 &>/dev/null
16067 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16068 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16069 oflag=direct &>/dev/null || error "dd failed"
16071 sync; sleep 1; sync # just to be safe
16072 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16073 if [ x$nrpcs != "x1" ]; then
16074 $LCTL get_param osc.*.stats
16075 error "found $nrpcs ost_write RPCs, not 1 as expected"
16079 # Drop the OSC cache, otherwise we will read from it
16080 cancel_lru_locks osc
16082 # clear the OSC stats
16083 $LCTL set_param osc.*.stats=0 &>/dev/null
16085 # Client reads $bulk_size.
16086 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16087 iflag=direct &>/dev/null || error "dd failed"
16089 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16090 if [ x$nrpcs != "x1" ]; then
16091 $LCTL get_param osc.*.stats
16092 error "found $nrpcs ost_read RPCs, not 1 as expected"
16095 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16098 mkdir -p $DIR/$tdir
16100 for i in {0..1023}; do
16101 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16102 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16103 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16107 run_test 231b "must not assert on fully utilized OST request buffer"
16110 mkdir -p $DIR/$tdir
16111 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16113 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16114 do_facet ost1 $LCTL set_param fail_loc=0x31c
16116 # ignore dd failure
16117 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16119 do_facet ost1 $LCTL set_param fail_loc=0
16120 umount_client $MOUNT || error "umount failed"
16121 mount_client $MOUNT || error "mount failed"
16122 stop ost1 || error "cannot stop ost1"
16123 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16125 run_test 232a "failed lock should not block umount"
16128 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16129 skip "Need MDS version at least 2.10.58"
16131 mkdir -p $DIR/$tdir
16132 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16133 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16135 cancel_lru_locks osc
16137 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16138 do_facet ost1 $LCTL set_param fail_loc=0x31c
16141 $LFS data_version $DIR/$tdir/$tfile || true
16143 do_facet ost1 $LCTL set_param fail_loc=0
16144 umount_client $MOUNT || error "umount failed"
16145 mount_client $MOUNT || error "mount failed"
16146 stop ost1 || error "cannot stop ost1"
16147 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16149 run_test 232b "failed data version lock should not block umount"
16152 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
16153 skip "Need MDS version at least 2.3.64"
16154 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16156 local fid=$($LFS path2fid $MOUNT)
16158 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16159 error "cannot access $MOUNT using its FID '$fid'"
16161 run_test 233a "checking that OBF of the FS root succeeds"
16164 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
16165 skip "Need MDS version at least 2.5.90"
16166 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16168 local fid=$($LFS path2fid $MOUNT/.lustre)
16170 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16171 error "cannot access $MOUNT/.lustre using its FID '$fid'"
16173 fid=$($LFS path2fid $MOUNT/.lustre/fid)
16174 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16175 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
16177 run_test 233b "checking that OBF of the FS .lustre succeeds"
16180 local p="$TMP/sanityN-$TESTNAME.parameters"
16181 save_lustre_params client "llite.*.xattr_cache" > $p
16182 lctl set_param llite.*.xattr_cache 1 ||
16183 skip_env "xattr cache is not supported"
16185 mkdir -p $DIR/$tdir || error "mkdir failed"
16186 touch $DIR/$tdir/$tfile || error "touch failed"
16187 # OBD_FAIL_LLITE_XATTR_ENOMEM
16188 $LCTL set_param fail_loc=0x1405
16189 getfattr -n user.attr $DIR/$tdir/$tfile &&
16190 error "getfattr should have failed with ENOMEM"
16191 $LCTL set_param fail_loc=0x0
16194 restore_lustre_params < $p
16197 run_test 234 "xattr cache should not crash on ENOMEM"
16200 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
16201 skip "Need MDS version at least 2.4.52"
16203 flock_deadlock $DIR/$tfile
16208 124) error "process hangs on a deadlock"
16210 *) error "error executing flock_deadlock $DIR/$tfile"
16214 run_test 235 "LU-1715: flock deadlock detection does not work properly"
16218 check_swap_layouts_support
16220 local ref1=/etc/passwd
16221 local ref2=/etc/group
16222 local file1=$DIR/$tdir/f1
16223 local file2=$DIR/$tdir/f2
16225 test_mkdir -c1 $DIR/$tdir
16226 $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
16227 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
16228 $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
16229 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
16230 local fd=$(free_fd)
16231 local cmd="exec $fd<>$file2"
16234 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
16235 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
16238 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
16243 run_test 236 "Layout swap on open unlinked file"
16245 # LU-4659 linkea consistency
16247 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
16248 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
16249 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
16250 skip "Need MDS version at least 2.5.58 or 2.5.2+"
16253 ln $DIR/$tfile $DIR/$tfile.lnk
16254 touch $DIR/$tfile.new
16255 mv $DIR/$tfile.new $DIR/$tfile
16256 local fid1=$($LFS path2fid $DIR/$tfile)
16257 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
16258 local path1=$($LFS fid2path $FSNAME "$fid1")
16259 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
16260 local path2=$($LFS fid2path $FSNAME "$fid2")
16261 [ $tfile.lnk == $path2 ] ||
16262 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
16265 run_test 238 "Verify linkea consistency"
16267 test_239A() { # was test_239
16268 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
16269 skip "Need MDS version at least 2.5.60"
16271 local list=$(comma_list $(mdts_nodes))
16273 mkdir -p $DIR/$tdir
16274 createmany -o $DIR/$tdir/f- 5000
16275 unlinkmany $DIR/$tdir/f- 5000
16276 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
16277 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
16278 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
16279 osp.*MDT*.sync_in_flight" | calc_sum)
16280 [ "$changes" -eq 0 ] || error "$changes not synced"
16282 run_test 239A "osp_sync test"
16284 test_239a() { #LU-5297
16285 remote_mds_nodsh && skip "remote MDS with nodsh"
16288 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
16289 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
16290 chgrp $RUNAS_GID $DIR/$tfile
16291 wait_delete_completed
16293 run_test 239a "process invalid osp sync record correctly"
16295 test_239b() { #LU-5297
16296 remote_mds_nodsh && skip "remote MDS with nodsh"
16299 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
16300 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
16301 chgrp $RUNAS_GID $DIR/$tfile1
16302 wait_delete_completed
16303 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
16305 chgrp $RUNAS_GID $DIR/$tfile2
16306 wait_delete_completed
16308 run_test 239b "process osp sync record with ENOMEM error correctly"
16311 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16312 remote_mds_nodsh && skip "remote MDS with nodsh"
16314 mkdir -p $DIR/$tdir
16316 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
16317 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
16318 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
16319 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
16321 umount_client $MOUNT || error "umount failed"
16322 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
16323 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
16324 mount_client $MOUNT || error "failed to mount client"
16326 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
16327 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
16329 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
16335 for LOOP in $(seq $count); do
16336 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
16337 cancel_lru_locks $OSC || true
16345 for LOOP in $(seq $1); do
16346 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
16351 test_241a() { # was test_241
16352 local bsize=$PAGE_SIZE
16354 (( bsize < 40960 )) && bsize=40960
16355 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16357 cancel_lru_locks $OSC
16358 test_241_bio 1000 $bsize &
16360 test_241_dio 1000 $bsize
16363 run_test 241a "bio vs dio"
16366 local bsize=$PAGE_SIZE
16368 (( bsize < 40960 )) && bsize=40960
16369 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16371 test_241_dio 1000 $bsize &
16373 test_241_dio 1000 $bsize
16376 run_test 241b "dio vs dio"
16379 remote_mds_nodsh && skip "remote MDS with nodsh"
16381 mkdir -p $DIR/$tdir
16382 touch $DIR/$tdir/$tfile
16384 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
16385 do_facet mds1 lctl set_param fail_loc=0x105
16386 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
16388 do_facet mds1 lctl set_param fail_loc=0
16389 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
16391 run_test 242 "mdt_readpage failure should not cause directory unreadable"
16395 test_mkdir $DIR/$tdir
16396 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
16398 run_test 243 "various group lock tests"
16402 test_mkdir $DIR/$tdir
16403 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
16404 sendfile_grouplock $DIR/$tdir/$tfile || \
16405 error "sendfile+grouplock failed"
16408 run_test 244 "sendfile with group lock tests"
16411 local flagname="multi_mod_rpcs"
16412 local connect_data_name="max_mod_rpcs"
16415 # check if multiple modify RPCs flag is set
16416 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
16417 grep "connect_flags:")
16420 echo "$out" | grep -qw $flagname
16421 if [ $? -ne 0 ]; then
16422 echo "connect flag $flagname is not set"
16426 # check if multiple modify RPCs data is set
16427 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
16430 echo "$out" | grep -qw $connect_data_name ||
16431 error "import should have connect data $connect_data_name"
16433 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
16435 test_246() { # LU-7371
16436 remote_ost_nodsh && skip "remote OST with nodsh"
16437 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
16438 skip "Need OST version >= 2.7.62"
16440 do_facet ost1 $LCTL set_param fail_val=4095
16441 #define OBD_FAIL_OST_READ_SIZE 0x234
16442 do_facet ost1 $LCTL set_param fail_loc=0x234
16443 $LFS setstripe $DIR/$tfile -i 0 -c 1
16444 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
16445 cancel_lru_locks $FSNAME-OST0000
16446 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
16448 run_test 246 "Read file of size 4095 should return right length"
16454 umount_client $submount
16459 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16461 skip_env "Fileset feature is not supported"
16463 local submount=${MOUNT}_$tdir
16466 mkdir -p $submount || error "mkdir $submount failed"
16467 FILESET="$FILESET/$tdir" mount_client $submount ||
16468 error "mount $submount failed"
16469 trap "cleanup_247 $submount" EXIT
16470 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
16471 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
16472 error "read $MOUNT/$tdir/$tfile failed"
16473 cleanup_247 $submount
16475 run_test 247a "mount subdir as fileset"
16478 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16479 skip_env "Fileset feature is not supported"
16481 local submount=${MOUNT}_$tdir
16483 rm -rf $MOUNT/$tdir
16484 mkdir -p $submount || error "mkdir $submount failed"
16486 FILESET="$FILESET/$tdir" mount_client $submount &&
16487 error "mount $submount should fail"
16490 run_test 247b "mount subdir that dose not exist"
16493 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16494 skip_env "Fileset feature is not supported"
16496 local submount=${MOUNT}_$tdir
16498 mkdir -p $MOUNT/$tdir/dir1
16499 mkdir -p $submount || error "mkdir $submount failed"
16500 trap "cleanup_247 $submount" EXIT
16501 FILESET="$FILESET/$tdir" mount_client $submount ||
16502 error "mount $submount failed"
16503 local fid=$($LFS path2fid $MOUNT/)
16504 $LFS fid2path $submount $fid && error "fid2path should fail"
16505 cleanup_247 $submount
16507 run_test 247c "running fid2path outside root"
16510 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16511 skip "Fileset feature is not supported"
16513 local submount=${MOUNT}_$tdir
16515 mkdir -p $MOUNT/$tdir/dir1
16516 mkdir -p $submount || error "mkdir $submount failed"
16517 FILESET="$FILESET/$tdir" mount_client $submount ||
16518 error "mount $submount failed"
16519 trap "cleanup_247 $submount" EXIT
16520 local fid=$($LFS path2fid $submount/dir1)
16521 $LFS fid2path $submount $fid || error "fid2path should succeed"
16522 cleanup_247 $submount
16524 run_test 247d "running fid2path inside root"
16528 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16530 skip "Fileset feature is not supported"
16532 local submount=${MOUNT}_$tdir
16535 mkdir -p $submount || error "mkdir $submount failed"
16536 FILESET="$FILESET/.." mount_client $submount &&
16537 error "mount $submount should fail"
16540 run_test 247e "mount .. as fileset"
16543 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
16544 [ -z "$fast_read_sav" ] && skip "no fast read support"
16546 # create a large file for fast read verification
16547 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
16549 # make sure the file is created correctly
16550 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
16551 { rm -f $DIR/$tfile; skip "file creation error"; }
16553 echo "Test 1: verify that fast read is 4 times faster on cache read"
16555 # small read with fast read enabled
16556 $LCTL set_param -n llite.*.fast_read=1
16557 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16558 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16559 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16560 # small read with fast read disabled
16561 $LCTL set_param -n llite.*.fast_read=0
16562 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16563 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16564 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16566 # verify that fast read is 4 times faster for cache read
16567 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
16568 error_not_in_vm "fast read was not 4 times faster: " \
16569 "$t_fast vs $t_slow"
16571 echo "Test 2: verify the performance between big and small read"
16572 $LCTL set_param -n llite.*.fast_read=1
16574 # 1k non-cache read
16575 cancel_lru_locks osc
16576 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16577 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16578 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16580 # 1M non-cache read
16581 cancel_lru_locks osc
16582 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16583 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16584 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16586 # verify that big IO is not 4 times faster than small IO
16587 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
16588 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
16590 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
16593 run_test 248 "fast read verification"
16595 test_249() { # LU-7890
16596 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
16597 skip "Need at least version 2.8.54"
16600 $SETSTRIPE -c 1 $DIR/$tfile
16601 # Offset 2T == 4k * 512M
16602 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
16603 error "dd to 2T offset failed"
16605 run_test 249 "Write above 2T file size"
16608 [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
16609 && skip "no 16TB file size limit on ZFS"
16611 $SETSTRIPE -c 1 $DIR/$tfile
16612 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
16613 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
16614 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
16615 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
16616 conv=notrunc,fsync && error "append succeeded"
16619 run_test 250 "Write above 16T limit"
16622 $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile
16624 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
16625 #Skip once - writing the first stripe will succeed
16626 $LCTL set_param fail_loc=0xa0001407 fail_val=1
16627 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
16628 error "short write happened"
16630 $LCTL set_param fail_loc=0xa0001407 fail_val=1
16631 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
16632 error "short read happened"
16636 run_test 251 "Handling short read and write correctly"
16639 remote_mds_nodsh && skip "remote MDS with nodsh"
16640 remote_ost_nodsh && skip "remote OST with nodsh"
16641 if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then
16642 skip_env "ldiskfs only test"
16652 # check lr_reader on OST0000
16654 dev=$(facet_device $tgt)
16655 out=$(do_facet $tgt $LR_READER $dev)
16656 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
16658 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
16659 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
16660 error "Invalid uuid returned by $LR_READER on target $tgt"
16661 echo -e "uuid returned by $LR_READER is '$uuid'\n"
16663 # check lr_reader -c on MDT0000
16665 dev=$(facet_device $tgt)
16666 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
16667 skip "$LR_READER does not support additional options"
16669 out=$(do_facet $tgt $LR_READER -c $dev)
16670 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
16672 num=$(echo "$out" | grep -c "mdtlov")
16673 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
16674 error "Invalid number of mdtlov clients returned by $LR_READER"
16675 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
16677 # check lr_reader -cr on MDT0000
16678 out=$(do_facet $tgt $LR_READER -cr $dev)
16679 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
16681 echo "$out" | grep -q "^reply_data:$" ||
16682 error "$LR_READER should have returned 'reply_data' section"
16683 num=$(echo "$out" | grep -c "client_generation")
16684 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
16686 run_test 252 "check lr_reader tool"
16688 test_253_fill_ost() {
16689 local size_mb #how many MB should we write to pass watermark
16690 local lwm=$3 #low watermark
16691 local free_10mb #10% of free space
16693 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
16694 size_mb=$((free_kb / 1024 - lwm))
16695 free_10mb=$((free_kb / 10240))
16696 #If 10% of free space cross low watermark use it
16697 if (( free_10mb > size_mb )); then
16700 #At least we need to store 1.1 of difference between
16701 #free space and low watermark
16702 size_mb=$((size_mb + size_mb / 10))
16704 if (( lwm <= $((free_kb / 1024)) )) || [ ! -f $DIR/$tdir/1 ]; then
16705 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M count=$size_mb \
16706 oflag=append conv=notrunc
16711 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
16712 echo "OST still has $((free_kb / 1024)) mbytes free"
16716 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16717 remote_mds_nodsh && skip "remote MDS with nodsh"
16718 remote_mgs_nodsh && skip "remote MGS with nodsh"
16723 local ost_name=$($LFS osts |
16724 sed -n 's/^'$ostidx': \(.*\)_UUID .*/\1/p')
16726 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
16727 do_facet $SINGLEMDS $LCTL get_param -n \
16728 osp.$mdtosc_proc1.reserved_mb_high ||
16729 skip "remote MDS does not support reserved_mb_high"
16733 wait_delete_completed
16736 local last_wm_h=$(do_facet $SINGLEMDS $LCTL get_param -n \
16737 osp.$mdtosc_proc1.reserved_mb_high)
16738 local last_wm_l=$(do_facet $SINGLEMDS $LCTL get_param -n \
16739 osp.$mdtosc_proc1.reserved_mb_low)
16740 echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l"
16742 create_pool $FSNAME.$TESTNAME || error "Pool creation failed"
16743 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name ||
16744 error "Adding $ost_name to pool failed"
16746 # Wait for client to see a OST at pool
16747 wait_update $HOSTNAME "$LCTL get_param -n
16748 lov.$FSNAME-*.pools.$TESTNAME | sort -u |
16749 grep $ost_name" "$ost_name""_UUID" $((TIMEOUT/2)) ||
16750 error "Client can not see the pool"
16751 $SETSTRIPE $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
16752 error "Setstripe failed"
16754 dd if=/dev/zero of=$DIR/$tdir/0 bs=1M count=10
16755 local blocks=$($LFS df $MOUNT | grep $ost_name | awk '{ print $4 }')
16756 echo "OST still has $((blocks/1024)) mbytes free"
16758 local new_lwm=$((blocks/1024-10))
16759 do_facet $SINGLEMDS $LCTL set_param \
16760 osp.$mdtosc_proc1.reserved_mb_high=$((new_lwm+5))
16761 do_facet $SINGLEMDS $LCTL set_param \
16762 osp.$mdtosc_proc1.reserved_mb_low=$new_lwm
16764 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
16766 #First enospc could execute orphan deletion so repeat.
16767 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
16769 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
16770 osp.$mdtosc_proc1.prealloc_status)
16771 echo "prealloc_status $oa_status"
16773 dd if=/dev/zero of=$DIR/$tdir/2 bs=1M count=1 &&
16774 error "File creation should fail"
16775 #object allocation was stopped, but we still able to append files
16776 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M seek=6 count=5 oflag=append ||
16777 error "Append failed"
16778 rm -f $DIR/$tdir/1 $DIR/$tdir/0 $DIR/$tdir/r*
16780 wait_delete_completed
16784 for i in $(seq 10 12); do
16785 dd if=/dev/zero of=$DIR/$tdir/$i bs=1M count=1 2>/dev/null ||
16786 error "File creation failed after rm";
16789 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
16790 osp.$mdtosc_proc1.prealloc_status)
16791 echo "prealloc_status $oa_status"
16793 if (( oa_status != 0 )); then
16794 error "Object allocation still disable after rm"
16796 do_facet $SINGLEMDS $LCTL set_param \
16797 osp.$mdtosc_proc1.reserved_mb_high=$last_wm_h
16798 do_facet $SINGLEMDS $LCTL set_param \
16799 osp.$mdtosc_proc1.reserved_mb_low=$last_wm_l
16802 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $ost_name ||
16803 error "Remove $ost_name from pool failed"
16804 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
16805 error "Pool destroy fialed"
16807 run_test 253 "Check object allocation limit"
16810 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16811 remote_mds_nodsh && skip "remote MDS with nodsh"
16812 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
16813 skip "MDS does not support changelog_size"
16816 local MDT0=$(facet_svc $SINGLEMDS)
16818 changelog_register || error "changelog_register failed"
16820 changelog_clear 0 || error "changelog_clear failed"
16822 local size1=$(do_facet $SINGLEMDS \
16823 $LCTL get_param -n mdd.$MDT0.changelog_size)
16824 echo "Changelog size $size1"
16827 $LFS mkdir -i 0 $DIR/$tdir
16829 mkdir -p $DIR/$tdir/pics/2008/zachy
16830 touch $DIR/$tdir/pics/2008/zachy/timestamp
16831 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
16832 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
16833 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
16834 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
16835 rm $DIR/$tdir/pics/desktop.jpg
16837 local size2=$(do_facet $SINGLEMDS \
16838 $LCTL get_param -n mdd.$MDT0.changelog_size)
16839 echo "Changelog size after work $size2"
16841 (( $size2 > $size1 )) ||
16842 error "new Changelog size=$size2 less than old size=$size1"
16844 run_test 254 "Check changelog size"
16851 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
16852 awk -F: '{print $2}' | grep $type > /dev/null
16853 if [ $? -ne 0 ]; then
16863 lfs ladvise -a willread $file > /dev/null 2>&1
16864 if [ $? -eq 0 ]; then
16868 lfs ladvise -a willread $file 2>&1 |
16869 grep "Inappropriate ioctl for device" > /dev/null
16870 if [ $? -eq 0 ]; then
16877 bc <<<"scale=2; ($1 - $2) * 100 / $2"
16880 # run a random read IO workload
16881 # usage: random_read_iops <filename> <filesize> <iosize>
16882 random_read_iops() {
16885 local iosize=${3:-4096}
16887 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
16888 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
16891 drop_file_oss_cache() {
16895 $LFS ladvise -a dontneed $file 2>/dev/null ||
16896 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
16899 ladvise_willread_performance()
16902 local average_origin=0
16903 local average_cache=0
16904 local average_ladvise=0
16906 for ((i = 1; i <= $repeat; i++)); do
16907 echo "Iter $i/$repeat: reading without willread hint"
16908 cancel_lru_locks osc
16909 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
16910 local speed_origin=$(random_read_iops $DIR/$tfile $size)
16911 echo "Iter $i/$repeat: uncached speed: $speed_origin"
16912 average_origin=$(bc <<<"$average_origin + $speed_origin")
16914 cancel_lru_locks osc
16915 local speed_cache=$(random_read_iops $DIR/$tfile $size)
16916 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
16917 average_cache=$(bc <<<"$average_cache + $speed_cache")
16919 cancel_lru_locks osc
16920 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
16921 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
16922 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
16923 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
16924 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
16926 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
16927 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
16928 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
16930 speedup_cache=$(percent $average_cache $average_origin)
16931 speedup_ladvise=$(percent $average_ladvise $average_origin)
16933 echo "Average uncached read: $average_origin"
16934 echo "Average speedup with OSS cached read: " \
16935 "$average_cache = +$speedup_cache%"
16936 echo "Average speedup with ladvise willread: " \
16937 "$average_ladvise = +$speedup_ladvise%"
16939 local lowest_speedup=20
16940 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
16941 echo "Speedup with OSS cached read less than $lowest_speedup%," \
16942 "got $average_cache%. Skipping ladvise willread check."
16946 # the test won't work on ZFS until it supports 'ladvise dontneed', but
16947 # it is still good to run until then to exercise 'ladvise willread'
16948 ! $LFS ladvise -a dontneed $DIR/$tfile &&
16949 [ "$ost1_FSTYPE" = "zfs" ] &&
16950 echo "osd-zfs does not support dontneed or drop_caches" &&
16953 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
16954 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
16955 error_not_in_vm "Speedup with willread is less than " \
16956 "$lowest_speedup%, got $average_ladvise%"
16960 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
16961 skip "lustre < 2.8.54 does not support ladvise "
16962 remote_ost_nodsh && skip "remote OST with nodsh"
16964 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
16966 ladvise_no_type willread $DIR/$tfile &&
16967 skip "willread ladvise is not supported"
16969 ladvise_no_ioctl $DIR/$tfile &&
16970 skip "ladvise ioctl is not supported"
16973 local size=$((size_mb * 1048576))
16974 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
16975 error "dd to $DIR/$tfile failed"
16977 lfs ladvise -a willread $DIR/$tfile ||
16978 error "Ladvise failed with no range argument"
16980 lfs ladvise -a willread -s 0 $DIR/$tfile ||
16981 error "Ladvise failed with no -l or -e argument"
16983 lfs ladvise -a willread -e 1 $DIR/$tfile ||
16984 error "Ladvise failed with only -e argument"
16986 lfs ladvise -a willread -l 1 $DIR/$tfile ||
16987 error "Ladvise failed with only -l argument"
16989 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
16990 error "End offset should not be smaller than start offset"
16992 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
16993 error "End offset should not be equal to start offset"
16995 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
16996 error "Ladvise failed with overflowing -s argument"
16998 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
16999 error "Ladvise failed with overflowing -e argument"
17001 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
17002 error "Ladvise failed with overflowing -l argument"
17004 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
17005 error "Ladvise succeeded with conflicting -l and -e arguments"
17007 echo "Synchronous ladvise should wait"
17009 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17010 do_nodes $(comma_list $(osts_nodes)) \
17011 $LCTL set_param fail_val=$delay fail_loc=0x237
17013 local start_ts=$SECONDS
17014 lfs ladvise -a willread $DIR/$tfile ||
17015 error "Ladvise failed with no range argument"
17016 local end_ts=$SECONDS
17017 local inteval_ts=$((end_ts - start_ts))
17019 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17020 error "Synchronous advice didn't wait reply"
17023 echo "Asynchronous ladvise shouldn't wait"
17024 local start_ts=$SECONDS
17025 lfs ladvise -a willread -b $DIR/$tfile ||
17026 error "Ladvise failed with no range argument"
17027 local end_ts=$SECONDS
17028 local inteval_ts=$((end_ts - start_ts))
17030 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17031 error "Asynchronous advice blocked"
17034 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17035 ladvise_willread_performance
17037 run_test 255a "check 'lfs ladvise -a willread'"
17043 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17047 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17048 skip "lustre < 2.8.54 does not support ladvise "
17049 remote_ost_nodsh && skip "remote OST with nodsh"
17051 lfs setstripe -c 1 -i 0 $DIR/$tfile
17053 ladvise_no_type dontneed $DIR/$tfile &&
17054 skip "dontneed ladvise is not supported"
17056 ladvise_no_ioctl $DIR/$tfile &&
17057 skip "ladvise ioctl is not supported"
17059 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17060 [ "$ost1_FSTYPE" = "zfs" ] &&
17061 skip "zfs-osd does not support 'ladvise dontneed'"
17064 local size=$((size_mb * 1048576))
17065 # In order to prevent disturbance of other processes, only check 3/4
17066 # of the memory usage
17067 local kibibytes=$((size_mb * 1024 * 3 / 4))
17069 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17070 error "dd to $DIR/$tfile failed"
17072 #force write to complete before dropping OST cache & checking memory
17075 local total=$(facet_meminfo ost1 MemTotal)
17076 echo "Total memory: $total KiB"
17078 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17079 local before_read=$(facet_meminfo ost1 Cached)
17080 echo "Cache used before read: $before_read KiB"
17082 lfs ladvise -a willread $DIR/$tfile ||
17083 error "Ladvise willread failed"
17084 local after_read=$(facet_meminfo ost1 Cached)
17085 echo "Cache used after read: $after_read KiB"
17087 lfs ladvise -a dontneed $DIR/$tfile ||
17088 error "Ladvise dontneed again failed"
17089 local no_read=$(facet_meminfo ost1 Cached)
17090 echo "Cache used after dontneed ladvise: $no_read KiB"
17092 if [ $total -lt $((before_read + kibibytes)) ]; then
17093 echo "Memory is too small, abort checking"
17097 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17098 error "Ladvise willread should use more memory" \
17099 "than $kibibytes KiB"
17102 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17103 error "Ladvise dontneed should release more memory" \
17104 "than $kibibytes KiB"
17107 run_test 255b "check 'lfs ladvise -a dontneed'"
17110 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17111 skip "lustre < 2.10.50 does not support lockahead"
17119 test_mkdir -p $DIR/$tdir
17120 $SETSTRIPE -i 0 $DIR/$tdir
17122 #test 10 returns only success/failure
17124 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17126 if [ $rc -eq 255 ]; then
17127 error "Ladvise test${i} failed, ${rc}"
17130 #test 11 counts lock enqueue requests, all others count new locks
17132 count=$(do_facet ost1 \
17133 $LCTL get_param -n ost.OSS.ost.stats)
17134 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17136 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17138 if [ $rc -eq 255 ]; then
17139 error "Ladvise test${i} failed, ${rc}"
17142 new_count=$(do_facet ost1 \
17143 $LCTL get_param -n ost.OSS.ost.stats)
17144 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17145 awk '{ print $2 }')
17147 difference="$((new_count - count))"
17148 if [ $difference -ne $rc ]; then
17149 error "Ladvise test${i}, bad enqueue count, returned " \
17150 "${rc}, actual ${difference}"
17153 for i in $(seq 12 21); do
17154 # If we do not do this, we run the risk of having too many
17155 # locks and starting lock cancellation while we are checking
17157 cancel_lru_locks osc
17159 count=$($LCTL get_param -n \
17160 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17162 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17164 if [ $rc -eq 255 ]; then
17165 error "Ladvise test ${i} failed, ${rc}"
17168 new_count=$($LCTL get_param -n \
17169 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17170 difference="$((new_count - count))"
17172 # Test 15 output is divided by 100 to map down to valid return
17173 if [ $i -eq 15 ]; then
17177 if [ $difference -ne $rc ]; then
17178 error "Ladvise test ${i}, bad lock count, returned " \
17179 "${rc}, actual ${difference}"
17183 #test 22 returns only success/failure
17185 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17187 if [ $rc -eq 255 ]; then
17188 error "Ladvise test${i} failed, ${rc}"
17191 run_test 255c "suite of ladvise lockahead tests"
17194 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17195 remote_mds_nodsh && skip "remote MDS with nodsh"
17196 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17197 changelog_users $SINGLEMDS | grep "^cl" &&
17198 skip "active changelog user"
17204 mdt_dev=$(mdsdevname 1)
17207 changelog_register || error "changelog_register failed"
17210 mkdir -p $DIR/$tdir
17212 changelog_clear 0 || error "changelog_clear failed"
17215 touch $DIR/$tdir/{1..10}
17218 stop $SINGLEMDS || error "Fail to stop MDT"
17222 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
17224 #after mount new plainllog is used
17225 touch $DIR/$tdir/{11..19}
17226 local tmpfile=$(mktemp -u $tfile.XXXXXX)
17227 cat_sl=$(do_facet $SINGLEMDS "sync; \
17228 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17229 llog_reader $tmpfile | grep -c type=1064553b")
17230 do_facet $SINGLEMDS llog_reader $tmpfile
17232 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
17234 changelog_clear 0 || error "changelog_clear failed"
17236 cat_sl=$(do_facet $SINGLEMDS "sync; \
17237 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17238 llog_reader $tmpfile | grep -c type=1064553b; rm -f $tmpfile")
17240 if (( cat_sl == 2 )); then
17241 error "Empty plain llog was not deleted from changelog catalog"
17242 elif (( cat_sl != 1 )); then
17243 error "Active plain llog shouldn't be deleted from catalog"
17246 run_test 256 "Check llog delete for empty and not full state"
17249 remote_mds_nodsh && skip "remote MDS with nodsh"
17250 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
17251 skip "Need MDS version at least 2.8.55"
17253 test_mkdir $DIR/$tdir
17255 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
17256 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
17259 #define OBD_FAIL_MDS_XATTR_REP 0x161
17260 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17261 local facet=mds$((mdtidx + 1))
17262 set_nodes_failloc $(facet_active_host $facet) 0x80000161
17263 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
17265 stop $facet || error "stop MDS failed"
17266 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
17267 error "start MDS fail"
17269 run_test 257 "xattr locks are not lost"
17271 # Verify we take the i_mutex when security requires it
17273 #define OBD_FAIL_IMUTEX_SEC 0x141c
17274 $LCTL set_param fail_loc=0x141c
17276 chmod u+s $DIR/$tfile
17277 chmod a+rwx $DIR/$tfile
17278 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17280 if [ $RC -ne 0 ]; then
17281 error "error, failed to take i_mutex, rc=$?"
17285 run_test 258a "verify i_mutex security behavior when suid attributes is set"
17287 # Verify we do NOT take the i_mutex in the normal case
17289 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
17290 $LCTL set_param fail_loc=0x141d
17293 chmod a+rw $DIR/$tfile
17294 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17296 if [ $RC -ne 0 ]; then
17297 error "error, took i_mutex unnecessarily, rc=$?"
17302 run_test 258b "verify i_mutex security behavior"
17305 local file=$DIR/$tfile
17309 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17311 stack_trap "rm -f $file" EXIT
17313 wait_delete_completed
17314 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17315 echo "before: $before"
17317 $LFS setstripe -i 0 -c 1 $file
17318 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
17320 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17321 echo "after write: $after"
17323 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
17324 do_facet ost1 $LCTL set_param fail_loc=0x2301
17326 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17327 echo "after truncate: $after"
17330 do_facet ost1 $LCTL set_param fail_loc=0
17331 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17333 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17334 echo "after restart: $after"
17335 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
17336 error "missing truncate?"
17340 run_test 259 "crash at delayed truncate"
17343 #define OBD_FAIL_MDC_CLOSE 0x806
17344 $LCTL set_param fail_loc=0x80000806
17348 run_test 260 "Check mdc_close fail"
17350 ### Data-on-MDT sanity tests ###
17352 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17353 skip "Need MDS version at least 2.10.55 for DoM"
17356 local dom=$DIR/$tdir/dom_file
17357 local tmp=$DIR/$tdir/tmp_file
17359 mkdir -p $DIR/$tdir
17361 # basic checks for DoM component creation
17362 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
17363 error "Can set MDT layout to non-first entry"
17365 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
17366 error "Can define multiple entries as MDT layout"
17368 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
17370 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
17371 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
17372 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
17374 local mdtidx=$($LFS getstripe -m $dom)
17375 local mdtname=MDT$(printf %04x $mdtidx)
17376 local facet=mds$((mdtidx + 1))
17377 local space_check=1
17379 # Skip free space checks with ZFS
17380 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
17384 local size_tmp=$((65536 * 3))
17385 local mdtfree1=$(do_facet $facet \
17386 lctl get_param -n osd*.*$mdtname.kbytesfree)
17388 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17389 # check also direct IO along write
17390 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
17391 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17393 cmp $tmp $dom || error "file data is different"
17394 [ $(stat -c%s $dom) == $size_tmp ] ||
17395 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17396 if [ $space_check == 1 ]; then
17397 local mdtfree2=$(do_facet $facet \
17398 lctl get_param -n osd*.*$mdtname.kbytesfree)
17400 # increase in usage from by $size_tmp
17401 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17402 error "MDT free space wrong after write: " \
17403 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17407 local size_dom=10000
17409 $TRUNCATE $dom $size_dom
17410 [ $(stat -c%s $dom) == $size_dom ] ||
17411 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
17412 if [ $space_check == 1 ]; then
17413 mdtfree1=$(do_facet $facet \
17414 lctl get_param -n osd*.*$mdtname.kbytesfree)
17415 # decrease in usage from $size_tmp to new $size_dom
17416 [ $(($mdtfree1 - $mdtfree2)) -ge \
17417 $(((size_tmp - size_dom) / 1024)) ] ||
17418 error "MDT free space is wrong after truncate: " \
17419 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
17425 size_dom=$((size_dom + size_tmp))
17426 [ $(stat -c%s $dom) == $size_dom ] ||
17427 error "bad size after append: $(stat -c%s $dom) != $size_dom"
17428 if [ $space_check == 1 ]; then
17429 mdtfree2=$(do_facet $facet \
17430 lctl get_param -n osd*.*$mdtname.kbytesfree)
17431 # increase in usage by $size_tmp from previous
17432 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17433 error "MDT free space is wrong after append: " \
17434 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17439 if [ $space_check == 1 ]; then
17440 mdtfree1=$(do_facet $facet \
17441 lctl get_param -n osd*.*$mdtname.kbytesfree)
17442 # decrease in usage by $size_dom from previous
17443 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
17444 error "MDT free space is wrong after removal: " \
17445 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
17448 # combined striping
17449 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
17450 error "Can't create DoM + OST striping"
17452 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
17453 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17454 # check also direct IO along write
17455 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17457 cmp $tmp $dom || error "file data is different"
17458 [ $(stat -c%s $dom) == $size_tmp ] ||
17459 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17464 run_test 270a "DoM: basic functionality tests"
17467 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17468 skip "Need MDS version at least 2.10.55"
17470 local dom=$DIR/$tdir/dom_file
17471 local max_size=1048576
17473 mkdir -p $DIR/$tdir
17474 $LFS setstripe -E $max_size -L mdt $dom
17476 # truncate over the limit
17477 $TRUNCATE $dom $(($max_size + 1)) &&
17478 error "successful truncate over the maximum size"
17479 # write over the limit
17480 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
17481 error "successful write over the maximum size"
17482 # append over the limit
17483 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
17484 echo "12345" >> $dom && error "successful append over the maximum size"
17489 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
17492 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17493 skip "Need MDS version at least 2.10.55"
17495 mkdir -p $DIR/$tdir
17496 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17498 # check files inherit DoM EA
17499 touch $DIR/$tdir/first
17500 [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] ||
17501 error "bad pattern"
17502 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
17503 error "bad stripe count"
17504 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
17505 error "bad stripe size"
17507 # check directory inherits DoM EA and uses it as default
17508 mkdir $DIR/$tdir/subdir
17509 touch $DIR/$tdir/subdir/second
17510 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
17511 error "bad pattern in sub-directory"
17512 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
17513 error "bad stripe count in sub-directory"
17514 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
17515 error "bad stripe size in sub-directory"
17518 run_test 270c "DoM: DoM EA inheritance tests"
17521 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17522 skip "Need MDS version at least 2.10.55"
17524 mkdir -p $DIR/$tdir
17525 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17527 # inherit default DoM striping
17528 mkdir $DIR/$tdir/subdir
17529 touch $DIR/$tdir/subdir/f1
17531 # change default directory striping
17532 $LFS setstripe -c 1 $DIR/$tdir/subdir
17533 touch $DIR/$tdir/subdir/f2
17534 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
17535 error "wrong default striping in file 2"
17536 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
17537 error "bad pattern in file 2"
17540 run_test 270d "DoM: change striping from DoM to RAID0"
17543 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17544 skip "Need MDS version at least 2.10.55"
17546 mkdir -p $DIR/$tdir/dom
17547 mkdir -p $DIR/$tdir/norm
17550 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
17551 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
17553 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
17554 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
17556 # find DoM files by layout
17557 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
17558 [ $NUM -eq $DOMFILES ] ||
17559 error "lfs find -L: found $NUM, expected $DOMFILES"
17560 echo "Test 1: lfs find 20 DOM files by layout: OK"
17562 # there should be 1 dir with default DOM striping
17563 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
17565 error "lfs find -L: found $NUM, expected 1 dir"
17566 echo "Test 2: lfs find 1 DOM dir by layout: OK"
17568 # find DoM files by stripe size
17569 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
17570 [ $NUM -eq $DOMFILES ] ||
17571 error "lfs find -S: found $NUM, expected $DOMFILES"
17572 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
17574 # find files by stripe offset except DoM files
17575 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
17576 [ $NUM -eq $NORMFILES ] ||
17577 error "lfs find -i: found $NUM, expected $NORMFILES"
17578 echo "Test 5: lfs find no DOM files by stripe index: OK"
17581 run_test 270e "DoM: lfs find with DoM files test"
17584 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17585 skip "Need MDS version at least 2.10.55"
17587 local mdtname=${FSNAME}-MDT0000-mdtlov
17588 local dom=$DIR/$tdir/dom_file
17589 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
17590 lod.$mdtname.dom_stripesize)
17591 local dom_limit=131072
17593 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
17594 local dom_current=$(do_facet mds1 $LCTL get_param -n \
17595 lod.$mdtname.dom_stripesize)
17596 [ ${dom_limit} -eq ${dom_current} ] ||
17597 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
17599 $LFS mkdir -i 0 -c 1 $DIR/$tdir
17600 $LFS setstripe -d $DIR/$tdir
17601 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
17602 error "Can't set directory default striping"
17604 # exceed maximum stripe size
17605 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
17606 error "Can't create file with $((dom_limit * 2)) DoM stripe"
17607 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
17608 error "Able to create DoM component size more than LOD limit"
17610 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
17611 dom_current=$(do_facet mds1 $LCTL get_param -n \
17612 lod.$mdtname.dom_stripesize)
17613 [ 0 -eq ${dom_current} ] ||
17614 error "Can't set zero DoM stripe limit"
17617 # attempt to create DoM file on server with disabled DoM should
17618 # remove DoM entry from layout and be succeed
17619 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
17620 error "Can't create DoM file (DoM is disabled)"
17621 [ $($LFS getstripe -L $dom) == "mdt" ] &&
17622 error "File has DoM component while DoM is disabled"
17625 # attempt to create DoM file with only DoM stripe should return error
17626 $LFS setstripe -E $dom_limit -L mdt $dom &&
17627 error "Able to create DoM-only file while DoM is disabled"
17629 # too low values to be aligned with smallest stripe size 64K
17630 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
17631 dom_current=$(do_facet mds1 $LCTL get_param -n \
17632 lod.$mdtname.dom_stripesize)
17633 [ 30000 -eq ${dom_current} ] &&
17634 error "Can set too small DoM stripe limit"
17636 # 64K is a minimal stripe size in Lustre, expect limit of that size
17637 [ 65536 -eq ${dom_current} ] ||
17638 error "Limit is not set to 64K but ${dom_current}"
17640 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
17641 dom_current=$(do_facet mds1 $LCTL get_param -n \
17642 lod.$mdtname.dom_stripesize)
17644 [ 2147483648 -eq ${dom_current} ] &&
17645 error "Can set too large DoM stripe limit"
17647 do_facet mds1 $LCTL set_param -n \
17648 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
17649 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
17650 error "Can't create DoM component size after limit change"
17651 do_facet mds1 $LCTL set_param -n \
17652 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
17653 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
17654 error "Can't create DoM file after limit decrease"
17655 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
17656 error "Can create big DoM component after limit decrease"
17657 touch ${dom}_def ||
17658 error "Can't create file with old default layout"
17660 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
17663 run_test 270f "DoM: maximum DoM stripe size checks"
17666 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17667 skip "Need MDS version at least 2.10.55"
17669 local dom=$DIR/$tdir/dom
17671 mkdir -p $DIR/$tdir
17673 $LFS setstripe -E 1024K -L mdt $dom
17675 lctl set_param -n mdc.*.stats=clear
17676 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
17677 cat $dom > /dev/null
17678 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
17679 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
17683 run_test 271a "DoM: data is cached for read after write"
17686 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17687 skip "Need MDS version at least 2.10.55"
17689 local dom=$DIR/$tdir/dom
17691 mkdir -p $DIR/$tdir
17693 $LFS setstripe -E 1024K -L mdt -E EOF $dom
17695 lctl set_param -n mdc.*.stats=clear
17696 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
17697 cancel_lru_locks mdc
17698 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
17699 # second stat to check size is cached on client
17700 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
17701 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
17702 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
17705 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
17708 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17709 skip "Need MDS version at least 2.10.55"
17711 local dom=$DIR/$tdir/dom
17713 mkdir -p $DIR/$tdir
17715 $LFS setstripe -E 1024K -L mdt -E EOF $dom
17717 lctl set_param -n mdc.*.stats=clear
17718 lctl set_param -n osc.*.stats=clear
17719 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
17720 cancel_lru_locks mdc
17721 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
17722 # second stat to check size is cached on client
17723 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
17724 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
17725 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
17726 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
17727 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
17730 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
17736 local mdt=MDT$(printf %04x $mdtidx)
17738 if [ -z $param ]; then
17739 lctl get_param -n mdc.*$mdt*.stats
17741 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
17746 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17747 skip "Need MDS version at least 2.10.55"
17749 local dom=$DIR/$tdir/dom
17751 mkdir -p $DIR/$tdir
17753 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17755 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17756 local facet=mds$((mdtidx + 1))
17758 cancel_lru_locks mdc
17759 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
17760 createmany -o $dom 1000
17761 lctl set_param -n mdc.*.stats=clear
17762 smalliomany -w $dom 1000 200
17763 get_mdc_stats $mdtidx
17764 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
17765 # Each file has 1 open, 1 IO enqueues, total 2000
17766 # but now we have also +1 getxattr for security.capability, total 3000
17767 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
17768 unlinkmany $dom 1000
17770 cancel_lru_locks mdc
17771 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
17772 createmany -o $dom 1000
17773 lctl set_param -n mdc.*.stats=clear
17774 smalliomany -w $dom 1000 200
17775 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
17776 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
17777 # for OPEN and IO lock.
17778 [ $((enq - enq_2)) -ge 1000 ] ||
17779 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
17780 unlinkmany $dom 1000
17783 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
17785 cleanup_271def_tests() {
17791 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
17792 skip "Need MDS version at least 2.10.57"
17794 local dom=$DIR/$tdir/dom
17795 local tmp=$TMP/$tfile
17796 trap "cleanup_271def_tests $tmp" EXIT
17798 mkdir -p $DIR/$tdir
17800 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17802 local mdtidx=$($GETSTRIPE -M $DIR/$tdir)
17804 cancel_lru_locks mdc
17805 dd if=/dev/urandom of=$tmp bs=1000 count=1
17806 dd if=$tmp of=$dom bs=1000 count=1
17807 cancel_lru_locks mdc
17809 cat /etc/hosts >> $tmp
17810 lctl set_param -n mdc.*.stats=clear
17812 # append data to the same file it should update local page
17813 echo "Append to the same page"
17814 cat /etc/hosts >> $dom
17815 local num=$(get_mdc_stats $mdtidx ost_read)
17816 local ra=$(get_mdc_stats $mdtidx req_active)
17817 local rw=$(get_mdc_stats $mdtidx req_waittime)
17819 [ -z $num ] || error "$num READ RPC occured"
17820 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
17824 cmp $tmp $dom || error "file miscompare"
17826 cancel_lru_locks mdc
17827 lctl set_param -n mdc.*.stats=clear
17829 echo "Open and read file"
17830 cat $dom > /dev/null
17831 local num=$(get_mdc_stats $mdtidx ost_read)
17832 local ra=$(get_mdc_stats $mdtidx req_active)
17833 local rw=$(get_mdc_stats $mdtidx req_waittime)
17835 [ -z $num ] || error "$num READ RPC occured"
17836 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
17840 cmp $tmp $dom || error "file miscompare"
17844 run_test 271d "DoM: read on open (1K file in reply buffer)"
17847 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
17848 skip "Need MDS version at least 2.10.57"
17850 local dom=$DIR/$tdir/dom
17851 local tmp=$TMP/$tfile
17852 trap "cleanup_271def_tests $tmp" EXIT
17854 mkdir -p $DIR/$tdir
17856 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17858 local mdtidx=$($GETSTRIPE -M $DIR/$tdir)
17860 cancel_lru_locks mdc
17861 dd if=/dev/urandom of=$tmp bs=200000 count=1
17862 dd if=$tmp of=$dom bs=200000 count=1
17863 cancel_lru_locks mdc
17864 cat /etc/hosts >> $tmp
17865 lctl set_param -n mdc.*.stats=clear
17867 echo "Append to the same page"
17868 cat /etc/hosts >> $dom
17869 local num=$(get_mdc_stats $mdtidx ost_read)
17870 local ra=$(get_mdc_stats $mdtidx req_active)
17871 local rw=$(get_mdc_stats $mdtidx req_waittime)
17873 [ -z $num ] || error "$num READ RPC occured"
17874 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
17878 cmp $tmp $dom || error "file miscompare"
17880 cancel_lru_locks mdc
17881 lctl set_param -n mdc.*.stats=clear
17883 echo "Open and read file"
17884 cat $dom > /dev/null
17885 local num=$(get_mdc_stats $mdtidx ost_read)
17886 local ra=$(get_mdc_stats $mdtidx req_active)
17887 local rw=$(get_mdc_stats $mdtidx req_waittime)
17889 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
17890 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
17894 cmp $tmp $dom || error "file miscompare"
17898 run_test 271f "DoM: read on open (200K file and read tail)"
17901 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
17902 skip "Skipping due to old client or server version"
17904 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
17906 $CHECKSTAT -t file $DIR1/$tfile
17908 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
17911 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
17912 $LCTL set_param fail_loc=0x80000314
17913 rm $DIR1/$tfile || error "Unlink fails"
17915 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
17916 [ $RC -eq 0 ] || error "Failed write to stale object"
17918 run_test 271g "Discard DoM data vs client flush race"
17921 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
17922 skip "Need MDS version at least 2.11.50"
17924 local dom=$DIR/$tdir/dom
17925 mkdir -p $DIR/$tdir
17927 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
17928 dd if=/dev/urandom of=$dom bs=512K count=1 ||
17929 error "failed to write data into $dom"
17930 local old_md5=$(md5sum $dom)
17932 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
17933 error "failed to migrate to the same DoM component"
17935 [ $($LFS getstripe -c $dom) -eq 2 ] ||
17936 error "layout was not changed silently"
17938 local new_md5=$(md5sum $dom)
17940 [ "$old_md5" != "$new_md5" ] &&
17941 error "md5sum differ: $old_md5, $new_md5"
17944 run_test 272a "DoM migration: new layout with the same DOM component"
17947 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
17948 skip "Need MDS version at least 2.11.50"
17950 local dom=$DIR/$tdir/dom
17951 mkdir -p $DIR/$tdir
17952 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
17954 local mdtidx=$($LFS getstripe -m $dom)
17955 local mdtname=MDT$(printf %04x $mdtidx)
17956 local facet=mds$((mdtidx + 1))
17958 local mdtfree1=$(do_facet $facet \
17959 lctl get_param -n osd*.*$mdtname.kbytesfree)
17960 dd if=/dev/urandom of=$dom bs=2M count=1 ||
17961 error "failed to write data into $dom"
17962 local old_md5=$(md5sum $dom)
17963 cancel_lru_locks mdc
17964 local mdtfree1=$(do_facet $facet \
17965 lctl get_param -n osd*.*$mdtname.kbytesfree)
17967 $LFS migrate -c2 $dom ||
17968 error "failed to migrate to the new composite layout"
17969 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
17970 error "MDT stripe was not removed"
17972 cancel_lru_locks mdc
17973 local new_md5=$(md5sum $dom)
17974 [ "$old_md5" != "$new_md5" ] &&
17975 error "$old_md5 != $new_md5"
17977 # Skip free space checks with ZFS
17978 if [ "$(facet_fstype $facet)" != "zfs" ]; then
17979 local mdtfree2=$(do_facet $facet \
17980 lctl get_param -n osd*.*$mdtname.kbytesfree)
17981 [ $mdtfree2 -gt $mdtfree1 ] ||
17982 error "MDT space is not freed after migration"
17986 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
17989 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
17990 skip "Need MDS version at least 2.11.50"
17992 local dom=$DIR/$tdir/$tfile
17993 mkdir -p $DIR/$tdir
17994 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
17996 local mdtidx=$($LFS getstripe -m $dom)
17997 local mdtname=MDT$(printf %04x $mdtidx)
17998 local facet=mds$((mdtidx + 1))
18000 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18001 error "failed to write data into $dom"
18002 local old_md5=$(md5sum $dom)
18003 cancel_lru_locks mdc
18004 local mdtfree1=$(do_facet $facet \
18005 lctl get_param -n osd*.*$mdtname.kbytesfree)
18007 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18008 error "failed to migrate to the new composite layout"
18009 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18010 error "MDT stripe was not removed"
18012 cancel_lru_locks mdc
18013 local new_md5=$(md5sum $dom)
18014 [ "$old_md5" != "$new_md5" ] &&
18015 error "$old_md5 != $new_md5"
18017 # Skip free space checks with ZFS
18018 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18019 local mdtfree2=$(do_facet $facet \
18020 lctl get_param -n osd*.*$mdtname.kbytesfree)
18021 [ $mdtfree2 -gt $mdtfree1 ] ||
18022 error "MDS space is not freed after migration"
18026 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18029 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18030 skip "Need MDS version at least 2.11.50"
18032 # Layout swap cannot be done if either file has DOM component,
18033 # this will never be supported, migration should be used instead
18035 local dom=$DIR/$tdir/$tfile
18036 mkdir -p $DIR/$tdir
18038 $LFS setstripe -c2 ${dom}_plain
18039 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18040 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18041 error "can swap layout with DoM component"
18042 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18043 error "can swap layout with DoM component"
18045 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18046 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18047 error "can swap layout with DoM component"
18048 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18049 error "can swap layout with DoM component"
18052 run_test 273a "DoM: layout swapping should fail with DOM"
18055 remote_ost_nodsh && skip "remote OST with nodsh"
18056 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18057 skip "Need OST version >= 2.10.57"
18059 local file=$DIR/$tfile
18062 oss=$(comma_list $(osts_nodes))
18064 dd if=/dev/urandom of=$file bs=1M count=2 ||
18065 error "failed to create a file"
18066 cancel_lru_locks osc
18069 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18070 error "failed to read a file"
18072 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
18073 $LCTL set_param fail_loc=0x8000031f
18075 cancel_lru_locks osc &
18078 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
18079 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
18080 #IO takes another lock, but matches the PENDING one
18081 #and places it to the IO RPC
18082 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18083 error "failed to read a file with PENDING lock"
18085 run_test 275 "Read on a canceled duplicate lock"
18088 remote_ost_nodsh && skip "remote OST with nodsh"
18091 do_facet ost1 "(while true; do \
18092 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
18093 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
18096 for LOOP in $(seq 20); do
18098 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
18101 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
18102 rm $TMP/sanity_276_pid"
18104 run_test 276 "Race between mount and obd_statfs"
18106 cleanup_test_300() {
18110 test_striped_dir() {
18115 mkdir -p $DIR/$tdir
18117 SAVE_UMASK=$(umask)
18118 trap cleanup_test_300 RETURN EXIT
18120 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
18121 $DIR/$tdir/striped_dir ||
18122 error "set striped dir error"
18124 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
18125 [ "$mode" = "755" ] || error "expect 755 got $mode"
18127 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
18128 error "getdirstripe failed"
18129 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
18130 if [ "$stripe_count" != "2" ]; then
18131 error "1:stripe_count is $stripe_count, expect 2"
18133 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
18134 if [ "$stripe_count" != "2" ]; then
18135 error "2:stripe_count is $stripe_count, expect 2"
18138 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
18139 if [ "$stripe_index" != "$mdt_index" ]; then
18140 error "stripe_index is $stripe_index, expect $mdt_index"
18143 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18144 error "nlink error after create striped dir"
18146 mkdir $DIR/$tdir/striped_dir/a
18147 mkdir $DIR/$tdir/striped_dir/b
18149 stat $DIR/$tdir/striped_dir/a ||
18150 error "create dir under striped dir failed"
18151 stat $DIR/$tdir/striped_dir/b ||
18152 error "create dir under striped dir failed"
18154 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
18155 error "nlink error after mkdir"
18157 rmdir $DIR/$tdir/striped_dir/a
18158 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
18159 error "nlink error after rmdir"
18161 rmdir $DIR/$tdir/striped_dir/b
18162 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18163 error "nlink error after rmdir"
18165 chattr +i $DIR/$tdir/striped_dir
18166 createmany -o $DIR/$tdir/striped_dir/f 10 &&
18167 error "immutable flags not working under striped dir!"
18168 chattr -i $DIR/$tdir/striped_dir
18170 rmdir $DIR/$tdir/striped_dir ||
18171 error "rmdir striped dir error"
18179 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18180 skip "skipped for lustre < 2.7.0"
18181 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18182 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18184 test_striped_dir 0 || error "failed on striped dir on MDT0"
18185 test_striped_dir 1 || error "failed on striped dir on MDT0"
18187 run_test 300a "basic striped dir sanity test"
18190 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18191 skip "skipped for lustre < 2.7.0"
18192 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18193 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18200 test_mkdir $DIR/$tdir || error "mkdir fail"
18201 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18202 error "set striped dir error"
18203 for i in {0..9}; do
18204 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
18206 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
18207 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
18208 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
18210 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
18211 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
18212 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
18216 run_test 300b "check ctime/mtime for striped dir"
18219 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18220 skip "skipped for lustre < 2.7.0"
18221 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18222 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18226 mkdir -p $DIR/$tdir
18227 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
18228 error "set striped dir error"
18230 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
18231 error "chown striped dir failed"
18233 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
18234 error "create 5k files failed"
18236 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
18238 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
18242 run_test 300c "chown && check ls under striped directory"
18245 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18246 skip "skipped for lustre < 2.7.0"
18247 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18248 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18253 mkdir -p $DIR/$tdir
18254 $SETSTRIPE -c 2 $DIR/$tdir
18256 #local striped directory
18257 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18258 error "set striped dir error"
18259 createmany -o $DIR/$tdir/striped_dir/f 10 ||
18260 error "create 10 files failed"
18262 #remote striped directory
18263 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
18264 error "set striped dir error"
18265 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
18266 error "create 10 files failed"
18268 for file in $(find $DIR/$tdir); do
18269 stripe_count=$($LFS getstripe -c $file)
18270 [ $stripe_count -eq 2 ] ||
18271 error "wrong stripe $stripe_count for $file"
18276 run_test 300d "check default stripe under striped directory"
18279 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18280 skip "Need MDS version at least 2.7.55"
18281 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18282 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18287 mkdir -p $DIR/$tdir
18289 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18290 error "set striped dir error"
18292 touch $DIR/$tdir/striped_dir/a
18293 touch $DIR/$tdir/striped_dir/b
18294 touch $DIR/$tdir/striped_dir/c
18296 mkdir $DIR/$tdir/striped_dir/dir_a
18297 mkdir $DIR/$tdir/striped_dir/dir_b
18298 mkdir $DIR/$tdir/striped_dir/dir_c
18300 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
18301 error "set striped adir under striped dir error"
18303 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
18304 error "set striped bdir under striped dir error"
18306 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
18307 error "set striped cdir under striped dir error"
18309 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
18310 error "rename dir under striped dir fails"
18312 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
18313 error "rename dir under different stripes fails"
18315 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
18316 error "rename file under striped dir should succeed"
18318 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
18319 error "rename dir under striped dir should succeed"
18323 run_test 300e "check rename under striped directory"
18326 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18327 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18328 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18329 skip "Need MDS version at least 2.7.55"
18335 mkdir -p $DIR/$tdir
18337 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18338 error "set striped dir error"
18340 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
18341 error "set striped dir error"
18343 touch $DIR/$tdir/striped_dir/a
18344 mkdir $DIR/$tdir/striped_dir/dir_a
18345 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
18346 error "create striped dir under striped dir fails"
18348 touch $DIR/$tdir/striped_dir1/b
18349 mkdir $DIR/$tdir/striped_dir1/dir_b
18350 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
18351 error "create striped dir under striped dir fails"
18353 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
18354 error "rename dir under different striped dir should fail"
18356 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
18357 error "rename striped dir under diff striped dir should fail"
18359 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
18360 error "rename file under diff striped dirs fails"
18364 run_test 300f "check rename cross striped directory"
18366 test_300_check_default_striped_dir()
18369 local default_count=$2
18370 local default_index=$3
18373 local dir_stripe_index
18376 echo "checking $dirname $default_count $default_index"
18377 $LFS setdirstripe -D -c $default_count -i $default_index \
18378 -t all_char $DIR/$tdir/$dirname ||
18379 error "set default stripe on striped dir error"
18380 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
18381 [ $stripe_count -eq $default_count ] ||
18382 error "expect $default_count get $stripe_count for $dirname"
18384 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
18385 [ $stripe_index -eq $default_index ] ||
18386 error "expect $default_index get $stripe_index for $dirname"
18388 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
18389 error "create dirs failed"
18391 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
18392 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
18393 for dir in $(find $DIR/$tdir/$dirname/*); do
18394 stripe_count=$($LFS getdirstripe -c $dir)
18395 [ $stripe_count -eq $default_count ] ||
18396 [ $stripe_count -eq 0 -o $default_count -eq 1 ] ||
18397 error "stripe count $default_count != $stripe_count for $dir"
18399 stripe_index=$($LFS getdirstripe -i $dir)
18400 [ $default_index -eq -1 -o $stripe_index -eq $default_index ] ||
18401 error "$stripe_index != $default_index for $dir"
18403 #check default stripe
18404 stripe_count=$($LFS getdirstripe -D -c $dir)
18405 [ $stripe_count -eq $default_count ] ||
18406 error "default count $default_count != $stripe_count for $dir"
18408 stripe_index=$($LFS getdirstripe -D -i $dir)
18409 [ $stripe_index -eq $default_index ] ||
18410 error "default index $default_index != $stripe_index for $dir"
18412 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
18416 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18417 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18418 skip "Need MDS version at least 2.7.55"
18425 mkdir $DIR/$tdir/normal_dir
18427 #Checking when client cache stripe index
18428 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
18429 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
18430 error "create striped_dir failed"
18432 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
18433 error "create dir0 fails"
18434 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
18435 [ $stripe_index -eq 0 ] ||
18436 error "dir0 expect index 0 got $stripe_index"
18438 mkdir $DIR/$tdir/striped_dir/dir1 ||
18439 error "create dir1 fails"
18440 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
18441 [ $stripe_index -eq 1 ] ||
18442 error "dir1 expect index 1 got $stripe_index"
18444 #check default stripe count/stripe index
18445 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
18446 test_300_check_default_striped_dir normal_dir 1 0
18447 test_300_check_default_striped_dir normal_dir 2 1
18448 test_300_check_default_striped_dir normal_dir 2 -1
18450 #delete default stripe information
18451 echo "delete default stripeEA"
18452 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
18453 error "set default stripe on striped dir error"
18455 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
18456 for dir in $(find $DIR/$tdir/normal_dir/*); do
18457 stripe_count=$($LFS getdirstripe -c $dir)
18458 [ $stripe_count -eq 0 ] ||
18459 error "expect 1 get $stripe_count for $dir"
18460 stripe_index=$($LFS getdirstripe -i $dir)
18461 [ $stripe_index -eq 0 ] ||
18462 error "expect 0 get $stripe_index for $dir"
18465 run_test 300g "check default striped directory for normal directory"
18468 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18469 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18470 skip "Need MDS version at least 2.7.55"
18476 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18477 error "set striped dir error"
18479 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
18480 test_300_check_default_striped_dir striped_dir 1 0
18481 test_300_check_default_striped_dir striped_dir 2 1
18482 test_300_check_default_striped_dir striped_dir 2 -1
18484 #delete default stripe information
18485 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
18486 error "set default stripe on striped dir error"
18488 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
18489 for dir in $(find $DIR/$tdir/striped_dir/*); do
18490 stripe_count=$($LFS getdirstripe -c $dir)
18491 [ $stripe_count -eq 0 ] ||
18492 error "expect 1 get $stripe_count for $dir"
18495 run_test 300h "check default striped directory for striped directory"
18498 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18499 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18500 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18501 skip "Need MDS version at least 2.7.55"
18508 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18509 error "set striped dir error"
18511 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18512 error "create files under striped dir failed"
18514 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
18515 error "set striped hashdir error"
18517 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
18518 error "create dir0 under hash dir failed"
18519 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
18520 error "create dir1 under hash dir failed"
18522 # unfortunately, we need to umount to clear dir layout cache for now
18523 # once we fully implement dir layout, we can drop this
18524 umount_client $MOUNT || error "umount failed"
18525 mount_client $MOUNT || error "mount failed"
18527 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
18528 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
18529 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
18531 #set the stripe to be unknown hash type
18532 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
18533 $LCTL set_param fail_loc=0x1901
18534 for ((i = 0; i < 10; i++)); do
18535 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
18536 error "stat f-$i failed"
18537 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
18540 touch $DIR/$tdir/striped_dir/f0 &&
18541 error "create under striped dir with unknown hash should fail"
18543 $LCTL set_param fail_loc=0
18545 umount_client $MOUNT || error "umount failed"
18546 mount_client $MOUNT || error "mount failed"
18550 run_test 300i "client handle unknown hash type striped directory"
18553 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18554 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18555 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18556 skip "Need MDS version at least 2.7.55"
18563 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
18564 $LCTL set_param fail_loc=0x1702
18565 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18566 error "set striped dir error"
18568 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18569 error "create files under striped dir failed"
18571 $LCTL set_param fail_loc=0
18573 rm -rf $DIR/$tdir || error "unlink striped dir fails"
18577 run_test 300j "test large update record"
18580 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18581 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18582 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18583 skip "Need MDS version at least 2.7.55"
18590 #define OBD_FAIL_LARGE_STRIPE 0x1703
18591 $LCTL set_param fail_loc=0x1703
18592 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
18593 error "set striped dir error"
18594 $LCTL set_param fail_loc=0
18596 $LFS getdirstripe $DIR/$tdir/striped_dir ||
18597 error "getstripeddir fails"
18598 rm -rf $DIR/$tdir/striped_dir ||
18599 error "unlink striped dir fails"
18603 run_test 300k "test large striped directory"
18606 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18607 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18608 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18609 skip "Need MDS version at least 2.7.55"
18613 test_mkdir -p $DIR/$tdir/striped_dir
18614 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
18615 error "chown $RUNAS_ID failed"
18616 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
18617 error "set default striped dir failed"
18619 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
18620 $LCTL set_param fail_loc=0x80000158
18621 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
18623 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
18624 [ $stripe_index -eq 1 ] ||
18625 error "expect 1 get $stripe_index for $dir"
18627 run_test 300l "non-root user to create dir under striped dir with stale layout"
18630 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18631 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
18632 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18633 skip "Need MDS version at least 2.7.55"
18635 mkdir -p $DIR/$tdir/striped_dir
18636 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
18637 error "set default stripes dir error"
18639 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
18641 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
18642 [ $stripe_count -eq 0 ] ||
18643 error "expect 0 get $stripe_count for a"
18645 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
18646 error "set default stripes dir error"
18648 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
18650 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
18651 [ $stripe_count -eq 0 ] ||
18652 error "expect 0 get $stripe_count for b"
18654 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
18655 error "set default stripes dir error"
18657 mkdir $DIR/$tdir/striped_dir/c &&
18658 error "default stripe_index is invalid, mkdir c should fails"
18660 rm -rf $DIR/$tdir || error "rmdir fails"
18662 run_test 300m "setstriped directory on single MDT FS"
18665 local list=$(comma_list $(mdts_nodes))
18668 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
18672 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18673 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18674 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18675 skip "Need MDS version at least 2.7.55"
18676 remote_mds_nodsh && skip "remote MDS with nodsh"
18679 local list=$(comma_list $(mdts_nodes))
18681 trap cleanup_300n RETURN EXIT
18682 mkdir -p $DIR/$tdir
18683 chmod 777 $DIR/$tdir
18684 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
18685 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
18686 error "create striped dir succeeds with gid=0"
18688 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
18689 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
18690 error "create striped dir fails with gid=-1"
18692 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
18693 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
18694 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
18695 error "set default striped dir succeeds with gid=0"
18698 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
18699 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
18700 error "set default striped dir fails with gid=-1"
18703 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
18704 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
18705 error "create test_dir fails"
18706 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
18707 error "create test_dir1 fails"
18708 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
18709 error "create test_dir2 fails"
18712 run_test 300n "non-root user to create dir under striped dir with default EA"
18715 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18716 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18717 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18718 skip "Need MDS version at least 2.7.55"
18723 mkdir -p $DIR/$tdir
18725 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
18726 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
18727 if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then
18728 skip "not enough free inodes $numfree1 $numfree2"
18731 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
18732 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
18733 if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then
18734 skip "not enough free space $numfree1 $numfree2"
18737 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
18738 error "setdirstripe fails"
18740 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
18741 error "create dirs fails"
18743 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
18744 ls $DIR/$tdir/striped_dir > /dev/null ||
18745 error "ls striped dir fails"
18746 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
18747 error "unlink big striped dir fails"
18749 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
18752 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18753 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18754 remote_mds_nodsh && skip "remote MDS with nodsh"
18756 mkdir -p $DIR/$tdir
18758 #define OBD_FAIL_OUT_ENOSPC 0x1704
18759 do_facet mds2 lctl set_param fail_loc=0x80001704
18760 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
18761 && error "create striped directory should fail"
18763 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
18765 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
18768 run_test 300p "create striped directory without space"
18771 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18772 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18774 local fd=$(free_fd)
18775 local cmd="exec $fd<$tdir"
18777 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
18780 trap "eval $cmd" EXIT
18781 cd $tdir || error "cd $tdir fails"
18782 rmdir ../$tdir || error "rmdir $tdir fails"
18783 mkdir local_dir && error "create dir succeeds"
18784 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
18788 run_test 300q "create remote directory under orphan directory"
18791 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
18792 skip "Need MDS version at least 2.7.55" && return
18793 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
18797 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
18798 error "set striped dir error"
18800 $LFS getdirstripe $DIR/$tdir/striped_dir ||
18801 error "getstripeddir fails"
18804 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
18805 awk '/lmv_stripe_count:/ { print $2 }')
18807 [ $MDSCOUNT -ne $stripe_count ] &&
18808 error "wrong stripe count $stripe_count expected $MDSCOUNT"
18810 rm -rf $DIR/$tdir/striped_dir ||
18811 error "unlink striped dir fails"
18813 run_test 300r "test -1 striped directory"
18815 prepare_remote_file() {
18816 mkdir $DIR/$tdir/src_dir ||
18817 error "create remote source failed"
18819 cp /etc/hosts $DIR/$tdir/src_dir/a ||
18820 error "cp to remote source failed"
18821 touch $DIR/$tdir/src_dir/a
18823 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
18824 error "create remote target dir failed"
18826 touch $DIR/$tdir/tgt_dir/b
18828 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
18829 error "rename dir cross MDT failed!"
18831 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
18832 error "src_child still exists after rename"
18834 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
18835 error "missing file(a) after rename"
18837 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
18838 error "diff after rename"
18842 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
18843 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18845 local remote_file=$DIR/$tdir/tgt_dir/b
18847 mkdir -p $DIR/$tdir
18849 prepare_remote_file || error "prepare remote file failed"
18852 $OPENUNLINK $remote_file $remote_file ||
18853 error "openunlink $remote_file failed"
18854 $CHECKSTAT -a $remote_file || error "$remote_file exists"
18856 run_test 310a "open unlink remote file"
18859 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
18860 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18862 local remote_file=$DIR/$tdir/tgt_dir/b
18864 mkdir -p $DIR/$tdir
18866 prepare_remote_file || error "prepare remote file failed"
18868 ln $remote_file $DIR/$tfile || error "link failed for remote file"
18869 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
18870 $CHECKSTAT -t file $remote_file || error "check file failed"
18872 run_test 310b "unlink remote file with multiple links while open"
18875 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18876 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
18878 local remote_file=$DIR/$tdir/tgt_dir/b
18880 mkdir -p $DIR/$tdir
18882 prepare_remote_file || error "prepare remote file failed"
18884 ln $remote_file $DIR/$tfile || error "link failed for remote file"
18885 multiop_bg_pause $remote_file O_uc ||
18886 error "mulitop failed for remote file"
18888 $MULTIOP $DIR/$tfile Ouc
18889 kill -USR1 $MULTIPID
18892 run_test 310c "open-unlink remote file with multiple links"
18896 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18897 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
18898 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
18899 skip "lustre < 2.8.54 does not contain LU-4825 fix"
18900 remote_mds_nodsh && skip "remote MDS with nodsh"
18902 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
18903 local mdts=$(comma_list $(mdts_nodes))
18905 mkdir -p $DIR/$tdir
18906 $SETSTRIPE -i 0 -c 1 $DIR/$tdir
18907 createmany -o $DIR/$tdir/$tfile. 1000
18909 # statfs data is not real time, let's just calculate it
18910 old_iused=$((old_iused + 1000))
18912 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
18913 osp.*OST0000*MDT0000.create_count")
18914 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
18915 osp.*OST0000*MDT0000.max_create_count")
18916 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
18918 $SETSTRIPE -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
18919 local index=$($GETSTRIPE -i $DIR/$tdir/$tfile)
18920 [ $index -ne 0 ] || error "$tfile stripe index is 0"
18922 unlinkmany $DIR/$tdir/$tfile. 1000
18924 do_nodes $mdts "$LCTL set_param -n \
18925 osp.*OST0000*.max_create_count=$max_count"
18926 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
18927 do_nodes $mdts "$LCTL set_param -n \
18928 osp.*OST0000*.create_count=$count"
18929 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
18930 grep "=0" && error "create_count is zero"
18933 for i in $(seq 120); do
18934 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
18935 # system may be too busy to destroy all objs in time, use
18936 # a somewhat small value to not fail autotest
18937 [ $((old_iused - new_iused)) -gt 400 ] && break
18941 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
18942 [ $((old_iused - new_iused)) -gt 400 ] ||
18943 error "objs not destroyed after unlink"
18945 run_test 311 "disable OSP precreate, and unlink should destroy objs"
18952 local vdevdir=$(dirname $(facet_vdevice $ost))
18953 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
18954 local zfs_zapid=$(do_facet $ost $cmd |
18955 grep -w "/O/0/d$((objid%32))" -C 5 |
18956 awk '/Object/{getline; print $1}')
18957 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
18958 awk "/$objid = /"'{printf $3}')
18963 zfs_object_blksz() {
18967 local vdevdir=$(dirname $(facet_vdevice $ost))
18968 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
18969 local blksz=$(do_facet $ost $cmd $objid |
18970 awk '/dblk/{getline; printf $4}')
18972 case "${blksz: -1}" in
18973 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
18974 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
18981 test_312() { # LU-4856
18982 remote_ost_nodsh && skip "remote OST with nodsh"
18983 [ "$ost1_FSTYPE" = "zfs" ] ||
18984 skip_env "the test only applies to zfs"
18986 local max_blksz=$(do_facet ost1 \
18987 $ZFS get -p recordsize $(facet_device ost1) |
18988 awk '!/VALUE/{print $3}')
18990 # to make life a little bit easier
18991 $LFS mkdir -c 1 -i 0 $DIR/$tdir
18992 $LFS setstripe -c 1 -i 0 $DIR/$tdir
18994 local tf=$DIR/$tdir/$tfile
18996 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
18998 # Get ZFS object id
18999 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19000 # block size change by sequential overwrite
19003 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
19004 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
19006 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
19007 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19011 # block size change by sequential append write
19012 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19013 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19014 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19017 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19018 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19019 oflag=sync conv=notrunc
19021 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19022 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19023 error "blksz error, actual $blksz, " \
19024 "expected: 2 * $count * $PAGE_SIZE"
19030 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19031 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19033 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
19034 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19035 [ $blksz -eq $PAGE_SIZE ] ||
19036 error "blksz error: $blksz, expected: $PAGE_SIZE"
19038 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
19039 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19040 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
19042 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
19043 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19044 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
19046 run_test 312 "make sure ZFS adjusts its block size by write pattern"
19049 remote_ost_nodsh && skip "remote OST with nodsh"
19051 local file=$DIR/$tfile
19054 $SETSTRIPE -c 1 -i 0 $file || error "setstripe failed"
19056 # define OBD_FAIL_TGT_RCVD_EIO 0x720
19057 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19058 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
19059 error "write should failed"
19060 do_facet ost1 "$LCTL set_param fail_loc=0"
19063 run_test 313 "io should fail after last_rcvd update fail"
19066 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19068 $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
19069 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19071 wait_delete_completed
19072 do_facet ost1 "$LCTL set_param fail_loc=0"
19074 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
19076 test_315() { # LU-618
19077 local file=$DIR/$tfile
19080 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
19081 error "multiop file write failed"
19082 $MULTIOP $file oO_RDONLY:r4063232_c &
19087 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
19090 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
19093 run_test 315 "read should be accounted"
19096 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19097 large_xattr_enabled || skip_env "ea_inode feature disabled"
19099 rm -rf $DIR/$tdir/d
19100 mkdir -p $DIR/$tdir/d
19101 chown nobody $DIR/$tdir/d
19102 touch $DIR/$tdir/d/file
19104 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
19106 run_test 316 "lfs mv"
19109 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
19110 skip "Need MDS version at least 2.11.53"
19111 if [ "$ost1_FSTYPE" == "zfs" ]; then
19112 skip "LU-10370: no implementation for ZFS"
19116 local grant_blk_size
19118 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
19119 awk '/grant_block_size:/ { print $2; exit; }')
19121 # Create File of size 5M. Truncate it to below size's and verify
19124 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
19125 error "Create file $DIR/$tfile failed"
19126 stack_trap "rm -f $DIR/$tfile" EXIT
19128 for trunc_sz in 2097152 4097 4000 509 0; do
19129 $TRUNCATE $DIR/$tfile $trunc_sz ||
19130 error "truncate $tfile to $trunc_sz failed"
19131 local sz=$(stat --format=%s $DIR/$tfile)
19132 local blk=$(stat --format=%b $DIR/$tfile)
19133 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
19134 grant_blk_size) * 8))
19136 if [[ $blk -ne $trunc_blk ]]; then
19137 $(which stat) $DIR/$tfile
19138 error "Expected Block $trunc_blk got $blk for $tfile"
19141 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19142 error "Expected Size $trunc_sz got $sz for $tfile"
19147 # Create file with a hole and write actual two blocks. Block count
19150 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
19151 conv=fsync || error "Create file : $DIR/$tfile"
19153 # Calculate the final truncate size.
19154 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
19157 # truncate to size $trunc_sz bytes. Strip the last block
19158 # The block count must drop to 8
19160 $TRUNCATE $DIR/$tfile $trunc_sz ||
19161 error "truncate $tfile to $trunc_sz failed"
19163 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
19164 sz=$(stat --format=%s $DIR/$tfile)
19165 blk=$(stat --format=%b $DIR/$tfile)
19167 if [[ $blk -ne $trunc_bsz ]]; then
19168 $(which stat) $DIR/$tfile
19169 error "Expected Block $trunc_bsz got $blk for $tfile"
19172 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19173 error "Expected Size $trunc_sz got $sz for $tfile"
19175 run_test 317 "Verify blocks get correctly update after truncate"
19178 local read_write=$1
19179 if [ "$read_write" = "write" ]; then
19180 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
19181 elif [ "$read_write" = "read" ]; then
19182 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
19184 error "argument error"
19187 # turn off debug for performance testing
19188 local saved_debug=$($LCTL get_param -n debug)
19189 $LCTL set_param debug=0
19191 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
19193 # get ost1 size - lustre-OST0000
19194 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
19195 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
19196 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
19198 if [ "$read_write" = "read" ]; then
19199 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
19202 local start_time=$(date +%s.%N)
19203 $dd_cmd bs=1M count=$blocks oflag=sync ||
19204 error "real dd $read_write error"
19205 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
19207 if [ "$read_write" = "write" ]; then
19211 # define OBD_FAIL_OST_FAKE_RW 0x238
19212 do_facet ost1 $LCTL set_param fail_loc=0x238
19214 local start_time=$(date +%s.%N)
19215 $dd_cmd bs=1M count=$blocks oflag=sync ||
19216 error "fake dd $read_write error"
19217 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
19219 if [ "$read_write" = "write" ]; then
19221 cancel_lru_locks osc
19222 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
19223 error "$tfile size not $blocks MB"
19225 do_facet ost1 $LCTL set_param fail_loc=0
19227 echo "fake $read_write $duration_fake vs. normal $read_write" \
19228 "$duration in seconds"
19229 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
19230 error_not_in_vm "fake write is slower"
19232 $LCTL set_param -n debug="$saved_debug"
19235 test_399a() { # LU-7655 for OST fake write
19236 remote_ost_nodsh && skip "remote OST with nodsh"
19240 run_test 399a "fake write should not be slower than normal write"
19242 test_399b() { # LU-8726 for OST fake read
19243 remote_ost_nodsh && skip "remote OST with nodsh"
19244 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
19245 skip_env "ldiskfs only test"
19250 run_test 399b "fake read should not be slower than normal read"
19252 test_400a() { # LU-1606, was conf-sanity test_74
19253 if ! which $CC > /dev/null 2>&1; then
19254 skip_env "$CC is not installed"
19257 local extra_flags=''
19258 local out=$TMP/$tfile
19259 local prefix=/usr/include/lustre
19262 if ! [[ -d $prefix ]]; then
19263 # Assume we're running in tree and fixup the include path.
19264 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
19265 extra_flags+=" -L$LUSTRE/utils/.lib"
19268 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
19269 $CC -Wall -Werror $extra_flags -o $out $prog -llustreapi ||
19270 error "client api broken"
19274 run_test 400a "Lustre client api program can compile and link"
19276 test_400b() { # LU-1606, LU-5011
19278 local out=$TMP/$tfile
19279 local prefix=/usr/include/linux/lustre
19281 # We use a hard coded prefix so that this test will not fail
19282 # when run in tree. There are headers in lustre/include/lustre/
19283 # that are not packaged (like lustre_idl.h) and have more
19284 # complicated include dependencies (like config.h and lnet/types.h).
19285 # Since this test about correct packaging we just skip them when
19286 # they don't exist (see below) rather than try to fixup cppflags.
19288 if ! which $CC > /dev/null 2>&1; then
19289 skip_env "$CC is not installed"
19292 for header in $prefix/*.h; do
19293 if ! [[ -f "$header" ]]; then
19297 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
19298 continue # lustre_ioctl.h is internal header
19301 $CC -Wall -Werror -include $header -c -x c /dev/null -o $out ||
19302 error "cannot compile '$header'"
19306 run_test 400b "packaged headers can be compiled"
19308 test_401a() { #LU-7437
19309 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
19310 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
19312 #count the number of parameters by "list_param -R"
19313 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
19314 #count the number of parameters by listing proc files
19315 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
19316 echo "proc_dirs='$proc_dirs'"
19317 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
19318 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
19321 [ $params -eq $procs ] ||
19322 error "found $params parameters vs. $procs proc files"
19324 # test the list_param -D option only returns directories
19325 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
19326 #count the number of parameters by listing proc directories
19327 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
19330 [ $params -eq $procs ] ||
19331 error "found $params parameters vs. $procs proc files"
19333 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
19336 local save=$($LCTL get_param -n jobid_var)
19339 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
19340 error "no error returned when setting bad parameters"
19342 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
19343 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
19345 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
19346 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
19347 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
19349 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
19352 local jobid_var_old=$($LCTL get_param -n jobid_var)
19353 local jobid_var_new
19355 $LCTL set_param jobid_var= &&
19356 error "no error returned for 'set_param a='"
19358 jobid_var_new=$($LCTL get_param -n jobid_var)
19359 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19360 error "jobid_var was changed by setting without value"
19362 $LCTL set_param jobid_var &&
19363 error "no error returned for 'set_param a'"
19365 jobid_var_new=$($LCTL get_param -n jobid_var)
19366 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19367 error "jobid_var was changed by setting without value"
19369 run_test 401c "Verify 'lctl set_param' without value fails in either format."
19372 local jobid_var_old=$($LCTL get_param -n jobid_var)
19373 local jobid_var_new
19374 local new_value="foo=bar"
19376 $LCTL set_param jobid_var=$new_value ||
19377 error "'set_param a=b' did not accept a value containing '='"
19379 jobid_var_new=$($LCTL get_param -n jobid_var)
19380 [[ "$jobid_var_new" == "$new_value" ]] ||
19381 error "'set_param a=b' failed on a value containing '='"
19383 # Reset the jobid_var to test the other format
19384 $LCTL set_param jobid_var=$jobid_var_old
19385 jobid_var_new=$($LCTL get_param -n jobid_var)
19386 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19387 error "failed to reset jobid_var"
19389 $LCTL set_param jobid_var $new_value ||
19390 error "'set_param a b' did not accept a value containing '='"
19392 jobid_var_new=$($LCTL get_param -n jobid_var)
19393 [[ "$jobid_var_new" == "$new_value" ]] ||
19394 error "'set_param a b' failed on a value containing '='"
19396 $LCTL set_param jobid_var $jobid_var_old
19397 jobid_var_new=$($LCTL get_param -n jobid_var)
19398 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19399 error "failed to reset jobid_var"
19401 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
19404 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
19405 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
19406 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
19407 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
19408 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
19409 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
19410 remote_mds_nodsh && skip "remote MDS with nodsh"
19412 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
19413 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
19414 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
19415 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
19416 echo "Touch failed - OK"
19418 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
19421 local file1=$DIR/$tfile.1
19422 local file2=$DIR/$tfile.2
19423 local tfile=$TMP/$tfile
19425 rm -f $file1 $file2 $tfile
19430 # 30 sec OBD_TIMEOUT in ll_getattr()
19431 # right before populating st_nlink
19432 $LCTL set_param fail_loc=0x80001409
19433 stat -c %h $file1 > $tfile &
19435 # create an alias, drop all locks and reclaim the dentry
19437 cancel_lru_locks mdc
19438 cancel_lru_locks osc
19439 sysctl -w vm.drop_caches=2
19443 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
19445 rm -f $tfile $file1 $file2
19447 run_test 403 "i_nlink should not drop to zero due to aliasing"
19449 test_404() { # LU-6601
19450 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
19451 skip "Need server version newer than 2.8.52"
19452 remote_mds_nodsh && skip "remote MDS with nodsh"
19454 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
19455 awk '/osp .*-osc-MDT/ { print $4}')
19458 for osp in $mosps; do
19459 echo "Deactivate: " $osp
19460 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
19461 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19462 awk -vp=$osp '$4 == p { print $2 }')
19463 [ $stat = IN ] || {
19464 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19465 error "deactivate error"
19467 echo "Activate: " $osp
19468 do_facet $SINGLEMDS $LCTL --device %$osp activate
19469 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19470 awk -vp=$osp '$4 == p { print $2 }')
19471 [ $stat = UP ] || {
19472 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19473 error "activate error"
19477 run_test 404 "validate manual {de}activated works properly for OSPs"
19480 [ $MDS1_VERSION -lt $(version_code 2.6.92) -o \
19481 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
19482 skip "Layout swap lock is not supported"
19483 check_swap_layouts_support
19485 test_mkdir $DIR/$tdir
19486 swap_lock_test -d $DIR/$tdir ||
19487 error "One layout swap locked test failed"
19489 run_test 405 "Various layout swap lock tests"
19492 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19493 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
19494 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
19495 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19496 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
19497 skip "Need MDS version at least 2.8.50"
19499 local def_stripe_size=$($LFS getstripe -S $MOUNT)
19500 local test_pool=$TESTNAME
19502 pool_add $test_pool || error "pool_add failed"
19503 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
19504 error "pool_add_targets failed"
19506 save_layout_restore_at_exit $MOUNT
19508 # parent set default stripe count only, child will stripe from both
19509 # parent and fs default
19510 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
19511 error "setstripe $MOUNT failed"
19512 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
19513 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
19514 for i in $(seq 10); do
19515 local f=$DIR/$tdir/$tfile.$i
19516 touch $f || error "touch failed"
19517 local count=$($LFS getstripe -c $f)
19518 [ $count -eq $OSTCOUNT ] ||
19519 error "$f stripe count $count != $OSTCOUNT"
19520 local offset=$($LFS getstripe -i $f)
19521 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
19522 local size=$($LFS getstripe -S $f)
19523 [ $size -eq $((def_stripe_size * 2)) ] ||
19524 error "$f stripe size $size != $((def_stripe_size * 2))"
19525 local pool=$($LFS getstripe -p $f)
19526 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
19529 # change fs default striping, delete parent default striping, now child
19530 # will stripe from new fs default striping only
19531 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
19532 error "change $MOUNT default stripe failed"
19533 $LFS setstripe -c 0 $DIR/$tdir ||
19534 error "delete $tdir default stripe failed"
19535 for i in $(seq 11 20); do
19536 local f=$DIR/$tdir/$tfile.$i
19537 touch $f || error "touch $f failed"
19538 local count=$($LFS getstripe -c $f)
19539 [ $count -eq 1 ] || error "$f stripe count $count != 1"
19540 local offset=$($LFS getstripe -i $f)
19541 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
19542 local size=$($LFS getstripe -S $f)
19543 [ $size -eq $def_stripe_size ] ||
19544 error "$f stripe size $size != $def_stripe_size"
19545 local pool=$($LFS getstripe -p $f)
19546 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
19549 unlinkmany $DIR/$tdir/$tfile. 1 20
19551 local f=$DIR/$tdir/$tfile
19552 pool_remove_all_targets $test_pool $f
19553 pool_remove $test_pool $f
19555 run_test 406 "DNE support fs default striping"
19558 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19559 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
19560 skip "Need MDS version at least 2.8.55"
19561 remote_mds_nodsh && skip "remote MDS with nodsh"
19563 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
19564 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
19565 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
19566 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
19567 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
19569 #define OBD_FAIL_DT_TXN_STOP 0x2019
19570 for idx in $(seq $MDSCOUNT); do
19571 do_facet mds$idx "lctl set_param fail_loc=0x2019"
19573 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
19574 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
19575 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
19578 run_test 407 "transaction fail should cause operation fail"
19581 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
19583 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
19584 lctl set_param fail_loc=0x8000040a
19585 # let ll_prepare_partial_page() fail
19586 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
19590 # create at least 100 unused inodes so that
19591 # shrink_icache_memory(0) should not return 0
19592 touch $DIR/$tfile-{0..100}
19593 rm -f $DIR/$tfile-{0..100}
19596 echo 2 > /proc/sys/vm/drop_caches
19598 run_test 408 "drop_caches should not hang due to page leaks"
19602 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19603 check_mount_and_prep
19605 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
19606 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
19607 touch $DIR/$tdir/guard || error "(2) Fail to create"
19609 local PREFIX=$(str_repeat 'A' 128)
19610 echo "Create 1K hard links start at $(date)"
19611 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
19612 error "(3) Fail to hard link"
19614 echo "Links count should be right although linkEA overflow"
19615 stat $DIR/$tdir/guard || error "(4) Fail to stat"
19616 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
19617 [ $linkcount -eq 1001 ] ||
19618 error "(5) Unexpected hard links count: $linkcount"
19620 echo "List all links start at $(date)"
19621 ls -l $DIR/$tdir/foo > /dev/null ||
19622 error "(6) Fail to list $DIR/$tdir/foo"
19624 echo "Unlink hard links start at $(date)"
19625 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
19626 error "(7) Fail to unlink"
19628 run_test 409 "Large amount of cross-MDTs hard links on the same file"
19632 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
19633 skip "Need client version at least 2.9.59"
19635 # Create a file, and stat it from the kernel
19636 local testfile=$DIR/$tfile
19639 local run_id=$RANDOM
19640 local my_ino=$(stat --format "%i" $testfile)
19642 # Try to insert the module. This will always fail as the
19643 # module is designed to not be inserted.
19644 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
19647 # Anything but success is a test failure
19649 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
19650 error "no inode match"
19652 run_test 410 "Test inode number returned from kernel thread"
19654 cleanup_test411_cgroup() {
19660 local cg_basedir=/sys/fs/cgroup/memory
19662 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
19663 skip "no setup for cgroup"
19665 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
19666 error "test file creation failed"
19667 cancel_lru_locks osc
19669 # Create a very small memory cgroup to force a slab allocation error
19670 local cgdir=$cg_basedir/osc_slab_alloc
19671 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
19672 trap "cleanup_test411_cgroup $cgdir" EXIT
19673 echo 2M > $cgdir/memory.kmem.limit_in_bytes
19674 echo 1M > $cgdir/memory.limit_in_bytes
19676 # Should not LBUG, just be killed by oom-killer
19677 # dd will return 0 even allocation failure in some environment.
19678 # So don't check return value
19679 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
19680 cleanup_test411_cgroup $cgdir
19684 run_test 411 "Slab allocation error with cgroup does not LBUG"
19687 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19688 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
19689 skip "Need server version at least 2.10.55"
19692 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
19693 error "mkdir failed"
19694 $LFS getdirstripe $DIR/$tdir
19695 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
19696 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
19697 error "expect $((MDSCOUT - 1)) get $stripe_index"
19698 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
19699 [ $stripe_count -eq 2 ] ||
19700 error "expect 2 get $stripe_count"
19702 run_test 412 "mkdir on specific MDTs"
19705 [ $MDSCOUNT -lt 2 ] &&
19706 skip "We need at least 2 MDTs for this test"
19708 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
19709 skip "Need server version at least 2.10.55"
19712 mkdir $DIR/$tdir || error "mkdir failed"
19714 # find MDT that is the most full
19715 local max=$($LFS df | grep MDT |
19724 END { split(b, c, ":")
19729 for i in $(seq $((MDSCOUNT - 1))); do
19730 $LFS mkdir -c $i $DIR/$tdir/d$i ||
19731 error "mkdir d$i failed"
19732 $LFS getdirstripe $DIR/$tdir/d$i
19733 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
19734 [ $stripe_index -ne $max ] ||
19735 error "don't expect $max"
19738 run_test 413 "mkdir on less full MDTs"
19741 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
19742 $LCTL set_param fail_loc=0x80000521
19743 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
19746 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
19749 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19750 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
19751 skip "Need server version at least 2.11.52"
19761 # this test may be slow on ZFS
19762 [ "$mds1_FSTYPE" == "zfs" ] && total=100
19764 # though this test is designed for striped directory, let's test normal
19765 # directory too since lock is always saved as CoS lock.
19766 test_mkdir $DIR/$tdir || error "mkdir $tdir"
19767 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
19776 start_time=$(date +%s)
19777 for i in $(seq $total); do
19778 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
19781 end_time=$(date +%s)
19782 duration=$((end_time - start_time))
19784 kill -9 $setattr_pid
19786 echo "rename $total files took $duration sec"
19787 [ $duration -lt 100 ] || error "rename took $duration sec"
19789 run_test 415 "lock revoke is not missing"
19792 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
19793 skip "Need server version at least 2.11.55"
19795 # define OBD_FAIL_OSD_TXN_START 0x19a
19796 do_facet mds1 lctl set_param fail_loc=0x19a
19798 lfs mkdir -c $MDSCOUNT $DIR/$tdir
19802 run_test 416 "transaction start failure won't cause system hung"
19806 do_nodes $(comma_list $(mdts_nodes)) \
19807 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
19808 do_nodes $(comma_list $(mdts_nodes)) \
19809 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
19810 do_nodes $(comma_list $(mdts_nodes)) \
19811 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
19815 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19816 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
19817 skip "Need MDS version at least 2.11.56"
19819 trap cleanup_417 RETURN EXIT
19821 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
19822 do_nodes $(comma_list $(mdts_nodes)) \
19823 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
19824 $LFS migrate -m 0 $DIR/$tdir.1 &&
19825 error "migrate dir $tdir.1 should fail"
19827 do_nodes $(comma_list $(mdts_nodes)) \
19828 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
19829 $LFS mkdir -i 1 $DIR/$tdir.2 &&
19830 error "create remote dir $tdir.2 should fail"
19832 do_nodes $(comma_list $(mdts_nodes)) \
19833 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
19834 $LFS mkdir -c 2 $DIR/$tdir.3 &&
19835 error "create striped dir $tdir.3 should fail"
19838 run_test 417 "disable remote dir, striped dir and dir migration"
19840 # Checks that the outputs of df [-i] and lfs df [-i] match
19842 # usage: check_lfs_df <blocks | inodes> <mountpoint>
19852 [ "$1" == "blocks" ] && inodes= || inodes="-i"
19854 for count in {1..100}; do
19858 # read the lines of interest
19859 df_out=($(df -P $inodes $dir | tail -n +2)) ||
19860 error "df $inodes $dir | tail -n +2 failed"
19861 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
19862 error "lfs df $inodes $dir | grep summary: failed"
19864 # skip first substrings of each output as they are different
19865 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
19866 # compare the remaining fields of the two outputs
19868 for i in {1..5}; do
19869 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
19877 lfs df $inodes $dir
19878 error "df and lfs df $1 output mismatch: " \
19879 "df ${inodes}: ${df_out[*]}, " \
19880 "lfs df ${inodes}: ${lfs_df_out[*]}"
19885 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19887 local dir=$DIR/$tdir
19888 local numfiles=$((RANDOM % 4096 + 2))
19889 local numblocks=$((RANDOM % 256 + 1))
19891 wait_delete_completed
19894 # check block output
19895 check_lfs_df blocks $dir
19896 # check inode output
19897 check_lfs_df inodes $dir
19899 # create a single file and retest
19900 echo "Creating a single file and testing"
19901 createmany -o $dir/$tfile- 1 &>/dev/null ||
19902 error "creating 1 file in $dir failed"
19903 check_lfs_df blocks $dir
19904 check_lfs_df inodes $dir
19906 # create a random number of files
19907 echo "Creating $((numfiles - 1)) files and testing"
19908 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
19909 error "creating $((numfiles - 1)) files in $dir failed"
19911 # write a random number of blocks to the first test file
19912 echo "Writing $numblocks 4K blocks and testing"
19913 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
19914 count=$numblocks &>/dev/null ||
19915 error "dd to $dir/${tfile}-0 failed"
19918 check_lfs_df blocks $dir
19919 check_lfs_df inodes $dir
19921 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
19922 error "unlinking $numfiles files in $dir failed"
19924 run_test 418 "df and lfs df outputs match"
19928 local dir=$DIR/$tdir
19933 cancel_lru_locks mdc
19935 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
19936 $LCTL set_param fail_loc=0x1410
19938 $LCTL set_param fail_loc=0
19941 run_test 419 "Verify open file by name doesn't crash kernel"
19945 [[ $MDS1_VERSION -ge $(version_code 2.12.1) ]] ||
19946 skip "Need MDS version at least 2.12.1"
19948 local SAVE_UMASK=$(umask)
19949 local dir=$DIR/$tdir
19950 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
19954 mkdir -m03777 $dir/testdir
19955 ls -dn $dir/testdir
19956 # Need to remove trailing '.' when SELinux is enabled
19957 local dirperms=$(ls -dn $dir/testdir |
19958 awk '{ sub(/\.$/, "", $1); print $1}')
19959 [ $dirperms == "drwxrwsrwt" ] ||
19960 error "incorrect perms on $dir/testdir"
19962 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
19963 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
19964 ls -n $dir/testdir/testfile
19965 local fileperms=$(ls -n $dir/testdir/testfile |
19966 awk '{ sub(/\.$/, "", $1); print $1}')
19967 [ $fileperms == "-rwxr-xr-x" ] ||
19968 error "incorrect perms on $dir/testdir/testfile"
19972 run_test 420 "clear SGID bit on non-directories for non-members"
19979 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
19980 skip "Need MDS version at least 2.12.2"
19982 test_mkdir $DIR/$tdir
19983 createmany -o $DIR/$tdir/f 3
19984 cnt=$(ls -1 $DIR/$tdir | wc -l)
19985 [ $cnt != 3 ] && error "unexpected #files: $cnt"
19987 fid1=$(lfs path2fid $DIR/$tdir/f1)
19988 fid2=$(lfs path2fid $DIR/$tdir/f2)
19989 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
19991 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
19992 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
19994 cnt=$(ls -1 $DIR/$tdir | wc -l)
19995 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
19997 rm -f $DIR/$tdir/f3 || error "can't remove f3"
19998 createmany -o $DIR/$tdir/f 3
19999 cnt=$(ls -1 $DIR/$tdir | wc -l)
20000 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20002 fid1=$(lfs path2fid $DIR/$tdir/f1)
20003 fid2=$(lfs path2fid $DIR/$tdir/f2)
20004 echo "remove using fsname $FSNAME"
20005 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
20007 cnt=$(ls -1 $DIR/$tdir | wc -l)
20008 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20010 run_test 421a "simple rm by fid"
20017 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20018 skip "Need MDS version at least 2.12.2"
20020 test_mkdir $DIR/$tdir
20021 createmany -o $DIR/$tdir/f 3
20022 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
20025 FID1=$(lfs path2fid $DIR/$tdir/f1)
20026 FID2=$(lfs path2fid $DIR/$tdir/f2)
20027 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
20029 kill -USR1 $MULTIPID
20032 cnt=$(ls $DIR/$tdir | wc -l)
20033 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
20035 run_test 421b "rm by fid on open file"
20041 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20042 skip "Need MDS version at least 2.12.2"
20044 test_mkdir $DIR/$tdir
20045 createmany -o $DIR/$tdir/f 3
20046 touch $DIR/$tdir/$tfile
20047 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
20048 cnt=$(ls -1 $DIR/$tdir | wc -l)
20049 [ $cnt != 184 ] && error "unexpected #files: $cnt"
20051 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
20052 $LFS rmfid $DIR $FID1 || error "rmfid failed"
20054 cnt=$(ls $DIR/$tdir | wc -l)
20055 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
20057 run_test 421c "rm by fid against hardlinked files"
20063 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20064 skip "Need MDS version at least 2.12.2"
20066 test_mkdir $DIR/$tdir
20067 createmany -o $DIR/$tdir/f 4097
20068 cnt=$(ls -1 $DIR/$tdir | wc -l)
20069 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
20071 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
20072 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20074 cnt=$(ls $DIR/$tdir | wc -l)
20076 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20078 run_test 421d "rmfid en masse"
20084 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20085 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20086 skip "Need MDS version at least 2.12.2"
20088 mkdir -p $DIR/$tdir
20089 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20090 createmany -o $DIR/$tdir/striped_dir/f 512
20091 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20092 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20094 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20095 sed "s/[/][^:]*://g")
20096 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20098 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20100 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20102 run_test 421e "rmfid in DNE"
20108 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20109 skip "Need MDS version at least 2.12.2"
20111 test_mkdir $DIR/$tdir
20113 cnt=$(ls -1 $DIR/$tdir | wc -l)
20114 [ $cnt != 1 ] && error "unexpected #files: $cnt"
20116 FID=$(lfs path2fid $DIR/$tdir/f)
20117 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
20118 # rmfid should fail
20119 cnt=$(ls -1 $DIR/$tdir | wc -l)
20120 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
20122 chmod a+rw $DIR/$tdir
20124 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
20125 # rmfid should fail
20126 cnt=$(ls -1 $DIR/$tdir | wc -l)
20127 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
20130 $RUNAS touch $DIR/$tdir/f
20131 FID=$(lfs path2fid $DIR/$tdir/f)
20132 echo "rmfid as root"
20133 $LFS rmfid $DIR $FID || error "rmfid as root failed"
20134 cnt=$(ls -1 $DIR/$tdir | wc -l)
20135 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
20138 $RUNAS touch $DIR/$tdir/f
20139 cnt=$(ls -1 $DIR/$tdir | wc -l)
20140 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
20141 FID=$(lfs path2fid $DIR/$tdir/f)
20142 # rmfid w/o user_fid2path mount option should fail
20143 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
20144 cnt=$(ls -1 $DIR/$tdir | wc -l)
20145 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
20147 umount_client $MOUNT || "failed to umount client"
20148 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
20149 "failed to mount client'"
20151 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
20152 # rmfid should succeed
20153 cnt=$(ls -1 $DIR/$tdir | wc -l)
20154 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
20156 # rmfid shouldn't allow to remove files due to dir's permission
20157 chmod a+rwx $DIR/$tdir
20160 FID=$(lfs path2fid $DIR/$tdir/f)
20161 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
20163 umount_client $MOUNT || "failed to umount client"
20164 mount_client $MOUNT "$MOUNT_OPTS" ||
20165 "failed to mount client'"
20168 run_test 421f "rmfid checks permissions"
20174 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20175 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20176 skip "Need MDS version at least 2.12.2"
20178 mkdir -p $DIR/$tdir
20179 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20180 createmany -o $DIR/$tdir/striped_dir/f 512
20181 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20182 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20184 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20185 sed "s/[/][^:]*://g")
20187 rm -f $DIR/$tdir/striped_dir/f1*
20188 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20189 removed=$((512 - cnt))
20191 # few files have been just removed, so we expect
20192 # rmfid to fail on their fids
20193 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
20194 [ $removed != $errors ] && error "$errors != $removed"
20196 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20198 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20200 run_test 421g "rmfid to return errors properly"
20203 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20204 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20205 skip "Need server version at least 2.9.55"
20207 start_full_debug_logging
20211 stop_full_debug_logging
20215 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20216 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20217 awk '/The barrier for/ { print $7 }')
20220 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
20225 barrier_expired() {
20228 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20229 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20230 awk '/will be expired/ { print $7 }')
20232 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
20241 echo "Start barrier_freeze at: $(date)"
20242 #define OBD_FAIL_BARRIER_DELAY 0x2202
20243 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20244 # Do not reduce barrier time - See LU-11873
20245 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
20248 local b_status=$(barrier_stat)
20249 echo "Got barrier status at: $(date)"
20250 [ "$b_status" = "'freezing_p1'" ] ||
20251 error "(1) unexpected barrier status $b_status"
20253 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20255 b_status=$(barrier_stat)
20256 [ "$b_status" = "'frozen'" ] ||
20257 error "(2) unexpected barrier status $b_status"
20259 local expired=$(barrier_expired)
20260 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
20261 sleep $((expired + 3))
20263 b_status=$(barrier_stat)
20264 [ "$b_status" = "'expired'" ] ||
20265 error "(3) unexpected barrier status $b_status"
20267 # Do not reduce barrier time - See LU-11873
20268 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
20269 error "(4) fail to freeze barrier"
20271 b_status=$(barrier_stat)
20272 [ "$b_status" = "'frozen'" ] ||
20273 error "(5) unexpected barrier status $b_status"
20275 echo "Start barrier_thaw at: $(date)"
20276 #define OBD_FAIL_BARRIER_DELAY 0x2202
20277 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20278 do_facet mgs $LCTL barrier_thaw $FSNAME &
20281 b_status=$(barrier_stat)
20282 echo "Got barrier status at: $(date)"
20283 [ "$b_status" = "'thawing'" ] ||
20284 error "(6) unexpected barrier status $b_status"
20286 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20288 b_status=$(barrier_stat)
20289 [ "$b_status" = "'thawed'" ] ||
20290 error "(7) unexpected barrier status $b_status"
20292 #define OBD_FAIL_BARRIER_FAILURE 0x2203
20293 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
20294 do_facet mgs $LCTL barrier_freeze $FSNAME
20296 b_status=$(barrier_stat)
20297 [ "$b_status" = "'failed'" ] ||
20298 error "(8) unexpected barrier status $b_status"
20300 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
20301 do_facet mgs $LCTL barrier_thaw $FSNAME
20305 run_test 801a "write barrier user interfaces and stat machine"
20310 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20311 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
20312 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
20313 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
20314 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
20316 cancel_lru_locks mdc
20318 # 180 seconds should be long enough
20319 do_facet mgs $LCTL barrier_freeze $FSNAME 180
20321 local b_status=$(barrier_stat)
20322 [ "$b_status" = "'frozen'" ] ||
20323 error "(6) unexpected barrier status $b_status"
20325 mkdir $DIR/$tdir/d0/d10 &
20328 touch $DIR/$tdir/d1/f13 &
20331 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
20334 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
20337 rm -f $DIR/$tdir/d4/f12 &
20340 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
20342 # To guarantee taht the 'stat' is not blocked
20343 b_status=$(barrier_stat)
20344 [ "$b_status" = "'frozen'" ] ||
20345 error "(8) unexpected barrier status $b_status"
20347 # let above commands to run at background
20350 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
20351 ps -p $touch_pid || error "(10) touch should be blocked"
20352 ps -p $ln_pid || error "(11) link should be blocked"
20353 ps -p $mv_pid || error "(12) rename should be blocked"
20354 ps -p $rm_pid || error "(13) unlink should be blocked"
20356 b_status=$(barrier_stat)
20357 [ "$b_status" = "'frozen'" ] ||
20358 error "(14) unexpected barrier status $b_status"
20360 do_facet mgs $LCTL barrier_thaw $FSNAME
20361 b_status=$(barrier_stat)
20362 [ "$b_status" = "'thawed'" ] ||
20363 error "(15) unexpected barrier status $b_status"
20365 wait $mkdir_pid || error "(16) mkdir should succeed"
20366 wait $touch_pid || error "(17) touch should succeed"
20367 wait $ln_pid || error "(18) link should succeed"
20368 wait $mv_pid || error "(19) rename should succeed"
20369 wait $rm_pid || error "(20) unlink should succeed"
20373 run_test 801b "modification will be blocked by write barrier"
20376 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20380 stop mds2 || error "(1) Fail to stop mds2"
20382 do_facet mgs $LCTL barrier_freeze $FSNAME 30
20384 local b_status=$(barrier_stat)
20385 [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || {
20386 do_facet mgs $LCTL barrier_thaw $FSNAME
20387 error "(2) unexpected barrier status $b_status"
20390 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20391 error "(3) Fail to rescan barrier bitmap"
20393 # Do not reduce barrier time - See LU-11873
20394 do_facet mgs $LCTL barrier_freeze $FSNAME 20
20396 b_status=$(barrier_stat)
20397 [ "$b_status" = "'frozen'" ] ||
20398 error "(4) unexpected barrier status $b_status"
20400 do_facet mgs $LCTL barrier_thaw $FSNAME
20401 b_status=$(barrier_stat)
20402 [ "$b_status" = "'thawed'" ] ||
20403 error "(5) unexpected barrier status $b_status"
20405 local devname=$(mdsdevname 2)
20407 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
20409 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20410 error "(7) Fail to rescan barrier bitmap"
20414 run_test 801c "rescan barrier bitmap"
20416 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
20417 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
20418 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
20419 saved_MOUNT_OPTS=$MOUNT_OPTS
20425 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
20426 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
20427 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
20428 MOUNT_OPTS=$saved_MOUNT_OPTS
20434 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20435 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20436 skip "Need server version at least 2.9.55"
20438 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
20440 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20442 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
20443 error "(2) Fail to copy"
20445 trap cleanup_802 EXIT
20447 # sync by force before remount as readonly
20448 sync; sync_all_data; sleep 3; sync_all_data
20452 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
20453 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
20454 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
20456 echo "Mount the server as read only"
20457 setupall server_only || error "(3) Fail to start servers"
20459 echo "Mount client without ro should fail"
20460 mount_client $MOUNT &&
20461 error "(4) Mount client without 'ro' should fail"
20463 echo "Mount client with ro should succeed"
20464 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
20465 mount_client $MOUNT ||
20466 error "(5) Mount client with 'ro' should succeed"
20468 echo "Modify should be refused"
20469 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
20471 echo "Read should be allowed"
20472 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
20473 error "(7) Read should succeed under ro mode"
20477 run_test 802 "simulate readonly device"
20480 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20481 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20482 skip "MDS needs to be newer than 2.10.54"
20484 mkdir -p $DIR/$tdir
20485 # Create some objects on all MDTs to trigger related logs objects
20486 for idx in $(seq $MDSCOUNT); do
20487 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
20488 $DIR/$tdir/dir${idx} ||
20489 error "Fail to create $DIR/$tdir/dir${idx}"
20493 wait_delete_completed # ensure old test cleanups are finished
20494 echo "before create:"
20496 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20498 for i in {1..10}; do
20499 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
20500 error "Fail to create $DIR/$tdir/foo$i"
20504 echo "after create:"
20506 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20508 # allow for an llog to be cleaned up during the test
20509 [ $after_used -ge $((before_used + 10 - 1)) ] ||
20510 error "before ($before_used) + 10 > after ($after_used)"
20512 for i in {1..10}; do
20513 rm -rf $DIR/$tdir/foo$i ||
20514 error "Fail to remove $DIR/$tdir/foo$i"
20517 sleep 3 # avoid MDT return cached statfs
20518 wait_delete_completed
20519 echo "after unlink:"
20521 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20523 # allow for an llog to be created during the test
20524 [ $after_used -le $((before_used + 1)) ] ||
20525 error "after ($after_used) > before ($before_used) + 1"
20527 run_test 803 "verify agent object for remote object"
20530 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20531 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20532 skip "MDS needs to be newer than 2.10.54"
20533 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
20535 mkdir -p $DIR/$tdir
20536 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
20537 error "Fail to create $DIR/$tdir/dir0"
20539 local fid=$($LFS path2fid $DIR/$tdir/dir0)
20540 local dev=$(mdsdevname 2)
20542 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20543 grep ${fid} || error "NOT found agent entry for dir0"
20545 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
20546 error "Fail to create $DIR/$tdir/dir1"
20548 touch $DIR/$tdir/dir1/foo0 ||
20549 error "Fail to create $DIR/$tdir/dir1/foo0"
20550 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
20553 for idx in $(seq $MDSCOUNT); do
20554 dev=$(mdsdevname $idx)
20555 do_facet mds${idx} \
20556 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20557 grep ${fid} && rc=$idx
20560 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
20561 error "Fail to rename foo0 to foo1"
20562 if [ $rc -eq 0 ]; then
20563 for idx in $(seq $MDSCOUNT); do
20564 dev=$(mdsdevname $idx)
20565 do_facet mds${idx} \
20566 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20567 grep ${fid} && rc=$idx
20571 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
20572 error "Fail to rename foo1 to foo2"
20573 if [ $rc -eq 0 ]; then
20574 for idx in $(seq $MDSCOUNT); do
20575 dev=$(mdsdevname $idx)
20576 do_facet mds${idx} \
20577 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20578 grep ${fid} && rc=$idx
20582 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
20584 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
20585 error "Fail to link to $DIR/$tdir/dir1/foo2"
20586 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
20587 error "Fail to rename foo2 to foo0"
20588 unlink $DIR/$tdir/dir1/foo0 ||
20589 error "Fail to unlink $DIR/$tdir/dir1/foo0"
20590 rm -rf $DIR/$tdir/dir0 ||
20591 error "Fail to rm $DIR/$tdir/dir0"
20593 for idx in $(seq $MDSCOUNT); do
20594 dev=$(mdsdevname $idx)
20598 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
20600 start mds${idx} $dev $MDS_MOUNT_OPTS ||
20601 error "mount mds$idx failed"
20602 df $MOUNT > /dev/null 2>&1
20604 # e2fsck should not return error
20606 error "e2fsck detected error on MDT${idx}: rc=$rc"
20609 run_test 804 "verify agent entry for remote entry"
20612 do_facet $SINGLEMDS zfs set quota=$old $fsset
20613 unlinkmany $DIR/$tdir/f- 1000000
20618 local zfs_version=$(do_node $SINGLEMDS cat /sys/module/zfs/version)
20619 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
20620 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
20621 skip "netfree not implemented before 0.7"
20622 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
20623 skip "Need MDS version at least 2.10.57"
20630 local pref="osd-zfs.lustre-MDT0000."
20632 # limit available space on MDS dataset to meet nospace issue
20633 # quickly. then ZFS 0.7.2 can use reserved space if asked
20634 # properly (using netfree flag in osd_declare_destroy()
20635 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
20636 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
20638 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
20639 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
20640 let "usedkb=usedkb-freekb"
20641 let "freekb=freekb/2"
20642 if let "freekb > 5000"; then
20645 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
20646 trap cleanup_805 EXIT
20648 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
20649 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
20650 rm -rf $DIR/$tdir || error "not able to remove"
20651 do_facet $SINGLEMDS zfs set quota=$old $fsset
20654 run_test 805 "ZFS can remove from full fs"
20660 local size=$($LFS getsom -s $file)
20661 local expect=$(stat -c %s $file)
20663 [[ $size == $expect ]] ||
20664 error "$file expected size: $expect, got: $size"
20666 local blocks=$($LFS getsom -b $file)
20667 expect=$(stat -c %b $file)
20668 [[ $blocks == $expect ]] ||
20669 error "$file expected blocks: $expect, got: $blocks"
20674 local size=$($LFS getsom -s $1)
20677 [[ $size == $expect ]] ||
20678 error "$file expected size: $expect, got: $size"
20682 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
20683 skip "Need MDS version at least 2.11.52"
20687 touch $DIR/$tfile || error "touch $tfile failed"
20689 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
20690 save_lustre_params client "llite.*.xattr_cache" > $save
20691 lctl set_param llite.*.xattr_cache=0
20692 stack_trap "restore_lustre_params < $save" EXIT
20694 # single-threaded write
20695 echo "Test SOM for single-threaded write"
20696 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
20697 error "write $tfile failed"
20698 check_lsom_size $DIR/$tfile $bs
20701 local size=$(($num * $bs))
20705 echo "Test SOM for single client multi-threaded($num) write"
20706 $TRUNCATE $DIR/$tfile 0
20707 for ((i = 0; i < $num; i++)); do
20708 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
20710 offset=$((offset + $bs))
20712 for (( i=0; i < $num; i++ )); do
20715 check_lsom_size $DIR/$tfile $size
20717 $TRUNCATE $DIR/$tfile 0
20718 for ((i = 0; i < $num; i++)); do
20719 offset=$((offset - $bs))
20720 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
20723 for (( i=0; i < $num; i++ )); do
20726 check_lsom_size $DIR/$tfile $size
20728 # multi-client writes
20729 num=$(get_node_count ${CLIENTS//,/ })
20730 size=$(($num * $bs))
20734 echo "Test SOM for multi-client ($num) writes"
20735 $TRUNCATE $DIR/$tfile 0
20736 for client in ${CLIENTS//,/ }; do
20737 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
20740 offset=$((offset + $bs))
20742 for (( i=0; i < $num; i++ )); do
20745 check_lsom_size $DIR/$tfile $offset
20748 $TRUNCATE $DIR/$tfile 0
20749 for client in ${CLIENTS//,/ }; do
20750 offset=$((offset - $bs))
20751 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
20755 for (( i=0; i < $num; i++ )); do
20758 check_lsom_size $DIR/$tfile $size
20761 echo "Test SOM for truncate"
20762 $TRUNCATE $DIR/$tfile 1048576
20763 check_lsom_size $DIR/$tfile 1048576
20764 $TRUNCATE $DIR/$tfile 1234
20765 check_lsom_size $DIR/$tfile 1234
20767 # verify SOM blocks count
20768 echo "Verify SOM block count"
20769 $TRUNCATE $DIR/$tfile 0
20770 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
20771 error "failed to write file $tfile"
20772 check_lsom_data $DIR/$tfile
20774 run_test 806 "Verify Lazy Size on MDS"
20777 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
20778 skip "Need MDS version at least 2.11.52"
20780 # Registration step
20781 changelog_register || error "changelog_register failed"
20782 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
20783 changelog_users $SINGLEMDS | grep -q $cl_user ||
20784 error "User $cl_user not found in changelog_users"
20786 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
20787 save_lustre_params client "llite.*.xattr_cache" > $save
20788 lctl set_param llite.*.xattr_cache=0
20789 stack_trap "restore_lustre_params < $save" EXIT
20791 rm -rf $DIR/$tdir || error "rm $tdir failed"
20792 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
20793 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
20794 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
20795 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
20796 error "truncate $tdir/trunc failed"
20799 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
20800 error "write $tfile failed"
20802 # multi-client wirtes
20803 local num=$(get_node_count ${CLIENTS//,/ })
20807 echo "Test SOM for multi-client ($num) writes"
20808 touch $DIR/$tfile || error "touch $tfile failed"
20809 $TRUNCATE $DIR/$tfile 0
20810 for client in ${CLIENTS//,/ }; do
20811 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
20814 offset=$((offset + $bs))
20816 for (( i=0; i < $num; i++ )); do
20821 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
20822 check_lsom_data $DIR/$tdir/trunc
20823 check_lsom_data $DIR/$tdir/single_dd
20824 check_lsom_data $DIR/$tfile
20827 # Deregistration step
20828 changelog_deregister || error "changelog_deregister failed"
20830 run_test 807 "verify LSOM syncing tool"
20832 check_som_nologged()
20834 local lines=$($LFS changelog $FSNAME-MDT0000 |
20835 grep 'x=trusted.som' | wc -l)
20836 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
20840 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
20841 skip "Need MDS version at least 2.11.55"
20843 # Registration step
20844 changelog_register || error "changelog_register failed"
20846 touch $DIR/$tfile || error "touch $tfile failed"
20849 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
20850 error "write $tfile failed"
20853 $TRUNCATE $DIR/$tfile 1234
20856 $TRUNCATE $DIR/$tfile 1048576
20859 # Deregistration step
20860 changelog_deregister || error "changelog_deregister failed"
20862 run_test 808 "Check trusted.som xattr not logged in Changelogs"
20867 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
20871 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
20872 skip "Need MDS version at least 2.11.56"
20874 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
20875 error "failed to create DoM-only file $DIR/$tfile"
20876 touch $DIR/$tfile || error "touch $tfile failed"
20877 check_som_nodata $DIR/$tfile
20879 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
20880 error "write $tfile failed"
20881 check_som_nodata $DIR/$tfile
20883 $TRUNCATE $DIR/$tfile 1234
20884 check_som_nodata $DIR/$tfile
20886 $TRUNCATE $DIR/$tfile 4097
20887 check_som_nodata $DIR/$file
20889 run_test 809 "Verify no SOM xattr store for DoM-only files"
20892 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20893 $GSS && skip_env "could not run with gss"
20896 stack_trap "set_checksums $ORIG_CSUM" EXIT
20897 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
20902 for csum in $CKSUM_TYPES; do
20903 #define OBD_FAIL_OSC_NO_GRANT 0x411
20904 $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411
20905 for i in "10240 0" "10000 0" "4000 1" "500 1"; do
20907 dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2
20908 before=$(md5sum $DIR/$tfile)
20909 $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear
20910 after=$(md5sum $DIR/$tfile)
20911 [ "$before" == "$after" ] ||
20912 error "$csum: $before != $after bs=$1 seek=$2"
20916 run_test 810 "partial page writes on ZFS (LU-11663)"
20919 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
20920 skip "Need MDS version at least 2.11.56"
20922 #define OBD_FAIL_MDS_ORPHAN_DELETE 0x165
20923 do_facet mds1 $LCTL set_param fail_loc=0x165
20924 $MULTIOP $DIR/$tfile Ouc || error "multiop failed"
20927 start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
20930 [[ $(do_facet mds1 pgrep orph_.*-MDD | wc -l) -eq 0 ]] ||
20931 error "MDD orphan cleanup thread not quit"
20933 run_test 811 "orphan name stub can be cleaned up in startup"
20936 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
20937 skip "OST < 2.12.51 doesn't support this fail_loc"
20938 [ "$SHARED_KEY" = true ] &&
20939 skip "OSC connections never go IDLE with Shared-Keys enabled"
20941 $LFS setstripe -c 1 -i 0 $DIR/$tfile
20942 # ensure ost1 is connected
20943 stat $DIR/$tfile >/dev/null || error "can't stat"
20944 wait_osc_import_state client ost1 FULL
20945 # no locks, no reqs to let the connection idle
20946 cancel_lru_locks osc
20948 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
20949 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
20950 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
20951 wait_osc_import_state client ost1 CONNECTING
20952 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
20954 stat $DIR/$tfile >/dev/null || error "can't stat file"
20956 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
20960 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
20961 echo -n y >> $DIR/$tfile
20962 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
20963 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
20965 run_test 814 "sparse cp works as expected (LU-12361)"
20969 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
20970 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
20972 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
20975 [ "$SHARED_KEY" = true ] &&
20976 skip "OSC connections never go IDLE with Shared-Keys enabled"
20978 $LFS setstripe -c 1 -i 0 $DIR/$tfile
20979 # ensure ost1 is connected
20980 stat $DIR/$tfile >/dev/null || error "can't stat"
20981 wait_osc_import_state client ost1 FULL
20982 # no locks, no reqs to let the connection idle
20983 cancel_lru_locks osc
20984 lru_resize_disable osc
20987 before=$($LCTL get_param -n \
20988 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
20990 wait_osc_import_state client ost1 IDLE
20991 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
20992 now=$($LCTL get_param -n \
20993 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
20994 [ $before == $now ] || error "lru_size changed $before != $now"
20996 run_test 816 "do not reset lru_resize on idle reconnect"
21000 exportfs -u localhost:$DIR/nfsexp
21005 systemctl restart nfs-server.service || skip "failed to restart nfsd"
21007 mkdir -p $DIR/nfsexp
21008 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
21009 error "failed to export nfs"
21011 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
21012 stack_trap cleanup_817 EXIT
21014 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
21015 error "failed to mount nfs to $tmpdir"
21017 cp /bin/true $tmpdir
21018 $DIR/nfsexp/true || error "failed to execute 'true' command"
21020 run_test 817 "nfsd won't cache write lock for exec file"
21023 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21024 cancel_lru_locks osc
21025 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21026 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21027 dd if=$DIR/$tfile of=/dev/null bs=1M count=1
21030 run_test 819a "too big niobuf in read"
21033 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21034 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21035 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21036 cancel_lru_locks osc
21040 run_test 819b "too big niobuf in write"
21044 $LFS setstripe -c1 -i0 $DIR/$tfile
21045 $LFS setstripe -c1 -i1 $DIR/$tfile
21047 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
21048 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
21049 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
21050 error "start $SINGLEMDS failed"
21053 run_test 818 "unlink with failed llog"
21056 # tests that do cleanup/setup should be run at the end
21060 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21063 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
21064 $LCTL set_param fail_loc=0x903
21066 cancel_lru_locks MGC
21068 FAIL_ON_ERROR=true cleanup
21069 FAIL_ON_ERROR=true setup
21071 run_test 900 "umount should not race with any mgc requeue thread"
21074 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
21075 check_and_cleanup_lustre
21076 if [ "$I_MOUNTED" != "yes" ]; then
21077 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true