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"
5384 cancel_lru_locks $OSC
5386 local rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5387 local nums=$($cmd | wc -l)
5389 [ $nums -eq $expected ] ||
5390 error "'$cmd' wrong: found $nums, expected $expected"
5392 local rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5394 if (( rpcs_before + glimpses != rpcs_after )); then
5395 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5396 $LCTL get_param osc.*.stats | grep ldlm_glimpse_enqueue
5398 if [[ $glimpses == 0 ]]; then
5399 error "'$cmd' should not send glimpse RPCs to OST"
5401 error "'$cmd' should send $glimpses glimpse RPCs to OST"
5407 [[ $MDS1_VERSION -ge $(version_code 2.12.4) ]] ||
5408 skip "MDS < 2.12.4 doesn't return LSOM data"
5409 local dir=$DIR/$tdir
5411 [[ $OSC == "mdc" ]] && skip "DoM files"
5413 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5414 # open and close all files to ensure LSOM is updated
5415 cancel_lru_locks $OSC
5416 find $dir -type f | xargs cat > /dev/null
5418 # expect_found glimpse_rpcs command_to_run
5419 test_56ra_sub 12 0 "$LFS find -size 0 -type f -lazy $dir"
5420 test_56ra_sub 12 12 "$LFS find -size 0 -type f $dir"
5421 test_56ra_sub 0 0 "$LFS find ! -size 0 -type f -lazy $dir"
5422 test_56ra_sub 0 12 "$LFS find ! -size 0 -type f $dir"
5424 echo "test" > $dir/$tfile
5425 echo "test2" > $dir/$tfile.2 && sync
5426 cancel_lru_locks $OSC
5427 cat $dir/$tfile $dir/$tfile.2 > /dev/null
5429 test_56ra_sub 1 0 "$LFS find -size 5 -type f -lazy $dir"
5430 test_56ra_sub 1 14 "$LFS find -size 5 -type f $dir"
5431 test_56ra_sub 1 0 "$LFS find -size +5 -type f -lazy $dir"
5432 test_56ra_sub 1 14 "$LFS find -size +5 -type f $dir"
5434 test_56ra_sub 2 0 "$LFS find -size +0 -type f -lazy $dir"
5435 test_56ra_sub 2 14 "$LFS find -size +0 -type f $dir"
5436 test_56ra_sub 2 0 "$LFS find ! -size -5 -type f -lazy $dir"
5437 test_56ra_sub 2 14 "$LFS find ! -size -5 -type f $dir"
5438 test_56ra_sub 12 0 "$LFS find -size -5 -type f -lazy $dir"
5439 test_56ra_sub 12 14 "$LFS find -size -5 -type f $dir"
5441 run_test 56ra "check lfs find -size -lazy works for data on OSTs"
5443 test_56s() { # LU-611 #LU-9369
5444 [[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
5446 local dir=$DIR/$tdir
5447 local onestripe=$(((NUMDIRS + 1) * NUMFILES))
5449 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5450 for i in $(seq $NUMDIRS); do
5451 $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile
5454 local expected=$NUMDIRS
5455 local cmd="$LFS find -c $OSTCOUNT $dir"
5456 local nums=$($cmd | wc -l)
5458 [ $nums -eq $expected ] || {
5459 $LFS getstripe -R $dir
5460 error "'$cmd' wrong: found $nums, expected $expected"
5463 expected=$((NUMDIRS + onestripe))
5464 cmd="$LFS find -stripe-count +0 -type f $dir"
5465 nums=$($cmd | wc -l)
5466 [ $nums -eq $expected ] || {
5467 $LFS getstripe -R $dir
5468 error "'$cmd' wrong: found $nums, expected $expected"
5472 cmd="$LFS find -stripe-count 1 -type f $dir"
5473 nums=$($cmd | wc -l)
5474 [ $nums -eq $expected ] || {
5475 $LFS getstripe -R $dir
5476 error "'$cmd' wrong: found $nums, expected $expected"
5479 cmd="$LFS find -stripe-count -2 -type f $dir"
5480 nums=$($cmd | wc -l)
5481 [ $nums -eq $expected ] || {
5482 $LFS getstripe -R $dir
5483 error "'$cmd' wrong: found $nums, expected $expected"
5487 cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir"
5488 nums=$($cmd | wc -l)
5489 [ $nums -eq $expected ] || {
5490 $LFS getstripe -R $dir
5491 error "'$cmd' wrong: found $nums, expected $expected"
5494 run_test 56s "check lfs find -stripe-count works"
5496 test_56t() { # LU-611 #LU-9369
5497 local dir=$DIR/$tdir
5499 setup_56 $dir 0 $NUMDIRS
5500 for i in $(seq $NUMDIRS); do
5501 $LFS setstripe -S 8M $dir/dir$i/$tfile
5504 local expected=$NUMDIRS
5505 local cmd="$LFS find -S 8M $dir"
5506 local nums=$($cmd | wc -l)
5508 [ $nums -eq $expected ] || {
5509 $LFS getstripe -R $dir
5510 error "'$cmd' wrong: found $nums, expected $expected"
5514 setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k"
5516 $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3}
5518 expected=$(((NUMDIRS + 1) * NUMFILES))
5519 cmd="$LFS find -stripe-size 512k -type f $dir"
5520 nums=$($cmd | wc -l)
5521 [ $nums -eq $expected ] ||
5522 error "'$cmd' wrong: found $nums, expected $expected"
5524 cmd="$LFS find -stripe-size +320k -type f $dir"
5525 nums=$($cmd | wc -l)
5526 [ $nums -eq $expected ] ||
5527 error "'$cmd' wrong: found $nums, expected $expected"
5529 expected=$(((NUMDIRS + 1) * NUMFILES + 4))
5530 cmd="$LFS find -stripe-size +200k -type f $dir"
5531 nums=$($cmd | wc -l)
5532 [ $nums -eq $expected ] ||
5533 error "'$cmd' wrong: found $nums, expected $expected"
5535 cmd="$LFS find -stripe-size -640k -type f $dir"
5536 nums=$($cmd | wc -l)
5537 [ $nums -eq $expected ] ||
5538 error "'$cmd' wrong: found $nums, expected $expected"
5541 cmd="$LFS find -stripe-size 256k -type f $dir"
5542 nums=$($cmd | wc -l)
5543 [ $nums -eq $expected ] ||
5544 error "'$cmd' wrong: found $nums, expected $expected"
5546 cmd="$LFS find -stripe-size -320k -type f $dir"
5547 nums=$($cmd | wc -l)
5548 [ $nums -eq $expected ] ||
5549 error "'$cmd' wrong: found $nums, expected $expected"
5552 cmd="$LFS find -stripe-size 1024k -type f $dir"
5553 nums=$($cmd | wc -l)
5554 [ $nums -eq $expected ] ||
5555 error "'$cmd' wrong: found $nums, expected $expected"
5557 run_test 56t "check lfs find -stripe-size works"
5559 test_56u() { # LU-611
5560 local dir=$DIR/$tdir
5562 setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1"
5564 if [[ $OSTCOUNT -gt 1 ]]; then
5565 $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3}
5571 local expected=$(((NUMDIRS + 1) * NUMFILES))
5572 local cmd="$LFS find -stripe-index 0 -type f $dir"
5573 local nums=$($cmd | wc -l)
5575 [ $nums -eq $expected ] ||
5576 error "'$cmd' wrong: found $nums, expected $expected"
5579 cmd="$LFS find -stripe-index 1 -type f $dir"
5580 nums=$($cmd | wc -l)
5581 [ $nums -eq $expected ] ||
5582 error "'$cmd' wrong: found $nums, expected $expected"
5584 cmd="$LFS find ! -stripe-index 0 -type f $dir"
5585 nums=$($cmd | wc -l)
5586 [ $nums -eq $expected ] ||
5587 error "'$cmd' wrong: found $nums, expected $expected"
5590 # This should produce an error and not return any files
5591 cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir"
5592 nums=$($cmd 2>/dev/null | wc -l)
5593 [ $nums -eq $expected ] ||
5594 error "'$cmd' wrong: found $nums, expected $expected"
5596 if [[ $OSTCOUNT -gt 1 ]]; then
5597 expected=$(((NUMDIRS + 1) * NUMFILES + onestripe))
5598 cmd="$LFS find -stripe-index 0,1 -type f $dir"
5599 nums=$($cmd | wc -l)
5600 [ $nums -eq $expected ] ||
5601 error "'$cmd' wrong: found $nums, expected $expected"
5604 run_test 56u "check lfs find -stripe-index works"
5608 local dir=$DIR/$tdir
5610 setup_56 $dir $NUMFILES $NUMDIRS
5612 UUID=$(mdtuuid_from_index $mdt_idx $dir)
5613 [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $mdt_idx"
5615 for file in $($LFS find -m $UUID $dir); do
5616 file_midx=$($LFS getstripe -m $file)
5617 [ $file_midx -eq $mdt_idx ] ||
5618 error "lfs find -m $UUID != getstripe -m $file_midx"
5621 run_test 56v "check 'lfs find -m match with lfs getstripe -m'"
5624 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5625 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5627 local dir=$DIR/$tdir
5629 setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
5631 local stripe_size=$($LFS getstripe -S -d $dir) ||
5632 error "$LFS getstripe -S -d $dir failed"
5633 stripe_size=${stripe_size%% *}
5635 local file_size=$((stripe_size * OSTCOUNT))
5636 local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
5637 local required_space=$((file_num * file_size))
5638 local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
5640 [[ $free_space -le $((required_space / 1024)) ]] &&
5641 skip_env "need $required_space, have $free_space kbytes"
5644 local dd_count=$((file_size / dd_bs))
5646 # write data into the files
5651 for i in $(seq $NUMFILES); do
5653 yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5654 error "write data into $file failed"
5656 for i in $(seq $NUMDIRS); do
5657 for j in $(seq $NUMFILES); do
5658 file=$dir/dir$i/file$j
5659 yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5660 error "write data into $file failed"
5664 # $LFS_MIGRATE will fail if hard link migration is unsupported
5665 if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then
5666 createmany -l$dir/dir1/file1 $dir/dir1/link 200 ||
5667 error "creating links to $dir/dir1/file1 failed"
5672 [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
5675 local cmd="$LFS_MIGRATE -y -c $expected $dir/file1"
5678 eval $cmd || error "$cmd failed"
5680 check_stripe_count $dir/file1 $expected
5682 if [ $MDS1_VERSION -ge $(version_code 2.6.90) ];
5684 # lfs_migrate file onto OST 0 if it is on OST 1, or onto
5685 # OST 1 if it is on OST 0. This file is small enough to
5686 # be on only one stripe.
5687 file=$dir/migr_1_ost
5688 dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
5689 error "write data into $file failed"
5690 local obdidx=$($LFS getstripe -i $file)
5691 local oldmd5=$(md5sum $file)
5694 [[ $obdidx -eq 0 ]] && newobdidx=1
5695 cmd="$LFS migrate -i $newobdidx $file"
5697 eval $cmd || error "$cmd failed"
5699 local realobdix=$($LFS getstripe -i $file)
5700 local newmd5=$(md5sum $file)
5702 [[ $newobdidx -ne $realobdix ]] &&
5703 error "new OST is different (was=$obdidx, "\
5704 "wanted=$newobdidx, got=$realobdix)"
5705 [[ "$oldmd5" != "$newmd5" ]] &&
5706 error "md5sum differ: $oldmd5, $newmd5"
5710 cmd="$LFS_MIGRATE -y -c $expected $dir/dir1"
5712 eval $cmd || error "$cmd failed"
5714 for j in $(seq $NUMFILES); do
5715 check_stripe_count $dir/dir1/file$j $expected
5718 # lfs_migrate works with lfs find
5719 cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir |
5720 $LFS_MIGRATE -y -c $expected"
5722 eval $cmd || error "$cmd failed"
5724 for i in $(seq 2 $NUMFILES); do
5725 check_stripe_count $dir/file$i $expected
5727 for i in $(seq 2 $NUMDIRS); do
5728 for j in $(seq $NUMFILES); do
5729 check_stripe_count $dir/dir$i/file$j $expected
5733 run_test 56w "check lfs_migrate -c stripe_count works"
5736 local file1=$DIR/$tdir/file1
5737 local create_pool=false
5738 local initial_pool=$($LFS getstripe -p $DIR)
5742 echo -n "Creating test dir..."
5743 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5746 echo -n "Creating test file..."
5747 touch $file1 || error "cannot create file"
5750 echo -n "Detecting existing pools..."
5751 pool_list=($($LFS pool_list $FSNAME | grep "$FSNAME\." | cut -d. -f2))
5753 if [ ${#pool_list[@]} -gt 0 ]; then
5754 echo "${pool_list[@]}"
5755 for thispool in "${pool_list[@]}"; do
5756 if [[ -z "$initial_pool" ||
5757 "$initial_pool" != "$thispool" ]]; then
5759 echo "Using existing pool '$pool'"
5764 echo "none detected."
5766 if [ -z "$pool" ]; then
5767 pool=${POOL:-testpool}
5768 [ "$initial_pool" = "$pool" ] && pool="testpool2"
5769 echo -n "Creating pool '$pool'..."
5771 pool_add $pool &> /dev/null ||
5772 error "pool_add failed"
5775 echo -n "Adding target to pool..."
5776 pool_add_targets $pool 0 0 1 &> /dev/null ||
5777 error "pool_add_targets failed"
5781 echo -n "Setting pool using -p option..."
5782 $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null ||
5783 error "migrate failed rc = $?"
5786 echo -n "Verifying test file is in pool after migrating..."
5787 [ "$($LFS getstripe -p $file1)" = $pool ] ||
5788 error "file was not migrated to pool $pool"
5791 echo -n "Removing test file from pool '$pool'..."
5792 # "lfs migrate $file" won't remove the file from the pool
5793 # until some striping information is changed.
5794 $LFS migrate -c 1 $file1 &> /dev/null ||
5795 error "cannot remove from pool"
5796 [ "$($LFS getstripe -p $file1)" ] &&
5797 error "pool still set"
5800 echo -n "Setting pool using --pool option..."
5801 $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null ||
5802 error "migrate failed rc = $?"
5807 if $create_pool; then
5808 destroy_test_pools 2> /dev/null ||
5809 error "destroy test pools failed"
5812 run_test 56wb "check lfs_migrate pool support"
5815 local file1="$DIR/$tdir/file1"
5822 echo -n "Creating test dir..."
5823 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5824 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
5825 error "cannot set stripe by '-S 1M -c 1'"
5828 echo -n "Setting initial stripe for test file..."
5829 $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
5830 error "cannot set stripe"
5831 cur_ssize=$($LFS getstripe -S "$file1")
5832 [ $cur_ssize -eq 524288 ] || error "setstripe -S $cur_ssize != 524288"
5835 # File currently set to -S 512K -c 1
5837 # Ensure -c and -S options are rejected when -R is set
5838 echo -n "Verifying incompatible options are detected..."
5839 $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null &&
5840 error "incompatible -c and -R options not detected"
5841 $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null &&
5842 error "incompatible -S and -R options not detected"
5845 # Ensure unrecognized options are passed through to 'lfs migrate'
5846 echo -n "Verifying -S option is passed through to lfs migrate..."
5847 $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
5848 error "migration failed"
5849 cur_ssize=$($LFS getstripe -S "$file1")
5850 [ $cur_ssize -eq 1048576 ] || error "migrate -S $cur_ssize != 1048576"
5853 # File currently set to -S 1M -c 1
5855 # Ensure long options are supported
5856 echo -n "Verifying long options supported..."
5857 $LFS_MIGRATE -y --non-block "$file1" &> /dev/null ||
5858 error "long option without argument not supported"
5859 $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
5860 error "long option with argument not supported"
5861 cur_ssize=$($LFS getstripe -S "$file1")
5862 [ $cur_ssize -eq 524288 ] ||
5863 error "migrate --stripe-size $cur_ssize != 524288"
5866 # File currently set to -S 512K -c 1
5868 if [ "$OSTCOUNT" -gt 1 ]; then
5869 echo -n "Verifying explicit stripe count can be set..."
5870 $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
5871 error "migrate failed"
5872 cur_scount=$($LFS getstripe -c "$file1")
5873 [ $cur_scount -eq 2 ] || error "migrate -c $cur_scount != 2"
5877 # File currently set to -S 512K -c 1 or -S 512K -c 2
5879 # Ensure parent striping is used if -R is set, and no stripe
5880 # count or size is specified
5881 echo -n "Setting stripe for parent directory..."
5882 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5883 error "cannot set stripe '-S 2M -c 1'"
5886 echo -n "Verifying restripe option uses parent stripe settings..."
5887 parent_ssize=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
5888 parent_scount=$($LFS getstripe -c $DIR/$tdir 2>/dev/null)
5889 $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
5890 error "migrate failed"
5891 cur_ssize=$($LFS getstripe -S "$file1")
5892 [ $cur_ssize -eq $parent_ssize ] ||
5893 error "migrate -R stripe_size $cur_ssize != $parent_ssize"
5894 cur_scount=$($LFS getstripe -c "$file1")
5895 [ $cur_scount -eq $parent_scount ] ||
5896 error "migrate -R stripe_count $cur_scount != $parent_scount"
5899 # File currently set to -S 1M -c 1
5901 # Ensure striping is preserved if -R is not set, and no stripe
5902 # count or size is specified
5903 echo -n "Verifying striping size preserved when not specified..."
5904 orig_ssize=$($LFS getstripe -S "$file1" 2>/dev/null)
5905 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5906 error "cannot set stripe on parent directory"
5907 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5908 error "migrate failed"
5909 cur_ssize=$($LFS getstripe -S "$file1")
5910 [ $cur_ssize -eq $orig_ssize ] ||
5911 error "migrate by default $cur_ssize != $orig_ssize"
5914 # Ensure file name properly detected when final option has no argument
5915 echo -n "Verifying file name properly detected..."
5916 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5917 error "file name interpreted as option argument"
5923 run_test 56wc "check unrecognized options for lfs_migrate are passed through"
5926 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5928 local file1=$DIR/$tdir/file1
5930 echo -n "Creating test dir..."
5931 test_mkdir $DIR/$tdir || error "cannot create dir"
5934 echo -n "Creating test file..."
5938 # Ensure 'lfs migrate' will fail by using a non-existent option,
5939 # and make sure rsync is not called to recover
5940 echo -n "Make sure --no-rsync option works..."
5941 $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 |
5942 grep -q 'refusing to fall back to rsync' ||
5943 error "rsync was called with --no-rsync set"
5946 # Ensure rsync is called without trying 'lfs migrate' first
5947 echo -n "Make sure --rsync option works..."
5948 $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 |
5949 grep -q 'falling back to rsync' &&
5950 error "lfs migrate was called with --rsync set"
5953 echo -n "Make sure --rsync and --no-rsync options are exclusive..."
5954 $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 |
5955 grep -q 'at the same time' ||
5956 error "--rsync and --no-rsync accepted concurrently"
5962 run_test 56wd "check lfs_migrate --rsync and --no-rsync work"
5965 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5966 check_swap_layouts_support
5968 local dir=$DIR/$tdir
5969 local ref1=/etc/passwd
5970 local file1=$dir/file1
5972 test_mkdir $dir || error "creating dir $dir"
5973 $LFS setstripe -c 2 $file1
5975 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
5976 stripe=$($LFS getstripe -c $file1)
5977 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
5978 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
5983 run_test 56x "lfs migration support"
5986 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5987 check_swap_layouts_support
5989 local dir=$DIR/$tdir/$testnum
5993 local ref1=/etc/passwd
5994 local file1=$dir/file1
5996 $LFS setstripe -c 2 $file1
5998 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
6000 local stripe=$($LFS getstripe -c $file1)
6002 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6003 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6008 run_test 56xa "lfs migration --block support"
6010 check_migrate_links() {
6012 local file1="$dir/file1"
6015 local total_count=$(($begin + $count - 1))
6016 local symlink_count=10
6019 if [ ! -f "$file1" ]; then
6020 echo -n "creating initial file..."
6021 $LFS setstripe -c 1 -S "512k" "$file1" ||
6022 error "cannot setstripe initial file"
6025 echo -n "creating symlinks..."
6026 for s in $(seq 1 $symlink_count); do
6027 ln -s "$file1" "$dir/slink$s" ||
6028 error "cannot create symlinks"
6032 echo -n "creating nonlinked files..."
6033 createmany -o "$dir/uniq" 1 10 &> /dev/null ||
6034 error "cannot create nonlinked files"
6039 if [ ! -f "$dir/file$total_count" ]; then
6040 echo -n "creating hard links $begin:$total_count..."
6041 createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
6042 /dev/null || error "cannot create hard links"
6046 echo -n "checking number of hard links listed in xattrs..."
6047 local fid=$($LFS getstripe -F "$file1")
6048 local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
6051 if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
6052 skip "hard link list has unexpected size, skipping test"
6054 if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
6055 error "link names should exceed xattrs size"
6058 echo -n "migrating files..."
6059 local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir)
6061 [ $rc -eq 0 ] || error "migrate failed rc = $rc"
6064 # make sure all links have been properly migrated
6065 echo -n "verifying files..."
6066 fid=$($LFS getstripe -F "$file1") ||
6067 error "cannot get fid for file $file1"
6068 for i in $(seq 2 $total_count); do
6069 local fid2=$($LFS getstripe -F $dir/file$i)
6071 [ "$fid2" == "$fid" ] ||
6072 error "migrated hard link has mismatched FID"
6075 # make sure hard links were properly detected, and migration was
6076 # performed only once for the entire link set; nonlinked files should
6078 local actual=$(grep -c 'done' <<< "$migrate_out")
6079 local expected=$(($uniq_count + 1))
6081 [ "$actual" -eq "$expected" ] ||
6082 error "hard links individually migrated ($actual != $expected)"
6084 # make sure the correct number of hard links are present
6085 local hardlinks=$(stat -c '%h' "$file1")
6087 [ $hardlinks -eq $total_count ] ||
6088 error "num hard links $hardlinks != $total_count"
6095 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
6096 skip "Need MDS version at least 2.10.55"
6098 local dir="$DIR/$tdir"
6100 test_mkdir "$dir" || error "cannot create dir $dir"
6102 echo "testing lfs migrate mode when all links fit within xattrs"
6103 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 2 99
6105 echo "testing rsync mode when all links fit within xattrs"
6106 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 2 99
6108 echo "testing lfs migrate mode when all links do not fit within xattrs"
6109 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100
6111 echo "testing rsync mode when all links do not fit within xattrs"
6112 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 101 100
6118 run_test 56xb "lfs migration hard link support"
6121 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6123 local dir="$DIR/$tdir"
6125 test_mkdir "$dir" || error "cannot create dir $dir"
6127 # Test 1: ensure file < 1 GB is always migrated with 1 stripe
6128 echo -n "Setting initial stripe for 20MB test file..."
6129 $LFS setstripe -c 2 -i 0 "$dir/20mb" ||
6130 error "cannot setstripe 20MB file"
6132 echo -n "Sizing 20MB test file..."
6133 truncate "$dir/20mb" 20971520 || error "cannot create 20MB test file"
6135 echo -n "Verifying small file autostripe count is 1..."
6136 $LFS_MIGRATE -y -A -C 1 "$dir/20mb" ||
6137 error "cannot migrate 20MB file"
6138 local stripe_count=$($LFS getstripe -c "$dir/20mb") ||
6139 error "cannot get stripe for $dir/20mb"
6140 [ $stripe_count -eq 1 ] ||
6141 error "unexpected stripe count $stripe_count for 20MB file"
6145 # Test 2: File is small enough to fit within the available space on
6146 # sqrt(size_in_gb) + 1 OSTs but is larger than 1GB. The file must
6147 # have at least an additional 1KB for each desired stripe for test 3
6148 echo -n "Setting stripe for 1GB test file..."
6149 $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe 1GB file"
6151 echo -n "Sizing 1GB test file..."
6152 # File size is 1GB + 3KB
6153 truncate "$dir/1gb" 1073744896 || error "cannot create 1GB test file"
6156 # need at least 512MB per OST for 1GB file to fit in 2 stripes
6157 local avail=$($LCTL get_param -n llite.$FSNAME*.kbytesavail)
6158 if (( avail > 524288 * OSTCOUNT )); then
6159 echo -n "Migrating 1GB file..."
6160 $LFS_MIGRATE -y -A -C 1 "$dir/1gb" ||
6161 error "cannot migrate 1GB file"
6163 echo -n "Verifying autostripe count is sqrt(n) + 1..."
6164 stripe_count=$($LFS getstripe -c "$dir/1gb") ||
6165 error "cannot getstripe for 1GB file"
6166 [ $stripe_count -eq 2 ] ||
6167 error "unexpected stripe count $stripe_count != 2"
6171 # Test 3: File is too large to fit within the available space on
6172 # sqrt(n) + 1 OSTs. Simulate limited available space with -X
6173 if [ $OSTCOUNT -ge 3 ]; then
6174 # The required available space is calculated as
6175 # file size (1GB + 3KB) / OST count (3).
6176 local kb_per_ost=349526
6178 echo -n "Migrating 1GB file with limit..."
6179 $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" ||
6180 error "cannot migrate 1GB file with limit"
6183 stripe_count=$($LFS getstripe -c "$dir/1gb")
6184 echo -n "Verifying 1GB autostripe count with limited space..."
6185 [ "$stripe_count" -a $stripe_count -ge 3 ] ||
6186 error "unexpected stripe count $stripe_count (min 3)"
6193 run_test 56xc "lfs migration autostripe"
6196 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6198 local dir=$DIR/$tdir
6199 local f_mgrt=$dir/$tfile.mgrt
6200 local f_yaml=$dir/$tfile.yaml
6201 local f_copy=$dir/$tfile.copy
6202 local layout_yaml="-E 1M -S 512K -c 1 -E -1 -S 1M -c 2 -i 0"
6203 local layout_copy="-c 2 -S 2M -i 1"
6204 local yamlfile=$dir/yamlfile
6205 local layout_before;
6208 test_mkdir "$dir" || error "cannot create dir $dir"
6209 $LFS setstripe $layout_yaml $f_yaml ||
6210 error "cannot setstripe $f_yaml with layout $layout_yaml"
6211 $LFS getstripe --yaml $f_yaml > $yamlfile
6212 $LFS setstripe $layout_copy $f_copy ||
6213 error "cannot setstripe $f_copy with layout $layout_copy"
6215 dd if=/dev/zero of=$f_mgrt bs=1M count=4
6217 # 1. test option --yaml
6218 $LFS_MIGRATE -y --yaml $yamlfile $f_mgrt ||
6219 error "cannot migrate $f_mgrt with --yaml $yamlfile"
6220 layout_before=$(get_layout_param $f_yaml)
6221 layout_after=$(get_layout_param $f_mgrt)
6222 [ "$layout_after" == "$layout_before" ] ||
6223 error "lfs_migrate --yaml: $layout_after != $layout_before"
6225 # 2. test option --copy
6226 $LFS_MIGRATE -y --copy $f_copy $f_mgrt ||
6227 error "cannot migrate $f_mgrt with --copy $f_copy"
6228 layout_before=$(get_layout_param $f_copy)
6229 layout_after=$(get_layout_param $f_mgrt)
6230 [ "$layout_after" == "$layout_before" ] ||
6231 error "lfs_migrate --copy: $layout_after != $layout_before"
6233 run_test 56xd "check lfs_migrate --yaml and --copy support"
6236 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6238 local dir=$DIR/$tdir
6239 local f_comp=$dir/$tfile
6240 local layout="-E 1M -S 512K -c 1 -E -1 -S 1M -c 2 -i 0"
6241 local layout_before=""
6242 local layout_after=""
6244 test_mkdir "$dir" || error "cannot create dir $dir"
6245 $LFS setstripe $layout $f_comp ||
6246 error "cannot setstripe $f_comp with layout $layout"
6247 layout_before=$(get_layout_param $f_comp)
6248 dd if=/dev/zero of=$f_comp bs=1M count=4
6250 # 1. migrate a comp layout file by lfs_migrate
6251 $LFS_MIGRATE -y $f_comp || error "cannot migrate $f_comp by lfs_migrate"
6252 layout_after=$(get_layout_param $f_comp)
6253 [ "$layout_before" == "$layout_after" ] ||
6254 error "lfs_migrate: $layout_before != $layout_after"
6256 # 2. migrate a comp layout file by lfs migrate
6257 $LFS migrate $f_comp || error "cannot migrate $f_comp by lfs migrate"
6258 layout_after=$(get_layout_param $f_comp)
6259 [ "$layout_before" == "$layout_after" ] ||
6260 error "lfs migrate: $layout_before != $layout_after"
6262 run_test 56xe "migrate a composite layout file"
6265 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
6266 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
6269 local dir=$DIR/$tdir
6273 test_mkdir -p $dir || error "creating dir $dir"
6274 touch $f1 || error "creating std file $f1"
6275 $MULTIOP $f2 H2c || error "creating released file $f2"
6277 # a directory can be raid0, so ask only for files
6278 res=$($LFS find $dir -L raid0 -type f | wc -l)
6279 [[ $res == 2 ]] || error "search raid0: found $res files != 2"
6281 res=$($LFS find $dir \! -L raid0 -type f | wc -l)
6282 [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
6284 # only files can be released, so no need to force file search
6285 res=$($LFS find $dir -L released)
6286 [[ $res == $f2 ]] || error "search released: found $res != $f2"
6288 res=$($LFS find $dir -type f \! -L released)
6289 [[ $res == $f1 ]] || error "search !released: found $res != $f1"
6291 run_test 56y "lfs find -L raid0|released"
6293 test_56z() { # LU-4824
6294 # This checks to make sure 'lfs find' continues after errors
6295 # There are two classes of errors that should be caught:
6296 # - If multiple paths are provided, all should be searched even if one
6298 # - If errors are encountered during the search, it should not terminate
6300 local dir=$DIR/$tdir
6304 for i in d{0..9}; do
6306 touch $dir/$i/$tfile
6308 $LFS find $DIR/non_existent_dir $dir &&
6309 error "$LFS find did not return an error"
6310 # Make a directory unsearchable. This should NOT be the last entry in
6311 # directory order. Arbitrarily pick the 6th entry
6312 chmod 700 $($LFS find $dir -type d | sed '6!d')
6314 $RUNAS $LFS find $DIR/non_existent $dir
6315 local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l)
6317 # The user should be able to see 10 directories and 9 files
6318 (( count == 19 )) ||
6319 error "$LFS find found $count != 19 entries after error"
6321 run_test 56z "lfs find should continue after an error"
6323 test_56aa() { # LU-5937
6324 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
6326 local dir=$DIR/$tdir
6329 $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
6331 createmany -o $dir/striped_dir/${tfile}- 1024
6332 local dirs=$($LFS find --size +8k $dir/)
6334 [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
6336 run_test 56aa "lfs find --size under striped dir"
6338 test_56ab() { # LU-10705
6339 test_mkdir $DIR/$tdir
6340 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
6341 dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
6342 dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
6343 # Flush writes to ensure valid blocks. Need to be more thorough for
6344 # ZFS, since blocks are not allocated/returned to client immediately.
6346 wait_zfs_commit ost1 2
6347 cancel_lru_locks osc
6350 local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
6352 [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
6354 files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
6355 [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
6357 rm -f $DIR/$tdir/$tfile.[123]
6359 run_test 56ab "lfs find --blocks"
6362 [ $MDS1_VERSION -lt $(version_code 2.10.50) ] &&
6363 skip "Need MDS version at least 2.10.50"
6365 # Create composite files with one component
6366 local dir=$DIR/$tdir
6368 setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
6369 # Create composite files with three components
6370 setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
6371 # Create non-composite files
6372 createmany -o $dir/${tfile}- 10
6374 local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l)
6376 [[ $nfiles == 10 ]] ||
6377 error "lfs find -E 1M found $nfiles != 10 files"
6379 nfiles=$($LFS find ! -E 1M --type f $dir | wc -l)
6380 [[ $nfiles == 25 ]] ||
6381 error "lfs find ! -E 1M found $nfiles != 25 files"
6383 # All files have a component that starts at 0
6384 nfiles=$($LFS find --component-start 0 --type f $dir | wc -l)
6385 [[ $nfiles == 35 ]] ||
6386 error "lfs find --component-start 0 - $nfiles != 35 files"
6388 nfiles=$($LFS find --component-start 2M --type f $dir | wc -l)
6389 [[ $nfiles == 15 ]] ||
6390 error "lfs find --component-start 2M - $nfiles != 15 files"
6392 # All files created here have a componenet that does not starts at 2M
6393 nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l)
6394 [[ $nfiles == 35 ]] ||
6395 error "lfs find ! --component-start 2M - $nfiles != 35 files"
6397 # Find files with a specified number of components
6398 local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l)
6399 [[ $nfiles == 15 ]] ||
6400 error "lfs find --component-count 3 - $nfiles != 15 files"
6402 # Remember non-composite files have a component count of zero
6403 local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l)
6404 [[ $nfiles == 10 ]] ||
6405 error "lfs find --component-count 0 - $nfiles != 10 files"
6407 nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l)
6408 [[ $nfiles == 20 ]] ||
6409 error "lfs find ! --component-count 3 - $nfiles != 20 files"
6411 # All files have a flag called "init"
6412 local nfiles=$($LFS find --component-flags init --type f $dir | wc -l)
6413 [[ $nfiles == 35 ]] ||
6414 error "lfs find --component-flags init - $nfiles != 35 files"
6416 # Multi-component files will have a component not initialized
6417 local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l)
6418 [[ $nfiles == 15 ]] ||
6419 error "lfs find !--component-flags init - $nfiles != 15 files"
6424 run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
6427 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
6428 skip "Need MDS version at least 2.10.57"
6438 # create mirrored directories and mirrored files
6439 mkdir $td || error "mkdir $td failed"
6440 $LFS mirror create -N3 $td || error "create mirrored dir $td failed"
6441 createmany -o $tf- 10 || error "create $tf- failed"
6443 for i in $(seq 2); do
6445 mkdir $dir || error "mkdir $dir failed"
6446 $LFS mirror create -N$((3 + i)) $dir ||
6447 error "create mirrored dir $dir failed"
6448 createmany -o $dir/$tfile- 10 ||
6449 error "create $dir/$tfile- failed"
6452 # change the states of some mirrored files
6454 for i in $(seq 2); do
6456 for j in $(seq 4 9); do
6457 echo foo > $dir/$tfile-$j
6461 # find mirrored files with specific mirror count
6462 cmd="$LFS find --mirror-count 3 --type f $td"
6463 nfiles=$($cmd | wc -l)
6464 [[ $nfiles = 10 ]] || error "$cmd: $nfiles != 10 files"
6466 cmd="$LFS find ! --mirror-count 3 --type f $td"
6467 nfiles=$($cmd | wc -l)
6468 [[ $nfiles = 20 ]] || error "$cmd: $nfiles != 20 files"
6470 cmd="$LFS find --mirror-count +2 --type f $td"
6471 nfiles=$($cmd | wc -l)
6472 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6474 cmd="$LFS find --mirror-count -6 --type f $td"
6475 nfiles=$($cmd | wc -l)
6476 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6478 # find mirrored files with specific file state
6479 cmd="$LFS find --maxdepth 1 --mirror-state=^ro --type f $td"
6480 [[ $($cmd) = $tf-6 ]] || error "$cmd: didn't return $tf-6"
6482 cmd="$LFS find --mirror-state=ro --type f $td"
6483 nfiles=$($cmd | wc -l)
6484 [[ $nfiles = 17 ]] || error "$cmd: $nfiles != 17 files"
6486 cmd="$LFS find ! --mirror-state=ro --type f $td"
6487 nfiles=$($cmd | wc -l)
6488 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6490 cmd="$LFS find --mirror-state=wp --type f $td"
6491 nfiles=$($cmd | wc -l)
6492 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6494 cmd="$LFS find ! --mirror-state=sp --type f $td"
6495 nfiles=$($cmd | wc -l)
6496 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6498 run_test 56ca "check lfs find --mirror-count|-N and --mirror-state"
6501 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6502 # note test will not do anything if MDS is not local
6503 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6504 skip_env "ldiskfs only test"
6506 remote_mds_nodsh && skip "remote MDS with nodsh"
6508 local MNTDEV="osd*.*MDT*.mntdev"
6509 DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV)
6510 [ -z "$DEV" ] && error "can't access $MNTDEV"
6511 for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
6512 do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
6513 error "can't access $DEV"
6514 DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
6515 [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
6519 run_test 57a "verify MDS filesystem created with large inodes =="
6522 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6523 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6524 skip_env "ldiskfs only test"
6526 remote_mds_nodsh && skip "remote MDS with nodsh"
6528 local dir=$DIR/$tdir
6531 local fileN=$dir/f$filecount
6533 rm -rf $dir || error "removing $dir"
6535 local mdtidx=$($LFS getstripe -m $dir)
6536 local mdtname=MDT$(printf %04x $mdtidx)
6537 local facet=mds$((mdtidx + 1))
6539 echo "mcreating $filecount files"
6540 createmany -m $dir/f 1 $filecount || error "creating files in $dir"
6542 # verify that files do not have EAs yet
6543 $LFS getstripe $file1 2>&1 | grep -q "no stripe" ||
6544 error "$file1 has an EA"
6545 $LFS getstripe $fileN 2>&1 | grep -q "no stripe" ||
6546 error "$fileN has an EA"
6550 df $dir #make sure we get new statfs data
6551 local mdsfree=$(do_facet $facet \
6552 lctl get_param -n osd*.*$mdtname.kbytesfree)
6553 local mdcfree=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6556 echo "opening files to create objects/EAs"
6557 for file in $(seq -f $dir/f%g 1 $filecount); do
6558 $OPENFILE -f O_RDWR $file > /dev/null 2>&1 ||
6559 error "opening $file"
6562 # verify that files have EAs now
6563 $LFS getstripe $file1 | grep -q "obdidx" || error "$file1 missing EA"
6564 $LFS getstripe $fileN | grep -q "obdidx" || error "$fileN missing EA"
6566 sleep 1 #make sure we get new statfs data
6568 local mdsfree2=$(do_facet $facet \
6569 lctl get_param -n osd*.*$mdtname.kbytesfree)
6570 local mdcfree2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6572 if [[ $mdcfree2 -lt $((mdcfree - 16)) ]]; then
6573 if [ "$mdsfree" != "$mdsfree2" ]; then
6574 error "MDC before $mdcfree != after $mdcfree2"
6576 echo "MDC before $mdcfree != after $mdcfree2"
6577 echo "unable to confirm if MDS has large inodes"
6582 run_test 57b "default LOV EAs are stored inside large inodes ==="
6585 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6586 [ -z "$(which wiretest 2>/dev/null)" ] &&
6587 skip_env "could not find wiretest"
6591 run_test 58 "verify cross-platform wire constants =============="
6594 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6596 echo "touch 130 files"
6597 createmany -o $DIR/f59- 130
6599 unlinkmany $DIR/f59- 130
6601 # wait for commitment of removal
6602 wait_delete_completed
6604 run_test 59 "verify cancellation of llog records async ========="
6606 TEST60_HEAD="test_60 run $RANDOM"
6608 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6609 remote_mgs_nodsh && skip "remote MGS with nodsh"
6610 do_facet mgs "! which run-llog.sh &> /dev/null" &&
6611 do_facet mgs "! ls run-llog.sh &> /dev/null" &&
6612 skip_env "missing subtest run-llog.sh"
6614 log "$TEST60_HEAD - from kernel mode"
6615 do_facet mgs "$LCTL dk > /dev/null"
6616 do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed"
6617 do_facet mgs $LCTL dk > $TMP/$tfile
6619 # LU-6388: test llog_reader
6620 local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
6621 llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
6622 [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
6623 skip_env "missing llog_reader"
6624 local fstype=$(facet_fstype mgs)
6625 [ $fstype != ldiskfs -a $fstype != zfs ] &&
6626 skip_env "Only for ldiskfs or zfs type mgs"
6628 local mntpt=$(facet_mntpt mgs)
6629 local mgsdev=$(mgsdevname 1)
6641 #get fid and record list
6642 fid_list=($(awk '/9_sub.*record/ { print $NF }' /$TMP/$tfile |
6644 rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' /$TMP/$tfile |
6646 #remount mgs as ldiskfs or zfs type
6647 stop mgs || error "stop mgs failed"
6648 mount_fstype mgs || error "remount mgs failed"
6649 for ((i = 0; i < ${#fid_list[@]}; i++)); do
6652 seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
6653 oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
6658 obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
6660 obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
6662 echo "obj_file is $obj_file"
6663 do_facet mgs $llog_reader $obj_file
6665 rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
6666 awk '{ print $3 }' | sed -e "s/^type=//g")
6667 if [ $rec_type != $rec ]; then
6668 echo "FAILED test_60a wrong record type $rec_type," \
6674 #check obj path if record type is LLOG_LOGID_MAGIC
6675 if [ "$rec" == "1064553b" ]; then
6676 path=$(do_facet mgs $llog_reader $obj_file |
6677 grep "path=" | awk '{ print $NF }' |
6678 sed -e "s/^path=//g")
6679 if [ $obj_file != $mntpt/$path ]; then
6680 echo "FAILED test_60a wrong obj path" \
6681 "$montpt/$path, should be $obj_file"
6688 #restart mgs before "error", otherwise it will block the next test
6689 stop mgs || error "stop mgs failed"
6690 start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
6691 $pass || error "test failed, see FAILED test_60a messages for specifics"
6693 run_test 60a "llog_test run from kernel module and test llog_reader"
6695 test_60b() { # bug 6411
6696 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6699 LLOG_COUNT=$(do_facet mgs dmesg |
6700 awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
6701 /llog_[a-z]*.c:[0-9]/ {
6713 [[ $LLOG_COUNT -gt 120 ]] &&
6714 error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
6716 run_test 60b "limit repeated messages from CERROR/CWARN"
6719 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6721 echo "create 5000 files"
6722 createmany -o $DIR/f60c- 5000
6723 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137
6724 lctl set_param fail_loc=0x80000137
6725 unlinkmany $DIR/f60c- 5000
6726 lctl set_param fail_loc=0
6728 run_test 60c "unlink file when mds full"
6731 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6733 SAVEPRINTK=$(lctl get_param -n printk)
6734 # verify "lctl mark" is even working"
6735 MESSAGE="test message ID $RANDOM $$"
6736 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6737 dmesg | grep -q "$MESSAGE" || error "didn't find debug marker in log"
6739 lctl set_param printk=0 || error "set lnet.printk failed"
6740 lctl get_param -n printk | grep emerg || error "lnet.printk dropped emerg"
6741 MESSAGE="new test message ID $RANDOM $$"
6742 # Assume here that libcfs_debug_mark_buffer() uses D_WARNING
6743 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6744 dmesg | grep -q "$MESSAGE" && error "D_WARNING wasn't masked" || true
6746 lctl set_param -n printk="$SAVEPRINTK"
6748 run_test 60d "test printk console message masking"
6751 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6752 remote_mds_nodsh && skip "remote MDS with nodsh"
6755 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
6756 do_facet mds1 lctl set_param fail_loc=0x15b
6759 run_test 60e "no space while new llog is being created"
6764 test_mkdir -c $MDSCOUNT $DIR/$tdir
6765 $LFS setdirstripe -D -i -1 -c $MDSCOUNT $DIR/$tdir
6770 mkdir $DIR/$tdir/subdir$index 2>/dev/null
6771 rmdir $DIR/$tdir/subdir$index 2>/dev/null
6772 index=$((index + 1))
6778 for i in $(seq 100); do
6779 # define OBD_FAIL_OSD_TXN_START 0x19a
6780 do_facet mds1 lctl set_param fail_loc=0x8000019a
6786 mkdir $DIR/$tdir/new || error "mkdir failed"
6787 rmdir $DIR/$tdir/new || error "rmdir failed"
6789 run_test 60g "transaction abort won't cause MDT hung"
6792 [ $MDS1_VERSION -le $(version_code 2.12.52) ] ||
6793 skip "Need MDS version at least 2.12.52"
6794 [ $MDSCOUNT -le 2 ] && skip "Need >= 2 MDTs"
6798 #define OBD_FAIL_MDS_STRIPE_CREATE 0x188
6799 #define OBD_FAIL_MDS_STRIPE_FID 0x189
6800 for fail_loc in 0x80000188 0x80000189; do
6801 do_facet mds1 "$LCTL set_param fail_loc=$fail_loc"
6802 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir-$fail_loc ||
6803 error "mkdir $dir-$fail_loc failed"
6804 for i in {0..10}; do
6805 # create may fail on missing stripe
6806 echo $i > $DIR/$tdir-$fail_loc/$i
6808 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6809 error "getdirstripe $tdir-$fail_loc failed"
6810 $LFS migrate -m 1 $DIR/$tdir-$fail_loc ||
6811 error "migrate $tdir-$fail_loc failed"
6812 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6813 error "getdirstripe $tdir-$fail_loc failed"
6814 pushd $DIR/$tdir-$fail_loc
6816 echo $f | cmp $f - || error "$f data mismatch"
6819 rm -rf $DIR/$tdir-$fail_loc
6822 run_test 60h "striped directory with missing stripes can be accessed"
6825 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6828 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1 || error "dd $f failed"
6829 cancel_lru_locks osc
6830 $MULTIOP $f OSMWUc || error "$MULTIOP $f failed"
6833 run_test 61a "mmap() writes don't make sync hang ================"
6836 mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
6838 run_test 61b "mmap() of unstriped file is successful"
6840 # bug 2330 - insufficient obd_match error checking causes LBUG
6842 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6846 cancel_lru_locks osc
6847 lctl set_param fail_loc=0x405
6848 cat $f && error "cat succeeded, expect -EIO"
6849 lctl set_param fail_loc=0
6851 # This test is now irrelevant (as of bug 10718 inclusion), we no longer
6852 # match every page all of the time.
6853 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
6855 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
6856 # Though this test is irrelevant anymore, it helped to reveal some
6857 # other grant bugs (LU-4482), let's keep it.
6858 test_63a() { # was test_63
6859 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6861 MAX_DIRTY_MB=$(lctl get_param -n osc.*.max_dirty_mb | head -n 1)
6863 for i in `seq 10` ; do
6864 dd if=/dev/zero of=$DIR/f63 bs=8k &
6870 rm -f $DIR/f63 || true
6872 run_test 63a "Verify oig_wait interruption does not crash ======="
6874 # bug 2248 - async write errors didn't return to application on sync
6875 # bug 3677 - async write errors left page locked
6877 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6880 lctl set_param debug=-1
6882 # ensure we have a grant to do async writes
6883 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
6886 sync # sync lest earlier test intercept the fail_loc
6888 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
6889 lctl set_param fail_loc=0x80000406
6890 $MULTIOP $DIR/$tfile Owy && \
6891 error "sync didn't return ENOMEM"
6892 sync; sleep 2; sync # do a real sync this time to flush page
6893 lctl get_param -n llite.*.dump_page_cache | grep locked && \
6894 error "locked page left in cache after async error" || true
6897 run_test 63b "async write errors should be returned to fsync ==="
6900 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6903 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
6905 run_test 64a "verify filter grant calculations (in kernel) ====="
6908 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6910 sh oos.sh $MOUNT || error "oos.sh failed: $?"
6912 run_test 64b "check out-of-space detection on client"
6915 $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
6917 run_test 64c "verify grant shrink"
6919 # this does exactly what osc_request.c:osc_announce_cached() does in
6920 # order to calculate max amount of grants to ask from server
6924 local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc)
6925 local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight)
6927 ((rpc_in_flight ++));
6928 nrpages=$((nrpages * rpc_in_flight))
6930 local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb)
6932 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
6934 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
6935 local undirty=$((nrpages * PAGE_SIZE))
6937 local max_extent_pages
6938 max_extent_pages=$($LCTL get_param osc.${tgt}.import |
6939 grep grant_max_extent_size | awk '{print $2}')
6940 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
6941 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
6942 local grant_extent_tax
6943 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
6944 grep grant_extent_tax | awk '{print $2}')
6946 undirty=$((undirty + nrextents * grant_extent_tax))
6951 # this is size of unit for grant allocation. It should be equal to
6952 # what tgt_grant.c:tgt_grant_chunk() calculates
6956 local grant_extent_tax
6958 max_brw_size=$($LCTL get_param osc.${tgt}.import |
6959 grep max_brw_size | awk '{print $2}')
6961 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
6962 grep grant_extent_tax | awk '{print $2}')
6964 echo $(((max_brw_size + grant_extent_tax) * 2))
6968 [ $OST1_VERSION -lt $(version_code 2.10.56) ] &&
6969 skip "OST < 2.10.55 doesn't limit grants enough"
6971 local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}')
6972 local file=$DIR/$tfile
6974 [[ $($LCTL get_param osc.${tgt}.import |
6975 grep "connect_flags:.*grant_param") ]] ||
6976 skip "no grant_param connect flag"
6978 local olddebug=$($LCTL get_param -n debug 2> /dev/null)
6980 $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true
6982 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
6983 stack_trap "rm -f $file" EXIT
6985 $SETSTRIPE $file -i 0 -c 1
6986 dd if=/dev/zero of=$file bs=1M count=1000 &
6991 local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes)
6992 if [[ $cur_grant -gt $max_cur_granted ]]
6995 error "cur_grant $cur_grant > $max_cur_granted"
6998 [[ $? -ne 0 ]] && break;
7003 wait_delete_completed
7004 $LCTL set_param debug="$olddebug" 2> /dev/null || true
7006 run_test 64d "check grant limit exceed"
7008 # bug 1414 - set/get directories' stripe info
7010 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7012 test_mkdir $DIR/$tdir
7014 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
7016 run_test 65a "directory with no stripe info"
7019 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7021 test_mkdir $DIR/$tdir
7022 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7024 $SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7027 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
7029 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
7032 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7033 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
7035 test_mkdir $DIR/$tdir
7036 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
7038 $LFS setstripe -S $((stripesize * 4)) -i 1 \
7039 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
7041 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
7043 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
7046 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7048 test_mkdir $DIR/$tdir
7049 local STRIPECOUNT=$($GETSTRIPE -c $DIR/$tdir)
7050 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7052 if [[ $STRIPECOUNT -le 0 ]]; then
7054 elif [[ $STRIPECOUNT -gt 2000 ]]; then
7055 #LOV_MAX_STRIPE_COUNT is 2000
7056 [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1))
7058 sc=$(($STRIPECOUNT - 1))
7060 $SETSTRIPE -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
7061 touch $DIR/$tdir/f4 $DIR/$tdir/f5
7062 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
7063 error "lverify failed"
7065 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
7068 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7070 test_mkdir $DIR/$tdir
7072 $SETSTRIPE $DIR/$tdir || error "setstripe"
7073 $GETSTRIPE -v $DIR/$tdir | grep "Default" ||
7074 error "no stripe info failed"
7076 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
7078 run_test 65e "directory setstripe defaults"
7081 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7083 test_mkdir $DIR/${tdir}f
7084 $RUNAS $SETSTRIPE $DIR/${tdir}f && error "setstripe succeeded" || true
7086 run_test 65f "dir setstripe permission (should return error) ==="
7089 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7091 test_mkdir $DIR/$tdir
7092 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7094 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7095 error "setstripe -S failed"
7096 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
7097 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7098 error "delete default stripe failed"
7100 run_test 65g "directory setstripe -d"
7103 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7105 test_mkdir $DIR/$tdir
7106 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7108 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7109 error "setstripe -S failed"
7110 test_mkdir $DIR/$tdir/dd1
7111 [ $($LFS getstripe -c $DIR/$tdir) = $($GETSTRIPE -c $DIR/$tdir/dd1) ] ||
7112 error "stripe info inherit failed"
7114 run_test 65h "directory stripe info inherit ===================="
7117 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7119 save_layout_restore_at_exit $MOUNT
7121 # bug6367: set non-default striping on root directory
7122 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
7124 # bug12836: getstripe on -1 default directory striping
7125 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
7127 # bug12836: getstripe -v on -1 default directory striping
7128 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
7130 # bug12836: new find on -1 default directory striping
7131 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
7133 run_test 65i "various tests to set root directory striping"
7135 test_65j() { # bug6367
7136 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7140 # if we aren't already remounting for each test, do so for this test
7141 if [ "$CLEANUP" = ":" -a "$I_MOUNTED" = "yes" ]; then
7142 cleanup || error "failed to unmount"
7146 save_layout_restore_at_exit $MOUNT
7148 $SETSTRIPE -d $MOUNT || error "setstripe failed"
7150 run_test 65j "set default striping on root directory (bug 6367)="
7154 wait_delete_completed
7155 do_facet $SINGLEMDS "lctl set_param -n \
7156 osp.$ost*MDT0000.max_create_count=$max_count"
7157 do_facet $SINGLEMDS "lctl set_param -n \
7158 osp.$ost*MDT0000.create_count=$count"
7159 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7160 echo $INACTIVE_OSC "is Activate"
7162 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7165 test_65k() { # bug11679
7166 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7167 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7168 remote_mds_nodsh && skip "remote MDS with nodsh"
7170 local disable_precreate=true
7171 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
7172 disable_precreate=false
7174 echo "Check OST status: "
7175 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
7176 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
7178 for OSC in $MDS_OSCS; do
7179 echo $OSC "is active"
7180 do_facet $SINGLEMDS lctl --device %$OSC activate
7183 for INACTIVE_OSC in $MDS_OSCS; do
7184 local ost=$(osc_to_ost $INACTIVE_OSC)
7185 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
7186 lov.*md*.target_obd |
7187 awk -F: /$ost/'{ print $1 }' | head -n 1)
7190 $SETSTRIPE -i $ostnum -c 1 $DIR/$tdir
7191 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
7193 echo "Deactivate: " $INACTIVE_OSC
7194 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
7196 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
7197 osp.$ost*MDT0000.create_count")
7198 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
7199 osp.$ost*MDT0000.max_create_count")
7200 $disable_precreate &&
7201 do_facet $SINGLEMDS "lctl set_param -n \
7202 osp.$ost*MDT0000.max_create_count=0"
7204 for idx in $(seq 0 $((OSTCOUNT - 1))); do
7205 [ -f $DIR/$tdir/$idx ] && continue
7206 echo "$SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx"
7207 $SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx ||
7209 error "setstripe $idx should succeed"; }
7210 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
7212 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
7215 do_facet $SINGLEMDS "lctl set_param -n \
7216 osp.$ost*MDT0000.max_create_count=$max_count"
7217 do_facet $SINGLEMDS "lctl set_param -n \
7218 osp.$ost*MDT0000.create_count=$count"
7219 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7220 echo $INACTIVE_OSC "is Activate"
7222 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7225 run_test 65k "validate manual striping works properly with deactivated OSCs"
7227 test_65l() { # bug 12836
7228 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7230 test_mkdir -p $DIR/$tdir/test_dir
7231 $SETSTRIPE -c -1 $DIR/$tdir/test_dir
7232 $LFS find -mtime -1 $DIR/$tdir >/dev/null
7234 run_test 65l "lfs find on -1 stripe dir ========================"
7237 local layout=$(save_layout $MOUNT)
7238 $RUNAS $SETSTRIPE -c 2 $MOUNT && {
7239 restore_layout $MOUNT $layout
7240 error "setstripe should fail by non-root users"
7244 run_test 65m "normal user can't set filesystem default stripe"
7247 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.0) ]] ||
7248 skip "Need MDS version at least 2.12.0"
7249 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7251 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7252 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7253 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7255 local root_layout=$(save_layout $MOUNT)
7256 stack_trap "restore_layout $MOUNT $root_layout" EXIT
7258 # new subdirectory under root directory should not inherit
7259 # the default layout from root
7260 local dir1=$MOUNT/$tdir-1
7261 mkdir $dir1 || error "mkdir $dir1 failed"
7262 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7263 error "$dir1 shouldn't have LOV EA"
7265 # delete the default layout on root directory
7266 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7268 local dir2=$MOUNT/$tdir-2
7269 mkdir $dir2 || error "mkdir $dir2 failed"
7270 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7271 error "$dir2 shouldn't have LOV EA"
7273 # set a new striping pattern on root directory
7274 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7275 local new_def_stripe_size=$((def_stripe_size * 2))
7276 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7277 error "set stripe size on $MOUNT failed"
7279 # new file created in $dir2 should inherit the new stripe size from
7280 # the filesystem default
7281 local file2=$dir2/$tfile-2
7282 touch $file2 || error "touch $file2 failed"
7284 local file2_stripe_size=$($LFS getstripe -S $file2)
7285 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7286 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7288 local dir3=$MOUNT/$tdir-3
7289 mkdir $dir3 || error "mkdir $dir3 failed"
7290 # $dir3 shouldn't have LOV EA, but "lfs getstripe -d $dir3" should show
7291 # the root layout, which is the actual default layout that will be used
7292 # when new files are created in $dir3.
7293 local dir3_layout=$(get_layout_param $dir3)
7294 local root_dir_layout=$(get_layout_param $MOUNT)
7295 [[ "$dir3_layout" = "$root_dir_layout" ]] ||
7296 error "$dir3 should show the default layout from $MOUNT"
7298 # set OST pool on root directory
7299 local pool=$TESTNAME
7300 pool_add $pool || error "add $pool failed"
7301 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7302 error "add targets to $pool failed"
7304 $LFS setstripe -p $pool $MOUNT ||
7305 error "set OST pool on $MOUNT failed"
7307 # new file created in $dir3 should inherit the pool from
7308 # the filesystem default
7309 local file3=$dir3/$tfile-3
7310 touch $file3 || error "touch $file3 failed"
7312 local file3_pool=$($LFS getstripe -p $file3)
7313 [[ "$file3_pool" = "$pool" ]] ||
7314 error "$file3 didn't inherit OST pool $pool"
7316 local dir4=$MOUNT/$tdir-4
7317 mkdir $dir4 || error "mkdir $dir4 failed"
7318 local dir4_layout=$(get_layout_param $dir4)
7319 root_dir_layout=$(get_layout_param $MOUNT)
7320 echo "$LFS getstripe -d $dir4"
7321 $LFS getstripe -d $dir4
7322 echo "$LFS getstripe -d $MOUNT"
7323 $LFS getstripe -d $MOUNT
7324 [[ "$dir4_layout" = "$root_dir_layout" ]] ||
7325 error "$dir4 should show the default layout from $MOUNT"
7327 # new file created in $dir4 should inherit the pool from
7328 # the filesystem default
7329 local file4=$dir4/$tfile-4
7330 touch $file4 || error "touch $file4 failed"
7332 local file4_pool=$($LFS getstripe -p $file4)
7333 [[ "$file4_pool" = "$pool" ]] ||
7334 error "$file4 didn't inherit OST pool $pool"
7336 # new subdirectory under non-root directory should inherit
7337 # the default layout from its parent directory
7338 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7339 error "set directory layout on $dir4 failed"
7341 local dir5=$dir4/$tdir-5
7342 mkdir $dir5 || error "mkdir $dir5 failed"
7344 dir4_layout=$(get_layout_param $dir4)
7345 local dir5_layout=$(get_layout_param $dir5)
7346 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7347 error "$dir5 should inherit the default layout from $dir4"
7349 # though subdir under ROOT doesn't inherit default layout, but
7350 # its sub dir/file should be created with default layout.
7351 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
7352 [[ $MDS1_VERSION -ge $(version_code 2.12.59) ]] ||
7353 [[ $MDS1_VERSION -ge $(version_code 2.12.3) &&
7354 $MDS1_VERSION -lt $(version_code 2.12.50) ]] ||
7355 skip "Need MDS version at least 2.12.3 or 2.12.59"
7357 local default_lmv_count=$($LFS getdirstripe -D -c $MOUNT)
7358 local default_lmv_index=$($LFS getdirstripe -D -i $MOUNT)
7359 local default_lmv_hash=$($LFS getdirstripe -D -H $MOUNT)
7361 if [ $default_lmv_hash == "none" ]; then
7362 stack_trap "$LFS setdirstripe -D -d $MOUNT" EXIT
7364 stack_trap "$LFS setdirstripe -D -i $default_lmv_index \
7365 -c $default_lmv_count -H $default_lmv_hash $MOUNT" EXIT
7368 $LFS setdirstripe -D -c 2 $MOUNT ||
7369 error "setdirstripe -D -c 2 failed"
7370 mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed"
7371 local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6)
7372 [ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count"
7374 run_test 65n "don't inherit default layout from root for new subdirectories"
7376 # bug 2543 - update blocks count on client
7378 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7381 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7382 sync; sync_all_data; sync; sync_all_data
7383 cancel_lru_locks osc
7384 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7385 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7387 run_test 66 "update inode blocks count on client ==============="
7390 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7394 swapon -s | awk '($1 == "'$1'") { print $4 }'
7397 # bug5265, obdfilter oa2dentry return -ENOENT
7398 # #define OBD_FAIL_SRV_ENOENT 0x217
7400 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7401 remote_ost_nodsh && skip "remote OST with nodsh"
7404 $SETSTRIPE -c 1 -i 0 $f
7406 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
7408 do_facet ost1 lctl set_param fail_loc=0x217
7409 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
7410 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
7412 do_facet ost1 lctl set_param fail_loc=0
7413 $DIRECTIO write $f 0 2 || error "write error"
7415 cancel_lru_locks osc
7416 $DIRECTIO read $f 0 1 || error "read error"
7418 do_facet ost1 lctl set_param fail_loc=0x217
7419 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
7421 do_facet ost1 lctl set_param fail_loc=0
7424 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
7427 test_mkdir $DIR/$tdir
7428 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
7429 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
7431 run_test 71 "Running dbench on lustre (don't segment fault) ===="
7433 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
7434 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7435 [ "$RUNAS_ID" = "$UID" ] &&
7436 skip_env "RUNAS_ID = UID = $UID -- skipping"
7437 # Check that testing environment is properly set up. Skip if not
7438 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
7439 skip_env "User $RUNAS_ID does not exist - skipping"
7442 chmod 777 $DIR/$tfile
7443 chmod ug+s $DIR/$tfile
7444 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
7445 error "$RUNAS dd $DIR/$tfile failed"
7446 # See if we are still setuid/sgid
7447 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7448 error "S/gid is not dropped on write"
7449 # Now test that MDS is updated too
7450 cancel_lru_locks mdc
7451 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7452 error "S/gid is not dropped on MDS"
7455 run_test 72a "Test that remove suid works properly (bug5695) ===="
7457 test_72b() { # bug 24226 -- keep mode setting when size is not changing
7460 [ "$RUNAS_ID" = "$UID" ] &&
7461 skip_env "RUNAS_ID = UID = $UID -- skipping"
7462 [ "$RUNAS_ID" -eq 0 ] &&
7463 skip_env "RUNAS_ID = 0 -- skipping"
7464 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7465 # Check that testing environment is properly set up. Skip if not
7466 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
7467 skip_env "User $RUNAS_ID does not exist - skipping"
7469 touch $DIR/${tfile}-f{g,u}
7470 test_mkdir $DIR/${tfile}-dg
7471 test_mkdir $DIR/${tfile}-du
7472 chmod 770 $DIR/${tfile}-{f,d}{g,u}
7473 chmod g+s $DIR/${tfile}-{f,d}g
7474 chmod u+s $DIR/${tfile}-{f,d}u
7475 for perm in 777 2777 4777; do
7476 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
7477 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
7478 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
7479 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
7483 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
7485 # bug 3462 - multiple simultaneous MDC requests
7487 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7489 test_mkdir $DIR/d73-1
7490 test_mkdir $DIR/d73-2
7491 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
7494 lctl set_param fail_loc=0x80000129
7495 $MULTIOP $DIR/d73-1/f73-2 Oc &
7497 lctl set_param fail_loc=0
7499 $MULTIOP $DIR/d73-2/f73-3 Oc &
7503 wait $pid1 || return 1
7507 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
7508 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
7509 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
7513 run_test 73 "multiple MDC requests (should not deadlock)"
7515 test_74a() { # bug 6149, 6184
7516 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7519 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7521 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7522 # will spin in a tight reconnection loop
7523 $LCTL set_param fail_loc=0x8000030e
7524 # get any lock that won't be difficult - lookup works.
7526 $LCTL set_param fail_loc=0
7530 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
7532 test_74b() { # bug 13310
7533 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7535 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7537 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7538 # will spin in a tight reconnection loop
7539 $LCTL set_param fail_loc=0x8000030e
7540 # get a "difficult" lock
7542 $LCTL set_param fail_loc=0
7546 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
7549 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7551 #define OBD_FAIL_LDLM_NEW_LOCK
7552 $LCTL set_param fail_loc=0x319
7553 touch $DIR/$tfile && error "touch successful"
7554 $LCTL set_param fail_loc=0
7557 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
7560 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
7563 test_76() { # Now for bug 20433, added originally in bug 1443
7564 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7566 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
7568 cancel_lru_locks osc
7569 BEFORE_INODES=$(num_inodes)
7570 echo "before inodes: $BEFORE_INODES"
7572 [ "$SLOW" = "no" ] && COUNT=100
7573 for i in $(seq $COUNT); do
7577 cancel_lru_locks osc
7578 AFTER_INODES=$(num_inodes)
7579 echo "after inodes: $AFTER_INODES"
7581 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
7583 AFTER_INODES=$(num_inodes)
7585 echo "wait $wait seconds inodes: $AFTER_INODES"
7586 if [ $wait -gt 30 ]; then
7587 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
7591 run_test 76 "confirm clients recycle inodes properly ===="
7597 # Note: in sptlrpc modes which enable its own bulk checksum, the
7598 # original crc32_le bulk checksum will be automatically disabled,
7599 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
7600 # will be checked by sptlrpc code against sptlrpc bulk checksum.
7601 # In this case set_checksums() will not be no-op, because sptlrpc
7602 # bulk checksum will be enabled all through the test.
7604 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
7605 lctl set_param -n osc.*.checksums $1
7609 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7610 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
7611 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7612 tr -d [] | head -n1)}
7615 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
7616 log "set checksum type to $1"
7619 F77_TMP=$TMP/f77-temp
7622 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
7623 error "error writing to $F77_TMP"
7626 test_77a() { # bug 10889
7627 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7628 $GSS && skip_env "could not run with gss"
7630 [ ! -f $F77_TMP ] && setup_f77
7632 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
7636 run_test 77a "normal checksum read/write operation"
7638 test_77b() { # bug 10889
7639 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7640 $GSS && skip_env "could not run with gss"
7642 [ ! -f $F77_TMP ] && setup_f77
7643 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7644 $LCTL set_param fail_loc=0x80000409
7647 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7648 error "dd error: $?"
7649 $LCTL set_param fail_loc=0
7651 for algo in $CKSUM_TYPES; do
7652 cancel_lru_locks osc
7653 set_checksum_type $algo
7654 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7655 $LCTL set_param fail_loc=0x80000408
7656 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
7657 $LCTL set_param fail_loc=0
7660 set_checksum_type $ORIG_CSUM_TYPE
7663 run_test 77b "checksum error on client write, read"
7668 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
7670 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
7671 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
7672 $check_ost && [ -n "$ost_file_prefix" ] &&
7673 do_facet ost1 rm -f ${ost_file_prefix}\*
7677 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7678 $GSS && skip_env "could not run with gss"
7679 remote_ost_nodsh && skip "remote OST with nodsh"
7682 local osc_file_prefix
7684 local check_ost=false
7685 local ost_file_prefix
7691 # ensure corruption will occur on first OSS/OST
7692 $LFS setstripe -i 0 $DIR/$tfile
7694 [ ! -f $F77_TMP ] && setup_f77
7695 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7696 error "dd write error: $?"
7697 fid=$($LFS path2fid $DIR/$tfile)
7699 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
7702 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
7703 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
7705 echo "OSS do not support bulk pages dump upon error"
7708 osc_file_prefix=$($LCTL get_param -n debug_path)
7709 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
7711 trap cleanup_77c EXIT
7714 # enable bulk pages dump upon error on Client
7715 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
7716 # enable bulk pages dump upon error on OSS
7718 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
7720 # flush Client cache to allow next read to reach OSS
7721 cancel_lru_locks osc
7723 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7724 $LCTL set_param fail_loc=0x80000408
7725 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
7726 $LCTL set_param fail_loc=0
7730 # check cksum dump on Client
7731 osc_file=$(ls ${osc_file_prefix}*)
7732 [ -n "$osc_file" ] || error "no checksum dump file on Client"
7733 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
7734 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
7735 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
7736 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
7738 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
7739 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7740 error "dump content does not match on Client"
7742 $check_ost || skip "No need to check cksum dump on OSS"
7744 # check cksum dump on OSS
7745 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
7746 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
7747 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
7748 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
7749 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7750 error "dump content does not match on OSS"
7754 run_test 77c "checksum error on client read with debug"
7756 test_77d() { # bug 10889
7757 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7758 $GSS && skip_env "could not run with gss"
7760 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7761 $LCTL set_param fail_loc=0x80000409
7763 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7764 error "direct write: rc=$?"
7765 $LCTL set_param fail_loc=0
7768 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7769 $LCTL set_param fail_loc=0x80000408
7771 cancel_lru_locks osc
7772 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7773 error "direct read: rc=$?"
7774 $LCTL set_param fail_loc=0
7777 run_test 77d "checksum error on OST direct write, read"
7779 test_77f() { # bug 10889
7780 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7781 $GSS && skip_env "could not run with gss"
7784 for algo in $CKSUM_TYPES; do
7785 cancel_lru_locks osc
7786 set_checksum_type $algo
7787 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7788 $LCTL set_param fail_loc=0x409
7789 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
7790 error "direct write succeeded"
7791 $LCTL set_param fail_loc=0
7793 set_checksum_type $ORIG_CSUM_TYPE
7796 run_test 77f "repeat checksum error on write (expect error)"
7798 test_77g() { # bug 10889
7799 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7800 $GSS && skip_env "could not run with gss"
7801 remote_ost_nodsh && skip "remote OST with nodsh"
7803 [ ! -f $F77_TMP ] && setup_f77
7805 local file=$DIR/$tfile
7806 stack_trap "rm -f $file" EXIT
7808 $SETSTRIPE -c 1 -i 0 $file
7809 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
7810 do_facet ost1 lctl set_param fail_loc=0x8000021a
7812 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
7813 error "write error: rc=$?"
7814 do_facet ost1 lctl set_param fail_loc=0
7817 cancel_lru_locks osc
7818 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
7819 do_facet ost1 lctl set_param fail_loc=0x8000021b
7821 cmp $F77_TMP $file || error "file compare failed"
7822 do_facet ost1 lctl set_param fail_loc=0
7825 run_test 77g "checksum error on OST write, read"
7827 test_77k() { # LU-10906
7828 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7829 $GSS && skip_env "could not run with gss"
7831 local cksum_param="osc.$FSNAME*.checksums"
7832 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
7836 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
7837 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
7838 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
7842 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
7843 error "failed to set checksum=$i on MGS"
7844 wait_update $HOSTNAME "$get_checksum" $i
7846 echo "remount client, checksum should be $i"
7847 remount_client $MOUNT || "failed to remount client"
7848 checksum=$(eval $get_checksum)
7849 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7852 for opt in "checksum" "nochecksum"; do
7853 #remount with mount option
7854 echo "remount client with option $opt, checksum should be $i"
7855 umount_client $MOUNT || "failed to umount client"
7856 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
7857 "failed to mount client with option '$opt'"
7858 checksum=$(eval $get_checksum)
7859 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7863 remount_client $MOUNT || "failed to remount client"
7865 run_test 77k "enable/disable checksum correctly"
7867 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
7876 test_78() { # bug 10901
7877 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7878 remote_ost || skip_env "local OST"
7881 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
7882 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
7883 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
7884 echo "MemTotal: $MEMTOTAL"
7886 # reserve 256MB of memory for the kernel and other running processes,
7887 # and then take 1/2 of the remaining memory for the read/write buffers.
7888 if [ $MEMTOTAL -gt 512 ] ;then
7889 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
7891 # for those poor memory-starved high-end clusters...
7892 MEMTOTAL=$((MEMTOTAL / 2))
7894 echo "Mem to use for directio: $MEMTOTAL"
7896 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
7897 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
7898 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
7899 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
7901 echo "Smallest OST: $SMALLESTOST"
7902 [[ $SMALLESTOST -lt 10240 ]] &&
7903 skip "too small OSTSIZE, useless to run large O_DIRECT test"
7905 trap cleanup_test_78 EXIT
7907 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
7908 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
7910 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
7911 echo "File size: $F78SIZE"
7912 $SETSTRIPE -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
7913 for i in $(seq 1 $NSEQ); do
7914 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
7915 echo directIO rdwr round $i of $NSEQ
7916 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
7921 run_test 78 "handle large O_DIRECT writes correctly ============"
7923 test_79() { # bug 12743
7924 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7926 wait_delete_completed
7928 BKTOTAL=$(calc_osc_kbytes kbytestotal)
7929 BKFREE=$(calc_osc_kbytes kbytesfree)
7930 BKAVAIL=$(calc_osc_kbytes kbytesavail)
7932 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
7933 DFTOTAL=`echo $STRING | cut -d, -f1`
7934 DFUSED=`echo $STRING | cut -d, -f2`
7935 DFAVAIL=`echo $STRING | cut -d, -f3`
7936 DFFREE=$(($DFTOTAL - $DFUSED))
7938 ALLOWANCE=$((64 * $OSTCOUNT))
7940 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
7941 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
7942 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
7944 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
7945 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
7946 error "df free($DFFREE) mismatch OST free($BKFREE)"
7948 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
7949 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
7950 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
7953 run_test 79 "df report consistency check ======================="
7955 test_80() { # bug 10718
7956 remote_ost_nodsh && skip "remote OST with nodsh"
7957 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7959 # relax strong synchronous semantics for slow backends like ZFS
7960 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
7961 local soc="obdfilter.*.sync_lock_cancel"
7962 local save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
7964 # "sync_on_lock_cancel" was broken by v2_11_55_0-26-g7059644e9a
7965 if [ -z "$save" ]; then
7966 soc="obdfilter.*.sync_on_lock_cancel"
7967 save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
7970 if [ "$save" != "never" ]; then
7971 local hosts=$(comma_list $(osts_nodes))
7973 do_nodes $hosts $LCTL set_param $soc=never
7974 stack_trap "do_nodes $hosts $LCTL set_param $soc=$save"
7978 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
7980 local before=$(date +%s)
7981 cancel_lru_locks osc
7982 local after=$(date +%s)
7983 local diff=$((after - before))
7984 [ $diff -le 1 ] || error "elapsed for 1M@1T = $diff"
7988 run_test 80 "Page eviction is equally fast at high offsets too"
7990 test_81a() { # LU-456
7991 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7992 remote_ost_nodsh && skip "remote OST with nodsh"
7994 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
7995 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
7996 do_facet ost1 lctl set_param fail_loc=0x80000228
7998 # write should trigger a retry and success
7999 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
8000 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8002 if [ $RC -ne 0 ] ; then
8003 error "write should success, but failed for $RC"
8006 run_test 81a "OST should retry write when get -ENOSPC ==============="
8008 test_81b() { # LU-456
8009 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8010 remote_ost_nodsh && skip "remote OST with nodsh"
8012 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8013 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
8014 do_facet ost1 lctl set_param fail_loc=0x228
8016 # write should retry several times and return -ENOSPC finally
8017 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
8018 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8021 if [ $RC -ne $ENOSPC ] ; then
8022 error "dd should fail for -ENOSPC, but succeed."
8025 run_test 81b "OST should return -ENOSPC when retry still fails ======="
8027 test_82() { # LU-1031
8028 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
8032 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
8034 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
8036 kill -USR1 $MULTIPID2
8038 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
8039 error "First grouplock does not block second one"
8041 echo "Second grouplock blocks first one"
8043 kill -USR1 $MULTIPID1
8047 run_test 82 "Basic grouplock test"
8050 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
8052 test_mkdir $DIR/$tdir.cvsroot
8053 chown $RUNAS_ID $DIR/$tdir.cvsroot
8056 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
8059 # some versions of cvs import exit(1) when asked to import links or
8060 # files they can't read. ignore those files.
8061 local toignore=$(find . -type l -printf '-I %f\n' -o \
8062 ! -perm /4 -printf '-I %f\n')
8063 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
8064 $tdir.reposname vtag rtag
8067 test_mkdir $DIR/$tdir.reposname
8068 chown $RUNAS_ID $DIR/$tdir.reposname
8069 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
8071 cd $DIR/$tdir.reposname
8073 $RUNAS cvs add -m 'addmsg' foo99
8075 $RUNAS cvs commit -m 'nomsg' foo99
8076 rm -fr $DIR/$tdir.cvsroot
8078 run_test 99 "cvs strange file/directory operations"
8081 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8082 [[ "$NETTYPE" =~ tcp ]] ||
8083 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
8084 remote_ost_nodsh && skip "remote OST with nodsh"
8085 remote_mds_nodsh && skip "remote MDS with nodsh"
8087 skip "useless for local single node setup"
8089 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
8090 [ "$PROT" != "tcp" ] && continue
8091 RPORT=$(echo $REMOTE | cut -d: -f2)
8092 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
8095 LPORT=`echo $LOCAL | cut -d: -f2`
8096 if [ $LPORT -ge 1024 ]; then
8097 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
8099 error_exit "local: $LPORT > 1024, remote: $RPORT"
8102 [ "$rc" = 0 ] || error_exit "privileged port not found" )
8104 run_test 100 "check local port using privileged port ==========="
8106 function get_named_value()
8115 echo $line | sed "s/^$tag[ ]*//"
8122 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
8123 awk '/^max_cached_mb/ { print $2 }')
8126 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
8131 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8132 [ $MDSCOUNT -ge 2 ] && skip_env "needs < 2 MDTs" #LU-4322
8137 local cache_limit=32
8139 $LCTL set_param -n osc.*-osc*.rpc_stats 0
8140 trap cleanup_101a EXIT
8141 $LCTL set_param -n llite.*.read_ahead_stats 0
8142 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
8145 # randomly read 10000 of 64K chunks from file 3x 32MB in size
8147 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
8148 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
8151 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
8152 get_named_value 'read but discarded' | cut -d" " -f1); do
8153 discard=$(($discard + $s))
8157 if [[ $(($discard * 10)) -gt $nreads ]]; then
8158 $LCTL get_param osc.*-osc*.rpc_stats
8159 $LCTL get_param llite.*.read_ahead_stats
8160 error "too many ($discard) discarded pages"
8162 rm -f $DIR/$tfile || true
8164 run_test 101a "check read-ahead for random reads"
8167 test_mkdir $DIR/$tdir
8168 local STRIPE_SIZE=$1
8169 local FILE_LENGTH=$2
8172 local FILE_SIZE_MB=$((FILE_LENGTH / STRIPE_SIZE))
8174 local list=$(comma_list $(osts_nodes))
8175 set_osd_param $list '' read_cache_enable 0
8176 set_osd_param $list '' writethrough_cache_enable 0
8178 trap cleanup_test101bc EXIT
8179 # prepare the read-ahead file
8180 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
8182 dd if=/dev/zero of=$DIR/$tfile bs=$STRIPE_SIZE \
8183 count=$FILE_SIZE_MB 2> /dev/null
8187 cleanup_test101bc() {
8192 local list=$(comma_list $(osts_nodes))
8193 set_osd_param $list '' read_cache_enable 1
8194 set_osd_param $list '' writethrough_cache_enable 1
8198 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
8203 local STRIPE_SIZE=$2
8204 local FILE_LENGTH=$3
8205 local RA_INC=1048576
8206 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
8207 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
8208 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
8209 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
8210 get_named_value 'read but discarded' |
8211 cut -d" " -f1 | calc_total)
8212 if [[ $DISCARD -gt $discard_limit ]]; then
8213 $LCTL get_param llite.*.read_ahead_stats
8214 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
8216 echo "Read-ahead success for size ${READ_SIZE}"
8221 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8222 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8224 local STRIPE_SIZE=1048576
8225 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
8227 if [ $SLOW == "yes" ]; then
8228 local FILE_LENGTH=$((STRIDE_SIZE * 64))
8230 local FILE_LENGTH=$((STRIDE_SIZE * 8))
8233 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
8235 # prepare the read-ahead file
8236 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8237 cancel_lru_locks osc
8238 for BIDX in 2 4 8 16 32 64 128 256
8240 local BSIZE=$((BIDX*4096))
8241 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
8242 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
8243 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
8244 $LCTL set_param -n llite.*.read_ahead_stats 0
8245 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
8246 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
8247 cancel_lru_locks osc
8248 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
8253 run_test 101b "check stride-io mode read-ahead ================="
8256 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8258 local STRIPE_SIZE=1048576
8259 local FILE_LENGTH=$((STRIPE_SIZE*100))
8263 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8265 cancel_lru_locks osc
8266 $LCTL set_param osc.*.rpc_stats 0
8267 $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
8268 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8269 local stats=$($LCTL get_param -n $osc_rpc_stats)
8270 local lines=$(echo "$stats" | awk 'END {print NR;}')
8273 if [ $lines -le 20 ]; then
8276 for size in 1 2 4 8; do
8277 local rpc=$(echo "$stats" |
8278 awk '($1 == "'$size':") {print $2; exit; }')
8280 error "Small $((size*4))k read IO $rpc !"
8282 echo "$osc_rpc_stats check passed!"
8287 run_test 101c "check stripe_size aligned read-ahead ================="
8290 $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
8291 $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
8295 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8297 local file=$DIR/$tfile
8298 local sz_MB=${FILESIZE_101d:-500}
8299 local ra_MB=${READAHEAD_MB:-40}
8301 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8302 [ $free_MB -lt $sz_MB ] &&
8303 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8305 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8306 $SETSTRIPE -c -1 $file || error "setstripe failed"
8308 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8309 echo Cancel LRU locks on lustre client to flush the client cache
8310 cancel_lru_locks osc
8312 echo Disable read-ahead
8313 local old_READAHEAD=$(set_read_ahead 0)
8315 echo Reading the test file $file with read-ahead disabled
8316 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8318 echo Cancel LRU locks on lustre client to flush the client cache
8319 cancel_lru_locks osc
8320 echo Enable read-ahead with ${ra_MB}MB
8321 set_read_ahead $ra_MB
8323 echo Reading the test file $file with read-ahead enabled
8324 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8326 echo "read-ahead disabled time read $raOFF"
8327 echo "read-ahead enabled time read $raON"
8329 set_read_ahead $old_READAHEAD
8331 wait_delete_completed
8333 [ $raOFF -le 1 -o $raON -lt $raOFF ] ||
8334 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8336 run_test 101d "file read with and without read-ahead enabled"
8339 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8341 local file=$DIR/$tfile
8342 local size_KB=500 #KB
8346 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8347 local need_KB=$((count * size_KB))
8348 [[ $free_KB -le $need_KB ]] &&
8349 skip_env "Need free space $need_KB, have $free_KB"
8351 echo "Creating $count ${size_KB}K test files"
8352 for ((i = 0; i < $count; i++)); do
8353 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8356 echo "Cancel LRU locks on lustre client to flush the client cache"
8357 cancel_lru_locks $OSC
8359 echo "Reset readahead stats"
8360 $LCTL set_param -n llite.*.read_ahead_stats 0
8362 for ((i = 0; i < $count; i++)); do
8363 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
8366 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8367 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8369 for ((i = 0; i < $count; i++)); do
8370 rm -rf $file.$i 2>/dev/null
8373 #10000 means 20% reads are missing in readahead
8374 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
8376 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
8379 which iozone || skip_env "no iozone installed"
8381 local old_debug=$($LCTL get_param debug)
8382 old_debug=${old_debug#*=}
8383 $LCTL set_param debug="reada mmap"
8385 # create a test file
8386 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
8388 echo Cancel LRU locks on lustre client to flush the client cache
8389 cancel_lru_locks osc
8391 echo Reset readahead stats
8392 $LCTL set_param -n llite.*.read_ahead_stats 0
8394 echo mmap read the file with small block size
8395 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
8398 echo checking missing pages
8399 $LCTL get_param llite.*.read_ahead_stats
8400 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8401 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8403 $LCTL set_param debug="$old_debug"
8404 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
8407 run_test 101f "check mmap read performance"
8409 test_101g_brw_size_test() {
8411 local pages=$((mb * 1048576 / PAGE_SIZE))
8412 local file=$DIR/$tfile
8414 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
8415 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
8416 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
8417 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
8421 stack_trap "rm -f $file" EXIT
8422 $LCTL set_param -n osc.*.rpc_stats=0
8424 # 10 RPCs should be enough for the test
8426 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
8427 { error "dd write ${mb} MB blocks failed"; return 3; }
8428 cancel_lru_locks osc
8429 dd of=/dev/null if=$file bs=${mb}M count=$count ||
8430 { error "dd write ${mb} MB blocks failed"; return 4; }
8432 # calculate number of full-sized read and write RPCs
8433 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
8434 sed -n '/pages per rpc/,/^$/p' |
8435 awk '/'$pages':/ { reads += $2; writes += $6 }; \
8436 END { print reads,writes }'))
8437 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
8439 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
8446 remote_ost_nodsh && skip "remote OST with nodsh"
8449 local osts=$(get_facets OST)
8450 local list=$(comma_list $(osts_nodes))
8451 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
8452 local brw_size="obdfilter.*.brw_size"
8454 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8456 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
8457 if [ $OST1_VERSION -ge $(version_code 2.8.52) -o \
8458 \( $OST1_VERSION -ge $(version_code 2.7.17) -a \
8459 $OST1_VERSION -lt $(version_code 2.7.50) \) ] &&
8460 [ $CLIENT_VERSION -ge $(version_code 2.8.52) -o \
8461 \( $CLIENT_VERSION -ge $(version_code 2.7.17) -a \
8462 $CLIENT_VERSION -lt $(version_code 2.7.50) \) ]; then
8463 [ $OST1_VERSION -ge $(version_code 2.9.52) ] && suffix="M"
8464 if [[ $orig_mb -lt 16 ]]; then
8465 save_lustre_params $osts "$brw_size" > $p
8466 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
8467 error "set 16MB RPC size failed"
8469 echo "remount client to enable new RPC size"
8470 remount_client $MOUNT || error "remount_client failed"
8473 test_101g_brw_size_test 16 || error "16MB RPC test failed"
8474 # should be able to set brw_size=12, but no rpc_stats for that
8475 test_101g_brw_size_test 8 || error "8MB RPC test failed"
8478 test_101g_brw_size_test 4 || error "4MB RPC test failed"
8480 if [[ $orig_mb -lt 16 ]]; then
8481 restore_lustre_params < $p
8482 remount_client $MOUNT || error "remount_client restore failed"
8485 rm -f $p $DIR/$tfile
8487 run_test 101g "Big bulk(4/16 MiB) readahead"
8490 test_mkdir $DIR/$tdir
8491 chown $RUNAS_ID $DIR/$tdir
8494 STRIPE_COUNT=$OSTCOUNT
8495 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
8497 trap cleanup_test102 EXIT
8499 $1 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
8501 for num in 1 2 3 4; do
8502 for count in $(seq 1 $STRIPE_COUNT); do
8503 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
8504 local size=`expr $STRIPE_SIZE \* $num`
8505 local file=file"$num-$idx-$count"
8506 $1 $SETSTRIPE -S $size -i $idx -c $count $file
8512 $1 tar cf $TMP/f102.tar $tdir --xattrs
8518 rm -rf $DIR/d0.sanity/d102
8522 [ "$UID" != 0 ] && skip "must run as root"
8523 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
8524 skip_env "must have user_xattr"
8526 [ -z "$(which setfattr 2>/dev/null)" ] &&
8527 skip_env "could not find setfattr"
8529 local testfile=$DIR/$tfile
8532 echo "set/get xattr..."
8533 setfattr -n trusted.name1 -v value1 $testfile ||
8534 error "setfattr -n trusted.name1=value1 $testfile failed"
8535 getfattr -n trusted.name1 $testfile 2> /dev/null |
8536 grep "trusted.name1=.value1" ||
8537 error "$testfile missing trusted.name1=value1"
8539 setfattr -n user.author1 -v author1 $testfile ||
8540 error "setfattr -n user.author1=author1 $testfile failed"
8541 getfattr -n user.author1 $testfile 2> /dev/null |
8542 grep "user.author1=.author1" ||
8543 error "$testfile missing trusted.author1=author1"
8546 setfattr -n trusted.name2 -v value2 $testfile ||
8547 error "$testfile unable to set trusted.name2"
8548 setfattr -n trusted.name3 -v value3 $testfile ||
8549 error "$testfile unable to set trusted.name3"
8550 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
8551 grep "trusted.name" | wc -l) -eq 3 ] ||
8552 error "$testfile missing 3 trusted.name xattrs"
8554 setfattr -n user.author2 -v author2 $testfile ||
8555 error "$testfile unable to set user.author2"
8556 setfattr -n user.author3 -v author3 $testfile ||
8557 error "$testfile unable to set user.author3"
8558 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
8559 grep "user.author" | wc -l) -eq 3 ] ||
8560 error "$testfile missing 3 user.author xattrs"
8562 echo "remove xattr..."
8563 setfattr -x trusted.name1 $testfile ||
8564 error "$testfile error deleting trusted.name1"
8565 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
8566 error "$testfile did not delete trusted.name1 xattr"
8568 setfattr -x user.author1 $testfile ||
8569 error "$testfile error deleting user.author1"
8570 echo "set lustre special xattr ..."
8571 $LFS setstripe -c1 $testfile
8572 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
8573 awk -F "=" '/trusted.lov/ { print $2 }' )
8574 setfattr -n "trusted.lov" -v $lovea $testfile ||
8575 error "$testfile doesn't ignore setting trusted.lov again"
8576 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
8577 error "$testfile allow setting invalid trusted.lov"
8580 run_test 102a "user xattr test =================================="
8583 [ -z "$(which setfattr 2>/dev/null)" ] &&
8584 skip_env "could not find setfattr"
8585 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8587 # b10930: get/set/list trusted.lov xattr
8588 echo "get/set/list trusted.lov xattr ..."
8589 local testfile=$DIR/$tfile
8590 $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8591 error "setstripe failed"
8592 local STRIPECOUNT=$($GETSTRIPE -c $testfile) ||
8593 error "getstripe failed"
8594 getfattr -d -m "^trusted" $testfile 2>/dev/null | grep "trusted.lov" ||
8595 error "can't get trusted.lov from $testfile"
8597 local testfile2=${testfile}2
8598 local value=$(getfattr -n trusted.lov $testfile 2>/dev/null |
8599 grep "trusted.lov" | sed -e 's/[^=]\+=//')
8602 setfattr -n trusted.lov -v $value $testfile2
8603 local stripe_size=$($GETSTRIPE -S $testfile2)
8604 local stripe_count=$($GETSTRIPE -c $testfile2)
8605 [[ $stripe_size -eq 65536 ]] ||
8606 error "stripe size $stripe_size != 65536"
8607 [[ $stripe_count -eq $STRIPECOUNT ]] ||
8608 error "stripe count $stripe_count != $STRIPECOUNT"
8611 run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
8614 [ -z "$(which setfattr 2>/dev/null)" ] &&
8615 skip_env "could not find setfattr"
8616 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8618 # b10930: get/set/list lustre.lov xattr
8619 echo "get/set/list lustre.lov xattr ..."
8620 test_mkdir $DIR/$tdir
8621 chown $RUNAS_ID $DIR/$tdir
8622 local testfile=$DIR/$tdir/$tfile
8623 $RUNAS $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8624 error "setstripe failed"
8625 local STRIPECOUNT=$($RUNAS $GETSTRIPE -c $testfile) ||
8626 error "getstripe failed"
8627 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
8628 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
8630 local testfile2=${testfile}2
8631 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
8632 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
8634 $RUNAS $MCREATE $testfile2
8635 $RUNAS setfattr -n lustre.lov -v $value $testfile2
8636 local stripe_size=$($RUNAS $GETSTRIPE -S $testfile2)
8637 local stripe_count=$($RUNAS $GETSTRIPE -c $testfile2)
8638 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
8639 [ $stripe_count -eq $STRIPECOUNT ] ||
8640 error "stripe count $stripe_count != $STRIPECOUNT"
8642 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
8644 compare_stripe_info1() {
8645 local stripe_index_all_zero=true
8647 for num in 1 2 3 4; do
8648 for count in $(seq 1 $STRIPE_COUNT); do
8649 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
8650 local size=$((STRIPE_SIZE * num))
8651 local file=file"$num-$offset-$count"
8652 stripe_size=$($LFS getstripe -S $PWD/$file)
8653 [[ $stripe_size -ne $size ]] &&
8654 error "$file: size $stripe_size != $size"
8655 stripe_count=$($LFS getstripe -c $PWD/$file)
8656 # allow fewer stripes to be created, ORI-601
8657 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
8658 error "$file: count $stripe_count != $count"
8659 stripe_index=$($LFS getstripe -i $PWD/$file)
8660 [[ $stripe_index -ne 0 ]] &&
8661 stripe_index_all_zero=false
8665 $stripe_index_all_zero &&
8666 error "all files are being extracted starting from OST index 0"
8670 have_xattrs_include() {
8671 tar --help | grep -q xattrs-include &&
8672 echo --xattrs-include="lustre.*"
8676 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8677 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8679 XINC=$(have_xattrs_include)
8681 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8683 compare_stripe_info1
8685 run_test 102d "tar restore stripe info from tarfile,not keep osts"
8688 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8689 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8691 XINC=$(have_xattrs_include)
8693 test_mkdir $DIR/$tdir.restore
8695 tar cf - --xattrs $tdir | tar xf - \
8696 -C $DIR/$tdir.restore --xattrs $XINC
8697 cd $DIR/$tdir.restore/$tdir
8698 compare_stripe_info1
8700 run_test 102f "tar copy files, not keep osts"
8703 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
8704 skip "must have user_xattr"
8705 [ -z "$(which setfattr 2>/dev/null)" ] &&
8706 skip_env "could not find setfattr"
8707 [ -z "$(which getfattr 2>/dev/null)" ] &&
8708 skip_env "could not find getfattr"
8710 local xsize=${1:-1024} # in bytes
8711 local file=$DIR/$tfile
8712 local value="$(generate_string $xsize)"
8713 local xbig=trusted.big
8716 log "save $xbig on $file"
8717 setfattr -n $xbig -v $value $file ||
8718 error "saving $xbig on $file failed"
8720 local orig=$(get_xattr_value $xbig $file)
8721 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
8723 local xsml=trusted.sml
8724 log "save $xsml on $file"
8725 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
8727 local new=$(get_xattr_value $xbig $file)
8728 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
8730 log "grow $xsml on $file"
8731 setfattr -n $xsml -v "$value" $file ||
8732 error "growing $xsml on $file failed"
8734 new=$(get_xattr_value $xbig $file)
8735 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
8736 log "$xbig still valid after growing $xsml"
8741 test_102h() { # bug 15777
8744 run_test 102h "grow xattr from inside inode to external block"
8747 large_xattr_enabled || skip_env "ea_inode feature disabled"
8749 grow_xattr $(max_xattr_size)
8751 run_test 102ha "grow xattr from inside inode to external inode"
8753 test_102i() { # bug 17038
8754 [ -z "$(which getfattr 2>/dev/null)" ] &&
8755 skip "could not find getfattr"
8758 ln -s $DIR/$tfile $DIR/${tfile}link
8759 getfattr -n trusted.lov $DIR/$tfile ||
8760 error "lgetxattr on $DIR/$tfile failed"
8761 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
8762 grep -i "no such attr" ||
8763 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
8764 rm -f $DIR/$tfile $DIR/${tfile}link
8766 run_test 102i "lgetxattr test on symbolic link ============"
8769 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8770 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8772 XINC=$(have_xattrs_include)
8773 setup_test102 "$RUNAS"
8774 chown $RUNAS_ID $DIR/$tdir
8775 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8777 compare_stripe_info1 "$RUNAS"
8779 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
8782 [ -z "$(which setfattr 2>/dev/null)" ] &&
8783 skip "could not find setfattr"
8786 # b22187 just check that does not crash for regular file.
8787 setfattr -n trusted.lov $DIR/$tfile
8788 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
8789 local test_kdir=$DIR/$tdir
8790 test_mkdir $test_kdir
8791 local default_size=$($LFS getstripe -S $test_kdir)
8792 local default_count=$($LFS getstripe -c $test_kdir)
8793 local default_offset=$($LFS getstripe -i $test_kdir)
8794 $SETSTRIPE -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
8795 error 'dir setstripe failed'
8796 setfattr -n trusted.lov $test_kdir
8797 local stripe_size=$($LFS getstripe -S $test_kdir)
8798 local stripe_count=$($LFS getstripe -c $test_kdir)
8799 local stripe_offset=$($LFS getstripe -i $test_kdir)
8800 [ $stripe_size -eq $default_size ] ||
8801 error "stripe size $stripe_size != $default_size"
8802 [ $stripe_count -eq $default_count ] ||
8803 error "stripe count $stripe_count != $default_count"
8804 [ $stripe_offset -eq $default_offset ] ||
8805 error "stripe offset $stripe_offset != $default_offset"
8806 rm -rf $DIR/$tfile $test_kdir
8808 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
8811 [ -z "$(which getfattr 2>/dev/null)" ] &&
8812 skip "could not find getfattr"
8814 # LU-532 trusted. xattr is invisible to non-root
8815 local testfile=$DIR/$tfile
8819 echo "listxattr as user..."
8820 chown $RUNAS_ID $testfile
8821 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
8822 grep -q "trusted" &&
8823 error "$testfile trusted xattrs are user visible"
8827 run_test 102l "listxattr size test =================================="
8829 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
8830 local path=$DIR/$tfile
8833 listxattr_size_check $path || error "listattr_size_check $path failed"
8835 run_test 102m "Ensure listxattr fails on small bufffer ========"
8839 getxattr() { # getxattr path name
8840 # Return the base64 encoding of the value of xattr name on path.
8844 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
8846 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8848 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
8850 getfattr --absolute-names --encoding=base64 --name=$name $path |
8851 awk -F= -v name=$name '$1 == name {
8852 print substr($0, index($0, "=") + 1);
8856 test_102n() { # LU-4101 mdt: protect internal xattrs
8857 [ -z "$(which setfattr 2>/dev/null)" ] &&
8858 skip "could not find setfattr"
8859 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
8861 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
8864 local file0=$DIR/$tfile.0
8865 local file1=$DIR/$tfile.1
8866 local xattr0=$TMP/$tfile.0
8867 local xattr1=$TMP/$tfile.1
8868 local namelist="lov lma lmv link fid version som hsm"
8872 rm -rf $file0 $file1 $xattr0 $xattr1
8875 # Get 'before' xattrs of $file1.
8876 getfattr --absolute-names --dump --match=- $file1 > $xattr0
8878 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
8879 namelist+=" lfsck_namespace"
8880 for name in $namelist; do
8881 # Try to copy xattr from $file0 to $file1.
8882 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8884 setfattr --name=trusted.$name --value="$value" $file1 ||
8885 error "setxattr 'trusted.$name' failed"
8887 # Try to set a garbage xattr.
8888 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8890 if [[ x$name == "xlov" ]]; then
8891 setfattr --name=trusted.lov --value="$value" $file1 &&
8892 error "setxattr invalid 'trusted.lov' success"
8894 setfattr --name=trusted.$name --value="$value" $file1 ||
8895 error "setxattr invalid 'trusted.$name' failed"
8898 # Try to remove the xattr from $file1. We don't care if this
8899 # appears to succeed or fail, we just don't want there to be
8900 # any changes or crashes.
8901 setfattr --remove=$trusted.$name $file1 2> /dev/null
8904 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
8907 # Try to copy xattr from $file0 to $file1.
8908 value=$(getxattr $file0 trusted.$name 2> /dev/null)
8910 setfattr --name=trusted.$name --value="$value" $file1 ||
8911 error "setxattr 'trusted.$name' failed"
8913 # Try to set a garbage xattr.
8914 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
8916 setfattr --name=trusted.$name --value="$value" $file1 ||
8917 error "setxattr 'trusted.$name' failed"
8919 # Try to remove the xattr from $file1. We don't care if this
8920 # appears to succeed or fail, we just don't want there to be
8921 # any changes or crashes.
8922 setfattr --remove=$trusted.$name $file1 2> /dev/null
8925 # Get 'after' xattrs of file1.
8926 getfattr --absolute-names --dump --match=- $file1 > $xattr1
8928 if ! diff $xattr0 $xattr1; then
8929 error "before and after xattrs of '$file1' differ"
8932 rm -rf $file0 $file1 $xattr0 $xattr1
8936 run_test 102n "silently ignore setxattr on internal trusted xattrs"
8938 test_102p() { # LU-4703 setxattr did not check ownership
8939 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
8940 skip "MDS needs to be at least 2.5.56"
8942 local testfile=$DIR/$tfile
8946 echo "setfacl as user..."
8947 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
8948 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
8950 echo "setfattr as user..."
8951 setfacl -m "u:$RUNAS_ID:---" $testfile
8952 $RUNAS setfattr -x system.posix_acl_access $testfile
8953 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
8955 run_test 102p "check setxattr(2) correctly fails without permission"
8958 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
8959 skip "MDS needs to be at least 2.6.92"
8961 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
8963 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
8966 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
8967 skip "MDS needs to be at least 2.6.93"
8969 touch $DIR/$tfile || error "touch"
8970 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
8971 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
8972 rm $DIR/$tfile || error "rm"
8975 mkdir -p $DIR/$tdir || error "mkdir"
8976 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
8977 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
8978 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
8979 error "$testfile error deleting user.author1"
8980 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
8981 grep "user.$(basename $tdir)" &&
8982 error "$tdir did not delete user.$(basename $tdir)"
8983 rmdir $DIR/$tdir || error "rmdir"
8986 test_mkdir $DIR/$tdir
8987 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
8988 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
8989 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
8990 error "$testfile error deleting user.author1"
8991 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
8992 grep "user.$(basename $tdir)" &&
8993 error "$tdir did not delete user.$(basename $tdir)"
8994 rmdir $DIR/$tdir || error "rm striped dir"
8996 run_test 102r "set EAs with empty values"
8999 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9000 skip "MDS needs to be at least 2.11.52"
9002 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9004 save_lustre_params client "llite.*.xattr_cache" > $save
9006 for cache in 0 1; do
9007 lctl set_param llite.*.xattr_cache=$cache
9010 touch $DIR/$tfile || error "touch"
9011 for prefix in lustre security system trusted user; do
9012 # Note getxattr() may fail with 'Operation not
9013 # supported' or 'No such attribute' depending
9014 # on prefix and cache.
9015 getfattr -n $prefix.n102s $DIR/$tfile &&
9016 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
9020 restore_lustre_params < $save
9022 run_test 102s "getting nonexistent xattrs should fail"
9025 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9026 skip "MDS needs to be at least 2.11.52"
9028 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9030 save_lustre_params client "llite.*.xattr_cache" > $save
9032 for cache in 0 1; do
9033 lctl set_param llite.*.xattr_cache=$cache
9035 for buf_size in 0 256; do
9037 touch $DIR/$tfile || error "touch"
9038 setfattr -n user.multiop $DIR/$tfile
9039 $MULTIOP $DIR/$tfile oa$buf_size ||
9040 error "cannot get zero length xattr value (buf_size = $buf_size)"
9044 restore_lustre_params < $save
9046 run_test 102t "zero length xattr values handled correctly"
9050 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
9055 [ "$UID" != 0 ] && skip "must run as root"
9056 $GSS && skip_env "could not run under gss"
9057 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
9058 skip_env "must have acl enabled"
9059 [ -z "$(which setfacl 2>/dev/null)" ] &&
9060 skip_env "could not find setfacl"
9061 remote_mds_nodsh && skip "remote MDS with nodsh"
9063 gpasswd -a daemon bin # LU-5641
9064 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
9066 declare -a identity_old
9068 for num in $(seq $MDSCOUNT); do
9069 switch_identity $num true || identity_old[$num]=$?
9077 echo "performing cp ..."
9078 run_acl_subtest cp || error "run_acl_subtest cp failed"
9079 echo "performing getfacl-noacl..."
9080 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
9081 echo "performing misc..."
9082 run_acl_subtest misc || error "misc test failed"
9083 echo "performing permissions..."
9084 run_acl_subtest permissions || error "permissions failed"
9085 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
9086 if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] ||
9087 { [ $MDS1_VERSION -lt $(version_code 2.6) ] &&
9088 [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; }
9090 echo "performing permissions xattr..."
9091 run_acl_subtest permissions_xattr ||
9092 error "permissions_xattr failed"
9094 echo "performing setfacl..."
9095 run_acl_subtest setfacl || error "setfacl test failed"
9097 # inheritance test got from HP
9098 echo "performing inheritance..."
9099 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
9100 chmod +x make-tree || error "chmod +x failed"
9101 run_acl_subtest inheritance || error "inheritance test failed"
9104 echo "LU-974 ignore umask when acl is enabled..."
9105 run_acl_subtest 974 || error "LU-974 umask test failed"
9106 if [ $MDSCOUNT -ge 2 ]; then
9107 run_acl_subtest 974_remote ||
9108 error "LU-974 umask test failed under remote dir"
9111 echo "LU-2561 newly created file is same size as directory..."
9112 if [ "$mds1_FSTYPE" != "zfs" ]; then
9113 run_acl_subtest 2561 || error "LU-2561 test failed"
9115 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
9118 run_acl_subtest 4924 || error "LU-4924 test failed"
9123 for num in $(seq $MDSCOUNT); do
9124 if [ "${identity_old[$num]}" = 1 ]; then
9125 switch_identity $num false || identity_old[$num]=$?
9129 run_test 103a "acl test"
9135 for U in {0..511}; do
9137 local O=$(printf "%04o" $U)
9139 umask $(printf "%04o" $((511 ^ $O)))
9140 $LFS setstripe -c 1 $DIR/$tfile.s$O
9141 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
9143 (( $S == ($O & 0666) )) ||
9144 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
9146 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
9147 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
9148 (( $S == ($O & 0666) )) ||
9149 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
9151 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
9152 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
9153 (( $S == ($O & 0666) )) ||
9154 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
9155 rm -f $DIR/$tfile.[smp]$0
9159 # limit the concurrently running threads to 64. LU-11878
9160 local idx=$((U % 64))
9161 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
9166 run_test 103b "umask lfs setstripe"
9170 cp -rp $DIR/$tdir $DIR/$tdir.bak
9172 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
9173 error "$DIR/$tdir shouldn't contain default ACL"
9174 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
9175 error "$DIR/$tdir.bak shouldn't contain default ACL"
9178 run_test 103c "'cp -rp' won't set empty acl"
9181 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9184 lfs df || error "lfs df failed"
9185 lfs df -ih || error "lfs df -ih failed"
9186 lfs df -h $DIR || error "lfs df -h $DIR failed"
9187 lfs df -i $DIR || error "lfs df -i $DIR failed"
9188 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
9189 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
9191 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
9192 lctl --device %$OSC deactivate
9193 lfs df || error "lfs df with deactivated OSC failed"
9194 lctl --device %$OSC activate
9195 # wait the osc back to normal
9196 wait_osc_import_ready client ost
9198 lfs df || error "lfs df with reactivated OSC failed"
9201 run_test 104a "lfs df [-ih] [path] test ========================="
9204 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9205 [ $RUNAS_ID -eq $UID ] &&
9206 skip_env "RUNAS_ID = UID = $UID -- skipping"
9208 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
9209 grep "Permission denied" | wc -l)))
9210 if [ $denied_cnt -ne 0 ]; then
9211 error "lfs check servers test failed"
9214 run_test 104b "$RUNAS lfs check servers test ===================="
9217 # doesn't work on 2.4 kernels
9219 if $(flock_is_enabled); then
9220 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
9222 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
9226 run_test 105a "flock when mounted without -o flock test ========"
9230 if $(flock_is_enabled); then
9231 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
9233 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
9237 run_test 105b "fcntl when mounted without -o flock test ========"
9241 if $(flock_is_enabled); then
9242 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
9244 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
9248 run_test 105c "lockf when mounted without -o flock test"
9250 test_105d() { # bug 15924
9251 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9253 test_mkdir $DIR/$tdir
9254 flock_is_enabled || skip_env "mount w/o flock enabled"
9255 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
9256 $LCTL set_param fail_loc=0x80000315
9257 flocks_test 2 $DIR/$tdir
9259 run_test 105d "flock race (should not freeze) ========"
9261 test_105e() { # bug 22660 && 22040
9262 flock_is_enabled || skip_env "mount w/o flock enabled"
9265 flocks_test 3 $DIR/$tfile
9267 run_test 105e "Two conflicting flocks from same process"
9269 test_106() { #bug 10921
9270 test_mkdir $DIR/$tdir
9271 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9272 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9274 run_test 106 "attempt exec of dir followed by chown of that dir"
9277 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9285 local save_pattern=$(sysctl -n kernel.core_pattern)
9286 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9287 sysctl -w kernel.core_pattern=$file
9288 sysctl -w kernel.core_uses_pid=0
9296 kill -s 11 $SLEEPPID
9298 if [ -e $file ]; then
9299 size=`stat -c%s $file`
9300 [ $size -eq 0 ] && error "Fail to create core file $file"
9302 error "Fail to create core file $file"
9305 sysctl -w kernel.core_pattern=$save_pattern
9306 sysctl -w kernel.core_uses_pid=$save_uses_pid
9309 run_test 107 "Coredump on SIG"
9312 test_mkdir $DIR/$tdir
9313 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9314 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9315 error "mkdir with 256 char should fail, but did not"
9316 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9317 error "create with 255 char failed"
9318 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9319 error "create with 256 char should fail, but did not"
9324 run_test 110 "filename length checking"
9327 # Purpose: To verify dynamic thread (OSS) creation.
9330 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9331 remote_ost_nodsh && skip "remote OST with nodsh"
9333 # Lustre does not stop service threads once they are started.
9334 # Reset number of running threads to default.
9339 local save_params="$TMP/sanity-$TESTNAME.parameters"
9341 # Get ll_ost_io count before I/O
9342 OSTIO_pre=$(do_facet ost1 \
9343 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9344 # Exit if lustre is not running (ll_ost_io not running).
9345 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9347 echo "Starting with $OSTIO_pre threads"
9348 local thread_max=$((OSTIO_pre * 2))
9349 local rpc_in_flight=$((thread_max * 2))
9350 # Number of I/O Process proposed to be started.
9352 local facets=$(get_facets OST)
9354 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9355 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9357 # Set in_flight to $rpc_in_flight
9358 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9359 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9360 nfiles=${rpc_in_flight}
9361 # Set ost thread_max to $thread_max
9362 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9364 # 5 Minutes should be sufficient for max number of OSS
9365 # threads(thread_max) to be created.
9369 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9370 test_mkdir $DIR/$tdir
9371 for i in $(seq $nfiles); do
9372 local file=$DIR/$tdir/${tfile}-$i
9373 $LFS setstripe -c -1 -i 0 $file
9374 ($WTL $file $timeout)&
9377 # I/O Started - Wait for thread_started to reach thread_max or report
9378 # error if thread_started is more than thread_max.
9379 echo "Waiting for thread_started to reach thread_max"
9380 local thread_started=0
9381 local end_time=$((SECONDS + timeout))
9383 while [ $SECONDS -le $end_time ] ; do
9385 # Get ost i/o thread_started count.
9386 thread_started=$(do_facet ost1 \
9388 ost.OSS.ost_io.threads_started | cut -d= -f2")
9389 # Break out if thread_started is equal/greater than thread_max
9390 if [[ $thread_started -ge $thread_max ]]; then
9391 echo ll_ost_io thread_started $thread_started, \
9392 equal/greater than thread_max $thread_max
9398 # Cleanup - We have the numbers, Kill i/o jobs if running.
9399 jobcount=($(jobs -p))
9400 for i in $(seq 0 $((${#jobcount[@]}-1)))
9402 kill -9 ${jobcount[$i]}
9403 if [ $? -ne 0 ] ; then
9405 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
9409 # Cleanup files left by WTL binary.
9410 for i in $(seq $nfiles); do
9411 local file=$DIR/$tdir/${tfile}-$i
9413 if [ $? -ne 0 ] ; then
9414 echo "Warning: Failed to delete file $file"
9418 restore_lustre_params <$save_params
9419 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
9421 # Error out if no new thread has started or Thread started is greater
9423 if [[ $thread_started -le $OSTIO_pre ||
9424 $thread_started -gt $thread_max ]]; then
9425 error "ll_ost_io: thread_started $thread_started" \
9426 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
9427 "No new thread started or thread started greater " \
9431 run_test 115 "verify dynamic thread creation===================="
9434 wait_delete_completed
9435 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
9436 echo "OST kbytes available: ${AVAIL[@]}"
9441 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
9442 #echo OST $i: ${AVAIL[i]}kb
9443 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
9447 if [[ ${AVAIL[i]} -lt $MINV ]]; then
9452 echo "Min free space: OST $MINI: $MINV"
9453 echo "Max free space: OST $MAXI: $MAXV"
9456 test_116a() { # was previously test_116()
9457 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9458 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9459 remote_mds_nodsh && skip "remote MDS with nodsh"
9461 echo -n "Free space priority "
9462 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
9467 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
9468 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
9469 trap simple_cleanup_common EXIT
9471 # Check if we need to generate uneven OSTs
9472 test_mkdir -p $DIR/$tdir/OST${MINI}
9473 local FILL=$((MINV / 4))
9474 local DIFF=$((MAXV - MINV))
9475 local DIFF2=$((DIFF * 100 / MINV))
9477 local threshold=$(do_facet $SINGLEMDS \
9478 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
9479 threshold=${threshold%%%}
9480 echo -n "Check for uneven OSTs: "
9481 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
9483 if [[ $DIFF2 -gt $threshold ]]; then
9485 echo "Don't need to fill OST$MINI"
9487 # generate uneven OSTs. Write 2% over the QOS threshold value
9489 DIFF=$((threshold - DIFF2 + 2))
9490 DIFF2=$((MINV * DIFF / 100))
9491 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
9492 $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
9493 error "setstripe failed"
9494 DIFF=$((DIFF2 / 2048))
9496 while [ $i -lt $DIFF ]; do
9498 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
9499 bs=2M count=1 2>/dev/null
9508 DIFF=$((MAXV - MINV))
9509 DIFF2=$((DIFF * 100 / MINV))
9510 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
9511 if [ $DIFF2 -gt $threshold ]; then
9514 echo "failed - QOS mode won't be used"
9515 simple_cleanup_common
9516 skip "QOS imbalance criteria not met"
9524 # now fill using QOS
9525 $SETSTRIPE -c 1 $DIR/$tdir
9526 FILL=$((FILL / 200))
9527 if [ $FILL -gt 600 ]; then
9530 echo "writing $FILL files to QOS-assigned OSTs"
9532 while [ $i -lt $FILL ]; do
9534 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
9538 echo "wrote $i 200k files"
9542 echo "Note: free space may not be updated, so measurements might be off"
9544 DIFF2=$((MAXV - MINV))
9545 echo "free space delta: orig $DIFF final $DIFF2"
9546 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
9547 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
9548 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
9549 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
9550 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
9551 if [[ $DIFF -gt 0 ]]; then
9552 FILL=$((DIFF2 * 100 / DIFF - 100))
9553 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
9556 # Figure out which files were written where
9557 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9558 awk '/'$MINI1': / {print $2; exit}')
9560 MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9561 echo "$MINC files created on smaller OST $MINI1"
9562 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9563 awk '/'$MAXI1': / {print $2; exit}')
9565 MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9566 echo "$MAXC files created on larger OST $MAXI1"
9567 if [[ $MINC -gt 0 ]]; then
9568 FILL=$((MAXC * 100 / MINC - 100))
9569 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
9571 [[ $MAXC -gt $MINC ]] ||
9572 error_ignore LU-9 "stripe QOS didn't balance free space"
9573 simple_cleanup_common
9575 run_test 116a "stripe QOS: free space balance ==================="
9577 test_116b() { # LU-2093
9578 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9579 remote_mds_nodsh && skip "remote MDS with nodsh"
9581 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
9582 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
9583 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
9584 [ -z "$old_rr" ] && skip "no QOS"
9585 do_facet $SINGLEMDS lctl set_param \
9586 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
9588 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
9589 createmany -o $DIR/$tdir/f- 20 || error "can't create"
9590 do_facet $SINGLEMDS lctl set_param fail_loc=0
9592 do_facet $SINGLEMDS lctl set_param \
9593 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
9595 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
9597 test_117() # bug 10891
9599 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9601 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
9602 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
9603 lctl set_param fail_loc=0x21e
9604 > $DIR/$tfile || error "truncate failed"
9605 lctl set_param fail_loc=0
9606 echo "Truncate succeeded."
9609 run_test 117 "verify osd extend =========="
9611 NO_SLOW_RESENDCOUNT=4
9612 export OLD_RESENDCOUNT=""
9613 set_resend_count () {
9614 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
9615 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
9616 lctl set_param -n $PROC_RESENDCOUNT $1
9617 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
9620 # for reduce test_118* time (b=14842)
9621 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9623 # Reset async IO behavior after error case
9625 FILE=$DIR/reset_async
9627 # Ensure all OSCs are cleared
9628 $SETSTRIPE -c -1 $FILE
9629 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
9634 test_118a() #bug 11710
9636 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9640 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9641 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9642 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9644 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9645 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9650 run_test 118a "verify O_SYNC works =========="
9654 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9655 remote_ost_nodsh && skip "remote OST with nodsh"
9659 #define OBD_FAIL_SRV_ENOENT 0x217
9660 set_nodes_failloc "$(osts_nodes)" 0x217
9661 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9663 set_nodes_failloc "$(osts_nodes)" 0
9664 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9665 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9668 if [[ $RC -eq 0 ]]; then
9669 error "Must return error due to dropped pages, rc=$RC"
9673 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9674 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9678 echo "Dirty pages not leaked on ENOENT"
9680 # Due to the above error the OSC will issue all RPCs syncronously
9681 # until a subsequent RPC completes successfully without error.
9682 $MULTIOP $DIR/$tfile Ow4096yc
9687 run_test 118b "Reclaim dirty pages on fatal error =========="
9691 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9693 # for 118c, restore the original resend count, LU-1940
9694 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
9695 set_resend_count $OLD_RESENDCOUNT
9696 remote_ost_nodsh && skip "remote OST with nodsh"
9700 #define OBD_FAIL_OST_EROFS 0x216
9701 set_nodes_failloc "$(osts_nodes)" 0x216
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 set_nodes_failloc "$(osts_nodes)" 0
9721 if [[ $RC -ne 0 ]]; then
9722 error "Multiop fsync failed, rc=$RC"
9725 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9726 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9728 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9729 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9733 echo "Dirty pages flushed via fsync on EROFS"
9736 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
9738 # continue to use small resend count to reduce test_118* time (b=14842)
9739 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9743 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9744 remote_ost_nodsh && skip "remote OST with nodsh"
9748 #define OBD_FAIL_OST_BRW_PAUSE_BULK
9749 set_nodes_failloc "$(osts_nodes)" 0x214
9750 # multiop should block due to fsync until pages are written
9751 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9755 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9756 error "Multiop failed to block on fsync, pid=$MULTIPID"
9759 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9761 if [[ $WRITEBACK -eq 0 ]]; then
9762 error "No page in writeback, writeback=$WRITEBACK"
9765 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
9766 set_nodes_failloc "$(osts_nodes)" 0
9768 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9769 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9771 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9772 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9776 echo "Dirty pages gaurenteed flushed via fsync"
9779 run_test 118d "Fsync validation inject a delay of the bulk =========="
9782 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9786 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
9787 lctl set_param fail_loc=0x8000040a
9789 # Should simulate EINVAL error which is fatal
9790 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9792 if [[ $RC -eq 0 ]]; then
9793 error "Must return error due to dropped pages, rc=$RC"
9796 lctl set_param fail_loc=0x0
9798 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9799 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9800 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9802 if [[ $LOCKED -ne 0 ]]; then
9803 error "Locked pages remain in cache, locked=$LOCKED"
9806 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9807 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9811 echo "No pages locked after fsync"
9816 run_test 118f "Simulate unrecoverable OSC side error =========="
9819 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9823 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
9824 lctl set_param fail_loc=0x406
9826 # simulate local -ENOMEM
9827 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9830 lctl set_param fail_loc=0
9831 if [[ $RC -eq 0 ]]; then
9832 error "Must return error due to dropped pages, rc=$RC"
9835 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9836 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9837 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9839 if [[ $LOCKED -ne 0 ]]; then
9840 error "Locked pages remain in cache, locked=$LOCKED"
9843 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9844 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9848 echo "No pages locked after fsync"
9853 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
9856 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9857 remote_ost_nodsh && skip "remote OST with nodsh"
9861 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9862 set_nodes_failloc "$(osts_nodes)" 0x20e
9863 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9864 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9867 set_nodes_failloc "$(osts_nodes)" 0
9868 if [[ $RC -eq 0 ]]; then
9869 error "Must return error due to dropped pages, rc=$RC"
9872 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9873 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9874 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9876 if [[ $LOCKED -ne 0 ]]; then
9877 error "Locked pages remain in cache, locked=$LOCKED"
9880 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9881 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9885 echo "No pages locked after fsync"
9889 run_test 118h "Verify timeout in handling recoverables errors =========="
9891 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
9894 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9895 remote_ost_nodsh && skip "remote OST with nodsh"
9899 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9900 set_nodes_failloc "$(osts_nodes)" 0x20e
9902 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
9903 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9906 set_nodes_failloc "$(osts_nodes)" 0
9910 if [[ $RC -ne 0 ]]; then
9911 error "got error, but should be not, rc=$RC"
9914 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9915 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9916 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9917 if [[ $LOCKED -ne 0 ]]; then
9918 error "Locked pages remain in cache, locked=$LOCKED"
9921 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9922 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9926 echo "No pages locked after fsync"
9930 run_test 118i "Fix error before timeout in recoverable error =========="
9932 [ "$SLOW" = "no" ] && set_resend_count 4
9935 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9936 remote_ost_nodsh && skip "remote OST with nodsh"
9940 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
9941 set_nodes_failloc "$(osts_nodes)" 0x220
9943 # return -EIO from OST
9944 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9946 set_nodes_failloc "$(osts_nodes)" 0x0
9947 if [[ $RC -eq 0 ]]; then
9948 error "Must return error due to dropped pages, rc=$RC"
9951 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9952 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9953 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9954 if [[ $LOCKED -ne 0 ]]; then
9955 error "Locked pages remain in cache, locked=$LOCKED"
9958 # in recoverable error on OST we want resend and stay until it finished
9959 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9960 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9964 echo "No pages locked after fsync"
9968 run_test 118j "Simulate unrecoverable OST side error =========="
9972 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9973 remote_ost_nodsh && skip "remote OSTs with nodsh"
9975 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
9976 set_nodes_failloc "$(osts_nodes)" 0x20e
9977 test_mkdir $DIR/$tdir
9979 for ((i=0;i<10;i++)); do
9980 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
9981 error "dd to $DIR/$tdir/$tfile-$i failed" )&
9988 set_nodes_failloc "$(osts_nodes)" 0
9991 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
9993 test_118l() # LU-646
9995 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9997 test_mkdir $DIR/$tdir
9998 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
10001 run_test 118l "fsync dir"
10003 test_118m() # LU-3066
10005 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10007 test_mkdir $DIR/$tdir
10008 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
10011 run_test 118m "fdatasync dir ========="
10013 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10020 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10021 remote_ost_nodsh && skip "remote OSTs with nodsh"
10023 # Sleep to avoid a cached response.
10024 #define OBD_STATFS_CACHE_SECONDS 1
10027 # Inject a 10 second delay in the OST_STATFS handler.
10028 #define OBD_FAIL_OST_STATFS_DELAY 0x242
10029 set_nodes_failloc "$(osts_nodes)" 0x242
10032 stat --file-system $MOUNT > /dev/null
10035 set_nodes_failloc "$(osts_nodes)" 0
10037 if ((end - begin > 20)); then
10038 error "statfs took $((end - begin)) seconds, expected 10"
10041 run_test 118n "statfs() sends OST_STATFS requests in parallel"
10043 test_119a() # bug 11737
10045 BSIZE=$((512 * 1024))
10046 directio write $DIR/$tfile 0 1 $BSIZE
10047 # We ask to read two blocks, which is more than a file size.
10048 # directio will indicate an error when requested and actual
10049 # sizes aren't equeal (a normal situation in this case) and
10050 # print actual read amount.
10051 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
10052 if [ "$NOB" != "$BSIZE" ]; then
10053 error "read $NOB bytes instead of $BSIZE"
10057 run_test 119a "Short directIO read must return actual read amount"
10059 test_119b() # bug 11737
10061 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10063 $SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed"
10064 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
10066 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
10067 error "direct read failed"
10070 run_test 119b "Sparse directIO read must return actual read amount"
10072 test_119c() # bug 13099
10075 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
10076 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
10079 run_test 119c "Testing for direct read hitting hole"
10081 test_119d() # bug 15950
10083 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10085 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
10086 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
10088 $SETSTRIPE $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
10089 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
10090 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
10091 lctl set_param fail_loc=0x40d
10092 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
10095 cat $DIR/$tfile > /dev/null &
10096 lctl set_param fail_loc=0
10099 log "the DIO writes have completed, now wait for the reads (should not block very long)"
10101 [ -n "`ps h -p $pid_reads -o comm`" ] && \
10102 error "the read rpcs have not completed in 2s"
10104 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
10106 run_test 119d "The DIO path should try to send a new rpc once one is completed"
10109 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10110 remote_mds_nodsh && skip "remote MDS with nodsh"
10111 test_mkdir $DIR/$tdir
10112 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10113 skip_env "no early lock cancel on server"
10115 lru_resize_disable mdc
10116 lru_resize_disable osc
10117 cancel_lru_locks mdc
10118 # asynchronous object destroy at MDT could cause bl ast to client
10119 cancel_lru_locks osc
10121 stat $DIR/$tdir > /dev/null
10122 can1=$(do_facet $SINGLEMDS \
10123 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10124 awk '/ldlm_cancel/ {print $2}')
10125 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10126 awk '/ldlm_bl_callback/ {print $2}')
10127 test_mkdir -c1 $DIR/$tdir/d1
10128 can2=$(do_facet $SINGLEMDS \
10129 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10130 awk '/ldlm_cancel/ {print $2}')
10131 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10132 awk '/ldlm_bl_callback/ {print $2}')
10133 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10134 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10135 lru_resize_enable mdc
10136 lru_resize_enable osc
10138 run_test 120a "Early Lock Cancel: mkdir test"
10141 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10142 remote_mds_nodsh && skip "remote MDS with nodsh"
10143 test_mkdir $DIR/$tdir
10144 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10145 skip_env "no early lock cancel on server"
10147 lru_resize_disable mdc
10148 lru_resize_disable osc
10149 cancel_lru_locks mdc
10150 stat $DIR/$tdir > /dev/null
10151 can1=$(do_facet $SINGLEMDS \
10152 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10153 awk '/ldlm_cancel/ {print $2}')
10154 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10155 awk '/ldlm_bl_callback/ {print $2}')
10156 touch $DIR/$tdir/f1
10157 can2=$(do_facet $SINGLEMDS \
10158 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10159 awk '/ldlm_cancel/ {print $2}')
10160 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10161 awk '/ldlm_bl_callback/ {print $2}')
10162 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10163 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10164 lru_resize_enable mdc
10165 lru_resize_enable osc
10167 run_test 120b "Early Lock Cancel: create test"
10170 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10171 remote_mds_nodsh && skip "remote MDS with nodsh"
10172 test_mkdir -c1 $DIR/$tdir
10173 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10174 skip "no early lock cancel on server"
10176 lru_resize_disable mdc
10177 lru_resize_disable osc
10178 test_mkdir -c1 $DIR/$tdir/d1
10179 test_mkdir -c1 $DIR/$tdir/d2
10180 touch $DIR/$tdir/d1/f1
10181 cancel_lru_locks mdc
10182 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
10183 can1=$(do_facet $SINGLEMDS \
10184 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10185 awk '/ldlm_cancel/ {print $2}')
10186 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10187 awk '/ldlm_bl_callback/ {print $2}')
10188 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10189 can2=$(do_facet $SINGLEMDS \
10190 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10191 awk '/ldlm_cancel/ {print $2}')
10192 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10193 awk '/ldlm_bl_callback/ {print $2}')
10194 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10195 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10196 lru_resize_enable mdc
10197 lru_resize_enable osc
10199 run_test 120c "Early Lock Cancel: link test"
10202 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10203 remote_mds_nodsh && skip "remote MDS with nodsh"
10204 test_mkdir -c1 $DIR/$tdir
10205 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10206 skip_env "no early lock cancel on server"
10208 lru_resize_disable mdc
10209 lru_resize_disable osc
10211 cancel_lru_locks mdc
10212 stat $DIR/$tdir > /dev/null
10213 can1=$(do_facet $SINGLEMDS \
10214 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10215 awk '/ldlm_cancel/ {print $2}')
10216 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10217 awk '/ldlm_bl_callback/ {print $2}')
10218 chmod a+x $DIR/$tdir
10219 can2=$(do_facet $SINGLEMDS \
10220 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10221 awk '/ldlm_cancel/ {print $2}')
10222 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10223 awk '/ldlm_bl_callback/ {print $2}')
10224 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10225 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10226 lru_resize_enable mdc
10227 lru_resize_enable osc
10229 run_test 120d "Early Lock Cancel: setattr test"
10232 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10233 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10234 skip_env "no early lock cancel on server"
10235 remote_mds_nodsh && skip "remote MDS with nodsh"
10237 local dlmtrace_set=false
10239 test_mkdir -c1 $DIR/$tdir
10240 lru_resize_disable mdc
10241 lru_resize_disable osc
10242 ! $LCTL get_param debug | grep -q dlmtrace &&
10243 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
10244 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
10245 cancel_lru_locks mdc
10246 cancel_lru_locks osc
10247 dd if=$DIR/$tdir/f1 of=/dev/null
10248 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
10249 # XXX client can not do early lock cancel of OST lock
10250 # during unlink (LU-4206), so cancel osc lock now.
10252 cancel_lru_locks osc
10253 can1=$(do_facet $SINGLEMDS \
10254 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10255 awk '/ldlm_cancel/ {print $2}')
10256 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10257 awk '/ldlm_bl_callback/ {print $2}')
10258 unlink $DIR/$tdir/f1
10260 can2=$(do_facet $SINGLEMDS \
10261 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10262 awk '/ldlm_cancel/ {print $2}')
10263 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10264 awk '/ldlm_bl_callback/ {print $2}')
10265 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10266 $LCTL dk $TMP/cancel.debug.txt
10267 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10268 $LCTL dk $TMP/blocking.debug.txt
10269 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10270 lru_resize_enable mdc
10271 lru_resize_enable osc
10273 run_test 120e "Early Lock Cancel: unlink test"
10276 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10277 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10278 skip_env "no early lock cancel on server"
10279 remote_mds_nodsh && skip "remote MDS with nodsh"
10281 test_mkdir -c1 $DIR/$tdir
10282 lru_resize_disable mdc
10283 lru_resize_disable osc
10284 test_mkdir -c1 $DIR/$tdir/d1
10285 test_mkdir -c1 $DIR/$tdir/d2
10286 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10287 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10288 cancel_lru_locks mdc
10289 cancel_lru_locks osc
10290 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10291 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10292 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10293 # XXX client can not do early lock cancel of OST lock
10294 # during rename (LU-4206), so cancel osc lock now.
10296 cancel_lru_locks osc
10297 can1=$(do_facet $SINGLEMDS \
10298 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10299 awk '/ldlm_cancel/ {print $2}')
10300 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10301 awk '/ldlm_bl_callback/ {print $2}')
10302 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10304 can2=$(do_facet $SINGLEMDS \
10305 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10306 awk '/ldlm_cancel/ {print $2}')
10307 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10308 awk '/ldlm_bl_callback/ {print $2}')
10309 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10310 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10311 lru_resize_enable mdc
10312 lru_resize_enable osc
10314 run_test 120f "Early Lock Cancel: rename test"
10317 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10318 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10319 skip_env "no early lock cancel on server"
10320 remote_mds_nodsh && skip "remote MDS with nodsh"
10322 lru_resize_disable mdc
10323 lru_resize_disable osc
10325 echo create $count files
10326 test_mkdir $DIR/$tdir
10327 cancel_lru_locks mdc
10328 cancel_lru_locks osc
10331 can0=$(do_facet $SINGLEMDS \
10332 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10333 awk '/ldlm_cancel/ {print $2}')
10334 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10335 awk '/ldlm_bl_callback/ {print $2}')
10336 createmany -o $DIR/$tdir/f $count
10338 can1=$(do_facet $SINGLEMDS \
10339 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10340 awk '/ldlm_cancel/ {print $2}')
10341 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10342 awk '/ldlm_bl_callback/ {print $2}')
10344 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10345 echo rm $count files
10348 can2=$(do_facet $SINGLEMDS \
10349 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10350 awk '/ldlm_cancel/ {print $2}')
10351 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10352 awk '/ldlm_bl_callback/ {print $2}')
10354 echo total: $count removes in $((t2-t1))
10355 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10357 # wait for commitment of removal
10358 lru_resize_enable mdc
10359 lru_resize_enable osc
10361 run_test 120g "Early Lock Cancel: performance test"
10363 test_121() { #bug #10589
10364 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10367 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10368 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10369 lctl set_param fail_loc=0x310
10370 cancel_lru_locks osc > /dev/null
10371 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10372 lctl set_param fail_loc=0
10373 [[ $reads -eq $writes ]] ||
10374 error "read $reads blocks, must be $writes blocks"
10376 run_test 121 "read cancel race ========="
10378 test_123a() { # was test 123, statahead(bug 11401)
10379 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10382 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10383 log "testing UP system. Performance may be lower than expected."
10388 test_mkdir $DIR/$tdir
10389 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10390 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10392 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10393 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10395 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10396 lctl set_param -n llite.*.statahead_max 0
10397 lctl get_param llite.*.statahead_max
10398 cancel_lru_locks mdc
10399 cancel_lru_locks osc
10401 time ls -l $DIR/$tdir | wc -l
10403 delta=$((etime - stime))
10404 log "ls $i files without statahead: $delta sec"
10405 lctl set_param llite.*.statahead_max=$max
10407 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10408 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
10409 cancel_lru_locks mdc
10410 cancel_lru_locks osc
10412 time ls -l $DIR/$tdir | wc -l
10414 delta_sa=$((etime - stime))
10415 log "ls $i files with statahead: $delta_sa sec"
10416 lctl get_param -n llite.*.statahead_stats
10417 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10419 [[ $swrong -lt $ewrong ]] &&
10420 log "statahead was stopped, maybe too many locks held!"
10421 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
10423 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10424 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10425 lctl set_param -n llite.*.statahead_max 0
10426 lctl get_param llite.*.statahead_max
10427 cancel_lru_locks mdc
10428 cancel_lru_locks osc
10430 time ls -l $DIR/$tdir | wc -l
10432 delta=$((etime - stime))
10433 log "ls $i files again without statahead: $delta sec"
10434 lctl set_param llite.*.statahead_max=$max
10435 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10436 if [ $SLOWOK -eq 0 ]; then
10437 error "ls $i files is slower with statahead!"
10439 log "ls $i files is slower with statahead!"
10445 [ $delta -gt 20 ] && break
10446 [ $delta -gt 8 ] && MULT=$((50 / delta))
10447 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
10455 delta=$((etime - stime))
10456 log "rm -r $DIR/$tdir/: $delta seconds"
10458 lctl get_param -n llite.*.statahead_stats
10460 run_test 123a "verify statahead work"
10462 test_123b () { # statahead(bug 15027)
10463 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10465 test_mkdir $DIR/$tdir
10466 createmany -o $DIR/$tdir/$tfile-%d 1000
10468 cancel_lru_locks mdc
10469 cancel_lru_locks osc
10471 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
10472 lctl set_param fail_loc=0x80000803
10473 ls -lR $DIR/$tdir > /dev/null
10475 lctl set_param fail_loc=0x0
10476 lctl get_param -n llite.*.statahead_stats
10481 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
10484 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
10486 test_mkdir -i 0 -c 1 $DIR/$tdir.0
10487 test_mkdir -i 1 -c 1 $DIR/$tdir.1
10488 touch $DIR/$tdir.1/{1..3}
10489 mv $DIR/$tdir.1/{1..3} $DIR/$tdir.0
10491 remount_client $MOUNT
10493 $MULTIOP $DIR/$tdir.0 Q
10495 # let statahead to complete
10496 ls -l $DIR/$tdir.0 > /dev/null
10498 testid=$(echo $TESTNAME | tr '_' ' ')
10499 dmesg | tac | sed "/$testid/,$ d" | grep "Can not initialize inode" &&
10500 error "statahead warning" || true
10502 run_test 123c "Can not initialize inode warning on DNE statahead"
10505 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10506 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10507 skip_env "no lru resize on server"
10511 test_mkdir $DIR/$tdir
10513 log "create $NR files at $DIR/$tdir"
10514 createmany -o $DIR/$tdir/f $NR ||
10515 error "failed to create $NR files in $DIR/$tdir"
10517 cancel_lru_locks mdc
10518 ls -l $DIR/$tdir > /dev/null
10522 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
10523 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
10524 LRU_SIZE=$($LCTL get_param -n $PARAM)
10525 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
10526 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
10528 log "NS=$(basename $NSDIR)"
10533 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
10534 skip "Not enough cached locks created!"
10536 log "LRU=$LRU_SIZE"
10540 # We know that lru resize allows one client to hold $LIMIT locks
10541 # for 10h. After that locks begin to be killed by client.
10543 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
10545 if [ $LIMIT -lt $LRU_SIZE ]; then
10546 skip "Limit is too small $LIMIT"
10549 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
10550 # killing locks. Some time was spent for creating locks. This means
10551 # that up to the moment of sleep finish we must have killed some of
10552 # them (10-100 locks). This depends on how fast ther were created.
10553 # Many of them were touched in almost the same moment and thus will
10554 # be killed in groups.
10555 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
10557 # Use $LRU_SIZE_B here to take into account real number of locks
10558 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
10559 local LRU_SIZE_B=$LRU_SIZE
10561 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
10562 log "OLD_LVF=$OLD_LVF"
10563 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
10565 # Let's make sure that we really have some margin. Client checks
10566 # cached locks every 10 sec.
10567 SLEEP=$((SLEEP+20))
10568 log "Sleep ${SLEEP} sec"
10570 while ((SEC<$SLEEP)); do
10574 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
10575 echo -n "$LRU_SIZE"
10578 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
10579 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
10581 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
10582 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
10583 unlinkmany $DIR/$tdir/f $NR
10587 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
10588 log "unlink $NR files at $DIR/$tdir"
10589 unlinkmany $DIR/$tdir/f $NR
10591 run_test 124a "lru resize ======================================="
10593 get_max_pool_limit()
10595 local limit=$($LCTL get_param \
10596 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
10598 for l in $limit; do
10599 if [[ $l -gt $max ]]; then
10607 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10608 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10609 skip_env "no lru resize on server"
10611 LIMIT=$(get_max_pool_limit)
10613 NR=$(($(default_lru_size)*20))
10614 if [[ $NR -gt $LIMIT ]]; then
10615 log "Limit lock number by $LIMIT locks"
10619 IFree=$(mdsrate_inodes_available)
10620 if [ $IFree -lt $NR ]; then
10621 log "Limit lock number by $IFree inodes"
10625 lru_resize_disable mdc
10626 test_mkdir -p $DIR/$tdir/disable_lru_resize
10628 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
10629 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
10630 cancel_lru_locks mdc
10633 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10636 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10639 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10643 nolruresize_delta=$((etime-stime))
10644 log "ls -la time: $nolruresize_delta seconds"
10645 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10646 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
10648 lru_resize_enable mdc
10649 test_mkdir -p $DIR/$tdir/enable_lru_resize
10651 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
10652 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
10653 cancel_lru_locks mdc
10656 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10659 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10662 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10666 lruresize_delta=$((etime-stime))
10667 log "ls -la time: $lruresize_delta seconds"
10668 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10670 if [ $lruresize_delta -gt $nolruresize_delta ]; then
10671 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
10672 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
10673 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
10675 log "lru resize performs the same with no lru resize"
10677 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
10679 run_test 124b "lru resize (performance test) ======================="
10682 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10683 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10684 skip_env "no lru resize on server"
10686 # cache ununsed locks on client
10688 cancel_lru_locks mdc
10689 test_mkdir $DIR/$tdir
10690 createmany -o $DIR/$tdir/f $nr ||
10691 error "failed to create $nr files in $DIR/$tdir"
10692 ls -l $DIR/$tdir > /dev/null
10694 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10695 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10696 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10697 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10698 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10700 # set lru_max_age to 1 sec
10701 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10702 echo "sleep $((recalc_p * 2)) seconds..."
10703 sleep $((recalc_p * 2))
10705 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10706 # restore lru_max_age
10707 $LCTL set_param -n $nsdir.lru_max_age $max_age
10708 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10709 unlinkmany $DIR/$tdir/f $nr
10711 run_test 124c "LRUR cancel very aged locks"
10714 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10715 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10716 skip_env "no lru resize on server"
10718 # cache ununsed locks on client
10721 lru_resize_disable mdc
10722 stack_trap "lru_resize_enable mdc" EXIT
10724 cancel_lru_locks mdc
10726 # asynchronous object destroy at MDT could cause bl ast to client
10727 test_mkdir $DIR/$tdir
10728 createmany -o $DIR/$tdir/f $nr ||
10729 error "failed to create $nr files in $DIR/$tdir"
10730 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
10732 ls -l $DIR/$tdir > /dev/null
10734 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10735 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10736 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10737 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10739 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10741 # set lru_max_age to 1 sec
10742 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10743 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
10745 echo "sleep $((recalc_p * 2)) seconds..."
10746 sleep $((recalc_p * 2))
10748 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10750 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10752 run_test 124d "cancel very aged locks if lru-resize diasbaled"
10754 test_125() { # 13358
10755 $LCTL get_param -n llite.*.client_type | grep -q local ||
10756 skip "must run as local client"
10757 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
10758 skip_env "must have acl enabled"
10759 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
10761 test_mkdir $DIR/$tdir
10762 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
10763 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
10764 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
10766 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
10768 test_126() { # bug 12829/13455
10769 $GSS && skip_env "must run as gss disabled"
10770 $LCTL get_param -n llite.*.client_type | grep -q local ||
10771 skip "must run as local client"
10772 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
10774 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
10775 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
10777 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
10779 run_test 126 "check that the fsgid provided by the client is taken into account"
10781 test_127a() { # bug 15521
10782 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10784 $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
10785 $LCTL set_param osc.*.stats=0
10786 FSIZE=$((2048 * 1024))
10787 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
10788 cancel_lru_locks osc
10789 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
10791 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
10792 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
10793 echo "got $COUNT $NAME"
10794 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
10795 eval $NAME=$COUNT || error "Wrong proc format"
10798 read_bytes|write_bytes)
10799 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
10800 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
10801 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
10802 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
10803 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
10804 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
10805 error "sumsquare is too small: $SUMSQ"
10806 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
10807 error "sumsquare is too big: $SUMSQ"
10811 done < $DIR/${tfile}.tmp
10813 #check that we actually got some stats
10814 [ "$read_bytes" ] || error "Missing read_bytes stats"
10815 [ "$write_bytes" ] || error "Missing write_bytes stats"
10816 [ "$read_bytes" != 0 ] || error "no read done"
10817 [ "$write_bytes" != 0 ] || error "no write done"
10819 run_test 127a "verify the client stats are sane"
10821 test_127b() { # bug LU-333
10822 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10823 local name count samp unit min max sum sumsq
10825 $LCTL set_param llite.*.stats=0
10827 # perform 2 reads and writes so MAX is different from SUM.
10828 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10829 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10830 cancel_lru_locks osc
10831 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10832 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10834 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
10835 while read name count samp unit min max sum sumsq; do
10836 echo "got $count $name"
10837 eval $name=$count || error "Wrong proc format"
10841 [ $count -ne 2 ] && error "count is not 2: $count"
10842 [ $min -ne $PAGE_SIZE ] &&
10843 error "min is not $PAGE_SIZE: $min"
10844 [ $max -ne $PAGE_SIZE ] &&
10845 error "max is incorrect: $max"
10846 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10847 error "sum is wrong: $sum"
10850 [ $count -ne 2 ] && error "count is not 2: $count"
10851 [ $min -ne $PAGE_SIZE ] &&
10852 error "min is not $PAGE_SIZE: $min"
10853 [ $max -ne $PAGE_SIZE ] &&
10854 error "max is incorrect: $max"
10855 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10856 error "sum is wrong: $sum"
10860 done < $TMP/$tfile.tmp
10862 #check that we actually got some stats
10863 [ "$read_bytes" ] || error "Missing read_bytes stats"
10864 [ "$write_bytes" ] || error "Missing write_bytes stats"
10865 [ "$read_bytes" != 0 ] || error "no read done"
10866 [ "$write_bytes" != 0 ] || error "no write done"
10868 rm -f $TMP/${tfile}.tmp
10870 run_test 127b "verify the llite client stats are sane"
10872 test_127c() { # LU-12394
10873 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
10880 $LCTL set_param llite.*.extents_stats=1
10881 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
10883 # Use two stripes so there is enough space in default config
10884 $LFS setstripe -c 2 $DIR/$tfile
10886 # Extent stats start at 0-4K and go in power of two buckets
10887 # LL_HIST_START = 12 --> 2^12 = 4K
10888 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
10889 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
10891 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
10893 # Write and read, 2x each, second time at a non-zero offset
10894 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
10895 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
10896 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
10897 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
10901 $LCTL get_param llite.*.extents_stats
10904 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
10906 local bucket=$($LCTL get_param -n llite.*.extents_stats |
10908 reads=$(echo $bucket | awk '{print $5}')
10909 writes=$(echo $bucket | awk '{print $9}')
10910 [ "$reads" -eq $count ] ||
10911 error "$reads reads in < $bsize bucket, expect $count"
10912 [ "$writes" -eq $count ] ||
10913 error "$writes writes in < $bsize bucket, expect $count"
10916 # Test mmap write and read
10917 $LCTL set_param llite.*.extents_stats=c
10919 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
10920 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
10921 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
10923 $LCTL get_param llite.*.extents_stats
10925 count=$(((size*1024) / PAGE_SIZE))
10927 bsize=$((2 * PAGE_SIZE / 1024))K
10929 bucket=$($LCTL get_param -n llite.*.extents_stats |
10931 reads=$(echo $bucket | awk '{print $5}')
10932 writes=$(echo $bucket | awk '{print $9}')
10933 # mmap writes fault in the page first, creating an additonal read
10934 [ "$reads" -eq $((2 * count)) ] ||
10935 error "$reads reads in < $bsize bucket, expect $count"
10936 [ "$writes" -eq $count ] ||
10937 error "$writes writes in < $bsize bucket, expect $count"
10939 run_test 127c "test llite extent stats with regular & mmap i/o"
10941 test_128() { # bug 15212
10943 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
10948 result=$(grep error $TMP/$tfile.log)
10949 rm -f $DIR/$tfile $TMP/$tfile.log
10950 [ -z "$result" ] ||
10951 error "consecutive find's under interactive lfs failed"
10953 run_test 128 "interactive lfs for 2 consecutive find's"
10955 set_dir_limits () {
10960 local ldproc=/proc/fs/ldiskfs
10961 local facets=$(get_facets MDS)
10963 for facet in ${facets//,/ }; do
10964 canondev=$(ldiskfs_canon \
10965 *.$(convert_facet2label $facet).mntdev $facet)
10966 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
10967 ldproc=/sys/fs/ldiskfs
10968 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
10969 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
10973 check_mds_dmesg() {
10974 local facets=$(get_facets MDS)
10975 for facet in ${facets//,/ }; do
10976 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
10982 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10983 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
10984 skip "Need MDS version with at least 2.5.56"
10985 if [ "$mds1_FSTYPE" != ldiskfs ]; then
10986 skip_env "ldiskfs only test"
10988 remote_mds_nodsh && skip "remote MDS with nodsh"
10992 local has_warning=false
10995 mkdir -p $DIR/$tdir
10997 # block size of mds1
10998 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
10999 set_dir_limits $maxsize $maxsize
11000 local dirsize=$(stat -c%s "$DIR/$tdir")
11002 while [[ $dirsize -le $maxsize ]]; do
11003 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
11005 if ! $has_warning; then
11006 check_mds_dmesg '"is approaching"' && has_warning=true
11008 # check two errors:
11009 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
11010 # EFBIG for previous versions included in ldiskfs series
11011 if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
11013 echo "return code $rc received as expected"
11015 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
11016 error_exit "create failed w/o dir size limit"
11018 check_mds_dmesg '"has reached"' ||
11019 error_exit "reached message should be output"
11021 [ $has_warning = "false" ] &&
11022 error_exit "warning message should be output"
11024 dirsize=$(stat -c%s "$DIR/$tdir")
11026 [[ $dirsize -ge $maxsize ]] && return 0
11027 error_exit "current dir size $dirsize, " \
11028 "previous limit $maxsize"
11029 elif [ $rc -ne 0 ]; then
11031 error_exit "return $rc received instead of expected " \
11032 "$EFBIG or $ENOSPC, files in dir $dirsize"
11034 nfiles=$((nfiles + 1))
11035 dirsize=$(stat -c%s "$DIR/$tdir")
11039 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
11041 run_test 129 "test directory size limit ========================"
11050 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11051 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11053 trap cleanup_130 EXIT RETURN
11055 local fm_file=$DIR/$tfile
11056 $SETSTRIPE -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
11057 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
11058 error "dd failed for $fm_file"
11060 # LU-1795: test filefrag/FIEMAP once, even if unsupported
11061 filefrag -ves $fm_file
11063 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11064 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11065 [ $RC != 0 ] && error "filefrag $fm_file failed"
11067 filefrag_op=$(filefrag -ve -k $fm_file |
11068 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11069 lun=$($GETSTRIPE -i $fm_file)
11071 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
11074 for line in $filefrag_op
11076 frag_lun=`echo $line | cut -d: -f5`
11077 ext_len=`echo $line | cut -d: -f4`
11078 if (( $frag_lun != $lun )); then
11080 error "FIEMAP on 1-stripe file($fm_file) failed"
11083 (( tot_len += ext_len ))
11086 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
11088 error "FIEMAP on 1-stripe file($fm_file) failed;"
11094 echo "FIEMAP on single striped file succeeded"
11096 run_test 130a "FIEMAP (1-stripe file)"
11099 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11101 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11102 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11104 trap cleanup_130 EXIT RETURN
11106 local fm_file=$DIR/$tfile
11107 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11108 error "setstripe on $fm_file"
11109 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11110 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11112 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
11113 error "dd failed on $fm_file"
11115 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11116 filefrag_op=$(filefrag -ve -k $fm_file |
11117 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11119 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11120 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11125 for line in $filefrag_op
11127 frag_lun=$(echo $line | cut -d: -f5 |
11128 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11129 ext_len=$(echo $line | cut -d: -f4)
11130 if (( $frag_lun != $last_lun )); then
11131 if (( tot_len != 1024 )); then
11133 error "FIEMAP on $fm_file failed; returned " \
11134 "len $tot_len for OST $last_lun instead of 1024"
11137 (( num_luns += 1 ))
11141 (( tot_len += ext_len ))
11144 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
11146 error "FIEMAP on $fm_file failed; returned wrong number of " \
11147 "luns or wrong len for OST $last_lun"
11153 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
11155 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
11158 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11160 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11161 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11163 trap cleanup_130 EXIT RETURN
11165 local fm_file=$DIR/$tfile
11166 $SETSTRIPE -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
11167 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11168 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11170 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
11171 error "dd failed on $fm_file"
11173 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11174 filefrag_op=$(filefrag -ve -k $fm_file |
11175 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11177 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11178 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11183 for line in $filefrag_op
11185 frag_lun=$(echo $line | cut -d: -f5 |
11186 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11187 ext_len=$(echo $line | cut -d: -f4)
11188 if (( $frag_lun != $last_lun )); then
11189 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
11190 if (( logical != 512 )); then
11192 error "FIEMAP on $fm_file failed; returned " \
11193 "logical start for lun $logical instead of 512"
11196 if (( tot_len != 512 )); then
11198 error "FIEMAP on $fm_file failed; returned " \
11199 "len $tot_len for OST $last_lun instead of 1024"
11202 (( num_luns += 1 ))
11206 (( tot_len += ext_len ))
11209 if (( num_luns != 2 || tot_len != 512 )); then
11211 error "FIEMAP on $fm_file failed; returned wrong number of " \
11212 "luns or wrong len for OST $last_lun"
11218 echo "FIEMAP on 2-stripe file with hole succeeded"
11220 run_test 130c "FIEMAP (2-stripe file with hole)"
11223 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
11225 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11226 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11228 trap cleanup_130 EXIT RETURN
11230 local fm_file=$DIR/$tfile
11231 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11232 error "setstripe on $fm_file"
11233 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11234 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11236 local actual_stripe_count=$($GETSTRIPE -c $fm_file)
11237 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
11238 error "dd failed on $fm_file"
11240 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11241 filefrag_op=$(filefrag -ve -k $fm_file |
11242 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11244 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11245 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11250 for line in $filefrag_op
11252 frag_lun=$(echo $line | cut -d: -f5 |
11253 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11254 ext_len=$(echo $line | cut -d: -f4)
11255 if (( $frag_lun != $last_lun )); then
11256 if (( tot_len != 1024 )); then
11258 error "FIEMAP on $fm_file failed; returned " \
11259 "len $tot_len for OST $last_lun instead of 1024"
11262 (( num_luns += 1 ))
11266 (( tot_len += ext_len ))
11269 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
11271 error "FIEMAP on $fm_file failed; returned wrong number of " \
11272 "luns or wrong len for OST $last_lun"
11278 echo "FIEMAP on N-stripe file succeeded"
11280 run_test 130d "FIEMAP (N-stripe file)"
11283 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11285 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11286 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11288 trap cleanup_130 EXIT RETURN
11290 local fm_file=$DIR/$tfile
11291 $SETSTRIPE -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11292 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11293 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11296 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11297 for ((i = 0; i < $NUM_BLKS; i++))
11299 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11302 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11303 filefrag_op=$(filefrag -ve -k $fm_file |
11304 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11306 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11307 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11312 for line in $filefrag_op
11314 frag_lun=$(echo $line | cut -d: -f5 |
11315 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11316 ext_len=$(echo $line | cut -d: -f4)
11317 if (( $frag_lun != $last_lun )); then
11318 if (( tot_len != $EXPECTED_LEN )); then
11320 error "FIEMAP on $fm_file failed; returned " \
11321 "len $tot_len for OST $last_lun instead " \
11325 (( num_luns += 1 ))
11329 (( tot_len += ext_len ))
11332 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11334 error "FIEMAP on $fm_file failed; returned wrong number " \
11335 "of luns or wrong len for OST $last_lun"
11341 echo "FIEMAP with continuation calls succeeded"
11343 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11346 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11347 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11349 local fm_file=$DIR/$tfile
11350 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11351 error "multiop create with lov_delay_create on $fm_file"
11353 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11354 filefrag_extents=$(filefrag -vek $fm_file |
11355 awk '/extents? found/ { print $2 }')
11356 if [[ "$filefrag_extents" != "0" ]]; then
11357 error "FIEMAP on $fm_file failed; " \
11358 "returned $filefrag_extents expected 0"
11363 run_test 130f "FIEMAP (unstriped file)"
11365 # Test for writev/readv
11367 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11368 error "writev test failed"
11369 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11370 error "readv failed"
11373 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11376 local fsize=$((524288 + 1048576 + 1572864))
11377 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11378 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11379 error "append writev test failed"
11381 ((fsize += 1572864 + 1048576))
11382 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11383 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11384 error "append writev test failed"
11387 run_test 131b "test append writev"
11390 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11393 run_test 131c "test read/write on file w/o objects"
11396 rwv -f $DIR/$tfile -w -n 1 1572864
11397 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11398 if [ "$NOB" != 1572864 ]; then
11399 error "Short read filed: read $NOB bytes instead of 1572864"
11403 run_test 131d "test short read"
11406 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11407 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11408 error "read hitting hole failed"
11411 run_test 131e "test read hitting hole"
11420 mds*) res=$(do_facet $facet \
11421 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11423 ost*) res=$(do_facet $facet \
11424 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
11426 *) error "Wrong facet '$facet'" ;;
11428 [ "$res" ] || error "The counter for $op on $facet was not incremented"
11429 # if the argument $3 is zero, it means any stat increment is ok.
11430 if [[ $want -gt 0 ]]; then
11431 local count=$(echo $res | awk '{ print $2 }')
11432 [[ $count -ne $want ]] &&
11433 error "The $op counter on $facet is $count, not $want"
11438 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11439 remote_ost_nodsh && skip "remote OST with nodsh"
11440 remote_mds_nodsh && skip "remote MDS with nodsh"
11441 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11442 skip_env "MDS doesn't support rename stats"
11444 local testdir=$DIR/${tdir}/stats_testdir
11446 mkdir -p $DIR/${tdir}
11449 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11450 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11452 # verify mdt stats first.
11453 mkdir ${testdir} || error "mkdir failed"
11454 check_stats $SINGLEMDS "mkdir" 1
11455 touch ${testdir}/${tfile} || error "touch failed"
11456 check_stats $SINGLEMDS "open" 1
11457 check_stats $SINGLEMDS "close" 1
11458 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
11459 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
11460 check_stats $SINGLEMDS "mknod" 2
11462 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
11463 check_stats $SINGLEMDS "unlink" 1
11464 rm -f ${testdir}/${tfile} || error "file remove failed"
11465 check_stats $SINGLEMDS "unlink" 2
11467 # remove working dir and check mdt stats again.
11468 rmdir ${testdir} || error "rmdir failed"
11469 check_stats $SINGLEMDS "rmdir" 1
11471 local testdir1=$DIR/${tdir}/stats_testdir1
11472 mkdir -p ${testdir}
11473 mkdir -p ${testdir1}
11474 touch ${testdir1}/test1
11475 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
11476 check_stats $SINGLEMDS "crossdir_rename" 1
11478 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
11479 check_stats $SINGLEMDS "samedir_rename" 1
11481 rm -rf $DIR/${tdir}
11483 run_test 133a "Verifying MDT stats ========================================"
11488 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11489 remote_ost_nodsh && skip "remote OST with nodsh"
11490 remote_mds_nodsh && skip "remote MDS with nodsh"
11492 local testdir=$DIR/${tdir}/stats_testdir
11494 mkdir -p ${testdir} || error "mkdir failed"
11495 touch ${testdir}/${tfile} || error "touch failed"
11496 cancel_lru_locks mdc
11499 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11500 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11502 # extra mdt stats verification.
11503 chmod 444 ${testdir}/${tfile} || error "chmod failed"
11504 check_stats $SINGLEMDS "setattr" 1
11505 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11506 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
11508 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
11509 check_stats $SINGLEMDS "getattr" 1
11511 rm -rf $DIR/${tdir}
11513 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
11514 # so the check below is not reliable
11515 [ $MDSCOUNT -eq 1 ] || return 0
11517 # Sleep to avoid a cached response.
11518 #define OBD_STATFS_CACHE_SECONDS 1
11520 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11521 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11522 $LFS df || error "lfs failed"
11523 check_stats $SINGLEMDS "statfs" 1
11525 # check aggregated statfs (LU-10018)
11526 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
11528 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
11531 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11532 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11534 check_stats $SINGLEMDS "statfs" 1
11536 # We want to check that the client didn't send OST_STATFS to
11537 # ost1 but the MDT also uses OST_STATFS for precreate. So some
11538 # extra care is needed here.
11539 if remote_mds; then
11540 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
11541 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
11543 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
11544 [ "$res" ] && error "OST got STATFS"
11549 run_test 133b "Verifying extra MDT stats =================================="
11552 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11553 remote_ost_nodsh && skip "remote OST with nodsh"
11554 remote_mds_nodsh && skip "remote MDS with nodsh"
11556 local testdir=$DIR/$tdir/stats_testdir
11558 test_mkdir -p $testdir
11560 # verify obdfilter stats.
11561 $SETSTRIPE -c 1 -i 0 $testdir/$tfile
11563 cancel_lru_locks osc
11564 wait_delete_completed
11567 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11568 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11570 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
11573 cancel_lru_locks osc
11574 check_stats ost1 "write" 1
11576 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
11577 check_stats ost1 "read" 1
11579 > $testdir/$tfile || error "truncate failed"
11580 check_stats ost1 "punch" 1
11582 rm -f $testdir/$tfile || error "file remove failed"
11583 wait_delete_completed
11584 check_stats ost1 "destroy" 1
11588 run_test 133c "Verifying OST stats ========================================"
11595 while [ $value -ge 2 ]; do
11600 if [ $orig -gt $order ]; then
11608 local size=('K' 'M' 'G' 'T');
11610 local size_string=$value
11612 while [ $value -ge 1024 ]; do
11613 if [ $i -gt 3 ]; then
11614 #T is the biggest unit we get here, if that is bigger,
11616 size_string=${value}T
11619 value=$((value >> 10))
11620 if [ $value -lt 1024 ]; then
11621 size_string=${value}${size[$i]}
11630 get_rename_size() {
11632 local context=${2:-.}
11633 local sample=$(do_facet $SINGLEMDS $LCTL \
11634 get_param mdt.$FSNAME-MDT0000.rename_stats |
11635 grep -A1 $context |
11636 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
11641 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11642 remote_ost_nodsh && skip "remote OST with nodsh"
11643 remote_mds_nodsh && skip "remote MDS with nodsh"
11644 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11645 skip_env "MDS doesn't support rename stats"
11647 local testdir1=$DIR/${tdir}/stats_testdir1
11648 local testdir2=$DIR/${tdir}/stats_testdir2
11649 mkdir -p $DIR/${tdir}
11651 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11653 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
11654 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
11656 createmany -o $testdir1/test 512 || error "createmany failed"
11658 # check samedir rename size
11659 mv ${testdir1}/test0 ${testdir1}/test_0
11661 local testdir1_size=$(ls -l $DIR/${tdir} |
11662 awk '/stats_testdir1/ {print $5}')
11663 local testdir2_size=$(ls -l $DIR/${tdir} |
11664 awk '/stats_testdir2/ {print $5}')
11666 testdir1_size=$(order_2 $testdir1_size)
11667 testdir2_size=$(order_2 $testdir2_size)
11669 testdir1_size=$(size_in_KMGT $testdir1_size)
11670 testdir2_size=$(size_in_KMGT $testdir2_size)
11672 echo "source rename dir size: ${testdir1_size}"
11673 echo "target rename dir size: ${testdir2_size}"
11675 local cmd="do_facet $SINGLEMDS $LCTL "
11676 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
11678 eval $cmd || error "$cmd failed"
11679 local samedir=$($cmd | grep 'same_dir')
11680 local same_sample=$(get_rename_size $testdir1_size)
11681 [ -z "$samedir" ] && error "samedir_rename_size count error"
11682 [[ $same_sample -eq 1 ]] ||
11683 error "samedir_rename_size error $same_sample"
11684 echo "Check same dir rename stats success"
11686 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11688 # check crossdir rename size
11689 mv ${testdir1}/test_0 ${testdir2}/test_0
11691 testdir1_size=$(ls -l $DIR/${tdir} |
11692 awk '/stats_testdir1/ {print $5}')
11693 testdir2_size=$(ls -l $DIR/${tdir} |
11694 awk '/stats_testdir2/ {print $5}')
11696 testdir1_size=$(order_2 $testdir1_size)
11697 testdir2_size=$(order_2 $testdir2_size)
11699 testdir1_size=$(size_in_KMGT $testdir1_size)
11700 testdir2_size=$(size_in_KMGT $testdir2_size)
11702 echo "source rename dir size: ${testdir1_size}"
11703 echo "target rename dir size: ${testdir2_size}"
11705 eval $cmd || error "$cmd failed"
11706 local crossdir=$($cmd | grep 'crossdir')
11707 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
11708 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
11709 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
11710 [[ $src_sample -eq 1 ]] ||
11711 error "crossdir_rename_size error $src_sample"
11712 [[ $tgt_sample -eq 1 ]] ||
11713 error "crossdir_rename_size error $tgt_sample"
11714 echo "Check cross dir rename stats success"
11715 rm -rf $DIR/${tdir}
11717 run_test 133d "Verifying rename_stats ========================================"
11720 remote_mds_nodsh && skip "remote MDS with nodsh"
11721 remote_ost_nodsh && skip "remote OST with nodsh"
11722 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11724 local testdir=$DIR/${tdir}/stats_testdir
11725 local ctr f0 f1 bs=32768 count=42 sum
11727 mkdir -p ${testdir} || error "mkdir failed"
11729 $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
11731 for ctr in {write,read}_bytes; do
11733 cancel_lru_locks osc
11735 do_facet ost1 $LCTL set_param -n \
11736 "obdfilter.*.exports.clear=clear"
11738 if [ $ctr = write_bytes ]; then
11740 f1=${testdir}/${tfile}
11742 f0=${testdir}/${tfile}
11746 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
11749 cancel_lru_locks osc
11751 sum=$(do_facet ost1 $LCTL get_param \
11752 "obdfilter.*.exports.*.stats" |
11753 awk -v ctr=$ctr 'BEGIN { sum = 0 }
11754 $1 == ctr { sum += $7 }
11755 END { printf("%0.0f", sum) }')
11757 if ((sum != bs * count)); then
11758 error "Bad $ctr sum, expected $((bs * count)), got $sum"
11762 rm -rf $DIR/${tdir}
11764 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
11766 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
11768 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
11769 # not honor the -ignore_readdir_race option correctly. So we call
11770 # error_ignore() rather than error() in these cases. See LU-11152.
11772 if (find --version; do_facet mds1 find --version) |
11773 grep -q '\b4\.5\.1[1-4]\b'; then
11774 error_ignore LU-11152 "$@"
11781 # First without trusting modes.
11782 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
11783 echo "proc_dirs='$proc_dirs'"
11784 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
11785 find $proc_dirs -exec cat '{}' \; &> /dev/null
11787 # Second verifying readability.
11788 $LCTL get_param -R '*' &> /dev/null
11790 # Verifing writability with badarea_io.
11792 -ignore_readdir_race \
11794 -not -name force_lbug \
11795 -not -name changelog_mask \
11796 -exec badarea_io '{}' \; ||
11797 error_133 "find $proc_dirs failed"
11799 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
11802 remote_mds_nodsh && skip "remote MDS with nodsh"
11803 remote_ost_nodsh && skip "remote OST with nodsh"
11805 # eventually, this can also be replaced with "lctl get_param -R",
11806 # but not until that option is always available on the server
11808 for facet in mds1 ost1; do
11809 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
11810 skip_noexit "Too old lustre on $facet"
11811 local facet_proc_dirs=$(do_facet $facet \
11812 \\\ls -d $proc_regexp 2>/dev/null)
11813 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11814 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11815 do_facet $facet find $facet_proc_dirs \
11816 ! -name req_history \
11817 -exec cat '{}' \\\; &> /dev/null
11819 do_facet $facet find $facet_proc_dirs \
11820 ! -name req_history \
11822 -exec cat '{}' \\\; &> /dev/null ||
11823 error "proc file read failed"
11825 do_facet $facet find $facet_proc_dirs \
11826 -ignore_readdir_race \
11828 -not -name force_lbug \
11829 -not -name changelog_mask \
11830 -exec badarea_io '{}' \\\; ||
11831 error_133 "$facet find $facet_proc_dirs failed"
11834 # remount the FS in case writes/reads /proc break the FS
11835 cleanup || error "failed to unmount"
11836 setup || error "failed to setup"
11839 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
11842 remote_mds_nodsh && skip "remote MDS with nodsh"
11843 remote_ost_nodsh && skip "remote OST with nodsh"
11844 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
11845 skip "Need MDS version at least 2.9.54"
11849 for facet in client mds1 ost1; do
11850 local facet_proc_dirs=$(do_facet $facet \
11851 \\\ls -d $proc_regexp 2> /dev/null)
11852 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11853 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11854 # Get the list of files that are missing the terminating newline
11855 local missing=($(do_facet $facet \
11856 find ${facet_proc_dirs} -type f \| \
11857 while read F\; do \
11858 awk -v FS='\v' -v RS='\v\v' \
11859 "'END { if(NR>0 && \
11860 \\\$NF !~ /.*\\\n\$/) \
11861 print FILENAME}'" \
11864 [ ${#missing[*]} -eq 0 ] ||
11865 error "files do not end with newline: ${missing[*]}"
11868 run_test 133h "Proc files should end with newlines"
11871 remote_mds_nodsh && skip "remote MDS with nodsh"
11872 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11873 skip "Need MDS version at least 2.7.54"
11875 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11876 cancel_lru_locks mdc
11878 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
11879 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11880 [ $unused -eq 0 ] || error "$unused locks are not cleared"
11883 createmany -o $DIR/$tdir/f $nr ||
11884 error "failed to create $nr files in $DIR/$tdir"
11885 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11887 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
11888 do_facet mds1 $LCTL set_param fail_loc=0x327
11889 do_facet mds1 $LCTL set_param fail_val=500
11892 echo "sleep 10 seconds ..."
11894 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
11896 do_facet mds1 $LCTL set_param fail_loc=0
11897 do_facet mds1 $LCTL set_param fail_val=0
11898 [ $lck_cnt -lt $unused ] ||
11899 error "No locks reclaimed, before:$unused, after:$lck_cnt"
11902 unlinkmany $DIR/$tdir/f $nr
11904 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
11907 remote_mds_nodsh && skip "remote MDS with nodsh"
11908 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
11909 skip "Need MDS version at least 2.7.54"
11911 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
11912 cancel_lru_locks mdc
11914 local low_wm=$(do_facet mds1 $LCTL get_param -n \
11915 ldlm.lock_reclaim_threshold_mb)
11916 # disable reclaim temporarily
11917 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
11919 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
11920 do_facet mds1 $LCTL set_param fail_loc=0x328
11921 do_facet mds1 $LCTL set_param fail_val=500
11923 $LCTL set_param debug=+trace
11926 createmany -o $DIR/$tdir/f $nr &
11927 local create_pid=$!
11929 echo "Sleep $TIMEOUT seconds ..."
11931 if ! ps -p $create_pid > /dev/null 2>&1; then
11932 do_facet mds1 $LCTL set_param fail_loc=0
11933 do_facet mds1 $LCTL set_param fail_val=0
11934 do_facet mds1 $LCTL set_param \
11935 ldlm.lock_reclaim_threshold_mb=${low_wm}m
11936 error "createmany finished incorrectly!"
11938 do_facet mds1 $LCTL set_param fail_loc=0
11939 do_facet mds1 $LCTL set_param fail_val=0
11940 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
11941 wait $create_pid || return 1
11943 unlinkmany $DIR/$tdir/f $nr
11945 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
11947 test_140() { #bug-17379
11948 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11950 test_mkdir $DIR/$tdir
11951 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
11952 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
11954 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
11955 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
11957 while i=$((i + 1)); do
11959 cd $i || error "Changing to $i"
11960 ln -s ../stat stat || error "Creating stat symlink"
11961 # Read the symlink until ELOOP present,
11962 # not LBUGing the system is considered success,
11963 # we didn't overrun the stack.
11964 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
11965 if [ $ret -ne 0 ]; then
11966 if [ $ret -eq 40 ]; then
11969 error "Open stat symlink"
11975 echo "The symlink depth = $i"
11976 [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] ||
11977 error "Invalid symlink depth"
11979 # Test recursive symlink
11980 ln -s symlink_self symlink_self
11981 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
11982 echo "open symlink_self returns $ret"
11983 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
11985 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
11988 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11990 local TF="$TMP/$tfile"
11992 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
11994 cancel_lru_locks $OSC
11995 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
11996 remount_client $MOUNT
11998 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
12001 $TRUNCATE $DIR/$tfile 6000
12002 cancel_lru_locks $OSC
12003 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
12006 echo "12345" >>$DIR/$tfile
12007 cancel_lru_locks $OSC
12008 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
12011 echo "12345" >>$DIR/$tfile
12012 cancel_lru_locks $OSC
12013 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
12018 run_test 150 "truncate/append tests"
12020 #LU-2902 roc_hit was not able to read all values from lproc
12021 function roc_hit_init() {
12022 local list=$(comma_list $(osts_nodes))
12023 local dir=$DIR/$tdir-check
12024 local file=$dir/$tfile
12030 #use setstripe to do a write to every ost
12031 for i in $(seq 0 $((OSTCOUNT-1))); do
12032 $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
12033 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
12034 idx=$(printf %04x $i)
12035 BEFORE=$(get_osd_param $list *OST*$idx stats |
12036 awk '$1 == "cache_access" {sum += $7}
12037 END { printf("%0.0f", sum) }')
12039 cancel_lru_locks osc
12040 cat $file >/dev/null
12042 AFTER=$(get_osd_param $list *OST*$idx stats |
12043 awk '$1 == "cache_access" {sum += $7}
12044 END { printf("%0.0f", sum) }')
12046 echo BEFORE:$BEFORE AFTER:$AFTER
12047 if ! let "AFTER - BEFORE == 4"; then
12049 error "roc_hit is not safe to use"
12057 function roc_hit() {
12058 local list=$(comma_list $(osts_nodes))
12059 echo $(get_osd_param $list '' stats |
12060 awk '$1 == "cache_hit" {sum += $7}
12061 END { printf("%0.0f", sum) }')
12064 function set_cache() {
12067 if [ "$2" == "off" ]; then
12070 local list=$(comma_list $(osts_nodes))
12071 set_osd_param $list '' $1_cache_enable $on
12073 cancel_lru_locks osc
12077 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12078 remote_ost_nodsh && skip "remote OST with nodsh"
12081 local list=$(comma_list $(osts_nodes))
12083 # check whether obdfilter is cache capable at all
12084 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
12085 skip "not cache-capable obdfilter"
12088 # check cache is enabled on all obdfilters
12089 if get_osd_param $list '' read_cache_enable | grep 0; then
12090 skip "oss cache is disabled"
12093 set_osd_param $list '' writethrough_cache_enable 1
12095 # check write cache is enabled on all obdfilters
12096 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
12097 skip "oss write cache is NOT enabled"
12102 #define OBD_FAIL_OBD_NO_LRU 0x609
12103 do_nodes $list $LCTL set_param fail_loc=0x609
12105 # pages should be in the case right after write
12106 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
12109 local BEFORE=$(roc_hit)
12110 cancel_lru_locks osc
12111 cat $DIR/$tfile >/dev/null
12112 local AFTER=$(roc_hit)
12114 do_nodes $list $LCTL set_param fail_loc=0
12116 if ! let "AFTER - BEFORE == CPAGES"; then
12117 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12120 # the following read invalidates the cache
12121 cancel_lru_locks osc
12122 set_osd_param $list '' read_cache_enable 0
12123 cat $DIR/$tfile >/dev/null
12125 # now data shouldn't be found in the cache
12127 cancel_lru_locks osc
12128 cat $DIR/$tfile >/dev/null
12130 if let "AFTER - BEFORE != 0"; then
12131 error "IN CACHE: before: $BEFORE, after: $AFTER"
12134 set_osd_param $list '' read_cache_enable 1
12137 run_test 151 "test cache on oss and controls ==============================="
12140 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12142 local TF="$TMP/$tfile"
12144 # simulate ENOMEM during write
12145 #define OBD_FAIL_OST_NOMEM 0x226
12146 lctl set_param fail_loc=0x80000226
12147 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12149 sync || error "sync failed"
12150 lctl set_param fail_loc=0
12152 # discard client's cache
12153 cancel_lru_locks osc
12155 # simulate ENOMEM during read
12156 lctl set_param fail_loc=0x80000226
12157 cmp $TF $DIR/$tfile || error "cmp failed"
12158 lctl set_param fail_loc=0
12162 run_test 152 "test read/write with enomem ============================"
12165 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
12167 run_test 153 "test if fdatasync does not crash ======================="
12169 dot_lustre_fid_permission_check() {
12171 local ffid=$MOUNT/.lustre/fid/$fid
12174 echo "stat fid $fid"
12175 stat $ffid > /dev/null || error "stat $ffid failed."
12176 echo "touch fid $fid"
12177 touch $ffid || error "touch $ffid failed."
12178 echo "write to fid $fid"
12179 cat /etc/hosts > $ffid || error "write $ffid failed."
12180 echo "read fid $fid"
12181 diff /etc/hosts $ffid || error "read $ffid failed."
12182 echo "append write to fid $fid"
12183 cat /etc/hosts >> $ffid || error "append write $ffid failed."
12184 echo "rename fid $fid"
12185 mv $ffid $test_dir/$tfile.1 &&
12186 error "rename $ffid to $tfile.1 should fail."
12187 touch $test_dir/$tfile.1
12188 mv $test_dir/$tfile.1 $ffid &&
12189 error "rename $tfile.1 to $ffid should fail."
12190 rm -f $test_dir/$tfile.1
12191 echo "truncate fid $fid"
12192 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
12193 echo "link fid $fid"
12194 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
12195 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
12196 echo "setfacl fid $fid"
12197 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
12198 echo "getfacl fid $fid"
12199 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
12201 echo "unlink fid $fid"
12202 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
12203 echo "mknod fid $fid"
12204 mknod $ffid c 1 3 && error "mknod $ffid should fail."
12206 fid=[0xf00000400:0x1:0x0]
12207 ffid=$MOUNT/.lustre/fid/$fid
12209 echo "stat non-exist fid $fid"
12210 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
12211 echo "write to non-exist fid $fid"
12212 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
12213 echo "link new fid $fid"
12214 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
12216 mkdir -p $test_dir/$tdir
12217 touch $test_dir/$tdir/$tfile
12218 fid=$($LFS path2fid $test_dir/$tdir)
12221 error "error: could not get fid for $test_dir/$dir/$tfile."
12223 ffid=$MOUNT/.lustre/fid/$fid
12226 ls $ffid > /dev/null || error "ls $ffid failed."
12227 echo "touch $fid/$tfile.1"
12228 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
12230 echo "touch $MOUNT/.lustre/fid/$tfile"
12231 touch $MOUNT/.lustre/fid/$tfile && \
12232 error "touch $MOUNT/.lustre/fid/$tfile should fail."
12234 echo "setxattr to $MOUNT/.lustre/fid"
12235 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
12237 echo "listxattr for $MOUNT/.lustre/fid"
12238 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
12240 echo "delxattr from $MOUNT/.lustre/fid"
12241 setfattr -x trusted.name1 $MOUNT/.lustre/fid
12243 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
12244 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
12245 error "touch invalid fid should fail."
12247 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
12248 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
12249 error "touch non-normal fid should fail."
12251 echo "rename $tdir to $MOUNT/.lustre/fid"
12252 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
12253 error "rename to $MOUNT/.lustre/fid should fail."
12255 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
12257 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
12258 local new_obf_mode=777
12260 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
12261 chmod $new_obf_mode $DIR/.lustre/fid ||
12262 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
12264 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
12265 [ $obf_mode -eq $new_obf_mode ] ||
12266 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
12268 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
12269 chmod $old_obf_mode $DIR/.lustre/fid ||
12270 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
12273 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
12274 fid=$($LFS path2fid $test_dir/$tfile-2)
12276 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
12278 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
12279 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
12280 error "create lov data thru .lustre failed"
12282 echo "cp /etc/passwd $test_dir/$tfile-2"
12283 cp /etc/passwd $test_dir/$tfile-2 ||
12284 error "copy to $test_dir/$tfile-2 failed."
12285 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
12286 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12287 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12289 rm -rf $test_dir/tfile.lnk
12290 rm -rf $test_dir/$tfile-2
12294 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12295 skip "Need MDS version at least 2.4.1"
12297 local tf=$DIR/$tfile
12300 local fid=$($LFS path2fid $tf)
12301 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12303 # check that we get the same pathname back
12304 local found=$($LFS fid2path $MOUNT "$fid")
12305 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12306 [ "$found" == "$tf" ] ||
12307 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12309 run_test 154A "lfs path2fid and fid2path basic checks"
12312 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12313 skip "Need MDS version at least 2.4.1"
12315 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12316 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12317 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12318 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12320 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12321 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12323 # check that we get the same pathname
12324 echo "PFID: $PFID, name: $name"
12325 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12326 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12327 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12328 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12330 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12332 run_test 154B "verify the ll_decode_linkea tool"
12335 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12336 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12337 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12338 skip "Need MDS version at least 2.2.51"
12339 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12341 cp /etc/hosts $DIR/$tfile
12343 fid=$($LFS path2fid $DIR/$tfile)
12345 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12347 dot_lustre_fid_permission_check "$fid" $DIR ||
12348 error "dot lustre permission check $fid failed"
12350 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12352 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12354 touch $MOUNT/.lustre/file &&
12355 error "creation is not allowed under .lustre"
12357 mkdir $MOUNT/.lustre/dir &&
12358 error "mkdir is not allowed under .lustre"
12362 run_test 154a "Open-by-FID"
12365 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12366 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12367 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12368 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12369 skip "Need MDS version at least 2.2.51"
12371 local remote_dir=$DIR/$tdir/remote_dir
12375 mkdir -p $DIR/$tdir
12376 $LFS mkdir -i $MDTIDX $remote_dir ||
12377 error "create remote directory failed"
12379 cp /etc/hosts $remote_dir/$tfile
12381 fid=$($LFS path2fid $remote_dir/$tfile)
12383 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12385 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12386 error "dot lustre permission check $fid failed"
12389 run_test 154b "Open-by-FID for remote directory"
12392 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12393 skip "Need MDS version at least 2.4.1"
12395 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12396 local FID1=$($LFS path2fid $DIR/$tfile.1)
12397 local FID2=$($LFS path2fid $DIR/$tfile.2)
12398 local FID3=$($LFS path2fid $DIR/$tfile.3)
12401 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12402 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12403 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12405 [ "$FID" = "${!want}" ] ||
12406 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12410 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12412 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12413 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12417 run_test 154c "lfs path2fid and fid2path multiple arguments"
12420 remote_mds_nodsh && skip "remote MDS with nodsh"
12421 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12422 skip "Need MDS version at least 2.5.53"
12424 if remote_mds; then
12425 nid=$($LCTL list_nids | sed "s/\./\\\./g")
12429 local proc_ofile="mdt.*.exports.'$nid'.open_files"
12436 local fid=$($LFS path2fid $DIR/$tfile)
12439 cmd="exec $fd<$DIR/$tfile"
12441 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
12442 echo "$fid_list" | grep "$fid"
12445 cmd="exec $fd>/dev/null"
12447 if [ $rc -ne 0 ]; then
12448 error "FID $fid not found in open files list $fid_list"
12451 run_test 154d "Verify open file fid"
12455 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
12456 skip "Need MDS version at least 2.6.50"
12458 if ls -a $MOUNT | grep -q '^\.lustre$'; then
12459 error ".lustre returned by readdir"
12462 run_test 154e ".lustre is not returned by readdir"
12465 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12467 # create parent directory on a single MDT to avoid cross-MDT hardlinks
12468 test_mkdir -p -c1 $DIR/$tdir/d
12469 # test dirs inherit from its stripe
12470 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
12471 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
12472 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
12473 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
12476 # get fid of parents
12477 local FID0=$($LFS path2fid $DIR/$tdir/d)
12478 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
12479 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
12480 local FID3=$($LFS path2fid $DIR)
12482 # check that path2fid --parents returns expected <parent_fid>/name
12483 # 1) test for a directory (single parent)
12484 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
12485 [ "$parent" == "$FID0/foo1" ] ||
12486 error "expected parent: $FID0/foo1, got: $parent"
12488 # 2) test for a file with nlink > 1 (multiple parents)
12489 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
12490 echo "$parent" | grep -F "$FID1/$tfile" ||
12491 error "$FID1/$tfile not returned in parent list"
12492 echo "$parent" | grep -F "$FID2/link" ||
12493 error "$FID2/link not returned in parent list"
12495 # 3) get parent by fid
12496 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
12497 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12498 echo "$parent" | grep -F "$FID1/$tfile" ||
12499 error "$FID1/$tfile not returned in parent list (by fid)"
12500 echo "$parent" | grep -F "$FID2/link" ||
12501 error "$FID2/link not returned in parent list (by fid)"
12503 # 4) test for entry in root directory
12504 parent=$($LFS path2fid --parents $DIR/f)
12505 echo "$parent" | grep -F "$FID3/f" ||
12506 error "$FID3/f not returned in parent list"
12508 # 5) test it on root directory
12509 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
12510 error "$MOUNT should not have parents"
12512 # enable xattr caching and check that linkea is correctly updated
12513 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
12514 save_lustre_params client "llite.*.xattr_cache" > $save
12515 lctl set_param llite.*.xattr_cache 1
12517 # 6.1) linkea update on rename
12518 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
12520 # get parents by fid
12521 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12522 # foo1 should no longer be returned in parent list
12523 echo "$parent" | grep -F "$FID1" &&
12524 error "$FID1 should no longer be in parent list"
12525 # the new path should appear
12526 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
12527 error "$FID2/$tfile.moved is not in parent list"
12529 # 6.2) linkea update on unlink
12530 rm -f $DIR/$tdir/d/foo2/link
12531 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12532 # foo2/link should no longer be returned in parent list
12533 echo "$parent" | grep -F "$FID2/link" &&
12534 error "$FID2/link should no longer be in parent list"
12538 restore_lustre_params < $save
12541 run_test 154f "get parent fids by reading link ea"
12545 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12546 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
12547 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
12548 skip "Need MDS version at least 2.6.92"
12550 mkdir -p $DIR/$tdir
12551 llapi_fid_test -d $DIR/$tdir
12553 run_test 154g "various llapi FID tests"
12555 test_155_small_load() {
12556 local temp=$TMP/$tfile
12557 local file=$DIR/$tfile
12559 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
12560 error "dd of=$temp bs=6096 count=1 failed"
12562 cancel_lru_locks $OSC
12563 cmp $temp $file || error "$temp $file differ"
12565 $TRUNCATE $temp 6000
12566 $TRUNCATE $file 6000
12567 cmp $temp $file || error "$temp $file differ (truncate1)"
12569 echo "12345" >>$temp
12570 echo "12345" >>$file
12571 cmp $temp $file || error "$temp $file differ (append1)"
12573 echo "12345" >>$temp
12574 echo "12345" >>$file
12575 cmp $temp $file || error "$temp $file differ (append2)"
12581 test_155_big_load() {
12582 remote_ost_nodsh && skip "remote OST with nodsh"
12584 local temp=$TMP/$tfile
12585 local file=$DIR/$tfile
12588 local cache_size=$(do_facet ost$((MAXI+1)) \
12589 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
12590 local large_file_size=$((cache_size * 2))
12592 echo "OSS cache size: $cache_size KB"
12593 echo "Large file size: $large_file_size KB"
12595 [ $MAXV -le $large_file_size ] &&
12596 skip_env "max available OST size needs > $large_file_size KB"
12598 $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed"
12600 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
12601 error "dd of=$temp bs=$large_file_size count=1k failed"
12604 cancel_lru_locks osc
12605 cmp $temp $file || error "$temp $file differ"
12611 save_writethrough() {
12612 local facets=$(get_facets OST)
12614 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
12618 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12620 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12622 save_writethrough $p
12625 set_cache writethrough on
12626 test_155_small_load
12627 restore_lustre_params < $p
12630 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
12633 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12635 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12637 save_writethrough $p
12640 set_cache writethrough off
12641 test_155_small_load
12642 restore_lustre_params < $p
12645 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
12648 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12650 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12652 save_writethrough $p
12655 set_cache writethrough on
12656 test_155_small_load
12657 restore_lustre_params < $p
12660 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
12663 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12665 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12667 save_writethrough $p
12670 set_cache writethrough off
12671 test_155_small_load
12672 restore_lustre_params < $p
12675 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
12678 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12680 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12682 save_writethrough $p
12685 set_cache writethrough on
12687 restore_lustre_params < $p
12690 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
12693 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12695 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12697 save_writethrough $p
12700 set_cache writethrough off
12702 restore_lustre_params < $p
12705 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
12708 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12710 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12712 save_writethrough $p
12715 set_cache writethrough on
12717 restore_lustre_params < $p
12720 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
12723 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12725 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12727 save_writethrough $p
12730 set_cache writethrough off
12732 restore_lustre_params < $p
12735 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
12738 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12739 remote_ost_nodsh && skip "remote OST with nodsh"
12740 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
12741 skip "stats not implemented on old servers"
12742 [ "$ost1_FSTYPE" = "zfs" ] &&
12743 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
12748 local file="$DIR/$tfile"
12749 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12751 save_writethrough $p
12754 log "Turn on read and write cache"
12756 set_cache writethrough on
12758 log "Write data and read it back."
12759 log "Read should be satisfied from the cache."
12760 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12762 cancel_lru_locks osc
12763 cat $file >/dev/null
12765 if ! let "AFTER - BEFORE == CPAGES"; then
12766 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12768 log "cache hits:: before: $BEFORE, after: $AFTER"
12771 log "Read again; it should be satisfied from the cache."
12773 cancel_lru_locks osc
12774 cat $file >/dev/null
12776 if ! let "AFTER - BEFORE == CPAGES"; then
12777 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12779 log "cache hits:: before: $BEFORE, after: $AFTER"
12782 log "Turn off the read cache and turn on the write cache"
12784 set_cache writethrough on
12786 log "Read again; it should be satisfied from the cache."
12788 cancel_lru_locks osc
12789 cat $file >/dev/null
12791 if ! let "AFTER - BEFORE == CPAGES"; then
12792 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12794 log "cache hits:: before: $BEFORE, after: $AFTER"
12797 log "Read again; it should not be satisfied from the cache."
12799 cancel_lru_locks osc
12800 cat $file >/dev/null
12802 if ! let "AFTER - BEFORE == 0"; then
12803 error "IN CACHE: before: $BEFORE, after: $AFTER"
12805 log "cache hits:: before: $BEFORE, after: $AFTER"
12808 log "Write data and read it back."
12809 log "Read should be satisfied from the cache."
12810 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12812 cancel_lru_locks osc
12813 cat $file >/dev/null
12815 if ! let "AFTER - BEFORE == CPAGES"; then
12816 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12818 log "cache hits:: before: $BEFORE, after: $AFTER"
12821 log "Read again; it should not be satisfied from the cache."
12823 cancel_lru_locks osc
12824 cat $file >/dev/null
12826 if ! let "AFTER - BEFORE == 0"; then
12827 error "IN CACHE: before: $BEFORE, after: $AFTER"
12829 log "cache hits:: before: $BEFORE, after: $AFTER"
12832 log "Turn off read and write cache"
12834 set_cache writethrough off
12836 log "Write data and read it back"
12837 log "It should not be satisfied from the cache."
12839 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12840 cancel_lru_locks osc
12842 cat $file >/dev/null
12844 if ! let "AFTER - BEFORE == 0"; then
12845 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12847 log "cache hits:: before: $BEFORE, after: $AFTER"
12850 log "Turn on the read cache and turn off the write cache"
12852 set_cache writethrough off
12854 log "Write data and read it back"
12855 log "It should not be satisfied from the cache."
12857 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12859 cancel_lru_locks osc
12860 cat $file >/dev/null
12862 if ! let "AFTER - BEFORE == 0"; then
12863 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12865 log "cache hits:: before: $BEFORE, after: $AFTER"
12868 log "Read again; it should be satisfied from the cache."
12870 cancel_lru_locks osc
12871 cat $file >/dev/null
12873 if ! let "AFTER - BEFORE == CPAGES"; then
12874 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12876 log "cache hits:: before: $BEFORE, after: $AFTER"
12879 restore_lustre_params < $p
12882 run_test 156 "Verification of tunables"
12885 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12886 remote_mds_nodsh && skip "remote MDS with nodsh"
12887 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
12888 skip "Need MDS version at least 2.2.0"
12890 changelog_register || error "changelog_register failed"
12891 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
12892 changelog_users $SINGLEMDS | grep -q $cl_user ||
12893 error "User $cl_user not found in changelog_users"
12896 test_mkdir -p $DIR/$tdir/pics/2008/zachy
12897 changelog_clear 0 || error "changelog_clear failed"
12898 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
12899 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
12900 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
12901 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
12902 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
12903 rm $DIR/$tdir/pics/desktop.jpg
12905 changelog_dump | tail -10
12907 echo "verifying changelog mask"
12908 changelog_chmask "-MKDIR"
12909 changelog_chmask "-CLOSE"
12911 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
12912 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
12914 changelog_chmask "+MKDIR"
12915 changelog_chmask "+CLOSE"
12917 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
12918 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
12920 changelog_dump | tail -10
12921 MKDIRS=$(changelog_dump | grep -c "MKDIR")
12922 CLOSES=$(changelog_dump | grep -c "CLOSE")
12923 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
12924 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
12927 echo "verifying target fid"
12928 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
12929 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
12930 [ "$fidc" == "$fidf" ] ||
12931 error "changelog '$tfile' fid $fidc != file fid $fidf"
12932 echo "verifying parent fid"
12933 # The FID returned from the Changelog may be the directory shard on
12934 # a different MDT, and not the FID returned by path2fid on the parent.
12935 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
12936 # since this is what will matter when recreating this file in the tree.
12937 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
12938 local pathp=$($LFS fid2path $MOUNT "$fidp")
12939 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
12940 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
12942 echo "getting records for $cl_user"
12943 changelog_users $SINGLEMDS
12944 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
12946 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
12947 error "changelog_clear failed"
12948 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
12949 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
12950 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
12951 error "user index expect $user_rec1 + $nclr != $user_rec2"
12953 local min0_rec=$(changelog_users $SINGLEMDS |
12954 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
12955 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
12956 awk '{ print $1; exit; }')
12958 changelog_dump | tail -n 5
12959 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
12960 [ $first_rec == $((min0_rec + 1)) ] ||
12961 error "first index should be $min0_rec + 1 not $first_rec"
12963 # LU-3446 changelog index reset on MDT restart
12964 local cur_rec1=$(changelog_users $SINGLEMDS |
12965 awk '/^current.index:/ { print $NF }')
12966 changelog_clear 0 ||
12967 error "clear all changelog records for $cl_user failed"
12968 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
12969 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
12970 error "Fail to start $SINGLEMDS"
12971 local cur_rec2=$(changelog_users $SINGLEMDS |
12972 awk '/^current.index:/ { print $NF }')
12973 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
12974 [ $cur_rec1 == $cur_rec2 ] ||
12975 error "current index should be $cur_rec1 not $cur_rec2"
12977 echo "verifying users from this test are deregistered"
12978 changelog_deregister || error "changelog_deregister failed"
12979 changelog_users $SINGLEMDS | grep -q $cl_user &&
12980 error "User '$cl_user' still in changelog_users"
12982 # lctl get_param -n mdd.*.changelog_users
12983 # current index: 144
12984 # ID index (idle seconds)
12986 if ! changelog_users $SINGLEMDS | grep "^cl"; then
12987 # this is the normal case where all users were deregistered
12988 # make sure no new records are added when no users are present
12989 local last_rec1=$(changelog_users $SINGLEMDS |
12990 awk '/^current.index:/ { print $NF }')
12991 touch $DIR/$tdir/chloe
12992 local last_rec2=$(changelog_users $SINGLEMDS |
12993 awk '/^current.index:/ { print $NF }')
12994 echo "verify changelogs are off: $last_rec1 == $last_rec2"
12995 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
12997 # any changelog users must be leftovers from a previous test
12998 changelog_users $SINGLEMDS
12999 echo "other changelog users; can't verify off"
13002 run_test 160a "changelog sanity"
13004 test_160b() { # LU-3587
13005 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13006 remote_mds_nodsh && skip "remote MDS with nodsh"
13007 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13008 skip "Need MDS version at least 2.2.0"
13010 changelog_register || error "changelog_register failed"
13011 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13012 changelog_users $SINGLEMDS | grep -q $cl_user ||
13013 error "User '$cl_user' not found in changelog_users"
13015 local longname1=$(str_repeat a 255)
13016 local longname2=$(str_repeat b 255)
13019 echo "creating very long named file"
13020 touch $longname1 || error "create of '$longname1' failed"
13021 echo "renaming very long named file"
13022 mv $longname1 $longname2
13024 changelog_dump | grep RENME | tail -n 5
13027 run_test 160b "Verify that very long rename doesn't crash in changelog"
13030 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13031 remote_mds_nodsh && skip "remote MDS with nodsh"
13033 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
13034 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
13035 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
13036 skip "Need MDS version at least 2.5.58 or 2.5.2+"
13040 # Registration step
13041 changelog_register || error "changelog_register failed"
13044 mkdir -p $DIR/$tdir
13045 $MCREATE $DIR/$tdir/foo_160c
13046 changelog_chmask "-TRUNC"
13047 $TRUNCATE $DIR/$tdir/foo_160c 200
13048 changelog_chmask "+TRUNC"
13049 $TRUNCATE $DIR/$tdir/foo_160c 199
13050 changelog_dump | tail -n 5
13051 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
13052 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
13054 run_test 160c "verify that changelog log catch the truncate event"
13057 remote_mds_nodsh && skip "remote MDS with nodsh"
13058 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13059 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13060 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
13061 skip "Need MDS version at least 2.7.60"
13063 # Registration step
13064 changelog_register || error "changelog_register failed"
13066 mkdir -p $DIR/$tdir/migrate_dir
13067 changelog_clear 0 || error "changelog_clear failed"
13069 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
13070 changelog_dump | tail -n 5
13071 local migrates=$(changelog_dump | grep -c "MIGRT")
13072 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
13074 run_test 160d "verify that changelog log catch the migrate event"
13077 remote_mds_nodsh && skip "remote MDS with nodsh"
13080 changelog_register || error "changelog_register failed"
13082 # Delete a future user (expect fail)
13083 local MDT0=$(facet_svc $SINGLEMDS)
13084 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
13087 if [ $rc -eq 0 ]; then
13088 error "Deleted non-existant user cl77"
13089 elif [ $rc -ne 2 ]; then
13090 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
13093 # Clear to a bad index (1 billion should be safe)
13094 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
13097 if [ $rc -eq 0 ]; then
13098 error "Successfully cleared to invalid CL index"
13099 elif [ $rc -ne 22 ]; then
13100 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
13103 run_test 160e "changelog negative testing (should return errors)"
13106 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13107 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13108 skip "Need MDS version at least 2.10.56"
13110 local mdts=$(comma_list $(mdts_nodes))
13113 changelog_register || error "first changelog_register failed"
13114 changelog_register || error "second changelog_register failed"
13116 declare -A cl_user1
13117 declare -A cl_user2
13122 # generate some changelog records to accumulate on each MDT
13123 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13124 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13125 error "create $DIR/$tdir/$tfile failed"
13127 # check changelogs have been generated
13128 local nbcl=$(changelog_dump | wc -l)
13129 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13131 for param in "changelog_max_idle_time=10" \
13133 "changelog_min_gc_interval=2" \
13134 "changelog_min_free_cat_entries=3"; do
13135 local MDT0=$(facet_svc $SINGLEMDS)
13136 local var="${param%=*}"
13137 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13139 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13140 do_nodes $mdts $LCTL set_param mdd.*.$param
13143 # force cl_user2 to be idle (1st part)
13146 # simulate changelog catalog almost full
13147 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13148 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13150 for i in $(seq $MDSCOUNT); do
13151 cl_users=(${CL_USERS[mds$i]})
13152 cl_user1[mds$i]="${cl_users[0]}"
13153 cl_user2[mds$i]="${cl_users[1]}"
13155 [ -n "${cl_user1[mds$i]}" ] ||
13156 error "mds$i: no user registered"
13157 [ -n "${cl_user2[mds$i]}" ] ||
13158 error "mds$i: only ${cl_user2[mds$i]} is registered"
13160 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13161 [ -n "$user_rec1" ] ||
13162 error "mds$i: User ${cl_user1[mds$i]} not registered"
13163 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13164 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13165 [ -n "$user_rec2" ] ||
13166 error "mds$i: User ${cl_user1[mds$i]} not registered"
13167 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13168 "$user_rec1 + 2 == $user_rec2"
13169 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13170 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13171 "$user_rec1 + 2, but is $user_rec2"
13172 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13173 [ -n "$user_rec2" ] ||
13174 error "mds$i: User ${cl_user2[mds$i]} not registered"
13175 [ $user_rec1 == $user_rec2 ] ||
13176 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13177 "$user_rec1, but is $user_rec2"
13180 # force cl_user2 to be idle (2nd part) and to reach
13181 # changelog_max_idle_time
13184 # generate one more changelog to trigger fail_loc
13185 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13186 error "create $DIR/$tdir/${tfile}bis failed"
13188 # ensure gc thread is done
13189 for i in $(mdts_nodes); do
13191 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13192 error "$i: GC-thread not done"
13196 for i in $(seq $MDSCOUNT); do
13197 # check cl_user1 still registered
13198 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13199 error "mds$i: User ${cl_user1[mds$i]} not registered"
13200 # check cl_user2 unregistered
13201 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13202 error "mds$i: User ${cl_user2[mds$i]} still registered"
13204 # check changelogs are present and starting at $user_rec1 + 1
13205 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13206 [ -n "$user_rec1" ] ||
13207 error "mds$i: User ${cl_user1[mds$i]} not registered"
13208 first_rec=$($LFS changelog $(facet_svc mds$i) |
13209 awk '{ print $1; exit; }')
13211 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13212 [ $((user_rec1 + 1)) == $first_rec ] ||
13213 error "mds$i: first index should be $user_rec1 + 1, " \
13214 "but is $first_rec"
13217 run_test 160f "changelog garbage collect (timestamped users)"
13220 remote_mds_nodsh && skip "remote MDS with nodsh"
13221 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13222 skip "Need MDS version at least 2.10.56"
13224 local mdts=$(comma_list $(mdts_nodes))
13226 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
13227 do_nodes $mdts $LCTL set_param fail_loc=0x1314
13230 changelog_register || error "first changelog_register failed"
13231 changelog_register || error "second changelog_register failed"
13233 declare -A cl_user1
13234 declare -A cl_user2
13239 # generate some changelog records to accumulate on each MDT
13240 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13241 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13242 error "create $DIR/$tdir/$tfile failed"
13244 # check changelogs have been generated
13245 local nbcl=$(changelog_dump | wc -l)
13246 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13248 # reduce the max_idle_indexes value to make sure we exceed it
13249 max_ndx=$((nbcl / 2 - 1))
13251 for param in "changelog_max_idle_indexes=$max_ndx" \
13253 "changelog_min_gc_interval=2" \
13254 "changelog_min_free_cat_entries=3"; do
13255 local MDT0=$(facet_svc $SINGLEMDS)
13256 local var="${param%=*}"
13257 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13259 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13260 do_nodes $mdts $LCTL set_param mdd.*.$param ||
13261 error "unable to set mdd.*.$param"
13264 # simulate changelog catalog almost full
13265 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13266 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13268 for i in $(seq $MDSCOUNT); do
13269 cl_users=(${CL_USERS[mds$i]})
13270 cl_user1[mds$i]="${cl_users[0]}"
13271 cl_user2[mds$i]="${cl_users[1]}"
13273 [ -n "${cl_user1[mds$i]}" ] ||
13274 error "mds$i: no user registered"
13275 [ -n "${cl_user2[mds$i]}" ] ||
13276 error "mds$i: only ${cl_user1[mds$i]} is registered"
13278 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13279 [ -n "$user_rec1" ] ||
13280 error "mds$i: User ${cl_user1[mds$i]} not registered"
13281 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13282 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13283 [ -n "$user_rec2" ] ||
13284 error "mds$i: User ${cl_user1[mds$i]} not registered"
13285 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13286 "$user_rec1 + 2 == $user_rec2"
13287 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13288 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13289 "$user_rec1 + 2, but is $user_rec2"
13290 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13291 [ -n "$user_rec2" ] ||
13292 error "mds$i: User ${cl_user2[mds$i]} not registered"
13293 [ $user_rec1 == $user_rec2 ] ||
13294 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13295 "$user_rec1, but is $user_rec2"
13298 # ensure we are past the previous changelog_min_gc_interval set above
13301 # generate one more changelog to trigger fail_loc
13302 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13303 error "create $DIR/$tdir/${tfile}bis failed"
13305 # ensure gc thread is done
13306 for i in $(mdts_nodes); do
13308 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13309 error "$i: GC-thread not done"
13313 for i in $(seq $MDSCOUNT); do
13314 # check cl_user1 still registered
13315 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13316 error "mds$i: User ${cl_user1[mds$i]} not registered"
13317 # check cl_user2 unregistered
13318 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13319 error "mds$i: User ${cl_user2[mds$i]} still registered"
13321 # check changelogs are present and starting at $user_rec1 + 1
13322 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13323 [ -n "$user_rec1" ] ||
13324 error "mds$i: User ${cl_user1[mds$i]} not registered"
13325 first_rec=$($LFS changelog $(facet_svc mds$i) |
13326 awk '{ print $1; exit; }')
13328 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13329 [ $((user_rec1 + 1)) == $first_rec ] ||
13330 error "mds$i: first index should be $user_rec1 + 1, " \
13331 "but is $first_rec"
13334 run_test 160g "changelog garbage collect (old users)"
13337 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13338 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13339 skip "Need MDS version at least 2.10.56"
13341 local mdts=$(comma_list $(mdts_nodes))
13344 changelog_register || error "first changelog_register failed"
13345 changelog_register || error "second changelog_register failed"
13347 declare -A cl_user1
13348 declare -A cl_user2
13353 # generate some changelog records to accumulate on each MDT
13354 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13355 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13356 error "create $DIR/$tdir/$tfile failed"
13358 # check changelogs have been generated
13359 local nbcl=$(changelog_dump | wc -l)
13360 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13362 for param in "changelog_max_idle_time=10" \
13364 "changelog_min_gc_interval=2"; do
13365 local MDT0=$(facet_svc $SINGLEMDS)
13366 local var="${param%=*}"
13367 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13369 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13370 do_nodes $mdts $LCTL set_param mdd.*.$param
13373 # force cl_user2 to be idle (1st part)
13376 for i in $(seq $MDSCOUNT); do
13377 cl_users=(${CL_USERS[mds$i]})
13378 cl_user1[mds$i]="${cl_users[0]}"
13379 cl_user2[mds$i]="${cl_users[1]}"
13381 [ -n "${cl_user1[mds$i]}" ] ||
13382 error "mds$i: no user registered"
13383 [ -n "${cl_user2[mds$i]}" ] ||
13384 error "mds$i: only ${cl_user2[mds$i]} is registered"
13386 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13387 [ -n "$user_rec1" ] ||
13388 error "mds$i: User ${cl_user1[mds$i]} not registered"
13389 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13390 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13391 [ -n "$user_rec2" ] ||
13392 error "mds$i: User ${cl_user1[mds$i]} not registered"
13393 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13394 "$user_rec1 + 2 == $user_rec2"
13395 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13396 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13397 "$user_rec1 + 2, but is $user_rec2"
13398 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13399 [ -n "$user_rec2" ] ||
13400 error "mds$i: User ${cl_user2[mds$i]} not registered"
13401 [ $user_rec1 == $user_rec2 ] ||
13402 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13403 "$user_rec1, but is $user_rec2"
13406 # force cl_user2 to be idle (2nd part) and to reach
13407 # changelog_max_idle_time
13410 # force each GC-thread start and block then
13411 # one per MDT/MDD, set fail_val accordingly
13412 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13413 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13415 # generate more changelogs to trigger fail_loc
13416 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13417 error "create $DIR/$tdir/${tfile}bis failed"
13419 # stop MDT to stop GC-thread, should be done in back-ground as it will
13420 # block waiting for the thread to be released and exit
13421 declare -A stop_pids
13422 for i in $(seq $MDSCOUNT); do
13424 stop_pids[mds$i]=$!
13427 for i in $(mdts_nodes); do
13430 local facets=$(facets_up_on_host $i)
13432 for facet in ${facets//,/ }; do
13433 if [[ $facet == mds* ]]; then
13437 # ensure each MDS's gc threads are still present and all in "R"
13438 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
13439 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
13440 error "$i: expected $nb GC-thread"
13442 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
13444 error "$i: GC-thread not found in R-state"
13445 # check umounts of each MDT on MDS have reached kthread_stop()
13446 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
13447 error "$i: expected $nb umount"
13449 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
13450 error "$i: umount not found in D-state"
13453 # release all GC-threads
13454 do_nodes $mdts $LCTL set_param fail_loc=0
13456 # wait for MDT stop to complete
13457 for i in $(seq $MDSCOUNT); do
13458 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
13462 # may try to check if any orphan changelog records are present
13463 # via ldiskfs/zfs and llog_reader...
13465 # re-start/mount MDTs
13466 for i in $(seq $MDSCOUNT); do
13467 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
13468 error "Fail to start mds$i"
13472 for i in $(seq $MDSCOUNT); do
13473 # check cl_user1 still registered
13474 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13475 error "mds$i: User ${cl_user1[mds$i]} not registered"
13476 # check cl_user2 unregistered
13477 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13478 error "mds$i: User ${cl_user2[mds$i]} still registered"
13480 # check changelogs are present and starting at $user_rec1 + 1
13481 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13482 [ -n "$user_rec1" ] ||
13483 error "mds$i: User ${cl_user1[mds$i]} not registered"
13484 first_rec=$($LFS changelog $(facet_svc mds$i) |
13485 awk '{ print $1; exit; }')
13487 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13488 [ $((user_rec1 + 1)) == $first_rec ] ||
13489 error "mds$i: first index should be $user_rec1 + 1, " \
13490 "but is $first_rec"
13493 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
13498 local mdts=$(comma_list $(mdts_nodes))
13500 changelog_register || error "first changelog_register failed"
13502 # generate some changelog records to accumulate on each MDT
13503 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13504 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13505 error "create $DIR/$tdir/$tfile failed"
13507 # check changelogs have been generated
13508 local nbcl=$(changelog_dump | wc -l)
13509 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13511 # simulate race between register and unregister
13512 # XXX as fail_loc is set per-MDS, with DNE configs the race
13513 # simulation will only occur for one MDT per MDS and for the
13514 # others the normal race scenario will take place
13515 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
13516 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
13517 do_nodes $mdts $LCTL set_param fail_val=1
13519 # unregister 1st user
13520 changelog_deregister &
13522 # wait some time for deregister work to reach race rdv
13524 # register 2nd user
13525 changelog_register || error "2nd user register failed"
13527 wait $pid1 || error "1st user deregister failed"
13531 declare -A LAST_REC
13532 for i in $(seq $MDSCOUNT); do
13533 if changelog_users mds$i | grep "^cl"; then
13534 # make sure new records are added with one user present
13535 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
13536 awk '/^current.index:/ { print $NF }')
13538 error "mds$i has no user registered"
13542 # generate more changelog records to accumulate on each MDT
13543 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13544 error "create $DIR/$tdir/${tfile}bis failed"
13546 for i in $(seq $MDSCOUNT); do
13547 last_rec=$(changelog_users $SINGLEMDS |
13548 awk '/^current.index:/ { print $NF }')
13549 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
13550 [ $last_rec != ${LAST_REC[mds$i]} ] ||
13551 error "changelogs are off on mds$i"
13554 run_test 160i "changelog user register/unregister race"
13557 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13558 remote_mds_nodsh && skip "remote MDS with nodsh"
13560 mkdir -p $DIR/$tdir/1/1
13562 changelog_register || error "changelog_register failed"
13563 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13565 changelog_users $SINGLEMDS | grep -q $cl_user ||
13566 error "User '$cl_user' not found in changelog_users"
13567 #define OBD_FAIL_MDS_CHANGELOG_REORDER 0x15d
13568 do_facet mds1 $LCTL set_param fail_loc=0x8000015d fail_val=3
13569 rmdir $DIR/$tdir/1/1 & sleep 1
13571 touch $DIR/$tdir/2/2
13572 rm -rf $DIR/$tdir/2
13577 changelog_dump | grep rmdir || error "rmdir not recorded"
13580 changelog_deregister
13582 run_test 160k "Verify that changelog records are not lost"
13585 remote_mds_nodsh && skip "remote MDS with nodsh"
13586 [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] &&
13587 skip "Need MDS version at least 2.12.56"
13589 mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
13591 changelog_register || error "first changelog_register failed"
13593 # generate some changelog
13594 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13595 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13596 error "create $DIR/$tdir/${tfile}bis failed"
13598 # open the changelog device
13599 exec 3>/dev/changelog-$FSNAME-MDT0000
13600 exec 4</dev/changelog-$FSNAME-MDT0000
13602 # umount the first lustre mount
13606 cat <&4 >/dev/null || error "read changelog failed"
13609 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13610 changelog_users $SINGLEMDS | grep -q $cl_user ||
13611 error "User $cl_user not found in changelog_users"
13613 printf 'clear:'$cl_user':0' >&3
13620 changelog_deregister || error "changelog_deregister failed"
13623 mount_client $MOUNT || error "mount_client on $MOUNT failed"
13625 run_test 160j "client can be umounted while its chanangelog is being used"
13628 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13630 test_mkdir -c1 $DIR/$tdir
13631 cp /etc/hosts $DIR/$tdir/$tfile
13632 test_mkdir -c1 $DIR/$tdir/foo1
13633 test_mkdir -c1 $DIR/$tdir/foo2
13634 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
13635 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
13636 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
13637 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
13638 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
13639 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13640 $LFS fid2path $DIR $FID
13641 error "bad link ea"
13644 rm $DIR/$tdir/foo2/zachary
13646 rm $DIR/$tdir/foo2/thor
13648 rm $DIR/$tdir/$tfile
13650 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
13651 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
13652 { $LFS fid2path $DIR $FID; error "bad link rename"; }
13653 rm $DIR/$tdir/foo2/maggie
13656 local longname=$tfile.avg_len_is_thirty_two_
13657 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
13658 error_noexit 'failed to unlink many hardlinks'" EXIT
13659 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
13660 error "failed to hardlink many files"
13661 links=$($LFS fid2path $DIR $FID | wc -l)
13662 echo -n "${links}/1000 links in link EA"
13663 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
13665 run_test 161a "link ea sanity"
13668 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13669 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
13672 local remote_dir=$DIR/$tdir/remote_dir
13674 mkdir -p $DIR/$tdir
13675 $LFS mkdir -i $MDTIDX $remote_dir ||
13676 error "create remote directory failed"
13678 cp /etc/hosts $remote_dir/$tfile
13679 mkdir -p $remote_dir/foo1
13680 mkdir -p $remote_dir/foo2
13681 ln $remote_dir/$tfile $remote_dir/foo1/sofia
13682 ln $remote_dir/$tfile $remote_dir/foo2/zachary
13683 ln $remote_dir/$tfile $remote_dir/foo1/luna
13684 ln $remote_dir/$tfile $remote_dir/foo2/thor
13686 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
13688 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13689 $LFS fid2path $DIR $FID
13690 error "bad link ea"
13693 rm $remote_dir/foo2/zachary
13695 rm $remote_dir/foo2/thor
13697 rm $remote_dir/$tfile
13699 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
13700 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
13701 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
13702 $LFS fid2path $DIR $FID
13703 error "bad link rename"
13705 rm $remote_dir/foo2/maggie
13708 local longname=filename_avg_len_is_thirty_two_
13709 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
13710 error "failed to hardlink many files"
13711 links=$($LFS fid2path $DIR $FID | wc -l)
13712 echo -n "${links}/1000 links in link EA"
13713 [[ ${links} -gt 60 ]] ||
13714 error "expected at least 60 links in link EA"
13715 unlinkmany $remote_dir/foo2/$longname 1000 ||
13716 error "failed to unlink many hardlinks"
13718 run_test 161b "link ea sanity under remote directory"
13721 remote_mds_nodsh && skip "remote MDS with nodsh"
13722 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13723 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
13724 skip "Need MDS version at least 2.1.5"
13726 # define CLF_RENAME_LAST 0x0001
13727 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
13728 changelog_register || error "changelog_register failed"
13731 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
13732 touch $DIR/$tdir/foo_161c
13733 touch $DIR/$tdir/bar_161c
13734 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13735 changelog_dump | grep RENME | tail -n 5
13736 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13737 changelog_clear 0 || error "changelog_clear failed"
13738 if [ x$flags != "x0x1" ]; then
13739 error "flag $flags is not 0x1"
13742 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
13743 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
13744 touch $DIR/$tdir/foo_161c
13745 touch $DIR/$tdir/bar_161c
13746 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13747 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13748 changelog_dump | grep RENME | tail -n 5
13749 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13750 changelog_clear 0 || error "changelog_clear failed"
13751 if [ x$flags != "x0x0" ]; then
13752 error "flag $flags is not 0x0"
13754 echo "rename overwrite a target having nlink > 1," \
13755 "changelog record has flags of $flags"
13757 # rename doesn't overwrite a target (changelog flag 0x0)
13758 touch $DIR/$tdir/foo_161c
13759 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
13760 changelog_dump | grep RENME | tail -n 5
13761 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
13762 changelog_clear 0 || error "changelog_clear failed"
13763 if [ x$flags != "x0x0" ]; then
13764 error "flag $flags is not 0x0"
13766 echo "rename doesn't overwrite a target," \
13767 "changelog record has flags of $flags"
13769 # define CLF_UNLINK_LAST 0x0001
13770 # unlink a file having nlink = 1 (changelog flag 0x1)
13771 rm -f $DIR/$tdir/foo2_161c
13772 changelog_dump | grep UNLNK | tail -n 5
13773 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13774 changelog_clear 0 || error "changelog_clear failed"
13775 if [ x$flags != "x0x1" ]; then
13776 error "flag $flags is not 0x1"
13778 echo "unlink a file having nlink = 1," \
13779 "changelog record has flags of $flags"
13781 # unlink a file having nlink > 1 (changelog flag 0x0)
13782 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13783 rm -f $DIR/$tdir/foobar_161c
13784 changelog_dump | grep UNLNK | tail -n 5
13785 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13786 changelog_clear 0 || error "changelog_clear failed"
13787 if [ x$flags != "x0x0" ]; then
13788 error "flag $flags is not 0x0"
13790 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
13792 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
13795 remote_mds_nodsh && skip "remote MDS with nodsh"
13800 changelog_register || error "changelog_register failed"
13802 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
13803 # interfer with $MOUNT/.lustre/fid/ access
13805 [[ $? -eq 0 ]] || error "mkdir failed"
13807 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
13808 $LCTL set_param fail_loc=0x8000140c
13810 $LCTL set_param fail_val=5
13813 echo foofoo > $DIR/$tdir/$tfile &
13816 # wait for create to be delayed
13820 [[ $? -eq 0 ]] || error "create should be blocked"
13822 local tempfile=$(mktemp)
13823 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
13824 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
13825 # some delay may occur during ChangeLog publishing and file read just
13826 # above, that could allow file write to happen finally
13827 [[ -s $tempfile ]] && echo "file should be empty"
13829 $LCTL set_param fail_loc=0
13832 [[ $? -eq 0 ]] || error "create failed"
13834 run_test 161d "create with concurrent .lustre/fid access"
13837 local expected="$1"
13842 path=$($LFS fid2path "$@")
13845 if [ $rc -ne 0 ]; then
13846 error "path looked up of '$expected' failed: rc=$rc"
13847 elif [ "$path" != "$expected" ]; then
13848 error "path looked up '$path' instead of '$expected'"
13850 echo "FID '$fid' resolves to path '$path' as expected"
13854 test_162a() { # was test_162
13855 test_mkdir -p -c1 $DIR/$tdir/d2
13856 touch $DIR/$tdir/d2/$tfile
13857 touch $DIR/$tdir/d2/x1
13858 touch $DIR/$tdir/d2/x2
13859 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
13860 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
13862 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
13863 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
13866 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
13867 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
13868 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
13870 # softlink to wrong file
13871 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
13872 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
13873 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
13876 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
13877 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
13878 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
13879 # fid2path dir/fsname should both work
13880 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
13881 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
13883 # hardlink count: check that there are 2 links
13884 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
13885 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
13887 # hardlink indexing: remove the first link
13888 rm $DIR/$tdir/d2/p/q/r/hlink
13889 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
13891 run_test 162a "path lookup sanity"
13894 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13895 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13898 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
13899 error "create striped dir failed"
13901 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
13902 tail -n 1 | awk '{print $2}')
13903 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
13905 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
13906 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
13909 for ((i=0;i<5;i++)); do
13910 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
13911 error "get fid for f$i failed"
13912 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
13914 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
13915 error "get fid for d$i failed"
13916 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
13921 run_test 162b "striped directory path lookup sanity"
13923 # LU-4239: Verify fid2path works with paths 100 or more directories deep
13925 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
13926 skip "Need MDS version at least 2.7.51"
13928 local lpath=$tdir.local
13929 local rpath=$tdir.remote
13931 test_mkdir $DIR/$lpath
13932 test_mkdir $DIR/$rpath
13934 for ((i = 0; i <= 101; i++)); do
13937 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
13938 error "get fid for local directory $DIR/$lpath failed"
13939 check_path "$DIR/$lpath" $MOUNT $FID --link 0
13942 test_mkdir $DIR/$rpath
13943 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
13944 error "get fid for remote directory $DIR/$rpath failed"
13945 check_path "$DIR/$rpath" $MOUNT $FID --link 0
13950 run_test 162c "fid2path works with paths 100 or more directories deep"
13953 # do directio so as not to populate the page cache
13954 log "creating a 10 Mb file"
13955 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
13956 log "starting reads"
13957 dd if=$DIR/$tfile of=/dev/null bs=4096 &
13958 log "truncating the file"
13959 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
13961 kill %+ || true # reads might have finished
13962 echo "wait until dd is finished"
13964 log "removing the temporary file"
13965 rm -rf $DIR/$tfile || error "tmp file removal failed"
13967 run_test 169 "parallel read and truncate should not deadlock"
13970 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13972 $LCTL clear # bug 18514
13973 $LCTL debug_daemon start $TMP/${tfile}_log_good
13975 $LCTL debug_daemon stop
13976 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
13977 error "sed failed to read log_good"
13979 $LCTL debug_daemon start $TMP/${tfile}_log_good
13981 $LCTL debug_daemon stop
13983 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
13984 error "lctl df log_bad failed"
13986 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
13987 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
13989 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
13990 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
13992 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
13993 error "bad_line good_line1 good_line2 are empty"
13995 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
13996 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
13997 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
13999 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
14000 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14001 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14003 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
14004 error "bad_line_new good_line_new are empty"
14006 local expected_good=$((good_line1 + good_line2*2))
14008 rm -f $TMP/${tfile}*
14009 # LU-231, short malformed line may not be counted into bad lines
14010 if [ $bad_line -ne $bad_line_new ] &&
14011 [ $bad_line -ne $((bad_line_new - 1)) ]; then
14012 error "expected $bad_line bad lines, but got $bad_line_new"
14016 if [ $expected_good -ne $good_line_new ]; then
14017 error "expected $expected_good good lines, but got $good_line_new"
14022 run_test 170 "test lctl df to handle corrupted log ====================="
14024 test_171() { # bug20592
14025 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14027 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
14028 $LCTL set_param fail_loc=0x50e
14029 $LCTL set_param fail_val=3000
14030 multiop_bg_pause $DIR/$tfile O_s || true
14032 kill -USR1 $MULTIPID
14036 if dmesg | grep "recursive fault"; then
14037 error "caught a recursive fault"
14039 $LCTL set_param fail_loc=0
14042 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
14044 # it would be good to share it with obdfilter-survey/iokit-libecho code
14045 setup_obdecho_osc () {
14048 local obdfilter_name=$2
14049 echo "Creating new osc for $obdfilter_name on $ost_nid"
14050 # make sure we can find loopback nid
14051 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
14053 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
14054 ${obdfilter_name}_osc_UUID || rc=2; }
14055 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
14056 ${obdfilter_name}_UUID $ost_nid || rc=3; }
14060 cleanup_obdecho_osc () {
14061 local obdfilter_name=$1
14062 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
14063 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
14070 local pages=${3:-64}
14075 local obd_size=$(get_obd_size $node $OBD)
14076 local page_size=$(get_page_size $node)
14077 if [[ -n "$obd_size" ]]; then
14078 local new_count=$((obd_size / (pages * page_size / 1024)))
14079 [[ $new_count -ge $count ]] || count=$new_count
14082 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
14083 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
14085 if [ $rc -eq 0 ]; then
14086 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
14087 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
14089 echo "New object id is $id"
14090 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
14092 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
14093 "test_brw $count w v $pages $id" || rc=4; }
14094 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
14096 [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
14097 "cleanup" || rc=5; }
14098 [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \
14099 "detach" || rc=6; }
14100 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
14105 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14107 if ! module_loaded obdecho; then
14108 load_module obdecho/obdecho &&
14109 stack_trap "rmmod obdecho" EXIT ||
14110 error "unable to load obdecho on client"
14113 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
14114 local host=$($LCTL get_param -n osc.$osc.import |
14115 awk '/current_connection:/ { print $2 }' )
14116 local target=$($LCTL get_param -n osc.$osc.import |
14117 awk '/target:/ { print $2 }' )
14118 target=${target%_UUID}
14120 if [ -n "$target" ]; then
14121 setup_obdecho_osc $host $target &&
14122 stack_trap "cleanup_obdecho_osc $target" EXIT ||
14123 { error "obdecho setup failed with $?"; return; }
14125 obdecho_test ${target}_osc client ||
14126 error "obdecho_test failed on ${target}_osc"
14128 $LCTL get_param osc.$osc.import
14129 error "there is no osc.$osc.import target"
14132 run_test 180a "test obdecho on osc"
14135 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14136 remote_ost_nodsh && skip "remote OST with nodsh"
14138 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14139 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14140 error "failed to load module obdecho"
14142 local target=$(do_facet ost1 $LCTL dl |
14143 awk '/obdfilter/ { print $4; exit; }')
14145 if [ -n "$target" ]; then
14146 obdecho_test $target ost1 || error "obdecho_test failed with $?"
14148 do_facet ost1 $LCTL dl
14149 error "there is no obdfilter target on ost1"
14152 run_test 180b "test obdecho directly on obdfilter"
14154 test_180c() { # LU-2598
14155 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14156 remote_ost_nodsh && skip "remote OST with nodsh"
14157 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
14158 skip "Need MDS version at least 2.4.0"
14160 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14161 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14162 error "failed to load module obdecho"
14164 local target=$(do_facet ost1 $LCTL dl |
14165 awk '/obdfilter/ { print $4; exit; }')
14167 if [ -n "$target" ]; then
14168 local pages=16384 # 64MB bulk I/O RPC size
14170 obdecho_test "$target" ost1 "$pages" ||
14171 error "obdecho_test with pages=$pages failed with $?"
14173 do_facet ost1 $LCTL dl
14174 error "there is no obdfilter target on ost1"
14177 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
14179 test_181() { # bug 22177
14180 test_mkdir $DIR/$tdir
14181 # create enough files to index the directory
14182 createmany -o $DIR/$tdir/foobar 4000
14183 # print attributes for debug purpose
14186 multiop_bg_pause $DIR/$tdir D_Sc || return 1
14188 # remove the files & current working dir
14189 unlinkmany $DIR/$tdir/foobar 4000
14191 kill -USR1 $MULTIPID
14193 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
14196 run_test 181 "Test open-unlinked dir ========================"
14202 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14204 $LCTL set_param mdc.*.rpc_stats=clear
14206 for (( i = 0; i < $tcount; i++ )) ; do
14207 mkdir $DIR/$tdir/$i
14210 for (( i = 0; i < $tcount; i++ )) ; do
14211 createmany -o $DIR/$tdir/$i/f- $fcount &
14215 for (( i = 0; i < $tcount; i++ )) ; do
14216 unlinkmany $DIR/$tdir/$i/f- $fcount &
14220 $LCTL get_param mdc.*.rpc_stats
14224 run_test 182 "Test parallel modify metadata operations ================"
14226 test_183() { # LU-2275
14227 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14228 remote_mds_nodsh && skip "remote MDS with nodsh"
14229 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
14230 skip "Need MDS version at least 2.3.56"
14232 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14233 echo aaa > $DIR/$tdir/$tfile
14235 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
14236 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
14238 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
14239 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
14241 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
14243 # Flush negative dentry cache
14244 touch $DIR/$tdir/$tfile
14246 # We are not checking for any leaked references here, they'll
14247 # become evident next time we do cleanup with module unload.
14250 run_test 183 "No crash or request leak in case of strange dispositions ========"
14252 # test suite 184 is for LU-2016, LU-2017
14254 check_swap_layouts_support
14256 dir0=$DIR/$tdir/$testnum
14257 test_mkdir -p -c1 $dir0
14262 $SETSTRIPE -c1 $file1
14264 $SETSTRIPE -c2 $file2
14266 gen1=$($GETSTRIPE -g $file1)
14267 gen2=$($GETSTRIPE -g $file2)
14269 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
14270 gen=$($GETSTRIPE -g $file1)
14271 [[ $gen1 != $gen ]] ||
14272 "Layout generation on $file1 does not change"
14273 gen=$($GETSTRIPE -g $file2)
14274 [[ $gen2 != $gen ]] ||
14275 "Layout generation on $file2 does not change"
14277 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
14278 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
14280 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
14282 run_test 184a "Basic layout swap"
14285 check_swap_layouts_support
14287 dir0=$DIR/$tdir/$testnum
14288 mkdir -p $dir0 || error "creating dir $dir0"
14295 $SETSTRIPE -c1 $file1
14296 $SETSTRIPE -c2 $file2
14297 $SETSTRIPE -c1 $file3
14298 chown $RUNAS_ID $file3
14299 gen1=$($GETSTRIPE -g $file1)
14300 gen2=$($GETSTRIPE -g $file2)
14302 $LFS swap_layouts $dir1 $dir2 &&
14303 error "swap of directories layouts should fail"
14304 $LFS swap_layouts $dir1 $file1 &&
14305 error "swap of directory and file layouts should fail"
14306 $RUNAS $LFS swap_layouts $file1 $file2 &&
14307 error "swap of file we cannot write should fail"
14308 $LFS swap_layouts $file1 $file3 &&
14309 error "swap of file with different owner should fail"
14310 /bin/true # to clear error code
14312 run_test 184b "Forbidden layout swap (will generate errors)"
14315 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14316 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14317 check_swap_layouts_support
14319 local dir0=$DIR/$tdir/$testnum
14320 mkdir -p $dir0 || error "creating dir $dir0"
14322 local ref1=$dir0/ref1
14323 local ref2=$dir0/ref2
14324 local file1=$dir0/file1
14325 local file2=$dir0/file2
14326 # create a file large enough for the concurrent test
14327 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14328 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14329 echo "ref file size: ref1($(stat -c %s $ref1))," \
14330 "ref2($(stat -c %s $ref2))"
14333 dd if=$ref1 of=$file1 bs=16k &
14336 # Make sure dd starts to copy file
14337 while [ ! -f $file1 ]; do sleep 0.1; done
14339 $LFS swap_layouts $file1 $file2
14342 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14343 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14345 # how many bytes copied before swapping layout
14346 local copied=$(stat -c %s $file2)
14347 local remaining=$(stat -c %s $ref1)
14348 remaining=$((remaining - copied))
14349 echo "Copied $copied bytes before swapping layout..."
14351 cmp -n $copied $file1 $ref2 | grep differ &&
14352 error "Content mismatch [0, $copied) of ref2 and file1"
14353 cmp -n $copied $file2 $ref1 ||
14354 error "Content mismatch [0, $copied) of ref1 and file2"
14355 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14356 error "Content mismatch [$copied, EOF) of ref1 and file1"
14359 rm -f $ref1 $ref2 $file1 $file2
14361 run_test 184c "Concurrent write and layout swap"
14364 check_swap_layouts_support
14365 [ -z "$(which getfattr 2>/dev/null)" ] &&
14366 skip_env "no getfattr command"
14368 local file1=$DIR/$tdir/$tfile-1
14369 local file2=$DIR/$tdir/$tfile-2
14370 local file3=$DIR/$tdir/$tfile-3
14374 mkdir -p $DIR/$tdir
14375 touch $file1 || error "create $file1 failed"
14376 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14377 error "create $file2 failed"
14378 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14379 error "create $file3 failed"
14380 lovea1=$(get_layout_param $file1)
14382 $LFS swap_layouts $file2 $file3 ||
14383 error "swap $file2 $file3 layouts failed"
14384 $LFS swap_layouts $file1 $file2 ||
14385 error "swap $file1 $file2 layouts failed"
14387 lovea2=$(get_layout_param $file2)
14390 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14392 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14393 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14395 run_test 184d "allow stripeless layouts swap"
14398 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14399 skip "Need MDS version at least 2.6.94"
14400 check_swap_layouts_support
14401 [ -z "$(which getfattr 2>/dev/null)" ] &&
14402 skip_env "no getfattr command"
14404 local file1=$DIR/$tdir/$tfile-1
14405 local file2=$DIR/$tdir/$tfile-2
14406 local file3=$DIR/$tdir/$tfile-3
14409 mkdir -p $DIR/$tdir
14410 touch $file1 || error "create $file1 failed"
14411 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14412 error "create $file2 failed"
14413 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14414 error "create $file3 failed"
14416 $LFS swap_layouts $file1 $file2 ||
14417 error "swap $file1 $file2 layouts failed"
14419 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14420 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14422 echo 123 > $file1 || error "Should be able to write into $file1"
14424 $LFS swap_layouts $file1 $file3 ||
14425 error "swap $file1 $file3 layouts failed"
14427 echo 123 > $file1 || error "Should be able to write into $file1"
14429 rm -rf $file1 $file2 $file3
14431 run_test 184e "Recreate layout after stripeless layout swaps"
14434 # Create a file with name longer than sizeof(struct stat) ==
14435 # 144 to see if we can get chars from the file name to appear
14436 # in the returned striping. Note that 'f' == 0x66.
14437 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
14439 mkdir -p $DIR/$tdir
14440 mcreate $DIR/$tdir/$file
14441 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
14442 error "IOC_MDC_GETFILEINFO returned garbage striping"
14445 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
14447 test_185() { # LU-2441
14448 # LU-3553 - no volatile file support in old servers
14449 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
14450 skip "Need MDS version at least 2.3.60"
14452 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14453 touch $DIR/$tdir/spoo
14454 local mtime1=$(stat -c "%Y" $DIR/$tdir)
14455 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
14456 error "cannot create/write a volatile file"
14457 [ "$FILESET" == "" ] &&
14458 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
14459 error "FID is still valid after close"
14461 multiop_bg_pause $DIR/$tdir vVw4096_c
14468 # assume that the next FID for this client is sequential, since stdout
14469 # is unfortunately eaten by multiop_bg_pause
14470 local n=$((${fidv[1]} + 1))
14471 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
14472 if [ "$FILESET" == "" ]; then
14473 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
14474 error "FID is missing before close"
14476 kill -USR1 $multi_pid
14477 # 1 second delay, so if mtime change we will see it
14479 local mtime2=$(stat -c "%Y" $DIR/$tdir)
14480 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
14482 run_test 185 "Volatile file support"
14484 function create_check_volatile() {
14488 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
14491 local FID=$(cat /tmp/${tfile}.fid)
14492 [ "$FID" == "" ] && error "can't get FID for volatile"
14493 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
14494 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
14495 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
14499 cancel_lru_locks mdc # flush opencache
14500 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
14505 # LU-12516 - volatile creation via .lustre
14506 [[ $MDS1_VERSION -ge $(version_code 2.12.2) ]] ||
14507 skip "Need MDS version at least 2.12.2"
14509 create_check_volatile 0
14510 [ $MDSCOUNT -lt 2 ] && return 0
14513 create_check_volatile 1
14517 run_test 185a "Volatile file creation in .lustre/fid/"
14520 remote_mds_nodsh && skip "remote MDS with nodsh"
14521 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14522 skip "Need MDS version at least 2.3.0"
14524 local dir0=$DIR/$tdir/$testnum
14525 mkdir -p $dir0 || error "creating dir $dir0"
14527 local file=$dir0/file1
14528 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
14529 local dv1=$($LFS data_version $file)
14530 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
14531 local dv2=$($LFS data_version $file)
14532 [[ $dv1 != $dv2 ]] ||
14533 error "data version did not change on write $dv1 == $dv2"
14538 run_test 187a "Test data version change"
14541 remote_mds_nodsh && skip "remote MDS with nodsh"
14542 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14543 skip "Need MDS version at least 2.3.0"
14545 local dir0=$DIR/$tdir/$testnum
14546 mkdir -p $dir0 || error "creating dir $dir0"
14548 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
14549 [[ ${DV[0]} != ${DV[1]} ]] ||
14550 error "data version did not change on write"\
14551 " ${DV[0]} == ${DV[1]}"
14556 run_test 187b "Test data version change on volatile file"
14559 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14560 remote_mgs_nodsh && skip "remote MGS with nodsh"
14561 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
14563 local POOL=${POOL:-cea1}
14564 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
14565 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
14568 local last_ost=$(($OSTCOUNT - 1))
14570 local ost_list=$(seq $first_ost $ost_step $last_ost)
14571 local ost_range="$first_ost $last_ost $ost_step"
14572 local test_path=$POOL_ROOT/$POOL_DIR_NAME
14573 local file_dir=$POOL_ROOT/file_tst
14574 local subdir=$test_path/subdir
14578 # former test_200a test_200b
14579 pool_add $POOL || { rc=$? ; break; }
14580 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
14581 # former test_200c test_200d
14582 mkdir -p $test_path
14583 pool_set_dir $POOL $test_path || { rc=$? ; break; }
14584 pool_check_dir $POOL $test_path || { rc=$? ; break; }
14586 pool_check_dir $POOL $subdir || { rc=$? ; break; }
14587 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
14588 || { rc=$? ; break; }
14589 # former test_200e test_200f
14590 local files=$((OSTCOUNT*3))
14591 pool_alloc_files $POOL $test_path $files "$ost_list" \
14592 || { rc=$? ; break; }
14593 pool_create_files $POOL $file_dir $files "$ost_list" \
14594 || { rc=$? ; break; }
14595 # former test_200g test_200h
14596 pool_lfs_df $POOL || { rc=$? ; break; }
14597 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
14599 # former test_201a test_201b test_201c
14600 pool_remove_first_target $POOL || { rc=$? ; break; }
14602 local f=$test_path/$tfile
14603 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
14604 pool_remove $POOL $f || { rc=$? ; break; }
14612 run_test 200 "OST pools"
14614 # usage: default_attr <count | size | offset>
14616 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
14619 # usage: check_default_stripe_attr
14620 check_default_stripe_attr() {
14621 ACTUAL=$($GETSTRIPE $* $DIR/$tdir)
14624 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
14626 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
14630 error "unknown getstripe attr '$1'"
14633 [ $ACTUAL == $EXPECTED ] ||
14634 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
14638 test_mkdir $DIR/$tdir
14639 $SETSTRIPE --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
14641 check_default_stripe_attr --stripe-count
14642 check_default_stripe_attr --stripe-size
14643 check_default_stripe_attr --stripe-index
14645 run_test 204a "Print default stripe attributes"
14648 test_mkdir $DIR/$tdir
14649 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14651 check_default_stripe_attr --stripe-size
14652 check_default_stripe_attr --stripe-index
14654 run_test 204b "Print default stripe size and offset"
14657 test_mkdir $DIR/$tdir
14658 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14660 check_default_stripe_attr --stripe-count
14661 check_default_stripe_attr --stripe-index
14663 run_test 204c "Print default stripe count and offset"
14666 test_mkdir $DIR/$tdir
14667 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14669 check_default_stripe_attr --stripe-count
14670 check_default_stripe_attr --stripe-size
14672 run_test 204d "Print default stripe count and size"
14675 test_mkdir $DIR/$tdir
14676 $SETSTRIPE -d $DIR/$tdir
14678 check_default_stripe_attr --stripe-count --raw
14679 check_default_stripe_attr --stripe-size --raw
14680 check_default_stripe_attr --stripe-index --raw
14682 run_test 204e "Print raw stripe attributes"
14685 test_mkdir $DIR/$tdir
14686 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14688 check_default_stripe_attr --stripe-size --raw
14689 check_default_stripe_attr --stripe-index --raw
14691 run_test 204f "Print raw stripe size and offset"
14694 test_mkdir $DIR/$tdir
14695 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14697 check_default_stripe_attr --stripe-count --raw
14698 check_default_stripe_attr --stripe-index --raw
14700 run_test 204g "Print raw stripe count and offset"
14703 test_mkdir $DIR/$tdir
14704 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14706 check_default_stripe_attr --stripe-count --raw
14707 check_default_stripe_attr --stripe-size --raw
14709 run_test 204h "Print raw stripe count and size"
14711 # Figure out which job scheduler is being used, if any,
14712 # or use a fake one
14713 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
14714 JOBENV=SLURM_JOB_ID
14715 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
14717 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
14719 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
14720 JOBENV=LOADL_STEP_ID
14721 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
14724 $LCTL list_param jobid_name > /dev/null 2>&1
14725 if [ $? -eq 0 ]; then
14731 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
14733 verify_jobstats() {
14738 # we don't really need to clear the stats for this test to work, since each
14739 # command has a unique jobid, but it makes debugging easier if needed.
14740 # for facet in $facets; do
14741 # local dev=$(convert_facet2label $facet)
14742 # # clear old jobstats
14743 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
14746 # use a new JobID for each test, or we might see an old one
14747 [ "$JOBENV" = "FAKE_JOBID" ] &&
14748 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
14750 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
14752 [ "$JOBENV" = "nodelocal" ] && {
14753 FAKE_JOBID=id.$testnum.%e.$RANDOM
14754 $LCTL set_param jobid_name=$FAKE_JOBID
14755 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
14758 log "Test: ${cmd[*]}"
14759 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
14761 if [ $JOBENV = "FAKE_JOBID" ]; then
14762 FAKE_JOBID=$JOBVAL ${cmd[*]}
14767 # all files are created on OST0000
14768 for facet in $facets; do
14769 local stats="*.$(convert_facet2label $facet).job_stats"
14771 # strip out libtool wrappers for in-tree executables
14772 if [ $(do_facet $facet lctl get_param $stats |
14773 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
14774 do_facet $facet lctl get_param $stats
14775 error "No jobstats for $JOBVAL found on $facet::$stats"
14781 local new_jobenv=$1
14783 set_persistent_param_and_check client "jobid_var" \
14784 "$FSNAME.sys.jobid_var" $new_jobenv
14787 test_205a() { # Job stats
14788 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14789 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
14790 skip "Need MDS version with at least 2.7.1"
14791 remote_mgs_nodsh && skip "remote MGS with nodsh"
14792 remote_mds_nodsh && skip "remote MDS with nodsh"
14793 remote_ost_nodsh && skip "remote OST with nodsh"
14794 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
14795 skip "Server doesn't support jobstats"
14796 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
14798 local old_jobenv=$($LCTL get_param -n jobid_var)
14799 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
14801 if [[ $PERM_CMD = *"set_param -P"* ]]; then
14802 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
14804 stack_trap "do_facet mgs $PERM_CMD \
14805 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
14809 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
14810 mdt.*.job_cleanup_interval | head -n 1)
14811 local new_interval=5
14812 do_facet $SINGLEMDS \
14813 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
14814 stack_trap "do_facet $SINGLEMDS \
14815 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
14816 local start=$SECONDS
14820 cmd="mkdir $DIR/$tdir"
14821 verify_jobstats "$cmd" "$SINGLEMDS"
14823 cmd="rmdir $DIR/$tdir"
14824 verify_jobstats "$cmd" "$SINGLEMDS"
14825 # mkdir on secondary MDT
14826 if [ $MDSCOUNT -gt 1 ]; then
14827 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
14828 verify_jobstats "$cmd" "mds2"
14831 cmd="mknod $DIR/$tfile c 1 3"
14832 verify_jobstats "$cmd" "$SINGLEMDS"
14834 cmd="rm -f $DIR/$tfile"
14835 verify_jobstats "$cmd" "$SINGLEMDS"
14836 # create all files on OST0000 so verify_jobstats can find OST stats
14838 cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile"
14839 verify_jobstats "$cmd" "$SINGLEMDS"
14841 cmd="touch $DIR/$tfile"
14842 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14844 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
14845 verify_jobstats "$cmd" "ost1"
14847 cancel_lru_locks osc
14848 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
14849 verify_jobstats "$cmd" "ost1"
14851 cmd="$TRUNCATE $DIR/$tfile 0"
14852 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14854 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
14855 verify_jobstats "$cmd" "$SINGLEMDS"
14856 # jobstats expiry - sleep until old stats should be expired
14857 local left=$((new_interval + 5 - (SECONDS - start)))
14858 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
14859 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
14861 cmd="mkdir $DIR/$tdir.expire"
14862 verify_jobstats "$cmd" "$SINGLEMDS"
14863 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
14864 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
14866 # Ensure that jobid are present in changelog (if supported by MDS)
14867 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
14868 changelog_dump | tail -10
14869 jobids=$(changelog_dump | tail -9 | grep -c "j=")
14870 [ $jobids -eq 9 ] ||
14871 error "Wrong changelog jobid count $jobids != 9"
14875 jobstats_set $JOBENV
14877 changelog_dump | grep $tfile
14878 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
14879 [ $jobids -eq 0 ] ||
14880 error "Unexpected jobids when jobid_var=$JOBENV"
14883 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
14884 JOBENV="JOBCOMPLEX"
14885 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
14887 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
14889 run_test 205a "Verify job stats"
14893 $LCTL set_param jobid_var=USER jobid_name="%e.%u"
14894 env -i USERTESTJOBSTATS=foolish touch $DIR/$tfile.1
14895 do_facet $SINGLEMDS $LCTL get_param mdt.*.job_stats |
14896 grep job_id: | grep foolish &&
14897 error "Unexpected jobid found"
14900 run_test 205b "Verify job stats jobid parsing"
14902 # LU-1480, LU-1773 and LU-1657
14904 mkdir -p $DIR/$tdir
14905 $SETSTRIPE -c -1 $DIR/$tdir
14906 #define OBD_FAIL_LOV_INIT 0x1403
14907 $LCTL set_param fail_loc=0xa0001403
14908 $LCTL set_param fail_val=1
14909 touch $DIR/$tdir/$tfile || true
14911 run_test 206 "fail lov_init_raid0() doesn't lbug"
14914 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14915 local fsz=`stat -c %s $DIR/$tfile`
14916 cancel_lru_locks mdc
14918 # do not return layout in getattr intent
14919 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
14920 $LCTL set_param fail_loc=0x170
14921 local sz=`stat -c %s $DIR/$tfile`
14923 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
14927 run_test 207a "can refresh layout at glimpse"
14930 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14931 local cksum=`md5sum $DIR/$tfile`
14932 local fsz=`stat -c %s $DIR/$tfile`
14933 cancel_lru_locks mdc
14934 cancel_lru_locks osc
14936 # do not return layout in getattr intent
14937 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
14938 $LCTL set_param fail_loc=0x171
14940 # it will refresh layout after the file is opened but before read issues
14941 echo checksum is "$cksum"
14942 echo "$cksum" |md5sum -c --quiet || error "file differs"
14946 run_test 207b "can refresh layout at open"
14949 # FIXME: in this test suite, only RD lease is used. This is okay
14950 # for now as only exclusive open is supported. After generic lease
14951 # is done, this test suite should be revised. - Jinshan
14953 remote_mds_nodsh && skip "remote MDS with nodsh"
14954 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
14955 skip "Need MDS version at least 2.4.52"
14957 echo "==== test 1: verify get lease work"
14958 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
14960 echo "==== test 2: verify lease can be broken by upcoming open"
14961 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
14965 $MULTIOP $DIR/$tfile oO_RDONLY:c
14966 kill -USR1 $PID && wait $PID || error "break lease error"
14968 echo "==== test 3: verify lease can't be granted if an open already exists"
14969 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
14973 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
14974 kill -USR1 $PID && wait $PID || error "open file error"
14976 echo "==== test 4: lease can sustain over recovery"
14977 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
14983 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
14985 echo "==== test 5: lease broken can't be regained by replay"
14986 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
14990 # open file to break lease and then recovery
14991 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
14994 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
14998 run_test 208 "Exclusive open"
15001 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
15002 skip_env "must have disp_stripe"
15005 sync; sleep 5; sync;
15007 echo 3 > /proc/sys/vm/drop_caches
15008 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15010 # open/close 500 times
15011 for i in $(seq 500); do
15015 echo 3 > /proc/sys/vm/drop_caches
15016 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15018 echo "before: $req_before, after: $req_after"
15019 [ $((req_after - req_before)) -ge 300 ] &&
15020 error "open/close requests are not freed"
15023 run_test 209 "read-only open/close requests should be freed promptly"
15027 size=$((size % 8192 + 1))
15028 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
15029 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
15030 rm -f $DIR/f212 $DIR/f212.xyz
15032 run_test 212 "Sendfile test ============================================"
15035 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
15036 cancel_lru_locks osc
15037 lctl set_param fail_loc=0x8000040f
15038 # generate a read lock
15039 cat $DIR/$tfile > /dev/null
15040 # write to the file, it will try to cancel the above read lock.
15041 cat /etc/hosts >> $DIR/$tfile
15043 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
15045 test_214() { # for bug 20133
15046 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
15047 for (( i=0; i < 340; i++ )) ; do
15048 touch $DIR/$tdir/d214c/a$i
15051 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
15052 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
15053 ls $DIR/d214c || error "ls $DIR/d214c failed"
15054 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
15055 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
15057 run_test 214 "hash-indexed directory test - bug 20133"
15059 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
15060 create_lnet_proc_files() {
15061 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
15064 # counterpart of create_lnet_proc_files
15065 remove_lnet_proc_files() {
15066 rm -f $TMP/lnet_$1.sys
15069 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15070 # 3rd arg as regexp for body
15071 check_lnet_proc_stats() {
15072 local l=$(cat "$TMP/lnet_$1" |wc -l)
15073 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
15075 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
15078 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15079 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
15080 # optional and can be regexp for 2nd line (lnet.routes case)
15081 check_lnet_proc_entry() {
15082 local blp=2 # blp stands for 'position of 1st line of body'
15083 [ -z "$5" ] || blp=3 # lnet.routes case
15085 local l=$(cat "$TMP/lnet_$1" |wc -l)
15086 # subtracting one from $blp because the body can be empty
15087 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
15089 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
15090 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
15092 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
15093 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
15095 # bail out if any unexpected line happened
15096 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
15097 [ "$?" != 0 ] || error "$2 misformatted"
15100 test_215() { # for bugs 18102, 21079, 21517
15101 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15103 local N='(0|[1-9][0-9]*)' # non-negative numeric
15104 local P='[1-9][0-9]*' # positive numeric
15105 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
15106 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
15107 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
15108 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
15110 local L1 # regexp for 1st line
15111 local L2 # regexp for 2nd line (optional)
15112 local BR # regexp for the rest (body)
15114 # lnet.stats should look as 11 space-separated non-negative numerics
15115 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
15116 create_lnet_proc_files "stats"
15117 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
15118 remove_lnet_proc_files "stats"
15120 # lnet.routes should look like this:
15121 # Routing disabled/enabled
15122 # net hops priority state router
15123 # where net is a string like tcp0, hops > 0, priority >= 0,
15124 # state is up/down,
15125 # router is a string like 192.168.1.1@tcp2
15126 L1="^Routing (disabled|enabled)$"
15127 L2="^net +hops +priority +state +router$"
15128 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
15129 create_lnet_proc_files "routes"
15130 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
15131 remove_lnet_proc_files "routes"
15133 # lnet.routers should look like this:
15134 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
15135 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
15136 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
15137 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
15138 L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
15139 BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
15140 create_lnet_proc_files "routers"
15141 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
15142 remove_lnet_proc_files "routers"
15144 # lnet.peers should look like this:
15145 # nid refs state last max rtr min tx min queue
15146 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
15147 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
15148 # numeric (0 or >0 or <0), queue >= 0.
15149 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
15150 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
15151 create_lnet_proc_files "peers"
15152 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
15153 remove_lnet_proc_files "peers"
15155 # lnet.buffers should look like this:
15156 # pages count credits min
15157 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
15158 L1="^pages +count +credits +min$"
15159 BR="^ +$N +$N +$I +$I$"
15160 create_lnet_proc_files "buffers"
15161 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
15162 remove_lnet_proc_files "buffers"
15164 # lnet.nis should look like this:
15165 # nid status alive refs peer rtr max tx min
15166 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
15167 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
15168 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
15169 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
15170 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
15171 create_lnet_proc_files "nis"
15172 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
15173 remove_lnet_proc_files "nis"
15175 # can we successfully write to lnet.stats?
15176 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
15178 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
15180 test_216() { # bug 20317
15181 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15182 remote_ost_nodsh && skip "remote OST with nodsh"
15185 local facets=$(get_facets OST)
15186 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15188 save_lustre_params client "osc.*.contention_seconds" > $p
15189 save_lustre_params $facets \
15190 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
15191 save_lustre_params $facets \
15192 "ldlm.namespaces.filter-*.contended_locks" >> $p
15193 save_lustre_params $facets \
15194 "ldlm.namespaces.filter-*.contention_seconds" >> $p
15195 clear_stats osc.*.osc_stats
15197 # agressive lockless i/o settings
15198 do_nodes $(comma_list $(osts_nodes)) \
15199 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
15200 ldlm.namespaces.filter-*.contended_locks=0 \
15201 ldlm.namespaces.filter-*.contention_seconds=60"
15202 lctl set_param -n osc.*.contention_seconds=60
15204 $DIRECTIO write $DIR/$tfile 0 10 4096
15205 $CHECKSTAT -s 40960 $DIR/$tfile
15207 # disable lockless i/o
15208 do_nodes $(comma_list $(osts_nodes)) \
15209 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
15210 ldlm.namespaces.filter-*.contended_locks=32 \
15211 ldlm.namespaces.filter-*.contention_seconds=0"
15212 lctl set_param -n osc.*.contention_seconds=0
15213 clear_stats osc.*.osc_stats
15215 dd if=/dev/zero of=$DIR/$tfile count=0
15216 $CHECKSTAT -s 0 $DIR/$tfile
15218 restore_lustre_params <$p
15222 run_test 216 "check lockless direct write updates file size and kms correctly"
15224 test_217() { # bug 22430
15225 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15230 for node in $(nodes_list); do
15231 nid=$(host_nids_address $node $NETTYPE)
15232 if [[ $nid = *-* ]] ; then
15233 echo "lctl ping $(h2nettype $nid)"
15234 lctl ping $(h2nettype $nid)
15236 echo "skipping $node (no hyphen detected)"
15240 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
15243 # do directio so as not to populate the page cache
15244 log "creating a 10 Mb file"
15245 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
15246 log "starting reads"
15247 dd if=$DIR/$tfile of=/dev/null bs=4096 &
15248 log "truncating the file"
15249 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
15251 kill %+ || true # reads might have finished
15252 echo "wait until dd is finished"
15254 log "removing the temporary file"
15255 rm -rf $DIR/$tfile || error "tmp file removal failed"
15257 run_test 218 "parallel read and truncate should not deadlock"
15260 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15262 # write one partial page
15263 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
15264 # set no grant so vvp_io_commit_write will do sync write
15265 $LCTL set_param fail_loc=0x411
15266 # write a full page at the end of file
15267 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
15269 $LCTL set_param fail_loc=0
15270 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
15271 $LCTL set_param fail_loc=0x411
15272 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
15275 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
15276 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
15278 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
15280 test_220() { #LU-325
15281 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15282 remote_ost_nodsh && skip "remote OST with nodsh"
15283 remote_mds_nodsh && skip "remote MDS with nodsh"
15284 remote_mgs_nodsh && skip "remote MGS with nodsh"
15288 # create on MDT0000 so the last_id and next_id are correct
15290 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
15294 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
15295 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
15296 osp.$mdtosc_proc1.prealloc_last_id)
15297 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15298 osp.$mdtosc_proc1.prealloc_next_id)
15302 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15303 #define OBD_FAIL_OST_ENOINO 0x229
15304 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15305 create_pool $FSNAME.$TESTNAME || return 1
15306 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15308 $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15310 MDSOBJS=$((last_id - next_id))
15311 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15313 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15314 echo "OST still has $count kbytes free"
15316 echo "create $MDSOBJS files @next_id..."
15317 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15319 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15320 osp.$mdtosc_proc1.prealloc_last_id)
15321 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15322 osp.$mdtosc_proc1.prealloc_next_id)
15324 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15329 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15330 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15332 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15333 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15334 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15335 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15336 echo "unlink $MDSOBJS files @$next_id..."
15337 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15339 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15342 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15344 dd if=`which date` of=$MOUNT/date oflag=sync
15345 chmod +x $MOUNT/date
15347 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15348 $LCTL set_param fail_loc=0x80001401
15350 $MOUNT/date > /dev/null
15353 run_test 221 "make sure fault and truncate race to not cause OOM"
15356 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15359 test_mkdir $DIR/$tdir
15360 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15361 createmany -o $DIR/$tdir/$tfile 10
15362 cancel_lru_locks mdc
15363 cancel_lru_locks osc
15364 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15365 $LCTL set_param fail_loc=0x31a
15366 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15367 $LCTL set_param fail_loc=0
15370 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15373 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15376 test_mkdir $DIR/$tdir
15377 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15378 createmany -o $DIR/$tdir/$tfile 10
15379 cancel_lru_locks mdc
15380 cancel_lru_locks osc
15381 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15382 $LCTL set_param fail_loc=0x31a
15383 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15384 $LCTL set_param fail_loc=0
15386 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15389 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15392 test_mkdir $DIR/$tdir
15393 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15394 createmany -o $DIR/$tdir/$tfile 10
15395 cancel_lru_locks mdc
15396 cancel_lru_locks osc
15397 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15398 $LCTL set_param fail_loc=0x31b
15399 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15400 $LCTL set_param fail_loc=0
15403 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15405 test_224a() { # LU-1039, MRP-303
15406 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15408 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15409 $LCTL set_param fail_loc=0x508
15410 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15411 $LCTL set_param fail_loc=0
15414 run_test 224a "Don't panic on bulk IO failure"
15416 test_224b() { # LU-1039, MRP-303
15417 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15419 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15420 cancel_lru_locks osc
15421 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15422 $LCTL set_param fail_loc=0x515
15423 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15424 $LCTL set_param fail_loc=0
15427 run_test 224b "Don't panic on bulk IO failure"
15429 test_224c() { # LU-6441
15430 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15431 remote_mds_nodsh && skip "remote MDS with nodsh"
15433 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15434 save_writethrough $p
15435 set_cache writethrough on
15437 local pages_per_rpc=$($LCTL get_param \
15438 osc.*.max_pages_per_rpc)
15439 local at_max=$($LCTL get_param -n at_max)
15440 local timeout=$($LCTL get_param -n timeout)
15441 local test_at="at_max"
15442 local param_at="$FSNAME.sys.at_max"
15443 local test_timeout="timeout"
15444 local param_timeout="$FSNAME.sys.timeout"
15446 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
15448 set_persistent_param_and_check client "$test_at" "$param_at" 0
15449 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
15451 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
15452 do_facet ost1 $LCTL set_param fail_loc=0x520
15453 $LFS setstripe -c 1 -i 0 $DIR/$tfile
15454 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
15456 do_facet ost1 $LCTL set_param fail_loc=0
15458 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
15459 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
15462 $LCTL set_param -n $pages_per_rpc
15463 restore_lustre_params < $p
15466 run_test 224c "Don't hang if one of md lost during large bulk RPC"
15468 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
15470 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15471 if [ -z ${MDSSURVEY} ]; then
15472 skip_env "mds-survey not found"
15474 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15475 skip "Need MDS version at least 2.2.51"
15477 local mds=$(facet_host $SINGLEMDS)
15478 local target=$(do_nodes $mds 'lctl dl' |
15479 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15481 local cmd1="file_count=1000 thrhi=4"
15482 local cmd2="dir_count=2 layer=mdd stripe_count=0"
15483 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15484 local cmd="$cmd1 $cmd2 $cmd3"
15486 rm -f ${TMP}/mds_survey*
15488 eval $cmd || error "mds-survey with zero-stripe failed"
15489 cat ${TMP}/mds_survey*
15490 rm -f ${TMP}/mds_survey*
15492 run_test 225a "Metadata survey sanity with zero-stripe"
15495 if [ -z ${MDSSURVEY} ]; then
15496 skip_env "mds-survey not found"
15498 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15499 skip "Need MDS version at least 2.2.51"
15500 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15501 remote_mds_nodsh && skip "remote MDS with nodsh"
15502 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
15503 skip_env "Need to mount OST to test"
15506 local mds=$(facet_host $SINGLEMDS)
15507 local target=$(do_nodes $mds 'lctl dl' |
15508 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15510 local cmd1="file_count=1000 thrhi=4"
15511 local cmd2="dir_count=2 layer=mdd stripe_count=1"
15512 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15513 local cmd="$cmd1 $cmd2 $cmd3"
15515 rm -f ${TMP}/mds_survey*
15517 eval $cmd || error "mds-survey with stripe_count failed"
15518 cat ${TMP}/mds_survey*
15519 rm -f ${TMP}/mds_survey*
15521 run_test 225b "Metadata survey sanity with stripe_count = 1"
15523 mcreate_path2fid () {
15529 local path=$DIR/$tdir/$name
15534 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
15535 error "cannot create $desc"
15537 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
15539 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
15541 fid_path=$($LFS fid2path $MOUNT $fid)
15543 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
15545 [ "$path" == "$fid_path" ] ||
15546 error "fid2path returned $fid_path, expected $path"
15548 echo "pass with $path and $fid"
15553 mkdir -p $DIR/$tdir
15555 mcreate_path2fid 0010666 0 0 fifo "FIFO"
15556 mcreate_path2fid 0020666 1 3 null "character special file (null)"
15557 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
15558 mcreate_path2fid 0040666 0 0 dir "directory"
15559 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
15560 mcreate_path2fid 0100666 0 0 file "regular file"
15561 mcreate_path2fid 0120666 0 0 link "symbolic link"
15562 mcreate_path2fid 0140666 0 0 sock "socket"
15564 run_test 226a "call path2fid and fid2path on files of all type"
15567 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15572 mkdir -p $DIR/$tdir
15573 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
15574 error "create remote directory failed"
15575 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
15576 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
15577 "character special file (null)"
15578 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
15579 "character special file (no device)"
15580 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
15581 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
15582 "block special file (loop)"
15583 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
15584 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
15585 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
15587 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
15589 # LU-1299 Executing or running ldd on a truncated executable does not
15590 # cause an out-of-memory condition.
15592 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15593 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
15595 dd if=$(which date) of=$MOUNT/date bs=1k count=1
15596 chmod +x $MOUNT/date
15598 $MOUNT/date > /dev/null
15599 ldd $MOUNT/date > /dev/null
15602 run_test 227 "running truncated executable does not cause OOM"
15604 # LU-1512 try to reuse idle OI blocks
15606 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15607 remote_mds_nodsh && skip "remote MDS with nodsh"
15608 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15610 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15611 local myDIR=$DIR/$tdir
15614 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15615 $LCTL set_param fail_loc=0x80001002
15616 createmany -o $myDIR/t- 10000
15617 $LCTL set_param fail_loc=0
15618 # The guard is current the largest FID holder
15620 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15622 local IDX=$(($SEQ % 64))
15624 do_facet $SINGLEMDS sync
15625 # Make sure journal flushed.
15627 local blk1=$(do_facet $SINGLEMDS \
15628 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15629 grep Blockcount | awk '{print $4}')
15631 # Remove old files, some OI blocks will become idle.
15632 unlinkmany $myDIR/t- 10000
15633 # Create new files, idle OI blocks should be reused.
15634 createmany -o $myDIR/t- 2000
15635 do_facet $SINGLEMDS sync
15636 # Make sure journal flushed.
15638 local blk2=$(do_facet $SINGLEMDS \
15639 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15640 grep Blockcount | awk '{print $4}')
15642 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15644 run_test 228a "try to reuse idle OI blocks"
15647 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15648 remote_mds_nodsh && skip "remote MDS with nodsh"
15649 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15651 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15652 local myDIR=$DIR/$tdir
15655 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15656 $LCTL set_param fail_loc=0x80001002
15657 createmany -o $myDIR/t- 10000
15658 $LCTL set_param fail_loc=0
15659 # The guard is current the largest FID holder
15661 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15663 local IDX=$(($SEQ % 64))
15665 do_facet $SINGLEMDS sync
15666 # Make sure journal flushed.
15668 local blk1=$(do_facet $SINGLEMDS \
15669 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15670 grep Blockcount | awk '{print $4}')
15672 # Remove old files, some OI blocks will become idle.
15673 unlinkmany $myDIR/t- 10000
15676 stop $SINGLEMDS || error "Fail to stop MDT."
15678 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
15680 df $MOUNT || error "Fail to df."
15681 # Create new files, idle OI blocks should be reused.
15682 createmany -o $myDIR/t- 2000
15683 do_facet $SINGLEMDS sync
15684 # Make sure journal flushed.
15686 local blk2=$(do_facet $SINGLEMDS \
15687 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15688 grep Blockcount | awk '{print $4}')
15690 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15692 run_test 228b "idle OI blocks can be reused after MDT restart"
15696 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15697 remote_mds_nodsh && skip "remote MDS with nodsh"
15698 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15700 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15701 local myDIR=$DIR/$tdir
15704 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15705 $LCTL set_param fail_loc=0x80001002
15706 # 20000 files can guarantee there are index nodes in the OI file
15707 createmany -o $myDIR/t- 20000
15708 $LCTL set_param fail_loc=0
15709 # The guard is current the largest FID holder
15711 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15713 local IDX=$(($SEQ % 64))
15715 do_facet $SINGLEMDS sync
15716 # Make sure journal flushed.
15718 local blk1=$(do_facet $SINGLEMDS \
15719 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15720 grep Blockcount | awk '{print $4}')
15722 # Remove old files, some OI blocks will become idle.
15723 unlinkmany $myDIR/t- 20000
15725 # The OI file should become empty now
15727 # Create new files, idle OI blocks should be reused.
15728 createmany -o $myDIR/t- 2000
15729 do_facet $SINGLEMDS sync
15730 # Make sure journal flushed.
15732 local blk2=$(do_facet $SINGLEMDS \
15733 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15734 grep Blockcount | awk '{print $4}')
15736 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15738 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
15740 test_229() { # LU-2482, LU-3448
15741 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15742 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
15743 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
15744 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
15748 # Create a file with a released layout and stripe count 2.
15749 $MULTIOP $DIR/$tfile H2c ||
15750 error "failed to create file with released layout"
15752 $GETSTRIPE -v $DIR/$tfile
15754 local pattern=$($GETSTRIPE -L $DIR/$tfile)
15755 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
15757 local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
15758 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
15759 stat $DIR/$tfile || error "failed to stat released file"
15761 chown $RUNAS_ID $DIR/$tfile ||
15762 error "chown $RUNAS_ID $DIR/$tfile failed"
15764 chgrp $RUNAS_ID $DIR/$tfile ||
15765 error "chgrp $RUNAS_ID $DIR/$tfile failed"
15767 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
15768 rm $DIR/$tfile || error "failed to remove released file"
15770 run_test 229 "getstripe/stat/rm/attr changes work on released files"
15773 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15774 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15775 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15776 skip "Need MDS version at least 2.11.52"
15780 test_mkdir $DIR/$tdir
15781 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
15782 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
15783 [ $mdt_idx -ne 0 ] &&
15784 error "create local directory on wrong MDT $mdt_idx"
15786 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
15787 error "create remote directory failed"
15788 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
15789 [ $mdt_idx -ne $MDTIDX ] &&
15790 error "create remote directory on wrong MDT $mdt_idx"
15792 createmany -o $DIR/$tdir/test_230/t- 10 ||
15793 error "create files on remote directory failed"
15794 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
15795 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
15796 rm -r $DIR/$tdir || error "unlink remote directory failed"
15798 run_test 230a "Create remote directory and files under the remote directory"
15801 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15802 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15803 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15804 skip "Need MDS version at least 2.11.52"
15812 local migrate_dir=$DIR/$tdir/migrate_dir
15813 local other_dir=$DIR/$tdir/other_dir
15815 test_mkdir $DIR/$tdir
15816 test_mkdir -i0 -c1 $migrate_dir
15817 test_mkdir -i0 -c1 $other_dir
15818 for ((i=0; i<10; i++)); do
15819 mkdir -p $migrate_dir/dir_${i}
15820 createmany -o $migrate_dir/dir_${i}/f 10 ||
15821 error "create files under remote dir failed $i"
15824 cp /etc/passwd $migrate_dir/$tfile
15825 cp /etc/passwd $other_dir/$tfile
15826 chattr +SAD $migrate_dir
15827 chattr +SAD $migrate_dir/$tfile
15829 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15830 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15831 local old_dir_mode=$(stat -c%f $migrate_dir)
15832 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
15834 mkdir -p $migrate_dir/dir_default_stripe2
15835 $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2
15836 $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2
15838 mkdir -p $other_dir
15839 ln $migrate_dir/$tfile $other_dir/luna
15840 ln $migrate_dir/$tfile $migrate_dir/sofia
15841 ln $other_dir/$tfile $migrate_dir/david
15842 ln -s $migrate_dir/$tfile $other_dir/zachary
15843 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
15844 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
15846 $LFS migrate -m $MDTIDX $migrate_dir ||
15847 error "fails on migrating remote dir to MDT1"
15849 echo "migratate to MDT1, then checking.."
15850 for ((i = 0; i < 10; i++)); do
15851 for file in $(find $migrate_dir/dir_${i}); do
15852 mdt_index=$($LFS getstripe -m $file)
15853 [ $mdt_index == $MDTIDX ] ||
15854 error "$file is not on MDT${MDTIDX}"
15858 # the multiple link file should still in MDT0
15859 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
15860 [ $mdt_index == 0 ] ||
15861 error "$file is not on MDT${MDTIDX}"
15863 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15864 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15865 error " expect $old_dir_flag get $new_dir_flag"
15867 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15868 [ "$old_file_flag" = "$new_file_flag" ] ||
15869 error " expect $old_file_flag get $new_file_flag"
15871 local new_dir_mode=$(stat -c%f $migrate_dir)
15872 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15873 error "expect mode $old_dir_mode get $new_dir_mode"
15875 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15876 [ "$old_file_mode" = "$new_file_mode" ] ||
15877 error "expect mode $old_file_mode get $new_file_mode"
15879 diff /etc/passwd $migrate_dir/$tfile ||
15880 error "$tfile different after migration"
15882 diff /etc/passwd $other_dir/luna ||
15883 error "luna different after migration"
15885 diff /etc/passwd $migrate_dir/sofia ||
15886 error "sofia different after migration"
15888 diff /etc/passwd $migrate_dir/david ||
15889 error "david different after migration"
15891 diff /etc/passwd $other_dir/zachary ||
15892 error "zachary different after migration"
15894 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15895 error "${tfile}_ln different after migration"
15897 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15898 error "${tfile}_ln_other different after migration"
15900 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
15901 [ $stripe_count = 2 ] ||
15902 error "dir strpe_count $d != 2 after migration."
15904 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
15905 [ $stripe_count = 2 ] ||
15906 error "file strpe_count $d != 2 after migration."
15908 #migrate back to MDT0
15911 $LFS migrate -m $MDTIDX $migrate_dir ||
15912 error "fails on migrating remote dir to MDT0"
15914 echo "migrate back to MDT0, checking.."
15915 for file in $(find $migrate_dir); do
15916 mdt_index=$($LFS getstripe -m $file)
15917 [ $mdt_index == $MDTIDX ] ||
15918 error "$file is not on MDT${MDTIDX}"
15921 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15922 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15923 error " expect $old_dir_flag get $new_dir_flag"
15925 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15926 [ "$old_file_flag" = "$new_file_flag" ] ||
15927 error " expect $old_file_flag get $new_file_flag"
15929 local new_dir_mode=$(stat -c%f $migrate_dir)
15930 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15931 error "expect mode $old_dir_mode get $new_dir_mode"
15933 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15934 [ "$old_file_mode" = "$new_file_mode" ] ||
15935 error "expect mode $old_file_mode get $new_file_mode"
15937 diff /etc/passwd ${migrate_dir}/$tfile ||
15938 error "$tfile different after migration"
15940 diff /etc/passwd ${other_dir}/luna ||
15941 error "luna different after migration"
15943 diff /etc/passwd ${migrate_dir}/sofia ||
15944 error "sofia different after migration"
15946 diff /etc/passwd ${other_dir}/zachary ||
15947 error "zachary different after migration"
15949 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15950 error "${tfile}_ln different after migration"
15952 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15953 error "${tfile}_ln_other different after migration"
15955 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
15956 [ $stripe_count = 2 ] ||
15957 error "dir strpe_count $d != 2 after migration."
15959 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
15960 [ $stripe_count = 2 ] ||
15961 error "file strpe_count $d != 2 after migration."
15963 rm -rf $DIR/$tdir || error "rm dir failed after migration"
15965 run_test 230b "migrate directory"
15968 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15969 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15970 remote_mds_nodsh && skip "remote MDS with nodsh"
15971 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15972 skip "Need MDS version at least 2.11.52"
15978 local migrate_dir=$DIR/$tdir/migrate_dir
15980 #If migrating directory fails in the middle, all entries of
15981 #the directory is still accessiable.
15982 test_mkdir $DIR/$tdir
15983 test_mkdir -i0 -c1 $migrate_dir
15984 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
15986 createmany -o $migrate_dir/f $total ||
15987 error "create files under ${migrate_dir} failed"
15989 # fail after migrating top dir, and this will fail only once, so the
15990 # first sub file migration will fail (currently f3), others succeed.
15991 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
15992 do_facet mds1 lctl set_param fail_loc=0x1801
15993 local t=$(ls $migrate_dir | wc -l)
15994 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
15995 error "migrate should fail"
15996 local u=$(ls $migrate_dir | wc -l)
15997 [ "$u" == "$t" ] || error "$u != $t during migration"
15999 # add new dir/file should succeed
16000 mkdir $migrate_dir/dir ||
16001 error "mkdir failed under migrating directory"
16002 touch $migrate_dir/file ||
16003 error "create file failed under migrating directory"
16005 # add file with existing name should fail
16006 for file in $migrate_dir/f*; do
16007 stat $file > /dev/null || error "stat $file failed"
16008 $OPENFILE -f O_CREAT:O_EXCL $file &&
16009 error "open(O_CREAT|O_EXCL) $file should fail"
16010 $MULTIOP $file m && error "create $file should fail"
16011 touch $DIR/$tdir/remote_dir/$tfile ||
16012 error "touch $tfile failed"
16013 ln $DIR/$tdir/remote_dir/$tfile $file &&
16014 error "link $file should fail"
16015 mdt_index=$($LFS getstripe -m $file)
16016 if [ $mdt_index == 0 ]; then
16017 # file failed to migrate is not allowed to rename to
16018 mv $DIR/$tdir/remote_dir/$tfile $file &&
16019 error "rename to $file should fail"
16021 mv $DIR/$tdir/remote_dir/$tfile $file ||
16022 error "rename to $file failed"
16024 echo hello >> $file || error "write $file failed"
16027 # resume migration with different options should fail
16028 $LFS migrate -m 0 $migrate_dir &&
16029 error "migrate -m 0 $migrate_dir should fail"
16031 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
16032 error "migrate -c 2 $migrate_dir should fail"
16034 # resume migration should succeed
16035 $LFS migrate -m $MDTIDX $migrate_dir ||
16036 error "migrate $migrate_dir failed"
16038 echo "Finish migration, then checking.."
16039 for file in $(find $migrate_dir); do
16040 mdt_index=$($LFS getstripe -m $file)
16041 [ $mdt_index == $MDTIDX ] ||
16042 error "$file is not on MDT${MDTIDX}"
16045 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16047 run_test 230c "check directory accessiblity if migration failed"
16050 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16051 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16052 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16053 skip "Need MDS version at least 2.11.52"
16055 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
16057 local migrate_dir=$DIR/$tdir/migrate_dir
16067 old_index=$((RANDOM % MDSCOUNT))
16068 old_count=$((MDSCOUNT - old_index))
16069 new_index=$((RANDOM % MDSCOUNT))
16070 new_count=$((MDSCOUNT - new_index))
16071 new_hash="all_char"
16073 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
16074 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
16076 test_mkdir $DIR/$tdir
16077 test_mkdir -i $old_index -c $old_count $migrate_dir
16079 for ((i=0; i<100; i++)); do
16080 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
16081 createmany -o $migrate_dir/dir_${i}/f 100 ||
16082 error "create files under remote dir failed $i"
16085 echo -n "Migrate from MDT$old_index "
16086 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
16087 echo -n "to MDT$new_index"
16088 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
16091 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
16092 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
16093 error "migrate remote dir error"
16095 echo "Finish migration, then checking.."
16096 for file in $(find $migrate_dir); do
16097 mdt_index=$($LFS getstripe -m $file)
16098 if [ $mdt_index -lt $new_index ] ||
16099 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
16100 error "$file is on MDT$mdt_index"
16104 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16106 run_test 230d "check migrate big directory"
16109 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16110 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16111 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16112 skip "Need MDS version at least 2.11.52"
16119 mkdir -p $DIR/$tdir
16120 mkdir $DIR/$tdir/migrate_dir
16121 mkdir $DIR/$tdir/other_dir
16122 touch $DIR/$tdir/migrate_dir/a
16123 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
16124 ls $DIR/$tdir/other_dir
16126 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16127 error "migrate dir fails"
16129 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16130 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16132 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16133 [ $mdt_index == 0 ] || error "a is not on MDT0"
16135 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
16136 error "migrate dir fails"
16138 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
16139 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
16141 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16142 [ $mdt_index == 1 ] || error "a is not on MDT1"
16144 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
16145 [ $mdt_index == 1 ] || error "b is not on MDT1"
16147 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16148 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
16150 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
16152 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16154 run_test 230e "migrate mulitple local link files"
16157 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16158 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16159 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16160 skip "Need MDS version at least 2.11.52"
16165 mkdir -p $DIR/$tdir
16166 mkdir $DIR/$tdir/migrate_dir
16167 $LFS mkdir -i1 $DIR/$tdir/other_dir
16168 touch $DIR/$tdir/migrate_dir/a
16169 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
16170 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
16171 ls $DIR/$tdir/other_dir
16173 # a should be migrated to MDT1, since no other links on MDT0
16174 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16175 error "#1 migrate dir fails"
16176 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16177 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16178 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16179 [ $mdt_index == 1 ] || error "a is not on MDT1"
16181 # a should stay on MDT1, because it is a mulitple link file
16182 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16183 error "#2 migrate dir fails"
16184 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16185 [ $mdt_index == 1 ] || error "a is not on MDT1"
16187 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16188 error "#3 migrate dir fails"
16190 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16191 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
16192 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
16194 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
16195 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
16197 # a should be migrated to MDT0, since no other links on MDT1
16198 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16199 error "#4 migrate dir fails"
16200 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16201 [ $mdt_index == 0 ] || error "a is not on MDT0"
16203 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16205 run_test 230f "migrate mulitple remote link files"
16208 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16209 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16210 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16211 skip "Need MDS version at least 2.11.52"
16213 mkdir -p $DIR/$tdir/migrate_dir
16215 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
16216 error "migrating dir to non-exist MDT succeeds"
16219 run_test 230g "migrate dir to non-exist MDT"
16222 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16223 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16224 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16225 skip "Need MDS version at least 2.11.52"
16229 mkdir -p $DIR/$tdir/migrate_dir
16231 $LFS migrate -m1 $DIR &&
16232 error "migrating mountpoint1 should fail"
16234 $LFS migrate -m1 $DIR/$tdir/.. &&
16235 error "migrating mountpoint2 should fail"
16238 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
16239 error "migrating $tdir/migrate_dir/.. should fail"
16243 run_test 230h "migrate .. and root"
16246 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16247 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16248 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16249 skip "Need MDS version at least 2.11.52"
16251 mkdir -p $DIR/$tdir/migrate_dir
16253 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
16254 error "migration fails with a tailing slash"
16256 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
16257 error "migration fails with two tailing slashes"
16259 run_test 230i "lfs migrate -m tolerates trailing slashes"
16262 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16263 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16264 skip "Need MDS version at least 2.11.52"
16266 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
16267 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
16268 error "create $tfile failed"
16269 cat /etc/passwd > $DIR/$tdir/$tfile
16271 $LFS migrate -m 1 $DIR/$tdir
16273 cmp /etc/passwd $DIR/$tdir/$tfile ||
16274 error "DoM file mismatch after migration"
16276 run_test 230j "DoM file data not changed after dir migration"
16279 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
16280 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16281 skip "Need MDS version at least 2.11.56"
16284 local files_on_starting_mdt=0
16286 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
16287 $LFS getdirstripe $DIR/$tdir
16288 for i in $(seq $total); do
16289 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
16290 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16291 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16294 echo "$files_on_starting_mdt files on MDT0"
16296 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
16297 $LFS getdirstripe $DIR/$tdir
16299 files_on_starting_mdt=0
16300 for i in $(seq $total); do
16301 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16302 error "file $tfile.$i mismatch after migration"
16303 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16304 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16307 echo "$files_on_starting_mdt files on MDT1 after migration"
16308 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16310 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16311 $LFS getdirstripe $DIR/$tdir
16313 files_on_starting_mdt=0
16314 for i in $(seq $total); do
16315 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16316 error "file $tfile.$i mismatch after 2nd migration"
16317 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16318 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16321 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
16322 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16326 run_test 230k "file data not changed after dir migration"
16329 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16330 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16331 skip "Need MDS version at least 2.11.56"
16333 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16334 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16335 error "create files under remote dir failed $i"
16336 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16338 run_test 230l "readdir between MDTs won't crash"
16341 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16342 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16343 skip "Need MDS version at least 2.11.56"
16346 local mig_dir=$DIR/$tdir/migrate_dir
16347 local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16351 echo "Creating files and dirs with xattrs"
16352 test_mkdir $DIR/$tdir
16353 test_mkdir -i0 -c1 $mig_dir
16355 setfattr -n user.attr1 -v $longstr $mig_dir/dir ||
16356 error "cannot set xattr attr1 on dir"
16357 setfattr -n user.attr2 -v $shortstr $mig_dir/dir ||
16358 error "cannot set xattr attr2 on dir"
16359 touch $mig_dir/dir/f0
16360 setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 ||
16361 error "cannot set xattr attr1 on file"
16362 setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 ||
16363 error "cannot set xattr attr2 on file"
16364 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16365 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16366 [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir"
16367 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16368 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir"
16369 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16370 [ "$val" = $longstr ] || error "xattr attr1 not set properly on file"
16371 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16372 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file"
16374 echo "Migrating to MDT1"
16375 $LFS migrate -m $MDTIDX $mig_dir ||
16376 error "fails on migrating dir to MDT1"
16378 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16379 echo "Checking xattrs"
16380 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16381 [ "$val" = $longstr ] ||
16382 error "expecting xattr1 $longstr on dir, found $val"
16383 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16384 [ "$val" = $shortstr ] ||
16385 error "expecting xattr2 $shortstr on dir, found $val"
16386 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16387 [ "$val" = $longstr ] ||
16388 error "expecting xattr1 $longstr on file, found $val"
16389 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16390 [ "$val" = $shortstr ] ||
16391 error "expecting xattr2 $shortstr on file, found $val"
16393 run_test 230m "xattrs not changed after dir migration"
16397 # For simplicity this test assumes that max_pages_per_rpc
16398 # is the same across all OSCs
16399 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16400 local bulk_size=$((max_pages * PAGE_SIZE))
16401 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16404 mkdir -p $DIR/$tdir
16405 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16406 error "failed to set stripe with -S ${brw_size}M option"
16408 # clear the OSC stats
16409 $LCTL set_param osc.*.stats=0 &>/dev/null
16412 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16413 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16414 oflag=direct &>/dev/null || error "dd failed"
16416 sync; sleep 1; sync # just to be safe
16417 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16418 if [ x$nrpcs != "x1" ]; then
16419 $LCTL get_param osc.*.stats
16420 error "found $nrpcs ost_write RPCs, not 1 as expected"
16424 # Drop the OSC cache, otherwise we will read from it
16425 cancel_lru_locks osc
16427 # clear the OSC stats
16428 $LCTL set_param osc.*.stats=0 &>/dev/null
16430 # Client reads $bulk_size.
16431 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16432 iflag=direct &>/dev/null || error "dd failed"
16434 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16435 if [ x$nrpcs != "x1" ]; then
16436 $LCTL get_param osc.*.stats
16437 error "found $nrpcs ost_read RPCs, not 1 as expected"
16440 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16443 mkdir -p $DIR/$tdir
16445 for i in {0..1023}; do
16446 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16447 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16448 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16452 run_test 231b "must not assert on fully utilized OST request buffer"
16455 mkdir -p $DIR/$tdir
16456 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16458 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16459 do_facet ost1 $LCTL set_param fail_loc=0x31c
16461 # ignore dd failure
16462 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16464 do_facet ost1 $LCTL set_param fail_loc=0
16465 umount_client $MOUNT || error "umount failed"
16466 mount_client $MOUNT || error "mount failed"
16467 stop ost1 || error "cannot stop ost1"
16468 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16470 run_test 232a "failed lock should not block umount"
16473 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16474 skip "Need MDS version at least 2.10.58"
16476 mkdir -p $DIR/$tdir
16477 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16478 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16480 cancel_lru_locks osc
16482 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16483 do_facet ost1 $LCTL set_param fail_loc=0x31c
16486 $LFS data_version $DIR/$tdir/$tfile || true
16488 do_facet ost1 $LCTL set_param fail_loc=0
16489 umount_client $MOUNT || error "umount failed"
16490 mount_client $MOUNT || error "mount failed"
16491 stop ost1 || error "cannot stop ost1"
16492 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16494 run_test 232b "failed data version lock should not block umount"
16497 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
16498 skip "Need MDS version at least 2.3.64"
16499 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16501 local fid=$($LFS path2fid $MOUNT)
16503 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16504 error "cannot access $MOUNT using its FID '$fid'"
16506 run_test 233a "checking that OBF of the FS root succeeds"
16509 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
16510 skip "Need MDS version at least 2.5.90"
16511 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16513 local fid=$($LFS path2fid $MOUNT/.lustre)
16515 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16516 error "cannot access $MOUNT/.lustre using its FID '$fid'"
16518 fid=$($LFS path2fid $MOUNT/.lustre/fid)
16519 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16520 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
16522 run_test 233b "checking that OBF of the FS .lustre succeeds"
16525 local p="$TMP/sanityN-$TESTNAME.parameters"
16526 save_lustre_params client "llite.*.xattr_cache" > $p
16527 lctl set_param llite.*.xattr_cache 1 ||
16528 skip_env "xattr cache is not supported"
16530 mkdir -p $DIR/$tdir || error "mkdir failed"
16531 touch $DIR/$tdir/$tfile || error "touch failed"
16532 # OBD_FAIL_LLITE_XATTR_ENOMEM
16533 $LCTL set_param fail_loc=0x1405
16534 getfattr -n user.attr $DIR/$tdir/$tfile &&
16535 error "getfattr should have failed with ENOMEM"
16536 $LCTL set_param fail_loc=0x0
16539 restore_lustre_params < $p
16542 run_test 234 "xattr cache should not crash on ENOMEM"
16545 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
16546 skip "Need MDS version at least 2.4.52"
16548 flock_deadlock $DIR/$tfile
16553 124) error "process hangs on a deadlock"
16555 *) error "error executing flock_deadlock $DIR/$tfile"
16559 run_test 235 "LU-1715: flock deadlock detection does not work properly"
16563 check_swap_layouts_support
16565 local ref1=/etc/passwd
16566 local ref2=/etc/group
16567 local file1=$DIR/$tdir/f1
16568 local file2=$DIR/$tdir/f2
16570 test_mkdir -c1 $DIR/$tdir
16571 $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
16572 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
16573 $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
16574 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
16575 local fd=$(free_fd)
16576 local cmd="exec $fd<>$file2"
16579 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
16580 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
16583 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
16588 run_test 236 "Layout swap on open unlinked file"
16590 # LU-4659 linkea consistency
16592 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
16593 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
16594 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
16595 skip "Need MDS version at least 2.5.58 or 2.5.2+"
16598 ln $DIR/$tfile $DIR/$tfile.lnk
16599 touch $DIR/$tfile.new
16600 mv $DIR/$tfile.new $DIR/$tfile
16601 local fid1=$($LFS path2fid $DIR/$tfile)
16602 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
16603 local path1=$($LFS fid2path $FSNAME "$fid1")
16604 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
16605 local path2=$($LFS fid2path $FSNAME "$fid2")
16606 [ $tfile.lnk == $path2 ] ||
16607 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
16610 run_test 238 "Verify linkea consistency"
16612 test_239A() { # was test_239
16613 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
16614 skip "Need MDS version at least 2.5.60"
16616 local list=$(comma_list $(mdts_nodes))
16618 mkdir -p $DIR/$tdir
16619 createmany -o $DIR/$tdir/f- 5000
16620 unlinkmany $DIR/$tdir/f- 5000
16621 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
16622 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
16623 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
16624 osp.*MDT*.sync_in_flight" | calc_sum)
16625 [ "$changes" -eq 0 ] || error "$changes not synced"
16627 run_test 239A "osp_sync test"
16629 test_239a() { #LU-5297
16630 remote_mds_nodsh && skip "remote MDS with nodsh"
16633 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
16634 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
16635 chgrp $RUNAS_GID $DIR/$tfile
16636 wait_delete_completed
16638 run_test 239a "process invalid osp sync record correctly"
16640 test_239b() { #LU-5297
16641 remote_mds_nodsh && skip "remote MDS with nodsh"
16644 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
16645 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
16646 chgrp $RUNAS_GID $DIR/$tfile1
16647 wait_delete_completed
16648 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
16650 chgrp $RUNAS_GID $DIR/$tfile2
16651 wait_delete_completed
16653 run_test 239b "process osp sync record with ENOMEM error correctly"
16656 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16657 remote_mds_nodsh && skip "remote MDS with nodsh"
16659 mkdir -p $DIR/$tdir
16661 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
16662 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
16663 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
16664 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
16666 umount_client $MOUNT || error "umount failed"
16667 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
16668 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
16669 mount_client $MOUNT || error "failed to mount client"
16671 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
16672 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
16674 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
16680 for LOOP in $(seq $count); do
16681 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
16682 cancel_lru_locks $OSC || true
16690 for LOOP in $(seq $1); do
16691 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
16696 test_241a() { # was test_241
16697 local bsize=$PAGE_SIZE
16699 (( bsize < 40960 )) && bsize=40960
16700 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16702 cancel_lru_locks $OSC
16703 test_241_bio 1000 $bsize &
16705 test_241_dio 1000 $bsize
16708 run_test 241a "bio vs dio"
16711 local bsize=$PAGE_SIZE
16713 (( bsize < 40960 )) && bsize=40960
16714 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16716 test_241_dio 1000 $bsize &
16718 test_241_dio 1000 $bsize
16721 run_test 241b "dio vs dio"
16724 remote_mds_nodsh && skip "remote MDS with nodsh"
16726 mkdir -p $DIR/$tdir
16727 touch $DIR/$tdir/$tfile
16729 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
16730 do_facet mds1 lctl set_param fail_loc=0x105
16731 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
16733 do_facet mds1 lctl set_param fail_loc=0
16734 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
16736 run_test 242 "mdt_readpage failure should not cause directory unreadable"
16740 test_mkdir $DIR/$tdir
16741 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
16743 run_test 243 "various group lock tests"
16747 test_mkdir $DIR/$tdir
16748 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
16749 sendfile_grouplock $DIR/$tdir/$tfile || \
16750 error "sendfile+grouplock failed"
16753 run_test 244 "sendfile with group lock tests"
16756 local flagname="multi_mod_rpcs"
16757 local connect_data_name="max_mod_rpcs"
16760 # check if multiple modify RPCs flag is set
16761 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
16762 grep "connect_flags:")
16765 echo "$out" | grep -qw $flagname
16766 if [ $? -ne 0 ]; then
16767 echo "connect flag $flagname is not set"
16771 # check if multiple modify RPCs data is set
16772 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
16775 echo "$out" | grep -qw $connect_data_name ||
16776 error "import should have connect data $connect_data_name"
16778 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
16780 test_246() { # LU-7371
16781 remote_ost_nodsh && skip "remote OST with nodsh"
16782 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
16783 skip "Need OST version >= 2.7.62"
16785 do_facet ost1 $LCTL set_param fail_val=4095
16786 #define OBD_FAIL_OST_READ_SIZE 0x234
16787 do_facet ost1 $LCTL set_param fail_loc=0x234
16788 $LFS setstripe $DIR/$tfile -i 0 -c 1
16789 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
16790 cancel_lru_locks $FSNAME-OST0000
16791 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
16793 run_test 246 "Read file of size 4095 should return right length"
16799 umount_client $submount
16804 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16806 skip_env "Fileset feature is not supported"
16808 local submount=${MOUNT}_$tdir
16811 mkdir -p $submount || error "mkdir $submount failed"
16812 FILESET="$FILESET/$tdir" mount_client $submount ||
16813 error "mount $submount failed"
16814 trap "cleanup_247 $submount" EXIT
16815 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
16816 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
16817 error "read $MOUNT/$tdir/$tfile failed"
16818 cleanup_247 $submount
16820 run_test 247a "mount subdir as fileset"
16823 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16824 skip_env "Fileset feature is not supported"
16826 local submount=${MOUNT}_$tdir
16828 rm -rf $MOUNT/$tdir
16829 mkdir -p $submount || error "mkdir $submount failed"
16831 FILESET="$FILESET/$tdir" mount_client $submount &&
16832 error "mount $submount should fail"
16835 run_test 247b "mount subdir that dose not exist"
16838 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16839 skip_env "Fileset feature is not supported"
16841 local submount=${MOUNT}_$tdir
16843 mkdir -p $MOUNT/$tdir/dir1
16844 mkdir -p $submount || error "mkdir $submount failed"
16845 trap "cleanup_247 $submount" EXIT
16846 FILESET="$FILESET/$tdir" mount_client $submount ||
16847 error "mount $submount failed"
16848 local fid=$($LFS path2fid $MOUNT/)
16849 $LFS fid2path $submount $fid && error "fid2path should fail"
16850 cleanup_247 $submount
16852 run_test 247c "running fid2path outside root"
16855 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16856 skip "Fileset feature is not supported"
16858 local submount=${MOUNT}_$tdir
16860 mkdir -p $MOUNT/$tdir/dir1
16861 mkdir -p $submount || error "mkdir $submount failed"
16862 FILESET="$FILESET/$tdir" mount_client $submount ||
16863 error "mount $submount failed"
16864 trap "cleanup_247 $submount" EXIT
16865 local fid=$($LFS path2fid $submount/dir1)
16866 $LFS fid2path $submount $fid || error "fid2path should succeed"
16867 cleanup_247 $submount
16869 run_test 247d "running fid2path inside root"
16873 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16875 skip "Fileset feature is not supported"
16877 local submount=${MOUNT}_$tdir
16880 mkdir -p $submount || error "mkdir $submount failed"
16881 FILESET="$FILESET/.." mount_client $submount &&
16882 error "mount $submount should fail"
16885 run_test 247e "mount .. as fileset"
16888 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
16889 [ -z "$fast_read_sav" ] && skip "no fast read support"
16891 # create a large file for fast read verification
16892 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
16894 # make sure the file is created correctly
16895 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
16896 { rm -f $DIR/$tfile; skip "file creation error"; }
16898 echo "Test 1: verify that fast read is 4 times faster on cache read"
16900 # small read with fast read enabled
16901 $LCTL set_param -n llite.*.fast_read=1
16902 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16903 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16904 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16905 # small read with fast read disabled
16906 $LCTL set_param -n llite.*.fast_read=0
16907 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16908 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16909 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16911 # verify that fast read is 4 times faster for cache read
16912 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
16913 error_not_in_vm "fast read was not 4 times faster: " \
16914 "$t_fast vs $t_slow"
16916 echo "Test 2: verify the performance between big and small read"
16917 $LCTL set_param -n llite.*.fast_read=1
16919 # 1k non-cache read
16920 cancel_lru_locks osc
16921 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16922 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16923 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16925 # 1M non-cache read
16926 cancel_lru_locks osc
16927 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16928 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16929 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16931 # verify that big IO is not 4 times faster than small IO
16932 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
16933 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
16935 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
16938 run_test 248 "fast read verification"
16940 test_249() { # LU-7890
16941 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
16942 skip "Need at least version 2.8.54"
16945 $SETSTRIPE -c 1 $DIR/$tfile
16946 # Offset 2T == 4k * 512M
16947 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
16948 error "dd to 2T offset failed"
16950 run_test 249 "Write above 2T file size"
16953 [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
16954 && skip "no 16TB file size limit on ZFS"
16956 $SETSTRIPE -c 1 $DIR/$tfile
16957 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
16958 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
16959 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
16960 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
16961 conv=notrunc,fsync && error "append succeeded"
16964 run_test 250 "Write above 16T limit"
16967 $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile
16969 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
16970 #Skip once - writing the first stripe will succeed
16971 $LCTL set_param fail_loc=0xa0001407 fail_val=1
16972 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
16973 error "short write happened"
16975 $LCTL set_param fail_loc=0xa0001407 fail_val=1
16976 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
16977 error "short read happened"
16981 run_test 251 "Handling short read and write correctly"
16984 remote_mds_nodsh && skip "remote MDS with nodsh"
16985 remote_ost_nodsh && skip "remote OST with nodsh"
16986 if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then
16987 skip_env "ldiskfs only test"
16997 # check lr_reader on OST0000
16999 dev=$(facet_device $tgt)
17000 out=$(do_facet $tgt $LR_READER $dev)
17001 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17003 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
17004 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
17005 error "Invalid uuid returned by $LR_READER on target $tgt"
17006 echo -e "uuid returned by $LR_READER is '$uuid'\n"
17008 # check lr_reader -c on MDT0000
17010 dev=$(facet_device $tgt)
17011 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
17012 skip "$LR_READER does not support additional options"
17014 out=$(do_facet $tgt $LR_READER -c $dev)
17015 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17017 num=$(echo "$out" | grep -c "mdtlov")
17018 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
17019 error "Invalid number of mdtlov clients returned by $LR_READER"
17020 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
17022 # check lr_reader -cr on MDT0000
17023 out=$(do_facet $tgt $LR_READER -cr $dev)
17024 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17026 echo "$out" | grep -q "^reply_data:$" ||
17027 error "$LR_READER should have returned 'reply_data' section"
17028 num=$(echo "$out" | grep -c "client_generation")
17029 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
17031 run_test 252 "check lr_reader tool"
17033 test_253_fill_ost() {
17034 local size_mb #how many MB should we write to pass watermark
17035 local lwm=$3 #low watermark
17036 local free_10mb #10% of free space
17038 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17039 size_mb=$((free_kb / 1024 - lwm))
17040 free_10mb=$((free_kb / 10240))
17041 #If 10% of free space cross low watermark use it
17042 if (( free_10mb > size_mb )); then
17045 #At least we need to store 1.1 of difference between
17046 #free space and low watermark
17047 size_mb=$((size_mb + size_mb / 10))
17049 if (( lwm <= $((free_kb / 1024)) )) || [ ! -f $DIR/$tdir/1 ]; then
17050 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M count=$size_mb \
17051 oflag=append conv=notrunc
17056 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17057 echo "OST still has $((free_kb / 1024)) mbytes free"
17061 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17062 remote_mds_nodsh && skip "remote MDS with nodsh"
17063 remote_mgs_nodsh && skip "remote MGS with nodsh"
17068 local ost_name=$($LFS osts |
17069 sed -n 's/^'$ostidx': \(.*\)_UUID .*/\1/p')
17071 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
17072 do_facet $SINGLEMDS $LCTL get_param -n \
17073 osp.$mdtosc_proc1.reserved_mb_high ||
17074 skip "remote MDS does not support reserved_mb_high"
17078 wait_delete_completed
17081 local last_wm_h=$(do_facet $SINGLEMDS $LCTL get_param -n \
17082 osp.$mdtosc_proc1.reserved_mb_high)
17083 local last_wm_l=$(do_facet $SINGLEMDS $LCTL get_param -n \
17084 osp.$mdtosc_proc1.reserved_mb_low)
17085 echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l"
17087 create_pool $FSNAME.$TESTNAME || error "Pool creation failed"
17088 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name ||
17089 error "Adding $ost_name to pool failed"
17091 # Wait for client to see a OST at pool
17092 wait_update $HOSTNAME "$LCTL get_param -n
17093 lov.$FSNAME-*.pools.$TESTNAME | sort -u |
17094 grep $ost_name" "$ost_name""_UUID" $((TIMEOUT/2)) ||
17095 error "Client can not see the pool"
17096 $SETSTRIPE $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
17097 error "Setstripe failed"
17099 dd if=/dev/zero of=$DIR/$tdir/0 bs=1M count=10
17100 local blocks=$($LFS df $MOUNT | grep $ost_name | awk '{ print $4 }')
17101 echo "OST still has $((blocks/1024)) mbytes free"
17103 local new_lwm=$((blocks/1024-10))
17104 do_facet $SINGLEMDS $LCTL set_param \
17105 osp.$mdtosc_proc1.reserved_mb_high=$((new_lwm+5))
17106 do_facet $SINGLEMDS $LCTL set_param \
17107 osp.$mdtosc_proc1.reserved_mb_low=$new_lwm
17109 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17111 #First enospc could execute orphan deletion so repeat.
17112 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17114 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17115 osp.$mdtosc_proc1.prealloc_status)
17116 echo "prealloc_status $oa_status"
17118 dd if=/dev/zero of=$DIR/$tdir/2 bs=1M count=1 &&
17119 error "File creation should fail"
17120 #object allocation was stopped, but we still able to append files
17121 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M seek=6 count=5 oflag=append ||
17122 error "Append failed"
17123 rm -f $DIR/$tdir/1 $DIR/$tdir/0 $DIR/$tdir/r*
17125 wait_delete_completed
17129 for i in $(seq 10 12); do
17130 dd if=/dev/zero of=$DIR/$tdir/$i bs=1M count=1 2>/dev/null ||
17131 error "File creation failed after rm";
17134 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17135 osp.$mdtosc_proc1.prealloc_status)
17136 echo "prealloc_status $oa_status"
17138 if (( oa_status != 0 )); then
17139 error "Object allocation still disable after rm"
17141 do_facet $SINGLEMDS $LCTL set_param \
17142 osp.$mdtosc_proc1.reserved_mb_high=$last_wm_h
17143 do_facet $SINGLEMDS $LCTL set_param \
17144 osp.$mdtosc_proc1.reserved_mb_low=$last_wm_l
17147 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $ost_name ||
17148 error "Remove $ost_name from pool failed"
17149 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
17150 error "Pool destroy fialed"
17152 run_test 253 "Check object allocation limit"
17155 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17156 remote_mds_nodsh && skip "remote MDS with nodsh"
17157 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
17158 skip "MDS does not support changelog_size"
17161 local MDT0=$(facet_svc $SINGLEMDS)
17163 changelog_register || error "changelog_register failed"
17165 changelog_clear 0 || error "changelog_clear failed"
17167 local size1=$(do_facet $SINGLEMDS \
17168 $LCTL get_param -n mdd.$MDT0.changelog_size)
17169 echo "Changelog size $size1"
17172 $LFS mkdir -i 0 $DIR/$tdir
17174 mkdir -p $DIR/$tdir/pics/2008/zachy
17175 touch $DIR/$tdir/pics/2008/zachy/timestamp
17176 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
17177 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
17178 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
17179 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
17180 rm $DIR/$tdir/pics/desktop.jpg
17182 local size2=$(do_facet $SINGLEMDS \
17183 $LCTL get_param -n mdd.$MDT0.changelog_size)
17184 echo "Changelog size after work $size2"
17186 (( $size2 > $size1 )) ||
17187 error "new Changelog size=$size2 less than old size=$size1"
17189 run_test 254 "Check changelog size"
17196 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
17197 awk -F: '{print $2}' | grep $type > /dev/null
17198 if [ $? -ne 0 ]; then
17208 lfs ladvise -a willread $file > /dev/null 2>&1
17209 if [ $? -eq 0 ]; then
17213 lfs ladvise -a willread $file 2>&1 |
17214 grep "Inappropriate ioctl for device" > /dev/null
17215 if [ $? -eq 0 ]; then
17222 bc <<<"scale=2; ($1 - $2) * 100 / $2"
17225 # run a random read IO workload
17226 # usage: random_read_iops <filename> <filesize> <iosize>
17227 random_read_iops() {
17230 local iosize=${3:-4096}
17232 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
17233 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
17236 drop_file_oss_cache() {
17240 $LFS ladvise -a dontneed $file 2>/dev/null ||
17241 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
17244 ladvise_willread_performance()
17247 local average_origin=0
17248 local average_cache=0
17249 local average_ladvise=0
17251 for ((i = 1; i <= $repeat; i++)); do
17252 echo "Iter $i/$repeat: reading without willread hint"
17253 cancel_lru_locks osc
17254 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17255 local speed_origin=$(random_read_iops $DIR/$tfile $size)
17256 echo "Iter $i/$repeat: uncached speed: $speed_origin"
17257 average_origin=$(bc <<<"$average_origin + $speed_origin")
17259 cancel_lru_locks osc
17260 local speed_cache=$(random_read_iops $DIR/$tfile $size)
17261 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
17262 average_cache=$(bc <<<"$average_cache + $speed_cache")
17264 cancel_lru_locks osc
17265 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17266 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
17267 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
17268 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
17269 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
17271 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
17272 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
17273 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
17275 speedup_cache=$(percent $average_cache $average_origin)
17276 speedup_ladvise=$(percent $average_ladvise $average_origin)
17278 echo "Average uncached read: $average_origin"
17279 echo "Average speedup with OSS cached read: " \
17280 "$average_cache = +$speedup_cache%"
17281 echo "Average speedup with ladvise willread: " \
17282 "$average_ladvise = +$speedup_ladvise%"
17284 local lowest_speedup=20
17285 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
17286 echo "Speedup with OSS cached read less than $lowest_speedup%," \
17287 "got $average_cache%. Skipping ladvise willread check."
17291 # the test won't work on ZFS until it supports 'ladvise dontneed', but
17292 # it is still good to run until then to exercise 'ladvise willread'
17293 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17294 [ "$ost1_FSTYPE" = "zfs" ] &&
17295 echo "osd-zfs does not support dontneed or drop_caches" &&
17298 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
17299 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
17300 error_not_in_vm "Speedup with willread is less than " \
17301 "$lowest_speedup%, got $average_ladvise%"
17305 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17306 skip "lustre < 2.8.54 does not support ladvise "
17307 remote_ost_nodsh && skip "remote OST with nodsh"
17309 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
17311 ladvise_no_type willread $DIR/$tfile &&
17312 skip "willread ladvise is not supported"
17314 ladvise_no_ioctl $DIR/$tfile &&
17315 skip "ladvise ioctl is not supported"
17318 local size=$((size_mb * 1048576))
17319 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17320 error "dd to $DIR/$tfile failed"
17322 lfs ladvise -a willread $DIR/$tfile ||
17323 error "Ladvise failed with no range argument"
17325 lfs ladvise -a willread -s 0 $DIR/$tfile ||
17326 error "Ladvise failed with no -l or -e argument"
17328 lfs ladvise -a willread -e 1 $DIR/$tfile ||
17329 error "Ladvise failed with only -e argument"
17331 lfs ladvise -a willread -l 1 $DIR/$tfile ||
17332 error "Ladvise failed with only -l argument"
17334 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
17335 error "End offset should not be smaller than start offset"
17337 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
17338 error "End offset should not be equal to start offset"
17340 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
17341 error "Ladvise failed with overflowing -s argument"
17343 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
17344 error "Ladvise failed with overflowing -e argument"
17346 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
17347 error "Ladvise failed with overflowing -l argument"
17349 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
17350 error "Ladvise succeeded with conflicting -l and -e arguments"
17352 echo "Synchronous ladvise should wait"
17354 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17355 do_nodes $(comma_list $(osts_nodes)) \
17356 $LCTL set_param fail_val=$delay fail_loc=0x237
17358 local start_ts=$SECONDS
17359 lfs ladvise -a willread $DIR/$tfile ||
17360 error "Ladvise failed with no range argument"
17361 local end_ts=$SECONDS
17362 local inteval_ts=$((end_ts - start_ts))
17364 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17365 error "Synchronous advice didn't wait reply"
17368 echo "Asynchronous ladvise shouldn't wait"
17369 local start_ts=$SECONDS
17370 lfs ladvise -a willread -b $DIR/$tfile ||
17371 error "Ladvise failed with no range argument"
17372 local end_ts=$SECONDS
17373 local inteval_ts=$((end_ts - start_ts))
17375 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17376 error "Asynchronous advice blocked"
17379 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17380 ladvise_willread_performance
17382 run_test 255a "check 'lfs ladvise -a willread'"
17388 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17392 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17393 skip "lustre < 2.8.54 does not support ladvise "
17394 remote_ost_nodsh && skip "remote OST with nodsh"
17396 lfs setstripe -c 1 -i 0 $DIR/$tfile
17398 ladvise_no_type dontneed $DIR/$tfile &&
17399 skip "dontneed ladvise is not supported"
17401 ladvise_no_ioctl $DIR/$tfile &&
17402 skip "ladvise ioctl is not supported"
17404 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17405 [ "$ost1_FSTYPE" = "zfs" ] &&
17406 skip "zfs-osd does not support 'ladvise dontneed'"
17409 local size=$((size_mb * 1048576))
17410 # In order to prevent disturbance of other processes, only check 3/4
17411 # of the memory usage
17412 local kibibytes=$((size_mb * 1024 * 3 / 4))
17414 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17415 error "dd to $DIR/$tfile failed"
17417 #force write to complete before dropping OST cache & checking memory
17420 local total=$(facet_meminfo ost1 MemTotal)
17421 echo "Total memory: $total KiB"
17423 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17424 local before_read=$(facet_meminfo ost1 Cached)
17425 echo "Cache used before read: $before_read KiB"
17427 lfs ladvise -a willread $DIR/$tfile ||
17428 error "Ladvise willread failed"
17429 local after_read=$(facet_meminfo ost1 Cached)
17430 echo "Cache used after read: $after_read KiB"
17432 lfs ladvise -a dontneed $DIR/$tfile ||
17433 error "Ladvise dontneed again failed"
17434 local no_read=$(facet_meminfo ost1 Cached)
17435 echo "Cache used after dontneed ladvise: $no_read KiB"
17437 if [ $total -lt $((before_read + kibibytes)) ]; then
17438 echo "Memory is too small, abort checking"
17442 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17443 error "Ladvise willread should use more memory" \
17444 "than $kibibytes KiB"
17447 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17448 error "Ladvise dontneed should release more memory" \
17449 "than $kibibytes KiB"
17452 run_test 255b "check 'lfs ladvise -a dontneed'"
17455 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17456 skip "lustre < 2.10.50 does not support lockahead"
17464 test_mkdir -p $DIR/$tdir
17465 $SETSTRIPE -i 0 $DIR/$tdir
17467 #test 10 returns only success/failure
17469 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17471 if [ $rc -eq 255 ]; then
17472 error "Ladvise test${i} failed, ${rc}"
17475 #test 11 counts lock enqueue requests, all others count new locks
17477 count=$(do_facet ost1 \
17478 $LCTL get_param -n ost.OSS.ost.stats)
17479 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17481 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17483 if [ $rc -eq 255 ]; then
17484 error "Ladvise test${i} failed, ${rc}"
17487 new_count=$(do_facet ost1 \
17488 $LCTL get_param -n ost.OSS.ost.stats)
17489 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17490 awk '{ print $2 }')
17492 difference="$((new_count - count))"
17493 if [ $difference -ne $rc ]; then
17494 error "Ladvise test${i}, bad enqueue count, returned " \
17495 "${rc}, actual ${difference}"
17498 for i in $(seq 12 21); do
17499 # If we do not do this, we run the risk of having too many
17500 # locks and starting lock cancellation while we are checking
17502 cancel_lru_locks osc
17504 count=$($LCTL get_param -n \
17505 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17507 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17509 if [ $rc -eq 255 ]; then
17510 error "Ladvise test ${i} failed, ${rc}"
17513 new_count=$($LCTL get_param -n \
17514 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17515 difference="$((new_count - count))"
17517 # Test 15 output is divided by 100 to map down to valid return
17518 if [ $i -eq 15 ]; then
17522 if [ $difference -ne $rc ]; then
17523 error "Ladvise test ${i}, bad lock count, returned " \
17524 "${rc}, actual ${difference}"
17528 #test 22 returns only success/failure
17530 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17532 if [ $rc -eq 255 ]; then
17533 error "Ladvise test${i} failed, ${rc}"
17536 run_test 255c "suite of ladvise lockahead tests"
17539 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17540 remote_mds_nodsh && skip "remote MDS with nodsh"
17541 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17542 changelog_users $SINGLEMDS | grep "^cl" &&
17543 skip "active changelog user"
17549 mdt_dev=$(mdsdevname 1)
17552 changelog_register || error "changelog_register failed"
17555 mkdir -p $DIR/$tdir
17557 changelog_clear 0 || error "changelog_clear failed"
17560 touch $DIR/$tdir/{1..10}
17563 stop $SINGLEMDS || error "Fail to stop MDT"
17567 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
17569 #after mount new plainllog is used
17570 touch $DIR/$tdir/{11..19}
17571 local tmpfile=$(mktemp -u $tfile.XXXXXX)
17572 cat_sl=$(do_facet $SINGLEMDS "sync; \
17573 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17574 llog_reader $tmpfile | grep -c type=1064553b")
17575 do_facet $SINGLEMDS llog_reader $tmpfile
17577 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
17579 changelog_clear 0 || error "changelog_clear failed"
17581 cat_sl=$(do_facet $SINGLEMDS "sync; \
17582 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17583 llog_reader $tmpfile | grep -c type=1064553b; rm -f $tmpfile")
17585 if (( cat_sl == 2 )); then
17586 error "Empty plain llog was not deleted from changelog catalog"
17587 elif (( cat_sl != 1 )); then
17588 error "Active plain llog shouldn't be deleted from catalog"
17591 run_test 256 "Check llog delete for empty and not full state"
17594 remote_mds_nodsh && skip "remote MDS with nodsh"
17595 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
17596 skip "Need MDS version at least 2.8.55"
17598 test_mkdir $DIR/$tdir
17600 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
17601 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
17604 #define OBD_FAIL_MDS_XATTR_REP 0x161
17605 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17606 local facet=mds$((mdtidx + 1))
17607 set_nodes_failloc $(facet_active_host $facet) 0x80000161
17608 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
17610 stop $facet || error "stop MDS failed"
17611 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
17612 error "start MDS fail"
17614 run_test 257 "xattr locks are not lost"
17616 # Verify we take the i_mutex when security requires it
17618 #define OBD_FAIL_IMUTEX_SEC 0x141c
17619 $LCTL set_param fail_loc=0x141c
17621 chmod u+s $DIR/$tfile
17622 chmod a+rwx $DIR/$tfile
17623 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17625 if [ $RC -ne 0 ]; then
17626 error "error, failed to take i_mutex, rc=$?"
17630 run_test 258a "verify i_mutex security behavior when suid attributes is set"
17632 # Verify we do NOT take the i_mutex in the normal case
17634 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
17635 $LCTL set_param fail_loc=0x141d
17638 chmod a+rw $DIR/$tfile
17639 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17641 if [ $RC -ne 0 ]; then
17642 error "error, took i_mutex unnecessarily, rc=$?"
17647 run_test 258b "verify i_mutex security behavior"
17650 local file=$DIR/$tfile
17654 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17656 stack_trap "rm -f $file" EXIT
17658 wait_delete_completed
17659 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17660 echo "before: $before"
17662 $LFS setstripe -i 0 -c 1 $file
17663 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
17665 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17666 echo "after write: $after"
17668 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
17669 do_facet ost1 $LCTL set_param fail_loc=0x2301
17671 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17672 echo "after truncate: $after"
17675 do_facet ost1 $LCTL set_param fail_loc=0
17676 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17678 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17679 echo "after restart: $after"
17680 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
17681 error "missing truncate?"
17685 run_test 259 "crash at delayed truncate"
17688 #define OBD_FAIL_MDC_CLOSE 0x806
17689 $LCTL set_param fail_loc=0x80000806
17693 run_test 260 "Check mdc_close fail"
17695 ### Data-on-MDT sanity tests ###
17697 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17698 skip "Need MDS version at least 2.10.55 for DoM"
17701 local dom=$DIR/$tdir/dom_file
17702 local tmp=$DIR/$tdir/tmp_file
17704 mkdir -p $DIR/$tdir
17706 # basic checks for DoM component creation
17707 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
17708 error "Can set MDT layout to non-first entry"
17710 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
17711 error "Can define multiple entries as MDT layout"
17713 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
17715 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
17716 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
17717 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
17719 local mdtidx=$($LFS getstripe -m $dom)
17720 local mdtname=MDT$(printf %04x $mdtidx)
17721 local facet=mds$((mdtidx + 1))
17722 local space_check=1
17724 # Skip free space checks with ZFS
17725 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
17729 local size_tmp=$((65536 * 3))
17730 local mdtfree1=$(do_facet $facet \
17731 lctl get_param -n osd*.*$mdtname.kbytesfree)
17733 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17734 # check also direct IO along write
17735 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
17736 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17738 cmp $tmp $dom || error "file data is different"
17739 [ $(stat -c%s $dom) == $size_tmp ] ||
17740 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17741 if [ $space_check == 1 ]; then
17742 local mdtfree2=$(do_facet $facet \
17743 lctl get_param -n osd*.*$mdtname.kbytesfree)
17745 # increase in usage from by $size_tmp
17746 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17747 error "MDT free space wrong after write: " \
17748 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17752 local size_dom=10000
17754 $TRUNCATE $dom $size_dom
17755 [ $(stat -c%s $dom) == $size_dom ] ||
17756 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
17757 if [ $space_check == 1 ]; then
17758 mdtfree1=$(do_facet $facet \
17759 lctl get_param -n osd*.*$mdtname.kbytesfree)
17760 # decrease in usage from $size_tmp to new $size_dom
17761 [ $(($mdtfree1 - $mdtfree2)) -ge \
17762 $(((size_tmp - size_dom) / 1024)) ] ||
17763 error "MDT free space is wrong after truncate: " \
17764 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
17770 size_dom=$((size_dom + size_tmp))
17771 [ $(stat -c%s $dom) == $size_dom ] ||
17772 error "bad size after append: $(stat -c%s $dom) != $size_dom"
17773 if [ $space_check == 1 ]; then
17774 mdtfree2=$(do_facet $facet \
17775 lctl get_param -n osd*.*$mdtname.kbytesfree)
17776 # increase in usage by $size_tmp from previous
17777 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17778 error "MDT free space is wrong after append: " \
17779 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17784 if [ $space_check == 1 ]; then
17785 mdtfree1=$(do_facet $facet \
17786 lctl get_param -n osd*.*$mdtname.kbytesfree)
17787 # decrease in usage by $size_dom from previous
17788 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
17789 error "MDT free space is wrong after removal: " \
17790 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
17793 # combined striping
17794 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
17795 error "Can't create DoM + OST striping"
17797 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
17798 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17799 # check also direct IO along write
17800 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17802 cmp $tmp $dom || error "file data is different"
17803 [ $(stat -c%s $dom) == $size_tmp ] ||
17804 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17809 run_test 270a "DoM: basic functionality tests"
17812 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17813 skip "Need MDS version at least 2.10.55"
17815 local dom=$DIR/$tdir/dom_file
17816 local max_size=1048576
17818 mkdir -p $DIR/$tdir
17819 $LFS setstripe -E $max_size -L mdt $dom
17821 # truncate over the limit
17822 $TRUNCATE $dom $(($max_size + 1)) &&
17823 error "successful truncate over the maximum size"
17824 # write over the limit
17825 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
17826 error "successful write over the maximum size"
17827 # append over the limit
17828 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
17829 echo "12345" >> $dom && error "successful append over the maximum size"
17834 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
17837 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17838 skip "Need MDS version at least 2.10.55"
17840 mkdir -p $DIR/$tdir
17841 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17843 # check files inherit DoM EA
17844 touch $DIR/$tdir/first
17845 [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] ||
17846 error "bad pattern"
17847 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
17848 error "bad stripe count"
17849 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
17850 error "bad stripe size"
17852 # check directory inherits DoM EA and uses it as default
17853 mkdir $DIR/$tdir/subdir
17854 touch $DIR/$tdir/subdir/second
17855 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
17856 error "bad pattern in sub-directory"
17857 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
17858 error "bad stripe count in sub-directory"
17859 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
17860 error "bad stripe size in sub-directory"
17863 run_test 270c "DoM: DoM EA inheritance tests"
17866 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17867 skip "Need MDS version at least 2.10.55"
17869 mkdir -p $DIR/$tdir
17870 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17872 # inherit default DoM striping
17873 mkdir $DIR/$tdir/subdir
17874 touch $DIR/$tdir/subdir/f1
17876 # change default directory striping
17877 $LFS setstripe -c 1 $DIR/$tdir/subdir
17878 touch $DIR/$tdir/subdir/f2
17879 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
17880 error "wrong default striping in file 2"
17881 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
17882 error "bad pattern in file 2"
17885 run_test 270d "DoM: change striping from DoM to RAID0"
17888 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17889 skip "Need MDS version at least 2.10.55"
17891 mkdir -p $DIR/$tdir/dom
17892 mkdir -p $DIR/$tdir/norm
17895 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
17896 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
17898 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
17899 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
17901 # find DoM files by layout
17902 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
17903 [ $NUM -eq $DOMFILES ] ||
17904 error "lfs find -L: found $NUM, expected $DOMFILES"
17905 echo "Test 1: lfs find 20 DOM files by layout: OK"
17907 # there should be 1 dir with default DOM striping
17908 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
17910 error "lfs find -L: found $NUM, expected 1 dir"
17911 echo "Test 2: lfs find 1 DOM dir by layout: OK"
17913 # find DoM files by stripe size
17914 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
17915 [ $NUM -eq $DOMFILES ] ||
17916 error "lfs find -S: found $NUM, expected $DOMFILES"
17917 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
17919 # find files by stripe offset except DoM files
17920 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
17921 [ $NUM -eq $NORMFILES ] ||
17922 error "lfs find -i: found $NUM, expected $NORMFILES"
17923 echo "Test 5: lfs find no DOM files by stripe index: OK"
17926 run_test 270e "DoM: lfs find with DoM files test"
17929 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17930 skip "Need MDS version at least 2.10.55"
17932 local mdtname=${FSNAME}-MDT0000-mdtlov
17933 local dom=$DIR/$tdir/dom_file
17934 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
17935 lod.$mdtname.dom_stripesize)
17936 local dom_limit=131072
17938 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
17939 local dom_current=$(do_facet mds1 $LCTL get_param -n \
17940 lod.$mdtname.dom_stripesize)
17941 [ ${dom_limit} -eq ${dom_current} ] ||
17942 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
17944 $LFS mkdir -i 0 -c 1 $DIR/$tdir
17945 $LFS setstripe -d $DIR/$tdir
17946 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
17947 error "Can't set directory default striping"
17949 # exceed maximum stripe size
17950 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
17951 error "Can't create file with $((dom_limit * 2)) DoM stripe"
17952 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
17953 error "Able to create DoM component size more than LOD limit"
17955 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
17956 dom_current=$(do_facet mds1 $LCTL get_param -n \
17957 lod.$mdtname.dom_stripesize)
17958 [ 0 -eq ${dom_current} ] ||
17959 error "Can't set zero DoM stripe limit"
17962 # attempt to create DoM file on server with disabled DoM should
17963 # remove DoM entry from layout and be succeed
17964 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
17965 error "Can't create DoM file (DoM is disabled)"
17966 [ $($LFS getstripe -L $dom) == "mdt" ] &&
17967 error "File has DoM component while DoM is disabled"
17970 # attempt to create DoM file with only DoM stripe should return error
17971 $LFS setstripe -E $dom_limit -L mdt $dom &&
17972 error "Able to create DoM-only file while DoM is disabled"
17974 # too low values to be aligned with smallest stripe size 64K
17975 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
17976 dom_current=$(do_facet mds1 $LCTL get_param -n \
17977 lod.$mdtname.dom_stripesize)
17978 [ 30000 -eq ${dom_current} ] &&
17979 error "Can set too small DoM stripe limit"
17981 # 64K is a minimal stripe size in Lustre, expect limit of that size
17982 [ 65536 -eq ${dom_current} ] ||
17983 error "Limit is not set to 64K but ${dom_current}"
17985 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
17986 dom_current=$(do_facet mds1 $LCTL get_param -n \
17987 lod.$mdtname.dom_stripesize)
17989 [ 2147483648 -eq ${dom_current} ] &&
17990 error "Can set too large DoM stripe limit"
17992 do_facet mds1 $LCTL set_param -n \
17993 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
17994 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
17995 error "Can't create DoM component size after limit change"
17996 do_facet mds1 $LCTL set_param -n \
17997 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
17998 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
17999 error "Can't create DoM file after limit decrease"
18000 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
18001 error "Can create big DoM component after limit decrease"
18002 touch ${dom}_def ||
18003 error "Can't create file with old default layout"
18005 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
18008 run_test 270f "DoM: maximum DoM stripe size checks"
18011 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18012 skip "Need MDS version at least 2.10.55"
18014 local dom=$DIR/$tdir/dom
18016 mkdir -p $DIR/$tdir
18018 $LFS setstripe -E 1024K -L mdt $dom
18020 lctl set_param -n mdc.*.stats=clear
18021 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18022 cat $dom > /dev/null
18023 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
18024 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
18028 run_test 271a "DoM: data is cached for read after write"
18031 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18032 skip "Need MDS version at least 2.10.55"
18034 local dom=$DIR/$tdir/dom
18036 mkdir -p $DIR/$tdir
18038 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18040 lctl set_param -n mdc.*.stats=clear
18041 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18042 cancel_lru_locks mdc
18043 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
18044 # second stat to check size is cached on client
18045 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
18046 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18047 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
18050 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
18053 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18054 skip "Need MDS version at least 2.10.55"
18056 local dom=$DIR/$tdir/dom
18058 mkdir -p $DIR/$tdir
18060 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18062 lctl set_param -n mdc.*.stats=clear
18063 lctl set_param -n osc.*.stats=clear
18064 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
18065 cancel_lru_locks mdc
18066 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18067 # second stat to check size is cached on client
18068 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18069 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18070 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
18071 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
18072 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
18075 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
18081 local mdt=MDT$(printf %04x $mdtidx)
18083 if [ -z $param ]; then
18084 lctl get_param -n mdc.*$mdt*.stats
18086 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
18091 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18092 skip "Need MDS version at least 2.10.55"
18094 local dom=$DIR/$tdir/dom
18096 mkdir -p $DIR/$tdir
18098 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18100 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18101 local facet=mds$((mdtidx + 1))
18103 cancel_lru_locks mdc
18104 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
18105 createmany -o $dom 1000
18106 lctl set_param -n mdc.*.stats=clear
18107 smalliomany -w $dom 1000 200
18108 get_mdc_stats $mdtidx
18109 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18110 # Each file has 1 open, 1 IO enqueues, total 2000
18111 # but now we have also +1 getxattr for security.capability, total 3000
18112 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
18113 unlinkmany $dom 1000
18115 cancel_lru_locks mdc
18116 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
18117 createmany -o $dom 1000
18118 lctl set_param -n mdc.*.stats=clear
18119 smalliomany -w $dom 1000 200
18120 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18121 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
18122 # for OPEN and IO lock.
18123 [ $((enq - enq_2)) -ge 1000 ] ||
18124 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
18125 unlinkmany $dom 1000
18128 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
18130 cleanup_271def_tests() {
18136 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18137 skip "Need MDS version at least 2.10.57"
18139 local dom=$DIR/$tdir/dom
18140 local tmp=$TMP/$tfile
18141 trap "cleanup_271def_tests $tmp" EXIT
18143 mkdir -p $DIR/$tdir
18145 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18147 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18149 cancel_lru_locks mdc
18150 dd if=/dev/urandom of=$tmp bs=1000 count=1
18151 dd if=$tmp of=$dom bs=1000 count=1
18152 cancel_lru_locks mdc
18154 cat /etc/hosts >> $tmp
18155 lctl set_param -n mdc.*.stats=clear
18157 # append data to the same file it should update local page
18158 echo "Append to the same page"
18159 cat /etc/hosts >> $dom
18160 local num=$(get_mdc_stats $mdtidx ost_read)
18161 local ra=$(get_mdc_stats $mdtidx req_active)
18162 local rw=$(get_mdc_stats $mdtidx req_waittime)
18164 [ -z $num ] || error "$num READ RPC occured"
18165 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18169 cmp $tmp $dom || error "file miscompare"
18171 cancel_lru_locks mdc
18172 lctl set_param -n mdc.*.stats=clear
18174 echo "Open and read file"
18175 cat $dom > /dev/null
18176 local num=$(get_mdc_stats $mdtidx ost_read)
18177 local ra=$(get_mdc_stats $mdtidx req_active)
18178 local rw=$(get_mdc_stats $mdtidx req_waittime)
18180 [ -z $num ] || error "$num READ RPC occured"
18181 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18185 cmp $tmp $dom || error "file miscompare"
18189 run_test 271d "DoM: read on open (1K file in reply buffer)"
18192 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18193 skip "Need MDS version at least 2.10.57"
18195 local dom=$DIR/$tdir/dom
18196 local tmp=$TMP/$tfile
18197 trap "cleanup_271def_tests $tmp" EXIT
18199 mkdir -p $DIR/$tdir
18201 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18203 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18205 cancel_lru_locks mdc
18206 dd if=/dev/urandom of=$tmp bs=200000 count=1
18207 dd if=$tmp of=$dom bs=200000 count=1
18208 cancel_lru_locks mdc
18209 cat /etc/hosts >> $tmp
18210 lctl set_param -n mdc.*.stats=clear
18212 echo "Append to the same page"
18213 cat /etc/hosts >> $dom
18214 local num=$(get_mdc_stats $mdtidx ost_read)
18215 local ra=$(get_mdc_stats $mdtidx req_active)
18216 local rw=$(get_mdc_stats $mdtidx req_waittime)
18218 [ -z $num ] || error "$num READ RPC occured"
18219 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18223 cmp $tmp $dom || error "file miscompare"
18225 cancel_lru_locks mdc
18226 lctl set_param -n mdc.*.stats=clear
18228 echo "Open and read file"
18229 cat $dom > /dev/null
18230 local num=$(get_mdc_stats $mdtidx ost_read)
18231 local ra=$(get_mdc_stats $mdtidx req_active)
18232 local rw=$(get_mdc_stats $mdtidx req_waittime)
18234 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
18235 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18239 cmp $tmp $dom || error "file miscompare"
18243 run_test 271f "DoM: read on open (200K file and read tail)"
18246 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
18247 skip "Skipping due to old client or server version"
18249 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
18251 $CHECKSTAT -t file $DIR1/$tfile
18253 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
18256 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
18257 $LCTL set_param fail_loc=0x80000314
18258 rm $DIR1/$tfile || error "Unlink fails"
18260 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
18261 [ $RC -eq 0 ] || error "Failed write to stale object"
18263 run_test 271g "Discard DoM data vs client flush race"
18266 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18267 skip "Need MDS version at least 2.11.50"
18269 local dom=$DIR/$tdir/dom
18270 mkdir -p $DIR/$tdir
18272 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
18273 dd if=/dev/urandom of=$dom bs=512K count=1 ||
18274 error "failed to write data into $dom"
18275 local old_md5=$(md5sum $dom)
18277 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
18278 error "failed to migrate to the same DoM component"
18280 [ $($LFS getstripe -c $dom) -eq 2 ] ||
18281 error "layout was not changed silently"
18283 local new_md5=$(md5sum $dom)
18285 [ "$old_md5" != "$new_md5" ] &&
18286 error "md5sum differ: $old_md5, $new_md5"
18289 run_test 272a "DoM migration: new layout with the same DOM component"
18292 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18293 skip "Need MDS version at least 2.11.50"
18295 local dom=$DIR/$tdir/dom
18296 mkdir -p $DIR/$tdir
18297 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18299 local mdtidx=$($LFS getstripe -m $dom)
18300 local mdtname=MDT$(printf %04x $mdtidx)
18301 local facet=mds$((mdtidx + 1))
18303 local mdtfree1=$(do_facet $facet \
18304 lctl get_param -n osd*.*$mdtname.kbytesfree)
18305 dd if=/dev/urandom of=$dom bs=2M count=1 ||
18306 error "failed to write data into $dom"
18307 local old_md5=$(md5sum $dom)
18308 cancel_lru_locks mdc
18309 local mdtfree1=$(do_facet $facet \
18310 lctl get_param -n osd*.*$mdtname.kbytesfree)
18312 $LFS migrate -c2 $dom ||
18313 error "failed to migrate to the new composite layout"
18314 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18315 error "MDT stripe was not removed"
18317 cancel_lru_locks mdc
18318 local new_md5=$(md5sum $dom)
18319 [ "$old_md5" != "$new_md5" ] &&
18320 error "$old_md5 != $new_md5"
18322 # Skip free space checks with ZFS
18323 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18324 local mdtfree2=$(do_facet $facet \
18325 lctl get_param -n osd*.*$mdtname.kbytesfree)
18326 [ $mdtfree2 -gt $mdtfree1 ] ||
18327 error "MDT space is not freed after migration"
18331 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
18334 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18335 skip "Need MDS version at least 2.11.50"
18337 local dom=$DIR/$tdir/$tfile
18338 mkdir -p $DIR/$tdir
18339 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18341 local mdtidx=$($LFS getstripe -m $dom)
18342 local mdtname=MDT$(printf %04x $mdtidx)
18343 local facet=mds$((mdtidx + 1))
18345 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18346 error "failed to write data into $dom"
18347 local old_md5=$(md5sum $dom)
18348 cancel_lru_locks mdc
18349 local mdtfree1=$(do_facet $facet \
18350 lctl get_param -n osd*.*$mdtname.kbytesfree)
18352 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18353 error "failed to migrate to the new composite layout"
18354 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18355 error "MDT stripe was not removed"
18357 cancel_lru_locks mdc
18358 local new_md5=$(md5sum $dom)
18359 [ "$old_md5" != "$new_md5" ] &&
18360 error "$old_md5 != $new_md5"
18362 # Skip free space checks with ZFS
18363 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18364 local mdtfree2=$(do_facet $facet \
18365 lctl get_param -n osd*.*$mdtname.kbytesfree)
18366 [ $mdtfree2 -gt $mdtfree1 ] ||
18367 error "MDS space is not freed after migration"
18371 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18374 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18375 skip "Need MDS version at least 2.11.50"
18377 # Layout swap cannot be done if either file has DOM component,
18378 # this will never be supported, migration should be used instead
18380 local dom=$DIR/$tdir/$tfile
18381 mkdir -p $DIR/$tdir
18383 $LFS setstripe -c2 ${dom}_plain
18384 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18385 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18386 error "can swap layout with DoM component"
18387 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18388 error "can swap layout with DoM component"
18390 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18391 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18392 error "can swap layout with DoM component"
18393 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18394 error "can swap layout with DoM component"
18397 run_test 273a "DoM: layout swapping should fail with DOM"
18400 remote_ost_nodsh && skip "remote OST with nodsh"
18401 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18402 skip "Need OST version >= 2.10.57"
18404 local file=$DIR/$tfile
18407 oss=$(comma_list $(osts_nodes))
18409 dd if=/dev/urandom of=$file bs=1M count=2 ||
18410 error "failed to create a file"
18411 cancel_lru_locks osc
18414 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18415 error "failed to read a file"
18417 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
18418 $LCTL set_param fail_loc=0x8000031f
18420 cancel_lru_locks osc &
18423 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
18424 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
18425 #IO takes another lock, but matches the PENDING one
18426 #and places it to the IO RPC
18427 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18428 error "failed to read a file with PENDING lock"
18430 run_test 275 "Read on a canceled duplicate lock"
18433 remote_ost_nodsh && skip "remote OST with nodsh"
18436 do_facet ost1 "(while true; do \
18437 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
18438 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
18441 for LOOP in $(seq 20); do
18443 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
18446 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
18447 rm $TMP/sanity_276_pid"
18449 run_test 276 "Race between mount and obd_statfs"
18451 cleanup_test_300() {
18455 test_striped_dir() {
18460 mkdir -p $DIR/$tdir
18462 SAVE_UMASK=$(umask)
18463 trap cleanup_test_300 RETURN EXIT
18465 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
18466 $DIR/$tdir/striped_dir ||
18467 error "set striped dir error"
18469 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
18470 [ "$mode" = "755" ] || error "expect 755 got $mode"
18472 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
18473 error "getdirstripe failed"
18474 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
18475 if [ "$stripe_count" != "2" ]; then
18476 error "1:stripe_count is $stripe_count, expect 2"
18478 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
18479 if [ "$stripe_count" != "2" ]; then
18480 error "2:stripe_count is $stripe_count, expect 2"
18483 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
18484 if [ "$stripe_index" != "$mdt_index" ]; then
18485 error "stripe_index is $stripe_index, expect $mdt_index"
18488 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18489 error "nlink error after create striped dir"
18491 mkdir $DIR/$tdir/striped_dir/a
18492 mkdir $DIR/$tdir/striped_dir/b
18494 stat $DIR/$tdir/striped_dir/a ||
18495 error "create dir under striped dir failed"
18496 stat $DIR/$tdir/striped_dir/b ||
18497 error "create dir under striped dir failed"
18499 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
18500 error "nlink error after mkdir"
18502 rmdir $DIR/$tdir/striped_dir/a
18503 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
18504 error "nlink error after rmdir"
18506 rmdir $DIR/$tdir/striped_dir/b
18507 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18508 error "nlink error after rmdir"
18510 chattr +i $DIR/$tdir/striped_dir
18511 createmany -o $DIR/$tdir/striped_dir/f 10 &&
18512 error "immutable flags not working under striped dir!"
18513 chattr -i $DIR/$tdir/striped_dir
18515 rmdir $DIR/$tdir/striped_dir ||
18516 error "rmdir striped dir error"
18524 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18525 skip "skipped for lustre < 2.7.0"
18526 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18527 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18529 test_striped_dir 0 || error "failed on striped dir on MDT0"
18530 test_striped_dir 1 || error "failed on striped dir on MDT0"
18532 run_test 300a "basic striped dir sanity test"
18535 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18536 skip "skipped for lustre < 2.7.0"
18537 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18538 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18545 test_mkdir $DIR/$tdir || error "mkdir fail"
18546 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18547 error "set striped dir error"
18548 for i in {0..9}; do
18549 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
18551 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
18552 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
18553 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
18555 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
18556 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
18557 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
18561 run_test 300b "check ctime/mtime for striped dir"
18564 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18565 skip "skipped for lustre < 2.7.0"
18566 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18567 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18571 mkdir -p $DIR/$tdir
18572 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
18573 error "set striped dir error"
18575 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
18576 error "chown striped dir failed"
18578 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
18579 error "create 5k files failed"
18581 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
18583 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
18587 run_test 300c "chown && check ls under striped directory"
18590 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18591 skip "skipped for lustre < 2.7.0"
18592 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18593 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18598 mkdir -p $DIR/$tdir
18599 $SETSTRIPE -c 2 $DIR/$tdir
18601 #local striped directory
18602 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18603 error "set striped dir error"
18604 createmany -o $DIR/$tdir/striped_dir/f 10 ||
18605 error "create 10 files failed"
18607 #remote striped directory
18608 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
18609 error "set striped dir error"
18610 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
18611 error "create 10 files failed"
18613 for file in $(find $DIR/$tdir); do
18614 stripe_count=$($LFS getstripe -c $file)
18615 [ $stripe_count -eq 2 ] ||
18616 error "wrong stripe $stripe_count for $file"
18621 run_test 300d "check default stripe under striped directory"
18624 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18625 skip "Need MDS version at least 2.7.55"
18626 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18627 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18632 mkdir -p $DIR/$tdir
18634 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18635 error "set striped dir error"
18637 touch $DIR/$tdir/striped_dir/a
18638 touch $DIR/$tdir/striped_dir/b
18639 touch $DIR/$tdir/striped_dir/c
18641 mkdir $DIR/$tdir/striped_dir/dir_a
18642 mkdir $DIR/$tdir/striped_dir/dir_b
18643 mkdir $DIR/$tdir/striped_dir/dir_c
18645 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
18646 error "set striped adir under striped dir error"
18648 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
18649 error "set striped bdir under striped dir error"
18651 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
18652 error "set striped cdir under striped dir error"
18654 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
18655 error "rename dir under striped dir fails"
18657 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
18658 error "rename dir under different stripes fails"
18660 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
18661 error "rename file under striped dir should succeed"
18663 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
18664 error "rename dir under striped dir should succeed"
18668 run_test 300e "check rename under striped directory"
18671 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18672 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18673 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18674 skip "Need MDS version at least 2.7.55"
18680 mkdir -p $DIR/$tdir
18682 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18683 error "set striped dir error"
18685 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
18686 error "set striped dir error"
18688 touch $DIR/$tdir/striped_dir/a
18689 mkdir $DIR/$tdir/striped_dir/dir_a
18690 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
18691 error "create striped dir under striped dir fails"
18693 touch $DIR/$tdir/striped_dir1/b
18694 mkdir $DIR/$tdir/striped_dir1/dir_b
18695 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
18696 error "create striped dir under striped dir fails"
18698 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
18699 error "rename dir under different striped dir should fail"
18701 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
18702 error "rename striped dir under diff striped dir should fail"
18704 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
18705 error "rename file under diff striped dirs fails"
18709 run_test 300f "check rename cross striped directory"
18711 test_300_check_default_striped_dir()
18714 local default_count=$2
18715 local default_index=$3
18718 local dir_stripe_index
18721 echo "checking $dirname $default_count $default_index"
18722 $LFS setdirstripe -D -c $default_count -i $default_index \
18723 -t all_char $DIR/$tdir/$dirname ||
18724 error "set default stripe on striped dir error"
18725 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
18726 [ $stripe_count -eq $default_count ] ||
18727 error "expect $default_count get $stripe_count for $dirname"
18729 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
18730 [ $stripe_index -eq $default_index ] ||
18731 error "expect $default_index get $stripe_index for $dirname"
18733 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
18734 error "create dirs failed"
18736 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
18737 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
18738 for dir in $(find $DIR/$tdir/$dirname/*); do
18739 stripe_count=$($LFS getdirstripe -c $dir)
18740 [ $stripe_count -eq $default_count ] ||
18741 [ $stripe_count -eq 0 -o $default_count -eq 1 ] ||
18742 error "stripe count $default_count != $stripe_count for $dir"
18744 stripe_index=$($LFS getdirstripe -i $dir)
18745 [ $default_index -eq -1 -o $stripe_index -eq $default_index ] ||
18746 error "$stripe_index != $default_index for $dir"
18748 #check default stripe
18749 stripe_count=$($LFS getdirstripe -D -c $dir)
18750 [ $stripe_count -eq $default_count ] ||
18751 error "default count $default_count != $stripe_count for $dir"
18753 stripe_index=$($LFS getdirstripe -D -i $dir)
18754 [ $stripe_index -eq $default_index ] ||
18755 error "default index $default_index != $stripe_index for $dir"
18757 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
18761 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18762 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18763 skip "Need MDS version at least 2.7.55"
18770 mkdir $DIR/$tdir/normal_dir
18772 #Checking when client cache stripe index
18773 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
18774 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
18775 error "create striped_dir failed"
18777 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
18778 error "create dir0 fails"
18779 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
18780 [ $stripe_index -eq 0 ] ||
18781 error "dir0 expect index 0 got $stripe_index"
18783 mkdir $DIR/$tdir/striped_dir/dir1 ||
18784 error "create dir1 fails"
18785 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
18786 [ $stripe_index -eq 1 ] ||
18787 error "dir1 expect index 1 got $stripe_index"
18789 #check default stripe count/stripe index
18790 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
18791 test_300_check_default_striped_dir normal_dir 1 0
18792 test_300_check_default_striped_dir normal_dir 2 1
18793 test_300_check_default_striped_dir normal_dir 2 -1
18795 #delete default stripe information
18796 echo "delete default stripeEA"
18797 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
18798 error "set default stripe on striped dir error"
18800 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
18801 for dir in $(find $DIR/$tdir/normal_dir/*); do
18802 stripe_count=$($LFS getdirstripe -c $dir)
18803 [ $stripe_count -eq 0 ] ||
18804 error "expect 1 get $stripe_count for $dir"
18805 stripe_index=$($LFS getdirstripe -i $dir)
18806 [ $stripe_index -eq 0 ] ||
18807 error "expect 0 get $stripe_index for $dir"
18810 run_test 300g "check default striped directory for normal directory"
18813 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18814 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18815 skip "Need MDS version at least 2.7.55"
18821 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18822 error "set striped dir error"
18824 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
18825 test_300_check_default_striped_dir striped_dir 1 0
18826 test_300_check_default_striped_dir striped_dir 2 1
18827 test_300_check_default_striped_dir striped_dir 2 -1
18829 #delete default stripe information
18830 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
18831 error "set default stripe on striped dir error"
18833 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
18834 for dir in $(find $DIR/$tdir/striped_dir/*); do
18835 stripe_count=$($LFS getdirstripe -c $dir)
18836 [ $stripe_count -eq 0 ] ||
18837 error "expect 1 get $stripe_count for $dir"
18840 run_test 300h "check default striped directory for striped directory"
18843 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18844 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18845 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18846 skip "Need MDS version at least 2.7.55"
18853 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18854 error "set striped dir error"
18856 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18857 error "create files under striped dir failed"
18859 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
18860 error "set striped hashdir error"
18862 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
18863 error "create dir0 under hash dir failed"
18864 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
18865 error "create dir1 under hash dir failed"
18867 # unfortunately, we need to umount to clear dir layout cache for now
18868 # once we fully implement dir layout, we can drop this
18869 umount_client $MOUNT || error "umount failed"
18870 mount_client $MOUNT || error "mount failed"
18872 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
18873 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
18874 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
18876 #set the stripe to be unknown hash type
18877 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
18878 $LCTL set_param fail_loc=0x1901
18879 for ((i = 0; i < 10; i++)); do
18880 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
18881 error "stat f-$i failed"
18882 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
18885 touch $DIR/$tdir/striped_dir/f0 &&
18886 error "create under striped dir with unknown hash should fail"
18888 $LCTL set_param fail_loc=0
18890 umount_client $MOUNT || error "umount failed"
18891 mount_client $MOUNT || error "mount failed"
18895 run_test 300i "client handle unknown hash type striped directory"
18898 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18899 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18900 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18901 skip "Need MDS version at least 2.7.55"
18908 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
18909 $LCTL set_param fail_loc=0x1702
18910 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18911 error "set striped dir error"
18913 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18914 error "create files under striped dir failed"
18916 $LCTL set_param fail_loc=0
18918 rm -rf $DIR/$tdir || error "unlink striped dir fails"
18922 run_test 300j "test large update record"
18925 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18926 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18927 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18928 skip "Need MDS version at least 2.7.55"
18935 #define OBD_FAIL_LARGE_STRIPE 0x1703
18936 $LCTL set_param fail_loc=0x1703
18937 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
18938 error "set striped dir error"
18939 $LCTL set_param fail_loc=0
18941 $LFS getdirstripe $DIR/$tdir/striped_dir ||
18942 error "getstripeddir fails"
18943 rm -rf $DIR/$tdir/striped_dir ||
18944 error "unlink striped dir fails"
18948 run_test 300k "test large striped directory"
18951 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18952 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18953 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18954 skip "Need MDS version at least 2.7.55"
18958 test_mkdir -p $DIR/$tdir/striped_dir
18959 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
18960 error "chown $RUNAS_ID failed"
18961 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
18962 error "set default striped dir failed"
18964 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
18965 $LCTL set_param fail_loc=0x80000158
18966 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
18968 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
18969 [ $stripe_index -eq 1 ] ||
18970 error "expect 1 get $stripe_index for $dir"
18972 run_test 300l "non-root user to create dir under striped dir with stale layout"
18975 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18976 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
18977 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18978 skip "Need MDS version at least 2.7.55"
18980 mkdir -p $DIR/$tdir/striped_dir
18981 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
18982 error "set default stripes dir error"
18984 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
18986 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
18987 [ $stripe_count -eq 0 ] ||
18988 error "expect 0 get $stripe_count for a"
18990 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
18991 error "set default stripes dir error"
18993 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
18995 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
18996 [ $stripe_count -eq 0 ] ||
18997 error "expect 0 get $stripe_count for b"
18999 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
19000 error "set default stripes dir error"
19002 mkdir $DIR/$tdir/striped_dir/c &&
19003 error "default stripe_index is invalid, mkdir c should fails"
19005 rm -rf $DIR/$tdir || error "rmdir fails"
19007 run_test 300m "setstriped directory on single MDT FS"
19010 local list=$(comma_list $(mdts_nodes))
19013 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19017 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19018 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19019 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19020 skip "Need MDS version at least 2.7.55"
19021 remote_mds_nodsh && skip "remote MDS with nodsh"
19024 local list=$(comma_list $(mdts_nodes))
19026 trap cleanup_300n RETURN EXIT
19027 mkdir -p $DIR/$tdir
19028 chmod 777 $DIR/$tdir
19029 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
19030 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19031 error "create striped dir succeeds with gid=0"
19033 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19034 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
19035 error "create striped dir fails with gid=-1"
19037 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19038 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
19039 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19040 error "set default striped dir succeeds with gid=0"
19043 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19044 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
19045 error "set default striped dir fails with gid=-1"
19048 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19049 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
19050 error "create test_dir fails"
19051 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
19052 error "create test_dir1 fails"
19053 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
19054 error "create test_dir2 fails"
19057 run_test 300n "non-root user to create dir under striped dir with default EA"
19060 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19061 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19062 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19063 skip "Need MDS version at least 2.7.55"
19068 mkdir -p $DIR/$tdir
19070 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
19071 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
19072 if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then
19073 skip "not enough free inodes $numfree1 $numfree2"
19076 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
19077 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
19078 if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then
19079 skip "not enough free space $numfree1 $numfree2"
19082 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
19083 error "setdirstripe fails"
19085 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
19086 error "create dirs fails"
19088 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
19089 ls $DIR/$tdir/striped_dir > /dev/null ||
19090 error "ls striped dir fails"
19091 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
19092 error "unlink big striped dir fails"
19094 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
19097 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19098 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19099 remote_mds_nodsh && skip "remote MDS with nodsh"
19101 mkdir -p $DIR/$tdir
19103 #define OBD_FAIL_OUT_ENOSPC 0x1704
19104 do_facet mds2 lctl set_param fail_loc=0x80001704
19105 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
19106 && error "create striped directory should fail"
19108 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
19110 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
19113 run_test 300p "create striped directory without space"
19116 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19117 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19119 local fd=$(free_fd)
19120 local cmd="exec $fd<$tdir"
19122 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
19125 trap "eval $cmd" EXIT
19126 cd $tdir || error "cd $tdir fails"
19127 rmdir ../$tdir || error "rmdir $tdir fails"
19128 mkdir local_dir && error "create dir succeeds"
19129 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
19133 run_test 300q "create remote directory under orphan directory"
19136 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
19137 skip "Need MDS version at least 2.7.55" && return
19138 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19142 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
19143 error "set striped dir error"
19145 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19146 error "getstripeddir fails"
19149 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
19150 awk '/lmv_stripe_count:/ { print $2 }')
19152 [ $MDSCOUNT -ne $stripe_count ] &&
19153 error "wrong stripe count $stripe_count expected $MDSCOUNT"
19155 rm -rf $DIR/$tdir/striped_dir ||
19156 error "unlink striped dir fails"
19158 run_test 300r "test -1 striped directory"
19160 prepare_remote_file() {
19161 mkdir $DIR/$tdir/src_dir ||
19162 error "create remote source failed"
19164 cp /etc/hosts $DIR/$tdir/src_dir/a ||
19165 error "cp to remote source failed"
19166 touch $DIR/$tdir/src_dir/a
19168 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
19169 error "create remote target dir failed"
19171 touch $DIR/$tdir/tgt_dir/b
19173 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
19174 error "rename dir cross MDT failed!"
19176 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
19177 error "src_child still exists after rename"
19179 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
19180 error "missing file(a) after rename"
19182 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
19183 error "diff after rename"
19187 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19188 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19190 local remote_file=$DIR/$tdir/tgt_dir/b
19192 mkdir -p $DIR/$tdir
19194 prepare_remote_file || error "prepare remote file failed"
19197 $OPENUNLINK $remote_file $remote_file ||
19198 error "openunlink $remote_file failed"
19199 $CHECKSTAT -a $remote_file || error "$remote_file exists"
19201 run_test 310a "open unlink remote file"
19204 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19205 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19207 local remote_file=$DIR/$tdir/tgt_dir/b
19209 mkdir -p $DIR/$tdir
19211 prepare_remote_file || error "prepare remote file failed"
19213 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19214 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
19215 $CHECKSTAT -t file $remote_file || error "check file failed"
19217 run_test 310b "unlink remote file with multiple links while open"
19220 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19221 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
19223 local remote_file=$DIR/$tdir/tgt_dir/b
19225 mkdir -p $DIR/$tdir
19227 prepare_remote_file || error "prepare remote file failed"
19229 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19230 multiop_bg_pause $remote_file O_uc ||
19231 error "mulitop failed for remote file"
19233 $MULTIOP $DIR/$tfile Ouc
19234 kill -USR1 $MULTIPID
19237 run_test 310c "open-unlink remote file with multiple links"
19241 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19242 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19243 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
19244 skip "lustre < 2.8.54 does not contain LU-4825 fix"
19245 remote_mds_nodsh && skip "remote MDS with nodsh"
19247 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19248 local mdts=$(comma_list $(mdts_nodes))
19250 mkdir -p $DIR/$tdir
19251 $SETSTRIPE -i 0 -c 1 $DIR/$tdir
19252 createmany -o $DIR/$tdir/$tfile. 1000
19254 # statfs data is not real time, let's just calculate it
19255 old_iused=$((old_iused + 1000))
19257 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19258 osp.*OST0000*MDT0000.create_count")
19259 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19260 osp.*OST0000*MDT0000.max_create_count")
19261 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
19263 $SETSTRIPE -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
19264 local index=$($GETSTRIPE -i $DIR/$tdir/$tfile)
19265 [ $index -ne 0 ] || error "$tfile stripe index is 0"
19267 unlinkmany $DIR/$tdir/$tfile. 1000
19269 do_nodes $mdts "$LCTL set_param -n \
19270 osp.*OST0000*.max_create_count=$max_count"
19271 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
19272 do_nodes $mdts "$LCTL set_param -n \
19273 osp.*OST0000*.create_count=$count"
19274 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
19275 grep "=0" && error "create_count is zero"
19278 for i in $(seq 120); do
19279 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19280 # system may be too busy to destroy all objs in time, use
19281 # a somewhat small value to not fail autotest
19282 [ $((old_iused - new_iused)) -gt 400 ] && break
19286 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
19287 [ $((old_iused - new_iused)) -gt 400 ] ||
19288 error "objs not destroyed after unlink"
19290 run_test 311 "disable OSP precreate, and unlink should destroy objs"
19297 local vdevdir=$(dirname $(facet_vdevice $ost))
19298 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
19299 local zfs_zapid=$(do_facet $ost $cmd |
19300 grep -w "/O/0/d$((objid%32))" -C 5 |
19301 awk '/Object/{getline; print $1}')
19302 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
19303 awk "/$objid = /"'{printf $3}')
19308 zfs_object_blksz() {
19312 local vdevdir=$(dirname $(facet_vdevice $ost))
19313 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
19314 local blksz=$(do_facet $ost $cmd $objid |
19315 awk '/dblk/{getline; printf $4}')
19317 case "${blksz: -1}" in
19318 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
19319 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
19326 test_312() { # LU-4856
19327 remote_ost_nodsh && skip "remote OST with nodsh"
19328 [ "$ost1_FSTYPE" = "zfs" ] ||
19329 skip_env "the test only applies to zfs"
19331 local max_blksz=$(do_facet ost1 \
19332 $ZFS get -p recordsize $(facet_device ost1) |
19333 awk '!/VALUE/{print $3}')
19335 # to make life a little bit easier
19336 $LFS mkdir -c 1 -i 0 $DIR/$tdir
19337 $LFS setstripe -c 1 -i 0 $DIR/$tdir
19339 local tf=$DIR/$tdir/$tfile
19341 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19343 # Get ZFS object id
19344 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19345 # block size change by sequential overwrite
19348 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
19349 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
19351 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
19352 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19356 # block size change by sequential append write
19357 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19358 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19359 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19362 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19363 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19364 oflag=sync conv=notrunc
19366 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19367 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19368 error "blksz error, actual $blksz, " \
19369 "expected: 2 * $count * $PAGE_SIZE"
19375 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19376 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19378 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
19379 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19380 [ $blksz -eq $PAGE_SIZE ] ||
19381 error "blksz error: $blksz, expected: $PAGE_SIZE"
19383 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
19384 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19385 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
19387 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
19388 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19389 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
19391 run_test 312 "make sure ZFS adjusts its block size by write pattern"
19394 remote_ost_nodsh && skip "remote OST with nodsh"
19396 local file=$DIR/$tfile
19399 $SETSTRIPE -c 1 -i 0 $file || error "setstripe failed"
19401 # define OBD_FAIL_TGT_RCVD_EIO 0x720
19402 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19403 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
19404 error "write should failed"
19405 do_facet ost1 "$LCTL set_param fail_loc=0"
19408 run_test 313 "io should fail after last_rcvd update fail"
19411 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19413 $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
19414 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19416 wait_delete_completed
19417 do_facet ost1 "$LCTL set_param fail_loc=0"
19419 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
19421 test_315() { # LU-618
19422 local file=$DIR/$tfile
19425 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
19426 error "multiop file write failed"
19427 $MULTIOP $file oO_RDONLY:r4063232_c &
19432 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
19435 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
19438 run_test 315 "read should be accounted"
19441 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19442 large_xattr_enabled || skip_env "ea_inode feature disabled"
19444 rm -rf $DIR/$tdir/d
19445 mkdir -p $DIR/$tdir/d
19446 chown nobody $DIR/$tdir/d
19447 touch $DIR/$tdir/d/file
19449 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
19451 run_test 316 "lfs mv"
19454 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
19455 skip "Need MDS version at least 2.11.53"
19456 if [ "$ost1_FSTYPE" == "zfs" ]; then
19457 skip "LU-10370: no implementation for ZFS"
19461 local grant_blk_size
19463 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
19464 awk '/grant_block_size:/ { print $2; exit; }')
19466 # Create File of size 5M. Truncate it to below size's and verify
19469 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
19470 error "Create file $DIR/$tfile failed"
19471 stack_trap "rm -f $DIR/$tfile" EXIT
19473 for trunc_sz in 2097152 4097 4000 509 0; do
19474 $TRUNCATE $DIR/$tfile $trunc_sz ||
19475 error "truncate $tfile to $trunc_sz failed"
19476 local sz=$(stat --format=%s $DIR/$tfile)
19477 local blk=$(stat --format=%b $DIR/$tfile)
19478 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
19479 grant_blk_size) * 8))
19481 if [[ $blk -ne $trunc_blk ]]; then
19482 $(which stat) $DIR/$tfile
19483 error "Expected Block $trunc_blk got $blk for $tfile"
19486 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19487 error "Expected Size $trunc_sz got $sz for $tfile"
19492 # Create file with a hole and write actual two blocks. Block count
19495 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
19496 conv=fsync || error "Create file : $DIR/$tfile"
19498 # Calculate the final truncate size.
19499 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
19502 # truncate to size $trunc_sz bytes. Strip the last block
19503 # The block count must drop to 8
19505 $TRUNCATE $DIR/$tfile $trunc_sz ||
19506 error "truncate $tfile to $trunc_sz failed"
19508 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
19509 sz=$(stat --format=%s $DIR/$tfile)
19510 blk=$(stat --format=%b $DIR/$tfile)
19512 if [[ $blk -ne $trunc_bsz ]]; then
19513 $(which stat) $DIR/$tfile
19514 error "Expected Block $trunc_bsz got $blk for $tfile"
19517 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19518 error "Expected Size $trunc_sz got $sz for $tfile"
19520 run_test 317 "Verify blocks get correctly update after truncate"
19523 local read_write=$1
19524 if [ "$read_write" = "write" ]; then
19525 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
19526 elif [ "$read_write" = "read" ]; then
19527 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
19529 error "argument error"
19532 # turn off debug for performance testing
19533 local saved_debug=$($LCTL get_param -n debug)
19534 $LCTL set_param debug=0
19536 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
19538 # get ost1 size - lustre-OST0000
19539 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
19540 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
19541 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
19543 if [ "$read_write" = "read" ]; then
19544 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
19547 local start_time=$(date +%s.%N)
19548 $dd_cmd bs=1M count=$blocks oflag=sync ||
19549 error "real dd $read_write error"
19550 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
19552 if [ "$read_write" = "write" ]; then
19556 # define OBD_FAIL_OST_FAKE_RW 0x238
19557 do_facet ost1 $LCTL set_param fail_loc=0x238
19559 local start_time=$(date +%s.%N)
19560 $dd_cmd bs=1M count=$blocks oflag=sync ||
19561 error "fake dd $read_write error"
19562 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
19564 if [ "$read_write" = "write" ]; then
19566 cancel_lru_locks osc
19567 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
19568 error "$tfile size not $blocks MB"
19570 do_facet ost1 $LCTL set_param fail_loc=0
19572 echo "fake $read_write $duration_fake vs. normal $read_write" \
19573 "$duration in seconds"
19574 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
19575 error_not_in_vm "fake write is slower"
19577 $LCTL set_param -n debug="$saved_debug"
19580 test_399a() { # LU-7655 for OST fake write
19581 remote_ost_nodsh && skip "remote OST with nodsh"
19585 run_test 399a "fake write should not be slower than normal write"
19587 test_399b() { # LU-8726 for OST fake read
19588 remote_ost_nodsh && skip "remote OST with nodsh"
19589 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
19590 skip_env "ldiskfs only test"
19595 run_test 399b "fake read should not be slower than normal read"
19597 test_400a() { # LU-1606, was conf-sanity test_74
19598 if ! which $CC > /dev/null 2>&1; then
19599 skip_env "$CC is not installed"
19602 local extra_flags=''
19603 local out=$TMP/$tfile
19604 local prefix=/usr/include/lustre
19607 # Oleg removes c files in his test rig so test if any c files exist
19608 [ -z "$(ls -A $LUSTRE_TESTS_API_DIR)" ] && \
19609 skip_env "Needed c test files are missing"
19611 if ! [[ -d $prefix ]]; then
19612 # Assume we're running in tree and fixup the include path.
19613 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
19614 extra_flags+=" -L$LUSTRE/utils/.lib"
19617 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
19618 $CC -Wall -Werror -std=c99 $extra_flags -o $out $prog -llustreapi ||
19619 error "client api broken"
19623 run_test 400a "Lustre client api program can compile and link"
19625 test_400b() { # LU-1606, LU-5011
19627 local out=$TMP/$tfile
19628 local prefix=/usr/include/linux/lustre
19630 # We use a hard coded prefix so that this test will not fail
19631 # when run in tree. There are headers in lustre/include/lustre/
19632 # that are not packaged (like lustre_idl.h) and have more
19633 # complicated include dependencies (like config.h and lnet/types.h).
19634 # Since this test about correct packaging we just skip them when
19635 # they don't exist (see below) rather than try to fixup cppflags.
19637 if ! which $CC > /dev/null 2>&1; then
19638 skip_env "$CC is not installed"
19641 for header in $prefix/*.h; do
19642 if ! [[ -f "$header" ]]; then
19646 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
19647 continue # lustre_ioctl.h is internal header
19650 $CC -Wall -Werror -std=c99 -include $header -c -x c /dev/null -o $out ||
19651 error "cannot compile '$header'"
19655 run_test 400b "packaged headers can be compiled"
19657 test_401a() { #LU-7437
19658 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
19659 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
19661 #count the number of parameters by "list_param -R"
19662 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
19663 #count the number of parameters by listing proc files
19664 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
19665 echo "proc_dirs='$proc_dirs'"
19666 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
19667 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
19670 [ $params -eq $procs ] ||
19671 error "found $params parameters vs. $procs proc files"
19673 # test the list_param -D option only returns directories
19674 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
19675 #count the number of parameters by listing proc directories
19676 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
19679 [ $params -eq $procs ] ||
19680 error "found $params parameters vs. $procs proc files"
19682 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
19685 local save=$($LCTL get_param -n jobid_var)
19688 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
19689 error "no error returned when setting bad parameters"
19691 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
19692 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
19694 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
19695 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
19696 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
19698 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
19701 local jobid_var_old=$($LCTL get_param -n jobid_var)
19702 local jobid_var_new
19704 $LCTL set_param jobid_var= &&
19705 error "no error returned for 'set_param a='"
19707 jobid_var_new=$($LCTL get_param -n jobid_var)
19708 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19709 error "jobid_var was changed by setting without value"
19711 $LCTL set_param jobid_var &&
19712 error "no error returned for 'set_param a'"
19714 jobid_var_new=$($LCTL get_param -n jobid_var)
19715 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19716 error "jobid_var was changed by setting without value"
19718 run_test 401c "Verify 'lctl set_param' without value fails in either format."
19721 local jobid_var_old=$($LCTL get_param -n jobid_var)
19722 local jobid_var_new
19723 local new_value="foo=bar"
19725 $LCTL set_param jobid_var=$new_value ||
19726 error "'set_param a=b' did not accept a value containing '='"
19728 jobid_var_new=$($LCTL get_param -n jobid_var)
19729 [[ "$jobid_var_new" == "$new_value" ]] ||
19730 error "'set_param a=b' failed on a value containing '='"
19732 # Reset the jobid_var to test the other format
19733 $LCTL set_param jobid_var=$jobid_var_old
19734 jobid_var_new=$($LCTL get_param -n jobid_var)
19735 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19736 error "failed to reset jobid_var"
19738 $LCTL set_param jobid_var $new_value ||
19739 error "'set_param a b' did not accept a value containing '='"
19741 jobid_var_new=$($LCTL get_param -n jobid_var)
19742 [[ "$jobid_var_new" == "$new_value" ]] ||
19743 error "'set_param a b' failed on a value containing '='"
19745 $LCTL set_param jobid_var $jobid_var_old
19746 jobid_var_new=$($LCTL get_param -n jobid_var)
19747 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19748 error "failed to reset jobid_var"
19750 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
19753 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
19754 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
19755 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
19756 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
19757 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
19758 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
19759 remote_mds_nodsh && skip "remote MDS with nodsh"
19761 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
19762 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
19763 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
19764 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
19765 echo "Touch failed - OK"
19767 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
19770 local file1=$DIR/$tfile.1
19771 local file2=$DIR/$tfile.2
19772 local tfile=$TMP/$tfile
19774 rm -f $file1 $file2 $tfile
19779 # 30 sec OBD_TIMEOUT in ll_getattr()
19780 # right before populating st_nlink
19781 $LCTL set_param fail_loc=0x80001409
19782 stat -c %h $file1 > $tfile &
19784 # create an alias, drop all locks and reclaim the dentry
19786 cancel_lru_locks mdc
19787 cancel_lru_locks osc
19788 sysctl -w vm.drop_caches=2
19792 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
19794 rm -f $tfile $file1 $file2
19796 run_test 403 "i_nlink should not drop to zero due to aliasing"
19798 test_404() { # LU-6601
19799 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
19800 skip "Need server version newer than 2.8.52"
19801 remote_mds_nodsh && skip "remote MDS with nodsh"
19803 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
19804 awk '/osp .*-osc-MDT/ { print $4}')
19807 for osp in $mosps; do
19808 echo "Deactivate: " $osp
19809 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
19810 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19811 awk -vp=$osp '$4 == p { print $2 }')
19812 [ $stat = IN ] || {
19813 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19814 error "deactivate error"
19816 echo "Activate: " $osp
19817 do_facet $SINGLEMDS $LCTL --device %$osp activate
19818 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19819 awk -vp=$osp '$4 == p { print $2 }')
19820 [ $stat = UP ] || {
19821 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19822 error "activate error"
19826 run_test 404 "validate manual {de}activated works properly for OSPs"
19829 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] ||
19830 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
19831 skip "Layout swap lock is not supported"
19833 check_swap_layouts_support
19835 test_mkdir $DIR/$tdir
19836 swap_lock_test -d $DIR/$tdir ||
19837 error "One layout swap locked test failed"
19839 run_test 405 "Various layout swap lock tests"
19842 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19843 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
19844 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
19845 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19846 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
19847 skip "Need MDS version at least 2.8.50"
19849 local def_stripe_size=$($LFS getstripe -S $MOUNT)
19850 local test_pool=$TESTNAME
19852 pool_add $test_pool || error "pool_add failed"
19853 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
19854 error "pool_add_targets failed"
19856 save_layout_restore_at_exit $MOUNT
19858 # parent set default stripe count only, child will stripe from both
19859 # parent and fs default
19860 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
19861 error "setstripe $MOUNT failed"
19862 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
19863 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
19864 for i in $(seq 10); do
19865 local f=$DIR/$tdir/$tfile.$i
19866 touch $f || error "touch failed"
19867 local count=$($LFS getstripe -c $f)
19868 [ $count -eq $OSTCOUNT ] ||
19869 error "$f stripe count $count != $OSTCOUNT"
19870 local offset=$($LFS getstripe -i $f)
19871 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
19872 local size=$($LFS getstripe -S $f)
19873 [ $size -eq $((def_stripe_size * 2)) ] ||
19874 error "$f stripe size $size != $((def_stripe_size * 2))"
19875 local pool=$($LFS getstripe -p $f)
19876 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
19879 # change fs default striping, delete parent default striping, now child
19880 # will stripe from new fs default striping only
19881 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
19882 error "change $MOUNT default stripe failed"
19883 $LFS setstripe -c 0 $DIR/$tdir ||
19884 error "delete $tdir default stripe failed"
19885 for i in $(seq 11 20); do
19886 local f=$DIR/$tdir/$tfile.$i
19887 touch $f || error "touch $f failed"
19888 local count=$($LFS getstripe -c $f)
19889 [ $count -eq 1 ] || error "$f stripe count $count != 1"
19890 local offset=$($LFS getstripe -i $f)
19891 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
19892 local size=$($LFS getstripe -S $f)
19893 [ $size -eq $def_stripe_size ] ||
19894 error "$f stripe size $size != $def_stripe_size"
19895 local pool=$($LFS getstripe -p $f)
19896 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
19899 unlinkmany $DIR/$tdir/$tfile. 1 20
19901 local f=$DIR/$tdir/$tfile
19902 pool_remove_all_targets $test_pool $f
19903 pool_remove $test_pool $f
19905 run_test 406 "DNE support fs default striping"
19908 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19909 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
19910 skip "Need MDS version at least 2.8.55"
19911 remote_mds_nodsh && skip "remote MDS with nodsh"
19913 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
19914 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
19915 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
19916 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
19917 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
19919 #define OBD_FAIL_DT_TXN_STOP 0x2019
19920 for idx in $(seq $MDSCOUNT); do
19921 do_facet mds$idx "lctl set_param fail_loc=0x2019"
19923 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
19924 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
19925 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
19928 run_test 407 "transaction fail should cause operation fail"
19931 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
19933 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
19934 lctl set_param fail_loc=0x8000040a
19935 # let ll_prepare_partial_page() fail
19936 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
19940 # create at least 100 unused inodes so that
19941 # shrink_icache_memory(0) should not return 0
19942 touch $DIR/$tfile-{0..100}
19943 rm -f $DIR/$tfile-{0..100}
19946 echo 2 > /proc/sys/vm/drop_caches
19948 run_test 408 "drop_caches should not hang due to page leaks"
19952 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19953 check_mount_and_prep
19955 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
19956 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
19957 touch $DIR/$tdir/guard || error "(2) Fail to create"
19959 local PREFIX=$(str_repeat 'A' 128)
19960 echo "Create 1K hard links start at $(date)"
19961 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
19962 error "(3) Fail to hard link"
19964 echo "Links count should be right although linkEA overflow"
19965 stat $DIR/$tdir/guard || error "(4) Fail to stat"
19966 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
19967 [ $linkcount -eq 1001 ] ||
19968 error "(5) Unexpected hard links count: $linkcount"
19970 echo "List all links start at $(date)"
19971 ls -l $DIR/$tdir/foo > /dev/null ||
19972 error "(6) Fail to list $DIR/$tdir/foo"
19974 echo "Unlink hard links start at $(date)"
19975 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
19976 error "(7) Fail to unlink"
19978 run_test 409 "Large amount of cross-MDTs hard links on the same file"
19982 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
19983 skip "Need client version at least 2.9.59"
19985 # Create a file, and stat it from the kernel
19986 local testfile=$DIR/$tfile
19989 local run_id=$RANDOM
19990 local my_ino=$(stat --format "%i" $testfile)
19992 # Try to insert the module. This will always fail as the
19993 # module is designed to not be inserted.
19994 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
19997 # Anything but success is a test failure
19999 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
20000 error "no inode match"
20002 run_test 410 "Test inode number returned from kernel thread"
20004 cleanup_test411_cgroup() {
20010 local cg_basedir=/sys/fs/cgroup/memory
20012 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
20013 skip "no setup for cgroup"
20015 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
20016 error "test file creation failed"
20017 cancel_lru_locks osc
20019 # Create a very small memory cgroup to force a slab allocation error
20020 local cgdir=$cg_basedir/osc_slab_alloc
20021 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
20022 trap "cleanup_test411_cgroup $cgdir" EXIT
20023 echo 2M > $cgdir/memory.kmem.limit_in_bytes
20024 echo 1M > $cgdir/memory.limit_in_bytes
20026 # Should not LBUG, just be killed by oom-killer
20027 # dd will return 0 even allocation failure in some environment.
20028 # So don't check return value
20029 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
20030 cleanup_test411_cgroup $cgdir
20034 run_test 411 "Slab allocation error with cgroup does not LBUG"
20037 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20038 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20039 skip "Need server version at least 2.10.55"
20042 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
20043 error "mkdir failed"
20044 $LFS getdirstripe $DIR/$tdir
20045 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
20046 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
20047 error "expect $((MDSCOUT - 1)) get $stripe_index"
20048 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
20049 [ $stripe_count -eq 2 ] ||
20050 error "expect 2 get $stripe_count"
20052 run_test 412 "mkdir on specific MDTs"
20055 [ $MDSCOUNT -lt 2 ] &&
20056 skip "We need at least 2 MDTs for this test"
20058 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20059 skip "Need server version at least 2.10.55"
20062 mkdir $DIR/$tdir || error "mkdir failed"
20064 # find MDT that is the most full
20065 local max=$($LFS df | grep MDT |
20074 END { split(b, c, ":")
20079 for i in $(seq $((MDSCOUNT - 1))); do
20080 $LFS mkdir -c $i $DIR/$tdir/d$i ||
20081 error "mkdir d$i failed"
20082 $LFS getdirstripe $DIR/$tdir/d$i
20083 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
20084 [ $stripe_index -ne $max ] ||
20085 error "don't expect $max"
20088 run_test 413 "mkdir on less full MDTs"
20091 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
20092 $LCTL set_param fail_loc=0x80000521
20093 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
20096 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
20099 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20100 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
20101 skip "Need server version at least 2.11.52"
20111 # this test may be slow on ZFS
20112 [ "$mds1_FSTYPE" == "zfs" ] && total=100
20114 # though this test is designed for striped directory, let's test normal
20115 # directory too since lock is always saved as CoS lock.
20116 test_mkdir $DIR/$tdir || error "mkdir $tdir"
20117 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
20126 start_time=$(date +%s)
20127 for i in $(seq $total); do
20128 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
20131 end_time=$(date +%s)
20132 duration=$((end_time - start_time))
20134 kill -9 $setattr_pid
20136 echo "rename $total files took $duration sec"
20137 [ $duration -lt 100 ] || error "rename took $duration sec"
20139 run_test 415 "lock revoke is not missing"
20142 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
20143 skip "Need server version at least 2.11.55"
20145 # define OBD_FAIL_OSD_TXN_START 0x19a
20146 do_facet mds1 lctl set_param fail_loc=0x19a
20148 lfs mkdir -c $MDSCOUNT $DIR/$tdir
20152 run_test 416 "transaction start failure won't cause system hung"
20156 do_nodes $(comma_list $(mdts_nodes)) \
20157 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
20158 do_nodes $(comma_list $(mdts_nodes)) \
20159 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
20160 do_nodes $(comma_list $(mdts_nodes)) \
20161 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
20165 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20166 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
20167 skip "Need MDS version at least 2.11.56"
20169 trap cleanup_417 RETURN EXIT
20171 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
20172 do_nodes $(comma_list $(mdts_nodes)) \
20173 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
20174 $LFS migrate -m 0 $DIR/$tdir.1 &&
20175 error "migrate dir $tdir.1 should fail"
20177 do_nodes $(comma_list $(mdts_nodes)) \
20178 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
20179 $LFS mkdir -i 1 $DIR/$tdir.2 &&
20180 error "create remote dir $tdir.2 should fail"
20182 do_nodes $(comma_list $(mdts_nodes)) \
20183 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
20184 $LFS mkdir -c 2 $DIR/$tdir.3 &&
20185 error "create striped dir $tdir.3 should fail"
20188 run_test 417 "disable remote dir, striped dir and dir migration"
20190 # Checks that the outputs of df [-i] and lfs df [-i] match
20192 # usage: check_lfs_df <blocks | inodes> <mountpoint>
20202 [ "$1" == "blocks" ] && inodes= || inodes="-i"
20204 for count in {1..100}; do
20208 # read the lines of interest
20209 df_out=($(df -P $inodes $dir | tail -n +2)) ||
20210 error "df $inodes $dir | tail -n +2 failed"
20211 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
20212 error "lfs df $inodes $dir | grep summary: failed"
20214 # skip first substrings of each output as they are different
20215 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
20216 # compare the remaining fields of the two outputs
20218 for i in {1..5}; do
20219 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
20227 lfs df $inodes $dir
20228 error "df and lfs df $1 output mismatch: " \
20229 "df ${inodes}: ${df_out[*]}, " \
20230 "lfs df ${inodes}: ${lfs_df_out[*]}"
20235 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20237 local dir=$DIR/$tdir
20238 local numfiles=$((RANDOM % 4096 + 2))
20239 local numblocks=$((RANDOM % 256 + 1))
20241 wait_delete_completed
20244 # check block output
20245 check_lfs_df blocks $dir
20246 # check inode output
20247 check_lfs_df inodes $dir
20249 # create a single file and retest
20250 echo "Creating a single file and testing"
20251 createmany -o $dir/$tfile- 1 &>/dev/null ||
20252 error "creating 1 file in $dir failed"
20253 check_lfs_df blocks $dir
20254 check_lfs_df inodes $dir
20256 # create a random number of files
20257 echo "Creating $((numfiles - 1)) files and testing"
20258 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
20259 error "creating $((numfiles - 1)) files in $dir failed"
20261 # write a random number of blocks to the first test file
20262 echo "Writing $numblocks 4K blocks and testing"
20263 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
20264 count=$numblocks &>/dev/null ||
20265 error "dd to $dir/${tfile}-0 failed"
20268 check_lfs_df blocks $dir
20269 check_lfs_df inodes $dir
20271 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
20272 error "unlinking $numfiles files in $dir failed"
20274 run_test 418 "df and lfs df outputs match"
20278 local dir=$DIR/$tdir
20283 cancel_lru_locks mdc
20285 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
20286 $LCTL set_param fail_loc=0x1410
20288 $LCTL set_param fail_loc=0
20291 run_test 419 "Verify open file by name doesn't crash kernel"
20295 [[ $MDS1_VERSION -ge $(version_code 2.12.1) ]] ||
20296 skip "Need MDS version at least 2.12.1"
20298 local SAVE_UMASK=$(umask)
20299 local dir=$DIR/$tdir
20300 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
20304 mkdir -m03777 $dir/testdir
20305 ls -dn $dir/testdir
20306 # Need to remove trailing '.' when SELinux is enabled
20307 local dirperms=$(ls -dn $dir/testdir |
20308 awk '{ sub(/\.$/, "", $1); print $1}')
20309 [ $dirperms == "drwxrwsrwt" ] ||
20310 error "incorrect perms on $dir/testdir"
20312 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
20313 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
20314 ls -n $dir/testdir/testfile
20315 local fileperms=$(ls -n $dir/testdir/testfile |
20316 awk '{ sub(/\.$/, "", $1); print $1}')
20317 [ $fileperms == "-rwxr-xr-x" ] ||
20318 error "incorrect perms on $dir/testdir/testfile"
20322 run_test 420 "clear SGID bit on non-directories for non-members"
20329 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20330 skip "Need MDS version at least 2.12.2"
20332 test_mkdir $DIR/$tdir
20333 createmany -o $DIR/$tdir/f 3
20334 cnt=$(ls -1 $DIR/$tdir | wc -l)
20335 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20337 fid1=$(lfs path2fid $DIR/$tdir/f1)
20338 fid2=$(lfs path2fid $DIR/$tdir/f2)
20339 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
20341 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
20342 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
20344 cnt=$(ls -1 $DIR/$tdir | wc -l)
20345 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20347 rm -f $DIR/$tdir/f3 || error "can't remove f3"
20348 createmany -o $DIR/$tdir/f 3
20349 cnt=$(ls -1 $DIR/$tdir | wc -l)
20350 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20352 fid1=$(lfs path2fid $DIR/$tdir/f1)
20353 fid2=$(lfs path2fid $DIR/$tdir/f2)
20354 echo "remove using fsname $FSNAME"
20355 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
20357 cnt=$(ls -1 $DIR/$tdir | wc -l)
20358 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20360 run_test 421a "simple rm by fid"
20367 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20368 skip "Need MDS version at least 2.12.2"
20370 test_mkdir $DIR/$tdir
20371 createmany -o $DIR/$tdir/f 3
20372 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
20375 FID1=$(lfs path2fid $DIR/$tdir/f1)
20376 FID2=$(lfs path2fid $DIR/$tdir/f2)
20377 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
20379 kill -USR1 $MULTIPID
20382 cnt=$(ls $DIR/$tdir | wc -l)
20383 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
20385 run_test 421b "rm by fid on open file"
20391 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20392 skip "Need MDS version at least 2.12.2"
20394 test_mkdir $DIR/$tdir
20395 createmany -o $DIR/$tdir/f 3
20396 touch $DIR/$tdir/$tfile
20397 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
20398 cnt=$(ls -1 $DIR/$tdir | wc -l)
20399 [ $cnt != 184 ] && error "unexpected #files: $cnt"
20401 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
20402 $LFS rmfid $DIR $FID1 || error "rmfid failed"
20404 cnt=$(ls $DIR/$tdir | wc -l)
20405 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
20407 run_test 421c "rm by fid against hardlinked files"
20413 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20414 skip "Need MDS version at least 2.12.2"
20416 test_mkdir $DIR/$tdir
20417 createmany -o $DIR/$tdir/f 4097
20418 cnt=$(ls -1 $DIR/$tdir | wc -l)
20419 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
20421 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
20422 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20424 cnt=$(ls $DIR/$tdir | wc -l)
20426 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20428 run_test 421d "rmfid en masse"
20434 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20435 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20436 skip "Need MDS version at least 2.12.2"
20438 mkdir -p $DIR/$tdir
20439 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20440 createmany -o $DIR/$tdir/striped_dir/f 512
20441 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20442 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20444 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20445 sed "s/[/][^:]*://g")
20446 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20448 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20450 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20452 run_test 421e "rmfid in DNE"
20458 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20459 skip "Need MDS version at least 2.12.2"
20461 test_mkdir $DIR/$tdir
20463 cnt=$(ls -1 $DIR/$tdir | wc -l)
20464 [ $cnt != 1 ] && error "unexpected #files: $cnt"
20466 FID=$(lfs path2fid $DIR/$tdir/f)
20467 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
20468 # rmfid should fail
20469 cnt=$(ls -1 $DIR/$tdir | wc -l)
20470 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
20472 chmod a+rw $DIR/$tdir
20474 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
20475 # rmfid should fail
20476 cnt=$(ls -1 $DIR/$tdir | wc -l)
20477 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
20480 $RUNAS touch $DIR/$tdir/f
20481 FID=$(lfs path2fid $DIR/$tdir/f)
20482 echo "rmfid as root"
20483 $LFS rmfid $DIR $FID || error "rmfid as root failed"
20484 cnt=$(ls -1 $DIR/$tdir | wc -l)
20485 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
20488 $RUNAS touch $DIR/$tdir/f
20489 cnt=$(ls -1 $DIR/$tdir | wc -l)
20490 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
20491 FID=$(lfs path2fid $DIR/$tdir/f)
20492 # rmfid w/o user_fid2path mount option should fail
20493 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
20494 cnt=$(ls -1 $DIR/$tdir | wc -l)
20495 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
20497 umount_client $MOUNT || "failed to umount client"
20498 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
20499 "failed to mount client'"
20501 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
20502 # rmfid should succeed
20503 cnt=$(ls -1 $DIR/$tdir | wc -l)
20504 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
20506 # rmfid shouldn't allow to remove files due to dir's permission
20507 chmod a+rwx $DIR/$tdir
20510 FID=$(lfs path2fid $DIR/$tdir/f)
20511 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
20513 umount_client $MOUNT || "failed to umount client"
20514 mount_client $MOUNT "$MOUNT_OPTS" ||
20515 "failed to mount client'"
20518 run_test 421f "rmfid checks permissions"
20524 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20525 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20526 skip "Need MDS version at least 2.12.2"
20528 mkdir -p $DIR/$tdir
20529 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20530 createmany -o $DIR/$tdir/striped_dir/f 512
20531 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20532 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20534 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20535 sed "s/[/][^:]*://g")
20537 rm -f $DIR/$tdir/striped_dir/f1*
20538 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20539 removed=$((512 - cnt))
20541 # few files have been just removed, so we expect
20542 # rmfid to fail on their fids
20543 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
20544 [ $removed != $errors ] && error "$errors != $removed"
20546 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20548 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20550 run_test 421g "rmfid to return errors properly"
20563 # ensure statfs cache is expired
20566 _stats=$(stat_test | grep $MOUNT | sort -u | wc -l)
20567 [[ ${_stats} -ne 1 ]] && error "statfs wrong"
20571 run_test 423 "statfs should return a right data"
20574 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20575 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20576 skip "Need server version at least 2.9.55"
20578 start_full_debug_logging
20582 stop_full_debug_logging
20586 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20587 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20588 awk '/The barrier for/ { print $7 }')
20591 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
20596 barrier_expired() {
20599 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20600 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20601 awk '/will be expired/ { print $7 }')
20603 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
20612 echo "Start barrier_freeze at: $(date)"
20613 #define OBD_FAIL_BARRIER_DELAY 0x2202
20614 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20615 # Do not reduce barrier time - See LU-11873
20616 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
20619 local b_status=$(barrier_stat)
20620 echo "Got barrier status at: $(date)"
20621 [ "$b_status" = "'freezing_p1'" ] ||
20622 error "(1) unexpected barrier status $b_status"
20624 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20626 b_status=$(barrier_stat)
20627 [ "$b_status" = "'frozen'" ] ||
20628 error "(2) unexpected barrier status $b_status"
20630 local expired=$(barrier_expired)
20631 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
20632 sleep $((expired + 3))
20634 b_status=$(barrier_stat)
20635 [ "$b_status" = "'expired'" ] ||
20636 error "(3) unexpected barrier status $b_status"
20638 # Do not reduce barrier time - See LU-11873
20639 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
20640 error "(4) fail to freeze barrier"
20642 b_status=$(barrier_stat)
20643 [ "$b_status" = "'frozen'" ] ||
20644 error "(5) unexpected barrier status $b_status"
20646 echo "Start barrier_thaw at: $(date)"
20647 #define OBD_FAIL_BARRIER_DELAY 0x2202
20648 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20649 do_facet mgs $LCTL barrier_thaw $FSNAME &
20652 b_status=$(barrier_stat)
20653 echo "Got barrier status at: $(date)"
20654 [ "$b_status" = "'thawing'" ] ||
20655 error "(6) unexpected barrier status $b_status"
20657 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20659 b_status=$(barrier_stat)
20660 [ "$b_status" = "'thawed'" ] ||
20661 error "(7) unexpected barrier status $b_status"
20663 #define OBD_FAIL_BARRIER_FAILURE 0x2203
20664 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
20665 do_facet mgs $LCTL barrier_freeze $FSNAME
20667 b_status=$(barrier_stat)
20668 [ "$b_status" = "'failed'" ] ||
20669 error "(8) unexpected barrier status $b_status"
20671 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
20672 do_facet mgs $LCTL barrier_thaw $FSNAME
20676 run_test 801a "write barrier user interfaces and stat machine"
20681 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20682 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
20683 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
20684 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
20685 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
20687 cancel_lru_locks mdc
20689 # 180 seconds should be long enough
20690 do_facet mgs $LCTL barrier_freeze $FSNAME 180
20692 local b_status=$(barrier_stat)
20693 [ "$b_status" = "'frozen'" ] ||
20694 error "(6) unexpected barrier status $b_status"
20696 mkdir $DIR/$tdir/d0/d10 &
20699 touch $DIR/$tdir/d1/f13 &
20702 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
20705 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
20708 rm -f $DIR/$tdir/d4/f12 &
20711 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
20713 # To guarantee taht the 'stat' is not blocked
20714 b_status=$(barrier_stat)
20715 [ "$b_status" = "'frozen'" ] ||
20716 error "(8) unexpected barrier status $b_status"
20718 # let above commands to run at background
20721 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
20722 ps -p $touch_pid || error "(10) touch should be blocked"
20723 ps -p $ln_pid || error "(11) link should be blocked"
20724 ps -p $mv_pid || error "(12) rename should be blocked"
20725 ps -p $rm_pid || error "(13) unlink should be blocked"
20727 b_status=$(barrier_stat)
20728 [ "$b_status" = "'frozen'" ] ||
20729 error "(14) unexpected barrier status $b_status"
20731 do_facet mgs $LCTL barrier_thaw $FSNAME
20732 b_status=$(barrier_stat)
20733 [ "$b_status" = "'thawed'" ] ||
20734 error "(15) unexpected barrier status $b_status"
20736 wait $mkdir_pid || error "(16) mkdir should succeed"
20737 wait $touch_pid || error "(17) touch should succeed"
20738 wait $ln_pid || error "(18) link should succeed"
20739 wait $mv_pid || error "(19) rename should succeed"
20740 wait $rm_pid || error "(20) unlink should succeed"
20744 run_test 801b "modification will be blocked by write barrier"
20747 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20751 stop mds2 || error "(1) Fail to stop mds2"
20753 do_facet mgs $LCTL barrier_freeze $FSNAME 30
20755 local b_status=$(barrier_stat)
20756 [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || {
20757 do_facet mgs $LCTL barrier_thaw $FSNAME
20758 error "(2) unexpected barrier status $b_status"
20761 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20762 error "(3) Fail to rescan barrier bitmap"
20764 # Do not reduce barrier time - See LU-11873
20765 do_facet mgs $LCTL barrier_freeze $FSNAME 20
20767 b_status=$(barrier_stat)
20768 [ "$b_status" = "'frozen'" ] ||
20769 error "(4) unexpected barrier status $b_status"
20771 do_facet mgs $LCTL barrier_thaw $FSNAME
20772 b_status=$(barrier_stat)
20773 [ "$b_status" = "'thawed'" ] ||
20774 error "(5) unexpected barrier status $b_status"
20776 local devname=$(mdsdevname 2)
20778 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
20780 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20781 error "(7) Fail to rescan barrier bitmap"
20785 run_test 801c "rescan barrier bitmap"
20787 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
20788 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
20789 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
20790 saved_MOUNT_OPTS=$MOUNT_OPTS
20796 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
20797 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
20798 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
20799 MOUNT_OPTS=$saved_MOUNT_OPTS
20805 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20806 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20807 skip "Need server version at least 2.9.55"
20809 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
20811 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20813 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
20814 error "(2) Fail to copy"
20816 trap cleanup_802 EXIT
20818 # sync by force before remount as readonly
20819 sync; sync_all_data; sleep 3; sync_all_data
20823 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
20824 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
20825 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
20827 echo "Mount the server as read only"
20828 setupall server_only || error "(3) Fail to start servers"
20830 echo "Mount client without ro should fail"
20831 mount_client $MOUNT &&
20832 error "(4) Mount client without 'ro' should fail"
20834 echo "Mount client with ro should succeed"
20835 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
20836 mount_client $MOUNT ||
20837 error "(5) Mount client with 'ro' should succeed"
20839 echo "Modify should be refused"
20840 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
20842 echo "Read should be allowed"
20843 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
20844 error "(7) Read should succeed under ro mode"
20848 run_test 802 "simulate readonly device"
20851 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20852 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20853 skip "MDS needs to be newer than 2.10.54"
20855 mkdir -p $DIR/$tdir
20856 # Create some objects on all MDTs to trigger related logs objects
20857 for idx in $(seq $MDSCOUNT); do
20858 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
20859 $DIR/$tdir/dir${idx} ||
20860 error "Fail to create $DIR/$tdir/dir${idx}"
20864 wait_delete_completed # ensure old test cleanups are finished
20865 echo "before create:"
20867 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20869 for i in {1..10}; do
20870 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
20871 error "Fail to create $DIR/$tdir/foo$i"
20875 echo "after create:"
20877 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20879 # allow for an llog to be cleaned up during the test
20880 [ $after_used -ge $((before_used + 10 - 1)) ] ||
20881 error "before ($before_used) + 10 > after ($after_used)"
20883 for i in {1..10}; do
20884 rm -rf $DIR/$tdir/foo$i ||
20885 error "Fail to remove $DIR/$tdir/foo$i"
20888 sleep 3 # avoid MDT return cached statfs
20889 wait_delete_completed
20890 echo "after unlink:"
20892 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
20894 # allow for an llog to be created during the test
20895 [ $after_used -le $((before_used + 1)) ] ||
20896 error "after ($after_used) > before ($before_used) + 1"
20898 run_test 803 "verify agent object for remote object"
20901 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20902 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
20903 skip "MDS needs to be newer than 2.10.54"
20904 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
20906 mkdir -p $DIR/$tdir
20907 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
20908 error "Fail to create $DIR/$tdir/dir0"
20910 local fid=$($LFS path2fid $DIR/$tdir/dir0)
20911 local dev=$(mdsdevname 2)
20913 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20914 grep ${fid} || error "NOT found agent entry for dir0"
20916 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
20917 error "Fail to create $DIR/$tdir/dir1"
20919 touch $DIR/$tdir/dir1/foo0 ||
20920 error "Fail to create $DIR/$tdir/dir1/foo0"
20921 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
20924 for idx in $(seq $MDSCOUNT); do
20925 dev=$(mdsdevname $idx)
20926 do_facet mds${idx} \
20927 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20928 grep ${fid} && rc=$idx
20931 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
20932 error "Fail to rename foo0 to foo1"
20933 if [ $rc -eq 0 ]; then
20934 for idx in $(seq $MDSCOUNT); do
20935 dev=$(mdsdevname $idx)
20936 do_facet mds${idx} \
20937 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20938 grep ${fid} && rc=$idx
20942 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
20943 error "Fail to rename foo1 to foo2"
20944 if [ $rc -eq 0 ]; then
20945 for idx in $(seq $MDSCOUNT); do
20946 dev=$(mdsdevname $idx)
20947 do_facet mds${idx} \
20948 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
20949 grep ${fid} && rc=$idx
20953 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
20955 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
20956 error "Fail to link to $DIR/$tdir/dir1/foo2"
20957 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
20958 error "Fail to rename foo2 to foo0"
20959 unlink $DIR/$tdir/dir1/foo0 ||
20960 error "Fail to unlink $DIR/$tdir/dir1/foo0"
20961 rm -rf $DIR/$tdir/dir0 ||
20962 error "Fail to rm $DIR/$tdir/dir0"
20964 for idx in $(seq $MDSCOUNT); do
20965 dev=$(mdsdevname $idx)
20969 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
20971 start mds${idx} $dev $MDS_MOUNT_OPTS ||
20972 error "mount mds$idx failed"
20973 df $MOUNT > /dev/null 2>&1
20975 # e2fsck should not return error
20977 error "e2fsck detected error on MDT${idx}: rc=$rc"
20980 run_test 804 "verify agent entry for remote entry"
20983 do_facet $SINGLEMDS zfs set quota=$old $fsset
20984 unlinkmany $DIR/$tdir/f- 1000000
20989 local zfs_version=$(do_node $SINGLEMDS cat /sys/module/zfs/version)
20990 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
20991 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
20992 skip "netfree not implemented before 0.7"
20993 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
20994 skip "Need MDS version at least 2.10.57"
21001 local pref="osd-zfs.lustre-MDT0000."
21003 # limit available space on MDS dataset to meet nospace issue
21004 # quickly. then ZFS 0.7.2 can use reserved space if asked
21005 # properly (using netfree flag in osd_declare_destroy()
21006 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
21007 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
21009 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
21010 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
21011 let "usedkb=usedkb-freekb"
21012 let "freekb=freekb/2"
21013 if let "freekb > 5000"; then
21016 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
21017 trap cleanup_805 EXIT
21019 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
21020 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
21021 rm -rf $DIR/$tdir || error "not able to remove"
21022 do_facet $SINGLEMDS zfs set quota=$old $fsset
21025 run_test 805 "ZFS can remove from full fs"
21031 local size=$($LFS getsom -s $file)
21032 local expect=$(stat -c %s $file)
21034 [[ $size == $expect ]] ||
21035 error "$file expected size: $expect, got: $size"
21037 local blocks=$($LFS getsom -b $file)
21038 expect=$(stat -c %b $file)
21039 [[ $blocks == $expect ]] ||
21040 error "$file expected blocks: $expect, got: $blocks"
21045 local size=$($LFS getsom -s $1)
21048 [[ $size == $expect ]] ||
21049 error "$file expected size: $expect, got: $size"
21053 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21054 skip "Need MDS version at least 2.11.52"
21058 touch $DIR/$tfile || error "touch $tfile failed"
21060 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21061 save_lustre_params client "llite.*.xattr_cache" > $save
21062 lctl set_param llite.*.xattr_cache=0
21063 stack_trap "restore_lustre_params < $save" EXIT
21065 # single-threaded write
21066 echo "Test SOM for single-threaded write"
21067 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
21068 error "write $tfile failed"
21069 check_lsom_size $DIR/$tfile $bs
21072 local size=$(($num * $bs))
21076 echo "Test SOM for single client multi-threaded($num) write"
21077 $TRUNCATE $DIR/$tfile 0
21078 for ((i = 0; i < $num; i++)); do
21079 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21081 offset=$((offset + $bs))
21083 for (( i=0; i < $num; i++ )); do
21086 check_lsom_size $DIR/$tfile $size
21088 $TRUNCATE $DIR/$tfile 0
21089 for ((i = 0; i < $num; i++)); do
21090 offset=$((offset - $bs))
21091 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21094 for (( i=0; i < $num; i++ )); do
21097 check_lsom_size $DIR/$tfile $size
21099 # multi-client writes
21100 num=$(get_node_count ${CLIENTS//,/ })
21101 size=$(($num * $bs))
21105 echo "Test SOM for multi-client ($num) writes"
21106 $TRUNCATE $DIR/$tfile 0
21107 for client in ${CLIENTS//,/ }; do
21108 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21111 offset=$((offset + $bs))
21113 for (( i=0; i < $num; i++ )); do
21116 check_lsom_size $DIR/$tfile $offset
21119 $TRUNCATE $DIR/$tfile 0
21120 for client in ${CLIENTS//,/ }; do
21121 offset=$((offset - $bs))
21122 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21126 for (( i=0; i < $num; i++ )); do
21129 check_lsom_size $DIR/$tfile $size
21132 echo "Test SOM for truncate"
21133 $TRUNCATE $DIR/$tfile 1048576
21134 check_lsom_size $DIR/$tfile 1048576
21135 $TRUNCATE $DIR/$tfile 1234
21136 check_lsom_size $DIR/$tfile 1234
21138 # verify SOM blocks count
21139 echo "Verify SOM block count"
21140 $TRUNCATE $DIR/$tfile 0
21141 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
21142 error "failed to write file $tfile"
21143 check_lsom_data $DIR/$tfile
21145 run_test 806 "Verify Lazy Size on MDS"
21148 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21149 skip "Need MDS version at least 2.11.52"
21151 # Registration step
21152 changelog_register || error "changelog_register failed"
21153 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
21154 changelog_users $SINGLEMDS | grep -q $cl_user ||
21155 error "User $cl_user not found in changelog_users"
21157 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21158 save_lustre_params client "llite.*.xattr_cache" > $save
21159 lctl set_param llite.*.xattr_cache=0
21160 stack_trap "restore_lustre_params < $save" EXIT
21162 rm -rf $DIR/$tdir || error "rm $tdir failed"
21163 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
21164 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
21165 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
21166 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
21167 error "truncate $tdir/trunc failed"
21170 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
21171 error "write $tfile failed"
21173 # multi-client wirtes
21174 local num=$(get_node_count ${CLIENTS//,/ })
21178 echo "Test SOM for multi-client ($num) writes"
21179 touch $DIR/$tfile || error "touch $tfile failed"
21180 $TRUNCATE $DIR/$tfile 0
21181 for client in ${CLIENTS//,/ }; do
21182 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21185 offset=$((offset + $bs))
21187 for (( i=0; i < $num; i++ )); do
21192 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
21193 check_lsom_data $DIR/$tdir/trunc
21194 check_lsom_data $DIR/$tdir/single_dd
21195 check_lsom_data $DIR/$tfile
21198 # Deregistration step
21199 changelog_deregister || error "changelog_deregister failed"
21201 run_test 807 "verify LSOM syncing tool"
21203 check_som_nologged()
21205 local lines=$($LFS changelog $FSNAME-MDT0000 |
21206 grep 'x=trusted.som' | wc -l)
21207 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
21211 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
21212 skip "Need MDS version at least 2.11.55"
21214 # Registration step
21215 changelog_register || error "changelog_register failed"
21217 touch $DIR/$tfile || error "touch $tfile failed"
21220 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
21221 error "write $tfile failed"
21224 $TRUNCATE $DIR/$tfile 1234
21227 $TRUNCATE $DIR/$tfile 1048576
21230 # Deregistration step
21231 changelog_deregister || error "changelog_deregister failed"
21233 run_test 808 "Check trusted.som xattr not logged in Changelogs"
21238 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
21242 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
21243 skip "Need MDS version at least 2.11.56"
21245 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
21246 error "failed to create DoM-only file $DIR/$tfile"
21247 touch $DIR/$tfile || error "touch $tfile failed"
21248 check_som_nodata $DIR/$tfile
21250 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
21251 error "write $tfile failed"
21252 check_som_nodata $DIR/$tfile
21254 $TRUNCATE $DIR/$tfile 1234
21255 check_som_nodata $DIR/$tfile
21257 $TRUNCATE $DIR/$tfile 4097
21258 check_som_nodata $DIR/$file
21260 run_test 809 "Verify no SOM xattr store for DoM-only files"
21263 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21264 $GSS && skip_env "could not run with gss"
21267 stack_trap "set_checksums $ORIG_CSUM" EXIT
21268 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
21273 for csum in $CKSUM_TYPES; do
21274 #define OBD_FAIL_OSC_NO_GRANT 0x411
21275 $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411
21276 for i in "10240 0" "10000 0" "4000 1" "500 1"; do
21278 dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2
21279 before=$(md5sum $DIR/$tfile)
21280 $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear
21281 after=$(md5sum $DIR/$tfile)
21282 [ "$before" == "$after" ] ||
21283 error "$csum: $before != $after bs=$1 seek=$2"
21287 run_test 810 "partial page writes on ZFS (LU-11663)"
21290 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
21291 skip "Need MDS version at least 2.11.56"
21293 #define OBD_FAIL_MDS_ORPHAN_DELETE 0x165
21294 do_facet mds1 $LCTL set_param fail_loc=0x165
21295 $MULTIOP $DIR/$tfile Ouc || error "multiop failed"
21298 start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
21301 [[ $(do_facet mds1 pgrep orph_.*-MDD | wc -l) -eq 0 ]] ||
21302 error "MDD orphan cleanup thread not quit"
21304 run_test 811 "orphan name stub can be cleaned up in startup"
21307 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
21308 skip "OST < 2.12.51 doesn't support this fail_loc"
21309 [ "$SHARED_KEY" = true ] &&
21310 skip "OSC connections never go IDLE with Shared-Keys enabled"
21312 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21313 # ensure ost1 is connected
21314 stat $DIR/$tfile >/dev/null || error "can't stat"
21315 wait_osc_import_state client ost1 FULL
21316 # no locks, no reqs to let the connection idle
21317 cancel_lru_locks osc
21319 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
21320 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
21321 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
21322 wait_osc_import_state client ost1 CONNECTING
21323 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
21325 stat $DIR/$tfile >/dev/null || error "can't stat file"
21327 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
21331 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
21332 echo -n y >> $DIR/$tfile
21333 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
21334 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
21336 run_test 814 "sparse cp works as expected (LU-12361)"
21340 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
21341 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
21343 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
21346 [ "$SHARED_KEY" = true ] &&
21347 skip "OSC connections never go IDLE with Shared-Keys enabled"
21349 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21350 # ensure ost1 is connected
21351 stat $DIR/$tfile >/dev/null || error "can't stat"
21352 wait_osc_import_state client ost1 FULL
21353 # no locks, no reqs to let the connection idle
21354 cancel_lru_locks osc
21355 lru_resize_disable osc
21358 before=$($LCTL get_param -n \
21359 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21361 wait_osc_import_state client ost1 IDLE
21362 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
21363 now=$($LCTL get_param -n \
21364 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21365 [ $before == $now ] || error "lru_size changed $before != $now"
21367 run_test 816 "do not reset lru_resize on idle reconnect"
21371 exportfs -u localhost:$DIR/nfsexp
21376 systemctl restart nfs-server.service || skip "failed to restart nfsd"
21378 mkdir -p $DIR/nfsexp
21379 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
21380 error "failed to export nfs"
21382 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
21383 stack_trap cleanup_817 EXIT
21385 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
21386 error "failed to mount nfs to $tmpdir"
21388 cp /bin/true $tmpdir
21389 $DIR/nfsexp/true || error "failed to execute 'true' command"
21391 run_test 817 "nfsd won't cache write lock for exec file"
21394 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21395 cancel_lru_locks osc
21396 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21397 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21398 dd if=$DIR/$tfile of=/dev/null bs=1M count=1
21401 run_test 819a "too big niobuf in read"
21404 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21405 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21406 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21407 cancel_lru_locks osc
21411 run_test 819b "too big niobuf in write"
21415 $LFS setstripe -c1 -i0 $DIR/$tfile
21416 $LFS setstripe -c1 -i1 $DIR/$tfile
21418 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
21419 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
21420 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
21421 error "start $SINGLEMDS failed"
21424 run_test 818 "unlink with failed llog"
21427 # tests that do cleanup/setup should be run at the end
21431 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21434 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
21435 $LCTL set_param fail_loc=0x903
21437 cancel_lru_locks MGC
21439 FAIL_ON_ERROR=true cleanup
21440 FAIL_ON_ERROR=true setup
21442 run_test 900 "umount should not race with any mgc requeue thread"
21445 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
21446 check_and_cleanup_lustre
21447 if [ "$I_MOUNTED" != "yes" ]; then
21448 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true