3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
6 # e.g. ONLY="22 23" or ONLY="`seq 32 39`" or EXCEPT="31"
11 # Check Grants after these tests
12 GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c 64d"
17 CREATETEST=${CREATETEST:-createtest}
18 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
19 OPENFILE=${OPENFILE:-openfile}
20 OPENUNLINK=${OPENUNLINK:-openunlink}
21 READS=${READS:-"reads"}
22 MUNLINK=${MUNLINK:-munlink}
23 SOCKETSERVER=${SOCKETSERVER:-socketserver}
24 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
25 MEMHOG=${MEMHOG:-memhog}
26 DIRECTIO=${DIRECTIO:-directio}
27 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
29 CHECK_GRANT=${CHECK_GRANT:-"yes"}
30 GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
31 export PARALLEL=${PARALLEL:-"no"}
34 LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
35 LUSTRE=${LUSTRE:-$(dirname $0)/..}
36 . $LUSTRE/tests/test-framework.sh
41 ALWAYS_EXCEPT="$SANITY_EXCEPT "
42 # bug number for skipped test: LU-9693 LU-6493 LU-9693
43 ALWAYS_EXCEPT+=" 42a 42b 42c "
44 # bug number: LU-8411 LU-9054
45 ALWAYS_EXCEPT+=" 407 312 "
48 # bug number: LU-9795 LU-9795 LU-9795 LU-9795
49 ALWAYS_EXCEPT+=" 17n 60a 133g 300f"
52 selinux_status=$(getenforce)
53 if [ "$selinux_status" != "Disabled" ]; then
58 # skip the grant tests for ARM until they are fixed
59 if [[ $(uname -m) = aarch64 ]]; then
60 # bug number: LU-11596
61 ALWAYS_EXCEPT+=" $GRANT_CHECK_LIST"
62 # bug number: LU-11671 LU-11667
63 ALWAYS_EXCEPT+=" 45 317"
66 # skip nfs tests on kernels >= 4.14.0 until they are fixed
67 if [ $LINUX_VERSION_CODE -ge $(version_code 4.14.0) ]; then
68 # bug number: LU-12661
71 # skip cgroup tests on RHEL8.1 kernels until they are fixed
72 if (( $LINUX_VERSION_CODE >= $(version_code 4.18.0) &&
73 $LINUX_VERSION_CODE < $(version_code 5.4.0) )); then
74 # bug number: LU-13063
79 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 135 136 300o"
81 if [ "$mds1_FSTYPE" = "zfs" ]; then
82 # bug number for skipped test:
83 ALWAYS_EXCEPT="$ALWAYS_EXCEPT "
85 [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
88 # Get the SLES distro version
90 # Returns a version string that should only be used in comparing
91 # strings returned by version_code()
94 local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2)
96 # All SuSE Linux versions have one decimal. version_code expects two
97 local sles_version=$version.0
98 version_code $sles_version
101 # Check if we are running on Ubuntu or SLES so we can make decisions on
103 if [ -r /etc/SuSE-release ]; then
104 sles_version=$(sles_version_code)
105 [ $sles_version -lt $(version_code 11.4.0) ] &&
106 # bug number for skipped test: LU-4341
107 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170"
108 [ $sles_version -lt $(version_code 12.0.0) ] &&
109 # bug number for skipped test: LU-3703
110 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234"
111 elif [ -r /etc/os-release ]; then
112 if grep -qi ubuntu /etc/os-release; then
113 ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
114 -e 's/^VERSION=//p' \
118 if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
119 # bug number for skipped test:
121 ALWAYS_EXCEPT+=" 103a 410"
131 pgrep ll_sa > /dev/null && { echo "There are ll_sa thread not exit!"; exit 20; }
132 cleanupall ${FORCE} $* || { echo "FAILed to clean up"; exit 20; }
141 check_swap_layouts_support()
143 $LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
144 skip "Does not support layout lock."
147 check_and_setup_lustre
151 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
153 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
154 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
155 rm -rf $DIR/[Rdfs][0-9]*
157 # $RUNAS_ID may get set incorrectly somewhere else
158 [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] &&
159 error "\$RUNAS_ID set to 0, but \$UID is also 0!"
161 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
163 if [ "${ONLY}" = "MOUNT" ] ; then
164 echo "Lustre is up, please go on"
168 echo "preparing for tests involving mounts"
169 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
171 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
172 echo # add a newline after mke2fs.
176 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
177 lctl set_param debug=-1 2> /dev/null || true
180 $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
182 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
184 run_test 0a "touch; rm ====================="
187 chmod 0755 $DIR || error "chmod 0755 $DIR failed"
188 $CHECKSTAT -p 0755 $DIR || error "$DIR permission is not 0755"
190 run_test 0b "chmod 0755 $DIR ============================="
193 $LCTL get_param mdc.*.import | grep "state: FULL" ||
194 error "import not FULL"
195 $LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" ||
198 run_test 0c "check import proc"
200 test_0d() { # LU-3397
201 [ $MGS_VERSION -lt $(version_code 2.10.57) ] &&
202 skip "proc exports not supported before 2.10.57"
204 local mgs_exp="mgs.MGS.exports"
205 local client_uuid=$($LCTL get_param -n mgc.*.uuid)
207 local exp_client_version
210 local temp_imp=$DIR/$tfile.import
211 local temp_exp=$DIR/$tfile.export
213 # save mgc import file to $temp_imp
214 $LCTL get_param mgc.*.import | tee $temp_imp
215 # Check if client uuid is found in MGS export
216 for exp_client_nid in $(do_facet mgs $LCTL get_param -N $mgs_exp.*); do
217 [ $(do_facet mgs $LCTL get_param -n $exp_client_nid.uuid) == \
221 # save mgs export file to $temp_exp
222 do_facet mgs $LCTL get_param $exp_client_nid.export | tee $temp_exp
224 # Compare the value of field "connect_flags"
225 imp_val=$(grep "connect_flags" $temp_imp)
226 exp_val=$(grep "connect_flags" $temp_exp)
227 [ "$exp_val" == "$imp_val" ] ||
228 error "export flags '$exp_val' != import flags '$imp_val'"
230 # Compare the value of client version
231 exp_client_version=$(awk '/target_version:/ { print $2 }' $temp_exp)
232 exp_val=$(version_code $exp_client_version)
233 imp_val=$CLIENT_VERSION
234 [ "$exp_val" == "$imp_val" ] ||
235 error "export client version '$exp_val' != '$imp_val'"
237 run_test 0d "check export proc ============================="
240 test_mkdir $DIR/$tdir
241 test_mkdir $DIR/$tdir/d2
242 mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
243 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir"
246 $CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed"
248 run_test 1 "mkdir; remkdir; rmdir"
251 test_mkdir $DIR/$tdir
252 touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed"
253 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
255 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed"
257 run_test 2 "mkdir; touch; rmdir; check file"
260 test_mkdir $DIR/$tdir
261 $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
262 touch $DIR/$tdir/$tfile
263 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
265 $CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed"
267 run_test 3 "mkdir; touch; rmdir; check dir"
269 # LU-4471 - failed rmdir on remote directories still removes directory on MDT0
271 test_mkdir -i 1 $DIR/$tdir
273 touch $DIR/$tdir/$tfile ||
274 error "Create file under remote directory failed"
277 error "Expect error removing in-use dir $DIR/$tdir"
279 test -d $DIR/$tdir || error "Remote directory disappeared"
281 rm -rf $DIR/$tdir || error "remove remote dir error"
283 run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
286 test_mkdir $DIR/$tdir
287 test_mkdir $DIR/$tdir/d2
288 chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed"
289 $CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707"
290 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
292 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2"
295 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
296 chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
297 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
298 error "$tfile does not have perm 0666 or UID $UID"
299 $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
300 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
301 error "$tfile should be 0666 and owned by UID $UID"
303 run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
306 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
309 chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
310 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
311 error "$tfile should be owned by UID $RUNAS_ID"
312 $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
313 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
314 error "$tfile should be owned by UID $RUNAS_ID"
316 run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
319 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
322 chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
323 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
324 error "$tfile should be owned by GID $UID"
325 $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
326 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
327 error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
329 run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)"
332 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
334 test_mkdir $DIR/$tdir
335 chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed"
336 $RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
337 chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed"
338 test_mkdir $DIR/$tdir/d/subdir
339 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir ||
340 error "$tdir/d/subdir should be GID $RUNAS_GID"
341 if [[ $MDSCOUNT -gt 1 ]]; then
342 # check remote dir sgid inherite
343 $LFS mkdir -i 0 $DIR/$tdir.local ||
344 error "mkdir $tdir.local failed"
345 chmod g+s $DIR/$tdir.local ||
346 error "chmod $tdir.local failed"
347 chgrp $RUNAS_GID $DIR/$tdir.local ||
348 error "chgrp $tdir.local failed"
349 $LFS mkdir -i 1 $DIR/$tdir.local/$tdir.remote ||
350 error "mkdir $tdir.remote failed"
351 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir.local/$tdir.remote ||
352 error "$tdir.remote should be owned by $UID.$RUNAS_ID"
353 $CHECKSTAT -p 02755 $DIR/$tdir.local/$tdir.remote ||
354 error "$tdir.remote should be mode 02755"
357 run_test 6g "verify new dir in sgid dir inherits group"
359 test_6h() { # bug 7331
360 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
362 touch $DIR/$tfile || error "touch failed"
363 chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile || error "initial chown failed"
364 $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/$tfile &&
365 error "chown $RUNAS_ID:0 $tfile worked as GID $RUNAS_GID"
366 $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile ||
367 error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID"
369 run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)"
372 test_mkdir $DIR/$tdir
373 $MCREATE $DIR/$tdir/$tfile
374 chmod 0666 $DIR/$tdir/$tfile
375 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
376 error "$tdir/$tfile should be mode 0666"
378 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
381 if [ ! -d $DIR/$tdir ]; then
382 test_mkdir $DIR/$tdir
384 $MCREATE $DIR/$tdir/$tfile
385 echo -n foo > $DIR/$tdir/$tfile
386 [ "$(cat $DIR/$tdir/$tfile)" = "foo" ] || error "$tdir/$tfile not 'foo'"
387 $CHECKSTAT -t file -s 3 $DIR/$tdir/$tfile || error "$tfile size not 3"
389 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
392 test_mkdir $DIR/$tdir
393 touch $DIR/$tdir/$tfile
394 chmod 0666 $DIR/$tdir/$tfile
395 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
396 error "$tfile mode not 0666"
398 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
401 test_mkdir $DIR/$tdir
402 test_mkdir $DIR/$tdir/d2
403 test_mkdir $DIR/$tdir/d2/d3
404 $CHECKSTAT -t dir $DIR/$tdir/d2/d3 || error "$tdir/d2/d3 not a dir"
406 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
409 test_mkdir $DIR/$tdir
410 test_mkdir $DIR/$tdir/d2
411 touch $DIR/$tdir/d2/$tfile
412 $CHECKSTAT -t file $DIR/$tdir/d2/$tfile ||
413 error "$tdir/d2/$tfile not a file"
415 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
418 test_mkdir $DIR/$tdir
419 test_mkdir $DIR/$tdir/d2
420 chmod 0666 $DIR/$tdir/d2
421 chmod 0705 $DIR/$tdir/d2
422 $CHECKSTAT -t dir -p 0705 $DIR/$tdir/d2 ||
423 error "$tdir/d2 mode not 0705"
425 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
428 test_mkdir $DIR/$tdir
429 touch $DIR/$tdir/$tfile
430 chmod 0666 $DIR/$tdir/$tfile
431 chmod 0654 $DIR/$tdir/$tfile
432 $CHECKSTAT -t file -p 0654 $DIR/$tdir/$tfile ||
433 error "$tdir/d2 mode not 0654"
435 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
438 test_mkdir $DIR/$tdir
439 dd if=/dev/zero of=$DIR/$tdir/$tfile count=10
441 $CHECKSTAT -t file -s 0 $DIR/$tdir/$tfile ||
442 error "$tdir/$tfile size not 0 after truncate"
444 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
447 test_mkdir $DIR/$tdir
448 touch $DIR/$tdir/$tfile
450 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
452 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
455 test_mkdir $DIR/$tdir
456 touch $DIR/$tdir/$tfile
457 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
458 $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
459 error "$tdir/${tfile_2} not a file after rename"
460 rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
462 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
465 test_mkdir $DIR/$tdir
466 touch $DIR/$tdir/$tfile
467 rm -rf $DIR/$tdir/$tfile
468 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
470 run_test 16 "touch .../d16/f; rm -rf .../d16/f"
473 test_mkdir $DIR/$tdir
474 touch $DIR/$tdir/$tfile
475 ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist
477 $CHECKSTAT -l $DIR/$tdir/$tfile $DIR/$tdir/l-exist ||
478 error "$tdir/l-exist not a symlink"
479 $CHECKSTAT -f -t f $DIR/$tdir/l-exist ||
480 error "$tdir/l-exist not referencing a file"
481 rm -f $DIR/$tdir/l-exist
482 $CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed"
484 run_test 17a "symlinks: create, remove (real)"
487 test_mkdir $DIR/$tdir
488 ln -s no-such-file $DIR/$tdir/l-dangle
490 $CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle ||
491 error "$tdir/l-dangle not referencing no-such-file"
492 $CHECKSTAT -fa $DIR/$tdir/l-dangle ||
493 error "$tdir/l-dangle not referencing non-existent file"
494 rm -f $DIR/$tdir/l-dangle
495 $CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed"
497 run_test 17b "symlinks: create, remove (dangling)"
499 test_17c() { # bug 3440 - don't save failed open RPC for replay
500 test_mkdir $DIR/$tdir
501 ln -s foo $DIR/$tdir/$tfile
502 cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true
504 run_test 17c "symlinks: open dangling (should return error)"
507 test_mkdir $DIR/$tdir
508 ln -s foo $DIR/$tdir/$tfile
509 touch $DIR/$tdir/$tfile || error "creating to new symlink"
511 run_test 17d "symlinks: create dangling"
514 test_mkdir $DIR/$tdir
515 local foo=$DIR/$tdir/$tfile
516 ln -s $foo $foo || error "create symlink failed"
517 ls -l $foo || error "ls -l failed"
518 ls $foo && error "ls not failed" || true
520 run_test 17e "symlinks: create recursive symlink (should return error)"
523 test_mkdir $DIR/$tdir
524 ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
525 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
526 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
527 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
528 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
529 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
532 run_test 17f "symlinks: long and very long symlink name"
534 # str_repeat(S, N) generate a string that is string S repeated N times
539 while [ $((n -= 1)) -ge 0 ]; do
545 # Long symlinks and LU-2241
547 test_mkdir $DIR/$tdir
548 local TESTS="59 60 61 4094 4095"
550 # Fix for inode size boundary in 2.1.4
551 [ $MDS1_VERSION -lt $(version_code 2.1.4) ] &&
554 # Patch not applied to 2.2 or 2.3 branches
555 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
556 [ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
560 local SYMNAME=$(str_repeat 'x' $i)
561 ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
562 readlink $DIR/$tdir/f$i || error "failed $i-char readlink"
565 run_test 17g "symlinks: really long symlink name and inode boundaries"
567 test_17h() { #bug 17378
568 [ $PARALLEL == "yes" ] && skip "skip parallel run"
569 remote_mds_nodsh && skip "remote MDS with nodsh"
573 test_mkdir $DIR/$tdir
574 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
575 $LFS setstripe -c -1 $DIR/$tdir
576 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
577 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
578 touch $DIR/$tdir/$tfile || true
580 run_test 17h "create objects: lov_free_memmd() doesn't lbug"
582 test_17i() { #bug 20018
583 [ $PARALLEL == "yes" ] && skip "skip parallel run"
584 remote_mds_nodsh && skip "remote MDS with nodsh"
586 local foo=$DIR/$tdir/$tfile
589 test_mkdir -c1 $DIR/$tdir
590 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
591 ln -s $foo $foo || error "create symlink failed"
592 #define OBD_FAIL_MDS_READLINK_EPROTO 0x143
593 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000143
594 ls -l $foo && error "error not detected"
597 run_test 17i "don't panic on short symlink (should return error)"
599 test_17k() { #bug 22301
600 [ $PARALLEL == "yes" ] && skip "skip parallel run"
601 [[ -z "$(which rsync 2>/dev/null)" ]] &&
602 skip "no rsync command"
603 rsync --help | grep -q xattr ||
604 skip_env "$(rsync --version | head -n1) does not support xattrs"
605 test_mkdir $DIR/$tdir
606 test_mkdir $DIR/$tdir.new
607 touch $DIR/$tdir/$tfile
608 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
609 rsync -av -X $DIR/$tdir/ $DIR/$tdir.new ||
610 error "rsync failed with xattrs enabled"
612 run_test 17k "symlinks: rsync with xattrs enabled"
614 test_17l() { # LU-279
615 [[ -z "$(which getfattr 2>/dev/null)" ]] &&
616 skip "no getfattr command"
618 test_mkdir $DIR/$tdir
619 touch $DIR/$tdir/$tfile
620 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
621 for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
622 # -h to not follow symlinks. -m '' to list all the xattrs.
623 # grep to remove first line: '# file: $path'.
624 for xattr in `getfattr -hm '' $path 2>/dev/null | grep -v '^#'`;
626 lgetxattr_size_check $path $xattr ||
627 error "lgetxattr_size_check $path $xattr failed"
631 run_test 17l "Ensure lgetxattr's returned xattr size is consistent"
635 [ $PARALLEL == "yes" ] && skip "skip parallel run"
636 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
637 remote_mds_nodsh && skip "remote MDS with nodsh"
638 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
639 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
640 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
642 local short_sym="0123456789"
643 local wdir=$DIR/$tdir
648 # create a long symlink file
649 for ((i = 0; i < 4; ++i)); do
650 long_sym=${long_sym}${long_sym}
653 echo "create 512 short and long symlink files under $wdir"
654 for ((i = 0; i < 256; ++i)); do
655 ln -sf ${long_sym}"a5a5" $wdir/long-$i
656 ln -sf ${short_sym}"a5a5" $wdir/short-$i
662 wait_delete_completed
664 echo "recreate the 512 symlink files with a shorter string"
665 for ((i = 0; i < 512; ++i)); do
666 # rewrite the symlink file with a shorter string
667 ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed"
668 ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed"
671 local mds_index=$(($($LFS getstripe -m $wdir) + 1))
672 local devname=$(mdsdevname $mds_index)
674 echo "stop and checking mds${mds_index}:"
675 # e2fsck should not return error
677 run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
680 start mds${mds_index} $devname $MDS_MOUNT_OPTS ||
681 error "start mds${mds_index} failed"
682 df $MOUNT > /dev/null 2>&1
684 error "e2fsck detected error for short/long symlink: rc=$rc"
687 run_test 17m "run e2fsck against MDT which contains short/long symlink"
689 check_fs_consistency_17n() {
693 # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
694 # so it only check MDT1/MDT2 instead of all of MDTs.
695 for mdt_index in 1 2; do
696 local devname=$(mdsdevname $mdt_index)
697 # e2fsck should not return error
699 run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
702 start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
703 error "mount mds$mdt_index failed"
704 df $MOUNT > /dev/null 2>&1
710 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
711 [ $PARALLEL == "yes" ] && skip "skip parallel run"
712 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
713 remote_mds_nodsh && skip "remote MDS with nodsh"
714 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
715 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
716 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
720 test_mkdir $DIR/$tdir
721 for ((i=0; i<10; i++)); do
722 $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
723 error "create remote dir error $i"
724 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
725 error "create files under remote dir failed $i"
728 check_fs_consistency_17n ||
729 error "e2fsck report error after create files under remote dir"
731 for ((i = 0; i < 10; i++)); do
732 rm -rf $DIR/$tdir/remote_dir_${i} ||
733 error "destroy remote dir error $i"
736 check_fs_consistency_17n ||
737 error "e2fsck report error after unlink files under remote dir"
739 [ $MDS1_VERSION -lt $(version_code 2.4.50) ] &&
740 skip "lustre < 2.4.50 does not support migrate mv"
742 for ((i = 0; i < 10; i++)); do
743 mkdir -p $DIR/$tdir/remote_dir_${i}
744 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
745 error "create files under remote dir failed $i"
746 $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
747 error "migrate remote dir error $i"
749 check_fs_consistency_17n || error "e2fsck report error after migration"
751 for ((i = 0; i < 10; i++)); do
752 rm -rf $DIR/$tdir/remote_dir_${i} ||
753 error "destroy remote dir error $i"
756 check_fs_consistency_17n || error "e2fsck report error after unlink"
758 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
761 remote_mds_nodsh && skip "remote MDS with nodsh"
762 [ $MDS1_VERSION -lt $(version_code 2.3.64) ] &&
763 skip "Need MDS version at least 2.3.64"
765 local wdir=$DIR/${tdir}o
771 mdt_index=$($LFS getstripe -m $wdir/$tfile)
772 mdt_index=$((mdt_index + 1))
775 #fail mds will wait the failover finish then set
776 #following fail_loc to avoid interfer the recovery process.
779 #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
780 do_facet mds${mdt_index} lctl set_param fail_loc=0x194
781 ls -l $wdir/$tfile && rc=1
782 do_facet mds${mdt_index} lctl set_param fail_loc=0
783 [[ $rc -eq 0 ]] || error "stat file should fail"
785 run_test 17o "stat file with incompat LMA feature"
788 touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
789 ls $DIR || error "Failed to ls $DIR: $?"
791 run_test 18 "touch .../f ; ls ... =============================="
797 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
799 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
802 ls -l $DIR/$tfile && error "ls -l $tfile failed"|| true
804 run_test 19b "ls -l .../f19 (should return error) =============="
807 [ $RUNAS_ID -eq $UID ] &&
808 skip_env "RUNAS_ID = UID = $UID -- skipping"
810 $RUNAS touch $DIR/$tfile && error "create non-root file failed" || true
812 run_test 19c "$RUNAS touch .../f19 (should return error) =="
815 cat $DIR/f19 && error || true
817 run_test 19d "cat .../f19 (should return error) =============="
826 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
828 run_test 20 "touch .../f ; ls -l ..."
831 test_mkdir $DIR/$tdir
832 [ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle
833 ln -s dangle $DIR/$tdir/link
834 echo foo >> $DIR/$tdir/link
835 cat $DIR/$tdir/dangle
836 $CHECKSTAT -t link $DIR/$tdir/link || error "$tdir/link not a link"
837 $CHECKSTAT -f -t file $DIR/$tdir/link ||
838 error "$tdir/link not linked to a file"
840 run_test 21 "write to dangling link"
843 local wdir=$DIR/$tdir
845 chown $RUNAS_ID:$RUNAS_GID $wdir
846 (cd $wdir || error "cd $wdir failed";
847 $RUNAS tar cf - /etc/hosts /etc/sysconfig/network |
849 ls -lR $wdir/etc || error "ls -lR $wdir/etc failed"
850 $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed"
851 $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc ||
852 error "checkstat -u failed"
854 run_test 22 "unpack tar archive as non-root user"
858 test_mkdir $DIR/$tdir
859 local file=$DIR/$tdir/$tfile
861 openfile -f O_CREAT:O_EXCL $file || error "$file create failed"
862 openfile -f O_CREAT:O_EXCL $file &&
863 error "$file recreate succeeded" || true
865 run_test 23a "O_CREAT|O_EXCL in subdir"
867 test_23b() { # bug 18988
868 test_mkdir $DIR/$tdir
869 local file=$DIR/$tdir/$tfile
872 echo foo > $file || error "write filed"
873 echo bar >> $file || error "append filed"
874 $CHECKSTAT -s 8 $file || error "wrong size"
877 run_test 23b "O_APPEND check"
879 # LU-9409, size with O_APPEND and tiny writes
881 local file=$DIR/$tfile
884 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800
885 $CHECKSTAT -s 6400 $file || error "wrong size, expected 6400"
889 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
890 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
892 $CHECKSTAT -s 12800 $file || error "wrong size, expected 12800"
895 #racing tiny & normal writes
896 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4096 count=4 &
897 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=100 &
899 $CHECKSTAT -s 17184 $file || error "wrong size, expected 17184"
902 #racing tiny & normal writes 2, ugly numbers
903 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4099 count=11 &
904 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=17 count=173 &
906 $CHECKSTAT -s 48030 $file || error "wrong size, expected 48030"
909 run_test 23c "O_APPEND size checks for tiny writes"
911 # LU-11069 file offset is correct after appending writes
913 local file=$DIR/$tfile
916 echo CentaurHauls > $file
917 offset=$($MULTIOP $file oO_WRONLY:O_APPEND:w13Zp)
918 if ((offset != 26)); then
919 error "wrong offset, expected 26, got '$offset'"
922 run_test 23d "file offset is correct after appending writes"
926 echo '-- same directory rename'
927 test_mkdir $DIR/$tdir
928 touch $DIR/$tdir/$tfile.1
929 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
930 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
932 run_test 24a "rename file to non-existent target"
935 test_mkdir $DIR/$tdir
936 touch $DIR/$tdir/$tfile.{1,2}
937 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
938 $CHECKSTAT -a $DIR/$tdir/$tfile.1 || error "$tfile.1 exists"
939 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
941 run_test 24b "rename file to existing target"
944 test_mkdir $DIR/$tdir
945 test_mkdir $DIR/$tdir/d$testnum.1
946 mv $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
947 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
948 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
950 run_test 24c "rename directory to non-existent target"
953 test_mkdir -c1 $DIR/$tdir
954 test_mkdir -c1 $DIR/$tdir/d$testnum.1
955 test_mkdir -c1 $DIR/$tdir/d$testnum.2
956 mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
957 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
958 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
960 run_test 24d "rename directory to existing target"
963 echo '-- cross directory renames --'
967 mv $DIR/R5a/f $DIR/R5b/g
968 $CHECKSTAT -a $DIR/R5a/f || error "$DIR/R5a/f exists"
969 $CHECKSTAT -t file $DIR/R5b/g || error "$DIR/R5b/g not file type"
971 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
976 touch $DIR/R6a/f $DIR/R6b/g
977 mv $DIR/R6a/f $DIR/R6b/g
978 $CHECKSTAT -a $DIR/R6a/f || error "$DIR/R6a/f exists"
979 $CHECKSTAT -t file $DIR/R6b/g || error "$DIR/R6b/g not file type"
981 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
986 test_mkdir $DIR/R7a/d
987 mv $DIR/R7a/d $DIR/R7b/e
988 $CHECKSTAT -a $DIR/R7a/d || error "$DIR/R7a/d exists"
989 $CHECKSTAT -t dir $DIR/R7b/e || error "$DIR/R7b/e not dir type"
991 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
994 test_mkdir -c1 $DIR/R8a
995 test_mkdir -c1 $DIR/R8b
996 test_mkdir -c1 $DIR/R8a/d
997 test_mkdir -c1 $DIR/R8b/e
998 mrename $DIR/R8a/d $DIR/R8b/e
999 $CHECKSTAT -a $DIR/R8a/d || error "$DIR/R8a/d exists"
1000 $CHECKSTAT -t dir $DIR/R8b/e || error "$DIR/R8b/e not dir type"
1002 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
1005 echo "-- rename error cases"
1007 test_mkdir $DIR/R9/a
1009 mrename $DIR/R9/f $DIR/R9/a
1010 $CHECKSTAT -t file $DIR/R9/f || error "$DIR/R9/f not file type"
1011 $CHECKSTAT -t dir $DIR/R9/a || error "$DIR/R9/a not dir type"
1012 $CHECKSTAT -a $DIR/R9/a/f || error "$DIR/R9/a/f exists"
1014 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
1018 mrename $DIR/R10/f $DIR/R10/g
1019 $CHECKSTAT -t dir $DIR/R10 || error "$DIR/R10 not dir type"
1020 $CHECKSTAT -a $DIR/R10/f || error "$DIR/R10/f exists"
1021 $CHECKSTAT -a $DIR/R10/g || error "$DIR/R10/g exists"
1023 run_test 24j "source does not exist ============================"
1026 test_mkdir $DIR/R11a
1027 test_mkdir $DIR/R11a/d
1029 mv $DIR/R11a/f $DIR/R11a/d
1030 $CHECKSTAT -a $DIR/R11a/f || error "$DIR/R11a/f exists"
1031 $CHECKSTAT -t file $DIR/R11a/d/f || error "$DIR/R11a/d/f not file type"
1033 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
1035 # bug 2429 - rename foo foo foo creates invalid file
1038 $MULTIOP $f OcNs || error "rename of ${f} to itself failed"
1040 run_test 24l "Renaming a file to itself ========================"
1044 $MULTIOP $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
1045 # on ext3 this does not remove either the source or target files
1046 # though the "expected" operation would be to remove the source
1047 $CHECKSTAT -t file ${f} || error "${f} missing"
1048 $CHECKSTAT -t file ${f}2 || error "${f}2 missing"
1050 run_test 24m "Renaming a file to a hard link to itself ========="
1054 # this stats the old file after it was renamed, so it should fail
1056 $CHECKSTAT ${f} || error "${f} missing"
1058 $CHECKSTAT ${f}.rename || error "${f}.rename missing"
1059 $CHECKSTAT -a ${f} || error "${f} exists"
1061 run_test 24n "Statting the old file after renaming (Posix rename 2)"
1064 test_mkdir $DIR/$tdir
1065 rename_many -s random -v -n 10 $DIR/$tdir
1067 run_test 24o "rename of files during htree split"
1070 test_mkdir $DIR/R12a
1071 test_mkdir $DIR/R12b
1072 DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
1073 mrename $DIR/R12a $DIR/R12b
1074 $CHECKSTAT -a $DIR/R12a || error "$DIR/R12a exists"
1075 $CHECKSTAT -t dir $DIR/R12b || error "$DIR/R12b not dir type"
1076 DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
1077 [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
1079 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
1081 cleanup_multiop_pause() {
1083 kill -USR1 $MULTIPID
1087 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1089 test_mkdir $DIR/R13a
1090 test_mkdir $DIR/R13b
1091 local DIRINO=$(ls -lid $DIR/R13a | awk '{ print $1 }')
1092 multiop_bg_pause $DIR/R13b D_c || error "multiop failed to start"
1095 trap cleanup_multiop_pause EXIT
1096 mrename $DIR/R13a $DIR/R13b
1097 $CHECKSTAT -a $DIR/R13a || error "R13a still exists"
1098 $CHECKSTAT -t dir $DIR/R13b || error "R13b does not exist"
1099 local DIRINO2=$(ls -lid $DIR/R13b | awk '{ print $1 }')
1100 [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
1101 cleanup_multiop_pause
1102 wait $MULTIPID || error "multiop close failed"
1104 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
1106 test_24r() { #bug 3789
1107 test_mkdir $DIR/R14a
1108 test_mkdir $DIR/R14a/b
1109 mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
1110 $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
1111 $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
1113 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
1116 test_mkdir $DIR/R15a
1117 test_mkdir $DIR/R15a/b
1118 test_mkdir $DIR/R15a/b/c
1119 mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
1120 $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
1121 $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
1123 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
1125 test_mkdir $DIR/R16a
1126 test_mkdir $DIR/R16a/b
1127 test_mkdir $DIR/R16a/b/c
1128 mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
1129 $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
1130 $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
1132 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
1134 test_24u() { # bug12192
1135 $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error "multiop failed"
1136 $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
1138 run_test 24u "create stripe file"
1140 simple_cleanup_common() {
1143 [ -z "$DIR" ] || [ -z "$tdir" ] && return 0
1145 local start=$SECONDS
1148 wait_delete_completed
1149 echo "cleanup time $((SECONDS - start))"
1153 max_pages_per_rpc() {
1154 local mdtname="$(printf "MDT%04x" ${1:-0})"
1155 $LCTL get_param -n mdc.*$mdtname*.max_pages_per_rpc
1159 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1161 local nrfiles=${COUNT:-100000}
1162 local fname="$DIR/$tdir/$tfile"
1164 # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
1165 [ "$mds1_FSTYPE" = "zfs" ] && nrfiles=${COUNT:-10000}
1167 test_mkdir "$(dirname $fname)"
1168 # assume MDT0000 has the fewest inodes
1169 local stripes=$($LFS getdirstripe -c $(dirname $fname))
1170 local free_inodes=$(($(mdt_free_inodes 0) * stripes))
1171 [[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
1173 trap simple_cleanup_common EXIT
1175 createmany -m "$fname" $nrfiles
1177 cancel_lru_locks mdc
1178 lctl set_param mdc.*.stats clear
1180 # was previously test_24D: LU-6101
1181 # readdir() returns correct number of entries after cursor reload
1182 local num_ls=$(ls $DIR/$tdir | wc -l)
1183 local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l)
1184 local num_all=$(ls -a $DIR/$tdir | wc -l)
1185 if [ $num_ls -ne $nrfiles ] || [ $num_uniq -ne $nrfiles ] ||
1186 [ $num_all -ne $((nrfiles + 2)) ]; then
1187 error "Expected $nrfiles files, got $num_ls " \
1188 "($num_uniq unique $num_all .&..)"
1190 # LU-5 large readdir
1191 # dirent_size = 32 bytes for sizeof(struct lu_dirent) +
1192 # N bytes for name (len($nrfiles) rounded to 8 bytes) +
1193 # 8 bytes for luda_type (4 bytes rounded to 8 bytes)
1194 # take into account of overhead in lu_dirpage header and end mark in
1195 # each page, plus one in rpc_num calculation.
1196 local dirent_size=$((32 + (${#tfile} | 7) + 1 + 8))
1197 local page_entries=$(((PAGE_SIZE - 24) / dirent_size))
1198 local mdt_idx=$($LFS getdirstripe -i $(dirname $fname))
1199 local rpc_pages=$(max_pages_per_rpc $mdt_idx)
1200 local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
1201 local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
1202 echo "readpages: $mds_readpage rpc_max: $rpc_max"
1203 (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
1204 error "large readdir doesn't take effect: " \
1205 "$mds_readpage should be about $rpc_max"
1207 simple_cleanup_common
1209 run_test 24v "list large directory (test hash collision, b=17560)"
1211 test_24w() { # bug21506
1213 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
1214 dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
1215 dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
1216 SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
1217 [[ "$SZ1" -eq "$SZ2" ]] ||
1218 error "Error reading at the end of the file $tfile"
1220 run_test 24w "Reading a file larger than 4Gb"
1223 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1224 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1225 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1226 skip "Need MDS version at least 2.7.56"
1229 local remote_dir=$DIR/$tdir/remote_dir
1231 test_mkdir $DIR/$tdir
1232 $LFS mkdir -i $MDTIDX $remote_dir ||
1233 error "create remote directory failed"
1235 test_mkdir $DIR/$tdir/src_dir
1236 touch $DIR/$tdir/src_file
1237 test_mkdir $remote_dir/tgt_dir
1238 touch $remote_dir/tgt_file
1240 mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
1241 error "rename dir cross MDT failed!"
1243 mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
1244 error "rename file cross MDT failed!"
1246 touch $DIR/$tdir/ln_file
1247 ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
1248 error "ln file cross MDT failed"
1250 rm -rf $DIR/$tdir || error "Can not delete directories"
1252 run_test 24x "cross MDT rename/link"
1255 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1256 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1258 local remote_dir=$DIR/$tdir/remote_dir
1261 test_mkdir $DIR/$tdir
1262 $LFS mkdir -i $mdtidx $remote_dir ||
1263 error "create remote directory failed"
1265 test_mkdir $remote_dir/src_dir
1266 touch $remote_dir/src_file
1267 test_mkdir $remote_dir/tgt_dir
1268 touch $remote_dir/tgt_file
1270 mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
1271 error "rename subdir in the same remote dir failed!"
1273 mrename $remote_dir/src_file $remote_dir/tgt_file ||
1274 error "rename files in the same remote dir failed!"
1276 ln $remote_dir/tgt_file $remote_dir/tgt_file1 ||
1277 error "link files in the same remote dir failed!"
1279 rm -rf $DIR/$tdir || error "Can not delete directories"
1281 run_test 24y "rename/link on the same dir should succeed"
1284 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1285 [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] &&
1286 skip "Need MDS version at least 2.12.51"
1290 for index in 0 1; do
1291 $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed"
1292 touch $DIR/$tdir.0/$tfile.$index || error "touch failed"
1295 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed"
1297 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0)
1298 [ $index -eq 0 ] || error "$tfile.0 is on MDT$index"
1300 local mdts=$(comma_list $(mdts_nodes))
1302 do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0
1303 stack_trap "do_nodes $mdts $LCTL \
1304 set_param mdt.*.enable_remote_rename=1" EXIT
1306 mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed"
1308 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1)
1309 [ $index -eq 1 ] || error "$tfile.1 is on MDT$index"
1311 run_test 24z "cross-MDT rename is done as cp"
1313 test_24A() { # LU-3182
1317 test_mkdir $DIR/$tdir
1318 trap simple_cleanup_common EXIT
1319 createmany -m $DIR/$tdir/$tfile $NFILES
1320 local t=$(ls $DIR/$tdir | wc -l)
1321 local u=$(ls $DIR/$tdir | sort -u | wc -l)
1322 local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
1323 if [ $t -ne $NFILES ] || [ $u -ne $NFILES ] ||
1324 [ $v -ne $((NFILES + 2)) ] ; then
1325 error "Expected $NFILES files, got $t ($u unique $v .&..)"
1328 simple_cleanup_common || error "Can not delete directories"
1330 run_test 24A "readdir() returns correct number of entries."
1332 test_24B() { # LU-4805
1333 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1337 test_mkdir $DIR/$tdir
1338 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
1339 error "create striped dir failed"
1341 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1342 [ $count -eq 2 ] || error "Expected 2, got $count"
1344 touch $DIR/$tdir/striped_dir/a
1346 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1347 [ $count -eq 3 ] || error "Expected 3, got $count"
1349 touch $DIR/$tdir/striped_dir/.f
1351 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1352 [ $count -eq 4 ] || error "Expected 4, got $count"
1354 rm -rf $DIR/$tdir || error "Can not delete directories"
1356 run_test 24B "readdir for striped dir return correct number of entries"
1359 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1365 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
1366 error "create striped dir failed"
1368 cd $DIR/$tdir/d0/striped_dir
1370 local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
1371 local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
1372 local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1374 [ "$d0_ino" = "$parent_ino" ] ||
1375 error ".. wrong, expect $d0_ino, get $parent_ino"
1377 mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
1378 error "mv striped dir failed"
1380 parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1382 [ "$d1_ino" = "$parent_ino" ] ||
1383 error ".. wrong after mv, expect $d1_ino, get $parent_ino"
1385 run_test 24C "check .. in striped dir"
1388 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
1389 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1392 mkdir $DIR/$tdir/src_dir
1393 $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
1394 error "create remote source failed"
1396 touch $DIR/$tdir/src_dir/src_child/a
1398 $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
1399 error "create remote target dir failed"
1401 $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
1402 error "create remote target child failed"
1404 mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
1405 error "rename dir cross MDT failed!"
1409 $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
1410 error "src_child still exists after rename"
1412 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
1413 error "missing file(a) after rename"
1415 rm -rf $DIR/$tdir || error "Can not delete directories"
1417 run_test 24E "cross MDT rename/link"
1420 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
1423 [ "$SLOW" = "no" ] && repeats=100
1427 echo "$repeats repeats"
1428 for ((i = 0; i < repeats; i++)); do
1429 $LFS mkdir -i0 -c2 $DIR/$tdir/test || error "mkdir fails"
1430 touch $DIR/$tdir/test/a || error "touch fails"
1431 mkdir $DIR/$tdir/test/b || error "mkdir fails"
1432 rm -rf $DIR/$tdir/test || error "rmdir fails"
1437 run_test 24F "hash order vs readdir (LU-11330)"
1440 echo '== symlink sanity ============================================='
1444 touch $DIR/s25/foo ||
1445 error "File creation in symlinked directory failed"
1447 run_test 25a "create file in symlinked directory ==============="
1450 [ ! -d $DIR/d25 ] && test_25a
1451 $CHECKSTAT -t file $DIR/s25/foo || error "$DIR/s25/foo not file type"
1453 run_test 25b "lookup file in symlinked directory ==============="
1457 test_mkdir $DIR/d26/d26-2
1458 ln -s d26/d26-2 $DIR/s26
1459 touch $DIR/s26/foo || error "File creation failed"
1461 run_test 26a "multiple component symlink ======================="
1464 test_mkdir -p $DIR/$tdir/d26-2
1465 ln -s $tdir/d26-2/foo $DIR/s26-2
1466 touch $DIR/s26-2 || error "File creation failed"
1468 run_test 26b "multiple component symlink at end of lookup ======"
1471 test_mkdir $DIR/d26.2
1472 touch $DIR/d26.2/foo
1473 ln -s d26.2 $DIR/s26.2-1
1474 ln -s s26.2-1 $DIR/s26.2-2
1475 ln -s s26.2-2 $DIR/s26.2-3
1476 chmod 0666 $DIR/s26.2-3/foo
1478 run_test 26c "chain of symlinks"
1480 # recursive symlinks (bug 439)
1482 ln -s d26-3/foo $DIR/d26-3
1484 run_test 26d "create multiple component recursive symlink"
1487 [ ! -h $DIR/d26-3 ] && test_26d
1490 run_test 26e "unlink multiple component recursive symlink"
1492 # recursive symlinks (bug 7022)
1494 test_mkdir $DIR/$tdir
1495 test_mkdir $DIR/$tdir/$tfile
1496 cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed"
1497 test_mkdir -p lndir/bar1
1498 test_mkdir $DIR/$tdir/$tfile/$tfile
1499 cd $tfile || error "cd $tfile failed"
1500 ln -s .. dotdot || error "ln dotdot failed"
1501 ln -s dotdot/lndir lndir || error "ln lndir failed"
1502 cd $DIR/$tdir || error "cd $DIR/$tdir failed"
1503 output=`ls $tfile/$tfile/lndir/bar1`
1504 [ "$output" = bar1 ] && error "unexpected output"
1505 rm -r $tfile || error "rm $tfile failed"
1506 $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
1508 run_test 26f "rm -r of a directory which has recursive symlink"
1511 test_mkdir $DIR/$tdir
1512 $LFS getstripe $DIR/$tdir
1513 $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed"
1514 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1515 cp /etc/hosts $DIR/$tdir/$tfile || error "Can't copy to one stripe file"
1517 run_test 27a "one stripe file"
1520 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1522 test_mkdir $DIR/$tdir
1523 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1524 $LFS getstripe -c $DIR/$tdir/$tfile
1525 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
1526 error "two-stripe file doesn't have two stripes"
1528 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1530 run_test 27b "create and write to two stripe file"
1532 # 27c family tests specific striping, setstripe -o
1534 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1535 test_mkdir -p $DIR/$tdir
1538 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1539 $LFS getstripe -i $DIR/$tdir/$tfile
1540 [ $($LFS getstripe -i $DIR/$tdir/$tfile ) -eq $osts ] ||
1541 error "stripe not on specified OST"
1543 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1545 run_test 27ca "one stripe on specified OST"
1548 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1549 test_mkdir -p $DIR/$tdir
1551 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1552 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1555 # Strip getstripe output to a space separated list of OSTs
1556 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1557 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1558 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1559 error "stripes not on specified OSTs"
1561 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1563 run_test 27cb "two stripes on specified OSTs"
1566 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1567 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
1568 skip "server does not support overstriping"
1570 test_mkdir -p $DIR/$tdir
1572 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1573 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1576 # Strip getstripe output to a space separated list of OSTs
1577 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1578 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1579 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1580 error "stripes not on specified OSTs"
1582 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1584 run_test 27cc "two stripes on the same OST"
1587 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1588 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
1589 skip "server does not support overstriping"
1590 test_mkdir -p $DIR/$tdir
1591 local osts="0,1,1,0"
1592 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1593 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1596 # Strip getstripe output to a space separated list of OSTs
1597 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1598 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1599 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1600 error "stripes not on specified OSTs"
1602 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1604 run_test 27cd "four stripes on two OSTs"
1607 [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
1608 skip_env "too many osts, skipping"
1609 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
1610 skip "server does not support overstriping"
1611 # We do one more stripe than we have OSTs
1612 [ $OSTCOUNT -ge 159 ] || large_xattr_enabled ||
1613 skip_env "ea_inode feature disabled"
1615 test_mkdir -p $DIR/$tdir
1617 for i in $(seq 0 $OSTCOUNT);
1620 if [ $i -ne $OSTCOUNT ]; then
1624 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1625 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1628 # Strip getstripe output to a space separated list of OSTs
1629 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1630 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1631 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1632 error "stripes not on specified OSTs"
1634 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1636 run_test 27ce "more stripes than OSTs with -o"
1639 test_mkdir $DIR/$tdir
1640 $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
1641 error "setstripe failed"
1642 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1643 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1645 run_test 27d "create file with default settings"
1648 # LU-5839 adds check for existed layout before setting it
1649 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1650 skip "Need MDS version at least 2.7.56"
1652 test_mkdir $DIR/$tdir
1653 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1654 $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice"
1655 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1657 run_test 27e "setstripe existing file (should return error)"
1660 test_mkdir $DIR/$tdir
1661 $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
1662 error "$LFS setstripe $DIR/$tdir/$tfile failed"
1663 $CHECKSTAT -t file $DIR/$tdir/$tfile &&
1664 error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
1665 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1666 $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed"
1668 run_test 27f "setstripe with bad stripe size (should return error)"
1671 test_mkdir $DIR/$tdir
1672 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1673 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" ||
1674 error "$DIR/$tdir/$tfile has object"
1676 run_test 27g "$LFS getstripe with no objects"
1679 test_mkdir $DIR/$tdir
1680 touch $DIR/$tdir/$tfile || error "touch failed"
1681 ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed"
1682 $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2
1684 (( rc == 2 )) || error "getstripe did not return ENOENT"
1686 run_test 27ga "$LFS getstripe with missing file (should return error)"
1689 test_mkdir $DIR/$tdir
1690 touch $DIR/$tdir/$tfile || error "touch failed"
1691 [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] ||
1692 error "missing objects"
1694 run_test 27i "$LFS getstripe with some objects"
1697 test_mkdir $DIR/$tdir
1698 $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile &&
1699 error "setstripe failed" || true
1701 run_test 27j "setstripe with bad stripe offset (should return error)"
1703 test_27k() { # bug 2844
1704 test_mkdir $DIR/$tdir
1705 local file=$DIR/$tdir/$tfile
1706 local ll_max_blksize=$((4 * 1024 * 1024))
1707 $LFS setstripe -S 67108864 $file || error "setstripe failed"
1708 local blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1709 [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize"
1710 dd if=/dev/zero of=$file bs=4k count=1
1711 blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1712 [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize"
1714 run_test 27k "limit i_blksize for broken user apps"
1717 mcreate $DIR/$tfile || error "creating file"
1718 $RUNAS $LFS setstripe -c 1 $DIR/$tfile &&
1719 error "setstripe should have failed" || true
1721 run_test 27l "check setstripe permissions (should return error)"
1724 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1726 [ -n "$RCLIENTS" -o -n "$MOUNT_2" ] &&
1727 skip_env "multiple clients -- skipping"
1729 ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
1731 if [[ $ORIGFREE -gt $MAXFREE ]]; then
1732 skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
1734 trap simple_cleanup_common EXIT
1735 test_mkdir $DIR/$tdir
1736 $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
1737 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
1738 error "dd should fill OST0"
1740 while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do
1742 [ $i -gt 256 ] && break
1745 touch $DIR/$tdir/$tfile.$i
1746 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1747 awk '{print $1}'| grep -w "0") ] &&
1748 error "OST0 was full but new created file still use it"
1750 touch $DIR/$tdir/$tfile.$i
1751 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1752 awk '{print $1}'| grep -w "0") ] &&
1753 error "OST0 was full but new created file still use it"
1754 simple_cleanup_common
1756 run_test 27m "create file while OST0 was full"
1758 # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage)
1759 # if the OST isn't full anymore.
1761 local OSTIDX=${1:-""}
1763 local list=$(comma_list $(osts_nodes))
1764 [ "$OSTIDX" ] && list=$(facet_host ost$((OSTIDX + 1)))
1766 do_nodes $list lctl set_param fail_loc=0
1767 sync # initiate all OST_DESTROYs from MDS to OST
1771 exhaust_precreations() {
1774 local FAILIDX=${3:-$OSTIDX}
1775 local ofacet=ost$((OSTIDX + 1))
1777 test_mkdir -p -c1 $DIR/$tdir
1778 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
1779 local mfacet=mds$((mdtidx + 1))
1780 echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
1782 local OST=$(ostname_from_index $OSTIDX)
1785 local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST)
1786 local last_id=$(do_facet $mfacet lctl get_param -n \
1787 osp.$mdtosc_proc1.prealloc_last_id)
1788 local next_id=$(do_facet $mfacet lctl get_param -n \
1789 osp.$mdtosc_proc1.prealloc_next_id)
1791 local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet)
1792 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1794 test_mkdir -p $DIR/$tdir/${OST}
1795 $LFS setstripe -i $OSTIDX -c 1 $DIR/$tdir/${OST}
1796 #define OBD_FAIL_OST_ENOSPC 0x215
1797 do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215
1798 echo "Creating to objid $last_id on ost $OST..."
1799 createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
1800 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1801 do_facet $ofacet lctl set_param fail_loc=$FAILLOC
1805 exhaust_all_precreations() {
1807 for (( i=0; i < OSTCOUNT; i++ )) ; do
1808 exhaust_precreations $i $1 -1
1813 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1814 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1815 remote_mds_nodsh && skip "remote MDS with nodsh"
1816 remote_ost_nodsh && skip "remote OST with nodsh"
1819 rm -f $DIR/$tdir/$tfile
1820 exhaust_precreations 0 0x80000215
1821 $LFS setstripe -c -1 $DIR/$tdir || error "setstripe failed"
1822 touch $DIR/$tdir/$tfile || error "touch failed"
1823 $LFS getstripe $DIR/$tdir/$tfile
1826 run_test 27n "create file with some full OSTs"
1829 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1830 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1831 remote_mds_nodsh && skip "remote MDS with nodsh"
1832 remote_ost_nodsh && skip "remote OST with nodsh"
1835 rm -f $DIR/$tdir/$tfile
1836 exhaust_all_precreations 0x215
1838 touch $DIR/$tdir/$tfile && error "able to create $DIR/$tdir/$tfile"
1843 run_test 27o "create file with all full OSTs (should error)"
1846 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1847 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1848 remote_mds_nodsh && skip "remote MDS with nodsh"
1849 remote_ost_nodsh && skip "remote OST with nodsh"
1852 rm -f $DIR/$tdir/$tfile
1853 test_mkdir $DIR/$tdir
1855 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1856 $TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed"
1857 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1859 exhaust_precreations 0 0x80000215
1860 echo foo >> $DIR/$tdir/$tfile || error "append failed"
1861 $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed"
1862 $LFS getstripe $DIR/$tdir/$tfile
1866 run_test 27p "append to a truncated file with some full OSTs"
1869 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1870 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1871 remote_mds_nodsh && skip "remote MDS with nodsh"
1872 remote_ost_nodsh && skip "remote OST with nodsh"
1875 rm -f $DIR/$tdir/$tfile
1877 test_mkdir $DIR/$tdir
1878 $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
1879 $TRUNCATE $DIR/$tdir/$tfile 80000000 ||
1880 error "truncate $DIR/$tdir/$tfile failed"
1881 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1883 exhaust_all_precreations 0x215
1885 echo foo >> $DIR/$tdir/$tfile && error "append succeeded"
1886 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat 2 failed"
1890 run_test 27q "append to truncated file with all OSTs full (should error)"
1893 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1894 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1895 remote_mds_nodsh && skip "remote MDS with nodsh"
1896 remote_ost_nodsh && skip "remote OST with nodsh"
1899 rm -f $DIR/$tdir/$tfile
1900 exhaust_precreations 0 0x80000215
1902 $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1906 run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
1908 test_27s() { # bug 10725
1909 test_mkdir $DIR/$tdir
1910 local stripe_size=$((4096 * 1024 * 1024)) # 2^32
1911 local stripe_count=0
1912 [ $OSTCOUNT -eq 1 ] || stripe_count=2
1913 $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir &&
1914 error "stripe width >= 2^32 succeeded" || true
1917 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
1919 test_27t() { # bug 10864
1924 $WLFS getstripe $tfile
1927 run_test 27t "check that utils parse path correctly"
1929 test_27u() { # bug 4900
1930 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1931 remote_mds_nodsh && skip "remote MDS with nodsh"
1934 local list=$(comma_list $(mdts_nodes))
1936 #define OBD_FAIL_MDS_OSC_PRECREATE 0x139
1937 do_nodes $list $LCTL set_param fail_loc=0x139
1938 test_mkdir -p $DIR/$tdir
1939 trap simple_cleanup_common EXIT
1940 createmany -o $DIR/$tdir/t- 1000
1941 do_nodes $list $LCTL set_param fail_loc=0
1943 TLOG=$TMP/$tfile.getstripe
1944 $LFS getstripe $DIR/$tdir > $TLOG
1945 OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
1946 unlinkmany $DIR/$tdir/t- 1000
1948 [[ $OBJS -gt 0 ]] &&
1949 error "$OBJS objects created on OST-0. See $TLOG" ||
1952 run_test 27u "skip object creation on OSC w/o objects"
1954 test_27v() { # bug 4900
1955 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1956 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1957 remote_mds_nodsh && skip "remote MDS with nodsh"
1958 remote_ost_nodsh && skip "remote OST with nodsh"
1960 exhaust_all_precreations 0x215
1963 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1965 touch $DIR/$tdir/$tfile
1966 #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
1968 for (( i=1; i < OSTCOUNT; i++ )); do
1969 do_facet ost$i lctl set_param fail_loc=0x705
1971 local START=`date +%s`
1972 createmany -o $DIR/$tdir/$tfile 32
1974 local FINISH=`date +%s`
1975 local TIMEOUT=`lctl get_param -n timeout`
1976 local PROCESS=$((FINISH - START))
1977 [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
1978 error "$FINISH - $START >= $TIMEOUT / 2"
1979 sleep $((TIMEOUT / 2 - PROCESS))
1982 run_test 27v "skip object creation on slow OST"
1984 test_27w() { # bug 10997
1985 test_mkdir $DIR/$tdir
1986 $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
1987 [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
1988 error "stripe size $size != 65536" || true
1989 [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
1990 error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
1992 run_test 27w "check $LFS setstripe -S and getstrip -d options"
1995 [[ $OSTCOUNT -lt 2 ]] &&
1996 skip_env "skipping multiple stripe count/offset test"
1998 test_mkdir $DIR/$tdir
1999 for i in $(seq 1 $OSTCOUNT); do
2001 $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i ||
2002 error "setstripe -c $i -i $offset failed"
2003 count=$($LFS getstripe -c $DIR/$tdir/f$i)
2004 index=$($LFS getstripe -i $DIR/$tdir/f$i)
2005 [ $count -ne $i ] && error "stripe count $count != $i" || true
2006 [ $index -ne $offset ] &&
2007 error "stripe offset $index != $offset" || true
2010 run_test 27wa "check $LFS setstripe -c -i options"
2013 remote_ost_nodsh && skip "remote OST with nodsh"
2014 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2015 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2017 OFFSET=$(($OSTCOUNT - 1))
2019 local OST=$(ostname_from_index $OSTIDX)
2021 test_mkdir $DIR/$tdir
2022 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file
2023 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1
2025 createmany -o $DIR/$tdir/$tfile $OSTCOUNT
2026 for i in $(seq 0 $OFFSET); do
2027 [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx |
2028 awk '{print $1}' | grep -w "$OSTIDX") ] &&
2029 error "OST0 was degraded but new created file still use it"
2031 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0
2033 run_test 27x "create files while OST0 is degraded"
2036 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2037 remote_mds_nodsh && skip "remote MDS with nodsh"
2038 remote_ost_nodsh && skip "remote OST with nodsh"
2039 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2041 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
2042 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
2043 osp.$mdtosc.prealloc_last_id)
2044 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
2045 osp.$mdtosc.prealloc_next_id)
2046 local fcount=$((last_id - next_id))
2047 [[ $fcount -eq 0 ]] && skip "not enough space on OST0"
2048 [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
2050 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
2051 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
2052 local OST_DEACTIVE_IDX=-1
2057 for OSC in $MDS_OSCS; do
2058 OST=$(osc_to_ost $OSC)
2059 OSTIDX=$(index_from_ostuuid $OST)
2060 if [ $OST_DEACTIVE_IDX == -1 ]; then
2061 OST_DEACTIVE_IDX=$OSTIDX
2063 if [ $OSTIDX != $OST_DEACTIVE_IDX ]; then
2064 echo $OSC "is Deactivated:"
2065 do_facet $SINGLEMDS lctl --device %$OSC deactivate
2069 OSTIDX=$(index_from_ostuuid $OST)
2070 test_mkdir $DIR/$tdir
2071 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
2073 for OSC in $MDS_OSCS; do
2074 OST=$(osc_to_ost $OSC)
2075 OSTIDX=$(index_from_ostuuid $OST)
2076 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
2077 echo $OST "is degraded:"
2078 do_facet ost$((OSTIDX+1)) lctl set_param -n \
2079 obdfilter.$OST.degraded=1
2084 createmany -o $DIR/$tdir/$tfile $fcount
2086 for OSC in $MDS_OSCS; do
2087 OST=$(osc_to_ost $OSC)
2088 OSTIDX=$(index_from_ostuuid $OST)
2089 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
2090 echo $OST "is recovered from degraded:"
2091 do_facet ost$((OSTIDX+1)) lctl set_param -n \
2092 obdfilter.$OST.degraded=0
2094 do_facet $SINGLEMDS lctl --device %$OSC activate
2098 # all osp devices get activated, hence -1 stripe count restored
2099 local stripe_count=0
2101 # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp
2102 # devices get activated.
2104 $LFS setstripe -c -1 $DIR/$tfile
2105 stripe_count=$($LFS getstripe -c $DIR/$tfile)
2107 [ $stripe_count -ne $OSTCOUNT ] &&
2108 error "Of $OSTCOUNT OSTs, only $stripe_count is available"
2111 run_test 27y "create files while OST0 is degraded and the rest inactive"
2117 lmm_count=$($LFS getstripe -c $1)
2118 lmm_seq=$($LFS getstripe -v $1 | awk '/lmm_seq/ { print $2 }')
2119 lmm_oid=$($LFS getstripe -v $1 | awk '/lmm_object_id/ { print $2 }')
2121 local old_ifs="$IFS"
2123 fid=($($LFS path2fid $1))
2126 log "FID seq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}"
2127 log "LOV seq $lmm_seq, oid $lmm_oid, count: $lmm_count"
2129 # compare lmm_seq and lu_fid->f_seq
2130 [ $lmm_seq = ${fid[1]} ] || { error "SEQ mismatch"; return 1; }
2131 # compare lmm_object_id and lu_fid->oid
2132 [ $lmm_oid = ${fid[2]} ] || { error "OID mismatch"; return 2; }
2134 # check the trusted.fid attribute of the OST objects of the file
2135 local have_obdidx=false
2137 $LFS getstripe $1 | while read obdidx oid hex seq; do
2138 # skip lines up to and including "obdidx"
2139 [ -z "$obdidx" ] && break
2140 [ "$obdidx" = "obdidx" ] && have_obdidx=true && continue
2141 $have_obdidx || continue
2143 local ost=$((obdidx + 1))
2144 local dev=$(ostdevname $ost)
2147 log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
2149 seq=$(echo $seq | sed -e "s/^0x//g")
2150 if [ $seq == 0 ] || [ $(facet_fstype ost$ost) == zfs ]; then
2151 oid_hex=$(echo $oid)
2153 oid_hex=$(echo $hex | sed -e "s/^0x//g")
2155 local obj_file="O/$seq/d$((oid %32))/$oid_hex"
2159 # Don't unmount/remount the OSTs if we don't need to do that.
2160 # LU-2577 changes filter_fid to be smaller, so debugfs needs
2161 # update too, until that use mount/ll_decode_filter_fid/mount.
2162 # Re-enable when debugfs will understand new filter_fid.
2164 if [ $(facet_fstype ost$ost) == ldiskfs ]; then
2165 ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
2166 $dev 2>/dev/null" | grep "parent=")
2168 if [ -z "$ff" ]; then
2170 mount_fstype ost$ost
2171 ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
2172 $(facet_mntpt ost$ost)/$obj_file)
2173 unmount_fstype ost$ost
2174 start ost$ost $dev $OST_MOUNT_OPTS
2178 [ -z "$ff" ] && error "$obj_file: no filter_fid info"
2180 echo "$ff" | sed -e 's#.*objid=#got: objid=#'
2182 # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
2183 # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
2185 # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \
2186 # stripe_size=1048576 component_id=1 component_start=0 \
2187 # component_end=33554432
2188 local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff)
2189 local ff_pseq=$(cut -d: -f1 <<<$ff_parent)
2190 local ff_poid=$(cut -d: -f2 <<<$ff_parent)
2192 if grep -q 'stripe=' <<<$ff; then
2193 ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff)
2195 # $LL_DECODE_FILTER_FID does not print "stripe="; look
2196 # into f_ver in this case. See comment on ff_parent.
2197 ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//')
2200 # compare lmm_seq and filter_fid->ff_parent.f_seq
2201 [ $ff_pseq = $lmm_seq ] ||
2202 error "FF parent SEQ $ff_pseq != $lmm_seq"
2203 # compare lmm_object_id and filter_fid->ff_parent.f_oid
2204 [ $ff_poid = $lmm_oid ] ||
2205 error "FF parent OID $ff_poid != $lmm_oid"
2206 (($ff_pstripe == $stripe_nr)) ||
2207 error "FF stripe $ff_pstripe != $stripe_nr"
2209 stripe_nr=$((stripe_nr + 1))
2210 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2212 if grep -q 'stripe_count=' <<<$ff; then
2213 local ff_scnt=$(sed -e 's/.*stripe_count=//' \
2214 -e 's/ .*//' <<<$ff)
2215 [ $lmm_count = $ff_scnt ] ||
2216 error "FF stripe count $lmm_count != $ff_scnt"
2222 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2223 remote_ost_nodsh && skip "remote OST with nodsh"
2225 test_mkdir $DIR/$tdir
2226 $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
2227 { error "setstripe -c -1 failed"; return 1; }
2228 # We need to send a write to every object to get parent FID info set.
2229 # This _should_ also work for setattr, but does not currently.
2230 # touch $DIR/$tdir/$tfile-1 ||
2231 dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
2232 { error "dd $tfile-1 failed"; return 2; }
2233 $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
2234 { error "setstripe -c -1 failed"; return 3; }
2235 dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
2236 { error "dd $tfile-2 failed"; return 4; }
2238 # make sure write RPCs have been sent to OSTs
2241 check_seq_oid $DIR/$tdir/$tfile-1 || return 5
2242 check_seq_oid $DIR/$tdir/$tfile-2 || return 6
2244 run_test 27z "check SEQ/OID on the MDT and OST filesystems"
2246 test_27A() { # b=19102
2247 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2249 save_layout_restore_at_exit $MOUNT
2250 $LFS setstripe -c 0 -i -1 -S 0 $MOUNT
2251 wait_update $HOSTNAME "$LFS getstripe -c $MOUNT | sed 's/ *//g'" "1" 20 ||
2252 error "stripe count $($LFS getstripe -c $MOUNT) != 1"
2253 local default_size=$($LFS getstripe -S $MOUNT)
2254 local default_offset=$($LFS getstripe -i $MOUNT)
2255 local dsize=$(do_facet $SINGLEMDS \
2256 "$LCTL get_param -n lod.$(facet_svc $SINGLEMDS)*.stripesize")
2257 [ $default_size -eq $dsize ] ||
2258 error "stripe size $default_size != $dsize"
2259 [ $default_offset -eq -1 ] ||
2260 error "stripe offset $default_offset != -1"
2262 run_test 27A "check filesystem-wide default LOV EA values"
2264 test_27B() { # LU-2523
2265 test_mkdir $DIR/$tdir
2266 rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
2268 # open f1 with O_LOV_DELAY_CREATE
2270 # call setstripe ioctl on open file descriptor for f1
2272 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:nB1c \
2276 # open f1 with O_LOV_DELAY_CREATE
2278 # call setstripe ioctl on open file descriptor for f1
2280 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:uB1c
2282 # Allow multiop to fail in imitation of NFS's busted semantics.
2285 run_test 27B "call setstripe on open unlinked file/rename victim"
2287 # 27C family tests full striping and overstriping
2288 test_27Ca() { #LU-2871
2289 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2297 test_mkdir $DIR/$tdir
2299 for i in $(seq 0 $((OSTCOUNT - 1))); do
2300 # set stripe across all OSTs starting from OST$i
2301 $LFS setstripe -i $i -c -1 $tfile$i
2302 # get striping information
2303 ost_idx=($($LFS getstripe $tfile$i |
2304 tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
2308 [ ${#ost_idx[@]} -eq $OSTCOUNT ] ||
2309 error "${#ost_idx[@]} != $OSTCOUNT"
2311 for index in $(seq 0 $((OSTCOUNT - 1))); do
2313 for j in $(echo ${ost_idx[@]}); do
2314 if [ $index -eq $j ]; then
2320 error "Can not find $index in ${ost_idx[@]}"
2324 run_test 27Ca "check full striping across all OSTs"
2327 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2328 skip "server does not support overstriping"
2329 [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2330 skip_env "too many osts, skipping"
2332 test_mkdir -p $DIR/$tdir
2333 local setcount=$(($OSTCOUNT * 2))
2334 [ $setcount -ge 160 ] || large_xattr_enabled ||
2335 skip_env "ea_inode feature disabled"
2337 $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
2338 error "setstripe failed"
2340 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2341 [ $count -eq $setcount ] ||
2342 error "stripe count $count, should be $setcount"
2344 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2345 error "overstriped should be set in pattern"
2347 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2350 run_test 27Cb "more stripes than OSTs with -C"
2353 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2354 skip "server does not support overstriping"
2355 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2357 test_mkdir -p $DIR/$tdir
2358 local setcount=$(($OSTCOUNT - 1))
2360 [ $setcount -ge 160 ] || large_xattr_enabled ||
2361 skip_env "ea_inode feature disabled"
2363 $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
2364 error "setstripe failed"
2366 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2367 [ $count -eq $setcount ] ||
2368 error "stripe count $count, should be $setcount"
2370 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" &&
2371 error "overstriped should not be set in pattern"
2373 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2376 run_test 27Cc "fewer stripes than OSTs does not set overstriping"
2379 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2380 skip "server does not support overstriping"
2381 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2382 large_xattr_enabled || skip_env "ea_inode feature disabled"
2384 test_mkdir -p $DIR/$tdir
2385 local setcount=$LOV_MAX_STRIPE_COUNT
2387 $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
2388 error "setstripe failed"
2390 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2391 [ $count -eq $setcount ] ||
2392 error "stripe count $count, should be $setcount"
2394 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2395 error "overstriped should be set in pattern"
2397 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2400 rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
2402 run_test 27Cd "test maximum stripe count"
2405 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2406 skip "server does not support overstriping"
2407 test_mkdir -p $DIR/$tdir
2409 pool_add $TESTNAME || error "Pool creation failed"
2410 pool_add_targets $TESTNAME 0 || error "pool_add_targets failed"
2414 $LFS setstripe -C $setcount -p "$TESTNAME" $DIR/$tdir/$tfile ||
2415 error "setstripe failed"
2417 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2418 [ $count -eq $setcount ] ||
2419 error "stripe count $count, should be $setcount"
2421 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2422 error "overstriped should be set in pattern"
2424 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2427 rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
2429 run_test 27Ce "test pool with overstriping"
2432 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2433 skip "server does not support overstriping"
2434 [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2435 skip_env "too many osts, skipping"
2437 test_mkdir -p $DIR/$tdir
2439 local setcount=$(($OSTCOUNT * 2))
2440 [ $setcount -ge 160 ] || large_xattr_enabled ||
2441 skip_env "ea_inode feature disabled"
2443 $LFS setstripe -C $setcount $DIR/$tdir/ ||
2444 error "setstripe failed"
2446 echo 1 > $DIR/$tdir/$tfile
2448 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2449 [ $count -eq $setcount ] ||
2450 error "stripe count $count, should be $setcount"
2452 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2453 error "overstriped should be set in pattern"
2455 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2458 rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
2460 run_test 27Cf "test default inheritance with overstriping"
2463 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2464 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2465 remote_mds_nodsh && skip "remote MDS with nodsh"
2467 local POOL=${POOL:-testpool}
2469 local last_ost=$(($OSTCOUNT - 1))
2471 local ost_list=$(seq $first_ost $ost_step $last_ost)
2472 local ost_range="$first_ost $last_ost $ost_step"
2474 test_mkdir $DIR/$tdir
2475 pool_add $POOL || error "pool_add failed"
2476 pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
2479 [ $MDS1_VERSION -lt $(version_code 2.8.55) ] &&
2481 [ $MDS1_VERSION -lt $(version_code 2.9.55) ] ||
2482 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2483 skip27D+=" -s 30,31"
2484 [[ ! $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ||
2485 $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2486 skip27D+=" -s 32,33"
2487 [[ $MDS_VERSION -lt $(version_code $SEL_VER) ]] &&
2489 llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
2490 error "llapi_layout_test failed"
2492 destroy_test_pools || error "destroy test pools failed"
2494 run_test 27D "validate llapi_layout API"
2496 # Verify that default_easize is increased from its initial value after
2497 # accessing a widely striped file.
2499 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2500 [ $CLIENT_VERSION -lt $(version_code 2.5.57) ] &&
2501 skip "client does not have LU-3338 fix"
2503 # 72 bytes is the minimum space required to store striping
2504 # information for a file striped across one OST:
2505 # (sizeof(struct lov_user_md_v3) +
2506 # sizeof(struct lov_user_ost_data_v1))
2508 $LCTL set_param -n llite.*.default_easize $min_easize ||
2509 error "lctl set_param failed"
2510 local easize=$($LCTL get_param -n llite.*.default_easize)
2512 [ $easize -eq $min_easize ] ||
2513 error "failed to set default_easize"
2515 $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
2516 error "setstripe failed"
2517 # In order to ensure stat() call actually talks to MDS we need to
2518 # do something drastic to this file to shake off all lock, e.g.
2519 # rename it (kills lookup lock forcing cache cleaning)
2520 mv $DIR/$tfile $DIR/${tfile}-1
2521 ls -l $DIR/${tfile}-1
2524 easize=$($LCTL get_param -n llite.*.default_easize)
2526 [ $easize -gt $min_easize ] ||
2527 error "default_easize not updated"
2529 run_test 27E "check that default extended attribute size properly increases"
2531 test_27F() { # LU-5346/LU-7975
2532 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2533 [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs"
2534 [[ $MDS1_VERSION -lt $(version_code 2.8.51) ]] &&
2535 skip "Need MDS version at least 2.8.51"
2536 remote_ost_nodsh && skip "remote OST with nodsh"
2538 test_mkdir $DIR/$tdir
2540 $LFS setstripe -c 2 $DIR/$tdir
2542 # stop all OSTs to reproduce situation for LU-7975 ticket
2543 for num in $(seq $OSTCOUNT); do
2547 # open/create f0 with O_LOV_DELAY_CREATE
2548 # truncate f0 to a non-0 size
2550 multiop $DIR/$tdir/f0 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T1050000c
2552 $CHECKSTAT -s 1050000 $DIR/$tdir/f0 || error "checkstat failed"
2553 # open/write it again to force delayed layout creation
2554 cat /etc/hosts > $DIR/$tdir/f0 &
2558 for num in $(seq $OSTCOUNT); do
2559 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS ||
2560 error "ost$num failed to start"
2563 wait $catpid || error "cat failed"
2565 cmp /etc/hosts $DIR/$tdir/f0 || error "cmp failed"
2566 [[ $($LFS getstripe -c $DIR/$tdir/f0) == 2 ]] ||
2567 error "wrong stripecount"
2570 run_test 27F "Client resend delayed layout creation with non-zero size"
2572 test_27G() { #LU-10629
2573 [ $MDS1_VERSION -lt $(version_code 2.11.51) ] &&
2574 skip "Need MDS version at least 2.11.51"
2575 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2576 remote_mds_nodsh && skip "remote MDS with nodsh"
2577 local POOL=${POOL:-testpool}
2578 local ostrange="0 0 1"
2580 test_mkdir $DIR/$tdir
2581 pool_add $POOL || error "pool_add failed"
2582 pool_add_targets $POOL $ostrange || error "pool_add_targets failed"
2583 $LFS setstripe -p $POOL $DIR/$tdir
2585 local pool=$($LFS getstripe -p $DIR/$tdir)
2587 [ "$pool" = "$POOL" ] || error "Striping failed got '$pool' not '$POOL'"
2589 $LFS setstripe -d $DIR/$tdir
2591 pool=$($LFS getstripe -p $DIR/$tdir)
2595 [ -z "$pool" ] || error "'$pool' is not empty"
2597 run_test 27G "Clear OST pool from stripe"
2600 [[ $MDS1_VERSION -le $(version_code 2.11.54) ]] &&
2601 skip "Need MDS version newer than 2.11.54"
2602 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
2603 test_mkdir $DIR/$tdir
2604 $LFS setstripe -o 0 -o 2 $DIR/$tdir || error "setstripe failed"
2605 touch $DIR/$tdir/$tfile
2606 $LFS getstripe -c $DIR/$tdir/$tfile
2607 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
2608 error "two-stripe file doesn't have two stripes"
2610 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
2611 $LFS getstripe -y $DIR/$tdir/$tfile
2612 (( $($LFS getstripe -y $DIR/$tdir/$tfile |
2613 egrep -c "l_ost_idx: [02]$") == "2" )) ||
2614 error "expected l_ost_idx: [02]$ not matched"
2616 # make sure ost list has been cleared
2617 local stripesize=$($LFS getstripe -S $DIR/$tdir)
2618 $LFS setstripe -S $((stripesize * 4)) -i 1 \
2619 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
2621 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
2623 run_test 27H "Set specific OSTs stripe"
2626 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2627 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2628 [[ $MDS1_VERSION -gt $(version_code 2.12.52) ]] ||
2629 skip "Need MDS version newer than 2.12.52"
2630 local pool=$TESTNAME
2631 local ostrange="1 1 1"
2633 save_layout_restore_at_exit $MOUNT
2634 $LFS setstripe -c 2 -i 0 $MOUNT
2635 pool_add $pool || error "pool_add failed"
2636 pool_add_targets $pool $ostrange || "pool_add_targets failed"
2637 test_mkdir $DIR/$tdir
2638 $LFS setstripe -p $pool $DIR/$tdir
2639 $MULTIOP $DIR/$tdir/$tfile Oc || error "multiop failed"
2640 $LFS getstripe $DIR/$tdir/$tfile
2642 run_test 27I "check that root dir striping does not break parent dir one"
2645 [[ $MDS1_VERSION -le $(version_code 2.12.51) ]] &&
2646 skip "Need MDS version newer than 2.12.51"
2648 test_mkdir $DIR/$tdir
2649 local uuid1=$(cat /proc/sys/kernel/random/uuid)
2650 local uuid2=$(cat /proc/sys/kernel/random/uuid)
2652 # create foreign file (raw way)
2653 create_foreign_file -f $DIR/$tdir/$tfile -x "${uuid1}@${uuid2}" \
2654 -t 1 -F 0xda08 || error "create_foreign_file failed"
2656 # verify foreign file (raw way)
2657 parse_foreign_file -f $DIR/$tdir/$tfile |
2658 grep "lov_foreign_magic: 0x0BD70BD0" ||
2659 error "$DIR/$tdir/$tfile: invalid LOV EA foreign magic"
2660 parse_foreign_file -f $DIR/$tdir/$tfile | grep "lov_xattr_size: 89" ||
2661 error "$DIR/$tdir/$tfile: invalid LOV EA foreign size"
2662 parse_foreign_file -f $DIR/$tdir/$tfile |
2663 grep "lov_foreign_size: 73" ||
2664 error "$DIR/$tdir/$tfile: invalid LOV EA foreign size"
2665 parse_foreign_file -f $DIR/$tdir/$tfile |
2666 grep "lov_foreign_type: 1" ||
2667 error "$DIR/$tdir/$tfile: invalid LOV EA foreign type"
2668 parse_foreign_file -f $DIR/$tdir/$tfile |
2669 grep "lov_foreign_flags: 0x0000DA08" ||
2670 error "$DIR/$tdir/$tfile: invalid LOV EA foreign flags"
2671 local lov=$(parse_foreign_file -f $DIR/$tdir/$tfile |
2672 grep "lov_foreign_value: 0x" |
2673 sed -e 's/lov_foreign_value: 0x//')
2674 local lov2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160)
2675 [[ $lov = ${lov2// /} ]] ||
2676 error "$DIR/$tdir/$tfile: invalid LOV EA foreign value"
2678 # create foreign file (lfs + API)
2679 $LFS setstripe --foreign=daos --flags 0xda08 \
2680 -x "${uuid1}@${uuid2}" $DIR/$tdir/${tfile}2 ||
2681 error "$DIR/$tdir/${tfile}2: create failed"
2683 $LFS getstripe -v $DIR/$tdir/${tfile}2 |
2684 grep "lfm_magic:.*0x0BD70BD0" ||
2685 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign magic"
2686 # lfm_length is LOV EA size - sizeof(lfm_magic) - sizeof(lfm_length)
2687 $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_length:.*73" ||
2688 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign size"
2689 $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_type:.*daos" ||
2690 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign type"
2691 $LFS getstripe -v $DIR/$tdir/${tfile}2 |
2692 grep "lfm_flags:.*0x0000DA08" ||
2693 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign flags"
2694 $LFS getstripe $DIR/$tdir/${tfile}2 |
2695 grep "lfm_value:.*${uuid1}@${uuid2}" ||
2696 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign value"
2698 # modify striping should fail
2699 $LFS setstripe -c 2 $DIR/$tdir/$tfile &&
2700 error "$DIR/$tdir/$tfile: setstripe should fail"
2701 $LFS setstripe -c 2 $DIR/$tdir/${tfile}2 &&
2702 error "$DIR/$tdir/${tfile}2: setstripe should fail"
2705 cat $DIR/$tdir/$tfile && error "$DIR/$tdir/$tfile: read should fail"
2706 cat $DIR/$tdir/${tfile}2 &&
2707 error "$DIR/$tdir/${tfile}2: read should fail"
2708 cat /etc/passwd > $DIR/$tdir/$tfile &&
2709 error "$DIR/$tdir/$tfile: write should fail"
2710 cat /etc/passwd > $DIR/$tdir/${tfile}2 &&
2711 error "$DIR/$tdir/${tfile}2: write should fail"
2714 chmod 222 $DIR/$tdir/$tfile ||
2715 error "$DIR/$tdir/$tfile: chmod failed"
2716 chmod 222 $DIR/$tdir/${tfile}2 ||
2717 error "$DIR/$tdir/${tfile}2: chmod failed"
2720 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tfile ||
2721 error "$DIR/$tdir/$tfile: chown failed"
2722 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tfile}2 ||
2723 error "$DIR/$tdir/${tfile}2: chown failed"
2725 # rename should work
2726 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}.new ||
2727 error "$DIR/$tdir/$tfile: rename of foreign file has failed"
2728 mv $DIR/$tdir/${tfile}2 $DIR/$tdir/${tfile}2.new ||
2729 error "$DIR/$tdir/${tfile}2: rename of foreign file has failed"
2731 #remove foreign file
2732 rm $DIR/$tdir/${tfile}.new ||
2733 error "$DIR/$tdir/${tfile}.new: remove of foreign file has failed"
2734 rm $DIR/$tdir/${tfile}2.new ||
2735 error "$DIR/$tdir/${tfile}2.new: remove of foreign file has failed"
2737 run_test 27J "basic ops on file with foreign LOV"
2740 [[ $MDS1_VERSION -le $(version_code 2.12.49) ]] &&
2741 skip "Need MDS version newer than 2.12.49"
2743 test_mkdir $DIR/$tdir
2744 local uuid1=$(cat /proc/sys/kernel/random/uuid)
2745 local uuid2=$(cat /proc/sys/kernel/random/uuid)
2747 # create foreign dir (raw way)
2748 create_foreign_dir -d $DIR/$tdir/$tdir -x "${uuid1}@${uuid2}" -t 1 ||
2749 error "create_foreign_dir FAILED"
2751 # verify foreign dir (raw way)
2752 parse_foreign_dir -d $DIR/$tdir/$tdir |
2753 grep "lmv_foreign_magic:.*0xcd50cd0" ||
2754 error "$DIR/$tdir/$tfile: invalid LMV EA magic"
2755 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_xattr_size:.*89$" ||
2756 error "$DIR/$tdir/$tdir: invalid LMV EA size"
2757 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_type: 1$" ||
2758 error "$DIR/$tdir/$tdir: invalid LMV EA type"
2759 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_flags: 0$" ||
2760 error "$DIR/$tdir/$tdir: invalid LMV EA flags"
2761 local lmv=$(parse_foreign_dir -d $DIR/$tdir/$tdir |
2762 grep "lmv_foreign_value: 0x" |
2763 sed 's/lmv_foreign_value: 0x//')
2764 local lmv2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160 |
2766 [[ $lmv == $lmv2 ]] || error "$DIR/$tdir/$tdir: invalid LMV EA value"
2768 # create foreign dir (lfs + API)
2769 $LFS mkdir --foreign=daos --xattr="${uuid1}@${uuid2}" --flags=0xda05 \
2770 $DIR/$tdir/${tdir}2 ||
2771 error "$DIR/$tdir/${tdir}2: create failed"
2773 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
2774 grep "lfm_magic:.*0x0CD50CD0" ||
2775 error "$DIR/$tdir/${tdir}2: invalid LMV EA magic"
2776 # lfm_length is LMV EA size - sizeof(lfm_magic) - sizeof(lfm_length)
2777 # - sizeof(lfm_type) - sizeof(lfm_flags)
2778 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_length:.*73" ||
2779 error "$DIR/$tdir/${tdir}2: invalid LMV EA size"
2780 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_type:.*daos" ||
2781 error "$DIR/$tdir/${tdir}2: invalid LMV EA type"
2782 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
2783 grep "lfm_flags:.*0x0000DA05" ||
2784 error "$DIR/$tdir/${tdir}2: invalid LMV EA flags"
2785 $LFS getdirstripe $DIR/$tdir/${tdir}2 |
2786 grep "lfm_value.*${uuid1}@${uuid2}" ||
2787 error "$DIR/$tdir/${tdir}2: invalid LMV EA value"
2789 # file create in dir should fail
2790 touch $DIR/$tdir/$tdir/$tfile && "$DIR/$tdir: file create should fail"
2791 touch $DIR/$tdir/${tdir}2/$tfile &&
2792 "$DIR/${tdir}2: file create should fail"
2795 chmod 777 $DIR/$tdir/$tdir ||
2796 error "$DIR/$tdir: chmod failed"
2797 chmod 777 $DIR/$tdir/${tdir}2 ||
2798 error "$DIR/${tdir}2: chmod failed"
2801 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tdir ||
2802 error "$DIR/$tdir: chown failed"
2803 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tdir}2 ||
2804 error "$DIR/${tdir}2: chown failed"
2806 # rename should work
2807 mv $DIR/$tdir/$tdir $DIR/$tdir/${tdir}.new ||
2808 error "$DIR/$tdir/$tdir: rename of foreign dir has failed"
2809 mv $DIR/$tdir/${tdir}2 $DIR/$tdir/${tdir}2.new ||
2810 error "$DIR/$tdir/${tdir}2: rename of foreign dir has failed"
2813 rmdir $DIR/$tdir/${tdir}.new ||
2814 error "$DIR/$tdir/${tdir}.new: remove of foreign dir has failed"
2815 rmdir $DIR/$tdir/${tdir}2.new ||
2816 error "$DIR/$tdir/${tdir}2.new: remove of foreign dir has failed"
2818 run_test 27K "basic ops on dir with foreign LMV"
2821 remote_mds_nodsh && skip "remote MDS with nodsh"
2823 local POOL=${POOL:-$TESTNAME}
2825 pool_add $POOL || error "pool_add failed"
2827 lfs pool_list $MOUNT | grep -Fx "${FSNAME}.${POOL}" ||
2828 error "pool_list does not contain ${FSNAME}.${POOL}:" \
2829 "$(lfs pool_list $MOUNT | grep -F "${POOL}")"
2831 run_test 27L "lfs pool_list gives correct pool name"
2834 [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.12.57) ]] &&
2835 skip "Need MDS version >= than 2.12.57"
2836 remote_mds_nodsh && skip "remote MDS with nodsh"
2837 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2839 test_mkdir $DIR/$tdir
2841 # Set default striping on directory
2842 $LFS setstripe -C 4 $DIR/$tdir
2844 echo 1 > $DIR/$tdir/${tfile}.1
2845 local count=$($LFS getstripe -c $DIR/$tdir/${tfile}.1)
2847 [ $count -eq $setcount ] ||
2848 error "(1) stripe count $count, should be $setcount"
2850 # Capture existing append_stripe_count setting for restore
2851 local orig_count=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_stripe_count)
2852 local mdts=$(comma_list $(mdts_nodes))
2853 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=$orig_count" EXIT
2855 local appendcount=$orig_count
2856 echo 1 >> $DIR/$tdir/${tfile}.2_append
2857 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.2_append)
2858 [ $count -eq $appendcount ] ||
2859 error "(2)stripe count $count, should be $appendcount for append"
2861 # Disable O_APPEND striping, verify it works
2862 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2864 # Should now get the default striping, which is 4
2866 echo 1 >> $DIR/$tdir/${tfile}.3_append
2867 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.3_append)
2868 [ $count -eq $setcount ] ||
2869 error "(3) stripe count $count, should be $setcount"
2871 # Try changing the stripe count for append files
2872 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=2
2874 # Append striping is now 2 (directory default is still 4)
2876 echo 1 >> $DIR/$tdir/${tfile}.4_append
2877 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.4_append)
2878 [ $count -eq $appendcount ] ||
2879 error "(4) stripe count $count, should be $appendcount for append"
2881 # Test append stripe count of -1
2882 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=-1
2883 appendcount=$OSTCOUNT
2884 echo 1 >> $DIR/$tdir/${tfile}.5
2885 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.5)
2886 [ $count -eq $appendcount ] ||
2887 error "(5) stripe count $count, should be $appendcount for append"
2889 # Set append striping back to default of 1
2890 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=1
2892 # Try a new default striping, PFL + DOM
2893 $LFS setstripe -L mdt -E 1M -E -1 -c 2 $DIR/$tdir
2895 # Create normal DOM file, DOM returns stripe count == 0
2897 touch $DIR/$tdir/${tfile}.6
2898 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.6)
2899 [ $count -eq $setcount ] ||
2900 error "(6) stripe count $count, should be $setcount"
2904 echo 1 >> $DIR/$tdir/${tfile}.7_append
2905 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.7_append)
2906 [ $count -eq $appendcount ] ||
2907 error "(7) stripe count $count, should be $appendcount for append"
2909 # Clean up DOM layout
2910 $LFS setstripe -d $DIR/$tdir
2912 # Now test that append striping works when layout is from root
2913 $LFS setstripe -c 2 $MOUNT
2914 # Make a special directory for this
2915 mkdir $DIR/${tdir}/${tdir}.2
2916 stack_trap "$LFS setstripe -d $MOUNT" EXIT
2918 # Verify for normal file
2920 echo 1 > $DIR/${tdir}/${tdir}.2/${tfile}.8
2921 count=$($LFS getstripe -c $DIR/$tdir/${tdir}.2/${tfile}.8)
2922 [ $count -eq $setcount ] ||
2923 error "(8) stripe count $count, should be $setcount"
2926 echo 1 >> $DIR/${tdir}/${tdir}.2/${tfile}.9_append
2927 count=$($LFS getstripe -c $DIR/${tdir}/${tdir}.2/${tfile}.9_append)
2928 [ $count -eq $appendcount ] ||
2929 error "(9) stripe count $count, should be $appendcount for append"
2931 # Now test O_APPEND striping with pools
2932 do_nodes $mdts $LCTL set_param mdd.*.append_pool="$TESTNAME"
2933 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'" EXIT
2936 pool_add $TESTNAME || error "pool creation failed"
2937 pool_add_targets $TESTNAME 0 1 || error "Pool add targets failed"
2939 echo 1 >> $DIR/$tdir/${tfile}.10_append
2941 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.10_append)
2942 [ "$pool" = "$TESTNAME" ] || error "(10) incorrect pool: $pool"
2944 # Check that count is still correct
2946 echo 1 >> $DIR/$tdir/${tfile}.11_append
2947 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.11_append)
2948 [ $count -eq $appendcount ] ||
2949 error "(11) stripe count $count, should be $appendcount for append"
2951 # Disable O_APPEND stripe count, verify pool works separately
2952 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2954 echo 1 >> $DIR/$tdir/${tfile}.12_append
2956 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.12_append)
2957 [ "$pool" = "$TESTNAME" ] || error "(12) incorrect pool: $pool"
2959 # Remove pool setting, verify it's not applied
2960 do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'
2962 echo 1 >> $DIR/$tdir/${tfile}.13_append
2964 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.13_append)
2965 [ "$pool" = "" ] || error "(13) pool found: $pool"
2967 run_test 27M "test O_APPEND striping"
2970 combined_mgs_mds && skip "needs separate MGS/MDT"
2972 pool_add $TESTNAME || error "pool_add failed"
2973 do_facet mgs "$LCTL pool_list $FSNAME" |
2974 grep -Fx "${FSNAME}.${TESTNAME}" ||
2975 error "lctl pool_list on MGS failed"
2977 run_test 27N "lctl pool_list on separate MGS gives correct pool name"
2979 # createtest also checks that device nodes are created and
2980 # then visible correctly (#2091)
2981 test_28() { # bug 2091
2983 $CREATETEST $DIR/d28/ct || error "createtest failed"
2985 run_test 28 "create/mknod/mkdir with bad file types ============"
2988 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2990 sync; sleep 1; sync # flush out any dirty pages from previous tests
2997 declare -i LOCKCOUNTORIG=0
2998 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2999 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
3001 [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
3003 declare -i LOCKUNUSEDCOUNTORIG=0
3004 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
3005 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
3012 declare -i LOCKCOUNTCURRENT=0
3013 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
3014 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
3017 declare -i LOCKUNUSEDCOUNTCURRENT=0
3018 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
3019 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
3022 if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
3023 $LCTL set_param -n ldlm.dump_namespaces ""
3024 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
3025 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
3026 log "dumped log to $TMP/test_29.dk (bug 5793)"
3029 if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
3030 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
3031 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
3032 log "dumped log to $TMP/test_29.dk (bug 5793)"
3036 run_test 29 "IT_GETATTR regression ============================"
3038 test_30a() { # was test_30
3039 cp $(which ls) $DIR || cp /bin/ls $DIR
3040 $DIR/ls / || error "Can't execute binary from lustre"
3043 run_test 30a "execute binary from Lustre (execve) =============="
3046 cp `which ls` $DIR || cp /bin/ls $DIR
3048 $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
3051 run_test 30b "execute binary from Lustre as non-root ==========="
3053 test_30c() { # b=22376
3054 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3056 cp `which ls` $DIR || cp /bin/ls $DIR
3058 cancel_lru_locks mdc
3059 cancel_lru_locks osc
3060 $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
3063 run_test 30c "execute binary from Lustre without read perms ===="
3066 $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
3067 $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
3069 run_test 31a "open-unlink file =================================="
3072 touch $DIR/f31 || error "touch $DIR/f31 failed"
3073 ln $DIR/f31 $DIR/f31b || error "ln failed"
3074 $MULTIOP $DIR/f31b Ouc || error "multiop failed"
3075 $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
3077 run_test 31b "unlink file with multiple links while open ======="
3080 touch $DIR/f31 || error "touch $DIR/f31 failed"
3081 ln $DIR/f31 $DIR/f31c || error "ln failed"
3082 multiop_bg_pause $DIR/f31 O_uc ||
3083 error "multiop_bg_pause for $DIR/f31 failed"
3085 $MULTIOP $DIR/f31c Ouc
3086 kill -USR1 $MULTIPID
3089 run_test 31c "open-unlink file with multiple links ============="
3092 opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
3093 $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
3095 run_test 31d "remove of open directory ========================="
3097 test_31e() { # bug 2904
3098 openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
3100 run_test 31e "remove of open non-empty directory ==============="
3102 test_31f() { # bug 4554
3103 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3106 test_mkdir $DIR/d31f
3107 $LFS setstripe -S 1048576 -c 1 $DIR/d31f
3108 cp /etc/hosts $DIR/d31f
3110 $LFS getstripe $DIR/d31f/hosts
3111 multiop_bg_pause $DIR/d31f D_c || return 1
3114 rm -rv $DIR/d31f || error "first of $DIR/d31f"
3115 test_mkdir $DIR/d31f
3116 $LFS setstripe -S 1048576 -c 1 $DIR/d31f
3117 cp /etc/hosts $DIR/d31f
3119 $LFS getstripe $DIR/d31f/hosts
3120 multiop_bg_pause $DIR/d31f D_c || return 1
3123 kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
3124 wait $MULTIPID || error "first opendir $MULTIPID failed"
3128 kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
3129 wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
3132 run_test 31f "remove of open directory with open-unlink file ==="
3135 echo "-- cross directory link --"
3136 test_mkdir -c1 $DIR/${tdir}ga
3137 test_mkdir -c1 $DIR/${tdir}gb
3138 touch $DIR/${tdir}ga/f
3139 ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
3140 $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
3141 [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
3142 $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
3143 [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
3145 run_test 31g "cross directory link==============="
3148 echo "-- cross directory link --"
3149 test_mkdir -c1 $DIR/${tdir}
3150 test_mkdir -c1 $DIR/${tdir}/dir
3151 touch $DIR/${tdir}/f
3152 ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
3153 $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
3154 [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
3155 $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
3156 [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
3158 run_test 31h "cross directory link under child==============="
3161 echo "-- cross directory link --"
3162 test_mkdir -c1 $DIR/$tdir
3163 test_mkdir -c1 $DIR/$tdir/dir
3164 touch $DIR/$tdir/dir/f
3165 ln $DIR/$tdir/dir/f $DIR/$tdir/g
3166 $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
3167 [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
3168 $CHECKSTAT -t file $DIR/$tdir/g || error "target"
3169 [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
3171 run_test 31i "cross directory link under parent==============="
3174 test_mkdir -c1 -p $DIR/$tdir
3175 test_mkdir -c1 -p $DIR/$tdir/dir1
3176 ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
3177 link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
3178 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
3179 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
3182 run_test 31j "link for directory==============="
3185 test_mkdir -c1 -p $DIR/$tdir
3187 touch $DIR/$tdir/exist
3188 mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
3189 mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
3190 mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
3191 mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
3192 mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
3193 mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
3194 mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
3197 run_test 31k "link to file: the same, non-existing, dir==============="
3203 touch $DIR/d31m2/exist
3204 mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
3205 mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
3206 mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
3207 mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
3208 mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
3209 mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
3212 run_test 31m "link to file: the same, non-existing, dir==============="
3215 touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
3216 nlink=$(stat --format=%h $DIR/$tfile)
3217 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
3219 local cmd="exec $fd<$DIR/$tfile"
3222 trap "eval $cmd" EXIT
3223 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
3224 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
3225 rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
3226 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
3227 [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
3230 run_test 31n "check link count of unlinked file"
3233 local tempfile=$(mktemp $1_XXXXXX)
3234 mlink $tempfile $1 2> /dev/null &&
3235 echo "$BASHPID: link $tempfile to $1 succeeded"
3239 test_31o() { # LU-2901
3240 test_mkdir $DIR/$tdir
3241 for LOOP in $(seq 100); do
3242 rm -f $DIR/$tdir/$tfile*
3243 for THREAD in $(seq 8); do
3244 link_one $DIR/$tdir/$tfile.$LOOP &
3247 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
3248 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
3249 error "$LINKS duplicate links to $tfile.$LOOP" &&
3253 run_test 31o "duplicate hard links with same filename"
3256 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3258 test_mkdir $DIR/$tdir
3259 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3260 $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
3262 opendirunlink $DIR/$tdir/striped_dir/test1 ||
3263 error "open unlink test1 failed"
3264 opendirunlink $DIR/$tdir/striped_dir/test2 ||
3265 error "open unlink test2 failed"
3267 $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
3268 error "test1 still exists"
3269 $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
3270 error "test2 still exists"
3272 run_test 31p "remove of open striped directory"
3274 cleanup_test32_mount() {
3277 local loopdev=$(losetup -a | grep $EXT2_DEV | sed -ne 's/:.*$//p')
3278 $UMOUNT $DIR/$tdir/ext2-mountpoint || rc=$?
3279 losetup -d $loopdev || true
3285 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3287 echo "== more mountpoints and symlinks ================="
3288 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3289 trap cleanup_test32_mount EXIT
3290 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3291 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3292 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3293 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/.. ||
3294 error "$DIR/$tdir/ext2-mountpoint/.. not dir type"
3295 cleanup_test32_mount
3297 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
3300 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3302 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3303 trap cleanup_test32_mount EXIT
3304 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3305 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3306 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3307 ls -al $DIR/$tdir/ext2-mountpoint/.. ||
3308 error "Can't list $DIR/$tdir/ext2-mountpoint/.."
3309 cleanup_test32_mount
3311 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
3314 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3316 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3317 trap cleanup_test32_mount EXIT
3318 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3319 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3320 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3321 test_mkdir -p $DIR/$tdir/d2/test_dir
3322 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
3323 error "$DIR/$tdir/ext2-mountpoint/../d2/test_dir not dir type"
3324 cleanup_test32_mount
3326 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
3329 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3331 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3332 trap cleanup_test32_mount EXIT
3333 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3334 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3335 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3336 test_mkdir -p $DIR/$tdir/d2/test_dir
3337 ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
3338 error "Can't list $DIR/$tdir/ext2-mountpoint/../d2/test_dir"
3339 cleanup_test32_mount
3341 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
3345 test_mkdir -p $DIR/$tdir/tmp
3346 local tmp_dir=$DIR/$tdir/tmp
3347 ln -s $DIR/$tdir $tmp_dir/symlink11
3348 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
3349 $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
3350 $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
3352 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
3356 test_mkdir -p $DIR/$tdir/tmp
3357 local tmp_dir=$DIR/$tdir/tmp
3358 ln -s $DIR/$tdir $tmp_dir/symlink11
3359 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
3360 ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
3361 ls $DIR/$tdir/symlink01 || error "symlink01 bad"
3363 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
3366 local tmp_dir=$DIR/$tdir/tmp
3367 test_mkdir -p $tmp_dir
3368 test_mkdir $DIR/${tdir}2
3369 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
3370 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
3371 $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
3372 $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
3373 $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
3374 $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
3376 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
3379 rm -fr $DIR/$tdir $DIR/${tdir}2
3380 tmp_dir=$DIR/$tdir/tmp
3381 test_mkdir -p $tmp_dir
3382 test_mkdir $DIR/${tdir}2
3383 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
3384 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
3385 ls $tmp_dir/symlink12 || error "listing symlink12"
3386 ls $DIR/$tdir/symlink02 || error "listing symlink02"
3388 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
3391 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3393 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3394 trap cleanup_test32_mount EXIT
3395 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3396 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3397 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3398 touch $DIR/$tdir/test_file
3399 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../test_file ||
3400 error "$DIR/$tdir/ext2-mountpoint/../test_file not file type"
3401 cleanup_test32_mount
3403 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
3406 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3408 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3409 trap cleanup_test32_mount EXIT
3410 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3411 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3412 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3413 touch $DIR/$tdir/test_file
3414 cat $DIR/$tdir/ext2-mountpoint/../test_file ||
3415 error "Can't open $DIR/$tdir/ext2-mountpoint/../test_file"
3416 cleanup_test32_mount
3418 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
3421 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3424 trap cleanup_test32_mount EXIT
3425 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3426 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3427 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3428 test_mkdir -p $DIR/$tdir/d2
3429 touch $DIR/$tdir/d2/test_file || error "touch failed"
3430 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
3431 error "$DIR/$tdir/ext2-mountpoint/../d2/test_file not file type"
3432 cleanup_test32_mount
3434 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
3437 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3440 trap cleanup_test32_mount EXIT
3441 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3442 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3443 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3444 test_mkdir -p $DIR/$tdir/d2
3445 touch $DIR/$tdir/d2/test_file || error "touch failed"
3446 cat $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
3447 error "Can't open $DIR/$tdir/ext2-mountpoint/../d2/test_file"
3448 cleanup_test32_mount
3450 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
3454 test_mkdir -p $DIR/d32m/tmp
3455 TMP_DIR=$DIR/d32m/tmp
3456 ln -s $DIR $TMP_DIR/symlink11
3457 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3458 $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 ||
3459 error "symlink11 not a link"
3460 $CHECKSTAT -t link $DIR/d32m/symlink01 ||
3461 error "symlink01 not a link"
3463 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
3467 test_mkdir -p $DIR/d32n/tmp
3468 TMP_DIR=$DIR/d32n/tmp
3469 ln -s $DIR $TMP_DIR/symlink11
3470 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3471 ls -l $DIR/d32n/tmp/symlink11 || error "listing symlink11"
3472 ls -l $DIR/d32n/symlink01 || error "listing symlink01"
3474 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
3478 test_mkdir -p $DIR/d32o/tmp
3479 TMP_DIR=$DIR/d32o/tmp
3480 ln -s $DIR/$tfile $TMP_DIR/symlink12
3481 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3482 $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 ||
3483 error "symlink12 not a link"
3484 $CHECKSTAT -t link $DIR/d32o/symlink02 || error "symlink02 not a link"
3485 $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 ||
3486 error "$DIR/d32o/tmp/symlink12 not file type"
3487 $CHECKSTAT -t file -f $DIR/d32o/symlink02 ||
3488 error "$DIR/d32o/symlink02 not file type"
3490 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
3500 test_mkdir -p $DIR/d32p/tmp
3502 TMP_DIR=$DIR/d32p/tmp
3504 ln -s $DIR/$tfile $TMP_DIR/symlink12
3506 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3508 cat $DIR/d32p/tmp/symlink12 ||
3509 error "Can't open $DIR/d32p/tmp/symlink12"
3511 cat $DIR/d32p/symlink02 || error "Can't open $DIR/d32p/symlink02"
3514 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
3517 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3519 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3520 trap cleanup_test32_mount EXIT
3521 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3522 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3523 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3524 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3525 ls $DIR/$tdir/ext2-mountpoint | grep "\<under_the_mount\>" && error
3526 cleanup_test32_mount
3528 run_test 32q "stat follows mountpoints in Lustre (should return error)"
3531 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3533 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3534 trap cleanup_test32_mount EXIT
3535 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3536 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3537 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3538 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3539 ls $DIR/$tdir/ext2-mountpoint | grep -q under_the_mount && error || true
3540 cleanup_test32_mount
3542 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
3547 chmod 444 $DIR/$tfile
3548 chown $RUNAS_ID $DIR/$tfile
3550 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3553 run_test 33aa "write file with mode 444 (should return error)"
3557 test_mkdir $DIR/$tdir
3558 chown $RUNAS_ID $DIR/$tdir
3559 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
3560 error "$RUNAS create $tdir/$tfile failed"
3561 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
3562 error "open RDWR" || true
3564 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
3568 test_mkdir $DIR/$tdir
3569 chown $RUNAS_ID $DIR/$tdir
3570 $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
3572 run_test 33b "test open file with malformed flags (No panic)"
3575 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3576 remote_ost_nodsh && skip "remote OST with nodsh"
3585 test_mkdir $DIR/$tdir
3586 # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
3589 for ostnum in $(seq $OSTCOUNT); do
3590 # test-framework's OST numbering is one-based, while Lustre's
3592 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3593 # Parsing llobdstat's output sucks; we could grep the /proc
3594 # path, but that's likely to not be as portable as using the
3595 # llobdstat utility. So we parse lctl output instead.
3596 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3597 obdfilter/$ostname/stats |
3598 awk '/^write_bytes/ {print $7}' )
3599 echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes"
3600 if (( ${write_bytes:-0} > 0 ))
3607 $all_zeros || return 0
3610 echo foo > $DIR/$tdir/bar
3614 # Total up write_bytes after writing. We'd better find non-zeros.
3615 for ostnum in $(seq $OSTCOUNT); do
3616 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3617 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3618 obdfilter/$ostname/stats |
3619 awk '/^write_bytes/ {print $7}' )
3620 echo "write_bytes@$OSTnum/$ostname=$write_bytes"
3621 if (( ${write_bytes:-0} > 0 ))
3630 for ostnum in $(seq $OSTCOUNT); do
3631 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3632 echo "Check that write_bytes is present in obdfilter/*/stats:"
3633 do_facet ost$ostnum lctl get_param -n \
3634 obdfilter/$ostname/stats
3636 error "OST not keeping write_bytes stats (b22312)"
3639 run_test 33c "test llobdstat and write_bytes"
3642 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3643 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3646 local remote_dir=$DIR/$tdir/remote_dir
3648 test_mkdir $DIR/$tdir
3649 $LFS mkdir -i $MDTIDX $remote_dir ||
3650 error "create remote directory failed"
3652 touch $remote_dir/$tfile
3653 chmod 444 $remote_dir/$tfile
3654 chown $RUNAS_ID $remote_dir/$tfile
3656 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3658 chown $RUNAS_ID $remote_dir
3659 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
3660 error "create" || true
3661 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
3662 error "open RDWR" || true
3663 $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
3665 run_test 33d "openfile with 444 modes and malformed flags under remote dir"
3668 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3672 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3673 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3674 mkdir $DIR/$tdir/local_dir
3676 local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3677 local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3678 local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3680 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3681 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
3683 rmdir $DIR/$tdir/* || error "rmdir failed"
3686 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3687 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3688 mkdir $DIR/$tdir/local_dir
3690 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3691 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3692 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3694 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3695 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
3697 rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
3700 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3701 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3702 mkdir $DIR/$tdir/local_dir
3704 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3705 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3706 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3708 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3709 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
3711 run_test 33e "mkdir and striped directory should have same mode"
3715 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
3719 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3720 remote_mds_nodsh && skip "remote MDS with nodsh"
3723 chmod go+rwx $DIR/$tdir
3724 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
3725 trap cleanup_33f EXIT
3727 $RUNAS lfs mkdir -i 0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
3728 error "cannot create striped directory"
3730 $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
3731 error "cannot create files in striped directory"
3733 $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
3734 error "cannot remove files in striped directory"
3736 $RUNAS rmdir $DIR/$tdir/striped_dir ||
3737 error "cannot remove striped directory"
3741 run_test 33f "nonroot user can create, access, and remove a striped directory"
3744 mkdir -p $DIR/$tdir/dir2
3746 local err=$($RUNAS mkdir $DIR/$tdir/dir2 2>&1)
3748 [[ $err =~ "exists" ]] || error "Not exists error"
3750 run_test 33g "nonroot user create already existing root created file"
3752 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
3755 $MCREATE $DIR/f34 || error "mcreate failed"
3756 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" ||
3757 error "getstripe failed"
3758 $TRUNCATE $DIR/f34 $TEST_34_SIZE || error "truncate failed"
3759 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" ||
3760 error "getstripe failed"
3761 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3762 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3764 run_test 34a "truncate file that has not been opened ==========="
3767 [ ! -f $DIR/f34 ] && test_34a
3768 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3769 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3770 $OPENFILE -f O_RDONLY $DIR/f34
3771 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" ||
3772 error "getstripe failed"
3773 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3774 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3776 run_test 34b "O_RDONLY opening file doesn't create objects ====="
3779 [ ! -f $DIR/f34 ] && test_34a
3780 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3781 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3782 $OPENFILE -f O_RDWR $DIR/f34
3783 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" &&
3784 error "$LFS getstripe failed"
3785 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3786 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3788 run_test 34c "O_RDWR opening file-with-size works =============="
3791 [ ! -f $DIR/f34 ] && test_34a
3792 dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 ||
3794 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3795 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3798 run_test 34d "write to sparse file ============================="
3802 $MCREATE $DIR/f34e || error "mcreate failed"
3803 $TRUNCATE $DIR/f34e 1000 || error "truncate failed"
3804 $CHECKSTAT -s 1000 $DIR/f34e ||
3805 error "Size of $DIR/f34e not equal to 1000 bytes"
3806 $OPENFILE -f O_RDWR $DIR/f34e
3807 $CHECKSTAT -s 1000 $DIR/f34e ||
3808 error "Size of $DIR/f34e not equal to 1000 bytes"
3810 run_test 34e "create objects, some with size and some without =="
3812 test_34f() { # bug 6242, 6243
3813 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3817 $MCREATE $DIR/f34f || error "mcreate failed"
3818 $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
3819 dd if=$DIR/f34f of=$TMP/f34f
3820 $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
3821 dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
3822 cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
3823 cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
3824 rm $TMP/f34f $TMP/f34fzero $DIR/f34f
3826 run_test 34f "read from a file with no objects until EOF ======="
3829 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3831 dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE ||
3833 $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error "truncate failed"
3834 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3835 error "Size of $DIR/$tfile not equal to $((TEST_34_SIZE / 2))"
3836 cancel_lru_locks osc
3837 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3838 error "wrong size after lock cancel"
3840 $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error "truncate failed"
3841 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3842 error "expanding truncate failed"
3843 cancel_lru_locks osc
3844 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3845 error "wrong expanded size after lock cancel"
3847 run_test 34g "truncate long file ==============================="
3850 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3855 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error "dd failed"
3856 sync # Flush the cache so that multiop below does not block on cache
3857 # flush when getting the group lock
3858 $MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
3861 # Since just timed wait is not good enough, let's do a sync write
3862 # that way we are sure enough time for a roundtrip + processing
3863 # passed + 2 seconds of extra margin.
3864 dd if=/dev/zero of=$DIR/${tfile}-1 bs=$PAGE_SIZE oflag=direct count=1
3868 if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then
3869 error "Multiop blocked on ftruncate, pid=$MULTIPID"
3873 local nsz=`stat -c %s $DIR/$tfile`
3874 [[ $nsz == $sz ]] || error "New size wrong $nsz != $sz"
3876 run_test 34h "ftruncate file under grouplock should not block"
3879 cp /bin/sh $DIR/f35a
3881 chown $RUNAS_ID $DIR/f35a
3882 $RUNAS $DIR/f35a && error || true
3885 run_test 35a "exec file with mode 444 (should return and not leak)"
3889 utime $DIR/f36 || error "utime failed for MDS"
3891 run_test 36a "MDS utime check (mknod, utime)"
3895 utime $DIR/f36 || error "utime failed for OST"
3897 run_test 36b "OST utime check (open, utime)"
3902 chown $RUNAS_ID $DIR/d36
3903 $RUNAS utime $DIR/d36/f36 || error "utime failed for MDS as non-root"
3905 run_test 36c "non-root MDS utime check (mknod, utime)"
3908 [ ! -d $DIR/d36 ] && test_36c
3909 echo "" > $DIR/d36/f36
3910 $RUNAS utime $DIR/d36/f36 || error "utime failed for OST as non-root"
3912 run_test 36d "non-root OST utime check (open, utime)"
3915 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping"
3917 test_mkdir $DIR/$tdir
3918 touch $DIR/$tdir/$tfile
3919 $RUNAS utime $DIR/$tdir/$tfile &&
3920 error "utime worked, expected failure" || true
3922 run_test 36e "utime on non-owned file (should return error)"
3926 local LANG_SAVE=$LANG
3927 local LC_LANG_SAVE=$LC_LANG
3928 export LANG=C LC_LANG=C # for date language
3930 DATESTR="Dec 20 2000"
3931 test_mkdir $DIR/$tdir
3932 lctl set_param fail_loc=$fl
3934 cp /etc/hosts $DIR/$tdir/$tfile
3935 sync & # write RPC generated with "current" inode timestamp, but delayed
3937 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
3938 LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
3939 cancel_lru_locks $OSC
3940 LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object
3942 [ "$LS_BEFORE" != "$LS_AFTER" ] && \
3943 echo "BEFORE: $LS_BEFORE" && \
3944 echo "AFTER : $LS_AFTER" && \
3945 echo "WANT : $DATESTR" && \
3946 error "$DIR/$tdir/$tfile timestamps changed" || true
3948 export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE
3952 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3954 #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
3955 subr_36fh "0x80000214"
3957 run_test 36f "utime on file racing with OST BRW write =========="
3960 remote_ost_nodsh && skip "remote OST with nodsh"
3961 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3962 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
3963 skip "Need MDS version at least 2.12.51"
3968 local tgt="obdfilter"
3970 [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1"
3972 test_mkdir $DIR/$tdir
3973 fmd_max_age=$(do_facet $facet \
3974 "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \
3977 echo "FMD max age: ${fmd_max_age}s"
3978 touch $DIR/$tdir/$tfile
3979 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3980 gawk '{cnt=cnt+$1} END{print cnt}')
3981 echo "FMD before: $fmd"
3983 error "FMD wasn't create by touch"
3984 sleep $((fmd_max_age + 12))
3985 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3986 gawk '{cnt=cnt+$1} END{print cnt}')
3987 echo "FMD after: $fmd"
3989 error "FMD wasn't expired by ping"
3991 run_test 36g "FMD cache expiry ====================="
3994 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3996 #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227
3997 subr_36fh "0x80000227"
3999 run_test 36h "utime on file racing with OST BRW write =========="
4002 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
4004 test_mkdir $DIR/$tdir
4005 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
4007 local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
4008 local new_mtime=$((mtime + 200))
4010 #change Modify time of striped dir
4011 touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
4012 error "change mtime failed"
4014 local got=$(stat -c%Y $DIR/$tdir/striped_dir)
4016 [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
4018 run_test 36i "change mtime on striped directory"
4020 # test_37 - duplicate with tests 32q 32r
4023 local file=$DIR/$tfile
4025 openfile -f O_DIRECTORY $file
4028 [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true
4029 [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)"
4031 run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ==="
4033 test_39a() { # was test_39
4035 touch $DIR/${tfile}2
4036 # ls -l $DIR/$tfile $DIR/${tfile}2
4037 # ls -lu $DIR/$tfile $DIR/${tfile}2
4038 # ls -lc $DIR/$tfile $DIR/${tfile}2
4040 $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
4041 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
4043 ls -l --full-time $DIR/$tfile $DIR/${tfile}2
4045 ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
4047 ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
4048 error "O_TRUNC didn't change timestamps"
4051 run_test 39a "mtime changed on create"
4054 test_mkdir -c1 $DIR/$tdir
4055 cp -p /etc/passwd $DIR/$tdir/fopen
4056 cp -p /etc/passwd $DIR/$tdir/flink
4057 cp -p /etc/passwd $DIR/$tdir/funlink
4058 cp -p /etc/passwd $DIR/$tdir/frename
4059 ln $DIR/$tdir/funlink $DIR/$tdir/funlink2
4062 echo "aaaaaa" >> $DIR/$tdir/fopen
4063 echo "aaaaaa" >> $DIR/$tdir/flink
4064 echo "aaaaaa" >> $DIR/$tdir/funlink
4065 echo "aaaaaa" >> $DIR/$tdir/frename
4067 local open_new=`stat -c %Y $DIR/$tdir/fopen`
4068 local link_new=`stat -c %Y $DIR/$tdir/flink`
4069 local unlink_new=`stat -c %Y $DIR/$tdir/funlink`
4070 local rename_new=`stat -c %Y $DIR/$tdir/frename`
4072 cat $DIR/$tdir/fopen > /dev/null
4073 ln $DIR/$tdir/flink $DIR/$tdir/flink2
4074 rm -f $DIR/$tdir/funlink2
4075 mv -f $DIR/$tdir/frename $DIR/$tdir/frename2
4077 for (( i=0; i < 2; i++ )) ; do
4078 local open_new2=`stat -c %Y $DIR/$tdir/fopen`
4079 local link_new2=`stat -c %Y $DIR/$tdir/flink`
4080 local unlink_new2=`stat -c %Y $DIR/$tdir/funlink`
4081 local rename_new2=`stat -c %Y $DIR/$tdir/frename2`
4083 [ $open_new2 -eq $open_new ] || error "open file reverses mtime"
4084 [ $link_new2 -eq $link_new ] || error "link file reverses mtime"
4085 [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime"
4086 [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime"
4088 cancel_lru_locks $OSC
4089 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4092 run_test 39b "mtime change on open, link, unlink, rename ======"
4094 # this should be set to past
4095 TEST_39_MTIME=`date -d "1 year ago" +%s`
4101 local mtime0=`stat -c %Y $DIR1/$tfile`
4103 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4104 local mtime1=`stat -c %Y $DIR1/$tfile`
4105 [ "$mtime1" = $TEST_39_MTIME ] || \
4106 error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME"
4109 echo hello >> $DIR1/$tfile
4111 local mtime2=`stat -c %Y $DIR1/$tfile`
4112 [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \
4113 error "mtime is not updated on write: $d1 <= $mtime2 <= $d2"
4115 mv $DIR1/$tfile $DIR1/$tfile-1
4117 for (( i=0; i < 2; i++ )) ; do
4118 local mtime3=`stat -c %Y $DIR1/$tfile-1`
4119 [ "$mtime2" = "$mtime3" ] || \
4120 error "mtime ($mtime2) changed (to $mtime3) on rename"
4122 cancel_lru_locks $OSC
4123 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4126 run_test 39c "mtime change on rename ==========================="
4130 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4133 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4135 for (( i=0; i < 2; i++ )) ; do
4136 local mtime=`stat -c %Y $DIR1/$tfile`
4137 [ $mtime = $TEST_39_MTIME ] || \
4138 error "mtime($mtime) is not set to $TEST_39_MTIME"
4140 cancel_lru_locks $OSC
4141 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4144 run_test 39d "create, utime, stat =============================="
4148 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4151 local mtime1=`stat -c %Y $DIR1/$tfile`
4153 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4155 for (( i=0; i < 2; i++ )) ; do
4156 local mtime2=`stat -c %Y $DIR1/$tfile`
4157 [ $mtime2 = $TEST_39_MTIME ] || \
4158 error "mtime($mtime2) is not set to $TEST_39_MTIME"
4160 cancel_lru_locks $OSC
4161 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4164 run_test 39e "create, stat, utime, stat ========================"
4168 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4171 mtime1=`stat -c %Y $DIR1/$tfile`
4174 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4176 for (( i=0; i < 2; i++ )) ; do
4177 local mtime2=`stat -c %Y $DIR1/$tfile`
4178 [ $mtime2 = $TEST_39_MTIME ] || \
4179 error "mtime($mtime2) is not set to $TEST_39_MTIME"
4181 cancel_lru_locks $OSC
4182 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4185 run_test 39f "create, stat, sleep, utime, stat ================="
4189 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4191 echo hello >> $DIR1/$tfile
4192 local mtime1=`stat -c %Y $DIR1/$tfile`
4195 chmod o+r $DIR1/$tfile
4197 for (( i=0; i < 2; i++ )) ; do
4198 local mtime2=`stat -c %Y $DIR1/$tfile`
4199 [ "$mtime1" = "$mtime2" ] || \
4200 error "lost mtime: $mtime2, should be $mtime1"
4202 cancel_lru_locks $OSC
4203 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4206 run_test 39g "write, chmod, stat ==============================="
4210 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4216 echo hello >> $DIR1/$tfile
4217 local mtime1=`stat -c %Y $DIR1/$tfile`
4219 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4221 if [ "$d1" != "$d2" ]; then
4222 echo "write and touch not within one second"
4224 for (( i=0; i < 2; i++ )) ; do
4225 local mtime2=`stat -c %Y $DIR1/$tfile`
4226 [ "$mtime2" = $TEST_39_MTIME ] || \
4227 error "lost mtime: $mtime2, should be $TEST_39_MTIME"
4229 cancel_lru_locks $OSC
4230 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4234 run_test 39h "write, utime within one second, stat ============="
4237 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4242 echo hello >> $DIR1/$tfile
4243 local mtime1=`stat -c %Y $DIR1/$tfile`
4245 mv $DIR1/$tfile $DIR1/$tfile-1
4247 for (( i=0; i < 2; i++ )) ; do
4248 local mtime2=`stat -c %Y $DIR1/$tfile-1`
4250 [ "$mtime1" = "$mtime2" ] || \
4251 error "lost mtime: $mtime2, should be $mtime1"
4253 cancel_lru_locks $OSC
4254 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4257 run_test 39i "write, rename, stat =============================="
4260 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4262 start_full_debug_logging
4266 #define OBD_FAIL_OSC_DELAY_SETTIME 0x412
4267 lctl set_param fail_loc=0x80000412
4268 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c ||
4269 error "multiop failed"
4271 local mtime1=`stat -c %Y $DIR1/$tfile`
4273 mv $DIR1/$tfile $DIR1/$tfile-1
4275 kill -USR1 $multipid
4276 wait $multipid || error "multiop close failed"
4278 for (( i=0; i < 2; i++ )) ; do
4279 local mtime2=`stat -c %Y $DIR1/$tfile-1`
4280 [ "$mtime1" = "$mtime2" ] ||
4281 error "mtime is lost on close: $mtime2, " \
4285 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4287 lctl set_param fail_loc=0
4288 stop_full_debug_logging
4290 run_test 39j "write, rename, close, stat ======================="
4293 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4298 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed"
4300 local mtime1=`stat -c %Y $DIR1/$tfile`
4302 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4304 kill -USR1 $multipid
4305 wait $multipid || error "multiop close failed"
4307 for (( i=0; i < 2; i++ )) ; do
4308 local mtime2=`stat -c %Y $DIR1/$tfile`
4310 [ "$mtime2" = $TEST_39_MTIME ] || \
4311 error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
4314 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4317 run_test 39k "write, utime, close, stat ========================"
4319 # this should be set to future
4320 TEST_39_ATIME=`date -d "1 year" +%s`
4323 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4324 remote_mds_nodsh && skip "remote MDS with nodsh"
4326 local atime_diff=$(do_facet $SINGLEMDS \
4327 lctl get_param -n mdd.*MDT0000*.atime_diff)
4331 # test setting directory atime to future
4332 touch -a -d @$TEST_39_ATIME $DIR/$tdir
4333 local atime=$(stat -c %X $DIR/$tdir)
4334 [ "$atime" = $TEST_39_ATIME ] ||
4335 error "atime is not set to future: $atime, $TEST_39_ATIME"
4337 # test setting directory atime from future to now
4338 local now=$(date +%s)
4339 touch -a -d @$now $DIR/$tdir
4341 atime=$(stat -c %X $DIR/$tdir)
4342 [ "$atime" -eq "$now" ] ||
4343 error "atime is not updated from future: $atime, $now"
4345 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=2
4348 # test setting directory atime when now > dir atime + atime_diff
4349 local d1=$(date +%s)
4351 local d2=$(date +%s)
4352 cancel_lru_locks mdc
4353 atime=$(stat -c %X $DIR/$tdir)
4354 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
4355 error "atime is not updated : $atime, should be $d2"
4357 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=60
4360 # test not setting directory atime when now < dir atime + atime_diff
4362 cancel_lru_locks mdc
4363 atime=$(stat -c %X $DIR/$tdir)
4364 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
4365 error "atime is updated to $atime, should remain $d1<atime<$d2"
4367 do_facet $SINGLEMDS \
4368 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
4370 run_test 39l "directory atime update ==========================="
4373 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4377 local far_past_mtime=$(date -d "May 29 1953" +%s)
4378 local far_past_atime=$(date -d "Dec 17 1903" +%s)
4380 touch -m -d @$far_past_mtime $DIR1/$tfile
4381 touch -a -d @$far_past_atime $DIR1/$tfile
4383 for (( i=0; i < 2; i++ )) ; do
4384 local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
4385 [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
4386 error "atime or mtime set incorrectly"
4388 cancel_lru_locks $OSC
4389 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4392 run_test 39m "test atime and mtime before 1970"
4394 test_39n() { # LU-3832
4395 remote_mds_nodsh && skip "remote MDS with nodsh"
4397 local atime_diff=$(do_facet $SINGLEMDS \
4398 lctl get_param -n mdd.*MDT0000*.atime_diff)
4403 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
4406 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
4407 atime0=$(stat -c %X $DIR/$tfile)
4410 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
4411 atime1=$(stat -c %X $DIR/$tfile)
4414 cancel_lru_locks mdc
4415 cancel_lru_locks osc
4416 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
4417 atime2=$(stat -c %X $DIR/$tfile)
4419 do_facet $SINGLEMDS \
4420 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
4422 [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
4423 [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
4425 run_test 39n "check that O_NOATIME is honored"
4428 TESTDIR=$DIR/$tdir/$tfile
4429 [ -e $TESTDIR ] && rm -rf $TESTDIR
4436 links2=$(stat -c %h .)
4437 [ $(($links1 + 2)) != $links2 ] &&
4438 error "wrong links count $(($links1 + 2)) != $links2"
4440 links3=$(stat -c %h .)
4441 [ $(($links1 + 1)) != $links3 ] &&
4442 error "wrong links count $links1 != $links3"
4445 run_test 39o "directory cached attributes updated after create"
4448 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
4451 TESTDIR=$DIR/$tdir/$tdir
4452 [ -e $TESTDIR ] && rm -rf $TESTDIR
4453 test_mkdir -p $TESTDIR
4457 test_mkdir -i $MDTIDX $TESTDIR/remote_dir1
4458 test_mkdir -i $MDTIDX $TESTDIR/remote_dir2
4460 links2=$(stat -c %h .)
4461 [ $(($links1 + 2)) != $links2 ] &&
4462 error "wrong links count $(($links1 + 2)) != $links2"
4464 links3=$(stat -c %h .)
4465 [ $(($links1 + 1)) != $links3 ] &&
4466 error "wrong links count $links1 != $links3"
4469 run_test 39p "remote directory cached attributes updated after create ========"
4472 test_39q() { # LU-8041
4473 local testdir=$DIR/$tdir
4475 multiop_bg_pause $testdir D_c || error "multiop failed"
4477 cancel_lru_locks mdc
4478 kill -USR1 $multipid
4479 local atime=$(stat -c %X $testdir)
4480 [ "$atime" -ne 0 ] || error "atime is zero"
4482 run_test 39q "close won't zero out atime"
4485 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
4486 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
4487 error "openfile O_WRONLY:O_TRUNC $tfile failed"
4488 $CHECKSTAT -t file -s 4096 $DIR/$tfile ||
4489 error "$tfile is not 4096 bytes in size"
4491 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
4495 small_write $DIR/f41 18
4497 run_test 41 "test small file write + fstat ====================="
4499 count_ost_writes() {
4500 lctl get_param -n ${OSC}.*.stats |
4501 awk -vwrites=0 '/ost_write/ { writes += $2 } \
4502 END { printf("%0.0f", writes) }'
4509 BG_DIRTY_RATIO_SAVE=10
4510 MAX_BG_DIRTY_RATIO=25
4514 # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs,
4515 # dirty_ratio, dirty_background_ratio
4516 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4517 sysctl -w vm.dirty_writeback_centisecs=$WRITEBACK_SAVE
4518 sysctl -w vm.dirty_background_ratio=$BG_DIRTY_RATIO_SAVE
4519 sysctl -w vm.dirty_ratio=$DIRTY_RATIO_SAVE
4521 # if file not here, we are a 2.4 kernel
4522 kill -CONT `pidof kupdated`
4527 # setup the trap first, so someone cannot exit the test at the
4528 # exact wrong time and mess up a machine
4529 trap start_writeback EXIT
4530 # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
4531 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4532 WRITEBACK_SAVE=`sysctl -n vm.dirty_writeback_centisecs`
4533 sysctl -w vm.dirty_writeback_centisecs=0
4534 sysctl -w vm.dirty_writeback_centisecs=0
4535 # save and increase /proc/sys/vm/dirty_ratio
4536 DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_ratio`
4537 sysctl -w vm.dirty_ratio=$MAX_DIRTY_RATIO
4538 # save and increase /proc/sys/vm/dirty_background_ratio
4539 BG_DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_background_ratio`
4540 sysctl -w vm.dirty_background_ratio=$MAX_BG_DIRTY_RATIO
4542 # if file not here, we are a 2.4 kernel
4543 kill -STOP `pidof kupdated`
4547 # ensure that all stripes have some grant before we test client-side cache
4549 for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
4550 dd if=/dev/zero of=$i bs=4k count=1
4555 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
4556 # file truncation, and file removal.
4558 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4561 cancel_lru_locks $OSC
4563 sync; sleep 1; sync # just to be safe
4564 BEFOREWRITES=`count_ost_writes`
4565 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur_grant_bytes | grep "[0-9]"
4566 dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
4567 AFTERWRITES=`count_ost_writes`
4568 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
4569 error "$BEFOREWRITES < $AFTERWRITES"
4572 run_test 42a "ensure that we don't flush on close"
4575 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4578 cancel_lru_locks $OSC
4581 dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
4582 BEFOREWRITES=$(count_ost_writes)
4583 $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
4584 AFTERWRITES=$(count_ost_writes)
4585 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4586 error "$BEFOREWRITES < $AFTERWRITES on unlink"
4588 BEFOREWRITES=$(count_ost_writes)
4589 sync || error "sync: $?"
4590 AFTERWRITES=$(count_ost_writes)
4591 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4592 error "$BEFOREWRITES < $AFTERWRITES on sync"
4594 dmesg | grep 'error from obd_brw_async' && error 'error writing back'
4598 run_test 42b "test destroy of file with cached dirty data ======"
4600 # if these tests just want to test the effect of truncation,
4601 # they have to be very careful. consider:
4602 # - the first open gets a {0,EOF}PR lock
4603 # - the first write conflicts and gets a {0, count-1}PW
4604 # - the rest of the writes are under {count,EOF}PW
4605 # - the open for truncate tries to match a {0,EOF}PR
4606 # for the filesize and cancels the PWs.
4607 # any number of fixes (don't get {0,EOF} on open, match
4608 # composite locks, do smarter file size management) fix
4609 # this, but for now we want these tests to verify that
4610 # the cancellation with truncate intent works, so we
4611 # start the file with a full-file pw lock to match against
4612 # until the truncate.
4617 cancel_lru_locks $OSC
4619 # prime the file with 0,EOF PW to match
4623 # now the real test..
4624 dd if=/dev/zero of=$file bs=1024 count=100
4625 BEFOREWRITES=`count_ost_writes`
4626 $TRUNCATE $file $offset
4627 cancel_lru_locks $OSC
4628 AFTERWRITES=`count_ost_writes`
4633 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4636 [ $BEFOREWRITES -eq $AFTERWRITES ] &&
4637 error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
4640 run_test 42c "test partial truncate of file with cached dirty data"
4643 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4646 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
4647 error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
4650 run_test 42d "test complete truncate of file with cached dirty data"
4652 test_42e() { # bug22074
4653 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4655 local TDIR=$DIR/${tdir}e
4656 local pages=16 # hardcoded 16 pages, don't change it.
4657 local files=$((OSTCOUNT * 500)) # hopefully 500 files on each OST
4658 local proc_osc0="osc.${FSNAME}-OST0000-osc-[^MDT]*"
4662 test_mkdir $DIR/${tdir}e
4663 $LFS setstripe -c 1 $TDIR
4664 createmany -o $TDIR/f $files
4666 max_dirty_mb=$($LCTL get_param -n $proc_osc0/max_dirty_mb)
4668 # we assume that with $OSTCOUNT files, at least one of them will
4669 # be allocated on OST0.
4670 warmup_files=$((OSTCOUNT * max_dirty_mb))
4671 createmany -o $TDIR/w $warmup_files
4673 # write a large amount of data into one file and sync, to get good
4674 # avail_grant number from OST.
4675 for ((i=0; i<$warmup_files; i++)); do
4676 idx=$($LFS getstripe -i $TDIR/w$i)
4677 [ $idx -ne 0 ] && continue
4678 dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1
4681 [[ $i -gt $warmup_files ]] && error "OST0 is still cold"
4683 $LCTL get_param $proc_osc0/cur_dirty_bytes
4684 $LCTL get_param $proc_osc0/cur_grant_bytes
4686 # create as much dirty pages as we can while not to trigger the actual
4687 # RPCs directly. but depends on the env, VFS may trigger flush during this
4688 # period, hopefully we are good.
4689 for ((i=0; i<$warmup_files; i++)); do
4690 idx=$($LFS getstripe -i $TDIR/w$i)
4691 [ $idx -ne 0 ] && continue
4692 dd if=/dev/zero of=$TDIR/w$i bs=1M count=1 2>/dev/null
4694 $LCTL get_param $proc_osc0/cur_dirty_bytes
4695 $LCTL get_param $proc_osc0/cur_grant_bytes
4697 # perform the real test
4698 $LCTL set_param $proc_osc0/rpc_stats 0
4699 for ((;i<$files; i++)); do
4700 [ $($LFS getstripe -i $TDIR/f$i) -eq 0 ] || continue
4701 dd if=/dev/zero of=$TDIR/f$i bs=$PAGE_SIZE count=$pages 2>/dev/null
4704 $LCTL get_param $proc_osc0/rpc_stats
4707 local have_ppr=false
4708 $LCTL get_param $proc_osc0/rpc_stats |
4709 while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do
4710 # skip lines until we are at the RPC histogram data
4711 [ "$PPR" == "pages" ] && have_ppr=true && continue
4712 $have_ppr || continue
4714 # we only want the percent stat for < 16 pages
4715 [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break
4717 percent=$((percent + WPCT))
4718 if [[ $percent -gt 15 ]]; then
4719 error "less than 16-pages write RPCs" \
4726 run_test 42e "verify sub-RPC writes are not done synchronously"
4728 test_43A() { # was test_43
4729 test_mkdir $DIR/$tdir
4730 cp -p /bin/ls $DIR/$tdir/$tfile
4731 $MULTIOP $DIR/$tdir/$tfile Ow_c &
4733 # give multiop a chance to open
4736 $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true
4739 run_test 43A "execution of file opened for write should return -ETXTBSY"
4742 test_mkdir $DIR/$tdir
4743 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4744 $DIR/$tdir/sleep 60 &
4746 # Make sure exec of $tdir/sleep wins race with truncate
4748 $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success"
4751 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
4754 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4756 test_mkdir $DIR/$tdir
4757 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4758 $DIR/$tdir/sleep 60 &
4760 # Make sure exec of $tdir/sleep wins race with truncate
4762 $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success"
4765 run_test 43b "truncate of file being executed should return -ETXTBSY"
4768 local testdir="$DIR/$tdir"
4771 ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) |
4772 ( cd $testdir && md5sum -c )
4774 run_test 43c "md5sum of copy into lustre"
4776 test_44A() { # was test_44
4777 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4779 dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
4780 dd if=$DIR/f1 bs=4k count=1 > /dev/null
4782 run_test 44A "zero length read from a sparse stripe"
4785 local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
4787 [ -z "$nstripe" ] && skip "can't get stripe info"
4788 [[ $nstripe -gt $OSTCOUNT ]] &&
4789 skip "Wrong default_stripe_count: $nstripe OSTCOUNT: $OSTCOUNT"
4791 local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: |
4793 if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then
4794 nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: |
4798 OFFSETS="0 $((stride/2)) $((stride-1))"
4799 for offset in $OFFSETS; do
4800 for i in $(seq 0 $((nstripe-1))); do
4801 local GLOBALOFFSETS=""
4803 local size=$((((i + 2 * $nstripe )*$stride + $offset)))
4804 local myfn=$DIR/d44a-$size
4805 echo "--------writing $myfn at $size"
4806 ll_sparseness_write $myfn $size ||
4807 error "ll_sparseness_write"
4808 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4809 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4810 error "ll_sparseness_verify $GLOBALOFFSETS"
4812 for j in $(seq 0 $((nstripe-1))); do
4814 size=$((((j + $nstripe )*$stride + $offset)))
4815 ll_sparseness_write $myfn $size ||
4816 error "ll_sparseness_write"
4817 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4819 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4820 error "ll_sparseness_verify $GLOBALOFFSETS"
4825 run_test 44a "test sparse pwrite ==============================="
4829 for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
4835 before=`dirty_osc_total`
4836 echo executing "\"$*\""
4838 after=`dirty_osc_total`
4839 echo before $before, after $after
4842 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4845 # Obtain grants from OST if it supports it
4846 echo blah > ${f}_grant
4849 do_dirty_record "echo blah > $f"
4850 [[ $before -eq $after ]] && error "write wasn't cached"
4851 do_dirty_record "> $f"
4852 [[ $before -gt $after ]] || error "truncate didn't lower dirty count"
4853 do_dirty_record "echo blah > $f"
4854 [[ $before -eq $after ]] && error "write wasn't cached"
4855 do_dirty_record "sync"
4856 [[ $before -gt $after ]] || error "writeback didn't lower dirty count"
4857 do_dirty_record "echo blah > $f"
4858 [[ $before -eq $after ]] && error "write wasn't cached"
4859 do_dirty_record "cancel_lru_locks osc"
4860 [[ $before -gt $after ]] ||
4861 error "lock cancellation didn't lower dirty count"
4864 run_test 45 "osc io page accounting ============================"
4866 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this
4867 # test tickles a bug where re-dirtying a page was failing to be mapped to the
4868 # objects offset and an assert hit when an rpc was built with 1023's mapped
4869 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
4871 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4876 dd if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4878 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=1023 count=1
4879 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4883 run_test 46 "dirtying a previously written page ================"
4885 # test_47 is removed "Device nodes check" is moved to test_28
4887 test_48a() { # bug 2399
4888 [ "$mds1_FSTYPE" = "zfs" ] &&
4889 [ $MDS1_VERSION -lt $(version_code 2.3.63) ] &&
4890 skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly"
4892 test_mkdir $DIR/$tdir
4894 mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
4895 test_mkdir $DIR/$tdir
4896 touch foo || error "'touch foo' failed after recreating cwd"
4898 touch .foo || error "'touch .foo' failed after recreating cwd"
4900 ls . > /dev/null || error "'ls .' failed after recreating cwd"
4901 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4902 cd . || error "'cd .' failed after recreating cwd"
4903 mkdir . && error "'mkdir .' worked after recreating cwd"
4904 rmdir . && error "'rmdir .' worked after recreating cwd"
4905 ln -s . baz || error "'ln -s .' failed after recreating cwd"
4906 cd .. || error "'cd ..' failed after recreating cwd"
4908 run_test 48a "Access renamed working dir (should return errors)="
4910 test_48b() { # bug 2399
4912 test_mkdir $DIR/$tdir
4914 rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
4915 touch foo && error "'touch foo' worked after removing cwd"
4916 mkdir foo && error "'mkdir foo' worked after removing cwd"
4917 touch .foo && error "'touch .foo' worked after removing cwd"
4918 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
4919 ls . > /dev/null && error "'ls .' worked after removing cwd"
4920 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4921 mkdir . && error "'mkdir .' worked after removing cwd"
4922 rmdir . && error "'rmdir .' worked after removing cwd"
4923 ln -s . foo && error "'ln -s .' worked after removing cwd"
4924 cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
4926 run_test 48b "Access removed working dir (should return errors)="
4928 test_48c() { # bug 2350
4929 #lctl set_param debug=-1
4932 test_mkdir -p $DIR/$tdir/dir
4934 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4935 $TRACE touch foo && error "touch foo worked after removing cwd"
4936 $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
4937 touch .foo && error "touch .foo worked after removing cwd"
4938 mkdir .foo && error "mkdir .foo worked after removing cwd"
4939 $TRACE ls . && error "'ls .' worked after removing cwd"
4940 $TRACE ls .. || error "'ls ..' failed after removing cwd"
4941 $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
4942 $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
4943 $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
4944 $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
4946 run_test 48c "Access removed working subdir (should return errors)"
4948 test_48d() { # bug 2350
4949 #lctl set_param debug=-1
4952 test_mkdir -p $DIR/$tdir/dir
4954 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4955 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4956 $TRACE touch foo && error "'touch foo' worked after removing parent"
4957 $TRACE mkdir foo && error "mkdir foo worked after removing parent"
4958 touch .foo && error "'touch .foo' worked after removing parent"
4959 mkdir .foo && error "mkdir .foo worked after removing parent"
4960 $TRACE ls . && error "'ls .' worked after removing parent"
4961 $TRACE ls .. && error "'ls ..' worked after removing parent"
4962 $TRACE mkdir . && error "'mkdir .' worked after removing parent"
4963 $TRACE rmdir . && error "'rmdir .' worked after removing parent"
4964 $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
4967 run_test 48d "Access removed parent subdir (should return errors)"
4969 test_48e() { # bug 4134
4970 #lctl set_param debug=-1
4973 test_mkdir -p $DIR/$tdir/dir
4975 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4976 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4977 $TRACE touch $DIR/$tdir || error "'touch $DIR/$tdir' failed"
4978 $TRACE chmod +x $DIR/$tdir || error "'chmod +x $DIR/$tdir' failed"
4979 # On a buggy kernel addition of "touch foo" after cd .. will
4980 # produce kernel oops in lookup_hash_it
4981 touch ../foo && error "'cd ..' worked after recreate parent"
4983 $TRACE rm $DIR/$tdir || error "rm '$DIR/$tdir' failed"
4985 run_test 48e "Access to recreated parent subdir (should return errors)"
4987 test_49() { # LU-1030
4988 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4989 remote_ost_nodsh && skip "remote OST with nodsh"
4991 # get ost1 size - $FSNAME-OST0000
4992 ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
4994 # write 800M at maximum
4995 [[ $ost1_size -lt 2 ]] && ost1_size=2
4996 [[ $ost1_size -gt 819200 ]] && ost1_size=819200
4998 $LFS setstripe -c 1 -i 0 $DIR/$tfile
4999 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) &
5002 # change max_pages_per_rpc while writing the file
5003 local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc
5004 local orig_mppc=$($LCTL get_param -n $osc1_mppc)
5005 # loop until dd process exits
5006 while ps ax -opid | grep -wq $dd_pid; do
5007 $LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1))
5008 sleep $((RANDOM % 5 + 1))
5010 # restore original max_pages_per_rpc
5011 $LCTL set_param $osc1_mppc=$orig_mppc
5012 rm $DIR/$tfile || error "rm $DIR/$tfile failed"
5014 run_test 49 "Change max_pages_per_rpc won't break osc extent"
5018 test_mkdir $DIR/$tdir
5020 ls /proc/$$/cwd || error "ls /proc/$$/cwd failed"
5022 run_test 50 "special situations: /proc symlinks ==============="
5024 test_51a() { # was test_51
5025 # bug 1516 - create an empty entry right after ".." then split dir
5026 test_mkdir -c1 $DIR/$tdir
5027 touch $DIR/$tdir/foo
5028 $MCREATE $DIR/$tdir/bar
5030 createmany -m $DIR/$tdir/longfile 201
5032 while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do
5033 $MCREATE $DIR/$tdir/longfile$FNUM
5038 ls -l $DIR/$tdir > /dev/null || error "ls -l $DIR/$tdir failed"
5040 run_test 51a "special situations: split htree with empty entry =="
5042 cleanup_print_lfs_df () {
5049 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5051 local dir=$DIR/$tdir
5052 local nrdirs=$((65536 + 100))
5054 # cleanup the directory
5061 local mdtidx=$(printf "%04x" $($LFS getstripe -m $dir))
5062 local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
5063 [[ $numfree -lt $nrdirs ]] &&
5064 skip "not enough free inodes ($numfree) on MDT$mdtidx"
5066 # need to check free space for the directories as well
5067 local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
5068 numfree=$(( blkfree / $(fs_inode_ksize) ))
5069 [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)"
5071 trap cleanup_print_lfs_df EXIT
5074 createmany -d $dir/d $nrdirs || {
5075 unlinkmany $dir/d $nrdirs
5076 error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
5080 nrdirs=$(ls -U $dir | wc -l)
5082 # unlink all but 100 subdirectories, then check it still works
5084 local delete=$((nrdirs - left))
5089 # for ldiskfs the nlink count should be 1, but this is OSD specific
5090 # and so this is listed for informational purposes only
5091 echo "nlink before: $(stat -c %h $dir), created before: $nrdirs"
5092 unlinkmany -d $dir/d $delete ||
5093 error "unlink of first $delete subdirs failed"
5095 echo "nlink between: $(stat -c %h $dir)"
5096 local found=$(ls -U $dir | wc -l)
5097 [ $found -ne $left ] &&
5098 error "can't find subdirs: found only $found, expected $left"
5100 unlinkmany -d $dir/d $delete $left ||
5101 error "unlink of second $left subdirs failed"
5102 # regardless of whether the backing filesystem tracks nlink accurately
5103 # or not, the nlink count shouldn't be more than "." and ".." here
5104 local after=$(stat -c %h $dir)
5105 [[ $after -gt 2 ]] && error "nlink after: $after > 2" ||
5106 echo "nlink after: $after"
5108 cleanup_print_lfs_df
5110 run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
5113 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5114 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
5116 test_mkdir $DIR/$tdir
5117 createmany -o $DIR/$tdir/t- 1000
5118 $LFS getstripe $DIR/$tdir > $TMP/$tfile
5119 for N in $(seq 0 $((OSTCOUNT - 1))); do
5120 OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
5121 END { printf("%0.0f", objs) }' $TMP/$tfile)
5122 OBJS0[$N]=$(grep -A 1 idx $TMP/$tfile | awk -vobjs=0 \
5123 '($1 == '$N') { objs += 1 } \
5124 END { printf("%0.0f", objs) }')
5125 log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
5127 unlinkmany $DIR/$tdir/t- 1000
5130 for N in $(seq 1 $((OSTCOUNT - 1))); do
5131 [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] &&
5132 error "OST $N has less objects vs OST $NLAST" \
5133 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
5134 [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] &&
5135 error "OST $N has less objects vs OST $NLAST" \
5136 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
5138 [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] &&
5139 error "OST $N has less #0 objects vs OST $NLAST" \
5140 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
5141 [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] &&
5142 error "OST $N has less #0 objects vs OST $NLAST" \
5143 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
5148 run_test 51d "check object distribution"
5151 if [ "$mds1_FSTYPE" != ldiskfs ]; then
5152 skip_env "ldiskfs only test"
5155 test_mkdir -c1 $DIR/$tdir
5156 test_mkdir -c1 $DIR/$tdir/d0
5158 touch $DIR/$tdir/d0/foo
5159 createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
5160 error "file exceed 65000 nlink limit!"
5161 unlinkmany $DIR/$tdir/d0/f- 65001
5164 run_test 51e "check file nlink limit"
5167 test_mkdir $DIR/$tdir
5170 local ulimit_old=$(ulimit -n)
5171 local spare=20 # number of spare fd's for scripts/libraries, etc.
5172 local mdt=$($LFS getstripe -m $DIR/$tdir)
5173 local numfree=$($LFS df -i $DIR/$tdir | awk '/MDT:'$mdt'/ { print $4 }')
5175 echo "MDT$mdt numfree=$numfree, max=$max"
5176 [[ $numfree -gt $max ]] && numfree=$max || numfree=$((numfree * 7 / 8))
5177 if [ $((numfree + spare)) -gt $ulimit_old ]; then
5178 while ! ulimit -n $((numfree + spare)); do
5179 numfree=$((numfree * 3 / 4))
5181 echo "changed ulimit from $ulimit_old to $((numfree + spare))"
5183 echo "left ulimit at $ulimit_old"
5186 createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
5187 unlinkmany $DIR/$tdir/f $numfree
5188 error "create+open $numfree files in $DIR/$tdir failed"
5190 ulimit -n $ulimit_old
5192 # if createmany exits at 120s there will be fewer than $numfree files
5193 unlinkmany $DIR/$tdir/f $numfree || true
5195 run_test 51f "check many open files limit"
5198 [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
5199 test_mkdir $DIR/$tdir
5200 touch $DIR/$tdir/foo
5201 chattr +a $DIR/$tdir/foo || error "chattr +a failed"
5202 echo bar >> $DIR/$tdir/foo || error "append bar failed"
5203 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
5204 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
5205 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
5207 echo foo >> $DIR/$tdir/foo || error "append foo failed"
5208 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
5209 lsattr $DIR/$tdir/foo | egrep -q "^-+a[-e]+ $DIR/$tdir/foo" ||
5211 chattr -a $DIR/$tdir/foo || error "chattr -a failed"
5212 cp -r $DIR/$tdir $TMP/
5213 rm -fr $DIR/$tdir $TMP/$tdir || error "cleanup rm failed"
5215 run_test 52a "append-only flag test (should return errors)"
5218 [ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo
5219 test_mkdir $DIR/$tdir
5220 touch $DIR/$tdir/foo
5221 chattr +i $DIR/$tdir/foo || error "chattr +i failed"
5222 cat test > $DIR/$tdir/foo && error "cat test worked"
5223 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
5224 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
5225 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
5227 echo foo >> $DIR/$tdir/foo && error "echo worked"
5228 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
5229 [ -f $DIR/$tdir/foo ] || error "$tdir/foo is not a file"
5230 [ -f $DIR/$tdir/foo_ren ] && error "$tdir/foo_ren is not a file"
5231 lsattr $DIR/$tdir/foo | egrep -q "^-+i[-e]+ $DIR/$tdir/foo" ||
5233 chattr -i $DIR/$tdir/foo || error "chattr failed"
5235 rm -fr $DIR/$tdir || error "unable to remove $DIR/$tdir"
5237 run_test 52b "immutable flag test (should return errors) ======="
5240 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5241 remote_mds_nodsh && skip "remote MDS with nodsh"
5242 remote_ost_nodsh && skip "remote OST with nodsh"
5255 local support_last_seq=true
5257 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
5258 support_last_seq=false
5261 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
5263 for value in $(do_facet $SINGLEMDS \
5264 $LCTL get_param osp.$mdtosc.prealloc_last_id) ; do
5265 param=$(echo ${value[0]} | cut -d "=" -f1)
5266 ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
5268 if $support_last_seq; then
5269 param_seq=$(echo $param |
5270 sed -e s/prealloc_last_id/prealloc_last_seq/g)
5271 mds_last_seq=$(do_facet $SINGLEMDS \
5272 $LCTL get_param -n $param_seq)
5274 mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
5276 ostnum=$(index_from_ostuuid ${ostname}_UUID)
5277 node=$(facet_active_host ost$((ostnum+1)))
5278 param="obdfilter.$ostname.last_id"
5279 for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
5280 echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
5281 ost_last_id=$ost_last
5283 if $support_last_seq; then
5284 ost_last_id=$(echo $ost_last |
5285 awk -F':' '{print $2}' |
5287 ost_last_seq=$(echo $ost_last |
5288 awk -F':' '{print $1}')
5289 [[ $ost_last_seq = $mds_last_seq ]] || continue
5292 if [[ $ost_last_id != $mds_last ]]; then
5293 error "$ost_last_id != $mds_last"
5300 $found || error "can not match last_seq/last_id for $mdtosc"
5303 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
5306 perl -MSocket -e ';' || skip "no Socket perl module installed"
5308 $SOCKETSERVER $DIR/socket ||
5309 error "$SOCKETSERVER $DIR/socket failed: $?"
5310 $SOCKETCLIENT $DIR/socket ||
5311 error "$SOCKETCLIENT $DIR/socket failed: $?"
5312 $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
5314 run_test 54a "unix domain socket test =========================="
5320 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1
5322 run_test 54b "char device works in lustre ======================"
5325 [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
5326 [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
5327 [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
5329 for i in $(seq 3 7); do
5330 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
5339 loopdev="$DIR/loop54c"
5342 $UMOUNT $DIR/$tdir || rc=$?
5343 losetup -d $loopdev || true
5344 losetup -d $LOOPDEV || true
5345 rm -rf $loopdev $DIR/$tfile $DIR/$tdir
5350 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5352 loopdev="$DIR/loop54c"
5355 [ -z "$LOOPNUM" ] && skip_env "couldn't find empty loop device"
5356 trap cleanup_54c EXIT
5357 mknod $loopdev b 7 $LOOPNUM
5358 echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
5359 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE seek=1024 count=1 > /dev/null
5360 losetup $loopdev $DIR/$tfile ||
5361 error "can't set up $loopdev for $DIR/$tfile"
5362 mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
5363 test_mkdir $DIR/$tdir
5364 mount -t ext2 $loopdev $DIR/$tdir ||
5365 error "error mounting $loopdev on $DIR/$tdir"
5366 dd if=/dev/zero of=$DIR/$tdir/tmp bs=$PAGE_SIZE count=30 ||
5369 dd if=$DIR/$tdir/tmp of=/dev/zero bs=$PAGE_SIZE count=30 ||
5373 run_test 54c "block device works in lustre ====================="
5379 [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string"
5381 run_test 54d "fifo device works in lustre ======================"
5386 cp -aL /dev/console $f
5387 echo $string > $f || error "echo $string to $f failed"
5389 run_test 54e "console/tty device works in lustre ======================"
5393 local dir=$DIR/$tdir
5396 test_mkdir -p $dir/dir
5397 for i in $(seq $numfiles); do
5399 touch $dir/dir/file$i
5402 local numcomp=$($LFS getstripe --component-count $dir)
5404 [[ $numcomp == 0 ]] && numcomp=1
5406 # test lfs getstripe with --recursive
5407 local filenum=$($LFS getstripe -r $dir | egrep -c "obdidx|l_ost_idx")
5409 [[ $filenum -eq $((numfiles * 2)) ]] ||
5410 error "$LFS getstripe -r: found $filenum != $((numfiles * 2))"
5411 filenum=$($LFS getstripe $dir | egrep -c "obdidx|l_ost_idx")
5412 [[ $filenum -eq $numfiles ]] ||
5413 error "$LFS getstripe $dir: found $filenum, not $numfiles"
5414 echo "$LFS getstripe showed obdidx or l_ost_idx"
5416 # test lfs getstripe with file instead of dir
5417 filenum=$($LFS getstripe $dir/file1 | egrep -c "obdidx|l_ost_idx")
5418 [[ $filenum -eq 1 ]] ||
5419 error "$LFS getstripe $dir/file1: found $filenum, not 1"
5420 echo "$LFS getstripe file1 passed"
5422 #test lfs getstripe with --verbose
5423 filenum=$($LFS getstripe --verbose $dir | grep -c lmm_magic)
5424 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
5425 error "$LFS getstripe --verbose $dir: "\
5426 "got $filenum want $((numfiles * numcomp)) lmm_magic"
5427 [[ $($LFS getstripe $dir | grep -c lmm_magic) -eq 0 ]] ||
5428 error "$LFS getstripe $dir: showed lmm_magic"
5430 #test lfs getstripe with -v prints lmm_fid
5431 filenum=$($LFS getstripe -v $dir | grep -c lmm_fid)
5432 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
5433 error "$LFS getstripe -v $dir: "\
5434 "got $filenum want $((numfiles * numcomp)) lmm_fid"
5435 [[ $($LFS getstripe $dir | grep -c lmm_fid) -eq 0 ]] ||
5436 error "$LFS getstripe $dir: showed lmm_fid by default"
5437 echo "$LFS getstripe --verbose passed"
5439 #check for FID information
5440 local fid1=$($LFS getstripe --fid $dir/file1)
5441 local fid2=$($LFS getstripe --verbose $dir/file1 |
5442 awk '/lmm_fid: / { print $2; exit; }')
5443 local fid3=$($LFS path2fid $dir/file1)
5445 [ "$fid1" != "$fid2" ] &&
5446 error "getstripe --fid '$fid1' != getstripe --verbose '$fid2'"
5447 [ "$fid1" != "$fid3" ] &&
5448 error "getstripe --fid '$fid1' != lfs path2fid '$fid3'"
5449 echo "$LFS getstripe --fid passed"
5451 #test lfs getstripe with --obd
5452 $LFS getstripe --obd wrong_uuid $dir 2>&1 | grep -q "unknown obduuid" ||
5453 error "$LFS getstripe --obd wrong_uuid: should return error"
5455 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5458 local obduuid=$(ostuuid_from_index $ostidx)
5459 local found=$($LFS getstripe -r --obd $obduuid $dir |
5460 grep 'lmm_stripe_offset:' | grep -c " $ostidx\$")
5462 filenum=$($LFS getstripe -ir $dir | grep -c "^$ostidx\$")
5463 [[ $($LFS getstripe -id $dir) -ne $ostidx ]] ||
5465 [[ $($LFS getstripe -id $dir/dir) -ne $ostidx ]] ||
5468 [[ $found -eq $filenum ]] ||
5469 error "$LFS getstripe --obd: found $found expect $filenum"
5470 [[ $($LFS getstripe -r -v --obd $obduuid $dir |
5471 sed '/^[ ]*'${ostidx}'[ ]/d' |
5472 sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] ||
5473 error "$LFS getstripe --obd: should not show file on other obd"
5474 echo "$LFS getstripe --obd passed"
5476 run_test 56a "check $LFS getstripe"
5479 local dir=$DIR/$tdir
5483 for i in $(seq $numdirs); do
5484 test_mkdir $dir/dir$i
5487 # test lfs getdirstripe default mode is non-recursion, which is
5488 # different from lfs getstripe
5489 local dircnt=$($LFS getdirstripe $dir | grep -c lmv_stripe_count)
5491 [[ $dircnt -eq 1 ]] ||
5492 error "$LFS getdirstripe: found $dircnt, not 1"
5493 dircnt=$($LFS getdirstripe --recursive $dir |
5494 grep -c lmv_stripe_count)
5495 [[ $dircnt -eq $((numdirs + 1)) ]] ||
5496 error "$LFS getdirstripe -r: $dircnt, != $((numdirs + 1))"
5498 run_test 56b "check $LFS getdirstripe"
5501 remote_ost_nodsh && skip "remote OST with nodsh"
5504 local ost_name=$(ostname_from_index $ost_idx)
5505 local old_status=$(ost_dev_status $ost_idx)
5507 [[ -z "$old_status" ]] ||
5508 skip_env "OST $ost_name is in $old_status status"
5510 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
5511 [[ $OST1_VERSION -ge $(version_code 2.12.55) ]] && do_facet ost1 \
5512 $LCTL set_param -n obdfilter.$ost_name.no_precreate=1
5515 local new_status=$(ost_dev_status $ost_idx)
5517 [[ "$new_status" =~ "D" ]] ||
5518 error "$ost_name status is '$new_status', missing 'D'"
5519 if [[ $OST1_VERSION -ge $(version_code 2.12.55) ]]; then
5520 [[ "$new_status" =~ "N" ]] ||
5521 error "$ost_name status is '$new_status', missing 'N'"
5524 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
5525 [[ $OST1_VERSION -ge $(version_code 2.12.55) ]] && do_facet ost1 \
5526 $LCTL set_param -n obdfilter.$ost_name.no_precreate=0
5529 new_status=$(ost_dev_status $ost_idx)
5530 [[ ! "$new_status" =~ "D" && ! "$new_status" =~ "N" ]] ||
5531 error "$ost_name status is '$new_status', has 'D' and/or 'N'"
5533 run_test 56c "check 'lfs df' showing device status"
5538 local local_tdir="$1"
5539 local local_numfiles="$2"
5540 local local_numdirs="$3"
5541 local dir_params="$4"
5542 local dir_stripe_params="$5"
5544 if [ ! -d "$local_tdir" ] ; then
5545 test_mkdir -p $dir_stripe_params $local_tdir
5546 [ "$dir_params" ] && $LFS setstripe $dir_params $local_tdir
5547 for i in $(seq $local_numfiles) ; do
5548 touch $local_tdir/file$i
5550 for i in $(seq $local_numdirs) ; do
5551 test_mkdir $dir_stripe_params $local_tdir/dir$i
5552 for j in $(seq $local_numfiles) ; do
5553 touch $local_tdir/dir$i/file$j
5559 setup_56_special() {
5561 local local_numfiles=$2
5562 local local_numdirs=$3
5564 setup_56 $local_tdir $local_numfiles $local_numdirs
5566 if [ ! -e "$local_tdir/loop${local_numfiles}b" ] ; then
5567 for i in $(seq $local_numfiles) ; do
5568 mknod $local_tdir/loop${i}b b 7 $i
5569 mknod $local_tdir/null${i}c c 1 3
5570 ln -s $local_tdir/file1 $local_tdir/link${i}
5572 for i in $(seq $local_numdirs) ; do
5573 mknod $local_tdir/dir$i/loop${i}b b 7 $i
5574 mknod $local_tdir/dir$i/null${i}c c 1 3
5575 ln -s $local_tdir/dir$i/file1 $local_tdir/dir$i/link${i}
5581 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5582 local expected=$(($NUMDIRS + 2))
5584 setup_56 $dir $NUMFILES $NUMDIRS
5586 # test lfs find with -name
5587 for i in $(seq $NUMFILES) ; do
5588 local nums=$($LFS find -name "*$i" $dir | wc -l)
5590 [ $nums -eq $expected ] ||
5591 error "lfs find -name '*$i' $dir wrong: "\
5592 "found $nums, expected $expected"
5595 run_test 56g "check lfs find -name"
5598 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5599 local expected=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES))
5601 setup_56 $dir $NUMFILES $NUMDIRS
5603 # test lfs find with ! -name
5604 for i in $(seq $NUMFILES) ; do
5605 local nums=$($LFS find ! -name "*$i" $dir | wc -l)
5607 [ $nums -eq $expected ] ||
5608 error "lfs find ! -name '*$i' $dir wrong: "\
5609 "found $nums, expected $expected"
5612 run_test 56h "check lfs find ! -name"
5615 local dir=$DIR/$tdir
5619 local cmd="$LFS find -ost $(ostuuid_from_index 0 $dir) $dir"
5622 [ -z "$out" ] || error "'$cmd' returned directory '$out'"
5624 run_test 56i "check 'lfs find -ost UUID' skips directories"
5627 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5629 setup_56_special $dir $NUMFILES $NUMDIRS
5631 local expected=$((NUMDIRS + 1))
5632 local cmd="$LFS find -type d $dir"
5633 local nums=$($cmd | wc -l)
5635 [ $nums -eq $expected ] ||
5636 error "'$cmd' wrong: found $nums, expected $expected"
5638 run_test 56j "check lfs find -type d"
5641 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5643 setup_56_special $dir $NUMFILES $NUMDIRS
5645 local expected=$(((NUMDIRS + 1) * NUMFILES))
5646 local cmd="$LFS find -type f $dir"
5647 local nums=$($cmd | wc -l)
5649 [ $nums -eq $expected ] ||
5650 error "'$cmd' wrong: found $nums, expected $expected"
5652 run_test 56k "check lfs find -type f"
5655 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5657 setup_56_special $dir $NUMFILES $NUMDIRS
5659 local expected=$((NUMDIRS + NUMFILES))
5660 local cmd="$LFS find -type b $dir"
5661 local nums=$($cmd | wc -l)
5663 [ $nums -eq $expected ] ||
5664 error "'$cmd' wrong: found $nums, expected $expected"
5666 run_test 56l "check lfs find -type b"
5669 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5671 setup_56_special $dir $NUMFILES $NUMDIRS
5673 local expected=$((NUMDIRS + NUMFILES))
5674 local cmd="$LFS find -type c $dir"
5675 local nums=$($cmd | wc -l)
5676 [ $nums -eq $expected ] ||
5677 error "'$cmd' wrong: found $nums, expected $expected"
5679 run_test 56m "check lfs find -type c"
5682 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5683 setup_56_special $dir $NUMFILES $NUMDIRS
5685 local expected=$((NUMDIRS + NUMFILES))
5686 local cmd="$LFS find -type l $dir"
5687 local nums=$($cmd | wc -l)
5689 [ $nums -eq $expected ] ||
5690 error "'$cmd' wrong: found $nums, expected $expected"
5692 run_test 56n "check lfs find -type l"
5695 local dir=$DIR/$tdir
5697 setup_56 $dir $NUMFILES $NUMDIRS
5698 utime $dir/file1 > /dev/null || error "utime (1)"
5699 utime $dir/file2 > /dev/null || error "utime (2)"
5700 utime $dir/dir1 > /dev/null || error "utime (3)"
5701 utime $dir/dir2 > /dev/null || error "utime (4)"
5702 utime $dir/dir1/file1 > /dev/null || error "utime (5)"
5703 dd if=/dev/zero count=1 >> $dir/dir1/file1 && sync
5706 local nums=$($LFS find -mtime +0 $dir | wc -l)
5708 [ $nums -eq $expected ] ||
5709 error "lfs find -mtime +0 $dir: found $nums expect $expected"
5712 cmd="$LFS find -mtime 0 $dir"
5713 nums=$($cmd | wc -l)
5714 [ $nums -eq $expected ] ||
5715 error "'$cmd' wrong: found $nums, expected $expected"
5717 run_test 56o "check lfs find -mtime for old files"
5720 local dir=$DIR/$tdir
5724 # just to make sure there is something that won't be found
5726 touch $dir/$tfile.now
5728 for age in year week day hour min; do
5729 count=$((count + 1))
5731 touch $dir/$tfile-a.$age $dir/$tfile-m.$age
5732 touch --date="$count $age ago" -a $dir/$tfile-a.$age
5733 touch --date="$count $age ago" -m $dir/$tfile-m.$age
5735 local cmd="$LFS find $dir -mtime $count${age:0:1}"
5736 local nums=$($cmd | wc -l)
5737 [ $nums -eq $expected ] ||
5738 error "'$cmd' wrong: found $nums, expected $expected"
5740 cmd="$LFS find $dir -atime $count${age:0:1}"
5741 nums=$($cmd | wc -l)
5742 [ $nums -eq $expected ] ||
5743 error "'$cmd' wrong: found $nums, expected $expected"
5747 cmd="$LFS find $dir -ctime +1s -type f"
5748 nums=$($cmd | wc -l)
5749 (( $nums == $count * 2 + 1)) ||
5750 error "'$cmd' wrong: found $nums, expected $((expected*2+1))"
5752 run_test 56ob "check lfs find -atime -mtime -ctime with units"
5754 test_newerXY_base() {
5757 local dir=$DIR/$tdir
5761 if [ $y == "t" ]; then
5762 ref="\"$(date +"%Y-%m-%d %H:%M:%S")\""
5764 ref=$DIR/$tfile.newer
5765 touch $ref || error "touch $ref failed"
5768 setup_56 $dir $NUMFILES $NUMDIRS "-i0 -c1" "-i0 -c1"
5770 if [ $y == "t" ]; then
5771 negref="\"$(date +"%Y-%m-%d %H:%M:%S")\""
5773 negref=$DIR/$tfile.newerneg
5774 touch $negref || error "touch $negref failed"
5777 local cmd="$LFS find $dir -newer$x$y $ref"
5778 local nums=$(eval $cmd | wc -l)
5779 local expected=$(((NUMFILES + 2) * NUMDIRS + 1))
5781 [ $nums -eq $expected ] ||
5782 error "'$cmd' wrong: found $nums, expected $expected"
5784 cmd="$LFS find $dir ! -newer$x$y $negref"
5785 nums=$(eval $cmd | wc -l)
5786 [ $nums -eq $expected ] ||
5787 error "'$cmd' wrong: found $nums, expected $expected"
5789 cmd="$LFS find $dir -newer$x$y $ref ! -newer$x$y $negref"
5790 nums=$(eval $cmd | wc -l)
5791 [ $nums -eq $expected ] ||
5792 error "'$cmd' wrong: found $nums, expected $expected"
5798 test_newerXY_base "a" "a"
5799 test_newerXY_base "a" "m"
5800 test_newerXY_base "a" "c"
5801 test_newerXY_base "m" "a"
5802 test_newerXY_base "m" "m"
5803 test_newerXY_base "m" "c"
5804 test_newerXY_base "c" "a"
5805 test_newerXY_base "c" "m"
5806 test_newerXY_base "c" "c"
5807 test_newerXY_base "a" "t"
5808 test_newerXY_base "m" "t"
5809 test_newerXY_base "c" "t"
5811 run_test 56oc "check lfs find -newerXY work"
5814 [ $RUNAS_ID -eq $UID ] &&
5815 skip_env "RUNAS_ID = UID = $UID -- skipping"
5817 local dir=$DIR/$tdir
5819 setup_56 $dir $NUMFILES $NUMDIRS
5820 chown $RUNAS_ID $dir/file* || error "chown $DIR/${tdir}g/file$i failed"
5822 local expected=$NUMFILES
5823 local cmd="$LFS find -uid $RUNAS_ID $dir"
5824 local nums=$($cmd | wc -l)
5826 [ $nums -eq $expected ] ||
5827 error "'$cmd' wrong: found $nums, expected $expected"
5829 expected=$(((NUMFILES + 1) * NUMDIRS + 1))
5830 cmd="$LFS find ! -uid $RUNAS_ID $dir"
5831 nums=$($cmd | wc -l)
5832 [ $nums -eq $expected ] ||
5833 error "'$cmd' wrong: found $nums, expected $expected"
5835 run_test 56p "check lfs find -uid and ! -uid"
5838 [ $RUNAS_ID -eq $UID ] &&
5839 skip_env "RUNAS_ID = UID = $UID -- skipping"
5841 local dir=$DIR/$tdir
5843 setup_56 $dir $NUMFILES $NUMDIRS
5844 chgrp $RUNAS_GID $dir/file* || error "chown $dir/file$i failed"
5846 local expected=$NUMFILES
5847 local cmd="$LFS find -gid $RUNAS_GID $dir"
5848 local nums=$($cmd | wc -l)
5850 [ $nums -eq $expected ] ||
5851 error "'$cmd' wrong: found $nums, expected $expected"
5853 expected=$(( ($NUMFILES+1) * $NUMDIRS + 1))
5854 cmd="$LFS find ! -gid $RUNAS_GID $dir"
5855 nums=$($cmd | wc -l)
5856 [ $nums -eq $expected ] ||
5857 error "'$cmd' wrong: found $nums, expected $expected"
5859 run_test 56q "check lfs find -gid and ! -gid"
5862 local dir=$DIR/$tdir
5864 setup_56 $dir $NUMFILES $NUMDIRS
5867 local cmd="$LFS find -size 0 -type f -lazy $dir"
5868 local nums=$($cmd | wc -l)
5870 [ $nums -eq $expected ] ||
5871 error "'$cmd' wrong: found $nums, expected $expected"
5872 cmd="$LFS find -size 0 -type f $dir"
5873 nums=$($cmd | wc -l)
5874 [ $nums -eq $expected ] ||
5875 error "'$cmd' wrong: found $nums, expected $expected"
5878 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5879 nums=$($cmd | wc -l)
5880 [ $nums -eq $expected ] ||
5881 error "'$cmd' wrong: found $nums, expected $expected"
5882 cmd="$LFS find ! -size 0 -type f $dir"
5883 nums=$($cmd | wc -l)
5884 [ $nums -eq $expected ] ||
5885 error "'$cmd' wrong: found $nums, expected $expected"
5887 echo "test" > $dir/$tfile
5888 echo "test2" > $dir/$tfile.2 && sync
5890 cmd="$LFS find -size 5 -type f -lazy $dir"
5891 nums=$($cmd | wc -l)
5892 [ $nums -eq $expected ] ||
5893 error "'$cmd' wrong: found $nums, expected $expected"
5894 cmd="$LFS find -size 5 -type f $dir"
5895 nums=$($cmd | wc -l)
5896 [ $nums -eq $expected ] ||
5897 error "'$cmd' wrong: found $nums, expected $expected"
5900 cmd="$LFS find -size +5 -type f -lazy $dir"
5901 nums=$($cmd | wc -l)
5902 [ $nums -eq $expected ] ||
5903 error "'$cmd' wrong: found $nums, expected $expected"
5904 cmd="$LFS find -size +5 -type f $dir"
5905 nums=$($cmd | wc -l)
5906 [ $nums -eq $expected ] ||
5907 error "'$cmd' wrong: found $nums, expected $expected"
5910 cmd="$LFS find -size +0 -type f -lazy $dir"
5911 nums=$($cmd | wc -l)
5912 [ $nums -eq $expected ] ||
5913 error "'$cmd' wrong: found $nums, expected $expected"
5914 cmd="$LFS find -size +0 -type f $dir"
5915 nums=$($cmd | wc -l)
5916 [ $nums -eq $expected ] ||
5917 error "'$cmd' wrong: found $nums, expected $expected"
5920 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5921 nums=$($cmd | wc -l)
5922 [ $nums -eq $expected ] ||
5923 error "'$cmd' wrong: found $nums, expected $expected"
5924 cmd="$LFS find ! -size -5 -type f $dir"
5925 nums=$($cmd | wc -l)
5926 [ $nums -eq $expected ] ||
5927 error "'$cmd' wrong: found $nums, expected $expected"
5930 cmd="$LFS find -size -5 -type f -lazy $dir"
5931 nums=$($cmd | wc -l)
5932 [ $nums -eq $expected ] ||
5933 error "'$cmd' wrong: found $nums, expected $expected"
5934 cmd="$LFS find -size -5 -type f $dir"
5935 nums=$($cmd | wc -l)
5936 [ $nums -eq $expected ] ||
5937 error "'$cmd' wrong: found $nums, expected $expected"
5939 run_test 56r "check lfs find -size works"
5942 [[ $MDS1_VERSION -gt $(version_code 2.12.58) ]] ||
5943 skip "MDS < 2.12.58 doesn't return LSOM data"
5944 local dir=$DIR/$tdir
5946 [[ $OSC == "mdc" ]] && skip "DoM files" && return
5948 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5950 cancel_lru_locks $OSC
5952 local rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5954 local cmd="$LFS find -size 0 -type f -lazy $dir"
5955 local nums=$($cmd | wc -l)
5957 [ $nums -eq $expected ] ||
5958 error "'$cmd' wrong: found $nums, expected $expected"
5960 local rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5961 [ $rpcs_before -eq $rpcs_after ] ||
5962 error "'$cmd' should not send glimpse RPCs to OST"
5963 cmd="$LFS find -size 0 -type f $dir"
5964 nums=$($cmd | wc -l)
5965 [ $nums -eq $expected ] ||
5966 error "'$cmd' wrong: found $nums, expected $expected"
5967 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5968 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5969 $LCTL get_param osc.*.stats
5970 [ $rpcs_after -eq $((rpcs_before + 12)) ] ||
5971 error "'$cmd' should send 12 glimpse RPCs to OST"
5973 cancel_lru_locks $OSC
5974 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5976 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5977 nums=$($cmd | wc -l)
5978 [ $nums -eq $expected ] ||
5979 error "'$cmd' wrong: found $nums, expected $expected"
5980 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5981 $LCTL get_param mdc.*.stats
5982 [ $rpcs_before -eq $rpcs_after ] ||
5983 error "'$cmd' should not send glimpse RPCs to OST"
5984 cmd="$LFS find ! -size 0 -type f $dir"
5985 nums=$($cmd | wc -l)
5986 [ $nums -eq $expected ] ||
5987 error "'$cmd' wrong: found $nums, expected $expected"
5988 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5989 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5990 [ $rpcs_after -eq $((rpcs_before + 12)) ] ||
5991 error "'$cmd' should send 12 glimpse RPCs to OST"
5993 echo "test" > $dir/$tfile
5994 echo "test2" > $dir/$tfile.2 && sync
5995 cancel_lru_locks $OSC
5996 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5998 cmd="$LFS find -size 5 -type f -lazy $dir"
5999 nums=$($cmd | wc -l)
6000 [ $nums -eq $expected ] ||
6001 error "'$cmd' wrong: found $nums, expected $expected"
6002 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6003 [ $rpcs_before -eq $rpcs_after ] ||
6004 error "'$cmd' should not send glimpse RPCs to OST"
6005 cmd="$LFS find -size 5 -type f $dir"
6006 nums=$($cmd | wc -l)
6007 [ $nums -eq $expected ] ||
6008 error "'$cmd' wrong: found $nums, expected $expected"
6009 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6010 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
6011 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
6012 error "'$cmd' should send 14 glimpse RPCs to OST"
6014 cancel_lru_locks $OSC
6015 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6017 cmd="$LFS find -size +5 -type f -lazy $dir"
6018 nums=$($cmd | wc -l)
6019 [ $nums -eq $expected ] ||
6020 error "'$cmd' wrong: found $nums, expected $expected"
6021 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6022 [ $rpcs_before -eq $rpcs_after ] ||
6023 error "'$cmd' should not send glimpse RPCs to OST"
6024 cmd="$LFS find -size +5 -type f $dir"
6025 nums=$($cmd | wc -l)
6026 [ $nums -eq $expected ] ||
6027 error "'$cmd' wrong: found $nums, expected $expected"
6028 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6029 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
6030 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
6031 error "'$cmd' should send 14 glimpse RPCs to OST"
6033 cancel_lru_locks $OSC
6034 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6036 cmd="$LFS find -size +0 -type f -lazy $dir"
6037 nums=$($cmd | wc -l)
6038 [ $nums -eq $expected ] ||
6039 error "'$cmd' wrong: found $nums, expected $expected"
6040 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6041 [ $rpcs_before -eq $rpcs_after ] ||
6042 error "'$cmd' should not send glimpse RPCs to OST"
6043 cmd="$LFS find -size +0 -type f $dir"
6044 nums=$($cmd | wc -l)
6045 [ $nums -eq $expected ] ||
6046 error "'$cmd' wrong: found $nums, expected $expected"
6047 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6048 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
6049 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
6050 error "'$cmd' should send 14 glimpse RPCs to OST"
6052 cancel_lru_locks $OSC
6053 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6055 cmd="$LFS find ! -size -5 -type f -lazy $dir"
6056 nums=$($cmd | wc -l)
6057 [ $nums -eq $expected ] ||
6058 error "'$cmd' wrong: found $nums, expected $expected"
6059 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6060 [ $rpcs_before -eq $rpcs_after ] ||
6061 error "'$cmd' should not send glimpse RPCs to OST"
6062 cmd="$LFS find ! -size -5 -type f $dir"
6063 nums=$($cmd | wc -l)
6064 [ $nums -eq $expected ] ||
6065 error "'$cmd' wrong: found $nums, expected $expected"
6066 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6067 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
6068 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
6069 error "'$cmd' should send 14 glimpse RPCs to OST"
6071 cancel_lru_locks $OSC
6072 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6074 cmd="$LFS find -size -5 -type f -lazy $dir"
6075 nums=$($cmd | wc -l)
6076 [ $nums -eq $expected ] ||
6077 error "'$cmd' wrong: found $nums, expected $expected"
6078 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6079 [ $rpcs_before -eq $rpcs_after ] ||
6080 error "'$cmd' should not send glimpse RPCs to OST"
6081 cmd="$LFS find -size -5 -type f $dir"
6082 nums=$($cmd | wc -l)
6083 [ $nums -eq $expected ] ||
6084 error "'$cmd' wrong: found $nums, expected $expected"
6085 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6086 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
6087 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
6088 error "'$cmd' should send 14 glimpse RPCs to OST"
6090 run_test 56ra "check lfs find -size -lazy works for data on OSTs"
6092 test_56s() { # LU-611 #LU-9369
6093 [[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
6095 local dir=$DIR/$tdir
6096 local onestripe=$(((NUMDIRS + 1) * NUMFILES))
6098 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
6099 for i in $(seq $NUMDIRS); do
6100 $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile
6103 local expected=$NUMDIRS
6104 local cmd="$LFS find -c $OSTCOUNT $dir"
6105 local nums=$($cmd | wc -l)
6107 [ $nums -eq $expected ] || {
6108 $LFS getstripe -R $dir
6109 error "'$cmd' wrong: found $nums, expected $expected"
6112 expected=$((NUMDIRS + onestripe))
6113 cmd="$LFS find -stripe-count +0 -type f $dir"
6114 nums=$($cmd | wc -l)
6115 [ $nums -eq $expected ] || {
6116 $LFS getstripe -R $dir
6117 error "'$cmd' wrong: found $nums, expected $expected"
6121 cmd="$LFS find -stripe-count 1 -type f $dir"
6122 nums=$($cmd | wc -l)
6123 [ $nums -eq $expected ] || {
6124 $LFS getstripe -R $dir
6125 error "'$cmd' wrong: found $nums, expected $expected"
6128 cmd="$LFS find -stripe-count -2 -type f $dir"
6129 nums=$($cmd | wc -l)
6130 [ $nums -eq $expected ] || {
6131 $LFS getstripe -R $dir
6132 error "'$cmd' wrong: found $nums, expected $expected"
6136 cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir"
6137 nums=$($cmd | wc -l)
6138 [ $nums -eq $expected ] || {
6139 $LFS getstripe -R $dir
6140 error "'$cmd' wrong: found $nums, expected $expected"
6143 run_test 56s "check lfs find -stripe-count works"
6145 test_56t() { # LU-611 #LU-9369
6146 local dir=$DIR/$tdir
6148 setup_56 $dir 0 $NUMDIRS
6149 for i in $(seq $NUMDIRS); do
6150 $LFS setstripe -S 8M $dir/dir$i/$tfile
6153 local expected=$NUMDIRS
6154 local cmd="$LFS find -S 8M $dir"
6155 local nums=$($cmd | wc -l)
6157 [ $nums -eq $expected ] || {
6158 $LFS getstripe -R $dir
6159 error "'$cmd' wrong: found $nums, expected $expected"
6163 setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k"
6165 $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3}
6167 expected=$(((NUMDIRS + 1) * NUMFILES))
6168 cmd="$LFS find -stripe-size 512k -type f $dir"
6169 nums=$($cmd | wc -l)
6170 [ $nums -eq $expected ] ||
6171 error "'$cmd' wrong: found $nums, expected $expected"
6173 cmd="$LFS find -stripe-size +320k -type f $dir"
6174 nums=$($cmd | wc -l)
6175 [ $nums -eq $expected ] ||
6176 error "'$cmd' wrong: found $nums, expected $expected"
6178 expected=$(((NUMDIRS + 1) * NUMFILES + 4))
6179 cmd="$LFS find -stripe-size +200k -type f $dir"
6180 nums=$($cmd | wc -l)
6181 [ $nums -eq $expected ] ||
6182 error "'$cmd' wrong: found $nums, expected $expected"
6184 cmd="$LFS find -stripe-size -640k -type f $dir"
6185 nums=$($cmd | wc -l)
6186 [ $nums -eq $expected ] ||
6187 error "'$cmd' wrong: found $nums, expected $expected"
6190 cmd="$LFS find -stripe-size 256k -type f $dir"
6191 nums=$($cmd | wc -l)
6192 [ $nums -eq $expected ] ||
6193 error "'$cmd' wrong: found $nums, expected $expected"
6195 cmd="$LFS find -stripe-size -320k -type f $dir"
6196 nums=$($cmd | wc -l)
6197 [ $nums -eq $expected ] ||
6198 error "'$cmd' wrong: found $nums, expected $expected"
6201 cmd="$LFS find -stripe-size 1024k -type f $dir"
6202 nums=$($cmd | wc -l)
6203 [ $nums -eq $expected ] ||
6204 error "'$cmd' wrong: found $nums, expected $expected"
6206 run_test 56t "check lfs find -stripe-size works"
6208 test_56u() { # LU-611
6209 local dir=$DIR/$tdir
6211 setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1"
6213 if [[ $OSTCOUNT -gt 1 ]]; then
6214 $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3}
6220 local expected=$(((NUMDIRS + 1) * NUMFILES))
6221 local cmd="$LFS find -stripe-index 0 -type f $dir"
6222 local nums=$($cmd | wc -l)
6224 [ $nums -eq $expected ] ||
6225 error "'$cmd' wrong: found $nums, expected $expected"
6228 cmd="$LFS find -stripe-index 1 -type f $dir"
6229 nums=$($cmd | wc -l)
6230 [ $nums -eq $expected ] ||
6231 error "'$cmd' wrong: found $nums, expected $expected"
6233 cmd="$LFS find ! -stripe-index 0 -type f $dir"
6234 nums=$($cmd | wc -l)
6235 [ $nums -eq $expected ] ||
6236 error "'$cmd' wrong: found $nums, expected $expected"
6239 # This should produce an error and not return any files
6240 cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir"
6241 nums=$($cmd 2>/dev/null | wc -l)
6242 [ $nums -eq $expected ] ||
6243 error "'$cmd' wrong: found $nums, expected $expected"
6245 if [[ $OSTCOUNT -gt 1 ]]; then
6246 expected=$(((NUMDIRS + 1) * NUMFILES + onestripe))
6247 cmd="$LFS find -stripe-index 0,1 -type f $dir"
6248 nums=$($cmd | wc -l)
6249 [ $nums -eq $expected ] ||
6250 error "'$cmd' wrong: found $nums, expected $expected"
6253 run_test 56u "check lfs find -stripe-index works"
6257 local dir=$DIR/$tdir
6259 setup_56 $dir $NUMFILES $NUMDIRS
6261 UUID=$(mdtuuid_from_index $mdt_idx $dir)
6262 [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $mdt_idx"
6264 for file in $($LFS find -m $UUID $dir); do
6265 file_midx=$($LFS getstripe -m $file)
6266 [ $file_midx -eq $mdt_idx ] ||
6267 error "lfs find -m $UUID != getstripe -m $file_midx"
6270 run_test 56v "check 'lfs find -m match with lfs getstripe -m'"
6273 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6274 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6276 local dir=$DIR/$tdir
6278 setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
6280 local stripe_size=$($LFS getstripe -S -d $dir) ||
6281 error "$LFS getstripe -S -d $dir failed"
6282 stripe_size=${stripe_size%% *}
6284 local file_size=$((stripe_size * OSTCOUNT))
6285 local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
6286 local required_space=$((file_num * file_size))
6287 local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
6289 [[ $free_space -le $((required_space / 1024)) ]] &&
6290 skip_env "need $required_space, have $free_space kbytes"
6293 local dd_count=$((file_size / dd_bs))
6295 # write data into the files
6300 for i in $(seq $NUMFILES); do
6302 yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
6303 error "write data into $file failed"
6305 for i in $(seq $NUMDIRS); do
6306 for j in $(seq $NUMFILES); do
6307 file=$dir/dir$i/file$j
6308 yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
6309 error "write data into $file failed"
6313 # $LFS_MIGRATE will fail if hard link migration is unsupported
6314 if [[ $MDS1_VERSION -gt $(version_code 2.5.55) ]]; then
6315 createmany -l$dir/dir1/file1 $dir/dir1/link 200 ||
6316 error "creating links to $dir/dir1/file1 failed"
6321 [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
6324 local cmd="$LFS_MIGRATE -y -c $expected $dir/file1"
6327 eval $cmd || error "$cmd failed"
6329 check_stripe_count $dir/file1 $expected
6331 if [ $MDS1_VERSION -ge $(version_code 2.6.90) ];
6333 # lfs_migrate file onto OST 0 if it is on OST 1, or onto
6334 # OST 1 if it is on OST 0. This file is small enough to
6335 # be on only one stripe.
6336 file=$dir/migr_1_ost
6337 dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
6338 error "write data into $file failed"
6339 local obdidx=$($LFS getstripe -i $file)
6340 local oldmd5=$(md5sum $file)
6343 [[ $obdidx -eq 0 ]] && newobdidx=1
6344 cmd="$LFS migrate -i $newobdidx $file"
6346 eval $cmd || error "$cmd failed"
6348 local realobdix=$($LFS getstripe -i $file)
6349 local newmd5=$(md5sum $file)
6351 [[ $newobdidx -ne $realobdix ]] &&
6352 error "new OST is different (was=$obdidx, "\
6353 "wanted=$newobdidx, got=$realobdix)"
6354 [[ "$oldmd5" != "$newmd5" ]] &&
6355 error "md5sum differ: $oldmd5, $newmd5"
6359 cmd="$LFS_MIGRATE -y -c $expected $dir/dir1"
6361 eval $cmd || error "$cmd failed"
6363 for j in $(seq $NUMFILES); do
6364 check_stripe_count $dir/dir1/file$j $expected
6367 # lfs_migrate works with lfs find
6368 cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir |
6369 $LFS_MIGRATE -y -c $expected"
6371 eval $cmd || error "$cmd failed"
6373 for i in $(seq 2 $NUMFILES); do
6374 check_stripe_count $dir/file$i $expected
6376 for i in $(seq 2 $NUMDIRS); do
6377 for j in $(seq $NUMFILES); do
6378 check_stripe_count $dir/dir$i/file$j $expected
6382 run_test 56w "check lfs_migrate -c stripe_count works"
6385 local file1=$DIR/$tdir/file1
6386 local create_pool=false
6387 local initial_pool=$($LFS getstripe -p $DIR)
6391 echo -n "Creating test dir..."
6392 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
6395 echo -n "Creating test file..."
6396 touch $file1 || error "cannot create file"
6399 echo -n "Detecting existing pools..."
6400 pool_list=($($LFS pool_list $FSNAME | grep "$FSNAME\." | cut -d. -f2))
6402 if [ ${#pool_list[@]} -gt 0 ]; then
6403 echo "${pool_list[@]}"
6404 for thispool in "${pool_list[@]}"; do
6405 if [[ -z "$initial_pool" ||
6406 "$initial_pool" != "$thispool" ]]; then
6408 echo "Using existing pool '$pool'"
6413 echo "none detected."
6415 if [ -z "$pool" ]; then
6416 pool=${POOL:-testpool}
6417 [ "$initial_pool" = "$pool" ] && pool="testpool2"
6418 echo -n "Creating pool '$pool'..."
6420 pool_add $pool &> /dev/null ||
6421 error "pool_add failed"
6424 echo -n "Adding target to pool..."
6425 pool_add_targets $pool 0 0 1 &> /dev/null ||
6426 error "pool_add_targets failed"
6430 echo -n "Setting pool using -p option..."
6431 $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null ||
6432 error "migrate failed rc = $?"
6435 echo -n "Verifying test file is in pool after migrating..."
6436 [ "$($LFS getstripe -p $file1)" = $pool ] ||
6437 error "file was not migrated to pool $pool"
6440 echo -n "Removing test file from pool '$pool'..."
6441 $LFS migrate $file1 &> /dev/null ||
6442 error "cannot remove from pool"
6443 [ "$($LFS getstripe -p $file1)" ] &&
6444 error "pool still set"
6447 echo -n "Setting pool using --pool option..."
6448 $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null ||
6449 error "migrate failed rc = $?"
6454 if $create_pool; then
6455 destroy_test_pools 2> /dev/null ||
6456 error "destroy test pools failed"
6459 run_test 56wb "check lfs_migrate pool support"
6462 local file1="$DIR/$tdir/file1"
6464 echo -n "Creating test dir..."
6465 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
6466 local def_stripe_size=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
6467 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
6468 error "cannot set stripe"
6471 echo -n "Setting initial stripe for test file..."
6472 $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
6473 error "cannot set stripe"
6474 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
6475 error "stripe size not set"
6478 # File currently set to -S 512K -c 1
6480 # Ensure -c and -S options are rejected when -R is set
6481 echo -n "Verifying incompatible options are detected..."
6482 $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null &&
6483 error "incompatible -c and -R options not detected"
6484 $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null &&
6485 error "incompatible -S and -R options not detected"
6488 # Ensure unrecognized options are passed through to 'lfs migrate'
6489 echo -n "Verifying -S option is passed through to lfs migrate..."
6490 $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
6491 error "migration failed"
6492 [ $($LFS getstripe -S "$file1") -eq 1048576 ] ||
6493 error "file was not restriped"
6496 # File currently set to -S 1M -c 1
6498 # Ensure long options are supported
6499 echo -n "Verifying long options supported..."
6500 $LFS_MIGRATE -y --non-block "$file1" &> /dev/null ||
6501 error "long option without argument not supported"
6502 $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
6503 error "long option with argument not supported"
6504 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
6505 error "file not restriped with --stripe-size option"
6508 # File currently set to -S 512K -c 1
6510 if [ "$OSTCOUNT" -gt 1 ]; then
6511 echo -n "Verifying explicit stripe count can be set..."
6512 $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
6513 error "migrate failed"
6514 [ $($LFS getstripe -c "$file1") -eq 2 ] ||
6515 error "file not restriped to explicit count"
6519 # File currently set to -S 512K -c 1 or -S 512K -c 2
6521 # Ensure parent striping is used if -R is set, and no stripe
6522 # count or size is specified
6523 echo -n "Setting stripe for parent directory..."
6524 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
6525 error "cannot set stripe"
6528 echo -n "Verifying restripe option uses parent stripe settings..."
6529 $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
6530 error "migrate failed"
6531 [ $($LFS getstripe -S "$file1") -eq $def_stripe_size ] ||
6532 error "file not restriped to parent settings"
6533 [ $($LFS getstripe -c "$file1") -eq 1 ] ||
6534 error "file not restriped to parent settings"
6537 # File currently set to -S 1M -c 1
6539 # Ensure striping is preserved if -R is not set, and no stripe
6540 # count or size is specified
6541 echo -n "Verifying striping size preserved when not specified..."
6542 local orig_stripe_size=$($LFS getstripe -S "$file1" 2>/dev/null)
6543 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
6544 error "cannot set stripe on parent directory"
6545 $LFS_MIGRATE -y "$file1" &> /dev/null ||
6546 error "migrate failed"
6547 [ $($LFS getstripe -S "$file1") -eq $orig_stripe_size ] ||
6548 error "file was restriped"
6551 # Ensure file name properly detected when final option has no argument
6552 echo -n "Verifying file name properly detected..."
6553 $LFS_MIGRATE -y "$file1" &> /dev/null ||
6554 error "file name interpreted as option argument"
6560 run_test 56wc "check unrecognized options for lfs_migrate are passed through"
6563 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6565 local file1=$DIR/$tdir/file1
6567 echo -n "Creating test dir..."
6568 test_mkdir $DIR/$tdir || error "cannot create dir"
6571 echo -n "Creating test file..."
6575 # Ensure 'lfs migrate' will fail by using a non-existent option,
6576 # and make sure rsync is not called to recover
6577 echo -n "Make sure --no-rsync option works..."
6578 $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 |
6579 grep -q 'refusing to fall back to rsync' ||
6580 error "rsync was called with --no-rsync set"
6583 # Ensure rsync is called without trying 'lfs migrate' first
6584 echo -n "Make sure --rsync option works..."
6585 $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 |
6586 grep -q 'falling back to rsync' &&
6587 error "lfs migrate was called with --rsync set"
6590 echo -n "Make sure --rsync and --no-rsync options are exclusive..."
6591 $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 |
6592 grep -q 'at the same time' ||
6593 error "--rsync and --no-rsync accepted concurrently"
6599 run_test 56wd "check lfs_migrate --rsync and --no-rsync work"
6602 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6603 check_swap_layouts_support
6605 local dir=$DIR/$tdir
6606 local ref1=/etc/passwd
6607 local file1=$dir/file1
6609 test_mkdir $dir || error "creating dir $dir"
6610 $LFS setstripe -c 2 $file1
6612 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
6613 stripe=$($LFS getstripe -c $file1)
6614 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6615 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6620 run_test 56x "lfs migration support"
6623 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6624 check_swap_layouts_support
6626 local dir=$DIR/$tdir/$testnum
6630 local ref1=/etc/passwd
6631 local file1=$dir/file1
6633 $LFS setstripe -c 2 $file1
6635 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
6637 local stripe=$($LFS getstripe -c $file1)
6639 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6640 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6645 run_test 56xa "lfs migration --block support"
6647 check_migrate_links() {
6649 local file1="$dir/file1"
6653 local total_count=$(($begin + $count - 1))
6654 local symlink_count=10
6657 if [ ! -f "$file1" ]; then
6658 echo -n "creating initial file..."
6659 $LFS setstripe -c 1 -S "512k" "$file1" ||
6660 error "cannot setstripe initial file"
6663 echo -n "creating symlinks..."
6664 for s in $(seq 1 $symlink_count); do
6665 ln -s "$file1" "$dir/slink$s" ||
6666 error "cannot create symlinks"
6670 echo -n "creating nonlinked files..."
6671 createmany -o "$dir/uniq" 1 10 &> /dev/null ||
6672 error "cannot create nonlinked files"
6677 if [ ! -f "$dir/file$total_count" ]; then
6678 echo -n "creating hard links $begin:$total_count..."
6679 createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
6680 /dev/null || error "cannot create hard links"
6684 echo -n "checking number of hard links listed in xattrs..."
6685 local fid=$($LFS getstripe -F "$file1")
6686 local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
6689 if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
6690 skip "hard link list has unexpected size, skipping test"
6692 if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
6693 error "link names should exceed xattrs size"
6696 echo -n "migrating files..."
6697 local migrate_out=$($runas $LFS_MIGRATE -y -S '1m' $dir)
6699 [ $rc -eq 0 ] || error "migrate failed rc = $rc"
6702 # make sure all links have been properly migrated
6703 echo -n "verifying files..."
6704 fid=$($LFS getstripe -F "$file1") ||
6705 error "cannot get fid for file $file1"
6706 for i in $(seq 2 $total_count); do
6707 local fid2=$($LFS getstripe -F $dir/file$i)
6709 [ "$fid2" == "$fid" ] ||
6710 error "migrated hard link has mismatched FID"
6713 # make sure hard links were properly detected, and migration was
6714 # performed only once for the entire link set; nonlinked files should
6716 local actual=$(grep -c 'done' <<< "$migrate_out")
6717 local expected=$(($uniq_count + 1))
6719 [ "$actual" -eq "$expected" ] ||
6720 error "hard links individually migrated ($actual != $expected)"
6722 # make sure the correct number of hard links are present
6723 local hardlinks=$(stat -c '%h' "$file1")
6725 [ $hardlinks -eq $total_count ] ||
6726 error "num hard links $hardlinks != $total_count"
6733 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
6734 skip "Need MDS version at least 2.10.55"
6736 local dir="$DIR/$tdir"
6738 test_mkdir "$dir" || error "cannot create dir $dir"
6740 echo "testing lfs migrate mode when all links fit within xattrs"
6741 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 2 99
6743 echo "testing rsync mode when all links fit within xattrs"
6744 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 2 99
6746 echo "testing lfs migrate mode when all links do not fit within xattrs"
6747 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100
6749 echo "testing rsync mode when all links do not fit within xattrs"
6750 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 101 100
6752 chown -R $RUNAS_ID $dir
6753 echo "testing non-root lfs migrate mode when not all links are in xattr"
6754 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100 "$RUNAS"
6759 run_test 56xb "lfs migration hard link support"
6762 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6764 local dir="$DIR/$tdir"
6766 test_mkdir "$dir" || error "cannot create dir $dir"
6768 # Test 1: ensure file < 1 GB is always migrated with 1 stripe
6769 echo -n "Setting initial stripe for 20MB test file..."
6770 $LFS setstripe -c 2 -i 0 "$dir/20mb" ||
6771 error "cannot setstripe 20MB file"
6773 echo -n "Sizing 20MB test file..."
6774 truncate "$dir/20mb" 20971520 || error "cannot create 20MB test file"
6776 echo -n "Verifying small file autostripe count is 1..."
6777 $LFS_MIGRATE -y -A -C 1 "$dir/20mb" ||
6778 error "cannot migrate 20MB file"
6779 local stripe_count=$($LFS getstripe -c "$dir/20mb") ||
6780 error "cannot get stripe for $dir/20mb"
6781 [ $stripe_count -eq 1 ] ||
6782 error "unexpected stripe count $stripe_count for 20MB file"
6786 # Test 2: File is small enough to fit within the available space on
6787 # sqrt(size_in_gb) + 1 OSTs but is larger than 1GB. The file must
6788 # have at least an additional 1KB for each desired stripe for test 3
6789 echo -n "Setting stripe for 1GB test file..."
6790 $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe 1GB file"
6792 echo -n "Sizing 1GB test file..."
6793 # File size is 1GB + 3KB
6794 truncate "$dir/1gb" 1073744896 || error "cannot create 1GB test file"
6797 # need at least 512MB per OST for 1GB file to fit in 2 stripes
6798 local avail=$($LCTL get_param -n llite.$FSNAME*.kbytesavail)
6799 if (( avail > 524288 * OSTCOUNT )); then
6800 echo -n "Migrating 1GB file..."
6801 $LFS_MIGRATE -y -A -C 1 "$dir/1gb" ||
6802 error "cannot migrate 1GB file"
6804 echo -n "Verifying autostripe count is sqrt(n) + 1..."
6805 stripe_count=$($LFS getstripe -c "$dir/1gb") ||
6806 error "cannot getstripe for 1GB file"
6807 [ $stripe_count -eq 2 ] ||
6808 error "unexpected stripe count $stripe_count != 2"
6812 # Test 3: File is too large to fit within the available space on
6813 # sqrt(n) + 1 OSTs. Simulate limited available space with -X
6814 if [ $OSTCOUNT -ge 3 ]; then
6815 # The required available space is calculated as
6816 # file size (1GB + 3KB) / OST count (3).
6817 local kb_per_ost=349526
6819 echo -n "Migrating 1GB file with limit..."
6820 $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" ||
6821 error "cannot migrate 1GB file with limit"
6824 stripe_count=$($LFS getstripe -c "$dir/1gb")
6825 echo -n "Verifying 1GB autostripe count with limited space..."
6826 [ "$stripe_count" -a $stripe_count -ge 3 ] ||
6827 error "unexpected stripe count $stripe_count (min 3)"
6834 run_test 56xc "lfs migration autostripe"
6837 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
6838 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
6841 local dir=$DIR/$tdir
6845 test_mkdir -p $dir || error "creating dir $dir"
6846 touch $f1 || error "creating std file $f1"
6847 $MULTIOP $f2 H2c || error "creating released file $f2"
6849 # a directory can be raid0, so ask only for files
6850 res=$($LFS find $dir -L raid0 -type f | wc -l)
6851 [[ $res == 2 ]] || error "search raid0: found $res files != 2"
6853 res=$($LFS find $dir \! -L raid0 -type f | wc -l)
6854 [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
6856 # only files can be released, so no need to force file search
6857 res=$($LFS find $dir -L released)
6858 [[ $res == $f2 ]] || error "search released: found $res != $f2"
6860 res=$($LFS find $dir -type f \! -L released)
6861 [[ $res == $f1 ]] || error "search !released: found $res != $f1"
6863 run_test 56y "lfs find -L raid0|released"
6865 test_56z() { # LU-4824
6866 # This checks to make sure 'lfs find' continues after errors
6867 # There are two classes of errors that should be caught:
6868 # - If multiple paths are provided, all should be searched even if one
6870 # - If errors are encountered during the search, it should not terminate
6872 local dir=$DIR/$tdir
6876 for i in d{0..9}; do
6878 touch $dir/$i/$tfile
6880 $LFS find $DIR/non_existent_dir $dir &&
6881 error "$LFS find did not return an error"
6882 # Make a directory unsearchable. This should NOT be the last entry in
6883 # directory order. Arbitrarily pick the 6th entry
6884 chmod 700 $($LFS find $dir -type d | sed '6!d')
6886 $RUNAS $LFS find $DIR/non_existent $dir
6887 local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l)
6889 # The user should be able to see 10 directories and 9 files
6890 (( count == 19 )) ||
6891 error "$LFS find found $count != 19 entries after error"
6893 run_test 56z "lfs find should continue after an error"
6895 test_56aa() { # LU-5937
6896 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
6898 local dir=$DIR/$tdir
6901 $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
6903 createmany -o $dir/striped_dir/${tfile}- 1024
6904 local dirs=$($LFS find --size +8k $dir/)
6906 [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
6908 run_test 56aa "lfs find --size under striped dir"
6910 test_56ab() { # LU-10705
6911 test_mkdir $DIR/$tdir
6912 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
6913 dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
6914 dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
6915 # Flush writes to ensure valid blocks. Need to be more thorough for
6916 # ZFS, since blocks are not allocated/returned to client immediately.
6918 wait_zfs_commit ost1 2
6919 cancel_lru_locks osc
6922 local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
6924 [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
6926 files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
6927 [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
6929 rm -f $DIR/$tdir/$tfile.[123]
6931 run_test 56ab "lfs find --blocks"
6934 [ $MDS1_VERSION -lt $(version_code 2.10.50) ] &&
6935 skip "Need MDS version at least 2.10.50"
6937 # Create composite files with one component
6938 local dir=$DIR/$tdir
6940 setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
6941 # Create composite files with three components
6942 setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
6943 # Create non-composite files
6944 createmany -o $dir/${tfile}- 10
6946 local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l)
6948 [[ $nfiles == 10 ]] ||
6949 error "lfs find -E 1M found $nfiles != 10 files"
6951 nfiles=$($LFS find ! -E 1M --type f $dir | wc -l)
6952 [[ $nfiles == 25 ]] ||
6953 error "lfs find ! -E 1M found $nfiles != 25 files"
6955 # All files have a component that starts at 0
6956 nfiles=$($LFS find --component-start 0 --type f $dir | wc -l)
6957 [[ $nfiles == 35 ]] ||
6958 error "lfs find --component-start 0 - $nfiles != 35 files"
6960 nfiles=$($LFS find --component-start 2M --type f $dir | wc -l)
6961 [[ $nfiles == 15 ]] ||
6962 error "lfs find --component-start 2M - $nfiles != 15 files"
6964 # All files created here have a componenet that does not starts at 2M
6965 nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l)
6966 [[ $nfiles == 35 ]] ||
6967 error "lfs find ! --component-start 2M - $nfiles != 35 files"
6969 # Find files with a specified number of components
6970 local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l)
6971 [[ $nfiles == 15 ]] ||
6972 error "lfs find --component-count 3 - $nfiles != 15 files"
6974 # Remember non-composite files have a component count of zero
6975 local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l)
6976 [[ $nfiles == 10 ]] ||
6977 error "lfs find --component-count 0 - $nfiles != 10 files"
6979 nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l)
6980 [[ $nfiles == 20 ]] ||
6981 error "lfs find ! --component-count 3 - $nfiles != 20 files"
6983 # All files have a flag called "init"
6984 local nfiles=$($LFS find --component-flags init --type f $dir | wc -l)
6985 [[ $nfiles == 35 ]] ||
6986 error "lfs find --component-flags init - $nfiles != 35 files"
6988 # Multi-component files will have a component not initialized
6989 local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l)
6990 [[ $nfiles == 15 ]] ||
6991 error "lfs find !--component-flags init - $nfiles != 15 files"
6996 run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
6999 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
7000 skip "Need MDS version at least 2.10.57"
7010 # create mirrored directories and mirrored files
7011 mkdir $td || error "mkdir $td failed"
7012 $LFS mirror create -N3 $td || error "create mirrored dir $td failed"
7013 createmany -o $tf- 10 || error "create $tf- failed"
7015 for i in $(seq 2); do
7017 mkdir $dir || error "mkdir $dir failed"
7018 $LFS mirror create -N$((3 + i)) $dir ||
7019 error "create mirrored dir $dir failed"
7020 createmany -o $dir/$tfile- 10 ||
7021 error "create $dir/$tfile- failed"
7024 # change the states of some mirrored files
7026 for i in $(seq 2); do
7028 for j in $(seq 4 9); do
7029 echo foo > $dir/$tfile-$j
7033 # find mirrored files with specific mirror count
7034 cmd="$LFS find --mirror-count 3 --type f $td"
7035 nfiles=$($cmd | wc -l)
7036 [[ $nfiles = 10 ]] || error "$cmd: $nfiles != 10 files"
7038 cmd="$LFS find ! --mirror-count 3 --type f $td"
7039 nfiles=$($cmd | wc -l)
7040 [[ $nfiles = 20 ]] || error "$cmd: $nfiles != 20 files"
7042 cmd="$LFS find --mirror-count +2 --type f $td"
7043 nfiles=$($cmd | wc -l)
7044 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
7046 cmd="$LFS find --mirror-count -6 --type f $td"
7047 nfiles=$($cmd | wc -l)
7048 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
7050 # find mirrored files with specific file state
7051 cmd="$LFS find --maxdepth 1 --mirror-state=^ro --type f $td"
7052 [[ $($cmd) = $tf-6 ]] || error "$cmd: didn't return $tf-6"
7054 cmd="$LFS find --mirror-state=ro --type f $td"
7055 nfiles=$($cmd | wc -l)
7056 [[ $nfiles = 17 ]] || error "$cmd: $nfiles != 17 files"
7058 cmd="$LFS find ! --mirror-state=ro --type f $td"
7059 nfiles=$($cmd | wc -l)
7060 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
7062 cmd="$LFS find --mirror-state=wp --type f $td"
7063 nfiles=$($cmd | wc -l)
7064 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
7066 cmd="$LFS find ! --mirror-state=sp --type f $td"
7067 nfiles=$($cmd | wc -l)
7068 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
7070 run_test 56ca "check lfs find --mirror-count|-N and --mirror-state"
7073 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7074 # note test will not do anything if MDS is not local
7075 if [ "$mds1_FSTYPE" != ldiskfs ]; then
7076 skip_env "ldiskfs only test"
7078 remote_mds_nodsh && skip "remote MDS with nodsh"
7080 local MNTDEV="osd*.*MDT*.mntdev"
7081 DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV)
7082 [ -z "$DEV" ] && error "can't access $MNTDEV"
7083 for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
7084 do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
7085 error "can't access $DEV"
7086 DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
7087 [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
7091 run_test 57a "verify MDS filesystem created with large inodes =="
7094 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7095 if [ "$mds1_FSTYPE" != ldiskfs ]; then
7096 skip_env "ldiskfs only test"
7098 remote_mds_nodsh && skip "remote MDS with nodsh"
7100 local dir=$DIR/$tdir
7103 local fileN=$dir/f$filecount
7105 rm -rf $dir || error "removing $dir"
7107 local mdtidx=$($LFS getstripe -m $dir)
7108 local mdtname=MDT$(printf %04x $mdtidx)
7109 local facet=mds$((mdtidx + 1))
7111 echo "mcreating $filecount files"
7112 createmany -m $dir/f 1 $filecount || error "creating files in $dir"
7114 # verify that files do not have EAs yet
7115 $LFS getstripe $file1 2>&1 | grep -q "no stripe" ||
7116 error "$file1 has an EA"
7117 $LFS getstripe $fileN 2>&1 | grep -q "no stripe" ||
7118 error "$fileN has an EA"
7122 df $dir #make sure we get new statfs data
7123 local mdsfree=$(do_facet $facet \
7124 lctl get_param -n osd*.*$mdtname.kbytesfree)
7125 local mdcfree=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
7128 echo "opening files to create objects/EAs"
7129 for file in $(seq -f $dir/f%g 1 $filecount); do
7130 $OPENFILE -f O_RDWR $file > /dev/null 2>&1 ||
7131 error "opening $file"
7134 # verify that files have EAs now
7135 $LFS getstripe $file1 | grep -q "obdidx" || error "$file1 missing EA"
7136 $LFS getstripe $fileN | grep -q "obdidx" || error "$fileN missing EA"
7138 sleep 1 #make sure we get new statfs data
7140 local mdsfree2=$(do_facet $facet \
7141 lctl get_param -n osd*.*$mdtname.kbytesfree)
7142 local mdcfree2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
7144 if [[ $mdcfree2 -lt $((mdcfree - 16)) ]]; then
7145 if [ "$mdsfree" != "$mdsfree2" ]; then
7146 error "MDC before $mdcfree != after $mdcfree2"
7148 echo "MDC before $mdcfree != after $mdcfree2"
7149 echo "unable to confirm if MDS has large inodes"
7154 run_test 57b "default LOV EAs are stored inside large inodes ==="
7157 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7158 [ -z "$(which wiretest 2>/dev/null)" ] &&
7159 skip_env "could not find wiretest"
7163 run_test 58 "verify cross-platform wire constants =============="
7166 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7168 echo "touch 130 files"
7169 createmany -o $DIR/f59- 130
7171 unlinkmany $DIR/f59- 130
7173 # wait for commitment of removal
7174 wait_delete_completed
7176 run_test 59 "verify cancellation of llog records async ========="
7178 TEST60_HEAD="test_60 run $RANDOM"
7180 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7181 remote_mgs_nodsh && skip "remote MGS with nodsh"
7182 do_facet mgs "! which run-llog.sh &> /dev/null" &&
7183 do_facet mgs "! ls run-llog.sh &> /dev/null" &&
7184 skip_env "missing subtest run-llog.sh"
7186 log "$TEST60_HEAD - from kernel mode"
7187 do_facet mgs "$LCTL dk > /dev/null"
7188 do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed"
7189 do_facet mgs $LCTL dk > $TMP/$tfile
7191 # LU-6388: test llog_reader
7192 local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
7193 llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
7194 [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
7195 skip_env "missing llog_reader"
7196 local fstype=$(facet_fstype mgs)
7197 [ $fstype != ldiskfs -a $fstype != zfs ] &&
7198 skip_env "Only for ldiskfs or zfs type mgs"
7200 local mntpt=$(facet_mntpt mgs)
7201 local mgsdev=$(mgsdevname 1)
7213 #get fid and record list
7214 fid_list=($(awk '/9_sub.*record/ { print $NF }' $TMP/$tfile |
7216 rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' $TMP/$tfile |
7218 #remount mgs as ldiskfs or zfs type
7219 stop mgs || error "stop mgs failed"
7220 mount_fstype mgs || error "remount mgs failed"
7221 for ((i = 0; i < ${#fid_list[@]}; i++)); do
7224 seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
7225 oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
7230 obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
7232 obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
7234 echo "obj_file is $obj_file"
7235 do_facet mgs $llog_reader $obj_file
7237 rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
7238 awk '{ print $3 }' | sed -e "s/^type=//g")
7239 if [ $rec_type != $rec ]; then
7240 echo "FAILED test_60a wrong record type $rec_type," \
7246 #check obj path if record type is LLOG_LOGID_MAGIC
7247 if [ "$rec" == "1064553b" ]; then
7248 path=$(do_facet mgs $llog_reader $obj_file |
7249 grep "path=" | awk '{ print $NF }' |
7250 sed -e "s/^path=//g")
7251 if [ $obj_file != $mntpt/$path ]; then
7252 echo "FAILED test_60a wrong obj path" \
7253 "$montpt/$path, should be $obj_file"
7260 #restart mgs before "error", otherwise it will block the next test
7261 stop mgs || error "stop mgs failed"
7262 start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
7263 $pass || error "test failed, see FAILED test_60a messages for specifics"
7265 run_test 60a "llog_test run from kernel module and test llog_reader"
7267 test_60b() { # bug 6411
7268 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7271 LLOG_COUNT=$(do_facet mgs dmesg |
7272 awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
7273 /llog_[a-z]*.c:[0-9]/ {
7285 [[ $LLOG_COUNT -gt 120 ]] &&
7286 error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
7288 run_test 60b "limit repeated messages from CERROR/CWARN"
7291 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7293 echo "create 5000 files"
7294 createmany -o $DIR/f60c- 5000
7295 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137
7296 lctl set_param fail_loc=0x80000137
7297 unlinkmany $DIR/f60c- 5000
7298 lctl set_param fail_loc=0
7300 run_test 60c "unlink file when mds full"
7303 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7305 SAVEPRINTK=$(lctl get_param -n printk)
7306 # verify "lctl mark" is even working"
7307 MESSAGE="test message ID $RANDOM $$"
7308 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
7309 dmesg | grep -q "$MESSAGE" || error "didn't find debug marker in log"
7311 lctl set_param printk=0 || error "set lnet.printk failed"
7312 lctl get_param -n printk | grep emerg || error "lnet.printk dropped emerg"
7313 MESSAGE="new test message ID $RANDOM $$"
7314 # Assume here that libcfs_debug_mark_buffer() uses D_WARNING
7315 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
7316 dmesg | grep -q "$MESSAGE" && error "D_WARNING wasn't masked" || true
7318 lctl set_param -n printk="$SAVEPRINTK"
7320 run_test 60d "test printk console message masking"
7323 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7324 remote_mds_nodsh && skip "remote MDS with nodsh"
7327 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
7328 do_facet mds1 lctl set_param fail_loc=0x15b
7331 run_test 60e "no space while new llog is being created"
7337 test_mkdir -c $MDSCOUNT $DIR/$tdir
7342 $LFS setdirstripe -i $(($index % $MDSCOUNT)) \
7343 -c $MDSCOUNT $DIR/$tdir/subdir$index \
7345 mkdir $DIR/$tdir/subdir$index 2>/dev/null
7346 rmdir $DIR/$tdir/subdir$index 2>/dev/null
7347 index=$((index + 1))
7353 for i in {0..100}; do
7354 # define OBD_FAIL_OSD_TXN_START 0x19a
7355 local index=$((i % MDSCOUNT + 1))
7357 do_facet mds$index $LCTL set_param fail_loc=0x8000019a \
7364 for i in $(seq $MDSCOUNT); do
7365 do_facet mds$i $LCTL set_param fail_loc=0 > /dev/null
7368 mkdir $DIR/$tdir/new || error "mkdir failed"
7369 rmdir $DIR/$tdir/new || error "rmdir failed"
7371 do_facet mds1 $LCTL lfsck_start -M $(facet_svc mds1) -A -C \
7373 for i in $(seq $MDSCOUNT); do
7374 wait_update_facet mds$i "$LCTL get_param -n \
7375 mdd.$(facet_svc mds$i).lfsck_namespace |
7376 awk '/^status/ { print \\\$2 }'" "completed"
7379 ls -R $DIR/$tdir || error "ls failed"
7380 rm -rf $DIR/$tdir || error "rmdir failed"
7382 run_test 60g "transaction abort won't cause MDT hung"
7385 [ $MDS1_VERSION -le $(version_code 2.12.52) ] &&
7386 skip "Need MDS version at least 2.12.52"
7387 [ $MDSCOUNT -lt 2 ] && skip "Need at least 2 MDTs"
7391 #define OBD_FAIL_MDS_STRIPE_CREATE 0x188
7392 #define OBD_FAIL_MDS_STRIPE_FID 0x189
7393 for fail_loc in 0x80000188 0x80000189; do
7394 do_facet mds1 "$LCTL set_param fail_loc=$fail_loc"
7395 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir-$fail_loc ||
7396 error "mkdir $dir-$fail_loc failed"
7397 for i in {0..10}; do
7398 # create may fail on missing stripe
7399 echo $i > $DIR/$tdir-$fail_loc/$i
7401 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
7402 error "getdirstripe $tdir-$fail_loc failed"
7403 $LFS migrate -m 1 $DIR/$tdir-$fail_loc ||
7404 error "migrate $tdir-$fail_loc failed"
7405 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
7406 error "getdirstripe $tdir-$fail_loc failed"
7407 pushd $DIR/$tdir-$fail_loc
7409 echo $f | cmp $f - || error "$f data mismatch"
7412 rm -rf $DIR/$tdir-$fail_loc
7415 run_test 60h "striped directory with missing stripes can be accessed"
7418 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7421 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1 || error "dd $f failed"
7422 cancel_lru_locks osc
7423 $MULTIOP $f OSMWUc || error "$MULTIOP $f failed"
7426 run_test 61a "mmap() writes don't make sync hang ================"
7429 mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
7431 run_test 61b "mmap() of unstriped file is successful"
7433 # bug 2330 - insufficient obd_match error checking causes LBUG
7435 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7439 cancel_lru_locks osc
7440 lctl set_param fail_loc=0x405
7441 cat $f && error "cat succeeded, expect -EIO"
7442 lctl set_param fail_loc=0
7444 # This test is now irrelevant (as of bug 10718 inclusion), we no longer
7445 # match every page all of the time.
7446 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
7448 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
7449 # Though this test is irrelevant anymore, it helped to reveal some
7450 # other grant bugs (LU-4482), let's keep it.
7451 test_63a() { # was test_63
7452 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7454 MAX_DIRTY_MB=$(lctl get_param -n osc.*.max_dirty_mb | head -n 1)
7456 for i in `seq 10` ; do
7457 dd if=/dev/zero of=$DIR/f63 bs=8k &
7463 rm -f $DIR/f63 || true
7465 run_test 63a "Verify oig_wait interruption does not crash ======="
7467 # bug 2248 - async write errors didn't return to application on sync
7468 # bug 3677 - async write errors left page locked
7470 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7473 lctl set_param debug=-1
7475 # ensure we have a grant to do async writes
7476 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
7479 sync # sync lest earlier test intercept the fail_loc
7481 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
7482 lctl set_param fail_loc=0x80000406
7483 $MULTIOP $DIR/$tfile Owy && \
7484 error "sync didn't return ENOMEM"
7485 sync; sleep 2; sync # do a real sync this time to flush page
7486 lctl get_param -n llite.*.dump_page_cache | grep locked && \
7487 error "locked page left in cache after async error" || true
7490 run_test 63b "async write errors should be returned to fsync ==="
7493 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7496 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
7498 run_test 64a "verify filter grant calculations (in kernel) ====="
7501 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7503 sh oos.sh $MOUNT || error "oos.sh failed: $?"
7505 run_test 64b "check out-of-space detection on client"
7508 $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
7510 run_test 64c "verify grant shrink"
7512 # this does exactly what osc_request.c:osc_announce_cached() does in
7513 # order to calculate max amount of grants to ask from server
7517 local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc)
7518 local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight)
7520 ((rpc_in_flight ++));
7521 nrpages=$((nrpages * rpc_in_flight))
7523 local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb)
7525 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
7527 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
7528 local undirty=$((nrpages * PAGE_SIZE))
7530 local max_extent_pages
7531 max_extent_pages=$($LCTL get_param osc.${tgt}.import |
7532 grep grant_max_extent_size | awk '{print $2}')
7533 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
7534 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
7535 local grant_extent_tax
7536 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
7537 grep grant_extent_tax | awk '{print $2}')
7539 undirty=$((undirty + nrextents * grant_extent_tax))
7544 # this is size of unit for grant allocation. It should be equal to
7545 # what tgt_grant.c:tgt_grant_chunk() calculates
7549 local grant_extent_tax
7551 max_brw_size=$($LCTL get_param osc.${tgt}.import |
7552 grep max_brw_size | awk '{print $2}')
7554 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
7555 grep grant_extent_tax | awk '{print $2}')
7557 echo $(((max_brw_size + grant_extent_tax) * 2))
7561 [ $OST1_VERSION -lt $(version_code 2.10.56) ] &&
7562 skip "OST < 2.10.55 doesn't limit grants enough"
7564 local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}')
7565 local file=$DIR/$tfile
7567 [[ $($LCTL get_param osc.${tgt}.import |
7568 grep "connect_flags:.*grant_param") ]] ||
7569 skip "no grant_param connect flag"
7571 local olddebug=$($LCTL get_param -n debug 2> /dev/null)
7573 $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true
7575 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
7576 stack_trap "rm -f $file" EXIT
7578 $LFS setstripe $file -i 0 -c 1
7579 dd if=/dev/zero of=$file bs=1M count=1000 &
7584 local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes)
7585 if [[ $cur_grant -gt $max_cur_granted ]]
7588 error "cur_grant $cur_grant > $max_cur_granted"
7591 [[ $? -ne 0 ]] && break;
7596 wait_delete_completed
7597 $LCTL set_param debug="$olddebug" 2> /dev/null || true
7599 run_test 64d "check grant limit exceed"
7601 # bug 1414 - set/get directories' stripe info
7603 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7605 test_mkdir $DIR/$tdir
7607 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
7609 run_test 65a "directory with no stripe info"
7612 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7614 test_mkdir $DIR/$tdir
7615 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7617 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7620 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
7622 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
7625 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7626 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
7628 test_mkdir $DIR/$tdir
7629 local stripesize=$($LFS getstripe -S $DIR/$tdir)
7631 $LFS setstripe -S $((stripesize * 4)) -i 1 \
7632 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
7634 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
7636 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
7639 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7641 test_mkdir $DIR/$tdir
7642 local STRIPECOUNT=$($LFS getstripe -c $DIR/$tdir)
7643 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7645 if [[ $STRIPECOUNT -le 0 ]]; then
7647 elif [[ $STRIPECOUNT -gt $LOV_MAX_STRIPE_COUNT ]]; then
7648 [[ $OSTCOUNT -gt $LOV_MAX_STRIPE_COUNT ]] &&
7649 sc=$LOV_MAX_STRIPE_COUNT || sc=$(($OSTCOUNT - 1))
7651 sc=$(($STRIPECOUNT - 1))
7653 $LFS setstripe -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
7654 touch $DIR/$tdir/f4 $DIR/$tdir/f5
7655 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
7656 error "lverify failed"
7658 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
7661 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7663 test_mkdir $DIR/$tdir
7665 $LFS setstripe $DIR/$tdir || error "setstripe"
7666 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7667 error "no stripe info failed"
7669 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
7671 run_test 65e "directory setstripe defaults"
7674 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7676 test_mkdir $DIR/${tdir}f
7677 $RUNAS $LFS setstripe $DIR/${tdir}f &&
7678 error "setstripe succeeded" || true
7680 run_test 65f "dir setstripe permission (should return error) ==="
7683 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7685 test_mkdir $DIR/$tdir
7686 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7688 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7689 error "setstripe -S failed"
7690 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
7691 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7692 error "delete default stripe failed"
7694 run_test 65g "directory setstripe -d"
7697 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7699 test_mkdir $DIR/$tdir
7700 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7702 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7703 error "setstripe -S failed"
7704 test_mkdir $DIR/$tdir/dd1
7705 [ $($LFS getstripe -c $DIR/$tdir) = $($LFS getstripe -c $DIR/$tdir/dd1) ] ||
7706 error "stripe info inherit failed"
7708 run_test 65h "directory stripe info inherit ===================="
7711 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7713 save_layout_restore_at_exit $MOUNT
7715 # bug6367: set non-default striping on root directory
7716 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
7718 # bug12836: getstripe on -1 default directory striping
7719 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
7721 # bug12836: getstripe -v on -1 default directory striping
7722 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
7724 # bug12836: new find on -1 default directory striping
7725 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
7727 run_test 65i "various tests to set root directory striping"
7729 test_65j() { # bug6367
7730 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7734 # if we aren't already remounting for each test, do so for this test
7735 if [ "$I_MOUNTED" = "yes" ]; then
7736 cleanup || error "failed to unmount"
7740 save_layout_restore_at_exit $MOUNT
7742 $LFS setstripe -d $MOUNT || error "setstripe failed"
7744 run_test 65j "set default striping on root directory (bug 6367)="
7748 wait_delete_completed
7749 do_facet $SINGLEMDS "lctl set_param -n \
7750 osp.$ost*MDT0000.max_create_count=$max_count"
7751 do_facet $SINGLEMDS "lctl set_param -n \
7752 osp.$ost*MDT0000.create_count=$count"
7753 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7754 echo $INACTIVE_OSC "is Activate"
7756 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7759 test_65k() { # bug11679
7760 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7761 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7762 remote_mds_nodsh && skip "remote MDS with nodsh"
7764 local disable_precreate=true
7765 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
7766 disable_precreate=false
7768 echo "Check OST status: "
7769 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
7770 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
7772 for OSC in $MDS_OSCS; do
7773 echo $OSC "is active"
7774 do_facet $SINGLEMDS lctl --device %$OSC activate
7777 for INACTIVE_OSC in $MDS_OSCS; do
7778 local ost=$(osc_to_ost $INACTIVE_OSC)
7779 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
7780 lov.*md*.target_obd |
7781 awk -F: /$ost/'{ print $1 }' | head -n 1)
7784 $LFS setstripe -i $ostnum -c 1 $DIR/$tdir
7785 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
7787 echo "Deactivate: " $INACTIVE_OSC
7788 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
7790 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
7791 osp.$ost*MDT0000.create_count")
7792 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
7793 osp.$ost*MDT0000.max_create_count")
7794 $disable_precreate &&
7795 do_facet $SINGLEMDS "lctl set_param -n \
7796 osp.$ost*MDT0000.max_create_count=0"
7798 for idx in $(seq 0 $((OSTCOUNT - 1))); do
7799 [ -f $DIR/$tdir/$idx ] && continue
7800 echo "$LFS setstripe -i $idx -c 1 $DIR/$tdir/$idx"
7801 $LFS setstripe -i $idx -c 1 $DIR/$tdir/$idx ||
7803 error "setstripe $idx should succeed"; }
7804 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
7806 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
7809 do_facet $SINGLEMDS "lctl set_param -n \
7810 osp.$ost*MDT0000.max_create_count=$max_count"
7811 do_facet $SINGLEMDS "lctl set_param -n \
7812 osp.$ost*MDT0000.create_count=$count"
7813 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7814 echo $INACTIVE_OSC "is Activate"
7816 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7819 run_test 65k "validate manual striping works properly with deactivated OSCs"
7821 test_65l() { # bug 12836
7822 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7824 test_mkdir -p $DIR/$tdir/test_dir
7825 $LFS setstripe -c -1 $DIR/$tdir/test_dir
7826 $LFS find -mtime -1 $DIR/$tdir >/dev/null
7828 run_test 65l "lfs find on -1 stripe dir ========================"
7831 local layout=$(save_layout $MOUNT)
7832 $RUNAS $LFS setstripe -c 2 $MOUNT && {
7833 restore_layout $MOUNT $layout
7834 error "setstripe should fail by non-root users"
7838 run_test 65m "normal user can't set filesystem default stripe"
7841 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
7842 [[ $MDS1_VERSION -ge $(version_code 2.12.50) ]] ||
7843 skip "Need MDS version at least 2.12.50"
7844 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7846 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7847 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7848 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7850 local root_layout=$(save_layout $MOUNT)
7851 stack_trap "restore_layout $MOUNT $root_layout" EXIT
7853 # new subdirectory under root directory should not inherit
7854 # the default layout from root
7855 local dir1=$MOUNT/$tdir-1
7856 mkdir $dir1 || error "mkdir $dir1 failed"
7857 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7858 error "$dir1 shouldn't have LOV EA"
7860 # delete the default layout on root directory
7861 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7863 local dir2=$MOUNT/$tdir-2
7864 mkdir $dir2 || error "mkdir $dir2 failed"
7865 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7866 error "$dir2 shouldn't have LOV EA"
7868 # set a new striping pattern on root directory
7869 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7870 local new_def_stripe_size=$((def_stripe_size * 2))
7871 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7872 error "set stripe size on $MOUNT failed"
7874 # new file created in $dir2 should inherit the new stripe size from
7875 # the filesystem default
7876 local file2=$dir2/$tfile-2
7877 touch $file2 || error "touch $file2 failed"
7879 local file2_stripe_size=$($LFS getstripe -S $file2)
7880 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7881 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7883 local dir3=$MOUNT/$tdir-3
7884 mkdir $dir3 || error "mkdir $dir3 failed"
7885 # $dir3 shouldn't have LOV EA, but "lfs getstripe -d $dir3" should show
7886 # the root layout, which is the actual default layout that will be used
7887 # when new files are created in $dir3.
7888 local dir3_layout=$(get_layout_param $dir3)
7889 local root_dir_layout=$(get_layout_param $MOUNT)
7890 [[ "$dir3_layout" = "$root_dir_layout" ]] ||
7891 error "$dir3 should show the default layout from $MOUNT"
7893 # set OST pool on root directory
7894 local pool=$TESTNAME
7895 pool_add $pool || error "add $pool failed"
7896 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7897 error "add targets to $pool failed"
7899 $LFS setstripe -p $pool $MOUNT ||
7900 error "set OST pool on $MOUNT failed"
7902 # new file created in $dir3 should inherit the pool from
7903 # the filesystem default
7904 local file3=$dir3/$tfile-3
7905 touch $file3 || error "touch $file3 failed"
7907 local file3_pool=$($LFS getstripe -p $file3)
7908 [[ "$file3_pool" = "$pool" ]] ||
7909 error "$file3 didn't inherit OST pool $pool"
7911 local dir4=$MOUNT/$tdir-4
7912 mkdir $dir4 || error "mkdir $dir4 failed"
7913 local dir4_layout=$(get_layout_param $dir4)
7914 root_dir_layout=$(get_layout_param $MOUNT)
7915 echo "$LFS getstripe -d $dir4"
7916 $LFS getstripe -d $dir4
7917 echo "$LFS getstripe -d $MOUNT"
7918 $LFS getstripe -d $MOUNT
7919 [[ "$dir4_layout" = "$root_dir_layout" ]] ||
7920 error "$dir4 should show the default layout from $MOUNT"
7922 # new file created in $dir4 should inherit the pool from
7923 # the filesystem default
7924 local file4=$dir4/$tfile-4
7925 touch $file4 || error "touch $file4 failed"
7927 local file4_pool=$($LFS getstripe -p $file4)
7928 [[ "$file4_pool" = "$pool" ]] ||
7929 error "$file4 didn't inherit OST pool $pool"
7931 # new subdirectory under non-root directory should inherit
7932 # the default layout from its parent directory
7933 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7934 error "set directory layout on $dir4 failed"
7936 local dir5=$dir4/$tdir-5
7937 mkdir $dir5 || error "mkdir $dir5 failed"
7939 dir4_layout=$(get_layout_param $dir4)
7940 local dir5_layout=$(get_layout_param $dir5)
7941 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7942 error "$dir5 should inherit the default layout from $dir4"
7944 # though subdir under ROOT doesn't inherit default layout, but
7945 # its sub dir/file should be created with default layout.
7946 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
7947 [[ $MDS1_VERSION -ge $(version_code 2.12.59) ]] ||
7948 skip "Need MDS version at least 2.12.59"
7950 local default_lmv_count=$($LFS getdirstripe -D -c $MOUNT)
7951 local default_lmv_index=$($LFS getdirstripe -D -i $MOUNT)
7952 local default_lmv_hash=$($LFS getdirstripe -D -H $MOUNT)
7954 if [ $default_lmv_hash == "none" ]; then
7955 stack_trap "$LFS setdirstripe -D -d $MOUNT" EXIT
7957 stack_trap "$LFS setdirstripe -D -i $default_lmv_index \
7958 -c $default_lmv_count -H $default_lmv_hash $MOUNT" EXIT
7961 $LFS setdirstripe -D -c 2 $MOUNT ||
7962 error "setdirstripe -D -c 2 failed"
7963 mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed"
7964 local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6)
7965 [ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count"
7967 run_test 65n "don't inherit default layout from root for new subdirectories"
7969 # bug 2543 - update blocks count on client
7971 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7974 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7975 sync; sync_all_data; sync; sync_all_data
7976 cancel_lru_locks osc
7977 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7978 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7980 run_test 66 "update inode blocks count on client ==============="
7983 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7987 swapon -s | awk '($1 == "'$1'") { print $4 }'
7990 # bug5265, obdfilter oa2dentry return -ENOENT
7991 # #define OBD_FAIL_SRV_ENOENT 0x217
7993 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7994 remote_ost_nodsh && skip "remote OST with nodsh"
7997 $LFS setstripe -c 1 -i 0 $f
7999 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
8001 do_facet ost1 lctl set_param fail_loc=0x217
8002 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
8003 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
8005 do_facet ost1 lctl set_param fail_loc=0
8006 $DIRECTIO write $f 0 2 || error "write error"
8008 cancel_lru_locks osc
8009 $DIRECTIO read $f 0 1 || error "read error"
8011 do_facet ost1 lctl set_param fail_loc=0x217
8012 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
8014 do_facet ost1 lctl set_param fail_loc=0
8017 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
8020 test_mkdir $DIR/$tdir
8021 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
8022 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
8024 run_test 71 "Running dbench on lustre (don't segment fault) ===="
8026 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
8027 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8028 [ "$RUNAS_ID" = "$UID" ] &&
8029 skip_env "RUNAS_ID = UID = $UID -- skipping"
8030 # Check that testing environment is properly set up. Skip if not
8031 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
8032 skip_env "User $RUNAS_ID does not exist - skipping"
8035 chmod 777 $DIR/$tfile
8036 chmod ug+s $DIR/$tfile
8037 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
8038 error "$RUNAS dd $DIR/$tfile failed"
8039 # See if we are still setuid/sgid
8040 [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] &&
8041 error "S/gid is not dropped on write"
8042 # Now test that MDS is updated too
8043 cancel_lru_locks mdc
8044 [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] &&
8045 error "S/gid is not dropped on MDS"
8048 run_test 72a "Test that remove suid works properly (bug5695) ===="
8050 test_72b() { # bug 24226 -- keep mode setting when size is not changing
8053 [ "$RUNAS_ID" = "$UID" ] &&
8054 skip_env "RUNAS_ID = UID = $UID -- skipping"
8055 [ "$RUNAS_ID" -eq 0 ] &&
8056 skip_env "RUNAS_ID = 0 -- skipping"
8057 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8058 # Check that testing environment is properly set up. Skip if not
8059 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
8060 skip_env "User $RUNAS_ID does not exist - skipping"
8062 touch $DIR/${tfile}-f{g,u}
8063 test_mkdir $DIR/${tfile}-dg
8064 test_mkdir $DIR/${tfile}-du
8065 chmod 770 $DIR/${tfile}-{f,d}{g,u}
8066 chmod g+s $DIR/${tfile}-{f,d}g
8067 chmod u+s $DIR/${tfile}-{f,d}u
8068 for perm in 777 2777 4777; do
8069 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
8070 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
8071 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
8072 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
8076 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
8078 # bug 3462 - multiple simultaneous MDC requests
8080 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8082 test_mkdir $DIR/d73-1
8083 test_mkdir $DIR/d73-2
8084 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
8087 lctl set_param fail_loc=0x80000129
8088 $MULTIOP $DIR/d73-1/f73-2 Oc &
8090 lctl set_param fail_loc=0
8092 $MULTIOP $DIR/d73-2/f73-3 Oc &
8096 wait $pid1 || return 1
8100 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
8101 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
8102 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
8106 run_test 73 "multiple MDC requests (should not deadlock)"
8108 test_74a() { # bug 6149, 6184
8109 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8112 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
8114 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
8115 # will spin in a tight reconnection loop
8116 $LCTL set_param fail_loc=0x8000030e
8117 # get any lock that won't be difficult - lookup works.
8119 $LCTL set_param fail_loc=0
8123 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
8125 test_74b() { # bug 13310
8126 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8128 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
8130 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
8131 # will spin in a tight reconnection loop
8132 $LCTL set_param fail_loc=0x8000030e
8133 # get a "difficult" lock
8135 $LCTL set_param fail_loc=0
8139 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
8142 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8144 #define OBD_FAIL_LDLM_NEW_LOCK
8145 $LCTL set_param fail_loc=0x319
8146 touch $DIR/$tfile && error "touch successful"
8147 $LCTL set_param fail_loc=0
8150 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
8153 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
8156 test_76() { # Now for bug 20433, added originally in bug 1443
8157 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8159 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
8161 cancel_lru_locks osc
8162 BEFORE_INODES=$(num_inodes)
8163 echo "before inodes: $BEFORE_INODES"
8165 [ "$SLOW" = "no" ] && COUNT=100
8166 for i in $(seq $COUNT); do
8170 cancel_lru_locks osc
8171 AFTER_INODES=$(num_inodes)
8172 echo "after inodes: $AFTER_INODES"
8174 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
8176 AFTER_INODES=$(num_inodes)
8178 echo "wait $wait seconds inodes: $AFTER_INODES"
8179 if [ $wait -gt 30 ]; then
8180 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
8184 run_test 76 "confirm clients recycle inodes properly ===="
8190 # Note: in sptlrpc modes which enable its own bulk checksum, the
8191 # original crc32_le bulk checksum will be automatically disabled,
8192 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
8193 # will be checked by sptlrpc code against sptlrpc bulk checksum.
8194 # In this case set_checksums() will not be no-op, because sptlrpc
8195 # bulk checksum will be enabled all through the test.
8197 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
8198 lctl set_param -n osc.*.checksums $1
8202 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
8203 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
8204 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
8205 tr -d [] | head -n1)}
8208 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
8210 log "set checksum type to $1, rc = $rc"
8214 get_osc_checksum_type()
8216 # arugment 1: OST name, like OST0000
8218 checksum_type=$(lctl get_param -n osc.*${ost}-osc-[^mM]*.checksum_type |
8219 sed 's/.*\[\(.*\)\].*/\1/g')
8221 [ $rc -ne 0 ] && error "failed to get checksum type of $ost, rc = $rc, output = $checksum_type"
8225 F77_TMP=$TMP/f77-temp
8228 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
8229 error "error writing to $F77_TMP"
8232 test_77a() { # bug 10889
8233 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8234 $GSS && skip_env "could not run with gss"
8236 [ ! -f $F77_TMP ] && setup_f77
8238 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
8242 run_test 77a "normal checksum read/write operation"
8244 test_77b() { # bug 10889
8245 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8246 $GSS && skip_env "could not run with gss"
8248 [ ! -f $F77_TMP ] && setup_f77
8249 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
8250 $LCTL set_param fail_loc=0x80000409
8253 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
8254 error "dd error: $?"
8255 $LCTL set_param fail_loc=0
8257 for algo in $CKSUM_TYPES; do
8258 cancel_lru_locks osc
8259 set_checksum_type $algo
8260 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
8261 $LCTL set_param fail_loc=0x80000408
8262 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
8263 $LCTL set_param fail_loc=0
8266 set_checksum_type $ORIG_CSUM_TYPE
8269 run_test 77b "checksum error on client write, read"
8274 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
8276 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
8277 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
8278 $check_ost && [ -n "$ost_file_prefix" ] &&
8279 do_facet ost1 rm -f ${ost_file_prefix}\*
8283 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8284 $GSS && skip_env "could not run with gss"
8285 remote_ost_nodsh && skip "remote OST with nodsh"
8288 local osc_file_prefix
8290 local check_ost=false
8291 local ost_file_prefix
8297 # ensure corruption will occur on first OSS/OST
8298 $LFS setstripe -i 0 $DIR/$tfile
8300 [ ! -f $F77_TMP ] && setup_f77
8301 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
8302 error "dd write error: $?"
8303 fid=$($LFS path2fid $DIR/$tfile)
8305 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
8308 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
8309 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
8311 echo "OSS do not support bulk pages dump upon error"
8314 osc_file_prefix=$($LCTL get_param -n debug_path)
8315 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
8317 trap cleanup_77c EXIT
8320 # enable bulk pages dump upon error on Client
8321 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
8322 # enable bulk pages dump upon error on OSS
8324 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
8326 # flush Client cache to allow next read to reach OSS
8327 cancel_lru_locks osc
8329 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
8330 $LCTL set_param fail_loc=0x80000408
8331 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
8332 $LCTL set_param fail_loc=0
8336 # check cksum dump on Client
8337 osc_file=$(ls ${osc_file_prefix}*)
8338 [ -n "$osc_file" ] || error "no checksum dump file on Client"
8339 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
8340 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
8341 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
8342 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
8344 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
8345 [[ "$orig_cksum" == "$dump_cksum" ]] ||
8346 error "dump content does not match on Client"
8348 $check_ost || skip "No need to check cksum dump on OSS"
8350 # check cksum dump on OSS
8351 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
8352 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
8353 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
8354 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
8355 [[ "$orig_cksum" == "$dump_cksum" ]] ||
8356 error "dump content does not match on OSS"
8360 run_test 77c "checksum error on client read with debug"
8362 test_77d() { # bug 10889
8363 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8364 $GSS && skip_env "could not run with gss"
8366 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
8367 $LCTL set_param fail_loc=0x80000409
8369 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
8370 error "direct write: rc=$?"
8371 $LCTL set_param fail_loc=0
8374 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
8375 $LCTL set_param fail_loc=0x80000408
8377 cancel_lru_locks osc
8378 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
8379 error "direct read: rc=$?"
8380 $LCTL set_param fail_loc=0
8383 run_test 77d "checksum error on OST direct write, read"
8385 test_77f() { # bug 10889
8386 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8387 $GSS && skip_env "could not run with gss"
8390 for algo in $CKSUM_TYPES; do
8391 cancel_lru_locks osc
8392 set_checksum_type $algo
8393 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
8394 $LCTL set_param fail_loc=0x409
8395 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
8396 error "direct write succeeded"
8397 $LCTL set_param fail_loc=0
8399 set_checksum_type $ORIG_CSUM_TYPE
8402 run_test 77f "repeat checksum error on write (expect error)"
8404 test_77g() { # bug 10889
8405 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8406 $GSS && skip_env "could not run with gss"
8407 remote_ost_nodsh && skip "remote OST with nodsh"
8409 [ ! -f $F77_TMP ] && setup_f77
8411 local file=$DIR/$tfile
8412 stack_trap "rm -f $file" EXIT
8414 $LFS setstripe -c 1 -i 0 $file
8415 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
8416 do_facet ost1 lctl set_param fail_loc=0x8000021a
8418 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
8419 error "write error: rc=$?"
8420 do_facet ost1 lctl set_param fail_loc=0
8423 cancel_lru_locks osc
8424 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
8425 do_facet ost1 lctl set_param fail_loc=0x8000021b
8427 cmp $F77_TMP $file || error "file compare failed"
8428 do_facet ost1 lctl set_param fail_loc=0
8431 run_test 77g "checksum error on OST write, read"
8433 test_77k() { # LU-10906
8434 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8435 $GSS && skip_env "could not run with gss"
8437 local cksum_param="osc.$FSNAME*.checksums"
8438 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
8442 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
8443 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
8444 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
8448 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
8449 error "failed to set checksum=$i on MGS"
8450 wait_update $HOSTNAME "$get_checksum" $i
8452 echo "remount client, checksum should be $i"
8453 remount_client $MOUNT || error "failed to remount client"
8454 checksum=$(eval $get_checksum)
8455 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
8457 # remove persistent param to avoid races with checksum mountopt below
8458 do_facet mgs $LCTL set_param -P -d $cksum_param ||
8459 error "failed to delete checksum on MGS"
8461 for opt in "checksum" "nochecksum"; do
8462 #remount with mount option
8463 echo "remount client with option $opt, checksum should be $i"
8464 umount_client $MOUNT || error "failed to umount client"
8465 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
8466 error "failed to mount client with option '$opt'"
8467 checksum=$(eval $get_checksum)
8468 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
8472 remount_client $MOUNT || error "failed to remount client"
8474 run_test 77k "enable/disable checksum correctly"
8477 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8478 $GSS && skip_env "could not run with gss"
8481 stack_trap "set_checksums $ORIG_CSUM" EXIT
8482 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
8484 set_checksum_type invalid && error "unexpected success of invalid checksum type"
8486 $LFS setstripe -c 1 -i 0 $DIR/$tfile
8487 for algo in $CKSUM_TYPES; do
8488 set_checksum_type $algo || error "fail to set checksum type $algo"
8489 osc_algo=$(get_osc_checksum_type OST0000)
8490 [ "$osc_algo" != "$algo" ] && error "checksum type is $osc_algo after setting it to $algo"
8492 # no locks, no reqs to let the connection idle
8493 cancel_lru_locks osc
8494 lru_resize_disable osc
8495 wait_osc_import_state client ost1 IDLE
8497 # ensure ost1 is connected
8498 stat $DIR/$tfile >/dev/null || error "can't stat"
8499 wait_osc_import_state client ost1 FULL
8501 osc_algo=$(get_osc_checksum_type OST0000)
8502 [ "$osc_algo" != "$algo" ] && error "checksum type changed from $algo to $osc_algo after reconnection"
8506 run_test 77l "preferred checksum type is remembered after reconnected"
8508 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
8517 test_78() { # bug 10901
8518 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8519 remote_ost || skip_env "local OST"
8522 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
8523 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
8524 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
8525 echo "MemTotal: $MEMTOTAL"
8527 # reserve 256MB of memory for the kernel and other running processes,
8528 # and then take 1/2 of the remaining memory for the read/write buffers.
8529 if [ $MEMTOTAL -gt 512 ] ;then
8530 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
8532 # for those poor memory-starved high-end clusters...
8533 MEMTOTAL=$((MEMTOTAL / 2))
8535 echo "Mem to use for directio: $MEMTOTAL"
8537 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
8538 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
8539 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
8540 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
8542 echo "Smallest OST: $SMALLESTOST"
8543 [[ $SMALLESTOST -lt 10240 ]] &&
8544 skip "too small OSTSIZE, useless to run large O_DIRECT test"
8546 trap cleanup_test_78 EXIT
8548 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
8549 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
8551 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
8552 echo "File size: $F78SIZE"
8553 $LFS setstripe -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
8554 for i in $(seq 1 $NSEQ); do
8555 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
8556 echo directIO rdwr round $i of $NSEQ
8557 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
8562 run_test 78 "handle large O_DIRECT writes correctly ============"
8564 test_79() { # bug 12743
8565 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8567 wait_delete_completed
8569 BKTOTAL=$(calc_osc_kbytes kbytestotal)
8570 BKFREE=$(calc_osc_kbytes kbytesfree)
8571 BKAVAIL=$(calc_osc_kbytes kbytesavail)
8573 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
8574 DFTOTAL=`echo $STRING | cut -d, -f1`
8575 DFUSED=`echo $STRING | cut -d, -f2`
8576 DFAVAIL=`echo $STRING | cut -d, -f3`
8577 DFFREE=$(($DFTOTAL - $DFUSED))
8579 ALLOWANCE=$((64 * $OSTCOUNT))
8581 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
8582 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
8583 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
8585 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
8586 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
8587 error "df free($DFFREE) mismatch OST free($BKFREE)"
8589 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
8590 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
8591 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
8594 run_test 79 "df report consistency check ======================="
8596 test_80() { # bug 10718
8597 remote_ost_nodsh && skip "remote OST with nodsh"
8598 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8600 # relax strong synchronous semantics for slow backends like ZFS
8601 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
8602 local soc="obdfilter.*.sync_lock_cancel"
8603 local save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
8605 # "sync_on_lock_cancel" was broken by v2_11_55_0-26-g7059644e9a
8606 if [ -z "$save" ]; then
8607 soc="obdfilter.*.sync_on_lock_cancel"
8608 save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
8611 if [ "$save" != "never" ]; then
8612 local hosts=$(comma_list $(osts_nodes))
8614 do_nodes $hosts $LCTL set_param $soc=never
8615 stack_trap "do_nodes $hosts $LCTL set_param $soc=$save"
8619 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
8621 local before=$(date +%s)
8622 cancel_lru_locks osc
8623 local after=$(date +%s)
8624 local diff=$((after - before))
8625 [ $diff -le 1 ] || error "elapsed for 1M@1T = $diff"
8629 run_test 80 "Page eviction is equally fast at high offsets too"
8631 test_81a() { # LU-456
8632 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8633 remote_ost_nodsh && skip "remote OST with nodsh"
8635 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8636 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
8637 do_facet ost1 lctl set_param fail_loc=0x80000228
8639 # write should trigger a retry and success
8640 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8641 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8643 if [ $RC -ne 0 ] ; then
8644 error "write should success, but failed for $RC"
8647 run_test 81a "OST should retry write when get -ENOSPC ==============="
8649 test_81b() { # LU-456
8650 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8651 remote_ost_nodsh && skip "remote OST with nodsh"
8653 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8654 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
8655 do_facet ost1 lctl set_param fail_loc=0x228
8657 # write should retry several times and return -ENOSPC finally
8658 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8659 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8662 if [ $RC -ne $ENOSPC ] ; then
8663 error "dd should fail for -ENOSPC, but succeed."
8666 run_test 81b "OST should return -ENOSPC when retry still fails ======="
8668 test_82() { # LU-1031
8669 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
8673 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
8675 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
8677 kill -USR1 $MULTIPID2
8679 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
8680 error "First grouplock does not block second one"
8682 echo "Second grouplock blocks first one"
8684 kill -USR1 $MULTIPID1
8688 run_test 82 "Basic grouplock test"
8691 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
8693 test_mkdir $DIR/$tdir.cvsroot
8694 chown $RUNAS_ID $DIR/$tdir.cvsroot
8697 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
8700 # some versions of cvs import exit(1) when asked to import links or
8701 # files they can't read. ignore those files.
8702 local toignore=$(find . -type l -printf '-I %f\n' -o \
8703 ! -perm /4 -printf '-I %f\n')
8704 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
8705 $tdir.reposname vtag rtag
8708 test_mkdir $DIR/$tdir.reposname
8709 chown $RUNAS_ID $DIR/$tdir.reposname
8710 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
8712 cd $DIR/$tdir.reposname
8714 $RUNAS cvs add -m 'addmsg' foo99
8716 $RUNAS cvs commit -m 'nomsg' foo99
8717 rm -fr $DIR/$tdir.cvsroot
8719 run_test 99 "cvs strange file/directory operations"
8722 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8723 [[ "$NETTYPE" =~ tcp ]] ||
8724 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
8725 remote_ost_nodsh && skip "remote OST with nodsh"
8726 remote_mds_nodsh && skip "remote MDS with nodsh"
8728 skip "useless for local single node setup"
8730 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
8731 [ "$PROT" != "tcp" ] && continue
8732 RPORT=$(echo $REMOTE | cut -d: -f2)
8733 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
8736 LPORT=`echo $LOCAL | cut -d: -f2`
8737 if [ $LPORT -ge 1024 ]; then
8738 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
8740 error_exit "local: $LPORT > 1024, remote: $RPORT"
8743 [ "$rc" = 0 ] || error_exit "privileged port not found" )
8745 run_test 100 "check local port using privileged port ==========="
8747 function get_named_value()
8756 echo $line | sed "s/^$tag[ ]*//"
8763 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
8764 awk '/^max_cached_mb/ { print $2 }')
8767 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
8772 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8777 local cache_limit=32
8779 $LCTL set_param -n osc.*-osc*.rpc_stats 0
8780 trap cleanup_101a EXIT
8781 $LCTL set_param -n llite.*.read_ahead_stats 0
8782 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
8785 # randomly read 10000 of 64K chunks from file 3x 32MB in size
8787 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
8788 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
8791 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
8792 get_named_value 'read but discarded' | cut -d" " -f1); do
8793 discard=$(($discard + $s))
8797 $LCTL get_param osc.*-osc*.rpc_stats
8798 $LCTL get_param llite.*.read_ahead_stats
8800 # Discard is generally zero, but sometimes a few random reads line up
8801 # and trigger larger readahead, which is wasted & leads to discards.
8802 if [[ $(($discard)) -gt $nreads ]]; then
8803 error "too many ($discard) discarded pages"
8805 rm -f $DIR/$tfile || true
8807 run_test 101a "check read-ahead for random reads"
8810 test_mkdir $DIR/$tdir
8812 local FILE_LENGTH=$2
8815 local FILE_SIZE_MB=$((FILE_LENGTH / ssize))
8817 local list=$(comma_list $(osts_nodes))
8818 set_osd_param $list '' read_cache_enable 0
8819 set_osd_param $list '' writethrough_cache_enable 0
8821 trap cleanup_test101bc EXIT
8822 # prepare the read-ahead file
8823 $LFS setstripe -S $ssize -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
8825 dd if=/dev/zero of=$DIR/$tfile bs=$ssize \
8826 count=$FILE_SIZE_MB 2> /dev/null
8830 cleanup_test101bc() {
8835 local list=$(comma_list $(osts_nodes))
8836 set_osd_param $list '' read_cache_enable 1
8837 set_osd_param $list '' writethrough_cache_enable 1
8841 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
8846 local STRIPE_SIZE=$2
8847 local FILE_LENGTH=$3
8848 local RA_INC=1048576
8849 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
8850 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
8851 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
8852 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
8853 get_named_value 'read but discarded' |
8854 cut -d" " -f1 | calc_total)
8855 if [[ $DISCARD -gt $discard_limit ]]; then
8856 $LCTL get_param llite.*.read_ahead_stats
8857 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
8859 echo "Read-ahead success for size ${READ_SIZE}"
8864 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8865 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8867 local STRIPE_SIZE=1048576
8868 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
8870 if [ $SLOW == "yes" ]; then
8871 local FILE_LENGTH=$((STRIDE_SIZE * 64))
8873 local FILE_LENGTH=$((STRIDE_SIZE * 8))
8876 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
8878 # prepare the read-ahead file
8879 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8880 cancel_lru_locks osc
8881 for BIDX in 2 4 8 16 32 64 128 256
8883 local BSIZE=$((BIDX*4096))
8884 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
8885 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
8886 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
8887 $LCTL set_param -n llite.*.read_ahead_stats 0
8888 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
8889 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
8890 cancel_lru_locks osc
8891 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
8896 run_test 101b "check stride-io mode read-ahead ================="
8899 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8901 local STRIPE_SIZE=1048576
8902 local FILE_LENGTH=$((STRIPE_SIZE*100))
8907 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8909 cancel_lru_locks osc
8910 $LCTL set_param osc.*.rpc_stats 0
8911 $READS -f $DIR/$tfile -s$FILE_LENGTH -b$rsize -n$nreads -t 180
8912 $LCTL get_param osc.*.rpc_stats
8913 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8914 local stats=$($LCTL get_param -n $osc_rpc_stats)
8915 local lines=$(echo "$stats" | awk 'END {print NR;}')
8918 if [ $lines -le 20 ]; then
8919 echo "continue debug"
8922 for size in 1 2 4 8; do
8923 local rpc=$(echo "$stats" |
8924 awk '($1 == "'$size':") {print $2; exit; }')
8925 [ $rpc != 0 ] && ((size * PAGE_SIZE < rsize)) &&
8926 error "Small $((size*PAGE_SIZE)) read IO $rpc!"
8928 echo "$osc_rpc_stats check passed!"
8933 run_test 101c "check stripe_size aligned read-ahead ================="
8936 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8938 local file=$DIR/$tfile
8939 local sz_MB=${FILESIZE_101d:-500}
8940 local ra_MB=${READAHEAD_MB:-40}
8942 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8943 [ $free_MB -lt $sz_MB ] &&
8944 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8946 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8947 $LFS setstripe -c -1 $file || error "setstripe failed"
8949 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8950 echo Cancel LRU locks on lustre client to flush the client cache
8951 cancel_lru_locks osc
8953 echo Disable read-ahead
8954 local old_RA=$($LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1)
8955 $LCTL set_param -n llite.*.max_read_ahead_mb=0
8956 stack_trap "$LCTL set_param -n llite.*.max_read_ahead_mb $old_RA" EXIT
8957 $LCTL get_param -n llite.*.max_read_ahead_mb
8959 echo Reading the test file $file with read-ahead disabled
8960 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8962 echo Cancel LRU locks on lustre client to flush the client cache
8963 cancel_lru_locks osc
8964 echo Enable read-ahead with ${ra_MB}MB
8965 $LCTL set_param -n llite.*.max_read_ahead_mb=$ra_MB
8967 echo Reading the test file $file with read-ahead enabled
8968 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8970 echo "read-ahead disabled time read $raOFF"
8971 echo "read-ahead enabled time read $raON"
8974 wait_delete_completed
8976 [ $raOFF -le 1 ] || [ $raON -lt $raOFF ] ||
8977 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8979 run_test 101d "file read with and without read-ahead enabled"
8982 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8984 local file=$DIR/$tfile
8985 local size_KB=500 #KB
8989 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8990 local need_KB=$((count * size_KB))
8991 [[ $free_KB -le $need_KB ]] &&
8992 skip_env "Need free space $need_KB, have $free_KB"
8994 echo "Creating $count ${size_KB}K test files"
8995 for ((i = 0; i < $count; i++)); do
8996 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8999 echo "Cancel LRU locks on lustre client to flush the client cache"
9000 cancel_lru_locks $OSC
9002 echo "Reset readahead stats"
9003 $LCTL set_param -n llite.*.read_ahead_stats 0
9005 for ((i = 0; i < $count; i++)); do
9006 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
9009 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
9010 get_named_value 'misses' | cut -d" " -f1 | calc_total)
9012 for ((i = 0; i < $count; i++)); do
9013 rm -rf $file.$i 2>/dev/null
9016 #10000 means 20% reads are missing in readahead
9017 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
9019 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
9022 which iozone || skip_env "no iozone installed"
9024 local old_debug=$($LCTL get_param debug)
9025 old_debug=${old_debug#*=}
9026 $LCTL set_param debug="reada mmap"
9028 # create a test file
9029 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
9031 echo Cancel LRU locks on lustre client to flush the client cache
9032 cancel_lru_locks osc
9034 echo Reset readahead stats
9035 $LCTL set_param -n llite.*.read_ahead_stats 0
9037 echo mmap read the file with small block size
9038 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
9041 echo checking missing pages
9042 $LCTL get_param llite.*.read_ahead_stats
9043 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
9044 get_named_value 'misses' | cut -d" " -f1 | calc_total)
9046 $LCTL set_param debug="$old_debug"
9047 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
9050 run_test 101f "check mmap read performance"
9052 test_101g_brw_size_test() {
9054 local pages=$((mb * 1048576 / PAGE_SIZE))
9055 local file=$DIR/$tfile
9057 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
9058 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
9059 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
9060 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
9064 stack_trap "rm -f $file" EXIT
9065 $LCTL set_param -n osc.*.rpc_stats=0
9067 # 10 RPCs should be enough for the test
9069 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
9070 { error "dd write ${mb} MB blocks failed"; return 3; }
9071 cancel_lru_locks osc
9072 dd of=/dev/null if=$file bs=${mb}M count=$count ||
9073 { error "dd write ${mb} MB blocks failed"; return 4; }
9075 # calculate number of full-sized read and write RPCs
9076 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
9077 sed -n '/pages per rpc/,/^$/p' |
9078 awk '/'$pages':/ { reads += $2; writes += $6 }; \
9079 END { print reads,writes }'))
9080 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
9082 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
9089 remote_ost_nodsh && skip "remote OST with nodsh"
9092 local osts=$(get_facets OST)
9093 local list=$(comma_list $(osts_nodes))
9094 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
9095 local brw_size="obdfilter.*.brw_size"
9097 $LFS setstripe -i 0 -c 1 $DIR/$tfile
9099 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
9101 if { [ $OST1_VERSION -ge $(version_code 2.8.52) ] ||
9102 { [ $OST1_VERSION -ge $(version_code 2.7.17) ] &&
9103 [ $OST1_VERSION -lt $(version_code 2.7.50) ]; }; } &&
9104 { [ $CLIENT_VERSION -ge $(version_code 2.8.52) ] ||
9105 { [ $CLIENT_VERSION -ge $(version_code 2.7.17) ] &&
9106 [ $CLIENT_VERSION -lt $(version_code 2.7.50) ]; }; }; then
9108 [ $OST1_VERSION -ge $(version_code 2.9.52) ] &&
9111 if [[ $orig_mb -lt 16 ]]; then
9112 save_lustre_params $osts "$brw_size" > $p
9113 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
9114 error "set 16MB RPC size failed"
9116 echo "remount client to enable new RPC size"
9117 remount_client $MOUNT || error "remount_client failed"
9120 test_101g_brw_size_test 16 || error "16MB RPC test failed"
9121 # should be able to set brw_size=12, but no rpc_stats for that
9122 test_101g_brw_size_test 8 || error "8MB RPC test failed"
9125 test_101g_brw_size_test 4 || error "4MB RPC test failed"
9127 if [[ $orig_mb -lt 16 ]]; then
9128 restore_lustre_params < $p
9129 remount_client $MOUNT || error "remount_client restore failed"
9132 rm -f $p $DIR/$tfile
9134 run_test 101g "Big bulk(4/16 MiB) readahead"
9137 $LFS setstripe -i 0 -c 1 $DIR/$tfile
9139 dd if=/dev/zero of=$DIR/$tfile bs=1M count=70 ||
9140 error "dd 70M file failed"
9141 echo Cancel LRU locks on lustre client to flush the client cache
9142 cancel_lru_locks osc
9144 echo "Reset readahead stats"
9145 $LCTL set_param -n llite.*.read_ahead_stats 0
9147 echo "Read 10M of data but cross 64M bundary"
9148 dd if=$DIR/$tfile of=/dev/null bs=10M skip=6 count=1
9149 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
9150 get_named_value 'misses' | cut -d" " -f1 | calc_total)
9151 [ $miss -eq 1 ] || error "expected miss 1 but got $miss"
9152 rm -f $p $DIR/$tfile
9154 run_test 101h "Readahead should cover current read window"
9157 test_mkdir $DIR/$tdir
9158 chown $RUNAS_ID $DIR/$tdir
9161 STRIPE_COUNT=$OSTCOUNT
9162 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
9164 trap cleanup_test102 EXIT
9166 $1 $LFS setstripe -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
9168 for num in 1 2 3 4; do
9169 for count in $(seq 1 $STRIPE_COUNT); do
9170 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
9171 local size=`expr $STRIPE_SIZE \* $num`
9172 local file=file"$num-$idx-$count"
9173 $1 $LFS setstripe -S $size -i $idx -c $count $file
9179 $1 tar cf $TMP/f102.tar $tdir --xattrs
9185 rm -rf $DIR/d0.sanity/d102
9189 [ "$UID" != 0 ] && skip "must run as root"
9190 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
9191 skip_env "must have user_xattr"
9193 [ -z "$(which setfattr 2>/dev/null)" ] &&
9194 skip_env "could not find setfattr"
9196 local testfile=$DIR/$tfile
9199 echo "set/get xattr..."
9200 setfattr -n trusted.name1 -v value1 $testfile ||
9201 error "setfattr -n trusted.name1=value1 $testfile failed"
9202 getfattr -n trusted.name1 $testfile 2> /dev/null |
9203 grep "trusted.name1=.value1" ||
9204 error "$testfile missing trusted.name1=value1"
9206 setfattr -n user.author1 -v author1 $testfile ||
9207 error "setfattr -n user.author1=author1 $testfile failed"
9208 getfattr -n user.author1 $testfile 2> /dev/null |
9209 grep "user.author1=.author1" ||
9210 error "$testfile missing trusted.author1=author1"
9213 setfattr -n trusted.name2 -v value2 $testfile ||
9214 error "$testfile unable to set trusted.name2"
9215 setfattr -n trusted.name3 -v value3 $testfile ||
9216 error "$testfile unable to set trusted.name3"
9217 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
9218 grep "trusted.name" | wc -l) -eq 3 ] ||
9219 error "$testfile missing 3 trusted.name xattrs"
9221 setfattr -n user.author2 -v author2 $testfile ||
9222 error "$testfile unable to set user.author2"
9223 setfattr -n user.author3 -v author3 $testfile ||
9224 error "$testfile unable to set user.author3"
9225 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
9226 grep "user.author" | wc -l) -eq 3 ] ||
9227 error "$testfile missing 3 user.author xattrs"
9229 echo "remove xattr..."
9230 setfattr -x trusted.name1 $testfile ||
9231 error "$testfile error deleting trusted.name1"
9232 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
9233 error "$testfile did not delete trusted.name1 xattr"
9235 setfattr -x user.author1 $testfile ||
9236 error "$testfile error deleting user.author1"
9237 echo "set lustre special xattr ..."
9238 $LFS setstripe -c1 $testfile
9239 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
9240 awk -F "=" '/trusted.lov/ { print $2 }' )
9241 setfattr -n "trusted.lov" -v $lovea $testfile ||
9242 error "$testfile doesn't ignore setting trusted.lov again"
9243 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
9244 error "$testfile allow setting invalid trusted.lov"
9247 run_test 102a "user xattr test =================================="
9250 [ -z "$(which setfattr 2>/dev/null)" ] &&
9251 skip_env "could not find setfattr"
9252 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9254 # b10930: get/set/list trusted.lov xattr
9255 echo "get/set/list trusted.lov xattr ..."
9256 local testfile=$DIR/$tfile
9257 $LFS setstripe -S 65536 -i 1 -c $OSTCOUNT $testfile ||
9258 error "setstripe failed"
9259 local STRIPECOUNT=$($LFS getstripe -c $testfile) ||
9260 error "getstripe failed"
9261 getfattr -d -m "^trusted" $testfile 2>/dev/null | grep "trusted.lov" ||
9262 error "can't get trusted.lov from $testfile"
9264 local testfile2=${testfile}2
9265 local value=$(getfattr -n trusted.lov $testfile 2>/dev/null |
9266 grep "trusted.lov" | sed -e 's/[^=]\+=//')
9269 setfattr -n trusted.lov -v $value $testfile2
9270 local stripe_size=$($LFS getstripe -S $testfile2)
9271 local stripe_count=$($LFS getstripe -c $testfile2)
9272 [[ $stripe_size -eq 65536 ]] ||
9273 error "stripe size $stripe_size != 65536"
9274 [[ $stripe_count -eq $STRIPECOUNT ]] ||
9275 error "stripe count $stripe_count != $STRIPECOUNT"
9278 run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
9281 [ -z "$(which setfattr 2>/dev/null)" ] &&
9282 skip_env "could not find setfattr"
9283 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9285 # b10930: get/set/list lustre.lov xattr
9286 echo "get/set/list lustre.lov xattr ..."
9287 test_mkdir $DIR/$tdir
9288 chown $RUNAS_ID $DIR/$tdir
9289 local testfile=$DIR/$tdir/$tfile
9290 $RUNAS $LFS setstripe -S 65536 -i 1 -c $OSTCOUNT $testfile ||
9291 error "setstripe failed"
9292 local STRIPECOUNT=$($RUNAS $LFS getstripe -c $testfile) ||
9293 error "getstripe failed"
9294 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
9295 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
9297 local testfile2=${testfile}2
9298 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
9299 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
9301 $RUNAS $MCREATE $testfile2
9302 $RUNAS setfattr -n lustre.lov -v $value $testfile2
9303 local stripe_size=$($RUNAS $LFS getstripe -S $testfile2)
9304 local stripe_count=$($RUNAS $LFS getstripe -c $testfile2)
9305 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
9306 [ $stripe_count -eq $STRIPECOUNT ] ||
9307 error "stripe count $stripe_count != $STRIPECOUNT"
9309 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
9311 compare_stripe_info1() {
9312 local stripe_index_all_zero=true
9314 for num in 1 2 3 4; do
9315 for count in $(seq 1 $STRIPE_COUNT); do
9316 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
9317 local size=$((STRIPE_SIZE * num))
9318 local file=file"$num-$offset-$count"
9319 stripe_size=$($LFS getstripe -S $PWD/$file)
9320 [[ $stripe_size -ne $size ]] &&
9321 error "$file: size $stripe_size != $size"
9322 stripe_count=$($LFS getstripe -c $PWD/$file)
9323 # allow fewer stripes to be created, ORI-601
9324 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
9325 error "$file: count $stripe_count != $count"
9326 stripe_index=$($LFS getstripe -i $PWD/$file)
9327 [[ $stripe_index -ne 0 ]] &&
9328 stripe_index_all_zero=false
9332 $stripe_index_all_zero &&
9333 error "all files are being extracted starting from OST index 0"
9337 have_xattrs_include() {
9338 tar --help | grep -q xattrs-include &&
9339 echo --xattrs-include="lustre.*"
9343 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9344 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9346 XINC=$(have_xattrs_include)
9348 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
9350 compare_stripe_info1
9352 run_test 102d "tar restore stripe info from tarfile,not keep osts"
9355 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9356 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9358 XINC=$(have_xattrs_include)
9360 test_mkdir $DIR/$tdir.restore
9362 tar cf - --xattrs $tdir | tar xf - \
9363 -C $DIR/$tdir.restore --xattrs $XINC
9364 cd $DIR/$tdir.restore/$tdir
9365 compare_stripe_info1
9367 run_test 102f "tar copy files, not keep osts"
9370 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
9371 skip "must have user_xattr"
9372 [ -z "$(which setfattr 2>/dev/null)" ] &&
9373 skip_env "could not find setfattr"
9374 [ -z "$(which getfattr 2>/dev/null)" ] &&
9375 skip_env "could not find getfattr"
9377 local xsize=${1:-1024} # in bytes
9378 local file=$DIR/$tfile
9379 local value="$(generate_string $xsize)"
9380 local xbig=trusted.big
9384 log "save $xbig on $file"
9387 setfattr -n $xbig -v $value $file ||
9388 error "saving $xbig on $file failed"
9390 setfattr -n $xbig -v $value $file &&
9391 error "saving $xbig on $file succeeded"
9395 local orig=$(get_xattr_value $xbig $file)
9396 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
9398 local xsml=trusted.sml
9399 log "save $xsml on $file"
9400 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
9402 local new=$(get_xattr_value $xbig $file)
9403 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
9405 log "grow $xsml on $file"
9406 setfattr -n $xsml -v "$value" $file ||
9407 error "growing $xsml on $file failed"
9409 new=$(get_xattr_value $xbig $file)
9410 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
9411 log "$xbig still valid after growing $xsml"
9416 test_102h() { # bug 15777
9419 run_test 102h "grow xattr from inside inode to external block"
9422 large_xattr_enabled || skip_env "ea_inode feature disabled"
9424 echo "setting xattr of max xattr size: $(max_xattr_size)"
9425 grow_xattr $(max_xattr_size)
9427 echo "setting xattr of > max xattr size: $(max_xattr_size) + 10"
9428 echo "This should fail:"
9429 grow_xattr $(($(max_xattr_size) + 10)) 1
9431 run_test 102ha "grow xattr from inside inode to external inode"
9433 test_102i() { # bug 17038
9434 [ -z "$(which getfattr 2>/dev/null)" ] &&
9435 skip "could not find getfattr"
9438 ln -s $DIR/$tfile $DIR/${tfile}link
9439 getfattr -n trusted.lov $DIR/$tfile ||
9440 error "lgetxattr on $DIR/$tfile failed"
9441 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
9442 grep -i "no such attr" ||
9443 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
9444 rm -f $DIR/$tfile $DIR/${tfile}link
9446 run_test 102i "lgetxattr test on symbolic link ============"
9449 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9450 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9452 XINC=$(have_xattrs_include)
9453 setup_test102 "$RUNAS"
9454 chown $RUNAS_ID $DIR/$tdir
9455 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
9457 compare_stripe_info1 "$RUNAS"
9459 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
9462 [ -z "$(which setfattr 2>/dev/null)" ] &&
9463 skip "could not find setfattr"
9466 # b22187 just check that does not crash for regular file.
9467 setfattr -n trusted.lov $DIR/$tfile
9468 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
9469 local test_kdir=$DIR/$tdir
9470 test_mkdir $test_kdir
9471 local default_size=$($LFS getstripe -S $test_kdir)
9472 local default_count=$($LFS getstripe -c $test_kdir)
9473 local default_offset=$($LFS getstripe -i $test_kdir)
9474 $LFS setstripe -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
9475 error 'dir setstripe failed'
9476 setfattr -n trusted.lov $test_kdir
9477 local stripe_size=$($LFS getstripe -S $test_kdir)
9478 local stripe_count=$($LFS getstripe -c $test_kdir)
9479 local stripe_offset=$($LFS getstripe -i $test_kdir)
9480 [ $stripe_size -eq $default_size ] ||
9481 error "stripe size $stripe_size != $default_size"
9482 [ $stripe_count -eq $default_count ] ||
9483 error "stripe count $stripe_count != $default_count"
9484 [ $stripe_offset -eq $default_offset ] ||
9485 error "stripe offset $stripe_offset != $default_offset"
9486 rm -rf $DIR/$tfile $test_kdir
9488 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
9491 [ -z "$(which getfattr 2>/dev/null)" ] &&
9492 skip "could not find getfattr"
9494 # LU-532 trusted. xattr is invisible to non-root
9495 local testfile=$DIR/$tfile
9499 echo "listxattr as user..."
9500 chown $RUNAS_ID $testfile
9501 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
9502 grep -q "trusted" &&
9503 error "$testfile trusted xattrs are user visible"
9507 run_test 102l "listxattr size test =================================="
9509 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
9510 local path=$DIR/$tfile
9513 listxattr_size_check $path || error "listattr_size_check $path failed"
9515 run_test 102m "Ensure listxattr fails on small bufffer ========"
9519 getxattr() { # getxattr path name
9520 # Return the base64 encoding of the value of xattr name on path.
9524 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
9526 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
9528 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
9530 getfattr --absolute-names --encoding=base64 --name=$name $path |
9531 awk -F= -v name=$name '$1 == name {
9532 print substr($0, index($0, "=") + 1);
9536 test_102n() { # LU-4101 mdt: protect internal xattrs
9537 [ -z "$(which setfattr 2>/dev/null)" ] &&
9538 skip "could not find setfattr"
9539 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
9541 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
9544 local file0=$DIR/$tfile.0
9545 local file1=$DIR/$tfile.1
9546 local xattr0=$TMP/$tfile.0
9547 local xattr1=$TMP/$tfile.1
9548 local namelist="lov lma lmv link fid version som hsm"
9552 rm -rf $file0 $file1 $xattr0 $xattr1
9555 # Get 'before' xattrs of $file1.
9556 getfattr --absolute-names --dump --match=- $file1 > $xattr0
9558 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
9559 namelist+=" lfsck_namespace"
9560 for name in $namelist; do
9561 # Try to copy xattr from $file0 to $file1.
9562 value=$(getxattr $file0 trusted.$name 2> /dev/null)
9564 setfattr --name=trusted.$name --value="$value" $file1 ||
9565 error "setxattr 'trusted.$name' failed"
9567 # Try to set a garbage xattr.
9568 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9570 if [[ x$name == "xlov" ]]; then
9571 setfattr --name=trusted.lov --value="$value" $file1 &&
9572 error "setxattr invalid 'trusted.lov' success"
9574 setfattr --name=trusted.$name --value="$value" $file1 ||
9575 error "setxattr invalid 'trusted.$name' failed"
9578 # Try to remove the xattr from $file1. We don't care if this
9579 # appears to succeed or fail, we just don't want there to be
9580 # any changes or crashes.
9581 setfattr --remove=$trusted.$name $file1 2> /dev/null
9584 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
9587 # Try to copy xattr from $file0 to $file1.
9588 value=$(getxattr $file0 trusted.$name 2> /dev/null)
9590 setfattr --name=trusted.$name --value="$value" $file1 ||
9591 error "setxattr 'trusted.$name' failed"
9593 # Try to set a garbage xattr.
9594 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9596 setfattr --name=trusted.$name --value="$value" $file1 ||
9597 error "setxattr 'trusted.$name' failed"
9599 # Try to remove the xattr from $file1. We don't care if this
9600 # appears to succeed or fail, we just don't want there to be
9601 # any changes or crashes.
9602 setfattr --remove=$trusted.$name $file1 2> /dev/null
9605 # Get 'after' xattrs of file1.
9606 getfattr --absolute-names --dump --match=- $file1 > $xattr1
9608 if ! diff $xattr0 $xattr1; then
9609 error "before and after xattrs of '$file1' differ"
9612 rm -rf $file0 $file1 $xattr0 $xattr1
9616 run_test 102n "silently ignore setxattr on internal trusted xattrs"
9618 test_102p() { # LU-4703 setxattr did not check ownership
9619 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
9620 skip "MDS needs to be at least 2.5.56"
9622 local testfile=$DIR/$tfile
9626 echo "setfacl as user..."
9627 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
9628 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
9630 echo "setfattr as user..."
9631 setfacl -m "u:$RUNAS_ID:---" $testfile
9632 $RUNAS setfattr -x system.posix_acl_access $testfile
9633 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
9635 run_test 102p "check setxattr(2) correctly fails without permission"
9638 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
9639 skip "MDS needs to be at least 2.6.92"
9641 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
9643 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
9646 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
9647 skip "MDS needs to be at least 2.6.93"
9649 touch $DIR/$tfile || error "touch"
9650 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
9651 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
9652 rm $DIR/$tfile || error "rm"
9655 mkdir -p $DIR/$tdir || error "mkdir"
9656 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9657 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9658 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9659 error "$testfile error deleting user.author1"
9660 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9661 grep "user.$(basename $tdir)" &&
9662 error "$tdir did not delete user.$(basename $tdir)"
9663 rmdir $DIR/$tdir || error "rmdir"
9666 test_mkdir $DIR/$tdir
9667 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9668 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9669 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9670 error "$testfile error deleting user.author1"
9671 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9672 grep "user.$(basename $tdir)" &&
9673 error "$tdir did not delete user.$(basename $tdir)"
9674 rmdir $DIR/$tdir || error "rm striped dir"
9676 run_test 102r "set EAs with empty values"
9679 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9680 skip "MDS needs to be at least 2.11.52"
9682 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9684 save_lustre_params client "llite.*.xattr_cache" > $save
9686 for cache in 0 1; do
9687 lctl set_param llite.*.xattr_cache=$cache
9690 touch $DIR/$tfile || error "touch"
9691 for prefix in lustre security system trusted user; do
9692 # Note getxattr() may fail with 'Operation not
9693 # supported' or 'No such attribute' depending
9694 # on prefix and cache.
9695 getfattr -n $prefix.n102s $DIR/$tfile &&
9696 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
9700 restore_lustre_params < $save
9702 run_test 102s "getting nonexistent xattrs should fail"
9705 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9706 skip "MDS needs to be at least 2.11.52"
9708 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9710 save_lustre_params client "llite.*.xattr_cache" > $save
9712 for cache in 0 1; do
9713 lctl set_param llite.*.xattr_cache=$cache
9715 for buf_size in 0 256; do
9717 touch $DIR/$tfile || error "touch"
9718 setfattr -n user.multiop $DIR/$tfile
9719 $MULTIOP $DIR/$tfile oa$buf_size ||
9720 error "cannot get zero length xattr value (buf_size = $buf_size)"
9724 restore_lustre_params < $save
9726 run_test 102t "zero length xattr values handled correctly"
9730 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
9735 [ "$UID" != 0 ] && skip "must run as root"
9736 $GSS && skip_env "could not run under gss"
9737 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
9738 skip_env "must have acl enabled"
9739 [ -z "$(which setfacl 2>/dev/null)" ] &&
9740 skip_env "could not find setfacl"
9741 remote_mds_nodsh && skip "remote MDS with nodsh"
9743 gpasswd -a daemon bin # LU-5641
9744 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
9746 declare -a identity_old
9748 for num in $(seq $MDSCOUNT); do
9749 switch_identity $num true || identity_old[$num]=$?
9757 echo "performing cp ..."
9758 run_acl_subtest cp || error "run_acl_subtest cp failed"
9759 echo "performing getfacl-noacl..."
9760 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
9761 echo "performing misc..."
9762 run_acl_subtest misc || error "misc test failed"
9763 echo "performing permissions..."
9764 run_acl_subtest permissions || error "permissions failed"
9765 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
9766 if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] ||
9767 { [ $MDS1_VERSION -lt $(version_code 2.6) ] &&
9768 [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; }
9770 echo "performing permissions xattr..."
9771 run_acl_subtest permissions_xattr ||
9772 error "permissions_xattr failed"
9774 echo "performing setfacl..."
9775 run_acl_subtest setfacl || error "setfacl test failed"
9777 # inheritance test got from HP
9778 echo "performing inheritance..."
9779 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
9780 chmod +x make-tree || error "chmod +x failed"
9781 run_acl_subtest inheritance || error "inheritance test failed"
9784 echo "LU-974 ignore umask when acl is enabled..."
9785 run_acl_subtest 974 || error "LU-974 umask test failed"
9786 if [ $MDSCOUNT -ge 2 ]; then
9787 run_acl_subtest 974_remote ||
9788 error "LU-974 umask test failed under remote dir"
9791 echo "LU-2561 newly created file is same size as directory..."
9792 if [ "$mds1_FSTYPE" != "zfs" ]; then
9793 run_acl_subtest 2561 || error "LU-2561 test failed"
9795 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
9798 run_acl_subtest 4924 || error "LU-4924 test failed"
9803 for num in $(seq $MDSCOUNT); do
9804 if [ "${identity_old[$num]}" = 1 ]; then
9805 switch_identity $num false || identity_old[$num]=$?
9809 run_test 103a "acl test"
9815 for U in {0..511}; do
9817 local O=$(printf "%04o" $U)
9819 umask $(printf "%04o" $((511 ^ $O)))
9820 $LFS setstripe -c 1 $DIR/$tfile.s$O
9821 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
9823 (( $S == ($O & 0666) )) ||
9824 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
9826 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
9827 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
9828 (( $S == ($O & 0666) )) ||
9829 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
9831 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
9832 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
9833 (( $S == ($O & 0666) )) ||
9834 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
9835 rm -f $DIR/$tfile.[smp]$0
9839 # limit the concurrently running threads to 64. LU-11878
9840 local idx=$((U % 64))
9841 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
9846 run_test 103b "umask lfs setstripe"
9850 cp -rp $DIR/$tdir $DIR/$tdir.bak
9852 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
9853 error "$DIR/$tdir shouldn't contain default ACL"
9854 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
9855 error "$DIR/$tdir.bak shouldn't contain default ACL"
9858 run_test 103c "'cp -rp' won't set empty acl"
9861 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9864 lfs df || error "lfs df failed"
9865 lfs df -ih || error "lfs df -ih failed"
9866 lfs df -h $DIR || error "lfs df -h $DIR failed"
9867 lfs df -i $DIR || error "lfs df -i $DIR failed"
9868 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
9869 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
9871 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
9872 lctl --device %$OSC deactivate
9873 lfs df || error "lfs df with deactivated OSC failed"
9874 lctl --device %$OSC activate
9875 # wait the osc back to normal
9876 wait_osc_import_ready client ost
9878 lfs df || error "lfs df with reactivated OSC failed"
9881 run_test 104a "lfs df [-ih] [path] test ========================="
9884 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9885 [ $RUNAS_ID -eq $UID ] &&
9886 skip_env "RUNAS_ID = UID = $UID -- skipping"
9888 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
9889 grep "Permission denied" | wc -l)))
9890 if [ $denied_cnt -ne 0 ]; then
9891 error "lfs check servers test failed"
9894 run_test 104b "$RUNAS lfs check servers test ===================="
9897 # doesn't work on 2.4 kernels
9899 if $(flock_is_enabled); then
9900 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
9902 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
9906 run_test 105a "flock when mounted without -o flock test ========"
9910 if $(flock_is_enabled); then
9911 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
9913 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
9917 run_test 105b "fcntl when mounted without -o flock test ========"
9921 if $(flock_is_enabled); then
9922 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
9924 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
9928 run_test 105c "lockf when mounted without -o flock test"
9930 test_105d() { # bug 15924
9931 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9933 test_mkdir $DIR/$tdir
9934 flock_is_enabled || skip_env "mount w/o flock enabled"
9935 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
9936 $LCTL set_param fail_loc=0x80000315
9937 flocks_test 2 $DIR/$tdir
9939 run_test 105d "flock race (should not freeze) ========"
9941 test_105e() { # bug 22660 && 22040
9942 flock_is_enabled || skip_env "mount w/o flock enabled"
9945 flocks_test 3 $DIR/$tfile
9947 run_test 105e "Two conflicting flocks from same process"
9949 test_106() { #bug 10921
9950 test_mkdir $DIR/$tdir
9951 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9952 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9954 run_test 106 "attempt exec of dir followed by chown of that dir"
9957 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9965 local save_pattern=$(sysctl -n kernel.core_pattern)
9966 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9967 sysctl -w kernel.core_pattern=$file
9968 sysctl -w kernel.core_uses_pid=0
9976 kill -s 11 $SLEEPPID
9978 if [ -e $file ]; then
9979 size=`stat -c%s $file`
9980 [ $size -eq 0 ] && error "Fail to create core file $file"
9982 error "Fail to create core file $file"
9985 sysctl -w kernel.core_pattern=$save_pattern
9986 sysctl -w kernel.core_uses_pid=$save_uses_pid
9989 run_test 107 "Coredump on SIG"
9992 test_mkdir $DIR/$tdir
9993 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9994 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9995 error "mkdir with 256 char should fail, but did not"
9996 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9997 error "create with 255 char failed"
9998 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9999 error "create with 256 char should fail, but did not"
10004 run_test 110 "filename length checking"
10007 # Purpose: To verify dynamic thread (OSS) creation.
10010 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10011 remote_ost_nodsh && skip "remote OST with nodsh"
10013 # Lustre does not stop service threads once they are started.
10014 # Reset number of running threads to default.
10019 local save_params="$TMP/sanity-$TESTNAME.parameters"
10021 # Get ll_ost_io count before I/O
10022 OSTIO_pre=$(do_facet ost1 \
10023 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
10024 # Exit if lustre is not running (ll_ost_io not running).
10025 [ -z "$OSTIO_pre" ] && error "no OSS threads"
10027 echo "Starting with $OSTIO_pre threads"
10028 local thread_max=$((OSTIO_pre * 2))
10029 local rpc_in_flight=$((thread_max * 2))
10030 # Number of I/O Process proposed to be started.
10032 local facets=$(get_facets OST)
10034 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
10035 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
10037 # Set in_flight to $rpc_in_flight
10038 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
10039 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
10040 nfiles=${rpc_in_flight}
10041 # Set ost thread_max to $thread_max
10042 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
10044 # 5 Minutes should be sufficient for max number of OSS
10045 # threads(thread_max) to be created.
10049 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
10050 test_mkdir $DIR/$tdir
10051 for i in $(seq $nfiles); do
10052 local file=$DIR/$tdir/${tfile}-$i
10053 $LFS setstripe -c -1 -i 0 $file
10054 ($WTL $file $timeout)&
10057 # I/O Started - Wait for thread_started to reach thread_max or report
10058 # error if thread_started is more than thread_max.
10059 echo "Waiting for thread_started to reach thread_max"
10060 local thread_started=0
10061 local end_time=$((SECONDS + timeout))
10063 while [ $SECONDS -le $end_time ] ; do
10065 # Get ost i/o thread_started count.
10066 thread_started=$(do_facet ost1 \
10068 ost.OSS.ost_io.threads_started | cut -d= -f2")
10069 # Break out if thread_started is equal/greater than thread_max
10070 if [[ $thread_started -ge $thread_max ]]; then
10071 echo ll_ost_io thread_started $thread_started, \
10072 equal/greater than thread_max $thread_max
10078 # Cleanup - We have the numbers, Kill i/o jobs if running.
10079 jobcount=($(jobs -p))
10080 for i in $(seq 0 $((${#jobcount[@]}-1)))
10082 kill -9 ${jobcount[$i]}
10083 if [ $? -ne 0 ] ; then
10085 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
10089 # Cleanup files left by WTL binary.
10090 for i in $(seq $nfiles); do
10091 local file=$DIR/$tdir/${tfile}-$i
10093 if [ $? -ne 0 ] ; then
10094 echo "Warning: Failed to delete file $file"
10098 restore_lustre_params <$save_params
10099 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
10101 # Error out if no new thread has started or Thread started is greater
10103 if [[ $thread_started -le $OSTIO_pre ||
10104 $thread_started -gt $thread_max ]]; then
10105 error "ll_ost_io: thread_started $thread_started" \
10106 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
10107 "No new thread started or thread started greater " \
10111 run_test 115 "verify dynamic thread creation===================="
10114 wait_delete_completed
10115 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
10116 echo "OST kbytes available: ${AVAIL[@]}"
10121 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
10122 #echo OST $i: ${AVAIL[i]}kb
10123 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
10127 if [[ ${AVAIL[i]} -lt $MINV ]]; then
10132 echo "Min free space: OST $MINI: $MINV"
10133 echo "Max free space: OST $MAXI: $MAXV"
10136 test_116a() { # was previously test_116()
10137 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10138 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10139 remote_mds_nodsh && skip "remote MDS with nodsh"
10141 echo -n "Free space priority "
10142 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
10147 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
10148 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
10149 trap simple_cleanup_common EXIT
10151 # Check if we need to generate uneven OSTs
10152 test_mkdir -p $DIR/$tdir/OST${MINI}
10153 local FILL=$((MINV / 4))
10154 local DIFF=$((MAXV - MINV))
10155 local DIFF2=$((DIFF * 100 / MINV))
10157 local threshold=$(do_facet $SINGLEMDS \
10158 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
10159 threshold=${threshold%%%}
10160 echo -n "Check for uneven OSTs: "
10161 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
10163 if [[ $DIFF2 -gt $threshold ]]; then
10165 echo "Don't need to fill OST$MINI"
10167 # generate uneven OSTs. Write 2% over the QOS threshold value
10169 DIFF=$((threshold - DIFF2 + 2))
10170 DIFF2=$((MINV * DIFF / 100))
10171 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
10172 $LFS setstripe -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
10173 error "setstripe failed"
10174 DIFF=$((DIFF2 / 2048))
10176 while [ $i -lt $DIFF ]; do
10178 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
10179 bs=2M count=1 2>/dev/null
10188 DIFF=$((MAXV - MINV))
10189 DIFF2=$((DIFF * 100 / MINV))
10190 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
10191 if [ $DIFF2 -gt $threshold ]; then
10194 echo "failed - QOS mode won't be used"
10195 simple_cleanup_common
10196 skip "QOS imbalance criteria not met"
10204 # now fill using QOS
10205 $LFS setstripe -c 1 $DIR/$tdir
10206 FILL=$((FILL / 200))
10207 if [ $FILL -gt 600 ]; then
10210 echo "writing $FILL files to QOS-assigned OSTs"
10212 while [ $i -lt $FILL ]; do
10214 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
10215 count=1 2>/dev/null
10218 echo "wrote $i 200k files"
10222 echo "Note: free space may not be updated, so measurements might be off"
10224 DIFF2=$((MAXV - MINV))
10225 echo "free space delta: orig $DIFF final $DIFF2"
10226 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
10227 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
10228 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
10229 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
10230 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
10231 if [[ $DIFF -gt 0 ]]; then
10232 FILL=$((DIFF2 * 100 / DIFF - 100))
10233 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
10236 # Figure out which files were written where
10237 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
10238 awk '/'$MINI1': / {print $2; exit}')
10240 MINC=$($LFS getstripe --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
10241 echo "$MINC files created on smaller OST $MINI1"
10242 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
10243 awk '/'$MAXI1': / {print $2; exit}')
10245 MAXC=$($LFS getstripe --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
10246 echo "$MAXC files created on larger OST $MAXI1"
10247 if [[ $MINC -gt 0 ]]; then
10248 FILL=$((MAXC * 100 / MINC - 100))
10249 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
10251 [[ $MAXC -gt $MINC ]] ||
10252 error_ignore LU-9 "stripe QOS didn't balance free space"
10253 simple_cleanup_common
10255 run_test 116a "stripe QOS: free space balance ==================="
10257 test_116b() { # LU-2093
10258 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10259 remote_mds_nodsh && skip "remote MDS with nodsh"
10261 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
10262 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
10263 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
10264 [ -z "$old_rr" ] && skip "no QOS"
10265 do_facet $SINGLEMDS lctl set_param \
10266 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
10267 mkdir -p $DIR/$tdir
10268 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
10269 createmany -o $DIR/$tdir/f- 20 || error "can't create"
10270 do_facet $SINGLEMDS lctl set_param fail_loc=0
10272 do_facet $SINGLEMDS lctl set_param \
10273 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
10275 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
10277 test_117() # bug 10891
10279 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10281 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
10282 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
10283 lctl set_param fail_loc=0x21e
10284 > $DIR/$tfile || error "truncate failed"
10285 lctl set_param fail_loc=0
10286 echo "Truncate succeeded."
10289 run_test 117 "verify osd extend =========="
10291 NO_SLOW_RESENDCOUNT=4
10292 export OLD_RESENDCOUNT=""
10293 set_resend_count () {
10294 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
10295 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
10296 lctl set_param -n $PROC_RESENDCOUNT $1
10297 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
10300 # for reduce test_118* time (b=14842)
10301 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
10303 # Reset async IO behavior after error case
10305 FILE=$DIR/reset_async
10307 # Ensure all OSCs are cleared
10308 $LFS setstripe -c -1 $FILE
10309 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
10314 test_118a() #bug 11710
10316 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10320 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10321 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10322 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10324 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10325 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10330 run_test 118a "verify O_SYNC works =========="
10334 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10335 remote_ost_nodsh && skip "remote OST with nodsh"
10339 #define OBD_FAIL_SRV_ENOENT 0x217
10340 set_nodes_failloc "$(osts_nodes)" 0x217
10341 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10343 set_nodes_failloc "$(osts_nodes)" 0
10344 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10345 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10348 if [[ $RC -eq 0 ]]; then
10349 error "Must return error due to dropped pages, rc=$RC"
10353 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10354 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10358 echo "Dirty pages not leaked on ENOENT"
10360 # Due to the above error the OSC will issue all RPCs syncronously
10361 # until a subsequent RPC completes successfully without error.
10362 $MULTIOP $DIR/$tfile Ow4096yc
10367 run_test 118b "Reclaim dirty pages on fatal error =========="
10371 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10373 # for 118c, restore the original resend count, LU-1940
10374 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
10375 set_resend_count $OLD_RESENDCOUNT
10376 remote_ost_nodsh && skip "remote OST with nodsh"
10380 #define OBD_FAIL_OST_EROFS 0x216
10381 set_nodes_failloc "$(osts_nodes)" 0x216
10383 # multiop should block due to fsync until pages are written
10384 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
10388 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
10389 error "Multiop failed to block on fsync, pid=$MULTIPID"
10392 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10394 if [[ $WRITEBACK -eq 0 ]]; then
10395 error "No page in writeback, writeback=$WRITEBACK"
10398 set_nodes_failloc "$(osts_nodes)" 0
10401 if [[ $RC -ne 0 ]]; then
10402 error "Multiop fsync failed, rc=$RC"
10405 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10406 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10408 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10409 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10413 echo "Dirty pages flushed via fsync on EROFS"
10416 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
10418 # continue to use small resend count to reduce test_118* time (b=14842)
10419 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
10423 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10424 remote_ost_nodsh && skip "remote OST with nodsh"
10428 #define OBD_FAIL_OST_BRW_PAUSE_BULK
10429 set_nodes_failloc "$(osts_nodes)" 0x214
10430 # multiop should block due to fsync until pages are written
10431 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
10435 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
10436 error "Multiop failed to block on fsync, pid=$MULTIPID"
10439 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10441 if [[ $WRITEBACK -eq 0 ]]; then
10442 error "No page in writeback, writeback=$WRITEBACK"
10445 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
10446 set_nodes_failloc "$(osts_nodes)" 0
10448 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10449 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10451 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10452 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10456 echo "Dirty pages gaurenteed flushed via fsync"
10459 run_test 118d "Fsync validation inject a delay of the bulk =========="
10462 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10466 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
10467 lctl set_param fail_loc=0x8000040a
10469 # Should simulate EINVAL error which is fatal
10470 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10472 if [[ $RC -eq 0 ]]; then
10473 error "Must return error due to dropped pages, rc=$RC"
10476 lctl set_param fail_loc=0x0
10478 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10479 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10480 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10482 if [[ $LOCKED -ne 0 ]]; then
10483 error "Locked pages remain in cache, locked=$LOCKED"
10486 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10487 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10491 echo "No pages locked after fsync"
10496 run_test 118f "Simulate unrecoverable OSC side error =========="
10499 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10503 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
10504 lctl set_param fail_loc=0x406
10506 # simulate local -ENOMEM
10507 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10510 lctl set_param fail_loc=0
10511 if [[ $RC -eq 0 ]]; then
10512 error "Must return error due to dropped pages, rc=$RC"
10515 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10516 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10517 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10519 if [[ $LOCKED -ne 0 ]]; then
10520 error "Locked pages remain in cache, locked=$LOCKED"
10523 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10524 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10528 echo "No pages locked after fsync"
10533 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
10536 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10537 remote_ost_nodsh && skip "remote OST with nodsh"
10541 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10542 set_nodes_failloc "$(osts_nodes)" 0x20e
10543 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
10544 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10547 set_nodes_failloc "$(osts_nodes)" 0
10548 if [[ $RC -eq 0 ]]; then
10549 error "Must return error due to dropped pages, rc=$RC"
10552 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10553 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10554 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10556 if [[ $LOCKED -ne 0 ]]; then
10557 error "Locked pages remain in cache, locked=$LOCKED"
10560 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10561 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10565 echo "No pages locked after fsync"
10569 run_test 118h "Verify timeout in handling recoverables errors =========="
10571 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10574 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10575 remote_ost_nodsh && skip "remote OST with nodsh"
10579 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10580 set_nodes_failloc "$(osts_nodes)" 0x20e
10582 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
10583 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
10586 set_nodes_failloc "$(osts_nodes)" 0
10590 if [[ $RC -ne 0 ]]; then
10591 error "got error, but should be not, rc=$RC"
10594 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10595 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10596 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10597 if [[ $LOCKED -ne 0 ]]; then
10598 error "Locked pages remain in cache, locked=$LOCKED"
10601 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10602 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10606 echo "No pages locked after fsync"
10610 run_test 118i "Fix error before timeout in recoverable error =========="
10612 [ "$SLOW" = "no" ] && set_resend_count 4
10615 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10616 remote_ost_nodsh && skip "remote OST with nodsh"
10620 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
10621 set_nodes_failloc "$(osts_nodes)" 0x220
10623 # return -EIO from OST
10624 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10626 set_nodes_failloc "$(osts_nodes)" 0x0
10627 if [[ $RC -eq 0 ]]; then
10628 error "Must return error due to dropped pages, rc=$RC"
10631 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10632 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10633 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10634 if [[ $LOCKED -ne 0 ]]; then
10635 error "Locked pages remain in cache, locked=$LOCKED"
10638 # in recoverable error on OST we want resend and stay until it finished
10639 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10640 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10644 echo "No pages locked after fsync"
10648 run_test 118j "Simulate unrecoverable OST side error =========="
10652 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10653 remote_ost_nodsh && skip "remote OSTs with nodsh"
10655 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10656 set_nodes_failloc "$(osts_nodes)" 0x20e
10657 test_mkdir $DIR/$tdir
10659 for ((i=0;i<10;i++)); do
10660 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
10661 error "dd to $DIR/$tdir/$tfile-$i failed" )&
10668 set_nodes_failloc "$(osts_nodes)" 0
10671 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
10673 test_118l() # LU-646
10675 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10677 test_mkdir $DIR/$tdir
10678 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
10681 run_test 118l "fsync dir"
10683 test_118m() # LU-3066
10685 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10687 test_mkdir $DIR/$tdir
10688 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
10691 run_test 118m "fdatasync dir ========="
10693 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10700 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10701 remote_ost_nodsh && skip "remote OSTs with nodsh"
10703 # Sleep to avoid a cached response.
10704 #define OBD_STATFS_CACHE_SECONDS 1
10707 # Inject a 10 second delay in the OST_STATFS handler.
10708 #define OBD_FAIL_OST_STATFS_DELAY 0x242
10709 set_nodes_failloc "$(osts_nodes)" 0x242
10712 stat --file-system $MOUNT > /dev/null
10715 set_nodes_failloc "$(osts_nodes)" 0
10717 if ((end - begin > 20)); then
10718 error "statfs took $((end - begin)) seconds, expected 10"
10721 run_test 118n "statfs() sends OST_STATFS requests in parallel"
10723 test_119a() # bug 11737
10725 BSIZE=$((512 * 1024))
10726 directio write $DIR/$tfile 0 1 $BSIZE
10727 # We ask to read two blocks, which is more than a file size.
10728 # directio will indicate an error when requested and actual
10729 # sizes aren't equeal (a normal situation in this case) and
10730 # print actual read amount.
10731 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
10732 if [ "$NOB" != "$BSIZE" ]; then
10733 error "read $NOB bytes instead of $BSIZE"
10737 run_test 119a "Short directIO read must return actual read amount"
10739 test_119b() # bug 11737
10741 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10743 $LFS setstripe -c 2 $DIR/$tfile || error "setstripe failed"
10744 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
10746 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
10747 error "direct read failed"
10750 run_test 119b "Sparse directIO read must return actual read amount"
10752 test_119c() # bug 13099
10755 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
10756 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
10759 run_test 119c "Testing for direct read hitting hole"
10761 test_119d() # bug 15950
10763 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10765 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
10766 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
10768 $LFS setstripe $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
10769 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
10770 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
10771 lctl set_param fail_loc=0x40d
10772 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
10775 cat $DIR/$tfile > /dev/null &
10776 lctl set_param fail_loc=0
10779 log "the DIO writes have completed, now wait for the reads (should not block very long)"
10781 [ -n "`ps h -p $pid_reads -o comm`" ] && \
10782 error "the read rpcs have not completed in 2s"
10784 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
10786 run_test 119d "The DIO path should try to send a new rpc once one is completed"
10789 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10790 remote_mds_nodsh && skip "remote MDS with nodsh"
10791 test_mkdir -i0 -c1 $DIR/$tdir
10792 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10793 skip_env "no early lock cancel on server"
10795 lru_resize_disable mdc
10796 lru_resize_disable osc
10797 cancel_lru_locks mdc
10798 # asynchronous object destroy at MDT could cause bl ast to client
10799 cancel_lru_locks osc
10801 stat $DIR/$tdir > /dev/null
10802 can1=$(do_facet mds1 \
10803 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10804 awk '/ldlm_cancel/ {print $2}')
10805 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10806 awk '/ldlm_bl_callback/ {print $2}')
10807 test_mkdir -i0 -c1 $DIR/$tdir/d1
10808 can2=$(do_facet mds1 \
10809 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10810 awk '/ldlm_cancel/ {print $2}')
10811 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10812 awk '/ldlm_bl_callback/ {print $2}')
10813 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10814 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10815 lru_resize_enable mdc
10816 lru_resize_enable osc
10818 run_test 120a "Early Lock Cancel: mkdir test"
10821 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10822 remote_mds_nodsh && skip "remote MDS with nodsh"
10823 test_mkdir $DIR/$tdir
10824 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10825 skip_env "no early lock cancel on server"
10827 lru_resize_disable mdc
10828 lru_resize_disable osc
10829 cancel_lru_locks mdc
10830 stat $DIR/$tdir > /dev/null
10831 can1=$(do_facet $SINGLEMDS \
10832 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10833 awk '/ldlm_cancel/ {print $2}')
10834 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10835 awk '/ldlm_bl_callback/ {print $2}')
10836 touch $DIR/$tdir/f1
10837 can2=$(do_facet $SINGLEMDS \
10838 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10839 awk '/ldlm_cancel/ {print $2}')
10840 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10841 awk '/ldlm_bl_callback/ {print $2}')
10842 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10843 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10844 lru_resize_enable mdc
10845 lru_resize_enable osc
10847 run_test 120b "Early Lock Cancel: create test"
10850 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10851 remote_mds_nodsh && skip "remote MDS with nodsh"
10852 test_mkdir -i0 -c1 $DIR/$tdir
10853 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10854 skip "no early lock cancel on server"
10856 lru_resize_disable mdc
10857 lru_resize_disable osc
10858 test_mkdir -i0 -c1 $DIR/$tdir/d1
10859 test_mkdir -i0 -c1 $DIR/$tdir/d2
10860 touch $DIR/$tdir/d1/f1
10861 cancel_lru_locks mdc
10862 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
10863 can1=$(do_facet mds1 \
10864 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10865 awk '/ldlm_cancel/ {print $2}')
10866 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10867 awk '/ldlm_bl_callback/ {print $2}')
10868 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10869 can2=$(do_facet mds1 \
10870 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10871 awk '/ldlm_cancel/ {print $2}')
10872 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10873 awk '/ldlm_bl_callback/ {print $2}')
10874 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10875 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10876 lru_resize_enable mdc
10877 lru_resize_enable osc
10879 run_test 120c "Early Lock Cancel: link test"
10882 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10883 remote_mds_nodsh && skip "remote MDS with nodsh"
10884 test_mkdir -i0 -c1 $DIR/$tdir
10885 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10886 skip_env "no early lock cancel on server"
10888 lru_resize_disable mdc
10889 lru_resize_disable osc
10891 cancel_lru_locks mdc
10892 stat $DIR/$tdir > /dev/null
10893 can1=$(do_facet mds1 \
10894 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10895 awk '/ldlm_cancel/ {print $2}')
10896 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10897 awk '/ldlm_bl_callback/ {print $2}')
10898 chmod a+x $DIR/$tdir
10899 can2=$(do_facet mds1 \
10900 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10901 awk '/ldlm_cancel/ {print $2}')
10902 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10903 awk '/ldlm_bl_callback/ {print $2}')
10904 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10905 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10906 lru_resize_enable mdc
10907 lru_resize_enable osc
10909 run_test 120d "Early Lock Cancel: setattr test"
10912 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10913 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10914 skip_env "no early lock cancel on server"
10915 remote_mds_nodsh && skip "remote MDS with nodsh"
10917 local dlmtrace_set=false
10919 test_mkdir -i0 -c1 $DIR/$tdir
10920 lru_resize_disable mdc
10921 lru_resize_disable osc
10922 ! $LCTL get_param debug | grep -q dlmtrace &&
10923 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
10924 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
10925 cancel_lru_locks mdc
10926 cancel_lru_locks osc
10927 dd if=$DIR/$tdir/f1 of=/dev/null
10928 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
10929 # XXX client can not do early lock cancel of OST lock
10930 # during unlink (LU-4206), so cancel osc lock now.
10932 cancel_lru_locks osc
10933 can1=$(do_facet mds1 \
10934 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10935 awk '/ldlm_cancel/ {print $2}')
10936 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10937 awk '/ldlm_bl_callback/ {print $2}')
10938 unlink $DIR/$tdir/f1
10940 can2=$(do_facet mds1 \
10941 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10942 awk '/ldlm_cancel/ {print $2}')
10943 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10944 awk '/ldlm_bl_callback/ {print $2}')
10945 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10946 $LCTL dk $TMP/cancel.debug.txt
10947 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10948 $LCTL dk $TMP/blocking.debug.txt
10949 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10950 lru_resize_enable mdc
10951 lru_resize_enable osc
10953 run_test 120e "Early Lock Cancel: unlink test"
10956 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10957 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10958 skip_env "no early lock cancel on server"
10959 remote_mds_nodsh && skip "remote MDS with nodsh"
10961 test_mkdir -i0 -c1 $DIR/$tdir
10962 lru_resize_disable mdc
10963 lru_resize_disable osc
10964 test_mkdir -i0 -c1 $DIR/$tdir/d1
10965 test_mkdir -i0 -c1 $DIR/$tdir/d2
10966 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10967 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10968 cancel_lru_locks mdc
10969 cancel_lru_locks osc
10970 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10971 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10972 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10973 # XXX client can not do early lock cancel of OST lock
10974 # during rename (LU-4206), so cancel osc lock now.
10976 cancel_lru_locks osc
10977 can1=$(do_facet mds1 \
10978 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10979 awk '/ldlm_cancel/ {print $2}')
10980 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10981 awk '/ldlm_bl_callback/ {print $2}')
10982 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10984 can2=$(do_facet mds1 \
10985 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10986 awk '/ldlm_cancel/ {print $2}')
10987 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10988 awk '/ldlm_bl_callback/ {print $2}')
10989 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10990 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10991 lru_resize_enable mdc
10992 lru_resize_enable osc
10994 run_test 120f "Early Lock Cancel: rename test"
10997 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10998 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10999 skip_env "no early lock cancel on server"
11000 remote_mds_nodsh && skip "remote MDS with nodsh"
11002 lru_resize_disable mdc
11003 lru_resize_disable osc
11005 echo create $count files
11006 test_mkdir $DIR/$tdir
11007 cancel_lru_locks mdc
11008 cancel_lru_locks osc
11011 can0=$(do_facet $SINGLEMDS \
11012 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
11013 awk '/ldlm_cancel/ {print $2}')
11014 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
11015 awk '/ldlm_bl_callback/ {print $2}')
11016 createmany -o $DIR/$tdir/f $count
11018 can1=$(do_facet $SINGLEMDS \
11019 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
11020 awk '/ldlm_cancel/ {print $2}')
11021 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
11022 awk '/ldlm_bl_callback/ {print $2}')
11024 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
11025 echo rm $count files
11028 can2=$(do_facet $SINGLEMDS \
11029 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
11030 awk '/ldlm_cancel/ {print $2}')
11031 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
11032 awk '/ldlm_bl_callback/ {print $2}')
11034 echo total: $count removes in $((t2-t1))
11035 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
11037 # wait for commitment of removal
11038 lru_resize_enable mdc
11039 lru_resize_enable osc
11041 run_test 120g "Early Lock Cancel: performance test"
11043 test_121() { #bug #10589
11044 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11047 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
11048 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
11049 lctl set_param fail_loc=0x310
11050 cancel_lru_locks osc > /dev/null
11051 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
11052 lctl set_param fail_loc=0
11053 [[ $reads -eq $writes ]] ||
11054 error "read $reads blocks, must be $writes blocks"
11056 run_test 121 "read cancel race ========="
11058 test_123a() { # was test 123, statahead(bug 11401)
11059 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11062 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
11063 log "testing UP system. Performance may be lower than expected."
11068 test_mkdir $DIR/$tdir
11069 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
11070 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
11072 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
11073 createmany -o $DIR/$tdir/$tfile $j $((i - j))
11075 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
11076 lctl set_param -n llite.*.statahead_max 0
11077 lctl get_param llite.*.statahead_max
11078 cancel_lru_locks mdc
11079 cancel_lru_locks osc
11081 time ls -l $DIR/$tdir | wc -l
11083 delta=$((etime - stime))
11084 log "ls $i files without statahead: $delta sec"
11085 lctl set_param llite.*.statahead_max=$max
11087 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
11088 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
11089 cancel_lru_locks mdc
11090 cancel_lru_locks osc
11092 time ls -l $DIR/$tdir | wc -l
11094 delta_sa=$((etime - stime))
11095 log "ls $i files with statahead: $delta_sa sec"
11096 lctl get_param -n llite.*.statahead_stats
11097 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
11099 [[ $swrong -lt $ewrong ]] &&
11100 log "statahead was stopped, maybe too many locks held!"
11101 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
11103 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
11104 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
11105 lctl set_param -n llite.*.statahead_max 0
11106 lctl get_param llite.*.statahead_max
11107 cancel_lru_locks mdc
11108 cancel_lru_locks osc
11110 time ls -l $DIR/$tdir | wc -l
11112 delta=$((etime - stime))
11113 log "ls $i files again without statahead: $delta sec"
11114 lctl set_param llite.*.statahead_max=$max
11115 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
11116 if [ $SLOWOK -eq 0 ]; then
11117 error "ls $i files is slower with statahead!"
11119 log "ls $i files is slower with statahead!"
11125 [ $delta -gt 20 ] && break
11126 [ $delta -gt 8 ] && MULT=$((50 / delta))
11127 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
11135 delta=$((etime - stime))
11136 log "rm -r $DIR/$tdir/: $delta seconds"
11138 lctl get_param -n llite.*.statahead_stats
11140 run_test 123a "verify statahead work"
11142 test_123b () { # statahead(bug 15027)
11143 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11145 test_mkdir $DIR/$tdir
11146 createmany -o $DIR/$tdir/$tfile-%d 1000
11148 cancel_lru_locks mdc
11149 cancel_lru_locks osc
11151 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
11152 lctl set_param fail_loc=0x80000803
11153 ls -lR $DIR/$tdir > /dev/null
11155 lctl set_param fail_loc=0x0
11156 lctl get_param -n llite.*.statahead_stats
11161 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
11164 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
11166 test_mkdir -i 0 -c 1 $DIR/$tdir.0
11167 test_mkdir -i 1 -c 1 $DIR/$tdir.1
11168 touch $DIR/$tdir.1/{1..3}
11169 mv $DIR/$tdir.1/{1..3} $DIR/$tdir.0
11171 remount_client $MOUNT
11173 $MULTIOP $DIR/$tdir.0 Q
11175 # let statahead to complete
11176 ls -l $DIR/$tdir.0 > /dev/null
11178 testid=$(echo $TESTNAME | tr '_' ' ')
11179 dmesg | tac | sed "/$testid/,$ d" | grep "Can not initialize inode" &&
11180 error "statahead warning" || true
11182 run_test 123c "Can not initialize inode warning on DNE statahead"
11185 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11186 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
11187 skip_env "no lru resize on server"
11191 test_mkdir $DIR/$tdir
11193 log "create $NR files at $DIR/$tdir"
11194 createmany -o $DIR/$tdir/f $NR ||
11195 error "failed to create $NR files in $DIR/$tdir"
11197 cancel_lru_locks mdc
11198 ls -l $DIR/$tdir > /dev/null
11202 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
11203 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
11204 LRU_SIZE=$($LCTL get_param -n $PARAM)
11205 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
11206 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
11208 log "NS=$(basename $NSDIR)"
11213 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
11214 skip "Not enough cached locks created!"
11216 log "LRU=$LRU_SIZE"
11220 # We know that lru resize allows one client to hold $LIMIT locks
11221 # for 10h. After that locks begin to be killed by client.
11223 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
11225 if [ $LIMIT -lt $LRU_SIZE ]; then
11226 skip "Limit is too small $LIMIT"
11229 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
11230 # killing locks. Some time was spent for creating locks. This means
11231 # that up to the moment of sleep finish we must have killed some of
11232 # them (10-100 locks). This depends on how fast ther were created.
11233 # Many of them were touched in almost the same moment and thus will
11234 # be killed in groups.
11235 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
11237 # Use $LRU_SIZE_B here to take into account real number of locks
11238 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
11239 local LRU_SIZE_B=$LRU_SIZE
11241 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
11242 log "OLD_LVF=$OLD_LVF"
11243 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
11245 # Let's make sure that we really have some margin. Client checks
11246 # cached locks every 10 sec.
11247 SLEEP=$((SLEEP+20))
11248 log "Sleep ${SLEEP} sec"
11250 while ((SEC<$SLEEP)); do
11254 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
11255 echo -n "$LRU_SIZE"
11258 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
11259 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
11261 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
11262 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
11263 unlinkmany $DIR/$tdir/f $NR
11267 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
11268 log "unlink $NR files at $DIR/$tdir"
11269 unlinkmany $DIR/$tdir/f $NR
11271 run_test 124a "lru resize ======================================="
11273 get_max_pool_limit()
11275 local limit=$($LCTL get_param \
11276 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
11278 for l in $limit; do
11279 if [[ $l -gt $max ]]; then
11287 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11288 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
11289 skip_env "no lru resize on server"
11291 LIMIT=$(get_max_pool_limit)
11293 NR=$(($(default_lru_size)*20))
11294 if [[ $NR -gt $LIMIT ]]; then
11295 log "Limit lock number by $LIMIT locks"
11299 IFree=$(mdsrate_inodes_available)
11300 if [ $IFree -lt $NR ]; then
11301 log "Limit lock number by $IFree inodes"
11305 lru_resize_disable mdc
11306 test_mkdir -p $DIR/$tdir/disable_lru_resize
11308 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
11309 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
11310 cancel_lru_locks mdc
11313 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
11316 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
11319 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
11323 nolruresize_delta=$((etime-stime))
11324 log "ls -la time: $nolruresize_delta seconds"
11325 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
11326 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
11328 lru_resize_enable mdc
11329 test_mkdir -p $DIR/$tdir/enable_lru_resize
11331 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
11332 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
11333 cancel_lru_locks mdc
11336 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
11339 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
11342 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
11346 lruresize_delta=$((etime-stime))
11347 log "ls -la time: $lruresize_delta seconds"
11348 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
11350 if [ $lruresize_delta -gt $nolruresize_delta ]; then
11351 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
11352 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
11353 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
11355 log "lru resize performs the same with no lru resize"
11357 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
11359 run_test 124b "lru resize (performance test) ======================="
11362 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11363 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
11364 skip_env "no lru resize on server"
11366 # cache ununsed locks on client
11368 cancel_lru_locks mdc
11369 test_mkdir $DIR/$tdir
11370 createmany -o $DIR/$tdir/f $nr ||
11371 error "failed to create $nr files in $DIR/$tdir"
11372 ls -l $DIR/$tdir > /dev/null
11374 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
11375 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11376 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
11377 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
11378 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
11380 # set lru_max_age to 1 sec
11381 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
11382 echo "sleep $((recalc_p * 2)) seconds..."
11383 sleep $((recalc_p * 2))
11385 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
11386 # restore lru_max_age
11387 $LCTL set_param -n $nsdir.lru_max_age $max_age
11388 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
11389 unlinkmany $DIR/$tdir/f $nr
11391 run_test 124c "LRUR cancel very aged locks"
11394 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11395 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
11396 skip_env "no lru resize on server"
11398 # cache ununsed locks on client
11401 lru_resize_disable mdc
11402 stack_trap "lru_resize_enable mdc" EXIT
11404 cancel_lru_locks mdc
11406 # asynchronous object destroy at MDT could cause bl ast to client
11407 test_mkdir $DIR/$tdir
11408 createmany -o $DIR/$tdir/f $nr ||
11409 error "failed to create $nr files in $DIR/$tdir"
11410 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
11412 ls -l $DIR/$tdir > /dev/null
11414 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
11415 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11416 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
11417 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
11419 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
11421 # set lru_max_age to 1 sec
11422 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
11423 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
11425 echo "sleep $((recalc_p * 2)) seconds..."
11426 sleep $((recalc_p * 2))
11428 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
11430 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
11432 run_test 124d "cancel very aged locks if lru-resize diasbaled"
11434 test_125() { # 13358
11435 $LCTL get_param -n llite.*.client_type | grep -q local ||
11436 skip "must run as local client"
11437 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
11438 skip_env "must have acl enabled"
11439 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
11441 test_mkdir $DIR/$tdir
11442 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
11443 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
11444 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
11446 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
11448 test_126() { # bug 12829/13455
11449 $GSS && skip_env "must run as gss disabled"
11450 $LCTL get_param -n llite.*.client_type | grep -q local ||
11451 skip "must run as local client"
11452 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
11454 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
11455 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
11457 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
11459 run_test 126 "check that the fsgid provided by the client is taken into account"
11461 test_127a() { # bug 15521
11462 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11463 local name count samp unit min max sum sumsq
11465 $LFS setstripe -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
11466 echo "stats before reset"
11467 $LCTL get_param osc.*.stats
11468 $LCTL set_param osc.*.stats=0
11469 local fsize=$((2048 * 1024))
11471 dd if=/dev/zero of=$DIR/$tfile bs=$fsize count=1
11472 cancel_lru_locks osc
11473 dd if=$DIR/$tfile of=/dev/null bs=$fsize
11475 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/$tfile.tmp
11476 stack_trap "rm -f $TMP/$tfile.tmp"
11477 while read name count samp unit min max sum sumsq; do
11478 echo "got name=$name count=$count unit=$unit min=$min max=$max"
11479 [ ! $min ] && error "Missing min value for $name proc entry"
11480 eval $name=$count || error "Wrong proc format"
11483 read_bytes|write_bytes)
11484 [[ "$unit" =~ "bytes" ]] ||
11485 error "unit is not 'bytes': $unit"
11486 (( $min >= 4096 )) || error "min is too small: $min"
11487 (( $min <= $fsize )) || error "min is too big: $min"
11488 (( $max >= 4096 )) || error "max is too small: $max"
11489 (( $max <= $fsize )) || error "max is too big: $max"
11490 (( $sum == $fsize )) || error "sum is wrong: $sum"
11491 (( $sumsq >= ($fsize / 4096) * (4096 * 4096) )) ||
11492 error "sumsquare is too small: $sumsq"
11493 (( $sumsq <= $fsize * $fsize )) ||
11494 error "sumsquare is too big: $sumsq"
11496 ost_read|ost_write)
11497 [[ "$unit" =~ "usec" ]] ||
11498 error "unit is not 'usec': $unit"
11502 done < $DIR/$tfile.tmp
11504 #check that we actually got some stats
11505 [ "$read_bytes" ] || error "Missing read_bytes stats"
11506 [ "$write_bytes" ] || error "Missing write_bytes stats"
11507 [ "$read_bytes" != 0 ] || error "no read done"
11508 [ "$write_bytes" != 0 ] || error "no write done"
11510 run_test 127a "verify the client stats are sane"
11512 test_127b() { # bug LU-333
11513 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11514 local name count samp unit min max sum sumsq
11516 echo "stats before reset"
11517 $LCTL get_param llite.*.stats
11518 $LCTL set_param llite.*.stats=0
11520 # perform 2 reads and writes so MAX is different from SUM.
11521 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
11522 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
11523 cancel_lru_locks osc
11524 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
11525 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
11527 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
11528 stack_trap "rm -f $TMP/$tfile.tmp"
11529 while read name count samp unit min max sum sumsq; do
11530 echo "got name=$name count=$count unit=$unit min=$min max=$max"
11531 eval $name=$count || error "Wrong proc format"
11534 read_bytes|write_bytes)
11535 [[ "$unit" =~ "bytes" ]] ||
11536 error "unit is not 'bytes': $unit"
11537 (( $count == 2 )) || error "count is not 2: $count"
11538 (( $min == $PAGE_SIZE )) ||
11539 error "min is not $PAGE_SIZE: $min"
11540 (( $max == $PAGE_SIZE )) ||
11541 error "max is not $PAGE_SIZE: $max"
11542 (( $sum == $PAGE_SIZE * 2 )) ||
11543 error "sum is not $((PAGE_SIZE * 2)): $sum"
11546 [[ "$unit" =~ "usec" ]] ||
11547 error "unit is not 'usec': $unit"
11551 done < $TMP/$tfile.tmp
11553 #check that we actually got some stats
11554 [ "$read_bytes" ] || error "Missing read_bytes stats"
11555 [ "$write_bytes" ] || error "Missing write_bytes stats"
11556 [ "$read_bytes" != 0 ] || error "no read done"
11557 [ "$write_bytes" != 0 ] || error "no write done"
11559 run_test 127b "verify the llite client stats are sane"
11561 test_127c() { # LU-12394
11562 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11569 $LCTL set_param llite.*.extents_stats=1
11570 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
11572 # Use two stripes so there is enough space in default config
11573 $LFS setstripe -c 2 $DIR/$tfile
11575 # Extent stats start at 0-4K and go in power of two buckets
11576 # LL_HIST_START = 12 --> 2^12 = 4K
11577 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
11578 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
11580 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
11582 # Write and read, 2x each, second time at a non-zero offset
11583 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
11584 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
11585 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
11586 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
11590 $LCTL get_param llite.*.extents_stats
11593 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
11595 local bucket=$($LCTL get_param -n llite.*.extents_stats |
11597 reads=$(echo $bucket | awk '{print $5}')
11598 writes=$(echo $bucket | awk '{print $9}')
11599 [ "$reads" -eq $count ] ||
11600 error "$reads reads in < $bsize bucket, expect $count"
11601 [ "$writes" -eq $count ] ||
11602 error "$writes writes in < $bsize bucket, expect $count"
11605 # Test mmap write and read
11606 $LCTL set_param llite.*.extents_stats=c
11608 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
11609 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
11610 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
11612 $LCTL get_param llite.*.extents_stats
11614 count=$(((size*1024) / PAGE_SIZE))
11616 bsize=$((2 * PAGE_SIZE / 1024))K
11618 bucket=$($LCTL get_param -n llite.*.extents_stats |
11620 reads=$(echo $bucket | awk '{print $5}')
11621 writes=$(echo $bucket | awk '{print $9}')
11622 # mmap writes fault in the page first, creating an additonal read
11623 [ "$reads" -eq $((2 * count)) ] ||
11624 error "$reads reads in < $bsize bucket, expect $count"
11625 [ "$writes" -eq $count ] ||
11626 error "$writes writes in < $bsize bucket, expect $count"
11628 run_test 127c "test llite extent stats with regular & mmap i/o"
11630 test_128() { # bug 15212
11632 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
11637 result=$(grep error $TMP/$tfile.log)
11638 rm -f $DIR/$tfile $TMP/$tfile.log
11639 [ -z "$result" ] ||
11640 error "consecutive find's under interactive lfs failed"
11642 run_test 128 "interactive lfs for 2 consecutive find's"
11644 set_dir_limits () {
11649 local ldproc=/proc/fs/ldiskfs
11650 local facets=$(get_facets MDS)
11652 for facet in ${facets//,/ }; do
11653 canondev=$(ldiskfs_canon \
11654 *.$(convert_facet2label $facet).mntdev $facet)
11655 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
11656 ldproc=/sys/fs/ldiskfs
11657 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
11658 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
11662 check_mds_dmesg() {
11663 local facets=$(get_facets MDS)
11664 for facet in ${facets//,/ }; do
11665 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
11671 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11672 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
11673 skip "Need MDS version with at least 2.5.56"
11674 if [ "$mds1_FSTYPE" != ldiskfs ]; then
11675 skip_env "ldiskfs only test"
11677 remote_mds_nodsh && skip "remote MDS with nodsh"
11681 local has_warning=false
11684 mkdir -p $DIR/$tdir
11686 # block size of mds1
11687 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
11688 set_dir_limits $maxsize $maxsize
11689 local dirsize=$(stat -c%s "$DIR/$tdir")
11691 while [[ $dirsize -le $maxsize ]]; do
11692 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
11694 if ! $has_warning; then
11695 check_mds_dmesg '"is approaching"' && has_warning=true
11697 # check two errors:
11698 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
11699 # EFBIG for previous versions included in ldiskfs series
11700 if [ $rc -eq $EFBIG ] || [ $rc -eq $ENOSPC ]; then
11702 echo "return code $rc received as expected"
11704 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
11705 error_exit "create failed w/o dir size limit"
11707 check_mds_dmesg '"has reached"' ||
11708 error_exit "reached message should be output"
11710 [ $has_warning = "false" ] &&
11711 error_exit "warning message should be output"
11713 dirsize=$(stat -c%s "$DIR/$tdir")
11715 [[ $dirsize -ge $maxsize ]] && return 0
11716 error_exit "current dir size $dirsize, " \
11717 "previous limit $maxsize"
11718 elif [ $rc -ne 0 ]; then
11720 error_exit "return $rc received instead of expected " \
11721 "$EFBIG or $ENOSPC, files in dir $dirsize"
11723 nfiles=$((nfiles + 1))
11724 dirsize=$(stat -c%s "$DIR/$tdir")
11728 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
11730 run_test 129 "test directory size limit ========================"
11739 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11740 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11742 trap cleanup_130 EXIT RETURN
11744 local fm_file=$DIR/$tfile
11745 $LFS setstripe -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
11746 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
11747 error "dd failed for $fm_file"
11749 # LU-1795: test filefrag/FIEMAP once, even if unsupported
11750 filefrag -ves $fm_file
11752 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11753 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11754 [ $RC != 0 ] && error "filefrag $fm_file failed"
11756 filefrag_op=$(filefrag -ve -k $fm_file |
11757 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11758 lun=$($LFS getstripe -i $fm_file)
11760 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
11763 for line in $filefrag_op
11765 frag_lun=`echo $line | cut -d: -f5`
11766 ext_len=`echo $line | cut -d: -f4`
11767 if (( $frag_lun != $lun )); then
11769 error "FIEMAP on 1-stripe file($fm_file) failed"
11772 (( tot_len += ext_len ))
11775 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
11777 error "FIEMAP on 1-stripe file($fm_file) failed;"
11783 echo "FIEMAP on single striped file succeeded"
11785 run_test 130a "FIEMAP (1-stripe file)"
11788 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11790 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11791 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11793 trap cleanup_130 EXIT RETURN
11795 local fm_file=$DIR/$tfile
11796 $LFS setstripe -S 65536 -c $OSTCOUNT $fm_file ||
11797 error "setstripe on $fm_file"
11798 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11799 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11801 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
11802 error "dd failed on $fm_file"
11804 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11805 filefrag_op=$(filefrag -ve -k $fm_file |
11806 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11808 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11809 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11814 for line in $filefrag_op
11816 frag_lun=$(echo $line | cut -d: -f5 |
11817 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11818 ext_len=$(echo $line | cut -d: -f4)
11819 if (( $frag_lun != $last_lun )); then
11820 if (( tot_len != 1024 )); then
11822 error "FIEMAP on $fm_file failed; returned " \
11823 "len $tot_len for OST $last_lun instead of 1024"
11826 (( num_luns += 1 ))
11830 (( tot_len += ext_len ))
11833 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
11835 error "FIEMAP on $fm_file failed; returned wrong number of " \
11836 "luns or wrong len for OST $last_lun"
11842 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
11844 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
11847 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11849 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11850 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11852 trap cleanup_130 EXIT RETURN
11854 local fm_file=$DIR/$tfile
11855 $LFS setstripe -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
11856 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11857 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11859 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
11860 error "dd failed on $fm_file"
11862 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11863 filefrag_op=$(filefrag -ve -k $fm_file |
11864 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11866 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11867 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11872 for line in $filefrag_op
11874 frag_lun=$(echo $line | cut -d: -f5 |
11875 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11876 ext_len=$(echo $line | cut -d: -f4)
11877 if (( $frag_lun != $last_lun )); then
11878 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
11879 if (( logical != 512 )); then
11881 error "FIEMAP on $fm_file failed; returned " \
11882 "logical start for lun $logical instead of 512"
11885 if (( tot_len != 512 )); then
11887 error "FIEMAP on $fm_file failed; returned " \
11888 "len $tot_len for OST $last_lun instead of 1024"
11891 (( num_luns += 1 ))
11895 (( tot_len += ext_len ))
11898 if (( num_luns != 2 || tot_len != 512 )); then
11900 error "FIEMAP on $fm_file failed; returned wrong number of " \
11901 "luns or wrong len for OST $last_lun"
11907 echo "FIEMAP on 2-stripe file with hole succeeded"
11909 run_test 130c "FIEMAP (2-stripe file with hole)"
11912 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
11914 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11915 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11917 trap cleanup_130 EXIT RETURN
11919 local fm_file=$DIR/$tfile
11920 $LFS setstripe -S 65536 -c $OSTCOUNT $fm_file ||
11921 error "setstripe on $fm_file"
11922 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11923 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11925 local actual_stripe_count=$($LFS getstripe -c $fm_file)
11926 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
11927 error "dd failed on $fm_file"
11929 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11930 filefrag_op=$(filefrag -ve -k $fm_file |
11931 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11933 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11934 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11939 for line in $filefrag_op
11941 frag_lun=$(echo $line | cut -d: -f5 |
11942 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11943 ext_len=$(echo $line | cut -d: -f4)
11944 if (( $frag_lun != $last_lun )); then
11945 if (( tot_len != 1024 )); then
11947 error "FIEMAP on $fm_file failed; returned " \
11948 "len $tot_len for OST $last_lun instead of 1024"
11951 (( num_luns += 1 ))
11955 (( tot_len += ext_len ))
11958 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
11960 error "FIEMAP on $fm_file failed; returned wrong number of " \
11961 "luns or wrong len for OST $last_lun"
11967 echo "FIEMAP on N-stripe file succeeded"
11969 run_test 130d "FIEMAP (N-stripe file)"
11972 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11974 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11975 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11977 trap cleanup_130 EXIT RETURN
11979 local fm_file=$DIR/$tfile
11980 $LFS setstripe -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11981 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11982 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11985 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11986 for ((i = 0; i < $NUM_BLKS; i++))
11988 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11991 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11992 filefrag_op=$(filefrag -ve -k $fm_file |
11993 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11995 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11996 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
12001 for line in $filefrag_op
12003 frag_lun=$(echo $line | cut -d: -f5 |
12004 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
12005 ext_len=$(echo $line | cut -d: -f4)
12006 if (( $frag_lun != $last_lun )); then
12007 if (( tot_len != $EXPECTED_LEN )); then
12009 error "FIEMAP on $fm_file failed; returned " \
12010 "len $tot_len for OST $last_lun instead " \
12014 (( num_luns += 1 ))
12018 (( tot_len += ext_len ))
12021 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
12023 error "FIEMAP on $fm_file failed; returned wrong number " \
12024 "of luns or wrong len for OST $last_lun"
12030 echo "FIEMAP with continuation calls succeeded"
12032 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
12035 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
12036 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
12038 local fm_file=$DIR/$tfile
12039 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
12040 error "multiop create with lov_delay_create on $fm_file"
12042 filefrag -ves $fm_file || error "filefrag $fm_file failed"
12043 filefrag_extents=$(filefrag -vek $fm_file |
12044 awk '/extents? found/ { print $2 }')
12045 if [[ "$filefrag_extents" != "0" ]]; then
12046 error "FIEMAP on $fm_file failed; " \
12047 "returned $filefrag_extents expected 0"
12052 run_test 130f "FIEMAP (unstriped file)"
12054 # Test for writev/readv
12056 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
12057 error "writev test failed"
12058 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
12059 error "readv failed"
12062 run_test 131a "test iov's crossing stripe boundary for writev/readv"
12065 local fsize=$((524288 + 1048576 + 1572864))
12066 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
12067 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
12068 error "append writev test failed"
12070 ((fsize += 1572864 + 1048576))
12071 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
12072 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
12073 error "append writev test failed"
12076 run_test 131b "test append writev"
12079 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
12082 run_test 131c "test read/write on file w/o objects"
12085 rwv -f $DIR/$tfile -w -n 1 1572864
12086 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
12087 if [ "$NOB" != 1572864 ]; then
12088 error "Short read filed: read $NOB bytes instead of 1572864"
12092 run_test 131d "test short read"
12095 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
12096 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
12097 error "read hitting hole failed"
12100 run_test 131e "test read hitting hole"
12109 mds*) res=$(do_facet $facet \
12110 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
12112 ost*) res=$(do_facet $facet \
12113 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
12115 *) error "Wrong facet '$facet'" ;;
12117 [ "$res" ] || error "The counter for $op on $facet was not incremented"
12118 # if the argument $3 is zero, it means any stat increment is ok.
12119 if [[ $want -gt 0 ]]; then
12120 local count=$(echo $res | awk '{ print $2 }')
12121 [[ $count -ne $want ]] &&
12122 error "The $op counter on $facet is $count, not $want"
12127 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12128 remote_ost_nodsh && skip "remote OST with nodsh"
12129 remote_mds_nodsh && skip "remote MDS with nodsh"
12130 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
12131 skip_env "MDS doesn't support rename stats"
12133 local testdir=$DIR/${tdir}/stats_testdir
12135 mkdir -p $DIR/${tdir}
12138 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
12139 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
12141 # verify mdt stats first.
12142 mkdir ${testdir} || error "mkdir failed"
12143 check_stats $SINGLEMDS "mkdir" 1
12144 touch ${testdir}/${tfile} || error "touch failed"
12145 check_stats $SINGLEMDS "open" 1
12146 check_stats $SINGLEMDS "close" 1
12147 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
12148 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
12149 check_stats $SINGLEMDS "mknod" 2
12151 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
12152 check_stats $SINGLEMDS "unlink" 1
12153 rm -f ${testdir}/${tfile} || error "file remove failed"
12154 check_stats $SINGLEMDS "unlink" 2
12156 # remove working dir and check mdt stats again.
12157 rmdir ${testdir} || error "rmdir failed"
12158 check_stats $SINGLEMDS "rmdir" 1
12160 local testdir1=$DIR/${tdir}/stats_testdir1
12161 mkdir -p ${testdir}
12162 mkdir -p ${testdir1}
12163 touch ${testdir1}/test1
12164 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
12165 check_stats $SINGLEMDS "crossdir_rename" 1
12167 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
12168 check_stats $SINGLEMDS "samedir_rename" 1
12170 rm -rf $DIR/${tdir}
12172 run_test 133a "Verifying MDT stats ========================================"
12177 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12178 remote_ost_nodsh && skip "remote OST with nodsh"
12179 remote_mds_nodsh && skip "remote MDS with nodsh"
12181 local testdir=$DIR/${tdir}/stats_testdir
12183 mkdir -p ${testdir} || error "mkdir failed"
12184 touch ${testdir}/${tfile} || error "touch failed"
12185 cancel_lru_locks mdc
12188 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
12189 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
12191 # extra mdt stats verification.
12192 chmod 444 ${testdir}/${tfile} || error "chmod failed"
12193 check_stats $SINGLEMDS "setattr" 1
12194 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
12195 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
12197 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
12198 check_stats $SINGLEMDS "getattr" 1
12200 rm -rf $DIR/${tdir}
12202 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
12203 # so the check below is not reliable
12204 [ $MDSCOUNT -eq 1 ] || return 0
12206 # Sleep to avoid a cached response.
12207 #define OBD_STATFS_CACHE_SECONDS 1
12209 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
12210 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
12211 $LFS df || error "lfs failed"
12212 check_stats $SINGLEMDS "statfs" 1
12214 # check aggregated statfs (LU-10018)
12215 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
12217 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
12220 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
12221 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
12223 check_stats $SINGLEMDS "statfs" 1
12225 # We want to check that the client didn't send OST_STATFS to
12226 # ost1 but the MDT also uses OST_STATFS for precreate. So some
12227 # extra care is needed here.
12228 if remote_mds; then
12229 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
12230 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
12232 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
12233 [ "$res" ] && error "OST got STATFS"
12238 run_test 133b "Verifying extra MDT stats =================================="
12241 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12242 remote_ost_nodsh && skip "remote OST with nodsh"
12243 remote_mds_nodsh && skip "remote MDS with nodsh"
12245 local testdir=$DIR/$tdir/stats_testdir
12247 test_mkdir -p $testdir
12249 # verify obdfilter stats.
12250 $LFS setstripe -c 1 -i 0 $testdir/$tfile
12252 cancel_lru_locks osc
12253 wait_delete_completed
12256 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
12257 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
12259 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
12262 cancel_lru_locks osc
12263 check_stats ost1 "write" 1
12265 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
12266 check_stats ost1 "read" 1
12268 > $testdir/$tfile || error "truncate failed"
12269 check_stats ost1 "punch" 1
12271 rm -f $testdir/$tfile || error "file remove failed"
12272 wait_delete_completed
12273 check_stats ost1 "destroy" 1
12277 run_test 133c "Verifying OST stats ========================================"
12284 while [ $value -ge 2 ]; do
12289 if [ $orig -gt $order ]; then
12297 local size=('K' 'M' 'G' 'T');
12299 local size_string=$value
12301 while [ $value -ge 1024 ]; do
12302 if [ $i -gt 3 ]; then
12303 #T is the biggest unit we get here, if that is bigger,
12305 size_string=${value}T
12308 value=$((value >> 10))
12309 if [ $value -lt 1024 ]; then
12310 size_string=${value}${size[$i]}
12319 get_rename_size() {
12321 local context=${2:-.}
12322 local sample=$(do_facet $SINGLEMDS $LCTL \
12323 get_param mdt.$FSNAME-MDT0000.rename_stats |
12324 grep -A1 $context |
12325 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
12330 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12331 remote_ost_nodsh && skip "remote OST with nodsh"
12332 remote_mds_nodsh && skip "remote MDS with nodsh"
12333 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
12334 skip_env "MDS doesn't support rename stats"
12336 local testdir1=$DIR/${tdir}/stats_testdir1
12337 local testdir2=$DIR/${tdir}/stats_testdir2
12338 mkdir -p $DIR/${tdir}
12340 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
12342 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
12343 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
12345 createmany -o $testdir1/test 512 || error "createmany failed"
12347 # check samedir rename size
12348 mv ${testdir1}/test0 ${testdir1}/test_0
12350 local testdir1_size=$(ls -l $DIR/${tdir} |
12351 awk '/stats_testdir1/ {print $5}')
12352 local testdir2_size=$(ls -l $DIR/${tdir} |
12353 awk '/stats_testdir2/ {print $5}')
12355 testdir1_size=$(order_2 $testdir1_size)
12356 testdir2_size=$(order_2 $testdir2_size)
12358 testdir1_size=$(size_in_KMGT $testdir1_size)
12359 testdir2_size=$(size_in_KMGT $testdir2_size)
12361 echo "source rename dir size: ${testdir1_size}"
12362 echo "target rename dir size: ${testdir2_size}"
12364 local cmd="do_facet $SINGLEMDS $LCTL "
12365 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
12367 eval $cmd || error "$cmd failed"
12368 local samedir=$($cmd | grep 'same_dir')
12369 local same_sample=$(get_rename_size $testdir1_size)
12370 [ -z "$samedir" ] && error "samedir_rename_size count error"
12371 [[ $same_sample -eq 1 ]] ||
12372 error "samedir_rename_size error $same_sample"
12373 echo "Check same dir rename stats success"
12375 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
12377 # check crossdir rename size
12378 mv ${testdir1}/test_0 ${testdir2}/test_0
12380 testdir1_size=$(ls -l $DIR/${tdir} |
12381 awk '/stats_testdir1/ {print $5}')
12382 testdir2_size=$(ls -l $DIR/${tdir} |
12383 awk '/stats_testdir2/ {print $5}')
12385 testdir1_size=$(order_2 $testdir1_size)
12386 testdir2_size=$(order_2 $testdir2_size)
12388 testdir1_size=$(size_in_KMGT $testdir1_size)
12389 testdir2_size=$(size_in_KMGT $testdir2_size)
12391 echo "source rename dir size: ${testdir1_size}"
12392 echo "target rename dir size: ${testdir2_size}"
12394 eval $cmd || error "$cmd failed"
12395 local crossdir=$($cmd | grep 'crossdir')
12396 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
12397 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
12398 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
12399 [[ $src_sample -eq 1 ]] ||
12400 error "crossdir_rename_size error $src_sample"
12401 [[ $tgt_sample -eq 1 ]] ||
12402 error "crossdir_rename_size error $tgt_sample"
12403 echo "Check cross dir rename stats success"
12404 rm -rf $DIR/${tdir}
12406 run_test 133d "Verifying rename_stats ========================================"
12409 remote_mds_nodsh && skip "remote MDS with nodsh"
12410 remote_ost_nodsh && skip "remote OST with nodsh"
12411 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12413 local testdir=$DIR/${tdir}/stats_testdir
12414 local ctr f0 f1 bs=32768 count=42 sum
12416 mkdir -p ${testdir} || error "mkdir failed"
12418 $LFS setstripe -c 1 -i 0 ${testdir}/${tfile}
12420 for ctr in {write,read}_bytes; do
12422 cancel_lru_locks osc
12424 do_facet ost1 $LCTL set_param -n \
12425 "obdfilter.*.exports.clear=clear"
12427 if [ $ctr = write_bytes ]; then
12429 f1=${testdir}/${tfile}
12431 f0=${testdir}/${tfile}
12435 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
12438 cancel_lru_locks osc
12440 sum=$(do_facet ost1 $LCTL get_param \
12441 "obdfilter.*.exports.*.stats" |
12442 awk -v ctr=$ctr 'BEGIN { sum = 0 }
12443 $1 == ctr { sum += $7 }
12444 END { printf("%0.0f", sum) }')
12446 if ((sum != bs * count)); then
12447 error "Bad $ctr sum, expected $((bs * count)), got $sum"
12451 rm -rf $DIR/${tdir}
12453 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
12455 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
12457 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
12458 # not honor the -ignore_readdir_race option correctly. So we call
12459 # error_ignore() rather than error() in these cases. See LU-11152.
12461 if (find --version; do_facet mds1 find --version) |
12462 grep -q '\b4\.5\.1[1-4]\b'; then
12463 error_ignore LU-11152 "$@"
12470 # First without trusting modes.
12471 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
12472 echo "proc_dirs='$proc_dirs'"
12473 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
12474 find $proc_dirs -exec cat '{}' \; &> /dev/null
12476 # Second verifying readability.
12477 $LCTL get_param -R '*' &> /dev/null
12479 # Verifing writability with badarea_io.
12481 -ignore_readdir_race \
12483 -not -name force_lbug \
12484 -not -name changelog_mask \
12485 -exec badarea_io '{}' \; ||
12486 error_133 "find $proc_dirs failed"
12488 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
12491 remote_mds_nodsh && skip "remote MDS with nodsh"
12492 remote_ost_nodsh && skip "remote OST with nodsh"
12495 for facet in mds1 ost1; do
12496 local facet_ver=$(lustre_version_code $facet)
12497 if [ $facet_ver -ge $(version_code 2.7.65) ]; then
12498 do_facet $facet "$LCTL get_param -R '*'" &> /dev/null
12500 log "$facet: too old lustre for get_param -R"
12502 if [ $facet_ver -ge $(version_code 2.5.54) ]; then
12503 do_facet $facet "$LCTL list_param -R '*' | grep '=' |
12504 tr -d= | egrep -v 'force_lbug|changelog_mask' |
12505 xargs badarea_io" ||
12506 error_133 "$facet badarea_io failed"
12508 skip_noexit "$facet: too old lustre for get_param -R"
12512 # remount the FS in case writes/reads /proc break the FS
12513 cleanup || error "failed to unmount"
12514 setup || error "failed to setup"
12517 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
12520 remote_mds_nodsh && skip "remote MDS with nodsh"
12521 remote_ost_nodsh && skip "remote OST with nodsh"
12522 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
12523 skip "Need MDS version at least 2.9.54"
12527 for facet in client mds1 ost1; do
12528 local facet_proc_dirs=$(do_facet $facet \
12529 \\\ls -d $proc_regexp 2> /dev/null)
12530 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
12531 echo "${facet}_proc_dirs='$facet_proc_dirs'"
12532 # Get the list of files that are missing the terminating newline
12533 local missing=($(do_facet $facet \
12534 find ${facet_proc_dirs} -type f \| \
12535 while read F\; do \
12536 awk -v FS='\v' -v RS='\v\v' \
12537 "'END { if(NR>0 && \
12538 \\\$NF !~ /.*\\\n\$/) \
12539 print FILENAME}'" \
12542 [ ${#missing[*]} -eq 0 ] ||
12543 error "files do not end with newline: ${missing[*]}"
12546 run_test 133h "Proc files should end with newlines"
12549 remote_mds_nodsh && skip "remote MDS with nodsh"
12550 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
12551 skip "Need MDS version at least 2.7.54"
12553 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12554 cancel_lru_locks mdc
12556 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
12557 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
12558 [ $unused -eq 0 ] || error "$unused locks are not cleared"
12561 createmany -o $DIR/$tdir/f $nr ||
12562 error "failed to create $nr files in $DIR/$tdir"
12563 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
12565 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
12566 do_facet mds1 $LCTL set_param fail_loc=0x327
12567 do_facet mds1 $LCTL set_param fail_val=500
12570 echo "sleep 10 seconds ..."
12572 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
12574 do_facet mds1 $LCTL set_param fail_loc=0
12575 do_facet mds1 $LCTL set_param fail_val=0
12576 [ $lck_cnt -lt $unused ] ||
12577 error "No locks reclaimed, before:$unused, after:$lck_cnt"
12580 unlinkmany $DIR/$tdir/f $nr
12582 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
12585 remote_mds_nodsh && skip "remote MDS with nodsh"
12586 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
12587 skip "Need MDS version at least 2.7.54"
12589 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12590 cancel_lru_locks mdc
12592 local low_wm=$(do_facet mds1 $LCTL get_param -n \
12593 ldlm.lock_reclaim_threshold_mb)
12594 # disable reclaim temporarily
12595 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
12597 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
12598 do_facet mds1 $LCTL set_param fail_loc=0x328
12599 do_facet mds1 $LCTL set_param fail_val=500
12601 $LCTL set_param debug=+trace
12604 createmany -o $DIR/$tdir/f $nr &
12605 local create_pid=$!
12607 echo "Sleep $TIMEOUT seconds ..."
12609 if ! ps -p $create_pid > /dev/null 2>&1; then
12610 do_facet mds1 $LCTL set_param fail_loc=0
12611 do_facet mds1 $LCTL set_param fail_val=0
12612 do_facet mds1 $LCTL set_param \
12613 ldlm.lock_reclaim_threshold_mb=${low_wm}m
12614 error "createmany finished incorrectly!"
12616 do_facet mds1 $LCTL set_param fail_loc=0
12617 do_facet mds1 $LCTL set_param fail_val=0
12618 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
12619 wait $create_pid || return 1
12621 unlinkmany $DIR/$tdir/f $nr
12623 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
12626 remote_mds_nodsh && skip "remote MDS with nodsh"
12627 [[ $MDS1_VERSION -lt $(version_code 2.13.50) ]] &&
12628 skip "Need MDS version at least 2.13.50"
12631 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12633 #define OBD_FAIL_PLAIN_RECORDS 0x1319
12634 #set only one record at plain llog
12635 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1319 fail_val=1
12637 #fill already existed plain llog each 64767
12638 #wrapping whole catalog
12639 createmany -o -u $DIR/$tdir/$tfile- $((64767 * 1))
12641 createmany -o $DIR/$tdir/$tfile_ 64700
12642 for (( i = 0; i < 64700; i = i + 2 ))
12644 rm $DIR/$tdir/$tfile_$i &
12645 rm $DIR/$tdir/$tfile_$((i + 1)) &
12650 #waiting osp synchronization
12651 wait_delete_completed
12653 run_test 135 "Race catalog processing"
12656 remote_mds_nodsh && skip "remote MDS with nodsh"
12657 [[ $MDS1_VERSION -lt $(version_code 2.13.50) ]] &&
12658 skip "Need MDS version at least 2.13.50"
12661 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12662 $SETSTRIPE -c 1 -i 0 $DIR/$tdir || error "failed to set striping"
12663 #set only one record at plain llog
12664 #define OBD_FAIL_CATALOG_FULL_CHECK 0x131a
12665 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x131a fail_val=1
12667 #fill already existed 2 plain llogs each 64767
12668 #wrapping whole catalog
12669 createmany -o -u $DIR/$tdir/$tfile- $((64767 * 1))
12670 createmany -o -u $DIR/$tdir/$tfile- $((64767 * 3 / 2))
12671 wait_delete_completed
12673 createmany -o $DIR/$tdir/$tfile_ 10
12676 do_facet $SINGLEMDS $LCTL set_param fail_val=3
12677 for (( i = 0; i < 10; i = i + 3 ))
12679 rm $DIR/$tdir/$tfile_$i &
12680 rm $DIR/$tdir/$tfile_$((i + 1)) &
12684 rm $DIR/$tdir/$tfile_$((i + 2)) &
12687 #waiting osp synchronization
12688 wait_delete_completed
12690 run_test 136 "Race catalog processing 2"
12692 test_140() { #bug-17379
12693 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12695 test_mkdir $DIR/$tdir
12696 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
12697 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
12699 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
12700 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
12702 while i=$((i + 1)); do
12704 cd $i || error "Changing to $i"
12705 ln -s ../stat stat || error "Creating stat symlink"
12706 # Read the symlink until ELOOP present,
12707 # not LBUGing the system is considered success,
12708 # we didn't overrun the stack.
12709 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
12710 if [ $ret -ne 0 ]; then
12711 if [ $ret -eq 40 ]; then
12714 error "Open stat symlink"
12720 echo "The symlink depth = $i"
12721 [ $i -eq 5 ] || [ $i -eq 7 ] || [ $i -eq 8 ] || [ $i -eq 40 ] ||
12722 error "Invalid symlink depth"
12724 # Test recursive symlink
12725 ln -s symlink_self symlink_self
12726 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
12727 echo "open symlink_self returns $ret"
12728 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
12730 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
12733 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12735 local TF="$TMP/$tfile"
12737 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12739 cancel_lru_locks $OSC
12740 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
12741 remount_client $MOUNT
12743 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
12746 $TRUNCATE $DIR/$tfile 6000
12747 cancel_lru_locks $OSC
12748 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
12751 echo "12345" >>$DIR/$tfile
12752 cancel_lru_locks $OSC
12753 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
12756 echo "12345" >>$DIR/$tfile
12757 cancel_lru_locks $OSC
12758 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
12763 run_test 150 "truncate/append tests"
12765 #LU-2902 roc_hit was not able to read all values from lproc
12766 function roc_hit_init() {
12767 local list=$(comma_list $(osts_nodes))
12768 local dir=$DIR/$tdir-check
12769 local file=$dir/$tfile
12775 #use setstripe to do a write to every ost
12776 for i in $(seq 0 $((OSTCOUNT-1))); do
12777 $LFS setstripe -c 1 -i $i $dir || error "$LFS setstripe $file failed"
12778 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
12779 idx=$(printf %04x $i)
12780 BEFORE=$(get_osd_param $list *OST*$idx stats |
12781 awk '$1 == "cache_access" {sum += $7}
12782 END { printf("%0.0f", sum) }')
12784 cancel_lru_locks osc
12785 cat $file >/dev/null
12787 AFTER=$(get_osd_param $list *OST*$idx stats |
12788 awk '$1 == "cache_access" {sum += $7}
12789 END { printf("%0.0f", sum) }')
12791 echo BEFORE:$BEFORE AFTER:$AFTER
12792 if ! let "AFTER - BEFORE == 4"; then
12794 error "roc_hit is not safe to use"
12802 function roc_hit() {
12803 local list=$(comma_list $(osts_nodes))
12804 echo $(get_osd_param $list '' stats |
12805 awk '$1 == "cache_hit" {sum += $7}
12806 END { printf("%0.0f", sum) }')
12809 function set_cache() {
12812 if [ "$2" == "off" ]; then
12815 local list=$(comma_list $(osts_nodes))
12816 set_osd_param $list '' $1_cache_enable $on
12818 cancel_lru_locks osc
12822 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12823 remote_ost_nodsh && skip "remote OST with nodsh"
12826 local list=$(comma_list $(osts_nodes))
12828 # check whether obdfilter is cache capable at all
12829 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
12830 skip "not cache-capable obdfilter"
12833 # check cache is enabled on all obdfilters
12834 if get_osd_param $list '' read_cache_enable | grep 0; then
12835 skip "oss cache is disabled"
12838 set_osd_param $list '' writethrough_cache_enable 1
12840 # check write cache is enabled on all obdfilters
12841 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
12842 skip "oss write cache is NOT enabled"
12847 #define OBD_FAIL_OBD_NO_LRU 0x609
12848 do_nodes $list $LCTL set_param fail_loc=0x609
12850 # pages should be in the case right after write
12851 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
12854 local BEFORE=$(roc_hit)
12855 cancel_lru_locks osc
12856 cat $DIR/$tfile >/dev/null
12857 local AFTER=$(roc_hit)
12859 do_nodes $list $LCTL set_param fail_loc=0
12861 if ! let "AFTER - BEFORE == CPAGES"; then
12862 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12865 cancel_lru_locks osc
12866 # invalidates OST cache
12867 do_nodes $list "echo 1 > /proc/sys/vm/drop_caches"
12868 set_osd_param $list '' read_cache_enable 0
12869 cat $DIR/$tfile >/dev/null
12871 # now data shouldn't be found in the cache
12873 cancel_lru_locks osc
12874 cat $DIR/$tfile >/dev/null
12876 if let "AFTER - BEFORE != 0"; then
12877 error "IN CACHE: before: $BEFORE, after: $AFTER"
12880 set_osd_param $list '' read_cache_enable 1
12883 run_test 151 "test cache on oss and controls ==============================="
12886 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12888 local TF="$TMP/$tfile"
12890 # simulate ENOMEM during write
12891 #define OBD_FAIL_OST_NOMEM 0x226
12892 lctl set_param fail_loc=0x80000226
12893 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12895 sync || error "sync failed"
12896 lctl set_param fail_loc=0
12898 # discard client's cache
12899 cancel_lru_locks osc
12901 # simulate ENOMEM during read
12902 lctl set_param fail_loc=0x80000226
12903 cmp $TF $DIR/$tfile || error "cmp failed"
12904 lctl set_param fail_loc=0
12908 run_test 152 "test read/write with enomem ============================"
12911 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
12913 run_test 153 "test if fdatasync does not crash ======================="
12915 dot_lustre_fid_permission_check() {
12917 local ffid=$MOUNT/.lustre/fid/$fid
12920 echo "stat fid $fid"
12921 stat $ffid > /dev/null || error "stat $ffid failed."
12922 echo "touch fid $fid"
12923 touch $ffid || error "touch $ffid failed."
12924 echo "write to fid $fid"
12925 cat /etc/hosts > $ffid || error "write $ffid failed."
12926 echo "read fid $fid"
12927 diff /etc/hosts $ffid || error "read $ffid failed."
12928 echo "append write to fid $fid"
12929 cat /etc/hosts >> $ffid || error "append write $ffid failed."
12930 echo "rename fid $fid"
12931 mv $ffid $test_dir/$tfile.1 &&
12932 error "rename $ffid to $tfile.1 should fail."
12933 touch $test_dir/$tfile.1
12934 mv $test_dir/$tfile.1 $ffid &&
12935 error "rename $tfile.1 to $ffid should fail."
12936 rm -f $test_dir/$tfile.1
12937 echo "truncate fid $fid"
12938 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
12939 echo "link fid $fid"
12940 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
12941 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
12942 echo "setfacl fid $fid"
12943 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
12944 echo "getfacl fid $fid"
12945 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
12947 echo "unlink fid $fid"
12948 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
12949 echo "mknod fid $fid"
12950 mknod $ffid c 1 3 && error "mknod $ffid should fail."
12952 fid=[0xf00000400:0x1:0x0]
12953 ffid=$MOUNT/.lustre/fid/$fid
12955 echo "stat non-exist fid $fid"
12956 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
12957 echo "write to non-exist fid $fid"
12958 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
12959 echo "link new fid $fid"
12960 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
12962 mkdir -p $test_dir/$tdir
12963 touch $test_dir/$tdir/$tfile
12964 fid=$($LFS path2fid $test_dir/$tdir)
12967 error "error: could not get fid for $test_dir/$dir/$tfile."
12969 ffid=$MOUNT/.lustre/fid/$fid
12972 ls $ffid > /dev/null || error "ls $ffid failed."
12973 echo "touch $fid/$tfile.1"
12974 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
12976 echo "touch $MOUNT/.lustre/fid/$tfile"
12977 touch $MOUNT/.lustre/fid/$tfile && \
12978 error "touch $MOUNT/.lustre/fid/$tfile should fail."
12980 echo "setxattr to $MOUNT/.lustre/fid"
12981 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
12983 echo "listxattr for $MOUNT/.lustre/fid"
12984 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
12986 echo "delxattr from $MOUNT/.lustre/fid"
12987 setfattr -x trusted.name1 $MOUNT/.lustre/fid
12989 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
12990 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
12991 error "touch invalid fid should fail."
12993 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
12994 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
12995 error "touch non-normal fid should fail."
12997 echo "rename $tdir to $MOUNT/.lustre/fid"
12998 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
12999 error "rename to $MOUNT/.lustre/fid should fail."
13001 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
13003 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
13004 local new_obf_mode=777
13006 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
13007 chmod $new_obf_mode $DIR/.lustre/fid ||
13008 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
13010 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
13011 [ $obf_mode -eq $new_obf_mode ] ||
13012 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
13014 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
13015 chmod $old_obf_mode $DIR/.lustre/fid ||
13016 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
13019 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
13020 fid=$($LFS path2fid $test_dir/$tfile-2)
13022 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
13024 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
13025 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
13026 error "create lov data thru .lustre failed"
13028 echo "cp /etc/passwd $test_dir/$tfile-2"
13029 cp /etc/passwd $test_dir/$tfile-2 ||
13030 error "copy to $test_dir/$tfile-2 failed."
13031 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
13032 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
13033 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
13035 rm -rf $test_dir/tfile.lnk
13036 rm -rf $test_dir/$tfile-2
13040 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
13041 skip "Need MDS version at least 2.4.1"
13043 local tf=$DIR/$tfile
13046 local fid=$($LFS path2fid $tf)
13047 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
13049 # check that we get the same pathname back
13050 local found=$($LFS fid2path $MOUNT "$fid")
13051 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
13052 [ "$found" == "$tf" ] ||
13053 error "fid2path($fid=path2fid($tf)) = $found != $tf"
13055 run_test 154A "lfs path2fid and fid2path basic checks"
13058 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
13059 skip "Need MDS version at least 2.4.1"
13061 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
13062 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
13063 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
13064 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
13066 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
13067 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
13069 # check that we get the same pathname
13070 echo "PFID: $PFID, name: $name"
13071 local FOUND=$($LFS fid2path $MOUNT "$PFID")
13072 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
13073 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
13074 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
13076 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
13078 run_test 154B "verify the ll_decode_linkea tool"
13081 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13082 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
13083 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
13084 skip "Need MDS version at least 2.2.51"
13085 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
13087 cp /etc/hosts $DIR/$tfile
13089 fid=$($LFS path2fid $DIR/$tfile)
13091 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
13093 dot_lustre_fid_permission_check "$fid" $DIR ||
13094 error "dot lustre permission check $fid failed"
13096 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
13098 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
13100 touch $MOUNT/.lustre/file &&
13101 error "creation is not allowed under .lustre"
13103 mkdir $MOUNT/.lustre/dir &&
13104 error "mkdir is not allowed under .lustre"
13108 run_test 154a "Open-by-FID"
13111 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13112 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
13113 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13114 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
13115 skip "Need MDS version at least 2.2.51"
13117 local remote_dir=$DIR/$tdir/remote_dir
13121 mkdir -p $DIR/$tdir
13122 $LFS mkdir -i $MDTIDX $remote_dir ||
13123 error "create remote directory failed"
13125 cp /etc/hosts $remote_dir/$tfile
13127 fid=$($LFS path2fid $remote_dir/$tfile)
13129 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
13131 dot_lustre_fid_permission_check "$fid" $remote_dir ||
13132 error "dot lustre permission check $fid failed"
13135 run_test 154b "Open-by-FID for remote directory"
13138 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
13139 skip "Need MDS version at least 2.4.1"
13141 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
13142 local FID1=$($LFS path2fid $DIR/$tfile.1)
13143 local FID2=$($LFS path2fid $DIR/$tfile.2)
13144 local FID3=$($LFS path2fid $DIR/$tfile.3)
13147 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
13148 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
13149 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
13151 [ "$FID" = "${!want}" ] ||
13152 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
13156 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
13158 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
13159 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
13163 run_test 154c "lfs path2fid and fid2path multiple arguments"
13166 remote_mds_nodsh && skip "remote MDS with nodsh"
13167 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
13168 skip "Need MDS version at least 2.5.53"
13170 if remote_mds; then
13171 nid=$($LCTL list_nids | sed "s/\./\\\./g")
13175 local proc_ofile="mdt.*.exports.'$nid'.open_files"
13182 local fid=$($LFS path2fid $DIR/$tfile)
13185 cmd="exec $fd<$DIR/$tfile"
13187 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
13188 echo "$fid_list" | grep "$fid"
13191 cmd="exec $fd>/dev/null"
13193 if [ $rc -ne 0 ]; then
13194 error "FID $fid not found in open files list $fid_list"
13197 run_test 154d "Verify open file fid"
13201 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
13202 skip "Need MDS version at least 2.6.50"
13204 if ls -a $MOUNT | grep -q '^\.lustre$'; then
13205 error ".lustre returned by readdir"
13208 run_test 154e ".lustre is not returned by readdir"
13211 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
13213 # create parent directory on a single MDT to avoid cross-MDT hardlinks
13214 test_mkdir -p -c1 $DIR/$tdir/d
13215 # test dirs inherit from its stripe
13216 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
13217 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
13218 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
13219 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
13222 # get fid of parents
13223 local FID0=$($LFS path2fid $DIR/$tdir/d)
13224 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
13225 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
13226 local FID3=$($LFS path2fid $DIR)
13228 # check that path2fid --parents returns expected <parent_fid>/name
13229 # 1) test for a directory (single parent)
13230 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
13231 [ "$parent" == "$FID0/foo1" ] ||
13232 error "expected parent: $FID0/foo1, got: $parent"
13234 # 2) test for a file with nlink > 1 (multiple parents)
13235 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
13236 echo "$parent" | grep -F "$FID1/$tfile" ||
13237 error "$FID1/$tfile not returned in parent list"
13238 echo "$parent" | grep -F "$FID2/link" ||
13239 error "$FID2/link not returned in parent list"
13241 # 3) get parent by fid
13242 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
13243 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
13244 echo "$parent" | grep -F "$FID1/$tfile" ||
13245 error "$FID1/$tfile not returned in parent list (by fid)"
13246 echo "$parent" | grep -F "$FID2/link" ||
13247 error "$FID2/link not returned in parent list (by fid)"
13249 # 4) test for entry in root directory
13250 parent=$($LFS path2fid --parents $DIR/f)
13251 echo "$parent" | grep -F "$FID3/f" ||
13252 error "$FID3/f not returned in parent list"
13254 # 5) test it on root directory
13255 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
13256 error "$MOUNT should not have parents"
13258 # enable xattr caching and check that linkea is correctly updated
13259 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
13260 save_lustre_params client "llite.*.xattr_cache" > $save
13261 lctl set_param llite.*.xattr_cache 1
13263 # 6.1) linkea update on rename
13264 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
13266 # get parents by fid
13267 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
13268 # foo1 should no longer be returned in parent list
13269 echo "$parent" | grep -F "$FID1" &&
13270 error "$FID1 should no longer be in parent list"
13271 # the new path should appear
13272 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
13273 error "$FID2/$tfile.moved is not in parent list"
13275 # 6.2) linkea update on unlink
13276 rm -f $DIR/$tdir/d/foo2/link
13277 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
13278 # foo2/link should no longer be returned in parent list
13279 echo "$parent" | grep -F "$FID2/link" &&
13280 error "$FID2/link should no longer be in parent list"
13284 restore_lustre_params < $save
13287 run_test 154f "get parent fids by reading link ea"
13291 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
13292 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
13293 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
13294 skip "Need MDS version at least 2.6.92"
13296 mkdir -p $DIR/$tdir
13297 llapi_fid_test -d $DIR/$tdir
13299 run_test 154g "various llapi FID tests"
13301 test_155_small_load() {
13302 local temp=$TMP/$tfile
13303 local file=$DIR/$tfile
13305 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
13306 error "dd of=$temp bs=6096 count=1 failed"
13308 cancel_lru_locks $OSC
13309 cmp $temp $file || error "$temp $file differ"
13311 $TRUNCATE $temp 6000
13312 $TRUNCATE $file 6000
13313 cmp $temp $file || error "$temp $file differ (truncate1)"
13315 echo "12345" >>$temp
13316 echo "12345" >>$file
13317 cmp $temp $file || error "$temp $file differ (append1)"
13319 echo "12345" >>$temp
13320 echo "12345" >>$file
13321 cmp $temp $file || error "$temp $file differ (append2)"
13327 test_155_big_load() {
13328 remote_ost_nodsh && skip "remote OST with nodsh"
13330 local temp=$TMP/$tfile
13331 local file=$DIR/$tfile
13334 local cache_size=$(do_facet ost$((MAXI+1)) \
13335 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
13336 local large_file_size=$((cache_size * 2))
13338 echo "OSS cache size: $cache_size KB"
13339 echo "Large file size: $large_file_size KB"
13341 [ $MAXV -le $large_file_size ] &&
13342 skip_env "max available OST size needs > $large_file_size KB"
13344 $LFS setstripe $file -c 1 -i $MAXI || error "$LFS setstripe $file failed"
13346 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
13347 error "dd of=$temp bs=$large_file_size count=1k failed"
13350 cancel_lru_locks osc
13351 cmp $temp $file || error "$temp $file differ"
13357 save_writethrough() {
13358 local facets=$(get_facets OST)
13360 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
13364 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13366 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13368 save_writethrough $p
13371 set_cache writethrough on
13372 test_155_small_load
13373 restore_lustre_params < $p
13376 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
13379 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13381 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13383 save_writethrough $p
13386 set_cache writethrough off
13387 test_155_small_load
13388 restore_lustre_params < $p
13391 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
13394 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13396 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13398 save_writethrough $p
13401 set_cache writethrough on
13402 test_155_small_load
13403 restore_lustre_params < $p
13406 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
13409 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13411 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13413 save_writethrough $p
13416 set_cache writethrough off
13417 test_155_small_load
13418 restore_lustre_params < $p
13421 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
13424 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13426 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13428 save_writethrough $p
13431 set_cache writethrough on
13433 restore_lustre_params < $p
13436 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
13439 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13441 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13443 save_writethrough $p
13446 set_cache writethrough off
13448 restore_lustre_params < $p
13451 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
13454 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13456 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13458 save_writethrough $p
13461 set_cache writethrough on
13463 restore_lustre_params < $p
13466 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
13469 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13471 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13473 save_writethrough $p
13476 set_cache writethrough off
13478 restore_lustre_params < $p
13481 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
13484 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13485 remote_ost_nodsh && skip "remote OST with nodsh"
13486 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
13487 skip "stats not implemented on old servers"
13488 [ "$ost1_FSTYPE" = "zfs" ] &&
13489 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
13494 local file="$DIR/$tfile"
13495 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13497 save_writethrough $p
13500 log "Turn on read and write cache"
13502 set_cache writethrough on
13504 log "Write data and read it back."
13505 log "Read should be satisfied from the cache."
13506 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13508 cancel_lru_locks osc
13509 cat $file >/dev/null
13511 if ! let "AFTER - BEFORE == CPAGES"; then
13512 error "NOT IN CACHE (2): before: $BEFORE, after: $AFTER"
13514 log "cache hits: before: $BEFORE, after: $AFTER"
13517 log "Read again; it should be satisfied from the cache."
13519 cancel_lru_locks osc
13520 cat $file >/dev/null
13522 if ! let "AFTER - BEFORE == CPAGES"; then
13523 error "NOT IN CACHE (3): before: $BEFORE, after: $AFTER"
13525 log "cache hits:: before: $BEFORE, after: $AFTER"
13528 log "Turn off the read cache and turn on the write cache"
13530 set_cache writethrough on
13532 log "Read again; it should be satisfied from the cache."
13534 cancel_lru_locks osc
13535 cat $file >/dev/null
13537 if ! let "AFTER - BEFORE == CPAGES"; then
13538 error "NOT IN CACHE (4): before: $BEFORE, after: $AFTER"
13540 log "cache hits:: before: $BEFORE, after: $AFTER"
13543 if [ $OST1_VERSION -lt $(version_code 2.12.55) ]; then
13544 # > 2.12.56 uses pagecache if cached
13545 log "Read again; it should not be satisfied from the cache."
13547 cancel_lru_locks osc
13548 cat $file >/dev/null
13550 if ! let "AFTER - BEFORE == 0"; then
13551 error "IN CACHE (5): before: $BEFORE, after: $AFTER"
13553 log "cache hits:: before: $BEFORE, after: $AFTER"
13557 log "Write data and read it back."
13558 log "Read should be satisfied from the cache."
13559 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13561 cancel_lru_locks osc
13562 cat $file >/dev/null
13564 if ! let "AFTER - BEFORE == CPAGES"; then
13565 error "NOT IN CACHE (6): before: $BEFORE, after: $AFTER"
13567 log "cache hits:: before: $BEFORE, after: $AFTER"
13570 if [ $OST1_VERSION -lt $(version_code 2.12.55) ]; then
13571 # > 2.12.56 uses pagecache if cached
13572 log "Read again; it should not be satisfied from the cache."
13574 cancel_lru_locks osc
13575 cat $file >/dev/null
13577 if ! let "AFTER - BEFORE == 0"; then
13578 error "IN CACHE (7): before: $BEFORE, after: $AFTER"
13580 log "cache hits:: before: $BEFORE, after: $AFTER"
13584 log "Turn off read and write cache"
13586 set_cache writethrough off
13588 log "Write data and read it back"
13589 log "It should not be satisfied from the cache."
13591 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13592 cancel_lru_locks osc
13594 cat $file >/dev/null
13596 if ! let "AFTER - BEFORE == 0"; then
13597 error_ignore bz20762 "IN CACHE (8):before:$BEFORE,after:$AFTER"
13599 log "cache hits:: before: $BEFORE, after: $AFTER"
13602 log "Turn on the read cache and turn off the write cache"
13604 set_cache writethrough off
13606 log "Write data and read it back"
13607 log "It should not be satisfied from the cache."
13609 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13611 cancel_lru_locks osc
13612 cat $file >/dev/null
13614 if ! let "AFTER - BEFORE == 0"; then
13615 error_ignore bz20762 "IN CACHE (9):before:$BEFORE,after:$AFTER"
13617 log "cache hits:: before: $BEFORE, after: $AFTER"
13620 log "Read again; it should be satisfied from the cache."
13622 cancel_lru_locks osc
13623 cat $file >/dev/null
13625 if ! let "AFTER - BEFORE == CPAGES"; then
13626 error "NOT IN CACHE (1): before: $BEFORE, after: $AFTER"
13628 log "cache hits:: before: $BEFORE, after: $AFTER"
13631 restore_lustre_params < $p
13634 run_test 156 "Verification of tunables"
13637 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13638 remote_mds_nodsh && skip "remote MDS with nodsh"
13639 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13640 skip "Need MDS version at least 2.2.0"
13642 changelog_register || error "changelog_register failed"
13643 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13644 changelog_users $SINGLEMDS | grep -q $cl_user ||
13645 error "User $cl_user not found in changelog_users"
13648 test_mkdir -p $DIR/$tdir/pics/2008/zachy
13649 changelog_clear 0 || error "changelog_clear failed"
13650 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
13651 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
13652 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
13653 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
13654 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
13655 rm $DIR/$tdir/pics/desktop.jpg
13657 changelog_dump | tail -10
13659 echo "verifying changelog mask"
13660 changelog_chmask "-MKDIR"
13661 changelog_chmask "-CLOSE"
13663 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
13664 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
13666 changelog_chmask "+MKDIR"
13667 changelog_chmask "+CLOSE"
13669 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
13670 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
13672 changelog_dump | tail -10
13673 MKDIRS=$(changelog_dump | grep -c "MKDIR")
13674 CLOSES=$(changelog_dump | grep -c "CLOSE")
13675 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
13676 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
13679 echo "verifying target fid"
13680 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
13681 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
13682 [ "$fidc" == "$fidf" ] ||
13683 error "changelog '$tfile' fid $fidc != file fid $fidf"
13684 echo "verifying parent fid"
13685 # The FID returned from the Changelog may be the directory shard on
13686 # a different MDT, and not the FID returned by path2fid on the parent.
13687 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
13688 # since this is what will matter when recreating this file in the tree.
13689 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
13690 local pathp=$($LFS fid2path $MOUNT "$fidp")
13691 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
13692 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
13694 echo "getting records for $cl_user"
13695 changelog_users $SINGLEMDS
13696 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
13698 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
13699 error "changelog_clear failed"
13700 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
13701 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
13702 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
13703 error "user index expect $user_rec1 + $nclr != $user_rec2"
13705 local min0_rec=$(changelog_users $SINGLEMDS |
13706 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
13707 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
13708 awk '{ print $1; exit; }')
13710 changelog_dump | tail -n 5
13711 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
13712 [ $first_rec == $((min0_rec + 1)) ] ||
13713 error "first index should be $min0_rec + 1 not $first_rec"
13715 # LU-3446 changelog index reset on MDT restart
13716 local cur_rec1=$(changelog_users $SINGLEMDS |
13717 awk '/^current.index:/ { print $NF }')
13718 changelog_clear 0 ||
13719 error "clear all changelog records for $cl_user failed"
13720 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
13721 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
13722 error "Fail to start $SINGLEMDS"
13723 local cur_rec2=$(changelog_users $SINGLEMDS |
13724 awk '/^current.index:/ { print $NF }')
13725 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
13726 [ $cur_rec1 == $cur_rec2 ] ||
13727 error "current index should be $cur_rec1 not $cur_rec2"
13729 echo "verifying users from this test are deregistered"
13730 changelog_deregister || error "changelog_deregister failed"
13731 changelog_users $SINGLEMDS | grep -q $cl_user &&
13732 error "User '$cl_user' still in changelog_users"
13734 # lctl get_param -n mdd.*.changelog_users
13735 # current index: 144
13736 # ID index (idle seconds)
13738 if ! changelog_users $SINGLEMDS | grep "^cl"; then
13739 # this is the normal case where all users were deregistered
13740 # make sure no new records are added when no users are present
13741 local last_rec1=$(changelog_users $SINGLEMDS |
13742 awk '/^current.index:/ { print $NF }')
13743 touch $DIR/$tdir/chloe
13744 local last_rec2=$(changelog_users $SINGLEMDS |
13745 awk '/^current.index:/ { print $NF }')
13746 echo "verify changelogs are off: $last_rec1 == $last_rec2"
13747 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
13749 # any changelog users must be leftovers from a previous test
13750 changelog_users $SINGLEMDS
13751 echo "other changelog users; can't verify off"
13754 run_test 160a "changelog sanity"
13756 test_160b() { # LU-3587
13757 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13758 remote_mds_nodsh && skip "remote MDS with nodsh"
13759 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13760 skip "Need MDS version at least 2.2.0"
13762 changelog_register || error "changelog_register failed"
13763 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13764 changelog_users $SINGLEMDS | grep -q $cl_user ||
13765 error "User '$cl_user' not found in changelog_users"
13767 local longname1=$(str_repeat a 255)
13768 local longname2=$(str_repeat b 255)
13771 echo "creating very long named file"
13772 touch $longname1 || error "create of '$longname1' failed"
13773 echo "renaming very long named file"
13774 mv $longname1 $longname2
13776 changelog_dump | grep RENME | tail -n 5
13779 run_test 160b "Verify that very long rename doesn't crash in changelog"
13782 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13783 remote_mds_nodsh && skip "remote MDS with nodsh"
13785 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
13786 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
13787 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
13788 skip "Need MDS version at least 2.5.58 or 2.5.2+"
13792 # Registration step
13793 changelog_register || error "changelog_register failed"
13796 mkdir -p $DIR/$tdir
13797 $MCREATE $DIR/$tdir/foo_160c
13798 changelog_chmask "-TRUNC"
13799 $TRUNCATE $DIR/$tdir/foo_160c 200
13800 changelog_chmask "+TRUNC"
13801 $TRUNCATE $DIR/$tdir/foo_160c 199
13802 changelog_dump | tail -n 5
13803 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
13804 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
13806 run_test 160c "verify that changelog log catch the truncate event"
13809 remote_mds_nodsh && skip "remote MDS with nodsh"
13810 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13811 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13812 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
13813 skip "Need MDS version at least 2.7.60"
13815 # Registration step
13816 changelog_register || error "changelog_register failed"
13818 mkdir -p $DIR/$tdir/migrate_dir
13819 changelog_clear 0 || error "changelog_clear failed"
13821 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
13822 changelog_dump | tail -n 5
13823 local migrates=$(changelog_dump | grep -c "MIGRT")
13824 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
13826 run_test 160d "verify that changelog log catch the migrate event"
13829 remote_mds_nodsh && skip "remote MDS with nodsh"
13832 changelog_register || error "changelog_register failed"
13834 # Delete a future user (expect fail)
13835 local MDT0=$(facet_svc $SINGLEMDS)
13836 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
13839 if [ $rc -eq 0 ]; then
13840 error "Deleted non-existant user cl77"
13841 elif [ $rc -ne 2 ]; then
13842 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
13845 # Clear to a bad index (1 billion should be safe)
13846 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
13849 if [ $rc -eq 0 ]; then
13850 error "Successfully cleared to invalid CL index"
13851 elif [ $rc -ne 22 ]; then
13852 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
13855 run_test 160e "changelog negative testing (should return errors)"
13858 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13859 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13860 skip "Need MDS version at least 2.10.56"
13862 local mdts=$(comma_list $(mdts_nodes))
13865 changelog_register || error "first changelog_register failed"
13866 changelog_register || error "second changelog_register failed"
13868 declare -A cl_user1
13869 declare -A cl_user2
13874 # generate some changelog records to accumulate on each MDT
13875 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13876 log "$(date +%s): creating first files"
13877 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13878 error "create $DIR/$tdir/$tfile failed"
13880 # check changelogs have been generated
13881 local start=$SECONDS
13882 local idle_time=$((MDSCOUNT * 5 + 5))
13883 local nbcl=$(changelog_dump | wc -l)
13884 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13886 for param in "changelog_max_idle_time=$idle_time" \
13888 "changelog_min_gc_interval=2" \
13889 "changelog_min_free_cat_entries=3"; do
13890 local MDT0=$(facet_svc $SINGLEMDS)
13891 local var="${param%=*}"
13892 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13894 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13895 do_nodes $mdts $LCTL set_param mdd.*.$param
13898 # force cl_user2 to be idle (1st part), but also cancel the
13899 # cl_user1 records so that it is not evicted later in the test.
13900 local sleep1=$((idle_time / 2))
13901 echo "$(date +%s): sleep1 $sleep1/${idle_time}s"
13904 # simulate changelog catalog almost full
13905 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13906 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13908 for i in $(seq $MDSCOUNT); do
13909 cl_users=(${CL_USERS[mds$i]})
13910 cl_user1[mds$i]="${cl_users[0]}"
13911 cl_user2[mds$i]="${cl_users[1]}"
13913 [ -n "${cl_user1[mds$i]}" ] ||
13914 error "mds$i: no user registered"
13915 [ -n "${cl_user2[mds$i]}" ] ||
13916 error "mds$i: only ${cl_user2[mds$i]} is registered"
13918 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13919 [ -n "$user_rec1" ] ||
13920 error "mds$i: User ${cl_user1[mds$i]} not registered"
13921 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13922 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13923 [ -n "$user_rec2" ] ||
13924 error "mds$i: User ${cl_user1[mds$i]} not registered"
13925 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13926 "$user_rec1 + 2 == $user_rec2"
13927 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13928 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13929 "$user_rec1 + 2, but is $user_rec2"
13930 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13931 [ -n "$user_rec2" ] ||
13932 error "mds$i: User ${cl_user2[mds$i]} not registered"
13933 [ $user_rec1 == $user_rec2 ] ||
13934 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13935 "$user_rec1, but is $user_rec2"
13938 # force cl_user2 idle (2nd part) to just exceed changelog_max_idle_time
13939 local sleep2=$((idle_time - (SECONDS - start) + 1))
13940 echo "$(date +%s): sleep2 $sleep2/${idle_time}s"
13943 # Generate one more changelog to trigger GC at fail_loc for cl_user2.
13944 # cl_user1 should be OK because it recently processed records.
13945 echo "$(date +%s): creating $((MDSCOUNT * 2)) files"
13946 createmany -m $DIR/$tdir/${tfile}b $((MDSCOUNT * 2)) ||
13947 error "create $DIR/$tdir/${tfile}b failed"
13949 # ensure gc thread is done
13950 for i in $(mdts_nodes); do
13952 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13953 error "$i: GC-thread not done"
13957 for i in $(seq $MDSCOUNT); do
13958 # check cl_user1 still registered
13959 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13960 error "mds$i: User ${cl_user1[mds$i]} not registered"
13961 # check cl_user2 unregistered
13962 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13963 error "mds$i: User ${cl_user2[mds$i]} still registered"
13965 # check changelogs are present and starting at $user_rec1 + 1
13966 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13967 [ -n "$user_rec1" ] ||
13968 error "mds$i: User ${cl_user1[mds$i]} not registered"
13969 first_rec=$($LFS changelog $(facet_svc mds$i) |
13970 awk '{ print $1; exit; }')
13972 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13973 [ $((user_rec1 + 1)) == $first_rec ] ||
13974 error "mds$i: first index should be $user_rec1 + 1, " \
13975 "but is $first_rec"
13978 run_test 160f "changelog garbage collect (timestamped users)"
13981 remote_mds_nodsh && skip "remote MDS with nodsh"
13982 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13983 skip "Need MDS version at least 2.10.56"
13985 local mdts=$(comma_list $(mdts_nodes))
13987 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
13988 do_nodes $mdts $LCTL set_param fail_loc=0x1314
13991 changelog_register || error "first changelog_register failed"
13992 changelog_register || error "second changelog_register failed"
13994 declare -A cl_user1
13995 declare -A cl_user2
14000 # generate some changelog records to accumulate on each MDT
14001 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
14002 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
14003 error "create $DIR/$tdir/$tfile failed"
14005 # check changelogs have been generated
14006 local nbcl=$(changelog_dump | wc -l)
14007 [[ $nbcl -eq 0 ]] && error "no changelogs found"
14009 # reduce the max_idle_indexes value to make sure we exceed it
14010 max_ndx=$((nbcl / 2 - 1))
14012 for param in "changelog_max_idle_indexes=$max_ndx" \
14014 "changelog_min_gc_interval=2" \
14015 "changelog_min_free_cat_entries=3"; do
14016 local MDT0=$(facet_svc $SINGLEMDS)
14017 local var="${param%=*}"
14018 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
14020 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
14021 do_nodes $mdts $LCTL set_param mdd.*.$param ||
14022 error "unable to set mdd.*.$param"
14025 # simulate changelog catalog almost full
14026 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
14027 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
14029 for i in $(seq $MDSCOUNT); do
14030 cl_users=(${CL_USERS[mds$i]})
14031 cl_user1[mds$i]="${cl_users[0]}"
14032 cl_user2[mds$i]="${cl_users[1]}"
14034 [ -n "${cl_user1[mds$i]}" ] ||
14035 error "mds$i: no user registered"
14036 [ -n "${cl_user2[mds$i]}" ] ||
14037 error "mds$i: only ${cl_user1[mds$i]} is registered"
14039 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
14040 [ -n "$user_rec1" ] ||
14041 error "mds$i: User ${cl_user1[mds$i]} not registered"
14042 __changelog_clear mds$i ${cl_user1[mds$i]} +2
14043 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
14044 [ -n "$user_rec2" ] ||
14045 error "mds$i: User ${cl_user1[mds$i]} not registered"
14046 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
14047 "$user_rec1 + 2 == $user_rec2"
14048 [ $((user_rec1 + 2)) == $user_rec2 ] ||
14049 error "mds$i: user ${cl_user1[mds$i]} index expected " \
14050 "$user_rec1 + 2, but is $user_rec2"
14051 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
14052 [ -n "$user_rec2" ] ||
14053 error "mds$i: User ${cl_user2[mds$i]} not registered"
14054 [ $user_rec1 == $user_rec2 ] ||
14055 error "mds$i: user ${cl_user2[mds$i]} index expected " \
14056 "$user_rec1, but is $user_rec2"
14059 # ensure we are past the previous changelog_min_gc_interval set above
14062 # generate one more changelog to trigger fail_loc
14063 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
14064 error "create $DIR/$tdir/${tfile}bis failed"
14066 # ensure gc thread is done
14067 for i in $(mdts_nodes); do
14069 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
14070 error "$i: GC-thread not done"
14074 for i in $(seq $MDSCOUNT); do
14075 # check cl_user1 still registered
14076 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
14077 error "mds$i: User ${cl_user1[mds$i]} not registered"
14078 # check cl_user2 unregistered
14079 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
14080 error "mds$i: User ${cl_user2[mds$i]} still registered"
14082 # check changelogs are present and starting at $user_rec1 + 1
14083 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
14084 [ -n "$user_rec1" ] ||
14085 error "mds$i: User ${cl_user1[mds$i]} not registered"
14086 first_rec=$($LFS changelog $(facet_svc mds$i) |
14087 awk '{ print $1; exit; }')
14089 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
14090 [ $((user_rec1 + 1)) == $first_rec ] ||
14091 error "mds$i: first index should be $user_rec1 + 1, " \
14092 "but is $first_rec"
14095 run_test 160g "changelog garbage collect (old users)"
14098 remote_mds_nodsh && skip "remote MDS with nodsh" && return
14099 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
14100 skip "Need MDS version at least 2.10.56"
14102 local mdts=$(comma_list $(mdts_nodes))
14105 changelog_register || error "first changelog_register failed"
14106 changelog_register || error "second changelog_register failed"
14108 declare -A cl_user1
14109 declare -A cl_user2
14114 # generate some changelog records to accumulate on each MDT
14115 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
14116 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
14117 error "create $DIR/$tdir/$tfile failed"
14119 # check changelogs have been generated
14120 local nbcl=$(changelog_dump | wc -l)
14121 [[ $nbcl -eq 0 ]] && error "no changelogs found"
14123 for param in "changelog_max_idle_time=10" \
14125 "changelog_min_gc_interval=2"; do
14126 local MDT0=$(facet_svc $SINGLEMDS)
14127 local var="${param%=*}"
14128 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
14130 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
14131 do_nodes $mdts $LCTL set_param mdd.*.$param
14134 # force cl_user2 to be idle (1st part)
14137 for i in $(seq $MDSCOUNT); do
14138 cl_users=(${CL_USERS[mds$i]})
14139 cl_user1[mds$i]="${cl_users[0]}"
14140 cl_user2[mds$i]="${cl_users[1]}"
14142 [ -n "${cl_user1[mds$i]}" ] ||
14143 error "mds$i: no user registered"
14144 [ -n "${cl_user2[mds$i]}" ] ||
14145 error "mds$i: only ${cl_user2[mds$i]} is registered"
14147 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
14148 [ -n "$user_rec1" ] ||
14149 error "mds$i: User ${cl_user1[mds$i]} not registered"
14150 __changelog_clear mds$i ${cl_user1[mds$i]} +2
14151 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
14152 [ -n "$user_rec2" ] ||
14153 error "mds$i: User ${cl_user1[mds$i]} not registered"
14154 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
14155 "$user_rec1 + 2 == $user_rec2"
14156 [ $((user_rec1 + 2)) == $user_rec2 ] ||
14157 error "mds$i: user ${cl_user1[mds$i]} index expected " \
14158 "$user_rec1 + 2, but is $user_rec2"
14159 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
14160 [ -n "$user_rec2" ] ||
14161 error "mds$i: User ${cl_user2[mds$i]} not registered"
14162 [ $user_rec1 == $user_rec2 ] ||
14163 error "mds$i: user ${cl_user2[mds$i]} index expected " \
14164 "$user_rec1, but is $user_rec2"
14167 # force cl_user2 to be idle (2nd part) and to reach
14168 # changelog_max_idle_time
14171 # force each GC-thread start and block then
14172 # one per MDT/MDD, set fail_val accordingly
14173 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
14174 do_nodes $mdts $LCTL set_param fail_loc=0x1316
14176 # generate more changelogs to trigger fail_loc
14177 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
14178 error "create $DIR/$tdir/${tfile}bis failed"
14180 # stop MDT to stop GC-thread, should be done in back-ground as it will
14181 # block waiting for the thread to be released and exit
14182 declare -A stop_pids
14183 for i in $(seq $MDSCOUNT); do
14185 stop_pids[mds$i]=$!
14188 for i in $(mdts_nodes); do
14191 local facets=$(facets_up_on_host $i)
14193 for facet in ${facets//,/ }; do
14194 if [[ $facet == mds* ]]; then
14198 # ensure each MDS's gc threads are still present and all in "R"
14199 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
14200 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
14201 error "$i: expected $nb GC-thread"
14203 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
14205 error "$i: GC-thread not found in R-state"
14206 # check umounts of each MDT on MDS have reached kthread_stop()
14207 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
14208 error "$i: expected $nb umount"
14210 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
14211 error "$i: umount not found in D-state"
14214 # release all GC-threads
14215 do_nodes $mdts $LCTL set_param fail_loc=0
14217 # wait for MDT stop to complete
14218 for i in $(seq $MDSCOUNT); do
14219 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
14223 # may try to check if any orphan changelog records are present
14224 # via ldiskfs/zfs and llog_reader...
14226 # re-start/mount MDTs
14227 for i in $(seq $MDSCOUNT); do
14228 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
14229 error "Fail to start mds$i"
14233 for i in $(seq $MDSCOUNT); do
14234 # check cl_user1 still registered
14235 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
14236 error "mds$i: User ${cl_user1[mds$i]} not registered"
14237 # check cl_user2 unregistered
14238 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
14239 error "mds$i: User ${cl_user2[mds$i]} still registered"
14241 # check changelogs are present and starting at $user_rec1 + 1
14242 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
14243 [ -n "$user_rec1" ] ||
14244 error "mds$i: User ${cl_user1[mds$i]} not registered"
14245 first_rec=$($LFS changelog $(facet_svc mds$i) |
14246 awk '{ print $1; exit; }')
14248 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
14249 [ $((user_rec1 + 1)) == $first_rec ] ||
14250 error "mds$i: first index should be $user_rec1 + 1, " \
14251 "but is $first_rec"
14254 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
14259 local mdts=$(comma_list $(mdts_nodes))
14261 changelog_register || error "first changelog_register failed"
14263 # generate some changelog records to accumulate on each MDT
14264 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
14265 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
14266 error "create $DIR/$tdir/$tfile failed"
14268 # check changelogs have been generated
14269 local nbcl=$(changelog_dump | wc -l)
14270 [[ $nbcl -eq 0 ]] && error "no changelogs found"
14272 # simulate race between register and unregister
14273 # XXX as fail_loc is set per-MDS, with DNE configs the race
14274 # simulation will only occur for one MDT per MDS and for the
14275 # others the normal race scenario will take place
14276 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
14277 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
14278 do_nodes $mdts $LCTL set_param fail_val=1
14280 # unregister 1st user
14281 changelog_deregister &
14283 # wait some time for deregister work to reach race rdv
14285 # register 2nd user
14286 changelog_register || error "2nd user register failed"
14288 wait $pid1 || error "1st user deregister failed"
14292 declare -A LAST_REC
14293 for i in $(seq $MDSCOUNT); do
14294 if changelog_users mds$i | grep "^cl"; then
14295 # make sure new records are added with one user present
14296 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
14297 awk '/^current.index:/ { print $NF }')
14299 error "mds$i has no user registered"
14303 # generate more changelog records to accumulate on each MDT
14304 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
14305 error "create $DIR/$tdir/${tfile}bis failed"
14307 for i in $(seq $MDSCOUNT); do
14308 last_rec=$(changelog_users $SINGLEMDS |
14309 awk '/^current.index:/ { print $NF }')
14310 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
14311 [ $last_rec != ${LAST_REC[mds$i]} ] ||
14312 error "changelogs are off on mds$i"
14315 run_test 160i "changelog user register/unregister race"
14318 remote_mds_nodsh && skip "remote MDS with nodsh"
14319 [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] &&
14320 skip "Need MDS version at least 2.12.56"
14322 mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
14323 stack_trap "umount $MOUNT2" EXIT
14325 changelog_register || error "first changelog_register failed"
14326 stack_trap "changelog_deregister" EXIT
14328 # generate some changelog
14329 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
14330 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
14331 error "create $DIR/$tdir/${tfile}bis failed"
14333 # open the changelog device
14334 exec 3>/dev/changelog-$FSNAME-MDT0000
14335 stack_trap "exec 3>&-" EXIT
14336 exec 4</dev/changelog-$FSNAME-MDT0000
14337 stack_trap "exec 4<&-" EXIT
14339 # umount the first lustre mount
14341 stack_trap "mount_client $MOUNT" EXIT
14344 cat <&4 >/dev/null || error "read changelog failed"
14347 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
14348 changelog_users $SINGLEMDS | grep -q $cl_user ||
14349 error "User $cl_user not found in changelog_users"
14351 printf 'clear:'$cl_user':0' >&3
14354 run_test 160j "client can be umounted while its chanangelog is being used"
14357 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14358 remote_mds_nodsh && skip "remote MDS with nodsh"
14360 mkdir -p $DIR/$tdir/1/1
14362 changelog_register || error "changelog_register failed"
14363 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
14365 changelog_users $SINGLEMDS | grep -q $cl_user ||
14366 error "User '$cl_user' not found in changelog_users"
14367 #define OBD_FAIL_MDS_CHANGELOG_REORDER 0x15d
14368 do_facet mds1 $LCTL set_param fail_loc=0x8000015d fail_val=3
14369 rmdir $DIR/$tdir/1/1 & sleep 1
14371 touch $DIR/$tdir/2/2
14372 rm -rf $DIR/$tdir/2
14377 changelog_dump | grep rmdir || error "rmdir not recorded"
14380 changelog_deregister
14382 run_test 160k "Verify that changelog records are not lost"
14385 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14387 test_mkdir -c1 $DIR/$tdir
14388 cp /etc/hosts $DIR/$tdir/$tfile
14389 test_mkdir -c1 $DIR/$tdir/foo1
14390 test_mkdir -c1 $DIR/$tdir/foo2
14391 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
14392 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
14393 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
14394 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
14395 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
14396 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
14397 $LFS fid2path $DIR $FID
14398 error "bad link ea"
14401 rm $DIR/$tdir/foo2/zachary
14403 rm $DIR/$tdir/foo2/thor
14405 rm $DIR/$tdir/$tfile
14407 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
14408 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
14409 { $LFS fid2path $DIR $FID; error "bad link rename"; }
14410 rm $DIR/$tdir/foo2/maggie
14413 local longname=$tfile.avg_len_is_thirty_two_
14414 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
14415 error_noexit 'failed to unlink many hardlinks'" EXIT
14416 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
14417 error "failed to hardlink many files"
14418 links=$($LFS fid2path $DIR $FID | wc -l)
14419 echo -n "${links}/1000 links in link EA"
14420 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
14422 run_test 161a "link ea sanity"
14425 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14426 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
14429 local remote_dir=$DIR/$tdir/remote_dir
14431 mkdir -p $DIR/$tdir
14432 $LFS mkdir -i $MDTIDX $remote_dir ||
14433 error "create remote directory failed"
14435 cp /etc/hosts $remote_dir/$tfile
14436 mkdir -p $remote_dir/foo1
14437 mkdir -p $remote_dir/foo2
14438 ln $remote_dir/$tfile $remote_dir/foo1/sofia
14439 ln $remote_dir/$tfile $remote_dir/foo2/zachary
14440 ln $remote_dir/$tfile $remote_dir/foo1/luna
14441 ln $remote_dir/$tfile $remote_dir/foo2/thor
14443 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
14445 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
14446 $LFS fid2path $DIR $FID
14447 error "bad link ea"
14450 rm $remote_dir/foo2/zachary
14452 rm $remote_dir/foo2/thor
14454 rm $remote_dir/$tfile
14456 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
14457 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
14458 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
14459 $LFS fid2path $DIR $FID
14460 error "bad link rename"
14462 rm $remote_dir/foo2/maggie
14465 local longname=filename_avg_len_is_thirty_two_
14466 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
14467 error "failed to hardlink many files"
14468 links=$($LFS fid2path $DIR $FID | wc -l)
14469 echo -n "${links}/1000 links in link EA"
14470 [[ ${links} -gt 60 ]] ||
14471 error "expected at least 60 links in link EA"
14472 unlinkmany $remote_dir/foo2/$longname 1000 ||
14473 error "failed to unlink many hardlinks"
14475 run_test 161b "link ea sanity under remote directory"
14478 remote_mds_nodsh && skip "remote MDS with nodsh"
14479 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14480 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
14481 skip "Need MDS version at least 2.1.5"
14483 # define CLF_RENAME_LAST 0x0001
14484 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
14485 changelog_register || error "changelog_register failed"
14488 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
14489 touch $DIR/$tdir/foo_161c
14490 touch $DIR/$tdir/bar_161c
14491 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
14492 changelog_dump | grep RENME | tail -n 5
14493 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
14494 changelog_clear 0 || error "changelog_clear failed"
14495 if [ x$flags != "x0x1" ]; then
14496 error "flag $flags is not 0x1"
14499 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
14500 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
14501 touch $DIR/$tdir/foo_161c
14502 touch $DIR/$tdir/bar_161c
14503 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
14504 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
14505 changelog_dump | grep RENME | tail -n 5
14506 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
14507 changelog_clear 0 || error "changelog_clear failed"
14508 if [ x$flags != "x0x0" ]; then
14509 error "flag $flags is not 0x0"
14511 echo "rename overwrite a target having nlink > 1," \
14512 "changelog record has flags of $flags"
14514 # rename doesn't overwrite a target (changelog flag 0x0)
14515 touch $DIR/$tdir/foo_161c
14516 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
14517 changelog_dump | grep RENME | tail -n 5
14518 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
14519 changelog_clear 0 || error "changelog_clear failed"
14520 if [ x$flags != "x0x0" ]; then
14521 error "flag $flags is not 0x0"
14523 echo "rename doesn't overwrite a target," \
14524 "changelog record has flags of $flags"
14526 # define CLF_UNLINK_LAST 0x0001
14527 # unlink a file having nlink = 1 (changelog flag 0x1)
14528 rm -f $DIR/$tdir/foo2_161c
14529 changelog_dump | grep UNLNK | tail -n 5
14530 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
14531 changelog_clear 0 || error "changelog_clear failed"
14532 if [ x$flags != "x0x1" ]; then
14533 error "flag $flags is not 0x1"
14535 echo "unlink a file having nlink = 1," \
14536 "changelog record has flags of $flags"
14538 # unlink a file having nlink > 1 (changelog flag 0x0)
14539 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
14540 rm -f $DIR/$tdir/foobar_161c
14541 changelog_dump | grep UNLNK | tail -n 5
14542 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
14543 changelog_clear 0 || error "changelog_clear failed"
14544 if [ x$flags != "x0x0" ]; then
14545 error "flag $flags is not 0x0"
14547 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
14549 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
14552 remote_mds_nodsh && skip "remote MDS with nodsh"
14553 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
14558 changelog_register || error "changelog_register failed"
14560 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
14561 # interfer with $MOUNT/.lustre/fid/ access
14563 [[ $? -eq 0 ]] || error "mkdir failed"
14565 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
14566 $LCTL set_param fail_loc=0x8000140c
14568 $LCTL set_param fail_val=5
14571 echo foofoo > $DIR/$tdir/$tfile &
14574 # wait for create to be delayed
14578 [[ $? -eq 0 ]] || error "create should be blocked"
14580 local tempfile="$(mktemp --tmpdir $tfile.XXXXXX)"
14581 stack_trap "rm -f $tempfile"
14582 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
14583 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
14584 # some delay may occur during ChangeLog publishing and file read just
14585 # above, that could allow file write to happen finally
14586 [[ -s $tempfile ]] && echo "file should be empty"
14588 $LCTL set_param fail_loc=0
14591 [[ $? -eq 0 ]] || error "create failed"
14593 run_test 161d "create with concurrent .lustre/fid access"
14596 local expected="$1"
14601 path=$($LFS fid2path "$@")
14604 if [ $rc -ne 0 ]; then
14605 error "path looked up of '$expected' failed: rc=$rc"
14606 elif [ "$path" != "$expected" ]; then
14607 error "path looked up '$path' instead of '$expected'"
14609 echo "FID '$fid' resolves to path '$path' as expected"
14613 test_162a() { # was test_162
14614 test_mkdir -p -c1 $DIR/$tdir/d2
14615 touch $DIR/$tdir/d2/$tfile
14616 touch $DIR/$tdir/d2/x1
14617 touch $DIR/$tdir/d2/x2
14618 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
14619 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
14621 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
14622 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
14625 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
14626 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
14627 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
14629 # softlink to wrong file
14630 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
14631 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
14632 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
14635 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
14636 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
14637 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
14638 # fid2path dir/fsname should both work
14639 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
14640 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
14642 # hardlink count: check that there are 2 links
14643 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
14644 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
14646 # hardlink indexing: remove the first link
14647 rm $DIR/$tdir/d2/p/q/r/hlink
14648 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
14650 run_test 162a "path lookup sanity"
14653 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14654 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
14657 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
14658 error "create striped dir failed"
14660 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
14661 tail -n 1 | awk '{print $2}')
14662 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
14664 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
14665 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
14668 for ((i=0;i<5;i++)); do
14669 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
14670 error "get fid for f$i failed"
14671 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
14673 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
14674 error "get fid for d$i failed"
14675 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
14680 run_test 162b "striped directory path lookup sanity"
14682 # LU-4239: Verify fid2path works with paths 100 or more directories deep
14684 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
14685 skip "Need MDS version at least 2.7.51"
14687 local lpath=$tdir.local
14688 local rpath=$tdir.remote
14690 test_mkdir $DIR/$lpath
14691 test_mkdir $DIR/$rpath
14693 for ((i = 0; i <= 101; i++)); do
14696 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
14697 error "get fid for local directory $DIR/$lpath failed"
14698 check_path "$DIR/$lpath" $MOUNT $FID --link 0
14701 test_mkdir $DIR/$rpath
14702 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
14703 error "get fid for remote directory $DIR/$rpath failed"
14704 check_path "$DIR/$rpath" $MOUNT $FID --link 0
14709 run_test 162c "fid2path works with paths 100 or more directories deep"
14712 # do directio so as not to populate the page cache
14713 log "creating a 10 Mb file"
14714 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
14715 log "starting reads"
14716 dd if=$DIR/$tfile of=/dev/null bs=4096 &
14717 log "truncating the file"
14718 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
14720 kill %+ || true # reads might have finished
14721 echo "wait until dd is finished"
14723 log "removing the temporary file"
14724 rm -rf $DIR/$tfile || error "tmp file removal failed"
14726 run_test 169 "parallel read and truncate should not deadlock"
14729 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14731 $LCTL clear # bug 18514
14732 $LCTL debug_daemon start $TMP/${tfile}_log_good
14734 $LCTL debug_daemon stop
14735 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
14736 error "sed failed to read log_good"
14738 $LCTL debug_daemon start $TMP/${tfile}_log_good
14740 $LCTL debug_daemon stop
14742 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
14743 error "lctl df log_bad failed"
14745 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14746 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14748 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
14749 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
14751 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
14752 error "bad_line good_line1 good_line2 are empty"
14754 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14755 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
14756 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14758 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
14759 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14760 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14762 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
14763 error "bad_line_new good_line_new are empty"
14765 local expected_good=$((good_line1 + good_line2*2))
14767 rm -f $TMP/${tfile}*
14768 # LU-231, short malformed line may not be counted into bad lines
14769 if [ $bad_line -ne $bad_line_new ] &&
14770 [ $bad_line -ne $((bad_line_new - 1)) ]; then
14771 error "expected $bad_line bad lines, but got $bad_line_new"
14775 if [ $expected_good -ne $good_line_new ]; then
14776 error "expected $expected_good good lines, but got $good_line_new"
14781 run_test 170 "test lctl df to handle corrupted log ====================="
14783 test_171() { # bug20592
14784 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14786 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
14787 $LCTL set_param fail_loc=0x50e
14788 $LCTL set_param fail_val=3000
14789 multiop_bg_pause $DIR/$tfile O_s || true
14791 kill -USR1 $MULTIPID
14795 if dmesg | grep "recursive fault"; then
14796 error "caught a recursive fault"
14798 $LCTL set_param fail_loc=0
14801 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
14803 # it would be good to share it with obdfilter-survey/iokit-libecho code
14804 setup_obdecho_osc () {
14807 local obdfilter_name=$2
14808 echo "Creating new osc for $obdfilter_name on $ost_nid"
14809 # make sure we can find loopback nid
14810 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
14812 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
14813 ${obdfilter_name}_osc_UUID || rc=2; }
14814 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
14815 ${obdfilter_name}_UUID $ost_nid || rc=3; }
14819 cleanup_obdecho_osc () {
14820 local obdfilter_name=$1
14821 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
14822 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
14829 local pages=${3:-64}
14834 local obd_size=$(get_obd_size $node $OBD)
14835 local page_size=$(get_page_size $node)
14836 if [[ -n "$obd_size" ]]; then
14837 local new_count=$((obd_size / (pages * page_size / 1024)))
14838 [[ $new_count -ge $count ]] || count=$new_count
14841 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
14842 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
14844 if [ $rc -eq 0 ]; then
14845 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
14846 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
14848 echo "New object id is $id"
14849 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
14851 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
14852 "test_brw $count w v $pages $id" || rc=4; }
14853 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
14855 [ $rc -eq 0 ] || [ $rc -gt 2 ] &&
14856 { do_facet $node "$LCTL --device ec cleanup" || rc=5; }
14857 [ $rc -eq 0 ] || [ $rc -gt 1 ] &&
14858 { do_facet $node "$LCTL --device ec detach" || rc=6; }
14859 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
14864 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14866 if ! module_loaded obdecho; then
14867 load_module obdecho/obdecho &&
14868 stack_trap "rmmod obdecho" EXIT ||
14869 error "unable to load obdecho on client"
14872 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
14873 local host=$($LCTL get_param -n osc.$osc.import |
14874 awk '/current_connection:/ { print $2 }' )
14875 local target=$($LCTL get_param -n osc.$osc.import |
14876 awk '/target:/ { print $2 }' )
14877 target=${target%_UUID}
14879 if [ -n "$target" ]; then
14880 setup_obdecho_osc $host $target &&
14881 stack_trap "cleanup_obdecho_osc $target" EXIT ||
14882 { error "obdecho setup failed with $?"; return; }
14884 obdecho_test ${target}_osc client ||
14885 error "obdecho_test failed on ${target}_osc"
14887 $LCTL get_param osc.$osc.import
14888 error "there is no osc.$osc.import target"
14891 run_test 180a "test obdecho on osc"
14894 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14895 remote_ost_nodsh && skip "remote OST with nodsh"
14897 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14898 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14899 error "failed to load module obdecho"
14901 local target=$(do_facet ost1 $LCTL dl |
14902 awk '/obdfilter/ { print $4; exit; }')
14904 if [ -n "$target" ]; then
14905 obdecho_test $target ost1 || error "obdecho_test failed with $?"
14907 do_facet ost1 $LCTL dl
14908 error "there is no obdfilter target on ost1"
14911 run_test 180b "test obdecho directly on obdfilter"
14913 test_180c() { # LU-2598
14914 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14915 remote_ost_nodsh && skip "remote OST with nodsh"
14916 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
14917 skip "Need MDS version at least 2.4.0"
14919 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14920 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14921 error "failed to load module obdecho"
14923 local target=$(do_facet ost1 $LCTL dl |
14924 awk '/obdfilter/ { print $4; exit; }')
14926 if [ -n "$target" ]; then
14927 local pages=16384 # 64MB bulk I/O RPC size
14929 obdecho_test "$target" ost1 "$pages" ||
14930 error "obdecho_test with pages=$pages failed with $?"
14932 do_facet ost1 $LCTL dl
14933 error "there is no obdfilter target on ost1"
14936 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
14938 test_181() { # bug 22177
14939 test_mkdir $DIR/$tdir
14940 # create enough files to index the directory
14941 createmany -o $DIR/$tdir/foobar 4000
14942 # print attributes for debug purpose
14945 multiop_bg_pause $DIR/$tdir D_Sc || return 1
14947 # remove the files & current working dir
14948 unlinkmany $DIR/$tdir/foobar 4000
14950 kill -USR1 $MULTIPID
14952 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
14955 run_test 181 "Test open-unlinked dir ========================"
14961 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14963 $LCTL set_param mdc.*.rpc_stats=clear
14965 for (( i = 0; i < $tcount; i++ )) ; do
14966 mkdir $DIR/$tdir/$i
14969 for (( i = 0; i < $tcount; i++ )) ; do
14970 createmany -o $DIR/$tdir/$i/f- $fcount &
14974 for (( i = 0; i < $tcount; i++ )) ; do
14975 unlinkmany $DIR/$tdir/$i/f- $fcount &
14979 $LCTL get_param mdc.*.rpc_stats
14983 run_test 182 "Test parallel modify metadata operations ================"
14985 test_183() { # LU-2275
14986 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14987 remote_mds_nodsh && skip "remote MDS with nodsh"
14988 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
14989 skip "Need MDS version at least 2.3.56"
14991 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14992 echo aaa > $DIR/$tdir/$tfile
14994 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
14995 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
14997 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
14998 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
15000 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
15002 # Flush negative dentry cache
15003 touch $DIR/$tdir/$tfile
15005 # We are not checking for any leaked references here, they'll
15006 # become evident next time we do cleanup with module unload.
15009 run_test 183 "No crash or request leak in case of strange dispositions ========"
15011 # test suite 184 is for LU-2016, LU-2017
15013 check_swap_layouts_support
15015 dir0=$DIR/$tdir/$testnum
15016 test_mkdir -p -c1 $dir0
15021 $LFS setstripe -c1 $file1
15023 $LFS setstripe -c2 $file2
15025 gen1=$($LFS getstripe -g $file1)
15026 gen2=$($LFS getstripe -g $file2)
15028 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
15029 gen=$($LFS getstripe -g $file1)
15030 [[ $gen1 != $gen ]] ||
15031 "Layout generation on $file1 does not change"
15032 gen=$($LFS getstripe -g $file2)
15033 [[ $gen2 != $gen ]] ||
15034 "Layout generation on $file2 does not change"
15036 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
15037 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
15039 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
15041 run_test 184a "Basic layout swap"
15044 check_swap_layouts_support
15046 dir0=$DIR/$tdir/$testnum
15047 mkdir -p $dir0 || error "creating dir $dir0"
15054 $LFS setstripe -c1 $file1
15055 $LFS setstripe -c2 $file2
15056 $LFS setstripe -c1 $file3
15057 chown $RUNAS_ID $file3
15058 gen1=$($LFS getstripe -g $file1)
15059 gen2=$($LFS getstripe -g $file2)
15061 $LFS swap_layouts $dir1 $dir2 &&
15062 error "swap of directories layouts should fail"
15063 $LFS swap_layouts $dir1 $file1 &&
15064 error "swap of directory and file layouts should fail"
15065 $RUNAS $LFS swap_layouts $file1 $file2 &&
15066 error "swap of file we cannot write should fail"
15067 $LFS swap_layouts $file1 $file3 &&
15068 error "swap of file with different owner should fail"
15069 /bin/true # to clear error code
15071 run_test 184b "Forbidden layout swap (will generate errors)"
15074 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
15075 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
15076 check_swap_layouts_support
15078 local dir0=$DIR/$tdir/$testnum
15079 mkdir -p $dir0 || error "creating dir $dir0"
15081 local ref1=$dir0/ref1
15082 local ref2=$dir0/ref2
15083 local file1=$dir0/file1
15084 local file2=$dir0/file2
15085 # create a file large enough for the concurrent test
15086 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
15087 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
15088 echo "ref file size: ref1($(stat -c %s $ref1))," \
15089 "ref2($(stat -c %s $ref2))"
15092 dd if=$ref1 of=$file1 bs=16k &
15095 # Make sure dd starts to copy file
15096 while [ ! -f $file1 ]; do sleep 0.1; done
15098 $LFS swap_layouts $file1 $file2
15101 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
15102 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
15104 # how many bytes copied before swapping layout
15105 local copied=$(stat -c %s $file2)
15106 local remaining=$(stat -c %s $ref1)
15107 remaining=$((remaining - copied))
15108 echo "Copied $copied bytes before swapping layout..."
15110 cmp -n $copied $file1 $ref2 | grep differ &&
15111 error "Content mismatch [0, $copied) of ref2 and file1"
15112 cmp -n $copied $file2 $ref1 ||
15113 error "Content mismatch [0, $copied) of ref1 and file2"
15114 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
15115 error "Content mismatch [$copied, EOF) of ref1 and file1"
15118 rm -f $ref1 $ref2 $file1 $file2
15120 run_test 184c "Concurrent write and layout swap"
15123 check_swap_layouts_support
15124 [ -z "$(which getfattr 2>/dev/null)" ] &&
15125 skip_env "no getfattr command"
15127 local file1=$DIR/$tdir/$tfile-1
15128 local file2=$DIR/$tdir/$tfile-2
15129 local file3=$DIR/$tdir/$tfile-3
15133 mkdir -p $DIR/$tdir
15134 touch $file1 || error "create $file1 failed"
15135 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
15136 error "create $file2 failed"
15137 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
15138 error "create $file3 failed"
15139 lovea1=$(get_layout_param $file1)
15141 $LFS swap_layouts $file2 $file3 ||
15142 error "swap $file2 $file3 layouts failed"
15143 $LFS swap_layouts $file1 $file2 ||
15144 error "swap $file1 $file2 layouts failed"
15146 lovea2=$(get_layout_param $file2)
15149 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
15151 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
15152 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
15154 run_test 184d "allow stripeless layouts swap"
15157 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
15158 skip "Need MDS version at least 2.6.94"
15159 check_swap_layouts_support
15160 [ -z "$(which getfattr 2>/dev/null)" ] &&
15161 skip_env "no getfattr command"
15163 local file1=$DIR/$tdir/$tfile-1
15164 local file2=$DIR/$tdir/$tfile-2
15165 local file3=$DIR/$tdir/$tfile-3
15168 mkdir -p $DIR/$tdir
15169 touch $file1 || error "create $file1 failed"
15170 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
15171 error "create $file2 failed"
15172 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
15173 error "create $file3 failed"
15175 $LFS swap_layouts $file1 $file2 ||
15176 error "swap $file1 $file2 layouts failed"
15178 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
15179 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
15181 echo 123 > $file1 || error "Should be able to write into $file1"
15183 $LFS swap_layouts $file1 $file3 ||
15184 error "swap $file1 $file3 layouts failed"
15186 echo 123 > $file1 || error "Should be able to write into $file1"
15188 rm -rf $file1 $file2 $file3
15190 run_test 184e "Recreate layout after stripeless layout swaps"
15193 # Create a file with name longer than sizeof(struct stat) ==
15194 # 144 to see if we can get chars from the file name to appear
15195 # in the returned striping. Note that 'f' == 0x66.
15196 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
15198 mkdir -p $DIR/$tdir
15199 mcreate $DIR/$tdir/$file
15200 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
15201 error "IOC_MDC_GETFILEINFO returned garbage striping"
15204 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
15206 test_185() { # LU-2441
15207 # LU-3553 - no volatile file support in old servers
15208 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
15209 skip "Need MDS version at least 2.3.60"
15211 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
15212 touch $DIR/$tdir/spoo
15213 local mtime1=$(stat -c "%Y" $DIR/$tdir)
15214 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
15215 error "cannot create/write a volatile file"
15216 [ "$FILESET" == "" ] &&
15217 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
15218 error "FID is still valid after close"
15220 multiop_bg_pause $DIR/$tdir vVw4096_c
15227 # assume that the next FID for this client is sequential, since stdout
15228 # is unfortunately eaten by multiop_bg_pause
15229 local n=$((${fidv[1]} + 1))
15230 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
15231 if [ "$FILESET" == "" ]; then
15232 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
15233 error "FID is missing before close"
15235 kill -USR1 $multi_pid
15236 # 1 second delay, so if mtime change we will see it
15238 local mtime2=$(stat -c "%Y" $DIR/$tdir)
15239 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
15241 run_test 185 "Volatile file support"
15243 function create_check_volatile() {
15247 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
15250 local FID=$(cat /tmp/${tfile}.fid)
15251 [ "$FID" == "" ] && error "can't get FID for volatile"
15252 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
15253 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
15254 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
15258 cancel_lru_locks mdc # flush opencache
15259 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
15264 # LU-12516 - volatile creation via .lustre
15265 [[ $MDS1_VERSION -ge $(version_code 2.12.55) ]] ||
15266 skip "Need MDS version at least 2.3.55"
15268 create_check_volatile 0
15269 [ $MDSCOUNT -lt 2 ] && return 0
15272 create_check_volatile 1
15276 run_test 185a "Volatile file creation in .lustre/fid/"
15279 remote_mds_nodsh && skip "remote MDS with nodsh"
15280 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
15281 skip "Need MDS version at least 2.3.0"
15283 local dir0=$DIR/$tdir/$testnum
15284 mkdir -p $dir0 || error "creating dir $dir0"
15286 local file=$dir0/file1
15287 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
15288 local dv1=$($LFS data_version $file)
15289 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
15290 local dv2=$($LFS data_version $file)
15291 [[ $dv1 != $dv2 ]] ||
15292 error "data version did not change on write $dv1 == $dv2"
15297 run_test 187a "Test data version change"
15300 remote_mds_nodsh && skip "remote MDS with nodsh"
15301 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
15302 skip "Need MDS version at least 2.3.0"
15304 local dir0=$DIR/$tdir/$testnum
15305 mkdir -p $dir0 || error "creating dir $dir0"
15307 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
15308 [[ ${DV[0]} != ${DV[1]} ]] ||
15309 error "data version did not change on write"\
15310 " ${DV[0]} == ${DV[1]}"
15315 run_test 187b "Test data version change on volatile file"
15318 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15319 remote_mgs_nodsh && skip "remote MGS with nodsh"
15320 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
15322 local POOL=${POOL:-cea1}
15323 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
15324 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
15327 local last_ost=$(($OSTCOUNT - 1))
15329 local ost_list=$(seq $first_ost $ost_step $last_ost)
15330 local ost_range="$first_ost $last_ost $ost_step"
15331 local test_path=$POOL_ROOT/$POOL_DIR_NAME
15332 local file_dir=$POOL_ROOT/file_tst
15333 local subdir=$test_path/subdir
15337 # former test_200a test_200b
15338 pool_add $POOL || { rc=$? ; break; }
15339 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
15340 # former test_200c test_200d
15341 mkdir -p $test_path
15342 pool_set_dir $POOL $test_path || { rc=$? ; break; }
15343 pool_check_dir $POOL $test_path || { rc=$? ; break; }
15345 pool_check_dir $POOL $subdir || { rc=$? ; break; }
15346 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
15347 || { rc=$? ; break; }
15348 # former test_200e test_200f
15349 local files=$((OSTCOUNT*3))
15350 pool_alloc_files $POOL $test_path $files "$ost_list" \
15351 || { rc=$? ; break; }
15352 pool_create_files $POOL $file_dir $files "$ost_list" \
15353 || { rc=$? ; break; }
15354 # former test_200g test_200h
15355 pool_lfs_df $POOL || { rc=$? ; break; }
15356 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
15358 # former test_201a test_201b test_201c
15359 pool_remove_first_target $POOL || { rc=$? ; break; }
15361 local f=$test_path/$tfile
15362 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
15363 pool_remove $POOL $f || { rc=$? ; break; }
15371 run_test 200 "OST pools"
15373 # usage: default_attr <count | size | offset>
15375 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
15378 # usage: check_default_stripe_attr
15379 check_default_stripe_attr() {
15380 ACTUAL=$($LFS getstripe $* $DIR/$tdir)
15383 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
15385 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
15389 error "unknown getstripe attr '$1'"
15392 [ $ACTUAL == $EXPECTED ] ||
15393 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
15397 test_mkdir $DIR/$tdir
15398 $LFS setstripe --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
15400 check_default_stripe_attr --stripe-count
15401 check_default_stripe_attr --stripe-size
15402 check_default_stripe_attr --stripe-index
15404 run_test 204a "Print default stripe attributes"
15407 test_mkdir $DIR/$tdir
15408 $LFS setstripe --stripe-count 1 $DIR/$tdir
15410 check_default_stripe_attr --stripe-size
15411 check_default_stripe_attr --stripe-index
15413 run_test 204b "Print default stripe size and offset"
15416 test_mkdir $DIR/$tdir
15417 $LFS setstripe --stripe-size 65536 $DIR/$tdir
15419 check_default_stripe_attr --stripe-count
15420 check_default_stripe_attr --stripe-index
15422 run_test 204c "Print default stripe count and offset"
15425 test_mkdir $DIR/$tdir
15426 $LFS setstripe --stripe-index 0 $DIR/$tdir
15428 check_default_stripe_attr --stripe-count
15429 check_default_stripe_attr --stripe-size
15431 run_test 204d "Print default stripe count and size"
15434 test_mkdir $DIR/$tdir
15435 $LFS setstripe -d $DIR/$tdir
15437 check_default_stripe_attr --stripe-count --raw
15438 check_default_stripe_attr --stripe-size --raw
15439 check_default_stripe_attr --stripe-index --raw
15441 run_test 204e "Print raw stripe attributes"
15444 test_mkdir $DIR/$tdir
15445 $LFS setstripe --stripe-count 1 $DIR/$tdir
15447 check_default_stripe_attr --stripe-size --raw
15448 check_default_stripe_attr --stripe-index --raw
15450 run_test 204f "Print raw stripe size and offset"
15453 test_mkdir $DIR/$tdir
15454 $LFS setstripe --stripe-size 65536 $DIR/$tdir
15456 check_default_stripe_attr --stripe-count --raw
15457 check_default_stripe_attr --stripe-index --raw
15459 run_test 204g "Print raw stripe count and offset"
15462 test_mkdir $DIR/$tdir
15463 $LFS setstripe --stripe-index 0 $DIR/$tdir
15465 check_default_stripe_attr --stripe-count --raw
15466 check_default_stripe_attr --stripe-size --raw
15468 run_test 204h "Print raw stripe count and size"
15470 # Figure out which job scheduler is being used, if any,
15471 # or use a fake one
15472 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
15473 JOBENV=SLURM_JOB_ID
15474 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
15476 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
15478 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
15479 JOBENV=LOADL_STEP_ID
15480 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
15483 $LCTL list_param jobid_name > /dev/null 2>&1
15484 if [ $? -eq 0 ]; then
15490 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
15492 verify_jobstats() {
15497 # we don't really need to clear the stats for this test to work, since each
15498 # command has a unique jobid, but it makes debugging easier if needed.
15499 # for facet in $facets; do
15500 # local dev=$(convert_facet2label $facet)
15501 # # clear old jobstats
15502 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
15505 # use a new JobID for each test, or we might see an old one
15506 [ "$JOBENV" = "FAKE_JOBID" ] &&
15507 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
15509 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
15511 [ "$JOBENV" = "nodelocal" ] && {
15512 FAKE_JOBID=id.$testnum.%e.$RANDOM
15513 $LCTL set_param jobid_name=$FAKE_JOBID
15514 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
15517 log "Test: ${cmd[*]}"
15518 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
15520 if [ $JOBENV = "FAKE_JOBID" ]; then
15521 FAKE_JOBID=$JOBVAL ${cmd[*]}
15526 # all files are created on OST0000
15527 for facet in $facets; do
15528 local stats="*.$(convert_facet2label $facet).job_stats"
15530 # strip out libtool wrappers for in-tree executables
15531 if [ $(do_facet $facet lctl get_param $stats |
15532 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
15533 do_facet $facet lctl get_param $stats
15534 error "No jobstats for $JOBVAL found on $facet::$stats"
15540 local new_jobenv=$1
15542 set_persistent_param_and_check client "jobid_var" \
15543 "$FSNAME.sys.jobid_var" $new_jobenv
15546 test_205a() { # Job stats
15547 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15548 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
15549 skip "Need MDS version with at least 2.7.1"
15550 remote_mgs_nodsh && skip "remote MGS with nodsh"
15551 remote_mds_nodsh && skip "remote MDS with nodsh"
15552 remote_ost_nodsh && skip "remote OST with nodsh"
15553 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
15554 skip "Server doesn't support jobstats"
15555 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
15557 local old_jobenv=$($LCTL get_param -n jobid_var)
15558 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
15560 if [[ $PERM_CMD == *"set_param -P"* ]]; then
15561 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
15563 stack_trap "do_facet mgs $PERM_CMD \
15564 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
15568 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
15569 mdt.*.job_cleanup_interval | head -n 1)
15570 local new_interval=5
15571 do_facet $SINGLEMDS \
15572 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
15573 stack_trap "do_facet $SINGLEMDS \
15574 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
15575 local start=$SECONDS
15579 cmd="mkdir $DIR/$tdir"
15580 verify_jobstats "$cmd" "$SINGLEMDS"
15582 cmd="rmdir $DIR/$tdir"
15583 verify_jobstats "$cmd" "$SINGLEMDS"
15584 # mkdir on secondary MDT
15585 if [ $MDSCOUNT -gt 1 ]; then
15586 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
15587 verify_jobstats "$cmd" "mds2"
15590 cmd="mknod $DIR/$tfile c 1 3"
15591 verify_jobstats "$cmd" "$SINGLEMDS"
15593 cmd="rm -f $DIR/$tfile"
15594 verify_jobstats "$cmd" "$SINGLEMDS"
15595 # create all files on OST0000 so verify_jobstats can find OST stats
15597 cmd="$LFS setstripe -i 0 -c 1 $DIR/$tfile"
15598 verify_jobstats "$cmd" "$SINGLEMDS"
15600 cmd="touch $DIR/$tfile"
15601 verify_jobstats "$cmd" "$SINGLEMDS ost1"
15603 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
15604 verify_jobstats "$cmd" "ost1"
15606 cancel_lru_locks osc
15607 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
15608 verify_jobstats "$cmd" "ost1"
15610 cmd="$TRUNCATE $DIR/$tfile 0"
15611 verify_jobstats "$cmd" "$SINGLEMDS ost1"
15613 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
15614 verify_jobstats "$cmd" "$SINGLEMDS"
15615 # jobstats expiry - sleep until old stats should be expired
15616 local left=$((new_interval + 5 - (SECONDS - start)))
15617 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
15618 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
15620 cmd="mkdir $DIR/$tdir.expire"
15621 verify_jobstats "$cmd" "$SINGLEMDS"
15622 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
15623 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
15625 # Ensure that jobid are present in changelog (if supported by MDS)
15626 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
15627 changelog_dump | tail -10
15628 jobids=$(changelog_dump | tail -9 | grep -c "j=")
15629 [ $jobids -eq 9 ] ||
15630 error "Wrong changelog jobid count $jobids != 9"
15634 jobstats_set $JOBENV
15636 changelog_dump | grep $tfile
15637 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
15638 [ $jobids -eq 0 ] ||
15639 error "Unexpected jobids when jobid_var=$JOBENV"
15642 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
15643 JOBENV="JOBCOMPLEX"
15644 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
15646 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
15648 run_test 205a "Verify job stats"
15652 $LCTL set_param jobid_var=USER jobid_name="%e.%u"
15653 env -i USERTESTJOBSTATS=foolish touch $DIR/$tfile.1
15654 do_facet $SINGLEMDS $LCTL get_param mdt.*.job_stats |
15655 grep job_id: | grep foolish &&
15656 error "Unexpected jobid found"
15659 run_test 205b "Verify job stats jobid parsing"
15661 # LU-1480, LU-1773 and LU-1657
15663 mkdir -p $DIR/$tdir
15664 $LFS setstripe -c -1 $DIR/$tdir
15665 #define OBD_FAIL_LOV_INIT 0x1403
15666 $LCTL set_param fail_loc=0xa0001403
15667 $LCTL set_param fail_val=1
15668 touch $DIR/$tdir/$tfile || true
15670 run_test 206 "fail lov_init_raid0() doesn't lbug"
15673 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15674 local fsz=`stat -c %s $DIR/$tfile`
15675 cancel_lru_locks mdc
15677 # do not return layout in getattr intent
15678 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
15679 $LCTL set_param fail_loc=0x170
15680 local sz=`stat -c %s $DIR/$tfile`
15682 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
15686 run_test 207a "can refresh layout at glimpse"
15689 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15690 local cksum=`md5sum $DIR/$tfile`
15691 local fsz=`stat -c %s $DIR/$tfile`
15692 cancel_lru_locks mdc
15693 cancel_lru_locks osc
15695 # do not return layout in getattr intent
15696 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
15697 $LCTL set_param fail_loc=0x171
15699 # it will refresh layout after the file is opened but before read issues
15700 echo checksum is "$cksum"
15701 echo "$cksum" |md5sum -c --quiet || error "file differs"
15705 run_test 207b "can refresh layout at open"
15708 # FIXME: in this test suite, only RD lease is used. This is okay
15709 # for now as only exclusive open is supported. After generic lease
15710 # is done, this test suite should be revised. - Jinshan
15712 remote_mds_nodsh && skip "remote MDS with nodsh"
15713 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
15714 skip "Need MDS version at least 2.4.52"
15716 echo "==== test 1: verify get lease work"
15717 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
15719 echo "==== test 2: verify lease can be broken by upcoming open"
15720 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15724 $MULTIOP $DIR/$tfile oO_RDONLY:c
15725 kill -USR1 $PID && wait $PID || error "break lease error"
15727 echo "==== test 3: verify lease can't be granted if an open already exists"
15728 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
15732 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
15733 kill -USR1 $PID && wait $PID || error "open file error"
15735 echo "==== test 4: lease can sustain over recovery"
15736 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
15742 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
15744 echo "==== test 5: lease broken can't be regained by replay"
15745 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15749 # open file to break lease and then recovery
15750 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
15753 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
15757 run_test 208 "Exclusive open"
15760 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
15761 skip_env "must have disp_stripe"
15764 sync; sleep 5; sync;
15766 echo 3 > /proc/sys/vm/drop_caches
15767 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15769 # open/close 500 times
15770 for i in $(seq 500); do
15774 echo 3 > /proc/sys/vm/drop_caches
15775 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15777 echo "before: $req_before, after: $req_after"
15778 [ $((req_after - req_before)) -ge 300 ] &&
15779 error "open/close requests are not freed"
15782 run_test 209 "read-only open/close requests should be freed promptly"
15786 size=$((size % 8192 + 1))
15787 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
15788 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
15789 rm -f $DIR/f212 $DIR/f212.xyz
15791 run_test 212 "Sendfile test ============================================"
15794 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
15795 cancel_lru_locks osc
15796 lctl set_param fail_loc=0x8000040f
15797 # generate a read lock
15798 cat $DIR/$tfile > /dev/null
15799 # write to the file, it will try to cancel the above read lock.
15800 cat /etc/hosts >> $DIR/$tfile
15802 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
15804 test_214() { # for bug 20133
15805 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
15806 for (( i=0; i < 340; i++ )) ; do
15807 touch $DIR/$tdir/d214c/a$i
15810 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
15811 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
15812 ls $DIR/d214c || error "ls $DIR/d214c failed"
15813 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
15814 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
15816 run_test 214 "hash-indexed directory test - bug 20133"
15818 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
15819 create_lnet_proc_files() {
15820 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
15823 # counterpart of create_lnet_proc_files
15824 remove_lnet_proc_files() {
15825 rm -f $TMP/lnet_$1.sys
15828 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15829 # 3rd arg as regexp for body
15830 check_lnet_proc_stats() {
15831 local l=$(cat "$TMP/lnet_$1" |wc -l)
15832 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
15834 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
15837 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15838 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
15839 # optional and can be regexp for 2nd line (lnet.routes case)
15840 check_lnet_proc_entry() {
15841 local blp=2 # blp stands for 'position of 1st line of body'
15842 [ -z "$5" ] || blp=3 # lnet.routes case
15844 local l=$(cat "$TMP/lnet_$1" |wc -l)
15845 # subtracting one from $blp because the body can be empty
15846 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
15848 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
15849 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
15851 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
15852 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
15854 # bail out if any unexpected line happened
15855 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
15856 [ "$?" != 0 ] || error "$2 misformatted"
15859 test_215() { # for bugs 18102, 21079, 21517
15860 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15862 local N='(0|[1-9][0-9]*)' # non-negative numeric
15863 local P='[1-9][0-9]*' # positive numeric
15864 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
15865 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
15866 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
15867 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
15869 local L1 # regexp for 1st line
15870 local L2 # regexp for 2nd line (optional)
15871 local BR # regexp for the rest (body)
15873 # lnet.stats should look as 11 space-separated non-negative numerics
15874 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
15875 create_lnet_proc_files "stats"
15876 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
15877 remove_lnet_proc_files "stats"
15879 # lnet.routes should look like this:
15880 # Routing disabled/enabled
15881 # net hops priority state router
15882 # where net is a string like tcp0, hops > 0, priority >= 0,
15883 # state is up/down,
15884 # router is a string like 192.168.1.1@tcp2
15885 L1="^Routing (disabled|enabled)$"
15886 L2="^net +hops +priority +state +router$"
15887 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
15888 create_lnet_proc_files "routes"
15889 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
15890 remove_lnet_proc_files "routes"
15892 # lnet.routers should look like this:
15893 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
15894 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
15895 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
15896 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
15897 L1="^ref +rtr_ref +alive +router$"
15898 BR="^$P +$P +(up|down) +$NID$"
15899 create_lnet_proc_files "routers"
15900 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
15901 remove_lnet_proc_files "routers"
15903 # lnet.peers should look like this:
15904 # nid refs state last max rtr min tx min queue
15905 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
15906 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
15907 # numeric (0 or >0 or <0), queue >= 0.
15908 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
15909 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
15910 create_lnet_proc_files "peers"
15911 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
15912 remove_lnet_proc_files "peers"
15914 # lnet.buffers should look like this:
15915 # pages count credits min
15916 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
15917 L1="^pages +count +credits +min$"
15918 BR="^ +$N +$N +$I +$I$"
15919 create_lnet_proc_files "buffers"
15920 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
15921 remove_lnet_proc_files "buffers"
15923 # lnet.nis should look like this:
15924 # nid status alive refs peer rtr max tx min
15925 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
15926 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
15927 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
15928 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
15929 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
15930 create_lnet_proc_files "nis"
15931 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
15932 remove_lnet_proc_files "nis"
15934 # can we successfully write to lnet.stats?
15935 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
15937 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
15939 test_216() { # bug 20317
15940 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15941 remote_ost_nodsh && skip "remote OST with nodsh"
15944 local facets=$(get_facets OST)
15945 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15947 save_lustre_params client "osc.*.contention_seconds" > $p
15948 save_lustre_params $facets \
15949 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
15950 save_lustre_params $facets \
15951 "ldlm.namespaces.filter-*.contended_locks" >> $p
15952 save_lustre_params $facets \
15953 "ldlm.namespaces.filter-*.contention_seconds" >> $p
15954 clear_stats osc.*.osc_stats
15956 # agressive lockless i/o settings
15957 do_nodes $(comma_list $(osts_nodes)) \
15958 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
15959 ldlm.namespaces.filter-*.contended_locks=0 \
15960 ldlm.namespaces.filter-*.contention_seconds=60"
15961 lctl set_param -n osc.*.contention_seconds=60
15963 $DIRECTIO write $DIR/$tfile 0 10 4096
15964 $CHECKSTAT -s 40960 $DIR/$tfile
15966 # disable lockless i/o
15967 do_nodes $(comma_list $(osts_nodes)) \
15968 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
15969 ldlm.namespaces.filter-*.contended_locks=32 \
15970 ldlm.namespaces.filter-*.contention_seconds=0"
15971 lctl set_param -n osc.*.contention_seconds=0
15972 clear_stats osc.*.osc_stats
15974 dd if=/dev/zero of=$DIR/$tfile count=0
15975 $CHECKSTAT -s 0 $DIR/$tfile
15977 restore_lustre_params <$p
15981 run_test 216 "check lockless direct write updates file size and kms correctly"
15983 test_217() { # bug 22430
15984 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15989 for node in $(nodes_list); do
15990 nid=$(host_nids_address $node $NETTYPE)
15991 if [[ $nid = *-* ]] ; then
15992 echo "lctl ping $(h2nettype $nid)"
15993 lctl ping $(h2nettype $nid)
15995 echo "skipping $node (no hyphen detected)"
15999 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
16002 # do directio so as not to populate the page cache
16003 log "creating a 10 Mb file"
16004 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
16005 log "starting reads"
16006 dd if=$DIR/$tfile of=/dev/null bs=4096 &
16007 log "truncating the file"
16008 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
16010 kill %+ || true # reads might have finished
16011 echo "wait until dd is finished"
16013 log "removing the temporary file"
16014 rm -rf $DIR/$tfile || error "tmp file removal failed"
16016 run_test 218 "parallel read and truncate should not deadlock"
16019 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16021 # write one partial page
16022 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
16023 # set no grant so vvp_io_commit_write will do sync write
16024 $LCTL set_param fail_loc=0x411
16025 # write a full page at the end of file
16026 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
16028 $LCTL set_param fail_loc=0
16029 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
16030 $LCTL set_param fail_loc=0x411
16031 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
16034 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
16035 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
16037 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
16039 test_220() { #LU-325
16040 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16041 remote_ost_nodsh && skip "remote OST with nodsh"
16042 remote_mds_nodsh && skip "remote MDS with nodsh"
16043 remote_mgs_nodsh && skip "remote MGS with nodsh"
16047 # create on MDT0000 so the last_id and next_id are correct
16049 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
16053 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
16054 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
16055 osp.$mdtosc_proc1.prealloc_last_id)
16056 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
16057 osp.$mdtosc_proc1.prealloc_next_id)
16061 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
16062 #define OBD_FAIL_OST_ENOINO 0x229
16063 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
16064 create_pool $FSNAME.$TESTNAME || return 1
16065 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
16067 $LFS setstripe $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
16069 MDSOBJS=$((last_id - next_id))
16070 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
16072 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
16073 echo "OST still has $count kbytes free"
16075 echo "create $MDSOBJS files @next_id..."
16076 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
16078 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
16079 osp.$mdtosc_proc1.prealloc_last_id)
16080 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
16081 osp.$mdtosc_proc1.prealloc_next_id)
16083 echo "after creation, last_id=$last_id2, next_id=$next_id2"
16088 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
16089 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
16091 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
16092 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
16093 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
16094 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
16095 echo "unlink $MDSOBJS files @$next_id..."
16096 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
16098 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
16101 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16103 dd if=`which date` of=$MOUNT/date oflag=sync
16104 chmod +x $MOUNT/date
16106 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
16107 $LCTL set_param fail_loc=0x80001401
16109 $MOUNT/date > /dev/null
16112 run_test 221 "make sure fault and truncate race to not cause OOM"
16115 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16118 test_mkdir $DIR/$tdir
16119 $LFS setstripe -c 1 -i 0 $DIR/$tdir
16120 createmany -o $DIR/$tdir/$tfile 10
16121 cancel_lru_locks mdc
16122 cancel_lru_locks osc
16123 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
16124 $LCTL set_param fail_loc=0x31a
16125 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
16126 $LCTL set_param fail_loc=0
16129 run_test 222a "AGL for ls should not trigger CLIO lock failure"
16132 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16135 test_mkdir $DIR/$tdir
16136 $LFS setstripe -c 1 -i 0 $DIR/$tdir
16137 createmany -o $DIR/$tdir/$tfile 10
16138 cancel_lru_locks mdc
16139 cancel_lru_locks osc
16140 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
16141 $LCTL set_param fail_loc=0x31a
16142 rm -r $DIR/$tdir || error "AGL for rmdir failed"
16143 $LCTL set_param fail_loc=0
16145 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
16148 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16151 test_mkdir $DIR/$tdir
16152 $LFS setstripe -c 1 -i 0 $DIR/$tdir
16153 createmany -o $DIR/$tdir/$tfile 10
16154 cancel_lru_locks mdc
16155 cancel_lru_locks osc
16156 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
16157 $LCTL set_param fail_loc=0x31b
16158 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
16159 $LCTL set_param fail_loc=0
16162 run_test 223 "osc reenqueue if without AGL lock granted ======================="
16164 test_224a() { # LU-1039, MRP-303
16165 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16167 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
16168 $LCTL set_param fail_loc=0x508
16169 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
16170 $LCTL set_param fail_loc=0
16173 run_test 224a "Don't panic on bulk IO failure"
16175 test_224b() { # LU-1039, MRP-303
16176 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16178 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
16179 cancel_lru_locks osc
16180 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
16181 $LCTL set_param fail_loc=0x515
16182 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
16183 $LCTL set_param fail_loc=0
16186 run_test 224b "Don't panic on bulk IO failure"
16188 test_224c() { # LU-6441
16189 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16190 remote_mds_nodsh && skip "remote MDS with nodsh"
16192 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
16193 save_writethrough $p
16194 set_cache writethrough on
16196 local pages_per_rpc=$($LCTL get_param osc.*.max_pages_per_rpc)
16197 local at_max=$($LCTL get_param -n at_max)
16198 local timeout=$($LCTL get_param -n timeout)
16199 local test_at="at_max"
16200 local param_at="$FSNAME.sys.at_max"
16201 local test_timeout="timeout"
16202 local param_timeout="$FSNAME.sys.timeout"
16204 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
16206 set_persistent_param_and_check client "$test_at" "$param_at" 0
16207 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
16209 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
16210 do_facet ost1 "$LCTL set_param fail_loc=0x520"
16211 $LFS setstripe -c 1 -i 0 $DIR/$tfile
16212 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
16214 do_facet ost1 "$LCTL set_param fail_loc=0"
16216 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
16217 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
16220 $LCTL set_param -n $pages_per_rpc
16221 restore_lustre_params < $p
16224 run_test 224c "Don't hang if one of md lost during large bulk RPC"
16226 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
16228 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16229 if [ -z ${MDSSURVEY} ]; then
16230 skip_env "mds-survey not found"
16232 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
16233 skip "Need MDS version at least 2.2.51"
16235 local mds=$(facet_host $SINGLEMDS)
16236 local target=$(do_nodes $mds 'lctl dl' |
16237 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
16239 local cmd1="file_count=1000 thrhi=4"
16240 local cmd2="dir_count=2 layer=mdd stripe_count=0"
16241 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
16242 local cmd="$cmd1 $cmd2 $cmd3"
16244 rm -f ${TMP}/mds_survey*
16246 eval $cmd || error "mds-survey with zero-stripe failed"
16247 cat ${TMP}/mds_survey*
16248 rm -f ${TMP}/mds_survey*
16250 run_test 225a "Metadata survey sanity with zero-stripe"
16253 if [ -z ${MDSSURVEY} ]; then
16254 skip_env "mds-survey not found"
16256 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
16257 skip "Need MDS version at least 2.2.51"
16258 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16259 remote_mds_nodsh && skip "remote MDS with nodsh"
16260 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
16261 skip_env "Need to mount OST to test"
16264 local mds=$(facet_host $SINGLEMDS)
16265 local target=$(do_nodes $mds 'lctl dl' |
16266 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
16268 local cmd1="file_count=1000 thrhi=4"
16269 local cmd2="dir_count=2 layer=mdd stripe_count=1"
16270 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
16271 local cmd="$cmd1 $cmd2 $cmd3"
16273 rm -f ${TMP}/mds_survey*
16275 eval $cmd || error "mds-survey with stripe_count failed"
16276 cat ${TMP}/mds_survey*
16277 rm -f ${TMP}/mds_survey*
16279 run_test 225b "Metadata survey sanity with stripe_count = 1"
16281 mcreate_path2fid () {
16287 local path=$DIR/$tdir/$name
16292 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
16293 error "cannot create $desc"
16295 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
16297 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
16299 fid_path=$($LFS fid2path $MOUNT $fid)
16301 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
16303 [ "$path" == "$fid_path" ] ||
16304 error "fid2path returned $fid_path, expected $path"
16306 echo "pass with $path and $fid"
16311 mkdir -p $DIR/$tdir
16313 mcreate_path2fid 0010666 0 0 fifo "FIFO"
16314 mcreate_path2fid 0020666 1 3 null "character special file (null)"
16315 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
16316 mcreate_path2fid 0040666 0 0 dir "directory"
16317 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
16318 mcreate_path2fid 0100666 0 0 file "regular file"
16319 mcreate_path2fid 0120666 0 0 link "symbolic link"
16320 mcreate_path2fid 0140666 0 0 sock "socket"
16322 run_test 226a "call path2fid and fid2path on files of all type"
16325 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16330 mkdir -p $DIR/$tdir
16331 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
16332 error "create remote directory failed"
16333 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
16334 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
16335 "character special file (null)"
16336 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
16337 "character special file (no device)"
16338 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
16339 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
16340 "block special file (loop)"
16341 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
16342 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
16343 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
16345 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
16347 # LU-1299 Executing or running ldd on a truncated executable does not
16348 # cause an out-of-memory condition.
16350 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16351 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
16353 dd if=$(which date) of=$MOUNT/date bs=1k count=1
16354 chmod +x $MOUNT/date
16356 $MOUNT/date > /dev/null
16357 ldd $MOUNT/date > /dev/null
16360 run_test 227 "running truncated executable does not cause OOM"
16362 # LU-1512 try to reuse idle OI blocks
16364 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16365 remote_mds_nodsh && skip "remote MDS with nodsh"
16366 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
16368 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
16369 local myDIR=$DIR/$tdir
16372 #define OBD_FAIL_SEQ_EXHAUST 0x1002
16373 $LCTL set_param fail_loc=0x80001002
16374 createmany -o $myDIR/t- 10000
16375 $LCTL set_param fail_loc=0
16376 # The guard is current the largest FID holder
16378 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
16380 local IDX=$(($SEQ % 64))
16382 do_facet $SINGLEMDS sync
16383 # Make sure journal flushed.
16385 local blk1=$(do_facet $SINGLEMDS \
16386 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
16387 grep Blockcount | awk '{print $4}')
16389 # Remove old files, some OI blocks will become idle.
16390 unlinkmany $myDIR/t- 10000
16391 # Create new files, idle OI blocks should be reused.
16392 createmany -o $myDIR/t- 2000
16393 do_facet $SINGLEMDS sync
16394 # Make sure journal flushed.
16396 local blk2=$(do_facet $SINGLEMDS \
16397 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
16398 grep Blockcount | awk '{print $4}')
16400 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
16402 run_test 228a "try to reuse idle OI blocks"
16405 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16406 remote_mds_nodsh && skip "remote MDS with nodsh"
16407 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
16409 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
16410 local myDIR=$DIR/$tdir
16413 #define OBD_FAIL_SEQ_EXHAUST 0x1002
16414 $LCTL set_param fail_loc=0x80001002
16415 createmany -o $myDIR/t- 10000
16416 $LCTL set_param fail_loc=0
16417 # The guard is current the largest FID holder
16419 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
16421 local IDX=$(($SEQ % 64))
16423 do_facet $SINGLEMDS sync
16424 # Make sure journal flushed.
16426 local blk1=$(do_facet $SINGLEMDS \
16427 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
16428 grep Blockcount | awk '{print $4}')
16430 # Remove old files, some OI blocks will become idle.
16431 unlinkmany $myDIR/t- 10000
16434 stop $SINGLEMDS || error "Fail to stop MDT."
16436 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
16438 df $MOUNT || error "Fail to df."
16439 # Create new files, idle OI blocks should be reused.
16440 createmany -o $myDIR/t- 2000
16441 do_facet $SINGLEMDS sync
16442 # Make sure journal flushed.
16444 local blk2=$(do_facet $SINGLEMDS \
16445 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
16446 grep Blockcount | awk '{print $4}')
16448 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
16450 run_test 228b "idle OI blocks can be reused after MDT restart"
16454 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16455 remote_mds_nodsh && skip "remote MDS with nodsh"
16456 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
16458 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
16459 local myDIR=$DIR/$tdir
16462 #define OBD_FAIL_SEQ_EXHAUST 0x1002
16463 $LCTL set_param fail_loc=0x80001002
16464 # 20000 files can guarantee there are index nodes in the OI file
16465 createmany -o $myDIR/t- 20000
16466 $LCTL set_param fail_loc=0
16467 # The guard is current the largest FID holder
16469 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
16471 local IDX=$(($SEQ % 64))
16473 do_facet $SINGLEMDS sync
16474 # Make sure journal flushed.
16476 local blk1=$(do_facet $SINGLEMDS \
16477 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
16478 grep Blockcount | awk '{print $4}')
16480 # Remove old files, some OI blocks will become idle.
16481 unlinkmany $myDIR/t- 20000
16483 # The OI file should become empty now
16485 # Create new files, idle OI blocks should be reused.
16486 createmany -o $myDIR/t- 2000
16487 do_facet $SINGLEMDS sync
16488 # Make sure journal flushed.
16490 local blk2=$(do_facet $SINGLEMDS \
16491 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
16492 grep Blockcount | awk '{print $4}')
16494 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
16496 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
16498 test_229() { # LU-2482, LU-3448
16499 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16500 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
16501 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
16502 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
16506 # Create a file with a released layout and stripe count 2.
16507 $MULTIOP $DIR/$tfile H2c ||
16508 error "failed to create file with released layout"
16510 $LFS getstripe -v $DIR/$tfile
16512 local pattern=$($LFS getstripe -L $DIR/$tfile)
16513 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
16515 local stripe_count=$($LFS getstripe -c $DIR/$tfile) ||
16517 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
16518 stat $DIR/$tfile || error "failed to stat released file"
16520 chown $RUNAS_ID $DIR/$tfile ||
16521 error "chown $RUNAS_ID $DIR/$tfile failed"
16523 chgrp $RUNAS_ID $DIR/$tfile ||
16524 error "chgrp $RUNAS_ID $DIR/$tfile failed"
16526 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
16527 rm $DIR/$tfile || error "failed to remove released file"
16529 run_test 229 "getstripe/stat/rm/attr changes work on released files"
16532 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16533 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16534 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16535 skip "Need MDS version at least 2.11.52"
16539 test_mkdir $DIR/$tdir
16540 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
16541 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
16542 [ $mdt_idx -ne 0 ] &&
16543 error "create local directory on wrong MDT $mdt_idx"
16545 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
16546 error "create remote directory failed"
16547 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
16548 [ $mdt_idx -ne $MDTIDX ] &&
16549 error "create remote directory on wrong MDT $mdt_idx"
16551 createmany -o $DIR/$tdir/test_230/t- 10 ||
16552 error "create files on remote directory failed"
16553 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
16554 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
16555 rm -r $DIR/$tdir || error "unlink remote directory failed"
16557 run_test 230a "Create remote directory and files under the remote directory"
16560 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16561 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16562 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16563 skip "Need MDS version at least 2.11.52"
16571 local migrate_dir=$DIR/$tdir/migrate_dir
16572 local other_dir=$DIR/$tdir/other_dir
16574 test_mkdir $DIR/$tdir
16575 test_mkdir -i0 -c1 $migrate_dir
16576 test_mkdir -i0 -c1 $other_dir
16577 for ((i=0; i<10; i++)); do
16578 mkdir -p $migrate_dir/dir_${i}
16579 createmany -o $migrate_dir/dir_${i}/f 10 ||
16580 error "create files under remote dir failed $i"
16583 cp /etc/passwd $migrate_dir/$tfile
16584 cp /etc/passwd $other_dir/$tfile
16585 chattr +SAD $migrate_dir
16586 chattr +SAD $migrate_dir/$tfile
16588 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16589 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16590 local old_dir_mode=$(stat -c%f $migrate_dir)
16591 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
16593 mkdir -p $migrate_dir/dir_default_stripe2
16594 $LFS setstripe -c 2 $migrate_dir/dir_default_stripe2
16595 $LFS setstripe -c 2 $migrate_dir/${tfile}_stripe2
16597 mkdir -p $other_dir
16598 ln $migrate_dir/$tfile $other_dir/luna
16599 ln $migrate_dir/$tfile $migrate_dir/sofia
16600 ln $other_dir/$tfile $migrate_dir/david
16601 ln -s $migrate_dir/$tfile $other_dir/zachary
16602 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
16603 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
16605 $LFS migrate -m $MDTIDX $migrate_dir ||
16606 error "fails on migrating remote dir to MDT1"
16608 echo "migratate to MDT1, then checking.."
16609 for ((i = 0; i < 10; i++)); do
16610 for file in $(find $migrate_dir/dir_${i}); do
16611 mdt_index=$($LFS getstripe -m $file)
16612 [ $mdt_index == $MDTIDX ] ||
16613 error "$file is not on MDT${MDTIDX}"
16617 # the multiple link file should still in MDT0
16618 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
16619 [ $mdt_index == 0 ] ||
16620 error "$file is not on MDT${MDTIDX}"
16622 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16623 [ "$old_dir_flag" = "$new_dir_flag" ] ||
16624 error " expect $old_dir_flag get $new_dir_flag"
16626 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16627 [ "$old_file_flag" = "$new_file_flag" ] ||
16628 error " expect $old_file_flag get $new_file_flag"
16630 local new_dir_mode=$(stat -c%f $migrate_dir)
16631 [ "$old_dir_mode" = "$new_dir_mode" ] ||
16632 error "expect mode $old_dir_mode get $new_dir_mode"
16634 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
16635 [ "$old_file_mode" = "$new_file_mode" ] ||
16636 error "expect mode $old_file_mode get $new_file_mode"
16638 diff /etc/passwd $migrate_dir/$tfile ||
16639 error "$tfile different after migration"
16641 diff /etc/passwd $other_dir/luna ||
16642 error "luna different after migration"
16644 diff /etc/passwd $migrate_dir/sofia ||
16645 error "sofia different after migration"
16647 diff /etc/passwd $migrate_dir/david ||
16648 error "david different after migration"
16650 diff /etc/passwd $other_dir/zachary ||
16651 error "zachary different after migration"
16653 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16654 error "${tfile}_ln different after migration"
16656 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16657 error "${tfile}_ln_other different after migration"
16659 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
16660 [ $stripe_count = 2 ] ||
16661 error "dir strpe_count $d != 2 after migration."
16663 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
16664 [ $stripe_count = 2 ] ||
16665 error "file strpe_count $d != 2 after migration."
16667 #migrate back to MDT0
16670 $LFS migrate -m $MDTIDX $migrate_dir ||
16671 error "fails on migrating remote dir to MDT0"
16673 echo "migrate back to MDT0, checking.."
16674 for file in $(find $migrate_dir); do
16675 mdt_index=$($LFS getstripe -m $file)
16676 [ $mdt_index == $MDTIDX ] ||
16677 error "$file is not on MDT${MDTIDX}"
16680 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16681 [ "$old_dir_flag" = "$new_dir_flag" ] ||
16682 error " expect $old_dir_flag get $new_dir_flag"
16684 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16685 [ "$old_file_flag" = "$new_file_flag" ] ||
16686 error " expect $old_file_flag get $new_file_flag"
16688 local new_dir_mode=$(stat -c%f $migrate_dir)
16689 [ "$old_dir_mode" = "$new_dir_mode" ] ||
16690 error "expect mode $old_dir_mode get $new_dir_mode"
16692 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
16693 [ "$old_file_mode" = "$new_file_mode" ] ||
16694 error "expect mode $old_file_mode get $new_file_mode"
16696 diff /etc/passwd ${migrate_dir}/$tfile ||
16697 error "$tfile different after migration"
16699 diff /etc/passwd ${other_dir}/luna ||
16700 error "luna different after migration"
16702 diff /etc/passwd ${migrate_dir}/sofia ||
16703 error "sofia different after migration"
16705 diff /etc/passwd ${other_dir}/zachary ||
16706 error "zachary different after migration"
16708 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16709 error "${tfile}_ln different after migration"
16711 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16712 error "${tfile}_ln_other different after migration"
16714 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
16715 [ $stripe_count = 2 ] ||
16716 error "dir strpe_count $d != 2 after migration."
16718 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
16719 [ $stripe_count = 2 ] ||
16720 error "file strpe_count $d != 2 after migration."
16722 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16724 run_test 230b "migrate directory"
16727 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16728 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16729 remote_mds_nodsh && skip "remote MDS with nodsh"
16730 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16731 skip "Need MDS version at least 2.11.52"
16737 local migrate_dir=$DIR/$tdir/migrate_dir
16739 #If migrating directory fails in the middle, all entries of
16740 #the directory is still accessiable.
16741 test_mkdir $DIR/$tdir
16742 test_mkdir -i0 -c1 $migrate_dir
16743 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
16745 createmany -o $migrate_dir/f $total ||
16746 error "create files under ${migrate_dir} failed"
16748 # fail after migrating top dir, and this will fail only once, so the
16749 # first sub file migration will fail (currently f3), others succeed.
16750 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
16751 do_facet mds1 lctl set_param fail_loc=0x1801
16752 local t=$(ls $migrate_dir | wc -l)
16753 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
16754 error "migrate should fail"
16755 local u=$(ls $migrate_dir | wc -l)
16756 [ "$u" == "$t" ] || error "$u != $t during migration"
16758 # add new dir/file should succeed
16759 mkdir $migrate_dir/dir ||
16760 error "mkdir failed under migrating directory"
16761 touch $migrate_dir/file ||
16762 error "create file failed under migrating directory"
16764 # add file with existing name should fail
16765 for file in $migrate_dir/f*; do
16766 stat $file > /dev/null || error "stat $file failed"
16767 $OPENFILE -f O_CREAT:O_EXCL $file &&
16768 error "open(O_CREAT|O_EXCL) $file should fail"
16769 $MULTIOP $file m && error "create $file should fail"
16770 touch $DIR/$tdir/remote_dir/$tfile ||
16771 error "touch $tfile failed"
16772 ln $DIR/$tdir/remote_dir/$tfile $file &&
16773 error "link $file should fail"
16774 mdt_index=$($LFS getstripe -m $file)
16775 if [ $mdt_index == 0 ]; then
16776 # file failed to migrate is not allowed to rename to
16777 mv $DIR/$tdir/remote_dir/$tfile $file &&
16778 error "rename to $file should fail"
16780 mv $DIR/$tdir/remote_dir/$tfile $file ||
16781 error "rename to $file failed"
16783 echo hello >> $file || error "write $file failed"
16786 # resume migration with different options should fail
16787 $LFS migrate -m 0 $migrate_dir &&
16788 error "migrate -m 0 $migrate_dir should fail"
16790 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
16791 error "migrate -c 2 $migrate_dir should fail"
16793 # resume migration should succeed
16794 $LFS migrate -m $MDTIDX $migrate_dir ||
16795 error "migrate $migrate_dir failed"
16797 echo "Finish migration, then checking.."
16798 for file in $(find $migrate_dir); do
16799 mdt_index=$($LFS getstripe -m $file)
16800 [ $mdt_index == $MDTIDX ] ||
16801 error "$file is not on MDT${MDTIDX}"
16804 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16806 run_test 230c "check directory accessiblity if migration failed"
16809 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16810 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16811 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16812 skip "Need MDS version at least 2.11.52"
16814 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
16816 local migrate_dir=$DIR/$tdir/migrate_dir
16826 old_index=$((RANDOM % MDSCOUNT))
16827 old_count=$((MDSCOUNT - old_index))
16828 new_index=$((RANDOM % MDSCOUNT))
16829 new_count=$((MDSCOUNT - new_index))
16830 new_hash="all_char"
16832 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
16833 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
16835 test_mkdir $DIR/$tdir
16836 test_mkdir -i $old_index -c $old_count $migrate_dir
16838 for ((i=0; i<100; i++)); do
16839 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
16840 createmany -o $migrate_dir/dir_${i}/f 100 ||
16841 error "create files under remote dir failed $i"
16844 echo -n "Migrate from MDT$old_index "
16845 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
16846 echo -n "to MDT$new_index"
16847 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
16850 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
16851 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
16852 error "migrate remote dir error"
16854 echo "Finish migration, then checking.."
16855 for file in $(find $migrate_dir); do
16856 mdt_index=$($LFS getstripe -m $file)
16857 if [ $mdt_index -lt $new_index ] ||
16858 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
16859 error "$file is on MDT$mdt_index"
16863 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16865 run_test 230d "check migrate big directory"
16868 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16869 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16870 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16871 skip "Need MDS version at least 2.11.52"
16878 mkdir -p $DIR/$tdir
16879 mkdir $DIR/$tdir/migrate_dir
16880 mkdir $DIR/$tdir/other_dir
16881 touch $DIR/$tdir/migrate_dir/a
16882 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
16883 ls $DIR/$tdir/other_dir
16885 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16886 error "migrate dir fails"
16888 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16889 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16891 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16892 [ $mdt_index == 0 ] || error "a is not on MDT0"
16894 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
16895 error "migrate dir fails"
16897 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
16898 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
16900 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16901 [ $mdt_index == 1 ] || error "a is not on MDT1"
16903 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
16904 [ $mdt_index == 1 ] || error "b is not on MDT1"
16906 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16907 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
16909 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
16911 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16913 run_test 230e "migrate mulitple local link files"
16916 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16917 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16918 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16919 skip "Need MDS version at least 2.11.52"
16924 mkdir -p $DIR/$tdir
16925 mkdir $DIR/$tdir/migrate_dir
16926 $LFS mkdir -i1 $DIR/$tdir/other_dir
16927 touch $DIR/$tdir/migrate_dir/a
16928 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
16929 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
16930 ls $DIR/$tdir/other_dir
16932 # a should be migrated to MDT1, since no other links on MDT0
16933 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16934 error "#1 migrate dir fails"
16935 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16936 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16937 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16938 [ $mdt_index == 1 ] || error "a is not on MDT1"
16940 # a should stay on MDT1, because it is a mulitple link file
16941 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16942 error "#2 migrate dir fails"
16943 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16944 [ $mdt_index == 1 ] || error "a is not on MDT1"
16946 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16947 error "#3 migrate dir fails"
16949 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16950 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
16951 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
16953 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
16954 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
16956 # a should be migrated to MDT0, since no other links on MDT1
16957 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16958 error "#4 migrate dir fails"
16959 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16960 [ $mdt_index == 0 ] || error "a is not on MDT0"
16962 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16964 run_test 230f "migrate mulitple remote link files"
16967 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16968 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16969 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16970 skip "Need MDS version at least 2.11.52"
16972 mkdir -p $DIR/$tdir/migrate_dir
16974 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
16975 error "migrating dir to non-exist MDT succeeds"
16978 run_test 230g "migrate dir to non-exist MDT"
16981 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16982 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16983 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16984 skip "Need MDS version at least 2.11.52"
16988 mkdir -p $DIR/$tdir/migrate_dir
16990 $LFS migrate -m1 $DIR &&
16991 error "migrating mountpoint1 should fail"
16993 $LFS migrate -m1 $DIR/$tdir/.. &&
16994 error "migrating mountpoint2 should fail"
16997 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
16998 error "migrating $tdir/migrate_dir/.. should fail"
17002 run_test 230h "migrate .. and root"
17005 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17006 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
17007 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
17008 skip "Need MDS version at least 2.11.52"
17010 mkdir -p $DIR/$tdir/migrate_dir
17012 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
17013 error "migration fails with a tailing slash"
17015 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
17016 error "migration fails with two tailing slashes"
17018 run_test 230i "lfs migrate -m tolerates trailing slashes"
17021 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
17022 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
17023 skip "Need MDS version at least 2.11.52"
17025 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
17026 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
17027 error "create $tfile failed"
17028 cat /etc/passwd > $DIR/$tdir/$tfile
17030 $LFS migrate -m 1 $DIR/$tdir
17032 cmp /etc/passwd $DIR/$tdir/$tfile ||
17033 error "DoM file mismatch after migration"
17035 run_test 230j "DoM file data not changed after dir migration"
17038 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
17039 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
17040 skip "Need MDS version at least 2.11.56"
17043 local files_on_starting_mdt=0
17045 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
17046 $LFS getdirstripe $DIR/$tdir
17047 for i in $(seq $total); do
17048 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
17049 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
17050 files_on_starting_mdt=$((files_on_starting_mdt + 1))
17053 echo "$files_on_starting_mdt files on MDT0"
17055 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
17056 $LFS getdirstripe $DIR/$tdir
17058 files_on_starting_mdt=0
17059 for i in $(seq $total); do
17060 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
17061 error "file $tfile.$i mismatch after migration"
17062 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
17063 files_on_starting_mdt=$((files_on_starting_mdt + 1))
17066 echo "$files_on_starting_mdt files on MDT1 after migration"
17067 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
17069 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
17070 $LFS getdirstripe $DIR/$tdir
17072 files_on_starting_mdt=0
17073 for i in $(seq $total); do
17074 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
17075 error "file $tfile.$i mismatch after 2nd migration"
17076 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
17077 files_on_starting_mdt=$((files_on_starting_mdt + 1))
17080 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
17081 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
17085 run_test 230k "file data not changed after dir migration"
17088 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
17089 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
17090 skip "Need MDS version at least 2.11.56"
17092 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
17093 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
17094 error "create files under remote dir failed $i"
17095 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
17097 run_test 230l "readdir between MDTs won't crash"
17100 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
17101 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
17102 skip "Need MDS version at least 2.11.56"
17105 local mig_dir=$DIR/$tdir/migrate_dir
17106 local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
17110 echo "Creating files and dirs with xattrs"
17111 test_mkdir $DIR/$tdir
17112 test_mkdir -i0 -c1 $mig_dir
17114 setfattr -n user.attr1 -v $longstr $mig_dir/dir ||
17115 error "cannot set xattr attr1 on dir"
17116 setfattr -n user.attr2 -v $shortstr $mig_dir/dir ||
17117 error "cannot set xattr attr2 on dir"
17118 touch $mig_dir/dir/f0
17119 setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 ||
17120 error "cannot set xattr attr1 on file"
17121 setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 ||
17122 error "cannot set xattr attr2 on file"
17123 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
17124 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
17125 [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir"
17126 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
17127 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir"
17128 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
17129 [ "$val" = $longstr ] || error "xattr attr1 not set properly on file"
17130 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
17131 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file"
17133 echo "Migrating to MDT1"
17134 $LFS migrate -m $MDTIDX $mig_dir ||
17135 error "fails on migrating dir to MDT1"
17137 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
17138 echo "Checking xattrs"
17139 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
17140 [ "$val" = $longstr ] ||
17141 error "expecting xattr1 $longstr on dir, found $val"
17142 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
17143 [ "$val" = $shortstr ] ||
17144 error "expecting xattr2 $shortstr on dir, found $val"
17145 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
17146 [ "$val" = $longstr ] ||
17147 error "expecting xattr1 $longstr on file, found $val"
17148 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
17149 [ "$val" = $shortstr ] ||
17150 error "expecting xattr2 $shortstr on file, found $val"
17152 run_test 230m "xattrs not changed after dir migration"
17156 # For simplicity this test assumes that max_pages_per_rpc
17157 # is the same across all OSCs
17158 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
17159 local bulk_size=$((max_pages * PAGE_SIZE))
17160 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
17163 mkdir -p $DIR/$tdir
17164 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
17165 error "failed to set stripe with -S ${brw_size}M option"
17167 # clear the OSC stats
17168 $LCTL set_param osc.*.stats=0 &>/dev/null
17171 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
17172 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
17173 oflag=direct &>/dev/null || error "dd failed"
17175 sync; sleep 1; sync # just to be safe
17176 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
17177 if [ x$nrpcs != "x1" ]; then
17178 $LCTL get_param osc.*.stats
17179 error "found $nrpcs ost_write RPCs, not 1 as expected"
17183 # Drop the OSC cache, otherwise we will read from it
17184 cancel_lru_locks osc
17186 # clear the OSC stats
17187 $LCTL set_param osc.*.stats=0 &>/dev/null
17189 # Client reads $bulk_size.
17190 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
17191 iflag=direct &>/dev/null || error "dd failed"
17193 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
17194 if [ x$nrpcs != "x1" ]; then
17195 $LCTL get_param osc.*.stats
17196 error "found $nrpcs ost_read RPCs, not 1 as expected"
17199 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
17202 mkdir -p $DIR/$tdir
17204 for i in {0..1023}; do
17205 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
17206 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
17207 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
17211 run_test 231b "must not assert on fully utilized OST request buffer"
17214 mkdir -p $DIR/$tdir
17215 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
17217 #define OBD_FAIL_LDLM_OST_LVB 0x31c
17218 do_facet ost1 $LCTL set_param fail_loc=0x31c
17220 # ignore dd failure
17221 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
17223 do_facet ost1 $LCTL set_param fail_loc=0
17224 umount_client $MOUNT || error "umount failed"
17225 mount_client $MOUNT || error "mount failed"
17226 stop ost1 || error "cannot stop ost1"
17227 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17229 run_test 232a "failed lock should not block umount"
17232 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
17233 skip "Need MDS version at least 2.10.58"
17235 mkdir -p $DIR/$tdir
17236 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
17237 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
17239 cancel_lru_locks osc
17241 #define OBD_FAIL_LDLM_OST_LVB 0x31c
17242 do_facet ost1 $LCTL set_param fail_loc=0x31c
17245 $LFS data_version $DIR/$tdir/$tfile || true
17247 do_facet ost1 $LCTL set_param fail_loc=0
17248 umount_client $MOUNT || error "umount failed"
17249 mount_client $MOUNT || error "mount failed"
17250 stop ost1 || error "cannot stop ost1"
17251 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17253 run_test 232b "failed data version lock should not block umount"
17256 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
17257 skip "Need MDS version at least 2.3.64"
17258 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
17260 local fid=$($LFS path2fid $MOUNT)
17262 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
17263 error "cannot access $MOUNT using its FID '$fid'"
17265 run_test 233a "checking that OBF of the FS root succeeds"
17268 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
17269 skip "Need MDS version at least 2.5.90"
17270 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
17272 local fid=$($LFS path2fid $MOUNT/.lustre)
17274 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
17275 error "cannot access $MOUNT/.lustre using its FID '$fid'"
17277 fid=$($LFS path2fid $MOUNT/.lustre/fid)
17278 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
17279 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
17281 run_test 233b "checking that OBF of the FS .lustre succeeds"
17284 local p="$TMP/sanityN-$TESTNAME.parameters"
17285 save_lustre_params client "llite.*.xattr_cache" > $p
17286 lctl set_param llite.*.xattr_cache 1 ||
17287 skip_env "xattr cache is not supported"
17289 mkdir -p $DIR/$tdir || error "mkdir failed"
17290 touch $DIR/$tdir/$tfile || error "touch failed"
17291 # OBD_FAIL_LLITE_XATTR_ENOMEM
17292 $LCTL set_param fail_loc=0x1405
17293 getfattr -n user.attr $DIR/$tdir/$tfile &&
17294 error "getfattr should have failed with ENOMEM"
17295 $LCTL set_param fail_loc=0x0
17298 restore_lustre_params < $p
17301 run_test 234 "xattr cache should not crash on ENOMEM"
17304 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
17305 skip "Need MDS version at least 2.4.52"
17307 flock_deadlock $DIR/$tfile
17312 124) error "process hangs on a deadlock"
17314 *) error "error executing flock_deadlock $DIR/$tfile"
17318 run_test 235 "LU-1715: flock deadlock detection does not work properly"
17322 check_swap_layouts_support
17324 local ref1=/etc/passwd
17325 local ref2=/etc/group
17326 local file1=$DIR/$tdir/f1
17327 local file2=$DIR/$tdir/f2
17329 test_mkdir -c1 $DIR/$tdir
17330 $LFS setstripe -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
17331 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
17332 $LFS setstripe -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
17333 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
17334 local fd=$(free_fd)
17335 local cmd="exec $fd<>$file2"
17338 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
17339 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
17342 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
17347 run_test 236 "Layout swap on open unlinked file"
17349 # LU-4659 linkea consistency
17351 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
17352 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
17353 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
17354 skip "Need MDS version at least 2.5.58 or 2.5.2+"
17357 ln $DIR/$tfile $DIR/$tfile.lnk
17358 touch $DIR/$tfile.new
17359 mv $DIR/$tfile.new $DIR/$tfile
17360 local fid1=$($LFS path2fid $DIR/$tfile)
17361 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
17362 local path1=$($LFS fid2path $FSNAME "$fid1")
17363 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
17364 local path2=$($LFS fid2path $FSNAME "$fid2")
17365 [ $tfile.lnk == $path2 ] ||
17366 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
17369 run_test 238 "Verify linkea consistency"
17371 test_239A() { # was test_239
17372 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
17373 skip "Need MDS version at least 2.5.60"
17375 local list=$(comma_list $(mdts_nodes))
17377 mkdir -p $DIR/$tdir
17378 createmany -o $DIR/$tdir/f- 5000
17379 unlinkmany $DIR/$tdir/f- 5000
17380 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
17381 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
17382 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
17383 osp.*MDT*.sync_in_flight" | calc_sum)
17384 [ "$changes" -eq 0 ] || error "$changes not synced"
17386 run_test 239A "osp_sync test"
17388 test_239a() { #LU-5297
17389 remote_mds_nodsh && skip "remote MDS with nodsh"
17392 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
17393 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
17394 chgrp $RUNAS_GID $DIR/$tfile
17395 wait_delete_completed
17397 run_test 239a "process invalid osp sync record correctly"
17399 test_239b() { #LU-5297
17400 remote_mds_nodsh && skip "remote MDS with nodsh"
17403 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
17404 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
17405 chgrp $RUNAS_GID $DIR/$tfile1
17406 wait_delete_completed
17407 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
17409 chgrp $RUNAS_GID $DIR/$tfile2
17410 wait_delete_completed
17412 run_test 239b "process osp sync record with ENOMEM error correctly"
17415 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
17416 remote_mds_nodsh && skip "remote MDS with nodsh"
17418 mkdir -p $DIR/$tdir
17420 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
17421 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
17422 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
17423 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
17425 umount_client $MOUNT || error "umount failed"
17426 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
17427 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
17428 mount_client $MOUNT || error "failed to mount client"
17430 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
17431 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
17433 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
17439 for LOOP in $(seq $count); do
17440 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
17441 cancel_lru_locks $OSC || true
17449 for LOOP in $(seq $1); do
17450 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
17455 test_241a() { # was test_241
17456 local bsize=$PAGE_SIZE
17458 (( bsize < 40960 )) && bsize=40960
17459 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
17461 cancel_lru_locks $OSC
17462 test_241_bio 1000 $bsize &
17464 test_241_dio 1000 $bsize
17467 run_test 241a "bio vs dio"
17470 local bsize=$PAGE_SIZE
17472 (( bsize < 40960 )) && bsize=40960
17473 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
17475 test_241_dio 1000 $bsize &
17477 test_241_dio 1000 $bsize
17480 run_test 241b "dio vs dio"
17483 remote_mds_nodsh && skip "remote MDS with nodsh"
17485 mkdir -p $DIR/$tdir
17486 touch $DIR/$tdir/$tfile
17488 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
17489 do_facet mds1 lctl set_param fail_loc=0x105
17490 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
17492 do_facet mds1 lctl set_param fail_loc=0
17493 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
17495 run_test 242 "mdt_readpage failure should not cause directory unreadable"
17499 test_mkdir $DIR/$tdir
17500 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
17502 run_test 243 "various group lock tests"
17506 test_mkdir $DIR/$tdir
17507 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
17508 sendfile_grouplock $DIR/$tdir/$tfile || \
17509 error "sendfile+grouplock failed"
17512 run_test 244a "sendfile with group lock tests"
17516 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
17519 local size=$((1024*1024))
17521 test_mkdir $DIR/$tdir
17522 for i in $(seq 1 $threads); do
17523 local file=$DIR/$tdir/file_$((i / 10))
17524 $MULTIOP $file OG1234w$size_$((i % 3))w$size_$((i % 4))g1234c &
17527 for i in $(seq 1 $threads); do
17531 run_test 244b "multi-threaded write with group lock"
17534 local flagname="multi_mod_rpcs"
17535 local connect_data_name="max_mod_rpcs"
17538 # check if multiple modify RPCs flag is set
17539 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
17540 grep "connect_flags:")
17543 echo "$out" | grep -qw $flagname
17544 if [ $? -ne 0 ]; then
17545 echo "connect flag $flagname is not set"
17549 # check if multiple modify RPCs data is set
17550 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
17553 echo "$out" | grep -qw $connect_data_name ||
17554 error "import should have connect data $connect_data_name"
17556 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
17562 umount_client $submount
17567 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
17569 skip_env "Fileset feature is not supported"
17571 local submount=${MOUNT}_$tdir
17574 mkdir -p $submount || error "mkdir $submount failed"
17575 FILESET="$FILESET/$tdir" mount_client $submount ||
17576 error "mount $submount failed"
17577 trap "cleanup_247 $submount" EXIT
17578 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
17579 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
17580 error "read $MOUNT/$tdir/$tfile failed"
17581 cleanup_247 $submount
17583 run_test 247a "mount subdir as fileset"
17586 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
17587 skip_env "Fileset feature is not supported"
17589 local submount=${MOUNT}_$tdir
17591 rm -rf $MOUNT/$tdir
17592 mkdir -p $submount || error "mkdir $submount failed"
17594 FILESET="$FILESET/$tdir" mount_client $submount &&
17595 error "mount $submount should fail"
17598 run_test 247b "mount subdir that dose not exist"
17601 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
17602 skip_env "Fileset feature is not supported"
17604 local submount=${MOUNT}_$tdir
17606 mkdir -p $MOUNT/$tdir/dir1
17607 mkdir -p $submount || error "mkdir $submount failed"
17608 trap "cleanup_247 $submount" EXIT
17609 FILESET="$FILESET/$tdir" mount_client $submount ||
17610 error "mount $submount failed"
17611 local fid=$($LFS path2fid $MOUNT/)
17612 $LFS fid2path $submount $fid && error "fid2path should fail"
17613 cleanup_247 $submount
17615 run_test 247c "running fid2path outside root"
17618 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
17619 skip "Fileset feature is not supported"
17621 local submount=${MOUNT}_$tdir
17623 mkdir -p $MOUNT/$tdir/dir1
17624 mkdir -p $submount || error "mkdir $submount failed"
17625 FILESET="$FILESET/$tdir" mount_client $submount ||
17626 error "mount $submount failed"
17627 trap "cleanup_247 $submount" EXIT
17628 local fid=$($LFS path2fid $submount/dir1)
17629 $LFS fid2path $submount $fid || error "fid2path should succeed"
17630 cleanup_247 $submount
17632 run_test 247d "running fid2path inside root"
17636 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
17638 skip "Fileset feature is not supported"
17640 local submount=${MOUNT}_$tdir
17643 mkdir -p $submount || error "mkdir $submount failed"
17644 FILESET="$FILESET/.." mount_client $submount &&
17645 error "mount $submount should fail"
17648 run_test 247e "mount .. as fileset"
17651 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
17652 [ -z "$fast_read_sav" ] && skip "no fast read support"
17654 # create a large file for fast read verification
17655 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
17657 # make sure the file is created correctly
17658 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
17659 { rm -f $DIR/$tfile; skip "file creation error"; }
17661 echo "Test 1: verify that fast read is 4 times faster on cache read"
17663 # small read with fast read enabled
17664 $LCTL set_param -n llite.*.fast_read=1
17665 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
17666 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17667 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17668 # small read with fast read disabled
17669 $LCTL set_param -n llite.*.fast_read=0
17670 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
17671 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17672 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17674 # verify that fast read is 4 times faster for cache read
17675 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
17676 error_not_in_vm "fast read was not 4 times faster: " \
17677 "$t_fast vs $t_slow"
17679 echo "Test 2: verify the performance between big and small read"
17680 $LCTL set_param -n llite.*.fast_read=1
17682 # 1k non-cache read
17683 cancel_lru_locks osc
17684 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17685 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17686 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17688 # 1M non-cache read
17689 cancel_lru_locks osc
17690 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17691 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17692 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17694 # verify that big IO is not 4 times faster than small IO
17695 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
17696 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
17698 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
17701 run_test 248a "fast read verification"
17704 # Default short_io_bytes=16384, try both smaller and larger sizes.
17705 # Lustre O_DIRECT read and write needs to be a multiple of PAGE_SIZE.
17706 # 6017024 = 2^12*13*113 = 47008*128 = 11752*512 = 4096*1469 = 53248*113
17707 echo "bs=53248 count=113 normal buffered write"
17708 dd if=/dev/urandom of=$TMP/$tfile.0 bs=53248 count=113 ||
17709 error "dd of initial data file failed"
17710 stack_trap "rm -f $DIR/$tfile.[0-3] $TMP/$tfile.[0-3]" EXIT
17712 echo "bs=47008 count=128 oflag=dsync normal write $tfile.0"
17713 dd if=$TMP/$tfile.0 of=$DIR/$tfile.0 bs=47008 count=128 oflag=dsync ||
17714 error "dd with sync normal writes failed"
17715 cmp $TMP/$tfile.0 $DIR/$tfile.0 || error "compare $DIR/$tfile.0 failed"
17717 echo "bs=11752 count=512 oflag=dsync small write $tfile.1"
17718 dd if=$TMP/$tfile.0 of=$DIR/$tfile.1 bs=11752 count=512 oflag=dsync ||
17719 error "dd with sync small writes failed"
17720 cmp $TMP/$tfile.0 $DIR/$tfile.1 || error "compare $DIR/$tfile.1 failed"
17722 cancel_lru_locks osc
17724 # calculate the small O_DIRECT size and count for the client PAGE_SIZE
17725 local num=$((13 * 113 / (PAGE_SIZE / 4096)))
17726 echo "bs=$PAGE_SIZE count=$num iflag=direct small read $tfile.1"
17727 dd if=$DIR/$tfile.1 of=$TMP/$tfile.1 bs=$PAGE_SIZE count=$num \
17728 iflag=direct || error "dd with O_DIRECT small read failed"
17729 # adjust bytes checked to handle larger PAGE_SIZE for ARM/PPC
17730 cmp --bytes=$((PAGE_SIZE * num)) $TMP/$tfile.0 $TMP/$tfile.1 ||
17731 error "compare $TMP/$tfile.1 failed"
17733 local save=$($LCTL get_param -n osc.*OST000*.short_io_bytes | head -n 1)
17734 stack_trap "$LCTL set_param osc.$FSNAME-*.short_io_bytes=$save" EXIT
17736 # just to see what the maximum tunable value is, and test parsing
17737 echo "test invalid parameter 2MB"
17738 $LCTL set_param osc.$FSNAME-OST0000*.short_io_bytes=2M &&
17739 error "too-large short_io_bytes allowed"
17740 echo "test maximum parameter 512KB"
17741 # if we can set a larger short_io_bytes, run test regardless of version
17742 if ! $LCTL set_param osc.$FSNAME-OST0000*.short_io_bytes=512K; then
17743 # older clients may not allow setting it this large, that's OK
17744 [ $CLIENT_VERSION -ge $(version_code 2.13.50) ] ||
17745 skip "Need at least client version 2.13.50"
17746 error "medium short_io_bytes failed"
17748 $LCTL get_param osc.$FSNAME-OST0000*.short_io_bytes
17749 size=$($LCTL get_param -n osc.$FSNAME-OST0000*.short_io_bytes)
17751 echo "test large parameter 64KB"
17752 $LCTL set_param osc.$FSNAME-*.short_io_bytes=65536
17753 $LCTL get_param osc.$FSNAME-OST0000*.short_io_bytes
17755 echo "bs=47008 count=128 oflag=dsync large write $tfile.2"
17756 dd if=$TMP/$tfile.0 of=$DIR/$tfile.2 bs=47008 count=128 oflag=dsync ||
17757 error "dd with sync large writes failed"
17758 cmp $TMP/$tfile.0 $DIR/$tfile.2 || error "compare $DIR/$tfile.2 failed"
17760 # calculate the large O_DIRECT size and count for the client PAGE_SIZE
17761 local size=$(((4096 * 13 + PAGE_SIZE - 1) / PAGE_SIZE * PAGE_SIZE))
17762 num=$((113 * 4096 / PAGE_SIZE))
17763 echo "bs=$size count=$num oflag=direct large write $tfile.3"
17764 dd if=$TMP/$tfile.0 of=$DIR/$tfile.3 bs=$size count=$num oflag=direct ||
17765 error "dd with O_DIRECT large writes failed"
17766 cmp --bytes=$((size * num)) $TMP/$tfile.0 $DIR/$tfile.3 ||
17767 error "compare $DIR/$tfile.3 failed"
17769 cancel_lru_locks osc
17771 echo "bs=$size count=$num iflag=direct large read $tfile.2"
17772 dd if=$DIR/$tfile.2 of=$TMP/$tfile.2 bs=$size count=$num iflag=direct ||
17773 error "dd with O_DIRECT large read failed"
17774 cmp --bytes=$((size * num)) $TMP/$tfile.0 $TMP/$tfile.2 ||
17775 error "compare $TMP/$tfile.2 failed"
17777 echo "bs=$size count=$num iflag=direct large read $tfile.3"
17778 dd if=$DIR/$tfile.3 of=$TMP/$tfile.3 bs=$size count=$num iflag=direct ||
17779 error "dd with O_DIRECT large read failed"
17780 cmp --bytes=$((size * num)) $TMP/$tfile.0 $TMP/$tfile.3 ||
17781 error "compare $TMP/$tfile.3 failed"
17783 run_test 248b "test short_io read and write for both small and large sizes"
17785 test_249() { # LU-7890
17786 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
17787 skip "Need at least version 2.8.54"
17790 $LFS setstripe -c 1 $DIR/$tfile
17791 # Offset 2T == 4k * 512M
17792 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
17793 error "dd to 2T offset failed"
17795 run_test 249 "Write above 2T file size"
17798 [ "$(facet_fstype ost$(($($LFS getstripe -i $DIR/$tfile) + 1)))" = "zfs" ] \
17799 && skip "no 16TB file size limit on ZFS"
17801 $LFS setstripe -c 1 $DIR/$tfile
17802 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
17803 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
17804 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
17805 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
17806 conv=notrunc,fsync && error "append succeeded"
17809 run_test 250 "Write above 16T limit"
17812 $LFS setstripe -c -1 -S 1048576 $DIR/$tfile
17814 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
17815 #Skip once - writing the first stripe will succeed
17816 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17817 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
17818 error "short write happened"
17820 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17821 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
17822 error "short read happened"
17826 run_test 251 "Handling short read and write correctly"
17829 remote_mds_nodsh && skip "remote MDS with nodsh"
17830 remote_ost_nodsh && skip "remote OST with nodsh"
17831 if [ "$ost1_FSTYPE" != ldiskfs ] || [ "$mds1_FSTYPE" != ldiskfs ]; then
17832 skip_env "ldiskfs only test"
17842 # check lr_reader on OST0000
17844 dev=$(facet_device $tgt)
17845 out=$(do_facet $tgt $LR_READER $dev)
17846 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17848 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
17849 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
17850 error "Invalid uuid returned by $LR_READER on target $tgt"
17851 echo -e "uuid returned by $LR_READER is '$uuid'\n"
17853 # check lr_reader -c on MDT0000
17855 dev=$(facet_device $tgt)
17856 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
17857 skip "$LR_READER does not support additional options"
17859 out=$(do_facet $tgt $LR_READER -c $dev)
17860 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17862 num=$(echo "$out" | grep -c "mdtlov")
17863 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
17864 error "Invalid number of mdtlov clients returned by $LR_READER"
17865 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
17867 # check lr_reader -cr on MDT0000
17868 out=$(do_facet $tgt $LR_READER -cr $dev)
17869 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17871 echo "$out" | grep -q "^reply_data:$" ||
17872 error "$LR_READER should have returned 'reply_data' section"
17873 num=$(echo "$out" | grep -c "client_generation")
17874 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
17876 run_test 252 "check lr_reader tool"
17879 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17880 remote_mds_nodsh && skip "remote MDS with nodsh"
17881 remote_mgs_nodsh && skip "remote MGS with nodsh"
17885 local ost_name=$(ostname_from_index $ostidx)
17888 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
17889 do_facet $SINGLEMDS $LCTL get_param -n \
17890 osp.$mdtosc_proc1.reserved_mb_high ||
17891 skip "remote MDS does not support reserved_mb_high"
17895 wait_delete_completed
17898 pool_add $TESTNAME || error "Pool creation failed"
17899 pool_add_targets $TESTNAME 0 || error "Pool add targets failed"
17901 $LFS setstripe $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
17902 error "Setstripe failed"
17904 dd if=/dev/zero of=$DIR/$tdir/$tfile.0 bs=1M count=10
17906 local wms=$(ost_watermarks_set_enospc $tfile $ostidx |
17908 stack_trap "ost_watermarks_clear_enospc $tfile $ostidx $wms" EXIT
17910 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17911 osp.$mdtosc_proc1.prealloc_status)
17912 echo "prealloc_status $oa_status"
17914 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1M count=1 &&
17915 error "File creation should fail"
17917 #object allocation was stopped, but we still able to append files
17918 dd if=/dev/zero of=$DIR/$tdir/$tfile.0 bs=1M seek=6 count=5 \
17919 oflag=append || error "Append failed"
17921 rm -f $DIR/$tdir/$tfile.0
17923 # For this test, we want to delete the files we created to go out of
17924 # space but leave the watermark, so we remain nearly out of space
17925 ost_watermarks_enospc_delete_files $tfile $ostidx
17927 wait_delete_completed
17931 for i in $(seq 10 12); do
17932 dd if=/dev/zero of=$DIR/$tdir/$tfile.$i bs=1M count=1 \
17933 2>/dev/null || error "File creation failed after rm"
17936 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17937 osp.$mdtosc_proc1.prealloc_status)
17938 echo "prealloc_status $oa_status"
17940 if (( oa_status != 0 )); then
17941 error "Object allocation still disable after rm"
17944 run_test 253 "Check object allocation limit"
17947 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17948 remote_mds_nodsh && skip "remote MDS with nodsh"
17949 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
17950 skip "MDS does not support changelog_size"
17953 local MDT0=$(facet_svc $SINGLEMDS)
17955 changelog_register || error "changelog_register failed"
17957 changelog_clear 0 || error "changelog_clear failed"
17959 local size1=$(do_facet $SINGLEMDS \
17960 $LCTL get_param -n mdd.$MDT0.changelog_size)
17961 echo "Changelog size $size1"
17964 $LFS mkdir -i 0 $DIR/$tdir
17966 mkdir -p $DIR/$tdir/pics/2008/zachy
17967 touch $DIR/$tdir/pics/2008/zachy/timestamp
17968 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
17969 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
17970 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
17971 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
17972 rm $DIR/$tdir/pics/desktop.jpg
17974 local size2=$(do_facet $SINGLEMDS \
17975 $LCTL get_param -n mdd.$MDT0.changelog_size)
17976 echo "Changelog size after work $size2"
17978 (( $size2 > $size1 )) ||
17979 error "new Changelog size=$size2 less than old size=$size1"
17981 run_test 254 "Check changelog size"
17988 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
17989 awk -F: '{print $2}' | grep $type > /dev/null
17990 if [ $? -ne 0 ]; then
18000 lfs ladvise -a willread $file > /dev/null 2>&1
18001 if [ $? -eq 0 ]; then
18005 lfs ladvise -a willread $file 2>&1 |
18006 grep "Inappropriate ioctl for device" > /dev/null
18007 if [ $? -eq 0 ]; then
18014 bc <<<"scale=2; ($1 - $2) * 100 / $2"
18017 # run a random read IO workload
18018 # usage: random_read_iops <filename> <filesize> <iosize>
18019 random_read_iops() {
18022 local iosize=${3:-4096}
18024 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
18025 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
18028 drop_file_oss_cache() {
18032 $LFS ladvise -a dontneed $file 2>/dev/null ||
18033 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
18036 ladvise_willread_performance()
18039 local average_origin=0
18040 local average_cache=0
18041 local average_ladvise=0
18043 for ((i = 1; i <= $repeat; i++)); do
18044 echo "Iter $i/$repeat: reading without willread hint"
18045 cancel_lru_locks osc
18046 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
18047 local speed_origin=$(random_read_iops $DIR/$tfile $size)
18048 echo "Iter $i/$repeat: uncached speed: $speed_origin"
18049 average_origin=$(bc <<<"$average_origin + $speed_origin")
18051 cancel_lru_locks osc
18052 local speed_cache=$(random_read_iops $DIR/$tfile $size)
18053 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
18054 average_cache=$(bc <<<"$average_cache + $speed_cache")
18056 cancel_lru_locks osc
18057 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
18058 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
18059 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
18060 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
18061 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
18063 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
18064 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
18065 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
18067 speedup_cache=$(percent $average_cache $average_origin)
18068 speedup_ladvise=$(percent $average_ladvise $average_origin)
18070 echo "Average uncached read: $average_origin"
18071 echo "Average speedup with OSS cached read: " \
18072 "$average_cache = +$speedup_cache%"
18073 echo "Average speedup with ladvise willread: " \
18074 "$average_ladvise = +$speedup_ladvise%"
18076 local lowest_speedup=20
18077 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
18078 echo "Speedup with OSS cached read less than $lowest_speedup%," \
18079 "got $average_cache%. Skipping ladvise willread check."
18083 # the test won't work on ZFS until it supports 'ladvise dontneed', but
18084 # it is still good to run until then to exercise 'ladvise willread'
18085 ! $LFS ladvise -a dontneed $DIR/$tfile &&
18086 [ "$ost1_FSTYPE" = "zfs" ] &&
18087 echo "osd-zfs does not support dontneed or drop_caches" &&
18090 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
18091 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
18092 error_not_in_vm "Speedup with willread is less than " \
18093 "$lowest_speedup%, got $average_ladvise%"
18097 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
18098 skip "lustre < 2.8.54 does not support ladvise "
18099 remote_ost_nodsh && skip "remote OST with nodsh"
18101 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
18103 ladvise_no_type willread $DIR/$tfile &&
18104 skip "willread ladvise is not supported"
18106 ladvise_no_ioctl $DIR/$tfile &&
18107 skip "ladvise ioctl is not supported"
18110 local size=$((size_mb * 1048576))
18111 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
18112 error "dd to $DIR/$tfile failed"
18114 lfs ladvise -a willread $DIR/$tfile ||
18115 error "Ladvise failed with no range argument"
18117 lfs ladvise -a willread -s 0 $DIR/$tfile ||
18118 error "Ladvise failed with no -l or -e argument"
18120 lfs ladvise -a willread -e 1 $DIR/$tfile ||
18121 error "Ladvise failed with only -e argument"
18123 lfs ladvise -a willread -l 1 $DIR/$tfile ||
18124 error "Ladvise failed with only -l argument"
18126 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
18127 error "End offset should not be smaller than start offset"
18129 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
18130 error "End offset should not be equal to start offset"
18132 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
18133 error "Ladvise failed with overflowing -s argument"
18135 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
18136 error "Ladvise failed with overflowing -e argument"
18138 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
18139 error "Ladvise failed with overflowing -l argument"
18141 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
18142 error "Ladvise succeeded with conflicting -l and -e arguments"
18144 echo "Synchronous ladvise should wait"
18146 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
18147 do_nodes $(comma_list $(osts_nodes)) \
18148 $LCTL set_param fail_val=$delay fail_loc=0x237
18150 local start_ts=$SECONDS
18151 lfs ladvise -a willread $DIR/$tfile ||
18152 error "Ladvise failed with no range argument"
18153 local end_ts=$SECONDS
18154 local inteval_ts=$((end_ts - start_ts))
18156 if [ $inteval_ts -lt $(($delay - 1)) ]; then
18157 error "Synchronous advice didn't wait reply"
18160 echo "Asynchronous ladvise shouldn't wait"
18161 local start_ts=$SECONDS
18162 lfs ladvise -a willread -b $DIR/$tfile ||
18163 error "Ladvise failed with no range argument"
18164 local end_ts=$SECONDS
18165 local inteval_ts=$((end_ts - start_ts))
18167 if [ $inteval_ts -gt $(($delay / 2)) ]; then
18168 error "Asynchronous advice blocked"
18171 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
18172 ladvise_willread_performance
18174 run_test 255a "check 'lfs ladvise -a willread'"
18180 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
18184 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
18185 skip "lustre < 2.8.54 does not support ladvise "
18186 remote_ost_nodsh && skip "remote OST with nodsh"
18188 lfs setstripe -c 1 -i 0 $DIR/$tfile
18190 ladvise_no_type dontneed $DIR/$tfile &&
18191 skip "dontneed ladvise is not supported"
18193 ladvise_no_ioctl $DIR/$tfile &&
18194 skip "ladvise ioctl is not supported"
18196 ! $LFS ladvise -a dontneed $DIR/$tfile &&
18197 [ "$ost1_FSTYPE" = "zfs" ] &&
18198 skip "zfs-osd does not support 'ladvise dontneed'"
18201 local size=$((size_mb * 1048576))
18202 # In order to prevent disturbance of other processes, only check 3/4
18203 # of the memory usage
18204 local kibibytes=$((size_mb * 1024 * 3 / 4))
18206 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
18207 error "dd to $DIR/$tfile failed"
18209 #force write to complete before dropping OST cache & checking memory
18212 local total=$(facet_meminfo ost1 MemTotal)
18213 echo "Total memory: $total KiB"
18215 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
18216 local before_read=$(facet_meminfo ost1 Cached)
18217 echo "Cache used before read: $before_read KiB"
18219 lfs ladvise -a willread $DIR/$tfile ||
18220 error "Ladvise willread failed"
18221 local after_read=$(facet_meminfo ost1 Cached)
18222 echo "Cache used after read: $after_read KiB"
18224 lfs ladvise -a dontneed $DIR/$tfile ||
18225 error "Ladvise dontneed again failed"
18226 local no_read=$(facet_meminfo ost1 Cached)
18227 echo "Cache used after dontneed ladvise: $no_read KiB"
18229 if [ $total -lt $((before_read + kibibytes)) ]; then
18230 echo "Memory is too small, abort checking"
18234 if [ $((before_read + kibibytes)) -gt $after_read ]; then
18235 error "Ladvise willread should use more memory" \
18236 "than $kibibytes KiB"
18239 if [ $((no_read + kibibytes)) -gt $after_read ]; then
18240 error "Ladvise dontneed should release more memory" \
18241 "than $kibibytes KiB"
18244 run_test 255b "check 'lfs ladvise -a dontneed'"
18247 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
18248 skip "lustre < 2.10.50 does not support lockahead"
18256 test_mkdir -p $DIR/$tdir
18257 $LFS setstripe -i 0 -c 1 $DIR/$tdir
18259 #test 10 returns only success/failure
18261 lockahead_test -d $DIR/$tdir -t $i -f $tfile
18263 if [ $rc -eq 255 ]; then
18264 error "Ladvise test${i} failed, ${rc}"
18267 #test 11 counts lock enqueue requests, all others count new locks
18269 count=$(do_facet ost1 \
18270 $LCTL get_param -n ost.OSS.ost.stats)
18271 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
18273 lockahead_test -d $DIR/$tdir -t $i -f $tfile
18275 if [ $rc -eq 255 ]; then
18276 error "Ladvise test${i} failed, ${rc}"
18279 new_count=$(do_facet ost1 \
18280 $LCTL get_param -n ost.OSS.ost.stats)
18281 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
18282 awk '{ print $2 }')
18284 difference="$((new_count - count))"
18285 if [ $difference -ne $rc ]; then
18286 error "Ladvise test${i}, bad enqueue count, returned " \
18287 "${rc}, actual ${difference}"
18290 for i in $(seq 12 21); do
18291 # If we do not do this, we run the risk of having too many
18292 # locks and starting lock cancellation while we are checking
18294 cancel_lru_locks osc
18296 count=$($LCTL get_param -n \
18297 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
18299 lockahead_test -d $DIR/$tdir -t $i -f $tfile
18301 if [ $rc -eq 255 ]; then
18302 error "Ladvise test ${i} failed, ${rc}"
18305 new_count=$($LCTL get_param -n \
18306 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
18307 difference="$((new_count - count))"
18309 # Test 15 output is divided by 100 to map down to valid return
18310 if [ $i -eq 15 ]; then
18314 if [ $difference -ne $rc ]; then
18315 error "Ladvise test ${i}, bad lock count, returned " \
18316 "${rc}, actual ${difference}"
18320 #test 22 returns only success/failure
18322 lockahead_test -d $DIR/$tdir -t $i -f $tfile
18324 if [ $rc -eq 255 ]; then
18325 error "Ladvise test${i} failed, ${rc}"
18328 run_test 255c "suite of ladvise lockahead tests"
18331 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18332 remote_mds_nodsh && skip "remote MDS with nodsh"
18333 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
18334 changelog_users $SINGLEMDS | grep "^cl" &&
18335 skip "active changelog user"
18341 mdt_dev=$(mdsdevname 1)
18344 changelog_register || error "changelog_register failed"
18347 mkdir -p $DIR/$tdir
18349 changelog_clear 0 || error "changelog_clear failed"
18352 touch $DIR/$tdir/{1..10}
18355 stop $SINGLEMDS || error "Fail to stop MDT"
18359 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
18361 #after mount new plainllog is used
18362 touch $DIR/$tdir/{11..19}
18363 local tmpfile="$(mktemp --tmpdir -u $tfile.XXXXXX)"
18364 stack_trap "rm -f $tmpfile"
18365 cat_sl=$(do_facet $SINGLEMDS "sync; \
18366 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
18367 llog_reader $tmpfile | grep -c type=1064553b")
18368 do_facet $SINGLEMDS llog_reader $tmpfile
18370 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
18372 changelog_clear 0 || error "changelog_clear failed"
18374 cat_sl=$(do_facet $SINGLEMDS "sync; \
18375 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
18376 llog_reader $tmpfile | grep -c type=1064553b")
18378 if (( cat_sl == 2 )); then
18379 error "Empty plain llog was not deleted from changelog catalog"
18380 elif (( cat_sl != 1 )); then
18381 error "Active plain llog shouldn't be deleted from catalog"
18384 run_test 256 "Check llog delete for empty and not full state"
18387 remote_mds_nodsh && skip "remote MDS with nodsh"
18388 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
18389 skip "Need MDS version at least 2.8.55"
18391 test_mkdir $DIR/$tdir
18393 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
18394 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
18397 #define OBD_FAIL_MDS_XATTR_REP 0x161
18398 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18399 local facet=mds$((mdtidx + 1))
18400 set_nodes_failloc $(facet_active_host $facet) 0x80000161
18401 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
18403 stop $facet || error "stop MDS failed"
18404 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
18405 error "start MDS fail"
18406 wait_recovery_complete $facet
18408 run_test 257 "xattr locks are not lost"
18410 # Verify we take the i_mutex when security requires it
18412 #define OBD_FAIL_IMUTEX_SEC 0x141c
18413 $LCTL set_param fail_loc=0x141c
18415 chmod u+s $DIR/$tfile
18416 chmod a+rwx $DIR/$tfile
18417 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
18419 if [ $RC -ne 0 ]; then
18420 error "error, failed to take i_mutex, rc=$?"
18424 run_test 258a "verify i_mutex security behavior when suid attributes is set"
18426 # Verify we do NOT take the i_mutex in the normal case
18428 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
18429 $LCTL set_param fail_loc=0x141d
18432 chmod a+rw $DIR/$tfile
18433 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
18435 if [ $RC -ne 0 ]; then
18436 error "error, took i_mutex unnecessarily, rc=$?"
18441 run_test 258b "verify i_mutex security behavior"
18444 local file=$DIR/$tfile
18448 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
18450 stack_trap "rm -f $file" EXIT
18452 wait_delete_completed
18453 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
18454 echo "before: $before"
18456 $LFS setstripe -i 0 -c 1 $file
18457 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
18459 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
18460 echo "after write: $after"
18462 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
18463 do_facet ost1 $LCTL set_param fail_loc=0x2301
18465 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
18466 echo "after truncate: $after"
18469 do_facet ost1 $LCTL set_param fail_loc=0
18470 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
18472 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
18473 echo "after restart: $after"
18474 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
18475 error "missing truncate?"
18479 run_test 259 "crash at delayed truncate"
18482 #define OBD_FAIL_MDC_CLOSE 0x806
18483 $LCTL set_param fail_loc=0x80000806
18487 run_test 260 "Check mdc_close fail"
18489 ### Data-on-MDT sanity tests ###
18491 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18492 skip "Need MDS version at least 2.10.55 for DoM"
18495 local dom=$DIR/$tdir/dom_file
18496 local tmp=$DIR/$tdir/tmp_file
18498 mkdir -p $DIR/$tdir
18500 # basic checks for DoM component creation
18501 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
18502 error "Can set MDT layout to non-first entry"
18504 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
18505 error "Can define multiple entries as MDT layout"
18507 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
18509 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
18510 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
18511 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
18513 local mdtidx=$($LFS getstripe -m $dom)
18514 local mdtname=MDT$(printf %04x $mdtidx)
18515 local facet=mds$((mdtidx + 1))
18516 local space_check=1
18518 # Skip free space checks with ZFS
18519 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
18523 local size_tmp=$((65536 * 3))
18524 local mdtfree1=$(do_facet $facet \
18525 lctl get_param -n osd*.*$mdtname.kbytesfree)
18527 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
18528 # check also direct IO along write
18529 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
18530 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
18532 cmp $tmp $dom || error "file data is different"
18533 [ $(stat -c%s $dom) == $size_tmp ] ||
18534 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
18535 if [ $space_check == 1 ]; then
18536 local mdtfree2=$(do_facet $facet \
18537 lctl get_param -n osd*.*$mdtname.kbytesfree)
18539 # increase in usage from by $size_tmp
18540 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
18541 error "MDT free space wrong after write: " \
18542 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
18546 local size_dom=10000
18548 $TRUNCATE $dom $size_dom
18549 [ $(stat -c%s $dom) == $size_dom ] ||
18550 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
18551 if [ $space_check == 1 ]; then
18552 mdtfree1=$(do_facet $facet \
18553 lctl get_param -n osd*.*$mdtname.kbytesfree)
18554 # decrease in usage from $size_tmp to new $size_dom
18555 [ $(($mdtfree1 - $mdtfree2)) -ge \
18556 $(((size_tmp - size_dom) / 1024)) ] ||
18557 error "MDT free space is wrong after truncate: " \
18558 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
18564 size_dom=$((size_dom + size_tmp))
18565 [ $(stat -c%s $dom) == $size_dom ] ||
18566 error "bad size after append: $(stat -c%s $dom) != $size_dom"
18567 if [ $space_check == 1 ]; then
18568 mdtfree2=$(do_facet $facet \
18569 lctl get_param -n osd*.*$mdtname.kbytesfree)
18570 # increase in usage by $size_tmp from previous
18571 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
18572 error "MDT free space is wrong after append: " \
18573 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
18578 if [ $space_check == 1 ]; then
18579 mdtfree1=$(do_facet $facet \
18580 lctl get_param -n osd*.*$mdtname.kbytesfree)
18581 # decrease in usage by $size_dom from previous
18582 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
18583 error "MDT free space is wrong after removal: " \
18584 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
18587 # combined striping
18588 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
18589 error "Can't create DoM + OST striping"
18591 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
18592 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
18593 # check also direct IO along write
18594 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
18596 cmp $tmp $dom || error "file data is different"
18597 [ $(stat -c%s $dom) == $size_tmp ] ||
18598 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
18603 run_test 270a "DoM: basic functionality tests"
18606 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18607 skip "Need MDS version at least 2.10.55"
18609 local dom=$DIR/$tdir/dom_file
18610 local max_size=1048576
18612 mkdir -p $DIR/$tdir
18613 $LFS setstripe -E $max_size -L mdt $dom
18615 # truncate over the limit
18616 $TRUNCATE $dom $(($max_size + 1)) &&
18617 error "successful truncate over the maximum size"
18618 # write over the limit
18619 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
18620 error "successful write over the maximum size"
18621 # append over the limit
18622 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
18623 echo "12345" >> $dom && error "successful append over the maximum size"
18628 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
18631 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18632 skip "Need MDS version at least 2.10.55"
18634 mkdir -p $DIR/$tdir
18635 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18637 # check files inherit DoM EA
18638 touch $DIR/$tdir/first
18639 [ $($LFS getstripe -L $DIR/$tdir/first) == "mdt" ] ||
18640 error "bad pattern"
18641 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
18642 error "bad stripe count"
18643 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
18644 error "bad stripe size"
18646 # check directory inherits DoM EA and uses it as default
18647 mkdir $DIR/$tdir/subdir
18648 touch $DIR/$tdir/subdir/second
18649 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
18650 error "bad pattern in sub-directory"
18651 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
18652 error "bad stripe count in sub-directory"
18653 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
18654 error "bad stripe size in sub-directory"
18657 run_test 270c "DoM: DoM EA inheritance tests"
18660 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18661 skip "Need MDS version at least 2.10.55"
18663 mkdir -p $DIR/$tdir
18664 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18666 # inherit default DoM striping
18667 mkdir $DIR/$tdir/subdir
18668 touch $DIR/$tdir/subdir/f1
18670 # change default directory striping
18671 $LFS setstripe -c 1 $DIR/$tdir/subdir
18672 touch $DIR/$tdir/subdir/f2
18673 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
18674 error "wrong default striping in file 2"
18675 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
18676 error "bad pattern in file 2"
18679 run_test 270d "DoM: change striping from DoM to RAID0"
18682 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18683 skip "Need MDS version at least 2.10.55"
18685 mkdir -p $DIR/$tdir/dom
18686 mkdir -p $DIR/$tdir/norm
18689 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
18690 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
18692 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
18693 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
18695 # find DoM files by layout
18696 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
18697 [ $NUM -eq $DOMFILES ] ||
18698 error "lfs find -L: found $NUM, expected $DOMFILES"
18699 echo "Test 1: lfs find 20 DOM files by layout: OK"
18701 # there should be 1 dir with default DOM striping
18702 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
18704 error "lfs find -L: found $NUM, expected 1 dir"
18705 echo "Test 2: lfs find 1 DOM dir by layout: OK"
18707 # find DoM files by stripe size
18708 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
18709 [ $NUM -eq $DOMFILES ] ||
18710 error "lfs find -S: found $NUM, expected $DOMFILES"
18711 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
18713 # find files by stripe offset except DoM files
18714 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
18715 [ $NUM -eq $NORMFILES ] ||
18716 error "lfs find -i: found $NUM, expected $NORMFILES"
18717 echo "Test 5: lfs find no DOM files by stripe index: OK"
18720 run_test 270e "DoM: lfs find with DoM files test"
18723 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18724 skip "Need MDS version at least 2.10.55"
18726 local mdtname=${FSNAME}-MDT0000-mdtlov
18727 local dom=$DIR/$tdir/dom_file
18728 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
18729 lod.$mdtname.dom_stripesize)
18730 local dom_limit=131072
18732 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
18733 local dom_current=$(do_facet mds1 $LCTL get_param -n \
18734 lod.$mdtname.dom_stripesize)
18735 [ ${dom_limit} -eq ${dom_current} ] ||
18736 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
18738 $LFS mkdir -i 0 -c 1 $DIR/$tdir
18739 $LFS setstripe -d $DIR/$tdir
18740 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
18741 error "Can't set directory default striping"
18743 # exceed maximum stripe size
18744 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18745 error "Can't create file with $((dom_limit * 2)) DoM stripe"
18746 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
18747 error "Able to create DoM component size more than LOD limit"
18749 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
18750 dom_current=$(do_facet mds1 $LCTL get_param -n \
18751 lod.$mdtname.dom_stripesize)
18752 [ 0 -eq ${dom_current} ] ||
18753 error "Can't set zero DoM stripe limit"
18756 # attempt to create DoM file on server with disabled DoM should
18757 # remove DoM entry from layout and be succeed
18758 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
18759 error "Can't create DoM file (DoM is disabled)"
18760 [ $($LFS getstripe -L $dom) == "mdt" ] &&
18761 error "File has DoM component while DoM is disabled"
18764 # attempt to create DoM file with only DoM stripe should return error
18765 $LFS setstripe -E $dom_limit -L mdt $dom &&
18766 error "Able to create DoM-only file while DoM is disabled"
18768 # too low values to be aligned with smallest stripe size 64K
18769 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
18770 dom_current=$(do_facet mds1 $LCTL get_param -n \
18771 lod.$mdtname.dom_stripesize)
18772 [ 30000 -eq ${dom_current} ] &&
18773 error "Can set too small DoM stripe limit"
18775 # 64K is a minimal stripe size in Lustre, expect limit of that size
18776 [ 65536 -eq ${dom_current} ] ||
18777 error "Limit is not set to 64K but ${dom_current}"
18779 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
18780 dom_current=$(do_facet mds1 $LCTL get_param -n \
18781 lod.$mdtname.dom_stripesize)
18783 [ 2147483648 -eq ${dom_current} ] &&
18784 error "Can set too large DoM stripe limit"
18786 do_facet mds1 $LCTL set_param -n \
18787 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
18788 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18789 error "Can't create DoM component size after limit change"
18790 do_facet mds1 $LCTL set_param -n \
18791 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
18792 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
18793 error "Can't create DoM file after limit decrease"
18794 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
18795 error "Can create big DoM component after limit decrease"
18796 touch ${dom}_def ||
18797 error "Can't create file with old default layout"
18799 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
18802 run_test 270f "DoM: maximum DoM stripe size checks"
18805 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18806 skip "Need MDS version at least 2.10.55"
18808 local dom=$DIR/$tdir/dom
18810 mkdir -p $DIR/$tdir
18812 $LFS setstripe -E 1024K -L mdt $dom
18814 lctl set_param -n mdc.*.stats=clear
18815 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18816 cat $dom > /dev/null
18817 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
18818 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
18822 run_test 271a "DoM: data is cached for read after write"
18825 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18826 skip "Need MDS version at least 2.10.55"
18828 local dom=$DIR/$tdir/dom
18830 mkdir -p $DIR/$tdir
18832 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18834 lctl set_param -n mdc.*.stats=clear
18835 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18836 cancel_lru_locks mdc
18837 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
18838 # second stat to check size is cached on client
18839 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
18840 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18841 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
18844 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
18847 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18848 skip "Need MDS version at least 2.10.55"
18850 local dom=$DIR/$tdir/dom
18852 mkdir -p $DIR/$tdir
18854 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18856 lctl set_param -n mdc.*.stats=clear
18857 lctl set_param -n osc.*.stats=clear
18858 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
18859 cancel_lru_locks mdc
18860 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18861 # second stat to check size is cached on client
18862 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18863 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18864 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
18865 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
18866 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
18869 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
18875 local mdt=MDT$(printf %04x $mdtidx)
18877 if [ -z $param ]; then
18878 lctl get_param -n mdc.*$mdt*.stats
18880 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
18885 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18886 skip "Need MDS version at least 2.10.55"
18888 local dom=$DIR/$tdir/dom
18890 mkdir -p $DIR/$tdir
18892 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18894 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18895 local facet=mds$((mdtidx + 1))
18897 cancel_lru_locks mdc
18898 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
18899 createmany -o $dom 1000
18900 lctl set_param -n mdc.*.stats=clear
18901 smalliomany -w $dom 1000 200
18902 get_mdc_stats $mdtidx
18903 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18904 # Each file has 1 open, 1 IO enqueues, total 2000
18905 # but now we have also +1 getxattr for security.capability, total 3000
18906 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
18907 unlinkmany $dom 1000
18909 cancel_lru_locks mdc
18910 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
18911 createmany -o $dom 1000
18912 lctl set_param -n mdc.*.stats=clear
18913 smalliomany -w $dom 1000 200
18914 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18915 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
18916 # for OPEN and IO lock.
18917 [ $((enq - enq_2)) -ge 1000 ] ||
18918 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
18919 unlinkmany $dom 1000
18922 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
18924 cleanup_271def_tests() {
18930 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18931 skip "Need MDS version at least 2.10.57"
18933 local dom=$DIR/$tdir/dom
18934 local tmp=$TMP/$tfile
18935 trap "cleanup_271def_tests $tmp" EXIT
18937 mkdir -p $DIR/$tdir
18939 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18941 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18943 cancel_lru_locks mdc
18944 dd if=/dev/urandom of=$tmp bs=1000 count=1
18945 dd if=$tmp of=$dom bs=1000 count=1
18946 cancel_lru_locks mdc
18948 cat /etc/hosts >> $tmp
18949 lctl set_param -n mdc.*.stats=clear
18951 # append data to the same file it should update local page
18952 echo "Append to the same page"
18953 cat /etc/hosts >> $dom
18954 local num=$(get_mdc_stats $mdtidx ost_read)
18955 local ra=$(get_mdc_stats $mdtidx req_active)
18956 local rw=$(get_mdc_stats $mdtidx req_waittime)
18958 [ -z $num ] || error "$num READ RPC occured"
18959 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18963 cmp $tmp $dom || error "file miscompare"
18965 cancel_lru_locks mdc
18966 lctl set_param -n mdc.*.stats=clear
18968 echo "Open and read file"
18969 cat $dom > /dev/null
18970 local num=$(get_mdc_stats $mdtidx ost_read)
18971 local ra=$(get_mdc_stats $mdtidx req_active)
18972 local rw=$(get_mdc_stats $mdtidx req_waittime)
18974 [ -z $num ] || error "$num READ RPC occured"
18975 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18979 cmp $tmp $dom || error "file miscompare"
18983 run_test 271d "DoM: read on open (1K file in reply buffer)"
18986 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18987 skip "Need MDS version at least 2.10.57"
18989 local dom=$DIR/$tdir/dom
18990 local tmp=$TMP/$tfile
18991 trap "cleanup_271def_tests $tmp" EXIT
18993 mkdir -p $DIR/$tdir
18995 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18997 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18999 cancel_lru_locks mdc
19000 dd if=/dev/urandom of=$tmp bs=265000 count=1
19001 dd if=$tmp of=$dom bs=265000 count=1
19002 cancel_lru_locks mdc
19003 cat /etc/hosts >> $tmp
19004 lctl set_param -n mdc.*.stats=clear
19006 echo "Append to the same page"
19007 cat /etc/hosts >> $dom
19008 local num=$(get_mdc_stats $mdtidx ost_read)
19009 local ra=$(get_mdc_stats $mdtidx req_active)
19010 local rw=$(get_mdc_stats $mdtidx req_waittime)
19012 [ -z $num ] || error "$num READ RPC occured"
19013 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
19017 cmp $tmp $dom || error "file miscompare"
19019 cancel_lru_locks mdc
19020 lctl set_param -n mdc.*.stats=clear
19022 echo "Open and read file"
19023 cat $dom > /dev/null
19024 local num=$(get_mdc_stats $mdtidx ost_read)
19025 local ra=$(get_mdc_stats $mdtidx req_active)
19026 local rw=$(get_mdc_stats $mdtidx req_waittime)
19028 [ -z $num ] && num=0
19029 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
19030 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
19034 cmp $tmp $dom || error "file miscompare"
19038 run_test 271f "DoM: read on open (200K file and read tail)"
19041 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
19042 skip "Skipping due to old client or server version"
19044 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
19046 $CHECKSTAT -t file $DIR1/$tfile
19048 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
19051 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
19052 $LCTL set_param fail_loc=0x80000314
19053 rm $DIR1/$tfile || error "Unlink fails"
19055 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
19056 [ $RC -eq 0 ] || error "Failed write to stale object"
19058 run_test 271g "Discard DoM data vs client flush race"
19061 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
19062 skip "Need MDS version at least 2.11.50"
19064 local dom=$DIR/$tdir/dom
19065 mkdir -p $DIR/$tdir
19067 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
19068 dd if=/dev/urandom of=$dom bs=512K count=1 ||
19069 error "failed to write data into $dom"
19070 local old_md5=$(md5sum $dom)
19072 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
19073 error "failed to migrate to the same DoM component"
19075 local new_md5=$(md5sum $dom)
19077 [ "$old_md5" == "$new_md5" ] ||
19078 error "md5sum differ: $old_md5, $new_md5"
19080 [ $($LFS getstripe -c $dom) -eq 2 ] ||
19081 error "bad final stripe count: $($LFS getstripe -c $dom) != 2"
19083 run_test 272a "DoM migration: new layout with the same DOM component"
19086 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
19087 skip "Need MDS version at least 2.11.50"
19089 local dom=$DIR/$tdir/dom
19090 mkdir -p $DIR/$tdir
19091 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
19093 local mdtidx=$($LFS getstripe -m $dom)
19094 local mdtname=MDT$(printf %04x $mdtidx)
19095 local facet=mds$((mdtidx + 1))
19097 local mdtfree1=$(do_facet $facet \
19098 lctl get_param -n osd*.*$mdtname.kbytesfree)
19099 dd if=/dev/urandom of=$dom bs=2M count=1 ||
19100 error "failed to write data into $dom"
19101 local old_md5=$(md5sum $dom)
19102 cancel_lru_locks mdc
19103 local mdtfree1=$(do_facet $facet \
19104 lctl get_param -n osd*.*$mdtname.kbytesfree)
19106 $LFS migrate -c2 $dom ||
19107 error "failed to migrate to the new composite layout"
19108 [ $($LFS getstripe -L $dom) != 'mdt' ] ||
19109 error "MDT stripe was not removed"
19111 cancel_lru_locks mdc
19112 local new_md5=$(md5sum $dom)
19113 [ "$old_md5" == "$new_md5" ] ||
19114 error "$old_md5 != $new_md5"
19116 # Skip free space checks with ZFS
19117 if [ "$(facet_fstype $facet)" != "zfs" ]; then
19118 local mdtfree2=$(do_facet $facet \
19119 lctl get_param -n osd*.*$mdtname.kbytesfree)
19120 [ $mdtfree2 -gt $mdtfree1 ] ||
19121 error "MDT space is not freed after migration"
19125 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
19128 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
19129 skip "Need MDS version at least 2.11.50"
19131 local dom=$DIR/$tdir/$tfile
19132 mkdir -p $DIR/$tdir
19133 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
19135 local mdtidx=$($LFS getstripe -m $dom)
19136 local mdtname=MDT$(printf %04x $mdtidx)
19137 local facet=mds$((mdtidx + 1))
19139 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
19140 error "failed to write data into $dom"
19141 local old_md5=$(md5sum $dom)
19142 cancel_lru_locks mdc
19143 local mdtfree1=$(do_facet $facet \
19144 lctl get_param -n osd*.*$mdtname.kbytesfree)
19146 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
19147 error "failed to migrate to the new composite layout"
19148 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
19149 error "MDT stripe was not removed"
19151 cancel_lru_locks mdc
19152 local new_md5=$(md5sum $dom)
19153 [ "$old_md5" == "$new_md5" ] ||
19154 error "$old_md5 != $new_md5"
19156 # Skip free space checks with ZFS
19157 if [ "$(facet_fstype $facet)" != "zfs" ]; then
19158 local mdtfree2=$(do_facet $facet \
19159 lctl get_param -n osd*.*$mdtname.kbytesfree)
19160 [ $mdtfree2 -gt $mdtfree1 ] ||
19161 error "MDS space is not freed after migration"
19165 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
19168 [ $MDS1_VERSION -lt $(version_code 2.12.55) ] &&
19169 skip "Need MDS version at least 2.12.55"
19171 local dom=$DIR/$tdir/$tfile
19172 mkdir -p $DIR/$tdir
19173 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
19175 local mdtidx=$($LFS getstripe -m $dom)
19176 local mdtname=MDT$(printf %04x $mdtidx)
19177 local facet=mds$((mdtidx + 1))
19179 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
19180 error "failed to write data into $dom"
19181 local old_md5=$(md5sum $dom)
19182 cancel_lru_locks mdc
19183 local mdtfree1=$(do_facet $facet \
19184 lctl get_param -n osd*.*$mdtname.kbytesfree)
19186 $LFS mirror extend -N -E 2M -c1 -E -1 -c2 $dom ||
19187 error "failed mirroring to the new composite layout"
19188 $LFS mirror resync $dom ||
19189 error "failed mirror resync"
19190 $LFS mirror split --mirror-id 1 -d $dom ||
19191 error "failed mirror split"
19193 [ $($LFS getstripe -L $dom) != 'mdt' ] ||
19194 error "MDT stripe was not removed"
19196 cancel_lru_locks mdc
19197 local new_md5=$(md5sum $dom)
19198 [ "$old_md5" == "$new_md5" ] ||
19199 error "$old_md5 != $new_md5"
19201 # Skip free space checks with ZFS
19202 if [ "$(facet_fstype $facet)" != "zfs" ]; then
19203 local mdtfree2=$(do_facet $facet \
19204 lctl get_param -n osd*.*$mdtname.kbytesfree)
19205 [ $mdtfree2 -gt $mdtfree1 ] ||
19206 error "MDS space is not freed after DOM mirror deletion"
19210 run_test 272d "DoM mirroring: OST-striped mirror to DOM file"
19213 [ $MDS1_VERSION -lt $(version_code 2.12.55) ] &&
19214 skip "Need MDS version at least 2.12.55"
19216 local dom=$DIR/$tdir/$tfile
19217 mkdir -p $DIR/$tdir
19218 $LFS setstripe -c 2 $dom
19220 dd if=/dev/urandom of=$dom bs=512K count=1 oflag=direct ||
19221 error "failed to write data into $dom"
19222 local old_md5=$(md5sum $dom)
19223 cancel_lru_locks mdc
19225 $LFS mirror extend -N -E 1M -L mdt -E eof -c2 $dom ||
19226 error "failed mirroring to the DOM layout"
19227 $LFS mirror resync $dom ||
19228 error "failed mirror resync"
19229 $LFS mirror split --mirror-id 1 -d $dom ||
19230 error "failed mirror split"
19232 [ $($LFS getstripe -L $dom) != 'mdt' ] ||
19233 error "MDT stripe was not removed"
19235 cancel_lru_locks mdc
19236 local new_md5=$(md5sum $dom)
19237 [ "$old_md5" == "$new_md5" ] ||
19238 error "$old_md5 != $new_md5"
19242 run_test 272e "DoM mirroring: DOM mirror to the OST-striped file"
19245 [ $MDS1_VERSION -lt $(version_code 2.12.55) ] &&
19246 skip "Need MDS version at least 2.12.55"
19248 local dom=$DIR/$tdir/$tfile
19249 mkdir -p $DIR/$tdir
19250 $LFS setstripe -c 2 $dom
19252 dd if=/dev/urandom of=$dom bs=512K count=1 oflag=direct ||
19253 error "failed to write data into $dom"
19254 local old_md5=$(md5sum $dom)
19255 cancel_lru_locks mdc
19257 $LFS migrate -E 1M -L mdt -E eof -c2 -v $dom ||
19258 error "failed migrating to the DOM file"
19260 cancel_lru_locks mdc
19261 local new_md5=$(md5sum $dom)
19262 [ "$old_md5" != "$new_md5" ] &&
19263 error "$old_md5 != $new_md5"
19267 run_test 272f "DoM migration: OST-striped file to DOM file"
19270 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
19271 skip "Need MDS version at least 2.11.50"
19273 # Layout swap cannot be done if either file has DOM component,
19274 # this will never be supported, migration should be used instead
19276 local dom=$DIR/$tdir/$tfile
19277 mkdir -p $DIR/$tdir
19279 $LFS setstripe -c2 ${dom}_plain
19280 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
19281 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
19282 error "can swap layout with DoM component"
19283 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
19284 error "can swap layout with DoM component"
19286 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
19287 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
19288 error "can swap layout with DoM component"
19289 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
19290 error "can swap layout with DoM component"
19293 run_test 273a "DoM: layout swapping should fail with DOM"
19296 remote_ost_nodsh && skip "remote OST with nodsh"
19297 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
19298 skip "Need OST version >= 2.10.57"
19300 local file=$DIR/$tfile
19303 oss=$(comma_list $(osts_nodes))
19305 dd if=/dev/urandom of=$file bs=1M count=2 ||
19306 error "failed to create a file"
19307 cancel_lru_locks osc
19310 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
19311 error "failed to read a file"
19313 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
19314 $LCTL set_param fail_loc=0x8000031f
19316 cancel_lru_locks osc &
19319 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
19320 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
19321 #IO takes another lock, but matches the PENDING one
19322 #and places it to the IO RPC
19323 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
19324 error "failed to read a file with PENDING lock"
19326 run_test 275 "Read on a canceled duplicate lock"
19329 remote_ost_nodsh && skip "remote OST with nodsh"
19332 do_facet ost1 "(while true; do \
19333 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
19334 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
19337 for LOOP in $(seq 20); do
19339 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
19342 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
19343 rm $TMP/sanity_276_pid"
19345 run_test 276 "Race between mount and obd_statfs"
19348 $LCTL set_param ldlm.namespaces.*.lru_size=0
19349 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
19350 local cached_mb=$($LCTL get_param llite.*.max_cached_mb |
19351 grep ^used_mb | awk '{print $2}')
19352 [ $cached_mb -eq 1 ] || error "expected mb 1 got $cached_mb"
19353 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 \
19354 oflag=direct conv=notrunc
19355 cached_mb=$($LCTL get_param llite.*.max_cached_mb |
19356 grep ^used_mb | awk '{print $2}')
19357 [ $cached_mb -eq 0 ] || error "expected mb 0 got $cached_mb"
19359 run_test 277 "Direct IO shall drop page cache"
19362 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
19363 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19364 [[ "$(facet_host mds1)" != "$(facet_host mds2)" ]] &&
19365 skip "needs the same host for mdt1 mdt2" && return
19370 #define OBD_FAIL_OBD_STOP_MDS_RACE 0x60b
19371 do_facet mds2 $LCTL set_param fail_loc=0x8000060c
19377 echo "Starting MDTs"
19378 start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
19380 #For the error assertion will happen. lu_env_get_key(..., &mdt_thread_key)
19382 do_facet mds2 $LCTL set_param fail_loc=0
19384 start mds2 $(mdsdevname 2) $MDS_MOUNT_OPTS
19385 wait_recovery_complete mds2
19387 run_test 278 "Race starting MDS between MDTs stop/start"
19389 cleanup_test_300() {
19393 test_striped_dir() {
19398 mkdir -p $DIR/$tdir
19400 SAVE_UMASK=$(umask)
19401 trap cleanup_test_300 RETURN EXIT
19403 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
19404 $DIR/$tdir/striped_dir ||
19405 error "set striped dir error"
19407 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
19408 [ "$mode" = "755" ] || error "expect 755 got $mode"
19410 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
19411 error "getdirstripe failed"
19412 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
19413 if [ "$stripe_count" != "2" ]; then
19414 error "1:stripe_count is $stripe_count, expect 2"
19416 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
19417 if [ "$stripe_count" != "2" ]; then
19418 error "2:stripe_count is $stripe_count, expect 2"
19421 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
19422 if [ "$stripe_index" != "$mdt_index" ]; then
19423 error "stripe_index is $stripe_index, expect $mdt_index"
19426 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
19427 error "nlink error after create striped dir"
19429 mkdir $DIR/$tdir/striped_dir/a
19430 mkdir $DIR/$tdir/striped_dir/b
19432 stat $DIR/$tdir/striped_dir/a ||
19433 error "create dir under striped dir failed"
19434 stat $DIR/$tdir/striped_dir/b ||
19435 error "create dir under striped dir failed"
19437 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
19438 error "nlink error after mkdir"
19440 rmdir $DIR/$tdir/striped_dir/a
19441 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
19442 error "nlink error after rmdir"
19444 rmdir $DIR/$tdir/striped_dir/b
19445 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
19446 error "nlink error after rmdir"
19448 chattr +i $DIR/$tdir/striped_dir
19449 createmany -o $DIR/$tdir/striped_dir/f 10 &&
19450 error "immutable flags not working under striped dir!"
19451 chattr -i $DIR/$tdir/striped_dir
19453 rmdir $DIR/$tdir/striped_dir ||
19454 error "rmdir striped dir error"
19462 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
19463 skip "skipped for lustre < 2.7.0"
19464 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19465 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19467 test_striped_dir 0 || error "failed on striped dir on MDT0"
19468 test_striped_dir 1 || error "failed on striped dir on MDT0"
19470 run_test 300a "basic striped dir sanity test"
19473 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
19474 skip "skipped for lustre < 2.7.0"
19475 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19476 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19483 test_mkdir $DIR/$tdir || error "mkdir fail"
19484 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
19485 error "set striped dir error"
19486 for i in {0..9}; do
19487 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
19489 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
19490 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
19491 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
19493 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
19494 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
19495 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
19499 run_test 300b "check ctime/mtime for striped dir"
19502 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
19503 skip "skipped for lustre < 2.7.0"
19504 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19505 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19509 mkdir -p $DIR/$tdir
19510 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
19511 error "set striped dir error"
19513 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
19514 error "chown striped dir failed"
19516 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
19517 error "create 5k files failed"
19519 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
19521 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
19525 run_test 300c "chown && check ls under striped directory"
19528 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
19529 skip "skipped for lustre < 2.7.0"
19530 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19531 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19536 mkdir -p $DIR/$tdir
19537 $LFS setstripe -c 2 $DIR/$tdir
19539 #local striped directory
19540 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
19541 error "set striped dir error"
19542 createmany -o $DIR/$tdir/striped_dir/f 10 ||
19543 error "create 10 files failed"
19545 #remote striped directory
19546 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
19547 error "set striped dir error"
19548 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
19549 error "create 10 files failed"
19551 for file in $(find $DIR/$tdir); do
19552 stripe_count=$($LFS getstripe -c $file)
19553 [ $stripe_count -eq 2 ] ||
19554 error "wrong stripe $stripe_count for $file"
19559 run_test 300d "check default stripe under striped directory"
19562 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19563 skip "Need MDS version at least 2.7.55"
19564 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19565 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19570 mkdir -p $DIR/$tdir
19572 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
19573 error "set striped dir error"
19575 touch $DIR/$tdir/striped_dir/a
19576 touch $DIR/$tdir/striped_dir/b
19577 touch $DIR/$tdir/striped_dir/c
19579 mkdir $DIR/$tdir/striped_dir/dir_a
19580 mkdir $DIR/$tdir/striped_dir/dir_b
19581 mkdir $DIR/$tdir/striped_dir/dir_c
19583 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
19584 error "set striped adir under striped dir error"
19586 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
19587 error "set striped bdir under striped dir error"
19589 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
19590 error "set striped cdir under striped dir error"
19592 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
19593 error "rename dir under striped dir fails"
19595 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
19596 error "rename dir under different stripes fails"
19598 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
19599 error "rename file under striped dir should succeed"
19601 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
19602 error "rename dir under striped dir should succeed"
19606 run_test 300e "check rename under striped directory"
19609 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19610 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19611 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19612 skip "Need MDS version at least 2.7.55"
19618 mkdir -p $DIR/$tdir
19620 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
19621 error "set striped dir error"
19623 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
19624 error "set striped dir error"
19626 touch $DIR/$tdir/striped_dir/a
19627 mkdir $DIR/$tdir/striped_dir/dir_a
19628 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
19629 error "create striped dir under striped dir fails"
19631 touch $DIR/$tdir/striped_dir1/b
19632 mkdir $DIR/$tdir/striped_dir1/dir_b
19633 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
19634 error "create striped dir under striped dir fails"
19636 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
19637 error "rename dir under different striped dir should fail"
19639 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
19640 error "rename striped dir under diff striped dir should fail"
19642 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
19643 error "rename file under diff striped dirs fails"
19647 run_test 300f "check rename cross striped directory"
19649 test_300_check_default_striped_dir()
19652 local default_count=$2
19653 local default_index=$3
19656 local dir_stripe_index
19659 echo "checking $dirname $default_count $default_index"
19660 $LFS setdirstripe -D -c $default_count -i $default_index \
19661 -t all_char $DIR/$tdir/$dirname ||
19662 error "set default stripe on striped dir error"
19663 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
19664 [ $stripe_count -eq $default_count ] ||
19665 error "expect $default_count get $stripe_count for $dirname"
19667 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
19668 [ $stripe_index -eq $default_index ] ||
19669 error "expect $default_index get $stripe_index for $dirname"
19671 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
19672 error "create dirs failed"
19674 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
19675 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
19676 for dir in $(find $DIR/$tdir/$dirname/*); do
19677 stripe_count=$($LFS getdirstripe -c $dir)
19678 [ $stripe_count -eq $default_count ] ||
19679 [ $stripe_count -eq 0 ] || [ $default_count -eq 1 ] ||
19680 error "stripe count $default_count != $stripe_count for $dir"
19682 stripe_index=$($LFS getdirstripe -i $dir)
19683 [ $default_index -eq -1 ] ||
19684 [ $stripe_index -eq $default_index ] ||
19685 error "$stripe_index != $default_index for $dir"
19687 #check default stripe
19688 stripe_count=$($LFS getdirstripe -D -c $dir)
19689 [ $stripe_count -eq $default_count ] ||
19690 error "default count $default_count != $stripe_count for $dir"
19692 stripe_index=$($LFS getdirstripe -D -i $dir)
19693 [ $stripe_index -eq $default_index ] ||
19694 error "default index $default_index != $stripe_index for $dir"
19696 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
19700 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19701 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19702 skip "Need MDS version at least 2.7.55"
19709 mkdir $DIR/$tdir/normal_dir
19711 #Checking when client cache stripe index
19712 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
19713 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
19714 error "create striped_dir failed"
19716 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
19717 error "create dir0 fails"
19718 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
19719 [ $stripe_index -eq 0 ] ||
19720 error "dir0 expect index 0 got $stripe_index"
19722 mkdir $DIR/$tdir/striped_dir/dir1 ||
19723 error "create dir1 fails"
19724 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
19725 [ $stripe_index -eq 1 ] ||
19726 error "dir1 expect index 1 got $stripe_index"
19728 #check default stripe count/stripe index
19729 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
19730 test_300_check_default_striped_dir normal_dir 1 0
19731 test_300_check_default_striped_dir normal_dir 2 1
19732 test_300_check_default_striped_dir normal_dir 2 -1
19734 #delete default stripe information
19735 echo "delete default stripeEA"
19736 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
19737 error "set default stripe on striped dir error"
19739 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
19740 for dir in $(find $DIR/$tdir/normal_dir/*); do
19741 stripe_count=$($LFS getdirstripe -c $dir)
19742 [ $stripe_count -eq 0 ] ||
19743 error "expect 1 get $stripe_count for $dir"
19744 stripe_index=$($LFS getdirstripe -i $dir)
19745 [ $stripe_index -eq 0 ] ||
19746 error "expect 0 get $stripe_index for $dir"
19749 run_test 300g "check default striped directory for normal directory"
19752 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19753 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19754 skip "Need MDS version at least 2.7.55"
19760 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19761 error "set striped dir error"
19763 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
19764 test_300_check_default_striped_dir striped_dir 1 0
19765 test_300_check_default_striped_dir striped_dir 2 1
19766 test_300_check_default_striped_dir striped_dir 2 -1
19768 #delete default stripe information
19769 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
19770 error "set default stripe on striped dir error"
19772 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
19773 for dir in $(find $DIR/$tdir/striped_dir/*); do
19774 stripe_count=$($LFS getdirstripe -c $dir)
19775 [ $stripe_count -eq 0 ] ||
19776 error "expect 1 get $stripe_count for $dir"
19779 run_test 300h "check default striped directory for striped directory"
19782 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19783 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19784 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19785 skip "Need MDS version at least 2.7.55"
19792 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19793 error "set striped dir error"
19795 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
19796 error "create files under striped dir failed"
19798 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
19799 error "set striped hashdir error"
19801 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
19802 error "create dir0 under hash dir failed"
19803 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
19804 error "create dir1 under hash dir failed"
19806 # unfortunately, we need to umount to clear dir layout cache for now
19807 # once we fully implement dir layout, we can drop this
19808 umount_client $MOUNT || error "umount failed"
19809 mount_client $MOUNT || error "mount failed"
19811 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
19812 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
19813 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
19815 #set the stripe to be unknown hash type
19816 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
19817 $LCTL set_param fail_loc=0x1901
19818 for ((i = 0; i < 10; i++)); do
19819 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
19820 error "stat f-$i failed"
19821 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
19824 touch $DIR/$tdir/striped_dir/f0 &&
19825 error "create under striped dir with unknown hash should fail"
19827 $LCTL set_param fail_loc=0
19829 umount_client $MOUNT || error "umount failed"
19830 mount_client $MOUNT || error "mount failed"
19834 run_test 300i "client handle unknown hash type striped directory"
19837 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19838 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19839 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19840 skip "Need MDS version at least 2.7.55"
19847 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
19848 $LCTL set_param fail_loc=0x1702
19849 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19850 error "set striped dir error"
19852 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
19853 error "create files under striped dir failed"
19855 $LCTL set_param fail_loc=0
19857 rm -rf $DIR/$tdir || error "unlink striped dir fails"
19861 run_test 300j "test large update record"
19864 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19865 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19866 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19867 skip "Need MDS version at least 2.7.55"
19869 # this test needs a huge transaction
19871 kb=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19872 osd*.$FSNAME-MDT0000.kbytestotal")
19873 [ $kb -lt $((1024*1024)) ] && skip "MDT0 too small: $kb"
19880 #define OBD_FAIL_LARGE_STRIPE 0x1703
19881 $LCTL set_param fail_loc=0x1703
19882 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
19883 error "set striped dir error"
19884 $LCTL set_param fail_loc=0
19886 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19887 error "getstripeddir fails"
19888 rm -rf $DIR/$tdir/striped_dir ||
19889 error "unlink striped dir fails"
19893 run_test 300k "test large striped directory"
19896 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19897 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19898 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19899 skip "Need MDS version at least 2.7.55"
19903 test_mkdir -p $DIR/$tdir/striped_dir
19904 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
19905 error "chown $RUNAS_ID failed"
19906 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
19907 error "set default striped dir failed"
19909 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
19910 $LCTL set_param fail_loc=0x80000158
19911 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
19913 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
19914 [ $stripe_index -eq 1 ] ||
19915 error "expect 1 get $stripe_index for $dir"
19917 run_test 300l "non-root user to create dir under striped dir with stale layout"
19920 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19921 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
19922 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19923 skip "Need MDS version at least 2.7.55"
19925 mkdir -p $DIR/$tdir/striped_dir
19926 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
19927 error "set default stripes dir error"
19929 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
19931 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
19932 [ $stripe_count -eq 0 ] ||
19933 error "expect 0 get $stripe_count for a"
19935 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
19936 error "set default stripes dir error"
19938 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
19940 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
19941 [ $stripe_count -eq 0 ] ||
19942 error "expect 0 get $stripe_count for b"
19944 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
19945 error "set default stripes dir error"
19947 mkdir $DIR/$tdir/striped_dir/c &&
19948 error "default stripe_index is invalid, mkdir c should fails"
19950 rm -rf $DIR/$tdir || error "rmdir fails"
19952 run_test 300m "setstriped directory on single MDT FS"
19955 local list=$(comma_list $(mdts_nodes))
19958 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19962 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19963 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19964 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19965 skip "Need MDS version at least 2.7.55"
19966 remote_mds_nodsh && skip "remote MDS with nodsh"
19969 local list=$(comma_list $(mdts_nodes))
19971 trap cleanup_300n RETURN EXIT
19972 mkdir -p $DIR/$tdir
19973 chmod 777 $DIR/$tdir
19974 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
19975 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19976 error "create striped dir succeeds with gid=0"
19978 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19979 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
19980 error "create striped dir fails with gid=-1"
19982 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19983 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
19984 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19985 error "set default striped dir succeeds with gid=0"
19988 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19989 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
19990 error "set default striped dir fails with gid=-1"
19993 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19994 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
19995 error "create test_dir fails"
19996 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
19997 error "create test_dir1 fails"
19998 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
19999 error "create test_dir2 fails"
20002 run_test 300n "non-root user to create dir under striped dir with default EA"
20005 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20006 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20007 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
20008 skip "Need MDS version at least 2.7.55"
20013 mkdir -p $DIR/$tdir
20015 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
20016 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
20017 if [ $numfree1 -lt 66000 ] || [ $numfree2 -lt 66000 ]; then
20018 skip "not enough free inodes $numfree1 $numfree2"
20021 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
20022 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
20023 if [ $numfree1 -lt 300000 ] || [ $numfree2 -lt 300000 ]; then
20024 skip "not enough free space $numfree1 $numfree2"
20027 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
20028 error "setdirstripe fails"
20030 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
20031 error "create dirs fails"
20033 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
20034 ls $DIR/$tdir/striped_dir > /dev/null ||
20035 error "ls striped dir fails"
20036 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
20037 error "unlink big striped dir fails"
20039 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
20042 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20043 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20044 remote_mds_nodsh && skip "remote MDS with nodsh"
20046 mkdir -p $DIR/$tdir
20048 #define OBD_FAIL_OUT_ENOSPC 0x1704
20049 do_facet mds2 lctl set_param fail_loc=0x80001704
20050 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
20051 && error "create striped directory should fail"
20053 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
20055 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
20058 run_test 300p "create striped directory without space"
20061 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20062 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20064 local fd=$(free_fd)
20065 local cmd="exec $fd<$tdir"
20067 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
20070 trap "eval $cmd" EXIT
20071 cd $tdir || error "cd $tdir fails"
20072 rmdir ../$tdir || error "rmdir $tdir fails"
20073 mkdir local_dir && error "create dir succeeds"
20074 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
20078 run_test 300q "create remote directory under orphan directory"
20081 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
20082 skip "Need MDS version at least 2.7.55" && return
20083 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
20087 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
20088 error "set striped dir error"
20090 $LFS getdirstripe $DIR/$tdir/striped_dir ||
20091 error "getstripeddir fails"
20094 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
20095 awk '/lmv_stripe_count:/ { print $2 }')
20097 [ $MDSCOUNT -ne $stripe_count ] &&
20098 error "wrong stripe count $stripe_count expected $MDSCOUNT"
20100 rm -rf $DIR/$tdir/striped_dir ||
20101 error "unlink striped dir fails"
20103 run_test 300r "test -1 striped directory"
20105 prepare_remote_file() {
20106 mkdir $DIR/$tdir/src_dir ||
20107 error "create remote source failed"
20109 cp /etc/hosts $DIR/$tdir/src_dir/a ||
20110 error "cp to remote source failed"
20111 touch $DIR/$tdir/src_dir/a
20113 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
20114 error "create remote target dir failed"
20116 touch $DIR/$tdir/tgt_dir/b
20118 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
20119 error "rename dir cross MDT failed!"
20121 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
20122 error "src_child still exists after rename"
20124 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
20125 error "missing file(a) after rename"
20127 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
20128 error "diff after rename"
20132 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
20133 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20135 local remote_file=$DIR/$tdir/tgt_dir/b
20137 mkdir -p $DIR/$tdir
20139 prepare_remote_file || error "prepare remote file failed"
20142 $OPENUNLINK $remote_file $remote_file ||
20143 error "openunlink $remote_file failed"
20144 $CHECKSTAT -a $remote_file || error "$remote_file exists"
20146 run_test 310a "open unlink remote file"
20149 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
20150 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20152 local remote_file=$DIR/$tdir/tgt_dir/b
20154 mkdir -p $DIR/$tdir
20156 prepare_remote_file || error "prepare remote file failed"
20158 ln $remote_file $DIR/$tfile || error "link failed for remote file"
20159 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
20160 $CHECKSTAT -t file $remote_file || error "check file failed"
20162 run_test 310b "unlink remote file with multiple links while open"
20165 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20166 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
20168 local remote_file=$DIR/$tdir/tgt_dir/b
20170 mkdir -p $DIR/$tdir
20172 prepare_remote_file || error "prepare remote file failed"
20174 ln $remote_file $DIR/$tfile || error "link failed for remote file"
20175 multiop_bg_pause $remote_file O_uc ||
20176 error "mulitop failed for remote file"
20178 $MULTIOP $DIR/$tfile Ouc
20179 kill -USR1 $MULTIPID
20182 run_test 310c "open-unlink remote file with multiple links"
20186 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20187 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
20188 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
20189 skip "lustre < 2.8.54 does not contain LU-4825 fix"
20190 remote_mds_nodsh && skip "remote MDS with nodsh"
20192 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
20193 local mdts=$(comma_list $(mdts_nodes))
20195 mkdir -p $DIR/$tdir
20196 $LFS setstripe -i 0 -c 1 $DIR/$tdir
20197 createmany -o $DIR/$tdir/$tfile. 1000
20199 # statfs data is not real time, let's just calculate it
20200 old_iused=$((old_iused + 1000))
20202 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
20203 osp.*OST0000*MDT0000.create_count")
20204 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
20205 osp.*OST0000*MDT0000.max_create_count")
20206 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
20208 $LFS setstripe -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
20209 local index=$($LFS getstripe -i $DIR/$tdir/$tfile)
20210 [ $index -ne 0 ] || error "$tfile stripe index is 0"
20212 unlinkmany $DIR/$tdir/$tfile. 1000
20214 do_nodes $mdts "$LCTL set_param -n \
20215 osp.*OST0000*.max_create_count=$max_count"
20216 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
20217 do_nodes $mdts "$LCTL set_param -n \
20218 osp.*OST0000*.create_count=$count"
20219 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
20220 grep "=0" && error "create_count is zero"
20223 for i in $(seq 120); do
20224 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
20225 # system may be too busy to destroy all objs in time, use
20226 # a somewhat small value to not fail autotest
20227 [ $((old_iused - new_iused)) -gt 400 ] && break
20231 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
20232 [ $((old_iused - new_iused)) -gt 400 ] ||
20233 error "objs not destroyed after unlink"
20235 run_test 311 "disable OSP precreate, and unlink should destroy objs"
20242 local vdevdir=$(dirname $(facet_vdevice $ost))
20243 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
20244 local zfs_zapid=$(do_facet $ost $cmd |
20245 grep -w "/O/0/d$((objid%32))" -C 5 |
20246 awk '/Object/{getline; print $1}')
20247 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
20248 awk "/$objid = /"'{printf $3}')
20253 zfs_object_blksz() {
20257 local vdevdir=$(dirname $(facet_vdevice $ost))
20258 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
20259 local blksz=$(do_facet $ost $cmd $objid |
20260 awk '/dblk/{getline; printf $4}')
20262 case "${blksz: -1}" in
20263 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
20264 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
20271 test_312() { # LU-4856
20272 remote_ost_nodsh && skip "remote OST with nodsh"
20273 [ "$ost1_FSTYPE" = "zfs" ] ||
20274 skip_env "the test only applies to zfs"
20276 local max_blksz=$(do_facet ost1 \
20277 $ZFS get -p recordsize $(facet_device ost1) |
20278 awk '!/VALUE/{print $3}')
20280 # to make life a little bit easier
20281 $LFS mkdir -c 1 -i 0 $DIR/$tdir
20282 $LFS setstripe -c 1 -i 0 $DIR/$tdir
20284 local tf=$DIR/$tdir/$tfile
20286 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
20288 # Get ZFS object id
20289 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
20290 # block size change by sequential overwrite
20293 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
20294 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
20296 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
20297 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
20301 # block size change by sequential append write
20302 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
20303 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
20304 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
20307 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
20308 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
20309 oflag=sync conv=notrunc
20311 blksz=$(zfs_object_blksz ost1 $zfs_objid)
20312 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
20313 error "blksz error, actual $blksz, " \
20314 "expected: 2 * $count * $PAGE_SIZE"
20320 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
20321 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
20323 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
20324 blksz=$(zfs_object_blksz ost1 $zfs_objid)
20325 [ $blksz -eq $PAGE_SIZE ] ||
20326 error "blksz error: $blksz, expected: $PAGE_SIZE"
20328 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
20329 blksz=$(zfs_object_blksz ost1 $zfs_objid)
20330 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
20332 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
20333 blksz=$(zfs_object_blksz ost1 $zfs_objid)
20334 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
20336 run_test 312 "make sure ZFS adjusts its block size by write pattern"
20339 remote_ost_nodsh && skip "remote OST with nodsh"
20341 local file=$DIR/$tfile
20344 $LFS setstripe -c 1 -i 0 $file || error "setstripe failed"
20346 # define OBD_FAIL_TGT_RCVD_EIO 0x720
20347 do_facet ost1 "$LCTL set_param fail_loc=0x720"
20348 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
20349 error "write should failed"
20350 do_facet ost1 "$LCTL set_param fail_loc=0"
20353 run_test 313 "io should fail after last_rcvd update fail"
20356 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
20358 $LFS setstripe -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
20359 do_facet ost1 "$LCTL set_param fail_loc=0x720"
20361 wait_delete_completed
20362 do_facet ost1 "$LCTL set_param fail_loc=0"
20364 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
20366 test_315() { # LU-618
20367 [ -f /proc/$$/io ] || skip_env "no IO accounting in kernel"
20369 local file=$DIR/$tfile
20372 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
20373 error "multiop file write failed"
20374 $MULTIOP $file oO_RDONLY:r4063232_c &
20379 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
20382 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
20385 run_test 315 "read should be accounted"
20388 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20389 large_xattr_enabled || skip_env "ea_inode feature disabled"
20391 rm -rf $DIR/$tdir/d
20392 mkdir -p $DIR/$tdir/d
20393 chown nobody $DIR/$tdir/d
20394 touch $DIR/$tdir/d/file
20396 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
20398 run_test 316 "lfs mv"
20401 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
20402 skip "Need MDS version at least 2.11.53"
20403 if [ "$ost1_FSTYPE" == "zfs" ]; then
20404 skip "LU-10370: no implementation for ZFS"
20408 local grant_blk_size
20410 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
20411 awk '/grant_block_size:/ { print $2; exit; }')
20413 # Create File of size 5M. Truncate it to below size's and verify
20416 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
20417 error "Create file $DIR/$tfile failed"
20418 stack_trap "rm -f $DIR/$tfile" EXIT
20420 for trunc_sz in 2097152 4097 4000 509 0; do
20421 $TRUNCATE $DIR/$tfile $trunc_sz ||
20422 error "truncate $tfile to $trunc_sz failed"
20423 local sz=$(stat --format=%s $DIR/$tfile)
20424 local blk=$(stat --format=%b $DIR/$tfile)
20425 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
20426 grant_blk_size) * 8))
20428 if [[ $blk -ne $trunc_blk ]]; then
20429 $(which stat) $DIR/$tfile
20430 error "Expected Block $trunc_blk got $blk for $tfile"
20433 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
20434 error "Expected Size $trunc_sz got $sz for $tfile"
20439 # Create file with a hole and write actual two blocks. Block count
20442 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
20443 conv=fsync || error "Create file : $DIR/$tfile"
20445 # Calculate the final truncate size.
20446 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
20449 # truncate to size $trunc_sz bytes. Strip the last block
20450 # The block count must drop to 8
20452 $TRUNCATE $DIR/$tfile $trunc_sz ||
20453 error "truncate $tfile to $trunc_sz failed"
20455 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
20456 sz=$(stat --format=%s $DIR/$tfile)
20457 blk=$(stat --format=%b $DIR/$tfile)
20459 if [[ $blk -ne $trunc_bsz ]]; then
20460 $(which stat) $DIR/$tfile
20461 error "Expected Block $trunc_bsz got $blk for $tfile"
20464 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
20465 error "Expected Size $trunc_sz got $sz for $tfile"
20467 run_test 317 "Verify blocks get correctly update after truncate"
20470 local old_max_active=$($LCTL get_param -n \
20471 llite.*.max_read_ahead_async_active 2>/dev/null)
20473 $LCTL set_param llite.*.max_read_ahead_async_active=256
20474 local max_active=$($LCTL get_param -n \
20475 llite.*.max_read_ahead_async_active 2>/dev/null)
20476 [ $max_active -ne 256 ] && error "expected 256 but got $max_active"
20478 # currently reset to 0 is unsupported, leave it 512 for now.
20479 $LCTL set_param llite.*.max_read_ahead_async_active=0 &&
20480 error "set max_read_ahead_async_active should fail"
20482 $LCTL set_param llite.*.max_read_ahead_async_active=512
20483 max_active=$($LCTL get_param -n \
20484 llite.*.max_read_ahead_async_active 2>/dev/null)
20485 [ $max_active -eq 512 ] || error "expected 512 but got $max_active"
20487 # restore @max_active
20488 [ $old_max_active -ne 0 ] && $LCTL set_param \
20489 llite.*.max_read_ahead_async_active=$old_max_active
20491 local old_threshold=$($LCTL get_param -n \
20492 llite.*.read_ahead_async_file_threshold_mb 2>/dev/null)
20493 local max_per_file_mb=$($LCTL get_param -n \
20494 llite.*.max_read_ahead_per_file_mb 2>/dev/null)
20496 local invalid=$(($max_per_file_mb + 1))
20498 llite.*.read_ahead_async_file_threshold_mb=$invalid\
20499 && error "set $invalid should fail"
20501 local valid=$(($invalid - 1))
20503 llite.*.read_ahead_async_file_threshold_mb=$valid ||
20504 error "set $valid should succeed"
20505 local threshold=$($LCTL get_param -n \
20506 llite.*.read_ahead_async_file_threshold_mb 2>/dev/null)
20507 [ $threshold -eq $valid ] || error \
20508 "expect threshold $valid got $threshold"
20510 llite.*.read_ahead_async_file_threshold_mb=$old_threshold
20512 run_test 318 "Verify async readahead tunables"
20515 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
20517 local before=$(date +%s)
20519 local mdir=$DIR/$tdir
20520 local file=$mdir/xxx
20522 $LFS mkdir -i0 $mdir || error "mkdir $mdir fails"
20525 #define OBD_FAIL_LDLM_LOCAL_CANCEL_PAUSE 0x32c
20526 $LCTL set_param fail_val=5 fail_loc=0x8000032c
20527 $LFS mv -m1 $file &
20530 dd if=$file of=/dev/null
20532 evict=$($LCTL get_param mdc.$FSNAME-MDT*.state |
20533 awk -F"[ [,]" '/EVICTED ]$/ { if (mx<$5) {mx=$5;} } END { print mx }')
20535 [ -z "$evict" ] || [[ $evict -le $before ]] || error "eviction happened"
20537 run_test 319 "lost lease lock on migrate error"
20539 test_398a() { # LU-4198
20540 $LFS setstripe -c 1 -i 0 $DIR/$tfile
20541 $LCTL set_param ldlm.namespaces.*.lru_size=clear
20543 # request a new lock on client
20544 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
20546 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
20547 local lock_count=$($LCTL get_param -n \
20548 ldlm.namespaces.*-OST0000-osc-ffff*.lru_size)
20549 [[ $lock_count -eq 0 ]] || error "lock should be cancelled by direct IO"
20551 $LCTL set_param ldlm.namespaces.*-OST0000-osc-ffff*.lru_size=clear
20553 # no lock cached, should use lockless IO and not enqueue new lock
20554 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
20555 lock_count=$($LCTL get_param -n \
20556 ldlm.namespaces.*-OST0000-osc-ffff*.lru_size)
20557 [[ $lock_count -eq 0 ]] || error "no lock should be held by direct IO"
20559 run_test 398a "direct IO should cancel lock otherwise lockless"
20561 test_398b() { # LU-4198
20562 which fio || skip_env "no fio installed"
20563 $LFS setstripe -c -1 $DIR/$tfile
20566 dd if=/dev/zero of=$DIR/$tfile bs=1M count=$size
20569 echo "mix direct rw ${size}M to OST0 by fio with $njobs jobs..."
20570 fio --name=rand-rw --rw=randrw --bs=$PAGE_SIZE --direct=1 \
20571 --numjobs=$njobs --fallocate=none \
20572 --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
20573 --filename=$DIR/$tfile &
20576 echo "mix buffer rw ${size}M to OST0 by fio with $njobs jobs..."
20577 fio --name=rand-rw --rw=randrw --bs=$PAGE_SIZE \
20578 --numjobs=$njobs --fallocate=none \
20579 --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
20580 --filename=$DIR/$tfile || true
20585 run_test 398b "DIO and buffer IO race"
20587 test_398c() { # LU-4198
20588 which fio || skip_env "no fio installed"
20590 saved_debug=$($LCTL get_param -n debug)
20591 $LCTL set_param debug=0
20593 local size=$(lctl get_param -n osc.$FSNAME-OST0000*.kbytesavail | head -1)
20594 ((size /= 1024)) # by megabytes
20595 ((size /= 2)) # write half of the OST at most
20596 [ $size -gt 40 ] && size=40 #reduce test time anyway
20598 $LFS setstripe -c 1 $DIR/$tfile
20600 # it seems like ldiskfs reserves more space than necessary if the
20601 # writing blocks are not mapped, so it extends the file firstly
20602 dd if=/dev/zero of=$DIR/$tfile bs=1M count=$size && sync
20603 cancel_lru_locks osc
20605 # clear and verify rpc_stats later
20606 $LCTL set_param osc.${FSNAME}-OST0000-osc-ffff*.rpc_stats=clear
20609 echo "writing ${size}M to OST0 by fio with $njobs jobs..."
20610 fio --name=rand-write --rw=randwrite --bs=$PAGE_SIZE --direct=1 \
20611 --numjobs=$njobs --fallocate=none --ioengine=libaio \
20612 --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
20613 --filename=$DIR/$tfile
20614 [ $? -eq 0 ] || error "fio write error"
20616 [ $($LCTL get_param -n \
20617 ldlm.namespaces.${FSNAME}-OST0000-osc-ffff*.lock_count) -eq 0 ] ||
20618 error "Locks were requested while doing AIO"
20620 # get the percentage of 1-page I/O
20621 pct=$($LCTL get_param osc.${FSNAME}-OST0000-osc-ffff*.rpc_stats |
20622 grep -A 1 'pages per rpc' | grep -v 'pages per rpc' |
20624 [ $pct -le 50 ] || error "$pct% of I/O are 1-page"
20626 echo "mix rw ${size}M to OST0 by fio with $njobs jobs..."
20627 fio --name=rand-rw --rw=randrw --bs=$PAGE_SIZE --direct=1 \
20628 --numjobs=$njobs --fallocate=none --ioengine=libaio \
20629 --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
20630 --filename=$DIR/$tfile
20631 [ $? -eq 0 ] || error "fio mixed read write error"
20634 $LCTL set_param debug="$saved_debug"
20636 run_test 398c "run fio to test AIO"
20639 local read_write=$1
20640 if [ "$read_write" = "write" ]; then
20641 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
20642 elif [ "$read_write" = "read" ]; then
20643 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
20645 error "argument error"
20648 # turn off debug for performance testing
20649 local saved_debug=$($LCTL get_param -n debug)
20650 $LCTL set_param debug=0
20652 $LFS setstripe -c 1 -i 0 $DIR/$tfile
20654 # get ost1 size - $FSNAME-OST0000
20655 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
20656 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
20657 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
20659 if [ "$read_write" = "read" ]; then
20660 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
20663 local start_time=$(date +%s.%N)
20664 $dd_cmd bs=1M count=$blocks oflag=sync ||
20665 error "real dd $read_write error"
20666 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
20668 if [ "$read_write" = "write" ]; then
20672 # define OBD_FAIL_OST_FAKE_RW 0x238
20673 do_facet ost1 $LCTL set_param fail_loc=0x238
20675 local start_time=$(date +%s.%N)
20676 $dd_cmd bs=1M count=$blocks oflag=sync ||
20677 error "fake dd $read_write error"
20678 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
20680 if [ "$read_write" = "write" ]; then
20682 cancel_lru_locks osc
20683 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
20684 error "$tfile size not $blocks MB"
20686 do_facet ost1 $LCTL set_param fail_loc=0
20688 echo "fake $read_write $duration_fake vs. normal $read_write" \
20689 "$duration in seconds"
20690 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
20691 error_not_in_vm "fake write is slower"
20693 $LCTL set_param -n debug="$saved_debug"
20696 test_399a() { # LU-7655 for OST fake write
20697 remote_ost_nodsh && skip "remote OST with nodsh"
20701 run_test 399a "fake write should not be slower than normal write"
20703 test_399b() { # LU-8726 for OST fake read
20704 remote_ost_nodsh && skip "remote OST with nodsh"
20705 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
20706 skip_env "ldiskfs only test"
20711 run_test 399b "fake read should not be slower than normal read"
20713 test_400a() { # LU-1606, was conf-sanity test_74
20714 if ! which $CC > /dev/null 2>&1; then
20715 skip_env "$CC is not installed"
20718 local extra_flags=''
20719 local out=$TMP/$tfile
20720 local prefix=/usr/include/lustre
20723 if ! [[ -d $prefix ]]; then
20724 # Assume we're running in tree and fixup the include path.
20725 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
20726 extra_flags+=" -L$LUSTRE/utils/.lib"
20729 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
20730 $CC -Wall -Werror $extra_flags -o $out $prog -llustreapi ||
20731 error "client api broken"
20735 run_test 400a "Lustre client api program can compile and link"
20737 test_400b() { # LU-1606, LU-5011
20739 local out=$TMP/$tfile
20740 local prefix=/usr/include/linux/lustre
20742 # We use a hard coded prefix so that this test will not fail
20743 # when run in tree. There are headers in lustre/include/lustre/
20744 # that are not packaged (like lustre_idl.h) and have more
20745 # complicated include dependencies (like config.h and lnet/types.h).
20746 # Since this test about correct packaging we just skip them when
20747 # they don't exist (see below) rather than try to fixup cppflags.
20749 if ! which $CC > /dev/null 2>&1; then
20750 skip_env "$CC is not installed"
20753 for header in $prefix/*.h; do
20754 if ! [[ -f "$header" ]]; then
20758 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
20759 continue # lustre_ioctl.h is internal header
20762 $CC -Wall -Werror -include $header -c -x c /dev/null -o $out ||
20763 error "cannot compile '$header'"
20767 run_test 400b "packaged headers can be compiled"
20769 test_401a() { #LU-7437
20770 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
20771 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
20773 #count the number of parameters by "list_param -R"
20774 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
20775 #count the number of parameters by listing proc files
20776 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
20777 echo "proc_dirs='$proc_dirs'"
20778 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
20779 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
20782 [ $params -eq $procs ] ||
20783 error "found $params parameters vs. $procs proc files"
20785 # test the list_param -D option only returns directories
20786 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
20787 #count the number of parameters by listing proc directories
20788 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
20791 [ $params -eq $procs ] ||
20792 error "found $params parameters vs. $procs proc files"
20794 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
20797 local save=$($LCTL get_param -n jobid_var)
20800 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
20801 error "no error returned when setting bad parameters"
20803 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
20804 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
20806 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
20807 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
20808 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
20810 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
20813 local jobid_var_old=$($LCTL get_param -n jobid_var)
20814 local jobid_var_new
20816 $LCTL set_param jobid_var= &&
20817 error "no error returned for 'set_param a='"
20819 jobid_var_new=$($LCTL get_param -n jobid_var)
20820 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
20821 error "jobid_var was changed by setting without value"
20823 $LCTL set_param jobid_var &&
20824 error "no error returned for 'set_param a'"
20826 jobid_var_new=$($LCTL get_param -n jobid_var)
20827 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
20828 error "jobid_var was changed by setting without value"
20830 run_test 401c "Verify 'lctl set_param' without value fails in either format."
20833 local jobid_var_old=$($LCTL get_param -n jobid_var)
20834 local jobid_var_new
20835 local new_value="foo=bar"
20837 $LCTL set_param jobid_var=$new_value ||
20838 error "'set_param a=b' did not accept a value containing '='"
20840 jobid_var_new=$($LCTL get_param -n jobid_var)
20841 [[ "$jobid_var_new" == "$new_value" ]] ||
20842 error "'set_param a=b' failed on a value containing '='"
20844 # Reset the jobid_var to test the other format
20845 $LCTL set_param jobid_var=$jobid_var_old
20846 jobid_var_new=$($LCTL get_param -n jobid_var)
20847 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
20848 error "failed to reset jobid_var"
20850 $LCTL set_param jobid_var $new_value ||
20851 error "'set_param a b' did not accept a value containing '='"
20853 jobid_var_new=$($LCTL get_param -n jobid_var)
20854 [[ "$jobid_var_new" == "$new_value" ]] ||
20855 error "'set_param a b' failed on a value containing '='"
20857 $LCTL set_param jobid_var $jobid_var_old
20858 jobid_var_new=$($LCTL get_param -n jobid_var)
20859 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
20860 error "failed to reset jobid_var"
20862 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
20865 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
20866 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
20867 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
20868 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
20869 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
20870 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
20871 remote_mds_nodsh && skip "remote MDS with nodsh"
20873 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
20874 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
20875 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
20876 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
20877 echo "Touch failed - OK"
20879 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
20882 local file1=$DIR/$tfile.1
20883 local file2=$DIR/$tfile.2
20884 local tfile=$TMP/$tfile
20886 rm -f $file1 $file2 $tfile
20891 # 30 sec OBD_TIMEOUT in ll_getattr()
20892 # right before populating st_nlink
20893 $LCTL set_param fail_loc=0x80001409
20894 stat -c %h $file1 > $tfile &
20896 # create an alias, drop all locks and reclaim the dentry
20898 cancel_lru_locks mdc
20899 cancel_lru_locks osc
20900 sysctl -w vm.drop_caches=2
20904 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
20906 rm -f $tfile $file1 $file2
20908 run_test 403 "i_nlink should not drop to zero due to aliasing"
20910 test_404() { # LU-6601
20911 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
20912 skip "Need server version newer than 2.8.52"
20913 remote_mds_nodsh && skip "remote MDS with nodsh"
20915 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
20916 awk '/osp .*-osc-MDT/ { print $4}')
20919 for osp in $mosps; do
20920 echo "Deactivate: " $osp
20921 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
20922 local stat=$(do_facet $SINGLEMDS $LCTL dl |
20923 awk -vp=$osp '$4 == p { print $2 }')
20924 [ $stat = IN ] || {
20925 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
20926 error "deactivate error"
20928 echo "Activate: " $osp
20929 do_facet $SINGLEMDS $LCTL --device %$osp activate
20930 local stat=$(do_facet $SINGLEMDS $LCTL dl |
20931 awk -vp=$osp '$4 == p { print $2 }')
20932 [ $stat = UP ] || {
20933 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
20934 error "activate error"
20938 run_test 404 "validate manual {de}activated works properly for OSPs"
20941 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
20942 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] ||
20943 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
20944 skip "Layout swap lock is not supported"
20946 check_swap_layouts_support
20948 test_mkdir $DIR/$tdir
20949 swap_lock_test -d $DIR/$tdir ||
20950 error "One layout swap locked test failed"
20952 run_test 405 "Various layout swap lock tests"
20955 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20956 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
20957 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
20958 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20959 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
20960 skip "Need MDS version at least 2.8.50"
20962 local def_stripe_size=$($LFS getstripe -S $MOUNT)
20963 local test_pool=$TESTNAME
20965 pool_add $test_pool || error "pool_add failed"
20966 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
20967 error "pool_add_targets failed"
20969 save_layout_restore_at_exit $MOUNT
20971 # parent set default stripe count only, child will stripe from both
20972 # parent and fs default
20973 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
20974 error "setstripe $MOUNT failed"
20975 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
20976 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
20977 for i in $(seq 10); do
20978 local f=$DIR/$tdir/$tfile.$i
20979 touch $f || error "touch failed"
20980 local count=$($LFS getstripe -c $f)
20981 [ $count -eq $OSTCOUNT ] ||
20982 error "$f stripe count $count != $OSTCOUNT"
20983 local offset=$($LFS getstripe -i $f)
20984 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
20985 local size=$($LFS getstripe -S $f)
20986 [ $size -eq $((def_stripe_size * 2)) ] ||
20987 error "$f stripe size $size != $((def_stripe_size * 2))"
20988 local pool=$($LFS getstripe -p $f)
20989 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
20992 # change fs default striping, delete parent default striping, now child
20993 # will stripe from new fs default striping only
20994 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
20995 error "change $MOUNT default stripe failed"
20996 $LFS setstripe -c 0 $DIR/$tdir ||
20997 error "delete $tdir default stripe failed"
20998 for i in $(seq 11 20); do
20999 local f=$DIR/$tdir/$tfile.$i
21000 touch $f || error "touch $f failed"
21001 local count=$($LFS getstripe -c $f)
21002 [ $count -eq 1 ] || error "$f stripe count $count != 1"
21003 local offset=$($LFS getstripe -i $f)
21004 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
21005 local size=$($LFS getstripe -S $f)
21006 [ $size -eq $def_stripe_size ] ||
21007 error "$f stripe size $size != $def_stripe_size"
21008 local pool=$($LFS getstripe -p $f)
21009 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
21012 unlinkmany $DIR/$tdir/$tfile. 1 20
21014 local f=$DIR/$tdir/$tfile
21015 pool_remove_all_targets $test_pool $f
21016 pool_remove $test_pool $f
21018 run_test 406 "DNE support fs default striping"
21021 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
21022 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
21023 skip "Need MDS version at least 2.8.55"
21024 remote_mds_nodsh && skip "remote MDS with nodsh"
21026 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
21027 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
21028 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
21029 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
21030 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
21032 #define OBD_FAIL_DT_TXN_STOP 0x2019
21033 for idx in $(seq $MDSCOUNT); do
21034 do_facet mds$idx "lctl set_param fail_loc=0x2019"
21036 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
21037 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
21038 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
21041 run_test 407 "transaction fail should cause operation fail"
21044 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
21046 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
21047 lctl set_param fail_loc=0x8000040a
21048 # let ll_prepare_partial_page() fail
21049 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
21053 # create at least 100 unused inodes so that
21054 # shrink_icache_memory(0) should not return 0
21055 touch $DIR/$tfile-{0..100}
21056 rm -f $DIR/$tfile-{0..100}
21059 echo 2 > /proc/sys/vm/drop_caches
21061 run_test 408 "drop_caches should not hang due to page leaks"
21065 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
21067 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
21068 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
21069 touch $DIR/$tdir/guard || error "(2) Fail to create"
21071 local PREFIX=$(str_repeat 'A' 128)
21072 echo "Create 1K hard links start at $(date)"
21073 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
21074 error "(3) Fail to hard link"
21076 echo "Links count should be right although linkEA overflow"
21077 stat $DIR/$tdir/guard || error "(4) Fail to stat"
21078 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
21079 [ $linkcount -eq 1001 ] ||
21080 error "(5) Unexpected hard links count: $linkcount"
21082 echo "List all links start at $(date)"
21083 ls -l $DIR/$tdir/foo > /dev/null ||
21084 error "(6) Fail to list $DIR/$tdir/foo"
21086 echo "Unlink hard links start at $(date)"
21087 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
21088 error "(7) Fail to unlink"
21089 echo "Unlink hard links finished at $(date)"
21091 run_test 409 "Large amount of cross-MDTs hard links on the same file"
21095 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
21096 skip "Need client version at least 2.9.59"
21098 # Create a file, and stat it from the kernel
21099 local testfile=$DIR/$tfile
21102 local run_id=$RANDOM
21103 local my_ino=$(stat --format "%i" $testfile)
21105 # Try to insert the module. This will always fail as the
21106 # module is designed to not be inserted.
21107 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
21110 # Anything but success is a test failure
21112 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
21113 error "no inode match"
21115 run_test 410 "Test inode number returned from kernel thread"
21117 cleanup_test411_cgroup() {
21123 local cg_basedir=/sys/fs/cgroup/memory
21125 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
21126 skip "no setup for cgroup"
21128 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
21129 error "test file creation failed"
21130 cancel_lru_locks osc
21132 # Create a very small memory cgroup to force a slab allocation error
21133 local cgdir=$cg_basedir/osc_slab_alloc
21134 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
21135 trap "cleanup_test411_cgroup $cgdir" EXIT
21136 echo 2M > $cgdir/memory.kmem.limit_in_bytes
21137 echo 1M > $cgdir/memory.limit_in_bytes
21139 # Should not LBUG, just be killed by oom-killer
21140 # dd will return 0 even allocation failure in some environment.
21141 # So don't check return value
21142 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
21143 cleanup_test411_cgroup $cgdir
21147 run_test 411 "Slab allocation error with cgroup does not LBUG"
21150 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
21151 if [ $MDS1_VERSION -lt $(version_code 2.10.55) ]; then
21152 skip "Need server version at least 2.10.55"
21155 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
21156 error "mkdir failed"
21157 $LFS getdirstripe $DIR/$tdir
21158 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
21159 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
21160 error "expect $((MDSCOUT - 1)) get $stripe_index"
21161 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
21162 [ $stripe_count -eq 2 ] ||
21163 error "expect 2 get $stripe_count"
21165 run_test 412 "mkdir on specific MDTs"
21169 local stripe_count=$2
21170 local mdts=$(comma_list $(mdts_nodes))
21173 local lmv_qos_prio_free
21174 local lmv_qos_threshold_rr
21175 local lmv_qos_maxage
21176 local lod_qos_prio_free
21177 local lod_qos_threshold_rr
21178 local lod_qos_maxage
21182 lmv_qos_prio_free=$($LCTL get_param -n lmv.*.qos_prio_free | head -n1)
21183 lmv_qos_prio_free=${lmv_qos_prio_free%%%}
21184 lmv_qos_threshold_rr=$($LCTL get_param -n lmv.*.qos_threshold_rr |
21186 lmv_qos_threshold_rr=${lmv_qos_threshold_rr%%%}
21187 lmv_qos_maxage=$($LCTL get_param -n lmv.*.qos_maxage)
21188 stack_trap "$LCTL set_param \
21189 lmv.*.qos_prio_free=$lmv_qos_prio_free > /dev/null" EXIT
21190 stack_trap "$LCTL set_param \
21191 lmv.*.qos_threshold_rr=$lmv_qos_threshold_rr > /dev/null" EXIT
21192 stack_trap "$LCTL set_param \
21193 lmv.*.qos_maxage=$lmv_qos_maxage > /dev/null" EXIT
21195 lod_qos_prio_free=$(do_facet mds1 $LCTL get_param -n \
21196 lod.$FSNAME-MDT0000-mdtlov.mdt_qos_prio_free | head -n1)
21197 lod_qos_prio_free=${lod_qos_prio_free%%%}
21198 lod_qos_threshold_rr=$(do_facet mds1 $LCTL get_param -n \
21199 lod.$FSNAME-MDT0000-mdtlov.mdt_qos_threshold_rr | head -n1)
21200 lod_qos_threshold_rr=${lod_qos_threshold_rr%%%}
21201 lod_qos_maxage=$(do_facet mds1 $LCTL get_param -n \
21202 lod.$FSNAME-MDT0000-mdtlov.qos_maxage | awk '{ print $1 }')
21203 stack_trap "do_nodes $mdts $LCTL set_param \
21204 lod.*.mdt_qos_prio_free=$lod_qos_prio_free > /dev/null" EXIT
21205 stack_trap "do_nodes $mdts $LCTL set_param \
21206 lod.*.mdt_qos_threshold_rr=$lod_qos_threshold_rr > /dev/null" \
21208 stack_trap "do_nodes $mdts $LCTL set_param \
21209 lod.*.mdt_qos_maxage=$lod_qos_maxage > /dev/null" EXIT
21212 echo "Mkdir (stripe_count $stripe_count) roundrobin:"
21214 $LCTL set_param lmv.*.qos_threshold_rr=100 > /dev/null
21215 do_nodes $mdts $LCTL set_param lod.*.mdt_qos_threshold_rr=100 > /dev/null
21217 testdir=$DIR/$tdir-s$stripe_count/rr
21219 for i in $(seq $((100 * MDSCOUNT))); do
21220 eval $mkdir_cmd $testdir/subdir$i ||
21221 error "$mkdir_cmd subdir$i failed"
21224 for i in $(seq $MDSCOUNT); do
21225 count=$($LFS getdirstripe -i $testdir/* |
21226 grep ^$((i - 1))$ | wc -l)
21227 echo "$count directories created on MDT$((i - 1))"
21228 [ $count -eq 100 ] || error "subdirs are not evenly distributed"
21230 if [ $stripe_count -gt 1 ]; then
21231 count=$($LFS getdirstripe $testdir/* |
21232 grep -P "^\s+$((i - 1))\t" | wc -l)
21233 echo "$count stripes created on MDT$((i - 1))"
21234 # deviation should < 5% of average
21235 [ $count -lt $((95 * stripe_count)) ] ||
21236 [ $count -gt $((105 * stripe_count)) ] &&
21237 error "stripes are not evenly distributed"
21241 $LCTL set_param lmv.*.qos_threshold_rr=$lmv_qos_threshold_rr > /dev/null
21242 do_nodes $mdts $LCTL set_param \
21243 lod.*.mdt_qos_threshold_rr=$lod_qos_threshold_rr > /dev/null
21246 echo "Check for uneven MDTs: "
21256 ffree=($(lctl get_param -n mdc.*[mM][dD][cC]-[^M]*.filesfree))
21257 bavail=($(lctl get_param -n mdc.*[mM][dD][cC]-[^M]*.kbytesavail))
21258 bsize=$(lctl get_param -n mdc.*MDT0000*.blocksize)
21260 max=$(((${ffree[0]} >> 8) * (${bavail[0]} * bsize >> 16)))
21261 min=$(((${ffree[0]} >> 8) * (${bavail[0]} * bsize >> 16)))
21264 for ((i = 1; i < ${#ffree[@]}; i++)); do
21265 tmp=$(((${ffree[i]} >> 8) * (${bavail[i]} * bsize >> 16)))
21266 if [ $tmp -gt $max ]; then
21270 if [ $tmp -lt $min ]; then
21276 [ ${ffree[min_index]} -eq 0 ] &&
21277 skip "no free files in MDT$min_index"
21278 [ ${ffree[min_index]} -gt 100000000 ] &&
21279 skip "too much free files in MDT$min_index"
21281 # Check if we need to generate uneven MDTs
21283 local diff=$(((max - min) * 100 / min))
21284 local value="$(generate_string 1024)"
21286 while [ $diff -lt $threshold ]; do
21287 # generate uneven MDTs, create till $threshold% diff
21288 echo -n "weight diff=$diff% must be > $threshold% ..."
21289 count=$((${ffree[min_index]} / 10))
21290 # 50 sec per 10000 files in vm
21291 [ $count -gt 40000 ] && [ "$SLOW" = "no" ] &&
21292 skip "$count files to create"
21293 echo "Fill MDT$min_index with $count files"
21294 [ -d $DIR/$tdir-MDT$min_index ] ||
21295 $LFS mkdir -i $min_index $DIR/$tdir-MDT$min_index ||
21296 error "mkdir $tdir-MDT$min_index failed"
21297 for i in $(seq $count); do
21298 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE \
21299 $DIR/$tdir-MDT$min_index/f$j_$i > /dev/null ||
21300 error "create f$j_$i failed"
21301 setfattr -n user.413b -v $value \
21302 $DIR/$tdir-MDT$min_index/f$j_$i ||
21303 error "setfattr f$j_$i failed"
21306 ffree=($(lctl get_param -n mdc.*[mM][dD][cC]-*.filesfree))
21307 bavail=($(lctl get_param -n mdc.*[mM][dD][cC]-*.kbytesavail))
21308 max=$(((${ffree[max_index]} >> 8) * \
21309 (${bavail[max_index]} * bsize >> 16)))
21310 min=$(((${ffree[min_index]} >> 8) * \
21311 (${bavail[min_index]} * bsize >> 16)))
21312 diff=$(((max - min) * 100 / min))
21315 echo "MDT filesfree available: ${ffree[@]}"
21316 echo "MDT blocks available: ${bavail[@]}"
21317 echo "weight diff=$diff%"
21320 echo "Mkdir (stripe_count $stripe_count) with balanced space usage:"
21322 $LCTL set_param lmv.*.qos_prio_free=100 > /dev/null
21323 do_nodes $mdts $LCTL set_param lod.*.mdt_qos_prio_free=100 > /dev/null
21324 # decrease statfs age, so that it can be updated in time
21325 $LCTL set_param lmv.*.qos_maxage=1 > /dev/null
21326 do_nodes $mdts $LCTL set_param lod.*.mdt_qos_maxage=1 > /dev/null
21330 testdir=$DIR/$tdir-s$stripe_count/qos
21332 for i in $(seq $((100 * MDSCOUNT))); do
21333 eval $mkdir_cmd $testdir/subdir$i ||
21334 error "$mkdir_cmd subdir$i failed"
21337 for i in $(seq $MDSCOUNT); do
21338 count=$($LFS getdirstripe -i $testdir/* | grep ^$((i - 1))$ |
21340 echo "$count directories created on MDT$((i - 1))"
21342 if [ $stripe_count -gt 1 ]; then
21343 count=$($LFS getdirstripe $testdir/* |
21344 grep -P "^\s+$((i - 1))\t" | wc -l)
21345 echo "$count stripes created on MDT$((i - 1))"
21349 max=$($LFS getdirstripe -i $testdir/* | grep ^$max_index$ | wc -l)
21350 min=$($LFS getdirstripe -i $testdir/* | grep ^$min_index$ | wc -l)
21352 # D-value should > 10% of averge
21353 [ $((max - min)) -lt 10 ] &&
21354 error "subdirs shouldn't be evenly distributed"
21357 if [ $stripe_count -gt 1 ]; then
21358 max=$($LFS getdirstripe $testdir/* |
21359 grep -P "^\s+$max_index\t" | wc -l)
21360 min=$($LFS getdirstripe $testdir/* |
21361 grep -P "^\s+$min_index\t" | wc -l)
21362 [ $((max - min)) -le $((10 * stripe_count)) ] &&
21363 error "stripes shouldn't be evenly distributed"|| true
21368 [ $MDSCOUNT -lt 2 ] &&
21369 skip "We need at least 2 MDTs for this test"
21371 [ $MDS1_VERSION -lt $(version_code 2.12.52) ] &&
21372 skip "Need server version at least 2.12.52"
21376 for stripe_count in $(seq 1 $((MDSCOUNT - 1))); do
21377 mkdir $DIR/$tdir-s$stripe_count || error "mkdir failed"
21378 mkdir $DIR/$tdir-s$stripe_count/rr || error "mkdir failed"
21379 mkdir $DIR/$tdir-s$stripe_count/qos || error "mkdir failed"
21380 test_qos_mkdir "$LFS mkdir -c $stripe_count" $stripe_count
21383 run_test 413a "QoS mkdir with 'lfs mkdir -i -1'"
21386 [ $MDSCOUNT -lt 2 ] &&
21387 skip "We need at least 2 MDTs for this test"
21389 [ $MDS1_VERSION -lt $(version_code 2.12.52) ] &&
21390 skip "Need server version at least 2.12.52"
21394 for stripe_count in $(seq 1 $((MDSCOUNT - 1))); do
21395 mkdir $DIR/$tdir-s$stripe_count || error "mkdir failed"
21396 mkdir $DIR/$tdir-s$stripe_count/rr || error "mkdir failed"
21397 mkdir $DIR/$tdir-s$stripe_count/qos || error "mkdir failed"
21398 $LFS setdirstripe -D -c $stripe_count \
21399 $DIR/$tdir-s$stripe_count/rr ||
21400 error "setdirstripe failed"
21401 $LFS setdirstripe -D -c $stripe_count \
21402 $DIR/$tdir-s$stripe_count/qos ||
21403 error "setdirstripe failed"
21404 test_qos_mkdir "mkdir" $stripe_count
21407 run_test 413b "QoS mkdir under dir whose default LMV starting MDT offset is -1"
21410 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
21411 $LCTL set_param fail_loc=0x80000521
21412 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
21415 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
21418 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21419 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21420 skip "Need server version at least 2.11.52"
21430 # this test may be slow on ZFS
21431 [ "$mds1_FSTYPE" == "zfs" ] && total=100
21433 # though this test is designed for striped directory, let's test normal
21434 # directory too since lock is always saved as CoS lock.
21435 test_mkdir $DIR/$tdir || error "mkdir $tdir"
21436 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
21445 start_time=$(date +%s)
21446 for i in $(seq $total); do
21447 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
21450 end_time=$(date +%s)
21451 duration=$((end_time - start_time))
21453 kill -9 $setattr_pid
21455 echo "rename $total files took $duration sec"
21456 [ $duration -lt 100 ] || error "rename took $duration sec"
21458 run_test 415 "lock revoke is not missing"
21461 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
21462 skip "Need server version at least 2.11.55"
21464 # define OBD_FAIL_OSD_TXN_START 0x19a
21465 do_facet mds1 lctl set_param fail_loc=0x19a
21467 lfs mkdir -c $MDSCOUNT $DIR/$tdir
21471 run_test 416 "transaction start failure won't cause system hung"
21475 do_nodes $(comma_list $(mdts_nodes)) \
21476 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
21477 do_nodes $(comma_list $(mdts_nodes)) \
21478 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
21479 do_nodes $(comma_list $(mdts_nodes)) \
21480 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
21484 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
21485 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
21486 skip "Need MDS version at least 2.11.56"
21488 trap cleanup_417 RETURN EXIT
21490 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
21491 do_nodes $(comma_list $(mdts_nodes)) \
21492 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
21493 $LFS migrate -m 0 $DIR/$tdir.1 &&
21494 error "migrate dir $tdir.1 should fail"
21496 do_nodes $(comma_list $(mdts_nodes)) \
21497 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
21498 $LFS mkdir -i 1 $DIR/$tdir.2 &&
21499 error "create remote dir $tdir.2 should fail"
21501 do_nodes $(comma_list $(mdts_nodes)) \
21502 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
21503 $LFS mkdir -c 2 $DIR/$tdir.3 &&
21504 error "create striped dir $tdir.3 should fail"
21507 run_test 417 "disable remote dir, striped dir and dir migration"
21509 # Checks that the outputs of df [-i] and lfs df [-i] match
21511 # usage: check_lfs_df <blocks | inodes> <mountpoint>
21521 [ "$1" == "blocks" ] && inodes= || inodes="-i"
21523 for count in {1..100}; do
21527 # read the lines of interest
21528 df_out=($(df -P $inodes $dir | tail -n +2)) ||
21529 error "df $inodes $dir | tail -n +2 failed"
21530 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
21531 error "lfs df $inodes $dir | grep summary: failed"
21533 # skip first substrings of each output as they are different
21534 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
21535 # compare the two outputs
21537 for i in {1..5}; do
21538 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
21546 lfs df $inodes $dir
21547 error "df and lfs df $1 output mismatch: " \
21548 "df ${inodes}: ${df_out[*]}, " \
21549 "lfs df ${inodes}: ${lfs_df_out[*]}"
21554 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21556 local dir=$DIR/$tdir
21557 local numfiles=$((RANDOM % 4096 + 2))
21558 local numblocks=$((RANDOM % 256 + 1))
21560 wait_delete_completed
21563 # check block output
21564 check_lfs_df blocks $dir
21565 # check inode output
21566 check_lfs_df inodes $dir
21568 # create a single file and retest
21569 echo "Creating a single file and testing"
21570 createmany -o $dir/$tfile- 1 &>/dev/null ||
21571 error "creating 1 file in $dir failed"
21572 check_lfs_df blocks $dir
21573 check_lfs_df inodes $dir
21575 # create a random number of files
21576 echo "Creating $((numfiles - 1)) files and testing"
21577 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
21578 error "creating $((numfiles - 1)) files in $dir failed"
21580 # write a random number of blocks to the first test file
21581 echo "Writing $numblocks 4K blocks and testing"
21582 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
21583 count=$numblocks &>/dev/null ||
21584 error "dd to $dir/${tfile}-0 failed"
21587 check_lfs_df blocks $dir
21588 check_lfs_df inodes $dir
21590 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
21591 error "unlinking $numfiles files in $dir failed"
21593 run_test 418 "df and lfs df outputs match"
21597 local dir=$DIR/$tdir
21602 cancel_lru_locks mdc
21604 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
21605 $LCTL set_param fail_loc=0x1410
21607 $LCTL set_param fail_loc=0
21610 run_test 419 "Verify open file by name doesn't crash kernel"
21614 [[ $MDS1_VERSION -ge $(version_code 2.12.53) ]] ||
21615 skip "Need MDS version at least 2.12.53"
21617 local SAVE_UMASK=$(umask)
21618 local dir=$DIR/$tdir
21619 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
21623 mkdir -m03777 $dir/testdir
21624 ls -dn $dir/testdir
21625 # Need to remove trailing '.' when SELinux is enabled
21626 local dirperms=$(ls -dn $dir/testdir |
21627 awk '{ sub(/\.$/, "", $1); print $1}')
21628 [ $dirperms == "drwxrwsrwt" ] ||
21629 error "incorrect perms on $dir/testdir"
21631 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
21632 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
21633 ls -n $dir/testdir/testfile
21634 local fileperms=$(ls -n $dir/testdir/testfile |
21635 awk '{ sub(/\.$/, "", $1); print $1}')
21636 [ $fileperms == "-rwxr-xr-x" ] ||
21637 error "incorrect perms on $dir/testdir/testfile"
21641 run_test 420 "clear SGID bit on non-directories for non-members"
21648 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21649 skip "Need MDS version at least 2.12.54"
21651 test_mkdir $DIR/$tdir
21652 createmany -o $DIR/$tdir/f 3
21653 cnt=$(ls -1 $DIR/$tdir | wc -l)
21654 [ $cnt != 3 ] && error "unexpected #files: $cnt"
21656 fid1=$(lfs path2fid $DIR/$tdir/f1)
21657 fid2=$(lfs path2fid $DIR/$tdir/f2)
21658 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
21660 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
21661 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
21663 cnt=$(ls -1 $DIR/$tdir | wc -l)
21664 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
21666 rm -f $DIR/$tdir/f3 || error "can't remove f3"
21667 createmany -o $DIR/$tdir/f 3
21668 cnt=$(ls -1 $DIR/$tdir | wc -l)
21669 [ $cnt != 3 ] && error "unexpected #files: $cnt"
21671 fid1=$(lfs path2fid $DIR/$tdir/f1)
21672 fid2=$(lfs path2fid $DIR/$tdir/f2)
21673 echo "remove using fsname $FSNAME"
21674 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
21676 cnt=$(ls -1 $DIR/$tdir | wc -l)
21677 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
21679 run_test 421a "simple rm by fid"
21686 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21687 skip "Need MDS version at least 2.12.54"
21689 test_mkdir $DIR/$tdir
21690 createmany -o $DIR/$tdir/f 3
21691 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
21694 FID1=$(lfs path2fid $DIR/$tdir/f1)
21695 FID2=$(lfs path2fid $DIR/$tdir/f2)
21696 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
21698 kill -USR1 $MULTIPID
21701 cnt=$(ls $DIR/$tdir | wc -l)
21702 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
21704 run_test 421b "rm by fid on open file"
21710 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21711 skip "Need MDS version at least 2.12.54"
21713 test_mkdir $DIR/$tdir
21714 createmany -o $DIR/$tdir/f 3
21715 touch $DIR/$tdir/$tfile
21716 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
21717 cnt=$(ls -1 $DIR/$tdir | wc -l)
21718 [ $cnt != 184 ] && error "unexpected #files: $cnt"
21720 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
21721 $LFS rmfid $DIR $FID1 || error "rmfid failed"
21723 cnt=$(ls $DIR/$tdir | wc -l)
21724 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
21726 run_test 421c "rm by fid against hardlinked files"
21732 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21733 skip "Need MDS version at least 2.12.54"
21735 test_mkdir $DIR/$tdir
21736 createmany -o $DIR/$tdir/f 4097
21737 cnt=$(ls -1 $DIR/$tdir | wc -l)
21738 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
21740 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
21741 $LFS rmfid $DIR $FIDS || error "rmfid failed"
21743 cnt=$(ls $DIR/$tdir | wc -l)
21745 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
21747 run_test 421d "rmfid en masse"
21753 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
21754 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21755 skip "Need MDS version at least 2.12.54"
21757 mkdir -p $DIR/$tdir
21758 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
21759 createmany -o $DIR/$tdir/striped_dir/f 512
21760 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
21761 [ $cnt != 512 ] && error "unexpected #files: $cnt"
21763 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
21764 sed "s/[/][^:]*://g")
21765 $LFS rmfid $DIR $FIDS || error "rmfid failed"
21767 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
21769 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
21771 run_test 421e "rmfid in DNE"
21777 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21778 skip "Need MDS version at least 2.12.54"
21780 test_mkdir $DIR/$tdir
21782 cnt=$(ls -1 $DIR/$tdir | wc -l)
21783 [ $cnt != 1 ] && error "unexpected #files: $cnt"
21785 FID=$(lfs path2fid $DIR/$tdir/f)
21786 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
21787 # rmfid should fail
21788 cnt=$(ls -1 $DIR/$tdir | wc -l)
21789 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
21791 chmod a+rw $DIR/$tdir
21793 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
21794 # rmfid should fail
21795 cnt=$(ls -1 $DIR/$tdir | wc -l)
21796 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
21799 $RUNAS touch $DIR/$tdir/f
21800 FID=$(lfs path2fid $DIR/$tdir/f)
21801 echo "rmfid as root"
21802 $LFS rmfid $DIR $FID || error "rmfid as root failed"
21803 cnt=$(ls -1 $DIR/$tdir | wc -l)
21804 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
21807 $RUNAS touch $DIR/$tdir/f
21808 cnt=$(ls -1 $DIR/$tdir | wc -l)
21809 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
21810 FID=$(lfs path2fid $DIR/$tdir/f)
21811 # rmfid w/o user_fid2path mount option should fail
21812 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
21813 cnt=$(ls -1 $DIR/$tdir | wc -l)
21814 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
21816 umount_client $MOUNT || error "failed to umount client"
21817 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
21818 error "failed to mount client'"
21820 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
21821 # rmfid should succeed
21822 cnt=$(ls -1 $DIR/$tdir | wc -l)
21823 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
21825 # rmfid shouldn't allow to remove files due to dir's permission
21826 chmod a+rwx $DIR/$tdir
21829 FID=$(lfs path2fid $DIR/$tdir/f)
21830 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
21832 umount_client $MOUNT || error "failed to umount client"
21833 mount_client $MOUNT "$MOUNT_OPTS" ||
21834 error "failed to mount client'"
21837 run_test 421f "rmfid checks permissions"
21843 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
21844 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21845 skip "Need MDS version at least 2.12.54"
21847 mkdir -p $DIR/$tdir
21848 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
21849 createmany -o $DIR/$tdir/striped_dir/f 512
21850 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
21851 [ $cnt != 512 ] && error "unexpected #files: $cnt"
21853 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
21854 sed "s/[/][^:]*://g")
21856 rm -f $DIR/$tdir/striped_dir/f1*
21857 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
21858 removed=$((512 - cnt))
21860 # few files have been just removed, so we expect
21861 # rmfid to fail on their fids
21862 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
21863 [ $removed != $errors ] && error "$errors != $removed"
21865 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
21867 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
21869 run_test 421g "rmfid to return errors properly"
21872 test_mkdir -i 0 -c 1 -p $DIR/$tdir/d1
21873 test_mkdir -i 0 -c 1 -p $DIR/$tdir/d2
21874 test_mkdir -i 0 -c 1 -p $DIR/$tdir/d3
21875 dd if=/dev/zero of=$DIR/$tdir/d1/file1 bs=1k count=1
21876 dd if=/dev/zero of=$DIR/$tdir/d2/file1 bs=1k count=1
21878 local amc=$(at_max_get client)
21879 local amo=$(at_max_get mds1)
21880 local timeout=`lctl get_param -n timeout`
21882 at_max_set 0 client
21885 #define OBD_FAIL_PTLRPC_PAUSE_REQ 0x50a
21886 do_facet mds1 $LCTL set_param fail_loc=0x8000050a \
21887 fail_val=$(((2*timeout + 10)*1000))
21888 touch $DIR/$tdir/d3/file &
21890 #define OBD_FAIL_TGT_REPLY_DATA_RACE 0x722
21891 do_facet mds1 $LCTL set_param fail_loc=0x80000722 \
21892 fail_val=$((2*timeout + 5))
21893 mv $DIR/$tdir/d1/file1 $DIR/$tdir/d1/file2 &
21897 sleep $((2 * timeout))
21901 touch $DIR/$tdir/d2/file3
21902 touch $DIR/$tdir/d2/file4
21903 touch $DIR/$tdir/d2/file5
21906 at_max_set $amc client
21907 at_max_set $amo mds1
21909 # LU-12838 - verify the ptlrpc thread watchdog is not always throttled
21910 do_facet mds1 "dmesg | grep 'Dumping the stack trace for debugging'" ||
21911 error "Watchdog is always throttled"
21913 run_test 422 "kill a process with RPC in progress"
21916 [[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
21917 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
21918 skip "Need server version at least 2.9.55"
21920 start_full_debug_logging
21924 stop_full_debug_logging
21928 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
21929 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
21930 awk '/The barrier for/ { print $7 }')
21933 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
21938 barrier_expired() {
21941 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
21942 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
21943 awk '/will be expired/ { print $7 }')
21945 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
21954 echo "Start barrier_freeze at: $(date)"
21955 #define OBD_FAIL_BARRIER_DELAY 0x2202
21956 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
21957 # Do not reduce barrier time - See LU-11873
21958 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
21961 local b_status=$(barrier_stat)
21962 echo "Got barrier status at: $(date)"
21963 [ "$b_status" = "'freezing_p1'" ] ||
21964 error "(1) unexpected barrier status $b_status"
21966 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
21968 b_status=$(barrier_stat)
21969 [ "$b_status" = "'frozen'" ] ||
21970 error "(2) unexpected barrier status $b_status"
21972 local expired=$(barrier_expired)
21973 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
21974 sleep $((expired + 3))
21976 b_status=$(barrier_stat)
21977 [ "$b_status" = "'expired'" ] ||
21978 error "(3) unexpected barrier status $b_status"
21980 # Do not reduce barrier time - See LU-11873
21981 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
21982 error "(4) fail to freeze barrier"
21984 b_status=$(barrier_stat)
21985 [ "$b_status" = "'frozen'" ] ||
21986 error "(5) unexpected barrier status $b_status"
21988 echo "Start barrier_thaw at: $(date)"
21989 #define OBD_FAIL_BARRIER_DELAY 0x2202
21990 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
21991 do_facet mgs $LCTL barrier_thaw $FSNAME &
21994 b_status=$(barrier_stat)
21995 echo "Got barrier status at: $(date)"
21996 [ "$b_status" = "'thawing'" ] ||
21997 error "(6) unexpected barrier status $b_status"
21999 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
22001 b_status=$(barrier_stat)
22002 [ "$b_status" = "'thawed'" ] ||
22003 error "(7) unexpected barrier status $b_status"
22005 #define OBD_FAIL_BARRIER_FAILURE 0x2203
22006 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
22007 do_facet mgs $LCTL barrier_freeze $FSNAME
22009 b_status=$(barrier_stat)
22010 [ "$b_status" = "'failed'" ] ||
22011 error "(8) unexpected barrier status $b_status"
22013 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
22014 do_facet mgs $LCTL barrier_thaw $FSNAME
22018 run_test 801a "write barrier user interfaces and stat machine"
22023 mkdir $DIR/$tdir || error "(1) fail to mkdir"
22024 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
22025 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
22026 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
22027 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
22029 cancel_lru_locks mdc
22031 # 180 seconds should be long enough
22032 do_facet mgs $LCTL barrier_freeze $FSNAME 180
22034 local b_status=$(barrier_stat)
22035 [ "$b_status" = "'frozen'" ] ||
22036 error "(6) unexpected barrier status $b_status"
22038 mkdir $DIR/$tdir/d0/d10 &
22041 touch $DIR/$tdir/d1/f13 &
22044 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
22047 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
22050 rm -f $DIR/$tdir/d4/f12 &
22053 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
22055 # To guarantee taht the 'stat' is not blocked
22056 b_status=$(barrier_stat)
22057 [ "$b_status" = "'frozen'" ] ||
22058 error "(8) unexpected barrier status $b_status"
22060 # let above commands to run at background
22063 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
22064 ps -p $touch_pid || error "(10) touch should be blocked"
22065 ps -p $ln_pid || error "(11) link should be blocked"
22066 ps -p $mv_pid || error "(12) rename should be blocked"
22067 ps -p $rm_pid || error "(13) unlink should be blocked"
22069 b_status=$(barrier_stat)
22070 [ "$b_status" = "'frozen'" ] ||
22071 error "(14) unexpected barrier status $b_status"
22073 do_facet mgs $LCTL barrier_thaw $FSNAME
22074 b_status=$(barrier_stat)
22075 [ "$b_status" = "'thawed'" ] ||
22076 error "(15) unexpected barrier status $b_status"
22078 wait $mkdir_pid || error "(16) mkdir should succeed"
22079 wait $touch_pid || error "(17) touch should succeed"
22080 wait $ln_pid || error "(18) link should succeed"
22081 wait $mv_pid || error "(19) rename should succeed"
22082 wait $rm_pid || error "(20) unlink should succeed"
22086 run_test 801b "modification will be blocked by write barrier"
22089 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
22093 stop mds2 || error "(1) Fail to stop mds2"
22095 do_facet mgs $LCTL barrier_freeze $FSNAME 30
22097 local b_status=$(barrier_stat)
22098 [ "$b_status" = "'expired'" ] || [ "$b_status" = "'failed'" ] || {
22099 do_facet mgs $LCTL barrier_thaw $FSNAME
22100 error "(2) unexpected barrier status $b_status"
22103 do_facet mgs $LCTL barrier_rescan $FSNAME ||
22104 error "(3) Fail to rescan barrier bitmap"
22106 # Do not reduce barrier time - See LU-11873
22107 do_facet mgs $LCTL barrier_freeze $FSNAME 20
22109 b_status=$(barrier_stat)
22110 [ "$b_status" = "'frozen'" ] ||
22111 error "(4) unexpected barrier status $b_status"
22113 do_facet mgs $LCTL barrier_thaw $FSNAME
22114 b_status=$(barrier_stat)
22115 [ "$b_status" = "'thawed'" ] ||
22116 error "(5) unexpected barrier status $b_status"
22118 local devname=$(mdsdevname 2)
22120 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
22122 do_facet mgs $LCTL barrier_rescan $FSNAME ||
22123 error "(7) Fail to rescan barrier bitmap"
22127 run_test 801c "rescan barrier bitmap"
22129 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
22130 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
22131 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
22132 saved_MOUNT_OPTS=$MOUNT_OPTS
22138 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
22139 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
22140 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
22141 MOUNT_OPTS=$saved_MOUNT_OPTS
22146 [[ $mds1_FSTYPE = zfs ]] || skip "ZFS specific test"
22147 [[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
22148 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
22149 skip "Need server version at least 2.9.55"
22151 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
22153 mkdir $DIR/$tdir || error "(1) fail to mkdir"
22155 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
22156 error "(2) Fail to copy"
22158 trap cleanup_802a EXIT
22160 # sync by force before remount as readonly
22161 sync; sync_all_data; sleep 3; sync_all_data
22165 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
22166 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
22167 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
22169 echo "Mount the server as read only"
22170 setupall server_only || error "(3) Fail to start servers"
22172 echo "Mount client without ro should fail"
22173 mount_client $MOUNT &&
22174 error "(4) Mount client without 'ro' should fail"
22176 echo "Mount client with ro should succeed"
22177 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
22178 mount_client $MOUNT ||
22179 error "(5) Mount client with 'ro' should succeed"
22181 echo "Modify should be refused"
22182 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
22184 echo "Read should be allowed"
22185 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
22186 error "(7) Read should succeed under ro mode"
22190 run_test 802a "simulate readonly device"
22193 [ $PARALLEL == "yes" ] && skip "skip parallel run"
22194 remote_mds_nodsh && skip "remote MDS with nodsh"
22196 do_facet $SINGLEMDS $LCTL get_param mdt.*.readonly ||
22197 skip "readonly option not available"
22199 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "(1) fail to mkdir"
22201 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
22202 error "(2) Fail to copy"
22204 # write back all cached data before setting MDT to readonly
22208 do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=1
22209 stack_trap "do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=0" EXIT
22211 echo "Modify should be refused"
22212 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
22214 echo "Read should be allowed"
22215 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
22216 error "(7) Read should succeed under ro mode"
22219 do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=0
22221 run_test 802b "be able to set MDTs to readonly"
22224 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
22225 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
22226 skip "MDS needs to be newer than 2.10.54"
22228 mkdir -p $DIR/$tdir
22229 # Create some objects on all MDTs to trigger related logs objects
22230 for idx in $(seq $MDSCOUNT); do
22231 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
22232 $DIR/$tdir/dir${idx} ||
22233 error "Fail to create $DIR/$tdir/dir${idx}"
22237 wait_delete_completed # ensure old test cleanups are finished
22238 echo "before create:"
22240 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
22242 for i in {1..10}; do
22243 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
22244 error "Fail to create $DIR/$tdir/foo$i"
22248 echo "after create:"
22250 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
22252 # allow for an llog to be cleaned up during the test
22253 [ $after_used -ge $((before_used + 10 - 1)) ] ||
22254 error "before ($before_used) + 10 > after ($after_used)"
22256 for i in {1..10}; do
22257 rm -rf $DIR/$tdir/foo$i ||
22258 error "Fail to remove $DIR/$tdir/foo$i"
22261 sleep 3 # avoid MDT return cached statfs
22262 wait_delete_completed
22263 echo "after unlink:"
22265 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
22267 # allow for an llog to be created during the test
22268 [ $after_used -le $((before_used + 1)) ] ||
22269 error "after ($after_used) > before ($before_used) + 1"
22271 run_test 803 "verify agent object for remote object"
22274 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
22275 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
22276 skip "MDS needs to be newer than 2.10.54"
22277 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
22279 mkdir -p $DIR/$tdir
22280 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
22281 error "Fail to create $DIR/$tdir/dir0"
22283 local fid=$($LFS path2fid $DIR/$tdir/dir0)
22284 local dev=$(mdsdevname 2)
22286 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
22287 grep ${fid} || error "NOT found agent entry for dir0"
22289 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
22290 error "Fail to create $DIR/$tdir/dir1"
22292 touch $DIR/$tdir/dir1/foo0 ||
22293 error "Fail to create $DIR/$tdir/dir1/foo0"
22294 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
22297 for idx in $(seq $MDSCOUNT); do
22298 dev=$(mdsdevname $idx)
22299 do_facet mds${idx} \
22300 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
22301 grep ${fid} && rc=$idx
22304 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
22305 error "Fail to rename foo0 to foo1"
22306 if [ $rc -eq 0 ]; then
22307 for idx in $(seq $MDSCOUNT); do
22308 dev=$(mdsdevname $idx)
22309 do_facet mds${idx} \
22310 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
22311 grep ${fid} && rc=$idx
22315 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
22316 error "Fail to rename foo1 to foo2"
22317 if [ $rc -eq 0 ]; then
22318 for idx in $(seq $MDSCOUNT); do
22319 dev=$(mdsdevname $idx)
22320 do_facet mds${idx} \
22321 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
22322 grep ${fid} && rc=$idx
22326 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
22328 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
22329 error "Fail to link to $DIR/$tdir/dir1/foo2"
22330 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
22331 error "Fail to rename foo2 to foo0"
22332 unlink $DIR/$tdir/dir1/foo0 ||
22333 error "Fail to unlink $DIR/$tdir/dir1/foo0"
22334 rm -rf $DIR/$tdir/dir0 ||
22335 error "Fail to rm $DIR/$tdir/dir0"
22337 for idx in $(seq $MDSCOUNT); do
22338 dev=$(mdsdevname $idx)
22342 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
22344 start mds${idx} $dev $MDS_MOUNT_OPTS ||
22345 error "mount mds$idx failed"
22346 df $MOUNT > /dev/null 2>&1
22348 # e2fsck should not return error
22350 error "e2fsck detected error on MDT${idx}: rc=$rc"
22353 run_test 804 "verify agent entry for remote entry"
22356 do_facet $SINGLEMDS zfs set quota=$old $fsset
22357 unlinkmany $DIR/$tdir/f- 1000000
22362 local zfs_version=$(do_facet mds1 cat /sys/module/zfs/version)
22363 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
22364 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
22365 skip "netfree not implemented before 0.7"
22366 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
22367 skip "Need MDS version at least 2.10.57"
22374 local pref="osd-zfs.$FSNAME-MDT0000."
22376 # limit available space on MDS dataset to meet nospace issue
22377 # quickly. then ZFS 0.7.2 can use reserved space if asked
22378 # properly (using netfree flag in osd_declare_destroy()
22379 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
22380 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
22382 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
22383 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
22384 let "usedkb=usedkb-freekb"
22385 let "freekb=freekb/2"
22386 if let "freekb > 5000"; then
22389 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
22390 trap cleanup_805 EXIT
22392 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
22393 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
22394 rm -rf $DIR/$tdir || error "not able to remove"
22395 do_facet $SINGLEMDS zfs set quota=$old $fsset
22398 run_test 805 "ZFS can remove from full fs"
22404 local size=$($LFS getsom -s $file)
22405 local expect=$(stat -c %s $file)
22407 [[ $size == $expect ]] ||
22408 error "$file expected size: $expect, got: $size"
22410 local blocks=$($LFS getsom -b $file)
22411 expect=$(stat -c %b $file)
22412 [[ $blocks == $expect ]] ||
22413 error "$file expected blocks: $expect, got: $blocks"
22418 local size=$($LFS getsom -s $1)
22421 [[ $size == $expect ]] ||
22422 error "$file expected size: $expect, got: $size"
22426 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
22427 skip "Need MDS version at least 2.11.52"
22431 touch $DIR/$tfile || error "touch $tfile failed"
22433 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
22434 save_lustre_params client "llite.*.xattr_cache" > $save
22435 lctl set_param llite.*.xattr_cache=0
22436 stack_trap "restore_lustre_params < $save; rm -f $save" EXIT
22438 # single-threaded write
22439 echo "Test SOM for single-threaded write"
22440 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
22441 error "write $tfile failed"
22442 check_lsom_size $DIR/$tfile $bs
22445 local size=$(($num * $bs))
22449 echo "Test SOM for single client multi-threaded($num) write"
22450 $TRUNCATE $DIR/$tfile 0
22451 for ((i = 0; i < $num; i++)); do
22452 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
22454 offset=$((offset + $bs))
22456 for (( i=0; i < $num; i++ )); do
22459 check_lsom_size $DIR/$tfile $size
22461 $TRUNCATE $DIR/$tfile 0
22462 for ((i = 0; i < $num; i++)); do
22463 offset=$((offset - $bs))
22464 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
22467 for (( i=0; i < $num; i++ )); do
22470 check_lsom_size $DIR/$tfile $size
22472 # multi-client writes
22473 num=$(get_node_count ${CLIENTS//,/ })
22474 size=$(($num * $bs))
22478 echo "Test SOM for multi-client ($num) writes"
22479 $TRUNCATE $DIR/$tfile 0
22480 for client in ${CLIENTS//,/ }; do
22481 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
22484 offset=$((offset + $bs))
22486 for (( i=0; i < $num; i++ )); do
22489 check_lsom_size $DIR/$tfile $offset
22492 $TRUNCATE $DIR/$tfile 0
22493 for client in ${CLIENTS//,/ }; do
22494 offset=$((offset - $bs))
22495 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
22499 for (( i=0; i < $num; i++ )); do
22502 check_lsom_size $DIR/$tfile $size
22505 echo "Test SOM for truncate"
22506 $TRUNCATE $DIR/$tfile 1048576
22507 check_lsom_size $DIR/$tfile 1048576
22508 $TRUNCATE $DIR/$tfile 1234
22509 check_lsom_size $DIR/$tfile 1234
22511 # verify SOM blocks count
22512 echo "Verify SOM block count"
22513 $TRUNCATE $DIR/$tfile 0
22514 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
22515 error "failed to write file $tfile"
22516 check_lsom_data $DIR/$tfile
22518 run_test 806 "Verify Lazy Size on MDS"
22521 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
22522 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
22523 skip "Need MDS version at least 2.11.52"
22525 # Registration step
22526 changelog_register || error "changelog_register failed"
22527 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
22528 changelog_users $SINGLEMDS | grep -q $cl_user ||
22529 error "User $cl_user not found in changelog_users"
22531 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
22532 save_lustre_params client "llite.*.xattr_cache" > $save
22533 lctl set_param llite.*.xattr_cache=0
22534 stack_trap "restore_lustre_params < $save; rm -f $save" EXIT
22536 rm -rf $DIR/$tdir || error "rm $tdir failed"
22537 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
22538 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
22539 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
22540 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
22541 error "truncate $tdir/trunc failed"
22544 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
22545 error "write $tfile failed"
22547 # multi-client wirtes
22548 local num=$(get_node_count ${CLIENTS//,/ })
22552 echo "Test SOM for multi-client ($num) writes"
22553 touch $DIR/$tfile || error "touch $tfile failed"
22554 $TRUNCATE $DIR/$tfile 0
22555 for client in ${CLIENTS//,/ }; do
22556 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
22559 offset=$((offset + $bs))
22561 for (( i=0; i < $num; i++ )); do
22566 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
22567 check_lsom_data $DIR/$tdir/trunc
22568 check_lsom_data $DIR/$tdir/single_dd
22569 check_lsom_data $DIR/$tfile
22572 # Deregistration step
22573 changelog_deregister || error "changelog_deregister failed"
22575 run_test 807 "verify LSOM syncing tool"
22577 check_som_nologged()
22579 local lines=$($LFS changelog $FSNAME-MDT0000 |
22580 grep 'x=trusted.som' | wc -l)
22581 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
22585 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
22586 skip "Need MDS version at least 2.11.55"
22588 # Registration step
22589 changelog_register || error "changelog_register failed"
22591 touch $DIR/$tfile || error "touch $tfile failed"
22594 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
22595 error "write $tfile failed"
22598 $TRUNCATE $DIR/$tfile 1234
22601 $TRUNCATE $DIR/$tfile 1048576
22604 # Deregistration step
22605 changelog_deregister || error "changelog_deregister failed"
22607 run_test 808 "Check trusted.som xattr not logged in Changelogs"
22612 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
22616 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
22617 skip "Need MDS version at least 2.11.56"
22619 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
22620 error "failed to create DoM-only file $DIR/$tfile"
22621 touch $DIR/$tfile || error "touch $tfile failed"
22622 check_som_nodata $DIR/$tfile
22624 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
22625 error "write $tfile failed"
22626 check_som_nodata $DIR/$tfile
22628 $TRUNCATE $DIR/$tfile 1234
22629 check_som_nodata $DIR/$tfile
22631 $TRUNCATE $DIR/$tfile 4097
22632 check_som_nodata $DIR/$file
22634 run_test 809 "Verify no SOM xattr store for DoM-only files"
22637 [ $PARALLEL == "yes" ] && skip "skip parallel run"
22638 $GSS && skip_env "could not run with gss"
22639 [[ $OST1_VERSION -gt $(version_code 2.12.58) ]] ||
22640 skip "OST < 2.12.58 doesn't align checksum"
22643 stack_trap "set_checksums $ORIG_CSUM" EXIT
22644 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
22649 for csum in $CKSUM_TYPES; do
22650 #define OBD_FAIL_OSC_NO_GRANT 0x411
22651 $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411
22652 for i in "10240 0" "10000 0" "4000 1" "500 1"; do
22654 dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2
22655 before=$(md5sum $DIR/$tfile)
22656 $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear
22657 after=$(md5sum $DIR/$tfile)
22658 [ "$before" == "$after" ] ||
22659 error "$csum: $before != $after bs=$1 seek=$2"
22663 run_test 810 "partial page writes on ZFS (LU-11663)"
22666 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
22667 skip "Need MDS version at least 2.11.56"
22669 #define OBD_FAIL_MDS_ORPHAN_DELETE 0x165
22670 do_facet mds1 $LCTL set_param fail_loc=0x165
22671 $MULTIOP $DIR/$tfile Ouc || error "multiop failed"
22674 start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
22676 wait_update_facet mds1 "pgrep orph_.*-MDD | wc -l" "0" ||
22677 error "MDD orphan cleanup thread not quit"
22679 run_test 811 "orphan name stub can be cleaned up in startup"
22682 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
22683 skip "OST < 2.12.51 doesn't support this fail_loc"
22684 [ "$SHARED_KEY" = true ] &&
22685 skip "OSC connections never go IDLE with Shared-Keys enabled"
22687 $LFS setstripe -c 1 -i 0 $DIR/$tfile
22688 # ensure ost1 is connected
22689 stat $DIR/$tfile >/dev/null || error "can't stat"
22690 wait_osc_import_state client ost1 FULL
22691 # no locks, no reqs to let the connection idle
22692 cancel_lru_locks osc
22694 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
22695 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
22696 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
22697 wait_osc_import_state client ost1 CONNECTING
22698 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
22700 stat $DIR/$tfile >/dev/null || error "can't stat file"
22702 run_test 812a "do not drop reqs generated when imp is going to idle (LU-11951)"
22704 test_812b() { # LU-12378
22705 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
22706 skip "OST < 2.12.51 doesn't support this fail_loc"
22707 [ "$SHARED_KEY" = true ] &&
22708 skip "OSC connections never go IDLE with Shared-Keys enabled"
22710 $LFS setstripe -c 1 -i 0 $DIR/$tfile || error "setstripe failed"
22711 # ensure ost1 is connected
22712 stat $DIR/$tfile >/dev/null || error "can't stat"
22713 wait_osc_import_state client ost1 FULL
22714 # no locks, no reqs to let the connection idle
22715 cancel_lru_locks osc
22717 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
22718 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
22719 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
22720 wait_osc_import_state client ost1 CONNECTING
22721 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
22723 $LFS quota -u 0 $DIR/ || error "lfs quota should succeed"
22724 wait_osc_import_state client ost1 IDLE
22726 run_test 812b "do not drop no resend request for idle connect"
22729 local file_heat_sav=$($LCTL get_param -n llite.*.file_heat 2>/dev/null)
22730 [ -z "$file_heat_sav" ] && skip "no file heat support"
22741 local period_second=$($LCTL get_param -n llite.*.heat_period_second)
22742 local decay_pct=$($LCTL get_param -n llite.*.heat_decay_percentage)
22744 $LCTL set_param -n llite.*.file_heat=1
22745 echo "Turn on file heat"
22746 echo "Period second: $period_second, Decay percentage: $decay_pct"
22748 echo "QQQQ" > $DIR/$tfile
22749 echo "QQQQ" > $DIR/$tfile
22750 echo "QQQQ" > $DIR/$tfile
22751 cat $DIR/$tfile > /dev/null
22752 cat $DIR/$tfile > /dev/null
22753 cat $DIR/$tfile > /dev/null
22754 cat $DIR/$tfile > /dev/null
22756 local out=$($LFS heat_get $DIR/$tfile)
22758 $LFS heat_get $DIR/$tfile
22759 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
22760 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
22761 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
22762 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
22764 [ $readsample -le 4 ] || error "read sample ($readsample) is wrong"
22765 [ $writesample -le 3 ] || error "write sample ($writesample) is wrong"
22766 [ $readbyte -le 20 ] || error "read bytes ($readbyte) is wrong"
22767 [ $writebyte -le 15 ] || error "write bytes ($writebyte) is wrong"
22769 sleep $((period_second + 3))
22770 echo "Sleep $((period_second + 3)) seconds..."
22771 # The recursion formula to calculate the heat of the file f is as
22773 # Hi+1(f) = (1-P)*Hi(f)+ P*Ci
22774 # Where Hi is the heat value in the period between time points i*I and
22775 # (i+1)*I; Ci is the access count in the period; the symbol P refers
22776 # to the weight of Ci.
22777 out=$($LFS heat_get $DIR/$tfile)
22778 $LFS heat_get $DIR/$tfile
22779 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
22780 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
22781 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
22782 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
22784 [ $(bc <<< "$readsample <= 4 * $decay_pct / 100") -eq 1 ] ||
22785 error "read sample ($readsample) is wrong"
22786 [ $(bc <<< "$writesample <= 3 * $decay_pct / 100") -eq 1 ] ||
22787 error "write sample ($writesample) is wrong"
22788 [ $(bc <<< "$readbyte <= 20 * $decay_pct / 100") -eq 1 ] ||
22789 error "read bytes ($readbyte) is wrong"
22790 [ $(bc <<< "$writebyte <= 15 * $decay_pct / 100") -eq 1 ] ||
22791 error "write bytes ($writebyte) is wrong"
22793 echo "QQQQ" > $DIR/$tfile
22794 echo "QQQQ" > $DIR/$tfile
22795 echo "QQQQ" > $DIR/$tfile
22796 cat $DIR/$tfile > /dev/null
22797 cat $DIR/$tfile > /dev/null
22798 cat $DIR/$tfile > /dev/null
22799 cat $DIR/$tfile > /dev/null
22801 sleep $((period_second + 3))
22802 echo "Sleep $((period_second + 3)) seconds..."
22804 out=$($LFS heat_get $DIR/$tfile)
22805 $LFS heat_get $DIR/$tfile
22806 readsample1=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
22807 writesample1=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
22808 readbyte1=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
22809 writebyte1=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
22811 [ $(bc <<< "$readsample1 <= ($readsample * (100 - $decay_pct) + \
22812 4 * $decay_pct) / 100") -eq 1 ] ||
22813 error "read sample ($readsample1) is wrong"
22814 [ $(bc <<< "$writesample1 <= ($writesample * (100 - $decay_pct) + \
22815 3 * $decay_pct) / 100") -eq 1 ] ||
22816 error "write sample ($writesample1) is wrong"
22817 [ $(bc <<< "$readbyte1 <= ($readbyte * (100 - $decay_pct) + \
22818 20 * $decay_pct) / 100") -eq 1 ] ||
22819 error "read bytes ($readbyte1) is wrong"
22820 [ $(bc <<< "$writebyte1 <= ($writebyte * (100 - $decay_pct) + \
22821 15 * $decay_pct) / 100") -eq 1 ] ||
22822 error "write bytes ($writebyte1) is wrong"
22824 echo "Turn off file heat for the file $DIR/$tfile"
22825 $LFS heat_set -o $DIR/$tfile
22827 echo "QQQQ" > $DIR/$tfile
22828 echo "QQQQ" > $DIR/$tfile
22829 echo "QQQQ" > $DIR/$tfile
22830 cat $DIR/$tfile > /dev/null
22831 cat $DIR/$tfile > /dev/null
22832 cat $DIR/$tfile > /dev/null
22833 cat $DIR/$tfile > /dev/null
22835 out=$($LFS heat_get $DIR/$tfile)
22836 $LFS heat_get $DIR/$tfile
22837 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
22838 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
22839 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
22840 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
22842 [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong"
22843 [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong"
22844 [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong"
22845 [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong"
22847 echo "Trun on file heat for the file $DIR/$tfile"
22848 $LFS heat_set -O $DIR/$tfile
22850 echo "QQQQ" > $DIR/$tfile
22851 echo "QQQQ" > $DIR/$tfile
22852 echo "QQQQ" > $DIR/$tfile
22853 cat $DIR/$tfile > /dev/null
22854 cat $DIR/$tfile > /dev/null
22855 cat $DIR/$tfile > /dev/null
22856 cat $DIR/$tfile > /dev/null
22858 out=$($LFS heat_get $DIR/$tfile)
22859 $LFS heat_get $DIR/$tfile
22860 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
22861 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
22862 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
22863 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
22865 [ $readsample -gt 0 ] || error "read sample ($readsample) is wrong"
22866 [ $writesample -gt 0 ] || error "write sample ($writesample) is wrong"
22867 [ $readbyte -gt 0 ] || error "read bytes ($readbyte) is wrong"
22868 [ $writebyte -gt 0 ] || error "write bytes ($writebyte) is wrong"
22870 $LFS heat_set -c $DIR/$tfile
22871 $LCTL set_param -n llite.*.file_heat=0
22872 echo "Turn off file heat support for the Lustre filesystem"
22874 echo "QQQQ" > $DIR/$tfile
22875 echo "QQQQ" > $DIR/$tfile
22876 echo "QQQQ" > $DIR/$tfile
22877 cat $DIR/$tfile > /dev/null
22878 cat $DIR/$tfile > /dev/null
22879 cat $DIR/$tfile > /dev/null
22880 cat $DIR/$tfile > /dev/null
22882 out=$($LFS heat_get $DIR/$tfile)
22883 $LFS heat_get $DIR/$tfile
22884 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
22885 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
22886 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
22887 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
22889 [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong"
22890 [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong"
22891 [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong"
22892 [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong"
22894 $LCTL set_param -n llite.*.file_heat=$file_heat_sav
22897 run_test 813 "File heat verfication"
22901 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
22902 echo -n y >> $DIR/$tfile
22903 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
22904 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
22906 run_test 814 "sparse cp works as expected (LU-12361)"
22910 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
22911 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
22913 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
22916 [ "$SHARED_KEY" = true ] &&
22917 skip "OSC connections never go IDLE with Shared-Keys enabled"
22919 $LFS setstripe -c 1 -i 0 $DIR/$tfile
22920 # ensure ost1 is connected
22921 stat $DIR/$tfile >/dev/null || error "can't stat"
22922 wait_osc_import_state client ost1 FULL
22923 # no locks, no reqs to let the connection idle
22924 cancel_lru_locks osc
22925 lru_resize_disable osc
22928 before=$($LCTL get_param -n \
22929 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
22931 wait_osc_import_state client ost1 IDLE
22932 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
22933 now=$($LCTL get_param -n \
22934 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
22935 [ $before == $now ] || error "lru_size changed $before != $now"
22937 run_test 816 "do not reset lru_resize on idle reconnect"
22941 exportfs -u localhost:$DIR/nfsexp
22946 systemctl restart nfs-server.service || skip "failed to restart nfsd"
22948 mkdir -p $DIR/nfsexp
22949 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
22950 error "failed to export nfs"
22952 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
22953 stack_trap cleanup_817 EXIT
22955 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
22956 error "failed to mount nfs to $tmpdir"
22958 cp /bin/true $tmpdir
22959 $DIR/nfsexp/true || error "failed to execute 'true' command"
22961 run_test 817 "nfsd won't cache write lock for exec file"
22965 $LFS setstripe -c1 -i0 $DIR/$tfile
22966 $LFS setstripe -c1 -i1 $DIR/$tfile
22968 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
22969 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
22970 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
22971 error "start $SINGLEMDS failed"
22974 run_test 818 "unlink with failed llog"
22977 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
22978 cancel_lru_locks osc
22979 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
22980 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
22981 dd if=$DIR/$tfile of=/dev/null bs=1M count=1
22984 run_test 819a "too big niobuf in read"
22987 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
22988 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
22989 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
22990 cancel_lru_locks osc
22994 run_test 819b "too big niobuf in write"
22997 function test_820_start_ost() {
23000 for num in $(seq $OSTCOUNT); do
23001 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS
23006 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
23009 umount_client $MOUNT || error "umount failed"
23010 for num in $(seq $OSTCOUNT); do
23014 # mount client with no active OSTs
23015 # so that the client can't initialize max LOV EA size
23016 # from OSC notifications
23017 mount_client $MOUNT || error "mount failed"
23018 # delay OST starting to keep this 0 max EA size for a while
23019 test_820_start_ost &
23021 # create a directory on MDS2
23022 test_mkdir -i 1 -c1 $DIR/$tdir/mds2 ||
23023 error "Failed to create directory"
23024 # open intent should update default EA size
23025 # see mdc_update_max_ea_from_body()
23026 # notice this is the very first RPC to MDS2
23027 cp /etc/services $DIR/$tdir/mds2 ||
23028 error "Failed to copy files to mds$n"
23030 run_test 820 "update max EA from open intent"
23033 # tests that do cleanup/setup should be run at the end
23037 [ $PARALLEL == "yes" ] && skip "skip parallel run"
23040 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
23041 $LCTL set_param fail_loc=0x903
23043 cancel_lru_locks MGC
23045 FAIL_ON_ERROR=true cleanup
23046 FAIL_ON_ERROR=true setup
23048 run_test 900 "umount should not race with any mgc requeue thread"
23050 # LUS-6253/LU-11185
23056 [ $PARALLEL == "yes" ] && skip "skip parallel run"
23058 # some get_param have a bug to handle dot in param name
23059 cancel_lru_locks MGC
23060 oldc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count')
23061 olds=$(do_facet mgs $LCTL get_param -n 'ldlm.namespaces.MGS*.lock_count')
23062 umount_client $MOUNT || error "umount failed"
23063 mount_client $MOUNT || error "mount failed"
23064 cancel_lru_locks MGC
23065 newc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count')
23066 news=$(do_facet mgs $LCTL get_param -n 'ldlm.namespaces.MGS*.lock_count')
23068 [ $oldc -lt $newc ] && error "mgc lock leak ($oldc != $newc)"
23069 [ $olds -lt $news ] && error "mgs lock leak ($olds != $news)"
23073 run_test 901 "don't leak a mgc lock on client umount"
23076 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
23077 check_and_cleanup_lustre
23078 if [ "$I_MOUNTED" != "yes" ]; then
23079 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true