2 # -*- tab-width: 8; indent-tabs-mode: t; -*-
4 # Run select tests by setting ONLY, or as arguments to the script.
5 # Skip specific tests by setting EXCEPT.
7 # e.g. ONLY="22 23" or ONLY="`seq 32 39`" or EXCEPT="31"
11 # bug number for skipped test: LU-9693 LU-6493 LU-9693 LU-11058
12 ALWAYS_EXCEPT="$SANITY_EXCEPT 42a 42b 42c 77k"
13 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
15 # skipped tests: LU-8411 LU-9096 LU-9054 ..
16 ALWAYS_EXCEPT=" 407 253 312 $ALWAYS_EXCEPT"
19 # bug number for skipped tests: LU-9795 (all below)
20 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 17n 60a 133g 300f"
23 if [[ $(uname -m) = aarch64 ]]; then
24 # bug number: LU-11596 (all below)
25 ALWAYS_EXCEPT+=" 42d 42e 63a 63b 64a 64b 64c"
26 # bug number: LU-11671 LU-11665 LU-11594 LU-11667 LU-11729
27 ALWAYS_EXCEPT+=" 45 101c 103a 317 810"
30 # Check Grants after these tests
31 GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c"
32 SRCDIR=$(cd $(dirname $0); echo $PWD)
33 export PATH=$PATH:/sbin
39 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
40 CREATETEST=${CREATETEST:-createtest}
42 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
44 OPENFILE=${OPENFILE:-openfile}
45 OPENUNLINK=${OPENUNLINK:-openunlink}
46 export MULTIOP=${MULTIOP:-multiop}
47 READS=${READS:-"reads"}
48 MUNLINK=${MUNLINK:-munlink}
49 SOCKETSERVER=${SOCKETSERVER:-socketserver}
50 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
51 MEMHOG=${MEMHOG:-memhog}
52 DIRECTIO=${DIRECTIO:-directio}
53 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
55 CHECK_GRANT=${CHECK_GRANT:-"yes"}
56 GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
57 export PARALLEL=${PARALLEL:-"no"}
59 export NAME=${NAME:-local}
66 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
67 LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
68 . $LUSTRE/tests/test-framework.sh
70 . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh}
75 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
77 if [ "$mds1_FSTYPE" = "zfs" ]; then
78 # bug number for skipped test:
79 ALWAYS_EXCEPT="$ALWAYS_EXCEPT "
81 [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
84 # Get the SLES distro version
86 # Returns a version string that should only be used in comparing
87 # strings returned by version_code()
90 local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2)
92 # All SuSE Linux versions have one decimal. version_code expects two
93 local sles_version=$version.0
94 version_code $sles_version
97 # Check if we are running on Ubuntu or SLES so we can make decisions on
99 if [ -r /etc/SuSE-release ]; then
100 sles_version=$(sles_version_code)
101 [ $sles_version -lt $(version_code 11.4.0) ] &&
102 # bug number for skipped test: LU-4341
103 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170"
104 [ $sles_version -lt $(version_code 12.0.0) ] &&
105 # bug number for skipped test: LU-3703
106 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234"
107 elif [ -r /etc/os-release ]; then
108 if grep -qi ubuntu /etc/os-release; then
109 ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
110 -e 's/^VERSION=//p' \
114 if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
115 # bug number for skipped test:
117 ALWAYS_EXCEPT+=" 103a 410"
126 pgrep ll_sa > /dev/null && { echo "There are ll_sa thread not exit!"; exit 20; }
127 cleanupall ${FORCE} $* || { echo "FAILed to clean up"; exit 20; }
136 check_swap_layouts_support()
138 $LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
139 skip "Does not support layout lock."
142 check_and_setup_lustre
146 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
148 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
149 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
150 rm -rf $DIR/[Rdfs][0-9]*
152 # $RUNAS_ID may get set incorrectly somewhere else
153 [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] &&
154 error "\$RUNAS_ID set to 0, but \$UID is also 0!"
156 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
160 if [ "${ONLY}" = "MOUNT" ] ; then
161 echo "Lustre is up, please go on"
165 echo "preparing for tests involving mounts"
166 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
168 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
169 echo # add a newline after mke2fs.
173 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
174 lctl set_param debug=-1 2> /dev/null || true
177 $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
179 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
181 run_test 0a "touch; rm ====================="
184 chmod 0755 $DIR || error "chmod 0755 $DIR failed"
185 $CHECKSTAT -p 0755 $DIR || error "$DIR permission is not 0755"
187 run_test 0b "chmod 0755 $DIR ============================="
190 $LCTL get_param mdc.*.import | grep "state: FULL" ||
191 error "import not FULL"
192 $LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" ||
195 run_test 0c "check import proc"
197 test_0d() { # LU-3397
198 [ $MGS_VERSION -lt $(version_code 2.10.57) ] &&
199 skip "proc exports not supported before 2.10.57"
201 local mgs_exp="mgs.MGS.exports"
202 local client_uuid=$($LCTL get_param -n mgc.*.uuid)
204 local exp_client_version
207 local temp_imp=$DIR/$tfile.import
208 local temp_exp=$DIR/$tfile.export
210 # save mgc import file to $temp_imp
211 $LCTL get_param mgc.*.import | tee $temp_imp
212 # Check if client uuid is found in MGS export
213 for exp_client_nid in $(do_facet mgs $LCTL get_param -N $mgs_exp.*); do
214 [ $(do_facet mgs $LCTL get_param -n $exp_client_nid.uuid) == \
218 # save mgs export file to $temp_exp
219 do_facet mgs $LCTL get_param $exp_client_nid.export | tee $temp_exp
221 # Compare the value of field "connect_flags"
222 imp_val=$(grep "connect_flags" $temp_imp)
223 exp_val=$(grep "connect_flags" $temp_exp)
224 [ "$exp_val" == "$imp_val" ] ||
225 error "export flags '$exp_val' != import flags '$imp_val'"
227 # Compare the value of client version
228 exp_client_version=$(awk '/target_version:/ { print $2 }' $temp_exp)
229 exp_val=$(version_code $exp_client_version)
230 imp_val=$CLIENT_VERSION
231 [ "$exp_val" == "$imp_val" ] ||
232 error "export client version '$exp_val' != '$imp_val'"
234 run_test 0d "check export proc ============================="
237 test_mkdir $DIR/$tdir
238 test_mkdir $DIR/$tdir/d2
239 mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
240 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir"
243 $CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed"
245 run_test 1 "mkdir; remkdir; rmdir"
248 test_mkdir $DIR/$tdir
249 touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed"
250 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
252 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed"
254 run_test 2 "mkdir; touch; rmdir; check file"
257 test_mkdir $DIR/$tdir
258 $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
259 touch $DIR/$tdir/$tfile
260 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
262 $CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed"
264 run_test 3 "mkdir; touch; rmdir; check dir"
266 # LU-4471 - failed rmdir on remote directories still removes directory on MDT0
268 test_mkdir -i 1 $DIR/$tdir
270 touch $DIR/$tdir/$tfile ||
271 error "Create file under remote directory failed"
274 error "Expect error removing in-use dir $DIR/$tdir"
276 test -d $DIR/$tdir || error "Remote directory disappeared"
278 rm -rf $DIR/$tdir || error "remove remote dir error"
280 run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
283 test_mkdir $DIR/$tdir
284 test_mkdir $DIR/$tdir/d2
285 chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed"
286 $CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707"
287 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
289 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2"
292 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
293 chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
294 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
295 error "$tfile does not have perm 0666 or UID $UID"
296 $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
297 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
298 error "$tfile should be 0666 and owned by UID $UID"
300 run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
303 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
306 chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
307 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
308 error "$tfile should be owned by UID $RUNAS_ID"
309 $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
310 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
311 error "$tfile should be owned by UID $RUNAS_ID"
313 run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
316 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
319 chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
320 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
321 error "$tfile should be owned by GID $UID"
322 $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
323 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
324 error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
326 run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)"
329 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
331 test_mkdir $DIR/$tdir
332 chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed"
333 $RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
334 chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed"
335 test_mkdir $DIR/$tdir/d/subdir
336 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir ||
337 error "$tdir/d/subdir should be GID $RUNAS_GID"
338 if [[ $MDSCOUNT -gt 1 ]]; then
339 # check remote dir sgid inherite
340 $LFS mkdir -i 0 $DIR/$tdir.local ||
341 error "mkdir $tdir.local failed"
342 chmod g+s $DIR/$tdir.local ||
343 error "chmod $tdir.local failed"
344 chgrp $RUNAS_GID $DIR/$tdir.local ||
345 error "chgrp $tdir.local failed"
346 $LFS mkdir -i 1 $DIR/$tdir.local/$tdir.remote ||
347 error "mkdir $tdir.remote failed"
348 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir.local/$tdir.remote ||
349 error "$tdir.remote should be owned by $UID.$RUNAS_ID"
350 $CHECKSTAT -p 02755 $DIR/$tdir.local/$tdir.remote ||
351 error "$tdir.remote should be mode 02755"
354 run_test 6g "verify new dir in sgid dir inherits group"
356 test_6h() { # bug 7331
357 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
359 touch $DIR/$tfile || error "touch failed"
360 chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile || error "initial chown failed"
361 $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/$tfile &&
362 error "chown $RUNAS_ID:0 $tfile worked as GID $RUNAS_GID"
363 $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile ||
364 error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID"
366 run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)"
369 test_mkdir $DIR/$tdir
370 $MCREATE $DIR/$tdir/$tfile
371 chmod 0666 $DIR/$tdir/$tfile
372 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
373 error "$tdir/$tfile should be mode 0666"
375 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
378 if [ ! -d $DIR/$tdir ]; then
379 test_mkdir $DIR/$tdir
381 $MCREATE $DIR/$tdir/$tfile
382 echo -n foo > $DIR/$tdir/$tfile
383 [ "$(cat $DIR/$tdir/$tfile)" = "foo" ] || error "$tdir/$tfile not 'foo'"
384 $CHECKSTAT -t file -s 3 $DIR/$tdir/$tfile || error "$tfile size not 3"
386 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
389 test_mkdir $DIR/$tdir
390 touch $DIR/$tdir/$tfile
391 chmod 0666 $DIR/$tdir/$tfile
392 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
393 error "$tfile mode not 0666"
395 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
398 test_mkdir $DIR/$tdir
399 test_mkdir $DIR/$tdir/d2
400 test_mkdir $DIR/$tdir/d2/d3
401 $CHECKSTAT -t dir $DIR/$tdir/d2/d3 || error "$tdir/d2/d3 not a dir"
403 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
406 test_mkdir $DIR/$tdir
407 test_mkdir $DIR/$tdir/d2
408 touch $DIR/$tdir/d2/$tfile
409 $CHECKSTAT -t file $DIR/$tdir/d2/$tfile ||
410 error "$tdir/d2/$tfile not a file"
412 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
415 test_mkdir $DIR/$tdir
416 test_mkdir $DIR/$tdir/d2
417 chmod 0666 $DIR/$tdir/d2
418 chmod 0705 $DIR/$tdir/d2
419 $CHECKSTAT -t dir -p 0705 $DIR/$tdir/d2 ||
420 error "$tdir/d2 mode not 0705"
422 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
425 test_mkdir $DIR/$tdir
426 touch $DIR/$tdir/$tfile
427 chmod 0666 $DIR/$tdir/$tfile
428 chmod 0654 $DIR/$tdir/$tfile
429 $CHECKSTAT -t file -p 0654 $DIR/$tdir/$tfile ||
430 error "$tdir/d2 mode not 0654"
432 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
435 test_mkdir $DIR/$tdir
436 dd if=/dev/zero of=$DIR/$tdir/$tfile count=10
438 $CHECKSTAT -t file -s 0 $DIR/$tdir/$tfile ||
439 error "$tdir/$tfile size not 0 after truncate"
441 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
444 test_mkdir $DIR/$tdir
445 touch $DIR/$tdir/$tfile
447 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
449 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
452 test_mkdir $DIR/$tdir
453 touch $DIR/$tdir/$tfile
454 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
455 $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
456 error "$tdir/${tfile_2} not a file after rename"
457 rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
459 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
462 test_mkdir $DIR/$tdir
463 touch $DIR/$tdir/$tfile
464 rm -rf $DIR/$tdir/$tfile
465 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
467 run_test 16 "touch .../d16/f; rm -rf .../d16/f"
470 test_mkdir $DIR/$tdir
471 touch $DIR/$tdir/$tfile
472 ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist
474 $CHECKSTAT -l $DIR/$tdir/$tfile $DIR/$tdir/l-exist ||
475 error "$tdir/l-exist not a symlink"
476 $CHECKSTAT -f -t f $DIR/$tdir/l-exist ||
477 error "$tdir/l-exist not referencing a file"
478 rm -f $DIR/$tdir/l-exist
479 $CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed"
481 run_test 17a "symlinks: create, remove (real)"
484 test_mkdir $DIR/$tdir
485 ln -s no-such-file $DIR/$tdir/l-dangle
487 $CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle ||
488 error "$tdir/l-dangle not referencing no-such-file"
489 $CHECKSTAT -fa $DIR/$tdir/l-dangle ||
490 error "$tdir/l-dangle not referencing non-existent file"
491 rm -f $DIR/$tdir/l-dangle
492 $CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed"
494 run_test 17b "symlinks: create, remove (dangling)"
496 test_17c() { # bug 3440 - don't save failed open RPC for replay
497 test_mkdir $DIR/$tdir
498 ln -s foo $DIR/$tdir/$tfile
499 cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true
501 run_test 17c "symlinks: open dangling (should return error)"
504 test_mkdir $DIR/$tdir
505 ln -s foo $DIR/$tdir/$tfile
506 touch $DIR/$tdir/$tfile || error "creating to new symlink"
508 run_test 17d "symlinks: create dangling"
511 test_mkdir $DIR/$tdir
512 local foo=$DIR/$tdir/$tfile
513 ln -s $foo $foo || error "create symlink failed"
514 ls -l $foo || error "ls -l failed"
515 ls $foo && error "ls not failed" || true
517 run_test 17e "symlinks: create recursive symlink (should return error)"
520 test_mkdir $DIR/$tdir
521 ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
522 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
523 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
524 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
525 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
526 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/$tdir/666
529 run_test 17f "symlinks: long and very long symlink name"
531 # str_repeat(S, N) generate a string that is string S repeated N times
536 while [ $((n -= 1)) -ge 0 ]; do
542 # Long symlinks and LU-2241
544 test_mkdir $DIR/$tdir
545 local TESTS="59 60 61 4094 4095"
547 # Fix for inode size boundary in 2.1.4
548 [ $MDS1_VERSION -lt $(version_code 2.1.4) ] &&
551 # Patch not applied to 2.2 or 2.3 branches
552 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
553 [ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
556 # skip long symlink name for rhel6.5.
557 # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
558 grep -q '6.5' /etc/redhat-release &>/dev/null &&
559 TESTS="59 60 61 4062 4063"
562 local SYMNAME=$(str_repeat 'x' $i)
563 ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
564 readlink $DIR/$tdir/f$i || error "failed $i-char readlink"
567 run_test 17g "symlinks: really long symlink name and inode boundaries"
569 test_17h() { #bug 17378
570 [ $PARALLEL == "yes" ] && skip "skip parallel run"
571 remote_mds_nodsh && skip "remote MDS with nodsh"
575 test_mkdir $DIR/$tdir
576 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
577 $LFS setstripe -c -1 $DIR/$tdir
578 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
579 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
580 touch $DIR/$tdir/$tfile || true
582 run_test 17h "create objects: lov_free_memmd() doesn't lbug"
584 test_17i() { #bug 20018
585 [ $PARALLEL == "yes" ] && skip "skip parallel run"
586 remote_mds_nodsh && skip "remote MDS with nodsh"
588 local foo=$DIR/$tdir/$tfile
591 test_mkdir -c1 $DIR/$tdir
592 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
593 ln -s $foo $foo || error "create symlink failed"
594 #define OBD_FAIL_MDS_READLINK_EPROTO 0x143
595 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000143
596 ls -l $foo && error "error not detected"
599 run_test 17i "don't panic on short symlink (should return error)"
601 test_17k() { #bug 22301
602 [ $PARALLEL == "yes" ] && skip "skip parallel run"
603 [[ -z "$(which rsync 2>/dev/null)" ]] &&
604 skip "no rsync command"
605 rsync --help | grep -q xattr ||
606 skip_env "$(rsync --version | head -n1) does not support xattrs"
607 test_mkdir $DIR/$tdir
608 test_mkdir $DIR/$tdir.new
609 touch $DIR/$tdir/$tfile
610 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
611 rsync -av -X $DIR/$tdir/ $DIR/$tdir.new ||
612 error "rsync failed with xattrs enabled"
614 run_test 17k "symlinks: rsync with xattrs enabled"
616 test_17l() { # LU-279
617 [[ -z "$(which getfattr 2>/dev/null)" ]] &&
618 skip "no getfattr command"
620 test_mkdir $DIR/$tdir
621 touch $DIR/$tdir/$tfile
622 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
623 for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
624 # -h to not follow symlinks. -m '' to list all the xattrs.
625 # grep to remove first line: '# file: $path'.
626 for xattr in `getfattr -hm '' $path 2>/dev/null | grep -v '^#'`;
628 lgetxattr_size_check $path $xattr ||
629 error "lgetxattr_size_check $path $xattr failed"
633 run_test 17l "Ensure lgetxattr's returned xattr size is consistent"
637 [ $PARALLEL == "yes" ] && skip "skip parallel run"
638 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
639 remote_mds_nodsh && skip "remote MDS with nodsh"
640 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
641 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
642 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
644 local short_sym="0123456789"
645 local wdir=$DIR/$tdir
650 # create a long symlink file
651 for ((i = 0; i < 4; ++i)); do
652 long_sym=${long_sym}${long_sym}
655 echo "create 512 short and long symlink files under $wdir"
656 for ((i = 0; i < 256; ++i)); do
657 ln -sf ${long_sym}"a5a5" $wdir/long-$i
658 ln -sf ${short_sym}"a5a5" $wdir/short-$i
664 wait_delete_completed
666 echo "recreate the 512 symlink files with a shorter string"
667 for ((i = 0; i < 512; ++i)); do
668 # rewrite the symlink file with a shorter string
669 ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed"
670 ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed"
673 local mds_index=$(($($LFS getstripe -m $wdir) + 1))
674 local devname=$(mdsdevname $mds_index)
676 echo "stop and checking mds${mds_index}:"
677 # e2fsck should not return error
679 run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
682 start mds${mds_index} $devname $MDS_MOUNT_OPTS ||
683 error "start mds${mds_index} failed"
684 df $MOUNT > /dev/null 2>&1
686 error "e2fsck detected error for short/long symlink: rc=$rc"
689 run_test 17m "run e2fsck against MDT which contains short/long symlink"
691 check_fs_consistency_17n() {
695 # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
696 # so it only check MDT1/MDT2 instead of all of MDTs.
697 for mdt_index in 1 2; do
698 local devname=$(mdsdevname $mdt_index)
699 # e2fsck should not return error
701 run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
704 start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
705 error "mount mds$mdt_index failed"
706 df $MOUNT > /dev/null 2>&1
712 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
713 [ $PARALLEL == "yes" ] && skip "skip parallel run"
714 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
715 remote_mds_nodsh && skip "remote MDS with nodsh"
716 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
717 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
718 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
722 test_mkdir $DIR/$tdir
723 for ((i=0; i<10; i++)); do
724 $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
725 error "create remote dir error $i"
726 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
727 error "create files under remote dir failed $i"
730 check_fs_consistency_17n ||
731 error "e2fsck report error after create files under remote dir"
733 for ((i = 0; i < 10; i++)); do
734 rm -rf $DIR/$tdir/remote_dir_${i} ||
735 error "destroy remote dir error $i"
738 check_fs_consistency_17n ||
739 error "e2fsck report error after unlink files under remote dir"
741 [ $MDS1_VERSION -lt $(version_code 2.4.50) ] &&
742 skip "lustre < 2.4.50 does not support migrate mv"
744 for ((i = 0; i < 10; i++)); do
745 mkdir -p $DIR/$tdir/remote_dir_${i}
746 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
747 error "create files under remote dir failed $i"
748 $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
749 error "migrate remote dir error $i"
751 check_fs_consistency_17n || error "e2fsck report error after migration"
753 for ((i = 0; i < 10; i++)); do
754 rm -rf $DIR/$tdir/remote_dir_${i} ||
755 error "destroy remote dir error $i"
758 check_fs_consistency_17n || error "e2fsck report error after unlink"
760 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
763 remote_mds_nodsh && skip "remote MDS with nodsh"
764 [ $MDS1_VERSION -lt $(version_code 2.3.64) ] &&
765 skip "Need MDS version at least 2.3.64"
767 local wdir=$DIR/${tdir}o
773 mdt_index=$($LFS getstripe -m $wdir/$tfile)
774 mdt_index=$((mdt_index + 1))
777 #fail mds will wait the failover finish then set
778 #following fail_loc to avoid interfer the recovery process.
781 #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
782 do_facet mds${mdt_index} lctl set_param fail_loc=0x194
783 ls -l $wdir/$tfile && rc=1
784 do_facet mds${mdt_index} lctl set_param fail_loc=0
785 [[ $rc -eq 0 ]] || error "stat file should fail"
787 run_test 17o "stat file with incompat LMA feature"
790 touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
791 ls $DIR || error "Failed to ls $DIR: $?"
793 run_test 18 "touch .../f ; ls ... =============================="
799 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
801 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
804 ls -l $DIR/$tfile && error "ls -l $tfile failed"|| true
806 run_test 19b "ls -l .../f19 (should return error) =============="
809 [ $RUNAS_ID -eq $UID ] &&
810 skip_env "RUNAS_ID = UID = $UID -- skipping"
812 $RUNAS touch $DIR/$tfile && error "create non-root file failed" || true
814 run_test 19c "$RUNAS touch .../f19 (should return error) =="
817 cat $DIR/f19 && error || true
819 run_test 19d "cat .../f19 (should return error) =============="
828 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
830 run_test 20 "touch .../f ; ls -l ..."
833 test_mkdir $DIR/$tdir
834 [ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle
835 ln -s dangle $DIR/$tdir/link
836 echo foo >> $DIR/$tdir/link
837 cat $DIR/$tdir/dangle
838 $CHECKSTAT -t link $DIR/$tdir/link || error "$tdir/link not a link"
839 $CHECKSTAT -f -t file $DIR/$tdir/link ||
840 error "$tdir/link not linked to a file"
842 run_test 21 "write to dangling link"
845 local wdir=$DIR/$tdir
847 chown $RUNAS_ID:$RUNAS_GID $wdir
848 (cd $wdir || error "cd $wdir failed";
849 $RUNAS tar cf - /etc/hosts /etc/sysconfig/network |
851 ls -lR $wdir/etc || error "ls -lR $wdir/etc failed"
852 $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed"
853 $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc ||
854 error "checkstat -u failed"
856 run_test 22 "unpack tar archive as non-root user"
860 test_mkdir $DIR/$tdir
861 local file=$DIR/$tdir/$tfile
863 openfile -f O_CREAT:O_EXCL $file || error "$file create failed"
864 openfile -f O_CREAT:O_EXCL $file &&
865 error "$file recreate succeeded" || true
867 run_test 23a "O_CREAT|O_EXCL in subdir"
869 test_23b() { # bug 18988
870 test_mkdir $DIR/$tdir
871 local file=$DIR/$tdir/$tfile
874 echo foo > $file || error "write filed"
875 echo bar >> $file || error "append filed"
876 $CHECKSTAT -s 8 $file || error "wrong size"
879 run_test 23b "O_APPEND check"
881 # LU-9409, size with O_APPEND and tiny writes
883 local file=$DIR/$tfile
886 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800
887 $CHECKSTAT -s 6400 $file || error "wrong size, expected 6400"
891 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
892 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
894 $CHECKSTAT -s 12800 $file || error "wrong size, expected 12800"
897 #racing tiny & normal writes
898 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4096 count=4 &
899 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=100 &
901 $CHECKSTAT -s 17184 $file || error "wrong size, expected 17184"
904 #racing tiny & normal writes 2, ugly numbers
905 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4099 count=11 &
906 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=17 count=173 &
908 $CHECKSTAT -s 48030 $file || error "wrong size, expected 48030"
911 run_test 23c "O_APPEND size checks for tiny writes"
913 # LU-11069 file offset is correct after appending writes
915 local file=$DIR/$tfile
918 echo CentaurHauls > $file
919 offset=$($MULTIOP $file oO_WRONLY:O_APPEND:w13Zp)
920 if ((offset != 26)); then
921 error "wrong offset, expected 26, got '$offset'"
924 run_test 23d "file offset is correct after appending writes"
928 echo '-- same directory rename'
929 test_mkdir $DIR/$tdir
930 touch $DIR/$tdir/$tfile.1
931 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
932 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
934 run_test 24a "rename file to non-existent target"
937 test_mkdir $DIR/$tdir
938 touch $DIR/$tdir/$tfile.{1,2}
939 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
940 $CHECKSTAT -a $DIR/$tdir/$tfile.1 || error "$tfile.1 exists"
941 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
943 run_test 24b "rename file to existing target"
946 test_mkdir $DIR/$tdir
947 test_mkdir $DIR/$tdir/d$testnum.1
948 mv $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
949 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
950 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
952 run_test 24c "rename directory to non-existent target"
955 test_mkdir -c1 $DIR/$tdir
956 test_mkdir -c1 $DIR/$tdir/d$testnum.1
957 test_mkdir -c1 $DIR/$tdir/d$testnum.2
958 mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
959 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
960 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
962 run_test 24d "rename directory to existing target"
965 echo '-- cross directory renames --'
969 mv $DIR/R5a/f $DIR/R5b/g
970 $CHECKSTAT -a $DIR/R5a/f || error "$DIR/R5a/f exists"
971 $CHECKSTAT -t file $DIR/R5b/g || error "$DIR/R5b/g not file type"
973 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
978 touch $DIR/R6a/f $DIR/R6b/g
979 mv $DIR/R6a/f $DIR/R6b/g
980 $CHECKSTAT -a $DIR/R6a/f || error "$DIR/R6a/f exists"
981 $CHECKSTAT -t file $DIR/R6b/g || error "$DIR/R6b/g not file type"
983 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
988 test_mkdir $DIR/R7a/d
989 mv $DIR/R7a/d $DIR/R7b/e
990 $CHECKSTAT -a $DIR/R7a/d || error "$DIR/R7a/d exists"
991 $CHECKSTAT -t dir $DIR/R7b/e || error "$DIR/R7b/e not dir type"
993 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
996 test_mkdir -c1 $DIR/R8a
997 test_mkdir -c1 $DIR/R8b
998 test_mkdir -c1 $DIR/R8a/d
999 test_mkdir -c1 $DIR/R8b/e
1000 mrename $DIR/R8a/d $DIR/R8b/e
1001 $CHECKSTAT -a $DIR/R8a/d || error "$DIR/R8a/d exists"
1002 $CHECKSTAT -t dir $DIR/R8b/e || error "$DIR/R8b/e not dir type"
1004 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
1007 echo "-- rename error cases"
1009 test_mkdir $DIR/R9/a
1011 mrename $DIR/R9/f $DIR/R9/a
1012 $CHECKSTAT -t file $DIR/R9/f || error "$DIR/R9/f not file type"
1013 $CHECKSTAT -t dir $DIR/R9/a || error "$DIR/R9/a not dir type"
1014 $CHECKSTAT -a $DIR/R9/a/f || error "$DIR/R9/a/f exists"
1016 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
1020 mrename $DIR/R10/f $DIR/R10/g
1021 $CHECKSTAT -t dir $DIR/R10 || error "$DIR/R10 not dir type"
1022 $CHECKSTAT -a $DIR/R10/f || error "$DIR/R10/f exists"
1023 $CHECKSTAT -a $DIR/R10/g || error "$DIR/R10/g exists"
1025 run_test 24j "source does not exist ============================"
1028 test_mkdir $DIR/R11a
1029 test_mkdir $DIR/R11a/d
1031 mv $DIR/R11a/f $DIR/R11a/d
1032 $CHECKSTAT -a $DIR/R11a/f || error "$DIR/R11a/f exists"
1033 $CHECKSTAT -t file $DIR/R11a/d/f || error "$DIR/R11a/d/f not file type"
1035 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
1037 # bug 2429 - rename foo foo foo creates invalid file
1040 $MULTIOP $f OcNs || error "rename of ${f} to itself failed"
1042 run_test 24l "Renaming a file to itself ========================"
1046 $MULTIOP $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
1047 # on ext3 this does not remove either the source or target files
1048 # though the "expected" operation would be to remove the source
1049 $CHECKSTAT -t file ${f} || error "${f} missing"
1050 $CHECKSTAT -t file ${f}2 || error "${f}2 missing"
1052 run_test 24m "Renaming a file to a hard link to itself ========="
1056 # this stats the old file after it was renamed, so it should fail
1058 $CHECKSTAT ${f} || error "${f} missing"
1060 $CHECKSTAT ${f}.rename || error "${f}.rename missing"
1061 $CHECKSTAT -a ${f} || error "${f} exists"
1063 run_test 24n "Statting the old file after renaming (Posix rename 2)"
1066 test_mkdir $DIR/$tdir
1067 rename_many -s random -v -n 10 $DIR/$tdir
1069 run_test 24o "rename of files during htree split"
1072 test_mkdir $DIR/R12a
1073 test_mkdir $DIR/R12b
1074 DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
1075 mrename $DIR/R12a $DIR/R12b
1076 $CHECKSTAT -a $DIR/R12a || error "$DIR/R12a exists"
1077 $CHECKSTAT -t dir $DIR/R12b || error "$DIR/R12b not dir type"
1078 DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
1079 [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
1081 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
1083 cleanup_multiop_pause() {
1085 kill -USR1 $MULTIPID
1089 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1091 test_mkdir $DIR/R13a
1092 test_mkdir $DIR/R13b
1093 local DIRINO=$(ls -lid $DIR/R13a | awk '{ print $1 }')
1094 multiop_bg_pause $DIR/R13b D_c || error "multiop failed to start"
1097 trap cleanup_multiop_pause EXIT
1098 mrename $DIR/R13a $DIR/R13b
1099 $CHECKSTAT -a $DIR/R13a || error "R13a still exists"
1100 $CHECKSTAT -t dir $DIR/R13b || error "R13b does not exist"
1101 local DIRINO2=$(ls -lid $DIR/R13b | awk '{ print $1 }')
1102 [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
1103 cleanup_multiop_pause
1104 wait $MULTIPID || error "multiop close failed"
1106 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
1108 test_24r() { #bug 3789
1109 test_mkdir $DIR/R14a
1110 test_mkdir $DIR/R14a/b
1111 mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
1112 $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
1113 $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
1115 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
1118 test_mkdir $DIR/R15a
1119 test_mkdir $DIR/R15a/b
1120 test_mkdir $DIR/R15a/b/c
1121 mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
1122 $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
1123 $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
1125 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
1127 test_mkdir $DIR/R16a
1128 test_mkdir $DIR/R16a/b
1129 test_mkdir $DIR/R16a/b/c
1130 mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
1131 $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
1132 $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
1134 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
1136 test_24u() { # bug12192
1137 $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error "multiop failed"
1138 $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
1140 run_test 24u "create stripe file"
1142 simple_cleanup_common() {
1145 [ -z "$DIR" -o -z "$tdir" ] && return 0
1147 local start=$SECONDS
1150 wait_delete_completed
1151 echo "cleanup time $((SECONDS - start))"
1155 max_pages_per_rpc() {
1156 local mdtname="$(printf "MDT%04x" ${1:-0})"
1157 $LCTL get_param -n mdc.*$mdtname*.max_pages_per_rpc
1161 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1163 local nrfiles=${COUNT:-100000}
1164 local fname="$DIR/$tdir/$tfile"
1166 # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
1167 [ "$mds1_FSTYPE" = "zfs" ] && nrfiles=${COUNT:-10000}
1169 test_mkdir "$(dirname $fname)"
1170 # assume MDT0000 has the fewest inodes
1171 local stripes=$($LFS getdirstripe -c $(dirname $fname))
1172 local free_inodes=$(($(mdt_free_inodes 0) * stripes))
1173 [[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
1175 trap simple_cleanup_common EXIT
1177 createmany -m "$fname" $nrfiles
1179 cancel_lru_locks mdc
1180 lctl set_param mdc.*.stats clear
1182 # was previously test_24D: LU-6101
1183 # readdir() returns correct number of entries after cursor reload
1184 local num_ls=$(ls $DIR/$tdir | wc -l)
1185 local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l)
1186 local num_all=$(ls -a $DIR/$tdir | wc -l)
1187 if [ $num_ls -ne $nrfiles -o $num_uniq -ne $nrfiles -o \
1188 $num_all -ne $((nrfiles + 2)) ]; then
1189 error "Expected $nrfiles files, got $num_ls " \
1190 "($num_uniq unique $num_all .&..)"
1192 # LU-5 large readdir
1193 # dirent_size = 32 bytes for sizeof(struct lu_dirent) +
1194 # N bytes for name (len($nrfiles) rounded to 8 bytes) +
1195 # 8 bytes for luda_type (4 bytes rounded to 8 bytes)
1196 # take into account of overhead in lu_dirpage header and end mark in
1197 # each page, plus one in rpc_num calculation.
1198 local dirent_size=$((32 + (${#tfile} | 7) + 1 + 8))
1199 local page_entries=$(((PAGE_SIZE - 24) / dirent_size))
1200 local mdt_idx=$($LFS getdirstripe -i $(dirname $fname))
1201 local rpc_pages=$(max_pages_per_rpc $mdt_idx)
1202 local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
1203 local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
1204 echo "readpages: $mds_readpage rpc_max: $rpc_max"
1205 (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
1206 error "large readdir doesn't take effect: " \
1207 "$mds_readpage should be about $rpc_max"
1209 simple_cleanup_common
1211 run_test 24v "list large directory (test hash collision, b=17560)"
1213 test_24w() { # bug21506
1215 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
1216 dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
1217 dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
1218 SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
1219 [[ "$SZ1" -eq "$SZ2" ]] ||
1220 error "Error reading at the end of the file $tfile"
1222 run_test 24w "Reading a file larger than 4Gb"
1225 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1226 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1227 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1228 skip "Need MDS version at least 2.7.56"
1231 local remote_dir=$DIR/$tdir/remote_dir
1233 test_mkdir $DIR/$tdir
1234 $LFS mkdir -i $MDTIDX $remote_dir ||
1235 error "create remote directory failed"
1237 test_mkdir $DIR/$tdir/src_dir
1238 touch $DIR/$tdir/src_file
1239 test_mkdir $remote_dir/tgt_dir
1240 touch $remote_dir/tgt_file
1242 mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
1243 error "rename dir cross MDT failed!"
1245 mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
1246 error "rename file cross MDT failed!"
1248 touch $DIR/$tdir/ln_file
1249 ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
1250 error "ln file cross MDT failed"
1252 rm -rf $DIR/$tdir || error "Can not delete directories"
1254 run_test 24x "cross MDT rename/link"
1257 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1258 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1260 local remote_dir=$DIR/$tdir/remote_dir
1263 test_mkdir $DIR/$tdir
1264 $LFS mkdir -i $mdtidx $remote_dir ||
1265 error "create remote directory failed"
1267 test_mkdir $remote_dir/src_dir
1268 touch $remote_dir/src_file
1269 test_mkdir $remote_dir/tgt_dir
1270 touch $remote_dir/tgt_file
1272 mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
1273 error "rename subdir in the same remote dir failed!"
1275 mrename $remote_dir/src_file $remote_dir/tgt_file ||
1276 error "rename files in the same remote dir failed!"
1278 ln $remote_dir/tgt_file $remote_dir/tgt_file1 ||
1279 error "link files in the same remote dir failed!"
1281 rm -rf $DIR/$tdir || error "Can not delete directories"
1283 run_test 24y "rename/link on the same dir should succeed"
1286 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1287 [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] &&
1288 skip "Need MDS version at least 2.12.51"
1292 for index in 0 1; do
1293 $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed"
1294 touch $DIR/$tdir.0/$tfile.$index || error "touch failed"
1297 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed"
1299 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0)
1300 [ $index -eq 0 ] || error "$tfile.0 is on MDT$index"
1302 local mdts=$(comma_list $(mdts_nodes))
1304 do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0
1305 stack_trap "do_nodes $mdts $LCTL \
1306 set_param mdt.*.enable_remote_rename=1" EXIT
1308 mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed"
1310 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1)
1311 [ $index -eq 1 ] || error "$tfile.1 is on MDT$index"
1313 run_test 24z "cross-MDT rename is done as cp"
1315 test_24A() { # LU-3182
1319 test_mkdir $DIR/$tdir
1320 trap simple_cleanup_common EXIT
1321 createmany -m $DIR/$tdir/$tfile $NFILES
1322 local t=$(ls $DIR/$tdir | wc -l)
1323 local u=$(ls $DIR/$tdir | sort -u | wc -l)
1324 local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
1325 if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then
1326 error "Expected $NFILES files, got $t ($u unique $v .&..)"
1329 simple_cleanup_common || error "Can not delete directories"
1331 run_test 24A "readdir() returns correct number of entries."
1333 test_24B() { # LU-4805
1334 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1338 test_mkdir $DIR/$tdir
1339 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
1340 error "create striped dir failed"
1342 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1343 [ $count -eq 2 ] || error "Expected 2, got $count"
1345 touch $DIR/$tdir/striped_dir/a
1347 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1348 [ $count -eq 3 ] || error "Expected 3, got $count"
1350 touch $DIR/$tdir/striped_dir/.f
1352 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1353 [ $count -eq 4 ] || error "Expected 4, got $count"
1355 rm -rf $DIR/$tdir || error "Can not delete directories"
1357 run_test 24B "readdir for striped dir return correct number of entries"
1360 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1366 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
1367 error "create striped dir failed"
1369 cd $DIR/$tdir/d0/striped_dir
1371 local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
1372 local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
1373 local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1375 [ "$d0_ino" = "$parent_ino" ] ||
1376 error ".. wrong, expect $d0_ino, get $parent_ino"
1378 mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
1379 error "mv striped dir failed"
1381 parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1383 [ "$d1_ino" = "$parent_ino" ] ||
1384 error ".. wrong after mv, expect $d1_ino, get $parent_ino"
1386 run_test 24C "check .. in striped dir"
1389 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
1390 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1393 mkdir $DIR/$tdir/src_dir
1394 $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
1395 error "create remote source failed"
1397 touch $DIR/$tdir/src_dir/src_child/a
1399 $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
1400 error "create remote target dir failed"
1402 $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
1403 error "create remote target child failed"
1405 mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
1406 error "rename dir cross MDT failed!"
1410 $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
1411 error "src_child still exists after rename"
1413 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
1414 error "missing file(a) after rename"
1416 rm -rf $DIR/$tdir || error "Can not delete directories"
1418 run_test 24E "cross MDT rename/link"
1421 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
1424 [ "$SLOW" = "no" ] && repeats=100
1428 echo "$repeats repeats"
1429 for ((i = 0; i < repeats; i++)); do
1430 $LFS mkdir -i0 -c2 $DIR/$tdir/test || error "mkdir fails"
1431 touch $DIR/$tdir/test/a || error "touch fails"
1432 mkdir $DIR/$tdir/test/b || error "mkdir fails"
1433 rm -rf $DIR/$tdir/test || error "rmdir fails"
1438 run_test 24F "hash order vs readdir (LU-11330)"
1441 echo '== symlink sanity ============================================='
1445 touch $DIR/s25/foo ||
1446 error "File creation in symlinked directory failed"
1448 run_test 25a "create file in symlinked directory ==============="
1451 [ ! -d $DIR/d25 ] && test_25a
1452 $CHECKSTAT -t file $DIR/s25/foo || error "$DIR/s25/foo not file type"
1454 run_test 25b "lookup file in symlinked directory ==============="
1458 test_mkdir $DIR/d26/d26-2
1459 ln -s d26/d26-2 $DIR/s26
1460 touch $DIR/s26/foo || error "File creation failed"
1462 run_test 26a "multiple component symlink ======================="
1465 test_mkdir -p $DIR/$tdir/d26-2
1466 ln -s $tdir/d26-2/foo $DIR/s26-2
1467 touch $DIR/s26-2 || error "File creation failed"
1469 run_test 26b "multiple component symlink at end of lookup ======"
1472 test_mkdir $DIR/d26.2
1473 touch $DIR/d26.2/foo
1474 ln -s d26.2 $DIR/s26.2-1
1475 ln -s s26.2-1 $DIR/s26.2-2
1476 ln -s s26.2-2 $DIR/s26.2-3
1477 chmod 0666 $DIR/s26.2-3/foo
1479 run_test 26c "chain of symlinks"
1481 # recursive symlinks (bug 439)
1483 ln -s d26-3/foo $DIR/d26-3
1485 run_test 26d "create multiple component recursive symlink"
1488 [ ! -h $DIR/d26-3 ] && test_26d
1491 run_test 26e "unlink multiple component recursive symlink"
1493 # recursive symlinks (bug 7022)
1495 test_mkdir $DIR/$tdir
1496 test_mkdir $DIR/$tdir/$tfile
1497 cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed"
1498 test_mkdir -p lndir/bar1
1499 test_mkdir $DIR/$tdir/$tfile/$tfile
1500 cd $tfile || error "cd $tfile failed"
1501 ln -s .. dotdot || error "ln dotdot failed"
1502 ln -s dotdot/lndir lndir || error "ln lndir failed"
1503 cd $DIR/$tdir || error "cd $DIR/$tdir failed"
1504 output=`ls $tfile/$tfile/lndir/bar1`
1505 [ "$output" = bar1 ] && error "unexpected output"
1506 rm -r $tfile || error "rm $tfile failed"
1507 $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
1509 run_test 26f "rm -r of a directory which has recursive symlink"
1512 test_mkdir $DIR/$tdir
1513 $LFS getstripe $DIR/$tdir
1514 $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed"
1515 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1516 cp /etc/hosts $DIR/$tdir/$tfile || error "Can't copy to one stripe file"
1518 run_test 27a "one stripe file"
1521 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1523 test_mkdir $DIR/$tdir
1524 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1525 $LFS getstripe -c $DIR/$tdir/$tfile
1526 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
1527 error "two-stripe file doesn't have two stripes"
1529 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1531 run_test 27b "create and write to two stripe file"
1534 test_mkdir $DIR/$tdir
1535 $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
1536 error "setstripe failed"
1537 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1538 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1540 run_test 27d "create file with default settings"
1543 # LU-5839 adds check for existed layout before setting it
1544 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1545 skip "Need MDS version at least 2.7.56"
1547 test_mkdir $DIR/$tdir
1548 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1549 $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice"
1550 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1552 run_test 27e "setstripe existing file (should return error)"
1555 test_mkdir $DIR/$tdir
1556 $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
1557 error "$SETSTRIPE $DIR/$tdir/$tfile failed"
1558 $CHECKSTAT -t file $DIR/$tdir/$tfile &&
1559 error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
1560 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1561 $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed"
1563 run_test 27f "setstripe with bad stripe size (should return error)"
1566 test_mkdir $DIR/$tdir
1567 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1568 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" ||
1569 error "$DIR/$tdir/$tfile has object"
1571 run_test 27g "$LFS getstripe with no objects"
1574 test_mkdir $DIR/$tdir
1575 touch $DIR/$tdir/$tfile || error "touch failed"
1576 ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed"
1577 $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2
1579 (( rc == 2 )) || error "getstripe did not return ENOENT"
1581 run_test 27ga "$LFS getstripe with missing file (should return error)"
1584 test_mkdir $DIR/$tdir
1585 touch $DIR/$tdir/$tfile || error "touch failed"
1586 [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] ||
1587 error "missing objects"
1589 run_test 27i "$LFS getstripe with some objects"
1592 test_mkdir $DIR/$tdir
1593 $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile &&
1594 error "setstripe failed" || true
1596 run_test 27j "setstripe with bad stripe offset (should return error)"
1598 test_27k() { # bug 2844
1599 test_mkdir $DIR/$tdir
1600 local file=$DIR/$tdir/$tfile
1601 local ll_max_blksize=$((4 * 1024 * 1024))
1602 $LFS setstripe -S 67108864 $file || error "setstripe failed"
1603 local blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1604 [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize"
1605 dd if=/dev/zero of=$file bs=4k count=1
1606 blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1607 [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize"
1609 run_test 27k "limit i_blksize for broken user apps"
1612 mcreate $DIR/$tfile || error "creating file"
1613 $RUNAS $LFS setstripe -c 1 $DIR/$tfile &&
1614 error "setstripe should have failed" || true
1616 run_test 27l "check setstripe permissions (should return error)"
1619 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1621 ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
1623 if [[ $ORIGFREE -gt $MAXFREE ]]; then
1624 skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
1626 trap simple_cleanup_common EXIT
1627 test_mkdir $DIR/$tdir
1628 $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
1629 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
1630 error "dd should fill OST0"
1632 while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do
1634 [ $i -gt 256 ] && break
1637 touch $DIR/$tdir/$tfile.$i
1638 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1639 awk '{print $1}'| grep -w "0") ] &&
1640 error "OST0 was full but new created file still use it"
1642 touch $DIR/$tdir/$tfile.$i
1643 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1644 awk '{print $1}'| grep -w "0") ] &&
1645 error "OST0 was full but new created file still use it"
1646 simple_cleanup_common
1648 run_test 27m "create file while OST0 was full"
1651 local delay=$(do_facet $SINGLEMDS lctl get_param -n lo[vd].*.qos_maxage |
1652 awk '{ print $1 * 2; exit; }')
1656 # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage)
1657 # if the OST isn't full anymore.
1659 local OSTIDX=${1:-""}
1661 local list=$(comma_list $(osts_nodes))
1662 [ "$OSTIDX" ] && list=$(facet_host ost$((OSTIDX + 1)))
1664 do_nodes $list lctl set_param fail_loc=0
1665 sync # initiate all OST_DESTROYs from MDS to OST
1669 exhaust_precreations() {
1672 local FAILIDX=${3:-$OSTIDX}
1673 local ofacet=ost$((OSTIDX + 1))
1675 test_mkdir -p -c1 $DIR/$tdir
1676 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
1677 local mfacet=mds$((mdtidx + 1))
1678 echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
1680 local OST=$(ostname_from_index $OSTIDX)
1683 local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST)
1684 local last_id=$(do_facet $mfacet lctl get_param -n \
1685 osp.$mdtosc_proc1.prealloc_last_id)
1686 local next_id=$(do_facet $mfacet lctl get_param -n \
1687 osp.$mdtosc_proc1.prealloc_next_id)
1689 local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet)
1690 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1692 test_mkdir -p $DIR/$tdir/${OST}
1693 $SETSTRIPE -i $OSTIDX -c 1 $DIR/$tdir/${OST}
1694 #define OBD_FAIL_OST_ENOSPC 0x215
1695 do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215
1696 echo "Creating to objid $last_id on ost $OST..."
1697 createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
1698 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1699 do_facet $ofacet lctl set_param fail_loc=$FAILLOC
1703 exhaust_all_precreations() {
1705 for (( i=0; i < OSTCOUNT; i++ )) ; do
1706 exhaust_precreations $i $1 -1
1711 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1712 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1713 remote_mds_nodsh && skip "remote MDS with nodsh"
1714 remote_ost_nodsh && skip "remote OST with nodsh"
1717 rm -f $DIR/$tdir/$tfile
1718 exhaust_precreations 0 0x80000215
1719 $LFS setstripe -c -1 $DIR/$tdir || error "setstripe failed"
1720 touch $DIR/$tdir/$tfile || error "touch failed"
1721 $LFS getstripe $DIR/$tdir/$tfile
1724 run_test 27n "create file with some full OSTs"
1727 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1728 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1729 remote_mds_nodsh && skip "remote MDS with nodsh"
1730 remote_ost_nodsh && skip "remote OST with nodsh"
1733 rm -f $DIR/$tdir/$tfile
1734 exhaust_all_precreations 0x215
1736 touch $DIR/$tdir/$tfile && error "able to create $DIR/$tdir/$tfile"
1741 run_test 27o "create file with all full OSTs (should error)"
1744 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1745 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1746 remote_mds_nodsh && skip "remote MDS with nodsh"
1747 remote_ost_nodsh && skip "remote OST with nodsh"
1750 rm -f $DIR/$tdir/$tfile
1751 test_mkdir $DIR/$tdir
1753 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1754 $TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed"
1755 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1757 exhaust_precreations 0 0x80000215
1758 echo foo >> $DIR/$tdir/$tfile || error "append failed"
1759 $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed"
1760 $LFS getstripe $DIR/$tdir/$tfile
1764 run_test 27p "append to a truncated file with some full OSTs"
1767 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1768 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1769 remote_mds_nodsh && skip "remote MDS with nodsh"
1770 remote_ost_nodsh && skip "remote OST with nodsh"
1773 rm -f $DIR/$tdir/$tfile
1775 test_mkdir $DIR/$tdir
1776 $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
1777 $TRUNCATE $DIR/$tdir/$tfile 80000000 ||
1778 error "truncate $DIR/$tdir/$tfile failed"
1779 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1781 exhaust_all_precreations 0x215
1783 echo foo >> $DIR/$tdir/$tfile && error "append succeeded"
1784 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat 2 failed"
1788 run_test 27q "append to truncated file with all OSTs full (should error)"
1791 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1792 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1793 remote_mds_nodsh && skip "remote MDS with nodsh"
1794 remote_ost_nodsh && skip "remote OST with nodsh"
1797 rm -f $DIR/$tdir/$tfile
1798 exhaust_precreations 0 0x80000215
1800 $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1804 run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
1806 test_27s() { # bug 10725
1807 test_mkdir $DIR/$tdir
1808 local stripe_size=$((4096 * 1024 * 1024)) # 2^32
1809 local stripe_count=0
1810 [ $OSTCOUNT -eq 1 ] || stripe_count=2
1811 $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir &&
1812 error "stripe width >= 2^32 succeeded" || true
1815 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
1817 test_27t() { # bug 10864
1822 $WLFS getstripe $tfile
1825 run_test 27t "check that utils parse path correctly"
1827 test_27u() { # bug 4900
1828 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1829 remote_mds_nodsh && skip "remote MDS with nodsh"
1832 local list=$(comma_list $(mdts_nodes))
1834 #define OBD_FAIL_MDS_OSC_PRECREATE 0x139
1835 do_nodes $list $LCTL set_param fail_loc=0x139
1836 test_mkdir -p $DIR/$tdir
1837 trap simple_cleanup_common EXIT
1838 createmany -o $DIR/$tdir/t- 1000
1839 do_nodes $list $LCTL set_param fail_loc=0
1841 TLOG=$TMP/$tfile.getstripe
1842 $LFS getstripe $DIR/$tdir > $TLOG
1843 OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
1844 unlinkmany $DIR/$tdir/t- 1000
1846 [[ $OBJS -gt 0 ]] &&
1847 error "$OBJS objects created on OST-0. See $TLOG" ||
1850 run_test 27u "skip object creation on OSC w/o objects"
1852 test_27v() { # bug 4900
1853 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1854 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1855 remote_mds_nodsh && skip "remote MDS with nodsh"
1856 remote_ost_nodsh && skip "remote OST with nodsh"
1858 exhaust_all_precreations 0x215
1861 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1863 touch $DIR/$tdir/$tfile
1864 #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
1866 for (( i=1; i < OSTCOUNT; i++ )); do
1867 do_facet ost$i lctl set_param fail_loc=0x705
1869 local START=`date +%s`
1870 createmany -o $DIR/$tdir/$tfile 32
1872 local FINISH=`date +%s`
1873 local TIMEOUT=`lctl get_param -n timeout`
1874 local PROCESS=$((FINISH - START))
1875 [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
1876 error "$FINISH - $START >= $TIMEOUT / 2"
1877 sleep $((TIMEOUT / 2 - PROCESS))
1880 run_test 27v "skip object creation on slow OST"
1882 test_27w() { # bug 10997
1883 test_mkdir $DIR/$tdir
1884 $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
1885 [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
1886 error "stripe size $size != 65536" || true
1887 [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
1888 error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
1890 run_test 27w "check $LFS setstripe -S and getstrip -d options"
1893 [[ $OSTCOUNT -lt 2 ]] &&
1894 skip_env "skipping multiple stripe count/offset test"
1896 test_mkdir $DIR/$tdir
1897 for i in $(seq 1 $OSTCOUNT); do
1899 $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i ||
1900 error "setstripe -c $i -i $offset failed"
1901 count=$($LFS getstripe -c $DIR/$tdir/f$i)
1902 index=$($LFS getstripe -i $DIR/$tdir/f$i)
1903 [ $count -ne $i ] && error "stripe count $count != $i" || true
1904 [ $index -ne $offset ] &&
1905 error "stripe offset $index != $offset" || true
1908 run_test 27wa "check $LFS setstripe -c -i options"
1911 remote_ost_nodsh && skip "remote OST with nodsh"
1912 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1913 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1915 OFFSET=$(($OSTCOUNT - 1))
1917 local OST=$(ostname_from_index $OSTIDX)
1919 test_mkdir $DIR/$tdir
1920 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file
1921 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1
1923 createmany -o $DIR/$tdir/$tfile $OSTCOUNT
1924 for i in $(seq 0 $OFFSET); do
1925 [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx |
1926 awk '{print $1}' | grep -w "$OSTIDX") ] &&
1927 error "OST0 was degraded but new created file still use it"
1929 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0
1931 run_test 27x "create files while OST0 is degraded"
1934 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1935 remote_mds_nodsh && skip "remote MDS with nodsh"
1936 remote_ost_nodsh && skip "remote OST with nodsh"
1937 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1939 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
1940 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
1941 osp.$mdtosc.prealloc_last_id)
1942 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
1943 osp.$mdtosc.prealloc_next_id)
1944 local fcount=$((last_id - next_id))
1945 [[ $fcount -eq 0 ]] && skip "not enough space on OST0"
1946 [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
1948 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
1949 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
1950 local OST_DEACTIVE_IDX=-1
1955 for OSC in $MDS_OSCS; do
1956 OST=$(osc_to_ost $OSC)
1957 OSTIDX=$(index_from_ostuuid $OST)
1958 if [ $OST_DEACTIVE_IDX == -1 ]; then
1959 OST_DEACTIVE_IDX=$OSTIDX
1961 if [ $OSTIDX != $OST_DEACTIVE_IDX ]; then
1962 echo $OSC "is Deactivated:"
1963 do_facet $SINGLEMDS lctl --device %$OSC deactivate
1967 OSTIDX=$(index_from_ostuuid $OST)
1968 test_mkdir $DIR/$tdir
1969 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1971 for OSC in $MDS_OSCS; do
1972 OST=$(osc_to_ost $OSC)
1973 OSTIDX=$(index_from_ostuuid $OST)
1974 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
1975 echo $OST "is degraded:"
1976 do_facet ost$((OSTIDX+1)) lctl set_param -n \
1977 obdfilter.$OST.degraded=1
1982 createmany -o $DIR/$tdir/$tfile $fcount
1984 for OSC in $MDS_OSCS; do
1985 OST=$(osc_to_ost $OSC)
1986 OSTIDX=$(index_from_ostuuid $OST)
1987 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
1988 echo $OST "is recovered from degraded:"
1989 do_facet ost$((OSTIDX+1)) lctl set_param -n \
1990 obdfilter.$OST.degraded=0
1992 do_facet $SINGLEMDS lctl --device %$OSC activate
1996 # all osp devices get activated, hence -1 stripe count restored
1997 local stripe_count=0
1999 # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp
2000 # devices get activated.
2002 $LFS setstripe -c -1 $DIR/$tfile
2003 stripe_count=$($LFS getstripe -c $DIR/$tfile)
2005 [ $stripe_count -ne $OSTCOUNT ] &&
2006 error "Of $OSTCOUNT OSTs, only $stripe_count is available"
2009 run_test 27y "create files while OST0 is degraded and the rest inactive"
2015 lmm_count=$($GETSTRIPE -c $1)
2016 lmm_seq=$($GETSTRIPE -v $1 | awk '/lmm_seq/ { print $2 }')
2017 lmm_oid=$($GETSTRIPE -v $1 | awk '/lmm_object_id/ { print $2 }')
2019 local old_ifs="$IFS"
2021 fid=($($LFS path2fid $1))
2024 log "FID seq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}"
2025 log "LOV seq $lmm_seq, oid $lmm_oid, count: $lmm_count"
2027 # compare lmm_seq and lu_fid->f_seq
2028 [ $lmm_seq = ${fid[1]} ] || { error "SEQ mismatch"; return 1; }
2029 # compare lmm_object_id and lu_fid->oid
2030 [ $lmm_oid = ${fid[2]} ] || { error "OID mismatch"; return 2; }
2032 # check the trusted.fid attribute of the OST objects of the file
2033 local have_obdidx=false
2035 $GETSTRIPE $1 | while read obdidx oid hex seq; do
2036 # skip lines up to and including "obdidx"
2037 [ -z "$obdidx" ] && break
2038 [ "$obdidx" = "obdidx" ] && have_obdidx=true && continue
2039 $have_obdidx || continue
2041 local ost=$((obdidx + 1))
2042 local dev=$(ostdevname $ost)
2045 log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
2047 seq=$(echo $seq | sed -e "s/^0x//g")
2048 if [ $seq == 0 ] || [ $(facet_fstype ost$ost) == zfs ]; then
2049 oid_hex=$(echo $oid)
2051 oid_hex=$(echo $hex | sed -e "s/^0x//g")
2053 local obj_file="O/$seq/d$((oid %32))/$oid_hex"
2057 # Don't unmount/remount the OSTs if we don't need to do that.
2058 # LU-2577 changes filter_fid to be smaller, so debugfs needs
2059 # update too, until that use mount/ll_decode_filter_fid/mount.
2060 # Re-enable when debugfs will understand new filter_fid.
2062 if [ $(facet_fstype ost$ost) == ldiskfs ]; then
2063 ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
2064 $dev 2>/dev/null" | grep "parent=")
2066 if [ -z "$ff" ]; then
2068 mount_fstype ost$ost
2069 ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
2070 $(facet_mntpt ost$ost)/$obj_file)
2071 unmount_fstype ost$ost
2072 start ost$ost $dev $OST_MOUNT_OPTS
2076 [ -z "$ff" ] && error "$obj_file: no filter_fid info"
2078 echo "$ff" | sed -e 's#.*objid=#got: objid=#'
2080 # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
2081 # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
2083 # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \
2084 # stripe_size=1048576 component_id=1 component_start=0 \
2085 # component_end=33554432
2086 local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff)
2087 local ff_pseq=$(cut -d: -f1 <<<$ff_parent)
2088 local ff_poid=$(cut -d: -f2 <<<$ff_parent)
2090 if grep -q 'stripe=' <<<$ff; then
2091 ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff)
2093 # $LL_DECODE_FILTER_FID does not print "stripe="; look
2094 # into f_ver in this case. See comment on ff_parent.
2095 ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//')
2098 # compare lmm_seq and filter_fid->ff_parent.f_seq
2099 [ $ff_pseq = $lmm_seq ] ||
2100 error "FF parent SEQ $ff_pseq != $lmm_seq"
2101 # compare lmm_object_id and filter_fid->ff_parent.f_oid
2102 [ $ff_poid = $lmm_oid ] ||
2103 error "FF parent OID $ff_poid != $lmm_oid"
2104 (($ff_pstripe == $stripe_nr)) ||
2105 error "FF stripe $ff_pstripe != $stripe_nr"
2107 stripe_nr=$((stripe_nr + 1))
2108 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2110 if grep -q 'stripe_count=' <<<$ff; then
2111 local ff_scnt=$(sed -e 's/.*stripe_count=//' \
2112 -e 's/ .*//' <<<$ff)
2113 [ $lmm_count = $ff_scnt ] ||
2114 error "FF stripe count $lmm_count != $ff_scnt"
2120 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2121 remote_ost_nodsh && skip "remote OST with nodsh"
2123 test_mkdir $DIR/$tdir
2124 $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
2125 { error "setstripe -c -1 failed"; return 1; }
2126 # We need to send a write to every object to get parent FID info set.
2127 # This _should_ also work for setattr, but does not currently.
2128 # touch $DIR/$tdir/$tfile-1 ||
2129 dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
2130 { error "dd $tfile-1 failed"; return 2; }
2131 $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
2132 { error "setstripe -c -1 failed"; return 3; }
2133 dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
2134 { error "dd $tfile-2 failed"; return 4; }
2136 # make sure write RPCs have been sent to OSTs
2139 check_seq_oid $DIR/$tdir/$tfile-1 || return 5
2140 check_seq_oid $DIR/$tdir/$tfile-2 || return 6
2142 run_test 27z "check SEQ/OID on the MDT and OST filesystems"
2144 test_27A() { # b=19102
2145 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2147 save_layout_restore_at_exit $MOUNT
2148 $LFS setstripe -c 0 -i -1 -S 0 $MOUNT
2149 wait_update $HOSTNAME "$GETSTRIPE -c $MOUNT | sed 's/ *//g'" "1" 20 ||
2150 error "stripe count $($GETSTRIPE -c $MOUNT) != 1"
2151 local default_size=$($GETSTRIPE -S $MOUNT)
2152 local default_offset=$($GETSTRIPE -i $MOUNT)
2153 local dsize=$(do_facet $SINGLEMDS \
2154 "$LCTL get_param -n lod.$(facet_svc $SINGLEMDS)*.stripesize")
2155 [ $default_size -eq $dsize ] ||
2156 error "stripe size $default_size != $dsize"
2157 [ $default_offset -eq -1 ] ||
2158 error "stripe offset $default_offset != -1"
2160 run_test 27A "check filesystem-wide default LOV EA values"
2162 test_27B() { # LU-2523
2163 test_mkdir $DIR/$tdir
2164 rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
2166 # open f1 with O_LOV_DELAY_CREATE
2168 # call setstripe ioctl on open file descriptor for f1
2170 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:nB1c \
2174 # open f1 with O_LOV_DELAY_CREATE
2176 # call setstripe ioctl on open file descriptor for f1
2178 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:uB1c
2180 # Allow multiop to fail in imitation of NFS's busted semantics.
2183 run_test 27B "call setstripe on open unlinked file/rename victim"
2185 test_27C() { #LU-2871
2186 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2194 test_mkdir $DIR/$tdir
2196 for i in $(seq 0 $((OSTCOUNT - 1))); do
2197 # set stripe across all OSTs starting from OST$i
2198 $SETSTRIPE -i $i -c -1 $tfile$i
2199 # get striping information
2200 ost_idx=($($GETSTRIPE $tfile$i |
2201 tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
2205 [ ${#ost_idx[@]} -eq $OSTCOUNT ] ||
2206 error "${#ost_idx[@]} != $OSTCOUNT"
2208 for index in $(seq 0 $((OSTCOUNT - 1))); do
2210 for j in $(echo ${ost_idx[@]}); do
2211 if [ $index -eq $j ]; then
2217 error "Can not find $index in ${ost_idx[@]}"
2221 run_test 27C "check full striping across all OSTs"
2224 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2225 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2226 remote_mds_nodsh && skip "remote MDS with nodsh"
2228 local POOL=${POOL:-testpool}
2230 local last_ost=$(($OSTCOUNT - 1))
2232 local ost_list=$(seq $first_ost $ost_step $last_ost)
2233 local ost_range="$first_ost $last_ost $ost_step"
2235 test_mkdir $DIR/$tdir
2236 pool_add $POOL || error "pool_add failed"
2237 pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
2240 [ $MDS1_VERSION -lt $(version_code 2.8.55) ] &&
2242 [ $MDS1_VERSION -lt $(version_code 2.9.55) -o \
2243 $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2244 skip27D+=" -s 30,31"
2245 llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
2246 error "llapi_layout_test failed"
2248 destroy_test_pools || error "destroy test pools failed"
2250 run_test 27D "validate llapi_layout API"
2252 # Verify that default_easize is increased from its initial value after
2253 # accessing a widely striped file.
2255 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2256 [ $CLIENT_VERSION -lt $(version_code 2.5.57) ] &&
2257 skip "client does not have LU-3338 fix"
2259 # 72 bytes is the minimum space required to store striping
2260 # information for a file striped across one OST:
2261 # (sizeof(struct lov_user_md_v3) +
2262 # sizeof(struct lov_user_ost_data_v1))
2264 $LCTL set_param -n llite.*.default_easize $min_easize ||
2265 error "lctl set_param failed"
2266 local easize=$($LCTL get_param -n llite.*.default_easize)
2268 [ $easize -eq $min_easize ] ||
2269 error "failed to set default_easize"
2271 $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
2272 error "setstripe failed"
2276 easize=$($LCTL get_param -n llite.*.default_easize)
2278 [ $easize -gt $min_easize ] ||
2279 error "default_easize not updated"
2281 run_test 27E "check that default extended attribute size properly increases"
2283 test_27F() { # LU-5346/LU-7975
2284 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2285 [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs"
2286 [[ $MDS1_VERSION -lt $(version_code 2.8.51) ]] &&
2287 skip "Need MDS version at least 2.8.51"
2288 remote_ost_nodsh && skip "remote OST with nodsh"
2290 test_mkdir $DIR/$tdir
2292 $SETSTRIPE -c 2 $DIR/$tdir
2294 # stop all OSTs to reproduce situation for LU-7975 ticket
2295 for num in $(seq $OSTCOUNT); do
2299 # open/create f0 with O_LOV_DELAY_CREATE
2300 # truncate f0 to a non-0 size
2302 multiop $DIR/$tdir/f0 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T1050000c
2304 $CHECKSTAT -s 1050000 $DIR/$tdir/f0 || error "checkstat failed"
2305 # open/write it again to force delayed layout creation
2306 cat /etc/hosts > $DIR/$tdir/f0 &
2310 for num in $(seq $OSTCOUNT); do
2311 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS ||
2312 error "ost$num failed to start"
2315 wait $catpid || error "cat failed"
2317 cmp /etc/hosts $DIR/$tdir/f0 || error "cmp failed"
2318 [[ $($GETSTRIPE -c $DIR/$tdir/f0) == 2 ]] || error "wrong stripecount"
2321 run_test 27F "Client resend delayed layout creation with non-zero size"
2323 test_27G() { #LU-10629
2324 [ $MDS1_VERSION -lt $(version_code 2.11.51) ] &&
2325 skip "Need MDS version at least 2.11.51"
2326 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2327 remote_mds_nodsh && skip "remote MDS with nodsh"
2328 local POOL=${POOL:-testpool}
2329 local ostrange="0 0 1"
2331 test_mkdir $DIR/$tdir
2332 pool_add $POOL || error "pool_add failed"
2333 pool_add_targets $POOL $ostrange || error "pool_add_targets failed"
2334 $LFS setstripe -p $POOL $DIR/$tdir
2336 local pool=$($LFS getstripe -p $DIR/$tdir)
2338 [ "$pool" = "$POOL" ] || error "Striping failed got '$pool' not '$POOL'"
2340 $LFS setstripe -d $DIR/$tdir
2342 pool=$($LFS getstripe -p $DIR/$tdir)
2346 [ -z "$pool" ] || error "'$pool' is not empty"
2348 run_test 27G "Clear OST pool from stripe"
2351 [[ $MDS1_VERSION -le $(version_code 2.11.54) ]] &&
2352 skip "Need MDS version newer than 2.11.54"
2353 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
2354 test_mkdir $DIR/$tdir
2355 $LFS setstripe -o 0 -o 2 $DIR/$tdir || error "setstripe failed"
2356 touch $DIR/$tdir/$tfile
2357 $LFS getstripe -c $DIR/$tdir/$tfile
2358 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
2359 error "two-stripe file doesn't have two stripes"
2361 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
2362 $LFS getstripe -y $DIR/$tdir/$tfile
2363 (( $($LFS getstripe -y $DIR/$tdir/$tfile |
2364 egrep -c "l_ost_idx: [02]$") == "2" )) ||
2365 error "expected l_ost_idx: [02]$ not matched"
2367 # make sure ost list have been cleared
2368 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
2369 $LFS setstripe -S $((stripesize * 4)) -i 1 \
2370 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
2372 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
2374 run_test 27H "Set specific OSTs stripe"
2377 [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.12.57) ]] &&
2378 skip "Need MDS version >= than 2.12.57"
2379 remote_mds_nodsh && skip "remote MDS with nodsh"
2380 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2382 test_mkdir $DIR/$tdir
2384 # Set default striping on directory
2385 $LFS setstripe -C 4 $DIR/$tdir
2387 echo 1 > $DIR/$tdir/${tfile}.1
2388 local count=$($LFS getstripe -c $DIR/$tdir/${tfile}.1)
2390 [ $count -eq $setcount ] ||
2391 error "(1) stripe count $count, should be $setcount"
2393 # Capture existing append_stripe_count setting for restore
2394 local orig_count=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_stripe_count)
2395 local mdts=$(comma_list $(mdts_nodes))
2396 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=$orig_count" EXIT
2398 local appendcount=$orig_count
2399 echo 1 >> $DIR/$tdir/${tfile}.2_append
2400 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.2_append)
2401 [ $count -eq $appendcount ] ||
2402 error "(2)stripe count $count, should be $appendcount for append"
2404 # Disable O_APPEND striping, verify it works
2405 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2407 # Should now get the default striping, which is 4
2409 echo 1 >> $DIR/$tdir/${tfile}.3_append
2410 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.3_append)
2411 [ $count -eq $setcount ] ||
2412 error "(3) stripe count $count, should be $setcount"
2414 # Try changing the stripe count for append files
2415 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=2
2417 # Append striping is now 2 (directory default is still 4)
2419 echo 1 >> $DIR/$tdir/${tfile}.4_append
2420 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.4_append)
2421 [ $count -eq $appendcount ] ||
2422 error "(4) stripe count $count, should be $appendcount for append"
2424 # Test append stripe count of -1
2425 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=-1
2426 appendcount=$OSTCOUNT
2427 echo 1 >> $DIR/$tdir/${tfile}.5
2428 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.5)
2429 [ $count -eq $appendcount ] ||
2430 error "(5) stripe count $count, should be $appendcount for append"
2432 # Set append striping back to default of 1
2433 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=1
2435 # Try a new default striping, PFL + DOM
2436 $LFS setstripe -L mdt -E 1M -E -1 -c 2 $DIR/$tdir
2438 # Create normal DOM file, DOM returns stripe count == 0
2440 touch $DIR/$tdir/${tfile}.6
2441 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.6)
2442 [ $count -eq $setcount ] ||
2443 error "(6) stripe count $count, should be $setcount"
2447 echo 1 >> $DIR/$tdir/${tfile}.7_append
2448 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.7_append)
2449 [ $count -eq $appendcount ] ||
2450 error "(7) stripe count $count, should be $appendcount for append"
2452 # Clean up DOM layout
2453 $LFS setstripe -d $DIR/$tdir
2455 # Now test that append striping works when layout is from root
2456 $LFS setstripe -c 2 $MOUNT
2457 # Make a special directory for this
2458 mkdir $DIR/${tdir}/${tdir}.2
2459 stack_trap "$LFS setstripe -d $MOUNT" EXIT
2461 # Verify for normal file
2463 echo 1 > $DIR/${tdir}/${tdir}.2/${tfile}.8
2464 count=$($LFS getstripe -c $DIR/$tdir/${tdir}.2/${tfile}.8)
2465 [ $count -eq $setcount ] ||
2466 error "(8) stripe count $count, should be $setcount"
2469 echo 1 >> $DIR/${tdir}/${tdir}.2/${tfile}.9_append
2470 count=$($LFS getstripe -c $DIR/${tdir}/${tdir}.2/${tfile}.9_append)
2471 [ $count -eq $appendcount ] ||
2472 error "(9) stripe count $count, should be $appendcount for append"
2474 # Now test O_APPEND striping with pools
2475 do_nodes $mdts $LCTL set_param mdd.*.append_pool="$TESTNAME"
2476 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'" EXIT
2479 pool_add $TESTNAME || error "pool creation failed"
2480 pool_add_targets $TESTNAME 0 1 || error "Pool add targets failed"
2482 echo 1 >> $DIR/$tdir/${tfile}.10_append
2484 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.10_append)
2485 [ "$pool" = "$TESTNAME" ] || error "(10) incorrect pool: $pool"
2487 # Check that count is still correct
2489 echo 1 >> $DIR/$tdir/${tfile}.11_append
2490 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.11_append)
2491 [ $count -eq $appendcount ] ||
2492 error "(11) stripe count $count, should be $appendcount for append"
2494 # Disable O_APPEND stripe count, verify pool works separately
2495 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2497 echo 1 >> $DIR/$tdir/${tfile}.12_append
2499 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.12_append)
2500 [ "$pool" = "$TESTNAME" ] || error "(12) incorrect pool: $pool"
2502 # Remove pool setting, verify it's not applied
2503 do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'
2505 echo 1 >> $DIR/$tdir/${tfile}.13_append
2507 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.13_append)
2508 [ "$pool" = "" ] || error "(13) pool found: $pool"
2510 run_test 27M "test O_APPEND striping"
2512 # createtest also checks that device nodes are created and
2513 # then visible correctly (#2091)
2514 test_28() { # bug 2091
2516 $CREATETEST $DIR/d28/ct || error "createtest failed"
2518 run_test 28 "create/mknod/mkdir with bad file types ============"
2521 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2523 sync; sleep 1; sync # flush out any dirty pages from previous tests
2530 declare -i LOCKCOUNTORIG=0
2531 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2532 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
2534 [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
2536 declare -i LOCKUNUSEDCOUNTORIG=0
2537 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2538 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
2545 declare -i LOCKCOUNTCURRENT=0
2546 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2547 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
2550 declare -i LOCKUNUSEDCOUNTCURRENT=0
2551 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2552 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
2555 if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
2556 $LCTL set_param -n ldlm.dump_namespaces ""
2557 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
2558 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2559 log "dumped log to $TMP/test_29.dk (bug 5793)"
2562 if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
2563 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
2564 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2565 log "dumped log to $TMP/test_29.dk (bug 5793)"
2569 run_test 29 "IT_GETATTR regression ============================"
2571 test_30a() { # was test_30
2572 cp $(which ls) $DIR || cp /bin/ls $DIR
2573 $DIR/ls / || error "Can't execute binary from lustre"
2576 run_test 30a "execute binary from Lustre (execve) =============="
2579 cp `which ls` $DIR || cp /bin/ls $DIR
2581 $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
2584 run_test 30b "execute binary from Lustre as non-root ==========="
2586 test_30c() { # b=22376
2587 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2589 cp `which ls` $DIR || cp /bin/ls $DIR
2591 cancel_lru_locks mdc
2592 cancel_lru_locks osc
2593 $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
2596 run_test 30c "execute binary from Lustre without read perms ===="
2599 $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
2600 $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
2602 run_test 31a "open-unlink file =================================="
2605 touch $DIR/f31 || error "touch $DIR/f31 failed"
2606 ln $DIR/f31 $DIR/f31b || error "ln failed"
2607 $MULTIOP $DIR/f31b Ouc || error "multiop failed"
2608 $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
2610 run_test 31b "unlink file with multiple links while open ======="
2613 touch $DIR/f31 || error "touch $DIR/f31 failed"
2614 ln $DIR/f31 $DIR/f31c || error "ln failed"
2615 multiop_bg_pause $DIR/f31 O_uc ||
2616 error "multiop_bg_pause for $DIR/f31 failed"
2618 $MULTIOP $DIR/f31c Ouc
2619 kill -USR1 $MULTIPID
2622 run_test 31c "open-unlink file with multiple links ============="
2625 opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
2626 $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
2628 run_test 31d "remove of open directory ========================="
2630 test_31e() { # bug 2904
2631 openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
2633 run_test 31e "remove of open non-empty directory ==============="
2635 test_31f() { # bug 4554
2636 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2639 test_mkdir $DIR/d31f
2640 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2641 cp /etc/hosts $DIR/d31f
2643 $GETSTRIPE $DIR/d31f/hosts
2644 multiop_bg_pause $DIR/d31f D_c || return 1
2647 rm -rv $DIR/d31f || error "first of $DIR/d31f"
2648 test_mkdir $DIR/d31f
2649 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2650 cp /etc/hosts $DIR/d31f
2652 $GETSTRIPE $DIR/d31f/hosts
2653 multiop_bg_pause $DIR/d31f D_c || return 1
2656 kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
2657 wait $MULTIPID || error "first opendir $MULTIPID failed"
2661 kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
2662 wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
2665 run_test 31f "remove of open directory with open-unlink file ==="
2668 echo "-- cross directory link --"
2669 test_mkdir -c1 $DIR/${tdir}ga
2670 test_mkdir -c1 $DIR/${tdir}gb
2671 touch $DIR/${tdir}ga/f
2672 ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
2673 $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
2674 [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
2675 $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
2676 [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
2678 run_test 31g "cross directory link==============="
2681 echo "-- cross directory link --"
2682 test_mkdir -c1 $DIR/${tdir}
2683 test_mkdir -c1 $DIR/${tdir}/dir
2684 touch $DIR/${tdir}/f
2685 ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
2686 $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
2687 [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
2688 $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
2689 [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
2691 run_test 31h "cross directory link under child==============="
2694 echo "-- cross directory link --"
2695 test_mkdir -c1 $DIR/$tdir
2696 test_mkdir -c1 $DIR/$tdir/dir
2697 touch $DIR/$tdir/dir/f
2698 ln $DIR/$tdir/dir/f $DIR/$tdir/g
2699 $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
2700 [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
2701 $CHECKSTAT -t file $DIR/$tdir/g || error "target"
2702 [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
2704 run_test 31i "cross directory link under parent==============="
2707 test_mkdir -c1 -p $DIR/$tdir
2708 test_mkdir -c1 -p $DIR/$tdir/dir1
2709 ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
2710 link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
2711 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
2712 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
2715 run_test 31j "link for directory==============="
2718 test_mkdir -c1 -p $DIR/$tdir
2720 touch $DIR/$tdir/exist
2721 mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
2722 mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
2723 mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
2724 mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
2725 mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
2726 mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
2727 mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
2730 run_test 31k "link to file: the same, non-existing, dir==============="
2736 touch $DIR/d31m2/exist
2737 mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
2738 mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
2739 mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
2740 mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
2741 mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
2742 mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
2745 run_test 31m "link to file: the same, non-existing, dir==============="
2748 touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
2749 nlink=$(stat --format=%h $DIR/$tfile)
2750 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2752 local cmd="exec $fd<$DIR/$tfile"
2755 trap "eval $cmd" EXIT
2756 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2757 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2758 rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
2759 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2760 [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
2763 run_test 31n "check link count of unlinked file"
2766 local TEMPNAME=$(mktemp $1_XXXXXX)
2767 mlink $TEMPNAME $1 2> /dev/null &&
2768 echo "$BASHPID: link $TEMPNAME to $1 succeeded"
2772 test_31o() { # LU-2901
2773 test_mkdir $DIR/$tdir
2774 for LOOP in $(seq 100); do
2775 rm -f $DIR/$tdir/$tfile*
2776 for THREAD in $(seq 8); do
2777 link_one $DIR/$tdir/$tfile.$LOOP &
2780 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
2781 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
2782 error "$LINKS duplicate links to $tfile.$LOOP" &&
2786 run_test 31o "duplicate hard links with same filename"
2789 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
2791 test_mkdir $DIR/$tdir
2792 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
2793 $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
2795 opendirunlink $DIR/$tdir/striped_dir/test1 ||
2796 error "open unlink test1 failed"
2797 opendirunlink $DIR/$tdir/striped_dir/test2 ||
2798 error "open unlink test2 failed"
2800 $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
2801 error "test1 still exists"
2802 $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
2803 error "test2 still exists"
2805 run_test 31p "remove of open striped directory"
2807 cleanup_test32_mount() {
2810 local loopdev=$(losetup -a | grep $EXT2_DEV | sed -ne 's/:.*$//p')
2811 $UMOUNT $DIR/$tdir/ext2-mountpoint || rc=$?
2812 losetup -d $loopdev || true
2818 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2820 echo "== more mountpoints and symlinks ================="
2821 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2822 trap cleanup_test32_mount EXIT
2823 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2824 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2825 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2826 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/.. ||
2827 error "$DIR/$tdir/ext2-mountpoint/.. not dir type"
2828 cleanup_test32_mount
2830 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
2833 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2835 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2836 trap cleanup_test32_mount EXIT
2837 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2838 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2839 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2840 ls -al $DIR/$tdir/ext2-mountpoint/.. ||
2841 error "Can't list $DIR/$tdir/ext2-mountpoint/.."
2842 cleanup_test32_mount
2844 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
2847 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2849 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2850 trap cleanup_test32_mount EXIT
2851 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2852 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2853 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2854 test_mkdir -p $DIR/$tdir/d2/test_dir
2855 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2856 error "$DIR/$tdir/ext2-mountpoint/../d2/test_dir not dir type"
2857 cleanup_test32_mount
2859 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
2862 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2864 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2865 trap cleanup_test32_mount EXIT
2866 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2867 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2868 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2869 test_mkdir -p $DIR/$tdir/d2/test_dir
2870 ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2871 error "Can't list $DIR/$tdir/ext2-mountpoint/../d2/test_dir"
2872 cleanup_test32_mount
2874 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
2878 test_mkdir -p $DIR/$tdir/tmp
2879 local tmp_dir=$DIR/$tdir/tmp
2880 ln -s $DIR/$tdir $tmp_dir/symlink11
2881 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2882 $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2883 $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
2885 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
2889 test_mkdir -p $DIR/$tdir/tmp
2890 local tmp_dir=$DIR/$tdir/tmp
2891 ln -s $DIR/$tdir $tmp_dir/symlink11
2892 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2893 ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2894 ls $DIR/$tdir/symlink01 || error "symlink01 bad"
2896 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
2899 local tmp_dir=$DIR/$tdir/tmp
2900 test_mkdir -p $tmp_dir
2901 test_mkdir $DIR/${tdir}2
2902 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2903 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2904 $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
2905 $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
2906 $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
2907 $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
2909 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2912 rm -fr $DIR/$tdir $DIR/${tdir}2
2913 tmp_dir=$DIR/$tdir/tmp
2914 test_mkdir -p $tmp_dir
2915 test_mkdir $DIR/${tdir}2
2916 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2917 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2918 ls $tmp_dir/symlink12 || error "listing symlink12"
2919 ls $DIR/$tdir/symlink02 || error "listing symlink02"
2921 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2924 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2926 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2927 trap cleanup_test32_mount EXIT
2928 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2929 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2930 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2931 touch $DIR/$tdir/test_file
2932 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../test_file ||
2933 error "$DIR/$tdir/ext2-mountpoint/../test_file not file type"
2934 cleanup_test32_mount
2936 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
2939 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2941 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2942 trap cleanup_test32_mount EXIT
2943 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2944 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2945 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2946 touch $DIR/$tdir/test_file
2947 cat $DIR/$tdir/ext2-mountpoint/../test_file ||
2948 error "Can't open $DIR/$tdir/ext2-mountpoint/../test_file"
2949 cleanup_test32_mount
2951 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
2954 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2957 trap cleanup_test32_mount EXIT
2958 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2959 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2960 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2961 test_mkdir -p $DIR/$tdir/d2
2962 touch $DIR/$tdir/d2/test_file || error "touch failed"
2963 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2964 error "$DIR/$tdir/ext2-mountpoint/../d2/test_file not file type"
2965 cleanup_test32_mount
2967 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
2970 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2973 trap cleanup_test32_mount EXIT
2974 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2975 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2976 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2977 test_mkdir -p $DIR/$tdir/d2
2978 touch $DIR/$tdir/d2/test_file || error "touch failed"
2979 cat $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2980 error "Can't open $DIR/$tdir/ext2-mountpoint/../d2/test_file"
2981 cleanup_test32_mount
2983 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
2987 test_mkdir -p $DIR/d32m/tmp
2988 TMP_DIR=$DIR/d32m/tmp
2989 ln -s $DIR $TMP_DIR/symlink11
2990 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
2991 $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 ||
2992 error "symlink11 not a link"
2993 $CHECKSTAT -t link $DIR/d32m/symlink01 ||
2994 error "symlink01 not a link"
2996 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
3000 test_mkdir -p $DIR/d32n/tmp
3001 TMP_DIR=$DIR/d32n/tmp
3002 ln -s $DIR $TMP_DIR/symlink11
3003 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3004 ls -l $DIR/d32n/tmp/symlink11 || error "listing symlink11"
3005 ls -l $DIR/d32n/symlink01 || error "listing symlink01"
3007 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
3011 test_mkdir -p $DIR/d32o/tmp
3012 TMP_DIR=$DIR/d32o/tmp
3013 ln -s $DIR/$tfile $TMP_DIR/symlink12
3014 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3015 $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 ||
3016 error "symlink12 not a link"
3017 $CHECKSTAT -t link $DIR/d32o/symlink02 || error "symlink02 not a link"
3018 $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 ||
3019 error "$DIR/d32o/tmp/symlink12 not file type"
3020 $CHECKSTAT -t file -f $DIR/d32o/symlink02 ||
3021 error "$DIR/d32o/symlink02 not file type"
3023 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
3033 test_mkdir -p $DIR/d32p/tmp
3035 TMP_DIR=$DIR/d32p/tmp
3037 ln -s $DIR/$tfile $TMP_DIR/symlink12
3039 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3041 cat $DIR/d32p/tmp/symlink12 ||
3042 error "Can't open $DIR/d32p/tmp/symlink12"
3044 cat $DIR/d32p/symlink02 || error "Can't open $DIR/d32p/symlink02"
3047 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
3050 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3052 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3053 trap cleanup_test32_mount EXIT
3054 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3055 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3056 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3057 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3058 ls $DIR/$tdir/ext2-mountpoint | grep "\<under_the_mount\>" && error
3059 cleanup_test32_mount
3061 run_test 32q "stat follows mountpoints in Lustre (should return error)"
3064 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3066 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3067 trap cleanup_test32_mount EXIT
3068 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3069 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3070 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3071 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3072 ls $DIR/$tdir/ext2-mountpoint | grep -q under_the_mount && error || true
3073 cleanup_test32_mount
3075 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
3080 chmod 444 $DIR/$tfile
3081 chown $RUNAS_ID $DIR/$tfile
3083 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3086 run_test 33aa "write file with mode 444 (should return error)"
3090 test_mkdir $DIR/$tdir
3091 chown $RUNAS_ID $DIR/$tdir
3092 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
3093 error "$RUNAS create $tdir/$tfile failed"
3094 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
3095 error "open RDWR" || true
3097 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
3101 test_mkdir $DIR/$tdir
3102 chown $RUNAS_ID $DIR/$tdir
3103 $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
3105 run_test 33b "test open file with malformed flags (No panic)"
3108 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3109 remote_ost_nodsh && skip "remote OST with nodsh"
3118 test_mkdir $DIR/$tdir
3119 # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
3122 for ostnum in $(seq $OSTCOUNT); do
3123 # test-framework's OST numbering is one-based, while Lustre's
3125 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3126 # Parsing llobdstat's output sucks; we could grep the /proc
3127 # path, but that's likely to not be as portable as using the
3128 # llobdstat utility. So we parse lctl output instead.
3129 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3130 obdfilter/$ostname/stats |
3131 awk '/^write_bytes/ {print $7}' )
3132 echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes"
3133 if (( ${write_bytes:-0} > 0 ))
3140 $all_zeros || return 0
3143 echo foo > $DIR/$tdir/bar
3147 # Total up write_bytes after writing. We'd better find non-zeros.
3148 for ostnum in $(seq $OSTCOUNT); do
3149 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3150 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3151 obdfilter/$ostname/stats |
3152 awk '/^write_bytes/ {print $7}' )
3153 echo "write_bytes@$OSTnum/$ostname=$write_bytes"
3154 if (( ${write_bytes:-0} > 0 ))
3163 for ostnum in $(seq $OSTCOUNT); do
3164 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3165 echo "Check that write_bytes is present in obdfilter/*/stats:"
3166 do_facet ost$ostnum lctl get_param -n \
3167 obdfilter/$ostname/stats
3169 error "OST not keeping write_bytes stats (b22312)"
3172 run_test 33c "test llobdstat and write_bytes"
3175 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3176 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3179 local remote_dir=$DIR/$tdir/remote_dir
3181 test_mkdir $DIR/$tdir
3182 $LFS mkdir -i $MDTIDX $remote_dir ||
3183 error "create remote directory failed"
3185 touch $remote_dir/$tfile
3186 chmod 444 $remote_dir/$tfile
3187 chown $RUNAS_ID $remote_dir/$tfile
3189 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3191 chown $RUNAS_ID $remote_dir
3192 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
3193 error "create" || true
3194 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
3195 error "open RDWR" || true
3196 $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
3198 run_test 33d "openfile with 444 modes and malformed flags under remote dir"
3201 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3205 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3206 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3207 mkdir $DIR/$tdir/local_dir
3209 local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3210 local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3211 local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3213 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3214 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
3216 rmdir $DIR/$tdir/* || error "rmdir failed"
3219 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3220 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3221 mkdir $DIR/$tdir/local_dir
3223 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3224 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3225 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3227 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3228 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
3230 rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
3233 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3234 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3235 mkdir $DIR/$tdir/local_dir
3237 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3238 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3239 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3241 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3242 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
3244 run_test 33e "mkdir and striped directory should have same mode"
3248 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
3252 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3253 remote_mds_nodsh && skip "remote MDS with nodsh"
3256 chmod go+rwx $DIR/$tdir
3257 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
3258 trap cleanup_33f EXIT
3260 $RUNAS lfs mkdir -i 0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
3261 error "cannot create striped directory"
3263 $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
3264 error "cannot create files in striped directory"
3266 $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
3267 error "cannot remove files in striped directory"
3269 $RUNAS rmdir $DIR/$tdir/striped_dir ||
3270 error "cannot remove striped directory"
3274 run_test 33f "nonroot user can create, access, and remove a striped directory"
3277 mkdir -p $DIR/$tdir/dir2
3279 local err=$($RUNAS mkdir $DIR/$tdir/dir2 2>&1)
3281 [[ $err =~ "exists" ]] || error "Not exists error"
3283 run_test 33g "nonroot user create already existing root created file"
3285 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
3288 $MCREATE $DIR/f34 || error "mcreate failed"
3289 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3290 error "getstripe failed"
3291 $TRUNCATE $DIR/f34 $TEST_34_SIZE || error "truncate failed"
3292 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3293 error "getstripe failed"
3294 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3295 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3297 run_test 34a "truncate file that has not been opened ==========="
3300 [ ! -f $DIR/f34 ] && test_34a
3301 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3302 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3303 $OPENFILE -f O_RDONLY $DIR/f34
3304 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3305 error "getstripe failed"
3306 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3307 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3309 run_test 34b "O_RDONLY opening file doesn't create objects ====="
3312 [ ! -f $DIR/f34 ] && test_34a
3313 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3314 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3315 $OPENFILE -f O_RDWR $DIR/f34
3316 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" && error
3317 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3318 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3320 run_test 34c "O_RDWR opening file-with-size works =============="
3323 [ ! -f $DIR/f34 ] && test_34a
3324 dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 ||
3326 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3327 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3330 run_test 34d "write to sparse file ============================="
3334 $MCREATE $DIR/f34e || error "mcreate failed"
3335 $TRUNCATE $DIR/f34e 1000 || error "truncate failed"
3336 $CHECKSTAT -s 1000 $DIR/f34e ||
3337 error "Size of $DIR/f34e not equal to 1000 bytes"
3338 $OPENFILE -f O_RDWR $DIR/f34e
3339 $CHECKSTAT -s 1000 $DIR/f34e ||
3340 error "Size of $DIR/f34e not equal to 1000 bytes"
3342 run_test 34e "create objects, some with size and some without =="
3344 test_34f() { # bug 6242, 6243
3345 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3349 $MCREATE $DIR/f34f || error "mcreate failed"
3350 $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
3351 dd if=$DIR/f34f of=$TMP/f34f
3352 $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
3353 dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
3354 cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
3355 cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
3356 rm $TMP/f34f $TMP/f34fzero $DIR/f34f
3358 run_test 34f "read from a file with no objects until EOF ======="
3361 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3363 dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE ||
3365 $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error "truncate failed"
3366 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3367 error "Size of $DIR/$tfile not equal to $((TEST_34_SIZE / 2))"
3368 cancel_lru_locks osc
3369 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3370 error "wrong size after lock cancel"
3372 $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error "truncate failed"
3373 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3374 error "expanding truncate failed"
3375 cancel_lru_locks osc
3376 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3377 error "wrong expanded size after lock cancel"
3379 run_test 34g "truncate long file ==============================="
3382 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3387 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error "dd failed"
3388 sync # Flush the cache so that multiop below does not block on cache
3389 # flush when getting the group lock
3390 $MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
3393 # Since just timed wait is not good enough, let's do a sync write
3394 # that way we are sure enough time for a roundtrip + processing
3395 # passed + 2 seconds of extra margin.
3396 dd if=/dev/zero of=$DIR/${tfile}-1 bs=$PAGE_SIZE oflag=direct count=1
3400 if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then
3401 error "Multiop blocked on ftruncate, pid=$MULTIPID"
3405 local nsz=`stat -c %s $DIR/$tfile`
3406 [[ $nsz == $sz ]] || error "New size wrong $nsz != $sz"
3408 run_test 34h "ftruncate file under grouplock should not block"
3411 cp /bin/sh $DIR/f35a
3413 chown $RUNAS_ID $DIR/f35a
3414 $RUNAS $DIR/f35a && error || true
3417 run_test 35a "exec file with mode 444 (should return and not leak)"
3421 utime $DIR/f36 || error "utime failed for MDS"
3423 run_test 36a "MDS utime check (mknod, utime)"
3427 utime $DIR/f36 || error "utime failed for OST"
3429 run_test 36b "OST utime check (open, utime)"
3434 chown $RUNAS_ID $DIR/d36
3435 $RUNAS utime $DIR/d36/f36 || error "utime failed for MDS as non-root"
3437 run_test 36c "non-root MDS utime check (mknod, utime)"
3440 [ ! -d $DIR/d36 ] && test_36c
3441 echo "" > $DIR/d36/f36
3442 $RUNAS utime $DIR/d36/f36 || error "utime failed for OST as non-root"
3444 run_test 36d "non-root OST utime check (open, utime)"
3447 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping"
3449 test_mkdir $DIR/$tdir
3450 touch $DIR/$tdir/$tfile
3451 $RUNAS utime $DIR/$tdir/$tfile &&
3452 error "utime worked, expected failure" || true
3454 run_test 36e "utime on non-owned file (should return error)"
3458 local LANG_SAVE=$LANG
3459 local LC_LANG_SAVE=$LC_LANG
3460 export LANG=C LC_LANG=C # for date language
3462 DATESTR="Dec 20 2000"
3463 test_mkdir $DIR/$tdir
3464 lctl set_param fail_loc=$fl
3466 cp /etc/hosts $DIR/$tdir/$tfile
3467 sync & # write RPC generated with "current" inode timestamp, but delayed
3469 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
3470 LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
3471 cancel_lru_locks $OSC
3472 LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object
3474 [ "$LS_BEFORE" != "$LS_AFTER" ] && \
3475 echo "BEFORE: $LS_BEFORE" && \
3476 echo "AFTER : $LS_AFTER" && \
3477 echo "WANT : $DATESTR" && \
3478 error "$DIR/$tdir/$tfile timestamps changed" || true
3480 export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE
3484 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3486 #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
3487 subr_36fh "0x80000214"
3489 run_test 36f "utime on file racing with OST BRW write =========="
3492 remote_ost_nodsh && skip "remote OST with nodsh"
3493 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3494 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
3495 skip "Need MDS version at least 2.12.51"
3500 local tgt="obdfilter"
3502 [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1"
3504 test_mkdir $DIR/$tdir
3505 fmd_max_age=$(do_facet $facet \
3506 "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \
3509 echo "FMD max age: ${fmd_max_age}s"
3510 touch $DIR/$tdir/$tfile
3511 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3512 gawk '{cnt=cnt+$1} END{print cnt}')
3513 echo "FMD before: $fmd"
3515 error "FMD wasn't create by touch"
3516 sleep $((fmd_max_age + 12))
3517 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3518 gawk '{cnt=cnt+$1} END{print cnt}')
3519 echo "FMD after: $fmd"
3521 error "FMD wasn't expired by ping"
3523 run_test 36g "FMD cache expiry ====================="
3526 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3528 #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227
3529 subr_36fh "0x80000227"
3531 run_test 36h "utime on file racing with OST BRW write =========="
3534 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3536 test_mkdir $DIR/$tdir
3537 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
3539 local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
3540 local new_mtime=$((mtime + 200))
3542 #change Modify time of striped dir
3543 touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
3544 error "change mtime failed"
3546 local got=$(stat -c%Y $DIR/$tdir/striped_dir)
3548 [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
3550 run_test 36i "change mtime on striped directory"
3552 # test_37 - duplicate with tests 32q 32r
3555 local file=$DIR/$tfile
3557 openfile -f O_DIRECTORY $file
3560 [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true
3561 [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)"
3563 run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ==="
3565 test_39a() { # was test_39
3567 touch $DIR/${tfile}2
3568 # ls -l $DIR/$tfile $DIR/${tfile}2
3569 # ls -lu $DIR/$tfile $DIR/${tfile}2
3570 # ls -lc $DIR/$tfile $DIR/${tfile}2
3572 $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
3573 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
3575 ls -l --full-time $DIR/$tfile $DIR/${tfile}2
3577 ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
3579 ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
3580 error "O_TRUNC didn't change timestamps"
3583 run_test 39a "mtime changed on create"
3586 test_mkdir -c1 $DIR/$tdir
3587 cp -p /etc/passwd $DIR/$tdir/fopen
3588 cp -p /etc/passwd $DIR/$tdir/flink
3589 cp -p /etc/passwd $DIR/$tdir/funlink
3590 cp -p /etc/passwd $DIR/$tdir/frename
3591 ln $DIR/$tdir/funlink $DIR/$tdir/funlink2
3594 echo "aaaaaa" >> $DIR/$tdir/fopen
3595 echo "aaaaaa" >> $DIR/$tdir/flink
3596 echo "aaaaaa" >> $DIR/$tdir/funlink
3597 echo "aaaaaa" >> $DIR/$tdir/frename
3599 local open_new=`stat -c %Y $DIR/$tdir/fopen`
3600 local link_new=`stat -c %Y $DIR/$tdir/flink`
3601 local unlink_new=`stat -c %Y $DIR/$tdir/funlink`
3602 local rename_new=`stat -c %Y $DIR/$tdir/frename`
3604 cat $DIR/$tdir/fopen > /dev/null
3605 ln $DIR/$tdir/flink $DIR/$tdir/flink2
3606 rm -f $DIR/$tdir/funlink2
3607 mv -f $DIR/$tdir/frename $DIR/$tdir/frename2
3609 for (( i=0; i < 2; i++ )) ; do
3610 local open_new2=`stat -c %Y $DIR/$tdir/fopen`
3611 local link_new2=`stat -c %Y $DIR/$tdir/flink`
3612 local unlink_new2=`stat -c %Y $DIR/$tdir/funlink`
3613 local rename_new2=`stat -c %Y $DIR/$tdir/frename2`
3615 [ $open_new2 -eq $open_new ] || error "open file reverses mtime"
3616 [ $link_new2 -eq $link_new ] || error "link file reverses mtime"
3617 [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime"
3618 [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime"
3620 cancel_lru_locks $OSC
3621 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3624 run_test 39b "mtime change on open, link, unlink, rename ======"
3626 # this should be set to past
3627 TEST_39_MTIME=`date -d "1 year ago" +%s`
3633 local mtime0=`stat -c %Y $DIR1/$tfile`
3635 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3636 local mtime1=`stat -c %Y $DIR1/$tfile`
3637 [ "$mtime1" = $TEST_39_MTIME ] || \
3638 error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME"
3641 echo hello >> $DIR1/$tfile
3643 local mtime2=`stat -c %Y $DIR1/$tfile`
3644 [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \
3645 error "mtime is not updated on write: $d1 <= $mtime2 <= $d2"
3647 mv $DIR1/$tfile $DIR1/$tfile-1
3649 for (( i=0; i < 2; i++ )) ; do
3650 local mtime3=`stat -c %Y $DIR1/$tfile-1`
3651 [ "$mtime2" = "$mtime3" ] || \
3652 error "mtime ($mtime2) changed (to $mtime3) on rename"
3654 cancel_lru_locks $OSC
3655 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3658 run_test 39c "mtime change on rename ==========================="
3662 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3665 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3667 for (( i=0; i < 2; i++ )) ; do
3668 local mtime=`stat -c %Y $DIR1/$tfile`
3669 [ $mtime = $TEST_39_MTIME ] || \
3670 error "mtime($mtime) is not set to $TEST_39_MTIME"
3672 cancel_lru_locks $OSC
3673 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3676 run_test 39d "create, utime, stat =============================="
3680 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3683 local mtime1=`stat -c %Y $DIR1/$tfile`
3685 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3687 for (( i=0; i < 2; i++ )) ; do
3688 local mtime2=`stat -c %Y $DIR1/$tfile`
3689 [ $mtime2 = $TEST_39_MTIME ] || \
3690 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3692 cancel_lru_locks $OSC
3693 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3696 run_test 39e "create, stat, utime, stat ========================"
3700 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3703 mtime1=`stat -c %Y $DIR1/$tfile`
3706 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3708 for (( i=0; i < 2; i++ )) ; do
3709 local mtime2=`stat -c %Y $DIR1/$tfile`
3710 [ $mtime2 = $TEST_39_MTIME ] || \
3711 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3713 cancel_lru_locks $OSC
3714 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3717 run_test 39f "create, stat, sleep, utime, stat ================="
3721 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3723 echo hello >> $DIR1/$tfile
3724 local mtime1=`stat -c %Y $DIR1/$tfile`
3727 chmod o+r $DIR1/$tfile
3729 for (( i=0; i < 2; i++ )) ; do
3730 local mtime2=`stat -c %Y $DIR1/$tfile`
3731 [ "$mtime1" = "$mtime2" ] || \
3732 error "lost mtime: $mtime2, should be $mtime1"
3734 cancel_lru_locks $OSC
3735 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3738 run_test 39g "write, chmod, stat ==============================="
3742 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3748 echo hello >> $DIR1/$tfile
3749 local mtime1=`stat -c %Y $DIR1/$tfile`
3751 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3753 if [ "$d1" != "$d2" ]; then
3754 echo "write and touch not within one second"
3756 for (( i=0; i < 2; i++ )) ; do
3757 local mtime2=`stat -c %Y $DIR1/$tfile`
3758 [ "$mtime2" = $TEST_39_MTIME ] || \
3759 error "lost mtime: $mtime2, should be $TEST_39_MTIME"
3761 cancel_lru_locks $OSC
3762 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3766 run_test 39h "write, utime within one second, stat ============="
3769 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3774 echo hello >> $DIR1/$tfile
3775 local mtime1=`stat -c %Y $DIR1/$tfile`
3777 mv $DIR1/$tfile $DIR1/$tfile-1
3779 for (( i=0; i < 2; i++ )) ; do
3780 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3782 [ "$mtime1" = "$mtime2" ] || \
3783 error "lost mtime: $mtime2, should be $mtime1"
3785 cancel_lru_locks $OSC
3786 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3789 run_test 39i "write, rename, stat =============================="
3792 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3794 start_full_debug_logging
3798 #define OBD_FAIL_OSC_DELAY_SETTIME 0x412
3799 lctl set_param fail_loc=0x80000412
3800 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c ||
3801 error "multiop failed"
3803 local mtime1=`stat -c %Y $DIR1/$tfile`
3805 mv $DIR1/$tfile $DIR1/$tfile-1
3807 kill -USR1 $multipid
3808 wait $multipid || error "multiop close failed"
3810 for (( i=0; i < 2; i++ )) ; do
3811 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3812 [ "$mtime1" = "$mtime2" ] ||
3813 error "mtime is lost on close: $mtime2, " \
3816 cancel_lru_locks $OSC
3817 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3819 lctl set_param fail_loc=0
3820 stop_full_debug_logging
3822 run_test 39j "write, rename, close, stat ======================="
3825 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3830 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed"
3832 local mtime1=`stat -c %Y $DIR1/$tfile`
3834 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3836 kill -USR1 $multipid
3837 wait $multipid || error "multiop close failed"
3839 for (( i=0; i < 2; i++ )) ; do
3840 local mtime2=`stat -c %Y $DIR1/$tfile`
3842 [ "$mtime2" = $TEST_39_MTIME ] || \
3843 error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
3845 cancel_lru_locks osc
3846 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3849 run_test 39k "write, utime, close, stat ========================"
3851 # this should be set to future
3852 TEST_39_ATIME=`date -d "1 year" +%s`
3855 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3856 remote_mds_nodsh && skip "remote MDS with nodsh"
3858 local atime_diff=$(do_facet $SINGLEMDS \
3859 lctl get_param -n mdd.*MDT0000*.atime_diff)
3863 # test setting directory atime to future
3864 touch -a -d @$TEST_39_ATIME $DIR/$tdir
3865 local atime=$(stat -c %X $DIR/$tdir)
3866 [ "$atime" = $TEST_39_ATIME ] ||
3867 error "atime is not set to future: $atime, $TEST_39_ATIME"
3869 # test setting directory atime from future to now
3870 local now=$(date +%s)
3871 touch -a -d @$now $DIR/$tdir
3873 atime=$(stat -c %X $DIR/$tdir)
3874 [ "$atime" -eq "$now" ] ||
3875 error "atime is not updated from future: $atime, $now"
3877 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=2
3880 # test setting directory atime when now > dir atime + atime_diff
3881 local d1=$(date +%s)
3883 local d2=$(date +%s)
3884 cancel_lru_locks mdc
3885 atime=$(stat -c %X $DIR/$tdir)
3886 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3887 error "atime is not updated : $atime, should be $d2"
3889 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=60
3892 # test not setting directory atime when now < dir atime + atime_diff
3894 cancel_lru_locks mdc
3895 atime=$(stat -c %X $DIR/$tdir)
3896 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3897 error "atime is updated to $atime, should remain $d1<atime<$d2"
3899 do_facet $SINGLEMDS \
3900 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3902 run_test 39l "directory atime update ==========================="
3905 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3909 local far_past_mtime=$(date -d "May 29 1953" +%s)
3910 local far_past_atime=$(date -d "Dec 17 1903" +%s)
3912 touch -m -d @$far_past_mtime $DIR1/$tfile
3913 touch -a -d @$far_past_atime $DIR1/$tfile
3915 for (( i=0; i < 2; i++ )) ; do
3916 local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
3917 [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
3918 error "atime or mtime set incorrectly"
3920 cancel_lru_locks $OSC
3921 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3924 run_test 39m "test atime and mtime before 1970"
3926 test_39n() { # LU-3832
3927 remote_mds_nodsh && skip "remote MDS with nodsh"
3929 local atime_diff=$(do_facet $SINGLEMDS \
3930 lctl get_param -n mdd.*MDT0000*.atime_diff)
3935 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
3938 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
3939 atime0=$(stat -c %X $DIR/$tfile)
3942 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3943 atime1=$(stat -c %X $DIR/$tfile)
3946 cancel_lru_locks mdc
3947 cancel_lru_locks osc
3948 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3949 atime2=$(stat -c %X $DIR/$tfile)
3951 do_facet $SINGLEMDS \
3952 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3954 [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
3955 [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
3957 run_test 39n "check that O_NOATIME is honored"
3960 TESTDIR=$DIR/$tdir/$tfile
3961 [ -e $TESTDIR ] && rm -rf $TESTDIR
3968 links2=$(stat -c %h .)
3969 [ $(($links1 + 2)) != $links2 ] &&
3970 error "wrong links count $(($links1 + 2)) != $links2"
3972 links3=$(stat -c %h .)
3973 [ $(($links1 + 1)) != $links3 ] &&
3974 error "wrong links count $links1 != $links3"
3977 run_test 39o "directory cached attributes updated after create"
3980 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3983 TESTDIR=$DIR/$tdir/$tdir
3984 [ -e $TESTDIR ] && rm -rf $TESTDIR
3985 test_mkdir -p $TESTDIR
3989 test_mkdir -i $MDTIDX $TESTDIR/remote_dir1
3990 test_mkdir -i $MDTIDX $TESTDIR/remote_dir2
3992 links2=$(stat -c %h .)
3993 [ $(($links1 + 2)) != $links2 ] &&
3994 error "wrong links count $(($links1 + 2)) != $links2"
3996 links3=$(stat -c %h .)
3997 [ $(($links1 + 1)) != $links3 ] &&
3998 error "wrong links count $links1 != $links3"
4001 run_test 39p "remote directory cached attributes updated after create ========"
4004 test_39q() { # LU-8041
4005 local testdir=$DIR/$tdir
4007 multiop_bg_pause $testdir D_c || error "multiop failed"
4009 cancel_lru_locks mdc
4010 kill -USR1 $multipid
4011 local atime=$(stat -c %X $testdir)
4012 [ "$atime" -ne 0 ] || error "atime is zero"
4014 run_test 39q "close won't zero out atime"
4017 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
4018 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
4019 error "openfile O_WRONLY:O_TRUNC $tfile failed"
4020 $CHECKSTAT -t file -s 4096 $DIR/$tfile ||
4021 error "$tfile is not 4096 bytes in size"
4023 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
4027 small_write $DIR/f41 18
4029 run_test 41 "test small file write + fstat ====================="
4031 count_ost_writes() {
4032 lctl get_param -n ${OSC}.*.stats |
4033 awk -vwrites=0 '/ost_write/ { writes += $2 } \
4034 END { printf("%0.0f", writes) }'
4041 BG_DIRTY_RATIO_SAVE=10
4042 MAX_BG_DIRTY_RATIO=25
4046 # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs,
4047 # dirty_ratio, dirty_background_ratio
4048 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4049 sysctl -w vm.dirty_writeback_centisecs=$WRITEBACK_SAVE
4050 sysctl -w vm.dirty_background_ratio=$BG_DIRTY_RATIO_SAVE
4051 sysctl -w vm.dirty_ratio=$DIRTY_RATIO_SAVE
4053 # if file not here, we are a 2.4 kernel
4054 kill -CONT `pidof kupdated`
4059 # setup the trap first, so someone cannot exit the test at the
4060 # exact wrong time and mess up a machine
4061 trap start_writeback EXIT
4062 # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
4063 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4064 WRITEBACK_SAVE=`sysctl -n vm.dirty_writeback_centisecs`
4065 sysctl -w vm.dirty_writeback_centisecs=0
4066 sysctl -w vm.dirty_writeback_centisecs=0
4067 # save and increase /proc/sys/vm/dirty_ratio
4068 DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_ratio`
4069 sysctl -w vm.dirty_ratio=$MAX_DIRTY_RATIO
4070 # save and increase /proc/sys/vm/dirty_background_ratio
4071 BG_DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_background_ratio`
4072 sysctl -w vm.dirty_background_ratio=$MAX_BG_DIRTY_RATIO
4074 # if file not here, we are a 2.4 kernel
4075 kill -STOP `pidof kupdated`
4079 # ensure that all stripes have some grant before we test client-side cache
4081 for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
4082 dd if=/dev/zero of=$i bs=4k count=1
4087 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
4088 # file truncation, and file removal.
4090 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4093 cancel_lru_locks $OSC
4095 sync; sleep 1; sync # just to be safe
4096 BEFOREWRITES=`count_ost_writes`
4097 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur_grant_bytes | grep "[0-9]"
4098 dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
4099 AFTERWRITES=`count_ost_writes`
4100 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
4101 error "$BEFOREWRITES < $AFTERWRITES"
4104 run_test 42a "ensure that we don't flush on close"
4107 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4110 cancel_lru_locks $OSC
4113 dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
4114 BEFOREWRITES=$(count_ost_writes)
4115 $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
4116 AFTERWRITES=$(count_ost_writes)
4117 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4118 error "$BEFOREWRITES < $AFTERWRITES on unlink"
4120 BEFOREWRITES=$(count_ost_writes)
4121 sync || error "sync: $?"
4122 AFTERWRITES=$(count_ost_writes)
4123 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4124 error "$BEFOREWRITES < $AFTERWRITES on sync"
4126 dmesg | grep 'error from obd_brw_async' && error 'error writing back'
4130 run_test 42b "test destroy of file with cached dirty data ======"
4132 # if these tests just want to test the effect of truncation,
4133 # they have to be very careful. consider:
4134 # - the first open gets a {0,EOF}PR lock
4135 # - the first write conflicts and gets a {0, count-1}PW
4136 # - the rest of the writes are under {count,EOF}PW
4137 # - the open for truncate tries to match a {0,EOF}PR
4138 # for the filesize and cancels the PWs.
4139 # any number of fixes (don't get {0,EOF} on open, match
4140 # composite locks, do smarter file size management) fix
4141 # this, but for now we want these tests to verify that
4142 # the cancellation with truncate intent works, so we
4143 # start the file with a full-file pw lock to match against
4144 # until the truncate.
4149 cancel_lru_locks $OSC
4151 # prime the file with 0,EOF PW to match
4155 # now the real test..
4156 dd if=/dev/zero of=$file bs=1024 count=100
4157 BEFOREWRITES=`count_ost_writes`
4158 $TRUNCATE $file $offset
4159 cancel_lru_locks $OSC
4160 AFTERWRITES=`count_ost_writes`
4165 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4168 [ $BEFOREWRITES -eq $AFTERWRITES ] &&
4169 error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
4172 run_test 42c "test partial truncate of file with cached dirty data"
4175 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4178 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
4179 error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
4182 run_test 42d "test complete truncate of file with cached dirty data"
4184 test_42e() { # bug22074
4185 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4187 local TDIR=$DIR/${tdir}e
4188 local pages=16 # hardcoded 16 pages, don't change it.
4189 local files=$((OSTCOUNT * 500)) # hopefully 500 files on each OST
4190 local proc_osc0="osc.${FSNAME}-OST0000-osc-[^MDT]*"
4194 test_mkdir $DIR/${tdir}e
4195 $SETSTRIPE -c 1 $TDIR
4196 createmany -o $TDIR/f $files
4198 max_dirty_mb=$($LCTL get_param -n $proc_osc0/max_dirty_mb)
4200 # we assume that with $OSTCOUNT files, at least one of them will
4201 # be allocated on OST0.
4202 warmup_files=$((OSTCOUNT * max_dirty_mb))
4203 createmany -o $TDIR/w $warmup_files
4205 # write a large amount of data into one file and sync, to get good
4206 # avail_grant number from OST.
4207 for ((i=0; i<$warmup_files; i++)); do
4208 idx=$($GETSTRIPE -i $TDIR/w$i)
4209 [ $idx -ne 0 ] && continue
4210 dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1
4213 [[ $i -gt $warmup_files ]] && error "OST0 is still cold"
4215 $LCTL get_param $proc_osc0/cur_dirty_bytes
4216 $LCTL get_param $proc_osc0/cur_grant_bytes
4218 # create as much dirty pages as we can while not to trigger the actual
4219 # RPCs directly. but depends on the env, VFS may trigger flush during this
4220 # period, hopefully we are good.
4221 for ((i=0; i<$warmup_files; i++)); do
4222 idx=$($GETSTRIPE -i $TDIR/w$i)
4223 [ $idx -ne 0 ] && continue
4224 dd if=/dev/zero of=$TDIR/w$i bs=1M count=1 2>/dev/null
4226 $LCTL get_param $proc_osc0/cur_dirty_bytes
4227 $LCTL get_param $proc_osc0/cur_grant_bytes
4229 # perform the real test
4230 $LCTL set_param $proc_osc0/rpc_stats 0
4231 for ((;i<$files; i++)); do
4232 [ $($GETSTRIPE -i $TDIR/f$i) -eq 0 ] || continue
4233 dd if=/dev/zero of=$TDIR/f$i bs=$PAGE_SIZE count=$pages 2>/dev/null
4236 $LCTL get_param $proc_osc0/rpc_stats
4239 local have_ppr=false
4240 $LCTL get_param $proc_osc0/rpc_stats |
4241 while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do
4242 # skip lines until we are at the RPC histogram data
4243 [ "$PPR" == "pages" ] && have_ppr=true && continue
4244 $have_ppr || continue
4246 # we only want the percent stat for < 16 pages
4247 [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break
4249 percent=$((percent + WPCT))
4250 if [[ $percent -gt 15 ]]; then
4251 error "less than 16-pages write RPCs" \
4258 run_test 42e "verify sub-RPC writes are not done synchronously"
4260 test_43A() { # was test_43
4261 test_mkdir $DIR/$tdir
4262 cp -p /bin/ls $DIR/$tdir/$tfile
4263 $MULTIOP $DIR/$tdir/$tfile Ow_c &
4265 # give multiop a chance to open
4268 $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true
4271 run_test 43A "execution of file opened for write should return -ETXTBSY"
4274 test_mkdir $DIR/$tdir
4275 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4276 $DIR/$tdir/sleep 60 &
4278 # Make sure exec of $tdir/sleep wins race with truncate
4280 $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success"
4283 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
4286 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4288 test_mkdir $DIR/$tdir
4289 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4290 $DIR/$tdir/sleep 60 &
4292 # Make sure exec of $tdir/sleep wins race with truncate
4294 $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success"
4297 run_test 43b "truncate of file being executed should return -ETXTBSY"
4300 local testdir="$DIR/$tdir"
4303 ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) |
4304 ( cd $testdir && md5sum -c )
4306 run_test 43c "md5sum of copy into lustre"
4308 test_44A() { # was test_44
4309 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4311 dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
4312 dd if=$DIR/f1 bs=4k count=1 > /dev/null
4314 run_test 44A "zero length read from a sparse stripe"
4317 local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
4319 [ -z "$nstripe" ] && skip "can't get stripe info"
4320 [[ $nstripe -gt $OSTCOUNT ]] &&
4321 skip "Wrong default_stripe_count: $nstripe OSTCOUNT: $OSTCOUNT"
4323 local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: |
4325 if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then
4326 nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: |
4330 OFFSETS="0 $((stride/2)) $((stride-1))"
4331 for offset in $OFFSETS; do
4332 for i in $(seq 0 $((nstripe-1))); do
4333 local GLOBALOFFSETS=""
4335 local size=$((((i + 2 * $nstripe )*$stride + $offset)))
4336 local myfn=$DIR/d44a-$size
4337 echo "--------writing $myfn at $size"
4338 ll_sparseness_write $myfn $size ||
4339 error "ll_sparseness_write"
4340 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4341 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4342 error "ll_sparseness_verify $GLOBALOFFSETS"
4344 for j in $(seq 0 $((nstripe-1))); do
4346 size=$((((j + $nstripe )*$stride + $offset)))
4347 ll_sparseness_write $myfn $size ||
4348 error "ll_sparseness_write"
4349 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4351 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4352 error "ll_sparseness_verify $GLOBALOFFSETS"
4357 run_test 44a "test sparse pwrite ==============================="
4361 for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
4367 before=`dirty_osc_total`
4368 echo executing "\"$*\""
4370 after=`dirty_osc_total`
4371 echo before $before, after $after
4374 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4377 # Obtain grants from OST if it supports it
4378 echo blah > ${f}_grant
4381 do_dirty_record "echo blah > $f"
4382 [[ $before -eq $after ]] && error "write wasn't cached"
4383 do_dirty_record "> $f"
4384 [[ $before -gt $after ]] || error "truncate didn't lower dirty count"
4385 do_dirty_record "echo blah > $f"
4386 [[ $before -eq $after ]] && error "write wasn't cached"
4387 do_dirty_record "sync"
4388 [[ $before -gt $after ]] || error "writeback didn't lower dirty count"
4389 do_dirty_record "echo blah > $f"
4390 [[ $before -eq $after ]] && error "write wasn't cached"
4391 do_dirty_record "cancel_lru_locks osc"
4392 [[ $before -gt $after ]] ||
4393 error "lock cancellation didn't lower dirty count"
4396 run_test 45 "osc io page accounting ============================"
4398 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this
4399 # test tickles a bug where re-dirtying a page was failing to be mapped to the
4400 # objects offset and an assert hit when an rpc was built with 1023's mapped
4401 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
4403 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4408 dd if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4410 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=1023 count=1
4411 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4415 run_test 46 "dirtying a previously written page ================"
4417 # test_47 is removed "Device nodes check" is moved to test_28
4419 test_48a() { # bug 2399
4420 [ "$mds1_FSTYPE" = "zfs" ] &&
4421 [ $MDS1_VERSION -lt $(version_code 2.3.63) ] &&
4422 skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly"
4424 test_mkdir $DIR/$tdir
4426 mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
4427 test_mkdir $DIR/$tdir
4428 touch foo || error "'touch foo' failed after recreating cwd"
4430 touch .foo || error "'touch .foo' failed after recreating cwd"
4432 ls . > /dev/null || error "'ls .' failed after recreating cwd"
4433 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4434 cd . || error "'cd .' failed after recreating cwd"
4435 mkdir . && error "'mkdir .' worked after recreating cwd"
4436 rmdir . && error "'rmdir .' worked after recreating cwd"
4437 ln -s . baz || error "'ln -s .' failed after recreating cwd"
4438 cd .. || error "'cd ..' failed after recreating cwd"
4440 run_test 48a "Access renamed working dir (should return errors)="
4442 test_48b() { # bug 2399
4444 test_mkdir $DIR/$tdir
4446 rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
4447 touch foo && error "'touch foo' worked after removing cwd"
4448 mkdir foo && error "'mkdir foo' worked after removing cwd"
4449 touch .foo && error "'touch .foo' worked after removing cwd"
4450 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
4451 ls . > /dev/null && error "'ls .' worked after removing cwd"
4452 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4453 mkdir . && error "'mkdir .' worked after removing cwd"
4454 rmdir . && error "'rmdir .' worked after removing cwd"
4455 ln -s . foo && error "'ln -s .' worked after removing cwd"
4456 cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
4458 run_test 48b "Access removed working dir (should return errors)="
4460 test_48c() { # bug 2350
4461 #lctl set_param debug=-1
4464 test_mkdir -p $DIR/$tdir/dir
4466 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4467 $TRACE touch foo && error "touch foo worked after removing cwd"
4468 $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
4469 touch .foo && error "touch .foo worked after removing cwd"
4470 mkdir .foo && error "mkdir .foo worked after removing cwd"
4471 $TRACE ls . && error "'ls .' worked after removing cwd"
4472 $TRACE ls .. || error "'ls ..' failed after removing cwd"
4473 $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
4474 $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
4475 $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
4476 $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
4478 run_test 48c "Access removed working subdir (should return errors)"
4480 test_48d() { # bug 2350
4481 #lctl set_param debug=-1
4484 test_mkdir -p $DIR/$tdir/dir
4486 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4487 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4488 $TRACE touch foo && error "'touch foo' worked after removing parent"
4489 $TRACE mkdir foo && error "mkdir foo worked after removing parent"
4490 touch .foo && error "'touch .foo' worked after removing parent"
4491 mkdir .foo && error "mkdir .foo worked after removing parent"
4492 $TRACE ls . && error "'ls .' worked after removing parent"
4493 $TRACE ls .. && error "'ls ..' worked after removing parent"
4494 $TRACE mkdir . && error "'mkdir .' worked after removing parent"
4495 $TRACE rmdir . && error "'rmdir .' worked after removing parent"
4496 $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
4499 run_test 48d "Access removed parent subdir (should return errors)"
4501 test_48e() { # bug 4134
4502 #lctl set_param debug=-1
4505 test_mkdir -p $DIR/$tdir/dir
4507 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4508 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4509 $TRACE touch $DIR/$tdir || error "'touch $DIR/$tdir' failed"
4510 $TRACE chmod +x $DIR/$tdir || error "'chmod +x $DIR/$tdir' failed"
4511 # On a buggy kernel addition of "touch foo" after cd .. will
4512 # produce kernel oops in lookup_hash_it
4513 touch ../foo && error "'cd ..' worked after recreate parent"
4515 $TRACE rm $DIR/$tdir || error "rm '$DIR/$tdir' failed"
4517 run_test 48e "Access to recreated parent subdir (should return errors)"
4519 test_49() { # LU-1030
4520 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4521 remote_ost_nodsh && skip "remote OST with nodsh"
4523 # get ost1 size - lustre-OST0000
4524 ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
4526 # write 800M at maximum
4527 [[ $ost1_size -lt 2 ]] && ost1_size=2
4528 [[ $ost1_size -gt 819200 ]] && ost1_size=819200
4530 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
4531 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) &
4534 # change max_pages_per_rpc while writing the file
4535 local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc
4536 local orig_mppc=$($LCTL get_param -n $osc1_mppc)
4537 # loop until dd process exits
4538 while ps ax -opid | grep -wq $dd_pid; do
4539 $LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1))
4540 sleep $((RANDOM % 5 + 1))
4542 # restore original max_pages_per_rpc
4543 $LCTL set_param $osc1_mppc=$orig_mppc
4544 rm $DIR/$tfile || error "rm $DIR/$tfile failed"
4546 run_test 49 "Change max_pages_per_rpc won't break osc extent"
4550 test_mkdir $DIR/$tdir
4552 ls /proc/$$/cwd || error "ls /proc/$$/cwd failed"
4554 run_test 50 "special situations: /proc symlinks ==============="
4556 test_51a() { # was test_51
4557 # bug 1516 - create an empty entry right after ".." then split dir
4558 test_mkdir -c1 $DIR/$tdir
4559 touch $DIR/$tdir/foo
4560 $MCREATE $DIR/$tdir/bar
4562 createmany -m $DIR/$tdir/longfile 201
4564 while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do
4565 $MCREATE $DIR/$tdir/longfile$FNUM
4570 ls -l $DIR/$tdir > /dev/null || error "ls -l $DIR/$tdir failed"
4572 run_test 51a "special situations: split htree with empty entry =="
4574 cleanup_print_lfs_df () {
4581 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4583 local dir=$DIR/$tdir
4584 local nrdirs=$((65536 + 100))
4586 # cleanup the directory
4593 local mdtidx=$(printf "%04x" $($LFS getstripe -m $dir))
4594 local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
4595 [[ $numfree -lt $nrdirs ]] &&
4596 skip "not enough free inodes ($numfree) on MDT$mdtidx"
4598 # need to check free space for the directories as well
4599 local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
4600 numfree=$(( blkfree / $(fs_inode_ksize) ))
4601 [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)"
4603 trap cleanup_print_lfs_df EXIT
4606 createmany -d $dir/d $nrdirs || {
4607 unlinkmany $dir/d $nrdirs
4608 error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
4612 nrdirs=$(ls -U $dir | wc -l)
4614 # unlink all but 100 subdirectories, then check it still works
4616 local delete=$((nrdirs - left))
4621 # for ldiskfs the nlink count should be 1, but this is OSD specific
4622 # and so this is listed for informational purposes only
4623 echo "nlink before: $(stat -c %h $dir), created before: $nrdirs"
4624 unlinkmany -d $dir/d $delete ||
4625 error "unlink of first $delete subdirs failed"
4627 echo "nlink between: $(stat -c %h $dir)"
4628 local found=$(ls -U $dir | wc -l)
4629 [ $found -ne $left ] &&
4630 error "can't find subdirs: found only $found, expected $left"
4632 unlinkmany -d $dir/d $delete $left ||
4633 error "unlink of second $left subdirs failed"
4634 # regardless of whether the backing filesystem tracks nlink accurately
4635 # or not, the nlink count shouldn't be more than "." and ".." here
4636 local after=$(stat -c %h $dir)
4637 [[ $after -gt 2 ]] && error "nlink after: $after > 2" ||
4638 echo "nlink after: $after"
4640 cleanup_print_lfs_df
4642 run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
4645 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4646 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
4648 test_mkdir $DIR/$tdir
4649 createmany -o $DIR/$tdir/t- 1000
4650 $LFS getstripe $DIR/$tdir > $TMP/$tfile
4651 for N in $(seq 0 $((OSTCOUNT - 1))); do
4652 OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
4653 END { printf("%0.0f", objs) }' $TMP/$tfile)
4654 OBJS0[$N]=$(grep -A 1 idx $TMP/$tfile | awk -vobjs=0 \
4655 '($1 == '$N') { objs += 1 } \
4656 END { printf("%0.0f", objs) }')
4657 log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
4659 unlinkmany $DIR/$tdir/t- 1000
4662 for N in $(seq 1 $((OSTCOUNT - 1))); do
4663 [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] &&
4664 error "OST $N has less objects vs OST $NLAST" \
4665 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4666 [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] &&
4667 error "OST $N has less objects vs OST $NLAST" \
4668 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4670 [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] &&
4671 error "OST $N has less #0 objects vs OST $NLAST" \
4672 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4673 [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] &&
4674 error "OST $N has less #0 objects vs OST $NLAST" \
4675 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4680 run_test 51d "check object distribution"
4683 if [ "$mds1_FSTYPE" != ldiskfs ]; then
4684 skip_env "ldiskfs only test"
4687 test_mkdir -c1 $DIR/$tdir
4688 test_mkdir -c1 $DIR/$tdir/d0
4690 touch $DIR/$tdir/d0/foo
4691 createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
4692 error "file exceed 65000 nlink limit!"
4693 unlinkmany $DIR/$tdir/d0/f- 65001
4696 run_test 51e "check file nlink limit"
4699 test_mkdir $DIR/$tdir
4702 local ulimit_old=$(ulimit -n)
4703 local spare=20 # number of spare fd's for scripts/libraries, etc.
4704 local mdt=$($LFS getstripe -m $DIR/$tdir)
4705 local numfree=$($LFS df -i $DIR/$tdir | awk '/MDT:'$mdt'/ { print $4 }')
4707 echo "MDT$mdt numfree=$numfree, max=$max"
4708 [[ $numfree -gt $max ]] && numfree=$max || numfree=$((numfree * 7 / 8))
4709 if [ $((numfree + spare)) -gt $ulimit_old ]; then
4710 while ! ulimit -n $((numfree + spare)); do
4711 numfree=$((numfree * 3 / 4))
4713 echo "changed ulimit from $ulimit_old to $((numfree + spare))"
4715 echo "left ulimit at $ulimit_old"
4718 createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
4719 unlinkmany $DIR/$tdir/f $numfree
4720 error "create+open $numfree files in $DIR/$tdir failed"
4722 ulimit -n $ulimit_old
4724 # if createmany exits at 120s there will be fewer than $numfree files
4725 unlinkmany $DIR/$tdir/f $numfree || true
4727 run_test 51f "check many open files limit"
4730 [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
4731 test_mkdir $DIR/$tdir
4732 touch $DIR/$tdir/foo
4733 chattr +a $DIR/$tdir/foo || error "chattr +a failed"
4734 echo bar >> $DIR/$tdir/foo || error "append bar failed"
4735 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4736 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4737 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4739 echo foo >> $DIR/$tdir/foo || error "append foo failed"
4740 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4741 lsattr $DIR/$tdir/foo | egrep -q "^-+a[-e]+ $DIR/$tdir/foo" ||
4743 chattr -a $DIR/$tdir/foo || error "chattr -a failed"
4744 cp -r $DIR/$tdir $TMP/
4745 rm -fr $DIR/$tdir $TMP/$tdir || error "cleanup rm failed"
4747 run_test 52a "append-only flag test (should return errors)"
4750 [ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo
4751 test_mkdir $DIR/$tdir
4752 touch $DIR/$tdir/foo
4753 chattr +i $DIR/$tdir/foo || error "chattr +i failed"
4754 cat test > $DIR/$tdir/foo && error "cat test worked"
4755 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4756 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4757 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4759 echo foo >> $DIR/$tdir/foo && error "echo worked"
4760 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4761 [ -f $DIR/$tdir/foo ] || error "$tdir/foo is not a file"
4762 [ -f $DIR/$tdir/foo_ren ] && error "$tdir/foo_ren is not a file"
4763 lsattr $DIR/$tdir/foo | egrep -q "^-+i[-e]+ $DIR/$tdir/foo" ||
4765 chattr -i $DIR/$tdir/foo || error "chattr failed"
4767 rm -fr $DIR/$tdir || error "unable to remove $DIR/$tdir"
4769 run_test 52b "immutable flag test (should return errors) ======="
4772 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4773 remote_mds_nodsh && skip "remote MDS with nodsh"
4774 remote_ost_nodsh && skip "remote OST with nodsh"
4787 local support_last_seq=true
4789 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
4790 support_last_seq=false
4793 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
4795 for value in $(do_facet $SINGLEMDS \
4796 $LCTL get_param osp.$mdtosc.prealloc_last_id) ; do
4797 param=$(echo ${value[0]} | cut -d "=" -f1)
4798 ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
4800 if $support_last_seq; then
4801 param_seq=$(echo $param |
4802 sed -e s/prealloc_last_id/prealloc_last_seq/g)
4803 mds_last_seq=$(do_facet $SINGLEMDS \
4804 $LCTL get_param -n $param_seq)
4806 mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
4808 ostnum=$(index_from_ostuuid ${ostname}_UUID)
4809 node=$(facet_active_host ost$((ostnum+1)))
4810 param="obdfilter.$ostname.last_id"
4811 for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
4812 echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
4813 ost_last_id=$ost_last
4815 if $support_last_seq; then
4816 ost_last_id=$(echo $ost_last |
4817 awk -F':' '{print $2}' |
4819 ost_last_seq=$(echo $ost_last |
4820 awk -F':' '{print $1}')
4821 [[ $ost_last_seq = $mds_last_seq ]] || continue
4824 if [[ $ost_last_id != $mds_last ]]; then
4825 error "$ost_last_id != $mds_last"
4832 $found || error "can not match last_seq/last_id for $mdtosc"
4835 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
4838 perl -MSocket -e ';' || skip "no Socket perl module installed"
4840 $SOCKETSERVER $DIR/socket ||
4841 error "$SOCKETSERVER $DIR/socket failed: $?"
4842 $SOCKETCLIENT $DIR/socket ||
4843 error "$SOCKETCLIENT $DIR/socket failed: $?"
4844 $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
4846 run_test 54a "unix domain socket test =========================="
4852 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1
4854 run_test 54b "char device works in lustre ======================"
4857 [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
4858 [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
4859 [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
4861 for i in $(seq 3 7); do
4862 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
4871 loopdev="$DIR/loop54c"
4874 $UMOUNT $DIR/$tdir || rc=$?
4875 losetup -d $loopdev || true
4876 losetup -d $LOOPDEV || true
4877 rm -rf $loopdev $DIR/$tfile $DIR/$tdir
4882 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4884 loopdev="$DIR/loop54c"
4887 [ -z "$LOOPNUM" ] && skip_env "couldn't find empty loop device"
4888 trap cleanup_54c EXIT
4889 mknod $loopdev b 7 $LOOPNUM
4890 echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
4891 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE seek=1024 count=1 > /dev/null
4892 losetup $loopdev $DIR/$tfile ||
4893 error "can't set up $loopdev for $DIR/$tfile"
4894 mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
4895 test_mkdir $DIR/$tdir
4896 mount -t ext2 $loopdev $DIR/$tdir ||
4897 error "error mounting $loopdev on $DIR/$tdir"
4898 dd if=/dev/zero of=$DIR/$tdir/tmp bs=$PAGE_SIZE count=30 ||
4901 dd if=$DIR/$tdir/tmp of=/dev/zero bs=$PAGE_SIZE count=30 ||
4905 run_test 54c "block device works in lustre ====================="
4911 [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string"
4913 run_test 54d "fifo device works in lustre ======================"
4918 cp -aL /dev/console $f
4919 echo $string > $f || error "echo $string to $f failed"
4921 run_test 54e "console/tty device works in lustre ======================"
4925 local dir=$DIR/$tdir
4928 test_mkdir -p $dir/dir
4929 for i in $(seq $numfiles); do
4931 touch $dir/dir/file$i
4934 local numcomp=$($LFS getstripe --component-count $dir)
4936 [[ $numcomp == 0 ]] && numcomp=1
4938 # test lfs getstripe with --recursive
4939 local filenum=$($LFS getstripe -r $dir | egrep -c "obdidx|l_ost_idx")
4941 [[ $filenum -eq $((numfiles * 2)) ]] ||
4942 error "$LFS getstripe -r: found $filenum != $((numfiles * 2))"
4943 filenum=$($LFS getstripe $dir | egrep -c "obdidx|l_ost_idx")
4944 [[ $filenum -eq $numfiles ]] ||
4945 error "$LFS getstripe $dir: found $filenum, not $numfiles"
4946 echo "$LFS getstripe showed obdidx or l_ost_idx"
4948 # test lfs getstripe with file instead of dir
4949 filenum=$($LFS getstripe $dir/file1 | egrep -c "obdidx|l_ost_idx")
4950 [[ $filenum -eq 1 ]] ||
4951 error "$LFS getstripe $dir/file1: found $filenum, not 1"
4952 echo "$LFS getstripe file1 passed"
4954 #test lfs getstripe with --verbose
4955 filenum=$($LFS getstripe --verbose $dir | grep -c lmm_magic)
4956 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
4957 error "$LFS getstripe --verbose $dir: "\
4958 "got $filenum want $((numfiles * numcomp)) lmm_magic"
4959 [[ $($LFS getstripe $dir | grep -c lmm_magic) -eq 0 ]] ||
4960 error "$LFS getstripe $dir: showed lmm_magic"
4962 #test lfs getstripe with -v prints lmm_fid
4963 filenum=$($LFS getstripe -v $dir | grep -c lmm_fid)
4964 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
4965 error "$LFS getstripe -v $dir: "\
4966 "got $filenum want $((numfiles * numcomp)) lmm_fid"
4967 [[ $($LFS getstripe $dir | grep -c lmm_fid) -eq 0 ]] ||
4968 error "$LFS getstripe $dir: showed lmm_fid by default"
4969 echo "$LFS getstripe --verbose passed"
4971 #check for FID information
4972 local fid1=$($LFS getstripe --fid $dir/file1)
4973 local fid2=$($LFS getstripe --verbose $dir/file1 |
4974 awk '/lmm_fid: / { print $2; exit; }')
4975 local fid3=$($LFS path2fid $dir/file1)
4977 [ "$fid1" != "$fid2" ] &&
4978 error "getstripe --fid '$fid1' != getstripe --verbose '$fid2'"
4979 [ "$fid1" != "$fid3" ] &&
4980 error "getstripe --fid '$fid1' != lfs path2fid '$fid3'"
4981 echo "$LFS getstripe --fid passed"
4983 #test lfs getstripe with --obd
4984 $LFS getstripe --obd wrong_uuid $dir 2>&1 | grep -q "unknown obduuid" ||
4985 error "$LFS getstripe --obd wrong_uuid: should return error"
4987 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4990 local obduuid=$(ostuuid_from_index $ostidx)
4991 local found=$($LFS getstripe -r --obd $obduuid $dir |
4992 grep 'lmm_stripe_offset:' | grep -c " $ostidx\$")
4994 filenum=$($LFS getstripe -ir $dir | grep -c "^$ostidx\$")
4995 [[ $($LFS getstripe -id $dir) -ne $ostidx ]] ||
4997 [[ $($LFS getstripe -id $dir/dir) -ne $ostidx ]] ||
5000 [[ $found -eq $filenum ]] ||
5001 error "$LFS getstripe --obd: found $found expect $filenum"
5002 [[ $($LFS getstripe -r -v --obd $obduuid $dir |
5003 sed '/^[ ]*'${ostidx}'[ ]/d' |
5004 sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] ||
5005 error "$LFS getstripe --obd: should not show file on other obd"
5006 echo "$LFS getstripe --obd passed"
5008 run_test 56a "check $LFS getstripe"
5011 local dir=$DIR/$tdir
5015 for i in $(seq $numdirs); do
5016 test_mkdir $dir/dir$i
5019 # test lfs getdirstripe default mode is non-recursion, which is
5020 # different from lfs getstripe
5021 local dircnt=$($LFS getdirstripe $dir | grep -c lmv_stripe_count)
5023 [[ $dircnt -eq 1 ]] ||
5024 error "$LFS getdirstripe: found $dircnt, not 1"
5025 dircnt=$($LFS getdirstripe --recursive $dir |
5026 grep -c lmv_stripe_count)
5027 [[ $dircnt -eq $((numdirs + 1)) ]] ||
5028 error "$LFS getdirstripe -r: $dircnt, != $((numdirs + 1))"
5030 run_test 56b "check $LFS getdirstripe"
5033 remote_ost_nodsh && skip "remote OST with nodsh"
5036 local ost_name=$(ostname_from_index $ost_idx)
5037 local old_status=$(ost_dev_status $ost_idx)
5039 [[ -z "$old_status" ]] ||
5040 skip_env "OST $ost_name is in $old_status status"
5042 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
5043 [[ $OST1_VERSION -ge $(version_code 2.12.3) ]] && do_facet ost1 \
5044 $LCTL set_param -n obdfilter.$ost_name.no_precreate=1
5047 local new_status=$(ost_dev_status $ost_idx)
5049 [[ "$new_status" =~ "D" ]] ||
5050 error "$ost_name status is '$new_status', missing 'D'"
5051 if [[ $OST1_VERSION -ge $(version_code 2.12.3) ]]; then
5052 [[ "$new_status" =~ "N" ]] ||
5053 error "$ost_name status is '$new_status', missing 'N'"
5056 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
5057 [[ $OST1_VERSION -ge $(version_code 2.12.3) ]] && do_facet ost1 \
5058 $LCTL set_param -n obdfilter.$ost_name.no_precreate=0
5061 new_status=$(ost_dev_status $ost_idx)
5062 [[ ! "$new_status" =~ "D" && ! "$new_status" =~ "N" ]] ||
5063 error "$ost_name status is '$new_status', has 'D' and/or 'N'"
5065 run_test 56c "check 'lfs df' showing device status"
5070 local local_tdir="$1"
5071 local local_numfiles="$2"
5072 local local_numdirs="$3"
5073 local dir_params="$4"
5074 local dir_stripe_params="$5"
5076 if [ ! -d "$local_tdir" ] ; then
5077 test_mkdir -p $dir_stripe_params $local_tdir
5078 [ "$dir_params" ] && $LFS setstripe $dir_params $local_tdir
5079 for i in $(seq $local_numfiles) ; do
5080 touch $local_tdir/file$i
5082 for i in $(seq $local_numdirs) ; do
5083 test_mkdir $dir_stripe_params $local_tdir/dir$i
5084 for j in $(seq $local_numfiles) ; do
5085 touch $local_tdir/dir$i/file$j
5091 setup_56_special() {
5093 local local_numfiles=$2
5094 local local_numdirs=$3
5096 setup_56 $local_tdir $local_numfiles $local_numdirs
5098 if [ ! -e "$local_tdir/loop${local_numfiles}b" ] ; then
5099 for i in $(seq $local_numfiles) ; do
5100 mknod $local_tdir/loop${i}b b 7 $i
5101 mknod $local_tdir/null${i}c c 1 3
5102 ln -s $local_tdir/file1 $local_tdir/link${i}
5104 for i in $(seq $local_numdirs) ; do
5105 mknod $local_tdir/dir$i/loop${i}b b 7 $i
5106 mknod $local_tdir/dir$i/null${i}c c 1 3
5107 ln -s $local_tdir/dir$i/file1 $local_tdir/dir$i/link${i}
5113 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5114 local expected=$(($NUMDIRS + 2))
5116 setup_56 $dir $NUMFILES $NUMDIRS
5118 # test lfs find with -name
5119 for i in $(seq $NUMFILES) ; do
5120 local nums=$($LFS find -name "*$i" $dir | wc -l)
5122 [ $nums -eq $expected ] ||
5123 error "lfs find -name '*$i' $dir wrong: "\
5124 "found $nums, expected $expected"
5127 run_test 56g "check lfs find -name"
5130 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5131 local expected=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES))
5133 setup_56 $dir $NUMFILES $NUMDIRS
5135 # test lfs find with ! -name
5136 for i in $(seq $NUMFILES) ; do
5137 local nums=$($LFS find ! -name "*$i" $dir | wc -l)
5139 [ $nums -eq $expected ] ||
5140 error "lfs find ! -name '*$i' $dir wrong: "\
5141 "found $nums, expected $expected"
5144 run_test 56h "check lfs find ! -name"
5147 local dir=$DIR/$tdir
5151 local cmd="$LFS find -ost $(ostuuid_from_index 0 $dir) $dir"
5154 [ -z "$out" ] || error "'$cmd' returned directory '$out'"
5156 run_test 56i "check 'lfs find -ost UUID' skips directories"
5159 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5161 setup_56_special $dir $NUMFILES $NUMDIRS
5163 local expected=$((NUMDIRS + 1))
5164 local cmd="$LFS find -type d $dir"
5165 local nums=$($cmd | wc -l)
5167 [ $nums -eq $expected ] ||
5168 error "'$cmd' wrong: found $nums, expected $expected"
5170 run_test 56j "check lfs find -type d"
5173 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5175 setup_56_special $dir $NUMFILES $NUMDIRS
5177 local expected=$(((NUMDIRS + 1) * NUMFILES))
5178 local cmd="$LFS find -type f $dir"
5179 local nums=$($cmd | wc -l)
5181 [ $nums -eq $expected ] ||
5182 error "'$cmd' wrong: found $nums, expected $expected"
5184 run_test 56k "check lfs find -type f"
5187 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5189 setup_56_special $dir $NUMFILES $NUMDIRS
5191 local expected=$((NUMDIRS + NUMFILES))
5192 local cmd="$LFS find -type b $dir"
5193 local nums=$($cmd | wc -l)
5195 [ $nums -eq $expected ] ||
5196 error "'$cmd' wrong: found $nums, expected $expected"
5198 run_test 56l "check lfs find -type b"
5201 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5203 setup_56_special $dir $NUMFILES $NUMDIRS
5205 local expected=$((NUMDIRS + NUMFILES))
5206 local cmd="$LFS find -type c $dir"
5207 local nums=$($cmd | wc -l)
5208 [ $nums -eq $expected ] ||
5209 error "'$cmd' wrong: found $nums, expected $expected"
5211 run_test 56m "check lfs find -type c"
5214 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5215 setup_56_special $dir $NUMFILES $NUMDIRS
5217 local expected=$((NUMDIRS + NUMFILES))
5218 local cmd="$LFS find -type l $dir"
5219 local nums=$($cmd | wc -l)
5221 [ $nums -eq $expected ] ||
5222 error "'$cmd' wrong: found $nums, expected $expected"
5224 run_test 56n "check lfs find -type l"
5227 local dir=$DIR/$tdir
5229 setup_56 $dir $NUMFILES $NUMDIRS
5230 utime $dir/file1 > /dev/null || error "utime (1)"
5231 utime $dir/file2 > /dev/null || error "utime (2)"
5232 utime $dir/dir1 > /dev/null || error "utime (3)"
5233 utime $dir/dir2 > /dev/null || error "utime (4)"
5234 utime $dir/dir1/file1 > /dev/null || error "utime (5)"
5235 dd if=/dev/zero count=1 >> $dir/dir1/file1 && sync
5238 local nums=$($LFS find -mtime +0 $dir | wc -l)
5240 [ $nums -eq $expected ] ||
5241 error "lfs find -mtime +0 $dir: found $nums expect $expected"
5244 cmd="$LFS find -mtime 0 $dir"
5245 nums=$($cmd | wc -l)
5246 [ $nums -eq $expected ] ||
5247 error "'$cmd' wrong: found $nums, expected $expected"
5249 run_test 56o "check lfs find -mtime for old files"
5252 [ $RUNAS_ID -eq $UID ] &&
5253 skip_env "RUNAS_ID = UID = $UID -- skipping"
5255 local dir=$DIR/$tdir
5257 setup_56 $dir $NUMFILES $NUMDIRS
5258 chown $RUNAS_ID $dir/file* || error "chown $DIR/${tdir}g/file$i failed"
5260 local expected=$NUMFILES
5261 local cmd="$LFS find -uid $RUNAS_ID $dir"
5262 local nums=$($cmd | wc -l)
5264 [ $nums -eq $expected ] ||
5265 error "'$cmd' wrong: found $nums, expected $expected"
5267 expected=$(((NUMFILES + 1) * NUMDIRS + 1))
5268 cmd="$LFS find ! -uid $RUNAS_ID $dir"
5269 nums=$($cmd | wc -l)
5270 [ $nums -eq $expected ] ||
5271 error "'$cmd' wrong: found $nums, expected $expected"
5273 run_test 56p "check lfs find -uid and ! -uid"
5276 [ $RUNAS_ID -eq $UID ] &&
5277 skip_env "RUNAS_ID = UID = $UID -- skipping"
5279 local dir=$DIR/$tdir
5281 setup_56 $dir $NUMFILES $NUMDIRS
5282 chgrp $RUNAS_GID $dir/file* || error "chown $dir/file$i failed"
5284 local expected=$NUMFILES
5285 local cmd="$LFS find -gid $RUNAS_GID $dir"
5286 local nums=$($cmd | wc -l)
5288 [ $nums -eq $expected ] ||
5289 error "'$cmd' wrong: found $nums, expected $expected"
5291 expected=$(( ($NUMFILES+1) * $NUMDIRS + 1))
5292 cmd="$LFS find ! -gid $RUNAS_GID $dir"
5293 nums=$($cmd | wc -l)
5294 [ $nums -eq $expected ] ||
5295 error "'$cmd' wrong: found $nums, expected $expected"
5297 run_test 56q "check lfs find -gid and ! -gid"
5300 local dir=$DIR/$tdir
5302 setup_56 $dir $NUMFILES $NUMDIRS
5305 local cmd="$LFS find -size 0 -type f -lazy $dir"
5306 local nums=$($cmd | wc -l)
5308 [ $nums -eq $expected ] ||
5309 error "'$cmd' wrong: found $nums, expected $expected"
5310 cmd="$LFS find -size 0 -type f $dir"
5311 nums=$($cmd | wc -l)
5312 [ $nums -eq $expected ] ||
5313 error "'$cmd' wrong: found $nums, expected $expected"
5316 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5317 nums=$($cmd | wc -l)
5318 [ $nums -eq $expected ] ||
5319 error "'$cmd' wrong: found $nums, expected $expected"
5320 cmd="$LFS find ! -size 0 -type f $dir"
5321 nums=$($cmd | wc -l)
5322 [ $nums -eq $expected ] ||
5323 error "'$cmd' wrong: found $nums, expected $expected"
5325 echo "test" > $dir/$tfile
5326 echo "test2" > $dir/$tfile.2 && sync
5328 cmd="$LFS find -size 5 -type f -lazy $dir"
5329 nums=$($cmd | wc -l)
5330 [ $nums -eq $expected ] ||
5331 error "'$cmd' wrong: found $nums, expected $expected"
5332 cmd="$LFS find -size 5 -type f $dir"
5333 nums=$($cmd | wc -l)
5334 [ $nums -eq $expected ] ||
5335 error "'$cmd' wrong: found $nums, expected $expected"
5338 cmd="$LFS find -size +5 -type f -lazy $dir"
5339 nums=$($cmd | wc -l)
5340 [ $nums -eq $expected ] ||
5341 error "'$cmd' wrong: found $nums, expected $expected"
5342 cmd="$LFS find -size +5 -type f $dir"
5343 nums=$($cmd | wc -l)
5344 [ $nums -eq $expected ] ||
5345 error "'$cmd' wrong: found $nums, expected $expected"
5348 cmd="$LFS find -size +0 -type f -lazy $dir"
5349 nums=$($cmd | wc -l)
5350 [ $nums -eq $expected ] ||
5351 error "'$cmd' wrong: found $nums, expected $expected"
5352 cmd="$LFS find -size +0 -type f $dir"
5353 nums=$($cmd | wc -l)
5354 [ $nums -eq $expected ] ||
5355 error "'$cmd' wrong: found $nums, expected $expected"
5358 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5359 nums=$($cmd | wc -l)
5360 [ $nums -eq $expected ] ||
5361 error "'$cmd' wrong: found $nums, expected $expected"
5362 cmd="$LFS find ! -size -5 -type f $dir"
5363 nums=$($cmd | wc -l)
5364 [ $nums -eq $expected ] ||
5365 error "'$cmd' wrong: found $nums, expected $expected"
5368 cmd="$LFS find -size -5 -type f -lazy $dir"
5369 nums=$($cmd | wc -l)
5370 [ $nums -eq $expected ] ||
5371 error "'$cmd' wrong: found $nums, expected $expected"
5372 cmd="$LFS find -size -5 -type f $dir"
5373 nums=$($cmd | wc -l)
5374 [ $nums -eq $expected ] ||
5375 error "'$cmd' wrong: found $nums, expected $expected"
5377 run_test 56r "check lfs find -size works"
5380 local dir=$DIR/$tdir
5382 [[ $OSC == "mdc" ]] && skip "DoM files" && return
5384 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5386 cancel_lru_locks $OSC
5388 local rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5390 local cmd="$LFS find -size 0 -type f -lazy $dir"
5391 local nums=$($cmd | wc -l)
5393 [ $nums -eq $expected ] ||
5394 error "'$cmd' wrong: found $nums, expected $expected"
5396 local rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5397 [ $rpcs_before -eq $rpcs_after ] ||
5398 error "'$cmd' should not send glimpse RPCs to OST"
5399 cmd="$LFS find -size 0 -type f $dir"
5400 nums=$($cmd | wc -l)
5401 [ $nums -eq $expected ] ||
5402 error "'$cmd' wrong: found $nums, expected $expected"
5403 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5404 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5405 $LCTL get_param osc.*.stats
5406 [ $rpcs_after -eq $((rpcs_before + 12)) ] ||
5407 error "'$cmd' should send 12 glimpse RPCs to OST"
5409 cancel_lru_locks $OSC
5410 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5412 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5413 nums=$($cmd | wc -l)
5414 [ $nums -eq $expected ] ||
5415 error "'$cmd' wrong: found $nums, expected $expected"
5416 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5417 $LCTL get_param mdc.*.stats
5418 [ $rpcs_before -eq $rpcs_after ] ||
5419 error "'$cmd' should not send glimpse RPCs to OST"
5420 cmd="$LFS find ! -size 0 -type f $dir"
5421 nums=$($cmd | wc -l)
5422 [ $nums -eq $expected ] ||
5423 error "'$cmd' wrong: found $nums, expected $expected"
5424 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5425 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5426 [ $rpcs_after -eq $((rpcs_before + 12)) ] ||
5427 error "'$cmd' should send 12 glimpse RPCs to OST"
5429 echo "test" > $dir/$tfile
5430 echo "test2" > $dir/$tfile.2 && sync
5431 cancel_lru_locks $OSC
5432 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5434 cmd="$LFS find -size 5 -type f -lazy $dir"
5435 nums=$($cmd | wc -l)
5436 [ $nums -eq $expected ] ||
5437 error "'$cmd' wrong: found $nums, expected $expected"
5438 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5439 [ $rpcs_before -eq $rpcs_after ] ||
5440 error "'$cmd' should not send glimpse RPCs to OST"
5441 cmd="$LFS find -size 5 -type f $dir"
5442 nums=$($cmd | wc -l)
5443 [ $nums -eq $expected ] ||
5444 error "'$cmd' wrong: found $nums, expected $expected"
5445 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5446 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5447 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5448 error "'$cmd' should send 14 glimpse RPCs to OST"
5450 cancel_lru_locks $OSC
5451 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5453 cmd="$LFS find -size +5 -type f -lazy $dir"
5454 nums=$($cmd | wc -l)
5455 [ $nums -eq $expected ] ||
5456 error "'$cmd' wrong: found $nums, expected $expected"
5457 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5458 [ $rpcs_before -eq $rpcs_after ] ||
5459 error "'$cmd' should not send glimpse RPCs to OST"
5460 cmd="$LFS find -size +5 -type f $dir"
5461 nums=$($cmd | wc -l)
5462 [ $nums -eq $expected ] ||
5463 error "'$cmd' wrong: found $nums, expected $expected"
5464 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5465 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5466 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5467 error "'$cmd' should send 14 glimpse RPCs to OST"
5469 cancel_lru_locks $OSC
5470 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5472 cmd="$LFS find -size +0 -type f -lazy $dir"
5473 nums=$($cmd | wc -l)
5474 [ $nums -eq $expected ] ||
5475 error "'$cmd' wrong: found $nums, expected $expected"
5476 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5477 [ $rpcs_before -eq $rpcs_after ] ||
5478 error "'$cmd' should not send glimpse RPCs to OST"
5479 cmd="$LFS find -size +0 -type f $dir"
5480 nums=$($cmd | wc -l)
5481 [ $nums -eq $expected ] ||
5482 error "'$cmd' wrong: found $nums, expected $expected"
5483 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5484 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5485 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5486 error "'$cmd' should send 14 glimpse RPCs to OST"
5488 cancel_lru_locks $OSC
5489 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5491 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5492 nums=$($cmd | wc -l)
5493 [ $nums -eq $expected ] ||
5494 error "'$cmd' wrong: found $nums, expected $expected"
5495 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5496 [ $rpcs_before -eq $rpcs_after ] ||
5497 error "'$cmd' should not send glimpse RPCs to OST"
5498 cmd="$LFS find ! -size -5 -type f $dir"
5499 nums=$($cmd | wc -l)
5500 [ $nums -eq $expected ] ||
5501 error "'$cmd' wrong: found $nums, expected $expected"
5502 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5503 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5504 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5505 error "'$cmd' should send 14 glimpse RPCs to OST"
5507 cancel_lru_locks $OSC
5508 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5510 cmd="$LFS find -size -5 -type f -lazy $dir"
5511 nums=$($cmd | wc -l)
5512 [ $nums -eq $expected ] ||
5513 error "'$cmd' wrong: found $nums, expected $expected"
5514 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5515 [ $rpcs_before -eq $rpcs_after ] ||
5516 error "'$cmd' should not send glimpse RPCs to OST"
5517 cmd="$LFS find -size -5 -type f $dir"
5518 nums=$($cmd | wc -l)
5519 [ $nums -eq $expected ] ||
5520 error "'$cmd' wrong: found $nums, expected $expected"
5521 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5522 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5523 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5524 error "'$cmd' should send 14 glimpse RPCs to OST"
5526 run_test 56ra "check lfs find -size -lazy works for data on OSTs"
5528 test_56s() { # LU-611 #LU-9369
5529 [[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
5531 local dir=$DIR/$tdir
5532 local onestripe=$(((NUMDIRS + 1) * NUMFILES))
5534 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5535 for i in $(seq $NUMDIRS); do
5536 $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile
5539 local expected=$NUMDIRS
5540 local cmd="$LFS find -c $OSTCOUNT $dir"
5541 local nums=$($cmd | wc -l)
5543 [ $nums -eq $expected ] || {
5544 $LFS getstripe -R $dir
5545 error "'$cmd' wrong: found $nums, expected $expected"
5548 expected=$((NUMDIRS + onestripe))
5549 cmd="$LFS find -stripe-count +0 -type f $dir"
5550 nums=$($cmd | wc -l)
5551 [ $nums -eq $expected ] || {
5552 $LFS getstripe -R $dir
5553 error "'$cmd' wrong: found $nums, expected $expected"
5557 cmd="$LFS find -stripe-count 1 -type f $dir"
5558 nums=$($cmd | wc -l)
5559 [ $nums -eq $expected ] || {
5560 $LFS getstripe -R $dir
5561 error "'$cmd' wrong: found $nums, expected $expected"
5564 cmd="$LFS find -stripe-count -2 -type f $dir"
5565 nums=$($cmd | wc -l)
5566 [ $nums -eq $expected ] || {
5567 $LFS getstripe -R $dir
5568 error "'$cmd' wrong: found $nums, expected $expected"
5572 cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir"
5573 nums=$($cmd | wc -l)
5574 [ $nums -eq $expected ] || {
5575 $LFS getstripe -R $dir
5576 error "'$cmd' wrong: found $nums, expected $expected"
5579 run_test 56s "check lfs find -stripe-count works"
5581 test_56t() { # LU-611 #LU-9369
5582 local dir=$DIR/$tdir
5584 setup_56 $dir 0 $NUMDIRS
5585 for i in $(seq $NUMDIRS); do
5586 $LFS setstripe -S 8M $dir/dir$i/$tfile
5589 local expected=$NUMDIRS
5590 local cmd="$LFS find -S 8M $dir"
5591 local nums=$($cmd | wc -l)
5593 [ $nums -eq $expected ] || {
5594 $LFS getstripe -R $dir
5595 error "'$cmd' wrong: found $nums, expected $expected"
5599 setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k"
5601 $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3}
5603 expected=$(((NUMDIRS + 1) * NUMFILES))
5604 cmd="$LFS find -stripe-size 512k -type f $dir"
5605 nums=$($cmd | wc -l)
5606 [ $nums -eq $expected ] ||
5607 error "'$cmd' wrong: found $nums, expected $expected"
5609 cmd="$LFS find -stripe-size +320k -type f $dir"
5610 nums=$($cmd | wc -l)
5611 [ $nums -eq $expected ] ||
5612 error "'$cmd' wrong: found $nums, expected $expected"
5614 expected=$(((NUMDIRS + 1) * NUMFILES + 4))
5615 cmd="$LFS find -stripe-size +200k -type f $dir"
5616 nums=$($cmd | wc -l)
5617 [ $nums -eq $expected ] ||
5618 error "'$cmd' wrong: found $nums, expected $expected"
5620 cmd="$LFS find -stripe-size -640k -type f $dir"
5621 nums=$($cmd | wc -l)
5622 [ $nums -eq $expected ] ||
5623 error "'$cmd' wrong: found $nums, expected $expected"
5626 cmd="$LFS find -stripe-size 256k -type f $dir"
5627 nums=$($cmd | wc -l)
5628 [ $nums -eq $expected ] ||
5629 error "'$cmd' wrong: found $nums, expected $expected"
5631 cmd="$LFS find -stripe-size -320k -type f $dir"
5632 nums=$($cmd | wc -l)
5633 [ $nums -eq $expected ] ||
5634 error "'$cmd' wrong: found $nums, expected $expected"
5637 cmd="$LFS find -stripe-size 1024k -type f $dir"
5638 nums=$($cmd | wc -l)
5639 [ $nums -eq $expected ] ||
5640 error "'$cmd' wrong: found $nums, expected $expected"
5642 run_test 56t "check lfs find -stripe-size works"
5644 test_56u() { # LU-611
5645 local dir=$DIR/$tdir
5647 setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1"
5649 if [[ $OSTCOUNT -gt 1 ]]; then
5650 $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3}
5656 local expected=$(((NUMDIRS + 1) * NUMFILES))
5657 local cmd="$LFS find -stripe-index 0 -type f $dir"
5658 local nums=$($cmd | wc -l)
5660 [ $nums -eq $expected ] ||
5661 error "'$cmd' wrong: found $nums, expected $expected"
5664 cmd="$LFS find -stripe-index 1 -type f $dir"
5665 nums=$($cmd | wc -l)
5666 [ $nums -eq $expected ] ||
5667 error "'$cmd' wrong: found $nums, expected $expected"
5669 cmd="$LFS find ! -stripe-index 0 -type f $dir"
5670 nums=$($cmd | wc -l)
5671 [ $nums -eq $expected ] ||
5672 error "'$cmd' wrong: found $nums, expected $expected"
5675 # This should produce an error and not return any files
5676 cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir"
5677 nums=$($cmd 2>/dev/null | wc -l)
5678 [ $nums -eq $expected ] ||
5679 error "'$cmd' wrong: found $nums, expected $expected"
5681 if [[ $OSTCOUNT -gt 1 ]]; then
5682 expected=$(((NUMDIRS + 1) * NUMFILES + onestripe))
5683 cmd="$LFS find -stripe-index 0,1 -type f $dir"
5684 nums=$($cmd | wc -l)
5685 [ $nums -eq $expected ] ||
5686 error "'$cmd' wrong: found $nums, expected $expected"
5689 run_test 56u "check lfs find -stripe-index works"
5693 local dir=$DIR/$tdir
5695 setup_56 $dir $NUMFILES $NUMDIRS
5697 UUID=$(mdtuuid_from_index $mdt_idx $dir)
5698 [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $mdt_idx"
5700 for file in $($LFS find -m $UUID $dir); do
5701 file_midx=$($LFS getstripe -m $file)
5702 [ $file_midx -eq $mdt_idx ] ||
5703 error "lfs find -m $UUID != getstripe -m $file_midx"
5706 run_test 56v "check 'lfs find -m match with lfs getstripe -m'"
5709 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5710 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5712 local dir=$DIR/$tdir
5714 setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
5716 local stripe_size=$($LFS getstripe -S -d $dir) ||
5717 error "$LFS getstripe -S -d $dir failed"
5718 stripe_size=${stripe_size%% *}
5720 local file_size=$((stripe_size * OSTCOUNT))
5721 local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
5722 local required_space=$((file_num * file_size))
5723 local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
5725 [[ $free_space -le $((required_space / 1024)) ]] &&
5726 skip_env "need $required_space, have $free_space kbytes"
5729 local dd_count=$((file_size / dd_bs))
5731 # write data into the files
5736 for i in $(seq $NUMFILES); do
5738 yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5739 error "write data into $file failed"
5741 for i in $(seq $NUMDIRS); do
5742 for j in $(seq $NUMFILES); do
5743 file=$dir/dir$i/file$j
5744 yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5745 error "write data into $file failed"
5749 # $LFS_MIGRATE will fail if hard link migration is unsupported
5750 if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then
5751 createmany -l$dir/dir1/file1 $dir/dir1/link 200 ||
5752 error "creating links to $dir/dir1/file1 failed"
5757 [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
5760 local cmd="$LFS_MIGRATE -y -c $expected $dir/file1"
5763 eval $cmd || error "$cmd failed"
5765 check_stripe_count $dir/file1 $expected
5767 if [ $MDS1_VERSION -ge $(version_code 2.6.90) ];
5769 # lfs_migrate file onto OST 0 if it is on OST 1, or onto
5770 # OST 1 if it is on OST 0. This file is small enough to
5771 # be on only one stripe.
5772 file=$dir/migr_1_ost
5773 dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
5774 error "write data into $file failed"
5775 local obdidx=$($LFS getstripe -i $file)
5776 local oldmd5=$(md5sum $file)
5779 [[ $obdidx -eq 0 ]] && newobdidx=1
5780 cmd="$LFS migrate -i $newobdidx $file"
5782 eval $cmd || error "$cmd failed"
5784 local realobdix=$($LFS getstripe -i $file)
5785 local newmd5=$(md5sum $file)
5787 [[ $newobdidx -ne $realobdix ]] &&
5788 error "new OST is different (was=$obdidx, "\
5789 "wanted=$newobdidx, got=$realobdix)"
5790 [[ "$oldmd5" != "$newmd5" ]] &&
5791 error "md5sum differ: $oldmd5, $newmd5"
5795 cmd="$LFS_MIGRATE -y -c $expected $dir/dir1"
5797 eval $cmd || error "$cmd failed"
5799 for j in $(seq $NUMFILES); do
5800 check_stripe_count $dir/dir1/file$j $expected
5803 # lfs_migrate works with lfs find
5804 cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir |
5805 $LFS_MIGRATE -y -c $expected"
5807 eval $cmd || error "$cmd failed"
5809 for i in $(seq 2 $NUMFILES); do
5810 check_stripe_count $dir/file$i $expected
5812 for i in $(seq 2 $NUMDIRS); do
5813 for j in $(seq $NUMFILES); do
5814 check_stripe_count $dir/dir$i/file$j $expected
5818 run_test 56w "check lfs_migrate -c stripe_count works"
5821 local file1=$DIR/$tdir/file1
5822 local create_pool=false
5823 local initial_pool=$($LFS getstripe -p $DIR)
5827 echo -n "Creating test dir..."
5828 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5831 echo -n "Creating test file..."
5832 touch $file1 || error "cannot create file"
5835 echo -n "Detecting existing pools..."
5836 pool_list=($($LFS pool_list $FSNAME | grep "$FSNAME\." | cut -d. -f2))
5838 if [ ${#pool_list[@]} -gt 0 ]; then
5839 echo "${pool_list[@]}"
5840 for thispool in "${pool_list[@]}"; do
5841 if [[ -z "$initial_pool" ||
5842 "$initial_pool" != "$thispool" ]]; then
5844 echo "Using existing pool '$pool'"
5849 echo "none detected."
5851 if [ -z "$pool" ]; then
5852 pool=${POOL:-testpool}
5853 [ "$initial_pool" = "$pool" ] && pool="testpool2"
5854 echo -n "Creating pool '$pool'..."
5856 pool_add $pool &> /dev/null ||
5857 error "pool_add failed"
5860 echo -n "Adding target to pool..."
5861 pool_add_targets $pool 0 0 1 &> /dev/null ||
5862 error "pool_add_targets failed"
5866 echo -n "Setting pool using -p option..."
5867 $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null ||
5868 error "migrate failed rc = $?"
5871 echo -n "Verifying test file is in pool after migrating..."
5872 [ "$($LFS getstripe -p $file1)" = $pool ] ||
5873 error "file was not migrated to pool $pool"
5876 echo -n "Removing test file from pool '$pool'..."
5877 $LFS migrate $file1 &> /dev/null ||
5878 error "cannot remove from pool"
5879 [ "$($LFS getstripe -p $file1)" ] &&
5880 error "pool still set"
5883 echo -n "Setting pool using --pool option..."
5884 $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null ||
5885 error "migrate failed rc = $?"
5890 if $create_pool; then
5891 destroy_test_pools 2> /dev/null ||
5892 error "destroy test pools failed"
5895 run_test 56wb "check lfs_migrate pool support"
5898 local file1="$DIR/$tdir/file1"
5900 echo -n "Creating test dir..."
5901 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5902 local def_stripe_size=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
5903 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
5904 error "cannot set stripe"
5907 echo -n "Setting initial stripe for test file..."
5908 $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
5909 error "cannot set stripe"
5910 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
5911 error "stripe size not set"
5914 # File currently set to -S 512K -c 1
5916 # Ensure -c and -S options are rejected when -R is set
5917 echo -n "Verifying incompatible options are detected..."
5918 $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null &&
5919 error "incompatible -c and -R options not detected"
5920 $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null &&
5921 error "incompatible -S and -R options not detected"
5924 # Ensure unrecognized options are passed through to 'lfs migrate'
5925 echo -n "Verifying -S option is passed through to lfs migrate..."
5926 $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
5927 error "migration failed"
5928 [ $($LFS getstripe -S "$file1") -eq 1048576 ] ||
5929 error "file was not restriped"
5932 # File currently set to -S 1M -c 1
5934 # Ensure long options are supported
5935 echo -n "Verifying long options supported..."
5936 $LFS_MIGRATE -y --non-block "$file1" &> /dev/null ||
5937 error "long option without argument not supported"
5938 $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
5939 error "long option with argument not supported"
5940 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
5941 error "file not restriped with --stripe-size option"
5944 # File currently set to -S 512K -c 1
5946 if [ "$OSTCOUNT" -gt 1 ]; then
5947 echo -n "Verifying explicit stripe count can be set..."
5948 $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
5949 error "migrate failed"
5950 [ $($LFS getstripe -c "$file1") -eq 2 ] ||
5951 error "file not restriped to explicit count"
5955 # File currently set to -S 512K -c 1 or -S 512K -c 2
5957 # Ensure parent striping is used if -R is set, and no stripe
5958 # count or size is specified
5959 echo -n "Setting stripe for parent directory..."
5960 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
5961 error "cannot set stripe"
5964 echo -n "Verifying restripe option uses parent stripe settings..."
5965 $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
5966 error "migrate failed"
5967 [ $($LFS getstripe -S "$file1") -eq $def_stripe_size ] ||
5968 error "file not restriped to parent settings"
5969 [ $($LFS getstripe -c "$file1") -eq 1 ] ||
5970 error "file not restriped to parent settings"
5973 # File currently set to -S 1M -c 1
5975 # Ensure striping is preserved if -R is not set, and no stripe
5976 # count or size is specified
5977 echo -n "Verifying striping size preserved when not specified..."
5978 local orig_stripe_size=$($LFS getstripe -S "$file1" 2>/dev/null)
5979 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5980 error "cannot set stripe on parent directory"
5981 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5982 error "migrate failed"
5983 [ $($LFS getstripe -S "$file1") -eq $orig_stripe_size ] ||
5984 error "file was restriped"
5987 # Ensure file name properly detected when final option has no argument
5988 echo -n "Verifying file name properly detected..."
5989 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5990 error "file name interpreted as option argument"
5996 run_test 56wc "check unrecognized options for lfs_migrate are passed through"
5999 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6001 local file1=$DIR/$tdir/file1
6003 echo -n "Creating test dir..."
6004 test_mkdir $DIR/$tdir || error "cannot create dir"
6007 echo -n "Creating test file..."
6011 # Ensure 'lfs migrate' will fail by using a non-existent option,
6012 # and make sure rsync is not called to recover
6013 echo -n "Make sure --no-rsync option works..."
6014 $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 |
6015 grep -q 'refusing to fall back to rsync' ||
6016 error "rsync was called with --no-rsync set"
6019 # Ensure rsync is called without trying 'lfs migrate' first
6020 echo -n "Make sure --rsync option works..."
6021 $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 |
6022 grep -q 'falling back to rsync' &&
6023 error "lfs migrate was called with --rsync set"
6026 echo -n "Make sure --rsync and --no-rsync options are exclusive..."
6027 $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 |
6028 grep -q 'at the same time' ||
6029 error "--rsync and --no-rsync accepted concurrently"
6035 run_test 56wd "check lfs_migrate --rsync and --no-rsync work"
6038 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6039 check_swap_layouts_support
6041 local dir=$DIR/$tdir
6042 local ref1=/etc/passwd
6043 local file1=$dir/file1
6045 test_mkdir $dir || error "creating dir $dir"
6046 $LFS setstripe -c 2 $file1
6048 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
6049 stripe=$($LFS getstripe -c $file1)
6050 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6051 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6056 run_test 56x "lfs migration support"
6059 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6060 check_swap_layouts_support
6062 local dir=$DIR/$tdir/$testnum
6066 local ref1=/etc/passwd
6067 local file1=$dir/file1
6069 $LFS setstripe -c 2 $file1
6071 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
6073 local stripe=$($LFS getstripe -c $file1)
6075 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6076 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6081 run_test 56xa "lfs migration --block support"
6083 check_migrate_links() {
6085 local file1="$dir/file1"
6088 local total_count=$(($begin + $count - 1))
6089 local symlink_count=10
6092 if [ ! -f "$file1" ]; then
6093 echo -n "creating initial file..."
6094 $LFS setstripe -c 1 -S "512k" "$file1" ||
6095 error "cannot setstripe initial file"
6098 echo -n "creating symlinks..."
6099 for s in $(seq 1 $symlink_count); do
6100 ln -s "$file1" "$dir/slink$s" ||
6101 error "cannot create symlinks"
6105 echo -n "creating nonlinked files..."
6106 createmany -o "$dir/uniq" 1 10 &> /dev/null ||
6107 error "cannot create nonlinked files"
6112 if [ ! -f "$dir/file$total_count" ]; then
6113 echo -n "creating hard links $begin:$total_count..."
6114 createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
6115 /dev/null || error "cannot create hard links"
6119 echo -n "checking number of hard links listed in xattrs..."
6120 local fid=$($LFS getstripe -F "$file1")
6121 local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
6124 if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
6125 skip "hard link list has unexpected size, skipping test"
6127 if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
6128 error "link names should exceed xattrs size"
6131 echo -n "migrating files..."
6132 local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir)
6134 [ $rc -eq 0 ] || error "migrate failed rc = $rc"
6137 # make sure all links have been properly migrated
6138 echo -n "verifying files..."
6139 fid=$($LFS getstripe -F "$file1") ||
6140 error "cannot get fid for file $file1"
6141 for i in $(seq 2 $total_count); do
6142 local fid2=$($LFS getstripe -F $dir/file$i)
6144 [ "$fid2" == "$fid" ] ||
6145 error "migrated hard link has mismatched FID"
6148 # make sure hard links were properly detected, and migration was
6149 # performed only once for the entire link set; nonlinked files should
6151 local actual=$(grep -c 'done migrate' <<< "$migrate_out")
6152 local expected=$(($uniq_count + 1))
6154 [ "$actual" -eq "$expected" ] ||
6155 error "hard links individually migrated ($actual != $expected)"
6157 # make sure the correct number of hard links are present
6158 local hardlinks=$(stat -c '%h' "$file1")
6160 [ $hardlinks -eq $total_count ] ||
6161 error "num hard links $hardlinks != $total_count"
6168 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
6169 skip "Need MDS version at least 2.10.55"
6171 local dir="$DIR/$tdir"
6173 test_mkdir "$dir" || error "cannot create dir $dir"
6175 echo "testing lfs migrate mode when all links fit within xattrs"
6176 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 2 99
6178 echo "testing rsync mode when all links fit within xattrs"
6179 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 2 99
6181 echo "testing lfs migrate mode when all links do not fit within xattrs"
6182 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100
6184 echo "testing rsync mode when all links do not fit within xattrs"
6185 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 101 100
6191 run_test 56xb "lfs migration hard link support"
6194 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6196 local dir="$DIR/$tdir"
6198 test_mkdir "$dir" || error "cannot create dir $dir"
6200 # Test 1: ensure file < 1 GB is always migrated with 1 stripe
6201 echo -n "Setting initial stripe for 20MB test file..."
6202 $LFS setstripe -c 2 -i 0 "$dir/20mb" || error "cannot setstripe"
6204 echo -n "Sizing 20MB test file..."
6205 truncate "$dir/20mb" 20971520 || error "cannot create 20MB test file"
6207 echo -n "Verifying small file autostripe count is 1..."
6208 $LFS_MIGRATE -y -A -C 1 "$dir/20mb" &> /dev/null ||
6209 error "cannot migrate 20MB file"
6210 local stripe_count=$($LFS getstripe -c "$dir/20mb") ||
6211 error "cannot get stripe for $dir/20mb"
6212 [ $stripe_count -eq 1 ] ||
6213 error "unexpected stripe count $stripe_count for 20MB file"
6217 # Test 2: File is small enough to fit within the available space on
6218 # sqrt(size_in_gb) + 1 OSTs but is larger than 1GB. The file must
6219 # have at least an additional 1KB for each desired stripe for test 3
6220 echo -n "Setting stripe for 1GB test file..."
6221 $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe"
6223 echo -n "Sizing 1GB test file..."
6224 # File size is 1GB + 3KB
6225 truncate "$dir/1gb" 1073744896 &> /dev/null ||
6226 error "cannot create 1GB test file"
6228 echo -n "Migrating 1GB file..."
6229 $LFS_MIGRATE -y -A -C 1 "$dir/1gb" &> /dev/null ||
6230 error "cannot migrate file"
6232 echo -n "Verifying autostripe count is sqrt(n) + 1..."
6233 stripe_count=$($LFS getstripe -c "$dir/1gb") ||
6234 error "cannot get stripe for $dir/1gb"
6235 [ $stripe_count -eq 2 ] ||
6236 error "unexpected stripe count $stripe_count (expected 2)"
6239 # Test 3: File is too large to fit within the available space on
6240 # sqrt(n) + 1 OSTs. Simulate limited available space with -X
6241 if [ $OSTCOUNT -ge 3 ]; then
6242 # The required available space is calculated as
6243 # file size (1GB + 3KB) / OST count (3).
6244 local kb_per_ost=349526
6246 echo -n "Migrating 1GB file..."
6247 $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" &>> \
6248 /dev/null || error "cannot migrate file"
6251 stripe_count=$($LFS getstripe -c "$dir/1gb")
6252 echo -n "Verifying autostripe count with limited space..."
6253 [ "$stripe_count" -a $stripe_count -eq 3 ] ||
6254 error "unexpected stripe count $stripe_count (wanted 3)"
6261 run_test 56xc "lfs migration autostripe"
6264 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
6265 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
6268 local dir=$DIR/$tdir
6272 test_mkdir -p $dir || error "creating dir $dir"
6273 touch $f1 || error "creating std file $f1"
6274 $MULTIOP $f2 H2c || error "creating released file $f2"
6276 # a directory can be raid0, so ask only for files
6277 res=$($LFS find $dir -L raid0 -type f | wc -l)
6278 [[ $res == 2 ]] || error "search raid0: found $res files != 2"
6280 res=$($LFS find $dir \! -L raid0 -type f | wc -l)
6281 [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
6283 # only files can be released, so no need to force file search
6284 res=$($LFS find $dir -L released)
6285 [[ $res == $f2 ]] || error "search released: found $res != $f2"
6287 res=$($LFS find $dir -type f \! -L released)
6288 [[ $res == $f1 ]] || error "search !released: found $res != $f1"
6290 run_test 56y "lfs find -L raid0|released"
6292 test_56z() { # LU-4824
6293 # This checks to make sure 'lfs find' continues after errors
6294 # There are two classes of errors that should be caught:
6295 # - If multiple paths are provided, all should be searched even if one
6297 # - If errors are encountered during the search, it should not terminate
6299 local dir=$DIR/$tdir
6303 for i in d{0..9}; do
6306 touch $dir/d{0..9}/$tfile
6307 $LFS find $DIR/non_existent_dir $dir &&
6308 error "$LFS find did not return an error"
6309 # Make a directory unsearchable. This should NOT be the last entry in
6310 # directory order. Arbitrarily pick the 6th entry
6311 chmod 700 $($LFS find $dir -type d | sed '6!d')
6313 local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l)
6315 # The user should be able to see 10 directories and 9 files
6316 [ $count == 19 ] || error "$LFS find did not continue after error"
6318 run_test 56z "lfs find should continue after an error"
6320 test_56aa() { # LU-5937
6321 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
6323 local dir=$DIR/$tdir
6326 $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
6328 createmany -o $dir/striped_dir/${tfile}- 1024
6329 local dirs=$($LFS find --size +8k $dir/)
6331 [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
6333 run_test 56aa "lfs find --size under striped dir"
6335 test_56ab() { # LU-10705
6336 test_mkdir $DIR/$tdir
6337 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
6338 dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
6339 dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
6340 # Flush writes to ensure valid blocks. Need to be more thorough for
6341 # ZFS, since blocks are not allocated/returned to client immediately.
6343 wait_zfs_commit ost1 2
6344 cancel_lru_locks osc
6347 local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
6349 [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
6351 files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
6352 [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
6354 rm -f $DIR/$tdir/$tfile.[123]
6356 run_test 56ab "lfs find --blocks"
6359 [ $MDS1_VERSION -lt $(version_code 2.10.50) ] &&
6360 skip "Need MDS version at least 2.10.50"
6362 # Create composite files with one component
6363 local dir=$DIR/$tdir
6365 setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
6366 # Create composite files with three components
6367 setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
6368 # Create non-composite files
6369 createmany -o $dir/${tfile}- 10
6371 local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l)
6373 [[ $nfiles == 10 ]] ||
6374 error "lfs find -E 1M found $nfiles != 10 files"
6376 nfiles=$($LFS find ! -E 1M --type f $dir | wc -l)
6377 [[ $nfiles == 25 ]] ||
6378 error "lfs find ! -E 1M found $nfiles != 25 files"
6380 # All files have a component that starts at 0
6381 nfiles=$($LFS find --component-start 0 --type f $dir | wc -l)
6382 [[ $nfiles == 35 ]] ||
6383 error "lfs find --component-start 0 - $nfiles != 35 files"
6385 nfiles=$($LFS find --component-start 2M --type f $dir | wc -l)
6386 [[ $nfiles == 15 ]] ||
6387 error "lfs find --component-start 2M - $nfiles != 15 files"
6389 # All files created here have a componenet that does not starts at 2M
6390 nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l)
6391 [[ $nfiles == 35 ]] ||
6392 error "lfs find ! --component-start 2M - $nfiles != 35 files"
6394 # Find files with a specified number of components
6395 local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l)
6396 [[ $nfiles == 15 ]] ||
6397 error "lfs find --component-count 3 - $nfiles != 15 files"
6399 # Remember non-composite files have a component count of zero
6400 local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l)
6401 [[ $nfiles == 10 ]] ||
6402 error "lfs find --component-count 0 - $nfiles != 10 files"
6404 nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l)
6405 [[ $nfiles == 20 ]] ||
6406 error "lfs find ! --component-count 3 - $nfiles != 20 files"
6408 # All files have a flag called "init"
6409 local nfiles=$($LFS find --component-flags init --type f $dir | wc -l)
6410 [[ $nfiles == 35 ]] ||
6411 error "lfs find --component-flags init - $nfiles != 35 files"
6413 # Multi-component files will have a component not initialized
6414 local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l)
6415 [[ $nfiles == 15 ]] ||
6416 error "lfs find !--component-flags init - $nfiles != 15 files"
6421 run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
6424 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
6425 skip "Need MDS version at least 2.10.57"
6435 # create mirrored directories and mirrored files
6436 mkdir $td || error "mkdir $td failed"
6437 $LFS mirror create -N3 $td || error "create mirrored dir $td failed"
6438 createmany -o $tf- 10 || error "create $tf- failed"
6440 for i in $(seq 2); do
6442 mkdir $dir || error "mkdir $dir failed"
6443 $LFS mirror create -N$((3 + i)) $dir ||
6444 error "create mirrored dir $dir failed"
6445 createmany -o $dir/$tfile- 10 ||
6446 error "create $dir/$tfile- failed"
6449 # change the states of some mirrored files
6451 for i in $(seq 2); do
6453 for j in $(seq 4 9); do
6454 echo foo > $dir/$tfile-$j
6458 # find mirrored files with specific mirror count
6459 cmd="$LFS find --mirror-count 3 --type f $td"
6460 nfiles=$($cmd | wc -l)
6461 [[ $nfiles = 10 ]] || error "$cmd: $nfiles != 10 files"
6463 cmd="$LFS find ! --mirror-count 3 --type f $td"
6464 nfiles=$($cmd | wc -l)
6465 [[ $nfiles = 20 ]] || error "$cmd: $nfiles != 20 files"
6467 cmd="$LFS find --mirror-count +2 --type f $td"
6468 nfiles=$($cmd | wc -l)
6469 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6471 cmd="$LFS find --mirror-count -6 --type f $td"
6472 nfiles=$($cmd | wc -l)
6473 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6475 # find mirrored files with specific file state
6476 cmd="$LFS find --maxdepth 1 --mirror-state=^ro --type f $td"
6477 [[ $($cmd) = $tf-6 ]] || error "$cmd: didn't return $tf-6"
6479 cmd="$LFS find --mirror-state=ro --type f $td"
6480 nfiles=$($cmd | wc -l)
6481 [[ $nfiles = 17 ]] || error "$cmd: $nfiles != 17 files"
6483 cmd="$LFS find ! --mirror-state=ro --type f $td"
6484 nfiles=$($cmd | wc -l)
6485 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6487 cmd="$LFS find --mirror-state=wp --type f $td"
6488 nfiles=$($cmd | wc -l)
6489 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6491 cmd="$LFS find ! --mirror-state=sp --type f $td"
6492 nfiles=$($cmd | wc -l)
6493 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6495 run_test 56ca "check lfs find --mirror-count|-N and --mirror-state"
6498 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6499 # note test will not do anything if MDS is not local
6500 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6501 skip_env "ldiskfs only test"
6503 remote_mds_nodsh && skip "remote MDS with nodsh"
6505 local MNTDEV="osd*.*MDT*.mntdev"
6506 DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV)
6507 [ -z "$DEV" ] && error "can't access $MNTDEV"
6508 for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
6509 do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
6510 error "can't access $DEV"
6511 DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
6512 [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
6516 run_test 57a "verify MDS filesystem created with large inodes =="
6519 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6520 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6521 skip_env "ldiskfs only test"
6523 remote_mds_nodsh && skip "remote MDS with nodsh"
6525 local dir=$DIR/$tdir
6528 local fileN=$dir/f$filecount
6530 rm -rf $dir || error "removing $dir"
6532 local mdtidx=$($LFS getstripe -m $dir)
6533 local mdtname=MDT$(printf %04x $mdtidx)
6534 local facet=mds$((mdtidx + 1))
6536 echo "mcreating $filecount files"
6537 createmany -m $dir/f 1 $filecount || error "creating files in $dir"
6539 # verify that files do not have EAs yet
6540 $LFS getstripe $file1 2>&1 | grep -q "no stripe" ||
6541 error "$file1 has an EA"
6542 $LFS getstripe $fileN 2>&1 | grep -q "no stripe" ||
6543 error "$fileN has an EA"
6547 df $dir #make sure we get new statfs data
6548 local mdsfree=$(do_facet $facet \
6549 lctl get_param -n osd*.*$mdtname.kbytesfree)
6550 local mdcfree=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6553 echo "opening files to create objects/EAs"
6554 for file in $(seq -f $dir/f%g 1 $filecount); do
6555 $OPENFILE -f O_RDWR $file > /dev/null 2>&1 ||
6556 error "opening $file"
6559 # verify that files have EAs now
6560 $LFS getstripe $file1 | grep -q "obdidx" || error "$file1 missing EA"
6561 $LFS getstripe $fileN | grep -q "obdidx" || error "$fileN missing EA"
6563 sleep 1 #make sure we get new statfs data
6565 local mdsfree2=$(do_facet $facet \
6566 lctl get_param -n osd*.*$mdtname.kbytesfree)
6567 local mdcfree2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6569 if [[ $mdcfree2 -lt $((mdcfree - 16)) ]]; then
6570 if [ "$mdsfree" != "$mdsfree2" ]; then
6571 error "MDC before $mdcfree != after $mdcfree2"
6573 echo "MDC before $mdcfree != after $mdcfree2"
6574 echo "unable to confirm if MDS has large inodes"
6579 run_test 57b "default LOV EAs are stored inside large inodes ==="
6582 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6583 [ -z "$(which wiretest 2>/dev/null)" ] &&
6584 skip_env "could not find wiretest"
6588 run_test 58 "verify cross-platform wire constants =============="
6591 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6593 echo "touch 130 files"
6594 createmany -o $DIR/f59- 130
6596 unlinkmany $DIR/f59- 130
6598 # wait for commitment of removal
6599 wait_delete_completed
6601 run_test 59 "verify cancellation of llog records async ========="
6603 TEST60_HEAD="test_60 run $RANDOM"
6605 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6606 remote_mgs_nodsh && skip "remote MGS with nodsh"
6607 do_facet mgs "! which run-llog.sh &> /dev/null" &&
6608 do_facet mgs "! ls run-llog.sh &> /dev/null" &&
6609 skip_env "missing subtest run-llog.sh"
6611 log "$TEST60_HEAD - from kernel mode"
6612 do_facet mgs "$LCTL dk > /dev/null"
6613 do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed"
6614 do_facet mgs $LCTL dk > $TMP/$tfile
6616 # LU-6388: test llog_reader
6617 local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
6618 llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
6619 [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
6620 skip_env "missing llog_reader"
6621 local fstype=$(facet_fstype mgs)
6622 [ $fstype != ldiskfs -a $fstype != zfs ] &&
6623 skip_env "Only for ldiskfs or zfs type mgs"
6625 local mntpt=$(facet_mntpt mgs)
6626 local mgsdev=$(mgsdevname 1)
6638 #get fid and record list
6639 fid_list=($(awk '/9_sub.*record/ { print $NF }' /$TMP/$tfile |
6641 rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' /$TMP/$tfile |
6643 #remount mgs as ldiskfs or zfs type
6644 stop mgs || error "stop mgs failed"
6645 mount_fstype mgs || error "remount mgs failed"
6646 for ((i = 0; i < ${#fid_list[@]}; i++)); do
6649 seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
6650 oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
6655 obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
6657 obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
6659 echo "obj_file is $obj_file"
6660 do_facet mgs $llog_reader $obj_file
6662 rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
6663 awk '{ print $3 }' | sed -e "s/^type=//g")
6664 if [ $rec_type != $rec ]; then
6665 echo "FAILED test_60a wrong record type $rec_type," \
6671 #check obj path if record type is LLOG_LOGID_MAGIC
6672 if [ "$rec" == "1064553b" ]; then
6673 path=$(do_facet mgs $llog_reader $obj_file |
6674 grep "path=" | awk '{ print $NF }' |
6675 sed -e "s/^path=//g")
6676 if [ $obj_file != $mntpt/$path ]; then
6677 echo "FAILED test_60a wrong obj path" \
6678 "$montpt/$path, should be $obj_file"
6685 #restart mgs before "error", otherwise it will block the next test
6686 stop mgs || error "stop mgs failed"
6687 start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
6688 $pass || error "test failed, see FAILED test_60a messages for specifics"
6690 run_test 60a "llog_test run from kernel module and test llog_reader"
6692 test_60b() { # bug 6411
6693 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6696 LLOG_COUNT=$(do_facet mgs dmesg |
6697 awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
6698 /llog_[a-z]*.c:[0-9]/ {
6710 [[ $LLOG_COUNT -gt 120 ]] &&
6711 error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
6713 run_test 60b "limit repeated messages from CERROR/CWARN"
6716 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6718 echo "create 5000 files"
6719 createmany -o $DIR/f60c- 5000
6720 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137
6721 lctl set_param fail_loc=0x80000137
6722 unlinkmany $DIR/f60c- 5000
6723 lctl set_param fail_loc=0
6725 run_test 60c "unlink file when mds full"
6728 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6730 SAVEPRINTK=$(lctl get_param -n printk)
6731 # verify "lctl mark" is even working"
6732 MESSAGE="test message ID $RANDOM $$"
6733 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6734 dmesg | grep -q "$MESSAGE" || error "didn't find debug marker in log"
6736 lctl set_param printk=0 || error "set lnet.printk failed"
6737 lctl get_param -n printk | grep emerg || error "lnet.printk dropped emerg"
6738 MESSAGE="new test message ID $RANDOM $$"
6739 # Assume here that libcfs_debug_mark_buffer() uses D_WARNING
6740 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6741 dmesg | grep -q "$MESSAGE" && error "D_WARNING wasn't masked" || true
6743 lctl set_param -n printk="$SAVEPRINTK"
6745 run_test 60d "test printk console message masking"
6748 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6749 remote_mds_nodsh && skip "remote MDS with nodsh"
6752 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
6753 do_facet mds1 lctl set_param fail_loc=0x15b
6756 run_test 60e "no space while new llog is being created"
6761 test_mkdir -c $MDSCOUNT $DIR/$tdir
6762 $LFS setdirstripe -D -i -1 -c $MDSCOUNT $DIR/$tdir
6767 mkdir $DIR/$tdir/subdir$index 2>/dev/null
6768 rmdir $DIR/$tdir/subdir$index 2>/dev/null
6769 index=$((index + 1))
6775 for i in $(seq 100); do
6776 # define OBD_FAIL_OSD_TXN_START 0x19a
6777 do_facet mds1 lctl set_param fail_loc=0x8000019a
6783 mkdir $DIR/$tdir/new || error "mkdir failed"
6784 rmdir $DIR/$tdir/new || error "rmdir failed"
6786 run_test 60g "transaction abort won't cause MDT hung"
6789 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6792 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1 || error "dd $f failed"
6793 cancel_lru_locks osc
6794 $MULTIOP $f OSMWUc || error "$MULTIOP $f failed"
6797 run_test 61a "mmap() writes don't make sync hang ================"
6800 mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
6802 run_test 61b "mmap() of unstriped file is successful"
6804 # bug 2330 - insufficient obd_match error checking causes LBUG
6806 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6810 cancel_lru_locks osc
6811 lctl set_param fail_loc=0x405
6812 cat $f && error "cat succeeded, expect -EIO"
6813 lctl set_param fail_loc=0
6815 # This test is now irrelevant (as of bug 10718 inclusion), we no longer
6816 # match every page all of the time.
6817 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
6819 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
6820 # Though this test is irrelevant anymore, it helped to reveal some
6821 # other grant bugs (LU-4482), let's keep it.
6822 test_63a() { # was test_63
6823 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6825 MAX_DIRTY_MB=$(lctl get_param -n osc.*.max_dirty_mb | head -n 1)
6827 for i in `seq 10` ; do
6828 dd if=/dev/zero of=$DIR/f63 bs=8k &
6834 rm -f $DIR/f63 || true
6836 run_test 63a "Verify oig_wait interruption does not crash ======="
6838 # bug 2248 - async write errors didn't return to application on sync
6839 # bug 3677 - async write errors left page locked
6841 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6844 lctl set_param debug=-1
6846 # ensure we have a grant to do async writes
6847 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
6850 sync # sync lest earlier test intercept the fail_loc
6852 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
6853 lctl set_param fail_loc=0x80000406
6854 $MULTIOP $DIR/$tfile Owy && \
6855 error "sync didn't return ENOMEM"
6856 sync; sleep 2; sync # do a real sync this time to flush page
6857 lctl get_param -n llite.*.dump_page_cache | grep locked && \
6858 error "locked page left in cache after async error" || true
6861 run_test 63b "async write errors should be returned to fsync ==="
6864 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6867 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
6869 run_test 64a "verify filter grant calculations (in kernel) ====="
6872 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6874 sh oos.sh $MOUNT || error "oos.sh failed: $?"
6876 run_test 64b "check out-of-space detection on client"
6879 $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
6881 run_test 64c "verify grant shrink"
6883 # this does exactly what osc_request.c:osc_announce_cached() does in
6884 # order to calculate max amount of grants to ask from server
6888 local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc)
6889 local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight)
6891 ((rpc_in_flight ++));
6892 nrpages=$((nrpages * rpc_in_flight))
6894 local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb)
6896 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
6898 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
6899 local undirty=$((nrpages * PAGE_SIZE))
6901 local max_extent_pages
6902 max_extent_pages=$($LCTL get_param osc.${tgt}.import |
6903 grep grant_max_extent_size | awk '{print $2}')
6904 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
6905 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
6906 local grant_extent_tax
6907 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
6908 grep grant_extent_tax | awk '{print $2}')
6910 undirty=$((undirty + nrextents * grant_extent_tax))
6915 # this is size of unit for grant allocation. It should be equal to
6916 # what tgt_grant.c:tgt_grant_chunk() calculates
6920 local grant_extent_tax
6922 max_brw_size=$($LCTL get_param osc.${tgt}.import |
6923 grep max_brw_size | awk '{print $2}')
6925 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
6926 grep grant_extent_tax | awk '{print $2}')
6928 echo $(((max_brw_size + grant_extent_tax) * 2))
6932 [ $OST1_VERSION -lt $(version_code 2.10.56) ] &&
6933 skip "OST < 2.10.55 doesn't limit grants enough"
6935 local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}')
6936 local file=$DIR/$tfile
6938 [[ $($LCTL get_param osc.${tgt}.import |
6939 grep "connect_flags:.*grant_param") ]] ||
6940 skip "no grant_param connect flag"
6942 local olddebug=$($LCTL get_param -n debug 2> /dev/null)
6944 $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true
6946 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
6947 stack_trap "rm -f $file" EXIT
6949 $SETSTRIPE $file -i 0 -c 1
6950 dd if=/dev/zero of=$file bs=1M count=1000 &
6955 local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes)
6956 if [[ $cur_grant -gt $max_cur_granted ]]
6959 error "cur_grant $cur_grant > $max_cur_granted"
6962 [[ $? -ne 0 ]] && break;
6967 wait_delete_completed
6968 $LCTL set_param debug="$olddebug" 2> /dev/null || true
6970 run_test 64d "check grant limit exceed"
6972 # bug 1414 - set/get directories' stripe info
6974 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6976 test_mkdir $DIR/$tdir
6978 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
6980 run_test 65a "directory with no stripe info"
6983 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6985 test_mkdir $DIR/$tdir
6986 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
6988 $SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
6991 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
6993 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
6996 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6997 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
6999 test_mkdir $DIR/$tdir
7000 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
7002 $LFS setstripe -S $((stripesize * 4)) -i 1 \
7003 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
7005 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
7007 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
7010 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7012 test_mkdir $DIR/$tdir
7013 local STRIPECOUNT=$($GETSTRIPE -c $DIR/$tdir)
7014 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7016 if [[ $STRIPECOUNT -le 0 ]]; then
7018 elif [[ $STRIPECOUNT -gt 2000 ]]; then
7019 #LOV_MAX_STRIPE_COUNT is 2000
7020 [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1))
7022 sc=$(($STRIPECOUNT - 1))
7024 $SETSTRIPE -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
7025 touch $DIR/$tdir/f4 $DIR/$tdir/f5
7026 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
7027 error "lverify failed"
7029 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
7032 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7034 test_mkdir $DIR/$tdir
7036 $SETSTRIPE $DIR/$tdir || error "setstripe"
7037 $GETSTRIPE -v $DIR/$tdir | grep "Default" ||
7038 error "no stripe info failed"
7040 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
7042 run_test 65e "directory setstripe defaults"
7045 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7047 test_mkdir $DIR/${tdir}f
7048 $RUNAS $SETSTRIPE $DIR/${tdir}f && error "setstripe succeeded" || true
7050 run_test 65f "dir setstripe permission (should return error) ==="
7053 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7055 test_mkdir $DIR/$tdir
7056 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7058 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7059 error "setstripe -S failed"
7060 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
7061 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7062 error "delete default stripe failed"
7064 run_test 65g "directory setstripe -d"
7067 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7069 test_mkdir $DIR/$tdir
7070 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7072 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7073 error "setstripe -S failed"
7074 test_mkdir $DIR/$tdir/dd1
7075 [ $($LFS getstripe -c $DIR/$tdir) = $($GETSTRIPE -c $DIR/$tdir/dd1) ] ||
7076 error "stripe info inherit failed"
7078 run_test 65h "directory stripe info inherit ===================="
7081 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7083 save_layout_restore_at_exit $MOUNT
7085 # bug6367: set non-default striping on root directory
7086 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
7088 # bug12836: getstripe on -1 default directory striping
7089 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
7091 # bug12836: getstripe -v on -1 default directory striping
7092 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
7094 # bug12836: new find on -1 default directory striping
7095 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
7097 run_test 65i "various tests to set root directory striping"
7099 test_65j() { # bug6367
7100 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7104 # if we aren't already remounting for each test, do so for this test
7105 if [ "$CLEANUP" = ":" -a "$I_MOUNTED" = "yes" ]; then
7106 cleanup || error "failed to unmount"
7110 save_layout_restore_at_exit $MOUNT
7112 $SETSTRIPE -d $MOUNT || error "setstripe failed"
7114 run_test 65j "set default striping on root directory (bug 6367)="
7118 wait_delete_completed
7119 do_facet $SINGLEMDS "lctl set_param -n \
7120 osp.$ost*MDT0000.max_create_count=$max_count"
7121 do_facet $SINGLEMDS "lctl set_param -n \
7122 osp.$ost*MDT0000.create_count=$count"
7123 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7124 echo $INACTIVE_OSC "is Activate"
7126 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7129 test_65k() { # bug11679
7130 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7131 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7132 remote_mds_nodsh && skip "remote MDS with nodsh"
7134 local disable_precreate=true
7135 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
7136 disable_precreate=false
7138 echo "Check OST status: "
7139 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
7140 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
7142 for OSC in $MDS_OSCS; do
7143 echo $OSC "is active"
7144 do_facet $SINGLEMDS lctl --device %$OSC activate
7147 for INACTIVE_OSC in $MDS_OSCS; do
7148 local ost=$(osc_to_ost $INACTIVE_OSC)
7149 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
7150 lov.*md*.target_obd |
7151 awk -F: /$ost/'{ print $1 }' | head -n 1)
7154 $SETSTRIPE -i $ostnum -c 1 $DIR/$tdir
7155 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
7157 echo "Deactivate: " $INACTIVE_OSC
7158 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
7160 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
7161 osp.$ost*MDT0000.create_count")
7162 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
7163 osp.$ost*MDT0000.max_create_count")
7164 $disable_precreate &&
7165 do_facet $SINGLEMDS "lctl set_param -n \
7166 osp.$ost*MDT0000.max_create_count=0"
7168 for idx in $(seq 0 $((OSTCOUNT - 1))); do
7169 [ -f $DIR/$tdir/$idx ] && continue
7170 echo "$SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx"
7171 $SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx ||
7173 error "setstripe $idx should succeed"; }
7174 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
7176 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
7179 do_facet $SINGLEMDS "lctl set_param -n \
7180 osp.$ost*MDT0000.max_create_count=$max_count"
7181 do_facet $SINGLEMDS "lctl set_param -n \
7182 osp.$ost*MDT0000.create_count=$count"
7183 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7184 echo $INACTIVE_OSC "is Activate"
7186 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7189 run_test 65k "validate manual striping works properly with deactivated OSCs"
7191 test_65l() { # bug 12836
7192 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7194 test_mkdir -p $DIR/$tdir/test_dir
7195 $SETSTRIPE -c -1 $DIR/$tdir/test_dir
7196 $LFS find -mtime -1 $DIR/$tdir >/dev/null
7198 run_test 65l "lfs find on -1 stripe dir ========================"
7201 local layout=$(save_layout $MOUNT)
7202 $RUNAS $SETSTRIPE -c 2 $MOUNT && {
7203 restore_layout $MOUNT $layout
7204 error "setstripe should fail by non-root users"
7208 run_test 65m "normal user can't set filesystem default stripe"
7211 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.0) ]] ||
7212 skip "Need MDS version at least 2.12.0"
7213 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7215 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7216 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7217 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7219 local root_layout=$(save_layout $MOUNT)
7220 stack_trap "restore_layout $MOUNT $root_layout" EXIT
7222 # new subdirectory under root directory should not inherit
7223 # the default layout from root
7224 local dir1=$MOUNT/$tdir-1
7225 mkdir $dir1 || error "mkdir $dir1 failed"
7226 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7227 error "$dir1 shouldn't have LOV EA"
7229 # delete the default layout on root directory
7230 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7232 local dir2=$MOUNT/$tdir-2
7233 mkdir $dir2 || error "mkdir $dir2 failed"
7234 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7235 error "$dir2 shouldn't have LOV EA"
7237 # set a new striping pattern on root directory
7238 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7239 local new_def_stripe_size=$((def_stripe_size * 2))
7240 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7241 error "set stripe size on $MOUNT failed"
7243 # new file created in $dir2 should inherit the new stripe size from
7244 # the filesystem default
7245 local file2=$dir2/$tfile-2
7246 touch $file2 || error "touch $file2 failed"
7248 local file2_stripe_size=$($LFS getstripe -S $file2)
7249 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7250 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7252 local dir3=$MOUNT/$tdir-3
7253 mkdir $dir3 || error "mkdir $dir3 failed"
7254 ! getfattr -n trusted.lov $dir3 &> /dev/null ||
7255 error "$dir3 shouldn't have LOV EA"
7257 # set OST pool on root directory
7258 local pool=$TESTNAME
7259 pool_add $pool || error "add $pool failed"
7260 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7261 error "add targets to $pool failed"
7263 $LFS setstripe -p $pool $MOUNT ||
7264 error "set OST pool on $MOUNT failed"
7266 # new file created in $dir3 should inherit the pool from
7267 # the filesystem default
7268 local file3=$dir3/$tfile-3
7269 touch $file3 || error "touch $file3 failed"
7271 local file3_pool=$($LFS getstripe -p $file3)
7272 [[ "$file3_pool" = "$pool" ]] ||
7273 error "$file3 didn't inherit OST pool $pool"
7275 local dir4=$MOUNT/$tdir-4
7276 mkdir $dir4 || error "mkdir $dir4 failed"
7277 ! getfattr -n trusted.lov $dir4 &> /dev/null ||
7278 error "$dir4 shouldn't have LOV EA"
7280 # new file created in $dir4 should inherit the pool from
7281 # the filesystem default
7282 local file4=$dir4/$tfile-4
7283 touch $file4 || error "touch $file4 failed"
7285 local file4_pool=$($LFS getstripe -p $file4)
7286 [[ "$file4_pool" = "$pool" ]] ||
7287 error "$file4 didn't inherit OST pool $pool"
7289 # new subdirectory under non-root directory should inherit
7290 # the default layout from its parent directory
7291 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7292 error "set directory layout on $dir4 failed"
7294 local dir5=$dir4/$tdir-5
7295 mkdir $dir5 || error "mkdir $dir5 failed"
7297 local dir4_layout=$(get_layout_param $dir4)
7298 local dir5_layout=$(get_layout_param $dir5)
7299 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7300 error "$dir5 should inherit the default layout from $dir4"
7302 # though subdir under ROOT doesn't inherit default layout, but
7303 # its sub dir/file should be created with default layout.
7304 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
7305 [[ $MDS1_VERSION -ge $(version_code 2.12.59) ]] ||
7306 [[ $MDS1_VERSION -ge $(version_code 2.12.3) &&
7307 $MDS1_VERSION -lt $(version_code 2.12.50) ]] ||
7308 skip "Need MDS version at least 2.12.3 or 2.12.59"
7310 local default_lmv_count=$($LFS getdirstripe -D -c $MOUNT)
7311 local default_lmv_index=$($LFS getdirstripe -D -i $MOUNT)
7312 local default_lmv_hash=$($LFS getdirstripe -D -H $MOUNT)
7314 if [ $default_lmv_hash == "none" ]; then
7315 stack_trap "$LFS setdirstripe -D -d $MOUNT" EXIT
7317 stack_trap "$LFS setdirstripe -D -i $default_lmv_index \
7318 -c $default_lmv_count -H $default_lmv_hash $MOUNT" EXIT
7321 $LFS setdirstripe -D -c 2 $MOUNT ||
7322 error "setdirstripe -D -c 2 failed"
7323 mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed"
7324 local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6)
7325 [ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count"
7327 run_test 65n "don't inherit default layout from root for new subdirectories"
7329 # bug 2543 - update blocks count on client
7331 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7334 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7335 sync; sync_all_data; sync; sync_all_data
7336 cancel_lru_locks osc
7337 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7338 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7340 run_test 66 "update inode blocks count on client ==============="
7343 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7347 swapon -s | awk '($1 == "'$1'") { print $4 }'
7350 # bug5265, obdfilter oa2dentry return -ENOENT
7351 # #define OBD_FAIL_SRV_ENOENT 0x217
7353 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7354 remote_ost_nodsh && skip "remote OST with nodsh"
7357 $SETSTRIPE -c 1 -i 0 $f
7359 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
7361 do_facet ost1 lctl set_param fail_loc=0x217
7362 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
7363 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
7365 do_facet ost1 lctl set_param fail_loc=0
7366 $DIRECTIO write $f 0 2 || error "write error"
7368 cancel_lru_locks osc
7369 $DIRECTIO read $f 0 1 || error "read error"
7371 do_facet ost1 lctl set_param fail_loc=0x217
7372 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
7374 do_facet ost1 lctl set_param fail_loc=0
7377 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
7380 test_mkdir $DIR/$tdir
7381 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
7382 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
7384 run_test 71 "Running dbench on lustre (don't segment fault) ===="
7386 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
7387 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7388 [ "$RUNAS_ID" = "$UID" ] &&
7389 skip_env "RUNAS_ID = UID = $UID -- skipping"
7390 # Check that testing environment is properly set up. Skip if not
7391 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
7392 skip_env "User $RUNAS_ID does not exist - skipping"
7395 chmod 777 $DIR/$tfile
7396 chmod ug+s $DIR/$tfile
7397 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
7398 error "$RUNAS dd $DIR/$tfile failed"
7399 # See if we are still setuid/sgid
7400 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7401 error "S/gid is not dropped on write"
7402 # Now test that MDS is updated too
7403 cancel_lru_locks mdc
7404 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7405 error "S/gid is not dropped on MDS"
7408 run_test 72a "Test that remove suid works properly (bug5695) ===="
7410 test_72b() { # bug 24226 -- keep mode setting when size is not changing
7413 [ "$RUNAS_ID" = "$UID" ] &&
7414 skip_env "RUNAS_ID = UID = $UID -- skipping"
7415 [ "$RUNAS_ID" -eq 0 ] &&
7416 skip_env "RUNAS_ID = 0 -- skipping"
7417 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7418 # Check that testing environment is properly set up. Skip if not
7419 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
7420 skip_env "User $RUNAS_ID does not exist - skipping"
7422 touch $DIR/${tfile}-f{g,u}
7423 test_mkdir $DIR/${tfile}-dg
7424 test_mkdir $DIR/${tfile}-du
7425 chmod 770 $DIR/${tfile}-{f,d}{g,u}
7426 chmod g+s $DIR/${tfile}-{f,d}g
7427 chmod u+s $DIR/${tfile}-{f,d}u
7428 for perm in 777 2777 4777; do
7429 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
7430 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
7431 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
7432 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
7436 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
7438 # bug 3462 - multiple simultaneous MDC requests
7440 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7442 test_mkdir $DIR/d73-1
7443 test_mkdir $DIR/d73-2
7444 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
7447 lctl set_param fail_loc=0x80000129
7448 $MULTIOP $DIR/d73-1/f73-2 Oc &
7450 lctl set_param fail_loc=0
7452 $MULTIOP $DIR/d73-2/f73-3 Oc &
7456 wait $pid1 || return 1
7460 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
7461 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
7462 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
7466 run_test 73 "multiple MDC requests (should not deadlock)"
7468 test_74a() { # bug 6149, 6184
7469 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7472 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7474 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7475 # will spin in a tight reconnection loop
7476 $LCTL set_param fail_loc=0x8000030e
7477 # get any lock that won't be difficult - lookup works.
7479 $LCTL set_param fail_loc=0
7483 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
7485 test_74b() { # bug 13310
7486 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7488 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7490 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7491 # will spin in a tight reconnection loop
7492 $LCTL set_param fail_loc=0x8000030e
7493 # get a "difficult" lock
7495 $LCTL set_param fail_loc=0
7499 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
7502 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7504 #define OBD_FAIL_LDLM_NEW_LOCK
7505 $LCTL set_param fail_loc=0x319
7506 touch $DIR/$tfile && error "touch successful"
7507 $LCTL set_param fail_loc=0
7510 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
7513 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
7516 test_76() { # Now for bug 20433, added originally in bug 1443
7517 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7519 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
7521 cancel_lru_locks osc
7522 BEFORE_INODES=$(num_inodes)
7523 echo "before inodes: $BEFORE_INODES"
7525 [ "$SLOW" = "no" ] && COUNT=100
7526 for i in $(seq $COUNT); do
7530 cancel_lru_locks osc
7531 AFTER_INODES=$(num_inodes)
7532 echo "after inodes: $AFTER_INODES"
7534 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
7536 AFTER_INODES=$(num_inodes)
7538 echo "wait $wait seconds inodes: $AFTER_INODES"
7539 if [ $wait -gt 30 ]; then
7540 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
7544 run_test 76 "confirm clients recycle inodes properly ===="
7550 # Note: in sptlrpc modes which enable its own bulk checksum, the
7551 # original crc32_le bulk checksum will be automatically disabled,
7552 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
7553 # will be checked by sptlrpc code against sptlrpc bulk checksum.
7554 # In this case set_checksums() will not be no-op, because sptlrpc
7555 # bulk checksum will be enabled all through the test.
7557 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
7558 lctl set_param -n osc.*.checksums $1
7562 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7563 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
7564 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7565 tr -d [] | head -n1)}
7568 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
7569 log "set checksum type to $1"
7572 F77_TMP=$TMP/f77-temp
7575 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
7576 error "error writing to $F77_TMP"
7579 test_77a() { # bug 10889
7580 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7581 $GSS && skip_env "could not run with gss"
7583 [ ! -f $F77_TMP ] && setup_f77
7585 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
7589 run_test 77a "normal checksum read/write operation"
7591 test_77b() { # bug 10889
7592 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7593 $GSS && skip_env "could not run with gss"
7595 [ ! -f $F77_TMP ] && setup_f77
7596 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7597 $LCTL set_param fail_loc=0x80000409
7600 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7601 error "dd error: $?"
7602 $LCTL set_param fail_loc=0
7604 for algo in $CKSUM_TYPES; do
7605 cancel_lru_locks osc
7606 set_checksum_type $algo
7607 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7608 $LCTL set_param fail_loc=0x80000408
7609 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
7610 $LCTL set_param fail_loc=0
7613 set_checksum_type $ORIG_CSUM_TYPE
7616 run_test 77b "checksum error on client write, read"
7621 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
7623 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
7624 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
7625 $check_ost && [ -n "$ost_file_prefix" ] &&
7626 do_facet ost1 rm -f ${ost_file_prefix}\*
7630 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7631 $GSS && skip_env "could not run with gss"
7632 remote_ost_nodsh && skip "remote OST with nodsh"
7635 local osc_file_prefix
7637 local check_ost=false
7638 local ost_file_prefix
7644 # ensure corruption will occur on first OSS/OST
7645 $LFS setstripe -i 0 $DIR/$tfile
7647 [ ! -f $F77_TMP ] && setup_f77
7648 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7649 error "dd write error: $?"
7650 fid=$($LFS path2fid $DIR/$tfile)
7652 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
7655 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
7656 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
7658 echo "OSS do not support bulk pages dump upon error"
7661 osc_file_prefix=$($LCTL get_param -n debug_path)
7662 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
7664 trap cleanup_77c EXIT
7667 # enable bulk pages dump upon error on Client
7668 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
7669 # enable bulk pages dump upon error on OSS
7671 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
7673 # flush Client cache to allow next read to reach OSS
7674 cancel_lru_locks osc
7676 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7677 $LCTL set_param fail_loc=0x80000408
7678 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
7679 $LCTL set_param fail_loc=0
7683 # check cksum dump on Client
7684 osc_file=$(ls ${osc_file_prefix}*)
7685 [ -n "$osc_file" ] || error "no checksum dump file on Client"
7686 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
7687 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
7688 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
7689 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
7691 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
7692 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7693 error "dump content does not match on Client"
7695 $check_ost || skip "No need to check cksum dump on OSS"
7697 # check cksum dump on OSS
7698 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
7699 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
7700 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
7701 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
7702 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7703 error "dump content does not match on OSS"
7707 run_test 77c "checksum error on client read with debug"
7709 test_77d() { # bug 10889
7710 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7711 $GSS && skip_env "could not run with gss"
7713 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7714 $LCTL set_param fail_loc=0x80000409
7716 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7717 error "direct write: rc=$?"
7718 $LCTL set_param fail_loc=0
7721 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7722 $LCTL set_param fail_loc=0x80000408
7724 cancel_lru_locks osc
7725 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7726 error "direct read: rc=$?"
7727 $LCTL set_param fail_loc=0
7730 run_test 77d "checksum error on OST direct write, read"
7732 test_77f() { # bug 10889
7733 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7734 $GSS && skip_env "could not run with gss"
7737 for algo in $CKSUM_TYPES; do
7738 cancel_lru_locks osc
7739 set_checksum_type $algo
7740 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7741 $LCTL set_param fail_loc=0x409
7742 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
7743 error "direct write succeeded"
7744 $LCTL set_param fail_loc=0
7746 set_checksum_type $ORIG_CSUM_TYPE
7749 run_test 77f "repeat checksum error on write (expect error)"
7751 test_77g() { # bug 10889
7752 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7753 $GSS && skip_env "could not run with gss"
7754 remote_ost_nodsh && skip "remote OST with nodsh"
7756 [ ! -f $F77_TMP ] && setup_f77
7758 local file=$DIR/$tfile
7759 stack_trap "rm -f $file" EXIT
7761 $SETSTRIPE -c 1 -i 0 $file
7762 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
7763 do_facet ost1 lctl set_param fail_loc=0x8000021a
7765 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
7766 error "write error: rc=$?"
7767 do_facet ost1 lctl set_param fail_loc=0
7770 cancel_lru_locks osc
7771 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
7772 do_facet ost1 lctl set_param fail_loc=0x8000021b
7774 cmp $F77_TMP $file || error "file compare failed"
7775 do_facet ost1 lctl set_param fail_loc=0
7778 run_test 77g "checksum error on OST write, read"
7780 test_77k() { # LU-10906
7781 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7782 $GSS && skip_env "could not run with gss"
7784 local cksum_param="osc.$FSNAME*.checksums"
7785 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
7789 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
7790 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
7791 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
7795 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
7796 error "failed to set checksum=$i on MGS"
7797 wait_update $HOSTNAME "$get_checksum" $i
7799 echo "remount client, checksum should be $i"
7800 remount_client $MOUNT || "failed to remount client"
7801 checksum=$(eval $get_checksum)
7802 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7805 for opt in "checksum" "nochecksum"; do
7806 #remount with mount option
7807 echo "remount client with option $opt, checksum should be $i"
7808 umount_client $MOUNT || "failed to umount client"
7809 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
7810 "failed to mount client with option '$opt'"
7811 checksum=$(eval $get_checksum)
7812 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7816 remount_client $MOUNT || "failed to remount client"
7818 run_test 77k "enable/disable checksum correctly"
7820 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
7829 test_78() { # bug 10901
7830 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7831 remote_ost || skip_env "local OST"
7834 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
7835 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
7836 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
7837 echo "MemTotal: $MEMTOTAL"
7839 # reserve 256MB of memory for the kernel and other running processes,
7840 # and then take 1/2 of the remaining memory for the read/write buffers.
7841 if [ $MEMTOTAL -gt 512 ] ;then
7842 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
7844 # for those poor memory-starved high-end clusters...
7845 MEMTOTAL=$((MEMTOTAL / 2))
7847 echo "Mem to use for directio: $MEMTOTAL"
7849 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
7850 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
7851 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
7852 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
7854 echo "Smallest OST: $SMALLESTOST"
7855 [[ $SMALLESTOST -lt 10240 ]] &&
7856 skip "too small OSTSIZE, useless to run large O_DIRECT test"
7858 trap cleanup_test_78 EXIT
7860 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
7861 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
7863 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
7864 echo "File size: $F78SIZE"
7865 $SETSTRIPE -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
7866 for i in $(seq 1 $NSEQ); do
7867 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
7868 echo directIO rdwr round $i of $NSEQ
7869 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
7874 run_test 78 "handle large O_DIRECT writes correctly ============"
7876 test_79() { # bug 12743
7877 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7879 wait_delete_completed
7881 BKTOTAL=$(calc_osc_kbytes kbytestotal)
7882 BKFREE=$(calc_osc_kbytes kbytesfree)
7883 BKAVAIL=$(calc_osc_kbytes kbytesavail)
7885 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
7886 DFTOTAL=`echo $STRING | cut -d, -f1`
7887 DFUSED=`echo $STRING | cut -d, -f2`
7888 DFAVAIL=`echo $STRING | cut -d, -f3`
7889 DFFREE=$(($DFTOTAL - $DFUSED))
7891 ALLOWANCE=$((64 * $OSTCOUNT))
7893 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
7894 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
7895 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
7897 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
7898 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
7899 error "df free($DFFREE) mismatch OST free($BKFREE)"
7901 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
7902 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
7903 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
7906 run_test 79 "df report consistency check ======================="
7908 test_80() { # bug 10718
7909 remote_ost_nodsh && skip "remote OST with nodsh"
7910 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7912 # relax strong synchronous semantics for slow backends like ZFS
7913 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
7914 local soc="obdfilter.*.sync_lock_cancel"
7915 local save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
7917 # "sync_on_lock_cancel" was broken by v2_11_55_0-26-g7059644e9a
7918 if [ -z "$save" ]; then
7919 soc="obdfilter.*.sync_on_lock_cancel"
7920 save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
7923 if [ "$save" != "never" ]; then
7924 local hosts=$(comma_list $(osts_nodes))
7926 do_nodes $hosts $LCTL set_param $soc=never
7927 stack_trap "do_nodes $hosts $LCTL set_param $soc=$save"
7931 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
7933 local before=$(date +%s)
7934 cancel_lru_locks osc
7935 local after=$(date +%s)
7936 local diff=$((after - before))
7937 [ $diff -le 1 ] || error "elapsed for 1M@1T = $diff"
7941 run_test 80 "Page eviction is equally fast at high offsets too"
7943 test_81a() { # LU-456
7944 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7945 remote_ost_nodsh && skip "remote OST with nodsh"
7947 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
7948 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
7949 do_facet ost1 lctl set_param fail_loc=0x80000228
7951 # write should trigger a retry and success
7952 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
7953 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
7955 if [ $RC -ne 0 ] ; then
7956 error "write should success, but failed for $RC"
7959 run_test 81a "OST should retry write when get -ENOSPC ==============="
7961 test_81b() { # LU-456
7962 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7963 remote_ost_nodsh && skip "remote OST with nodsh"
7965 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
7966 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
7967 do_facet ost1 lctl set_param fail_loc=0x228
7969 # write should retry several times and return -ENOSPC finally
7970 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
7971 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
7974 if [ $RC -ne $ENOSPC ] ; then
7975 error "dd should fail for -ENOSPC, but succeed."
7978 run_test 81b "OST should return -ENOSPC when retry still fails ======="
7980 test_82() { # LU-1031
7981 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
7985 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
7987 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
7989 kill -USR1 $MULTIPID2
7991 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
7992 error "First grouplock does not block second one"
7994 echo "Second grouplock blocks first one"
7996 kill -USR1 $MULTIPID1
8000 run_test 82 "Basic grouplock test"
8003 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
8005 test_mkdir $DIR/$tdir.cvsroot
8006 chown $RUNAS_ID $DIR/$tdir.cvsroot
8009 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
8012 # some versions of cvs import exit(1) when asked to import links or
8013 # files they can't read. ignore those files.
8014 local toignore=$(find . -type l -printf '-I %f\n' -o \
8015 ! -perm /4 -printf '-I %f\n')
8016 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
8017 $tdir.reposname vtag rtag
8020 test_mkdir $DIR/$tdir.reposname
8021 chown $RUNAS_ID $DIR/$tdir.reposname
8022 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
8024 cd $DIR/$tdir.reposname
8026 $RUNAS cvs add -m 'addmsg' foo99
8028 $RUNAS cvs commit -m 'nomsg' foo99
8029 rm -fr $DIR/$tdir.cvsroot
8031 run_test 99 "cvs strange file/directory operations"
8034 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8035 [[ "$NETTYPE" =~ tcp ]] ||
8036 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
8037 remote_ost_nodsh && skip "remote OST with nodsh"
8038 remote_mds_nodsh && skip "remote MDS with nodsh"
8040 skip "useless for local single node setup"
8042 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
8043 [ "$PROT" != "tcp" ] && continue
8044 RPORT=$(echo $REMOTE | cut -d: -f2)
8045 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
8048 LPORT=`echo $LOCAL | cut -d: -f2`
8049 if [ $LPORT -ge 1024 ]; then
8050 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
8052 error_exit "local: $LPORT > 1024, remote: $RPORT"
8055 [ "$rc" = 0 ] || error_exit "privileged port not found" )
8057 run_test 100 "check local port using privileged port ==========="
8059 function get_named_value()
8068 echo $line | sed "s/^$tag[ ]*//"
8075 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
8076 awk '/^max_cached_mb/ { print $2 }')
8079 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
8084 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8085 [ $MDSCOUNT -ge 2 ] && skip_env "needs < 2 MDTs" #LU-4322
8090 local cache_limit=32
8092 $LCTL set_param -n osc.*-osc*.rpc_stats 0
8093 trap cleanup_101a EXIT
8094 $LCTL set_param -n llite.*.read_ahead_stats 0
8095 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
8098 # randomly read 10000 of 64K chunks from file 3x 32MB in size
8100 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
8101 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
8104 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
8105 get_named_value 'read but discarded' | cut -d" " -f1); do
8106 discard=$(($discard + $s))
8110 if [[ $(($discard * 10)) -gt $nreads ]]; then
8111 $LCTL get_param osc.*-osc*.rpc_stats
8112 $LCTL get_param llite.*.read_ahead_stats
8113 error "too many ($discard) discarded pages"
8115 rm -f $DIR/$tfile || true
8117 run_test 101a "check read-ahead for random reads"
8120 test_mkdir $DIR/$tdir
8121 local STRIPE_SIZE=$1
8122 local FILE_LENGTH=$2
8125 local FILE_SIZE_MB=$((FILE_LENGTH / STRIPE_SIZE))
8127 local list=$(comma_list $(osts_nodes))
8128 set_osd_param $list '' read_cache_enable 0
8129 set_osd_param $list '' writethrough_cache_enable 0
8131 trap cleanup_test101bc EXIT
8132 # prepare the read-ahead file
8133 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
8135 dd if=/dev/zero of=$DIR/$tfile bs=$STRIPE_SIZE \
8136 count=$FILE_SIZE_MB 2> /dev/null
8140 cleanup_test101bc() {
8145 local list=$(comma_list $(osts_nodes))
8146 set_osd_param $list '' read_cache_enable 1
8147 set_osd_param $list '' writethrough_cache_enable 1
8151 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
8156 local STRIPE_SIZE=$2
8157 local FILE_LENGTH=$3
8158 local RA_INC=1048576
8159 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
8160 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
8161 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
8162 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
8163 get_named_value 'read but discarded' |
8164 cut -d" " -f1 | calc_total)
8165 if [[ $DISCARD -gt $discard_limit ]]; then
8166 $LCTL get_param llite.*.read_ahead_stats
8167 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
8169 echo "Read-ahead success for size ${READ_SIZE}"
8174 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8175 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8177 local STRIPE_SIZE=1048576
8178 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
8180 if [ $SLOW == "yes" ]; then
8181 local FILE_LENGTH=$((STRIDE_SIZE * 64))
8183 local FILE_LENGTH=$((STRIDE_SIZE * 8))
8186 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
8188 # prepare the read-ahead file
8189 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8190 cancel_lru_locks osc
8191 for BIDX in 2 4 8 16 32 64 128 256
8193 local BSIZE=$((BIDX*4096))
8194 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
8195 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
8196 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
8197 $LCTL set_param -n llite.*.read_ahead_stats 0
8198 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
8199 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
8200 cancel_lru_locks osc
8201 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
8206 run_test 101b "check stride-io mode read-ahead ================="
8209 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8211 local STRIPE_SIZE=1048576
8212 local FILE_LENGTH=$((STRIPE_SIZE*100))
8216 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8218 cancel_lru_locks osc
8219 $LCTL set_param osc.*.rpc_stats 0
8220 $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
8221 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8222 local stats=$($LCTL get_param -n $osc_rpc_stats)
8223 local lines=$(echo "$stats" | awk 'END {print NR;}')
8226 if [ $lines -le 20 ]; then
8229 for size in 1 2 4 8; do
8230 local rpc=$(echo "$stats" |
8231 awk '($1 == "'$size':") {print $2; exit; }')
8233 error "Small $((size*4))k read IO $rpc !"
8235 echo "$osc_rpc_stats check passed!"
8240 run_test 101c "check stripe_size aligned read-ahead ================="
8243 $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
8244 $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
8248 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8250 local file=$DIR/$tfile
8251 local sz_MB=${FILESIZE_101d:-500}
8252 local ra_MB=${READAHEAD_MB:-40}
8254 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8255 [ $free_MB -lt $sz_MB ] &&
8256 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8258 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8259 $SETSTRIPE -c -1 $file || error "setstripe failed"
8261 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8262 echo Cancel LRU locks on lustre client to flush the client cache
8263 cancel_lru_locks osc
8265 echo Disable read-ahead
8266 local old_READAHEAD=$(set_read_ahead 0)
8268 echo Reading the test file $file with read-ahead disabled
8269 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8271 echo Cancel LRU locks on lustre client to flush the client cache
8272 cancel_lru_locks osc
8273 echo Enable read-ahead with ${ra_MB}MB
8274 set_read_ahead $ra_MB
8276 echo Reading the test file $file with read-ahead enabled
8277 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8279 echo "read-ahead disabled time read $raOFF"
8280 echo "read-ahead enabled time read $raON"
8282 set_read_ahead $old_READAHEAD
8284 wait_delete_completed
8286 [ $raOFF -le 1 -o $raON -lt $raOFF ] ||
8287 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8289 run_test 101d "file read with and without read-ahead enabled"
8292 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8294 local file=$DIR/$tfile
8295 local size_KB=500 #KB
8299 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8300 local need_KB=$((count * size_KB))
8301 [[ $free_KB -le $need_KB ]] &&
8302 skip_env "Need free space $need_KB, have $free_KB"
8304 echo "Creating $count ${size_KB}K test files"
8305 for ((i = 0; i < $count; i++)); do
8306 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8309 echo "Cancel LRU locks on lustre client to flush the client cache"
8310 cancel_lru_locks $OSC
8312 echo "Reset readahead stats"
8313 $LCTL set_param -n llite.*.read_ahead_stats 0
8315 for ((i = 0; i < $count; i++)); do
8316 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
8319 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8320 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8322 for ((i = 0; i < $count; i++)); do
8323 rm -rf $file.$i 2>/dev/null
8326 #10000 means 20% reads are missing in readahead
8327 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
8329 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
8332 which iozone || skip_env "no iozone installed"
8334 local old_debug=$($LCTL get_param debug)
8335 old_debug=${old_debug#*=}
8336 $LCTL set_param debug="reada mmap"
8338 # create a test file
8339 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
8341 echo Cancel LRU locks on lustre client to flush the client cache
8342 cancel_lru_locks osc
8344 echo Reset readahead stats
8345 $LCTL set_param -n llite.*.read_ahead_stats 0
8347 echo mmap read the file with small block size
8348 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
8351 echo checking missing pages
8352 $LCTL get_param llite.*.read_ahead_stats
8353 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8354 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8356 $LCTL set_param debug="$old_debug"
8357 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
8360 run_test 101f "check mmap read performance"
8362 test_101g_brw_size_test() {
8364 local pages=$((mb * 1048576 / PAGE_SIZE))
8365 local file=$DIR/$tfile
8367 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
8368 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
8369 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
8370 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
8374 stack_trap "rm -f $file" EXIT
8375 $LCTL set_param -n osc.*.rpc_stats=0
8377 # 10 RPCs should be enough for the test
8379 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
8380 { error "dd write ${mb} MB blocks failed"; return 3; }
8381 cancel_lru_locks osc
8382 dd of=/dev/null if=$file bs=${mb}M count=$count ||
8383 { error "dd write ${mb} MB blocks failed"; return 4; }
8385 # calculate number of full-sized read and write RPCs
8386 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
8387 sed -n '/pages per rpc/,/^$/p' |
8388 awk '/'$pages':/ { reads += $2; writes += $6 }; \
8389 END { print reads,writes }'))
8390 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
8392 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
8399 remote_ost_nodsh && skip "remote OST with nodsh"
8402 local osts=$(get_facets OST)
8403 local list=$(comma_list $(osts_nodes))
8404 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
8405 local brw_size="obdfilter.*.brw_size"
8407 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8409 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
8410 if [ $OST1_VERSION -ge $(version_code 2.8.52) -o \
8411 \( $OST1_VERSION -ge $(version_code 2.7.17) -a \
8412 $OST1_VERSION -lt $(version_code 2.7.50) \) ] &&
8413 [ $CLIENT_VERSION -ge $(version_code 2.8.52) -o \
8414 \( $CLIENT_VERSION -ge $(version_code 2.7.17) -a \
8415 $CLIENT_VERSION -lt $(version_code 2.7.50) \) ]; then
8416 [ $OST1_VERSION -ge $(version_code 2.9.52) ] && suffix="M"
8417 if [[ $orig_mb -lt 16 ]]; then
8418 save_lustre_params $osts "$brw_size" > $p
8419 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
8420 error "set 16MB RPC size failed"
8422 echo "remount client to enable new RPC size"
8423 remount_client $MOUNT || error "remount_client failed"
8426 test_101g_brw_size_test 16 || error "16MB RPC test failed"
8427 # should be able to set brw_size=12, but no rpc_stats for that
8428 test_101g_brw_size_test 8 || error "8MB RPC test failed"
8431 test_101g_brw_size_test 4 || error "4MB RPC test failed"
8433 if [[ $orig_mb -lt 16 ]]; then
8434 restore_lustre_params < $p
8435 remount_client $MOUNT || error "remount_client restore failed"
8438 rm -f $p $DIR/$tfile
8440 run_test 101g "Big bulk(4/16 MiB) readahead"
8443 test_mkdir $DIR/$tdir
8444 chown $RUNAS_ID $DIR/$tdir
8447 STRIPE_COUNT=$OSTCOUNT
8448 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
8450 trap cleanup_test102 EXIT
8452 $1 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
8454 for num in 1 2 3 4; do
8455 for count in $(seq 1 $STRIPE_COUNT); do
8456 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
8457 local size=`expr $STRIPE_SIZE \* $num`
8458 local file=file"$num-$idx-$count"
8459 $1 $SETSTRIPE -S $size -i $idx -c $count $file
8465 $1 tar cf $TMP/f102.tar $tdir --xattrs
8471 rm -rf $DIR/d0.sanity/d102
8475 [ "$UID" != 0 ] && skip "must run as root"
8476 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
8477 skip_env "must have user_xattr"
8479 [ -z "$(which setfattr 2>/dev/null)" ] &&
8480 skip_env "could not find setfattr"
8482 local testfile=$DIR/$tfile
8485 echo "set/get xattr..."
8486 setfattr -n trusted.name1 -v value1 $testfile ||
8487 error "setfattr -n trusted.name1=value1 $testfile failed"
8488 getfattr -n trusted.name1 $testfile 2> /dev/null |
8489 grep "trusted.name1=.value1" ||
8490 error "$testfile missing trusted.name1=value1"
8492 setfattr -n user.author1 -v author1 $testfile ||
8493 error "setfattr -n user.author1=author1 $testfile failed"
8494 getfattr -n user.author1 $testfile 2> /dev/null |
8495 grep "user.author1=.author1" ||
8496 error "$testfile missing trusted.author1=author1"
8499 setfattr -n trusted.name2 -v value2 $testfile ||
8500 error "$testfile unable to set trusted.name2"
8501 setfattr -n trusted.name3 -v value3 $testfile ||
8502 error "$testfile unable to set trusted.name3"
8503 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
8504 grep "trusted.name" | wc -l) -eq 3 ] ||
8505 error "$testfile missing 3 trusted.name xattrs"
8507 setfattr -n user.author2 -v author2 $testfile ||
8508 error "$testfile unable to set user.author2"
8509 setfattr -n user.author3 -v author3 $testfile ||
8510 error "$testfile unable to set user.author3"
8511 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
8512 grep "user.author" | wc -l) -eq 3 ] ||
8513 error "$testfile missing 3 user.author xattrs"
8515 echo "remove xattr..."
8516 setfattr -x trusted.name1 $testfile ||
8517 error "$testfile error deleting trusted.name1"
8518 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
8519 error "$testfile did not delete trusted.name1 xattr"
8521 setfattr -x user.author1 $testfile ||
8522 error "$testfile error deleting user.author1"
8523 echo "set lustre special xattr ..."
8524 $LFS setstripe -c1 $testfile
8525 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
8526 awk -F "=" '/trusted.lov/ { print $2 }' )
8527 setfattr -n "trusted.lov" -v $lovea $testfile ||
8528 error "$testfile doesn't ignore setting trusted.lov again"
8529 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
8530 error "$testfile allow setting invalid trusted.lov"
8533 run_test 102a "user xattr test =================================="
8536 [ -z "$(which setfattr 2>/dev/null)" ] &&
8537 skip_env "could not find setfattr"
8538 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8540 # b10930: get/set/list trusted.lov xattr
8541 echo "get/set/list trusted.lov xattr ..."
8542 local testfile=$DIR/$tfile
8543 $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8544 error "setstripe failed"
8545 local STRIPECOUNT=$($GETSTRIPE -c $testfile) ||
8546 error "getstripe failed"
8547 getfattr -d -m "^trusted" $testfile 2>/dev/null | grep "trusted.lov" ||
8548 error "can't get trusted.lov from $testfile"
8550 local testfile2=${testfile}2
8551 local value=$(getfattr -n trusted.lov $testfile 2>/dev/null |
8552 grep "trusted.lov" | sed -e 's/[^=]\+=//')
8555 setfattr -n trusted.lov -v $value $testfile2
8556 local stripe_size=$($GETSTRIPE -S $testfile2)
8557 local stripe_count=$($GETSTRIPE -c $testfile2)
8558 [[ $stripe_size -eq 65536 ]] ||
8559 error "stripe size $stripe_size != 65536"
8560 [[ $stripe_count -eq $STRIPECOUNT ]] ||
8561 error "stripe count $stripe_count != $STRIPECOUNT"
8564 run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
8567 [ -z "$(which setfattr 2>/dev/null)" ] &&
8568 skip_env "could not find setfattr"
8569 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8571 # b10930: get/set/list lustre.lov xattr
8572 echo "get/set/list lustre.lov xattr ..."
8573 test_mkdir $DIR/$tdir
8574 chown $RUNAS_ID $DIR/$tdir
8575 local testfile=$DIR/$tdir/$tfile
8576 $RUNAS $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8577 error "setstripe failed"
8578 local STRIPECOUNT=$($RUNAS $GETSTRIPE -c $testfile) ||
8579 error "getstripe failed"
8580 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
8581 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
8583 local testfile2=${testfile}2
8584 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
8585 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
8587 $RUNAS $MCREATE $testfile2
8588 $RUNAS setfattr -n lustre.lov -v $value $testfile2
8589 local stripe_size=$($RUNAS $GETSTRIPE -S $testfile2)
8590 local stripe_count=$($RUNAS $GETSTRIPE -c $testfile2)
8591 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
8592 [ $stripe_count -eq $STRIPECOUNT ] ||
8593 error "stripe count $stripe_count != $STRIPECOUNT"
8595 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
8597 compare_stripe_info1() {
8598 local stripe_index_all_zero=true
8600 for num in 1 2 3 4; do
8601 for count in $(seq 1 $STRIPE_COUNT); do
8602 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
8603 local size=$((STRIPE_SIZE * num))
8604 local file=file"$num-$offset-$count"
8605 stripe_size=$($LFS getstripe -S $PWD/$file)
8606 [[ $stripe_size -ne $size ]] &&
8607 error "$file: size $stripe_size != $size"
8608 stripe_count=$($LFS getstripe -c $PWD/$file)
8609 # allow fewer stripes to be created, ORI-601
8610 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
8611 error "$file: count $stripe_count != $count"
8612 stripe_index=$($LFS getstripe -i $PWD/$file)
8613 [[ $stripe_index -ne 0 ]] &&
8614 stripe_index_all_zero=false
8618 $stripe_index_all_zero &&
8619 error "all files are being extracted starting from OST index 0"
8623 have_xattrs_include() {
8624 tar --help | grep -q xattrs-include &&
8625 echo --xattrs-include="lustre.*"
8629 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8630 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8632 XINC=$(have_xattrs_include)
8634 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8636 compare_stripe_info1
8638 run_test 102d "tar restore stripe info from tarfile,not keep osts"
8641 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8642 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8644 XINC=$(have_xattrs_include)
8646 test_mkdir $DIR/$tdir.restore
8648 tar cf - --xattrs $tdir | tar xf - \
8649 -C $DIR/$tdir.restore --xattrs $XINC
8650 cd $DIR/$tdir.restore/$tdir
8651 compare_stripe_info1
8653 run_test 102f "tar copy files, not keep osts"
8656 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
8657 skip "must have user_xattr"
8658 [ -z "$(which setfattr 2>/dev/null)" ] &&
8659 skip_env "could not find setfattr"
8660 [ -z "$(which getfattr 2>/dev/null)" ] &&
8661 skip_env "could not find getfattr"
8663 local xsize=${1:-1024} # in bytes
8664 local file=$DIR/$tfile
8665 local value="$(generate_string $xsize)"
8666 local xbig=trusted.big
8669 log "save $xbig on $file"
8670 setfattr -n $xbig -v $value $file ||
8671 error "saving $xbig on $file failed"
8673 local orig=$(get_xattr_value $xbig $file)
8674 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
8676 local xsml=trusted.sml
8677 log "save $xsml on $file"
8678 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
8680 local new=$(get_xattr_value $xbig $file)
8681 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
8683 log "grow $xsml on $file"
8684 setfattr -n $xsml -v "$value" $file ||
8685 error "growing $xsml on $file failed"
8687 new=$(get_xattr_value $xbig $file)
8688 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
8689 log "$xbig still valid after growing $xsml"
8694 test_102h() { # bug 15777
8697 run_test 102h "grow xattr from inside inode to external block"
8700 large_xattr_enabled || skip_env "ea_inode feature disabled"
8702 grow_xattr $(max_xattr_size)
8704 run_test 102ha "grow xattr from inside inode to external inode"
8706 test_102i() { # bug 17038
8707 [ -z "$(which getfattr 2>/dev/null)" ] &&
8708 skip "could not find getfattr"
8711 ln -s $DIR/$tfile $DIR/${tfile}link
8712 getfattr -n trusted.lov $DIR/$tfile ||
8713 error "lgetxattr on $DIR/$tfile failed"
8714 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
8715 grep -i "no such attr" ||
8716 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
8717 rm -f $DIR/$tfile $DIR/${tfile}link
8719 run_test 102i "lgetxattr test on symbolic link ============"
8722 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8723 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8725 XINC=$(have_xattrs_include)
8726 setup_test102 "$RUNAS"
8727 chown $RUNAS_ID $DIR/$tdir
8728 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8730 compare_stripe_info1 "$RUNAS"
8732 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
8735 [ -z "$(which setfattr 2>/dev/null)" ] &&
8736 skip "could not find setfattr"
8739 # b22187 just check that does not crash for regular file.
8740 setfattr -n trusted.lov $DIR/$tfile
8741 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
8742 local test_kdir=$DIR/$tdir
8743 test_mkdir $test_kdir
8744 local default_size=$($LFS getstripe -S $test_kdir)
8745 local default_count=$($LFS getstripe -c $test_kdir)
8746 local default_offset=$($LFS getstripe -i $test_kdir)
8747 $SETSTRIPE -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
8748 error 'dir setstripe failed'
8749 setfattr -n trusted.lov $test_kdir
8750 local stripe_size=$($LFS getstripe -S $test_kdir)
8751 local stripe_count=$($LFS getstripe -c $test_kdir)
8752 local stripe_offset=$($LFS getstripe -i $test_kdir)
8753 [ $stripe_size -eq $default_size ] ||
8754 error "stripe size $stripe_size != $default_size"
8755 [ $stripe_count -eq $default_count ] ||
8756 error "stripe count $stripe_count != $default_count"
8757 [ $stripe_offset -eq $default_offset ] ||
8758 error "stripe offset $stripe_offset != $default_offset"
8759 rm -rf $DIR/$tfile $test_kdir
8761 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
8764 [ -z "$(which getfattr 2>/dev/null)" ] &&
8765 skip "could not find getfattr"
8767 # LU-532 trusted. xattr is invisible to non-root
8768 local testfile=$DIR/$tfile
8772 echo "listxattr as user..."
8773 chown $RUNAS_ID $testfile
8774 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
8775 grep -q "trusted" &&
8776 error "$testfile trusted xattrs are user visible"
8780 run_test 102l "listxattr size test =================================="
8782 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
8783 local path=$DIR/$tfile
8786 listxattr_size_check $path || error "listattr_size_check $path failed"
8788 run_test 102m "Ensure listxattr fails on small bufffer ========"
8792 getxattr() { # getxattr path name
8793 # Return the base64 encoding of the value of xattr name on path.
8797 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
8799 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8801 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8803 getfattr --absolute-names --encoding=base64 --name=$name $path |
8804 awk -F= -v name=$name '$1 == name {
8805 print substr($0, index($0, "=") + 1);
8809 test_102n() { # LU-4101 mdt: protect internal xattrs
8810 [ -z "$(which setfattr 2>/dev/null)" ] &&
8811 skip "could not find setfattr"
8812 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
8814 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
8817 local file0=$DIR/$tfile.0
8818 local file1=$DIR/$tfile.1
8819 local xattr0=$TMP/$tfile.0
8820 local xattr1=$TMP/$tfile.1
8821 local namelist="lov lma lmv link fid version som hsm"
8825 rm -rf $file0 $file1 $xattr0 $xattr1
8828 # Get 'before' xattrs of $file1.
8829 getfattr --absolute-names --dump --match=- $file1 > $xattr0
8831 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
8832 namelist+=" lfsck_namespace"
8833 for name in $namelist; do
8834 # Try to copy xattr from $file0 to $file1.
8835 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8837 setfattr --name=trusted.$name --value="$value" $file1 ||
8838 error "setxattr 'trusted.$name' failed"
8840 # Try to set a garbage xattr.
8841 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8843 if [[ x$name == "xlov" ]]; then
8844 setfattr --name=trusted.lov --value="$value" $file1 &&
8845 error "setxattr invalid 'trusted.lov' success"
8847 setfattr --name=trusted.$name --value="$value" $file1 ||
8848 error "setxattr invalid 'trusted.$name' failed"
8851 # Try to remove the xattr from $file1. We don't care if this
8852 # appears to succeed or fail, we just don't want there to be
8853 # any changes or crashes.
8854 setfattr --remove=$trusted.$name $file1 2> /dev/null
8857 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
8860 # Try to copy xattr from $file0 to $file1.
8861 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8863 setfattr --name=trusted.$name --value="$value" $file1 ||
8864 error "setxattr 'trusted.$name' failed"
8866 # Try to set a garbage xattr.
8867 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8869 setfattr --name=trusted.$name --value="$value" $file1 ||
8870 error "setxattr 'trusted.$name' failed"
8872 # Try to remove the xattr from $file1. We don't care if this
8873 # appears to succeed or fail, we just don't want there to be
8874 # any changes or crashes.
8875 setfattr --remove=$trusted.$name $file1 2> /dev/null
8878 # Get 'after' xattrs of file1.
8879 getfattr --absolute-names --dump --match=- $file1 > $xattr1
8881 if ! diff $xattr0 $xattr1; then
8882 error "before and after xattrs of '$file1' differ"
8885 rm -rf $file0 $file1 $xattr0 $xattr1
8889 run_test 102n "silently ignore setxattr on internal trusted xattrs"
8891 test_102p() { # LU-4703 setxattr did not check ownership
8892 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
8893 skip "MDS needs to be at least 2.5.56"
8895 local testfile=$DIR/$tfile
8899 echo "setfacl as user..."
8900 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
8901 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
8903 echo "setfattr as user..."
8904 setfacl -m "u:$RUNAS_ID:---" $testfile
8905 $RUNAS setfattr -x system.posix_acl_access $testfile
8906 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
8908 run_test 102p "check setxattr(2) correctly fails without permission"
8911 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
8912 skip "MDS needs to be at least 2.6.92"
8914 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
8916 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
8919 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
8920 skip "MDS needs to be at least 2.6.93"
8922 touch $DIR/$tfile || error "touch"
8923 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
8924 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
8925 rm $DIR/$tfile || error "rm"
8928 mkdir -p $DIR/$tdir || error "mkdir"
8929 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
8930 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
8931 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
8932 error "$testfile error deleting user.author1"
8933 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
8934 grep "user.$(basename $tdir)" &&
8935 error "$tdir did not delete user.$(basename $tdir)"
8936 rmdir $DIR/$tdir || error "rmdir"
8939 test_mkdir $DIR/$tdir
8940 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
8941 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
8942 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
8943 error "$testfile error deleting user.author1"
8944 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
8945 grep "user.$(basename $tdir)" &&
8946 error "$tdir did not delete user.$(basename $tdir)"
8947 rmdir $DIR/$tdir || error "rm striped dir"
8949 run_test 102r "set EAs with empty values"
8952 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
8953 skip "MDS needs to be at least 2.11.52"
8955 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
8957 save_lustre_params client "llite.*.xattr_cache" > $save
8959 for cache in 0 1; do
8960 lctl set_param llite.*.xattr_cache=$cache
8963 touch $DIR/$tfile || error "touch"
8964 for prefix in lustre security system trusted user; do
8965 # Note getxattr() may fail with 'Operation not
8966 # supported' or 'No such attribute' depending
8967 # on prefix and cache.
8968 getfattr -n $prefix.n102s $DIR/$tfile &&
8969 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
8973 restore_lustre_params < $save
8975 run_test 102s "getting nonexistent xattrs should fail"
8978 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
8979 skip "MDS needs to be at least 2.11.52"
8981 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
8983 save_lustre_params client "llite.*.xattr_cache" > $save
8985 for cache in 0 1; do
8986 lctl set_param llite.*.xattr_cache=$cache
8988 for buf_size in 0 256; do
8990 touch $DIR/$tfile || error "touch"
8991 setfattr -n user.multiop $DIR/$tfile
8992 $MULTIOP $DIR/$tfile oa$buf_size ||
8993 error "cannot get zero length xattr value (buf_size = $buf_size)"
8997 restore_lustre_params < $save
8999 run_test 102t "zero length xattr values handled correctly"
9003 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
9008 [ "$UID" != 0 ] && skip "must run as root"
9009 $GSS && skip_env "could not run under gss"
9010 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
9011 skip_env "must have acl enabled"
9012 [ -z "$(which setfacl 2>/dev/null)" ] &&
9013 skip_env "could not find setfacl"
9014 remote_mds_nodsh && skip "remote MDS with nodsh"
9016 gpasswd -a daemon bin # LU-5641
9017 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
9019 declare -a identity_old
9021 for num in $(seq $MDSCOUNT); do
9022 switch_identity $num true || identity_old[$num]=$?
9030 echo "performing cp ..."
9031 run_acl_subtest cp || error "run_acl_subtest cp failed"
9032 echo "performing getfacl-noacl..."
9033 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
9034 echo "performing misc..."
9035 run_acl_subtest misc || error "misc test failed"
9036 echo "performing permissions..."
9037 run_acl_subtest permissions || error "permissions failed"
9038 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
9039 if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] ||
9040 { [ $MDS1_VERSION -lt $(version_code 2.6) ] &&
9041 [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; }
9043 echo "performing permissions xattr..."
9044 run_acl_subtest permissions_xattr ||
9045 error "permissions_xattr failed"
9047 echo "performing setfacl..."
9048 run_acl_subtest setfacl || error "setfacl test failed"
9050 # inheritance test got from HP
9051 echo "performing inheritance..."
9052 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
9053 chmod +x make-tree || error "chmod +x failed"
9054 run_acl_subtest inheritance || error "inheritance test failed"
9057 echo "LU-974 ignore umask when acl is enabled..."
9058 run_acl_subtest 974 || error "LU-974 umask test failed"
9059 if [ $MDSCOUNT -ge 2 ]; then
9060 run_acl_subtest 974_remote ||
9061 error "LU-974 umask test failed under remote dir"
9064 echo "LU-2561 newly created file is same size as directory..."
9065 if [ "$mds1_FSTYPE" != "zfs" ]; then
9066 run_acl_subtest 2561 || error "LU-2561 test failed"
9068 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
9071 run_acl_subtest 4924 || error "LU-4924 test failed"
9076 for num in $(seq $MDSCOUNT); do
9077 if [ "${identity_old[$num]}" = 1 ]; then
9078 switch_identity $num false || identity_old[$num]=$?
9082 run_test 103a "acl test"
9088 for U in {0..511}; do
9090 local O=$(printf "%04o" $U)
9092 umask $(printf "%04o" $((511 ^ $O)))
9093 $LFS setstripe -c 1 $DIR/$tfile.s$O
9094 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
9096 (( $S == ($O & 0666) )) ||
9097 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
9099 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
9100 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
9101 (( $S == ($O & 0666) )) ||
9102 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
9104 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
9105 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
9106 (( $S == ($O & 0666) )) ||
9107 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
9108 rm -f $DIR/$tfile.[smp]$0
9112 # limit the concurrently running threads to 64. LU-11878
9113 local idx=$((U % 64))
9114 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
9119 run_test 103b "umask lfs setstripe"
9123 cp -rp $DIR/$tdir $DIR/$tdir.bak
9125 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
9126 error "$DIR/$tdir shouldn't contain default ACL"
9127 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
9128 error "$DIR/$tdir.bak shouldn't contain default ACL"
9131 run_test 103c "'cp -rp' won't set empty acl"
9134 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9137 lfs df || error "lfs df failed"
9138 lfs df -ih || error "lfs df -ih failed"
9139 lfs df -h $DIR || error "lfs df -h $DIR failed"
9140 lfs df -i $DIR || error "lfs df -i $DIR failed"
9141 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
9142 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
9144 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
9145 lctl --device %$OSC deactivate
9146 lfs df || error "lfs df with deactivated OSC failed"
9147 lctl --device %$OSC activate
9148 # wait the osc back to normal
9149 wait_osc_import_ready client ost
9151 lfs df || error "lfs df with reactivated OSC failed"
9154 run_test 104a "lfs df [-ih] [path] test ========================="
9157 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9158 [ $RUNAS_ID -eq $UID ] &&
9159 skip_env "RUNAS_ID = UID = $UID -- skipping"
9161 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
9162 grep "Permission denied" | wc -l)))
9163 if [ $denied_cnt -ne 0 ]; then
9164 error "lfs check servers test failed"
9167 run_test 104b "$RUNAS lfs check servers test ===================="
9170 # doesn't work on 2.4 kernels
9172 if $(flock_is_enabled); then
9173 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
9175 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
9179 run_test 105a "flock when mounted without -o flock test ========"
9183 if $(flock_is_enabled); then
9184 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
9186 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
9190 run_test 105b "fcntl when mounted without -o flock test ========"
9194 if $(flock_is_enabled); then
9195 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
9197 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
9201 run_test 105c "lockf when mounted without -o flock test"
9203 test_105d() { # bug 15924
9204 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9206 test_mkdir $DIR/$tdir
9207 flock_is_enabled || skip_env "mount w/o flock enabled"
9208 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
9209 $LCTL set_param fail_loc=0x80000315
9210 flocks_test 2 $DIR/$tdir
9212 run_test 105d "flock race (should not freeze) ========"
9214 test_105e() { # bug 22660 && 22040
9215 flock_is_enabled || skip_env "mount w/o flock enabled"
9218 flocks_test 3 $DIR/$tfile
9220 run_test 105e "Two conflicting flocks from same process"
9222 test_106() { #bug 10921
9223 test_mkdir $DIR/$tdir
9224 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9225 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9227 run_test 106 "attempt exec of dir followed by chown of that dir"
9230 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9238 local save_pattern=$(sysctl -n kernel.core_pattern)
9239 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9240 sysctl -w kernel.core_pattern=$file
9241 sysctl -w kernel.core_uses_pid=0
9249 kill -s 11 $SLEEPPID
9251 if [ -e $file ]; then
9252 size=`stat -c%s $file`
9253 [ $size -eq 0 ] && error "Fail to create core file $file"
9255 error "Fail to create core file $file"
9258 sysctl -w kernel.core_pattern=$save_pattern
9259 sysctl -w kernel.core_uses_pid=$save_uses_pid
9262 run_test 107 "Coredump on SIG"
9265 test_mkdir $DIR/$tdir
9266 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9267 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9268 error "mkdir with 256 char should fail, but did not"
9269 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9270 error "create with 255 char failed"
9271 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9272 error "create with 256 char should fail, but did not"
9277 run_test 110 "filename length checking"
9280 # Purpose: To verify dynamic thread (OSS) creation.
9283 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9284 remote_ost_nodsh && skip "remote OST with nodsh"
9286 # Lustre does not stop service threads once they are started.
9287 # Reset number of running threads to default.
9292 local save_params="$TMP/sanity-$TESTNAME.parameters"
9294 # Get ll_ost_io count before I/O
9295 OSTIO_pre=$(do_facet ost1 \
9296 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9297 # Exit if lustre is not running (ll_ost_io not running).
9298 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9300 echo "Starting with $OSTIO_pre threads"
9301 local thread_max=$((OSTIO_pre * 2))
9302 local rpc_in_flight=$((thread_max * 2))
9303 # Number of I/O Process proposed to be started.
9305 local facets=$(get_facets OST)
9307 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9308 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9310 # Set in_flight to $rpc_in_flight
9311 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9312 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9313 nfiles=${rpc_in_flight}
9314 # Set ost thread_max to $thread_max
9315 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9317 # 5 Minutes should be sufficient for max number of OSS
9318 # threads(thread_max) to be created.
9322 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9323 test_mkdir $DIR/$tdir
9324 for i in $(seq $nfiles); do
9325 local file=$DIR/$tdir/${tfile}-$i
9326 $LFS setstripe -c -1 -i 0 $file
9327 ($WTL $file $timeout)&
9330 # I/O Started - Wait for thread_started to reach thread_max or report
9331 # error if thread_started is more than thread_max.
9332 echo "Waiting for thread_started to reach thread_max"
9333 local thread_started=0
9334 local end_time=$((SECONDS + timeout))
9336 while [ $SECONDS -le $end_time ] ; do
9338 # Get ost i/o thread_started count.
9339 thread_started=$(do_facet ost1 \
9341 ost.OSS.ost_io.threads_started | cut -d= -f2")
9342 # Break out if thread_started is equal/greater than thread_max
9343 if [[ $thread_started -ge $thread_max ]]; then
9344 echo ll_ost_io thread_started $thread_started, \
9345 equal/greater than thread_max $thread_max
9351 # Cleanup - We have the numbers, Kill i/o jobs if running.
9352 jobcount=($(jobs -p))
9353 for i in $(seq 0 $((${#jobcount[@]}-1)))
9355 kill -9 ${jobcount[$i]}
9356 if [ $? -ne 0 ] ; then
9358 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
9362 # Cleanup files left by WTL binary.
9363 for i in $(seq $nfiles); do
9364 local file=$DIR/$tdir/${tfile}-$i
9366 if [ $? -ne 0 ] ; then
9367 echo "Warning: Failed to delete file $file"
9371 restore_lustre_params <$save_params
9372 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
9374 # Error out if no new thread has started or Thread started is greater
9376 if [[ $thread_started -le $OSTIO_pre ||
9377 $thread_started -gt $thread_max ]]; then
9378 error "ll_ost_io: thread_started $thread_started" \
9379 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
9380 "No new thread started or thread started greater " \
9384 run_test 115 "verify dynamic thread creation===================="
9387 wait_delete_completed
9388 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
9389 echo "OST kbytes available: ${AVAIL[@]}"
9394 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
9395 #echo OST $i: ${AVAIL[i]}kb
9396 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
9400 if [[ ${AVAIL[i]} -lt $MINV ]]; then
9405 echo "Min free space: OST $MINI: $MINV"
9406 echo "Max free space: OST $MAXI: $MAXV"
9409 test_116a() { # was previously test_116()
9410 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9411 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9412 remote_mds_nodsh && skip "remote MDS with nodsh"
9414 echo -n "Free space priority "
9415 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
9420 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
9421 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
9422 trap simple_cleanup_common EXIT
9424 # Check if we need to generate uneven OSTs
9425 test_mkdir -p $DIR/$tdir/OST${MINI}
9426 local FILL=$((MINV / 4))
9427 local DIFF=$((MAXV - MINV))
9428 local DIFF2=$((DIFF * 100 / MINV))
9430 local threshold=$(do_facet $SINGLEMDS \
9431 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
9432 threshold=${threshold%%%}
9433 echo -n "Check for uneven OSTs: "
9434 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
9436 if [[ $DIFF2 -gt $threshold ]]; then
9438 echo "Don't need to fill OST$MINI"
9440 # generate uneven OSTs. Write 2% over the QOS threshold value
9442 DIFF=$((threshold - DIFF2 + 2))
9443 DIFF2=$((MINV * DIFF / 100))
9444 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
9445 $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
9446 error "setstripe failed"
9447 DIFF=$((DIFF2 / 2048))
9449 while [ $i -lt $DIFF ]; do
9451 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
9452 bs=2M count=1 2>/dev/null
9461 DIFF=$((MAXV - MINV))
9462 DIFF2=$((DIFF * 100 / MINV))
9463 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
9464 if [ $DIFF2 -gt $threshold ]; then
9467 echo "failed - QOS mode won't be used"
9468 simple_cleanup_common
9469 skip "QOS imbalance criteria not met"
9477 # now fill using QOS
9478 $SETSTRIPE -c 1 $DIR/$tdir
9479 FILL=$((FILL / 200))
9480 if [ $FILL -gt 600 ]; then
9483 echo "writing $FILL files to QOS-assigned OSTs"
9485 while [ $i -lt $FILL ]; do
9487 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
9491 echo "wrote $i 200k files"
9495 echo "Note: free space may not be updated, so measurements might be off"
9497 DIFF2=$((MAXV - MINV))
9498 echo "free space delta: orig $DIFF final $DIFF2"
9499 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
9500 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
9501 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
9502 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
9503 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
9504 if [[ $DIFF -gt 0 ]]; then
9505 FILL=$((DIFF2 * 100 / DIFF - 100))
9506 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
9509 # Figure out which files were written where
9510 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9511 awk '/'$MINI1': / {print $2; exit}')
9513 MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9514 echo "$MINC files created on smaller OST $MINI1"
9515 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9516 awk '/'$MAXI1': / {print $2; exit}')
9518 MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9519 echo "$MAXC files created on larger OST $MAXI1"
9520 if [[ $MINC -gt 0 ]]; then
9521 FILL=$((MAXC * 100 / MINC - 100))
9522 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
9524 [[ $MAXC -gt $MINC ]] ||
9525 error_ignore LU-9 "stripe QOS didn't balance free space"
9526 simple_cleanup_common
9528 run_test 116a "stripe QOS: free space balance ==================="
9530 test_116b() { # LU-2093
9531 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9532 remote_mds_nodsh && skip "remote MDS with nodsh"
9534 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
9535 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
9536 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
9537 [ -z "$old_rr" ] && skip "no QOS"
9538 do_facet $SINGLEMDS lctl set_param \
9539 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
9541 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
9542 createmany -o $DIR/$tdir/f- 20 || error "can't create"
9543 do_facet $SINGLEMDS lctl set_param fail_loc=0
9545 do_facet $SINGLEMDS lctl set_param \
9546 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
9548 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
9550 test_117() # bug 10891
9552 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9554 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
9555 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
9556 lctl set_param fail_loc=0x21e
9557 > $DIR/$tfile || error "truncate failed"
9558 lctl set_param fail_loc=0
9559 echo "Truncate succeeded."
9562 run_test 117 "verify osd extend =========="
9564 NO_SLOW_RESENDCOUNT=4
9565 export OLD_RESENDCOUNT=""
9566 set_resend_count () {
9567 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
9568 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
9569 lctl set_param -n $PROC_RESENDCOUNT $1
9570 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
9573 # for reduce test_118* time (b=14842)
9574 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9576 # Reset async IO behavior after error case
9578 FILE=$DIR/reset_async
9580 # Ensure all OSCs are cleared
9581 $SETSTRIPE -c -1 $FILE
9582 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
9587 test_118a() #bug 11710
9589 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9593 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9594 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9595 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9597 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9598 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9603 run_test 118a "verify O_SYNC works =========="
9607 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9608 remote_ost_nodsh && skip "remote OST with nodsh"
9612 #define OBD_FAIL_SRV_ENOENT 0x217
9613 set_nodes_failloc "$(osts_nodes)" 0x217
9614 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9616 set_nodes_failloc "$(osts_nodes)" 0
9617 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9618 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9621 if [[ $RC -eq 0 ]]; then
9622 error "Must return error due to dropped pages, rc=$RC"
9626 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9627 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9631 echo "Dirty pages not leaked on ENOENT"
9633 # Due to the above error the OSC will issue all RPCs syncronously
9634 # until a subsequent RPC completes successfully without error.
9635 $MULTIOP $DIR/$tfile Ow4096yc
9640 run_test 118b "Reclaim dirty pages on fatal error =========="
9644 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9646 # for 118c, restore the original resend count, LU-1940
9647 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
9648 set_resend_count $OLD_RESENDCOUNT
9649 remote_ost_nodsh && skip "remote OST with nodsh"
9653 #define OBD_FAIL_OST_EROFS 0x216
9654 set_nodes_failloc "$(osts_nodes)" 0x216
9656 # multiop should block due to fsync until pages are written
9657 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9661 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9662 error "Multiop failed to block on fsync, pid=$MULTIPID"
9665 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9667 if [[ $WRITEBACK -eq 0 ]]; then
9668 error "No page in writeback, writeback=$WRITEBACK"
9671 set_nodes_failloc "$(osts_nodes)" 0
9674 if [[ $RC -ne 0 ]]; then
9675 error "Multiop fsync failed, rc=$RC"
9678 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9679 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9681 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9682 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9686 echo "Dirty pages flushed via fsync on EROFS"
9689 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
9691 # continue to use small resend count to reduce test_118* time (b=14842)
9692 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9696 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9697 remote_ost_nodsh && skip "remote OST with nodsh"
9701 #define OBD_FAIL_OST_BRW_PAUSE_BULK
9702 set_nodes_failloc "$(osts_nodes)" 0x214
9703 # multiop should block due to fsync until pages are written
9704 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9708 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9709 error "Multiop failed to block on fsync, pid=$MULTIPID"
9712 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9714 if [[ $WRITEBACK -eq 0 ]]; then
9715 error "No page in writeback, writeback=$WRITEBACK"
9718 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
9719 set_nodes_failloc "$(osts_nodes)" 0
9721 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9722 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9724 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9725 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9729 echo "Dirty pages gaurenteed flushed via fsync"
9732 run_test 118d "Fsync validation inject a delay of the bulk =========="
9735 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9739 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
9740 lctl set_param fail_loc=0x8000040a
9742 # Should simulate EINVAL error which is fatal
9743 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9745 if [[ $RC -eq 0 ]]; then
9746 error "Must return error due to dropped pages, rc=$RC"
9749 lctl set_param fail_loc=0x0
9751 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9752 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9753 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9755 if [[ $LOCKED -ne 0 ]]; then
9756 error "Locked pages remain in cache, locked=$LOCKED"
9759 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9760 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9764 echo "No pages locked after fsync"
9769 run_test 118f "Simulate unrecoverable OSC side error =========="
9772 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9776 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
9777 lctl set_param fail_loc=0x406
9779 # simulate local -ENOMEM
9780 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9783 lctl set_param fail_loc=0
9784 if [[ $RC -eq 0 ]]; then
9785 error "Must return error due to dropped pages, rc=$RC"
9788 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9789 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9790 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9792 if [[ $LOCKED -ne 0 ]]; then
9793 error "Locked pages remain in cache, locked=$LOCKED"
9796 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9797 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9801 echo "No pages locked after fsync"
9806 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
9809 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9810 remote_ost_nodsh && skip "remote OST with nodsh"
9814 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9815 set_nodes_failloc "$(osts_nodes)" 0x20e
9816 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9817 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9820 set_nodes_failloc "$(osts_nodes)" 0
9821 if [[ $RC -eq 0 ]]; then
9822 error "Must return error due to dropped pages, rc=$RC"
9825 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9826 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9827 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9829 if [[ $LOCKED -ne 0 ]]; then
9830 error "Locked pages remain in cache, locked=$LOCKED"
9833 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9834 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9838 echo "No pages locked after fsync"
9842 run_test 118h "Verify timeout in handling recoverables errors =========="
9844 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
9847 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9848 remote_ost_nodsh && skip "remote OST with nodsh"
9852 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9853 set_nodes_failloc "$(osts_nodes)" 0x20e
9855 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9856 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9859 set_nodes_failloc "$(osts_nodes)" 0
9863 if [[ $RC -ne 0 ]]; then
9864 error "got error, but should be not, rc=$RC"
9867 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9868 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9869 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9870 if [[ $LOCKED -ne 0 ]]; then
9871 error "Locked pages remain in cache, locked=$LOCKED"
9874 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9875 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9879 echo "No pages locked after fsync"
9883 run_test 118i "Fix error before timeout in recoverable error =========="
9885 [ "$SLOW" = "no" ] && set_resend_count 4
9888 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9889 remote_ost_nodsh && skip "remote OST with nodsh"
9893 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
9894 set_nodes_failloc "$(osts_nodes)" 0x220
9896 # return -EIO from OST
9897 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9899 set_nodes_failloc "$(osts_nodes)" 0x0
9900 if [[ $RC -eq 0 ]]; then
9901 error "Must return error due to dropped pages, rc=$RC"
9904 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9905 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9906 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9907 if [[ $LOCKED -ne 0 ]]; then
9908 error "Locked pages remain in cache, locked=$LOCKED"
9911 # in recoverable error on OST we want resend and stay until it finished
9912 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9913 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9917 echo "No pages locked after fsync"
9921 run_test 118j "Simulate unrecoverable OST side error =========="
9925 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9926 remote_ost_nodsh && skip "remote OSTs with nodsh"
9928 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9929 set_nodes_failloc "$(osts_nodes)" 0x20e
9930 test_mkdir $DIR/$tdir
9932 for ((i=0;i<10;i++)); do
9933 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
9934 error "dd to $DIR/$tdir/$tfile-$i failed" )&
9941 set_nodes_failloc "$(osts_nodes)" 0
9944 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
9946 test_118l() # LU-646
9948 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9950 test_mkdir $DIR/$tdir
9951 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
9954 run_test 118l "fsync dir"
9956 test_118m() # LU-3066
9958 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9960 test_mkdir $DIR/$tdir
9961 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
9964 run_test 118m "fdatasync dir ========="
9966 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
9973 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9974 remote_ost_nodsh && skip "remote OSTs with nodsh"
9976 # Sleep to avoid a cached response.
9977 #define OBD_STATFS_CACHE_SECONDS 1
9980 # Inject a 10 second delay in the OST_STATFS handler.
9981 #define OBD_FAIL_OST_STATFS_DELAY 0x242
9982 set_nodes_failloc "$(osts_nodes)" 0x242
9985 stat --file-system $MOUNT > /dev/null
9988 set_nodes_failloc "$(osts_nodes)" 0
9990 if ((end - begin > 20)); then
9991 error "statfs took $((end - begin)) seconds, expected 10"
9994 run_test 118n "statfs() sends OST_STATFS requests in parallel"
9996 test_119a() # bug 11737
9998 BSIZE=$((512 * 1024))
9999 directio write $DIR/$tfile 0 1 $BSIZE
10000 # We ask to read two blocks, which is more than a file size.
10001 # directio will indicate an error when requested and actual
10002 # sizes aren't equeal (a normal situation in this case) and
10003 # print actual read amount.
10004 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
10005 if [ "$NOB" != "$BSIZE" ]; then
10006 error "read $NOB bytes instead of $BSIZE"
10010 run_test 119a "Short directIO read must return actual read amount"
10012 test_119b() # bug 11737
10014 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10016 $SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed"
10017 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
10019 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
10020 error "direct read failed"
10023 run_test 119b "Sparse directIO read must return actual read amount"
10025 test_119c() # bug 13099
10028 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
10029 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
10032 run_test 119c "Testing for direct read hitting hole"
10034 test_119d() # bug 15950
10036 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10038 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
10039 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
10041 $SETSTRIPE $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
10042 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
10043 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
10044 lctl set_param fail_loc=0x40d
10045 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
10048 cat $DIR/$tfile > /dev/null &
10049 lctl set_param fail_loc=0
10052 log "the DIO writes have completed, now wait for the reads (should not block very long)"
10054 [ -n "`ps h -p $pid_reads -o comm`" ] && \
10055 error "the read rpcs have not completed in 2s"
10057 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
10059 run_test 119d "The DIO path should try to send a new rpc once one is completed"
10062 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10063 remote_mds_nodsh && skip "remote MDS with nodsh"
10064 test_mkdir $DIR/$tdir
10065 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10066 skip_env "no early lock cancel on server"
10068 lru_resize_disable mdc
10069 lru_resize_disable osc
10070 cancel_lru_locks mdc
10071 # asynchronous object destroy at MDT could cause bl ast to client
10072 cancel_lru_locks osc
10074 stat $DIR/$tdir > /dev/null
10075 can1=$(do_facet $SINGLEMDS \
10076 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10077 awk '/ldlm_cancel/ {print $2}')
10078 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10079 awk '/ldlm_bl_callback/ {print $2}')
10080 test_mkdir -c1 $DIR/$tdir/d1
10081 can2=$(do_facet $SINGLEMDS \
10082 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10083 awk '/ldlm_cancel/ {print $2}')
10084 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10085 awk '/ldlm_bl_callback/ {print $2}')
10086 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10087 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10088 lru_resize_enable mdc
10089 lru_resize_enable osc
10091 run_test 120a "Early Lock Cancel: mkdir test"
10094 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10095 remote_mds_nodsh && skip "remote MDS with nodsh"
10096 test_mkdir $DIR/$tdir
10097 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10098 skip_env "no early lock cancel on server"
10100 lru_resize_disable mdc
10101 lru_resize_disable osc
10102 cancel_lru_locks mdc
10103 stat $DIR/$tdir > /dev/null
10104 can1=$(do_facet $SINGLEMDS \
10105 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10106 awk '/ldlm_cancel/ {print $2}')
10107 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10108 awk '/ldlm_bl_callback/ {print $2}')
10109 touch $DIR/$tdir/f1
10110 can2=$(do_facet $SINGLEMDS \
10111 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10112 awk '/ldlm_cancel/ {print $2}')
10113 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10114 awk '/ldlm_bl_callback/ {print $2}')
10115 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10116 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10117 lru_resize_enable mdc
10118 lru_resize_enable osc
10120 run_test 120b "Early Lock Cancel: create test"
10123 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10124 remote_mds_nodsh && skip "remote MDS with nodsh"
10125 test_mkdir -c1 $DIR/$tdir
10126 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10127 skip "no early lock cancel on server"
10129 lru_resize_disable mdc
10130 lru_resize_disable osc
10131 test_mkdir -c1 $DIR/$tdir/d1
10132 test_mkdir -c1 $DIR/$tdir/d2
10133 touch $DIR/$tdir/d1/f1
10134 cancel_lru_locks mdc
10135 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
10136 can1=$(do_facet $SINGLEMDS \
10137 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10138 awk '/ldlm_cancel/ {print $2}')
10139 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10140 awk '/ldlm_bl_callback/ {print $2}')
10141 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10142 can2=$(do_facet $SINGLEMDS \
10143 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10144 awk '/ldlm_cancel/ {print $2}')
10145 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10146 awk '/ldlm_bl_callback/ {print $2}')
10147 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10148 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10149 lru_resize_enable mdc
10150 lru_resize_enable osc
10152 run_test 120c "Early Lock Cancel: link test"
10155 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10156 remote_mds_nodsh && skip "remote MDS with nodsh"
10157 test_mkdir -c1 $DIR/$tdir
10158 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10159 skip_env "no early lock cancel on server"
10161 lru_resize_disable mdc
10162 lru_resize_disable osc
10164 cancel_lru_locks mdc
10165 stat $DIR/$tdir > /dev/null
10166 can1=$(do_facet $SINGLEMDS \
10167 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10168 awk '/ldlm_cancel/ {print $2}')
10169 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10170 awk '/ldlm_bl_callback/ {print $2}')
10171 chmod a+x $DIR/$tdir
10172 can2=$(do_facet $SINGLEMDS \
10173 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10174 awk '/ldlm_cancel/ {print $2}')
10175 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10176 awk '/ldlm_bl_callback/ {print $2}')
10177 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10178 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10179 lru_resize_enable mdc
10180 lru_resize_enable osc
10182 run_test 120d "Early Lock Cancel: setattr test"
10185 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10186 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10187 skip_env "no early lock cancel on server"
10188 remote_mds_nodsh && skip "remote MDS with nodsh"
10190 local dlmtrace_set=false
10192 test_mkdir -c1 $DIR/$tdir
10193 lru_resize_disable mdc
10194 lru_resize_disable osc
10195 ! $LCTL get_param debug | grep -q dlmtrace &&
10196 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
10197 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
10198 cancel_lru_locks mdc
10199 cancel_lru_locks osc
10200 dd if=$DIR/$tdir/f1 of=/dev/null
10201 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
10202 # XXX client can not do early lock cancel of OST lock
10203 # during unlink (LU-4206), so cancel osc lock now.
10205 cancel_lru_locks osc
10206 can1=$(do_facet $SINGLEMDS \
10207 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10208 awk '/ldlm_cancel/ {print $2}')
10209 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10210 awk '/ldlm_bl_callback/ {print $2}')
10211 unlink $DIR/$tdir/f1
10213 can2=$(do_facet $SINGLEMDS \
10214 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10215 awk '/ldlm_cancel/ {print $2}')
10216 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10217 awk '/ldlm_bl_callback/ {print $2}')
10218 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10219 $LCTL dk $TMP/cancel.debug.txt
10220 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10221 $LCTL dk $TMP/blocking.debug.txt
10222 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10223 lru_resize_enable mdc
10224 lru_resize_enable osc
10226 run_test 120e "Early Lock Cancel: unlink test"
10229 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10230 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10231 skip_env "no early lock cancel on server"
10232 remote_mds_nodsh && skip "remote MDS with nodsh"
10234 test_mkdir -c1 $DIR/$tdir
10235 lru_resize_disable mdc
10236 lru_resize_disable osc
10237 test_mkdir -c1 $DIR/$tdir/d1
10238 test_mkdir -c1 $DIR/$tdir/d2
10239 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10240 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10241 cancel_lru_locks mdc
10242 cancel_lru_locks osc
10243 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10244 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10245 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10246 # XXX client can not do early lock cancel of OST lock
10247 # during rename (LU-4206), so cancel osc lock now.
10249 cancel_lru_locks osc
10250 can1=$(do_facet $SINGLEMDS \
10251 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10252 awk '/ldlm_cancel/ {print $2}')
10253 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10254 awk '/ldlm_bl_callback/ {print $2}')
10255 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10257 can2=$(do_facet $SINGLEMDS \
10258 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10259 awk '/ldlm_cancel/ {print $2}')
10260 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10261 awk '/ldlm_bl_callback/ {print $2}')
10262 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10263 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10264 lru_resize_enable mdc
10265 lru_resize_enable osc
10267 run_test 120f "Early Lock Cancel: rename test"
10270 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10271 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10272 skip_env "no early lock cancel on server"
10273 remote_mds_nodsh && skip "remote MDS with nodsh"
10275 lru_resize_disable mdc
10276 lru_resize_disable osc
10278 echo create $count files
10279 test_mkdir $DIR/$tdir
10280 cancel_lru_locks mdc
10281 cancel_lru_locks osc
10284 can0=$(do_facet $SINGLEMDS \
10285 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10286 awk '/ldlm_cancel/ {print $2}')
10287 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10288 awk '/ldlm_bl_callback/ {print $2}')
10289 createmany -o $DIR/$tdir/f $count
10291 can1=$(do_facet $SINGLEMDS \
10292 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10293 awk '/ldlm_cancel/ {print $2}')
10294 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10295 awk '/ldlm_bl_callback/ {print $2}')
10297 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10298 echo rm $count files
10301 can2=$(do_facet $SINGLEMDS \
10302 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10303 awk '/ldlm_cancel/ {print $2}')
10304 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10305 awk '/ldlm_bl_callback/ {print $2}')
10307 echo total: $count removes in $((t2-t1))
10308 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10310 # wait for commitment of removal
10311 lru_resize_enable mdc
10312 lru_resize_enable osc
10314 run_test 120g "Early Lock Cancel: performance test"
10316 test_121() { #bug #10589
10317 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10320 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10321 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10322 lctl set_param fail_loc=0x310
10323 cancel_lru_locks osc > /dev/null
10324 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10325 lctl set_param fail_loc=0
10326 [[ $reads -eq $writes ]] ||
10327 error "read $reads blocks, must be $writes blocks"
10329 run_test 121 "read cancel race ========="
10331 test_123a() { # was test 123, statahead(bug 11401)
10332 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10335 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10336 log "testing UP system. Performance may be lower than expected."
10341 test_mkdir $DIR/$tdir
10342 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10343 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10345 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10346 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10348 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10349 lctl set_param -n llite.*.statahead_max 0
10350 lctl get_param llite.*.statahead_max
10351 cancel_lru_locks mdc
10352 cancel_lru_locks osc
10354 time ls -l $DIR/$tdir | wc -l
10356 delta=$((etime - stime))
10357 log "ls $i files without statahead: $delta sec"
10358 lctl set_param llite.*.statahead_max=$max
10360 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10361 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
10362 cancel_lru_locks mdc
10363 cancel_lru_locks osc
10365 time ls -l $DIR/$tdir | wc -l
10367 delta_sa=$((etime - stime))
10368 log "ls $i files with statahead: $delta_sa sec"
10369 lctl get_param -n llite.*.statahead_stats
10370 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10372 [[ $swrong -lt $ewrong ]] &&
10373 log "statahead was stopped, maybe too many locks held!"
10374 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
10376 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10377 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10378 lctl set_param -n llite.*.statahead_max 0
10379 lctl get_param llite.*.statahead_max
10380 cancel_lru_locks mdc
10381 cancel_lru_locks osc
10383 time ls -l $DIR/$tdir | wc -l
10385 delta=$((etime - stime))
10386 log "ls $i files again without statahead: $delta sec"
10387 lctl set_param llite.*.statahead_max=$max
10388 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10389 if [ $SLOWOK -eq 0 ]; then
10390 error "ls $i files is slower with statahead!"
10392 log "ls $i files is slower with statahead!"
10398 [ $delta -gt 20 ] && break
10399 [ $delta -gt 8 ] && MULT=$((50 / delta))
10400 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
10408 delta=$((etime - stime))
10409 log "rm -r $DIR/$tdir/: $delta seconds"
10411 lctl get_param -n llite.*.statahead_stats
10413 run_test 123a "verify statahead work"
10415 test_123b () { # statahead(bug 15027)
10416 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10418 test_mkdir $DIR/$tdir
10419 createmany -o $DIR/$tdir/$tfile-%d 1000
10421 cancel_lru_locks mdc
10422 cancel_lru_locks osc
10424 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
10425 lctl set_param fail_loc=0x80000803
10426 ls -lR $DIR/$tdir > /dev/null
10428 lctl set_param fail_loc=0x0
10429 lctl get_param -n llite.*.statahead_stats
10434 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
10437 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10438 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10439 skip_env "no lru resize on server"
10443 test_mkdir $DIR/$tdir
10445 log "create $NR files at $DIR/$tdir"
10446 createmany -o $DIR/$tdir/f $NR ||
10447 error "failed to create $NR files in $DIR/$tdir"
10449 cancel_lru_locks mdc
10450 ls -l $DIR/$tdir > /dev/null
10454 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
10455 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
10456 LRU_SIZE=$($LCTL get_param -n $PARAM)
10457 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
10458 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
10460 log "NS=$(basename $NSDIR)"
10465 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
10466 skip "Not enough cached locks created!"
10468 log "LRU=$LRU_SIZE"
10472 # We know that lru resize allows one client to hold $LIMIT locks
10473 # for 10h. After that locks begin to be killed by client.
10475 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
10477 if [ $LIMIT -lt $LRU_SIZE ]; then
10478 skip "Limit is too small $LIMIT"
10481 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
10482 # killing locks. Some time was spent for creating locks. This means
10483 # that up to the moment of sleep finish we must have killed some of
10484 # them (10-100 locks). This depends on how fast ther were created.
10485 # Many of them were touched in almost the same moment and thus will
10486 # be killed in groups.
10487 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
10489 # Use $LRU_SIZE_B here to take into account real number of locks
10490 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
10491 local LRU_SIZE_B=$LRU_SIZE
10493 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
10494 log "OLD_LVF=$OLD_LVF"
10495 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
10497 # Let's make sure that we really have some margin. Client checks
10498 # cached locks every 10 sec.
10499 SLEEP=$((SLEEP+20))
10500 log "Sleep ${SLEEP} sec"
10502 while ((SEC<$SLEEP)); do
10506 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
10507 echo -n "$LRU_SIZE"
10510 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
10511 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
10513 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
10514 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
10515 unlinkmany $DIR/$tdir/f $NR
10519 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
10520 log "unlink $NR files at $DIR/$tdir"
10521 unlinkmany $DIR/$tdir/f $NR
10523 run_test 124a "lru resize ======================================="
10525 get_max_pool_limit()
10527 local limit=$($LCTL get_param \
10528 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
10530 for l in $limit; do
10531 if [[ $l -gt $max ]]; then
10539 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10540 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10541 skip_env "no lru resize on server"
10543 LIMIT=$(get_max_pool_limit)
10545 NR=$(($(default_lru_size)*20))
10546 if [[ $NR -gt $LIMIT ]]; then
10547 log "Limit lock number by $LIMIT locks"
10551 IFree=$(mdsrate_inodes_available)
10552 if [ $IFree -lt $NR ]; then
10553 log "Limit lock number by $IFree inodes"
10557 lru_resize_disable mdc
10558 test_mkdir -p $DIR/$tdir/disable_lru_resize
10560 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
10561 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
10562 cancel_lru_locks mdc
10565 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10568 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10571 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10575 nolruresize_delta=$((etime-stime))
10576 log "ls -la time: $nolruresize_delta seconds"
10577 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10578 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
10580 lru_resize_enable mdc
10581 test_mkdir -p $DIR/$tdir/enable_lru_resize
10583 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
10584 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
10585 cancel_lru_locks mdc
10588 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10591 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10594 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10598 lruresize_delta=$((etime-stime))
10599 log "ls -la time: $lruresize_delta seconds"
10600 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10602 if [ $lruresize_delta -gt $nolruresize_delta ]; then
10603 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
10604 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
10605 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
10607 log "lru resize performs the same with no lru resize"
10609 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
10611 run_test 124b "lru resize (performance test) ======================="
10614 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10615 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10616 skip_env "no lru resize on server"
10618 # cache ununsed locks on client
10620 cancel_lru_locks mdc
10621 test_mkdir $DIR/$tdir
10622 createmany -o $DIR/$tdir/f $nr ||
10623 error "failed to create $nr files in $DIR/$tdir"
10624 ls -l $DIR/$tdir > /dev/null
10626 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10627 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10628 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10629 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10630 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10632 # set lru_max_age to 1 sec
10633 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10634 echo "sleep $((recalc_p * 2)) seconds..."
10635 sleep $((recalc_p * 2))
10637 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10638 # restore lru_max_age
10639 $LCTL set_param -n $nsdir.lru_max_age $max_age
10640 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10641 unlinkmany $DIR/$tdir/f $nr
10643 run_test 124c "LRUR cancel very aged locks"
10646 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10647 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10648 skip_env "no lru resize on server"
10650 # cache ununsed locks on client
10653 lru_resize_disable mdc
10654 stack_trap "lru_resize_enable mdc" EXIT
10656 cancel_lru_locks mdc
10658 # asynchronous object destroy at MDT could cause bl ast to client
10659 test_mkdir $DIR/$tdir
10660 createmany -o $DIR/$tdir/f $nr ||
10661 error "failed to create $nr files in $DIR/$tdir"
10662 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
10664 ls -l $DIR/$tdir > /dev/null
10666 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10667 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10668 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10669 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10671 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10673 # set lru_max_age to 1 sec
10674 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10675 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
10677 echo "sleep $((recalc_p * 2)) seconds..."
10678 sleep $((recalc_p * 2))
10680 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10682 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10684 run_test 124d "cancel very aged locks if lru-resize diasbaled"
10686 test_125() { # 13358
10687 $LCTL get_param -n llite.*.client_type | grep -q local ||
10688 skip "must run as local client"
10689 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
10690 skip_env "must have acl enabled"
10691 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
10693 test_mkdir $DIR/$tdir
10694 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
10695 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
10696 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
10698 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
10700 test_126() { # bug 12829/13455
10701 $GSS && skip_env "must run as gss disabled"
10702 $LCTL get_param -n llite.*.client_type | grep -q local ||
10703 skip "must run as local client"
10704 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
10706 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
10707 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
10709 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
10711 run_test 126 "check that the fsgid provided by the client is taken into account"
10713 test_127a() { # bug 15521
10714 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10716 $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
10717 $LCTL set_param osc.*.stats=0
10718 FSIZE=$((2048 * 1024))
10719 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
10720 cancel_lru_locks osc
10721 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
10723 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
10724 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
10725 echo "got $COUNT $NAME"
10726 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
10727 eval $NAME=$COUNT || error "Wrong proc format"
10730 read_bytes|write_bytes)
10731 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
10732 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
10733 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
10734 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
10735 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
10736 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
10737 error "sumsquare is too small: $SUMSQ"
10738 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
10739 error "sumsquare is too big: $SUMSQ"
10743 done < $DIR/${tfile}.tmp
10745 #check that we actually got some stats
10746 [ "$read_bytes" ] || error "Missing read_bytes stats"
10747 [ "$write_bytes" ] || error "Missing write_bytes stats"
10748 [ "$read_bytes" != 0 ] || error "no read done"
10749 [ "$write_bytes" != 0 ] || error "no write done"
10751 run_test 127a "verify the client stats are sane"
10753 test_127b() { # bug LU-333
10754 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10755 local name count samp unit min max sum sumsq
10757 $LCTL set_param llite.*.stats=0
10759 # perform 2 reads and writes so MAX is different from SUM.
10760 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10761 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10762 cancel_lru_locks osc
10763 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10764 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10766 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
10767 while read name count samp unit min max sum sumsq; do
10768 echo "got $count $name"
10769 eval $name=$count || error "Wrong proc format"
10773 [ $count -ne 2 ] && error "count is not 2: $count"
10774 [ $min -ne $PAGE_SIZE ] &&
10775 error "min is not $PAGE_SIZE: $min"
10776 [ $max -ne $PAGE_SIZE ] &&
10777 error "max is incorrect: $max"
10778 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10779 error "sum is wrong: $sum"
10782 [ $count -ne 2 ] && error "count is not 2: $count"
10783 [ $min -ne $PAGE_SIZE ] &&
10784 error "min is not $PAGE_SIZE: $min"
10785 [ $max -ne $PAGE_SIZE ] &&
10786 error "max is incorrect: $max"
10787 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10788 error "sum is wrong: $sum"
10792 done < $TMP/$tfile.tmp
10794 #check that we actually got some stats
10795 [ "$read_bytes" ] || error "Missing read_bytes stats"
10796 [ "$write_bytes" ] || error "Missing write_bytes stats"
10797 [ "$read_bytes" != 0 ] || error "no read done"
10798 [ "$write_bytes" != 0 ] || error "no write done"
10800 rm -f $TMP/${tfile}.tmp
10802 run_test 127b "verify the llite client stats are sane"
10804 test_127c() { # LU-12394
10805 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
10812 $LCTL set_param llite.*.extents_stats=1
10813 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
10815 # Use two stripes so there is enough space in default config
10816 $LFS setstripe -c 2 $DIR/$tfile
10818 # Extent stats start at 0-4K and go in power of two buckets
10819 # LL_HIST_START = 12 --> 2^12 = 4K
10820 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
10821 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
10823 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
10825 # Write and read, 2x each, second time at a non-zero offset
10826 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
10827 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
10828 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
10829 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
10833 $LCTL get_param llite.*.extents_stats
10836 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
10838 local bucket=$($LCTL get_param -n llite.*.extents_stats |
10840 reads=$(echo $bucket | awk '{print $5}')
10841 writes=$(echo $bucket | awk '{print $9}')
10842 [ "$reads" -eq $count ] ||
10843 error "$reads reads in < $bsize bucket, expect $count"
10844 [ "$writes" -eq $count ] ||
10845 error "$writes writes in < $bsize bucket, expect $count"
10848 # Test mmap write and read
10849 $LCTL set_param llite.*.extents_stats=c
10851 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
10852 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
10853 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
10855 $LCTL get_param llite.*.extents_stats
10857 count=$(((size*1024) / PAGE_SIZE))
10859 bsize=$((2 * PAGE_SIZE / 1024))K
10861 bucket=$($LCTL get_param -n llite.*.extents_stats |
10863 reads=$(echo $bucket | awk '{print $5}')
10864 writes=$(echo $bucket | awk '{print $9}')
10865 # mmap writes fault in the page first, creating an additonal read
10866 [ "$reads" -eq $((2 * count)) ] ||
10867 error "$reads reads in < $bsize bucket, expect $count"
10868 [ "$writes" -eq $count ] ||
10869 error "$writes writes in < $bsize bucket, expect $count"
10871 run_test 127c "test llite extent stats with regular & mmap i/o"
10873 test_128() { # bug 15212
10875 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
10880 result=$(grep error $TMP/$tfile.log)
10881 rm -f $DIR/$tfile $TMP/$tfile.log
10882 [ -z "$result" ] ||
10883 error "consecutive find's under interactive lfs failed"
10885 run_test 128 "interactive lfs for 2 consecutive find's"
10887 set_dir_limits () {
10892 local ldproc=/proc/fs/ldiskfs
10893 local facets=$(get_facets MDS)
10895 for facet in ${facets//,/ }; do
10896 canondev=$(ldiskfs_canon \
10897 *.$(convert_facet2label $facet).mntdev $facet)
10898 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
10899 ldproc=/sys/fs/ldiskfs
10900 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
10901 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
10905 check_mds_dmesg() {
10906 local facets=$(get_facets MDS)
10907 for facet in ${facets//,/ }; do
10908 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
10914 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10915 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
10916 skip "Need MDS version with at least 2.5.56"
10917 if [ "$mds1_FSTYPE" != ldiskfs ]; then
10918 skip_env "ldiskfs only test"
10920 remote_mds_nodsh && skip "remote MDS with nodsh"
10924 local has_warning=false
10927 mkdir -p $DIR/$tdir
10929 # block size of mds1
10930 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
10931 set_dir_limits $maxsize $maxsize
10932 local dirsize=$(stat -c%s "$DIR/$tdir")
10934 while [[ $dirsize -le $maxsize ]]; do
10935 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
10937 if ! $has_warning; then
10938 check_mds_dmesg '"is approaching"' && has_warning=true
10940 # check two errors:
10941 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
10942 # EFBIG for previous versions included in ldiskfs series
10943 if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
10945 echo "return code $rc received as expected"
10947 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
10948 error_exit "create failed w/o dir size limit"
10950 check_mds_dmesg '"has reached"' ||
10951 error_exit "reached message should be output"
10953 [ $has_warning = "false" ] &&
10954 error_exit "warning message should be output"
10956 dirsize=$(stat -c%s "$DIR/$tdir")
10958 [[ $dirsize -ge $maxsize ]] && return 0
10959 error_exit "current dir size $dirsize, " \
10960 "previous limit $maxsize"
10961 elif [ $rc -ne 0 ]; then
10963 error_exit "return $rc received instead of expected " \
10964 "$EFBIG or $ENOSPC, files in dir $dirsize"
10966 nfiles=$((nfiles + 1))
10967 dirsize=$(stat -c%s "$DIR/$tdir")
10971 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
10973 run_test 129 "test directory size limit ========================"
10982 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
10983 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
10985 trap cleanup_130 EXIT RETURN
10987 local fm_file=$DIR/$tfile
10988 $SETSTRIPE -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
10989 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
10990 error "dd failed for $fm_file"
10992 # LU-1795: test filefrag/FIEMAP once, even if unsupported
10993 filefrag -ves $fm_file
10995 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
10996 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
10997 [ $RC != 0 ] && error "filefrag $fm_file failed"
10999 filefrag_op=$(filefrag -ve -k $fm_file |
11000 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11001 lun=$($GETSTRIPE -i $fm_file)
11003 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
11006 for line in $filefrag_op
11008 frag_lun=`echo $line | cut -d: -f5`
11009 ext_len=`echo $line | cut -d: -f4`
11010 if (( $frag_lun != $lun )); then
11012 error "FIEMAP on 1-stripe file($fm_file) failed"
11015 (( tot_len += ext_len ))
11018 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
11020 error "FIEMAP on 1-stripe file($fm_file) failed;"
11026 echo "FIEMAP on single striped file succeeded"
11028 run_test 130a "FIEMAP (1-stripe file)"
11031 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11033 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11034 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11036 trap cleanup_130 EXIT RETURN
11038 local fm_file=$DIR/$tfile
11039 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11040 error "setstripe on $fm_file"
11041 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11042 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11044 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
11045 error "dd failed on $fm_file"
11047 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11048 filefrag_op=$(filefrag -ve -k $fm_file |
11049 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11051 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11052 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11057 for line in $filefrag_op
11059 frag_lun=$(echo $line | cut -d: -f5 |
11060 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11061 ext_len=$(echo $line | cut -d: -f4)
11062 if (( $frag_lun != $last_lun )); then
11063 if (( tot_len != 1024 )); then
11065 error "FIEMAP on $fm_file failed; returned " \
11066 "len $tot_len for OST $last_lun instead of 1024"
11069 (( num_luns += 1 ))
11073 (( tot_len += ext_len ))
11076 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
11078 error "FIEMAP on $fm_file failed; returned wrong number of " \
11079 "luns or wrong len for OST $last_lun"
11085 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
11087 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
11090 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11092 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11093 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11095 trap cleanup_130 EXIT RETURN
11097 local fm_file=$DIR/$tfile
11098 $SETSTRIPE -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
11099 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11100 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11102 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
11103 error "dd failed on $fm_file"
11105 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11106 filefrag_op=$(filefrag -ve -k $fm_file |
11107 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11109 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11110 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11115 for line in $filefrag_op
11117 frag_lun=$(echo $line | cut -d: -f5 |
11118 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11119 ext_len=$(echo $line | cut -d: -f4)
11120 if (( $frag_lun != $last_lun )); then
11121 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
11122 if (( logical != 512 )); then
11124 error "FIEMAP on $fm_file failed; returned " \
11125 "logical start for lun $logical instead of 512"
11128 if (( tot_len != 512 )); then
11130 error "FIEMAP on $fm_file failed; returned " \
11131 "len $tot_len for OST $last_lun instead of 1024"
11134 (( num_luns += 1 ))
11138 (( tot_len += ext_len ))
11141 if (( num_luns != 2 || tot_len != 512 )); then
11143 error "FIEMAP on $fm_file failed; returned wrong number of " \
11144 "luns or wrong len for OST $last_lun"
11150 echo "FIEMAP on 2-stripe file with hole succeeded"
11152 run_test 130c "FIEMAP (2-stripe file with hole)"
11155 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
11157 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11158 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11160 trap cleanup_130 EXIT RETURN
11162 local fm_file=$DIR/$tfile
11163 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11164 error "setstripe on $fm_file"
11165 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11166 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11168 local actual_stripe_count=$($GETSTRIPE -c $fm_file)
11169 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
11170 error "dd failed on $fm_file"
11172 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11173 filefrag_op=$(filefrag -ve -k $fm_file |
11174 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11176 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11177 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11182 for line in $filefrag_op
11184 frag_lun=$(echo $line | cut -d: -f5 |
11185 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11186 ext_len=$(echo $line | cut -d: -f4)
11187 if (( $frag_lun != $last_lun )); then
11188 if (( tot_len != 1024 )); then
11190 error "FIEMAP on $fm_file failed; returned " \
11191 "len $tot_len for OST $last_lun instead of 1024"
11194 (( num_luns += 1 ))
11198 (( tot_len += ext_len ))
11201 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
11203 error "FIEMAP on $fm_file failed; returned wrong number of " \
11204 "luns or wrong len for OST $last_lun"
11210 echo "FIEMAP on N-stripe file succeeded"
11212 run_test 130d "FIEMAP (N-stripe file)"
11215 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11217 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11218 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11220 trap cleanup_130 EXIT RETURN
11222 local fm_file=$DIR/$tfile
11223 $SETSTRIPE -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11224 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11225 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11228 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11229 for ((i = 0; i < $NUM_BLKS; i++))
11231 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11234 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11235 filefrag_op=$(filefrag -ve -k $fm_file |
11236 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11238 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11239 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11244 for line in $filefrag_op
11246 frag_lun=$(echo $line | cut -d: -f5 |
11247 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11248 ext_len=$(echo $line | cut -d: -f4)
11249 if (( $frag_lun != $last_lun )); then
11250 if (( tot_len != $EXPECTED_LEN )); then
11252 error "FIEMAP on $fm_file failed; returned " \
11253 "len $tot_len for OST $last_lun instead " \
11257 (( num_luns += 1 ))
11261 (( tot_len += ext_len ))
11264 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11266 error "FIEMAP on $fm_file failed; returned wrong number " \
11267 "of luns or wrong len for OST $last_lun"
11273 echo "FIEMAP with continuation calls succeeded"
11275 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11278 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11279 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11281 local fm_file=$DIR/$tfile
11282 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11283 error "multiop create with lov_delay_create on $fm_file"
11285 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11286 filefrag_extents=$(filefrag -vek $fm_file |
11287 awk '/extents? found/ { print $2 }')
11288 if [[ "$filefrag_extents" != "0" ]]; then
11289 error "FIEMAP on $fm_file failed; " \
11290 "returned $filefrag_extents expected 0"
11295 run_test 130f "FIEMAP (unstriped file)"
11297 # Test for writev/readv
11299 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11300 error "writev test failed"
11301 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11302 error "readv failed"
11305 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11308 local fsize=$((524288 + 1048576 + 1572864))
11309 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11310 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11311 error "append writev test failed"
11313 ((fsize += 1572864 + 1048576))
11314 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11315 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11316 error "append writev test failed"
11319 run_test 131b "test append writev"
11322 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11325 run_test 131c "test read/write on file w/o objects"
11328 rwv -f $DIR/$tfile -w -n 1 1572864
11329 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11330 if [ "$NOB" != 1572864 ]; then
11331 error "Short read filed: read $NOB bytes instead of 1572864"
11335 run_test 131d "test short read"
11338 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11339 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11340 error "read hitting hole failed"
11343 run_test 131e "test read hitting hole"
11352 mds*) res=$(do_facet $facet \
11353 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11355 ost*) res=$(do_facet $facet \
11356 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
11358 *) error "Wrong facet '$facet'" ;;
11360 [ "$res" ] || error "The counter for $op on $facet was not incremented"
11361 # if the argument $3 is zero, it means any stat increment is ok.
11362 if [[ $want -gt 0 ]]; then
11363 local count=$(echo $res | awk '{ print $2 }')
11364 [[ $count -ne $want ]] &&
11365 error "The $op counter on $facet is $count, not $want"
11370 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11371 remote_ost_nodsh && skip "remote OST with nodsh"
11372 remote_mds_nodsh && skip "remote MDS with nodsh"
11373 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11374 skip_env "MDS doesn't support rename stats"
11376 local testdir=$DIR/${tdir}/stats_testdir
11378 mkdir -p $DIR/${tdir}
11381 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11382 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11384 # verify mdt stats first.
11385 mkdir ${testdir} || error "mkdir failed"
11386 check_stats $SINGLEMDS "mkdir" 1
11387 touch ${testdir}/${tfile} || error "touch failed"
11388 check_stats $SINGLEMDS "open" 1
11389 check_stats $SINGLEMDS "close" 1
11390 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
11391 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
11392 check_stats $SINGLEMDS "mknod" 2
11394 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
11395 check_stats $SINGLEMDS "unlink" 1
11396 rm -f ${testdir}/${tfile} || error "file remove failed"
11397 check_stats $SINGLEMDS "unlink" 2
11399 # remove working dir and check mdt stats again.
11400 rmdir ${testdir} || error "rmdir failed"
11401 check_stats $SINGLEMDS "rmdir" 1
11403 local testdir1=$DIR/${tdir}/stats_testdir1
11404 mkdir -p ${testdir}
11405 mkdir -p ${testdir1}
11406 touch ${testdir1}/test1
11407 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
11408 check_stats $SINGLEMDS "crossdir_rename" 1
11410 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
11411 check_stats $SINGLEMDS "samedir_rename" 1
11413 rm -rf $DIR/${tdir}
11415 run_test 133a "Verifying MDT stats ========================================"
11420 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11421 remote_ost_nodsh && skip "remote OST with nodsh"
11422 remote_mds_nodsh && skip "remote MDS with nodsh"
11424 local testdir=$DIR/${tdir}/stats_testdir
11426 mkdir -p ${testdir} || error "mkdir failed"
11427 touch ${testdir}/${tfile} || error "touch failed"
11428 cancel_lru_locks mdc
11431 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11432 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11434 # extra mdt stats verification.
11435 chmod 444 ${testdir}/${tfile} || error "chmod failed"
11436 check_stats $SINGLEMDS "setattr" 1
11437 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11438 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
11440 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
11441 check_stats $SINGLEMDS "getattr" 1
11443 rm -rf $DIR/${tdir}
11445 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
11446 # so the check below is not reliable
11447 [ $MDSCOUNT -eq 1 ] || return 0
11449 # Sleep to avoid a cached response.
11450 #define OBD_STATFS_CACHE_SECONDS 1
11452 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11453 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11454 $LFS df || error "lfs failed"
11455 check_stats $SINGLEMDS "statfs" 1
11457 # check aggregated statfs (LU-10018)
11458 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
11460 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
11463 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11464 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11466 check_stats $SINGLEMDS "statfs" 1
11468 # We want to check that the client didn't send OST_STATFS to
11469 # ost1 but the MDT also uses OST_STATFS for precreate. So some
11470 # extra care is needed here.
11471 if remote_mds; then
11472 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
11473 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
11475 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
11476 [ "$res" ] && error "OST got STATFS"
11481 run_test 133b "Verifying extra MDT stats =================================="
11484 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11485 remote_ost_nodsh && skip "remote OST with nodsh"
11486 remote_mds_nodsh && skip "remote MDS with nodsh"
11488 local testdir=$DIR/$tdir/stats_testdir
11490 test_mkdir -p $testdir
11492 # verify obdfilter stats.
11493 $SETSTRIPE -c 1 -i 0 $testdir/$tfile
11495 cancel_lru_locks osc
11496 wait_delete_completed
11499 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11500 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11502 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
11505 cancel_lru_locks osc
11506 check_stats ost1 "write" 1
11508 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
11509 check_stats ost1 "read" 1
11511 > $testdir/$tfile || error "truncate failed"
11512 check_stats ost1 "punch" 1
11514 rm -f $testdir/$tfile || error "file remove failed"
11515 wait_delete_completed
11516 check_stats ost1 "destroy" 1
11520 run_test 133c "Verifying OST stats ========================================"
11527 while [ $value -ge 2 ]; do
11532 if [ $orig -gt $order ]; then
11540 local size=('K' 'M' 'G' 'T');
11542 local size_string=$value
11544 while [ $value -ge 1024 ]; do
11545 if [ $i -gt 3 ]; then
11546 #T is the biggest unit we get here, if that is bigger,
11548 size_string=${value}T
11551 value=$((value >> 10))
11552 if [ $value -lt 1024 ]; then
11553 size_string=${value}${size[$i]}
11562 get_rename_size() {
11564 local context=${2:-.}
11565 local sample=$(do_facet $SINGLEMDS $LCTL \
11566 get_param mdt.$FSNAME-MDT0000.rename_stats |
11567 grep -A1 $context |
11568 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
11573 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11574 remote_ost_nodsh && skip "remote OST with nodsh"
11575 remote_mds_nodsh && skip "remote MDS with nodsh"
11576 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11577 skip_env "MDS doesn't support rename stats"
11579 local testdir1=$DIR/${tdir}/stats_testdir1
11580 local testdir2=$DIR/${tdir}/stats_testdir2
11581 mkdir -p $DIR/${tdir}
11583 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11585 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
11586 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
11588 createmany -o $testdir1/test 512 || error "createmany failed"
11590 # check samedir rename size
11591 mv ${testdir1}/test0 ${testdir1}/test_0
11593 local testdir1_size=$(ls -l $DIR/${tdir} |
11594 awk '/stats_testdir1/ {print $5}')
11595 local testdir2_size=$(ls -l $DIR/${tdir} |
11596 awk '/stats_testdir2/ {print $5}')
11598 testdir1_size=$(order_2 $testdir1_size)
11599 testdir2_size=$(order_2 $testdir2_size)
11601 testdir1_size=$(size_in_KMGT $testdir1_size)
11602 testdir2_size=$(size_in_KMGT $testdir2_size)
11604 echo "source rename dir size: ${testdir1_size}"
11605 echo "target rename dir size: ${testdir2_size}"
11607 local cmd="do_facet $SINGLEMDS $LCTL "
11608 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
11610 eval $cmd || error "$cmd failed"
11611 local samedir=$($cmd | grep 'same_dir')
11612 local same_sample=$(get_rename_size $testdir1_size)
11613 [ -z "$samedir" ] && error "samedir_rename_size count error"
11614 [[ $same_sample -eq 1 ]] ||
11615 error "samedir_rename_size error $same_sample"
11616 echo "Check same dir rename stats success"
11618 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11620 # check crossdir rename size
11621 mv ${testdir1}/test_0 ${testdir2}/test_0
11623 testdir1_size=$(ls -l $DIR/${tdir} |
11624 awk '/stats_testdir1/ {print $5}')
11625 testdir2_size=$(ls -l $DIR/${tdir} |
11626 awk '/stats_testdir2/ {print $5}')
11628 testdir1_size=$(order_2 $testdir1_size)
11629 testdir2_size=$(order_2 $testdir2_size)
11631 testdir1_size=$(size_in_KMGT $testdir1_size)
11632 testdir2_size=$(size_in_KMGT $testdir2_size)
11634 echo "source rename dir size: ${testdir1_size}"
11635 echo "target rename dir size: ${testdir2_size}"
11637 eval $cmd || error "$cmd failed"
11638 local crossdir=$($cmd | grep 'crossdir')
11639 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
11640 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
11641 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
11642 [[ $src_sample -eq 1 ]] ||
11643 error "crossdir_rename_size error $src_sample"
11644 [[ $tgt_sample -eq 1 ]] ||
11645 error "crossdir_rename_size error $tgt_sample"
11646 echo "Check cross dir rename stats success"
11647 rm -rf $DIR/${tdir}
11649 run_test 133d "Verifying rename_stats ========================================"
11652 remote_mds_nodsh && skip "remote MDS with nodsh"
11653 remote_ost_nodsh && skip "remote OST with nodsh"
11654 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11656 local testdir=$DIR/${tdir}/stats_testdir
11657 local ctr f0 f1 bs=32768 count=42 sum
11659 mkdir -p ${testdir} || error "mkdir failed"
11661 $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
11663 for ctr in {write,read}_bytes; do
11665 cancel_lru_locks osc
11667 do_facet ost1 $LCTL set_param -n \
11668 "obdfilter.*.exports.clear=clear"
11670 if [ $ctr = write_bytes ]; then
11672 f1=${testdir}/${tfile}
11674 f0=${testdir}/${tfile}
11678 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
11681 cancel_lru_locks osc
11683 sum=$(do_facet ost1 $LCTL get_param \
11684 "obdfilter.*.exports.*.stats" |
11685 awk -v ctr=$ctr 'BEGIN { sum = 0 }
11686 $1 == ctr { sum += $7 }
11687 END { printf("%0.0f", sum) }')
11689 if ((sum != bs * count)); then
11690 error "Bad $ctr sum, expected $((bs * count)), got $sum"
11694 rm -rf $DIR/${tdir}
11696 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
11698 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
11700 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
11701 # not honor the -ignore_readdir_race option correctly. So we call
11702 # error_ignore() rather than error() in these cases. See LU-11152.
11704 if (find --version; do_facet mds1 find --version) |
11705 grep -q '\b4\.5\.1[1-4]\b'; then
11706 error_ignore LU-11152 "$@"
11713 # First without trusting modes.
11714 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
11715 echo "proc_dirs='$proc_dirs'"
11716 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
11717 find $proc_dirs -exec cat '{}' \; &> /dev/null
11719 # Second verifying readability.
11720 $LCTL get_param -R '*' &> /dev/null
11722 # Verifing writability with badarea_io.
11724 -ignore_readdir_race \
11726 -not -name force_lbug \
11727 -not -name changelog_mask \
11728 -exec badarea_io '{}' \; ||
11729 error_133 "find $proc_dirs failed"
11731 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
11734 remote_mds_nodsh && skip "remote MDS with nodsh"
11735 remote_ost_nodsh && skip "remote OST with nodsh"
11737 # eventually, this can also be replaced with "lctl get_param -R",
11738 # but not until that option is always available on the server
11740 for facet in mds1 ost1; do
11741 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
11742 skip_noexit "Too old lustre on $facet"
11743 local facet_proc_dirs=$(do_facet $facet \
11744 \\\ls -d $proc_regexp 2>/dev/null)
11745 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11746 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11747 do_facet $facet find $facet_proc_dirs \
11748 ! -name req_history \
11749 -exec cat '{}' \\\; &> /dev/null
11751 do_facet $facet find $facet_proc_dirs \
11752 ! -name req_history \
11754 -exec cat '{}' \\\; &> /dev/null ||
11755 error "proc file read failed"
11757 do_facet $facet find $facet_proc_dirs \
11758 -ignore_readdir_race \
11760 -not -name force_lbug \
11761 -not -name changelog_mask \
11762 -exec badarea_io '{}' \\\; ||
11763 error_133 "$facet find $facet_proc_dirs failed"
11766 # remount the FS in case writes/reads /proc break the FS
11767 cleanup || error "failed to unmount"
11768 setup || error "failed to setup"
11771 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
11774 remote_mds_nodsh && skip "remote MDS with nodsh"
11775 remote_ost_nodsh && skip "remote OST with nodsh"
11776 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
11777 skip "Need MDS version at least 2.9.54"
11781 for facet in client mds1 ost1; do
11782 local facet_proc_dirs=$(do_facet $facet \
11783 \\\ls -d $proc_regexp 2> /dev/null)
11784 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11785 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11786 # Get the list of files that are missing the terminating newline
11787 local missing=($(do_facet $facet \
11788 find ${facet_proc_dirs} -type f \| \
11789 while read F\; do \
11790 awk -v FS='\v' -v RS='\v\v' \
11791 "'END { if(NR>0 && \
11792 \\\$NF !~ /.*\\\n\$/) \
11793 print FILENAME}'" \
11796 [ ${#missing[*]} -eq 0 ] ||
11797 error "files do not end with newline: ${missing[*]}"
11800 run_test 133h "Proc files should end with newlines"
11803 remote_mds_nodsh && skip "remote MDS with nodsh"
11804 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11805 skip "Need MDS version at least 2.7.54"
11807 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11808 cancel_lru_locks mdc
11810 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
11811 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11812 [ $unused -eq 0 ] || error "$unused locks are not cleared"
11815 createmany -o $DIR/$tdir/f $nr ||
11816 error "failed to create $nr files in $DIR/$tdir"
11817 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11819 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
11820 do_facet mds1 $LCTL set_param fail_loc=0x327
11821 do_facet mds1 $LCTL set_param fail_val=500
11824 echo "sleep 10 seconds ..."
11826 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
11828 do_facet mds1 $LCTL set_param fail_loc=0
11829 do_facet mds1 $LCTL set_param fail_val=0
11830 [ $lck_cnt -lt $unused ] ||
11831 error "No locks reclaimed, before:$unused, after:$lck_cnt"
11834 unlinkmany $DIR/$tdir/f $nr
11836 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
11839 remote_mds_nodsh && skip "remote MDS with nodsh"
11840 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11841 skip "Need MDS version at least 2.7.54"
11843 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11844 cancel_lru_locks mdc
11846 local low_wm=$(do_facet mds1 $LCTL get_param -n \
11847 ldlm.lock_reclaim_threshold_mb)
11848 # disable reclaim temporarily
11849 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
11851 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
11852 do_facet mds1 $LCTL set_param fail_loc=0x328
11853 do_facet mds1 $LCTL set_param fail_val=500
11855 $LCTL set_param debug=+trace
11858 createmany -o $DIR/$tdir/f $nr &
11859 local create_pid=$!
11861 echo "Sleep $TIMEOUT seconds ..."
11863 if ! ps -p $create_pid > /dev/null 2>&1; then
11864 do_facet mds1 $LCTL set_param fail_loc=0
11865 do_facet mds1 $LCTL set_param fail_val=0
11866 do_facet mds1 $LCTL set_param \
11867 ldlm.lock_reclaim_threshold_mb=${low_wm}m
11868 error "createmany finished incorrectly!"
11870 do_facet mds1 $LCTL set_param fail_loc=0
11871 do_facet mds1 $LCTL set_param fail_val=0
11872 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
11873 wait $create_pid || return 1
11875 unlinkmany $DIR/$tdir/f $nr
11877 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
11879 test_140() { #bug-17379
11880 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11882 test_mkdir $DIR/$tdir
11883 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
11884 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
11886 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
11887 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
11889 while i=$((i + 1)); do
11891 cd $i || error "Changing to $i"
11892 ln -s ../stat stat || error "Creating stat symlink"
11893 # Read the symlink until ELOOP present,
11894 # not LBUGing the system is considered success,
11895 # we didn't overrun the stack.
11896 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
11897 if [ $ret -ne 0 ]; then
11898 if [ $ret -eq 40 ]; then
11901 error "Open stat symlink"
11907 echo "The symlink depth = $i"
11908 [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] ||
11909 error "Invalid symlink depth"
11911 # Test recursive symlink
11912 ln -s symlink_self symlink_self
11913 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
11914 echo "open symlink_self returns $ret"
11915 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
11917 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
11920 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11922 local TF="$TMP/$tfile"
11924 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
11926 cancel_lru_locks $OSC
11927 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
11928 remount_client $MOUNT
11930 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
11933 $TRUNCATE $DIR/$tfile 6000
11934 cancel_lru_locks $OSC
11935 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
11938 echo "12345" >>$DIR/$tfile
11939 cancel_lru_locks $OSC
11940 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
11943 echo "12345" >>$DIR/$tfile
11944 cancel_lru_locks $OSC
11945 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
11950 run_test 150 "truncate/append tests"
11952 #LU-2902 roc_hit was not able to read all values from lproc
11953 function roc_hit_init() {
11954 local list=$(comma_list $(osts_nodes))
11955 local dir=$DIR/$tdir-check
11956 local file=$dir/$tfile
11962 #use setstripe to do a write to every ost
11963 for i in $(seq 0 $((OSTCOUNT-1))); do
11964 $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
11965 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
11966 idx=$(printf %04x $i)
11967 BEFORE=$(get_osd_param $list *OST*$idx stats |
11968 awk '$1 == "cache_access" {sum += $7}
11969 END { printf("%0.0f", sum) }')
11971 cancel_lru_locks osc
11972 cat $file >/dev/null
11974 AFTER=$(get_osd_param $list *OST*$idx stats |
11975 awk '$1 == "cache_access" {sum += $7}
11976 END { printf("%0.0f", sum) }')
11978 echo BEFORE:$BEFORE AFTER:$AFTER
11979 if ! let "AFTER - BEFORE == 4"; then
11981 error "roc_hit is not safe to use"
11989 function roc_hit() {
11990 local list=$(comma_list $(osts_nodes))
11991 echo $(get_osd_param $list '' stats |
11992 awk '$1 == "cache_hit" {sum += $7}
11993 END { printf("%0.0f", sum) }')
11996 function set_cache() {
11999 if [ "$2" == "off" ]; then
12002 local list=$(comma_list $(osts_nodes))
12003 set_osd_param $list '' $1_cache_enable $on
12005 cancel_lru_locks osc
12009 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12010 remote_ost_nodsh && skip "remote OST with nodsh"
12013 local list=$(comma_list $(osts_nodes))
12015 # check whether obdfilter is cache capable at all
12016 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
12017 skip "not cache-capable obdfilter"
12020 # check cache is enabled on all obdfilters
12021 if get_osd_param $list '' read_cache_enable | grep 0; then
12022 skip "oss cache is disabled"
12025 set_osd_param $list '' writethrough_cache_enable 1
12027 # check write cache is enabled on all obdfilters
12028 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
12029 skip "oss write cache is NOT enabled"
12034 #define OBD_FAIL_OBD_NO_LRU 0x609
12035 do_nodes $list $LCTL set_param fail_loc=0x609
12037 # pages should be in the case right after write
12038 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
12041 local BEFORE=$(roc_hit)
12042 cancel_lru_locks osc
12043 cat $DIR/$tfile >/dev/null
12044 local AFTER=$(roc_hit)
12046 do_nodes $list $LCTL set_param fail_loc=0
12048 if ! let "AFTER - BEFORE == CPAGES"; then
12049 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12052 # the following read invalidates the cache
12053 cancel_lru_locks osc
12054 set_osd_param $list '' read_cache_enable 0
12055 cat $DIR/$tfile >/dev/null
12057 # now data shouldn't be found in the cache
12059 cancel_lru_locks osc
12060 cat $DIR/$tfile >/dev/null
12062 if let "AFTER - BEFORE != 0"; then
12063 error "IN CACHE: before: $BEFORE, after: $AFTER"
12066 set_osd_param $list '' read_cache_enable 1
12069 run_test 151 "test cache on oss and controls ==============================="
12072 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12074 local TF="$TMP/$tfile"
12076 # simulate ENOMEM during write
12077 #define OBD_FAIL_OST_NOMEM 0x226
12078 lctl set_param fail_loc=0x80000226
12079 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12081 sync || error "sync failed"
12082 lctl set_param fail_loc=0
12084 # discard client's cache
12085 cancel_lru_locks osc
12087 # simulate ENOMEM during read
12088 lctl set_param fail_loc=0x80000226
12089 cmp $TF $DIR/$tfile || error "cmp failed"
12090 lctl set_param fail_loc=0
12094 run_test 152 "test read/write with enomem ============================"
12097 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
12099 run_test 153 "test if fdatasync does not crash ======================="
12101 dot_lustre_fid_permission_check() {
12103 local ffid=$MOUNT/.lustre/fid/$fid
12106 echo "stat fid $fid"
12107 stat $ffid > /dev/null || error "stat $ffid failed."
12108 echo "touch fid $fid"
12109 touch $ffid || error "touch $ffid failed."
12110 echo "write to fid $fid"
12111 cat /etc/hosts > $ffid || error "write $ffid failed."
12112 echo "read fid $fid"
12113 diff /etc/hosts $ffid || error "read $ffid failed."
12114 echo "append write to fid $fid"
12115 cat /etc/hosts >> $ffid || error "append write $ffid failed."
12116 echo "rename fid $fid"
12117 mv $ffid $test_dir/$tfile.1 &&
12118 error "rename $ffid to $tfile.1 should fail."
12119 touch $test_dir/$tfile.1
12120 mv $test_dir/$tfile.1 $ffid &&
12121 error "rename $tfile.1 to $ffid should fail."
12122 rm -f $test_dir/$tfile.1
12123 echo "truncate fid $fid"
12124 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
12125 echo "link fid $fid"
12126 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
12127 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
12128 echo "setfacl fid $fid"
12129 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
12130 echo "getfacl fid $fid"
12131 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
12133 echo "unlink fid $fid"
12134 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
12135 echo "mknod fid $fid"
12136 mknod $ffid c 1 3 && error "mknod $ffid should fail."
12138 fid=[0xf00000400:0x1:0x0]
12139 ffid=$MOUNT/.lustre/fid/$fid
12141 echo "stat non-exist fid $fid"
12142 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
12143 echo "write to non-exist fid $fid"
12144 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
12145 echo "link new fid $fid"
12146 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
12148 mkdir -p $test_dir/$tdir
12149 touch $test_dir/$tdir/$tfile
12150 fid=$($LFS path2fid $test_dir/$tdir)
12153 error "error: could not get fid for $test_dir/$dir/$tfile."
12155 ffid=$MOUNT/.lustre/fid/$fid
12158 ls $ffid > /dev/null || error "ls $ffid failed."
12159 echo "touch $fid/$tfile.1"
12160 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
12162 echo "touch $MOUNT/.lustre/fid/$tfile"
12163 touch $MOUNT/.lustre/fid/$tfile && \
12164 error "touch $MOUNT/.lustre/fid/$tfile should fail."
12166 echo "setxattr to $MOUNT/.lustre/fid"
12167 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
12169 echo "listxattr for $MOUNT/.lustre/fid"
12170 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
12172 echo "delxattr from $MOUNT/.lustre/fid"
12173 setfattr -x trusted.name1 $MOUNT/.lustre/fid
12175 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
12176 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
12177 error "touch invalid fid should fail."
12179 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
12180 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
12181 error "touch non-normal fid should fail."
12183 echo "rename $tdir to $MOUNT/.lustre/fid"
12184 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
12185 error "rename to $MOUNT/.lustre/fid should fail."
12187 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
12189 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
12190 local new_obf_mode=777
12192 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
12193 chmod $new_obf_mode $DIR/.lustre/fid ||
12194 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
12196 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
12197 [ $obf_mode -eq $new_obf_mode ] ||
12198 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
12200 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
12201 chmod $old_obf_mode $DIR/.lustre/fid ||
12202 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
12205 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
12206 fid=$($LFS path2fid $test_dir/$tfile-2)
12208 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
12210 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
12211 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
12212 error "create lov data thru .lustre failed"
12214 echo "cp /etc/passwd $test_dir/$tfile-2"
12215 cp /etc/passwd $test_dir/$tfile-2 ||
12216 error "copy to $test_dir/$tfile-2 failed."
12217 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
12218 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12219 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12221 rm -rf $test_dir/tfile.lnk
12222 rm -rf $test_dir/$tfile-2
12226 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12227 skip "Need MDS version at least 2.4.1"
12229 local tf=$DIR/$tfile
12232 local fid=$($LFS path2fid $tf)
12233 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12235 # check that we get the same pathname back
12236 local found=$($LFS fid2path $MOUNT "$fid")
12237 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12238 [ "$found" == "$tf" ] ||
12239 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12241 run_test 154A "lfs path2fid and fid2path basic checks"
12244 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12245 skip "Need MDS version at least 2.4.1"
12247 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12248 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12249 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12250 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12252 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12253 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12255 # check that we get the same pathname
12256 echo "PFID: $PFID, name: $name"
12257 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12258 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12259 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12260 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12262 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12264 run_test 154B "verify the ll_decode_linkea tool"
12267 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12268 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12269 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12270 skip "Need MDS version at least 2.2.51"
12271 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12273 cp /etc/hosts $DIR/$tfile
12275 fid=$($LFS path2fid $DIR/$tfile)
12277 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12279 dot_lustre_fid_permission_check "$fid" $DIR ||
12280 error "dot lustre permission check $fid failed"
12282 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12284 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12286 touch $MOUNT/.lustre/file &&
12287 error "creation is not allowed under .lustre"
12289 mkdir $MOUNT/.lustre/dir &&
12290 error "mkdir is not allowed under .lustre"
12294 run_test 154a "Open-by-FID"
12297 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12298 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12299 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12300 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12301 skip "Need MDS version at least 2.2.51"
12303 local remote_dir=$DIR/$tdir/remote_dir
12307 mkdir -p $DIR/$tdir
12308 $LFS mkdir -i $MDTIDX $remote_dir ||
12309 error "create remote directory failed"
12311 cp /etc/hosts $remote_dir/$tfile
12313 fid=$($LFS path2fid $remote_dir/$tfile)
12315 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12317 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12318 error "dot lustre permission check $fid failed"
12321 run_test 154b "Open-by-FID for remote directory"
12324 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12325 skip "Need MDS version at least 2.4.1"
12327 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12328 local FID1=$($LFS path2fid $DIR/$tfile.1)
12329 local FID2=$($LFS path2fid $DIR/$tfile.2)
12330 local FID3=$($LFS path2fid $DIR/$tfile.3)
12333 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12334 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12335 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12337 [ "$FID" = "${!want}" ] ||
12338 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12342 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12344 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12345 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12349 run_test 154c "lfs path2fid and fid2path multiple arguments"
12352 remote_mds_nodsh && skip "remote MDS with nodsh"
12353 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12354 skip "Need MDS version at least 2.5.53"
12356 if remote_mds; then
12357 nid=$($LCTL list_nids | sed "s/\./\\\./g")
12361 local proc_ofile="mdt.*.exports.'$nid'.open_files"
12368 local fid=$($LFS path2fid $DIR/$tfile)
12371 cmd="exec $fd<$DIR/$tfile"
12373 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
12374 echo "$fid_list" | grep "$fid"
12377 cmd="exec $fd>/dev/null"
12379 if [ $rc -ne 0 ]; then
12380 error "FID $fid not found in open files list $fid_list"
12383 run_test 154d "Verify open file fid"
12387 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
12388 skip "Need MDS version at least 2.6.50"
12390 if ls -a $MOUNT | grep -q '^\.lustre$'; then
12391 error ".lustre returned by readdir"
12394 run_test 154e ".lustre is not returned by readdir"
12397 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12399 # create parent directory on a single MDT to avoid cross-MDT hardlinks
12400 test_mkdir -p -c1 $DIR/$tdir/d
12401 # test dirs inherit from its stripe
12402 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
12403 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
12404 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
12405 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
12408 # get fid of parents
12409 local FID0=$($LFS path2fid $DIR/$tdir/d)
12410 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
12411 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
12412 local FID3=$($LFS path2fid $DIR)
12414 # check that path2fid --parents returns expected <parent_fid>/name
12415 # 1) test for a directory (single parent)
12416 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
12417 [ "$parent" == "$FID0/foo1" ] ||
12418 error "expected parent: $FID0/foo1, got: $parent"
12420 # 2) test for a file with nlink > 1 (multiple parents)
12421 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
12422 echo "$parent" | grep -F "$FID1/$tfile" ||
12423 error "$FID1/$tfile not returned in parent list"
12424 echo "$parent" | grep -F "$FID2/link" ||
12425 error "$FID2/link not returned in parent list"
12427 # 3) get parent by fid
12428 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
12429 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12430 echo "$parent" | grep -F "$FID1/$tfile" ||
12431 error "$FID1/$tfile not returned in parent list (by fid)"
12432 echo "$parent" | grep -F "$FID2/link" ||
12433 error "$FID2/link not returned in parent list (by fid)"
12435 # 4) test for entry in root directory
12436 parent=$($LFS path2fid --parents $DIR/f)
12437 echo "$parent" | grep -F "$FID3/f" ||
12438 error "$FID3/f not returned in parent list"
12440 # 5) test it on root directory
12441 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
12442 error "$MOUNT should not have parents"
12444 # enable xattr caching and check that linkea is correctly updated
12445 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
12446 save_lustre_params client "llite.*.xattr_cache" > $save
12447 lctl set_param llite.*.xattr_cache 1
12449 # 6.1) linkea update on rename
12450 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
12452 # get parents by fid
12453 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12454 # foo1 should no longer be returned in parent list
12455 echo "$parent" | grep -F "$FID1" &&
12456 error "$FID1 should no longer be in parent list"
12457 # the new path should appear
12458 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
12459 error "$FID2/$tfile.moved is not in parent list"
12461 # 6.2) linkea update on unlink
12462 rm -f $DIR/$tdir/d/foo2/link
12463 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12464 # foo2/link should no longer be returned in parent list
12465 echo "$parent" | grep -F "$FID2/link" &&
12466 error "$FID2/link should no longer be in parent list"
12470 restore_lustre_params < $save
12473 run_test 154f "get parent fids by reading link ea"
12477 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12478 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
12479 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
12480 skip "Need MDS version at least 2.6.92"
12482 mkdir -p $DIR/$tdir
12483 llapi_fid_test -d $DIR/$tdir
12485 run_test 154g "various llapi FID tests"
12487 test_155_small_load() {
12488 local temp=$TMP/$tfile
12489 local file=$DIR/$tfile
12491 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
12492 error "dd of=$temp bs=6096 count=1 failed"
12494 cancel_lru_locks $OSC
12495 cmp $temp $file || error "$temp $file differ"
12497 $TRUNCATE $temp 6000
12498 $TRUNCATE $file 6000
12499 cmp $temp $file || error "$temp $file differ (truncate1)"
12501 echo "12345" >>$temp
12502 echo "12345" >>$file
12503 cmp $temp $file || error "$temp $file differ (append1)"
12505 echo "12345" >>$temp
12506 echo "12345" >>$file
12507 cmp $temp $file || error "$temp $file differ (append2)"
12513 test_155_big_load() {
12514 remote_ost_nodsh && skip "remote OST with nodsh"
12516 local temp=$TMP/$tfile
12517 local file=$DIR/$tfile
12520 local cache_size=$(do_facet ost$((MAXI+1)) \
12521 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
12522 local large_file_size=$((cache_size * 2))
12524 echo "OSS cache size: $cache_size KB"
12525 echo "Large file size: $large_file_size KB"
12527 [ $MAXV -le $large_file_size ] &&
12528 skip_env "max available OST size needs > $large_file_size KB"
12530 $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed"
12532 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
12533 error "dd of=$temp bs=$large_file_size count=1k failed"
12536 cancel_lru_locks osc
12537 cmp $temp $file || error "$temp $file differ"
12543 save_writethrough() {
12544 local facets=$(get_facets OST)
12546 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
12550 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12552 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12554 save_writethrough $p
12557 set_cache writethrough on
12558 test_155_small_load
12559 restore_lustre_params < $p
12562 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
12565 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12567 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12569 save_writethrough $p
12572 set_cache writethrough off
12573 test_155_small_load
12574 restore_lustre_params < $p
12577 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
12580 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12582 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12584 save_writethrough $p
12587 set_cache writethrough on
12588 test_155_small_load
12589 restore_lustre_params < $p
12592 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
12595 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12597 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12599 save_writethrough $p
12602 set_cache writethrough off
12603 test_155_small_load
12604 restore_lustre_params < $p
12607 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
12610 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12612 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12614 save_writethrough $p
12617 set_cache writethrough on
12619 restore_lustre_params < $p
12622 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
12625 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12627 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12629 save_writethrough $p
12632 set_cache writethrough off
12634 restore_lustre_params < $p
12637 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
12640 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12642 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12644 save_writethrough $p
12647 set_cache writethrough on
12649 restore_lustre_params < $p
12652 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
12655 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12657 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12659 save_writethrough $p
12662 set_cache writethrough off
12664 restore_lustre_params < $p
12667 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
12670 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12671 remote_ost_nodsh && skip "remote OST with nodsh"
12672 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
12673 skip "stats not implemented on old servers"
12674 [ "$ost1_FSTYPE" = "zfs" ] &&
12675 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
12680 local file="$DIR/$tfile"
12681 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12683 save_writethrough $p
12686 log "Turn on read and write cache"
12688 set_cache writethrough on
12690 log "Write data and read it back."
12691 log "Read should be satisfied from the cache."
12692 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12694 cancel_lru_locks osc
12695 cat $file >/dev/null
12697 if ! let "AFTER - BEFORE == CPAGES"; then
12698 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12700 log "cache hits:: before: $BEFORE, after: $AFTER"
12703 log "Read again; it should be satisfied from the cache."
12705 cancel_lru_locks osc
12706 cat $file >/dev/null
12708 if ! let "AFTER - BEFORE == CPAGES"; then
12709 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12711 log "cache hits:: before: $BEFORE, after: $AFTER"
12714 log "Turn off the read cache and turn on the write cache"
12716 set_cache writethrough on
12718 log "Read again; it should be satisfied from the cache."
12720 cancel_lru_locks osc
12721 cat $file >/dev/null
12723 if ! let "AFTER - BEFORE == CPAGES"; then
12724 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12726 log "cache hits:: before: $BEFORE, after: $AFTER"
12729 log "Read again; it should not be satisfied from the cache."
12731 cancel_lru_locks osc
12732 cat $file >/dev/null
12734 if ! let "AFTER - BEFORE == 0"; then
12735 error "IN CACHE: before: $BEFORE, after: $AFTER"
12737 log "cache hits:: before: $BEFORE, after: $AFTER"
12740 log "Write data and read it back."
12741 log "Read should be satisfied from the cache."
12742 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12744 cancel_lru_locks osc
12745 cat $file >/dev/null
12747 if ! let "AFTER - BEFORE == CPAGES"; then
12748 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12750 log "cache hits:: before: $BEFORE, after: $AFTER"
12753 log "Read again; it should not be satisfied from the cache."
12755 cancel_lru_locks osc
12756 cat $file >/dev/null
12758 if ! let "AFTER - BEFORE == 0"; then
12759 error "IN CACHE: before: $BEFORE, after: $AFTER"
12761 log "cache hits:: before: $BEFORE, after: $AFTER"
12764 log "Turn off read and write cache"
12766 set_cache writethrough off
12768 log "Write data and read it back"
12769 log "It should not be satisfied from the cache."
12771 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12772 cancel_lru_locks osc
12774 cat $file >/dev/null
12776 if ! let "AFTER - BEFORE == 0"; then
12777 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12779 log "cache hits:: before: $BEFORE, after: $AFTER"
12782 log "Turn on the read cache and turn off the write cache"
12784 set_cache writethrough off
12786 log "Write data and read it back"
12787 log "It should not be satisfied from the cache."
12789 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12791 cancel_lru_locks osc
12792 cat $file >/dev/null
12794 if ! let "AFTER - BEFORE == 0"; then
12795 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12797 log "cache hits:: before: $BEFORE, after: $AFTER"
12800 log "Read again; it should be satisfied from the cache."
12802 cancel_lru_locks osc
12803 cat $file >/dev/null
12805 if ! let "AFTER - BEFORE == CPAGES"; then
12806 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12808 log "cache hits:: before: $BEFORE, after: $AFTER"
12811 restore_lustre_params < $p
12814 run_test 156 "Verification of tunables"
12817 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12818 remote_mds_nodsh && skip "remote MDS with nodsh"
12819 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
12820 skip "Need MDS version at least 2.2.0"
12822 changelog_register || error "changelog_register failed"
12823 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
12824 changelog_users $SINGLEMDS | grep -q $cl_user ||
12825 error "User $cl_user not found in changelog_users"
12828 test_mkdir -p $DIR/$tdir/pics/2008/zachy
12829 changelog_clear 0 || error "changelog_clear failed"
12830 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
12831 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
12832 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
12833 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
12834 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
12835 rm $DIR/$tdir/pics/desktop.jpg
12837 changelog_dump | tail -10
12839 echo "verifying changelog mask"
12840 changelog_chmask "-MKDIR"
12841 changelog_chmask "-CLOSE"
12843 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
12844 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
12846 changelog_chmask "+MKDIR"
12847 changelog_chmask "+CLOSE"
12849 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
12850 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
12852 changelog_dump | tail -10
12853 MKDIRS=$(changelog_dump | grep -c "MKDIR")
12854 CLOSES=$(changelog_dump | grep -c "CLOSE")
12855 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
12856 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
12859 echo "verifying target fid"
12860 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
12861 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
12862 [ "$fidc" == "$fidf" ] ||
12863 error "changelog '$tfile' fid $fidc != file fid $fidf"
12864 echo "verifying parent fid"
12865 # The FID returned from the Changelog may be the directory shard on
12866 # a different MDT, and not the FID returned by path2fid on the parent.
12867 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
12868 # since this is what will matter when recreating this file in the tree.
12869 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
12870 local pathp=$($LFS fid2path $MOUNT "$fidp")
12871 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
12872 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
12874 echo "getting records for $cl_user"
12875 changelog_users $SINGLEMDS
12876 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
12878 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
12879 error "changelog_clear failed"
12880 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
12881 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
12882 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
12883 error "user index expect $user_rec1 + $nclr != $user_rec2"
12885 local min0_rec=$(changelog_users $SINGLEMDS |
12886 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
12887 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
12888 awk '{ print $1; exit; }')
12890 changelog_dump | tail -n 5
12891 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
12892 [ $first_rec == $((min0_rec + 1)) ] ||
12893 error "first index should be $min0_rec + 1 not $first_rec"
12895 # LU-3446 changelog index reset on MDT restart
12896 local cur_rec1=$(changelog_users $SINGLEMDS |
12897 awk '/^current.index:/ { print $NF }')
12898 changelog_clear 0 ||
12899 error "clear all changelog records for $cl_user failed"
12900 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
12901 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
12902 error "Fail to start $SINGLEMDS"
12903 local cur_rec2=$(changelog_users $SINGLEMDS |
12904 awk '/^current.index:/ { print $NF }')
12905 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
12906 [ $cur_rec1 == $cur_rec2 ] ||
12907 error "current index should be $cur_rec1 not $cur_rec2"
12909 echo "verifying users from this test are deregistered"
12910 changelog_deregister || error "changelog_deregister failed"
12911 changelog_users $SINGLEMDS | grep -q $cl_user &&
12912 error "User '$cl_user' still in changelog_users"
12914 # lctl get_param -n mdd.*.changelog_users
12915 # current index: 144
12916 # ID index (idle seconds)
12918 if ! changelog_users $SINGLEMDS | grep "^cl"; then
12919 # this is the normal case where all users were deregistered
12920 # make sure no new records are added when no users are present
12921 local last_rec1=$(changelog_users $SINGLEMDS |
12922 awk '/^current.index:/ { print $NF }')
12923 touch $DIR/$tdir/chloe
12924 local last_rec2=$(changelog_users $SINGLEMDS |
12925 awk '/^current.index:/ { print $NF }')
12926 echo "verify changelogs are off: $last_rec1 == $last_rec2"
12927 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
12929 # any changelog users must be leftovers from a previous test
12930 changelog_users $SINGLEMDS
12931 echo "other changelog users; can't verify off"
12934 run_test 160a "changelog sanity"
12936 test_160b() { # LU-3587
12937 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12938 remote_mds_nodsh && skip "remote MDS with nodsh"
12939 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
12940 skip "Need MDS version at least 2.2.0"
12942 changelog_register || error "changelog_register failed"
12943 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
12944 changelog_users $SINGLEMDS | grep -q $cl_user ||
12945 error "User '$cl_user' not found in changelog_users"
12947 local longname1=$(str_repeat a 255)
12948 local longname2=$(str_repeat b 255)
12951 echo "creating very long named file"
12952 touch $longname1 || error "create of '$longname1' failed"
12953 echo "renaming very long named file"
12954 mv $longname1 $longname2
12956 changelog_dump | grep RENME | tail -n 5
12959 run_test 160b "Verify that very long rename doesn't crash in changelog"
12962 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12963 remote_mds_nodsh && skip "remote MDS with nodsh"
12965 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
12966 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
12967 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
12968 skip "Need MDS version at least 2.5.58 or 2.5.2+"
12972 # Registration step
12973 changelog_register || error "changelog_register failed"
12976 mkdir -p $DIR/$tdir
12977 $MCREATE $DIR/$tdir/foo_160c
12978 changelog_chmask "-TRUNC"
12979 $TRUNCATE $DIR/$tdir/foo_160c 200
12980 changelog_chmask "+TRUNC"
12981 $TRUNCATE $DIR/$tdir/foo_160c 199
12982 changelog_dump | tail -n 5
12983 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
12984 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
12986 run_test 160c "verify that changelog log catch the truncate event"
12989 remote_mds_nodsh && skip "remote MDS with nodsh"
12990 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12991 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12992 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
12993 skip "Need MDS version at least 2.7.60"
12995 # Registration step
12996 changelog_register || error "changelog_register failed"
12998 mkdir -p $DIR/$tdir/migrate_dir
12999 changelog_clear 0 || error "changelog_clear failed"
13001 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
13002 changelog_dump | tail -n 5
13003 local migrates=$(changelog_dump | grep -c "MIGRT")
13004 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
13006 run_test 160d "verify that changelog log catch the migrate event"
13009 remote_mds_nodsh && skip "remote MDS with nodsh"
13012 changelog_register || error "changelog_register failed"
13014 # Delete a future user (expect fail)
13015 local MDT0=$(facet_svc $SINGLEMDS)
13016 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
13019 if [ $rc -eq 0 ]; then
13020 error "Deleted non-existant user cl77"
13021 elif [ $rc -ne 2 ]; then
13022 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
13025 # Clear to a bad index (1 billion should be safe)
13026 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
13029 if [ $rc -eq 0 ]; then
13030 error "Successfully cleared to invalid CL index"
13031 elif [ $rc -ne 22 ]; then
13032 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
13035 run_test 160e "changelog negative testing (should return errors)"
13038 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13039 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13040 skip "Need MDS version at least 2.10.56"
13042 local mdts=$(comma_list $(mdts_nodes))
13045 changelog_register || error "first changelog_register failed"
13046 changelog_register || error "second changelog_register failed"
13048 declare -A cl_user1
13049 declare -A cl_user2
13054 # generate some changelog records to accumulate on each MDT
13055 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13056 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13057 error "create $DIR/$tdir/$tfile failed"
13059 # check changelogs have been generated
13060 local nbcl=$(changelog_dump | wc -l)
13061 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13063 for param in "changelog_max_idle_time=10" \
13065 "changelog_min_gc_interval=2" \
13066 "changelog_min_free_cat_entries=3"; do
13067 local MDT0=$(facet_svc $SINGLEMDS)
13068 local var="${param%=*}"
13069 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13071 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13072 do_nodes $mdts $LCTL set_param mdd.*.$param
13075 # force cl_user2 to be idle (1st part)
13078 # simulate changelog catalog almost full
13079 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13080 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13082 for i in $(seq $MDSCOUNT); do
13083 cl_users=(${CL_USERS[mds$i]})
13084 cl_user1[mds$i]="${cl_users[0]}"
13085 cl_user2[mds$i]="${cl_users[1]}"
13087 [ -n "${cl_user1[mds$i]}" ] ||
13088 error "mds$i: no user registered"
13089 [ -n "${cl_user2[mds$i]}" ] ||
13090 error "mds$i: only ${cl_user2[mds$i]} is registered"
13092 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13093 [ -n "$user_rec1" ] ||
13094 error "mds$i: User ${cl_user1[mds$i]} not registered"
13095 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13096 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13097 [ -n "$user_rec2" ] ||
13098 error "mds$i: User ${cl_user1[mds$i]} not registered"
13099 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13100 "$user_rec1 + 2 == $user_rec2"
13101 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13102 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13103 "$user_rec1 + 2, but is $user_rec2"
13104 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13105 [ -n "$user_rec2" ] ||
13106 error "mds$i: User ${cl_user2[mds$i]} not registered"
13107 [ $user_rec1 == $user_rec2 ] ||
13108 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13109 "$user_rec1, but is $user_rec2"
13112 # force cl_user2 to be idle (2nd part) and to reach
13113 # changelog_max_idle_time
13116 # generate one more changelog to trigger fail_loc
13117 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13118 error "create $DIR/$tdir/${tfile}bis failed"
13120 # ensure gc thread is done
13121 for i in $(mdts_nodes); do
13123 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13124 error "$i: GC-thread not done"
13128 for i in $(seq $MDSCOUNT); do
13129 # check cl_user1 still registered
13130 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13131 error "mds$i: User ${cl_user1[mds$i]} not registered"
13132 # check cl_user2 unregistered
13133 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13134 error "mds$i: User ${cl_user2[mds$i]} still registered"
13136 # check changelogs are present and starting at $user_rec1 + 1
13137 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13138 [ -n "$user_rec1" ] ||
13139 error "mds$i: User ${cl_user1[mds$i]} not registered"
13140 first_rec=$($LFS changelog $(facet_svc mds$i) |
13141 awk '{ print $1; exit; }')
13143 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13144 [ $((user_rec1 + 1)) == $first_rec ] ||
13145 error "mds$i: first index should be $user_rec1 + 1, " \
13146 "but is $first_rec"
13149 run_test 160f "changelog garbage collect (timestamped users)"
13152 remote_mds_nodsh && skip "remote MDS with nodsh"
13153 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13154 skip "Need MDS version at least 2.10.56"
13156 local mdts=$(comma_list $(mdts_nodes))
13158 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
13159 do_nodes $mdts $LCTL set_param fail_loc=0x1314
13162 changelog_register || error "first changelog_register failed"
13163 changelog_register || error "second changelog_register failed"
13165 declare -A cl_user1
13166 declare -A cl_user2
13171 # generate some changelog records to accumulate on each MDT
13172 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13173 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13174 error "create $DIR/$tdir/$tfile failed"
13176 # check changelogs have been generated
13177 local nbcl=$(changelog_dump | wc -l)
13178 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13180 # reduce the max_idle_indexes value to make sure we exceed it
13181 max_ndx=$((nbcl / 2 - 1))
13183 for param in "changelog_max_idle_indexes=$max_ndx" \
13185 "changelog_min_gc_interval=2" \
13186 "changelog_min_free_cat_entries=3"; do
13187 local MDT0=$(facet_svc $SINGLEMDS)
13188 local var="${param%=*}"
13189 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13191 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13192 do_nodes $mdts $LCTL set_param mdd.*.$param ||
13193 error "unable to set mdd.*.$param"
13196 # simulate changelog catalog almost full
13197 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13198 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13200 for i in $(seq $MDSCOUNT); do
13201 cl_users=(${CL_USERS[mds$i]})
13202 cl_user1[mds$i]="${cl_users[0]}"
13203 cl_user2[mds$i]="${cl_users[1]}"
13205 [ -n "${cl_user1[mds$i]}" ] ||
13206 error "mds$i: no user registered"
13207 [ -n "${cl_user2[mds$i]}" ] ||
13208 error "mds$i: only ${cl_user1[mds$i]} is registered"
13210 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13211 [ -n "$user_rec1" ] ||
13212 error "mds$i: User ${cl_user1[mds$i]} not registered"
13213 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13214 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13215 [ -n "$user_rec2" ] ||
13216 error "mds$i: User ${cl_user1[mds$i]} not registered"
13217 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13218 "$user_rec1 + 2 == $user_rec2"
13219 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13220 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13221 "$user_rec1 + 2, but is $user_rec2"
13222 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13223 [ -n "$user_rec2" ] ||
13224 error "mds$i: User ${cl_user2[mds$i]} not registered"
13225 [ $user_rec1 == $user_rec2 ] ||
13226 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13227 "$user_rec1, but is $user_rec2"
13230 # ensure we are past the previous changelog_min_gc_interval set above
13233 # generate one more changelog to trigger fail_loc
13234 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13235 error "create $DIR/$tdir/${tfile}bis failed"
13237 # ensure gc thread is done
13238 for i in $(mdts_nodes); do
13240 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13241 error "$i: GC-thread not done"
13245 for i in $(seq $MDSCOUNT); do
13246 # check cl_user1 still registered
13247 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13248 error "mds$i: User ${cl_user1[mds$i]} not registered"
13249 # check cl_user2 unregistered
13250 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13251 error "mds$i: User ${cl_user2[mds$i]} still registered"
13253 # check changelogs are present and starting at $user_rec1 + 1
13254 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13255 [ -n "$user_rec1" ] ||
13256 error "mds$i: User ${cl_user1[mds$i]} not registered"
13257 first_rec=$($LFS changelog $(facet_svc mds$i) |
13258 awk '{ print $1; exit; }')
13260 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13261 [ $((user_rec1 + 1)) == $first_rec ] ||
13262 error "mds$i: first index should be $user_rec1 + 1, " \
13263 "but is $first_rec"
13266 run_test 160g "changelog garbage collect (old users)"
13269 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13270 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13271 skip "Need MDS version at least 2.10.56"
13273 local mdts=$(comma_list $(mdts_nodes))
13276 changelog_register || error "first changelog_register failed"
13277 changelog_register || error "second changelog_register failed"
13279 declare -A cl_user1
13280 declare -A cl_user2
13285 # generate some changelog records to accumulate on each MDT
13286 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13287 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13288 error "create $DIR/$tdir/$tfile failed"
13290 # check changelogs have been generated
13291 local nbcl=$(changelog_dump | wc -l)
13292 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13294 for param in "changelog_max_idle_time=10" \
13296 "changelog_min_gc_interval=2"; do
13297 local MDT0=$(facet_svc $SINGLEMDS)
13298 local var="${param%=*}"
13299 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13301 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13302 do_nodes $mdts $LCTL set_param mdd.*.$param
13305 # force cl_user2 to be idle (1st part)
13308 for i in $(seq $MDSCOUNT); do
13309 cl_users=(${CL_USERS[mds$i]})
13310 cl_user1[mds$i]="${cl_users[0]}"
13311 cl_user2[mds$i]="${cl_users[1]}"
13313 [ -n "${cl_user1[mds$i]}" ] ||
13314 error "mds$i: no user registered"
13315 [ -n "${cl_user2[mds$i]}" ] ||
13316 error "mds$i: only ${cl_user2[mds$i]} is registered"
13318 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13319 [ -n "$user_rec1" ] ||
13320 error "mds$i: User ${cl_user1[mds$i]} not registered"
13321 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13322 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13323 [ -n "$user_rec2" ] ||
13324 error "mds$i: User ${cl_user1[mds$i]} not registered"
13325 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13326 "$user_rec1 + 2 == $user_rec2"
13327 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13328 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13329 "$user_rec1 + 2, but is $user_rec2"
13330 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13331 [ -n "$user_rec2" ] ||
13332 error "mds$i: User ${cl_user2[mds$i]} not registered"
13333 [ $user_rec1 == $user_rec2 ] ||
13334 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13335 "$user_rec1, but is $user_rec2"
13338 # force cl_user2 to be idle (2nd part) and to reach
13339 # changelog_max_idle_time
13342 # force each GC-thread start and block then
13343 # one per MDT/MDD, set fail_val accordingly
13344 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13345 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13347 # generate more changelogs to trigger fail_loc
13348 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13349 error "create $DIR/$tdir/${tfile}bis failed"
13351 # stop MDT to stop GC-thread, should be done in back-ground as it will
13352 # block waiting for the thread to be released and exit
13353 declare -A stop_pids
13354 for i in $(seq $MDSCOUNT); do
13356 stop_pids[mds$i]=$!
13359 for i in $(mdts_nodes); do
13362 local facets=$(facets_up_on_host $i)
13364 for facet in ${facets//,/ }; do
13365 if [[ $facet == mds* ]]; then
13369 # ensure each MDS's gc threads are still present and all in "R"
13370 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
13371 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
13372 error "$i: expected $nb GC-thread"
13374 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
13376 error "$i: GC-thread not found in R-state"
13377 # check umounts of each MDT on MDS have reached kthread_stop()
13378 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
13379 error "$i: expected $nb umount"
13381 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
13382 error "$i: umount not found in D-state"
13385 # release all GC-threads
13386 do_nodes $mdts $LCTL set_param fail_loc=0
13388 # wait for MDT stop to complete
13389 for i in $(seq $MDSCOUNT); do
13390 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
13394 # may try to check if any orphan changelog records are present
13395 # via ldiskfs/zfs and llog_reader...
13397 # re-start/mount MDTs
13398 for i in $(seq $MDSCOUNT); do
13399 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
13400 error "Fail to start mds$i"
13404 for i in $(seq $MDSCOUNT); do
13405 # check cl_user1 still registered
13406 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13407 error "mds$i: User ${cl_user1[mds$i]} not registered"
13408 # check cl_user2 unregistered
13409 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13410 error "mds$i: User ${cl_user2[mds$i]} still registered"
13412 # check changelogs are present and starting at $user_rec1 + 1
13413 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13414 [ -n "$user_rec1" ] ||
13415 error "mds$i: User ${cl_user1[mds$i]} not registered"
13416 first_rec=$($LFS changelog $(facet_svc mds$i) |
13417 awk '{ print $1; exit; }')
13419 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13420 [ $((user_rec1 + 1)) == $first_rec ] ||
13421 error "mds$i: first index should be $user_rec1 + 1, " \
13422 "but is $first_rec"
13425 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
13430 local mdts=$(comma_list $(mdts_nodes))
13432 changelog_register || error "first changelog_register failed"
13434 # generate some changelog records to accumulate on each MDT
13435 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13436 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13437 error "create $DIR/$tdir/$tfile failed"
13439 # check changelogs have been generated
13440 local nbcl=$(changelog_dump | wc -l)
13441 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13443 # simulate race between register and unregister
13444 # XXX as fail_loc is set per-MDS, with DNE configs the race
13445 # simulation will only occur for one MDT per MDS and for the
13446 # others the normal race scenario will take place
13447 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
13448 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
13449 do_nodes $mdts $LCTL set_param fail_val=1
13451 # unregister 1st user
13452 changelog_deregister &
13454 # wait some time for deregister work to reach race rdv
13456 # register 2nd user
13457 changelog_register || error "2nd user register failed"
13459 wait $pid1 || error "1st user deregister failed"
13463 declare -A LAST_REC
13464 for i in $(seq $MDSCOUNT); do
13465 if changelog_users mds$i | grep "^cl"; then
13466 # make sure new records are added with one user present
13467 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
13468 awk '/^current.index:/ { print $NF }')
13470 error "mds$i has no user registered"
13474 # generate more changelog records to accumulate on each MDT
13475 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13476 error "create $DIR/$tdir/${tfile}bis failed"
13478 for i in $(seq $MDSCOUNT); do
13479 last_rec=$(changelog_users $SINGLEMDS |
13480 awk '/^current.index:/ { print $NF }')
13481 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
13482 [ $last_rec != ${LAST_REC[mds$i]} ] ||
13483 error "changelogs are off on mds$i"
13486 run_test 160i "changelog user register/unregister race"
13489 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13490 remote_mds_nodsh && skip "remote MDS with nodsh"
13492 mkdir -p $DIR/$tdir/1/1
13494 changelog_register || error "changelog_register failed"
13495 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13497 changelog_users $SINGLEMDS | grep -q $cl_user ||
13498 error "User '$cl_user' not found in changelog_users"
13499 #define OBD_FAIL_MDS_CHANGELOG_REORDER 0x15d
13500 do_facet mds1 $LCTL set_param fail_loc=0x8000015d fail_val=3
13501 rmdir $DIR/$tdir/1/1 & sleep 1
13503 touch $DIR/$tdir/2/2
13504 rm -rf $DIR/$tdir/2
13509 changelog_dump | grep rmdir || error "rmdir not recorded"
13512 changelog_deregister
13514 run_test 160k "Verify that changelog records are not lost"
13517 remote_mds_nodsh && skip "remote MDS with nodsh"
13518 [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] &&
13519 skip "Need MDS version at least 2.12.56"
13521 mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
13523 changelog_register || error "first changelog_register failed"
13525 # generate some changelog
13526 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13527 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13528 error "create $DIR/$tdir/${tfile}bis failed"
13530 # open the changelog device
13531 exec 3>/dev/changelog-$FSNAME-MDT0000
13532 exec 4</dev/changelog-$FSNAME-MDT0000
13534 # umount the first lustre mount
13538 cat <&4 >/dev/null || error "read changelog failed"
13541 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13542 changelog_users $SINGLEMDS | grep -q $cl_user ||
13543 error "User $cl_user not found in changelog_users"
13545 printf 'clear:'$cl_user':0' >&3
13552 changelog_deregister || error "changelog_deregister failed"
13555 mount_client $MOUNT || error "mount_client on $MOUNT failed"
13557 run_test 160j "client can be umounted while its chanangelog is being used"
13560 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13562 test_mkdir -c1 $DIR/$tdir
13563 cp /etc/hosts $DIR/$tdir/$tfile
13564 test_mkdir -c1 $DIR/$tdir/foo1
13565 test_mkdir -c1 $DIR/$tdir/foo2
13566 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
13567 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
13568 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
13569 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
13570 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
13571 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13572 $LFS fid2path $DIR $FID
13573 error "bad link ea"
13576 rm $DIR/$tdir/foo2/zachary
13578 rm $DIR/$tdir/foo2/thor
13580 rm $DIR/$tdir/$tfile
13582 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
13583 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
13584 { $LFS fid2path $DIR $FID; error "bad link rename"; }
13585 rm $DIR/$tdir/foo2/maggie
13588 local longname=$tfile.avg_len_is_thirty_two_
13589 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
13590 error_noexit 'failed to unlink many hardlinks'" EXIT
13591 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
13592 error "failed to hardlink many files"
13593 links=$($LFS fid2path $DIR $FID | wc -l)
13594 echo -n "${links}/1000 links in link EA"
13595 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
13597 run_test 161a "link ea sanity"
13600 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13601 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
13604 local remote_dir=$DIR/$tdir/remote_dir
13606 mkdir -p $DIR/$tdir
13607 $LFS mkdir -i $MDTIDX $remote_dir ||
13608 error "create remote directory failed"
13610 cp /etc/hosts $remote_dir/$tfile
13611 mkdir -p $remote_dir/foo1
13612 mkdir -p $remote_dir/foo2
13613 ln $remote_dir/$tfile $remote_dir/foo1/sofia
13614 ln $remote_dir/$tfile $remote_dir/foo2/zachary
13615 ln $remote_dir/$tfile $remote_dir/foo1/luna
13616 ln $remote_dir/$tfile $remote_dir/foo2/thor
13618 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
13620 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13621 $LFS fid2path $DIR $FID
13622 error "bad link ea"
13625 rm $remote_dir/foo2/zachary
13627 rm $remote_dir/foo2/thor
13629 rm $remote_dir/$tfile
13631 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
13632 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
13633 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
13634 $LFS fid2path $DIR $FID
13635 error "bad link rename"
13637 rm $remote_dir/foo2/maggie
13640 local longname=filename_avg_len_is_thirty_two_
13641 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
13642 error "failed to hardlink many files"
13643 links=$($LFS fid2path $DIR $FID | wc -l)
13644 echo -n "${links}/1000 links in link EA"
13645 [[ ${links} -gt 60 ]] ||
13646 error "expected at least 60 links in link EA"
13647 unlinkmany $remote_dir/foo2/$longname 1000 ||
13648 error "failed to unlink many hardlinks"
13650 run_test 161b "link ea sanity under remote directory"
13653 remote_mds_nodsh && skip "remote MDS with nodsh"
13654 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13655 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
13656 skip "Need MDS version at least 2.1.5"
13658 # define CLF_RENAME_LAST 0x0001
13659 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
13660 changelog_register || error "changelog_register failed"
13663 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
13664 touch $DIR/$tdir/foo_161c
13665 touch $DIR/$tdir/bar_161c
13666 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13667 changelog_dump | grep RENME | tail -n 5
13668 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13669 changelog_clear 0 || error "changelog_clear failed"
13670 if [ x$flags != "x0x1" ]; then
13671 error "flag $flags is not 0x1"
13674 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
13675 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
13676 touch $DIR/$tdir/foo_161c
13677 touch $DIR/$tdir/bar_161c
13678 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13679 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13680 changelog_dump | grep RENME | tail -n 5
13681 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13682 changelog_clear 0 || error "changelog_clear failed"
13683 if [ x$flags != "x0x0" ]; then
13684 error "flag $flags is not 0x0"
13686 echo "rename overwrite a target having nlink > 1," \
13687 "changelog record has flags of $flags"
13689 # rename doesn't overwrite a target (changelog flag 0x0)
13690 touch $DIR/$tdir/foo_161c
13691 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
13692 changelog_dump | grep RENME | tail -n 5
13693 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
13694 changelog_clear 0 || error "changelog_clear failed"
13695 if [ x$flags != "x0x0" ]; then
13696 error "flag $flags is not 0x0"
13698 echo "rename doesn't overwrite a target," \
13699 "changelog record has flags of $flags"
13701 # define CLF_UNLINK_LAST 0x0001
13702 # unlink a file having nlink = 1 (changelog flag 0x1)
13703 rm -f $DIR/$tdir/foo2_161c
13704 changelog_dump | grep UNLNK | tail -n 5
13705 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13706 changelog_clear 0 || error "changelog_clear failed"
13707 if [ x$flags != "x0x1" ]; then
13708 error "flag $flags is not 0x1"
13710 echo "unlink a file having nlink = 1," \
13711 "changelog record has flags of $flags"
13713 # unlink a file having nlink > 1 (changelog flag 0x0)
13714 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13715 rm -f $DIR/$tdir/foobar_161c
13716 changelog_dump | grep UNLNK | tail -n 5
13717 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13718 changelog_clear 0 || error "changelog_clear failed"
13719 if [ x$flags != "x0x0" ]; then
13720 error "flag $flags is not 0x0"
13722 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
13724 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
13727 remote_mds_nodsh && skip "remote MDS with nodsh"
13732 changelog_register || error "changelog_register failed"
13734 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
13735 # interfer with $MOUNT/.lustre/fid/ access
13737 [[ $? -eq 0 ]] || error "mkdir failed"
13739 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
13740 $LCTL set_param fail_loc=0x8000140c
13742 $LCTL set_param fail_val=5
13745 echo foofoo > $DIR/$tdir/$tfile &
13748 # wait for create to be delayed
13752 [[ $? -eq 0 ]] || error "create should be blocked"
13754 local tempfile=$(mktemp)
13755 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
13756 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
13757 # some delay may occur during ChangeLog publishing and file read just
13758 # above, that could allow file write to happen finally
13759 [[ -s $tempfile ]] && echo "file should be empty"
13761 $LCTL set_param fail_loc=0
13764 [[ $? -eq 0 ]] || error "create failed"
13766 run_test 161d "create with concurrent .lustre/fid access"
13769 local expected="$1"
13774 path=$($LFS fid2path "$@")
13777 if [ $rc -ne 0 ]; then
13778 error "path looked up of '$expected' failed: rc=$rc"
13779 elif [ "$path" != "$expected" ]; then
13780 error "path looked up '$path' instead of '$expected'"
13782 echo "FID '$fid' resolves to path '$path' as expected"
13786 test_162a() { # was test_162
13787 test_mkdir -p -c1 $DIR/$tdir/d2
13788 touch $DIR/$tdir/d2/$tfile
13789 touch $DIR/$tdir/d2/x1
13790 touch $DIR/$tdir/d2/x2
13791 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
13792 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
13794 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
13795 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
13798 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
13799 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
13800 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
13802 # softlink to wrong file
13803 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
13804 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
13805 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
13808 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
13809 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
13810 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
13811 # fid2path dir/fsname should both work
13812 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
13813 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
13815 # hardlink count: check that there are 2 links
13816 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
13817 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
13819 # hardlink indexing: remove the first link
13820 rm $DIR/$tdir/d2/p/q/r/hlink
13821 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
13823 run_test 162a "path lookup sanity"
13826 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13827 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13830 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
13831 error "create striped dir failed"
13833 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
13834 tail -n 1 | awk '{print $2}')
13835 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
13837 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
13838 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
13841 for ((i=0;i<5;i++)); do
13842 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
13843 error "get fid for f$i failed"
13844 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
13846 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
13847 error "get fid for d$i failed"
13848 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
13853 run_test 162b "striped directory path lookup sanity"
13855 # LU-4239: Verify fid2path works with paths 100 or more directories deep
13857 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
13858 skip "Need MDS version at least 2.7.51"
13860 local lpath=$tdir.local
13861 local rpath=$tdir.remote
13863 test_mkdir $DIR/$lpath
13864 test_mkdir $DIR/$rpath
13866 for ((i = 0; i <= 101; i++)); do
13869 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
13870 error "get fid for local directory $DIR/$lpath failed"
13871 check_path "$DIR/$lpath" $MOUNT $FID --link 0
13874 test_mkdir $DIR/$rpath
13875 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
13876 error "get fid for remote directory $DIR/$rpath failed"
13877 check_path "$DIR/$rpath" $MOUNT $FID --link 0
13882 run_test 162c "fid2path works with paths 100 or more directories deep"
13885 # do directio so as not to populate the page cache
13886 log "creating a 10 Mb file"
13887 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
13888 log "starting reads"
13889 dd if=$DIR/$tfile of=/dev/null bs=4096 &
13890 log "truncating the file"
13891 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
13893 kill %+ || true # reads might have finished
13894 echo "wait until dd is finished"
13896 log "removing the temporary file"
13897 rm -rf $DIR/$tfile || error "tmp file removal failed"
13899 run_test 169 "parallel read and truncate should not deadlock"
13902 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13904 $LCTL clear # bug 18514
13905 $LCTL debug_daemon start $TMP/${tfile}_log_good
13907 $LCTL debug_daemon stop
13908 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
13909 error "sed failed to read log_good"
13911 $LCTL debug_daemon start $TMP/${tfile}_log_good
13913 $LCTL debug_daemon stop
13915 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
13916 error "lctl df log_bad failed"
13918 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
13919 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
13921 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
13922 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
13924 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
13925 error "bad_line good_line1 good_line2 are empty"
13927 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
13928 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
13929 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
13931 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
13932 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
13933 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
13935 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
13936 error "bad_line_new good_line_new are empty"
13938 local expected_good=$((good_line1 + good_line2*2))
13940 rm -f $TMP/${tfile}*
13941 # LU-231, short malformed line may not be counted into bad lines
13942 if [ $bad_line -ne $bad_line_new ] &&
13943 [ $bad_line -ne $((bad_line_new - 1)) ]; then
13944 error "expected $bad_line bad lines, but got $bad_line_new"
13948 if [ $expected_good -ne $good_line_new ]; then
13949 error "expected $expected_good good lines, but got $good_line_new"
13954 run_test 170 "test lctl df to handle corrupted log ====================="
13956 test_171() { # bug20592
13957 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13959 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
13960 $LCTL set_param fail_loc=0x50e
13961 $LCTL set_param fail_val=3000
13962 multiop_bg_pause $DIR/$tfile O_s || true
13964 kill -USR1 $MULTIPID
13968 if dmesg | grep "recursive fault"; then
13969 error "caught a recursive fault"
13971 $LCTL set_param fail_loc=0
13974 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
13976 # it would be good to share it with obdfilter-survey/iokit-libecho code
13977 setup_obdecho_osc () {
13980 local obdfilter_name=$2
13981 echo "Creating new osc for $obdfilter_name on $ost_nid"
13982 # make sure we can find loopback nid
13983 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
13985 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
13986 ${obdfilter_name}_osc_UUID || rc=2; }
13987 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
13988 ${obdfilter_name}_UUID $ost_nid || rc=3; }
13992 cleanup_obdecho_osc () {
13993 local obdfilter_name=$1
13994 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
13995 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
14002 local pages=${3:-64}
14007 local obd_size=$(get_obd_size $node $OBD)
14008 local page_size=$(get_page_size $node)
14009 if [[ -n "$obd_size" ]]; then
14010 local new_count=$((obd_size / (pages * page_size / 1024)))
14011 [[ $new_count -ge $count ]] || count=$new_count
14014 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
14015 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
14017 if [ $rc -eq 0 ]; then
14018 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
14019 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
14021 echo "New object id is $id"
14022 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
14024 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
14025 "test_brw $count w v $pages $id" || rc=4; }
14026 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
14028 [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
14029 "cleanup" || rc=5; }
14030 [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \
14031 "detach" || rc=6; }
14032 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
14037 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14039 if ! module_loaded obdecho; then
14040 load_module obdecho/obdecho &&
14041 stack_trap "rmmod obdecho" EXIT ||
14042 error "unable to load obdecho on client"
14045 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
14046 local host=$($LCTL get_param -n osc.$osc.import |
14047 awk '/current_connection:/ { print $2 }' )
14048 local target=$($LCTL get_param -n osc.$osc.import |
14049 awk '/target:/ { print $2 }' )
14050 target=${target%_UUID}
14052 if [ -n "$target" ]; then
14053 setup_obdecho_osc $host $target &&
14054 stack_trap "cleanup_obdecho_osc $target" EXIT ||
14055 { error "obdecho setup failed with $?"; return; }
14057 obdecho_test ${target}_osc client ||
14058 error "obdecho_test failed on ${target}_osc"
14060 $LCTL get_param osc.$osc.import
14061 error "there is no osc.$osc.import target"
14064 run_test 180a "test obdecho on osc"
14067 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14068 remote_ost_nodsh && skip "remote OST with nodsh"
14070 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14071 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14072 error "failed to load module obdecho"
14074 local target=$(do_facet ost1 $LCTL dl |
14075 awk '/obdfilter/ { print $4; exit; }')
14077 if [ -n "$target" ]; then
14078 obdecho_test $target ost1 || error "obdecho_test failed with $?"
14080 do_facet ost1 $LCTL dl
14081 error "there is no obdfilter target on ost1"
14084 run_test 180b "test obdecho directly on obdfilter"
14086 test_180c() { # LU-2598
14087 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14088 remote_ost_nodsh && skip "remote OST with nodsh"
14089 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
14090 skip "Need MDS version at least 2.4.0"
14092 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14093 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14094 error "failed to load module obdecho"
14096 local target=$(do_facet ost1 $LCTL dl |
14097 awk '/obdfilter/ { print $4; exit; }')
14099 if [ -n "$target" ]; then
14100 local pages=16384 # 64MB bulk I/O RPC size
14102 obdecho_test "$target" ost1 "$pages" ||
14103 error "obdecho_test with pages=$pages failed with $?"
14105 do_facet ost1 $LCTL dl
14106 error "there is no obdfilter target on ost1"
14109 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
14111 test_181() { # bug 22177
14112 test_mkdir $DIR/$tdir
14113 # create enough files to index the directory
14114 createmany -o $DIR/$tdir/foobar 4000
14115 # print attributes for debug purpose
14118 multiop_bg_pause $DIR/$tdir D_Sc || return 1
14120 # remove the files & current working dir
14121 unlinkmany $DIR/$tdir/foobar 4000
14123 kill -USR1 $MULTIPID
14125 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
14128 run_test 181 "Test open-unlinked dir ========================"
14134 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14136 $LCTL set_param mdc.*.rpc_stats=clear
14138 for (( i = 0; i < $tcount; i++ )) ; do
14139 mkdir $DIR/$tdir/$i
14142 for (( i = 0; i < $tcount; i++ )) ; do
14143 createmany -o $DIR/$tdir/$i/f- $fcount &
14147 for (( i = 0; i < $tcount; i++ )) ; do
14148 unlinkmany $DIR/$tdir/$i/f- $fcount &
14152 $LCTL get_param mdc.*.rpc_stats
14156 run_test 182 "Test parallel modify metadata operations ================"
14158 test_183() { # LU-2275
14159 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14160 remote_mds_nodsh && skip "remote MDS with nodsh"
14161 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
14162 skip "Need MDS version at least 2.3.56"
14164 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14165 echo aaa > $DIR/$tdir/$tfile
14167 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
14168 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
14170 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
14171 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
14173 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
14175 # Flush negative dentry cache
14176 touch $DIR/$tdir/$tfile
14178 # We are not checking for any leaked references here, they'll
14179 # become evident next time we do cleanup with module unload.
14182 run_test 183 "No crash or request leak in case of strange dispositions ========"
14184 # test suite 184 is for LU-2016, LU-2017
14186 check_swap_layouts_support
14188 dir0=$DIR/$tdir/$testnum
14189 test_mkdir -p -c1 $dir0
14194 $SETSTRIPE -c1 $file1
14196 $SETSTRIPE -c2 $file2
14198 gen1=$($GETSTRIPE -g $file1)
14199 gen2=$($GETSTRIPE -g $file2)
14201 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
14202 gen=$($GETSTRIPE -g $file1)
14203 [[ $gen1 != $gen ]] ||
14204 "Layout generation on $file1 does not change"
14205 gen=$($GETSTRIPE -g $file2)
14206 [[ $gen2 != $gen ]] ||
14207 "Layout generation on $file2 does not change"
14209 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
14210 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
14212 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
14214 run_test 184a "Basic layout swap"
14217 check_swap_layouts_support
14219 dir0=$DIR/$tdir/$testnum
14220 mkdir -p $dir0 || error "creating dir $dir0"
14227 $SETSTRIPE -c1 $file1
14228 $SETSTRIPE -c2 $file2
14229 $SETSTRIPE -c1 $file3
14230 chown $RUNAS_ID $file3
14231 gen1=$($GETSTRIPE -g $file1)
14232 gen2=$($GETSTRIPE -g $file2)
14234 $LFS swap_layouts $dir1 $dir2 &&
14235 error "swap of directories layouts should fail"
14236 $LFS swap_layouts $dir1 $file1 &&
14237 error "swap of directory and file layouts should fail"
14238 $RUNAS $LFS swap_layouts $file1 $file2 &&
14239 error "swap of file we cannot write should fail"
14240 $LFS swap_layouts $file1 $file3 &&
14241 error "swap of file with different owner should fail"
14242 /bin/true # to clear error code
14244 run_test 184b "Forbidden layout swap (will generate errors)"
14247 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14248 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14249 check_swap_layouts_support
14251 local dir0=$DIR/$tdir/$testnum
14252 mkdir -p $dir0 || error "creating dir $dir0"
14254 local ref1=$dir0/ref1
14255 local ref2=$dir0/ref2
14256 local file1=$dir0/file1
14257 local file2=$dir0/file2
14258 # create a file large enough for the concurrent test
14259 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14260 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14261 echo "ref file size: ref1($(stat -c %s $ref1))," \
14262 "ref2($(stat -c %s $ref2))"
14265 dd if=$ref1 of=$file1 bs=16k &
14268 # Make sure dd starts to copy file
14269 while [ ! -f $file1 ]; do sleep 0.1; done
14271 $LFS swap_layouts $file1 $file2
14274 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14275 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14277 # how many bytes copied before swapping layout
14278 local copied=$(stat -c %s $file2)
14279 local remaining=$(stat -c %s $ref1)
14280 remaining=$((remaining - copied))
14281 echo "Copied $copied bytes before swapping layout..."
14283 cmp -n $copied $file1 $ref2 | grep differ &&
14284 error "Content mismatch [0, $copied) of ref2 and file1"
14285 cmp -n $copied $file2 $ref1 ||
14286 error "Content mismatch [0, $copied) of ref1 and file2"
14287 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14288 error "Content mismatch [$copied, EOF) of ref1 and file1"
14291 rm -f $ref1 $ref2 $file1 $file2
14293 run_test 184c "Concurrent write and layout swap"
14296 check_swap_layouts_support
14297 [ -z "$(which getfattr 2>/dev/null)" ] &&
14298 skip_env "no getfattr command"
14300 local file1=$DIR/$tdir/$tfile-1
14301 local file2=$DIR/$tdir/$tfile-2
14302 local file3=$DIR/$tdir/$tfile-3
14306 mkdir -p $DIR/$tdir
14307 touch $file1 || error "create $file1 failed"
14308 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14309 error "create $file2 failed"
14310 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14311 error "create $file3 failed"
14312 lovea1=$(get_layout_param $file1)
14314 $LFS swap_layouts $file2 $file3 ||
14315 error "swap $file2 $file3 layouts failed"
14316 $LFS swap_layouts $file1 $file2 ||
14317 error "swap $file1 $file2 layouts failed"
14319 lovea2=$(get_layout_param $file2)
14322 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14324 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14325 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14327 run_test 184d "allow stripeless layouts swap"
14330 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14331 skip "Need MDS version at least 2.6.94"
14332 check_swap_layouts_support
14333 [ -z "$(which getfattr 2>/dev/null)" ] &&
14334 skip_env "no getfattr command"
14336 local file1=$DIR/$tdir/$tfile-1
14337 local file2=$DIR/$tdir/$tfile-2
14338 local file3=$DIR/$tdir/$tfile-3
14341 mkdir -p $DIR/$tdir
14342 touch $file1 || error "create $file1 failed"
14343 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14344 error "create $file2 failed"
14345 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14346 error "create $file3 failed"
14348 $LFS swap_layouts $file1 $file2 ||
14349 error "swap $file1 $file2 layouts failed"
14351 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14352 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14354 echo 123 > $file1 || error "Should be able to write into $file1"
14356 $LFS swap_layouts $file1 $file3 ||
14357 error "swap $file1 $file3 layouts failed"
14359 echo 123 > $file1 || error "Should be able to write into $file1"
14361 rm -rf $file1 $file2 $file3
14363 run_test 184e "Recreate layout after stripeless layout swaps"
14366 # Create a file with name longer than sizeof(struct stat) ==
14367 # 144 to see if we can get chars from the file name to appear
14368 # in the returned striping. Note that 'f' == 0x66.
14369 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
14371 mkdir -p $DIR/$tdir
14372 mcreate $DIR/$tdir/$file
14373 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
14374 error "IOC_MDC_GETFILEINFO returned garbage striping"
14377 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
14379 test_185() { # LU-2441
14380 # LU-3553 - no volatile file support in old servers
14381 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
14382 skip "Need MDS version at least 2.3.60"
14384 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14385 touch $DIR/$tdir/spoo
14386 local mtime1=$(stat -c "%Y" $DIR/$tdir)
14387 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
14388 error "cannot create/write a volatile file"
14389 [ "$FILESET" == "" ] &&
14390 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
14391 error "FID is still valid after close"
14393 multiop_bg_pause $DIR/$tdir vVw4096_c
14400 # assume that the next FID for this client is sequential, since stdout
14401 # is unfortunately eaten by multiop_bg_pause
14402 local n=$((${fidv[1]} + 1))
14403 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
14404 if [ "$FILESET" == "" ]; then
14405 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
14406 error "FID is missing before close"
14408 kill -USR1 $multi_pid
14409 # 1 second delay, so if mtime change we will see it
14411 local mtime2=$(stat -c "%Y" $DIR/$tdir)
14412 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
14414 run_test 185 "Volatile file support"
14416 function create_check_volatile() {
14420 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
14423 local FID=$(cat /tmp/${tfile}.fid)
14424 [ "$FID" == "" ] && error "can't get FID for volatile"
14425 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
14426 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
14427 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
14431 cancel_lru_locks mdc # flush opencache
14432 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
14437 # LU-12516 - volatile creation via .lustre
14438 [[ $MDS1_VERSION -ge $(version_code 2.12.2) ]] ||
14439 skip "Need MDS version at least 2.12.2"
14441 create_check_volatile 0
14442 [ $MDSCOUNT -lt 2 ] && return 0
14445 create_check_volatile 1
14449 run_test 185a "Volatile file creation in .lustre/fid/"
14452 remote_mds_nodsh && skip "remote MDS with nodsh"
14453 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14454 skip "Need MDS version at least 2.3.0"
14456 local dir0=$DIR/$tdir/$testnum
14457 mkdir -p $dir0 || error "creating dir $dir0"
14459 local file=$dir0/file1
14460 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
14461 local dv1=$($LFS data_version $file)
14462 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
14463 local dv2=$($LFS data_version $file)
14464 [[ $dv1 != $dv2 ]] ||
14465 error "data version did not change on write $dv1 == $dv2"
14470 run_test 187a "Test data version change"
14473 remote_mds_nodsh && skip "remote MDS with nodsh"
14474 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14475 skip "Need MDS version at least 2.3.0"
14477 local dir0=$DIR/$tdir/$testnum
14478 mkdir -p $dir0 || error "creating dir $dir0"
14480 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
14481 [[ ${DV[0]} != ${DV[1]} ]] ||
14482 error "data version did not change on write"\
14483 " ${DV[0]} == ${DV[1]}"
14488 run_test 187b "Test data version change on volatile file"
14491 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14492 remote_mgs_nodsh && skip "remote MGS with nodsh"
14493 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
14495 local POOL=${POOL:-cea1}
14496 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
14497 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
14500 local last_ost=$(($OSTCOUNT - 1))
14502 local ost_list=$(seq $first_ost $ost_step $last_ost)
14503 local ost_range="$first_ost $last_ost $ost_step"
14504 local test_path=$POOL_ROOT/$POOL_DIR_NAME
14505 local file_dir=$POOL_ROOT/file_tst
14506 local subdir=$test_path/subdir
14510 # former test_200a test_200b
14511 pool_add $POOL || { rc=$? ; break; }
14512 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
14513 # former test_200c test_200d
14514 mkdir -p $test_path
14515 pool_set_dir $POOL $test_path || { rc=$? ; break; }
14516 pool_check_dir $POOL $test_path || { rc=$? ; break; }
14518 pool_check_dir $POOL $subdir || { rc=$? ; break; }
14519 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
14520 || { rc=$? ; break; }
14521 # former test_200e test_200f
14522 local files=$((OSTCOUNT*3))
14523 pool_alloc_files $POOL $test_path $files "$ost_list" \
14524 || { rc=$? ; break; }
14525 pool_create_files $POOL $file_dir $files "$ost_list" \
14526 || { rc=$? ; break; }
14527 # former test_200g test_200h
14528 pool_lfs_df $POOL || { rc=$? ; break; }
14529 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
14531 # former test_201a test_201b test_201c
14532 pool_remove_first_target $POOL || { rc=$? ; break; }
14534 local f=$test_path/$tfile
14535 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
14536 pool_remove $POOL $f || { rc=$? ; break; }
14544 run_test 200 "OST pools"
14546 # usage: default_attr <count | size | offset>
14548 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
14551 # usage: check_default_stripe_attr
14552 check_default_stripe_attr() {
14553 ACTUAL=$($GETSTRIPE $* $DIR/$tdir)
14556 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
14558 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
14562 error "unknown getstripe attr '$1'"
14565 [ $ACTUAL == $EXPECTED ] ||
14566 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
14570 test_mkdir $DIR/$tdir
14571 $SETSTRIPE --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
14573 check_default_stripe_attr --stripe-count
14574 check_default_stripe_attr --stripe-size
14575 check_default_stripe_attr --stripe-index
14577 run_test 204a "Print default stripe attributes"
14580 test_mkdir $DIR/$tdir
14581 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14583 check_default_stripe_attr --stripe-size
14584 check_default_stripe_attr --stripe-index
14586 run_test 204b "Print default stripe size and offset"
14589 test_mkdir $DIR/$tdir
14590 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14592 check_default_stripe_attr --stripe-count
14593 check_default_stripe_attr --stripe-index
14595 run_test 204c "Print default stripe count and offset"
14598 test_mkdir $DIR/$tdir
14599 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14601 check_default_stripe_attr --stripe-count
14602 check_default_stripe_attr --stripe-size
14604 run_test 204d "Print default stripe count and size"
14607 test_mkdir $DIR/$tdir
14608 $SETSTRIPE -d $DIR/$tdir
14610 check_default_stripe_attr --stripe-count --raw
14611 check_default_stripe_attr --stripe-size --raw
14612 check_default_stripe_attr --stripe-index --raw
14614 run_test 204e "Print raw stripe attributes"
14617 test_mkdir $DIR/$tdir
14618 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14620 check_default_stripe_attr --stripe-size --raw
14621 check_default_stripe_attr --stripe-index --raw
14623 run_test 204f "Print raw stripe size and offset"
14626 test_mkdir $DIR/$tdir
14627 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14629 check_default_stripe_attr --stripe-count --raw
14630 check_default_stripe_attr --stripe-index --raw
14632 run_test 204g "Print raw stripe count and offset"
14635 test_mkdir $DIR/$tdir
14636 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14638 check_default_stripe_attr --stripe-count --raw
14639 check_default_stripe_attr --stripe-size --raw
14641 run_test 204h "Print raw stripe count and size"
14643 # Figure out which job scheduler is being used, if any,
14644 # or use a fake one
14645 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
14646 JOBENV=SLURM_JOB_ID
14647 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
14649 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
14651 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
14652 JOBENV=LOADL_STEP_ID
14653 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
14656 $LCTL list_param jobid_name > /dev/null 2>&1
14657 if [ $? -eq 0 ]; then
14663 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
14665 verify_jobstats() {
14670 # we don't really need to clear the stats for this test to work, since each
14671 # command has a unique jobid, but it makes debugging easier if needed.
14672 # for facet in $facets; do
14673 # local dev=$(convert_facet2label $facet)
14674 # # clear old jobstats
14675 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
14678 # use a new JobID for each test, or we might see an old one
14679 [ "$JOBENV" = "FAKE_JOBID" ] &&
14680 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
14682 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
14684 [ "$JOBENV" = "nodelocal" ] && {
14685 FAKE_JOBID=id.$testnum.%e.$RANDOM
14686 $LCTL set_param jobid_name=$FAKE_JOBID
14687 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
14690 log "Test: ${cmd[*]}"
14691 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
14693 if [ $JOBENV = "FAKE_JOBID" ]; then
14694 FAKE_JOBID=$JOBVAL ${cmd[*]}
14699 # all files are created on OST0000
14700 for facet in $facets; do
14701 local stats="*.$(convert_facet2label $facet).job_stats"
14703 # strip out libtool wrappers for in-tree executables
14704 if [ $(do_facet $facet lctl get_param $stats |
14705 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
14706 do_facet $facet lctl get_param $stats
14707 error "No jobstats for $JOBVAL found on $facet::$stats"
14713 local new_jobenv=$1
14715 set_persistent_param_and_check client "jobid_var" \
14716 "$FSNAME.sys.jobid_var" $new_jobenv
14719 test_205() { # Job stats
14720 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14721 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
14722 skip "Need MDS version with at least 2.7.1"
14723 remote_mgs_nodsh && skip "remote MGS with nodsh"
14724 remote_mds_nodsh && skip "remote MDS with nodsh"
14725 remote_ost_nodsh && skip "remote OST with nodsh"
14726 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
14727 skip "Server doesn't support jobstats"
14728 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
14730 local old_jobenv=$($LCTL get_param -n jobid_var)
14731 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
14733 if [[ $PERM_CMD = *"set_param -P"* ]]; then
14734 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
14736 stack_trap "do_facet mgs $PERM_CMD \
14737 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
14741 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
14742 mdt.*.job_cleanup_interval | head -n 1)
14743 local new_interval=5
14744 do_facet $SINGLEMDS \
14745 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
14746 stack_trap "do_facet $SINGLEMDS \
14747 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
14748 local start=$SECONDS
14752 cmd="mkdir $DIR/$tdir"
14753 verify_jobstats "$cmd" "$SINGLEMDS"
14755 cmd="rmdir $DIR/$tdir"
14756 verify_jobstats "$cmd" "$SINGLEMDS"
14757 # mkdir on secondary MDT
14758 if [ $MDSCOUNT -gt 1 ]; then
14759 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
14760 verify_jobstats "$cmd" "mds2"
14763 cmd="mknod $DIR/$tfile c 1 3"
14764 verify_jobstats "$cmd" "$SINGLEMDS"
14766 cmd="rm -f $DIR/$tfile"
14767 verify_jobstats "$cmd" "$SINGLEMDS"
14768 # create all files on OST0000 so verify_jobstats can find OST stats
14770 cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile"
14771 verify_jobstats "$cmd" "$SINGLEMDS"
14773 cmd="touch $DIR/$tfile"
14774 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14776 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
14777 verify_jobstats "$cmd" "ost1"
14779 cancel_lru_locks osc
14780 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
14781 verify_jobstats "$cmd" "ost1"
14783 cmd="$TRUNCATE $DIR/$tfile 0"
14784 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14786 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
14787 verify_jobstats "$cmd" "$SINGLEMDS"
14788 # jobstats expiry - sleep until old stats should be expired
14789 local left=$((new_interval + 5 - (SECONDS - start)))
14790 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
14791 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
14793 cmd="mkdir $DIR/$tdir.expire"
14794 verify_jobstats "$cmd" "$SINGLEMDS"
14795 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
14796 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
14798 # Ensure that jobid are present in changelog (if supported by MDS)
14799 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
14800 changelog_dump | tail -10
14801 jobids=$(changelog_dump | tail -9 | grep -c "j=")
14802 [ $jobids -eq 9 ] ||
14803 error "Wrong changelog jobid count $jobids != 9"
14807 jobstats_set $JOBENV
14809 changelog_dump | grep $tfile
14810 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
14811 [ $jobids -eq 0 ] ||
14812 error "Unexpected jobids when jobid_var=$JOBENV"
14815 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
14816 JOBENV="JOBCOMPLEX"
14817 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
14819 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
14821 run_test 205 "Verify job stats"
14823 # LU-1480, LU-1773 and LU-1657
14825 mkdir -p $DIR/$tdir
14826 $SETSTRIPE -c -1 $DIR/$tdir
14827 #define OBD_FAIL_LOV_INIT 0x1403
14828 $LCTL set_param fail_loc=0xa0001403
14829 $LCTL set_param fail_val=1
14830 touch $DIR/$tdir/$tfile || true
14832 run_test 206 "fail lov_init_raid0() doesn't lbug"
14835 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14836 local fsz=`stat -c %s $DIR/$tfile`
14837 cancel_lru_locks mdc
14839 # do not return layout in getattr intent
14840 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
14841 $LCTL set_param fail_loc=0x170
14842 local sz=`stat -c %s $DIR/$tfile`
14844 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
14848 run_test 207a "can refresh layout at glimpse"
14851 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14852 local cksum=`md5sum $DIR/$tfile`
14853 local fsz=`stat -c %s $DIR/$tfile`
14854 cancel_lru_locks mdc
14855 cancel_lru_locks osc
14857 # do not return layout in getattr intent
14858 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
14859 $LCTL set_param fail_loc=0x171
14861 # it will refresh layout after the file is opened but before read issues
14862 echo checksum is "$cksum"
14863 echo "$cksum" |md5sum -c --quiet || error "file differs"
14867 run_test 207b "can refresh layout at open"
14870 # FIXME: in this test suite, only RD lease is used. This is okay
14871 # for now as only exclusive open is supported. After generic lease
14872 # is done, this test suite should be revised. - Jinshan
14874 remote_mds_nodsh && skip "remote MDS with nodsh"
14875 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
14876 skip "Need MDS version at least 2.4.52"
14878 echo "==== test 1: verify get lease work"
14879 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
14881 echo "==== test 2: verify lease can be broken by upcoming open"
14882 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
14886 $MULTIOP $DIR/$tfile oO_RDONLY:c
14887 kill -USR1 $PID && wait $PID || error "break lease error"
14889 echo "==== test 3: verify lease can't be granted if an open already exists"
14890 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
14894 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
14895 kill -USR1 $PID && wait $PID || error "open file error"
14897 echo "==== test 4: lease can sustain over recovery"
14898 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
14904 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
14906 echo "==== test 5: lease broken can't be regained by replay"
14907 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
14911 # open file to break lease and then recovery
14912 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
14915 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
14919 run_test 208 "Exclusive open"
14922 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
14923 skip_env "must have disp_stripe"
14926 sync; sleep 5; sync;
14928 echo 3 > /proc/sys/vm/drop_caches
14929 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
14931 # open/close 500 times
14932 for i in $(seq 500); do
14936 echo 3 > /proc/sys/vm/drop_caches
14937 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
14939 echo "before: $req_before, after: $req_after"
14940 [ $((req_after - req_before)) -ge 300 ] &&
14941 error "open/close requests are not freed"
14944 run_test 209 "read-only open/close requests should be freed promptly"
14948 size=$((size % 8192 + 1))
14949 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
14950 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
14951 rm -f $DIR/f212 $DIR/f212.xyz
14953 run_test 212 "Sendfile test ============================================"
14956 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
14957 cancel_lru_locks osc
14958 lctl set_param fail_loc=0x8000040f
14959 # generate a read lock
14960 cat $DIR/$tfile > /dev/null
14961 # write to the file, it will try to cancel the above read lock.
14962 cat /etc/hosts >> $DIR/$tfile
14964 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
14966 test_214() { # for bug 20133
14967 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
14968 for (( i=0; i < 340; i++ )) ; do
14969 touch $DIR/$tdir/d214c/a$i
14972 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
14973 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
14974 ls $DIR/d214c || error "ls $DIR/d214c failed"
14975 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
14976 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
14978 run_test 214 "hash-indexed directory test - bug 20133"
14980 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
14981 create_lnet_proc_files() {
14982 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
14985 # counterpart of create_lnet_proc_files
14986 remove_lnet_proc_files() {
14987 rm -f $TMP/lnet_$1.sys
14990 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
14991 # 3rd arg as regexp for body
14992 check_lnet_proc_stats() {
14993 local l=$(cat "$TMP/lnet_$1" |wc -l)
14994 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
14996 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
14999 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15000 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
15001 # optional and can be regexp for 2nd line (lnet.routes case)
15002 check_lnet_proc_entry() {
15003 local blp=2 # blp stands for 'position of 1st line of body'
15004 [ -z "$5" ] || blp=3 # lnet.routes case
15006 local l=$(cat "$TMP/lnet_$1" |wc -l)
15007 # subtracting one from $blp because the body can be empty
15008 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
15010 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
15011 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
15013 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
15014 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
15016 # bail out if any unexpected line happened
15017 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
15018 [ "$?" != 0 ] || error "$2 misformatted"
15021 test_215() { # for bugs 18102, 21079, 21517
15022 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15024 local N='(0|[1-9][0-9]*)' # non-negative numeric
15025 local P='[1-9][0-9]*' # positive numeric
15026 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
15027 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
15028 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
15029 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
15031 local L1 # regexp for 1st line
15032 local L2 # regexp for 2nd line (optional)
15033 local BR # regexp for the rest (body)
15035 # lnet.stats should look as 11 space-separated non-negative numerics
15036 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
15037 create_lnet_proc_files "stats"
15038 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
15039 remove_lnet_proc_files "stats"
15041 # lnet.routes should look like this:
15042 # Routing disabled/enabled
15043 # net hops priority state router
15044 # where net is a string like tcp0, hops > 0, priority >= 0,
15045 # state is up/down,
15046 # router is a string like 192.168.1.1@tcp2
15047 L1="^Routing (disabled|enabled)$"
15048 L2="^net +hops +priority +state +router$"
15049 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
15050 create_lnet_proc_files "routes"
15051 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
15052 remove_lnet_proc_files "routes"
15054 # lnet.routers should look like this:
15055 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
15056 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
15057 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
15058 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
15059 L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
15060 BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
15061 create_lnet_proc_files "routers"
15062 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
15063 remove_lnet_proc_files "routers"
15065 # lnet.peers should look like this:
15066 # nid refs state last max rtr min tx min queue
15067 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
15068 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
15069 # numeric (0 or >0 or <0), queue >= 0.
15070 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
15071 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
15072 create_lnet_proc_files "peers"
15073 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
15074 remove_lnet_proc_files "peers"
15076 # lnet.buffers should look like this:
15077 # pages count credits min
15078 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
15079 L1="^pages +count +credits +min$"
15080 BR="^ +$N +$N +$I +$I$"
15081 create_lnet_proc_files "buffers"
15082 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
15083 remove_lnet_proc_files "buffers"
15085 # lnet.nis should look like this:
15086 # nid status alive refs peer rtr max tx min
15087 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
15088 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
15089 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
15090 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
15091 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
15092 create_lnet_proc_files "nis"
15093 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
15094 remove_lnet_proc_files "nis"
15096 # can we successfully write to lnet.stats?
15097 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
15099 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
15101 test_216() { # bug 20317
15102 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15103 remote_ost_nodsh && skip "remote OST with nodsh"
15106 local facets=$(get_facets OST)
15107 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15109 save_lustre_params client "osc.*.contention_seconds" > $p
15110 save_lustre_params $facets \
15111 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
15112 save_lustre_params $facets \
15113 "ldlm.namespaces.filter-*.contended_locks" >> $p
15114 save_lustre_params $facets \
15115 "ldlm.namespaces.filter-*.contention_seconds" >> $p
15116 clear_stats osc.*.osc_stats
15118 # agressive lockless i/o settings
15119 do_nodes $(comma_list $(osts_nodes)) \
15120 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
15121 ldlm.namespaces.filter-*.contended_locks=0 \
15122 ldlm.namespaces.filter-*.contention_seconds=60"
15123 lctl set_param -n osc.*.contention_seconds=60
15125 $DIRECTIO write $DIR/$tfile 0 10 4096
15126 $CHECKSTAT -s 40960 $DIR/$tfile
15128 # disable lockless i/o
15129 do_nodes $(comma_list $(osts_nodes)) \
15130 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
15131 ldlm.namespaces.filter-*.contended_locks=32 \
15132 ldlm.namespaces.filter-*.contention_seconds=0"
15133 lctl set_param -n osc.*.contention_seconds=0
15134 clear_stats osc.*.osc_stats
15136 dd if=/dev/zero of=$DIR/$tfile count=0
15137 $CHECKSTAT -s 0 $DIR/$tfile
15139 restore_lustre_params <$p
15143 run_test 216 "check lockless direct write updates file size and kms correctly"
15145 test_217() { # bug 22430
15146 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15151 for node in $(nodes_list); do
15152 nid=$(host_nids_address $node $NETTYPE)
15153 if [[ $nid = *-* ]] ; then
15154 echo "lctl ping $(h2nettype $nid)"
15155 lctl ping $(h2nettype $nid)
15157 echo "skipping $node (no hyphen detected)"
15161 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
15164 # do directio so as not to populate the page cache
15165 log "creating a 10 Mb file"
15166 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
15167 log "starting reads"
15168 dd if=$DIR/$tfile of=/dev/null bs=4096 &
15169 log "truncating the file"
15170 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
15172 kill %+ || true # reads might have finished
15173 echo "wait until dd is finished"
15175 log "removing the temporary file"
15176 rm -rf $DIR/$tfile || error "tmp file removal failed"
15178 run_test 218 "parallel read and truncate should not deadlock"
15181 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15183 # write one partial page
15184 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
15185 # set no grant so vvp_io_commit_write will do sync write
15186 $LCTL set_param fail_loc=0x411
15187 # write a full page at the end of file
15188 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
15190 $LCTL set_param fail_loc=0
15191 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
15192 $LCTL set_param fail_loc=0x411
15193 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
15196 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
15197 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
15199 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
15201 test_220() { #LU-325
15202 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15203 remote_ost_nodsh && skip "remote OST with nodsh"
15204 remote_mds_nodsh && skip "remote MDS with nodsh"
15205 remote_mgs_nodsh && skip "remote MGS with nodsh"
15209 # create on MDT0000 so the last_id and next_id are correct
15211 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
15215 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
15216 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
15217 osp.$mdtosc_proc1.prealloc_last_id)
15218 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15219 osp.$mdtosc_proc1.prealloc_next_id)
15223 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15224 #define OBD_FAIL_OST_ENOINO 0x229
15225 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15226 create_pool $FSNAME.$TESTNAME || return 1
15227 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15229 $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15231 MDSOBJS=$((last_id - next_id))
15232 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15234 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15235 echo "OST still has $count kbytes free"
15237 echo "create $MDSOBJS files @next_id..."
15238 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15240 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15241 osp.$mdtosc_proc1.prealloc_last_id)
15242 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15243 osp.$mdtosc_proc1.prealloc_next_id)
15245 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15250 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15251 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15253 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15254 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15255 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15256 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15257 echo "unlink $MDSOBJS files @$next_id..."
15258 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15260 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15263 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15265 dd if=`which date` of=$MOUNT/date oflag=sync
15266 chmod +x $MOUNT/date
15268 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15269 $LCTL set_param fail_loc=0x80001401
15271 $MOUNT/date > /dev/null
15274 run_test 221 "make sure fault and truncate race to not cause OOM"
15277 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15280 test_mkdir $DIR/$tdir
15281 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15282 createmany -o $DIR/$tdir/$tfile 10
15283 cancel_lru_locks mdc
15284 cancel_lru_locks osc
15285 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15286 $LCTL set_param fail_loc=0x31a
15287 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15288 $LCTL set_param fail_loc=0
15291 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15294 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15297 test_mkdir $DIR/$tdir
15298 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15299 createmany -o $DIR/$tdir/$tfile 10
15300 cancel_lru_locks mdc
15301 cancel_lru_locks osc
15302 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15303 $LCTL set_param fail_loc=0x31a
15304 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15305 $LCTL set_param fail_loc=0
15307 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15310 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15313 test_mkdir $DIR/$tdir
15314 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15315 createmany -o $DIR/$tdir/$tfile 10
15316 cancel_lru_locks mdc
15317 cancel_lru_locks osc
15318 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15319 $LCTL set_param fail_loc=0x31b
15320 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15321 $LCTL set_param fail_loc=0
15324 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15326 test_224a() { # LU-1039, MRP-303
15327 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15329 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15330 $LCTL set_param fail_loc=0x508
15331 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15332 $LCTL set_param fail_loc=0
15335 run_test 224a "Don't panic on bulk IO failure"
15337 test_224b() { # LU-1039, MRP-303
15338 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15340 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15341 cancel_lru_locks osc
15342 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15343 $LCTL set_param fail_loc=0x515
15344 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15345 $LCTL set_param fail_loc=0
15348 run_test 224b "Don't panic on bulk IO failure"
15350 test_224c() { # LU-6441
15351 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15352 remote_mds_nodsh && skip "remote MDS with nodsh"
15354 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15355 save_writethrough $p
15356 set_cache writethrough on
15358 local pages_per_rpc=$($LCTL get_param \
15359 osc.*.max_pages_per_rpc)
15360 local at_max=$($LCTL get_param -n at_max)
15361 local timeout=$($LCTL get_param -n timeout)
15362 local test_at="at_max"
15363 local param_at="$FSNAME.sys.at_max"
15364 local test_timeout="timeout"
15365 local param_timeout="$FSNAME.sys.timeout"
15367 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
15369 set_persistent_param_and_check client "$test_at" "$param_at" 0
15370 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
15372 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
15373 do_facet ost1 $LCTL set_param fail_loc=0x520
15374 $LFS setstripe -c 1 -i 0 $DIR/$tfile
15375 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
15377 do_facet ost1 $LCTL set_param fail_loc=0
15379 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
15380 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
15383 $LCTL set_param -n $pages_per_rpc
15384 restore_lustre_params < $p
15387 run_test 224c "Don't hang if one of md lost during large bulk RPC"
15389 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
15391 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15392 if [ -z ${MDSSURVEY} ]; then
15393 skip_env "mds-survey not found"
15395 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15396 skip "Need MDS version at least 2.2.51"
15398 local mds=$(facet_host $SINGLEMDS)
15399 local target=$(do_nodes $mds 'lctl dl' |
15400 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15402 local cmd1="file_count=1000 thrhi=4"
15403 local cmd2="dir_count=2 layer=mdd stripe_count=0"
15404 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15405 local cmd="$cmd1 $cmd2 $cmd3"
15407 rm -f ${TMP}/mds_survey*
15409 eval $cmd || error "mds-survey with zero-stripe failed"
15410 cat ${TMP}/mds_survey*
15411 rm -f ${TMP}/mds_survey*
15413 run_test 225a "Metadata survey sanity with zero-stripe"
15416 if [ -z ${MDSSURVEY} ]; then
15417 skip_env "mds-survey not found"
15419 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15420 skip "Need MDS version at least 2.2.51"
15421 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15422 remote_mds_nodsh && skip "remote MDS with nodsh"
15423 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
15424 skip_env "Need to mount OST to test"
15427 local mds=$(facet_host $SINGLEMDS)
15428 local target=$(do_nodes $mds 'lctl dl' |
15429 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15431 local cmd1="file_count=1000 thrhi=4"
15432 local cmd2="dir_count=2 layer=mdd stripe_count=1"
15433 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15434 local cmd="$cmd1 $cmd2 $cmd3"
15436 rm -f ${TMP}/mds_survey*
15438 eval $cmd || error "mds-survey with stripe_count failed"
15439 cat ${TMP}/mds_survey*
15440 rm -f ${TMP}/mds_survey*
15442 run_test 225b "Metadata survey sanity with stripe_count = 1"
15444 mcreate_path2fid () {
15450 local path=$DIR/$tdir/$name
15455 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
15456 error "cannot create $desc"
15458 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
15460 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
15462 fid_path=$($LFS fid2path $MOUNT $fid)
15464 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
15466 [ "$path" == "$fid_path" ] ||
15467 error "fid2path returned $fid_path, expected $path"
15469 echo "pass with $path and $fid"
15474 mkdir -p $DIR/$tdir
15476 mcreate_path2fid 0010666 0 0 fifo "FIFO"
15477 mcreate_path2fid 0020666 1 3 null "character special file (null)"
15478 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
15479 mcreate_path2fid 0040666 0 0 dir "directory"
15480 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
15481 mcreate_path2fid 0100666 0 0 file "regular file"
15482 mcreate_path2fid 0120666 0 0 link "symbolic link"
15483 mcreate_path2fid 0140666 0 0 sock "socket"
15485 run_test 226a "call path2fid and fid2path on files of all type"
15488 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15493 mkdir -p $DIR/$tdir
15494 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
15495 error "create remote directory failed"
15496 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
15497 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
15498 "character special file (null)"
15499 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
15500 "character special file (no device)"
15501 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
15502 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
15503 "block special file (loop)"
15504 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
15505 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
15506 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
15508 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
15510 # LU-1299 Executing or running ldd on a truncated executable does not
15511 # cause an out-of-memory condition.
15513 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15514 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
15516 dd if=$(which date) of=$MOUNT/date bs=1k count=1
15517 chmod +x $MOUNT/date
15519 $MOUNT/date > /dev/null
15520 ldd $MOUNT/date > /dev/null
15523 run_test 227 "running truncated executable does not cause OOM"
15525 # LU-1512 try to reuse idle OI blocks
15527 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15528 remote_mds_nodsh && skip "remote MDS with nodsh"
15529 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15531 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15532 local myDIR=$DIR/$tdir
15535 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15536 $LCTL set_param fail_loc=0x80001002
15537 createmany -o $myDIR/t- 10000
15538 $LCTL set_param fail_loc=0
15539 # The guard is current the largest FID holder
15541 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15543 local IDX=$(($SEQ % 64))
15545 do_facet $SINGLEMDS sync
15546 # Make sure journal flushed.
15548 local blk1=$(do_facet $SINGLEMDS \
15549 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15550 grep Blockcount | awk '{print $4}')
15552 # Remove old files, some OI blocks will become idle.
15553 unlinkmany $myDIR/t- 10000
15554 # Create new files, idle OI blocks should be reused.
15555 createmany -o $myDIR/t- 2000
15556 do_facet $SINGLEMDS sync
15557 # Make sure journal flushed.
15559 local blk2=$(do_facet $SINGLEMDS \
15560 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15561 grep Blockcount | awk '{print $4}')
15563 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15565 run_test 228a "try to reuse idle OI blocks"
15568 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15569 remote_mds_nodsh && skip "remote MDS with nodsh"
15570 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15572 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15573 local myDIR=$DIR/$tdir
15576 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15577 $LCTL set_param fail_loc=0x80001002
15578 createmany -o $myDIR/t- 10000
15579 $LCTL set_param fail_loc=0
15580 # The guard is current the largest FID holder
15582 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15584 local IDX=$(($SEQ % 64))
15586 do_facet $SINGLEMDS sync
15587 # Make sure journal flushed.
15589 local blk1=$(do_facet $SINGLEMDS \
15590 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15591 grep Blockcount | awk '{print $4}')
15593 # Remove old files, some OI blocks will become idle.
15594 unlinkmany $myDIR/t- 10000
15597 stop $SINGLEMDS || error "Fail to stop MDT."
15599 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
15601 df $MOUNT || error "Fail to df."
15602 # Create new files, idle OI blocks should be reused.
15603 createmany -o $myDIR/t- 2000
15604 do_facet $SINGLEMDS sync
15605 # Make sure journal flushed.
15607 local blk2=$(do_facet $SINGLEMDS \
15608 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15609 grep Blockcount | awk '{print $4}')
15611 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15613 run_test 228b "idle OI blocks can be reused after MDT restart"
15617 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15618 remote_mds_nodsh && skip "remote MDS with nodsh"
15619 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15621 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15622 local myDIR=$DIR/$tdir
15625 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15626 $LCTL set_param fail_loc=0x80001002
15627 # 20000 files can guarantee there are index nodes in the OI file
15628 createmany -o $myDIR/t- 20000
15629 $LCTL set_param fail_loc=0
15630 # The guard is current the largest FID holder
15632 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15634 local IDX=$(($SEQ % 64))
15636 do_facet $SINGLEMDS sync
15637 # Make sure journal flushed.
15639 local blk1=$(do_facet $SINGLEMDS \
15640 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15641 grep Blockcount | awk '{print $4}')
15643 # Remove old files, some OI blocks will become idle.
15644 unlinkmany $myDIR/t- 20000
15646 # The OI file should become empty now
15648 # Create new files, idle OI blocks should be reused.
15649 createmany -o $myDIR/t- 2000
15650 do_facet $SINGLEMDS sync
15651 # Make sure journal flushed.
15653 local blk2=$(do_facet $SINGLEMDS \
15654 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15655 grep Blockcount | awk '{print $4}')
15657 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15659 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
15661 test_229() { # LU-2482, LU-3448
15662 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15663 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
15664 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
15665 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
15669 # Create a file with a released layout and stripe count 2.
15670 $MULTIOP $DIR/$tfile H2c ||
15671 error "failed to create file with released layout"
15673 $GETSTRIPE -v $DIR/$tfile
15675 local pattern=$($GETSTRIPE -L $DIR/$tfile)
15676 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
15678 local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
15679 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
15680 stat $DIR/$tfile || error "failed to stat released file"
15682 chown $RUNAS_ID $DIR/$tfile ||
15683 error "chown $RUNAS_ID $DIR/$tfile failed"
15685 chgrp $RUNAS_ID $DIR/$tfile ||
15686 error "chgrp $RUNAS_ID $DIR/$tfile failed"
15688 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
15689 rm $DIR/$tfile || error "failed to remove released file"
15691 run_test 229 "getstripe/stat/rm/attr changes work on released files"
15694 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15695 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15696 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15697 skip "Need MDS version at least 2.11.52"
15701 test_mkdir $DIR/$tdir
15702 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
15703 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
15704 [ $mdt_idx -ne 0 ] &&
15705 error "create local directory on wrong MDT $mdt_idx"
15707 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
15708 error "create remote directory failed"
15709 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
15710 [ $mdt_idx -ne $MDTIDX ] &&
15711 error "create remote directory on wrong MDT $mdt_idx"
15713 createmany -o $DIR/$tdir/test_230/t- 10 ||
15714 error "create files on remote directory failed"
15715 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
15716 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
15717 rm -r $DIR/$tdir || error "unlink remote directory failed"
15719 run_test 230a "Create remote directory and files under the remote directory"
15722 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15723 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15724 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15725 skip "Need MDS version at least 2.11.52"
15733 local migrate_dir=$DIR/$tdir/migrate_dir
15734 local other_dir=$DIR/$tdir/other_dir
15736 test_mkdir $DIR/$tdir
15737 test_mkdir -i0 -c1 $migrate_dir
15738 test_mkdir -i0 -c1 $other_dir
15739 for ((i=0; i<10; i++)); do
15740 mkdir -p $migrate_dir/dir_${i}
15741 createmany -o $migrate_dir/dir_${i}/f 10 ||
15742 error "create files under remote dir failed $i"
15745 cp /etc/passwd $migrate_dir/$tfile
15746 cp /etc/passwd $other_dir/$tfile
15747 chattr +SAD $migrate_dir
15748 chattr +SAD $migrate_dir/$tfile
15750 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15751 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15752 local old_dir_mode=$(stat -c%f $migrate_dir)
15753 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
15755 mkdir -p $migrate_dir/dir_default_stripe2
15756 $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2
15757 $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2
15759 mkdir -p $other_dir
15760 ln $migrate_dir/$tfile $other_dir/luna
15761 ln $migrate_dir/$tfile $migrate_dir/sofia
15762 ln $other_dir/$tfile $migrate_dir/david
15763 ln -s $migrate_dir/$tfile $other_dir/zachary
15764 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
15765 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
15767 $LFS migrate -m $MDTIDX $migrate_dir ||
15768 error "fails on migrating remote dir to MDT1"
15770 echo "migratate to MDT1, then checking.."
15771 for ((i = 0; i < 10; i++)); do
15772 for file in $(find $migrate_dir/dir_${i}); do
15773 mdt_index=$($LFS getstripe -m $file)
15774 [ $mdt_index == $MDTIDX ] ||
15775 error "$file is not on MDT${MDTIDX}"
15779 # the multiple link file should still in MDT0
15780 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
15781 [ $mdt_index == 0 ] ||
15782 error "$file is not on MDT${MDTIDX}"
15784 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15785 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15786 error " expect $old_dir_flag get $new_dir_flag"
15788 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15789 [ "$old_file_flag" = "$new_file_flag" ] ||
15790 error " expect $old_file_flag get $new_file_flag"
15792 local new_dir_mode=$(stat -c%f $migrate_dir)
15793 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15794 error "expect mode $old_dir_mode get $new_dir_mode"
15796 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15797 [ "$old_file_mode" = "$new_file_mode" ] ||
15798 error "expect mode $old_file_mode get $new_file_mode"
15800 diff /etc/passwd $migrate_dir/$tfile ||
15801 error "$tfile different after migration"
15803 diff /etc/passwd $other_dir/luna ||
15804 error "luna different after migration"
15806 diff /etc/passwd $migrate_dir/sofia ||
15807 error "sofia different after migration"
15809 diff /etc/passwd $migrate_dir/david ||
15810 error "david different after migration"
15812 diff /etc/passwd $other_dir/zachary ||
15813 error "zachary different after migration"
15815 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15816 error "${tfile}_ln different after migration"
15818 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15819 error "${tfile}_ln_other different after migration"
15821 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
15822 [ $stripe_count = 2 ] ||
15823 error "dir strpe_count $d != 2 after migration."
15825 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
15826 [ $stripe_count = 2 ] ||
15827 error "file strpe_count $d != 2 after migration."
15829 #migrate back to MDT0
15832 $LFS migrate -m $MDTIDX $migrate_dir ||
15833 error "fails on migrating remote dir to MDT0"
15835 echo "migrate back to MDT0, checking.."
15836 for file in $(find $migrate_dir); do
15837 mdt_index=$($LFS getstripe -m $file)
15838 [ $mdt_index == $MDTIDX ] ||
15839 error "$file is not on MDT${MDTIDX}"
15842 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15843 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15844 error " expect $old_dir_flag get $new_dir_flag"
15846 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15847 [ "$old_file_flag" = "$new_file_flag" ] ||
15848 error " expect $old_file_flag get $new_file_flag"
15850 local new_dir_mode=$(stat -c%f $migrate_dir)
15851 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15852 error "expect mode $old_dir_mode get $new_dir_mode"
15854 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15855 [ "$old_file_mode" = "$new_file_mode" ] ||
15856 error "expect mode $old_file_mode get $new_file_mode"
15858 diff /etc/passwd ${migrate_dir}/$tfile ||
15859 error "$tfile different after migration"
15861 diff /etc/passwd ${other_dir}/luna ||
15862 error "luna different after migration"
15864 diff /etc/passwd ${migrate_dir}/sofia ||
15865 error "sofia different after migration"
15867 diff /etc/passwd ${other_dir}/zachary ||
15868 error "zachary different after migration"
15870 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15871 error "${tfile}_ln different after migration"
15873 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15874 error "${tfile}_ln_other different after migration"
15876 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
15877 [ $stripe_count = 2 ] ||
15878 error "dir strpe_count $d != 2 after migration."
15880 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
15881 [ $stripe_count = 2 ] ||
15882 error "file strpe_count $d != 2 after migration."
15884 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15886 run_test 230b "migrate directory"
15889 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15890 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15891 remote_mds_nodsh && skip "remote MDS with nodsh"
15892 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15893 skip "Need MDS version at least 2.11.52"
15899 local migrate_dir=$DIR/$tdir/migrate_dir
15901 #If migrating directory fails in the middle, all entries of
15902 #the directory is still accessiable.
15903 test_mkdir $DIR/$tdir
15904 test_mkdir -i0 -c1 $migrate_dir
15905 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
15907 createmany -o $migrate_dir/f $total ||
15908 error "create files under ${migrate_dir} failed"
15910 # fail after migrating top dir, and this will fail only once, so the
15911 # first sub file migration will fail (currently f3), others succeed.
15912 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
15913 do_facet mds1 lctl set_param fail_loc=0x1801
15914 local t=$(ls $migrate_dir | wc -l)
15915 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
15916 error "migrate should fail"
15917 local u=$(ls $migrate_dir | wc -l)
15918 [ "$u" == "$t" ] || error "$u != $t during migration"
15920 # add new dir/file should succeed
15921 mkdir $migrate_dir/dir ||
15922 error "mkdir failed under migrating directory"
15923 touch $migrate_dir/file ||
15924 error "create file failed under migrating directory"
15926 # add file with existing name should fail
15927 for file in $migrate_dir/f*; do
15928 stat $file > /dev/null || error "stat $file failed"
15929 $OPENFILE -f O_CREAT:O_EXCL $file &&
15930 error "open(O_CREAT|O_EXCL) $file should fail"
15931 $MULTIOP $file m && error "create $file should fail"
15932 touch $DIR/$tdir/remote_dir/$tfile ||
15933 error "touch $tfile failed"
15934 ln $DIR/$tdir/remote_dir/$tfile $file &&
15935 error "link $file should fail"
15936 mdt_index=$($LFS getstripe -m $file)
15937 if [ $mdt_index == 0 ]; then
15938 # file failed to migrate is not allowed to rename to
15939 mv $DIR/$tdir/remote_dir/$tfile $file &&
15940 error "rename to $file should fail"
15942 mv $DIR/$tdir/remote_dir/$tfile $file ||
15943 error "rename to $file failed"
15945 echo hello >> $file || error "write $file failed"
15948 # resume migration with different options should fail
15949 $LFS migrate -m 0 $migrate_dir &&
15950 error "migrate -m 0 $migrate_dir should fail"
15952 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
15953 error "migrate -c 2 $migrate_dir should fail"
15955 # resume migration should succeed
15956 $LFS migrate -m $MDTIDX $migrate_dir ||
15957 error "migrate $migrate_dir failed"
15959 echo "Finish migration, then checking.."
15960 for file in $(find $migrate_dir); do
15961 mdt_index=$($LFS getstripe -m $file)
15962 [ $mdt_index == $MDTIDX ] ||
15963 error "$file is not on MDT${MDTIDX}"
15966 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15968 run_test 230c "check directory accessiblity if migration failed"
15971 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15972 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15973 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15974 skip "Need MDS version at least 2.11.52"
15976 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
15978 local migrate_dir=$DIR/$tdir/migrate_dir
15988 old_index=$((RANDOM % MDSCOUNT))
15989 old_count=$((MDSCOUNT - old_index))
15990 new_index=$((RANDOM % MDSCOUNT))
15991 new_count=$((MDSCOUNT - new_index))
15992 new_hash="all_char"
15994 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
15995 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
15997 test_mkdir $DIR/$tdir
15998 test_mkdir -i $old_index -c $old_count $migrate_dir
16000 for ((i=0; i<100; i++)); do
16001 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
16002 createmany -o $migrate_dir/dir_${i}/f 100 ||
16003 error "create files under remote dir failed $i"
16006 echo -n "Migrate from MDT$old_index "
16007 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
16008 echo -n "to MDT$new_index"
16009 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
16012 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
16013 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
16014 error "migrate remote dir error"
16016 echo "Finish migration, then checking.."
16017 for file in $(find $migrate_dir); do
16018 mdt_index=$($LFS getstripe -m $file)
16019 if [ $mdt_index -lt $new_index ] ||
16020 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
16021 error "$file is on MDT$mdt_index"
16025 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16027 run_test 230d "check migrate big directory"
16030 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16031 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16032 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16033 skip "Need MDS version at least 2.11.52"
16040 mkdir -p $DIR/$tdir
16041 mkdir $DIR/$tdir/migrate_dir
16042 mkdir $DIR/$tdir/other_dir
16043 touch $DIR/$tdir/migrate_dir/a
16044 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
16045 ls $DIR/$tdir/other_dir
16047 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16048 error "migrate dir fails"
16050 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16051 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16053 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16054 [ $mdt_index == 0 ] || error "a is not on MDT0"
16056 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
16057 error "migrate dir fails"
16059 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
16060 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
16062 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16063 [ $mdt_index == 1 ] || error "a is not on MDT1"
16065 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
16066 [ $mdt_index == 1 ] || error "b is not on MDT1"
16068 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16069 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
16071 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
16073 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16075 run_test 230e "migrate mulitple local link files"
16078 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16079 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16080 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16081 skip "Need MDS version at least 2.11.52"
16086 mkdir -p $DIR/$tdir
16087 mkdir $DIR/$tdir/migrate_dir
16088 $LFS mkdir -i1 $DIR/$tdir/other_dir
16089 touch $DIR/$tdir/migrate_dir/a
16090 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
16091 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
16092 ls $DIR/$tdir/other_dir
16094 # a should be migrated to MDT1, since no other links on MDT0
16095 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16096 error "#1 migrate dir fails"
16097 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16098 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16099 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16100 [ $mdt_index == 1 ] || error "a is not on MDT1"
16102 # a should stay on MDT1, because it is a mulitple link file
16103 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16104 error "#2 migrate dir fails"
16105 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16106 [ $mdt_index == 1 ] || error "a is not on MDT1"
16108 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16109 error "#3 migrate dir fails"
16111 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16112 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
16113 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
16115 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
16116 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
16118 # a should be migrated to MDT0, since no other links on MDT1
16119 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16120 error "#4 migrate dir fails"
16121 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16122 [ $mdt_index == 0 ] || error "a is not on MDT0"
16124 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16126 run_test 230f "migrate mulitple remote link files"
16129 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16130 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16131 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16132 skip "Need MDS version at least 2.11.52"
16134 mkdir -p $DIR/$tdir/migrate_dir
16136 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
16137 error "migrating dir to non-exist MDT succeeds"
16140 run_test 230g "migrate dir to non-exist MDT"
16143 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16144 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16145 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16146 skip "Need MDS version at least 2.11.52"
16150 mkdir -p $DIR/$tdir/migrate_dir
16152 $LFS migrate -m1 $DIR &&
16153 error "migrating mountpoint1 should fail"
16155 $LFS migrate -m1 $DIR/$tdir/.. &&
16156 error "migrating mountpoint2 should fail"
16159 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
16160 error "migrating $tdir/migrate_dir/.. should fail"
16164 run_test 230h "migrate .. and root"
16167 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16168 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16169 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16170 skip "Need MDS version at least 2.11.52"
16172 mkdir -p $DIR/$tdir/migrate_dir
16174 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
16175 error "migration fails with a tailing slash"
16177 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
16178 error "migration fails with two tailing slashes"
16180 run_test 230i "lfs migrate -m tolerates trailing slashes"
16183 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16184 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16185 skip "Need MDS version at least 2.11.52"
16187 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
16188 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
16189 error "create $tfile failed"
16190 cat /etc/passwd > $DIR/$tdir/$tfile
16192 $LFS migrate -m 1 $DIR/$tdir
16194 cmp /etc/passwd $DIR/$tdir/$tfile ||
16195 error "DoM file mismatch after migration"
16197 run_test 230j "DoM file data not changed after dir migration"
16200 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
16201 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16202 skip "Need MDS version at least 2.11.56"
16205 local files_on_starting_mdt=0
16207 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
16208 $LFS getdirstripe $DIR/$tdir
16209 for i in $(seq $total); do
16210 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
16211 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16212 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16215 echo "$files_on_starting_mdt files on MDT0"
16217 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
16218 $LFS getdirstripe $DIR/$tdir
16220 files_on_starting_mdt=0
16221 for i in $(seq $total); do
16222 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16223 error "file $tfile.$i mismatch after migration"
16224 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16225 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16228 echo "$files_on_starting_mdt files on MDT1 after migration"
16229 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16231 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16232 $LFS getdirstripe $DIR/$tdir
16234 files_on_starting_mdt=0
16235 for i in $(seq $total); do
16236 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16237 error "file $tfile.$i mismatch after 2nd migration"
16238 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16239 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16242 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
16243 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16247 run_test 230k "file data not changed after dir migration"
16250 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16251 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16252 skip "Need MDS version at least 2.11.56"
16254 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16255 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16256 error "create files under remote dir failed $i"
16257 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16259 run_test 230l "readdir between MDTs won't crash"
16262 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16263 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16264 skip "Need MDS version at least 2.11.56"
16267 local mig_dir=$DIR/$tdir/migrate_dir
16268 local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16272 echo "Creating files and dirs with xattrs"
16273 test_mkdir $DIR/$tdir
16274 test_mkdir -i0 -c1 $mig_dir
16276 setfattr -n user.attr1 -v $longstr $mig_dir/dir ||
16277 error "cannot set xattr attr1 on dir"
16278 setfattr -n user.attr2 -v $shortstr $mig_dir/dir ||
16279 error "cannot set xattr attr2 on dir"
16280 touch $mig_dir/dir/f0
16281 setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 ||
16282 error "cannot set xattr attr1 on file"
16283 setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 ||
16284 error "cannot set xattr attr2 on file"
16285 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16286 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16287 [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir"
16288 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16289 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir"
16290 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16291 [ "$val" = $longstr ] || error "xattr attr1 not set properly on file"
16292 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16293 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file"
16295 echo "Migrating to MDT1"
16296 $LFS migrate -m $MDTIDX $mig_dir ||
16297 error "fails on migrating dir to MDT1"
16299 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16300 echo "Checking xattrs"
16301 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16302 [ "$val" = $longstr ] ||
16303 error "expecting xattr1 $longstr on dir, found $val"
16304 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16305 [ "$val" = $shortstr ] ||
16306 error "expecting xattr2 $shortstr on dir, found $val"
16307 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16308 [ "$val" = $longstr ] ||
16309 error "expecting xattr1 $longstr on file, found $val"
16310 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16311 [ "$val" = $shortstr ] ||
16312 error "expecting xattr2 $shortstr on file, found $val"
16314 run_test 230m "xattrs not changed after dir migration"
16318 # For simplicity this test assumes that max_pages_per_rpc
16319 # is the same across all OSCs
16320 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16321 local bulk_size=$((max_pages * PAGE_SIZE))
16322 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16325 mkdir -p $DIR/$tdir
16326 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16327 error "failed to set stripe with -S ${brw_size}M option"
16329 # clear the OSC stats
16330 $LCTL set_param osc.*.stats=0 &>/dev/null
16333 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16334 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16335 oflag=direct &>/dev/null || error "dd failed"
16337 sync; sleep 1; sync # just to be safe
16338 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16339 if [ x$nrpcs != "x1" ]; then
16340 $LCTL get_param osc.*.stats
16341 error "found $nrpcs ost_write RPCs, not 1 as expected"
16345 # Drop the OSC cache, otherwise we will read from it
16346 cancel_lru_locks osc
16348 # clear the OSC stats
16349 $LCTL set_param osc.*.stats=0 &>/dev/null
16351 # Client reads $bulk_size.
16352 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16353 iflag=direct &>/dev/null || error "dd failed"
16355 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16356 if [ x$nrpcs != "x1" ]; then
16357 $LCTL get_param osc.*.stats
16358 error "found $nrpcs ost_read RPCs, not 1 as expected"
16361 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16364 mkdir -p $DIR/$tdir
16366 for i in {0..1023}; do
16367 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16368 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16369 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16373 run_test 231b "must not assert on fully utilized OST request buffer"
16376 mkdir -p $DIR/$tdir
16377 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16379 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16380 do_facet ost1 $LCTL set_param fail_loc=0x31c
16382 # ignore dd failure
16383 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16385 do_facet ost1 $LCTL set_param fail_loc=0
16386 umount_client $MOUNT || error "umount failed"
16387 mount_client $MOUNT || error "mount failed"
16388 stop ost1 || error "cannot stop ost1"
16389 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16391 run_test 232a "failed lock should not block umount"
16394 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16395 skip "Need MDS version at least 2.10.58"
16397 mkdir -p $DIR/$tdir
16398 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16399 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16401 cancel_lru_locks osc
16403 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16404 do_facet ost1 $LCTL set_param fail_loc=0x31c
16407 $LFS data_version $DIR/$tdir/$tfile || true
16409 do_facet ost1 $LCTL set_param fail_loc=0
16410 umount_client $MOUNT || error "umount failed"
16411 mount_client $MOUNT || error "mount failed"
16412 stop ost1 || error "cannot stop ost1"
16413 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16415 run_test 232b "failed data version lock should not block umount"
16418 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
16419 skip "Need MDS version at least 2.3.64"
16420 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16422 local fid=$($LFS path2fid $MOUNT)
16424 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16425 error "cannot access $MOUNT using its FID '$fid'"
16427 run_test 233a "checking that OBF of the FS root succeeds"
16430 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
16431 skip "Need MDS version at least 2.5.90"
16432 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16434 local fid=$($LFS path2fid $MOUNT/.lustre)
16436 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16437 error "cannot access $MOUNT/.lustre using its FID '$fid'"
16439 fid=$($LFS path2fid $MOUNT/.lustre/fid)
16440 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16441 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
16443 run_test 233b "checking that OBF of the FS .lustre succeeds"
16446 local p="$TMP/sanityN-$TESTNAME.parameters"
16447 save_lustre_params client "llite.*.xattr_cache" > $p
16448 lctl set_param llite.*.xattr_cache 1 ||
16449 skip_env "xattr cache is not supported"
16451 mkdir -p $DIR/$tdir || error "mkdir failed"
16452 touch $DIR/$tdir/$tfile || error "touch failed"
16453 # OBD_FAIL_LLITE_XATTR_ENOMEM
16454 $LCTL set_param fail_loc=0x1405
16455 getfattr -n user.attr $DIR/$tdir/$tfile &&
16456 error "getfattr should have failed with ENOMEM"
16457 $LCTL set_param fail_loc=0x0
16460 restore_lustre_params < $p
16463 run_test 234 "xattr cache should not crash on ENOMEM"
16466 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
16467 skip "Need MDS version at least 2.4.52"
16469 flock_deadlock $DIR/$tfile
16474 124) error "process hangs on a deadlock"
16476 *) error "error executing flock_deadlock $DIR/$tfile"
16480 run_test 235 "LU-1715: flock deadlock detection does not work properly"
16484 check_swap_layouts_support
16486 local ref1=/etc/passwd
16487 local ref2=/etc/group
16488 local file1=$DIR/$tdir/f1
16489 local file2=$DIR/$tdir/f2
16491 test_mkdir -c1 $DIR/$tdir
16492 $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
16493 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
16494 $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
16495 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
16496 local fd=$(free_fd)
16497 local cmd="exec $fd<>$file2"
16500 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
16501 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
16504 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
16509 run_test 236 "Layout swap on open unlinked file"
16511 # LU-4659 linkea consistency
16513 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
16514 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
16515 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
16516 skip "Need MDS version at least 2.5.58 or 2.5.2+"
16519 ln $DIR/$tfile $DIR/$tfile.lnk
16520 touch $DIR/$tfile.new
16521 mv $DIR/$tfile.new $DIR/$tfile
16522 local fid1=$($LFS path2fid $DIR/$tfile)
16523 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
16524 local path1=$($LFS fid2path $FSNAME "$fid1")
16525 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
16526 local path2=$($LFS fid2path $FSNAME "$fid2")
16527 [ $tfile.lnk == $path2 ] ||
16528 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
16531 run_test 238 "Verify linkea consistency"
16533 test_239A() { # was test_239
16534 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
16535 skip "Need MDS version at least 2.5.60"
16537 local list=$(comma_list $(mdts_nodes))
16539 mkdir -p $DIR/$tdir
16540 createmany -o $DIR/$tdir/f- 5000
16541 unlinkmany $DIR/$tdir/f- 5000
16542 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
16543 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
16544 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
16545 osp.*MDT*.sync_in_flight" | calc_sum)
16546 [ "$changes" -eq 0 ] || error "$changes not synced"
16548 run_test 239A "osp_sync test"
16550 test_239a() { #LU-5297
16551 remote_mds_nodsh && skip "remote MDS with nodsh"
16554 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
16555 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
16556 chgrp $RUNAS_GID $DIR/$tfile
16557 wait_delete_completed
16559 run_test 239a "process invalid osp sync record correctly"
16561 test_239b() { #LU-5297
16562 remote_mds_nodsh && skip "remote MDS with nodsh"
16565 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
16566 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
16567 chgrp $RUNAS_GID $DIR/$tfile1
16568 wait_delete_completed
16569 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
16571 chgrp $RUNAS_GID $DIR/$tfile2
16572 wait_delete_completed
16574 run_test 239b "process osp sync record with ENOMEM error correctly"
16577 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16578 remote_mds_nodsh && skip "remote MDS with nodsh"
16580 mkdir -p $DIR/$tdir
16582 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
16583 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
16584 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
16585 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
16587 umount_client $MOUNT || error "umount failed"
16588 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
16589 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
16590 mount_client $MOUNT || error "failed to mount client"
16592 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
16593 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
16595 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
16601 for LOOP in $(seq $count); do
16602 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
16603 cancel_lru_locks $OSC || true
16611 for LOOP in $(seq $1); do
16612 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
16617 test_241a() { # was test_241
16618 local bsize=$PAGE_SIZE
16620 (( bsize < 40960 )) && bsize=40960
16621 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16623 cancel_lru_locks $OSC
16624 test_241_bio 1000 $bsize &
16626 test_241_dio 1000 $bsize
16629 run_test 241a "bio vs dio"
16632 local bsize=$PAGE_SIZE
16634 (( bsize < 40960 )) && bsize=40960
16635 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16637 test_241_dio 1000 $bsize &
16639 test_241_dio 1000 $bsize
16642 run_test 241b "dio vs dio"
16645 remote_mds_nodsh && skip "remote MDS with nodsh"
16647 mkdir -p $DIR/$tdir
16648 touch $DIR/$tdir/$tfile
16650 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
16651 do_facet mds1 lctl set_param fail_loc=0x105
16652 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
16654 do_facet mds1 lctl set_param fail_loc=0
16655 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
16657 run_test 242 "mdt_readpage failure should not cause directory unreadable"
16661 test_mkdir $DIR/$tdir
16662 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
16664 run_test 243 "various group lock tests"
16668 test_mkdir $DIR/$tdir
16669 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
16670 sendfile_grouplock $DIR/$tdir/$tfile || \
16671 error "sendfile+grouplock failed"
16674 run_test 244 "sendfile with group lock tests"
16677 local flagname="multi_mod_rpcs"
16678 local connect_data_name="max_mod_rpcs"
16681 # check if multiple modify RPCs flag is set
16682 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
16683 grep "connect_flags:")
16686 echo "$out" | grep -qw $flagname
16687 if [ $? -ne 0 ]; then
16688 echo "connect flag $flagname is not set"
16692 # check if multiple modify RPCs data is set
16693 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
16696 echo "$out" | grep -qw $connect_data_name ||
16697 error "import should have connect data $connect_data_name"
16699 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
16701 test_246() { # LU-7371
16702 remote_ost_nodsh && skip "remote OST with nodsh"
16703 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
16704 skip "Need OST version >= 2.7.62"
16706 do_facet ost1 $LCTL set_param fail_val=4095
16707 #define OBD_FAIL_OST_READ_SIZE 0x234
16708 do_facet ost1 $LCTL set_param fail_loc=0x234
16709 $LFS setstripe $DIR/$tfile -i 0 -c 1
16710 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
16711 cancel_lru_locks $FSNAME-OST0000
16712 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
16714 run_test 246 "Read file of size 4095 should return right length"
16720 umount_client $submount
16725 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16727 skip_env "Fileset feature is not supported"
16729 local submount=${MOUNT}_$tdir
16732 mkdir -p $submount || error "mkdir $submount failed"
16733 FILESET="$FILESET/$tdir" mount_client $submount ||
16734 error "mount $submount failed"
16735 trap "cleanup_247 $submount" EXIT
16736 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
16737 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
16738 error "read $MOUNT/$tdir/$tfile failed"
16739 cleanup_247 $submount
16741 run_test 247a "mount subdir as fileset"
16744 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16745 skip_env "Fileset feature is not supported"
16747 local submount=${MOUNT}_$tdir
16749 rm -rf $MOUNT/$tdir
16750 mkdir -p $submount || error "mkdir $submount failed"
16752 FILESET="$FILESET/$tdir" mount_client $submount &&
16753 error "mount $submount should fail"
16756 run_test 247b "mount subdir that dose not exist"
16759 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16760 skip_env "Fileset feature is not supported"
16762 local submount=${MOUNT}_$tdir
16764 mkdir -p $MOUNT/$tdir/dir1
16765 mkdir -p $submount || error "mkdir $submount failed"
16766 trap "cleanup_247 $submount" EXIT
16767 FILESET="$FILESET/$tdir" mount_client $submount ||
16768 error "mount $submount failed"
16769 local fid=$($LFS path2fid $MOUNT/)
16770 $LFS fid2path $submount $fid && error "fid2path should fail"
16771 cleanup_247 $submount
16773 run_test 247c "running fid2path outside root"
16776 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16777 skip "Fileset feature is not supported"
16779 local submount=${MOUNT}_$tdir
16781 mkdir -p $MOUNT/$tdir/dir1
16782 mkdir -p $submount || error "mkdir $submount failed"
16783 FILESET="$FILESET/$tdir" mount_client $submount ||
16784 error "mount $submount failed"
16785 trap "cleanup_247 $submount" EXIT
16786 local fid=$($LFS path2fid $submount/dir1)
16787 $LFS fid2path $submount $fid || error "fid2path should succeed"
16788 cleanup_247 $submount
16790 run_test 247d "running fid2path inside root"
16794 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16796 skip "Fileset feature is not supported"
16798 local submount=${MOUNT}_$tdir
16801 mkdir -p $submount || error "mkdir $submount failed"
16802 FILESET="$FILESET/.." mount_client $submount &&
16803 error "mount $submount should fail"
16806 run_test 247e "mount .. as fileset"
16809 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
16810 [ -z "$fast_read_sav" ] && skip "no fast read support"
16812 # create a large file for fast read verification
16813 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
16815 # make sure the file is created correctly
16816 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
16817 { rm -f $DIR/$tfile; skip "file creation error"; }
16819 echo "Test 1: verify that fast read is 4 times faster on cache read"
16821 # small read with fast read enabled
16822 $LCTL set_param -n llite.*.fast_read=1
16823 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16824 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16825 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16826 # small read with fast read disabled
16827 $LCTL set_param -n llite.*.fast_read=0
16828 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16829 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16830 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16832 # verify that fast read is 4 times faster for cache read
16833 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
16834 error_not_in_vm "fast read was not 4 times faster: " \
16835 "$t_fast vs $t_slow"
16837 echo "Test 2: verify the performance between big and small read"
16838 $LCTL set_param -n llite.*.fast_read=1
16840 # 1k non-cache read
16841 cancel_lru_locks osc
16842 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16843 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16844 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16846 # 1M non-cache read
16847 cancel_lru_locks osc
16848 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16849 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16850 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16852 # verify that big IO is not 4 times faster than small IO
16853 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
16854 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
16856 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
16859 run_test 248 "fast read verification"
16861 test_249() { # LU-7890
16862 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
16863 skip "Need at least version 2.8.54"
16866 $SETSTRIPE -c 1 $DIR/$tfile
16867 # Offset 2T == 4k * 512M
16868 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
16869 error "dd to 2T offset failed"
16871 run_test 249 "Write above 2T file size"
16874 [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
16875 && skip "no 16TB file size limit on ZFS"
16877 $SETSTRIPE -c 1 $DIR/$tfile
16878 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
16879 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
16880 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
16881 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
16882 conv=notrunc,fsync && error "append succeeded"
16885 run_test 250 "Write above 16T limit"
16888 $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile
16890 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
16891 #Skip once - writing the first stripe will succeed
16892 $LCTL set_param fail_loc=0xa0001407 fail_val=1
16893 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
16894 error "short write happened"
16896 $LCTL set_param fail_loc=0xa0001407 fail_val=1
16897 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
16898 error "short read happened"
16902 run_test 251 "Handling short read and write correctly"
16905 remote_mds_nodsh && skip "remote MDS with nodsh"
16906 remote_ost_nodsh && skip "remote OST with nodsh"
16907 if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then
16908 skip_env "ldiskfs only test"
16918 # check lr_reader on OST0000
16920 dev=$(facet_device $tgt)
16921 out=$(do_facet $tgt $LR_READER $dev)
16922 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
16924 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
16925 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
16926 error "Invalid uuid returned by $LR_READER on target $tgt"
16927 echo -e "uuid returned by $LR_READER is '$uuid'\n"
16929 # check lr_reader -c on MDT0000
16931 dev=$(facet_device $tgt)
16932 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
16933 skip "$LR_READER does not support additional options"
16935 out=$(do_facet $tgt $LR_READER -c $dev)
16936 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
16938 num=$(echo "$out" | grep -c "mdtlov")
16939 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
16940 error "Invalid number of mdtlov clients returned by $LR_READER"
16941 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
16943 # check lr_reader -cr on MDT0000
16944 out=$(do_facet $tgt $LR_READER -cr $dev)
16945 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
16947 echo "$out" | grep -q "^reply_data:$" ||
16948 error "$LR_READER should have returned 'reply_data' section"
16949 num=$(echo "$out" | grep -c "client_generation")
16950 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
16952 run_test 252 "check lr_reader tool"
16954 test_253_fill_ost() {
16955 local size_mb #how many MB should we write to pass watermark
16956 local lwm=$3 #low watermark
16957 local free_10mb #10% of free space
16959 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
16960 size_mb=$((free_kb / 1024 - lwm))
16961 free_10mb=$((free_kb / 10240))
16962 #If 10% of free space cross low watermark use it
16963 if (( free_10mb > size_mb )); then
16966 #At least we need to store 1.1 of difference between
16967 #free space and low watermark
16968 size_mb=$((size_mb + size_mb / 10))
16970 if (( lwm <= $((free_kb / 1024)) )) || [ ! -f $DIR/$tdir/1 ]; then
16971 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M count=$size_mb \
16972 oflag=append conv=notrunc
16977 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
16978 echo "OST still has $((free_kb / 1024)) mbytes free"
16982 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16983 remote_mds_nodsh && skip "remote MDS with nodsh"
16984 remote_mgs_nodsh && skip "remote MGS with nodsh"
16989 local ost_name=$($LFS osts |
16990 sed -n 's/^'$ostidx': \(.*\)_UUID .*/\1/p')
16992 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
16993 do_facet $SINGLEMDS $LCTL get_param -n \
16994 osp.$mdtosc_proc1.reserved_mb_high ||
16995 skip "remote MDS does not support reserved_mb_high"
16999 wait_delete_completed
17002 local last_wm_h=$(do_facet $SINGLEMDS $LCTL get_param -n \
17003 osp.$mdtosc_proc1.reserved_mb_high)
17004 local last_wm_l=$(do_facet $SINGLEMDS $LCTL get_param -n \
17005 osp.$mdtosc_proc1.reserved_mb_low)
17006 echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l"
17008 create_pool $FSNAME.$TESTNAME || error "Pool creation failed"
17009 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name ||
17010 error "Adding $ost_name to pool failed"
17012 # Wait for client to see a OST at pool
17013 wait_update $HOSTNAME "$LCTL get_param -n
17014 lov.$FSNAME-*.pools.$TESTNAME | sort -u |
17015 grep $ost_name" "$ost_name""_UUID" $((TIMEOUT/2)) ||
17016 error "Client can not see the pool"
17017 $SETSTRIPE $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
17018 error "Setstripe failed"
17020 dd if=/dev/zero of=$DIR/$tdir/0 bs=1M count=10
17021 local blocks=$($LFS df $MOUNT | grep $ost_name | awk '{ print $4 }')
17022 echo "OST still has $((blocks/1024)) mbytes free"
17024 local new_lwm=$((blocks/1024-10))
17025 do_facet $SINGLEMDS $LCTL set_param \
17026 osp.$mdtosc_proc1.reserved_mb_high=$((new_lwm+5))
17027 do_facet $SINGLEMDS $LCTL set_param \
17028 osp.$mdtosc_proc1.reserved_mb_low=$new_lwm
17030 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17032 #First enospc could execute orphan deletion so repeat.
17033 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17035 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17036 osp.$mdtosc_proc1.prealloc_status)
17037 echo "prealloc_status $oa_status"
17039 dd if=/dev/zero of=$DIR/$tdir/2 bs=1M count=1 &&
17040 error "File creation should fail"
17041 #object allocation was stopped, but we still able to append files
17042 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M seek=6 count=5 oflag=append ||
17043 error "Append failed"
17044 rm -f $DIR/$tdir/1 $DIR/$tdir/0 $DIR/$tdir/r*
17046 wait_delete_completed
17050 for i in $(seq 10 12); do
17051 dd if=/dev/zero of=$DIR/$tdir/$i bs=1M count=1 2>/dev/null ||
17052 error "File creation failed after rm";
17055 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17056 osp.$mdtosc_proc1.prealloc_status)
17057 echo "prealloc_status $oa_status"
17059 if (( oa_status != 0 )); then
17060 error "Object allocation still disable after rm"
17062 do_facet $SINGLEMDS $LCTL set_param \
17063 osp.$mdtosc_proc1.reserved_mb_high=$last_wm_h
17064 do_facet $SINGLEMDS $LCTL set_param \
17065 osp.$mdtosc_proc1.reserved_mb_low=$last_wm_l
17068 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $ost_name ||
17069 error "Remove $ost_name from pool failed"
17070 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
17071 error "Pool destroy fialed"
17073 run_test 253 "Check object allocation limit"
17076 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17077 remote_mds_nodsh && skip "remote MDS with nodsh"
17078 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
17079 skip "MDS does not support changelog_size"
17082 local MDT0=$(facet_svc $SINGLEMDS)
17084 changelog_register || error "changelog_register failed"
17086 changelog_clear 0 || error "changelog_clear failed"
17088 local size1=$(do_facet $SINGLEMDS \
17089 $LCTL get_param -n mdd.$MDT0.changelog_size)
17090 echo "Changelog size $size1"
17093 $LFS mkdir -i 0 $DIR/$tdir
17095 mkdir -p $DIR/$tdir/pics/2008/zachy
17096 touch $DIR/$tdir/pics/2008/zachy/timestamp
17097 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
17098 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
17099 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
17100 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
17101 rm $DIR/$tdir/pics/desktop.jpg
17103 local size2=$(do_facet $SINGLEMDS \
17104 $LCTL get_param -n mdd.$MDT0.changelog_size)
17105 echo "Changelog size after work $size2"
17107 (( $size2 > $size1 )) ||
17108 error "new Changelog size=$size2 less than old size=$size1"
17110 run_test 254 "Check changelog size"
17117 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
17118 awk -F: '{print $2}' | grep $type > /dev/null
17119 if [ $? -ne 0 ]; then
17129 lfs ladvise -a willread $file > /dev/null 2>&1
17130 if [ $? -eq 0 ]; then
17134 lfs ladvise -a willread $file 2>&1 |
17135 grep "Inappropriate ioctl for device" > /dev/null
17136 if [ $? -eq 0 ]; then
17143 bc <<<"scale=2; ($1 - $2) * 100 / $2"
17146 # run a random read IO workload
17147 # usage: random_read_iops <filename> <filesize> <iosize>
17148 random_read_iops() {
17151 local iosize=${3:-4096}
17153 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
17154 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
17157 drop_file_oss_cache() {
17161 $LFS ladvise -a dontneed $file 2>/dev/null ||
17162 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
17165 ladvise_willread_performance()
17168 local average_origin=0
17169 local average_cache=0
17170 local average_ladvise=0
17172 for ((i = 1; i <= $repeat; i++)); do
17173 echo "Iter $i/$repeat: reading without willread hint"
17174 cancel_lru_locks osc
17175 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17176 local speed_origin=$(random_read_iops $DIR/$tfile $size)
17177 echo "Iter $i/$repeat: uncached speed: $speed_origin"
17178 average_origin=$(bc <<<"$average_origin + $speed_origin")
17180 cancel_lru_locks osc
17181 local speed_cache=$(random_read_iops $DIR/$tfile $size)
17182 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
17183 average_cache=$(bc <<<"$average_cache + $speed_cache")
17185 cancel_lru_locks osc
17186 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17187 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
17188 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
17189 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
17190 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
17192 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
17193 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
17194 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
17196 speedup_cache=$(percent $average_cache $average_origin)
17197 speedup_ladvise=$(percent $average_ladvise $average_origin)
17199 echo "Average uncached read: $average_origin"
17200 echo "Average speedup with OSS cached read: " \
17201 "$average_cache = +$speedup_cache%"
17202 echo "Average speedup with ladvise willread: " \
17203 "$average_ladvise = +$speedup_ladvise%"
17205 local lowest_speedup=20
17206 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
17207 echo "Speedup with OSS cached read less than $lowest_speedup%," \
17208 "got $average_cache%. Skipping ladvise willread check."
17212 # the test won't work on ZFS until it supports 'ladvise dontneed', but
17213 # it is still good to run until then to exercise 'ladvise willread'
17214 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17215 [ "$ost1_FSTYPE" = "zfs" ] &&
17216 echo "osd-zfs does not support dontneed or drop_caches" &&
17219 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
17220 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
17221 error_not_in_vm "Speedup with willread is less than " \
17222 "$lowest_speedup%, got $average_ladvise%"
17226 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17227 skip "lustre < 2.8.54 does not support ladvise "
17228 remote_ost_nodsh && skip "remote OST with nodsh"
17230 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
17232 ladvise_no_type willread $DIR/$tfile &&
17233 skip "willread ladvise is not supported"
17235 ladvise_no_ioctl $DIR/$tfile &&
17236 skip "ladvise ioctl is not supported"
17239 local size=$((size_mb * 1048576))
17240 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17241 error "dd to $DIR/$tfile failed"
17243 lfs ladvise -a willread $DIR/$tfile ||
17244 error "Ladvise failed with no range argument"
17246 lfs ladvise -a willread -s 0 $DIR/$tfile ||
17247 error "Ladvise failed with no -l or -e argument"
17249 lfs ladvise -a willread -e 1 $DIR/$tfile ||
17250 error "Ladvise failed with only -e argument"
17252 lfs ladvise -a willread -l 1 $DIR/$tfile ||
17253 error "Ladvise failed with only -l argument"
17255 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
17256 error "End offset should not be smaller than start offset"
17258 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
17259 error "End offset should not be equal to start offset"
17261 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
17262 error "Ladvise failed with overflowing -s argument"
17264 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
17265 error "Ladvise failed with overflowing -e argument"
17267 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
17268 error "Ladvise failed with overflowing -l argument"
17270 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
17271 error "Ladvise succeeded with conflicting -l and -e arguments"
17273 echo "Synchronous ladvise should wait"
17275 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17276 do_nodes $(comma_list $(osts_nodes)) \
17277 $LCTL set_param fail_val=$delay fail_loc=0x237
17279 local start_ts=$SECONDS
17280 lfs ladvise -a willread $DIR/$tfile ||
17281 error "Ladvise failed with no range argument"
17282 local end_ts=$SECONDS
17283 local inteval_ts=$((end_ts - start_ts))
17285 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17286 error "Synchronous advice didn't wait reply"
17289 echo "Asynchronous ladvise shouldn't wait"
17290 local start_ts=$SECONDS
17291 lfs ladvise -a willread -b $DIR/$tfile ||
17292 error "Ladvise failed with no range argument"
17293 local end_ts=$SECONDS
17294 local inteval_ts=$((end_ts - start_ts))
17296 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17297 error "Asynchronous advice blocked"
17300 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17301 ladvise_willread_performance
17303 run_test 255a "check 'lfs ladvise -a willread'"
17309 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17313 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17314 skip "lustre < 2.8.54 does not support ladvise "
17315 remote_ost_nodsh && skip "remote OST with nodsh"
17317 lfs setstripe -c 1 -i 0 $DIR/$tfile
17319 ladvise_no_type dontneed $DIR/$tfile &&
17320 skip "dontneed ladvise is not supported"
17322 ladvise_no_ioctl $DIR/$tfile &&
17323 skip "ladvise ioctl is not supported"
17325 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17326 [ "$ost1_FSTYPE" = "zfs" ] &&
17327 skip "zfs-osd does not support 'ladvise dontneed'"
17330 local size=$((size_mb * 1048576))
17331 # In order to prevent disturbance of other processes, only check 3/4
17332 # of the memory usage
17333 local kibibytes=$((size_mb * 1024 * 3 / 4))
17335 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17336 error "dd to $DIR/$tfile failed"
17338 #force write to complete before dropping OST cache & checking memory
17341 local total=$(facet_meminfo ost1 MemTotal)
17342 echo "Total memory: $total KiB"
17344 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17345 local before_read=$(facet_meminfo ost1 Cached)
17346 echo "Cache used before read: $before_read KiB"
17348 lfs ladvise -a willread $DIR/$tfile ||
17349 error "Ladvise willread failed"
17350 local after_read=$(facet_meminfo ost1 Cached)
17351 echo "Cache used after read: $after_read KiB"
17353 lfs ladvise -a dontneed $DIR/$tfile ||
17354 error "Ladvise dontneed again failed"
17355 local no_read=$(facet_meminfo ost1 Cached)
17356 echo "Cache used after dontneed ladvise: $no_read KiB"
17358 if [ $total -lt $((before_read + kibibytes)) ]; then
17359 echo "Memory is too small, abort checking"
17363 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17364 error "Ladvise willread should use more memory" \
17365 "than $kibibytes KiB"
17368 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17369 error "Ladvise dontneed should release more memory" \
17370 "than $kibibytes KiB"
17373 run_test 255b "check 'lfs ladvise -a dontneed'"
17376 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17377 skip "lustre < 2.10.50 does not support lockahead"
17385 test_mkdir -p $DIR/$tdir
17386 $SETSTRIPE -i 0 $DIR/$tdir
17388 #test 10 returns only success/failure
17390 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17392 if [ $rc -eq 255 ]; then
17393 error "Ladvise test${i} failed, ${rc}"
17396 #test 11 counts lock enqueue requests, all others count new locks
17398 count=$(do_facet ost1 \
17399 $LCTL get_param -n ost.OSS.ost.stats)
17400 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17402 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17404 if [ $rc -eq 255 ]; then
17405 error "Ladvise test${i} failed, ${rc}"
17408 new_count=$(do_facet ost1 \
17409 $LCTL get_param -n ost.OSS.ost.stats)
17410 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17411 awk '{ print $2 }')
17413 difference="$((new_count - count))"
17414 if [ $difference -ne $rc ]; then
17415 error "Ladvise test${i}, bad enqueue count, returned " \
17416 "${rc}, actual ${difference}"
17419 for i in $(seq 12 21); do
17420 # If we do not do this, we run the risk of having too many
17421 # locks and starting lock cancellation while we are checking
17423 cancel_lru_locks osc
17425 count=$($LCTL get_param -n \
17426 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17428 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17430 if [ $rc -eq 255 ]; then
17431 error "Ladvise test ${i} failed, ${rc}"
17434 new_count=$($LCTL get_param -n \
17435 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17436 difference="$((new_count - count))"
17438 # Test 15 output is divided by 100 to map down to valid return
17439 if [ $i -eq 15 ]; then
17443 if [ $difference -ne $rc ]; then
17444 error "Ladvise test ${i}, bad lock count, returned " \
17445 "${rc}, actual ${difference}"
17449 #test 22 returns only success/failure
17451 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17453 if [ $rc -eq 255 ]; then
17454 error "Ladvise test${i} failed, ${rc}"
17457 run_test 255c "suite of ladvise lockahead tests"
17460 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17461 remote_mds_nodsh && skip "remote MDS with nodsh"
17462 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17463 changelog_users $SINGLEMDS | grep "^cl" &&
17464 skip "active changelog user"
17470 mdt_dev=$(mdsdevname 1)
17473 changelog_register || error "changelog_register failed"
17476 mkdir -p $DIR/$tdir
17478 changelog_clear 0 || error "changelog_clear failed"
17481 touch $DIR/$tdir/{1..10}
17484 stop $SINGLEMDS || error "Fail to stop MDT"
17488 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
17490 #after mount new plainllog is used
17491 touch $DIR/$tdir/{11..19}
17492 local tmpfile=$(mktemp -u $tfile.XXXXXX)
17493 cat_sl=$(do_facet $SINGLEMDS "sync; \
17494 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17495 llog_reader $tmpfile | grep -c type=1064553b")
17496 do_facet $SINGLEMDS llog_reader $tmpfile
17498 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
17500 changelog_clear 0 || error "changelog_clear failed"
17502 cat_sl=$(do_facet $SINGLEMDS "sync; \
17503 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17504 llog_reader $tmpfile | grep -c type=1064553b; rm -f $tmpfile")
17506 if (( cat_sl == 2 )); then
17507 error "Empty plain llog was not deleted from changelog catalog"
17508 elif (( cat_sl != 1 )); then
17509 error "Active plain llog shouldn't be deleted from catalog"
17512 run_test 256 "Check llog delete for empty and not full state"
17515 remote_mds_nodsh && skip "remote MDS with nodsh"
17516 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
17517 skip "Need MDS version at least 2.8.55"
17519 test_mkdir $DIR/$tdir
17521 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
17522 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
17525 #define OBD_FAIL_MDS_XATTR_REP 0x161
17526 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17527 local facet=mds$((mdtidx + 1))
17528 set_nodes_failloc $(facet_active_host $facet) 0x80000161
17529 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
17531 stop $facet || error "stop MDS failed"
17532 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
17533 error "start MDS fail"
17535 run_test 257 "xattr locks are not lost"
17537 # Verify we take the i_mutex when security requires it
17539 #define OBD_FAIL_IMUTEX_SEC 0x141c
17540 $LCTL set_param fail_loc=0x141c
17542 chmod u+s $DIR/$tfile
17543 chmod a+rwx $DIR/$tfile
17544 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17546 if [ $RC -ne 0 ]; then
17547 error "error, failed to take i_mutex, rc=$?"
17551 run_test 258a "verify i_mutex security behavior when suid attributes is set"
17553 # Verify we do NOT take the i_mutex in the normal case
17555 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
17556 $LCTL set_param fail_loc=0x141d
17559 chmod a+rw $DIR/$tfile
17560 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17562 if [ $RC -ne 0 ]; then
17563 error "error, took i_mutex unnecessarily, rc=$?"
17568 run_test 258b "verify i_mutex security behavior"
17571 local file=$DIR/$tfile
17575 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17577 stack_trap "rm -f $file" EXIT
17579 wait_delete_completed
17580 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17581 echo "before: $before"
17583 $LFS setstripe -i 0 -c 1 $file
17584 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
17586 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17587 echo "after write: $after"
17589 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
17590 do_facet ost1 $LCTL set_param fail_loc=0x2301
17592 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17593 echo "after truncate: $after"
17596 do_facet ost1 $LCTL set_param fail_loc=0
17597 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17599 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17600 echo "after restart: $after"
17601 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
17602 error "missing truncate?"
17606 run_test 259 "crash at delayed truncate"
17609 #define OBD_FAIL_MDC_CLOSE 0x806
17610 $LCTL set_param fail_loc=0x80000806
17614 run_test 260 "Check mdc_close fail"
17616 ### Data-on-MDT sanity tests ###
17618 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17619 skip "Need MDS version at least 2.10.55 for DoM"
17622 local dom=$DIR/$tdir/dom_file
17623 local tmp=$DIR/$tdir/tmp_file
17625 mkdir -p $DIR/$tdir
17627 # basic checks for DoM component creation
17628 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
17629 error "Can set MDT layout to non-first entry"
17631 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
17632 error "Can define multiple entries as MDT layout"
17634 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
17636 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
17637 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
17638 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
17640 local mdtidx=$($LFS getstripe -m $dom)
17641 local mdtname=MDT$(printf %04x $mdtidx)
17642 local facet=mds$((mdtidx + 1))
17643 local space_check=1
17645 # Skip free space checks with ZFS
17646 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
17650 local size_tmp=$((65536 * 3))
17651 local mdtfree1=$(do_facet $facet \
17652 lctl get_param -n osd*.*$mdtname.kbytesfree)
17654 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17655 # check also direct IO along write
17656 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
17657 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17659 cmp $tmp $dom || error "file data is different"
17660 [ $(stat -c%s $dom) == $size_tmp ] ||
17661 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17662 if [ $space_check == 1 ]; then
17663 local mdtfree2=$(do_facet $facet \
17664 lctl get_param -n osd*.*$mdtname.kbytesfree)
17666 # increase in usage from by $size_tmp
17667 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17668 error "MDT free space wrong after write: " \
17669 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17673 local size_dom=10000
17675 $TRUNCATE $dom $size_dom
17676 [ $(stat -c%s $dom) == $size_dom ] ||
17677 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
17678 if [ $space_check == 1 ]; then
17679 mdtfree1=$(do_facet $facet \
17680 lctl get_param -n osd*.*$mdtname.kbytesfree)
17681 # decrease in usage from $size_tmp to new $size_dom
17682 [ $(($mdtfree1 - $mdtfree2)) -ge \
17683 $(((size_tmp - size_dom) / 1024)) ] ||
17684 error "MDT free space is wrong after truncate: " \
17685 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
17691 size_dom=$((size_dom + size_tmp))
17692 [ $(stat -c%s $dom) == $size_dom ] ||
17693 error "bad size after append: $(stat -c%s $dom) != $size_dom"
17694 if [ $space_check == 1 ]; then
17695 mdtfree2=$(do_facet $facet \
17696 lctl get_param -n osd*.*$mdtname.kbytesfree)
17697 # increase in usage by $size_tmp from previous
17698 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17699 error "MDT free space is wrong after append: " \
17700 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17705 if [ $space_check == 1 ]; then
17706 mdtfree1=$(do_facet $facet \
17707 lctl get_param -n osd*.*$mdtname.kbytesfree)
17708 # decrease in usage by $size_dom from previous
17709 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
17710 error "MDT free space is wrong after removal: " \
17711 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
17714 # combined striping
17715 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
17716 error "Can't create DoM + OST striping"
17718 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
17719 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17720 # check also direct IO along write
17721 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17723 cmp $tmp $dom || error "file data is different"
17724 [ $(stat -c%s $dom) == $size_tmp ] ||
17725 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17730 run_test 270a "DoM: basic functionality tests"
17733 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17734 skip "Need MDS version at least 2.10.55"
17736 local dom=$DIR/$tdir/dom_file
17737 local max_size=1048576
17739 mkdir -p $DIR/$tdir
17740 $LFS setstripe -E $max_size -L mdt $dom
17742 # truncate over the limit
17743 $TRUNCATE $dom $(($max_size + 1)) &&
17744 error "successful truncate over the maximum size"
17745 # write over the limit
17746 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
17747 error "successful write over the maximum size"
17748 # append over the limit
17749 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
17750 echo "12345" >> $dom && error "successful append over the maximum size"
17755 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
17758 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17759 skip "Need MDS version at least 2.10.55"
17761 mkdir -p $DIR/$tdir
17762 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17764 # check files inherit DoM EA
17765 touch $DIR/$tdir/first
17766 [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] ||
17767 error "bad pattern"
17768 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
17769 error "bad stripe count"
17770 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
17771 error "bad stripe size"
17773 # check directory inherits DoM EA and uses it as default
17774 mkdir $DIR/$tdir/subdir
17775 touch $DIR/$tdir/subdir/second
17776 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
17777 error "bad pattern in sub-directory"
17778 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
17779 error "bad stripe count in sub-directory"
17780 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
17781 error "bad stripe size in sub-directory"
17784 run_test 270c "DoM: DoM EA inheritance tests"
17787 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17788 skip "Need MDS version at least 2.10.55"
17790 mkdir -p $DIR/$tdir
17791 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17793 # inherit default DoM striping
17794 mkdir $DIR/$tdir/subdir
17795 touch $DIR/$tdir/subdir/f1
17797 # change default directory striping
17798 $LFS setstripe -c 1 $DIR/$tdir/subdir
17799 touch $DIR/$tdir/subdir/f2
17800 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
17801 error "wrong default striping in file 2"
17802 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
17803 error "bad pattern in file 2"
17806 run_test 270d "DoM: change striping from DoM to RAID0"
17809 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17810 skip "Need MDS version at least 2.10.55"
17812 mkdir -p $DIR/$tdir/dom
17813 mkdir -p $DIR/$tdir/norm
17816 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
17817 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
17819 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
17820 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
17822 # find DoM files by layout
17823 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
17824 [ $NUM -eq $DOMFILES ] ||
17825 error "lfs find -L: found $NUM, expected $DOMFILES"
17826 echo "Test 1: lfs find 20 DOM files by layout: OK"
17828 # there should be 1 dir with default DOM striping
17829 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
17831 error "lfs find -L: found $NUM, expected 1 dir"
17832 echo "Test 2: lfs find 1 DOM dir by layout: OK"
17834 # find DoM files by stripe size
17835 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
17836 [ $NUM -eq $DOMFILES ] ||
17837 error "lfs find -S: found $NUM, expected $DOMFILES"
17838 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
17840 # find files by stripe offset except DoM files
17841 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
17842 [ $NUM -eq $NORMFILES ] ||
17843 error "lfs find -i: found $NUM, expected $NORMFILES"
17844 echo "Test 5: lfs find no DOM files by stripe index: OK"
17847 run_test 270e "DoM: lfs find with DoM files test"
17850 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17851 skip "Need MDS version at least 2.10.55"
17853 local mdtname=${FSNAME}-MDT0000-mdtlov
17854 local dom=$DIR/$tdir/dom_file
17855 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
17856 lod.$mdtname.dom_stripesize)
17857 local dom_limit=131072
17859 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
17860 local dom_current=$(do_facet mds1 $LCTL get_param -n \
17861 lod.$mdtname.dom_stripesize)
17862 [ ${dom_limit} -eq ${dom_current} ] ||
17863 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
17865 $LFS mkdir -i 0 -c 1 $DIR/$tdir
17866 $LFS setstripe -d $DIR/$tdir
17867 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
17868 error "Can't set directory default striping"
17870 # exceed maximum stripe size
17871 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
17872 error "Can't create file with $((dom_limit * 2)) DoM stripe"
17873 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
17874 error "Able to create DoM component size more than LOD limit"
17876 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
17877 dom_current=$(do_facet mds1 $LCTL get_param -n \
17878 lod.$mdtname.dom_stripesize)
17879 [ 0 -eq ${dom_current} ] ||
17880 error "Can't set zero DoM stripe limit"
17883 # attempt to create DoM file on server with disabled DoM should
17884 # remove DoM entry from layout and be succeed
17885 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
17886 error "Can't create DoM file (DoM is disabled)"
17887 [ $($LFS getstripe -L $dom) == "mdt" ] &&
17888 error "File has DoM component while DoM is disabled"
17891 # attempt to create DoM file with only DoM stripe should return error
17892 $LFS setstripe -E $dom_limit -L mdt $dom &&
17893 error "Able to create DoM-only file while DoM is disabled"
17895 # too low values to be aligned with smallest stripe size 64K
17896 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
17897 dom_current=$(do_facet mds1 $LCTL get_param -n \
17898 lod.$mdtname.dom_stripesize)
17899 [ 30000 -eq ${dom_current} ] &&
17900 error "Can set too small DoM stripe limit"
17902 # 64K is a minimal stripe size in Lustre, expect limit of that size
17903 [ 65536 -eq ${dom_current} ] ||
17904 error "Limit is not set to 64K but ${dom_current}"
17906 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
17907 dom_current=$(do_facet mds1 $LCTL get_param -n \
17908 lod.$mdtname.dom_stripesize)
17910 [ 2147483648 -eq ${dom_current} ] &&
17911 error "Can set too large DoM stripe limit"
17913 do_facet mds1 $LCTL set_param -n \
17914 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
17915 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
17916 error "Can't create DoM component size after limit change"
17917 do_facet mds1 $LCTL set_param -n \
17918 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
17919 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
17920 error "Can't create DoM file after limit decrease"
17921 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
17922 error "Can create big DoM component after limit decrease"
17923 touch ${dom}_def ||
17924 error "Can't create file with old default layout"
17926 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
17929 run_test 270f "DoM: maximum DoM stripe size checks"
17932 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17933 skip "Need MDS version at least 2.10.55"
17935 local dom=$DIR/$tdir/dom
17937 mkdir -p $DIR/$tdir
17939 $LFS setstripe -E 1024K -L mdt $dom
17941 lctl set_param -n mdc.*.stats=clear
17942 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
17943 cat $dom > /dev/null
17944 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
17945 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
17949 run_test 271a "DoM: data is cached for read after write"
17952 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17953 skip "Need MDS version at least 2.10.55"
17955 local dom=$DIR/$tdir/dom
17957 mkdir -p $DIR/$tdir
17959 $LFS setstripe -E 1024K -L mdt -E EOF $dom
17961 lctl set_param -n mdc.*.stats=clear
17962 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
17963 cancel_lru_locks mdc
17964 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
17965 # second stat to check size is cached on client
17966 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
17967 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
17968 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
17971 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
17974 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17975 skip "Need MDS version at least 2.10.55"
17977 local dom=$DIR/$tdir/dom
17979 mkdir -p $DIR/$tdir
17981 $LFS setstripe -E 1024K -L mdt -E EOF $dom
17983 lctl set_param -n mdc.*.stats=clear
17984 lctl set_param -n osc.*.stats=clear
17985 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
17986 cancel_lru_locks mdc
17987 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
17988 # second stat to check size is cached on client
17989 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
17990 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
17991 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
17992 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
17993 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
17996 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
18002 local mdt=MDT$(printf %04x $mdtidx)
18004 if [ -z $param ]; then
18005 lctl get_param -n mdc.*$mdt*.stats
18007 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
18012 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18013 skip "Need MDS version at least 2.10.55"
18015 local dom=$DIR/$tdir/dom
18017 mkdir -p $DIR/$tdir
18019 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18021 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18022 local facet=mds$((mdtidx + 1))
18024 cancel_lru_locks mdc
18025 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
18026 createmany -o $dom 1000
18027 lctl set_param -n mdc.*.stats=clear
18028 smalliomany -w $dom 1000 200
18029 get_mdc_stats $mdtidx
18030 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18031 # Each file has 1 open, 1 IO enqueues, total 2000
18032 # but now we have also +1 getxattr for security.capability, total 3000
18033 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
18034 unlinkmany $dom 1000
18036 cancel_lru_locks mdc
18037 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
18038 createmany -o $dom 1000
18039 lctl set_param -n mdc.*.stats=clear
18040 smalliomany -w $dom 1000 200
18041 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18042 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
18043 # for OPEN and IO lock.
18044 [ $((enq - enq_2)) -ge 1000 ] ||
18045 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
18046 unlinkmany $dom 1000
18049 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
18051 cleanup_271def_tests() {
18057 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18058 skip "Need MDS version at least 2.10.57"
18060 local dom=$DIR/$tdir/dom
18061 local tmp=$TMP/$tfile
18062 trap "cleanup_271def_tests $tmp" EXIT
18064 mkdir -p $DIR/$tdir
18066 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18068 local mdtidx=$($GETSTRIPE -M $DIR/$tdir)
18070 cancel_lru_locks mdc
18071 dd if=/dev/urandom of=$tmp bs=1000 count=1
18072 dd if=$tmp of=$dom bs=1000 count=1
18073 cancel_lru_locks mdc
18075 cat /etc/hosts >> $tmp
18076 lctl set_param -n mdc.*.stats=clear
18078 # append data to the same file it should update local page
18079 echo "Append to the same page"
18080 cat /etc/hosts >> $dom
18081 local num=$(get_mdc_stats $mdtidx ost_read)
18082 local ra=$(get_mdc_stats $mdtidx req_active)
18083 local rw=$(get_mdc_stats $mdtidx req_waittime)
18085 [ -z $num ] || error "$num READ RPC occured"
18086 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18090 cmp $tmp $dom || error "file miscompare"
18092 cancel_lru_locks mdc
18093 lctl set_param -n mdc.*.stats=clear
18095 echo "Open and read file"
18096 cat $dom > /dev/null
18097 local num=$(get_mdc_stats $mdtidx ost_read)
18098 local ra=$(get_mdc_stats $mdtidx req_active)
18099 local rw=$(get_mdc_stats $mdtidx req_waittime)
18101 [ -z $num ] || error "$num READ RPC occured"
18102 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18106 cmp $tmp $dom || error "file miscompare"
18110 run_test 271d "DoM: read on open (1K file in reply buffer)"
18113 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18114 skip "Need MDS version at least 2.10.57"
18116 local dom=$DIR/$tdir/dom
18117 local tmp=$TMP/$tfile
18118 trap "cleanup_271def_tests $tmp" EXIT
18120 mkdir -p $DIR/$tdir
18122 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18124 local mdtidx=$($GETSTRIPE -M $DIR/$tdir)
18126 cancel_lru_locks mdc
18127 dd if=/dev/urandom of=$tmp bs=200000 count=1
18128 dd if=$tmp of=$dom bs=200000 count=1
18129 cancel_lru_locks mdc
18130 cat /etc/hosts >> $tmp
18131 lctl set_param -n mdc.*.stats=clear
18133 echo "Append to the same page"
18134 cat /etc/hosts >> $dom
18135 local num=$(get_mdc_stats $mdtidx ost_read)
18136 local ra=$(get_mdc_stats $mdtidx req_active)
18137 local rw=$(get_mdc_stats $mdtidx req_waittime)
18139 [ -z $num ] || error "$num READ RPC occured"
18140 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18144 cmp $tmp $dom || error "file miscompare"
18146 cancel_lru_locks mdc
18147 lctl set_param -n mdc.*.stats=clear
18149 echo "Open and read file"
18150 cat $dom > /dev/null
18151 local num=$(get_mdc_stats $mdtidx ost_read)
18152 local ra=$(get_mdc_stats $mdtidx req_active)
18153 local rw=$(get_mdc_stats $mdtidx req_waittime)
18155 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
18156 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18160 cmp $tmp $dom || error "file miscompare"
18164 run_test 271f "DoM: read on open (200K file and read tail)"
18167 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
18168 skip "Skipping due to old client or server version"
18170 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
18172 $CHECKSTAT -t file $DIR1/$tfile
18174 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
18177 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
18178 $LCTL set_param fail_loc=0x80000314
18179 rm $DIR1/$tfile || error "Unlink fails"
18181 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
18182 [ $RC -eq 0 ] || error "Failed write to stale object"
18184 run_test 271g "Discard DoM data vs client flush race"
18187 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18188 skip "Need MDS version at least 2.11.50"
18190 local dom=$DIR/$tdir/dom
18191 mkdir -p $DIR/$tdir
18193 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
18194 dd if=/dev/urandom of=$dom bs=512K count=1 ||
18195 error "failed to write data into $dom"
18196 local old_md5=$(md5sum $dom)
18198 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
18199 error "failed to migrate to the same DoM component"
18201 [ $($LFS getstripe -c $dom) -eq 2 ] ||
18202 error "layout was not changed silently"
18204 local new_md5=$(md5sum $dom)
18206 [ "$old_md5" != "$new_md5" ] &&
18207 error "md5sum differ: $old_md5, $new_md5"
18210 run_test 272a "DoM migration: new layout with the same DOM component"
18213 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18214 skip "Need MDS version at least 2.11.50"
18216 local dom=$DIR/$tdir/dom
18217 mkdir -p $DIR/$tdir
18218 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18220 local mdtidx=$($LFS getstripe -m $dom)
18221 local mdtname=MDT$(printf %04x $mdtidx)
18222 local facet=mds$((mdtidx + 1))
18224 local mdtfree1=$(do_facet $facet \
18225 lctl get_param -n osd*.*$mdtname.kbytesfree)
18226 dd if=/dev/urandom of=$dom bs=2M count=1 ||
18227 error "failed to write data into $dom"
18228 local old_md5=$(md5sum $dom)
18229 cancel_lru_locks mdc
18230 local mdtfree1=$(do_facet $facet \
18231 lctl get_param -n osd*.*$mdtname.kbytesfree)
18233 $LFS migrate -c2 $dom ||
18234 error "failed to migrate to the new composite layout"
18235 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18236 error "MDT stripe was not removed"
18238 cancel_lru_locks mdc
18239 local new_md5=$(md5sum $dom)
18240 [ "$old_md5" != "$new_md5" ] &&
18241 error "$old_md5 != $new_md5"
18243 # Skip free space checks with ZFS
18244 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18245 local mdtfree2=$(do_facet $facet \
18246 lctl get_param -n osd*.*$mdtname.kbytesfree)
18247 [ $mdtfree2 -gt $mdtfree1 ] ||
18248 error "MDT space is not freed after migration"
18252 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
18255 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18256 skip "Need MDS version at least 2.11.50"
18258 local dom=$DIR/$tdir/$tfile
18259 mkdir -p $DIR/$tdir
18260 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18262 local mdtidx=$($LFS getstripe -m $dom)
18263 local mdtname=MDT$(printf %04x $mdtidx)
18264 local facet=mds$((mdtidx + 1))
18266 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18267 error "failed to write data into $dom"
18268 local old_md5=$(md5sum $dom)
18269 cancel_lru_locks mdc
18270 local mdtfree1=$(do_facet $facet \
18271 lctl get_param -n osd*.*$mdtname.kbytesfree)
18273 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18274 error "failed to migrate to the new composite layout"
18275 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18276 error "MDT stripe was not removed"
18278 cancel_lru_locks mdc
18279 local new_md5=$(md5sum $dom)
18280 [ "$old_md5" != "$new_md5" ] &&
18281 error "$old_md5 != $new_md5"
18283 # Skip free space checks with ZFS
18284 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18285 local mdtfree2=$(do_facet $facet \
18286 lctl get_param -n osd*.*$mdtname.kbytesfree)
18287 [ $mdtfree2 -gt $mdtfree1 ] ||
18288 error "MDS space is not freed after migration"
18292 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18295 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18296 skip "Need MDS version at least 2.11.50"
18298 # Layout swap cannot be done if either file has DOM component,
18299 # this will never be supported, migration should be used instead
18301 local dom=$DIR/$tdir/$tfile
18302 mkdir -p $DIR/$tdir
18304 $LFS setstripe -c2 ${dom}_plain
18305 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18306 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18307 error "can swap layout with DoM component"
18308 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18309 error "can swap layout with DoM component"
18311 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18312 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18313 error "can swap layout with DoM component"
18314 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18315 error "can swap layout with DoM component"
18318 run_test 273a "DoM: layout swapping should fail with DOM"
18321 remote_ost_nodsh && skip "remote OST with nodsh"
18322 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18323 skip "Need OST version >= 2.10.57"
18325 local file=$DIR/$tfile
18328 oss=$(comma_list $(osts_nodes))
18330 dd if=/dev/urandom of=$file bs=1M count=2 ||
18331 error "failed to create a file"
18332 cancel_lru_locks osc
18335 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18336 error "failed to read a file"
18338 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
18339 $LCTL set_param fail_loc=0x8000031f
18341 cancel_lru_locks osc &
18344 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
18345 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
18346 #IO takes another lock, but matches the PENDING one
18347 #and places it to the IO RPC
18348 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18349 error "failed to read a file with PENDING lock"
18351 run_test 275 "Read on a canceled duplicate lock"
18354 remote_ost_nodsh && skip "remote OST with nodsh"
18357 do_facet ost1 "(while true; do \
18358 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
18359 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
18362 for LOOP in $(seq 20); do
18364 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
18367 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
18368 rm $TMP/sanity_276_pid"
18370 run_test 276 "Race between mount and obd_statfs"
18372 cleanup_test_300() {
18376 test_striped_dir() {
18381 mkdir -p $DIR/$tdir
18383 SAVE_UMASK=$(umask)
18384 trap cleanup_test_300 RETURN EXIT
18386 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
18387 $DIR/$tdir/striped_dir ||
18388 error "set striped dir error"
18390 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
18391 [ "$mode" = "755" ] || error "expect 755 got $mode"
18393 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
18394 error "getdirstripe failed"
18395 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
18396 if [ "$stripe_count" != "2" ]; then
18397 error "1:stripe_count is $stripe_count, expect 2"
18399 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
18400 if [ "$stripe_count" != "2" ]; then
18401 error "2:stripe_count is $stripe_count, expect 2"
18404 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
18405 if [ "$stripe_index" != "$mdt_index" ]; then
18406 error "stripe_index is $stripe_index, expect $mdt_index"
18409 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18410 error "nlink error after create striped dir"
18412 mkdir $DIR/$tdir/striped_dir/a
18413 mkdir $DIR/$tdir/striped_dir/b
18415 stat $DIR/$tdir/striped_dir/a ||
18416 error "create dir under striped dir failed"
18417 stat $DIR/$tdir/striped_dir/b ||
18418 error "create dir under striped dir failed"
18420 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
18421 error "nlink error after mkdir"
18423 rmdir $DIR/$tdir/striped_dir/a
18424 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
18425 error "nlink error after rmdir"
18427 rmdir $DIR/$tdir/striped_dir/b
18428 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18429 error "nlink error after rmdir"
18431 chattr +i $DIR/$tdir/striped_dir
18432 createmany -o $DIR/$tdir/striped_dir/f 10 &&
18433 error "immutable flags not working under striped dir!"
18434 chattr -i $DIR/$tdir/striped_dir
18436 rmdir $DIR/$tdir/striped_dir ||
18437 error "rmdir striped dir error"
18445 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18446 skip "skipped for lustre < 2.7.0"
18447 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18448 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18450 test_striped_dir 0 || error "failed on striped dir on MDT0"
18451 test_striped_dir 1 || error "failed on striped dir on MDT0"
18453 run_test 300a "basic striped dir sanity test"
18456 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18457 skip "skipped for lustre < 2.7.0"
18458 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18459 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18466 test_mkdir $DIR/$tdir || error "mkdir fail"
18467 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18468 error "set striped dir error"
18469 for i in {0..9}; do
18470 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
18472 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
18473 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
18474 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
18476 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
18477 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
18478 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
18482 run_test 300b "check ctime/mtime for striped dir"
18485 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18486 skip "skipped for lustre < 2.7.0"
18487 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18488 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18492 mkdir -p $DIR/$tdir
18493 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
18494 error "set striped dir error"
18496 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
18497 error "chown striped dir failed"
18499 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
18500 error "create 5k files failed"
18502 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
18504 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
18508 run_test 300c "chown && check ls under striped directory"
18511 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18512 skip "skipped for lustre < 2.7.0"
18513 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18514 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18519 mkdir -p $DIR/$tdir
18520 $SETSTRIPE -c 2 $DIR/$tdir
18522 #local striped directory
18523 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18524 error "set striped dir error"
18525 createmany -o $DIR/$tdir/striped_dir/f 10 ||
18526 error "create 10 files failed"
18528 #remote striped directory
18529 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
18530 error "set striped dir error"
18531 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
18532 error "create 10 files failed"
18534 for file in $(find $DIR/$tdir); do
18535 stripe_count=$($LFS getstripe -c $file)
18536 [ $stripe_count -eq 2 ] ||
18537 error "wrong stripe $stripe_count for $file"
18542 run_test 300d "check default stripe under striped directory"
18545 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18546 skip "Need MDS version at least 2.7.55"
18547 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18548 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18553 mkdir -p $DIR/$tdir
18555 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18556 error "set striped dir error"
18558 touch $DIR/$tdir/striped_dir/a
18559 touch $DIR/$tdir/striped_dir/b
18560 touch $DIR/$tdir/striped_dir/c
18562 mkdir $DIR/$tdir/striped_dir/dir_a
18563 mkdir $DIR/$tdir/striped_dir/dir_b
18564 mkdir $DIR/$tdir/striped_dir/dir_c
18566 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
18567 error "set striped adir under striped dir error"
18569 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
18570 error "set striped bdir under striped dir error"
18572 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
18573 error "set striped cdir under striped dir error"
18575 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
18576 error "rename dir under striped dir fails"
18578 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
18579 error "rename dir under different stripes fails"
18581 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
18582 error "rename file under striped dir should succeed"
18584 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
18585 error "rename dir under striped dir should succeed"
18589 run_test 300e "check rename under striped directory"
18592 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18593 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18594 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18595 skip "Need MDS version at least 2.7.55"
18601 mkdir -p $DIR/$tdir
18603 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18604 error "set striped dir error"
18606 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
18607 error "set striped dir error"
18609 touch $DIR/$tdir/striped_dir/a
18610 mkdir $DIR/$tdir/striped_dir/dir_a
18611 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
18612 error "create striped dir under striped dir fails"
18614 touch $DIR/$tdir/striped_dir1/b
18615 mkdir $DIR/$tdir/striped_dir1/dir_b
18616 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
18617 error "create striped dir under striped dir fails"
18619 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
18620 error "rename dir under different striped dir should fail"
18622 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
18623 error "rename striped dir under diff striped dir should fail"
18625 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
18626 error "rename file under diff striped dirs fails"
18630 run_test 300f "check rename cross striped directory"
18632 test_300_check_default_striped_dir()
18635 local default_count=$2
18636 local default_index=$3
18639 local dir_stripe_index
18642 echo "checking $dirname $default_count $default_index"
18643 $LFS setdirstripe -D -c $default_count -i $default_index \
18644 -t all_char $DIR/$tdir/$dirname ||
18645 error "set default stripe on striped dir error"
18646 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
18647 [ $stripe_count -eq $default_count ] ||
18648 error "expect $default_count get $stripe_count for $dirname"
18650 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
18651 [ $stripe_index -eq $default_index ] ||
18652 error "expect $default_index get $stripe_index for $dirname"
18654 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
18655 error "create dirs failed"
18657 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
18658 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
18659 for dir in $(find $DIR/$tdir/$dirname/*); do
18660 stripe_count=$($LFS getdirstripe -c $dir)
18661 [ $stripe_count -eq $default_count ] ||
18662 [ $stripe_count -eq 0 -o $default_count -eq 1 ] ||
18663 error "stripe count $default_count != $stripe_count for $dir"
18665 stripe_index=$($LFS getdirstripe -i $dir)
18666 [ $default_index -eq -1 -o $stripe_index -eq $default_index ] ||
18667 error "$stripe_index != $default_index for $dir"
18669 #check default stripe
18670 stripe_count=$($LFS getdirstripe -D -c $dir)
18671 [ $stripe_count -eq $default_count ] ||
18672 error "default count $default_count != $stripe_count for $dir"
18674 stripe_index=$($LFS getdirstripe -D -i $dir)
18675 [ $stripe_index -eq $default_index ] ||
18676 error "default index $default_index != $stripe_index for $dir"
18678 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
18682 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18683 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18684 skip "Need MDS version at least 2.7.55"
18691 mkdir $DIR/$tdir/normal_dir
18693 #Checking when client cache stripe index
18694 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
18695 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
18696 error "create striped_dir failed"
18698 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
18699 error "create dir0 fails"
18700 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
18701 [ $stripe_index -eq 0 ] ||
18702 error "dir0 expect index 0 got $stripe_index"
18704 mkdir $DIR/$tdir/striped_dir/dir1 ||
18705 error "create dir1 fails"
18706 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
18707 [ $stripe_index -eq 1 ] ||
18708 error "dir1 expect index 1 got $stripe_index"
18710 #check default stripe count/stripe index
18711 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
18712 test_300_check_default_striped_dir normal_dir 1 0
18713 test_300_check_default_striped_dir normal_dir 2 1
18714 test_300_check_default_striped_dir normal_dir 2 -1
18716 #delete default stripe information
18717 echo "delete default stripeEA"
18718 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
18719 error "set default stripe on striped dir error"
18721 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
18722 for dir in $(find $DIR/$tdir/normal_dir/*); do
18723 stripe_count=$($LFS getdirstripe -c $dir)
18724 [ $stripe_count -eq 0 ] ||
18725 error "expect 1 get $stripe_count for $dir"
18726 stripe_index=$($LFS getdirstripe -i $dir)
18727 [ $stripe_index -eq 0 ] ||
18728 error "expect 0 get $stripe_index for $dir"
18731 run_test 300g "check default striped directory for normal directory"
18734 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18735 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18736 skip "Need MDS version at least 2.7.55"
18742 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18743 error "set striped dir error"
18745 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
18746 test_300_check_default_striped_dir striped_dir 1 0
18747 test_300_check_default_striped_dir striped_dir 2 1
18748 test_300_check_default_striped_dir striped_dir 2 -1
18750 #delete default stripe information
18751 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
18752 error "set default stripe on striped dir error"
18754 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
18755 for dir in $(find $DIR/$tdir/striped_dir/*); do
18756 stripe_count=$($LFS getdirstripe -c $dir)
18757 [ $stripe_count -eq 0 ] ||
18758 error "expect 1 get $stripe_count for $dir"
18761 run_test 300h "check default striped directory for striped directory"
18764 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18765 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18766 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18767 skip "Need MDS version at least 2.7.55"
18774 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18775 error "set striped dir error"
18777 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18778 error "create files under striped dir failed"
18780 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
18781 error "set striped hashdir error"
18783 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
18784 error "create dir0 under hash dir failed"
18785 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
18786 error "create dir1 under hash dir failed"
18788 # unfortunately, we need to umount to clear dir layout cache for now
18789 # once we fully implement dir layout, we can drop this
18790 umount_client $MOUNT || error "umount failed"
18791 mount_client $MOUNT || error "mount failed"
18793 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
18794 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
18795 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
18797 #set the stripe to be unknown hash type
18798 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
18799 $LCTL set_param fail_loc=0x1901
18800 for ((i = 0; i < 10; i++)); do
18801 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
18802 error "stat f-$i failed"
18803 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
18806 touch $DIR/$tdir/striped_dir/f0 &&
18807 error "create under striped dir with unknown hash should fail"
18809 $LCTL set_param fail_loc=0
18811 umount_client $MOUNT || error "umount failed"
18812 mount_client $MOUNT || error "mount failed"
18816 run_test 300i "client handle unknown hash type striped directory"
18819 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18820 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18821 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18822 skip "Need MDS version at least 2.7.55"
18829 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
18830 $LCTL set_param fail_loc=0x1702
18831 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18832 error "set striped dir error"
18834 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18835 error "create files under striped dir failed"
18837 $LCTL set_param fail_loc=0
18839 rm -rf $DIR/$tdir || error "unlink striped dir fails"
18843 run_test 300j "test large update record"
18846 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18847 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18848 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18849 skip "Need MDS version at least 2.7.55"
18856 #define OBD_FAIL_LARGE_STRIPE 0x1703
18857 $LCTL set_param fail_loc=0x1703
18858 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
18859 error "set striped dir error"
18860 $LCTL set_param fail_loc=0
18862 $LFS getdirstripe $DIR/$tdir/striped_dir ||
18863 error "getstripeddir fails"
18864 rm -rf $DIR/$tdir/striped_dir ||
18865 error "unlink striped dir fails"
18869 run_test 300k "test large striped directory"
18872 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18873 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18874 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18875 skip "Need MDS version at least 2.7.55"
18879 test_mkdir -p $DIR/$tdir/striped_dir
18880 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
18881 error "chown $RUNAS_ID failed"
18882 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
18883 error "set default striped dir failed"
18885 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
18886 $LCTL set_param fail_loc=0x80000158
18887 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
18889 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
18890 [ $stripe_index -eq 1 ] ||
18891 error "expect 1 get $stripe_index for $dir"
18893 run_test 300l "non-root user to create dir under striped dir with stale layout"
18896 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18897 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
18898 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18899 skip "Need MDS version at least 2.7.55"
18901 mkdir -p $DIR/$tdir/striped_dir
18902 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
18903 error "set default stripes dir error"
18905 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
18907 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
18908 [ $stripe_count -eq 0 ] ||
18909 error "expect 0 get $stripe_count for a"
18911 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
18912 error "set default stripes dir error"
18914 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
18916 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
18917 [ $stripe_count -eq 0 ] ||
18918 error "expect 0 get $stripe_count for b"
18920 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
18921 error "set default stripes dir error"
18923 mkdir $DIR/$tdir/striped_dir/c &&
18924 error "default stripe_index is invalid, mkdir c should fails"
18926 rm -rf $DIR/$tdir || error "rmdir fails"
18928 run_test 300m "setstriped directory on single MDT FS"
18931 local list=$(comma_list $(mdts_nodes))
18934 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
18938 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18939 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18940 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18941 skip "Need MDS version at least 2.7.55"
18942 remote_mds_nodsh && skip "remote MDS with nodsh"
18945 local list=$(comma_list $(mdts_nodes))
18947 trap cleanup_300n RETURN EXIT
18948 mkdir -p $DIR/$tdir
18949 chmod 777 $DIR/$tdir
18950 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
18951 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
18952 error "create striped dir succeeds with gid=0"
18954 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
18955 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
18956 error "create striped dir fails with gid=-1"
18958 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
18959 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
18960 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
18961 error "set default striped dir succeeds with gid=0"
18964 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
18965 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
18966 error "set default striped dir fails with gid=-1"
18969 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
18970 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
18971 error "create test_dir fails"
18972 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
18973 error "create test_dir1 fails"
18974 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
18975 error "create test_dir2 fails"
18978 run_test 300n "non-root user to create dir under striped dir with default EA"
18981 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18982 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18983 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18984 skip "Need MDS version at least 2.7.55"
18989 mkdir -p $DIR/$tdir
18991 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
18992 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
18993 if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then
18994 skip "not enough free inodes $numfree1 $numfree2"
18997 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
18998 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
18999 if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then
19000 skip "not enough free space $numfree1 $numfree2"
19003 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
19004 error "setdirstripe fails"
19006 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
19007 error "create dirs fails"
19009 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
19010 ls $DIR/$tdir/striped_dir > /dev/null ||
19011 error "ls striped dir fails"
19012 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
19013 error "unlink big striped dir fails"
19015 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
19018 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19019 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19020 remote_mds_nodsh && skip "remote MDS with nodsh"
19022 mkdir -p $DIR/$tdir
19024 #define OBD_FAIL_OUT_ENOSPC 0x1704
19025 do_facet mds2 lctl set_param fail_loc=0x80001704
19026 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
19027 && error "create striped directory should fail"
19029 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
19031 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
19034 run_test 300p "create striped directory without space"
19037 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19038 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19040 local fd=$(free_fd)
19041 local cmd="exec $fd<$tdir"
19043 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
19046 trap "eval $cmd" EXIT
19047 cd $tdir || error "cd $tdir fails"
19048 rmdir ../$tdir || error "rmdir $tdir fails"
19049 mkdir local_dir && error "create dir succeeds"
19050 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
19054 run_test 300q "create remote directory under orphan directory"
19057 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
19058 skip "Need MDS version at least 2.7.55" && return
19059 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19063 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
19064 error "set striped dir error"
19066 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19067 error "getstripeddir fails"
19070 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
19071 awk '/lmv_stripe_count:/ { print $2 }')
19073 [ $MDSCOUNT -ne $stripe_count ] &&
19074 error "wrong stripe count $stripe_count expected $MDSCOUNT"
19076 rm -rf $DIR/$tdir/striped_dir ||
19077 error "unlink striped dir fails"
19079 run_test 300r "test -1 striped directory"
19081 prepare_remote_file() {
19082 mkdir $DIR/$tdir/src_dir ||
19083 error "create remote source failed"
19085 cp /etc/hosts $DIR/$tdir/src_dir/a ||
19086 error "cp to remote source failed"
19087 touch $DIR/$tdir/src_dir/a
19089 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
19090 error "create remote target dir failed"
19092 touch $DIR/$tdir/tgt_dir/b
19094 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
19095 error "rename dir cross MDT failed!"
19097 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
19098 error "src_child still exists after rename"
19100 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
19101 error "missing file(a) after rename"
19103 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
19104 error "diff after rename"
19108 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19109 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19111 local remote_file=$DIR/$tdir/tgt_dir/b
19113 mkdir -p $DIR/$tdir
19115 prepare_remote_file || error "prepare remote file failed"
19118 $OPENUNLINK $remote_file $remote_file ||
19119 error "openunlink $remote_file failed"
19120 $CHECKSTAT -a $remote_file || error "$remote_file exists"
19122 run_test 310a "open unlink remote file"
19125 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19126 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19128 local remote_file=$DIR/$tdir/tgt_dir/b
19130 mkdir -p $DIR/$tdir
19132 prepare_remote_file || error "prepare remote file failed"
19134 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19135 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
19136 $CHECKSTAT -t file $remote_file || error "check file failed"
19138 run_test 310b "unlink remote file with multiple links while open"
19141 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19142 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
19144 local remote_file=$DIR/$tdir/tgt_dir/b
19146 mkdir -p $DIR/$tdir
19148 prepare_remote_file || error "prepare remote file failed"
19150 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19151 multiop_bg_pause $remote_file O_uc ||
19152 error "mulitop failed for remote file"
19154 $MULTIOP $DIR/$tfile Ouc
19155 kill -USR1 $MULTIPID
19158 run_test 310c "open-unlink remote file with multiple links"
19162 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19163 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19164 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
19165 skip "lustre < 2.8.54 does not contain LU-4825 fix"
19166 remote_mds_nodsh && skip "remote MDS with nodsh"
19168 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19169 local mdts=$(comma_list $(mdts_nodes))
19171 mkdir -p $DIR/$tdir
19172 $SETSTRIPE -i 0 -c 1 $DIR/$tdir
19173 createmany -o $DIR/$tdir/$tfile. 1000
19175 # statfs data is not real time, let's just calculate it
19176 old_iused=$((old_iused + 1000))
19178 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19179 osp.*OST0000*MDT0000.create_count")
19180 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19181 osp.*OST0000*MDT0000.max_create_count")
19182 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
19184 $SETSTRIPE -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
19185 local index=$($GETSTRIPE -i $DIR/$tdir/$tfile)
19186 [ $index -ne 0 ] || error "$tfile stripe index is 0"
19188 unlinkmany $DIR/$tdir/$tfile. 1000
19190 do_nodes $mdts "$LCTL set_param -n \
19191 osp.*OST0000*.max_create_count=$max_count"
19192 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
19193 do_nodes $mdts "$LCTL set_param -n \
19194 osp.*OST0000*.create_count=$count"
19195 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
19196 grep "=0" && error "create_count is zero"
19199 for i in $(seq 120); do
19200 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19201 # system may be too busy to destroy all objs in time, use
19202 # a somewhat small value to not fail autotest
19203 [ $((old_iused - new_iused)) -gt 400 ] && break
19207 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
19208 [ $((old_iused - new_iused)) -gt 400 ] ||
19209 error "objs not destroyed after unlink"
19211 run_test 311 "disable OSP precreate, and unlink should destroy objs"
19218 local vdevdir=$(dirname $(facet_vdevice $ost))
19219 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
19220 local zfs_zapid=$(do_facet $ost $cmd |
19221 grep -w "/O/0/d$((objid%32))" -C 5 |
19222 awk '/Object/{getline; print $1}')
19223 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
19224 awk "/$objid = /"'{printf $3}')
19229 zfs_object_blksz() {
19233 local vdevdir=$(dirname $(facet_vdevice $ost))
19234 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
19235 local blksz=$(do_facet $ost $cmd $objid |
19236 awk '/dblk/{getline; printf $4}')
19238 case "${blksz: -1}" in
19239 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
19240 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
19247 test_312() { # LU-4856
19248 remote_ost_nodsh && skip "remote OST with nodsh"
19249 [ "$ost1_FSTYPE" = "zfs" ] ||
19250 skip_env "the test only applies to zfs"
19252 local max_blksz=$(do_facet ost1 \
19253 $ZFS get -p recordsize $(facet_device ost1) |
19254 awk '!/VALUE/{print $3}')
19256 # to make life a little bit easier
19257 $LFS mkdir -c 1 -i 0 $DIR/$tdir
19258 $LFS setstripe -c 1 -i 0 $DIR/$tdir
19260 local tf=$DIR/$tdir/$tfile
19262 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19264 # Get ZFS object id
19265 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19266 # block size change by sequential overwrite
19269 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
19270 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
19272 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
19273 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19277 # block size change by sequential append write
19278 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19279 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19280 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19283 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19284 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19285 oflag=sync conv=notrunc
19287 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19288 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19289 error "blksz error, actual $blksz, " \
19290 "expected: 2 * $count * $PAGE_SIZE"
19296 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19297 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19299 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
19300 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19301 [ $blksz -eq $PAGE_SIZE ] ||
19302 error "blksz error: $blksz, expected: $PAGE_SIZE"
19304 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
19305 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19306 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
19308 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
19309 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19310 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
19312 run_test 312 "make sure ZFS adjusts its block size by write pattern"
19315 remote_ost_nodsh && skip "remote OST with nodsh"
19317 local file=$DIR/$tfile
19320 $SETSTRIPE -c 1 -i 0 $file || error "setstripe failed"
19322 # define OBD_FAIL_TGT_RCVD_EIO 0x720
19323 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19324 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
19325 error "write should failed"
19326 do_facet ost1 "$LCTL set_param fail_loc=0"
19329 run_test 313 "io should fail after last_rcvd update fail"
19332 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19334 $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
19335 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19337 wait_delete_completed
19338 do_facet ost1 "$LCTL set_param fail_loc=0"
19340 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
19342 test_315() { # LU-618
19343 local file=$DIR/$tfile
19346 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
19347 error "multiop file write failed"
19348 $MULTIOP $file oO_RDONLY:r4063232_c &
19353 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
19356 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
19359 run_test 315 "read should be accounted"
19362 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19363 large_xattr_enabled || skip_env "ea_inode feature disabled"
19365 rm -rf $DIR/$tdir/d
19366 mkdir -p $DIR/$tdir/d
19367 chown nobody $DIR/$tdir/d
19368 touch $DIR/$tdir/d/file
19370 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
19372 run_test 316 "lfs mv"
19375 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
19376 skip "Need MDS version at least 2.11.53"
19377 if [ "$ost1_FSTYPE" == "zfs" ]; then
19378 skip "LU-10370: no implementation for ZFS"
19382 local grant_blk_size
19384 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
19385 awk '/grant_block_size:/ { print $2; exit; }')
19387 # Create File of size 5M. Truncate it to below size's and verify
19390 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
19391 error "Create file $DIR/$tfile failed"
19392 stack_trap "rm -f $DIR/$tfile" EXIT
19394 for trunc_sz in 2097152 4097 4000 509 0; do
19395 $TRUNCATE $DIR/$tfile $trunc_sz ||
19396 error "truncate $tfile to $trunc_sz failed"
19397 local sz=$(stat --format=%s $DIR/$tfile)
19398 local blk=$(stat --format=%b $DIR/$tfile)
19399 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
19400 grant_blk_size) * 8))
19402 if [[ $blk -ne $trunc_blk ]]; then
19403 $(which stat) $DIR/$tfile
19404 error "Expected Block $trunc_blk got $blk for $tfile"
19407 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19408 error "Expected Size $trunc_sz got $sz for $tfile"
19413 # Create file with a hole and write actual two blocks. Block count
19416 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
19417 conv=fsync || error "Create file : $DIR/$tfile"
19419 # Calculate the final truncate size.
19420 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
19423 # truncate to size $trunc_sz bytes. Strip the last block
19424 # The block count must drop to 8
19426 $TRUNCATE $DIR/$tfile $trunc_sz ||
19427 error "truncate $tfile to $trunc_sz failed"
19429 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
19430 sz=$(stat --format=%s $DIR/$tfile)
19431 blk=$(stat --format=%b $DIR/$tfile)
19433 if [[ $blk -ne $trunc_bsz ]]; then
19434 $(which stat) $DIR/$tfile
19435 error "Expected Block $trunc_bsz got $blk for $tfile"
19438 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19439 error "Expected Size $trunc_sz got $sz for $tfile"
19441 run_test 317 "Verify blocks get correctly update after truncate"
19444 local read_write=$1
19445 if [ "$read_write" = "write" ]; then
19446 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
19447 elif [ "$read_write" = "read" ]; then
19448 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
19450 error "argument error"
19453 # turn off debug for performance testing
19454 local saved_debug=$($LCTL get_param -n debug)
19455 $LCTL set_param debug=0
19457 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
19459 # get ost1 size - lustre-OST0000
19460 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
19461 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
19462 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
19464 if [ "$read_write" = "read" ]; then
19465 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
19468 local start_time=$(date +%s.%N)
19469 $dd_cmd bs=1M count=$blocks oflag=sync ||
19470 error "real dd $read_write error"
19471 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
19473 if [ "$read_write" = "write" ]; then
19477 # define OBD_FAIL_OST_FAKE_RW 0x238
19478 do_facet ost1 $LCTL set_param fail_loc=0x238
19480 local start_time=$(date +%s.%N)
19481 $dd_cmd bs=1M count=$blocks oflag=sync ||
19482 error "fake dd $read_write error"
19483 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
19485 if [ "$read_write" = "write" ]; then
19487 cancel_lru_locks osc
19488 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
19489 error "$tfile size not $blocks MB"
19491 do_facet ost1 $LCTL set_param fail_loc=0
19493 echo "fake $read_write $duration_fake vs. normal $read_write" \
19494 "$duration in seconds"
19495 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
19496 error_not_in_vm "fake write is slower"
19498 $LCTL set_param -n debug="$saved_debug"
19501 test_399a() { # LU-7655 for OST fake write
19502 remote_ost_nodsh && skip "remote OST with nodsh"
19506 run_test 399a "fake write should not be slower than normal write"
19508 test_399b() { # LU-8726 for OST fake read
19509 remote_ost_nodsh && skip "remote OST with nodsh"
19510 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
19511 skip_env "ldiskfs only test"
19516 run_test 399b "fake read should not be slower than normal read"
19518 test_400a() { # LU-1606, was conf-sanity test_74
19519 if ! which $CC > /dev/null 2>&1; then
19520 skip_env "$CC is not installed"
19523 local extra_flags=''
19524 local out=$TMP/$tfile
19525 local prefix=/usr/include/lustre
19528 if ! [[ -d $prefix ]]; then
19529 # Assume we're running in tree and fixup the include path.
19530 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
19531 extra_flags+=" -L$LUSTRE/utils/.lib"
19534 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
19535 $CC -Wall -Werror $extra_flags -o $out $prog -llustreapi ||
19536 error "client api broken"
19540 run_test 400a "Lustre client api program can compile and link"
19542 test_400b() { # LU-1606, LU-5011
19544 local out=$TMP/$tfile
19545 local prefix=/usr/include/linux/lustre
19547 # We use a hard coded prefix so that this test will not fail
19548 # when run in tree. There are headers in lustre/include/lustre/
19549 # that are not packaged (like lustre_idl.h) and have more
19550 # complicated include dependencies (like config.h and lnet/types.h).
19551 # Since this test about correct packaging we just skip them when
19552 # they don't exist (see below) rather than try to fixup cppflags.
19554 if ! which $CC > /dev/null 2>&1; then
19555 skip_env "$CC is not installed"
19558 for header in $prefix/*.h; do
19559 if ! [[ -f "$header" ]]; then
19563 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
19564 continue # lustre_ioctl.h is internal header
19567 $CC -Wall -Werror -include $header -c -x c /dev/null -o $out ||
19568 error "cannot compile '$header'"
19572 run_test 400b "packaged headers can be compiled"
19574 test_401a() { #LU-7437
19575 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
19576 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
19578 #count the number of parameters by "list_param -R"
19579 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
19580 #count the number of parameters by listing proc files
19581 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
19582 echo "proc_dirs='$proc_dirs'"
19583 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
19584 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
19587 [ $params -eq $procs ] ||
19588 error "found $params parameters vs. $procs proc files"
19590 # test the list_param -D option only returns directories
19591 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
19592 #count the number of parameters by listing proc directories
19593 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
19596 [ $params -eq $procs ] ||
19597 error "found $params parameters vs. $procs proc files"
19599 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
19602 local save=$($LCTL get_param -n jobid_var)
19605 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
19606 error "no error returned when setting bad parameters"
19608 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
19609 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
19611 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
19612 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
19613 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
19615 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
19618 local jobid_var_old=$($LCTL get_param -n jobid_var)
19619 local jobid_var_new
19621 $LCTL set_param jobid_var= &&
19622 error "no error returned for 'set_param a='"
19624 jobid_var_new=$($LCTL get_param -n jobid_var)
19625 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19626 error "jobid_var was changed by setting without value"
19628 $LCTL set_param jobid_var &&
19629 error "no error returned for 'set_param a'"
19631 jobid_var_new=$($LCTL get_param -n jobid_var)
19632 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19633 error "jobid_var was changed by setting without value"
19635 run_test 401c "Verify 'lctl set_param' without value fails in either format."
19638 local jobid_var_old=$($LCTL get_param -n jobid_var)
19639 local jobid_var_new
19640 local new_value="foo=bar"
19642 $LCTL set_param jobid_var=$new_value ||
19643 error "'set_param a=b' did not accept a value containing '='"
19645 jobid_var_new=$($LCTL get_param -n jobid_var)
19646 [[ "$jobid_var_new" == "$new_value" ]] ||
19647 error "'set_param a=b' failed on a value containing '='"
19649 # Reset the jobid_var to test the other format
19650 $LCTL set_param jobid_var=$jobid_var_old
19651 jobid_var_new=$($LCTL get_param -n jobid_var)
19652 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19653 error "failed to reset jobid_var"
19655 $LCTL set_param jobid_var $new_value ||
19656 error "'set_param a b' did not accept a value containing '='"
19658 jobid_var_new=$($LCTL get_param -n jobid_var)
19659 [[ "$jobid_var_new" == "$new_value" ]] ||
19660 error "'set_param a b' failed on a value containing '='"
19662 $LCTL set_param jobid_var $jobid_var_old
19663 jobid_var_new=$($LCTL get_param -n jobid_var)
19664 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19665 error "failed to reset jobid_var"
19667 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
19670 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
19671 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
19672 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
19673 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
19674 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
19675 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
19676 remote_mds_nodsh && skip "remote MDS with nodsh"
19678 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
19679 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
19680 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
19681 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
19682 echo "Touch failed - OK"
19684 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
19687 local file1=$DIR/$tfile.1
19688 local file2=$DIR/$tfile.2
19689 local tfile=$TMP/$tfile
19691 rm -f $file1 $file2 $tfile
19696 # 30 sec OBD_TIMEOUT in ll_getattr()
19697 # right before populating st_nlink
19698 $LCTL set_param fail_loc=0x80001409
19699 stat -c %h $file1 > $tfile &
19701 # create an alias, drop all locks and reclaim the dentry
19703 cancel_lru_locks mdc
19704 cancel_lru_locks osc
19705 sysctl -w vm.drop_caches=2
19709 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
19711 rm -f $tfile $file1 $file2
19713 run_test 403 "i_nlink should not drop to zero due to aliasing"
19715 test_404() { # LU-6601
19716 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
19717 skip "Need server version newer than 2.8.52"
19718 remote_mds_nodsh && skip "remote MDS with nodsh"
19720 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
19721 awk '/osp .*-osc-MDT/ { print $4}')
19724 for osp in $mosps; do
19725 echo "Deactivate: " $osp
19726 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
19727 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19728 awk -vp=$osp '$4 == p { print $2 }')
19729 [ $stat = IN ] || {
19730 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19731 error "deactivate error"
19733 echo "Activate: " $osp
19734 do_facet $SINGLEMDS $LCTL --device %$osp activate
19735 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19736 awk -vp=$osp '$4 == p { print $2 }')
19737 [ $stat = UP ] || {
19738 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19739 error "activate error"
19743 run_test 404 "validate manual {de}activated works properly for OSPs"
19746 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] ||
19747 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
19748 skip "Layout swap lock is not supported"
19750 check_swap_layouts_support
19752 test_mkdir $DIR/$tdir
19753 swap_lock_test -d $DIR/$tdir ||
19754 error "One layout swap locked test failed"
19756 run_test 405 "Various layout swap lock tests"
19759 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19760 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
19761 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
19762 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19763 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
19764 skip "Need MDS version at least 2.8.50"
19766 local def_stripe_size=$($LFS getstripe -S $MOUNT)
19767 local test_pool=$TESTNAME
19769 pool_add $test_pool || error "pool_add failed"
19770 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
19771 error "pool_add_targets failed"
19773 save_layout_restore_at_exit $MOUNT
19775 # parent set default stripe count only, child will stripe from both
19776 # parent and fs default
19777 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
19778 error "setstripe $MOUNT failed"
19779 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
19780 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
19781 for i in $(seq 10); do
19782 local f=$DIR/$tdir/$tfile.$i
19783 touch $f || error "touch failed"
19784 local count=$($LFS getstripe -c $f)
19785 [ $count -eq $OSTCOUNT ] ||
19786 error "$f stripe count $count != $OSTCOUNT"
19787 local offset=$($LFS getstripe -i $f)
19788 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
19789 local size=$($LFS getstripe -S $f)
19790 [ $size -eq $((def_stripe_size * 2)) ] ||
19791 error "$f stripe size $size != $((def_stripe_size * 2))"
19792 local pool=$($LFS getstripe -p $f)
19793 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
19796 # change fs default striping, delete parent default striping, now child
19797 # will stripe from new fs default striping only
19798 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
19799 error "change $MOUNT default stripe failed"
19800 $LFS setstripe -c 0 $DIR/$tdir ||
19801 error "delete $tdir default stripe failed"
19802 for i in $(seq 11 20); do
19803 local f=$DIR/$tdir/$tfile.$i
19804 touch $f || error "touch $f failed"
19805 local count=$($LFS getstripe -c $f)
19806 [ $count -eq 1 ] || error "$f stripe count $count != 1"
19807 local offset=$($LFS getstripe -i $f)
19808 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
19809 local size=$($LFS getstripe -S $f)
19810 [ $size -eq $def_stripe_size ] ||
19811 error "$f stripe size $size != $def_stripe_size"
19812 local pool=$($LFS getstripe -p $f)
19813 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
19816 unlinkmany $DIR/$tdir/$tfile. 1 20
19818 local f=$DIR/$tdir/$tfile
19819 pool_remove_all_targets $test_pool $f
19820 pool_remove $test_pool $f
19822 run_test 406 "DNE support fs default striping"
19825 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19826 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
19827 skip "Need MDS version at least 2.8.55"
19828 remote_mds_nodsh && skip "remote MDS with nodsh"
19830 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
19831 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
19832 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
19833 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
19834 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
19836 #define OBD_FAIL_DT_TXN_STOP 0x2019
19837 for idx in $(seq $MDSCOUNT); do
19838 do_facet mds$idx "lctl set_param fail_loc=0x2019"
19840 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
19841 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
19842 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
19845 run_test 407 "transaction fail should cause operation fail"
19848 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
19850 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
19851 lctl set_param fail_loc=0x8000040a
19852 # let ll_prepare_partial_page() fail
19853 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
19857 # create at least 100 unused inodes so that
19858 # shrink_icache_memory(0) should not return 0
19859 touch $DIR/$tfile-{0..100}
19860 rm -f $DIR/$tfile-{0..100}
19863 echo 2 > /proc/sys/vm/drop_caches
19865 run_test 408 "drop_caches should not hang due to page leaks"
19869 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19870 check_mount_and_prep
19872 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
19873 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
19874 touch $DIR/$tdir/guard || error "(2) Fail to create"
19876 local PREFIX=$(str_repeat 'A' 128)
19877 echo "Create 1K hard links start at $(date)"
19878 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
19879 error "(3) Fail to hard link"
19881 echo "Links count should be right although linkEA overflow"
19882 stat $DIR/$tdir/guard || error "(4) Fail to stat"
19883 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
19884 [ $linkcount -eq 1001 ] ||
19885 error "(5) Unexpected hard links count: $linkcount"
19887 echo "List all links start at $(date)"
19888 ls -l $DIR/$tdir/foo > /dev/null ||
19889 error "(6) Fail to list $DIR/$tdir/foo"
19891 echo "Unlink hard links start at $(date)"
19892 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
19893 error "(7) Fail to unlink"
19895 run_test 409 "Large amount of cross-MDTs hard links on the same file"
19899 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
19900 skip "Need client version at least 2.9.59"
19902 # Create a file, and stat it from the kernel
19903 local testfile=$DIR/$tfile
19906 local run_id=$RANDOM
19907 local my_ino=$(stat --format "%i" $testfile)
19909 # Try to insert the module. This will always fail as the
19910 # module is designed to not be inserted.
19911 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
19914 # Anything but success is a test failure
19916 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
19917 error "no inode match"
19919 run_test 410 "Test inode number returned from kernel thread"
19921 cleanup_test411_cgroup() {
19927 local cg_basedir=/sys/fs/cgroup/memory
19929 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
19930 skip "no setup for cgroup"
19932 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
19933 error "test file creation failed"
19934 cancel_lru_locks osc
19936 # Create a very small memory cgroup to force a slab allocation error
19937 local cgdir=$cg_basedir/osc_slab_alloc
19938 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
19939 trap "cleanup_test411_cgroup $cgdir" EXIT
19940 echo 2M > $cgdir/memory.kmem.limit_in_bytes
19941 echo 1M > $cgdir/memory.limit_in_bytes
19943 # Should not LBUG, just be killed by oom-killer
19944 # dd will return 0 even allocation failure in some environment.
19945 # So don't check return value
19946 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
19947 cleanup_test411_cgroup $cgdir
19951 run_test 411 "Slab allocation error with cgroup does not LBUG"
19954 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19955 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
19956 skip "Need server version at least 2.10.55"
19959 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
19960 error "mkdir failed"
19961 $LFS getdirstripe $DIR/$tdir
19962 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
19963 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
19964 error "expect $((MDSCOUT - 1)) get $stripe_index"
19965 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
19966 [ $stripe_count -eq 2 ] ||
19967 error "expect 2 get $stripe_count"
19969 run_test 412 "mkdir on specific MDTs"
19972 [ $MDSCOUNT -lt 2 ] &&
19973 skip "We need at least 2 MDTs for this test"
19975 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
19976 skip "Need server version at least 2.10.55"
19979 mkdir $DIR/$tdir || error "mkdir failed"
19981 # find MDT that is the most full
19982 local max=$($LFS df | grep MDT |
19991 END { split(b, c, ":")
19996 for i in $(seq $((MDSCOUNT - 1))); do
19997 $LFS mkdir -c $i $DIR/$tdir/d$i ||
19998 error "mkdir d$i failed"
19999 $LFS getdirstripe $DIR/$tdir/d$i
20000 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
20001 [ $stripe_index -ne $max ] ||
20002 error "don't expect $max"
20005 run_test 413 "mkdir on less full MDTs"
20008 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
20009 $LCTL set_param fail_loc=0x80000521
20010 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
20013 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
20016 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20017 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
20018 skip "Need server version at least 2.11.52"
20028 # this test may be slow on ZFS
20029 [ "$mds1_FSTYPE" == "zfs" ] && total=100
20031 # though this test is designed for striped directory, let's test normal
20032 # directory too since lock is always saved as CoS lock.
20033 test_mkdir $DIR/$tdir || error "mkdir $tdir"
20034 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
20043 start_time=$(date +%s)
20044 for i in $(seq $total); do
20045 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
20048 end_time=$(date +%s)
20049 duration=$((end_time - start_time))
20051 kill -9 $setattr_pid
20053 echo "rename $total files took $duration sec"
20054 [ $duration -lt 100 ] || error "rename took $duration sec"
20056 run_test 415 "lock revoke is not missing"
20059 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
20060 skip "Need server version at least 2.11.55"
20062 # define OBD_FAIL_OSD_TXN_START 0x19a
20063 do_facet mds1 lctl set_param fail_loc=0x19a
20065 lfs mkdir -c $MDSCOUNT $DIR/$tdir
20069 run_test 416 "transaction start failure won't cause system hung"
20073 do_nodes $(comma_list $(mdts_nodes)) \
20074 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
20075 do_nodes $(comma_list $(mdts_nodes)) \
20076 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
20077 do_nodes $(comma_list $(mdts_nodes)) \
20078 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
20082 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20083 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
20084 skip "Need MDS version at least 2.11.56"
20086 trap cleanup_417 RETURN EXIT
20088 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
20089 do_nodes $(comma_list $(mdts_nodes)) \
20090 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
20091 $LFS migrate -m 0 $DIR/$tdir.1 &&
20092 error "migrate dir $tdir.1 should fail"
20094 do_nodes $(comma_list $(mdts_nodes)) \
20095 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
20096 $LFS mkdir -i 1 $DIR/$tdir.2 &&
20097 error "create remote dir $tdir.2 should fail"
20099 do_nodes $(comma_list $(mdts_nodes)) \
20100 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
20101 $LFS mkdir -c 2 $DIR/$tdir.3 &&
20102 error "create striped dir $tdir.3 should fail"
20105 run_test 417 "disable remote dir, striped dir and dir migration"
20107 # Checks that the outputs of df [-i] and lfs df [-i] match
20109 # usage: check_lfs_df <blocks | inodes> <mountpoint>
20119 [ "$1" == "blocks" ] && inodes= || inodes="-i"
20121 for count in {1..100}; do
20125 # read the lines of interest
20126 df_out=($(df -P $inodes $dir | tail -n +2)) ||
20127 error "df $inodes $dir | tail -n +2 failed"
20128 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
20129 error "lfs df $inodes $dir | grep summary: failed"
20131 # skip first substrings of each output as they are different
20132 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
20133 # compare the remaining fields of the two outputs
20135 for i in {1..5}; do
20136 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
20144 lfs df $inodes $dir
20145 error "df and lfs df $1 output mismatch: " \
20146 "df ${inodes}: ${df_out[*]}, " \
20147 "lfs df ${inodes}: ${lfs_df_out[*]}"
20152 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20154 local dir=$DIR/$tdir
20155 local numfiles=$((RANDOM % 4096 + 2))
20156 local numblocks=$((RANDOM % 256 + 1))
20158 wait_delete_completed
20161 # check block output
20162 check_lfs_df blocks $dir
20163 # check inode output
20164 check_lfs_df inodes $dir
20166 # create a single file and retest
20167 echo "Creating a single file and testing"
20168 createmany -o $dir/$tfile- 1 &>/dev/null ||
20169 error "creating 1 file in $dir failed"
20170 check_lfs_df blocks $dir
20171 check_lfs_df inodes $dir
20173 # create a random number of files
20174 echo "Creating $((numfiles - 1)) files and testing"
20175 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
20176 error "creating $((numfiles - 1)) files in $dir failed"
20178 # write a random number of blocks to the first test file
20179 echo "Writing $numblocks 4K blocks and testing"
20180 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
20181 count=$numblocks &>/dev/null ||
20182 error "dd to $dir/${tfile}-0 failed"
20185 check_lfs_df blocks $dir
20186 check_lfs_df inodes $dir
20188 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
20189 error "unlinking $numfiles files in $dir failed"
20191 run_test 418 "df and lfs df outputs match"
20195 local dir=$DIR/$tdir
20200 cancel_lru_locks mdc
20202 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
20203 $LCTL set_param fail_loc=0x1410
20205 $LCTL set_param fail_loc=0
20208 run_test 419 "Verify open file by name doesn't crash kernel"
20212 [[ $MDS1_VERSION -ge $(version_code 2.12.1) ]] ||
20213 skip "Need MDS version at least 2.12.1"
20215 local SAVE_UMASK=$(umask)
20216 local dir=$DIR/$tdir
20217 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
20221 mkdir -m03777 $dir/testdir
20222 ls -dn $dir/testdir
20223 # Need to remove trailing '.' when SELinux is enabled
20224 local dirperms=$(ls -dn $dir/testdir |
20225 awk '{ sub(/\.$/, "", $1); print $1}')
20226 [ $dirperms == "drwxrwsrwt" ] ||
20227 error "incorrect perms on $dir/testdir"
20229 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
20230 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
20231 ls -n $dir/testdir/testfile
20232 local fileperms=$(ls -n $dir/testdir/testfile |
20233 awk '{ sub(/\.$/, "", $1); print $1}')
20234 [ $fileperms == "-rwxr-xr-x" ] ||
20235 error "incorrect perms on $dir/testdir/testfile"
20239 run_test 420 "clear SGID bit on non-directories for non-members"
20246 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20247 skip "Need MDS version at least 2.12.2"
20249 test_mkdir $DIR/$tdir
20250 createmany -o $DIR/$tdir/f 3
20251 cnt=$(ls -1 $DIR/$tdir | wc -l)
20252 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20254 fid1=$(lfs path2fid $DIR/$tdir/f1)
20255 fid2=$(lfs path2fid $DIR/$tdir/f2)
20256 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
20258 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
20259 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
20261 cnt=$(ls -1 $DIR/$tdir | wc -l)
20262 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20264 rm -f $DIR/$tdir/f3 || error "can't remove f3"
20265 createmany -o $DIR/$tdir/f 3
20266 cnt=$(ls -1 $DIR/$tdir | wc -l)
20267 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20269 fid1=$(lfs path2fid $DIR/$tdir/f1)
20270 fid2=$(lfs path2fid $DIR/$tdir/f2)
20271 echo "remove using fsname $FSNAME"
20272 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
20274 cnt=$(ls -1 $DIR/$tdir | wc -l)
20275 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20277 run_test 421a "simple rm by fid"
20284 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20285 skip "Need MDS version at least 2.12.2"
20287 test_mkdir $DIR/$tdir
20288 createmany -o $DIR/$tdir/f 3
20289 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
20292 FID1=$(lfs path2fid $DIR/$tdir/f1)
20293 FID2=$(lfs path2fid $DIR/$tdir/f2)
20294 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
20296 kill -USR1 $MULTIPID
20299 cnt=$(ls $DIR/$tdir | wc -l)
20300 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
20302 run_test 421b "rm by fid on open file"
20308 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20309 skip "Need MDS version at least 2.12.2"
20311 test_mkdir $DIR/$tdir
20312 createmany -o $DIR/$tdir/f 3
20313 touch $DIR/$tdir/$tfile
20314 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
20315 cnt=$(ls -1 $DIR/$tdir | wc -l)
20316 [ $cnt != 184 ] && error "unexpected #files: $cnt"
20318 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
20319 $LFS rmfid $DIR $FID1 || error "rmfid failed"
20321 cnt=$(ls $DIR/$tdir | wc -l)
20322 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
20324 run_test 421c "rm by fid against hardlinked files"
20330 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20331 skip "Need MDS version at least 2.12.2"
20333 test_mkdir $DIR/$tdir
20334 createmany -o $DIR/$tdir/f 4097
20335 cnt=$(ls -1 $DIR/$tdir | wc -l)
20336 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
20338 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
20339 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20341 cnt=$(ls $DIR/$tdir | wc -l)
20343 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20345 run_test 421d "rmfid en masse"
20351 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20352 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20353 skip "Need MDS version at least 2.12.2"
20355 mkdir -p $DIR/$tdir
20356 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20357 createmany -o $DIR/$tdir/striped_dir/f 512
20358 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20359 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20361 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20362 sed "s/[/][^:]*://g")
20363 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20365 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20367 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20369 run_test 421e "rmfid in DNE"
20375 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20376 skip "Need MDS version at least 2.12.2"
20378 test_mkdir $DIR/$tdir
20380 cnt=$(ls -1 $DIR/$tdir | wc -l)
20381 [ $cnt != 1 ] && error "unexpected #files: $cnt"
20383 FID=$(lfs path2fid $DIR/$tdir/f)
20384 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
20385 # rmfid should fail
20386 cnt=$(ls -1 $DIR/$tdir | wc -l)
20387 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
20389 chmod a+rw $DIR/$tdir
20391 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
20392 # rmfid should fail
20393 cnt=$(ls -1 $DIR/$tdir | wc -l)
20394 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
20397 $RUNAS touch $DIR/$tdir/f
20398 FID=$(lfs path2fid $DIR/$tdir/f)
20399 echo "rmfid as root"
20400 $LFS rmfid $DIR $FID || error "rmfid as root failed"
20401 cnt=$(ls -1 $DIR/$tdir | wc -l)
20402 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
20405 $RUNAS touch $DIR/$tdir/f
20406 cnt=$(ls -1 $DIR/$tdir | wc -l)
20407 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
20408 FID=$(lfs path2fid $DIR/$tdir/f)
20409 # rmfid w/o user_fid2path mount option should fail
20410 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
20411 cnt=$(ls -1 $DIR/$tdir | wc -l)
20412 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
20414 umount_client $MOUNT || "failed to umount client"
20415 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
20416 "failed to mount client'"
20418 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
20419 # rmfid should succeed
20420 cnt=$(ls -1 $DIR/$tdir | wc -l)
20421 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
20423 # rmfid shouldn't allow to remove files due to dir's permission
20424 chmod a+rwx $DIR/$tdir
20427 FID=$(lfs path2fid $DIR/$tdir/f)
20428 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
20430 umount_client $MOUNT || "failed to umount client"
20431 mount_client $MOUNT "$MOUNT_OPTS" ||
20432 "failed to mount client'"
20435 run_test 421f "rmfid checks permissions"
20441 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20442 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20443 skip "Need MDS version at least 2.12.2"
20445 mkdir -p $DIR/$tdir
20446 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20447 createmany -o $DIR/$tdir/striped_dir/f 512
20448 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20449 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20451 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20452 sed "s/[/][^:]*://g")
20454 rm -f $DIR/$tdir/striped_dir/f1*
20455 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20456 removed=$((512 - cnt))
20458 # few files have been just removed, so we expect
20459 # rmfid to fail on their fids
20460 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
20461 [ $removed != $errors ] && error "$errors != $removed"
20463 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20465 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20467 run_test 421g "rmfid to return errors properly"
20470 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20471 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20472 skip "Need server version at least 2.9.55"
20474 start_full_debug_logging
20478 stop_full_debug_logging
20482 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20483 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20484 awk '/The barrier for/ { print $7 }')
20487 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
20492 barrier_expired() {
20495 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20496 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20497 awk '/will be expired/ { print $7 }')
20499 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
20508 echo "Start barrier_freeze at: $(date)"
20509 #define OBD_FAIL_BARRIER_DELAY 0x2202
20510 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20511 # Do not reduce barrier time - See LU-11873
20512 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
20515 local b_status=$(barrier_stat)
20516 echo "Got barrier status at: $(date)"
20517 [ "$b_status" = "'freezing_p1'" ] ||
20518 error "(1) unexpected barrier status $b_status"
20520 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20522 b_status=$(barrier_stat)
20523 [ "$b_status" = "'frozen'" ] ||
20524 error "(2) unexpected barrier status $b_status"
20526 local expired=$(barrier_expired)
20527 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
20528 sleep $((expired + 3))
20530 b_status=$(barrier_stat)
20531 [ "$b_status" = "'expired'" ] ||
20532 error "(3) unexpected barrier status $b_status"
20534 # Do not reduce barrier time - See LU-11873
20535 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
20536 error "(4) fail to freeze barrier"
20538 b_status=$(barrier_stat)
20539 [ "$b_status" = "'frozen'" ] ||
20540 error "(5) unexpected barrier status $b_status"
20542 echo "Start barrier_thaw at: $(date)"
20543 #define OBD_FAIL_BARRIER_DELAY 0x2202
20544 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20545 do_facet mgs $LCTL barrier_thaw $FSNAME &
20548 b_status=$(barrier_stat)
20549 echo "Got barrier status at: $(date)"
20550 [ "$b_status" = "'thawing'" ] ||
20551 error "(6) unexpected barrier status $b_status"
20553 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20555 b_status=$(barrier_stat)
20556 [ "$b_status" = "'thawed'" ] ||
20557 error "(7) unexpected barrier status $b_status"
20559 #define OBD_FAIL_BARRIER_FAILURE 0x2203
20560 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
20561 do_facet mgs $LCTL barrier_freeze $FSNAME
20563 b_status=$(barrier_stat)
20564 [ "$b_status" = "'failed'" ] ||
20565 error "(8) unexpected barrier status $b_status"
20567 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
20568 do_facet mgs $LCTL barrier_thaw $FSNAME
20572 run_test 801a "write barrier user interfaces and stat machine"
20577 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20578 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
20579 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
20580 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
20581 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
20583 cancel_lru_locks mdc
20585 # 180 seconds should be long enough
20586 do_facet mgs $LCTL barrier_freeze $FSNAME 180
20588 local b_status=$(barrier_stat)
20589 [ "$b_status" = "'frozen'" ] ||
20590 error "(6) unexpected barrier status $b_status"
20592 mkdir $DIR/$tdir/d0/d10 &
20595 touch $DIR/$tdir/d1/f13 &
20598 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
20601 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
20604 rm -f $DIR/$tdir/d4/f12 &
20607 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
20609 # To guarantee taht the 'stat' is not blocked
20610 b_status=$(barrier_stat)
20611 [ "$b_status" = "'frozen'" ] ||
20612 error "(8) unexpected barrier status $b_status"
20614 # let above commands to run at background
20617 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
20618 ps -p $touch_pid || error "(10) touch should be blocked"
20619 ps -p $ln_pid || error "(11) link should be blocked"
20620 ps -p $mv_pid || error "(12) rename should be blocked"
20621 ps -p $rm_pid || error "(13) unlink should be blocked"
20623 b_status=$(barrier_stat)
20624 [ "$b_status" = "'frozen'" ] ||
20625 error "(14) unexpected barrier status $b_status"
20627 do_facet mgs $LCTL barrier_thaw $FSNAME
20628 b_status=$(barrier_stat)
20629 [ "$b_status" = "'thawed'" ] ||
20630 error "(15) unexpected barrier status $b_status"
20632 wait $mkdir_pid || error "(16) mkdir should succeed"
20633 wait $touch_pid || error "(17) touch should succeed"
20634 wait $ln_pid || error "(18) link should succeed"
20635 wait $mv_pid || error "(19) rename should succeed"
20636 wait $rm_pid || error "(20) unlink should succeed"
20640 run_test 801b "modification will be blocked by write barrier"
20643 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20647 stop mds2 || error "(1) Fail to stop mds2"
20649 do_facet mgs $LCTL barrier_freeze $FSNAME 30
20651 local b_status=$(barrier_stat)
20652 [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || {
20653 do_facet mgs $LCTL barrier_thaw $FSNAME
20654 error "(2) unexpected barrier status $b_status"
20657 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20658 error "(3) Fail to rescan barrier bitmap"
20660 # Do not reduce barrier time - See LU-11873
20661 do_facet mgs $LCTL barrier_freeze $FSNAME 20
20663 b_status=$(barrier_stat)
20664 [ "$b_status" = "'frozen'" ] ||
20665 error "(4) unexpected barrier status $b_status"
20667 do_facet mgs $LCTL barrier_thaw $FSNAME
20668 b_status=$(barrier_stat)
20669 [ "$b_status" = "'thawed'" ] ||
20670 error "(5) unexpected barrier status $b_status"
20672 local devname=$(mdsdevname 2)
20674 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
20676 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20677 error "(7) Fail to rescan barrier bitmap"
20681 run_test 801c "rescan barrier bitmap"
20683 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
20684 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
20685 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
20686 saved_MOUNT_OPTS=$MOUNT_OPTS
20692 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
20693 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
20694 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
20695 MOUNT_OPTS=$saved_MOUNT_OPTS
20701 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20702 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20703 skip "Need server version at least 2.9.55"
20705 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
20707 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20709 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
20710 error "(2) Fail to copy"
20712 trap cleanup_802 EXIT
20714 # sync by force before remount as readonly
20715 sync; sync_all_data; sleep 3; sync_all_data
20719 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
20720 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
20721 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
20723 echo "Mount the server as read only"
20724 setupall server_only || error "(3) Fail to start servers"
20726 echo "Mount client without ro should fail"
20727 mount_client $MOUNT &&
20728 error "(4) Mount client without 'ro' should fail"
20730 echo "Mount client with ro should succeed"
20731 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
20732 mount_client $MOUNT ||
20733 error "(5) Mount client with 'ro' should succeed"
20735 echo "Modify should be refused"
20736 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
20738 echo "Read should be allowed"
20739 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
20740 error "(7) Read should succeed under ro mode"
20744 run_test 802 "simulate readonly device"
20747 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20748 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20749 skip "MDS needs to be newer than 2.10.54"
20751 mkdir -p $DIR/$tdir
20752 # Create some objects on all MDTs to trigger related logs objects
20753 for idx in $(seq $MDSCOUNT); do
20754 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
20755 $DIR/$tdir/dir${idx} ||
20756 error "Fail to create $DIR/$tdir/dir${idx}"
20760 wait_delete_completed # ensure old test cleanups are finished
20761 echo "before create:"
20763 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20765 for i in {1..10}; do
20766 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
20767 error "Fail to create $DIR/$tdir/foo$i"
20771 echo "after create:"
20773 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20775 # allow for an llog to be cleaned up during the test
20776 [ $after_used -ge $((before_used + 10 - 1)) ] ||
20777 error "before ($before_used) + 10 > after ($after_used)"
20779 for i in {1..10}; do
20780 rm -rf $DIR/$tdir/foo$i ||
20781 error "Fail to remove $DIR/$tdir/foo$i"
20784 sleep 3 # avoid MDT return cached statfs
20785 wait_delete_completed
20786 echo "after unlink:"
20788 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20790 # allow for an llog to be created during the test
20791 [ $after_used -le $((before_used + 1)) ] ||
20792 error "after ($after_used) > before ($before_used) + 1"
20794 run_test 803 "verify agent object for remote object"
20797 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20798 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20799 skip "MDS needs to be newer than 2.10.54"
20800 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
20802 mkdir -p $DIR/$tdir
20803 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
20804 error "Fail to create $DIR/$tdir/dir0"
20806 local fid=$($LFS path2fid $DIR/$tdir/dir0)
20807 local dev=$(mdsdevname 2)
20809 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20810 grep ${fid} || error "NOT found agent entry for dir0"
20812 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
20813 error "Fail to create $DIR/$tdir/dir1"
20815 touch $DIR/$tdir/dir1/foo0 ||
20816 error "Fail to create $DIR/$tdir/dir1/foo0"
20817 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
20820 for idx in $(seq $MDSCOUNT); do
20821 dev=$(mdsdevname $idx)
20822 do_facet mds${idx} \
20823 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20824 grep ${fid} && rc=$idx
20827 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
20828 error "Fail to rename foo0 to foo1"
20829 if [ $rc -eq 0 ]; then
20830 for idx in $(seq $MDSCOUNT); do
20831 dev=$(mdsdevname $idx)
20832 do_facet mds${idx} \
20833 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20834 grep ${fid} && rc=$idx
20838 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
20839 error "Fail to rename foo1 to foo2"
20840 if [ $rc -eq 0 ]; then
20841 for idx in $(seq $MDSCOUNT); do
20842 dev=$(mdsdevname $idx)
20843 do_facet mds${idx} \
20844 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20845 grep ${fid} && rc=$idx
20849 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
20851 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
20852 error "Fail to link to $DIR/$tdir/dir1/foo2"
20853 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
20854 error "Fail to rename foo2 to foo0"
20855 unlink $DIR/$tdir/dir1/foo0 ||
20856 error "Fail to unlink $DIR/$tdir/dir1/foo0"
20857 rm -rf $DIR/$tdir/dir0 ||
20858 error "Fail to rm $DIR/$tdir/dir0"
20860 for idx in $(seq $MDSCOUNT); do
20861 dev=$(mdsdevname $idx)
20865 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
20867 start mds${idx} $dev $MDS_MOUNT_OPTS ||
20868 error "mount mds$idx failed"
20869 df $MOUNT > /dev/null 2>&1
20871 # e2fsck should not return error
20873 error "e2fsck detected error on MDT${idx}: rc=$rc"
20876 run_test 804 "verify agent entry for remote entry"
20879 do_facet $SINGLEMDS zfs set quota=$old $fsset
20880 unlinkmany $DIR/$tdir/f- 1000000
20885 local zfs_version=$(do_node $SINGLEMDS cat /sys/module/zfs/version)
20886 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
20887 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
20888 skip "netfree not implemented before 0.7"
20889 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
20890 skip "Need MDS version at least 2.10.57"
20897 local pref="osd-zfs.lustre-MDT0000."
20899 # limit available space on MDS dataset to meet nospace issue
20900 # quickly. then ZFS 0.7.2 can use reserved space if asked
20901 # properly (using netfree flag in osd_declare_destroy()
20902 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
20903 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
20905 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
20906 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
20907 let "usedkb=usedkb-freekb"
20908 let "freekb=freekb/2"
20909 if let "freekb > 5000"; then
20912 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
20913 trap cleanup_805 EXIT
20915 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
20916 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
20917 rm -rf $DIR/$tdir || error "not able to remove"
20918 do_facet $SINGLEMDS zfs set quota=$old $fsset
20921 run_test 805 "ZFS can remove from full fs"
20927 local size=$($LFS getsom -s $file)
20928 local expect=$(stat -c %s $file)
20930 [[ $size == $expect ]] ||
20931 error "$file expected size: $expect, got: $size"
20933 local blocks=$($LFS getsom -b $file)
20934 expect=$(stat -c %b $file)
20935 [[ $blocks == $expect ]] ||
20936 error "$file expected blocks: $expect, got: $blocks"
20941 local size=$($LFS getsom -s $1)
20944 [[ $size == $expect ]] ||
20945 error "$file expected size: $expect, got: $size"
20949 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
20950 skip "Need MDS version at least 2.11.52"
20954 touch $DIR/$tfile || error "touch $tfile failed"
20956 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
20957 save_lustre_params client "llite.*.xattr_cache" > $save
20958 lctl set_param llite.*.xattr_cache=0
20959 stack_trap "restore_lustre_params < $save" EXIT
20961 # single-threaded write
20962 echo "Test SOM for single-threaded write"
20963 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
20964 error "write $tfile failed"
20965 check_lsom_size $DIR/$tfile $bs
20968 local size=$(($num * $bs))
20972 echo "Test SOM for single client multi-threaded($num) write"
20973 $TRUNCATE $DIR/$tfile 0
20974 for ((i = 0; i < $num; i++)); do
20975 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
20977 offset=$((offset + $bs))
20979 for (( i=0; i < $num; i++ )); do
20982 check_lsom_size $DIR/$tfile $size
20984 $TRUNCATE $DIR/$tfile 0
20985 for ((i = 0; i < $num; i++)); do
20986 offset=$((offset - $bs))
20987 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
20990 for (( i=0; i < $num; i++ )); do
20993 check_lsom_size $DIR/$tfile $size
20995 # multi-client writes
20996 num=$(get_node_count ${CLIENTS//,/ })
20997 size=$(($num * $bs))
21001 echo "Test SOM for multi-client ($num) writes"
21002 $TRUNCATE $DIR/$tfile 0
21003 for client in ${CLIENTS//,/ }; do
21004 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21007 offset=$((offset + $bs))
21009 for (( i=0; i < $num; i++ )); do
21012 check_lsom_size $DIR/$tfile $offset
21015 $TRUNCATE $DIR/$tfile 0
21016 for client in ${CLIENTS//,/ }; do
21017 offset=$((offset - $bs))
21018 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21022 for (( i=0; i < $num; i++ )); do
21025 check_lsom_size $DIR/$tfile $size
21028 echo "Test SOM for truncate"
21029 $TRUNCATE $DIR/$tfile 1048576
21030 check_lsom_size $DIR/$tfile 1048576
21031 $TRUNCATE $DIR/$tfile 1234
21032 check_lsom_size $DIR/$tfile 1234
21034 # verify SOM blocks count
21035 echo "Verify SOM block count"
21036 $TRUNCATE $DIR/$tfile 0
21037 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
21038 error "failed to write file $tfile"
21039 check_lsom_data $DIR/$tfile
21041 run_test 806 "Verify Lazy Size on MDS"
21044 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21045 skip "Need MDS version at least 2.11.52"
21047 # Registration step
21048 changelog_register || error "changelog_register failed"
21049 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
21050 changelog_users $SINGLEMDS | grep -q $cl_user ||
21051 error "User $cl_user not found in changelog_users"
21053 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21054 save_lustre_params client "llite.*.xattr_cache" > $save
21055 lctl set_param llite.*.xattr_cache=0
21056 stack_trap "restore_lustre_params < $save" EXIT
21058 rm -rf $DIR/$tdir || error "rm $tdir failed"
21059 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
21060 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
21061 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
21062 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
21063 error "truncate $tdir/trunc failed"
21066 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
21067 error "write $tfile failed"
21069 # multi-client wirtes
21070 local num=$(get_node_count ${CLIENTS//,/ })
21074 echo "Test SOM for multi-client ($num) writes"
21075 touch $DIR/$tfile || error "touch $tfile failed"
21076 $TRUNCATE $DIR/$tfile 0
21077 for client in ${CLIENTS//,/ }; do
21078 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21081 offset=$((offset + $bs))
21083 for (( i=0; i < $num; i++ )); do
21088 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
21089 check_lsom_data $DIR/$tdir/trunc
21090 check_lsom_data $DIR/$tdir/single_dd
21091 check_lsom_data $DIR/$tfile
21094 # Deregistration step
21095 changelog_deregister || error "changelog_deregister failed"
21097 run_test 807 "verify LSOM syncing tool"
21099 check_som_nologged()
21101 local lines=$($LFS changelog $FSNAME-MDT0000 |
21102 grep 'x=trusted.som' | wc -l)
21103 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
21107 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
21108 skip "Need MDS version at least 2.11.55"
21110 # Registration step
21111 changelog_register || error "changelog_register failed"
21113 touch $DIR/$tfile || error "touch $tfile failed"
21116 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
21117 error "write $tfile failed"
21120 $TRUNCATE $DIR/$tfile 1234
21123 $TRUNCATE $DIR/$tfile 1048576
21126 # Deregistration step
21127 changelog_deregister || error "changelog_deregister failed"
21129 run_test 808 "Check trusted.som xattr not logged in Changelogs"
21134 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
21138 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
21139 skip "Need MDS version at least 2.11.56"
21141 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
21142 error "failed to create DoM-only file $DIR/$tfile"
21143 touch $DIR/$tfile || error "touch $tfile failed"
21144 check_som_nodata $DIR/$tfile
21146 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
21147 error "write $tfile failed"
21148 check_som_nodata $DIR/$tfile
21150 $TRUNCATE $DIR/$tfile 1234
21151 check_som_nodata $DIR/$tfile
21153 $TRUNCATE $DIR/$tfile 4097
21154 check_som_nodata $DIR/$file
21156 run_test 809 "Verify no SOM xattr store for DoM-only files"
21159 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21160 $GSS && skip_env "could not run with gss"
21163 stack_trap "set_checksums $ORIG_CSUM" EXIT
21164 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
21169 for csum in $CKSUM_TYPES; do
21170 #define OBD_FAIL_OSC_NO_GRANT 0x411
21171 $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411
21172 for i in "10240 0" "10000 0" "4000 1" "500 1"; do
21174 dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2
21175 before=$(md5sum $DIR/$tfile)
21176 $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear
21177 after=$(md5sum $DIR/$tfile)
21178 [ "$before" == "$after" ] ||
21179 error "$csum: $before != $after bs=$1 seek=$2"
21183 run_test 810 "partial page writes on ZFS (LU-11663)"
21186 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
21187 skip "Need MDS version at least 2.11.56"
21189 #define OBD_FAIL_MDS_ORPHAN_DELETE 0x165
21190 do_facet mds1 $LCTL set_param fail_loc=0x165
21191 $MULTIOP $DIR/$tfile Ouc || error "multiop failed"
21194 start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
21197 [[ $(do_facet mds1 pgrep orph_.*-MDD | wc -l) -eq 0 ]] ||
21198 error "MDD orphan cleanup thread not quit"
21200 run_test 811 "orphan name stub can be cleaned up in startup"
21203 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
21204 skip "OST < 2.12.51 doesn't support this fail_loc"
21205 [ "$SHARED_KEY" = true ] &&
21206 skip "OSC connections never go IDLE with Shared-Keys enabled"
21208 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21209 # ensure ost1 is connected
21210 stat $DIR/$tfile >/dev/null || error "can't stat"
21211 wait_osc_import_state client ost1 FULL
21212 # no locks, no reqs to let the connection idle
21213 cancel_lru_locks osc
21215 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
21216 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
21217 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
21218 wait_osc_import_state client ost1 CONNECTING
21219 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
21221 stat $DIR/$tfile >/dev/null || error "can't stat file"
21223 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
21227 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
21228 echo -n y >> $DIR/$tfile
21229 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
21230 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
21232 run_test 814 "sparse cp works as expected (LU-12361)"
21236 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
21237 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
21239 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
21242 [ "$SHARED_KEY" = true ] &&
21243 skip "OSC connections never go IDLE with Shared-Keys enabled"
21245 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21246 # ensure ost1 is connected
21247 stat $DIR/$tfile >/dev/null || error "can't stat"
21248 wait_osc_import_state client ost1 FULL
21249 # no locks, no reqs to let the connection idle
21250 cancel_lru_locks osc
21251 lru_resize_disable osc
21254 before=$($LCTL get_param -n \
21255 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21257 wait_osc_import_state client ost1 IDLE
21258 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
21259 now=$($LCTL get_param -n \
21260 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21261 [ $before == $now ] || error "lru_size changed $before != $now"
21263 run_test 816 "do not reset lru_resize on idle reconnect"
21267 exportfs -u localhost:$DIR/nfsexp
21272 systemctl restart nfs-server.service || skip "failed to restart nfsd"
21274 mkdir -p $DIR/nfsexp
21275 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
21276 error "failed to export nfs"
21278 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
21279 stack_trap cleanup_817 EXIT
21281 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
21282 error "failed to mount nfs to $tmpdir"
21284 cp /bin/true $tmpdir
21285 $DIR/nfsexp/true || error "failed to execute 'true' command"
21287 run_test 817 "nfsd won't cache write lock for exec file"
21290 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21291 cancel_lru_locks osc
21292 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21293 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21294 dd if=$DIR/$tfile of=/dev/null bs=1M count=1
21297 run_test 819a "too big niobuf in read"
21300 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21301 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21302 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21303 cancel_lru_locks osc
21307 run_test 819b "too big niobuf in write"
21311 $LFS setstripe -c1 -i0 $DIR/$tfile
21312 $LFS setstripe -c1 -i1 $DIR/$tfile
21314 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
21315 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
21316 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
21317 error "start $SINGLEMDS failed"
21320 run_test 818 "unlink with failed llog"
21323 # tests that do cleanup/setup should be run at the end
21327 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21330 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
21331 $LCTL set_param fail_loc=0x903
21333 cancel_lru_locks MGC
21335 FAIL_ON_ERROR=true cleanup
21336 FAIL_ON_ERROR=true setup
21338 run_test 900 "umount should not race with any mgc requeue thread"
21341 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
21342 check_and_cleanup_lustre
21343 if [ "$I_MOUNTED" != "yes" ]; then
21344 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true