3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
6 # e.g. ONLY="22 23" or ONLY="`seq 32 39`" or EXCEPT="31"
11 # Check Grants after these tests
12 GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c 64d"
17 CREATETEST=${CREATETEST:-createtest}
18 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
19 OPENFILE=${OPENFILE:-openfile}
20 OPENUNLINK=${OPENUNLINK:-openunlink}
21 READS=${READS:-"reads"}
22 MUNLINK=${MUNLINK:-munlink}
23 SOCKETSERVER=${SOCKETSERVER:-socketserver}
24 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
25 MEMHOG=${MEMHOG:-memhog}
26 DIRECTIO=${DIRECTIO:-directio}
27 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
29 CHECK_GRANT=${CHECK_GRANT:-"yes"}
30 GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
31 export PARALLEL=${PARALLEL:-"no"}
34 LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
35 LUSTRE=${LUSTRE:-$(dirname $0)/..}
36 . $LUSTRE/tests/test-framework.sh
41 ALWAYS_EXCEPT="$SANITY_EXCEPT "
42 # bug number for skipped test: LU-9693 LU-6493 LU-9693
43 ALWAYS_EXCEPT+=" 42a 42b 42c "
44 # bug number: LU-8411 LU-9054
45 ALWAYS_EXCEPT+=" 407 312 "
48 # bug number: LU-9795 LU-9795 LU-9795 LU-9795
49 ALWAYS_EXCEPT+=" 17n 60a 133g 300f "
52 # skip the grant tests for ARM until they are fixed
53 if [[ $(uname -m) = aarch64 ]]; then
54 # bug number: LU-11596
55 ALWAYS_EXCEPT+=" $GRANT_CHECK_LIST"
56 # bug number: LU-11671 LU-11667 LU-11729 LU-4398
57 ALWAYS_EXCEPT+=" 45 317 810 817"
61 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
63 if [ "$mds1_FSTYPE" = "zfs" ]; then
64 # bug number for skipped test: LU-1957
65 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 180"
67 [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
70 # Get the SLES distro version
72 # Returns a version string that should only be used in comparing
73 # strings returned by version_code()
76 local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2)
78 # All SuSE Linux versions have one decimal. version_code expects two
79 local sles_version=$version.0
80 version_code $sles_version
83 # Check if we are running on Ubuntu or SLES so we can make decisions on
85 if [ -r /etc/SuSE-release ]; then
86 sles_version=$(sles_version_code)
87 [ $sles_version -lt $(version_code 11.4.0) ] &&
88 # bug number for skipped test: LU-4341
89 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170"
90 [ $sles_version -lt $(version_code 12.0.0) ] &&
91 # bug number for skipped test: LU-3703
92 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234"
93 elif [ -r /etc/os-release ]; then
94 if grep -qi ubuntu /etc/os-release; then
95 ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
100 if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
101 # bug number for skipped test:
103 ALWAYS_EXCEPT+=" 103a 410"
113 pgrep ll_sa > /dev/null && { echo "There are ll_sa thread not exit!"; exit 20; }
114 cleanupall ${FORCE} $* || { echo "FAILed to clean up"; exit 20; }
123 check_swap_layouts_support()
125 $LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
126 skip "Does not support layout lock."
129 check_and_setup_lustre
133 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
135 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
136 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
137 rm -rf $DIR/[Rdfs][0-9]*
139 # $RUNAS_ID may get set incorrectly somewhere else
140 [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] &&
141 error "\$RUNAS_ID set to 0, but \$UID is also 0!"
143 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
145 if [ "${ONLY}" = "MOUNT" ] ; then
146 echo "Lustre is up, please go on"
150 echo "preparing for tests involving mounts"
151 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
153 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
154 echo # add a newline after mke2fs.
158 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
159 lctl set_param debug=-1 2> /dev/null || true
162 $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
164 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
166 run_test 0a "touch; rm ====================="
169 chmod 0755 $DIR || error "chmod 0755 $DIR failed"
170 $CHECKSTAT -p 0755 $DIR || error "$DIR permission is not 0755"
172 run_test 0b "chmod 0755 $DIR ============================="
175 $LCTL get_param mdc.*.import | grep "state: FULL" ||
176 error "import not FULL"
177 $LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" ||
180 run_test 0c "check import proc"
182 test_0d() { # LU-3397
183 [ $MGS_VERSION -lt $(version_code 2.10.57) ] &&
184 skip "proc exports not supported before 2.10.57"
186 local mgs_exp="mgs.MGS.exports"
187 local client_uuid=$($LCTL get_param -n mgc.*.uuid)
189 local exp_client_version
192 local temp_imp=$DIR/$tfile.import
193 local temp_exp=$DIR/$tfile.export
195 # save mgc import file to $temp_imp
196 $LCTL get_param mgc.*.import | tee $temp_imp
197 # Check if client uuid is found in MGS export
198 for exp_client_nid in $(do_facet mgs $LCTL get_param -N $mgs_exp.*); do
199 [ $(do_facet mgs $LCTL get_param -n $exp_client_nid.uuid) == \
203 # save mgs export file to $temp_exp
204 do_facet mgs $LCTL get_param $exp_client_nid.export | tee $temp_exp
206 # Compare the value of field "connect_flags"
207 imp_val=$(grep "connect_flags" $temp_imp)
208 exp_val=$(grep "connect_flags" $temp_exp)
209 [ "$exp_val" == "$imp_val" ] ||
210 error "export flags '$exp_val' != import flags '$imp_val'"
212 # Compare the value of client version
213 exp_client_version=$(awk '/target_version:/ { print $2 }' $temp_exp)
214 exp_val=$(version_code $exp_client_version)
215 imp_val=$CLIENT_VERSION
216 [ "$exp_val" == "$imp_val" ] ||
217 error "export client version '$exp_val' != '$imp_val'"
219 run_test 0d "check export proc ============================="
222 test_mkdir $DIR/$tdir
223 test_mkdir $DIR/$tdir/d2
224 mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
225 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir"
228 $CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed"
230 run_test 1 "mkdir; remkdir; rmdir"
233 test_mkdir $DIR/$tdir
234 touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed"
235 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
237 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed"
239 run_test 2 "mkdir; touch; rmdir; check file"
242 test_mkdir $DIR/$tdir
243 $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
244 touch $DIR/$tdir/$tfile
245 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
247 $CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed"
249 run_test 3 "mkdir; touch; rmdir; check dir"
251 # LU-4471 - failed rmdir on remote directories still removes directory on MDT0
253 test_mkdir -i 1 $DIR/$tdir
255 touch $DIR/$tdir/$tfile ||
256 error "Create file under remote directory failed"
259 error "Expect error removing in-use dir $DIR/$tdir"
261 test -d $DIR/$tdir || error "Remote directory disappeared"
263 rm -rf $DIR/$tdir || error "remove remote dir error"
265 run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
268 test_mkdir $DIR/$tdir
269 test_mkdir $DIR/$tdir/d2
270 chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed"
271 $CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707"
272 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
274 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2"
277 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
278 chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
279 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
280 error "$tfile does not have perm 0666 or UID $UID"
281 $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
282 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
283 error "$tfile should be 0666 and owned by UID $UID"
285 run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
288 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
291 chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
292 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
293 error "$tfile should be owned by UID $RUNAS_ID"
294 $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
295 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
296 error "$tfile should be owned by UID $RUNAS_ID"
298 run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
301 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
304 chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
305 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
306 error "$tfile should be owned by GID $UID"
307 $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
308 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
309 error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
311 run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)"
314 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
316 test_mkdir $DIR/$tdir
317 chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed"
318 $RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
319 chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed"
320 test_mkdir $DIR/$tdir/d/subdir
321 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir ||
322 error "$tdir/d/subdir should be GID $RUNAS_GID"
323 if [[ $MDSCOUNT -gt 1 ]]; then
324 # check remote dir sgid inherite
325 $LFS mkdir -i 0 $DIR/$tdir.local ||
326 error "mkdir $tdir.local failed"
327 chmod g+s $DIR/$tdir.local ||
328 error "chmod $tdir.local failed"
329 chgrp $RUNAS_GID $DIR/$tdir.local ||
330 error "chgrp $tdir.local failed"
331 $LFS mkdir -i 1 $DIR/$tdir.local/$tdir.remote ||
332 error "mkdir $tdir.remote failed"
333 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir.local/$tdir.remote ||
334 error "$tdir.remote should be owned by $UID.$RUNAS_ID"
335 $CHECKSTAT -p 02755 $DIR/$tdir.local/$tdir.remote ||
336 error "$tdir.remote should be mode 02755"
339 run_test 6g "verify new dir in sgid dir inherits group"
341 test_6h() { # bug 7331
342 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
344 touch $DIR/$tfile || error "touch failed"
345 chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile || error "initial chown failed"
346 $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/$tfile &&
347 error "chown $RUNAS_ID:0 $tfile worked as GID $RUNAS_GID"
348 $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile ||
349 error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID"
351 run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)"
354 test_mkdir $DIR/$tdir
355 $MCREATE $DIR/$tdir/$tfile
356 chmod 0666 $DIR/$tdir/$tfile
357 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
358 error "$tdir/$tfile should be mode 0666"
360 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
363 if [ ! -d $DIR/$tdir ]; then
364 test_mkdir $DIR/$tdir
366 $MCREATE $DIR/$tdir/$tfile
367 echo -n foo > $DIR/$tdir/$tfile
368 [ "$(cat $DIR/$tdir/$tfile)" = "foo" ] || error "$tdir/$tfile not 'foo'"
369 $CHECKSTAT -t file -s 3 $DIR/$tdir/$tfile || error "$tfile size not 3"
371 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
374 test_mkdir $DIR/$tdir
375 touch $DIR/$tdir/$tfile
376 chmod 0666 $DIR/$tdir/$tfile
377 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
378 error "$tfile mode not 0666"
380 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
383 test_mkdir $DIR/$tdir
384 test_mkdir $DIR/$tdir/d2
385 test_mkdir $DIR/$tdir/d2/d3
386 $CHECKSTAT -t dir $DIR/$tdir/d2/d3 || error "$tdir/d2/d3 not a dir"
388 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
391 test_mkdir $DIR/$tdir
392 test_mkdir $DIR/$tdir/d2
393 touch $DIR/$tdir/d2/$tfile
394 $CHECKSTAT -t file $DIR/$tdir/d2/$tfile ||
395 error "$tdir/d2/$tfile not a file"
397 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
400 test_mkdir $DIR/$tdir
401 test_mkdir $DIR/$tdir/d2
402 chmod 0666 $DIR/$tdir/d2
403 chmod 0705 $DIR/$tdir/d2
404 $CHECKSTAT -t dir -p 0705 $DIR/$tdir/d2 ||
405 error "$tdir/d2 mode not 0705"
407 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
410 test_mkdir $DIR/$tdir
411 touch $DIR/$tdir/$tfile
412 chmod 0666 $DIR/$tdir/$tfile
413 chmod 0654 $DIR/$tdir/$tfile
414 $CHECKSTAT -t file -p 0654 $DIR/$tdir/$tfile ||
415 error "$tdir/d2 mode not 0654"
417 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
420 test_mkdir $DIR/$tdir
421 dd if=/dev/zero of=$DIR/$tdir/$tfile count=10
423 $CHECKSTAT -t file -s 0 $DIR/$tdir/$tfile ||
424 error "$tdir/$tfile size not 0 after truncate"
426 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
429 test_mkdir $DIR/$tdir
430 touch $DIR/$tdir/$tfile
432 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
434 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
437 test_mkdir $DIR/$tdir
438 touch $DIR/$tdir/$tfile
439 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
440 $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
441 error "$tdir/${tfile_2} not a file after rename"
442 rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
444 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
447 test_mkdir $DIR/$tdir
448 touch $DIR/$tdir/$tfile
449 rm -rf $DIR/$tdir/$tfile
450 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
452 run_test 16 "touch .../d16/f; rm -rf .../d16/f"
455 test_mkdir $DIR/$tdir
456 touch $DIR/$tdir/$tfile
457 ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist
459 $CHECKSTAT -l $DIR/$tdir/$tfile $DIR/$tdir/l-exist ||
460 error "$tdir/l-exist not a symlink"
461 $CHECKSTAT -f -t f $DIR/$tdir/l-exist ||
462 error "$tdir/l-exist not referencing a file"
463 rm -f $DIR/$tdir/l-exist
464 $CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed"
466 run_test 17a "symlinks: create, remove (real)"
469 test_mkdir $DIR/$tdir
470 ln -s no-such-file $DIR/$tdir/l-dangle
472 $CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle ||
473 error "$tdir/l-dangle not referencing no-such-file"
474 $CHECKSTAT -fa $DIR/$tdir/l-dangle ||
475 error "$tdir/l-dangle not referencing non-existent file"
476 rm -f $DIR/$tdir/l-dangle
477 $CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed"
479 run_test 17b "symlinks: create, remove (dangling)"
481 test_17c() { # bug 3440 - don't save failed open RPC for replay
482 test_mkdir $DIR/$tdir
483 ln -s foo $DIR/$tdir/$tfile
484 cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true
486 run_test 17c "symlinks: open dangling (should return error)"
489 test_mkdir $DIR/$tdir
490 ln -s foo $DIR/$tdir/$tfile
491 touch $DIR/$tdir/$tfile || error "creating to new symlink"
493 run_test 17d "symlinks: create dangling"
496 test_mkdir $DIR/$tdir
497 local foo=$DIR/$tdir/$tfile
498 ln -s $foo $foo || error "create symlink failed"
499 ls -l $foo || error "ls -l failed"
500 ls $foo && error "ls not failed" || true
502 run_test 17e "symlinks: create recursive symlink (should return error)"
505 test_mkdir $DIR/$tdir
506 ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
507 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
508 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
509 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
510 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
511 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
514 run_test 17f "symlinks: long and very long symlink name"
516 # str_repeat(S, N) generate a string that is string S repeated N times
521 while [ $((n -= 1)) -ge 0 ]; do
527 # Long symlinks and LU-2241
529 test_mkdir $DIR/$tdir
530 local TESTS="59 60 61 4094 4095"
532 # Fix for inode size boundary in 2.1.4
533 [ $MDS1_VERSION -lt $(version_code 2.1.4) ] &&
536 # Patch not applied to 2.2 or 2.3 branches
537 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
538 [ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
541 # skip long symlink name for rhel6.5.
542 # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
543 grep -q '6.5' /etc/redhat-release &>/dev/null &&
544 TESTS="59 60 61 4062 4063"
547 local SYMNAME=$(str_repeat 'x' $i)
548 ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
549 readlink $DIR/$tdir/f$i || error "failed $i-char readlink"
552 run_test 17g "symlinks: really long symlink name and inode boundaries"
554 test_17h() { #bug 17378
555 [ $PARALLEL == "yes" ] && skip "skip parallel run"
556 remote_mds_nodsh && skip "remote MDS with nodsh"
560 test_mkdir $DIR/$tdir
561 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
562 $LFS setstripe -c -1 $DIR/$tdir
563 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
564 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
565 touch $DIR/$tdir/$tfile || true
567 run_test 17h "create objects: lov_free_memmd() doesn't lbug"
569 test_17i() { #bug 20018
570 [ $PARALLEL == "yes" ] && skip "skip parallel run"
571 remote_mds_nodsh && skip "remote MDS with nodsh"
573 local foo=$DIR/$tdir/$tfile
576 test_mkdir -c1 $DIR/$tdir
577 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
578 ln -s $foo $foo || error "create symlink failed"
579 #define OBD_FAIL_MDS_READLINK_EPROTO 0x143
580 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000143
581 ls -l $foo && error "error not detected"
584 run_test 17i "don't panic on short symlink (should return error)"
586 test_17k() { #bug 22301
587 [ $PARALLEL == "yes" ] && skip "skip parallel run"
588 [[ -z "$(which rsync 2>/dev/null)" ]] &&
589 skip "no rsync command"
590 rsync --help | grep -q xattr ||
591 skip_env "$(rsync --version | head -n1) does not support xattrs"
592 test_mkdir $DIR/$tdir
593 test_mkdir $DIR/$tdir.new
594 touch $DIR/$tdir/$tfile
595 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
596 rsync -av -X $DIR/$tdir/ $DIR/$tdir.new ||
597 error "rsync failed with xattrs enabled"
599 run_test 17k "symlinks: rsync with xattrs enabled"
601 test_17l() { # LU-279
602 [[ -z "$(which getfattr 2>/dev/null)" ]] &&
603 skip "no getfattr command"
605 test_mkdir $DIR/$tdir
606 touch $DIR/$tdir/$tfile
607 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
608 for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
609 # -h to not follow symlinks. -m '' to list all the xattrs.
610 # grep to remove first line: '# file: $path'.
611 for xattr in `getfattr -hm '' $path 2>/dev/null | grep -v '^#'`;
613 lgetxattr_size_check $path $xattr ||
614 error "lgetxattr_size_check $path $xattr failed"
618 run_test 17l "Ensure lgetxattr's returned xattr size is consistent"
622 [ $PARALLEL == "yes" ] && skip "skip parallel run"
623 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
624 remote_mds_nodsh && skip "remote MDS with nodsh"
625 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
626 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
627 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
629 local short_sym="0123456789"
630 local wdir=$DIR/$tdir
635 # create a long symlink file
636 for ((i = 0; i < 4; ++i)); do
637 long_sym=${long_sym}${long_sym}
640 echo "create 512 short and long symlink files under $wdir"
641 for ((i = 0; i < 256; ++i)); do
642 ln -sf ${long_sym}"a5a5" $wdir/long-$i
643 ln -sf ${short_sym}"a5a5" $wdir/short-$i
649 wait_delete_completed
651 echo "recreate the 512 symlink files with a shorter string"
652 for ((i = 0; i < 512; ++i)); do
653 # rewrite the symlink file with a shorter string
654 ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed"
655 ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed"
658 local mds_index=$(($($LFS getstripe -m $wdir) + 1))
659 local devname=$(mdsdevname $mds_index)
661 echo "stop and checking mds${mds_index}:"
662 # e2fsck should not return error
664 run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
667 start mds${mds_index} $devname $MDS_MOUNT_OPTS ||
668 error "start mds${mds_index} failed"
669 df $MOUNT > /dev/null 2>&1
671 error "e2fsck detected error for short/long symlink: rc=$rc"
674 run_test 17m "run e2fsck against MDT which contains short/long symlink"
676 check_fs_consistency_17n() {
680 # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
681 # so it only check MDT1/MDT2 instead of all of MDTs.
682 for mdt_index in 1 2; do
683 local devname=$(mdsdevname $mdt_index)
684 # e2fsck should not return error
686 run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
689 start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
690 error "mount mds$mdt_index failed"
691 df $MOUNT > /dev/null 2>&1
697 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
698 [ $PARALLEL == "yes" ] && skip "skip parallel run"
699 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
700 remote_mds_nodsh && skip "remote MDS with nodsh"
701 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
702 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
703 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
707 test_mkdir $DIR/$tdir
708 for ((i=0; i<10; i++)); do
709 $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
710 error "create remote dir error $i"
711 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
712 error "create files under remote dir failed $i"
715 check_fs_consistency_17n ||
716 error "e2fsck report error after create files under remote dir"
718 for ((i = 0; i < 10; i++)); do
719 rm -rf $DIR/$tdir/remote_dir_${i} ||
720 error "destroy remote dir error $i"
723 check_fs_consistency_17n ||
724 error "e2fsck report error after unlink files under remote dir"
726 [ $MDS1_VERSION -lt $(version_code 2.4.50) ] &&
727 skip "lustre < 2.4.50 does not support migrate mv"
729 for ((i = 0; i < 10; i++)); do
730 mkdir -p $DIR/$tdir/remote_dir_${i}
731 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
732 error "create files under remote dir failed $i"
733 $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
734 error "migrate remote dir error $i"
736 check_fs_consistency_17n || error "e2fsck report error after migration"
738 for ((i = 0; i < 10; i++)); do
739 rm -rf $DIR/$tdir/remote_dir_${i} ||
740 error "destroy remote dir error $i"
743 check_fs_consistency_17n || error "e2fsck report error after unlink"
745 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
748 remote_mds_nodsh && skip "remote MDS with nodsh"
749 [ $MDS1_VERSION -lt $(version_code 2.3.64) ] &&
750 skip "Need MDS version at least 2.3.64"
752 local wdir=$DIR/${tdir}o
758 mdt_index=$($LFS getstripe -m $wdir/$tfile)
759 mdt_index=$((mdt_index + 1))
762 #fail mds will wait the failover finish then set
763 #following fail_loc to avoid interfer the recovery process.
766 #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
767 do_facet mds${mdt_index} lctl set_param fail_loc=0x194
768 ls -l $wdir/$tfile && rc=1
769 do_facet mds${mdt_index} lctl set_param fail_loc=0
770 [[ $rc -eq 0 ]] || error "stat file should fail"
772 run_test 17o "stat file with incompat LMA feature"
775 touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
776 ls $DIR || error "Failed to ls $DIR: $?"
778 run_test 18 "touch .../f ; ls ... =============================="
784 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
786 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
789 ls -l $DIR/$tfile && error "ls -l $tfile failed"|| true
791 run_test 19b "ls -l .../f19 (should return error) =============="
794 [ $RUNAS_ID -eq $UID ] &&
795 skip_env "RUNAS_ID = UID = $UID -- skipping"
797 $RUNAS touch $DIR/$tfile && error "create non-root file failed" || true
799 run_test 19c "$RUNAS touch .../f19 (should return error) =="
802 cat $DIR/f19 && error || true
804 run_test 19d "cat .../f19 (should return error) =============="
813 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
815 run_test 20 "touch .../f ; ls -l ..."
818 test_mkdir $DIR/$tdir
819 [ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle
820 ln -s dangle $DIR/$tdir/link
821 echo foo >> $DIR/$tdir/link
822 cat $DIR/$tdir/dangle
823 $CHECKSTAT -t link $DIR/$tdir/link || error "$tdir/link not a link"
824 $CHECKSTAT -f -t file $DIR/$tdir/link ||
825 error "$tdir/link not linked to a file"
827 run_test 21 "write to dangling link"
830 local wdir=$DIR/$tdir
832 chown $RUNAS_ID:$RUNAS_GID $wdir
833 (cd $wdir || error "cd $wdir failed";
834 $RUNAS tar cf - /etc/hosts /etc/sysconfig/network |
836 ls -lR $wdir/etc || error "ls -lR $wdir/etc failed"
837 $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed"
838 $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc ||
839 error "checkstat -u failed"
841 run_test 22 "unpack tar archive as non-root user"
845 test_mkdir $DIR/$tdir
846 local file=$DIR/$tdir/$tfile
848 openfile -f O_CREAT:O_EXCL $file || error "$file create failed"
849 openfile -f O_CREAT:O_EXCL $file &&
850 error "$file recreate succeeded" || true
852 run_test 23a "O_CREAT|O_EXCL in subdir"
854 test_23b() { # bug 18988
855 test_mkdir $DIR/$tdir
856 local file=$DIR/$tdir/$tfile
859 echo foo > $file || error "write filed"
860 echo bar >> $file || error "append filed"
861 $CHECKSTAT -s 8 $file || error "wrong size"
864 run_test 23b "O_APPEND check"
866 # LU-9409, size with O_APPEND and tiny writes
868 local file=$DIR/$tfile
871 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800
872 $CHECKSTAT -s 6400 $file || error "wrong size, expected 6400"
876 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
877 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
879 $CHECKSTAT -s 12800 $file || error "wrong size, expected 12800"
882 #racing tiny & normal writes
883 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4096 count=4 &
884 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=100 &
886 $CHECKSTAT -s 17184 $file || error "wrong size, expected 17184"
889 #racing tiny & normal writes 2, ugly numbers
890 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4099 count=11 &
891 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=17 count=173 &
893 $CHECKSTAT -s 48030 $file || error "wrong size, expected 48030"
896 run_test 23c "O_APPEND size checks for tiny writes"
898 # LU-11069 file offset is correct after appending writes
900 local file=$DIR/$tfile
903 echo CentaurHauls > $file
904 offset=$($MULTIOP $file oO_WRONLY:O_APPEND:w13Zp)
905 if ((offset != 26)); then
906 error "wrong offset, expected 26, got '$offset'"
909 run_test 23d "file offset is correct after appending writes"
913 echo '-- same directory rename'
914 test_mkdir $DIR/$tdir
915 touch $DIR/$tdir/$tfile.1
916 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
917 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
919 run_test 24a "rename file to non-existent target"
922 test_mkdir $DIR/$tdir
923 touch $DIR/$tdir/$tfile.{1,2}
924 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
925 $CHECKSTAT -a $DIR/$tdir/$tfile.1 || error "$tfile.1 exists"
926 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
928 run_test 24b "rename file to existing target"
931 test_mkdir $DIR/$tdir
932 test_mkdir $DIR/$tdir/d$testnum.1
933 mv $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
934 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
935 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
937 run_test 24c "rename directory to non-existent target"
940 test_mkdir -c1 $DIR/$tdir
941 test_mkdir -c1 $DIR/$tdir/d$testnum.1
942 test_mkdir -c1 $DIR/$tdir/d$testnum.2
943 mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
944 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
945 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
947 run_test 24d "rename directory to existing target"
950 echo '-- cross directory renames --'
954 mv $DIR/R5a/f $DIR/R5b/g
955 $CHECKSTAT -a $DIR/R5a/f || error "$DIR/R5a/f exists"
956 $CHECKSTAT -t file $DIR/R5b/g || error "$DIR/R5b/g not file type"
958 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
963 touch $DIR/R6a/f $DIR/R6b/g
964 mv $DIR/R6a/f $DIR/R6b/g
965 $CHECKSTAT -a $DIR/R6a/f || error "$DIR/R6a/f exists"
966 $CHECKSTAT -t file $DIR/R6b/g || error "$DIR/R6b/g not file type"
968 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
973 test_mkdir $DIR/R7a/d
974 mv $DIR/R7a/d $DIR/R7b/e
975 $CHECKSTAT -a $DIR/R7a/d || error "$DIR/R7a/d exists"
976 $CHECKSTAT -t dir $DIR/R7b/e || error "$DIR/R7b/e not dir type"
978 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
981 test_mkdir -c1 $DIR/R8a
982 test_mkdir -c1 $DIR/R8b
983 test_mkdir -c1 $DIR/R8a/d
984 test_mkdir -c1 $DIR/R8b/e
985 mrename $DIR/R8a/d $DIR/R8b/e
986 $CHECKSTAT -a $DIR/R8a/d || error "$DIR/R8a/d exists"
987 $CHECKSTAT -t dir $DIR/R8b/e || error "$DIR/R8b/e not dir type"
989 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
992 echo "-- rename error cases"
996 mrename $DIR/R9/f $DIR/R9/a
997 $CHECKSTAT -t file $DIR/R9/f || error "$DIR/R9/f not file type"
998 $CHECKSTAT -t dir $DIR/R9/a || error "$DIR/R9/a not dir type"
999 $CHECKSTAT -a $DIR/R9/a/f || error "$DIR/R9/a/f exists"
1001 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
1005 mrename $DIR/R10/f $DIR/R10/g
1006 $CHECKSTAT -t dir $DIR/R10 || error "$DIR/R10 not dir type"
1007 $CHECKSTAT -a $DIR/R10/f || error "$DIR/R10/f exists"
1008 $CHECKSTAT -a $DIR/R10/g || error "$DIR/R10/g exists"
1010 run_test 24j "source does not exist ============================"
1013 test_mkdir $DIR/R11a
1014 test_mkdir $DIR/R11a/d
1016 mv $DIR/R11a/f $DIR/R11a/d
1017 $CHECKSTAT -a $DIR/R11a/f || error "$DIR/R11a/f exists"
1018 $CHECKSTAT -t file $DIR/R11a/d/f || error "$DIR/R11a/d/f not file type"
1020 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
1022 # bug 2429 - rename foo foo foo creates invalid file
1025 $MULTIOP $f OcNs || error "rename of ${f} to itself failed"
1027 run_test 24l "Renaming a file to itself ========================"
1031 $MULTIOP $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
1032 # on ext3 this does not remove either the source or target files
1033 # though the "expected" operation would be to remove the source
1034 $CHECKSTAT -t file ${f} || error "${f} missing"
1035 $CHECKSTAT -t file ${f}2 || error "${f}2 missing"
1037 run_test 24m "Renaming a file to a hard link to itself ========="
1041 # this stats the old file after it was renamed, so it should fail
1043 $CHECKSTAT ${f} || error "${f} missing"
1045 $CHECKSTAT ${f}.rename || error "${f}.rename missing"
1046 $CHECKSTAT -a ${f} || error "${f} exists"
1048 run_test 24n "Statting the old file after renaming (Posix rename 2)"
1051 test_mkdir $DIR/$tdir
1052 rename_many -s random -v -n 10 $DIR/$tdir
1054 run_test 24o "rename of files during htree split"
1057 test_mkdir $DIR/R12a
1058 test_mkdir $DIR/R12b
1059 DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
1060 mrename $DIR/R12a $DIR/R12b
1061 $CHECKSTAT -a $DIR/R12a || error "$DIR/R12a exists"
1062 $CHECKSTAT -t dir $DIR/R12b || error "$DIR/R12b not dir type"
1063 DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
1064 [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
1066 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
1068 cleanup_multiop_pause() {
1070 kill -USR1 $MULTIPID
1074 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1076 test_mkdir $DIR/R13a
1077 test_mkdir $DIR/R13b
1078 local DIRINO=$(ls -lid $DIR/R13a | awk '{ print $1 }')
1079 multiop_bg_pause $DIR/R13b D_c || error "multiop failed to start"
1082 trap cleanup_multiop_pause EXIT
1083 mrename $DIR/R13a $DIR/R13b
1084 $CHECKSTAT -a $DIR/R13a || error "R13a still exists"
1085 $CHECKSTAT -t dir $DIR/R13b || error "R13b does not exist"
1086 local DIRINO2=$(ls -lid $DIR/R13b | awk '{ print $1 }')
1087 [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
1088 cleanup_multiop_pause
1089 wait $MULTIPID || error "multiop close failed"
1091 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
1093 test_24r() { #bug 3789
1094 test_mkdir $DIR/R14a
1095 test_mkdir $DIR/R14a/b
1096 mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
1097 $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
1098 $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
1100 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
1103 test_mkdir $DIR/R15a
1104 test_mkdir $DIR/R15a/b
1105 test_mkdir $DIR/R15a/b/c
1106 mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
1107 $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
1108 $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
1110 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
1112 test_mkdir $DIR/R16a
1113 test_mkdir $DIR/R16a/b
1114 test_mkdir $DIR/R16a/b/c
1115 mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
1116 $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
1117 $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
1119 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
1121 test_24u() { # bug12192
1122 $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error "multiop failed"
1123 $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
1125 run_test 24u "create stripe file"
1127 simple_cleanup_common() {
1130 [ -z "$DIR" ] || [ -z "$tdir" ] && return 0
1132 local start=$SECONDS
1135 wait_delete_completed
1136 echo "cleanup time $((SECONDS - start))"
1140 max_pages_per_rpc() {
1141 local mdtname="$(printf "MDT%04x" ${1:-0})"
1142 $LCTL get_param -n mdc.*$mdtname*.max_pages_per_rpc
1146 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1148 local nrfiles=${COUNT:-100000}
1149 local fname="$DIR/$tdir/$tfile"
1151 # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
1152 [ "$mds1_FSTYPE" = "zfs" ] && nrfiles=${COUNT:-10000}
1154 test_mkdir "$(dirname $fname)"
1155 # assume MDT0000 has the fewest inodes
1156 local stripes=$($LFS getdirstripe -c $(dirname $fname))
1157 local free_inodes=$(($(mdt_free_inodes 0) * stripes))
1158 [[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
1160 trap simple_cleanup_common EXIT
1162 createmany -m "$fname" $nrfiles
1164 cancel_lru_locks mdc
1165 lctl set_param mdc.*.stats clear
1167 # was previously test_24D: LU-6101
1168 # readdir() returns correct number of entries after cursor reload
1169 local num_ls=$(ls $DIR/$tdir | wc -l)
1170 local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l)
1171 local num_all=$(ls -a $DIR/$tdir | wc -l)
1172 if [ $num_ls -ne $nrfiles ] || [ $num_uniq -ne $nrfiles ] ||
1173 [ $num_all -ne $((nrfiles + 2)) ]; then
1174 error "Expected $nrfiles files, got $num_ls " \
1175 "($num_uniq unique $num_all .&..)"
1177 # LU-5 large readdir
1178 # dirent_size = 32 bytes for sizeof(struct lu_dirent) +
1179 # N bytes for name (len($nrfiles) rounded to 8 bytes) +
1180 # 8 bytes for luda_type (4 bytes rounded to 8 bytes)
1181 # take into account of overhead in lu_dirpage header and end mark in
1182 # each page, plus one in rpc_num calculation.
1183 local dirent_size=$((32 + (${#tfile} | 7) + 1 + 8))
1184 local page_entries=$(((PAGE_SIZE - 24) / dirent_size))
1185 local mdt_idx=$($LFS getdirstripe -i $(dirname $fname))
1186 local rpc_pages=$(max_pages_per_rpc $mdt_idx)
1187 local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
1188 local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
1189 echo "readpages: $mds_readpage rpc_max: $rpc_max"
1190 (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
1191 error "large readdir doesn't take effect: " \
1192 "$mds_readpage should be about $rpc_max"
1194 simple_cleanup_common
1196 run_test 24v "list large directory (test hash collision, b=17560)"
1198 test_24w() { # bug21506
1200 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
1201 dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
1202 dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
1203 SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
1204 [[ "$SZ1" -eq "$SZ2" ]] ||
1205 error "Error reading at the end of the file $tfile"
1207 run_test 24w "Reading a file larger than 4Gb"
1210 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1211 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1212 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1213 skip "Need MDS version at least 2.7.56"
1216 local remote_dir=$DIR/$tdir/remote_dir
1218 test_mkdir $DIR/$tdir
1219 $LFS mkdir -i $MDTIDX $remote_dir ||
1220 error "create remote directory failed"
1222 test_mkdir $DIR/$tdir/src_dir
1223 touch $DIR/$tdir/src_file
1224 test_mkdir $remote_dir/tgt_dir
1225 touch $remote_dir/tgt_file
1227 mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
1228 error "rename dir cross MDT failed!"
1230 mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
1231 error "rename file cross MDT failed!"
1233 touch $DIR/$tdir/ln_file
1234 ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
1235 error "ln file cross MDT failed"
1237 rm -rf $DIR/$tdir || error "Can not delete directories"
1239 run_test 24x "cross MDT rename/link"
1242 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1243 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1245 local remote_dir=$DIR/$tdir/remote_dir
1248 test_mkdir $DIR/$tdir
1249 $LFS mkdir -i $mdtidx $remote_dir ||
1250 error "create remote directory failed"
1252 test_mkdir $remote_dir/src_dir
1253 touch $remote_dir/src_file
1254 test_mkdir $remote_dir/tgt_dir
1255 touch $remote_dir/tgt_file
1257 mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
1258 error "rename subdir in the same remote dir failed!"
1260 mrename $remote_dir/src_file $remote_dir/tgt_file ||
1261 error "rename files in the same remote dir failed!"
1263 ln $remote_dir/tgt_file $remote_dir/tgt_file1 ||
1264 error "link files in the same remote dir failed!"
1266 rm -rf $DIR/$tdir || error "Can not delete directories"
1268 run_test 24y "rename/link on the same dir should succeed"
1271 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1272 [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] &&
1273 skip "Need MDS version at least 2.12.51"
1277 for index in 0 1; do
1278 $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed"
1279 touch $DIR/$tdir.0/$tfile.$index || error "touch failed"
1282 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed"
1284 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0)
1285 [ $index -eq 0 ] || error "$tfile.0 is on MDT$index"
1287 local mdts=$(comma_list $(mdts_nodes))
1289 do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0
1290 stack_trap "do_nodes $mdts $LCTL \
1291 set_param mdt.*.enable_remote_rename=1" EXIT
1293 mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed"
1295 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1)
1296 [ $index -eq 1 ] || error "$tfile.1 is on MDT$index"
1298 run_test 24z "cross-MDT rename is done as cp"
1300 test_24A() { # LU-3182
1304 test_mkdir $DIR/$tdir
1305 trap simple_cleanup_common EXIT
1306 createmany -m $DIR/$tdir/$tfile $NFILES
1307 local t=$(ls $DIR/$tdir | wc -l)
1308 local u=$(ls $DIR/$tdir | sort -u | wc -l)
1309 local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
1310 if [ $t -ne $NFILES ] || [ $u -ne $NFILES ] ||
1311 [ $v -ne $((NFILES + 2)) ] ; then
1312 error "Expected $NFILES files, got $t ($u unique $v .&..)"
1315 simple_cleanup_common || error "Can not delete directories"
1317 run_test 24A "readdir() returns correct number of entries."
1319 test_24B() { # LU-4805
1320 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1324 test_mkdir $DIR/$tdir
1325 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
1326 error "create striped dir failed"
1328 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1329 [ $count -eq 2 ] || error "Expected 2, got $count"
1331 touch $DIR/$tdir/striped_dir/a
1333 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1334 [ $count -eq 3 ] || error "Expected 3, got $count"
1336 touch $DIR/$tdir/striped_dir/.f
1338 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1339 [ $count -eq 4 ] || error "Expected 4, got $count"
1341 rm -rf $DIR/$tdir || error "Can not delete directories"
1343 run_test 24B "readdir for striped dir return correct number of entries"
1346 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1352 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
1353 error "create striped dir failed"
1355 cd $DIR/$tdir/d0/striped_dir
1357 local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
1358 local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
1359 local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1361 [ "$d0_ino" = "$parent_ino" ] ||
1362 error ".. wrong, expect $d0_ino, get $parent_ino"
1364 mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
1365 error "mv striped dir failed"
1367 parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1369 [ "$d1_ino" = "$parent_ino" ] ||
1370 error ".. wrong after mv, expect $d1_ino, get $parent_ino"
1372 run_test 24C "check .. in striped dir"
1375 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
1376 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1379 mkdir $DIR/$tdir/src_dir
1380 $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
1381 error "create remote source failed"
1383 touch $DIR/$tdir/src_dir/src_child/a
1385 $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
1386 error "create remote target dir failed"
1388 $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
1389 error "create remote target child failed"
1391 mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
1392 error "rename dir cross MDT failed!"
1396 $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
1397 error "src_child still exists after rename"
1399 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
1400 error "missing file(a) after rename"
1402 rm -rf $DIR/$tdir || error "Can not delete directories"
1404 run_test 24E "cross MDT rename/link"
1407 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
1410 [ "$SLOW" = "no" ] && repeats=100
1414 echo "$repeats repeats"
1415 for ((i = 0; i < repeats; i++)); do
1416 $LFS mkdir -i0 -c2 $DIR/$tdir/test || error "mkdir fails"
1417 touch $DIR/$tdir/test/a || error "touch fails"
1418 mkdir $DIR/$tdir/test/b || error "mkdir fails"
1419 rm -rf $DIR/$tdir/test || error "rmdir fails"
1424 run_test 24F "hash order vs readdir (LU-11330)"
1427 echo '== symlink sanity ============================================='
1431 touch $DIR/s25/foo ||
1432 error "File creation in symlinked directory failed"
1434 run_test 25a "create file in symlinked directory ==============="
1437 [ ! -d $DIR/d25 ] && test_25a
1438 $CHECKSTAT -t file $DIR/s25/foo || error "$DIR/s25/foo not file type"
1440 run_test 25b "lookup file in symlinked directory ==============="
1444 test_mkdir $DIR/d26/d26-2
1445 ln -s d26/d26-2 $DIR/s26
1446 touch $DIR/s26/foo || error "File creation failed"
1448 run_test 26a "multiple component symlink ======================="
1451 test_mkdir -p $DIR/$tdir/d26-2
1452 ln -s $tdir/d26-2/foo $DIR/s26-2
1453 touch $DIR/s26-2 || error "File creation failed"
1455 run_test 26b "multiple component symlink at end of lookup ======"
1458 test_mkdir $DIR/d26.2
1459 touch $DIR/d26.2/foo
1460 ln -s d26.2 $DIR/s26.2-1
1461 ln -s s26.2-1 $DIR/s26.2-2
1462 ln -s s26.2-2 $DIR/s26.2-3
1463 chmod 0666 $DIR/s26.2-3/foo
1465 run_test 26c "chain of symlinks"
1467 # recursive symlinks (bug 439)
1469 ln -s d26-3/foo $DIR/d26-3
1471 run_test 26d "create multiple component recursive symlink"
1474 [ ! -h $DIR/d26-3 ] && test_26d
1477 run_test 26e "unlink multiple component recursive symlink"
1479 # recursive symlinks (bug 7022)
1481 test_mkdir $DIR/$tdir
1482 test_mkdir $DIR/$tdir/$tfile
1483 cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed"
1484 test_mkdir -p lndir/bar1
1485 test_mkdir $DIR/$tdir/$tfile/$tfile
1486 cd $tfile || error "cd $tfile failed"
1487 ln -s .. dotdot || error "ln dotdot failed"
1488 ln -s dotdot/lndir lndir || error "ln lndir failed"
1489 cd $DIR/$tdir || error "cd $DIR/$tdir failed"
1490 output=`ls $tfile/$tfile/lndir/bar1`
1491 [ "$output" = bar1 ] && error "unexpected output"
1492 rm -r $tfile || error "rm $tfile failed"
1493 $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
1495 run_test 26f "rm -r of a directory which has recursive symlink"
1498 test_mkdir $DIR/$tdir
1499 $LFS getstripe $DIR/$tdir
1500 $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed"
1501 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1502 cp /etc/hosts $DIR/$tdir/$tfile || error "Can't copy to one stripe file"
1504 run_test 27a "one stripe file"
1507 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1509 test_mkdir $DIR/$tdir
1510 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1511 $LFS getstripe -c $DIR/$tdir/$tfile
1512 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
1513 error "two-stripe file doesn't have two stripes"
1515 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1517 run_test 27b "create and write to two stripe file"
1519 # 27c family tests specific striping, setstripe -o
1521 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1522 test_mkdir -p $DIR/$tdir
1525 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1526 $LFS getstripe -i $DIR/$tdir/$tfile
1527 [ $($LFS getstripe -i $DIR/$tdir/$tfile ) -eq $osts ] ||
1528 error "stripe not on specified OST"
1530 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1532 run_test 27ca "one stripe on specified OST"
1535 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1536 test_mkdir -p $DIR/$tdir
1538 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1539 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1542 # Strip getstripe output to a space separated list of OSTs
1543 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1544 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1545 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1546 error "stripes not on specified OSTs"
1548 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1550 run_test 27cb "two stripes on specified OSTs"
1553 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1554 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
1555 skip "server does not support overstriping"
1557 test_mkdir -p $DIR/$tdir
1559 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1560 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1563 # Strip getstripe output to a space separated list of OSTs
1564 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1565 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1566 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1567 error "stripes not on specified OSTs"
1569 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1571 run_test 27cc "two stripes on the same OST"
1574 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1575 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
1576 skip "server does not support overstriping"
1577 test_mkdir -p $DIR/$tdir
1578 local osts="0,1,1,0"
1579 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1580 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1583 # Strip getstripe output to a space separated list of OSTs
1584 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1585 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1586 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1587 error "stripes not on specified OSTs"
1589 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1591 run_test 27cd "four stripes on two OSTs"
1594 [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
1595 skip_env "too many osts, skipping"
1596 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
1597 skip "server does not support overstriping"
1598 # We do one more stripe than we have OSTs
1599 [ $OSTCOUNT -ge 159 ] || large_xattr_enabled ||
1600 skip_env "ea_inode feature disabled"
1602 test_mkdir -p $DIR/$tdir
1604 for i in $(seq 0 $OSTCOUNT);
1607 if [ $i -ne $OSTCOUNT ]; then
1611 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1612 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1615 # Strip getstripe output to a space separated list of OSTs
1616 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1617 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1618 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1619 error "stripes not on specified OSTs"
1621 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1623 run_test 27ce "more stripes than OSTs with -o"
1626 test_mkdir $DIR/$tdir
1627 $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
1628 error "setstripe failed"
1629 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1630 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1632 run_test 27d "create file with default settings"
1635 # LU-5839 adds check for existed layout before setting it
1636 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1637 skip "Need MDS version at least 2.7.56"
1639 test_mkdir $DIR/$tdir
1640 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1641 $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice"
1642 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1644 run_test 27e "setstripe existing file (should return error)"
1647 test_mkdir $DIR/$tdir
1648 $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
1649 error "$LFS setstripe $DIR/$tdir/$tfile failed"
1650 $CHECKSTAT -t file $DIR/$tdir/$tfile &&
1651 error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
1652 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1653 $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed"
1655 run_test 27f "setstripe with bad stripe size (should return error)"
1658 test_mkdir $DIR/$tdir
1659 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1660 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" ||
1661 error "$DIR/$tdir/$tfile has object"
1663 run_test 27g "$LFS getstripe with no objects"
1666 test_mkdir $DIR/$tdir
1667 touch $DIR/$tdir/$tfile || error "touch failed"
1668 ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed"
1669 $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2
1671 (( rc == 2 )) || error "getstripe did not return ENOENT"
1673 run_test 27ga "$LFS getstripe with missing file (should return error)"
1676 test_mkdir $DIR/$tdir
1677 touch $DIR/$tdir/$tfile || error "touch failed"
1678 [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] ||
1679 error "missing objects"
1681 run_test 27i "$LFS getstripe with some objects"
1684 test_mkdir $DIR/$tdir
1685 $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile &&
1686 error "setstripe failed" || true
1688 run_test 27j "setstripe with bad stripe offset (should return error)"
1690 test_27k() { # bug 2844
1691 test_mkdir $DIR/$tdir
1692 local file=$DIR/$tdir/$tfile
1693 local ll_max_blksize=$((4 * 1024 * 1024))
1694 $LFS setstripe -S 67108864 $file || error "setstripe failed"
1695 local blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1696 [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize"
1697 dd if=/dev/zero of=$file bs=4k count=1
1698 blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1699 [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize"
1701 run_test 27k "limit i_blksize for broken user apps"
1704 mcreate $DIR/$tfile || error "creating file"
1705 $RUNAS $LFS setstripe -c 1 $DIR/$tfile &&
1706 error "setstripe should have failed" || true
1708 run_test 27l "check setstripe permissions (should return error)"
1711 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1713 [ -n "$RCLIENTS" -o -n "$MOUNT_2" ] &&
1714 skip_env "multiple clients -- skipping"
1716 ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
1718 if [[ $ORIGFREE -gt $MAXFREE ]]; then
1719 skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
1721 trap simple_cleanup_common EXIT
1722 test_mkdir $DIR/$tdir
1723 $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
1724 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
1725 error "dd should fill OST0"
1727 while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do
1729 [ $i -gt 256 ] && break
1732 touch $DIR/$tdir/$tfile.$i
1733 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1734 awk '{print $1}'| grep -w "0") ] &&
1735 error "OST0 was full but new created file still use it"
1737 touch $DIR/$tdir/$tfile.$i
1738 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1739 awk '{print $1}'| grep -w "0") ] &&
1740 error "OST0 was full but new created file still use it"
1741 simple_cleanup_common
1743 run_test 27m "create file while OST0 was full"
1745 # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage)
1746 # if the OST isn't full anymore.
1748 local OSTIDX=${1:-""}
1750 local list=$(comma_list $(osts_nodes))
1751 [ "$OSTIDX" ] && list=$(facet_host ost$((OSTIDX + 1)))
1753 do_nodes $list lctl set_param fail_loc=0
1754 sync # initiate all OST_DESTROYs from MDS to OST
1758 exhaust_precreations() {
1761 local FAILIDX=${3:-$OSTIDX}
1762 local ofacet=ost$((OSTIDX + 1))
1764 test_mkdir -p -c1 $DIR/$tdir
1765 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
1766 local mfacet=mds$((mdtidx + 1))
1767 echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
1769 local OST=$(ostname_from_index $OSTIDX)
1772 local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST)
1773 local last_id=$(do_facet $mfacet lctl get_param -n \
1774 osp.$mdtosc_proc1.prealloc_last_id)
1775 local next_id=$(do_facet $mfacet lctl get_param -n \
1776 osp.$mdtosc_proc1.prealloc_next_id)
1778 local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet)
1779 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1781 test_mkdir -p $DIR/$tdir/${OST}
1782 $LFS setstripe -i $OSTIDX -c 1 $DIR/$tdir/${OST}
1783 #define OBD_FAIL_OST_ENOSPC 0x215
1784 do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215
1785 echo "Creating to objid $last_id on ost $OST..."
1786 createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
1787 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1788 do_facet $ofacet lctl set_param fail_loc=$FAILLOC
1792 exhaust_all_precreations() {
1794 for (( i=0; i < OSTCOUNT; i++ )) ; do
1795 exhaust_precreations $i $1 -1
1800 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1801 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1802 remote_mds_nodsh && skip "remote MDS with nodsh"
1803 remote_ost_nodsh && skip "remote OST with nodsh"
1806 rm -f $DIR/$tdir/$tfile
1807 exhaust_precreations 0 0x80000215
1808 $LFS setstripe -c -1 $DIR/$tdir || error "setstripe failed"
1809 touch $DIR/$tdir/$tfile || error "touch failed"
1810 $LFS getstripe $DIR/$tdir/$tfile
1813 run_test 27n "create file with some full OSTs"
1816 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1817 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1818 remote_mds_nodsh && skip "remote MDS with nodsh"
1819 remote_ost_nodsh && skip "remote OST with nodsh"
1822 rm -f $DIR/$tdir/$tfile
1823 exhaust_all_precreations 0x215
1825 touch $DIR/$tdir/$tfile && error "able to create $DIR/$tdir/$tfile"
1830 run_test 27o "create file with all full OSTs (should error)"
1833 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1834 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1835 remote_mds_nodsh && skip "remote MDS with nodsh"
1836 remote_ost_nodsh && skip "remote OST with nodsh"
1839 rm -f $DIR/$tdir/$tfile
1840 test_mkdir $DIR/$tdir
1842 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1843 $TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed"
1844 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1846 exhaust_precreations 0 0x80000215
1847 echo foo >> $DIR/$tdir/$tfile || error "append failed"
1848 $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed"
1849 $LFS getstripe $DIR/$tdir/$tfile
1853 run_test 27p "append to a truncated file with some full OSTs"
1856 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1857 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1858 remote_mds_nodsh && skip "remote MDS with nodsh"
1859 remote_ost_nodsh && skip "remote OST with nodsh"
1862 rm -f $DIR/$tdir/$tfile
1864 test_mkdir $DIR/$tdir
1865 $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
1866 $TRUNCATE $DIR/$tdir/$tfile 80000000 ||
1867 error "truncate $DIR/$tdir/$tfile failed"
1868 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1870 exhaust_all_precreations 0x215
1872 echo foo >> $DIR/$tdir/$tfile && error "append succeeded"
1873 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat 2 failed"
1877 run_test 27q "append to truncated file with all OSTs full (should error)"
1880 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1881 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1882 remote_mds_nodsh && skip "remote MDS with nodsh"
1883 remote_ost_nodsh && skip "remote OST with nodsh"
1886 rm -f $DIR/$tdir/$tfile
1887 exhaust_precreations 0 0x80000215
1889 $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1893 run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
1895 test_27s() { # bug 10725
1896 test_mkdir $DIR/$tdir
1897 local stripe_size=$((4096 * 1024 * 1024)) # 2^32
1898 local stripe_count=0
1899 [ $OSTCOUNT -eq 1 ] || stripe_count=2
1900 $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir &&
1901 error "stripe width >= 2^32 succeeded" || true
1904 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
1906 test_27t() { # bug 10864
1911 $WLFS getstripe $tfile
1914 run_test 27t "check that utils parse path correctly"
1916 test_27u() { # bug 4900
1917 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1918 remote_mds_nodsh && skip "remote MDS with nodsh"
1921 local list=$(comma_list $(mdts_nodes))
1923 #define OBD_FAIL_MDS_OSC_PRECREATE 0x139
1924 do_nodes $list $LCTL set_param fail_loc=0x139
1925 test_mkdir -p $DIR/$tdir
1926 trap simple_cleanup_common EXIT
1927 createmany -o $DIR/$tdir/t- 1000
1928 do_nodes $list $LCTL set_param fail_loc=0
1930 TLOG=$TMP/$tfile.getstripe
1931 $LFS getstripe $DIR/$tdir > $TLOG
1932 OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
1933 unlinkmany $DIR/$tdir/t- 1000
1935 [[ $OBJS -gt 0 ]] &&
1936 error "$OBJS objects created on OST-0. See $TLOG" ||
1939 run_test 27u "skip object creation on OSC w/o objects"
1941 test_27v() { # bug 4900
1942 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1943 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1944 remote_mds_nodsh && skip "remote MDS with nodsh"
1945 remote_ost_nodsh && skip "remote OST with nodsh"
1947 exhaust_all_precreations 0x215
1950 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1952 touch $DIR/$tdir/$tfile
1953 #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
1955 for (( i=1; i < OSTCOUNT; i++ )); do
1956 do_facet ost$i lctl set_param fail_loc=0x705
1958 local START=`date +%s`
1959 createmany -o $DIR/$tdir/$tfile 32
1961 local FINISH=`date +%s`
1962 local TIMEOUT=`lctl get_param -n timeout`
1963 local PROCESS=$((FINISH - START))
1964 [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
1965 error "$FINISH - $START >= $TIMEOUT / 2"
1966 sleep $((TIMEOUT / 2 - PROCESS))
1969 run_test 27v "skip object creation on slow OST"
1971 test_27w() { # bug 10997
1972 test_mkdir $DIR/$tdir
1973 $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
1974 [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
1975 error "stripe size $size != 65536" || true
1976 [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
1977 error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
1979 run_test 27w "check $LFS setstripe -S and getstrip -d options"
1982 [[ $OSTCOUNT -lt 2 ]] &&
1983 skip_env "skipping multiple stripe count/offset test"
1985 test_mkdir $DIR/$tdir
1986 for i in $(seq 1 $OSTCOUNT); do
1988 $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i ||
1989 error "setstripe -c $i -i $offset failed"
1990 count=$($LFS getstripe -c $DIR/$tdir/f$i)
1991 index=$($LFS getstripe -i $DIR/$tdir/f$i)
1992 [ $count -ne $i ] && error "stripe count $count != $i" || true
1993 [ $index -ne $offset ] &&
1994 error "stripe offset $index != $offset" || true
1997 run_test 27wa "check $LFS setstripe -c -i options"
2000 remote_ost_nodsh && skip "remote OST with nodsh"
2001 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2002 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2004 OFFSET=$(($OSTCOUNT - 1))
2006 local OST=$(ostname_from_index $OSTIDX)
2008 test_mkdir $DIR/$tdir
2009 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file
2010 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1
2012 createmany -o $DIR/$tdir/$tfile $OSTCOUNT
2013 for i in $(seq 0 $OFFSET); do
2014 [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx |
2015 awk '{print $1}' | grep -w "$OSTIDX") ] &&
2016 error "OST0 was degraded but new created file still use it"
2018 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0
2020 run_test 27x "create files while OST0 is degraded"
2023 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2024 remote_mds_nodsh && skip "remote MDS with nodsh"
2025 remote_ost_nodsh && skip "remote OST with nodsh"
2026 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2028 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
2029 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
2030 osp.$mdtosc.prealloc_last_id)
2031 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
2032 osp.$mdtosc.prealloc_next_id)
2033 local fcount=$((last_id - next_id))
2034 [[ $fcount -eq 0 ]] && skip "not enough space on OST0"
2035 [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
2037 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
2038 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
2039 local OST_DEACTIVE_IDX=-1
2044 for OSC in $MDS_OSCS; do
2045 OST=$(osc_to_ost $OSC)
2046 OSTIDX=$(index_from_ostuuid $OST)
2047 if [ $OST_DEACTIVE_IDX == -1 ]; then
2048 OST_DEACTIVE_IDX=$OSTIDX
2050 if [ $OSTIDX != $OST_DEACTIVE_IDX ]; then
2051 echo $OSC "is Deactivated:"
2052 do_facet $SINGLEMDS lctl --device %$OSC deactivate
2056 OSTIDX=$(index_from_ostuuid $OST)
2057 test_mkdir $DIR/$tdir
2058 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
2060 for OSC in $MDS_OSCS; do
2061 OST=$(osc_to_ost $OSC)
2062 OSTIDX=$(index_from_ostuuid $OST)
2063 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
2064 echo $OST "is degraded:"
2065 do_facet ost$((OSTIDX+1)) lctl set_param -n \
2066 obdfilter.$OST.degraded=1
2071 createmany -o $DIR/$tdir/$tfile $fcount
2073 for OSC in $MDS_OSCS; do
2074 OST=$(osc_to_ost $OSC)
2075 OSTIDX=$(index_from_ostuuid $OST)
2076 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
2077 echo $OST "is recovered from degraded:"
2078 do_facet ost$((OSTIDX+1)) lctl set_param -n \
2079 obdfilter.$OST.degraded=0
2081 do_facet $SINGLEMDS lctl --device %$OSC activate
2085 # all osp devices get activated, hence -1 stripe count restored
2086 local stripe_count=0
2088 # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp
2089 # devices get activated.
2091 $LFS setstripe -c -1 $DIR/$tfile
2092 stripe_count=$($LFS getstripe -c $DIR/$tfile)
2094 [ $stripe_count -ne $OSTCOUNT ] &&
2095 error "Of $OSTCOUNT OSTs, only $stripe_count is available"
2098 run_test 27y "create files while OST0 is degraded and the rest inactive"
2104 lmm_count=$($LFS getstripe -c $1)
2105 lmm_seq=$($LFS getstripe -v $1 | awk '/lmm_seq/ { print $2 }')
2106 lmm_oid=$($LFS getstripe -v $1 | awk '/lmm_object_id/ { print $2 }')
2108 local old_ifs="$IFS"
2110 fid=($($LFS path2fid $1))
2113 log "FID seq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}"
2114 log "LOV seq $lmm_seq, oid $lmm_oid, count: $lmm_count"
2116 # compare lmm_seq and lu_fid->f_seq
2117 [ $lmm_seq = ${fid[1]} ] || { error "SEQ mismatch"; return 1; }
2118 # compare lmm_object_id and lu_fid->oid
2119 [ $lmm_oid = ${fid[2]} ] || { error "OID mismatch"; return 2; }
2121 # check the trusted.fid attribute of the OST objects of the file
2122 local have_obdidx=false
2124 $LFS getstripe $1 | while read obdidx oid hex seq; do
2125 # skip lines up to and including "obdidx"
2126 [ -z "$obdidx" ] && break
2127 [ "$obdidx" = "obdidx" ] && have_obdidx=true && continue
2128 $have_obdidx || continue
2130 local ost=$((obdidx + 1))
2131 local dev=$(ostdevname $ost)
2134 log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
2136 seq=$(echo $seq | sed -e "s/^0x//g")
2137 if [ $seq == 0 ] || [ $(facet_fstype ost$ost) == zfs ]; then
2138 oid_hex=$(echo $oid)
2140 oid_hex=$(echo $hex | sed -e "s/^0x//g")
2142 local obj_file="O/$seq/d$((oid %32))/$oid_hex"
2146 # Don't unmount/remount the OSTs if we don't need to do that.
2147 # LU-2577 changes filter_fid to be smaller, so debugfs needs
2148 # update too, until that use mount/ll_decode_filter_fid/mount.
2149 # Re-enable when debugfs will understand new filter_fid.
2151 if [ $(facet_fstype ost$ost) == ldiskfs ]; then
2152 ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
2153 $dev 2>/dev/null" | grep "parent=")
2155 if [ -z "$ff" ]; then
2157 mount_fstype ost$ost
2158 ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
2159 $(facet_mntpt ost$ost)/$obj_file)
2160 unmount_fstype ost$ost
2161 start ost$ost $dev $OST_MOUNT_OPTS
2165 [ -z "$ff" ] && error "$obj_file: no filter_fid info"
2167 echo "$ff" | sed -e 's#.*objid=#got: objid=#'
2169 # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
2170 # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
2172 # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \
2173 # stripe_size=1048576 component_id=1 component_start=0 \
2174 # component_end=33554432
2175 local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff)
2176 local ff_pseq=$(cut -d: -f1 <<<$ff_parent)
2177 local ff_poid=$(cut -d: -f2 <<<$ff_parent)
2179 if grep -q 'stripe=' <<<$ff; then
2180 ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff)
2182 # $LL_DECODE_FILTER_FID does not print "stripe="; look
2183 # into f_ver in this case. See comment on ff_parent.
2184 ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//')
2187 # compare lmm_seq and filter_fid->ff_parent.f_seq
2188 [ $ff_pseq = $lmm_seq ] ||
2189 error "FF parent SEQ $ff_pseq != $lmm_seq"
2190 # compare lmm_object_id and filter_fid->ff_parent.f_oid
2191 [ $ff_poid = $lmm_oid ] ||
2192 error "FF parent OID $ff_poid != $lmm_oid"
2193 (($ff_pstripe == $stripe_nr)) ||
2194 error "FF stripe $ff_pstripe != $stripe_nr"
2196 stripe_nr=$((stripe_nr + 1))
2197 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2199 if grep -q 'stripe_count=' <<<$ff; then
2200 local ff_scnt=$(sed -e 's/.*stripe_count=//' \
2201 -e 's/ .*//' <<<$ff)
2202 [ $lmm_count = $ff_scnt ] ||
2203 error "FF stripe count $lmm_count != $ff_scnt"
2209 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2210 remote_ost_nodsh && skip "remote OST with nodsh"
2212 test_mkdir $DIR/$tdir
2213 $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
2214 { error "setstripe -c -1 failed"; return 1; }
2215 # We need to send a write to every object to get parent FID info set.
2216 # This _should_ also work for setattr, but does not currently.
2217 # touch $DIR/$tdir/$tfile-1 ||
2218 dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
2219 { error "dd $tfile-1 failed"; return 2; }
2220 $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
2221 { error "setstripe -c -1 failed"; return 3; }
2222 dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
2223 { error "dd $tfile-2 failed"; return 4; }
2225 # make sure write RPCs have been sent to OSTs
2228 check_seq_oid $DIR/$tdir/$tfile-1 || return 5
2229 check_seq_oid $DIR/$tdir/$tfile-2 || return 6
2231 run_test 27z "check SEQ/OID on the MDT and OST filesystems"
2233 test_27A() { # b=19102
2234 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2236 save_layout_restore_at_exit $MOUNT
2237 $LFS setstripe -c 0 -i -1 -S 0 $MOUNT
2238 wait_update $HOSTNAME "$LFS getstripe -c $MOUNT | sed 's/ *//g'" "1" 20 ||
2239 error "stripe count $($LFS getstripe -c $MOUNT) != 1"
2240 local default_size=$($LFS getstripe -S $MOUNT)
2241 local default_offset=$($LFS getstripe -i $MOUNT)
2242 local dsize=$(do_facet $SINGLEMDS \
2243 "$LCTL get_param -n lod.$(facet_svc $SINGLEMDS)*.stripesize")
2244 [ $default_size -eq $dsize ] ||
2245 error "stripe size $default_size != $dsize"
2246 [ $default_offset -eq -1 ] ||
2247 error "stripe offset $default_offset != -1"
2249 run_test 27A "check filesystem-wide default LOV EA values"
2251 test_27B() { # LU-2523
2252 test_mkdir $DIR/$tdir
2253 rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
2255 # open f1 with O_LOV_DELAY_CREATE
2257 # call setstripe ioctl on open file descriptor for f1
2259 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:nB1c \
2263 # open f1 with O_LOV_DELAY_CREATE
2265 # call setstripe ioctl on open file descriptor for f1
2267 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:uB1c
2269 # Allow multiop to fail in imitation of NFS's busted semantics.
2272 run_test 27B "call setstripe on open unlinked file/rename victim"
2274 # 27C family tests full striping and overstriping
2275 test_27Ca() { #LU-2871
2276 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2284 test_mkdir $DIR/$tdir
2286 for i in $(seq 0 $((OSTCOUNT - 1))); do
2287 # set stripe across all OSTs starting from OST$i
2288 $LFS setstripe -i $i -c -1 $tfile$i
2289 # get striping information
2290 ost_idx=($($LFS getstripe $tfile$i |
2291 tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
2295 [ ${#ost_idx[@]} -eq $OSTCOUNT ] ||
2296 error "${#ost_idx[@]} != $OSTCOUNT"
2298 for index in $(seq 0 $((OSTCOUNT - 1))); do
2300 for j in $(echo ${ost_idx[@]}); do
2301 if [ $index -eq $j ]; then
2307 error "Can not find $index in ${ost_idx[@]}"
2311 run_test 27Ca "check full striping across all OSTs"
2314 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2315 skip "server does not support overstriping"
2316 [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2317 skip_env "too many osts, skipping"
2319 test_mkdir -p $DIR/$tdir
2320 local setcount=$(($OSTCOUNT * 2))
2321 [ $setcount -ge 160 ] || large_xattr_enabled ||
2322 skip_env "ea_inode feature disabled"
2324 $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
2325 error "setstripe failed"
2327 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2328 [ $count -eq $setcount ] ||
2329 error "stripe count $count, should be $setcount"
2331 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2332 error "overstriped should be set in pattern"
2334 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2337 run_test 27Cb "more stripes than OSTs with -C"
2340 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2341 skip "server does not support overstriping"
2342 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2344 test_mkdir -p $DIR/$tdir
2345 local setcount=$(($OSTCOUNT - 1))
2347 [ $setcount -ge 160 ] || large_xattr_enabled ||
2348 skip_env "ea_inode feature disabled"
2350 $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
2351 error "setstripe failed"
2353 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2354 [ $count -eq $setcount ] ||
2355 error "stripe count $count, should be $setcount"
2357 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" &&
2358 error "overstriped should not be set in pattern"
2360 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2363 run_test 27Cc "fewer stripes than OSTs does not set overstriping"
2366 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2367 skip "server does not support overstriping"
2368 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2369 large_xattr_enabled || skip_env "ea_inode feature disabled"
2371 test_mkdir -p $DIR/$tdir
2372 local setcount=$LOV_MAX_STRIPE_COUNT
2374 $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
2375 error "setstripe failed"
2377 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2378 [ $count -eq $setcount ] ||
2379 error "stripe count $count, should be $setcount"
2381 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2382 error "overstriped should be set in pattern"
2384 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2387 rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
2389 run_test 27Cd "test maximum stripe count"
2392 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2393 skip "server does not support overstriping"
2394 test_mkdir -p $DIR/$tdir
2396 pool_add $TESTNAME || error "Pool creation failed"
2397 pool_add_targets $TESTNAME 0 || error "pool_add_targets failed"
2401 $LFS setstripe -C $setcount -p "$TESTNAME" $DIR/$tdir/$tfile ||
2402 error "setstripe failed"
2404 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2405 [ $count -eq $setcount ] ||
2406 error "stripe count $count, should be $setcount"
2408 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2409 error "overstriped should be set in pattern"
2411 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2414 rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
2416 run_test 27Ce "test pool with overstriping"
2419 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2420 skip "server does not support overstriping"
2421 [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2422 skip_env "too many osts, skipping"
2424 test_mkdir -p $DIR/$tdir
2426 local setcount=$(($OSTCOUNT * 2))
2427 [ $setcount -ge 160 ] || large_xattr_enabled ||
2428 skip_env "ea_inode feature disabled"
2430 $LFS setstripe -C $setcount $DIR/$tdir/ ||
2431 error "setstripe failed"
2433 echo 1 > $DIR/$tdir/$tfile
2435 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2436 [ $count -eq $setcount ] ||
2437 error "stripe count $count, should be $setcount"
2439 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2440 error "overstriped should be set in pattern"
2442 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2445 rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
2447 run_test 27Cf "test default inheritance with overstriping"
2450 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2451 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2452 remote_mds_nodsh && skip "remote MDS with nodsh"
2454 local POOL=${POOL:-testpool}
2456 local last_ost=$(($OSTCOUNT - 1))
2458 local ost_list=$(seq $first_ost $ost_step $last_ost)
2459 local ost_range="$first_ost $last_ost $ost_step"
2461 if ! combined_mgs_mds ; then
2465 test_mkdir $DIR/$tdir
2466 pool_add $POOL || error "pool_add failed"
2467 pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
2470 [ $MDS1_VERSION -lt $(version_code 2.8.55) ] &&
2472 [ $MDS1_VERSION -lt $(version_code 2.9.55) ] ||
2473 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2474 skip27D+=" -s 30,31"
2475 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] &&
2477 [[ ! $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ||
2478 $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2479 skip27D+=" -s 32,33"
2480 llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
2481 error "llapi_layout_test failed"
2483 destroy_test_pools || error "destroy test pools failed"
2485 if ! combined_mgs_mds ; then
2489 run_test 27D "validate llapi_layout API"
2491 # Verify that default_easize is increased from its initial value after
2492 # accessing a widely striped file.
2494 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2495 [ $CLIENT_VERSION -lt $(version_code 2.5.57) ] &&
2496 skip "client does not have LU-3338 fix"
2498 # 72 bytes is the minimum space required to store striping
2499 # information for a file striped across one OST:
2500 # (sizeof(struct lov_user_md_v3) +
2501 # sizeof(struct lov_user_ost_data_v1))
2503 $LCTL set_param -n llite.*.default_easize $min_easize ||
2504 error "lctl set_param failed"
2505 local easize=$($LCTL get_param -n llite.*.default_easize)
2507 [ $easize -eq $min_easize ] ||
2508 error "failed to set default_easize"
2510 $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
2511 error "setstripe failed"
2512 # In order to ensure stat() call actually talks to MDS we need to
2513 # do something drastic to this file to shake off all lock, e.g.
2514 # rename it (kills lookup lock forcing cache cleaning)
2515 mv $DIR/$tfile $DIR/${tfile}-1
2516 ls -l $DIR/${tfile}-1
2519 easize=$($LCTL get_param -n llite.*.default_easize)
2521 [ $easize -gt $min_easize ] ||
2522 error "default_easize not updated"
2524 run_test 27E "check that default extended attribute size properly increases"
2526 test_27F() { # LU-5346/LU-7975
2527 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2528 [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs"
2529 [[ $MDS1_VERSION -lt $(version_code 2.8.51) ]] &&
2530 skip "Need MDS version at least 2.8.51"
2531 remote_ost_nodsh && skip "remote OST with nodsh"
2533 test_mkdir $DIR/$tdir
2535 $LFS setstripe -c 2 $DIR/$tdir
2537 # stop all OSTs to reproduce situation for LU-7975 ticket
2538 for num in $(seq $OSTCOUNT); do
2542 # open/create f0 with O_LOV_DELAY_CREATE
2543 # truncate f0 to a non-0 size
2545 multiop $DIR/$tdir/f0 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T1050000c
2547 $CHECKSTAT -s 1050000 $DIR/$tdir/f0 || error "checkstat failed"
2548 # open/write it again to force delayed layout creation
2549 cat /etc/hosts > $DIR/$tdir/f0 &
2553 for num in $(seq $OSTCOUNT); do
2554 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS ||
2555 error "ost$num failed to start"
2558 wait $catpid || error "cat failed"
2560 cmp /etc/hosts $DIR/$tdir/f0 || error "cmp failed"
2561 [[ $($LFS getstripe -c $DIR/$tdir/f0) == 2 ]] ||
2562 error "wrong stripecount"
2565 run_test 27F "Client resend delayed layout creation with non-zero size"
2567 test_27G() { #LU-10629
2568 [ $MDS1_VERSION -lt $(version_code 2.11.51) ] &&
2569 skip "Need MDS version at least 2.11.51"
2570 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2571 remote_mds_nodsh && skip "remote MDS with nodsh"
2572 local POOL=${POOL:-testpool}
2573 local ostrange="0 0 1"
2575 test_mkdir $DIR/$tdir
2576 pool_add $POOL || error "pool_add failed"
2577 pool_add_targets $POOL $ostrange || error "pool_add_targets failed"
2578 $LFS setstripe -p $POOL $DIR/$tdir
2580 local pool=$($LFS getstripe -p $DIR/$tdir)
2582 [ "$pool" = "$POOL" ] || error "Striping failed got '$pool' not '$POOL'"
2584 $LFS setstripe -d $DIR/$tdir
2586 pool=$($LFS getstripe -p $DIR/$tdir)
2590 [ -z "$pool" ] || error "'$pool' is not empty"
2592 run_test 27G "Clear OST pool from stripe"
2595 [[ $MDS1_VERSION -le $(version_code 2.11.54) ]] &&
2596 skip "Need MDS version newer than 2.11.54"
2597 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
2598 test_mkdir $DIR/$tdir
2599 $LFS setstripe -o 0 -o 2 $DIR/$tdir || error "setstripe failed"
2600 touch $DIR/$tdir/$tfile
2601 $LFS getstripe -c $DIR/$tdir/$tfile
2602 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
2603 error "two-stripe file doesn't have two stripes"
2605 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
2606 $LFS getstripe -y $DIR/$tdir/$tfile
2607 (( $($LFS getstripe -y $DIR/$tdir/$tfile |
2608 egrep -c "l_ost_idx: [02]$") == "2" )) ||
2609 error "expected l_ost_idx: [02]$ not matched"
2611 # make sure ost list has been cleared
2612 local stripesize=$($LFS getstripe -S $DIR/$tdir)
2613 $LFS setstripe -S $((stripesize * 4)) -i 1 \
2614 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
2616 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
2618 run_test 27H "Set specific OSTs stripe"
2621 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2622 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2623 local pool=$TESTNAME
2624 local ostrange="1 1 1"
2626 save_layout_restore_at_exit $MOUNT
2627 $LFS setstripe -c 2 -i 0 $MOUNT
2628 pool_add $pool || error "pool_add failed"
2629 pool_add_targets $pool $ostrange || "pool_add_targets failed"
2630 test_mkdir $DIR/$tdir
2631 $LFS setstripe -p $pool $DIR/$tdir
2632 $MULTIOP $DIR/$tdir/$tfile Oc || error "multiop failed"
2633 $LFS getstripe $DIR/$tdir/$tfile
2635 run_test 27I "check that root dir striping does not break parent dir one"
2638 [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.51) ]] &&
2639 skip "Need MDS version newer than 2.12.51"
2641 test_mkdir $DIR/$tdir
2642 local uuid1=$(cat /proc/sys/kernel/random/uuid)
2643 local uuid2=$(cat /proc/sys/kernel/random/uuid)
2645 # create foreign file (raw way)
2646 create_foreign_file -f $DIR/$tdir/$tfile -x "${uuid1}@${uuid2}" \
2647 -t 1 -F 0xda08 || error "create_foreign_file failed"
2649 # verify foreign file (raw way)
2650 parse_foreign_file -f $DIR/$tdir/$tfile |
2651 grep "lov_foreign_magic: 0x0BD70BD0" ||
2652 error "$DIR/$tdir/$tfile: invalid LOV EA foreign magic"
2653 parse_foreign_file -f $DIR/$tdir/$tfile | grep "lov_xattr_size: 89" ||
2654 error "$DIR/$tdir/$tfile: invalid LOV EA foreign size"
2655 parse_foreign_file -f $DIR/$tdir/$tfile |
2656 grep "lov_foreign_size: 73" ||
2657 error "$DIR/$tdir/$tfile: invalid LOV EA foreign size"
2658 parse_foreign_file -f $DIR/$tdir/$tfile |
2659 grep "lov_foreign_type: 1" ||
2660 error "$DIR/$tdir/$tfile: invalid LOV EA foreign type"
2661 parse_foreign_file -f $DIR/$tdir/$tfile |
2662 grep "lov_foreign_flags: 0x0000DA08" ||
2663 error "$DIR/$tdir/$tfile: invalid LOV EA foreign flags"
2664 local lov=$(parse_foreign_file -f $DIR/$tdir/$tfile |
2665 grep "lov_foreign_value: 0x" |
2666 sed -e 's/lov_foreign_value: 0x//')
2667 local lov2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160)
2668 [[ $lov = ${lov2// /} ]] ||
2669 error "$DIR/$tdir/$tfile: invalid LOV EA foreign value"
2671 # create foreign file (lfs + API)
2672 $LFS setstripe --foreign=daos --flags 0xda08 \
2673 -x "${uuid1}@${uuid2}" $DIR/$tdir/${tfile}2 ||
2674 error "$DIR/$tdir/${tfile}2: create failed"
2676 $LFS getstripe -v $DIR/$tdir/${tfile}2 |
2677 grep "lfm_magic:.*0x0BD70BD0" ||
2678 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign magic"
2679 # lfm_length is LOV EA size - sizeof(lfm_magic) - sizeof(lfm_length)
2680 $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_length:.*73" ||
2681 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign size"
2682 $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_type:.*daos" ||
2683 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign type"
2684 $LFS getstripe -v $DIR/$tdir/${tfile}2 |
2685 grep "lfm_flags:.*0x0000DA08" ||
2686 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign flags"
2687 $LFS getstripe $DIR/$tdir/${tfile}2 |
2688 grep "lfm_value:.*${uuid1}@${uuid2}" ||
2689 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign value"
2691 # modify striping should fail
2692 $LFS setstripe -c 2 $DIR/$tdir/$tfile &&
2693 error "$DIR/$tdir/$tfile: setstripe should fail"
2694 $LFS setstripe -c 2 $DIR/$tdir/${tfile}2 &&
2695 error "$DIR/$tdir/${tfile}2: setstripe should fail"
2698 cat $DIR/$tdir/$tfile && error "$DIR/$tdir/$tfile: read should fail"
2699 cat $DIR/$tdir/${tfile}2 &&
2700 error "$DIR/$tdir/${tfile}2: read should fail"
2701 cat /etc/passwd > $DIR/$tdir/$tfile &&
2702 error "$DIR/$tdir/$tfile: write should fail"
2703 cat /etc/passwd > $DIR/$tdir/${tfile}2 &&
2704 error "$DIR/$tdir/${tfile}2: write should fail"
2707 chmod 222 $DIR/$tdir/$tfile ||
2708 error "$DIR/$tdir/$tfile: chmod failed"
2709 chmod 222 $DIR/$tdir/${tfile}2 ||
2710 error "$DIR/$tdir/${tfile}2: chmod failed"
2713 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tfile ||
2714 error "$DIR/$tdir/$tfile: chown failed"
2715 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tfile}2 ||
2716 error "$DIR/$tdir/${tfile}2: chown failed"
2718 # rename should work
2719 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}.new ||
2720 error "$DIR/$tdir/$tfile: rename of foreign file has failed"
2721 mv $DIR/$tdir/${tfile}2 $DIR/$tdir/${tfile}2.new ||
2722 error "$DIR/$tdir/${tfile}2: rename of foreign file has failed"
2724 #remove foreign file
2725 rm $DIR/$tdir/${tfile}.new ||
2726 error "$DIR/$tdir/${tfile}.new: remove of foreign file has failed"
2727 rm $DIR/$tdir/${tfile}2.new ||
2728 error "$DIR/$tdir/${tfile}2.new: remove of foreign file has failed"
2730 run_test 27J "basic ops on file with foreign LOV"
2733 [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.49) ]] &&
2734 skip "Need MDS version newer than 2.12.49"
2736 test_mkdir $DIR/$tdir
2737 local uuid1=$(cat /proc/sys/kernel/random/uuid)
2738 local uuid2=$(cat /proc/sys/kernel/random/uuid)
2740 # create foreign dir (raw way)
2741 create_foreign_dir -d $DIR/$tdir/$tdir -x "${uuid1}@${uuid2}" -t 1 ||
2742 error "create_foreign_dir FAILED"
2744 # verify foreign dir (raw way)
2745 parse_foreign_dir -d $DIR/$tdir/$tdir |
2746 grep "lmv_foreign_magic:.*0xcd50cd0" ||
2747 error "$DIR/$tdir/$tfile: invalid LMV EA magic"
2748 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_xattr_size:.*89$" ||
2749 error "$DIR/$tdir/$tdir: invalid LMV EA size"
2750 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_type: 1$" ||
2751 error "$DIR/$tdir/$tdir: invalid LMV EA type"
2752 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_flags: 0$" ||
2753 error "$DIR/$tdir/$tdir: invalid LMV EA flags"
2754 local lmv=$(parse_foreign_dir -d $DIR/$tdir/$tdir |
2755 grep "lmv_foreign_value: 0x" |
2756 sed 's/lmv_foreign_value: 0x//')
2757 local lmv2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160 |
2759 [[ $lmv == $lmv2 ]] || error "$DIR/$tdir/$tdir: invalid LMV EA value"
2761 # create foreign dir (lfs + API)
2762 $LFS mkdir --foreign=daos --xattr="${uuid1}@${uuid2}" --flags=0xda05 \
2763 $DIR/$tdir/${tdir}2 ||
2764 error "$DIR/$tdir/${tdir}2: create failed"
2766 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
2767 grep "lfm_magic:.*0x0CD50CD0" ||
2768 error "$DIR/$tdir/${tdir}2: invalid LMV EA magic"
2769 # lfm_length is LMV EA size - sizeof(lfm_magic) - sizeof(lfm_length)
2770 # - sizeof(lfm_type) - sizeof(lfm_flags)
2771 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_length:.*73" ||
2772 error "$DIR/$tdir/${tdir}2: invalid LMV EA size"
2773 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_type:.*daos" ||
2774 error "$DIR/$tdir/${tdir}2: invalid LMV EA type"
2775 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
2776 grep "lfm_flags:.*0x0000DA05" ||
2777 error "$DIR/$tdir/${tdir}2: invalid LMV EA flags"
2778 $LFS getdirstripe $DIR/$tdir/${tdir}2 |
2779 grep "lfm_value.*${uuid1}@${uuid2}" ||
2780 error "$DIR/$tdir/${tdir}2: invalid LMV EA value"
2782 # file create in dir should fail
2783 touch $DIR/$tdir/$tdir/$tfile && "$DIR/$tdir: file create should fail"
2784 touch $DIR/$tdir/${tdir}2/$tfile &&
2785 "$DIR/${tdir}2: file create should fail"
2788 chmod 777 $DIR/$tdir/$tdir ||
2789 error "$DIR/$tdir: chmod failed"
2790 chmod 777 $DIR/$tdir/${tdir}2 ||
2791 error "$DIR/${tdir}2: chmod failed"
2794 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tdir ||
2795 error "$DIR/$tdir: chown failed"
2796 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tdir}2 ||
2797 error "$DIR/${tdir}2: chown failed"
2799 # rename should work
2800 mv $DIR/$tdir/$tdir $DIR/$tdir/${tdir}.new ||
2801 error "$DIR/$tdir/$tdir: rename of foreign dir has failed"
2802 mv $DIR/$tdir/${tdir}2 $DIR/$tdir/${tdir}2.new ||
2803 error "$DIR/$tdir/${tdir}2: rename of foreign dir has failed"
2806 rmdir $DIR/$tdir/${tdir}.new ||
2807 error "$DIR/$tdir/${tdir}.new: remove of foreign dir has failed"
2808 rmdir $DIR/$tdir/${tdir}2.new ||
2809 error "$DIR/$tdir/${tdir}2.new: remove of foreign dir has failed"
2811 run_test 27K "basic ops on dir with foreign LMV"
2814 remote_mds_nodsh && skip "remote MDS with nodsh"
2816 local POOL=${POOL:-$TESTNAME}
2818 if ! combined_mgs_mds ; then
2820 trap umount_mgs_client EXIT
2823 pool_add $POOL || error "pool_add failed"
2825 lfs pool_list $MOUNT | grep -Fx "${FSNAME}.${POOL}" ||
2826 error "pool_list does not contain ${FSNAME}.${POOL}:" \
2827 "$(lfs pool_list $MOUNT | grep -F "${POOL}")"
2829 run_test 27L "lfs pool_list gives correct pool name"
2831 # createtest also checks that device nodes are created and
2832 # then visible correctly (#2091)
2833 test_28() { # bug 2091
2835 $CREATETEST $DIR/d28/ct || error "createtest failed"
2837 run_test 28 "create/mknod/mkdir with bad file types ============"
2840 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2842 sync; sleep 1; sync # flush out any dirty pages from previous tests
2849 declare -i LOCKCOUNTORIG=0
2850 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2851 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
2853 [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
2855 declare -i LOCKUNUSEDCOUNTORIG=0
2856 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2857 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
2864 declare -i LOCKCOUNTCURRENT=0
2865 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2866 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
2869 declare -i LOCKUNUSEDCOUNTCURRENT=0
2870 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2871 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
2874 if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
2875 $LCTL set_param -n ldlm.dump_namespaces ""
2876 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
2877 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2878 log "dumped log to $TMP/test_29.dk (bug 5793)"
2881 if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
2882 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
2883 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2884 log "dumped log to $TMP/test_29.dk (bug 5793)"
2888 run_test 29 "IT_GETATTR regression ============================"
2890 test_30a() { # was test_30
2891 cp $(which ls) $DIR || cp /bin/ls $DIR
2892 $DIR/ls / || error "Can't execute binary from lustre"
2895 run_test 30a "execute binary from Lustre (execve) =============="
2898 cp `which ls` $DIR || cp /bin/ls $DIR
2900 $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
2903 run_test 30b "execute binary from Lustre as non-root ==========="
2905 test_30c() { # b=22376
2906 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2908 cp `which ls` $DIR || cp /bin/ls $DIR
2910 cancel_lru_locks mdc
2911 cancel_lru_locks osc
2912 $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
2915 run_test 30c "execute binary from Lustre without read perms ===="
2918 $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
2919 $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
2921 run_test 31a "open-unlink file =================================="
2924 touch $DIR/f31 || error "touch $DIR/f31 failed"
2925 ln $DIR/f31 $DIR/f31b || error "ln failed"
2926 $MULTIOP $DIR/f31b Ouc || error "multiop failed"
2927 $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
2929 run_test 31b "unlink file with multiple links while open ======="
2932 touch $DIR/f31 || error "touch $DIR/f31 failed"
2933 ln $DIR/f31 $DIR/f31c || error "ln failed"
2934 multiop_bg_pause $DIR/f31 O_uc ||
2935 error "multiop_bg_pause for $DIR/f31 failed"
2937 $MULTIOP $DIR/f31c Ouc
2938 kill -USR1 $MULTIPID
2941 run_test 31c "open-unlink file with multiple links ============="
2944 opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
2945 $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
2947 run_test 31d "remove of open directory ========================="
2949 test_31e() { # bug 2904
2950 openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
2952 run_test 31e "remove of open non-empty directory ==============="
2954 test_31f() { # bug 4554
2955 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2958 test_mkdir $DIR/d31f
2959 $LFS setstripe -S 1048576 -c 1 $DIR/d31f
2960 cp /etc/hosts $DIR/d31f
2962 $LFS getstripe $DIR/d31f/hosts
2963 multiop_bg_pause $DIR/d31f D_c || return 1
2966 rm -rv $DIR/d31f || error "first of $DIR/d31f"
2967 test_mkdir $DIR/d31f
2968 $LFS setstripe -S 1048576 -c 1 $DIR/d31f
2969 cp /etc/hosts $DIR/d31f
2971 $LFS getstripe $DIR/d31f/hosts
2972 multiop_bg_pause $DIR/d31f D_c || return 1
2975 kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
2976 wait $MULTIPID || error "first opendir $MULTIPID failed"
2980 kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
2981 wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
2984 run_test 31f "remove of open directory with open-unlink file ==="
2987 echo "-- cross directory link --"
2988 test_mkdir -c1 $DIR/${tdir}ga
2989 test_mkdir -c1 $DIR/${tdir}gb
2990 touch $DIR/${tdir}ga/f
2991 ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
2992 $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
2993 [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
2994 $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
2995 [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
2997 run_test 31g "cross directory link==============="
3000 echo "-- cross directory link --"
3001 test_mkdir -c1 $DIR/${tdir}
3002 test_mkdir -c1 $DIR/${tdir}/dir
3003 touch $DIR/${tdir}/f
3004 ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
3005 $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
3006 [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
3007 $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
3008 [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
3010 run_test 31h "cross directory link under child==============="
3013 echo "-- cross directory link --"
3014 test_mkdir -c1 $DIR/$tdir
3015 test_mkdir -c1 $DIR/$tdir/dir
3016 touch $DIR/$tdir/dir/f
3017 ln $DIR/$tdir/dir/f $DIR/$tdir/g
3018 $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
3019 [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
3020 $CHECKSTAT -t file $DIR/$tdir/g || error "target"
3021 [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
3023 run_test 31i "cross directory link under parent==============="
3026 test_mkdir -c1 -p $DIR/$tdir
3027 test_mkdir -c1 -p $DIR/$tdir/dir1
3028 ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
3029 link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
3030 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
3031 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
3034 run_test 31j "link for directory==============="
3037 test_mkdir -c1 -p $DIR/$tdir
3039 touch $DIR/$tdir/exist
3040 mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
3041 mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
3042 mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
3043 mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
3044 mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
3045 mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
3046 mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
3049 run_test 31k "link to file: the same, non-existing, dir==============="
3055 touch $DIR/d31m2/exist
3056 mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
3057 mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
3058 mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
3059 mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
3060 mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
3061 mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
3064 run_test 31m "link to file: the same, non-existing, dir==============="
3067 touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
3068 nlink=$(stat --format=%h $DIR/$tfile)
3069 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
3071 local cmd="exec $fd<$DIR/$tfile"
3074 trap "eval $cmd" EXIT
3075 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
3076 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
3077 rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
3078 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
3079 [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
3082 run_test 31n "check link count of unlinked file"
3085 local tempfile=$(mktemp $1_XXXXXX)
3086 mlink $tempfile $1 2> /dev/null &&
3087 echo "$BASHPID: link $tempfile to $1 succeeded"
3091 test_31o() { # LU-2901
3092 test_mkdir $DIR/$tdir
3093 for LOOP in $(seq 100); do
3094 rm -f $DIR/$tdir/$tfile*
3095 for THREAD in $(seq 8); do
3096 link_one $DIR/$tdir/$tfile.$LOOP &
3099 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
3100 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
3101 error "$LINKS duplicate links to $tfile.$LOOP" &&
3105 run_test 31o "duplicate hard links with same filename"
3108 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3110 test_mkdir $DIR/$tdir
3111 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3112 $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
3114 opendirunlink $DIR/$tdir/striped_dir/test1 ||
3115 error "open unlink test1 failed"
3116 opendirunlink $DIR/$tdir/striped_dir/test2 ||
3117 error "open unlink test2 failed"
3119 $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
3120 error "test1 still exists"
3121 $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
3122 error "test2 still exists"
3124 run_test 31p "remove of open striped directory"
3126 cleanup_test32_mount() {
3129 local loopdev=$(losetup -a | grep $EXT2_DEV | sed -ne 's/:.*$//p')
3130 $UMOUNT $DIR/$tdir/ext2-mountpoint || rc=$?
3131 losetup -d $loopdev || true
3137 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3139 echo "== more mountpoints and symlinks ================="
3140 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3141 trap cleanup_test32_mount EXIT
3142 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3143 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3144 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3145 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/.. ||
3146 error "$DIR/$tdir/ext2-mountpoint/.. not dir type"
3147 cleanup_test32_mount
3149 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
3152 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3154 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3155 trap cleanup_test32_mount EXIT
3156 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3157 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3158 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3159 ls -al $DIR/$tdir/ext2-mountpoint/.. ||
3160 error "Can't list $DIR/$tdir/ext2-mountpoint/.."
3161 cleanup_test32_mount
3163 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
3166 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3168 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3169 trap cleanup_test32_mount EXIT
3170 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3171 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3172 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3173 test_mkdir -p $DIR/$tdir/d2/test_dir
3174 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
3175 error "$DIR/$tdir/ext2-mountpoint/../d2/test_dir not dir type"
3176 cleanup_test32_mount
3178 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
3181 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3183 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3184 trap cleanup_test32_mount EXIT
3185 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3186 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3187 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3188 test_mkdir -p $DIR/$tdir/d2/test_dir
3189 ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
3190 error "Can't list $DIR/$tdir/ext2-mountpoint/../d2/test_dir"
3191 cleanup_test32_mount
3193 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
3197 test_mkdir -p $DIR/$tdir/tmp
3198 local tmp_dir=$DIR/$tdir/tmp
3199 ln -s $DIR/$tdir $tmp_dir/symlink11
3200 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
3201 $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
3202 $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
3204 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
3208 test_mkdir -p $DIR/$tdir/tmp
3209 local tmp_dir=$DIR/$tdir/tmp
3210 ln -s $DIR/$tdir $tmp_dir/symlink11
3211 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
3212 ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
3213 ls $DIR/$tdir/symlink01 || error "symlink01 bad"
3215 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
3218 local tmp_dir=$DIR/$tdir/tmp
3219 test_mkdir -p $tmp_dir
3220 test_mkdir $DIR/${tdir}2
3221 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
3222 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
3223 $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
3224 $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
3225 $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
3226 $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
3228 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
3231 rm -fr $DIR/$tdir $DIR/${tdir}2
3232 tmp_dir=$DIR/$tdir/tmp
3233 test_mkdir -p $tmp_dir
3234 test_mkdir $DIR/${tdir}2
3235 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
3236 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
3237 ls $tmp_dir/symlink12 || error "listing symlink12"
3238 ls $DIR/$tdir/symlink02 || error "listing symlink02"
3240 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
3243 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3245 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3246 trap cleanup_test32_mount EXIT
3247 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3248 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3249 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3250 touch $DIR/$tdir/test_file
3251 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../test_file ||
3252 error "$DIR/$tdir/ext2-mountpoint/../test_file not file type"
3253 cleanup_test32_mount
3255 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
3258 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3260 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3261 trap cleanup_test32_mount EXIT
3262 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3263 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3264 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3265 touch $DIR/$tdir/test_file
3266 cat $DIR/$tdir/ext2-mountpoint/../test_file ||
3267 error "Can't open $DIR/$tdir/ext2-mountpoint/../test_file"
3268 cleanup_test32_mount
3270 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
3273 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3276 trap cleanup_test32_mount EXIT
3277 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3278 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3279 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3280 test_mkdir -p $DIR/$tdir/d2
3281 touch $DIR/$tdir/d2/test_file || error "touch failed"
3282 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
3283 error "$DIR/$tdir/ext2-mountpoint/../d2/test_file not file type"
3284 cleanup_test32_mount
3286 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
3289 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3292 trap cleanup_test32_mount EXIT
3293 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3294 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3295 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3296 test_mkdir -p $DIR/$tdir/d2
3297 touch $DIR/$tdir/d2/test_file || error "touch failed"
3298 cat $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
3299 error "Can't open $DIR/$tdir/ext2-mountpoint/../d2/test_file"
3300 cleanup_test32_mount
3302 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
3306 test_mkdir -p $DIR/d32m/tmp
3307 TMP_DIR=$DIR/d32m/tmp
3308 ln -s $DIR $TMP_DIR/symlink11
3309 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3310 $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 ||
3311 error "symlink11 not a link"
3312 $CHECKSTAT -t link $DIR/d32m/symlink01 ||
3313 error "symlink01 not a link"
3315 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
3319 test_mkdir -p $DIR/d32n/tmp
3320 TMP_DIR=$DIR/d32n/tmp
3321 ln -s $DIR $TMP_DIR/symlink11
3322 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3323 ls -l $DIR/d32n/tmp/symlink11 || error "listing symlink11"
3324 ls -l $DIR/d32n/symlink01 || error "listing symlink01"
3326 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
3330 test_mkdir -p $DIR/d32o/tmp
3331 TMP_DIR=$DIR/d32o/tmp
3332 ln -s $DIR/$tfile $TMP_DIR/symlink12
3333 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3334 $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 ||
3335 error "symlink12 not a link"
3336 $CHECKSTAT -t link $DIR/d32o/symlink02 || error "symlink02 not a link"
3337 $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 ||
3338 error "$DIR/d32o/tmp/symlink12 not file type"
3339 $CHECKSTAT -t file -f $DIR/d32o/symlink02 ||
3340 error "$DIR/d32o/symlink02 not file type"
3342 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
3352 test_mkdir -p $DIR/d32p/tmp
3354 TMP_DIR=$DIR/d32p/tmp
3356 ln -s $DIR/$tfile $TMP_DIR/symlink12
3358 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3360 cat $DIR/d32p/tmp/symlink12 ||
3361 error "Can't open $DIR/d32p/tmp/symlink12"
3363 cat $DIR/d32p/symlink02 || error "Can't open $DIR/d32p/symlink02"
3366 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
3369 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3371 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3372 trap cleanup_test32_mount EXIT
3373 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3374 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3375 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3376 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3377 ls $DIR/$tdir/ext2-mountpoint | grep "\<under_the_mount\>" && error
3378 cleanup_test32_mount
3380 run_test 32q "stat follows mountpoints in Lustre (should return error)"
3383 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3385 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3386 trap cleanup_test32_mount EXIT
3387 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3388 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3389 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3390 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3391 ls $DIR/$tdir/ext2-mountpoint | grep -q under_the_mount && error || true
3392 cleanup_test32_mount
3394 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
3399 chmod 444 $DIR/$tfile
3400 chown $RUNAS_ID $DIR/$tfile
3402 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3405 run_test 33aa "write file with mode 444 (should return error)"
3409 test_mkdir $DIR/$tdir
3410 chown $RUNAS_ID $DIR/$tdir
3411 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
3412 error "$RUNAS create $tdir/$tfile failed"
3413 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
3414 error "open RDWR" || true
3416 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
3420 test_mkdir $DIR/$tdir
3421 chown $RUNAS_ID $DIR/$tdir
3422 $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
3424 run_test 33b "test open file with malformed flags (No panic)"
3427 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3428 remote_ost_nodsh && skip "remote OST with nodsh"
3437 test_mkdir $DIR/$tdir
3438 # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
3441 for ostnum in $(seq $OSTCOUNT); do
3442 # test-framework's OST numbering is one-based, while Lustre's
3444 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3445 # Parsing llobdstat's output sucks; we could grep the /proc
3446 # path, but that's likely to not be as portable as using the
3447 # llobdstat utility. So we parse lctl output instead.
3448 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3449 obdfilter/$ostname/stats |
3450 awk '/^write_bytes/ {print $7}' )
3451 echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes"
3452 if (( ${write_bytes:-0} > 0 ))
3459 $all_zeros || return 0
3462 echo foo > $DIR/$tdir/bar
3466 # Total up write_bytes after writing. We'd better find non-zeros.
3467 for ostnum in $(seq $OSTCOUNT); do
3468 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3469 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3470 obdfilter/$ostname/stats |
3471 awk '/^write_bytes/ {print $7}' )
3472 echo "write_bytes@$OSTnum/$ostname=$write_bytes"
3473 if (( ${write_bytes:-0} > 0 ))
3482 for ostnum in $(seq $OSTCOUNT); do
3483 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3484 echo "Check that write_bytes is present in obdfilter/*/stats:"
3485 do_facet ost$ostnum lctl get_param -n \
3486 obdfilter/$ostname/stats
3488 error "OST not keeping write_bytes stats (b22312)"
3491 run_test 33c "test llobdstat and write_bytes"
3494 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3495 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3498 local remote_dir=$DIR/$tdir/remote_dir
3500 test_mkdir $DIR/$tdir
3501 $LFS mkdir -i $MDTIDX $remote_dir ||
3502 error "create remote directory failed"
3504 touch $remote_dir/$tfile
3505 chmod 444 $remote_dir/$tfile
3506 chown $RUNAS_ID $remote_dir/$tfile
3508 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3510 chown $RUNAS_ID $remote_dir
3511 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
3512 error "create" || true
3513 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
3514 error "open RDWR" || true
3515 $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
3517 run_test 33d "openfile with 444 modes and malformed flags under remote dir"
3520 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3524 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3525 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3526 mkdir $DIR/$tdir/local_dir
3528 local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3529 local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3530 local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3532 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3533 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
3535 rmdir $DIR/$tdir/* || error "rmdir failed"
3538 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3539 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3540 mkdir $DIR/$tdir/local_dir
3542 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3543 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3544 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3546 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3547 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
3549 rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
3552 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3553 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3554 mkdir $DIR/$tdir/local_dir
3556 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3557 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3558 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3560 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3561 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
3563 run_test 33e "mkdir and striped directory should have same mode"
3567 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
3571 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3572 remote_mds_nodsh && skip "remote MDS with nodsh"
3575 chmod go+rwx $DIR/$tdir
3576 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
3577 trap cleanup_33f EXIT
3579 $RUNAS lfs mkdir -i 0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
3580 error "cannot create striped directory"
3582 $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
3583 error "cannot create files in striped directory"
3585 $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
3586 error "cannot remove files in striped directory"
3588 $RUNAS rmdir $DIR/$tdir/striped_dir ||
3589 error "cannot remove striped directory"
3593 run_test 33f "nonroot user can create, access, and remove a striped directory"
3596 mkdir -p $DIR/$tdir/dir2
3598 local err=$($RUNAS mkdir $DIR/$tdir/dir2 2>&1)
3600 [[ $err =~ "exists" ]] || error "Not exists error"
3602 run_test 33g "nonroot user create already existing root created file"
3604 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
3607 $MCREATE $DIR/f34 || error "mcreate failed"
3608 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" ||
3609 error "getstripe failed"
3610 $TRUNCATE $DIR/f34 $TEST_34_SIZE || error "truncate failed"
3611 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" ||
3612 error "getstripe failed"
3613 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3614 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3616 run_test 34a "truncate file that has not been opened ==========="
3619 [ ! -f $DIR/f34 ] && test_34a
3620 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3621 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3622 $OPENFILE -f O_RDONLY $DIR/f34
3623 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" ||
3624 error "getstripe failed"
3625 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3626 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3628 run_test 34b "O_RDONLY opening file doesn't create objects ====="
3631 [ ! -f $DIR/f34 ] && test_34a
3632 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3633 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3634 $OPENFILE -f O_RDWR $DIR/f34
3635 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" &&
3636 error "$LFS getstripe failed"
3637 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3638 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3640 run_test 34c "O_RDWR opening file-with-size works =============="
3643 [ ! -f $DIR/f34 ] && test_34a
3644 dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 ||
3646 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3647 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3650 run_test 34d "write to sparse file ============================="
3654 $MCREATE $DIR/f34e || error "mcreate failed"
3655 $TRUNCATE $DIR/f34e 1000 || error "truncate failed"
3656 $CHECKSTAT -s 1000 $DIR/f34e ||
3657 error "Size of $DIR/f34e not equal to 1000 bytes"
3658 $OPENFILE -f O_RDWR $DIR/f34e
3659 $CHECKSTAT -s 1000 $DIR/f34e ||
3660 error "Size of $DIR/f34e not equal to 1000 bytes"
3662 run_test 34e "create objects, some with size and some without =="
3664 test_34f() { # bug 6242, 6243
3665 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3669 $MCREATE $DIR/f34f || error "mcreate failed"
3670 $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
3671 dd if=$DIR/f34f of=$TMP/f34f
3672 $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
3673 dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
3674 cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
3675 cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
3676 rm $TMP/f34f $TMP/f34fzero $DIR/f34f
3678 run_test 34f "read from a file with no objects until EOF ======="
3681 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3683 dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE ||
3685 $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error "truncate failed"
3686 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3687 error "Size of $DIR/$tfile not equal to $((TEST_34_SIZE / 2))"
3688 cancel_lru_locks osc
3689 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3690 error "wrong size after lock cancel"
3692 $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error "truncate failed"
3693 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3694 error "expanding truncate failed"
3695 cancel_lru_locks osc
3696 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3697 error "wrong expanded size after lock cancel"
3699 run_test 34g "truncate long file ==============================="
3702 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3707 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error "dd failed"
3708 sync # Flush the cache so that multiop below does not block on cache
3709 # flush when getting the group lock
3710 $MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
3713 # Since just timed wait is not good enough, let's do a sync write
3714 # that way we are sure enough time for a roundtrip + processing
3715 # passed + 2 seconds of extra margin.
3716 dd if=/dev/zero of=$DIR/${tfile}-1 bs=$PAGE_SIZE oflag=direct count=1
3720 if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then
3721 error "Multiop blocked on ftruncate, pid=$MULTIPID"
3725 local nsz=`stat -c %s $DIR/$tfile`
3726 [[ $nsz == $sz ]] || error "New size wrong $nsz != $sz"
3728 run_test 34h "ftruncate file under grouplock should not block"
3731 cp /bin/sh $DIR/f35a
3733 chown $RUNAS_ID $DIR/f35a
3734 $RUNAS $DIR/f35a && error || true
3737 run_test 35a "exec file with mode 444 (should return and not leak)"
3741 utime $DIR/f36 || error "utime failed for MDS"
3743 run_test 36a "MDS utime check (mknod, utime)"
3747 utime $DIR/f36 || error "utime failed for OST"
3749 run_test 36b "OST utime check (open, utime)"
3754 chown $RUNAS_ID $DIR/d36
3755 $RUNAS utime $DIR/d36/f36 || error "utime failed for MDS as non-root"
3757 run_test 36c "non-root MDS utime check (mknod, utime)"
3760 [ ! -d $DIR/d36 ] && test_36c
3761 echo "" > $DIR/d36/f36
3762 $RUNAS utime $DIR/d36/f36 || error "utime failed for OST as non-root"
3764 run_test 36d "non-root OST utime check (open, utime)"
3767 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping"
3769 test_mkdir $DIR/$tdir
3770 touch $DIR/$tdir/$tfile
3771 $RUNAS utime $DIR/$tdir/$tfile &&
3772 error "utime worked, expected failure" || true
3774 run_test 36e "utime on non-owned file (should return error)"
3778 local LANG_SAVE=$LANG
3779 local LC_LANG_SAVE=$LC_LANG
3780 export LANG=C LC_LANG=C # for date language
3782 DATESTR="Dec 20 2000"
3783 test_mkdir $DIR/$tdir
3784 lctl set_param fail_loc=$fl
3786 cp /etc/hosts $DIR/$tdir/$tfile
3787 sync & # write RPC generated with "current" inode timestamp, but delayed
3789 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
3790 LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
3791 cancel_lru_locks $OSC
3792 LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object
3794 [ "$LS_BEFORE" != "$LS_AFTER" ] && \
3795 echo "BEFORE: $LS_BEFORE" && \
3796 echo "AFTER : $LS_AFTER" && \
3797 echo "WANT : $DATESTR" && \
3798 error "$DIR/$tdir/$tfile timestamps changed" || true
3800 export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE
3804 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3806 #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
3807 subr_36fh "0x80000214"
3809 run_test 36f "utime on file racing with OST BRW write =========="
3812 remote_ost_nodsh && skip "remote OST with nodsh"
3813 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3814 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
3815 skip "Need MDS version at least 2.12.51"
3820 local tgt="obdfilter"
3822 [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1"
3824 test_mkdir $DIR/$tdir
3825 fmd_max_age=$(do_facet $facet \
3826 "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \
3829 echo "FMD max age: ${fmd_max_age}s"
3830 touch $DIR/$tdir/$tfile
3831 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3832 gawk '{cnt=cnt+$1} END{print cnt}')
3833 echo "FMD before: $fmd"
3835 error "FMD wasn't create by touch"
3836 sleep $((fmd_max_age + 12))
3837 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3838 gawk '{cnt=cnt+$1} END{print cnt}')
3839 echo "FMD after: $fmd"
3841 error "FMD wasn't expired by ping"
3843 run_test 36g "FMD cache expiry ====================="
3846 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3848 #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227
3849 subr_36fh "0x80000227"
3851 run_test 36h "utime on file racing with OST BRW write =========="
3854 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3856 test_mkdir $DIR/$tdir
3857 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
3859 local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
3860 local new_mtime=$((mtime + 200))
3862 #change Modify time of striped dir
3863 touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
3864 error "change mtime failed"
3866 local got=$(stat -c%Y $DIR/$tdir/striped_dir)
3868 [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
3870 run_test 36i "change mtime on striped directory"
3872 # test_37 - duplicate with tests 32q 32r
3875 local file=$DIR/$tfile
3877 openfile -f O_DIRECTORY $file
3880 [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true
3881 [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)"
3883 run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ==="
3885 test_39a() { # was test_39
3887 touch $DIR/${tfile}2
3888 # ls -l $DIR/$tfile $DIR/${tfile}2
3889 # ls -lu $DIR/$tfile $DIR/${tfile}2
3890 # ls -lc $DIR/$tfile $DIR/${tfile}2
3892 $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
3893 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
3895 ls -l --full-time $DIR/$tfile $DIR/${tfile}2
3897 ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
3899 ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
3900 error "O_TRUNC didn't change timestamps"
3903 run_test 39a "mtime changed on create"
3906 test_mkdir -c1 $DIR/$tdir
3907 cp -p /etc/passwd $DIR/$tdir/fopen
3908 cp -p /etc/passwd $DIR/$tdir/flink
3909 cp -p /etc/passwd $DIR/$tdir/funlink
3910 cp -p /etc/passwd $DIR/$tdir/frename
3911 ln $DIR/$tdir/funlink $DIR/$tdir/funlink2
3914 echo "aaaaaa" >> $DIR/$tdir/fopen
3915 echo "aaaaaa" >> $DIR/$tdir/flink
3916 echo "aaaaaa" >> $DIR/$tdir/funlink
3917 echo "aaaaaa" >> $DIR/$tdir/frename
3919 local open_new=`stat -c %Y $DIR/$tdir/fopen`
3920 local link_new=`stat -c %Y $DIR/$tdir/flink`
3921 local unlink_new=`stat -c %Y $DIR/$tdir/funlink`
3922 local rename_new=`stat -c %Y $DIR/$tdir/frename`
3924 cat $DIR/$tdir/fopen > /dev/null
3925 ln $DIR/$tdir/flink $DIR/$tdir/flink2
3926 rm -f $DIR/$tdir/funlink2
3927 mv -f $DIR/$tdir/frename $DIR/$tdir/frename2
3929 for (( i=0; i < 2; i++ )) ; do
3930 local open_new2=`stat -c %Y $DIR/$tdir/fopen`
3931 local link_new2=`stat -c %Y $DIR/$tdir/flink`
3932 local unlink_new2=`stat -c %Y $DIR/$tdir/funlink`
3933 local rename_new2=`stat -c %Y $DIR/$tdir/frename2`
3935 [ $open_new2 -eq $open_new ] || error "open file reverses mtime"
3936 [ $link_new2 -eq $link_new ] || error "link file reverses mtime"
3937 [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime"
3938 [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime"
3940 cancel_lru_locks $OSC
3941 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3944 run_test 39b "mtime change on open, link, unlink, rename ======"
3946 # this should be set to past
3947 TEST_39_MTIME=`date -d "1 year ago" +%s`
3953 local mtime0=`stat -c %Y $DIR1/$tfile`
3955 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3956 local mtime1=`stat -c %Y $DIR1/$tfile`
3957 [ "$mtime1" = $TEST_39_MTIME ] || \
3958 error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME"
3961 echo hello >> $DIR1/$tfile
3963 local mtime2=`stat -c %Y $DIR1/$tfile`
3964 [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \
3965 error "mtime is not updated on write: $d1 <= $mtime2 <= $d2"
3967 mv $DIR1/$tfile $DIR1/$tfile-1
3969 for (( i=0; i < 2; i++ )) ; do
3970 local mtime3=`stat -c %Y $DIR1/$tfile-1`
3971 [ "$mtime2" = "$mtime3" ] || \
3972 error "mtime ($mtime2) changed (to $mtime3) on rename"
3974 cancel_lru_locks $OSC
3975 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3978 run_test 39c "mtime change on rename ==========================="
3982 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3985 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3987 for (( i=0; i < 2; i++ )) ; do
3988 local mtime=`stat -c %Y $DIR1/$tfile`
3989 [ $mtime = $TEST_39_MTIME ] || \
3990 error "mtime($mtime) is not set to $TEST_39_MTIME"
3992 cancel_lru_locks $OSC
3993 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3996 run_test 39d "create, utime, stat =============================="
4000 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4003 local mtime1=`stat -c %Y $DIR1/$tfile`
4005 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4007 for (( i=0; i < 2; i++ )) ; do
4008 local mtime2=`stat -c %Y $DIR1/$tfile`
4009 [ $mtime2 = $TEST_39_MTIME ] || \
4010 error "mtime($mtime2) is not set to $TEST_39_MTIME"
4012 cancel_lru_locks $OSC
4013 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4016 run_test 39e "create, stat, utime, stat ========================"
4020 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4023 mtime1=`stat -c %Y $DIR1/$tfile`
4026 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4028 for (( i=0; i < 2; i++ )) ; do
4029 local mtime2=`stat -c %Y $DIR1/$tfile`
4030 [ $mtime2 = $TEST_39_MTIME ] || \
4031 error "mtime($mtime2) is not set to $TEST_39_MTIME"
4033 cancel_lru_locks $OSC
4034 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4037 run_test 39f "create, stat, sleep, utime, stat ================="
4041 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4043 echo hello >> $DIR1/$tfile
4044 local mtime1=`stat -c %Y $DIR1/$tfile`
4047 chmod o+r $DIR1/$tfile
4049 for (( i=0; i < 2; i++ )) ; do
4050 local mtime2=`stat -c %Y $DIR1/$tfile`
4051 [ "$mtime1" = "$mtime2" ] || \
4052 error "lost mtime: $mtime2, should be $mtime1"
4054 cancel_lru_locks $OSC
4055 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4058 run_test 39g "write, chmod, stat ==============================="
4062 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4068 echo hello >> $DIR1/$tfile
4069 local mtime1=`stat -c %Y $DIR1/$tfile`
4071 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4073 if [ "$d1" != "$d2" ]; then
4074 echo "write and touch not within one second"
4076 for (( i=0; i < 2; i++ )) ; do
4077 local mtime2=`stat -c %Y $DIR1/$tfile`
4078 [ "$mtime2" = $TEST_39_MTIME ] || \
4079 error "lost mtime: $mtime2, should be $TEST_39_MTIME"
4081 cancel_lru_locks $OSC
4082 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4086 run_test 39h "write, utime within one second, stat ============="
4089 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4094 echo hello >> $DIR1/$tfile
4095 local mtime1=`stat -c %Y $DIR1/$tfile`
4097 mv $DIR1/$tfile $DIR1/$tfile-1
4099 for (( i=0; i < 2; i++ )) ; do
4100 local mtime2=`stat -c %Y $DIR1/$tfile-1`
4102 [ "$mtime1" = "$mtime2" ] || \
4103 error "lost mtime: $mtime2, should be $mtime1"
4105 cancel_lru_locks $OSC
4106 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4109 run_test 39i "write, rename, stat =============================="
4112 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4114 start_full_debug_logging
4118 #define OBD_FAIL_OSC_DELAY_SETTIME 0x412
4119 lctl set_param fail_loc=0x80000412
4120 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c ||
4121 error "multiop failed"
4123 local mtime1=`stat -c %Y $DIR1/$tfile`
4125 mv $DIR1/$tfile $DIR1/$tfile-1
4127 kill -USR1 $multipid
4128 wait $multipid || error "multiop close failed"
4130 for (( i=0; i < 2; i++ )) ; do
4131 local mtime2=`stat -c %Y $DIR1/$tfile-1`
4132 [ "$mtime1" = "$mtime2" ] ||
4133 error "mtime is lost on close: $mtime2, " \
4136 cancel_lru_locks $OSC
4137 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4139 lctl set_param fail_loc=0
4140 stop_full_debug_logging
4142 run_test 39j "write, rename, close, stat ======================="
4145 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4150 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed"
4152 local mtime1=`stat -c %Y $DIR1/$tfile`
4154 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4156 kill -USR1 $multipid
4157 wait $multipid || error "multiop close failed"
4159 for (( i=0; i < 2; i++ )) ; do
4160 local mtime2=`stat -c %Y $DIR1/$tfile`
4162 [ "$mtime2" = $TEST_39_MTIME ] || \
4163 error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
4165 cancel_lru_locks osc
4166 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4169 run_test 39k "write, utime, close, stat ========================"
4171 # this should be set to future
4172 TEST_39_ATIME=`date -d "1 year" +%s`
4175 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4176 remote_mds_nodsh && skip "remote MDS with nodsh"
4178 local atime_diff=$(do_facet $SINGLEMDS \
4179 lctl get_param -n mdd.*MDT0000*.atime_diff)
4183 # test setting directory atime to future
4184 touch -a -d @$TEST_39_ATIME $DIR/$tdir
4185 local atime=$(stat -c %X $DIR/$tdir)
4186 [ "$atime" = $TEST_39_ATIME ] ||
4187 error "atime is not set to future: $atime, $TEST_39_ATIME"
4189 # test setting directory atime from future to now
4190 local now=$(date +%s)
4191 touch -a -d @$now $DIR/$tdir
4193 atime=$(stat -c %X $DIR/$tdir)
4194 [ "$atime" -eq "$now" ] ||
4195 error "atime is not updated from future: $atime, $now"
4197 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=2
4200 # test setting directory atime when now > dir atime + atime_diff
4201 local d1=$(date +%s)
4203 local d2=$(date +%s)
4204 cancel_lru_locks mdc
4205 atime=$(stat -c %X $DIR/$tdir)
4206 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
4207 error "atime is not updated : $atime, should be $d2"
4209 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=60
4212 # test not setting directory atime when now < dir atime + atime_diff
4214 cancel_lru_locks mdc
4215 atime=$(stat -c %X $DIR/$tdir)
4216 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
4217 error "atime is updated to $atime, should remain $d1<atime<$d2"
4219 do_facet $SINGLEMDS \
4220 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
4222 run_test 39l "directory atime update ==========================="
4225 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4229 local far_past_mtime=$(date -d "May 29 1953" +%s)
4230 local far_past_atime=$(date -d "Dec 17 1903" +%s)
4232 touch -m -d @$far_past_mtime $DIR1/$tfile
4233 touch -a -d @$far_past_atime $DIR1/$tfile
4235 for (( i=0; i < 2; i++ )) ; do
4236 local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
4237 [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
4238 error "atime or mtime set incorrectly"
4240 cancel_lru_locks $OSC
4241 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4244 run_test 39m "test atime and mtime before 1970"
4246 test_39n() { # LU-3832
4247 remote_mds_nodsh && skip "remote MDS with nodsh"
4249 local atime_diff=$(do_facet $SINGLEMDS \
4250 lctl get_param -n mdd.*MDT0000*.atime_diff)
4255 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
4258 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
4259 atime0=$(stat -c %X $DIR/$tfile)
4262 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
4263 atime1=$(stat -c %X $DIR/$tfile)
4266 cancel_lru_locks mdc
4267 cancel_lru_locks osc
4268 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
4269 atime2=$(stat -c %X $DIR/$tfile)
4271 do_facet $SINGLEMDS \
4272 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
4274 [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
4275 [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
4277 run_test 39n "check that O_NOATIME is honored"
4280 TESTDIR=$DIR/$tdir/$tfile
4281 [ -e $TESTDIR ] && rm -rf $TESTDIR
4288 links2=$(stat -c %h .)
4289 [ $(($links1 + 2)) != $links2 ] &&
4290 error "wrong links count $(($links1 + 2)) != $links2"
4292 links3=$(stat -c %h .)
4293 [ $(($links1 + 1)) != $links3 ] &&
4294 error "wrong links count $links1 != $links3"
4297 run_test 39o "directory cached attributes updated after create"
4300 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
4303 TESTDIR=$DIR/$tdir/$tdir
4304 [ -e $TESTDIR ] && rm -rf $TESTDIR
4305 test_mkdir -p $TESTDIR
4309 test_mkdir -i $MDTIDX $TESTDIR/remote_dir1
4310 test_mkdir -i $MDTIDX $TESTDIR/remote_dir2
4312 links2=$(stat -c %h .)
4313 [ $(($links1 + 2)) != $links2 ] &&
4314 error "wrong links count $(($links1 + 2)) != $links2"
4316 links3=$(stat -c %h .)
4317 [ $(($links1 + 1)) != $links3 ] &&
4318 error "wrong links count $links1 != $links3"
4321 run_test 39p "remote directory cached attributes updated after create ========"
4324 test_39q() { # LU-8041
4325 local testdir=$DIR/$tdir
4327 multiop_bg_pause $testdir D_c || error "multiop failed"
4329 cancel_lru_locks mdc
4330 kill -USR1 $multipid
4331 local atime=$(stat -c %X $testdir)
4332 [ "$atime" -ne 0 ] || error "atime is zero"
4334 run_test 39q "close won't zero out atime"
4337 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
4338 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
4339 error "openfile O_WRONLY:O_TRUNC $tfile failed"
4340 $CHECKSTAT -t file -s 4096 $DIR/$tfile ||
4341 error "$tfile is not 4096 bytes in size"
4343 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
4347 small_write $DIR/f41 18
4349 run_test 41 "test small file write + fstat ====================="
4351 count_ost_writes() {
4352 lctl get_param -n ${OSC}.*.stats |
4353 awk -vwrites=0 '/ost_write/ { writes += $2 } \
4354 END { printf("%0.0f", writes) }'
4361 BG_DIRTY_RATIO_SAVE=10
4362 MAX_BG_DIRTY_RATIO=25
4366 # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs,
4367 # dirty_ratio, dirty_background_ratio
4368 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4369 sysctl -w vm.dirty_writeback_centisecs=$WRITEBACK_SAVE
4370 sysctl -w vm.dirty_background_ratio=$BG_DIRTY_RATIO_SAVE
4371 sysctl -w vm.dirty_ratio=$DIRTY_RATIO_SAVE
4373 # if file not here, we are a 2.4 kernel
4374 kill -CONT `pidof kupdated`
4379 # setup the trap first, so someone cannot exit the test at the
4380 # exact wrong time and mess up a machine
4381 trap start_writeback EXIT
4382 # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
4383 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4384 WRITEBACK_SAVE=`sysctl -n vm.dirty_writeback_centisecs`
4385 sysctl -w vm.dirty_writeback_centisecs=0
4386 sysctl -w vm.dirty_writeback_centisecs=0
4387 # save and increase /proc/sys/vm/dirty_ratio
4388 DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_ratio`
4389 sysctl -w vm.dirty_ratio=$MAX_DIRTY_RATIO
4390 # save and increase /proc/sys/vm/dirty_background_ratio
4391 BG_DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_background_ratio`
4392 sysctl -w vm.dirty_background_ratio=$MAX_BG_DIRTY_RATIO
4394 # if file not here, we are a 2.4 kernel
4395 kill -STOP `pidof kupdated`
4399 # ensure that all stripes have some grant before we test client-side cache
4401 for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
4402 dd if=/dev/zero of=$i bs=4k count=1
4407 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
4408 # file truncation, and file removal.
4410 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4413 cancel_lru_locks $OSC
4415 sync; sleep 1; sync # just to be safe
4416 BEFOREWRITES=`count_ost_writes`
4417 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur_grant_bytes | grep "[0-9]"
4418 dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
4419 AFTERWRITES=`count_ost_writes`
4420 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
4421 error "$BEFOREWRITES < $AFTERWRITES"
4424 run_test 42a "ensure that we don't flush on close"
4427 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4430 cancel_lru_locks $OSC
4433 dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
4434 BEFOREWRITES=$(count_ost_writes)
4435 $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
4436 AFTERWRITES=$(count_ost_writes)
4437 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4438 error "$BEFOREWRITES < $AFTERWRITES on unlink"
4440 BEFOREWRITES=$(count_ost_writes)
4441 sync || error "sync: $?"
4442 AFTERWRITES=$(count_ost_writes)
4443 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4444 error "$BEFOREWRITES < $AFTERWRITES on sync"
4446 dmesg | grep 'error from obd_brw_async' && error 'error writing back'
4450 run_test 42b "test destroy of file with cached dirty data ======"
4452 # if these tests just want to test the effect of truncation,
4453 # they have to be very careful. consider:
4454 # - the first open gets a {0,EOF}PR lock
4455 # - the first write conflicts and gets a {0, count-1}PW
4456 # - the rest of the writes are under {count,EOF}PW
4457 # - the open for truncate tries to match a {0,EOF}PR
4458 # for the filesize and cancels the PWs.
4459 # any number of fixes (don't get {0,EOF} on open, match
4460 # composite locks, do smarter file size management) fix
4461 # this, but for now we want these tests to verify that
4462 # the cancellation with truncate intent works, so we
4463 # start the file with a full-file pw lock to match against
4464 # until the truncate.
4469 cancel_lru_locks $OSC
4471 # prime the file with 0,EOF PW to match
4475 # now the real test..
4476 dd if=/dev/zero of=$file bs=1024 count=100
4477 BEFOREWRITES=`count_ost_writes`
4478 $TRUNCATE $file $offset
4479 cancel_lru_locks $OSC
4480 AFTERWRITES=`count_ost_writes`
4485 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4488 [ $BEFOREWRITES -eq $AFTERWRITES ] &&
4489 error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
4492 run_test 42c "test partial truncate of file with cached dirty data"
4495 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4498 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
4499 error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
4502 run_test 42d "test complete truncate of file with cached dirty data"
4504 test_42e() { # bug22074
4505 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4507 local TDIR=$DIR/${tdir}e
4508 local pages=16 # hardcoded 16 pages, don't change it.
4509 local files=$((OSTCOUNT * 500)) # hopefully 500 files on each OST
4510 local proc_osc0="osc.${FSNAME}-OST0000-osc-[^MDT]*"
4514 test_mkdir $DIR/${tdir}e
4515 $LFS setstripe -c 1 $TDIR
4516 createmany -o $TDIR/f $files
4518 max_dirty_mb=$($LCTL get_param -n $proc_osc0/max_dirty_mb)
4520 # we assume that with $OSTCOUNT files, at least one of them will
4521 # be allocated on OST0.
4522 warmup_files=$((OSTCOUNT * max_dirty_mb))
4523 createmany -o $TDIR/w $warmup_files
4525 # write a large amount of data into one file and sync, to get good
4526 # avail_grant number from OST.
4527 for ((i=0; i<$warmup_files; i++)); do
4528 idx=$($LFS getstripe -i $TDIR/w$i)
4529 [ $idx -ne 0 ] && continue
4530 dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1
4533 [[ $i -gt $warmup_files ]] && error "OST0 is still cold"
4535 $LCTL get_param $proc_osc0/cur_dirty_bytes
4536 $LCTL get_param $proc_osc0/cur_grant_bytes
4538 # create as much dirty pages as we can while not to trigger the actual
4539 # RPCs directly. but depends on the env, VFS may trigger flush during this
4540 # period, hopefully we are good.
4541 for ((i=0; i<$warmup_files; i++)); do
4542 idx=$($LFS getstripe -i $TDIR/w$i)
4543 [ $idx -ne 0 ] && continue
4544 dd if=/dev/zero of=$TDIR/w$i bs=1M count=1 2>/dev/null
4546 $LCTL get_param $proc_osc0/cur_dirty_bytes
4547 $LCTL get_param $proc_osc0/cur_grant_bytes
4549 # perform the real test
4550 $LCTL set_param $proc_osc0/rpc_stats 0
4551 for ((;i<$files; i++)); do
4552 [ $($LFS getstripe -i $TDIR/f$i) -eq 0 ] || continue
4553 dd if=/dev/zero of=$TDIR/f$i bs=$PAGE_SIZE count=$pages 2>/dev/null
4556 $LCTL get_param $proc_osc0/rpc_stats
4559 local have_ppr=false
4560 $LCTL get_param $proc_osc0/rpc_stats |
4561 while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do
4562 # skip lines until we are at the RPC histogram data
4563 [ "$PPR" == "pages" ] && have_ppr=true && continue
4564 $have_ppr || continue
4566 # we only want the percent stat for < 16 pages
4567 [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break
4569 percent=$((percent + WPCT))
4570 if [[ $percent -gt 15 ]]; then
4571 error "less than 16-pages write RPCs" \
4578 run_test 42e "verify sub-RPC writes are not done synchronously"
4580 test_43A() { # was test_43
4581 test_mkdir $DIR/$tdir
4582 cp -p /bin/ls $DIR/$tdir/$tfile
4583 $MULTIOP $DIR/$tdir/$tfile Ow_c &
4585 # give multiop a chance to open
4588 $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true
4591 run_test 43A "execution of file opened for write should return -ETXTBSY"
4594 test_mkdir $DIR/$tdir
4595 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4596 $DIR/$tdir/sleep 60 &
4598 # Make sure exec of $tdir/sleep wins race with truncate
4600 $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success"
4603 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
4606 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4608 test_mkdir $DIR/$tdir
4609 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4610 $DIR/$tdir/sleep 60 &
4612 # Make sure exec of $tdir/sleep wins race with truncate
4614 $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success"
4617 run_test 43b "truncate of file being executed should return -ETXTBSY"
4620 local testdir="$DIR/$tdir"
4623 ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) |
4624 ( cd $testdir && md5sum -c )
4626 run_test 43c "md5sum of copy into lustre"
4628 test_44A() { # was test_44
4629 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4631 dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
4632 dd if=$DIR/f1 bs=4k count=1 > /dev/null
4634 run_test 44A "zero length read from a sparse stripe"
4637 local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
4639 [ -z "$nstripe" ] && skip "can't get stripe info"
4640 [[ $nstripe -gt $OSTCOUNT ]] &&
4641 skip "Wrong default_stripe_count: $nstripe OSTCOUNT: $OSTCOUNT"
4643 local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: |
4645 if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then
4646 nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: |
4650 OFFSETS="0 $((stride/2)) $((stride-1))"
4651 for offset in $OFFSETS; do
4652 for i in $(seq 0 $((nstripe-1))); do
4653 local GLOBALOFFSETS=""
4655 local size=$((((i + 2 * $nstripe )*$stride + $offset)))
4656 local myfn=$DIR/d44a-$size
4657 echo "--------writing $myfn at $size"
4658 ll_sparseness_write $myfn $size ||
4659 error "ll_sparseness_write"
4660 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4661 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4662 error "ll_sparseness_verify $GLOBALOFFSETS"
4664 for j in $(seq 0 $((nstripe-1))); do
4666 size=$((((j + $nstripe )*$stride + $offset)))
4667 ll_sparseness_write $myfn $size ||
4668 error "ll_sparseness_write"
4669 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4671 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4672 error "ll_sparseness_verify $GLOBALOFFSETS"
4677 run_test 44a "test sparse pwrite ==============================="
4681 for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
4687 before=`dirty_osc_total`
4688 echo executing "\"$*\""
4690 after=`dirty_osc_total`
4691 echo before $before, after $after
4694 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4697 # Obtain grants from OST if it supports it
4698 echo blah > ${f}_grant
4701 do_dirty_record "echo blah > $f"
4702 [[ $before -eq $after ]] && error "write wasn't cached"
4703 do_dirty_record "> $f"
4704 [[ $before -gt $after ]] || error "truncate didn't lower dirty count"
4705 do_dirty_record "echo blah > $f"
4706 [[ $before -eq $after ]] && error "write wasn't cached"
4707 do_dirty_record "sync"
4708 [[ $before -gt $after ]] || error "writeback didn't lower dirty count"
4709 do_dirty_record "echo blah > $f"
4710 [[ $before -eq $after ]] && error "write wasn't cached"
4711 do_dirty_record "cancel_lru_locks osc"
4712 [[ $before -gt $after ]] ||
4713 error "lock cancellation didn't lower dirty count"
4716 run_test 45 "osc io page accounting ============================"
4718 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this
4719 # test tickles a bug where re-dirtying a page was failing to be mapped to the
4720 # objects offset and an assert hit when an rpc was built with 1023's mapped
4721 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
4723 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4728 dd if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4730 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=1023 count=1
4731 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4735 run_test 46 "dirtying a previously written page ================"
4737 # test_47 is removed "Device nodes check" is moved to test_28
4739 test_48a() { # bug 2399
4740 [ "$mds1_FSTYPE" = "zfs" ] &&
4741 [ $MDS1_VERSION -lt $(version_code 2.3.63) ] &&
4742 skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly"
4744 test_mkdir $DIR/$tdir
4746 mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
4747 test_mkdir $DIR/$tdir
4748 touch foo || error "'touch foo' failed after recreating cwd"
4750 touch .foo || error "'touch .foo' failed after recreating cwd"
4752 ls . > /dev/null || error "'ls .' failed after recreating cwd"
4753 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4754 cd . || error "'cd .' failed after recreating cwd"
4755 mkdir . && error "'mkdir .' worked after recreating cwd"
4756 rmdir . && error "'rmdir .' worked after recreating cwd"
4757 ln -s . baz || error "'ln -s .' failed after recreating cwd"
4758 cd .. || error "'cd ..' failed after recreating cwd"
4760 run_test 48a "Access renamed working dir (should return errors)="
4762 test_48b() { # bug 2399
4764 test_mkdir $DIR/$tdir
4766 rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
4767 touch foo && error "'touch foo' worked after removing cwd"
4768 mkdir foo && error "'mkdir foo' worked after removing cwd"
4769 touch .foo && error "'touch .foo' worked after removing cwd"
4770 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
4771 ls . > /dev/null && error "'ls .' worked after removing cwd"
4772 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4773 mkdir . && error "'mkdir .' worked after removing cwd"
4774 rmdir . && error "'rmdir .' worked after removing cwd"
4775 ln -s . foo && error "'ln -s .' worked after removing cwd"
4776 cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
4778 run_test 48b "Access removed working dir (should return errors)="
4780 test_48c() { # bug 2350
4781 #lctl set_param debug=-1
4784 test_mkdir -p $DIR/$tdir/dir
4786 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4787 $TRACE touch foo && error "touch foo worked after removing cwd"
4788 $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
4789 touch .foo && error "touch .foo worked after removing cwd"
4790 mkdir .foo && error "mkdir .foo worked after removing cwd"
4791 $TRACE ls . && error "'ls .' worked after removing cwd"
4792 $TRACE ls .. || error "'ls ..' failed after removing cwd"
4793 $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
4794 $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
4795 $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
4796 $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
4798 run_test 48c "Access removed working subdir (should return errors)"
4800 test_48d() { # bug 2350
4801 #lctl set_param debug=-1
4804 test_mkdir -p $DIR/$tdir/dir
4806 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4807 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4808 $TRACE touch foo && error "'touch foo' worked after removing parent"
4809 $TRACE mkdir foo && error "mkdir foo worked after removing parent"
4810 touch .foo && error "'touch .foo' worked after removing parent"
4811 mkdir .foo && error "mkdir .foo worked after removing parent"
4812 $TRACE ls . && error "'ls .' worked after removing parent"
4813 $TRACE ls .. && error "'ls ..' worked after removing parent"
4814 $TRACE mkdir . && error "'mkdir .' worked after removing parent"
4815 $TRACE rmdir . && error "'rmdir .' worked after removing parent"
4816 $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
4819 run_test 48d "Access removed parent subdir (should return errors)"
4821 test_48e() { # bug 4134
4822 #lctl set_param debug=-1
4825 test_mkdir -p $DIR/$tdir/dir
4827 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4828 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4829 $TRACE touch $DIR/$tdir || error "'touch $DIR/$tdir' failed"
4830 $TRACE chmod +x $DIR/$tdir || error "'chmod +x $DIR/$tdir' failed"
4831 # On a buggy kernel addition of "touch foo" after cd .. will
4832 # produce kernel oops in lookup_hash_it
4833 touch ../foo && error "'cd ..' worked after recreate parent"
4835 $TRACE rm $DIR/$tdir || error "rm '$DIR/$tdir' failed"
4837 run_test 48e "Access to recreated parent subdir (should return errors)"
4839 test_49() { # LU-1030
4840 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4841 remote_ost_nodsh && skip "remote OST with nodsh"
4843 # get ost1 size - lustre-OST0000
4844 ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
4846 # write 800M at maximum
4847 [[ $ost1_size -lt 2 ]] && ost1_size=2
4848 [[ $ost1_size -gt 819200 ]] && ost1_size=819200
4850 $LFS setstripe -c 1 -i 0 $DIR/$tfile
4851 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) &
4854 # change max_pages_per_rpc while writing the file
4855 local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc
4856 local orig_mppc=$($LCTL get_param -n $osc1_mppc)
4857 # loop until dd process exits
4858 while ps ax -opid | grep -wq $dd_pid; do
4859 $LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1))
4860 sleep $((RANDOM % 5 + 1))
4862 # restore original max_pages_per_rpc
4863 $LCTL set_param $osc1_mppc=$orig_mppc
4864 rm $DIR/$tfile || error "rm $DIR/$tfile failed"
4866 run_test 49 "Change max_pages_per_rpc won't break osc extent"
4870 test_mkdir $DIR/$tdir
4872 ls /proc/$$/cwd || error "ls /proc/$$/cwd failed"
4874 run_test 50 "special situations: /proc symlinks ==============="
4876 test_51a() { # was test_51
4877 # bug 1516 - create an empty entry right after ".." then split dir
4878 test_mkdir -c1 $DIR/$tdir
4879 touch $DIR/$tdir/foo
4880 $MCREATE $DIR/$tdir/bar
4882 createmany -m $DIR/$tdir/longfile 201
4884 while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do
4885 $MCREATE $DIR/$tdir/longfile$FNUM
4890 ls -l $DIR/$tdir > /dev/null || error "ls -l $DIR/$tdir failed"
4892 run_test 51a "special situations: split htree with empty entry =="
4894 cleanup_print_lfs_df () {
4901 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4903 local dir=$DIR/$tdir
4904 local nrdirs=$((65536 + 100))
4906 # cleanup the directory
4913 local mdtidx=$(printf "%04x" $($LFS getstripe -m $dir))
4914 local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
4915 [[ $numfree -lt $nrdirs ]] &&
4916 skip "not enough free inodes ($numfree) on MDT$mdtidx"
4918 # need to check free space for the directories as well
4919 local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
4920 numfree=$(( blkfree / $(fs_inode_ksize) ))
4921 [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)"
4923 trap cleanup_print_lfs_df EXIT
4926 createmany -d $dir/d $nrdirs || {
4927 unlinkmany $dir/d $nrdirs
4928 error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
4932 nrdirs=$(ls -U $dir | wc -l)
4934 # unlink all but 100 subdirectories, then check it still works
4936 local delete=$((nrdirs - left))
4941 # for ldiskfs the nlink count should be 1, but this is OSD specific
4942 # and so this is listed for informational purposes only
4943 echo "nlink before: $(stat -c %h $dir), created before: $nrdirs"
4944 unlinkmany -d $dir/d $delete ||
4945 error "unlink of first $delete subdirs failed"
4947 echo "nlink between: $(stat -c %h $dir)"
4948 local found=$(ls -U $dir | wc -l)
4949 [ $found -ne $left ] &&
4950 error "can't find subdirs: found only $found, expected $left"
4952 unlinkmany -d $dir/d $delete $left ||
4953 error "unlink of second $left subdirs failed"
4954 # regardless of whether the backing filesystem tracks nlink accurately
4955 # or not, the nlink count shouldn't be more than "." and ".." here
4956 local after=$(stat -c %h $dir)
4957 [[ $after -gt 2 ]] && error "nlink after: $after > 2" ||
4958 echo "nlink after: $after"
4960 cleanup_print_lfs_df
4962 run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
4965 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4966 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
4968 test_mkdir $DIR/$tdir
4969 createmany -o $DIR/$tdir/t- 1000
4970 $LFS getstripe $DIR/$tdir > $TMP/$tfile
4971 for N in $(seq 0 $((OSTCOUNT - 1))); do
4972 OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
4973 END { printf("%0.0f", objs) }' $TMP/$tfile)
4974 OBJS0[$N]=$(grep -A 1 idx $TMP/$tfile | awk -vobjs=0 \
4975 '($1 == '$N') { objs += 1 } \
4976 END { printf("%0.0f", objs) }')
4977 log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
4979 unlinkmany $DIR/$tdir/t- 1000
4982 for N in $(seq 1 $((OSTCOUNT - 1))); do
4983 [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] &&
4984 error "OST $N has less objects vs OST $NLAST" \
4985 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4986 [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] &&
4987 error "OST $N has less objects vs OST $NLAST" \
4988 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4990 [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] &&
4991 error "OST $N has less #0 objects vs OST $NLAST" \
4992 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4993 [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] &&
4994 error "OST $N has less #0 objects vs OST $NLAST" \
4995 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
5000 run_test 51d "check object distribution"
5003 if [ "$mds1_FSTYPE" != ldiskfs ]; then
5004 skip_env "ldiskfs only test"
5007 test_mkdir -c1 $DIR/$tdir
5008 test_mkdir -c1 $DIR/$tdir/d0
5010 touch $DIR/$tdir/d0/foo
5011 createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
5012 error "file exceed 65000 nlink limit!"
5013 unlinkmany $DIR/$tdir/d0/f- 65001
5016 run_test 51e "check file nlink limit"
5019 test_mkdir $DIR/$tdir
5022 local ulimit_old=$(ulimit -n)
5023 local spare=20 # number of spare fd's for scripts/libraries, etc.
5024 local mdt=$($LFS getstripe -m $DIR/$tdir)
5025 local numfree=$($LFS df -i $DIR/$tdir | awk '/MDT:'$mdt'/ { print $4 }')
5027 echo "MDT$mdt numfree=$numfree, max=$max"
5028 [[ $numfree -gt $max ]] && numfree=$max || numfree=$((numfree * 7 / 8))
5029 if [ $((numfree + spare)) -gt $ulimit_old ]; then
5030 while ! ulimit -n $((numfree + spare)); do
5031 numfree=$((numfree * 3 / 4))
5033 echo "changed ulimit from $ulimit_old to $((numfree + spare))"
5035 echo "left ulimit at $ulimit_old"
5038 createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
5039 unlinkmany $DIR/$tdir/f $numfree
5040 error "create+open $numfree files in $DIR/$tdir failed"
5042 ulimit -n $ulimit_old
5044 # if createmany exits at 120s there will be fewer than $numfree files
5045 unlinkmany $DIR/$tdir/f $numfree || true
5047 run_test 51f "check many open files limit"
5050 [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
5051 test_mkdir $DIR/$tdir
5052 touch $DIR/$tdir/foo
5053 chattr +a $DIR/$tdir/foo || error "chattr +a failed"
5054 echo bar >> $DIR/$tdir/foo || error "append bar failed"
5055 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
5056 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
5057 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
5059 echo foo >> $DIR/$tdir/foo || error "append foo failed"
5060 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
5061 lsattr $DIR/$tdir/foo | egrep -q "^-+a[-e]+ $DIR/$tdir/foo" ||
5063 chattr -a $DIR/$tdir/foo || error "chattr -a failed"
5064 cp -r $DIR/$tdir $TMP/
5065 rm -fr $DIR/$tdir $TMP/$tdir || error "cleanup rm failed"
5067 run_test 52a "append-only flag test (should return errors)"
5070 [ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo
5071 test_mkdir $DIR/$tdir
5072 touch $DIR/$tdir/foo
5073 chattr +i $DIR/$tdir/foo || error "chattr +i failed"
5074 cat test > $DIR/$tdir/foo && error "cat test worked"
5075 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
5076 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
5077 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
5079 echo foo >> $DIR/$tdir/foo && error "echo worked"
5080 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
5081 [ -f $DIR/$tdir/foo ] || error "$tdir/foo is not a file"
5082 [ -f $DIR/$tdir/foo_ren ] && error "$tdir/foo_ren is not a file"
5083 lsattr $DIR/$tdir/foo | egrep -q "^-+i[-e]+ $DIR/$tdir/foo" ||
5085 chattr -i $DIR/$tdir/foo || error "chattr failed"
5087 rm -fr $DIR/$tdir || error "unable to remove $DIR/$tdir"
5089 run_test 52b "immutable flag test (should return errors) ======="
5092 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5093 remote_mds_nodsh && skip "remote MDS with nodsh"
5094 remote_ost_nodsh && skip "remote OST with nodsh"
5107 local support_last_seq=true
5109 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
5110 support_last_seq=false
5113 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
5115 for value in $(do_facet $SINGLEMDS \
5116 $LCTL get_param osp.$mdtosc.prealloc_last_id) ; do
5117 param=$(echo ${value[0]} | cut -d "=" -f1)
5118 ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
5120 if $support_last_seq; then
5121 param_seq=$(echo $param |
5122 sed -e s/prealloc_last_id/prealloc_last_seq/g)
5123 mds_last_seq=$(do_facet $SINGLEMDS \
5124 $LCTL get_param -n $param_seq)
5126 mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
5128 ostnum=$(index_from_ostuuid ${ostname}_UUID)
5129 node=$(facet_active_host ost$((ostnum+1)))
5130 param="obdfilter.$ostname.last_id"
5131 for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
5132 echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
5133 ost_last_id=$ost_last
5135 if $support_last_seq; then
5136 ost_last_id=$(echo $ost_last |
5137 awk -F':' '{print $2}' |
5139 ost_last_seq=$(echo $ost_last |
5140 awk -F':' '{print $1}')
5141 [[ $ost_last_seq = $mds_last_seq ]] || continue
5144 if [[ $ost_last_id != $mds_last ]]; then
5145 error "$ost_last_id != $mds_last"
5152 $found || error "can not match last_seq/last_id for $mdtosc"
5155 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
5158 perl -MSocket -e ';' || skip "no Socket perl module installed"
5160 $SOCKETSERVER $DIR/socket ||
5161 error "$SOCKETSERVER $DIR/socket failed: $?"
5162 $SOCKETCLIENT $DIR/socket ||
5163 error "$SOCKETCLIENT $DIR/socket failed: $?"
5164 $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
5166 run_test 54a "unix domain socket test =========================="
5172 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1
5174 run_test 54b "char device works in lustre ======================"
5177 [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
5178 [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
5179 [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
5181 for i in $(seq 3 7); do
5182 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
5191 loopdev="$DIR/loop54c"
5194 $UMOUNT $DIR/$tdir || rc=$?
5195 losetup -d $loopdev || true
5196 losetup -d $LOOPDEV || true
5197 rm -rf $loopdev $DIR/$tfile $DIR/$tdir
5202 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5204 loopdev="$DIR/loop54c"
5207 [ -z "$LOOPNUM" ] && skip_env "couldn't find empty loop device"
5208 trap cleanup_54c EXIT
5209 mknod $loopdev b 7 $LOOPNUM
5210 echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
5211 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE seek=1024 count=1 > /dev/null
5212 losetup $loopdev $DIR/$tfile ||
5213 error "can't set up $loopdev for $DIR/$tfile"
5214 mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
5215 test_mkdir $DIR/$tdir
5216 mount -t ext2 $loopdev $DIR/$tdir ||
5217 error "error mounting $loopdev on $DIR/$tdir"
5218 dd if=/dev/zero of=$DIR/$tdir/tmp bs=$PAGE_SIZE count=30 ||
5221 dd if=$DIR/$tdir/tmp of=/dev/zero bs=$PAGE_SIZE count=30 ||
5225 run_test 54c "block device works in lustre ====================="
5231 [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string"
5233 run_test 54d "fifo device works in lustre ======================"
5238 cp -aL /dev/console $f
5239 echo $string > $f || error "echo $string to $f failed"
5241 run_test 54e "console/tty device works in lustre ======================"
5245 local dir=$DIR/$tdir
5248 test_mkdir -p $dir/dir
5249 for i in $(seq $numfiles); do
5251 touch $dir/dir/file$i
5254 local numcomp=$($LFS getstripe --component-count $dir)
5256 [[ $numcomp == 0 ]] && numcomp=1
5258 # test lfs getstripe with --recursive
5259 local filenum=$($LFS getstripe -r $dir | egrep -c "obdidx|l_ost_idx")
5261 [[ $filenum -eq $((numfiles * 2)) ]] ||
5262 error "$LFS getstripe -r: found $filenum != $((numfiles * 2))"
5263 filenum=$($LFS getstripe $dir | egrep -c "obdidx|l_ost_idx")
5264 [[ $filenum -eq $numfiles ]] ||
5265 error "$LFS getstripe $dir: found $filenum, not $numfiles"
5266 echo "$LFS getstripe showed obdidx or l_ost_idx"
5268 # test lfs getstripe with file instead of dir
5269 filenum=$($LFS getstripe $dir/file1 | egrep -c "obdidx|l_ost_idx")
5270 [[ $filenum -eq 1 ]] ||
5271 error "$LFS getstripe $dir/file1: found $filenum, not 1"
5272 echo "$LFS getstripe file1 passed"
5274 #test lfs getstripe with --verbose
5275 filenum=$($LFS getstripe --verbose $dir | grep -c lmm_magic)
5276 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
5277 error "$LFS getstripe --verbose $dir: "\
5278 "got $filenum want $((numfiles * numcomp)) lmm_magic"
5279 [[ $($LFS getstripe $dir | grep -c lmm_magic) -eq 0 ]] ||
5280 error "$LFS getstripe $dir: showed lmm_magic"
5282 #test lfs getstripe with -v prints lmm_fid
5283 filenum=$($LFS getstripe -v $dir | grep -c lmm_fid)
5284 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
5285 error "$LFS getstripe -v $dir: "\
5286 "got $filenum want $((numfiles * numcomp)) lmm_fid"
5287 [[ $($LFS getstripe $dir | grep -c lmm_fid) -eq 0 ]] ||
5288 error "$LFS getstripe $dir: showed lmm_fid by default"
5289 echo "$LFS getstripe --verbose passed"
5291 #check for FID information
5292 local fid1=$($LFS getstripe --fid $dir/file1)
5293 local fid2=$($LFS getstripe --verbose $dir/file1 |
5294 awk '/lmm_fid: / { print $2; exit; }')
5295 local fid3=$($LFS path2fid $dir/file1)
5297 [ "$fid1" != "$fid2" ] &&
5298 error "getstripe --fid '$fid1' != getstripe --verbose '$fid2'"
5299 [ "$fid1" != "$fid3" ] &&
5300 error "getstripe --fid '$fid1' != lfs path2fid '$fid3'"
5301 echo "$LFS getstripe --fid passed"
5303 #test lfs getstripe with --obd
5304 $LFS getstripe --obd wrong_uuid $dir 2>&1 | grep -q "unknown obduuid" ||
5305 error "$LFS getstripe --obd wrong_uuid: should return error"
5307 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5310 local obduuid=$(ostuuid_from_index $ostidx)
5311 local found=$($LFS getstripe -r --obd $obduuid $dir |
5312 grep 'lmm_stripe_offset:' | grep -c " $ostidx\$")
5314 filenum=$($LFS getstripe -ir $dir | grep -c "^$ostidx\$")
5315 [[ $($LFS getstripe -id $dir) -ne $ostidx ]] ||
5317 [[ $($LFS getstripe -id $dir/dir) -ne $ostidx ]] ||
5320 [[ $found -eq $filenum ]] ||
5321 error "$LFS getstripe --obd: found $found expect $filenum"
5322 [[ $($LFS getstripe -r -v --obd $obduuid $dir |
5323 sed '/^[ ]*'${ostidx}'[ ]/d' |
5324 sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] ||
5325 error "$LFS getstripe --obd: should not show file on other obd"
5326 echo "$LFS getstripe --obd passed"
5328 run_test 56a "check $LFS getstripe"
5331 local dir=$DIR/$tdir
5335 for i in $(seq $numdirs); do
5336 test_mkdir $dir/dir$i
5339 # test lfs getdirstripe default mode is non-recursion, which is
5340 # different from lfs getstripe
5341 local dircnt=$($LFS getdirstripe $dir | grep -c lmv_stripe_count)
5343 [[ $dircnt -eq 1 ]] ||
5344 error "$LFS getdirstripe: found $dircnt, not 1"
5345 dircnt=$($LFS getdirstripe --recursive $dir |
5346 grep -c lmv_stripe_count)
5347 [[ $dircnt -eq $((numdirs + 1)) ]] ||
5348 error "$LFS getdirstripe -r: $dircnt, != $((numdirs + 1))"
5350 run_test 56b "check $LFS getdirstripe"
5353 remote_ost_nodsh && skip "remote OST with nodsh"
5356 local ost_name=$(ostname_from_index $ost_idx)
5357 local old_status=$(ost_dev_status $ost_idx)
5359 [[ -z "$old_status" ]] ||
5360 skip_env "OST $ost_name is in $old_status status"
5362 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
5365 local new_status=$(ost_dev_status $ost_idx)
5367 [[ "$new_status" = "D" ]] ||
5368 error "OST $ost_name is in status of '$new_status', not 'D'"
5370 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
5373 new_status=$(ost_dev_status $ost_idx)
5374 [[ -z "$new_status" ]] ||
5375 error "OST $ost_name is in status of '$new_status', not ''"
5377 run_test 56c "check 'lfs df' showing device status"
5382 local local_tdir="$1"
5383 local local_numfiles="$2"
5384 local local_numdirs="$3"
5385 local dir_params="$4"
5386 local dir_stripe_params="$5"
5388 if [ ! -d "$local_tdir" ] ; then
5389 test_mkdir -p $dir_stripe_params $local_tdir
5390 [ "$dir_params" ] && $LFS setstripe $dir_params $local_tdir
5391 for i in $(seq $local_numfiles) ; do
5392 touch $local_tdir/file$i
5394 for i in $(seq $local_numdirs) ; do
5395 test_mkdir $dir_stripe_params $local_tdir/dir$i
5396 for j in $(seq $local_numfiles) ; do
5397 touch $local_tdir/dir$i/file$j
5403 setup_56_special() {
5405 local local_numfiles=$2
5406 local local_numdirs=$3
5408 setup_56 $local_tdir $local_numfiles $local_numdirs
5410 if [ ! -e "$local_tdir/loop${local_numfiles}b" ] ; then
5411 for i in $(seq $local_numfiles) ; do
5412 mknod $local_tdir/loop${i}b b 7 $i
5413 mknod $local_tdir/null${i}c c 1 3
5414 ln -s $local_tdir/file1 $local_tdir/link${i}
5416 for i in $(seq $local_numdirs) ; do
5417 mknod $local_tdir/dir$i/loop${i}b b 7 $i
5418 mknod $local_tdir/dir$i/null${i}c c 1 3
5419 ln -s $local_tdir/dir$i/file1 $local_tdir/dir$i/link${i}
5425 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5426 local expected=$(($NUMDIRS + 2))
5428 setup_56 $dir $NUMFILES $NUMDIRS
5430 # test lfs find with -name
5431 for i in $(seq $NUMFILES) ; do
5432 local nums=$($LFS find -name "*$i" $dir | wc -l)
5434 [ $nums -eq $expected ] ||
5435 error "lfs find -name '*$i' $dir wrong: "\
5436 "found $nums, expected $expected"
5439 run_test 56g "check lfs find -name"
5442 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5443 local expected=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES))
5445 setup_56 $dir $NUMFILES $NUMDIRS
5447 # test lfs find with ! -name
5448 for i in $(seq $NUMFILES) ; do
5449 local nums=$($LFS find ! -name "*$i" $dir | wc -l)
5451 [ $nums -eq $expected ] ||
5452 error "lfs find ! -name '*$i' $dir wrong: "\
5453 "found $nums, expected $expected"
5456 run_test 56h "check lfs find ! -name"
5459 local dir=$DIR/$tdir
5463 local cmd="$LFS find -ost $(ostuuid_from_index 0 $dir) $dir"
5466 [ -z "$out" ] || error "'$cmd' returned directory '$out'"
5468 run_test 56i "check 'lfs find -ost UUID' skips directories"
5471 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5473 setup_56_special $dir $NUMFILES $NUMDIRS
5475 local expected=$((NUMDIRS + 1))
5476 local cmd="$LFS find -type d $dir"
5477 local nums=$($cmd | wc -l)
5479 [ $nums -eq $expected ] ||
5480 error "'$cmd' wrong: found $nums, expected $expected"
5482 run_test 56j "check lfs find -type d"
5485 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5487 setup_56_special $dir $NUMFILES $NUMDIRS
5489 local expected=$(((NUMDIRS + 1) * NUMFILES))
5490 local cmd="$LFS find -type f $dir"
5491 local nums=$($cmd | wc -l)
5493 [ $nums -eq $expected ] ||
5494 error "'$cmd' wrong: found $nums, expected $expected"
5496 run_test 56k "check lfs find -type f"
5499 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5501 setup_56_special $dir $NUMFILES $NUMDIRS
5503 local expected=$((NUMDIRS + NUMFILES))
5504 local cmd="$LFS find -type b $dir"
5505 local nums=$($cmd | wc -l)
5507 [ $nums -eq $expected ] ||
5508 error "'$cmd' wrong: found $nums, expected $expected"
5510 run_test 56l "check lfs find -type b"
5513 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5515 setup_56_special $dir $NUMFILES $NUMDIRS
5517 local expected=$((NUMDIRS + NUMFILES))
5518 local cmd="$LFS find -type c $dir"
5519 local nums=$($cmd | wc -l)
5520 [ $nums -eq $expected ] ||
5521 error "'$cmd' wrong: found $nums, expected $expected"
5523 run_test 56m "check lfs find -type c"
5526 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5527 setup_56_special $dir $NUMFILES $NUMDIRS
5529 local expected=$((NUMDIRS + NUMFILES))
5530 local cmd="$LFS find -type l $dir"
5531 local nums=$($cmd | wc -l)
5533 [ $nums -eq $expected ] ||
5534 error "'$cmd' wrong: found $nums, expected $expected"
5536 run_test 56n "check lfs find -type l"
5539 local dir=$DIR/$tdir
5541 setup_56 $dir $NUMFILES $NUMDIRS
5542 utime $dir/file1 > /dev/null || error "utime (1)"
5543 utime $dir/file2 > /dev/null || error "utime (2)"
5544 utime $dir/dir1 > /dev/null || error "utime (3)"
5545 utime $dir/dir2 > /dev/null || error "utime (4)"
5546 utime $dir/dir1/file1 > /dev/null || error "utime (5)"
5547 dd if=/dev/zero count=1 >> $dir/dir1/file1 && sync
5550 local nums=$($LFS find -mtime +0 $dir | wc -l)
5552 [ $nums -eq $expected ] ||
5553 error "lfs find -mtime +0 $dir: found $nums expect $expected"
5556 cmd="$LFS find -mtime 0 $dir"
5557 nums=$($cmd | wc -l)
5558 [ $nums -eq $expected ] ||
5559 error "'$cmd' wrong: found $nums, expected $expected"
5561 run_test 56o "check lfs find -mtime for old files"
5564 local dir=$DIR/$tdir
5568 # just to make sure there is something that won't be found
5570 touch $dir/$tfile.now
5572 for age in year week day hour min; do
5573 count=$((count + 1))
5575 touch $dir/$tfile-a.$age $dir/$tfile-m.$age
5576 touch --date="$count $age ago" -a $dir/$tfile-a.$age
5577 touch --date="$count $age ago" -m $dir/$tfile-m.$age
5579 local cmd="$LFS find $dir -mtime $count${age:0:1}"
5580 local nums=$($cmd | wc -l)
5581 [ $nums -eq $expected ] ||
5582 error "'$cmd' wrong: found $nums, expected $expected"
5584 cmd="$LFS find $dir -atime $count${age:0:1}"
5585 nums=$($cmd | wc -l)
5586 [ $nums -eq $expected ] ||
5587 error "'$cmd' wrong: found $nums, expected $expected"
5591 cmd="$LFS find $dir -ctime +1s -type f"
5592 nums=$($cmd | wc -l)
5593 (( $nums == $count * 2 + 1)) ||
5594 error "'$cmd' wrong: found $nums, expected $((expected*2+1))"
5596 run_test 56ob "check lfs find -atime -mtime -ctime with units"
5599 [ $RUNAS_ID -eq $UID ] &&
5600 skip_env "RUNAS_ID = UID = $UID -- skipping"
5602 local dir=$DIR/$tdir
5604 setup_56 $dir $NUMFILES $NUMDIRS
5605 chown $RUNAS_ID $dir/file* || error "chown $DIR/${tdir}g/file$i failed"
5607 local expected=$NUMFILES
5608 local cmd="$LFS find -uid $RUNAS_ID $dir"
5609 local nums=$($cmd | wc -l)
5611 [ $nums -eq $expected ] ||
5612 error "'$cmd' wrong: found $nums, expected $expected"
5614 expected=$(((NUMFILES + 1) * NUMDIRS + 1))
5615 cmd="$LFS find ! -uid $RUNAS_ID $dir"
5616 nums=$($cmd | wc -l)
5617 [ $nums -eq $expected ] ||
5618 error "'$cmd' wrong: found $nums, expected $expected"
5620 run_test 56p "check lfs find -uid and ! -uid"
5623 [ $RUNAS_ID -eq $UID ] &&
5624 skip_env "RUNAS_ID = UID = $UID -- skipping"
5626 local dir=$DIR/$tdir
5628 setup_56 $dir $NUMFILES $NUMDIRS
5629 chgrp $RUNAS_GID $dir/file* || error "chown $dir/file$i failed"
5631 local expected=$NUMFILES
5632 local cmd="$LFS find -gid $RUNAS_GID $dir"
5633 local nums=$($cmd | wc -l)
5635 [ $nums -eq $expected ] ||
5636 error "'$cmd' wrong: found $nums, expected $expected"
5638 expected=$(( ($NUMFILES+1) * $NUMDIRS + 1))
5639 cmd="$LFS find ! -gid $RUNAS_GID $dir"
5640 nums=$($cmd | wc -l)
5641 [ $nums -eq $expected ] ||
5642 error "'$cmd' wrong: found $nums, expected $expected"
5644 run_test 56q "check lfs find -gid and ! -gid"
5647 local dir=$DIR/$tdir
5649 setup_56 $dir $NUMFILES $NUMDIRS
5652 local cmd="$LFS find -size 0 -type f $dir"
5653 local nums=$($cmd | wc -l)
5655 [ $nums -eq $expected ] ||
5656 error "'$cmd' wrong: found $nums, expected $expected"
5658 cmd="$LFS find ! -size 0 -type f $dir"
5659 nums=$($cmd | wc -l)
5660 [ $nums -eq $expected ] ||
5661 error "'$cmd' wrong: found $nums, expected $expected"
5662 echo "test" > $dir/$tfile
5663 echo "test2" > $dir/$tfile.2 && sync
5665 cmd="$LFS find -size 5 -type f $dir"
5666 nums=$($cmd | wc -l)
5667 [ $nums -eq $expected ] ||
5668 error "'$cmd' wrong: found $nums, expected $expected"
5670 cmd="$LFS find -size +5 -type f $dir"
5671 nums=$($cmd | wc -l)
5672 [ $nums -eq $expected ] ||
5673 error "'$cmd' wrong: found $nums, expected $expected"
5675 cmd="$LFS find -size +0 -type f $dir"
5676 nums=$($cmd | wc -l)
5677 [ $nums -eq $expected ] ||
5678 error "'$cmd' wrong: found $nums, expected $expected"
5680 cmd="$LFS find ! -size -5 -type f $dir"
5681 nums=$($cmd | wc -l)
5682 [ $nums -eq $expected ] ||
5683 error "'$cmd' wrong: found $nums, expected $expected"
5685 cmd="$LFS find -size -5 -type f $dir"
5686 nums=$($cmd | wc -l)
5687 [ $nums -eq $expected ] ||
5688 error "'$cmd' wrong: found $nums, expected $expected"
5690 run_test 56r "check lfs find -size works"
5692 test_56s() { # LU-611 #LU-9369
5693 [[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
5695 local dir=$DIR/$tdir
5696 local onestripe=$(((NUMDIRS + 1) * NUMFILES))
5698 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5699 for i in $(seq $NUMDIRS); do
5700 $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile
5703 local expected=$NUMDIRS
5704 local cmd="$LFS find -c $OSTCOUNT $dir"
5705 local nums=$($cmd | wc -l)
5707 [ $nums -eq $expected ] || {
5708 $LFS getstripe -R $dir
5709 error "'$cmd' wrong: found $nums, expected $expected"
5712 expected=$((NUMDIRS + onestripe))
5713 cmd="$LFS find -stripe-count +0 -type f $dir"
5714 nums=$($cmd | wc -l)
5715 [ $nums -eq $expected ] || {
5716 $LFS getstripe -R $dir
5717 error "'$cmd' wrong: found $nums, expected $expected"
5721 cmd="$LFS find -stripe-count 1 -type f $dir"
5722 nums=$($cmd | wc -l)
5723 [ $nums -eq $expected ] || {
5724 $LFS getstripe -R $dir
5725 error "'$cmd' wrong: found $nums, expected $expected"
5728 cmd="$LFS find -stripe-count -2 -type f $dir"
5729 nums=$($cmd | wc -l)
5730 [ $nums -eq $expected ] || {
5731 $LFS getstripe -R $dir
5732 error "'$cmd' wrong: found $nums, expected $expected"
5736 cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir"
5737 nums=$($cmd | wc -l)
5738 [ $nums -eq $expected ] || {
5739 $LFS getstripe -R $dir
5740 error "'$cmd' wrong: found $nums, expected $expected"
5743 run_test 56s "check lfs find -stripe-count works"
5745 test_56t() { # LU-611 #LU-9369
5746 local dir=$DIR/$tdir
5748 setup_56 $dir 0 $NUMDIRS
5749 for i in $(seq $NUMDIRS); do
5750 $LFS setstripe -S 8M $dir/dir$i/$tfile
5753 local expected=$NUMDIRS
5754 local cmd="$LFS find -S 8M $dir"
5755 local nums=$($cmd | wc -l)
5757 [ $nums -eq $expected ] || {
5758 $LFS getstripe -R $dir
5759 error "'$cmd' wrong: found $nums, expected $expected"
5763 setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k"
5765 $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3}
5767 expected=$(((NUMDIRS + 1) * NUMFILES))
5768 cmd="$LFS find -stripe-size 512k -type f $dir"
5769 nums=$($cmd | wc -l)
5770 [ $nums -eq $expected ] ||
5771 error "'$cmd' wrong: found $nums, expected $expected"
5773 cmd="$LFS find -stripe-size +320k -type f $dir"
5774 nums=$($cmd | wc -l)
5775 [ $nums -eq $expected ] ||
5776 error "'$cmd' wrong: found $nums, expected $expected"
5778 expected=$(((NUMDIRS + 1) * NUMFILES + 4))
5779 cmd="$LFS find -stripe-size +200k -type f $dir"
5780 nums=$($cmd | wc -l)
5781 [ $nums -eq $expected ] ||
5782 error "'$cmd' wrong: found $nums, expected $expected"
5784 cmd="$LFS find -stripe-size -640k -type f $dir"
5785 nums=$($cmd | wc -l)
5786 [ $nums -eq $expected ] ||
5787 error "'$cmd' wrong: found $nums, expected $expected"
5790 cmd="$LFS find -stripe-size 256k -type f $dir"
5791 nums=$($cmd | wc -l)
5792 [ $nums -eq $expected ] ||
5793 error "'$cmd' wrong: found $nums, expected $expected"
5795 cmd="$LFS find -stripe-size -320k -type f $dir"
5796 nums=$($cmd | wc -l)
5797 [ $nums -eq $expected ] ||
5798 error "'$cmd' wrong: found $nums, expected $expected"
5801 cmd="$LFS find -stripe-size 1024k -type f $dir"
5802 nums=$($cmd | wc -l)
5803 [ $nums -eq $expected ] ||
5804 error "'$cmd' wrong: found $nums, expected $expected"
5806 run_test 56t "check lfs find -stripe-size works"
5808 test_56u() { # LU-611
5809 local dir=$DIR/$tdir
5811 setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1"
5813 if [[ $OSTCOUNT -gt 1 ]]; then
5814 $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3}
5820 local expected=$(((NUMDIRS + 1) * NUMFILES))
5821 local cmd="$LFS find -stripe-index 0 -type f $dir"
5822 local nums=$($cmd | wc -l)
5824 [ $nums -eq $expected ] ||
5825 error "'$cmd' wrong: found $nums, expected $expected"
5828 cmd="$LFS find -stripe-index 1 -type f $dir"
5829 nums=$($cmd | wc -l)
5830 [ $nums -eq $expected ] ||
5831 error "'$cmd' wrong: found $nums, expected $expected"
5833 cmd="$LFS find ! -stripe-index 0 -type f $dir"
5834 nums=$($cmd | wc -l)
5835 [ $nums -eq $expected ] ||
5836 error "'$cmd' wrong: found $nums, expected $expected"
5839 # This should produce an error and not return any files
5840 cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir"
5841 nums=$($cmd 2>/dev/null | wc -l)
5842 [ $nums -eq $expected ] ||
5843 error "'$cmd' wrong: found $nums, expected $expected"
5845 if [[ $OSTCOUNT -gt 1 ]]; then
5846 expected=$(((NUMDIRS + 1) * NUMFILES + onestripe))
5847 cmd="$LFS find -stripe-index 0,1 -type f $dir"
5848 nums=$($cmd | wc -l)
5849 [ $nums -eq $expected ] ||
5850 error "'$cmd' wrong: found $nums, expected $expected"
5853 run_test 56u "check lfs find -stripe-index works"
5857 local dir=$DIR/$tdir
5859 setup_56 $dir $NUMFILES $NUMDIRS
5861 UUID=$(mdtuuid_from_index $mdt_idx $dir)
5862 [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $mdt_idx"
5864 for file in $($LFS find -m $UUID $dir); do
5865 file_midx=$($LFS getstripe -m $file)
5866 [ $file_midx -eq $mdt_idx ] ||
5867 error "lfs find -m $UUID != getstripe -m $file_midx"
5870 run_test 56v "check 'lfs find -m match with lfs getstripe -m'"
5873 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5874 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5876 local dir=$DIR/$tdir
5878 setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
5880 local stripe_size=$($LFS getstripe -S -d $dir) ||
5881 error "$LFS getstripe -S -d $dir failed"
5882 stripe_size=${stripe_size%% *}
5884 local file_size=$((stripe_size * OSTCOUNT))
5885 local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
5886 local required_space=$((file_num * file_size))
5887 local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
5889 [[ $free_space -le $((required_space / 1024)) ]] &&
5890 skip_env "need $required_space, have $free_space kbytes"
5893 local dd_count=$((file_size / dd_bs))
5895 # write data into the files
5900 for i in $(seq $NUMFILES); do
5902 yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5903 error "write data into $file failed"
5905 for i in $(seq $NUMDIRS); do
5906 for j in $(seq $NUMFILES); do
5907 file=$dir/dir$i/file$j
5908 yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5909 error "write data into $file failed"
5913 # $LFS_MIGRATE will fail if hard link migration is unsupported
5914 if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then
5915 createmany -l$dir/dir1/file1 $dir/dir1/link 200 ||
5916 error "creating links to $dir/dir1/file1 failed"
5921 [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
5924 local cmd="$LFS_MIGRATE -y -c $expected $dir/file1"
5927 eval $cmd || error "$cmd failed"
5929 check_stripe_count $dir/file1 $expected
5931 if [ $MDS1_VERSION -ge $(version_code 2.6.90) ];
5933 # lfs_migrate file onto OST 0 if it is on OST 1, or onto
5934 # OST 1 if it is on OST 0. This file is small enough to
5935 # be on only one stripe.
5936 file=$dir/migr_1_ost
5937 dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
5938 error "write data into $file failed"
5939 local obdidx=$($LFS getstripe -i $file)
5940 local oldmd5=$(md5sum $file)
5943 [[ $obdidx -eq 0 ]] && newobdidx=1
5944 cmd="$LFS migrate -i $newobdidx $file"
5946 eval $cmd || error "$cmd failed"
5948 local realobdix=$($LFS getstripe -i $file)
5949 local newmd5=$(md5sum $file)
5951 [[ $newobdidx -ne $realobdix ]] &&
5952 error "new OST is different (was=$obdidx, "\
5953 "wanted=$newobdidx, got=$realobdix)"
5954 [[ "$oldmd5" != "$newmd5" ]] &&
5955 error "md5sum differ: $oldmd5, $newmd5"
5959 cmd="$LFS_MIGRATE -y -c $expected $dir/dir1"
5961 eval $cmd || error "$cmd failed"
5963 for j in $(seq $NUMFILES); do
5964 check_stripe_count $dir/dir1/file$j $expected
5967 # lfs_migrate works with lfs find
5968 cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir |
5969 $LFS_MIGRATE -y -c $expected"
5971 eval $cmd || error "$cmd failed"
5973 for i in $(seq 2 $NUMFILES); do
5974 check_stripe_count $dir/file$i $expected
5976 for i in $(seq 2 $NUMDIRS); do
5977 for j in $(seq $NUMFILES); do
5978 check_stripe_count $dir/dir$i/file$j $expected
5982 run_test 56w "check lfs_migrate -c stripe_count works"
5985 local file1=$DIR/$tdir/file1
5986 local create_pool=false
5987 local initial_pool=$($LFS getstripe -p $DIR)
5991 echo -n "Creating test dir..."
5992 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5995 echo -n "Creating test file..."
5996 touch $file1 || error "cannot create file"
5999 echo -n "Detecting existing pools..."
6000 pool_list=($($LFS pool_list $FSNAME | grep "$FSNAME\." | cut -d. -f2))
6002 if [ ${#pool_list[@]} -gt 0 ]; then
6003 echo "${pool_list[@]}"
6004 for thispool in "${pool_list[@]}"; do
6005 if [[ -z "$initial_pool" ||
6006 "$initial_pool" != "$thispool" ]]; then
6008 echo "Using existing pool '$pool'"
6013 echo "none detected."
6015 if [ -z "$pool" ]; then
6016 pool=${POOL:-testpool}
6017 [ "$initial_pool" = "$pool" ] && pool="testpool2"
6018 echo -n "Creating pool '$pool'..."
6020 pool_add $pool &> /dev/null ||
6021 error "pool_add failed"
6024 echo -n "Adding target to pool..."
6025 pool_add_targets $pool 0 0 1 &> /dev/null ||
6026 error "pool_add_targets failed"
6030 echo -n "Setting pool using -p option..."
6031 $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null ||
6032 error "migrate failed rc = $?"
6035 echo -n "Verifying test file is in pool after migrating..."
6036 [ "$($LFS getstripe -p $file1)" = $pool ] ||
6037 error "file was not migrated to pool $pool"
6040 echo -n "Removing test file from pool '$pool'..."
6041 $LFS migrate $file1 &> /dev/null ||
6042 error "cannot remove from pool"
6043 [ "$($LFS getstripe -p $file1)" ] &&
6044 error "pool still set"
6047 echo -n "Setting pool using --pool option..."
6048 $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null ||
6049 error "migrate failed rc = $?"
6054 if $create_pool; then
6055 destroy_test_pools 2> /dev/null ||
6056 error "destroy test pools failed"
6059 run_test 56wb "check lfs_migrate pool support"
6062 local file1="$DIR/$tdir/file1"
6064 echo -n "Creating test dir..."
6065 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
6066 local def_stripe_size=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
6067 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
6068 error "cannot set stripe"
6071 echo -n "Setting initial stripe for test file..."
6072 $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
6073 error "cannot set stripe"
6074 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
6075 error "stripe size not set"
6078 # File currently set to -S 512K -c 1
6080 # Ensure -c and -S options are rejected when -R is set
6081 echo -n "Verifying incompatible options are detected..."
6082 $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null &&
6083 error "incompatible -c and -R options not detected"
6084 $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null &&
6085 error "incompatible -S and -R options not detected"
6088 # Ensure unrecognized options are passed through to 'lfs migrate'
6089 echo -n "Verifying -S option is passed through to lfs migrate..."
6090 $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
6091 error "migration failed"
6092 [ $($LFS getstripe -S "$file1") -eq 1048576 ] ||
6093 error "file was not restriped"
6096 # File currently set to -S 1M -c 1
6098 # Ensure long options are supported
6099 echo -n "Verifying long options supported..."
6100 $LFS_MIGRATE -y --non-block "$file1" &> /dev/null ||
6101 error "long option without argument not supported"
6102 $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
6103 error "long option with argument not supported"
6104 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
6105 error "file not restriped with --stripe-size option"
6108 # File currently set to -S 512K -c 1
6110 if [ "$OSTCOUNT" -gt 1 ]; then
6111 echo -n "Verifying explicit stripe count can be set..."
6112 $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
6113 error "migrate failed"
6114 [ $($LFS getstripe -c "$file1") -eq 2 ] ||
6115 error "file not restriped to explicit count"
6119 # File currently set to -S 512K -c 1 or -S 512K -c 2
6121 # Ensure parent striping is used if -R is set, and no stripe
6122 # count or size is specified
6123 echo -n "Setting stripe for parent directory..."
6124 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
6125 error "cannot set stripe"
6128 echo -n "Verifying restripe option uses parent stripe settings..."
6129 $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
6130 error "migrate failed"
6131 [ $($LFS getstripe -S "$file1") -eq $def_stripe_size ] ||
6132 error "file not restriped to parent settings"
6133 [ $($LFS getstripe -c "$file1") -eq 1 ] ||
6134 error "file not restriped to parent settings"
6137 # File currently set to -S 1M -c 1
6139 # Ensure striping is preserved if -R is not set, and no stripe
6140 # count or size is specified
6141 echo -n "Verifying striping size preserved when not specified..."
6142 local orig_stripe_size=$($LFS getstripe -S "$file1" 2>/dev/null)
6143 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
6144 error "cannot set stripe on parent directory"
6145 $LFS_MIGRATE -y "$file1" &> /dev/null ||
6146 error "migrate failed"
6147 [ $($LFS getstripe -S "$file1") -eq $orig_stripe_size ] ||
6148 error "file was restriped"
6151 # Ensure file name properly detected when final option has no argument
6152 echo -n "Verifying file name properly detected..."
6153 $LFS_MIGRATE -y "$file1" &> /dev/null ||
6154 error "file name interpreted as option argument"
6160 run_test 56wc "check unrecognized options for lfs_migrate are passed through"
6163 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6165 local file1=$DIR/$tdir/file1
6167 echo -n "Creating test dir..."
6168 test_mkdir $DIR/$tdir || error "cannot create dir"
6171 echo -n "Creating test file..."
6175 # Ensure 'lfs migrate' will fail by using a non-existent option,
6176 # and make sure rsync is not called to recover
6177 echo -n "Make sure --no-rsync option works..."
6178 $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 |
6179 grep -q 'refusing to fall back to rsync' ||
6180 error "rsync was called with --no-rsync set"
6183 # Ensure rsync is called without trying 'lfs migrate' first
6184 echo -n "Make sure --rsync option works..."
6185 $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 |
6186 grep -q 'falling back to rsync' &&
6187 error "lfs migrate was called with --rsync set"
6190 echo -n "Make sure --rsync and --no-rsync options are exclusive..."
6191 $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 |
6192 grep -q 'at the same time' ||
6193 error "--rsync and --no-rsync accepted concurrently"
6199 run_test 56wd "check lfs_migrate --rsync and --no-rsync work"
6202 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6203 check_swap_layouts_support
6205 local dir=$DIR/$tdir
6206 local ref1=/etc/passwd
6207 local file1=$dir/file1
6209 test_mkdir $dir || error "creating dir $dir"
6210 $LFS setstripe -c 2 $file1
6212 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
6213 stripe=$($LFS getstripe -c $file1)
6214 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6215 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6220 run_test 56x "lfs migration support"
6223 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6224 check_swap_layouts_support
6226 local dir=$DIR/$tdir/$testnum
6230 local ref1=/etc/passwd
6231 local file1=$dir/file1
6233 $LFS setstripe -c 2 $file1
6235 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
6237 local stripe=$($LFS getstripe -c $file1)
6239 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6240 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6245 run_test 56xa "lfs migration --block support"
6247 check_migrate_links() {
6249 local file1="$dir/file1"
6252 local total_count=$(($begin + $count - 1))
6253 local symlink_count=10
6256 if [ ! -f "$file1" ]; then
6257 echo -n "creating initial file..."
6258 $LFS setstripe -c 1 -S "512k" "$file1" ||
6259 error "cannot setstripe initial file"
6262 echo -n "creating symlinks..."
6263 for s in $(seq 1 $symlink_count); do
6264 ln -s "$file1" "$dir/slink$s" ||
6265 error "cannot create symlinks"
6269 echo -n "creating nonlinked files..."
6270 createmany -o "$dir/uniq" 1 10 &> /dev/null ||
6271 error "cannot create nonlinked files"
6276 if [ ! -f "$dir/file$total_count" ]; then
6277 echo -n "creating hard links $begin:$total_count..."
6278 createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
6279 /dev/null || error "cannot create hard links"
6283 echo -n "checking number of hard links listed in xattrs..."
6284 local fid=$($LFS getstripe -F "$file1")
6285 local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
6288 if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
6289 skip "hard link list has unexpected size, skipping test"
6291 if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
6292 error "link names should exceed xattrs size"
6295 echo -n "migrating files..."
6296 local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir)
6298 [ $rc -eq 0 ] || error "migrate failed rc = $rc"
6301 # make sure all links have been properly migrated
6302 echo -n "verifying files..."
6303 fid=$($LFS getstripe -F "$file1") ||
6304 error "cannot get fid for file $file1"
6305 for i in $(seq 2 $total_count); do
6306 local fid2=$($LFS getstripe -F $dir/file$i)
6308 [ "$fid2" == "$fid" ] ||
6309 error "migrated hard link has mismatched FID"
6312 # make sure hard links were properly detected, and migration was
6313 # performed only once for the entire link set; nonlinked files should
6315 local actual=$(grep -c 'done' <<< "$migrate_out")
6316 local expected=$(($uniq_count + 1))
6318 [ "$actual" -eq "$expected" ] ||
6319 error "hard links individually migrated ($actual != $expected)"
6321 # make sure the correct number of hard links are present
6322 local hardlinks=$(stat -c '%h' "$file1")
6324 [ $hardlinks -eq $total_count ] ||
6325 error "num hard links $hardlinks != $total_count"
6332 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
6333 skip "Need MDS version at least 2.10.55"
6335 local dir="$DIR/$tdir"
6337 test_mkdir "$dir" || error "cannot create dir $dir"
6339 echo "testing lfs migrate mode when all links fit within xattrs"
6340 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 2 99
6342 echo "testing rsync mode when all links fit within xattrs"
6343 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 2 99
6345 echo "testing lfs migrate mode when all links do not fit within xattrs"
6346 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100
6348 echo "testing rsync mode when all links do not fit within xattrs"
6349 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 101 100
6355 run_test 56xb "lfs migration hard link support"
6358 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6360 local dir="$DIR/$tdir"
6362 test_mkdir "$dir" || error "cannot create dir $dir"
6364 # Test 1: ensure file < 1 GB is always migrated with 1 stripe
6365 echo -n "Setting initial stripe for 20MB test file..."
6366 $LFS setstripe -c 2 -i 0 "$dir/20mb" ||
6367 error "cannot setstripe 20MB file"
6369 echo -n "Sizing 20MB test file..."
6370 truncate "$dir/20mb" 20971520 || error "cannot create 20MB test file"
6372 echo -n "Verifying small file autostripe count is 1..."
6373 $LFS_MIGRATE -y -A -C 1 "$dir/20mb" ||
6374 error "cannot migrate 20MB file"
6375 local stripe_count=$($LFS getstripe -c "$dir/20mb") ||
6376 error "cannot get stripe for $dir/20mb"
6377 [ $stripe_count -eq 1 ] ||
6378 error "unexpected stripe count $stripe_count for 20MB file"
6382 # Test 2: File is small enough to fit within the available space on
6383 # sqrt(size_in_gb) + 1 OSTs but is larger than 1GB. The file must
6384 # have at least an additional 1KB for each desired stripe for test 3
6385 echo -n "Setting stripe for 1GB test file..."
6386 $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe 1GB file"
6388 echo -n "Sizing 1GB test file..."
6389 # File size is 1GB + 3KB
6390 truncate "$dir/1gb" 1073744896 || error "cannot create 1GB test file"
6393 # need at least 512MB per OST for 1GB file to fit in 2 stripes
6394 local avail=$($LCTL get_param -n llite.$FSNAME*.kbytesavail)
6395 if (( avail > 524288 * OSTCOUNT )); then
6396 echo -n "Migrating 1GB file..."
6397 $LFS_MIGRATE -y -A -C 1 "$dir/1gb" ||
6398 error "cannot migrate 1GB file"
6400 echo -n "Verifying autostripe count is sqrt(n) + 1..."
6401 stripe_count=$($LFS getstripe -c "$dir/1gb") ||
6402 error "cannot getstripe for 1GB file"
6403 [ $stripe_count -eq 2 ] ||
6404 error "unexpected stripe count $stripe_count != 2"
6408 # Test 3: File is too large to fit within the available space on
6409 # sqrt(n) + 1 OSTs. Simulate limited available space with -X
6410 if [ $OSTCOUNT -ge 3 ]; then
6411 # The required available space is calculated as
6412 # file size (1GB + 3KB) / OST count (3).
6413 local kb_per_ost=349526
6415 echo -n "Migrating 1GB file with limit..."
6416 $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" ||
6417 error "cannot migrate 1GB file with limit"
6420 stripe_count=$($LFS getstripe -c "$dir/1gb")
6421 echo -n "Verifying 1GB autostripe count with limited space..."
6422 [ "$stripe_count" -a $stripe_count -ge 3 ] ||
6423 error "unexpected stripe count $stripe_count (min 3)"
6430 run_test 56xc "lfs migration autostripe"
6433 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
6434 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
6437 local dir=$DIR/$tdir
6441 test_mkdir -p $dir || error "creating dir $dir"
6442 touch $f1 || error "creating std file $f1"
6443 $MULTIOP $f2 H2c || error "creating released file $f2"
6445 # a directory can be raid0, so ask only for files
6446 res=$($LFS find $dir -L raid0 -type f | wc -l)
6447 [[ $res == 2 ]] || error "search raid0: found $res files != 2"
6449 res=$($LFS find $dir \! -L raid0 -type f | wc -l)
6450 [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
6452 # only files can be released, so no need to force file search
6453 res=$($LFS find $dir -L released)
6454 [[ $res == $f2 ]] || error "search released: found $res != $f2"
6456 res=$($LFS find $dir -type f \! -L released)
6457 [[ $res == $f1 ]] || error "search !released: found $res != $f1"
6459 run_test 56y "lfs find -L raid0|released"
6461 test_56z() { # LU-4824
6462 # This checks to make sure 'lfs find' continues after errors
6463 # There are two classes of errors that should be caught:
6464 # - If multiple paths are provided, all should be searched even if one
6466 # - If errors are encountered during the search, it should not terminate
6468 local dir=$DIR/$tdir
6472 for i in d{0..9}; do
6474 touch $dir/$i/$tfile
6476 $LFS find $DIR/non_existent_dir $dir &&
6477 error "$LFS find did not return an error"
6478 # Make a directory unsearchable. This should NOT be the last entry in
6479 # directory order. Arbitrarily pick the 6th entry
6480 chmod 700 $($LFS find $dir -type d | sed '6!d')
6482 $RUNAS $LFS find $DIR/non_existent $dir
6483 local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l)
6485 # The user should be able to see 10 directories and 9 files
6486 (( count == 19 )) ||
6487 error "$LFS find found $count != 19 entries after error"
6489 run_test 56z "lfs find should continue after an error"
6491 test_56aa() { # LU-5937
6492 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
6494 local dir=$DIR/$tdir
6497 $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
6499 createmany -o $dir/striped_dir/${tfile}- 1024
6500 local dirs=$($LFS find --size +8k $dir/)
6502 [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
6504 run_test 56aa "lfs find --size under striped dir"
6506 test_56ab() { # LU-10705
6507 test_mkdir $DIR/$tdir
6508 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
6509 dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
6510 dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
6511 # Flush writes to ensure valid blocks. Need to be more thorough for
6512 # ZFS, since blocks are not allocated/returned to client immediately.
6514 wait_zfs_commit ost1 2
6515 cancel_lru_locks osc
6518 local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
6520 [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
6522 files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
6523 [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
6525 rm -f $DIR/$tdir/$tfile.[123]
6527 run_test 56ab "lfs find --blocks"
6530 [ $MDS1_VERSION -lt $(version_code 2.10.50) ] &&
6531 skip "Need MDS version at least 2.10.50"
6533 # Create composite files with one component
6534 local dir=$DIR/$tdir
6536 setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
6537 # Create composite files with three components
6538 setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
6539 # Create non-composite files
6540 createmany -o $dir/${tfile}- 10
6542 local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l)
6544 [[ $nfiles == 10 ]] ||
6545 error "lfs find -E 1M found $nfiles != 10 files"
6547 nfiles=$($LFS find ! -E 1M --type f $dir | wc -l)
6548 [[ $nfiles == 25 ]] ||
6549 error "lfs find ! -E 1M found $nfiles != 25 files"
6551 # All files have a component that starts at 0
6552 nfiles=$($LFS find --component-start 0 --type f $dir | wc -l)
6553 [[ $nfiles == 35 ]] ||
6554 error "lfs find --component-start 0 - $nfiles != 35 files"
6556 nfiles=$($LFS find --component-start 2M --type f $dir | wc -l)
6557 [[ $nfiles == 15 ]] ||
6558 error "lfs find --component-start 2M - $nfiles != 15 files"
6560 # All files created here have a componenet that does not starts at 2M
6561 nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l)
6562 [[ $nfiles == 35 ]] ||
6563 error "lfs find ! --component-start 2M - $nfiles != 35 files"
6565 # Find files with a specified number of components
6566 local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l)
6567 [[ $nfiles == 15 ]] ||
6568 error "lfs find --component-count 3 - $nfiles != 15 files"
6570 # Remember non-composite files have a component count of zero
6571 local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l)
6572 [[ $nfiles == 10 ]] ||
6573 error "lfs find --component-count 0 - $nfiles != 10 files"
6575 nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l)
6576 [[ $nfiles == 20 ]] ||
6577 error "lfs find ! --component-count 3 - $nfiles != 20 files"
6579 # All files have a flag called "init"
6580 local nfiles=$($LFS find --component-flags init --type f $dir | wc -l)
6581 [[ $nfiles == 35 ]] ||
6582 error "lfs find --component-flags init - $nfiles != 35 files"
6584 # Multi-component files will have a component not initialized
6585 local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l)
6586 [[ $nfiles == 15 ]] ||
6587 error "lfs find !--component-flags init - $nfiles != 15 files"
6592 run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
6595 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
6596 skip "Need MDS version at least 2.10.57"
6606 # create mirrored directories and mirrored files
6607 mkdir $td || error "mkdir $td failed"
6608 $LFS mirror create -N3 $td || error "create mirrored dir $td failed"
6609 createmany -o $tf- 10 || error "create $tf- failed"
6611 for i in $(seq 2); do
6613 mkdir $dir || error "mkdir $dir failed"
6614 $LFS mirror create -N$((3 + i)) $dir ||
6615 error "create mirrored dir $dir failed"
6616 createmany -o $dir/$tfile- 10 ||
6617 error "create $dir/$tfile- failed"
6620 # change the states of some mirrored files
6622 for i in $(seq 2); do
6624 for j in $(seq 4 9); do
6625 echo foo > $dir/$tfile-$j
6629 # find mirrored files with specific mirror count
6630 cmd="$LFS find --mirror-count 3 --type f $td"
6631 nfiles=$($cmd | wc -l)
6632 [[ $nfiles = 10 ]] || error "$cmd: $nfiles != 10 files"
6634 cmd="$LFS find ! --mirror-count 3 --type f $td"
6635 nfiles=$($cmd | wc -l)
6636 [[ $nfiles = 20 ]] || error "$cmd: $nfiles != 20 files"
6638 cmd="$LFS find --mirror-count +2 --type f $td"
6639 nfiles=$($cmd | wc -l)
6640 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6642 cmd="$LFS find --mirror-count -6 --type f $td"
6643 nfiles=$($cmd | wc -l)
6644 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6646 # find mirrored files with specific file state
6647 cmd="$LFS find --maxdepth 1 --mirror-state=^ro --type f $td"
6648 [[ $($cmd) = $tf-6 ]] || error "$cmd: didn't return $tf-6"
6650 cmd="$LFS find --mirror-state=ro --type f $td"
6651 nfiles=$($cmd | wc -l)
6652 [[ $nfiles = 17 ]] || error "$cmd: $nfiles != 17 files"
6654 cmd="$LFS find ! --mirror-state=ro --type f $td"
6655 nfiles=$($cmd | wc -l)
6656 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6658 cmd="$LFS find --mirror-state=wp --type f $td"
6659 nfiles=$($cmd | wc -l)
6660 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6662 cmd="$LFS find ! --mirror-state=sp --type f $td"
6663 nfiles=$($cmd | wc -l)
6664 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6666 run_test 56ca "check lfs find --mirror-count|-N and --mirror-state"
6669 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6670 # note test will not do anything if MDS is not local
6671 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6672 skip_env "ldiskfs only test"
6674 remote_mds_nodsh && skip "remote MDS with nodsh"
6676 local MNTDEV="osd*.*MDT*.mntdev"
6677 DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV)
6678 [ -z "$DEV" ] && error "can't access $MNTDEV"
6679 for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
6680 do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
6681 error "can't access $DEV"
6682 DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
6683 [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
6687 run_test 57a "verify MDS filesystem created with large inodes =="
6690 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6691 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6692 skip_env "ldiskfs only test"
6694 remote_mds_nodsh && skip "remote MDS with nodsh"
6696 local dir=$DIR/$tdir
6699 local fileN=$dir/f$filecount
6701 rm -rf $dir || error "removing $dir"
6703 local mdtidx=$($LFS getstripe -m $dir)
6704 local mdtname=MDT$(printf %04x $mdtidx)
6705 local facet=mds$((mdtidx + 1))
6707 echo "mcreating $filecount files"
6708 createmany -m $dir/f 1 $filecount || error "creating files in $dir"
6710 # verify that files do not have EAs yet
6711 $LFS getstripe $file1 2>&1 | grep -q "no stripe" ||
6712 error "$file1 has an EA"
6713 $LFS getstripe $fileN 2>&1 | grep -q "no stripe" ||
6714 error "$fileN has an EA"
6718 df $dir #make sure we get new statfs data
6719 local mdsfree=$(do_facet $facet \
6720 lctl get_param -n osd*.*$mdtname.kbytesfree)
6721 local mdcfree=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6724 echo "opening files to create objects/EAs"
6725 for file in $(seq -f $dir/f%g 1 $filecount); do
6726 $OPENFILE -f O_RDWR $file > /dev/null 2>&1 ||
6727 error "opening $file"
6730 # verify that files have EAs now
6731 $LFS getstripe $file1 | grep -q "obdidx" || error "$file1 missing EA"
6732 $LFS getstripe $fileN | grep -q "obdidx" || error "$fileN missing EA"
6734 sleep 1 #make sure we get new statfs data
6736 local mdsfree2=$(do_facet $facet \
6737 lctl get_param -n osd*.*$mdtname.kbytesfree)
6738 local mdcfree2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6740 if [[ $mdcfree2 -lt $((mdcfree - 16)) ]]; then
6741 if [ "$mdsfree" != "$mdsfree2" ]; then
6742 error "MDC before $mdcfree != after $mdcfree2"
6744 echo "MDC before $mdcfree != after $mdcfree2"
6745 echo "unable to confirm if MDS has large inodes"
6750 run_test 57b "default LOV EAs are stored inside large inodes ==="
6753 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6754 [ -z "$(which wiretest 2>/dev/null)" ] &&
6755 skip_env "could not find wiretest"
6759 run_test 58 "verify cross-platform wire constants =============="
6762 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6764 echo "touch 130 files"
6765 createmany -o $DIR/f59- 130
6767 unlinkmany $DIR/f59- 130
6769 # wait for commitment of removal
6770 wait_delete_completed
6772 run_test 59 "verify cancellation of llog records async ========="
6774 TEST60_HEAD="test_60 run $RANDOM"
6776 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6777 remote_mgs_nodsh && skip "remote MGS with nodsh"
6778 do_facet mgs "! which run-llog.sh &> /dev/null" &&
6779 do_facet mgs "! ls run-llog.sh &> /dev/null" &&
6780 skip_env "missing subtest run-llog.sh"
6782 log "$TEST60_HEAD - from kernel mode"
6783 do_facet mgs "$LCTL dk > /dev/null"
6784 do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed"
6785 do_facet mgs $LCTL dk > $TMP/$tfile
6787 # LU-6388: test llog_reader
6788 local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
6789 llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
6790 [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
6791 skip_env "missing llog_reader"
6792 local fstype=$(facet_fstype mgs)
6793 [ $fstype != ldiskfs -a $fstype != zfs ] &&
6794 skip_env "Only for ldiskfs or zfs type mgs"
6796 local mntpt=$(facet_mntpt mgs)
6797 local mgsdev=$(mgsdevname 1)
6809 #get fid and record list
6810 fid_list=($(awk '/9_sub.*record/ { print $NF }' /$TMP/$tfile |
6812 rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' /$TMP/$tfile |
6814 #remount mgs as ldiskfs or zfs type
6815 stop mgs || error "stop mgs failed"
6816 mount_fstype mgs || error "remount mgs failed"
6817 for ((i = 0; i < ${#fid_list[@]}; i++)); do
6820 seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
6821 oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
6826 obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
6828 obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
6830 echo "obj_file is $obj_file"
6831 do_facet mgs $llog_reader $obj_file
6833 rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
6834 awk '{ print $3 }' | sed -e "s/^type=//g")
6835 if [ $rec_type != $rec ]; then
6836 echo "FAILED test_60a wrong record type $rec_type," \
6842 #check obj path if record type is LLOG_LOGID_MAGIC
6843 if [ "$rec" == "1064553b" ]; then
6844 path=$(do_facet mgs $llog_reader $obj_file |
6845 grep "path=" | awk '{ print $NF }' |
6846 sed -e "s/^path=//g")
6847 if [ $obj_file != $mntpt/$path ]; then
6848 echo "FAILED test_60a wrong obj path" \
6849 "$montpt/$path, should be $obj_file"
6856 #restart mgs before "error", otherwise it will block the next test
6857 stop mgs || error "stop mgs failed"
6858 start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
6859 $pass || error "test failed, see FAILED test_60a messages for specifics"
6861 run_test 60a "llog_test run from kernel module and test llog_reader"
6863 test_60b() { # bug 6411
6864 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6867 LLOG_COUNT=$(do_facet mgs dmesg |
6868 awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
6869 /llog_[a-z]*.c:[0-9]/ {
6881 [[ $LLOG_COUNT -gt 120 ]] &&
6882 error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
6884 run_test 60b "limit repeated messages from CERROR/CWARN"
6887 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6889 echo "create 5000 files"
6890 createmany -o $DIR/f60c- 5000
6891 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137
6892 lctl set_param fail_loc=0x80000137
6893 unlinkmany $DIR/f60c- 5000
6894 lctl set_param fail_loc=0
6896 run_test 60c "unlink file when mds full"
6899 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6901 SAVEPRINTK=$(lctl get_param -n printk)
6902 # verify "lctl mark" is even working"
6903 MESSAGE="test message ID $RANDOM $$"
6904 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6905 dmesg | grep -q "$MESSAGE" || error "didn't find debug marker in log"
6907 lctl set_param printk=0 || error "set lnet.printk failed"
6908 lctl get_param -n printk | grep emerg || error "lnet.printk dropped emerg"
6909 MESSAGE="new test message ID $RANDOM $$"
6910 # Assume here that libcfs_debug_mark_buffer() uses D_WARNING
6911 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6912 dmesg | grep -q "$MESSAGE" && error "D_WARNING wasn't masked" || true
6914 lctl set_param -n printk="$SAVEPRINTK"
6916 run_test 60d "test printk console message masking"
6919 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6920 remote_mds_nodsh && skip "remote MDS with nodsh"
6923 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
6924 do_facet mds1 lctl set_param fail_loc=0x15b
6927 run_test 60e "no space while new llog is being created"
6932 test_mkdir -c $MDSCOUNT $DIR/$tdir
6933 $LFS setdirstripe -D -i -1 -c $MDSCOUNT $DIR/$tdir
6938 mkdir $DIR/$tdir/subdir$index 2>/dev/null
6939 rmdir $DIR/$tdir/subdir$index 2>/dev/null
6940 index=$((index + 1))
6946 for i in $(seq 100); do
6947 # define OBD_FAIL_OSD_TXN_START 0x19a
6948 do_facet mds1 lctl set_param fail_loc=0x8000019a
6954 mkdir $DIR/$tdir/new || error "mkdir failed"
6955 rmdir $DIR/$tdir/new || error "rmdir failed"
6957 run_test 60g "transaction abort won't cause MDT hung"
6960 [ $MDS1_VERSION -le $(version_code 2.12.52) ] &&
6961 skip "Need MDS version at least 2.12.52"
6962 [ $MDSCOUNT -lt 2 ] && skip "Need at least 2 MDTs"
6966 #define OBD_FAIL_MDS_STRIPE_CREATE 0x188
6967 #define OBD_FAIL_MDS_STRIPE_FID 0x189
6968 for fail_loc in 0x80000188 0x80000189; do
6969 do_facet mds1 "$LCTL set_param fail_loc=$fail_loc"
6970 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir-$fail_loc ||
6971 error "mkdir $dir-$fail_loc failed"
6972 for i in {0..10}; do
6973 # create may fail on missing stripe
6974 echo $i > $DIR/$tdir-$fail_loc/$i
6976 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6977 error "getdirstripe $tdir-$fail_loc failed"
6978 $LFS migrate -m 1 $DIR/$tdir-$fail_loc ||
6979 error "migrate $tdir-$fail_loc failed"
6980 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6981 error "getdirstripe $tdir-$fail_loc failed"
6982 pushd $DIR/$tdir-$fail_loc
6984 echo $f | cmp $f - || error "$f data mismatch"
6987 rm -rf $DIR/$tdir-$fail_loc
6990 run_test 60h "striped directory with missing stripes can be accessed"
6993 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6996 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1 || error "dd $f failed"
6997 cancel_lru_locks osc
6998 $MULTIOP $f OSMWUc || error "$MULTIOP $f failed"
7001 run_test 61a "mmap() writes don't make sync hang ================"
7004 mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
7006 run_test 61b "mmap() of unstriped file is successful"
7008 # bug 2330 - insufficient obd_match error checking causes LBUG
7010 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7014 cancel_lru_locks osc
7015 lctl set_param fail_loc=0x405
7016 cat $f && error "cat succeeded, expect -EIO"
7017 lctl set_param fail_loc=0
7019 # This test is now irrelevant (as of bug 10718 inclusion), we no longer
7020 # match every page all of the time.
7021 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
7023 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
7024 # Though this test is irrelevant anymore, it helped to reveal some
7025 # other grant bugs (LU-4482), let's keep it.
7026 test_63a() { # was test_63
7027 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7029 MAX_DIRTY_MB=$(lctl get_param -n osc.*.max_dirty_mb | head -n 1)
7031 for i in `seq 10` ; do
7032 dd if=/dev/zero of=$DIR/f63 bs=8k &
7038 rm -f $DIR/f63 || true
7040 run_test 63a "Verify oig_wait interruption does not crash ======="
7042 # bug 2248 - async write errors didn't return to application on sync
7043 # bug 3677 - async write errors left page locked
7045 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7048 lctl set_param debug=-1
7050 # ensure we have a grant to do async writes
7051 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
7054 sync # sync lest earlier test intercept the fail_loc
7056 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
7057 lctl set_param fail_loc=0x80000406
7058 $MULTIOP $DIR/$tfile Owy && \
7059 error "sync didn't return ENOMEM"
7060 sync; sleep 2; sync # do a real sync this time to flush page
7061 lctl get_param -n llite.*.dump_page_cache | grep locked && \
7062 error "locked page left in cache after async error" || true
7065 run_test 63b "async write errors should be returned to fsync ==="
7068 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7071 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
7073 run_test 64a "verify filter grant calculations (in kernel) ====="
7076 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7078 sh oos.sh $MOUNT || error "oos.sh failed: $?"
7080 run_test 64b "check out-of-space detection on client"
7083 $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
7085 run_test 64c "verify grant shrink"
7087 # this does exactly what osc_request.c:osc_announce_cached() does in
7088 # order to calculate max amount of grants to ask from server
7092 local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc)
7093 local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight)
7095 ((rpc_in_flight ++));
7096 nrpages=$((nrpages * rpc_in_flight))
7098 local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb)
7100 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
7102 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
7103 local undirty=$((nrpages * PAGE_SIZE))
7105 local max_extent_pages
7106 max_extent_pages=$($LCTL get_param osc.${tgt}.import |
7107 grep grant_max_extent_size | awk '{print $2}')
7108 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
7109 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
7110 local grant_extent_tax
7111 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
7112 grep grant_extent_tax | awk '{print $2}')
7114 undirty=$((undirty + nrextents * grant_extent_tax))
7119 # this is size of unit for grant allocation. It should be equal to
7120 # what tgt_grant.c:tgt_grant_chunk() calculates
7124 local grant_extent_tax
7126 max_brw_size=$($LCTL get_param osc.${tgt}.import |
7127 grep max_brw_size | awk '{print $2}')
7129 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
7130 grep grant_extent_tax | awk '{print $2}')
7132 echo $(((max_brw_size + grant_extent_tax) * 2))
7136 [ $OST1_VERSION -lt $(version_code 2.10.56) ] &&
7137 skip "OST < 2.10.55 doesn't limit grants enough"
7139 local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}')
7140 local file=$DIR/$tfile
7142 [[ $($LCTL get_param osc.${tgt}.import |
7143 grep "connect_flags:.*grant_param") ]] ||
7144 skip "no grant_param connect flag"
7146 local olddebug=$($LCTL get_param -n debug 2> /dev/null)
7148 $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true
7150 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
7151 stack_trap "rm -f $file" EXIT
7153 $LFS setstripe $file -i 0 -c 1
7154 dd if=/dev/zero of=$file bs=1M count=1000 &
7159 local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes)
7160 if [[ $cur_grant -gt $max_cur_granted ]]
7163 error "cur_grant $cur_grant > $max_cur_granted"
7166 [[ $? -ne 0 ]] && break;
7171 wait_delete_completed
7172 $LCTL set_param debug="$olddebug" 2> /dev/null || true
7174 run_test 64d "check grant limit exceed"
7176 # bug 1414 - set/get directories' stripe info
7178 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7180 test_mkdir $DIR/$tdir
7182 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
7184 run_test 65a "directory with no stripe info"
7187 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7189 test_mkdir $DIR/$tdir
7190 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7192 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7195 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
7197 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
7200 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7201 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
7203 test_mkdir $DIR/$tdir
7204 local stripesize=$($LFS getstripe -S $DIR/$tdir)
7206 $LFS setstripe -S $((stripesize * 4)) -i 1 \
7207 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
7209 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
7211 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
7214 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7216 test_mkdir $DIR/$tdir
7217 local STRIPECOUNT=$($LFS getstripe -c $DIR/$tdir)
7218 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7220 if [[ $STRIPECOUNT -le 0 ]]; then
7222 elif [[ $STRIPECOUNT -gt $LOV_MAX_STRIPE_COUNT ]]; then
7223 [[ $OSTCOUNT -gt $LOV_MAX_STRIPE_COUNT ]] &&
7224 sc=$LOV_MAX_STRIPE_COUNT || sc=$(($OSTCOUNT - 1))
7226 sc=$(($STRIPECOUNT - 1))
7228 $LFS setstripe -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
7229 touch $DIR/$tdir/f4 $DIR/$tdir/f5
7230 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
7231 error "lverify failed"
7233 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
7236 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7238 test_mkdir $DIR/$tdir
7240 $LFS setstripe $DIR/$tdir || error "setstripe"
7241 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7242 error "no stripe info failed"
7244 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
7246 run_test 65e "directory setstripe defaults"
7249 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7251 test_mkdir $DIR/${tdir}f
7252 $RUNAS $LFS setstripe $DIR/${tdir}f &&
7253 error "setstripe succeeded" || true
7255 run_test 65f "dir setstripe permission (should return error) ==="
7258 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7260 test_mkdir $DIR/$tdir
7261 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7263 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7264 error "setstripe -S failed"
7265 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
7266 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7267 error "delete default stripe failed"
7269 run_test 65g "directory setstripe -d"
7272 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7274 test_mkdir $DIR/$tdir
7275 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7277 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7278 error "setstripe -S failed"
7279 test_mkdir $DIR/$tdir/dd1
7280 [ $($LFS getstripe -c $DIR/$tdir) = $($LFS getstripe -c $DIR/$tdir/dd1) ] ||
7281 error "stripe info inherit failed"
7283 run_test 65h "directory stripe info inherit ===================="
7286 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7288 save_layout_restore_at_exit $MOUNT
7290 # bug6367: set non-default striping on root directory
7291 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
7293 # bug12836: getstripe on -1 default directory striping
7294 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
7296 # bug12836: getstripe -v on -1 default directory striping
7297 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
7299 # bug12836: new find on -1 default directory striping
7300 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
7302 run_test 65i "various tests to set root directory striping"
7304 test_65j() { # bug6367
7305 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7309 # if we aren't already remounting for each test, do so for this test
7310 if [ "$I_MOUNTED" = "yes" ]; then
7311 cleanup || error "failed to unmount"
7315 save_layout_restore_at_exit $MOUNT
7317 $LFS setstripe -d $MOUNT || error "setstripe failed"
7319 run_test 65j "set default striping on root directory (bug 6367)="
7323 wait_delete_completed
7324 do_facet $SINGLEMDS "lctl set_param -n \
7325 osp.$ost*MDT0000.max_create_count=$max_count"
7326 do_facet $SINGLEMDS "lctl set_param -n \
7327 osp.$ost*MDT0000.create_count=$count"
7328 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7329 echo $INACTIVE_OSC "is Activate"
7331 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7334 test_65k() { # bug11679
7335 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7336 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7337 remote_mds_nodsh && skip "remote MDS with nodsh"
7339 local disable_precreate=true
7340 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
7341 disable_precreate=false
7343 echo "Check OST status: "
7344 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
7345 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
7347 for OSC in $MDS_OSCS; do
7348 echo $OSC "is active"
7349 do_facet $SINGLEMDS lctl --device %$OSC activate
7352 for INACTIVE_OSC in $MDS_OSCS; do
7353 local ost=$(osc_to_ost $INACTIVE_OSC)
7354 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
7355 lov.*md*.target_obd |
7356 awk -F: /$ost/'{ print $1 }' | head -n 1)
7359 $LFS setstripe -i $ostnum -c 1 $DIR/$tdir
7360 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
7362 echo "Deactivate: " $INACTIVE_OSC
7363 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
7365 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
7366 osp.$ost*MDT0000.create_count")
7367 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
7368 osp.$ost*MDT0000.max_create_count")
7369 $disable_precreate &&
7370 do_facet $SINGLEMDS "lctl set_param -n \
7371 osp.$ost*MDT0000.max_create_count=0"
7373 for idx in $(seq 0 $((OSTCOUNT - 1))); do
7374 [ -f $DIR/$tdir/$idx ] && continue
7375 echo "$LFS setstripe -i $idx -c 1 $DIR/$tdir/$idx"
7376 $LFS setstripe -i $idx -c 1 $DIR/$tdir/$idx ||
7378 error "setstripe $idx should succeed"; }
7379 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
7381 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
7384 do_facet $SINGLEMDS "lctl set_param -n \
7385 osp.$ost*MDT0000.max_create_count=$max_count"
7386 do_facet $SINGLEMDS "lctl set_param -n \
7387 osp.$ost*MDT0000.create_count=$count"
7388 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7389 echo $INACTIVE_OSC "is Activate"
7391 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7394 run_test 65k "validate manual striping works properly with deactivated OSCs"
7396 test_65l() { # bug 12836
7397 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7399 test_mkdir -p $DIR/$tdir/test_dir
7400 $LFS setstripe -c -1 $DIR/$tdir/test_dir
7401 $LFS find -mtime -1 $DIR/$tdir >/dev/null
7403 run_test 65l "lfs find on -1 stripe dir ========================"
7406 local layout=$(save_layout $MOUNT)
7407 $RUNAS $LFS setstripe -c 2 $MOUNT && {
7408 restore_layout $MOUNT $layout
7409 error "setstripe should fail by non-root users"
7413 run_test 65m "normal user can't set filesystem default stripe"
7416 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
7417 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.50) ]] ||
7418 skip "Need MDS version at least 2.12.50"
7419 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7421 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7422 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7423 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7425 local root_layout=$(save_layout $MOUNT)
7426 stack_trap "restore_layout $MOUNT $root_layout" EXIT
7428 # new subdirectory under root directory should not inherit
7429 # the default layout from root
7430 local dir1=$MOUNT/$tdir-1
7431 mkdir $dir1 || error "mkdir $dir1 failed"
7432 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7433 error "$dir1 shouldn't have LOV EA"
7435 # delete the default layout on root directory
7436 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7438 local dir2=$MOUNT/$tdir-2
7439 mkdir $dir2 || error "mkdir $dir2 failed"
7440 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7441 error "$dir2 shouldn't have LOV EA"
7443 # set a new striping pattern on root directory
7444 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7445 local new_def_stripe_size=$((def_stripe_size * 2))
7446 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7447 error "set stripe size on $MOUNT failed"
7449 # new file created in $dir2 should inherit the new stripe size from
7450 # the filesystem default
7451 local file2=$dir2/$tfile-2
7452 touch $file2 || error "touch $file2 failed"
7454 local file2_stripe_size=$($LFS getstripe -S $file2)
7455 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7456 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7458 local dir3=$MOUNT/$tdir-3
7459 mkdir $dir3 || error "mkdir $dir3 failed"
7460 ! getfattr -n trusted.lov $dir3 &> /dev/null ||
7461 error "$dir3 shouldn't have LOV EA"
7463 # set OST pool on root directory
7464 local pool=$TESTNAME
7465 pool_add $pool || error "add $pool failed"
7466 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7467 error "add targets to $pool failed"
7469 $LFS setstripe -p $pool $MOUNT ||
7470 error "set OST pool on $MOUNT failed"
7472 # new file created in $dir3 should inherit the pool from
7473 # the filesystem default
7474 local file3=$dir3/$tfile-3
7475 touch $file3 || error "touch $file3 failed"
7477 local file3_pool=$($LFS getstripe -p $file3)
7478 [[ "$file3_pool" = "$pool" ]] ||
7479 error "$file3 didn't inherit OST pool $pool"
7481 local dir4=$MOUNT/$tdir-4
7482 mkdir $dir4 || error "mkdir $dir4 failed"
7483 ! getfattr -n trusted.lov $dir4 &> /dev/null ||
7484 error "$dir4 shouldn't have LOV EA"
7486 # new file created in $dir4 should inherit the pool from
7487 # the filesystem default
7488 local file4=$dir4/$tfile-4
7489 touch $file4 || error "touch $file4 failed"
7491 local file4_pool=$($LFS getstripe -p $file4)
7492 [[ "$file4_pool" = "$pool" ]] ||
7493 error "$file4 didn't inherit OST pool $pool"
7495 # new subdirectory under non-root directory should inherit
7496 # the default layout from its parent directory
7497 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7498 error "set directory layout on $dir4 failed"
7500 local dir5=$dir4/$tdir-5
7501 mkdir $dir5 || error "mkdir $dir5 failed"
7503 local dir4_layout=$(get_layout_param $dir4)
7504 local dir5_layout=$(get_layout_param $dir5)
7505 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7506 error "$dir5 should inherit the default layout from $dir4"
7508 run_test 65n "don't inherit default layout from root for new subdirectories"
7510 # bug 2543 - update blocks count on client
7512 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7515 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7516 sync; sync_all_data; sync; sync_all_data
7517 cancel_lru_locks osc
7518 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7519 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7521 run_test 66 "update inode blocks count on client ==============="
7524 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7528 swapon -s | awk '($1 == "'$1'") { print $4 }'
7531 # bug5265, obdfilter oa2dentry return -ENOENT
7532 # #define OBD_FAIL_SRV_ENOENT 0x217
7534 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7535 remote_ost_nodsh && skip "remote OST with nodsh"
7538 $LFS setstripe -c 1 -i 0 $f
7540 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
7542 do_facet ost1 lctl set_param fail_loc=0x217
7543 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
7544 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
7546 do_facet ost1 lctl set_param fail_loc=0
7547 $DIRECTIO write $f 0 2 || error "write error"
7549 cancel_lru_locks osc
7550 $DIRECTIO read $f 0 1 || error "read error"
7552 do_facet ost1 lctl set_param fail_loc=0x217
7553 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
7555 do_facet ost1 lctl set_param fail_loc=0
7558 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
7561 test_mkdir $DIR/$tdir
7562 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
7563 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
7565 run_test 71 "Running dbench on lustre (don't segment fault) ===="
7567 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
7568 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7569 [ "$RUNAS_ID" = "$UID" ] &&
7570 skip_env "RUNAS_ID = UID = $UID -- skipping"
7571 # Check that testing environment is properly set up. Skip if not
7572 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
7573 skip_env "User $RUNAS_ID does not exist - skipping"
7576 chmod 777 $DIR/$tfile
7577 chmod ug+s $DIR/$tfile
7578 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
7579 error "$RUNAS dd $DIR/$tfile failed"
7580 # See if we are still setuid/sgid
7581 [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] &&
7582 error "S/gid is not dropped on write"
7583 # Now test that MDS is updated too
7584 cancel_lru_locks mdc
7585 [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] &&
7586 error "S/gid is not dropped on MDS"
7589 run_test 72a "Test that remove suid works properly (bug5695) ===="
7591 test_72b() { # bug 24226 -- keep mode setting when size is not changing
7594 [ "$RUNAS_ID" = "$UID" ] &&
7595 skip_env "RUNAS_ID = UID = $UID -- skipping"
7596 [ "$RUNAS_ID" -eq 0 ] &&
7597 skip_env "RUNAS_ID = 0 -- skipping"
7598 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7599 # Check that testing environment is properly set up. Skip if not
7600 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
7601 skip_env "User $RUNAS_ID does not exist - skipping"
7603 touch $DIR/${tfile}-f{g,u}
7604 test_mkdir $DIR/${tfile}-dg
7605 test_mkdir $DIR/${tfile}-du
7606 chmod 770 $DIR/${tfile}-{f,d}{g,u}
7607 chmod g+s $DIR/${tfile}-{f,d}g
7608 chmod u+s $DIR/${tfile}-{f,d}u
7609 for perm in 777 2777 4777; do
7610 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
7611 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
7612 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
7613 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
7617 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
7619 # bug 3462 - multiple simultaneous MDC requests
7621 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7623 test_mkdir $DIR/d73-1
7624 test_mkdir $DIR/d73-2
7625 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
7628 lctl set_param fail_loc=0x80000129
7629 $MULTIOP $DIR/d73-1/f73-2 Oc &
7631 lctl set_param fail_loc=0
7633 $MULTIOP $DIR/d73-2/f73-3 Oc &
7637 wait $pid1 || return 1
7641 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
7642 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
7643 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
7647 run_test 73 "multiple MDC requests (should not deadlock)"
7649 test_74a() { # bug 6149, 6184
7650 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7653 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7655 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7656 # will spin in a tight reconnection loop
7657 $LCTL set_param fail_loc=0x8000030e
7658 # get any lock that won't be difficult - lookup works.
7660 $LCTL set_param fail_loc=0
7664 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
7666 test_74b() { # bug 13310
7667 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7669 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7671 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7672 # will spin in a tight reconnection loop
7673 $LCTL set_param fail_loc=0x8000030e
7674 # get a "difficult" lock
7676 $LCTL set_param fail_loc=0
7680 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
7683 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7685 #define OBD_FAIL_LDLM_NEW_LOCK
7686 $LCTL set_param fail_loc=0x319
7687 touch $DIR/$tfile && error "touch successful"
7688 $LCTL set_param fail_loc=0
7691 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
7694 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
7697 test_76() { # Now for bug 20433, added originally in bug 1443
7698 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7700 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
7702 cancel_lru_locks osc
7703 BEFORE_INODES=$(num_inodes)
7704 echo "before inodes: $BEFORE_INODES"
7706 [ "$SLOW" = "no" ] && COUNT=100
7707 for i in $(seq $COUNT); do
7711 cancel_lru_locks osc
7712 AFTER_INODES=$(num_inodes)
7713 echo "after inodes: $AFTER_INODES"
7715 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
7717 AFTER_INODES=$(num_inodes)
7719 echo "wait $wait seconds inodes: $AFTER_INODES"
7720 if [ $wait -gt 30 ]; then
7721 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
7725 run_test 76 "confirm clients recycle inodes properly ===="
7731 # Note: in sptlrpc modes which enable its own bulk checksum, the
7732 # original crc32_le bulk checksum will be automatically disabled,
7733 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
7734 # will be checked by sptlrpc code against sptlrpc bulk checksum.
7735 # In this case set_checksums() will not be no-op, because sptlrpc
7736 # bulk checksum will be enabled all through the test.
7738 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
7739 lctl set_param -n osc.*.checksums $1
7743 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7744 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
7745 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7746 tr -d [] | head -n1)}
7749 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
7750 log "set checksum type to $1"
7753 F77_TMP=$TMP/f77-temp
7756 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
7757 error "error writing to $F77_TMP"
7760 test_77a() { # bug 10889
7761 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7762 $GSS && skip_env "could not run with gss"
7764 [ ! -f $F77_TMP ] && setup_f77
7766 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
7770 run_test 77a "normal checksum read/write operation"
7772 test_77b() { # bug 10889
7773 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7774 $GSS && skip_env "could not run with gss"
7776 [ ! -f $F77_TMP ] && setup_f77
7777 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7778 $LCTL set_param fail_loc=0x80000409
7781 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7782 error "dd error: $?"
7783 $LCTL set_param fail_loc=0
7785 for algo in $CKSUM_TYPES; do
7786 cancel_lru_locks osc
7787 set_checksum_type $algo
7788 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7789 $LCTL set_param fail_loc=0x80000408
7790 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
7791 $LCTL set_param fail_loc=0
7794 set_checksum_type $ORIG_CSUM_TYPE
7797 run_test 77b "checksum error on client write, read"
7802 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
7804 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
7805 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
7806 $check_ost && [ -n "$ost_file_prefix" ] &&
7807 do_facet ost1 rm -f ${ost_file_prefix}\*
7811 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7812 $GSS && skip_env "could not run with gss"
7813 remote_ost_nodsh && skip "remote OST with nodsh"
7816 local osc_file_prefix
7818 local check_ost=false
7819 local ost_file_prefix
7825 # ensure corruption will occur on first OSS/OST
7826 $LFS setstripe -i 0 $DIR/$tfile
7828 [ ! -f $F77_TMP ] && setup_f77
7829 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7830 error "dd write error: $?"
7831 fid=$($LFS path2fid $DIR/$tfile)
7833 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
7836 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
7837 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
7839 echo "OSS do not support bulk pages dump upon error"
7842 osc_file_prefix=$($LCTL get_param -n debug_path)
7843 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
7845 trap cleanup_77c EXIT
7848 # enable bulk pages dump upon error on Client
7849 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
7850 # enable bulk pages dump upon error on OSS
7852 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
7854 # flush Client cache to allow next read to reach OSS
7855 cancel_lru_locks osc
7857 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7858 $LCTL set_param fail_loc=0x80000408
7859 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
7860 $LCTL set_param fail_loc=0
7864 # check cksum dump on Client
7865 osc_file=$(ls ${osc_file_prefix}*)
7866 [ -n "$osc_file" ] || error "no checksum dump file on Client"
7867 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
7868 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
7869 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
7870 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
7872 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
7873 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7874 error "dump content does not match on Client"
7876 $check_ost || skip "No need to check cksum dump on OSS"
7878 # check cksum dump on OSS
7879 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
7880 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
7881 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
7882 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
7883 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7884 error "dump content does not match on OSS"
7888 run_test 77c "checksum error on client read with debug"
7890 test_77d() { # bug 10889
7891 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7892 $GSS && skip_env "could not run with gss"
7894 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7895 $LCTL set_param fail_loc=0x80000409
7897 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7898 error "direct write: rc=$?"
7899 $LCTL set_param fail_loc=0
7902 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7903 $LCTL set_param fail_loc=0x80000408
7905 cancel_lru_locks osc
7906 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7907 error "direct read: rc=$?"
7908 $LCTL set_param fail_loc=0
7911 run_test 77d "checksum error on OST direct write, read"
7913 test_77f() { # bug 10889
7914 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7915 $GSS && skip_env "could not run with gss"
7918 for algo in $CKSUM_TYPES; do
7919 cancel_lru_locks osc
7920 set_checksum_type $algo
7921 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7922 $LCTL set_param fail_loc=0x409
7923 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
7924 error "direct write succeeded"
7925 $LCTL set_param fail_loc=0
7927 set_checksum_type $ORIG_CSUM_TYPE
7930 run_test 77f "repeat checksum error on write (expect error)"
7932 test_77g() { # bug 10889
7933 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7934 $GSS && skip_env "could not run with gss"
7935 remote_ost_nodsh && skip "remote OST with nodsh"
7937 [ ! -f $F77_TMP ] && setup_f77
7939 local file=$DIR/$tfile
7940 stack_trap "rm -f $file" EXIT
7942 $LFS setstripe -c 1 -i 0 $file
7943 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
7944 do_facet ost1 lctl set_param fail_loc=0x8000021a
7946 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
7947 error "write error: rc=$?"
7948 do_facet ost1 lctl set_param fail_loc=0
7951 cancel_lru_locks osc
7952 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
7953 do_facet ost1 lctl set_param fail_loc=0x8000021b
7955 cmp $F77_TMP $file || error "file compare failed"
7956 do_facet ost1 lctl set_param fail_loc=0
7959 run_test 77g "checksum error on OST write, read"
7961 test_77k() { # LU-10906
7962 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7963 $GSS && skip_env "could not run with gss"
7965 local cksum_param="osc.$FSNAME*.checksums"
7966 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
7970 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
7971 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
7972 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
7976 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
7977 error "failed to set checksum=$i on MGS"
7978 wait_update $HOSTNAME "$get_checksum" $i
7980 echo "remount client, checksum should be $i"
7981 remount_client $MOUNT || "failed to remount client"
7982 checksum=$(eval $get_checksum)
7983 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
7985 # remove persistent param to avoid races with checksum mountopt below
7986 do_facet mgs $LCTL set_param -P -d $cksum_param ||
7987 error "failed to delete checksum on MGS"
7989 for opt in "checksum" "nochecksum"; do
7990 #remount with mount option
7991 echo "remount client with option $opt, checksum should be $i"
7992 umount_client $MOUNT || "failed to umount client"
7993 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
7994 "failed to mount client with option '$opt'"
7995 checksum=$(eval $get_checksum)
7996 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
8000 remount_client $MOUNT || "failed to remount client"
8002 run_test 77k "enable/disable checksum correctly"
8004 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
8013 test_78() { # bug 10901
8014 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8015 remote_ost || skip_env "local OST"
8018 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
8019 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
8020 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
8021 echo "MemTotal: $MEMTOTAL"
8023 # reserve 256MB of memory for the kernel and other running processes,
8024 # and then take 1/2 of the remaining memory for the read/write buffers.
8025 if [ $MEMTOTAL -gt 512 ] ;then
8026 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
8028 # for those poor memory-starved high-end clusters...
8029 MEMTOTAL=$((MEMTOTAL / 2))
8031 echo "Mem to use for directio: $MEMTOTAL"
8033 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
8034 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
8035 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
8036 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
8038 echo "Smallest OST: $SMALLESTOST"
8039 [[ $SMALLESTOST -lt 10240 ]] &&
8040 skip "too small OSTSIZE, useless to run large O_DIRECT test"
8042 trap cleanup_test_78 EXIT
8044 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
8045 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
8047 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
8048 echo "File size: $F78SIZE"
8049 $LFS setstripe -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
8050 for i in $(seq 1 $NSEQ); do
8051 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
8052 echo directIO rdwr round $i of $NSEQ
8053 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
8058 run_test 78 "handle large O_DIRECT writes correctly ============"
8060 test_79() { # bug 12743
8061 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8063 wait_delete_completed
8065 BKTOTAL=$(calc_osc_kbytes kbytestotal)
8066 BKFREE=$(calc_osc_kbytes kbytesfree)
8067 BKAVAIL=$(calc_osc_kbytes kbytesavail)
8069 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
8070 DFTOTAL=`echo $STRING | cut -d, -f1`
8071 DFUSED=`echo $STRING | cut -d, -f2`
8072 DFAVAIL=`echo $STRING | cut -d, -f3`
8073 DFFREE=$(($DFTOTAL - $DFUSED))
8075 ALLOWANCE=$((64 * $OSTCOUNT))
8077 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
8078 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
8079 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
8081 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
8082 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
8083 error "df free($DFFREE) mismatch OST free($BKFREE)"
8085 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
8086 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
8087 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
8090 run_test 79 "df report consistency check ======================="
8092 test_80() { # bug 10718
8093 remote_ost_nodsh && skip "remote OST with nodsh"
8094 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8096 # relax strong synchronous semantics for slow backends like ZFS
8097 local soc="obdfilter.*.sync_on_lock_cancel"
8098 local soc_old=$(do_facet ost1 lctl get_param -n $soc | head -n1)
8100 if [ "$soc_old" != "never" ] &&
8101 [ "$ost1_FSTYPE" != "ldiskfs" ]; then
8102 hosts=$(for host in $(seq -f "ost%g" 1 $OSTCOUNT); do
8103 facet_active_host $host; done | sort -u)
8104 do_nodes $hosts lctl set_param $soc=never
8107 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
8109 local BEFORE=`date +%s`
8110 cancel_lru_locks osc
8111 local AFTER=`date +%s`
8112 local DIFF=$((AFTER-BEFORE))
8113 if [ $DIFF -gt 1 ] ; then
8114 error "elapsed for 1M@1T = $DIFF"
8117 [ -n "$hosts" ] && do_nodes $hosts lctl set_param $soc=$soc_old
8121 run_test 80 "Page eviction is equally fast at high offsets too ===="
8123 test_81a() { # LU-456
8124 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8125 remote_ost_nodsh && skip "remote OST with nodsh"
8127 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8128 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
8129 do_facet ost1 lctl set_param fail_loc=0x80000228
8131 # write should trigger a retry and success
8132 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8133 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8135 if [ $RC -ne 0 ] ; then
8136 error "write should success, but failed for $RC"
8139 run_test 81a "OST should retry write when get -ENOSPC ==============="
8141 test_81b() { # LU-456
8142 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8143 remote_ost_nodsh && skip "remote OST with nodsh"
8145 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8146 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
8147 do_facet ost1 lctl set_param fail_loc=0x228
8149 # write should retry several times and return -ENOSPC finally
8150 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8151 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8154 if [ $RC -ne $ENOSPC ] ; then
8155 error "dd should fail for -ENOSPC, but succeed."
8158 run_test 81b "OST should return -ENOSPC when retry still fails ======="
8160 test_82() { # LU-1031
8161 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
8165 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
8167 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
8169 kill -USR1 $MULTIPID2
8171 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
8172 error "First grouplock does not block second one"
8174 echo "Second grouplock blocks first one"
8176 kill -USR1 $MULTIPID1
8180 run_test 82 "Basic grouplock test"
8183 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
8185 test_mkdir $DIR/$tdir.cvsroot
8186 chown $RUNAS_ID $DIR/$tdir.cvsroot
8189 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
8192 # some versions of cvs import exit(1) when asked to import links or
8193 # files they can't read. ignore those files.
8194 local toignore=$(find . -type l -printf '-I %f\n' -o \
8195 ! -perm /4 -printf '-I %f\n')
8196 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
8197 $tdir.reposname vtag rtag
8200 test_mkdir $DIR/$tdir.reposname
8201 chown $RUNAS_ID $DIR/$tdir.reposname
8202 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
8204 cd $DIR/$tdir.reposname
8206 $RUNAS cvs add -m 'addmsg' foo99
8208 $RUNAS cvs commit -m 'nomsg' foo99
8209 rm -fr $DIR/$tdir.cvsroot
8211 run_test 99 "cvs strange file/directory operations"
8214 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8215 [[ "$NETTYPE" =~ tcp ]] ||
8216 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
8217 remote_ost_nodsh && skip "remote OST with nodsh"
8218 remote_mds_nodsh && skip "remote MDS with nodsh"
8220 skip "useless for local single node setup"
8222 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
8223 [ "$PROT" != "tcp" ] && continue
8224 RPORT=$(echo $REMOTE | cut -d: -f2)
8225 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
8228 LPORT=`echo $LOCAL | cut -d: -f2`
8229 if [ $LPORT -ge 1024 ]; then
8230 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
8232 error_exit "local: $LPORT > 1024, remote: $RPORT"
8235 [ "$rc" = 0 ] || error_exit "privileged port not found" )
8237 run_test 100 "check local port using privileged port ==========="
8239 function get_named_value()
8248 echo $line | sed "s/^$tag[ ]*//"
8255 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
8256 awk '/^max_cached_mb/ { print $2 }')
8259 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
8264 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8265 [ $MDSCOUNT -ge 2 ] && skip_env "needs < 2 MDTs" #LU-4322
8270 local cache_limit=32
8272 $LCTL set_param -n osc.*-osc*.rpc_stats 0
8273 trap cleanup_101a EXIT
8274 $LCTL set_param -n llite.*.read_ahead_stats 0
8275 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
8278 # randomly read 10000 of 64K chunks from file 3x 32MB in size
8280 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
8281 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
8284 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
8285 get_named_value 'read but discarded' | cut -d" " -f1); do
8286 discard=$(($discard + $s))
8290 if [[ $(($discard * 10)) -gt $nreads ]]; then
8291 $LCTL get_param osc.*-osc*.rpc_stats
8292 $LCTL get_param llite.*.read_ahead_stats
8293 error "too many ($discard) discarded pages"
8295 rm -f $DIR/$tfile || true
8297 run_test 101a "check read-ahead for random reads"
8300 test_mkdir $DIR/$tdir
8302 local FILE_LENGTH=$2
8305 local FILE_SIZE_MB=$((FILE_LENGTH / ssize))
8307 local list=$(comma_list $(osts_nodes))
8308 set_osd_param $list '' read_cache_enable 0
8309 set_osd_param $list '' writethrough_cache_enable 0
8311 trap cleanup_test101bc EXIT
8312 # prepare the read-ahead file
8313 $LFS setstripe -S $ssize -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
8315 dd if=/dev/zero of=$DIR/$tfile bs=$ssize \
8316 count=$FILE_SIZE_MB 2> /dev/null
8320 cleanup_test101bc() {
8325 local list=$(comma_list $(osts_nodes))
8326 set_osd_param $list '' read_cache_enable 1
8327 set_osd_param $list '' writethrough_cache_enable 1
8331 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
8336 local STRIPE_SIZE=$2
8337 local FILE_LENGTH=$3
8338 local RA_INC=1048576
8339 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
8340 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
8341 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
8342 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
8343 get_named_value 'read but discarded' |
8344 cut -d" " -f1 | calc_total)
8345 if [[ $DISCARD -gt $discard_limit ]]; then
8346 $LCTL get_param llite.*.read_ahead_stats
8347 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
8349 echo "Read-ahead success for size ${READ_SIZE}"
8354 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8355 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8357 local STRIPE_SIZE=1048576
8358 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
8360 if [ $SLOW == "yes" ]; then
8361 local FILE_LENGTH=$((STRIDE_SIZE * 64))
8363 local FILE_LENGTH=$((STRIDE_SIZE * 8))
8366 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
8368 # prepare the read-ahead file
8369 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8370 cancel_lru_locks osc
8371 for BIDX in 2 4 8 16 32 64 128 256
8373 local BSIZE=$((BIDX*4096))
8374 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
8375 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
8376 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
8377 $LCTL set_param -n llite.*.read_ahead_stats 0
8378 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
8379 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
8380 cancel_lru_locks osc
8381 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
8386 run_test 101b "check stride-io mode read-ahead ================="
8389 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8391 local STRIPE_SIZE=1048576
8392 local FILE_LENGTH=$((STRIPE_SIZE*100))
8397 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8399 cancel_lru_locks osc
8400 $LCTL set_param osc.*.rpc_stats 0
8401 $READS -f $DIR/$tfile -s$FILE_LENGTH -b$rsize -n$nreads -t 180
8402 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8403 local stats=$($LCTL get_param -n $osc_rpc_stats)
8404 local lines=$(echo "$stats" | awk 'END {print NR;}')
8407 if [ $lines -le 20 ]; then
8410 for size in 1 2 4 8; do
8411 local rpc=$(echo "$stats" |
8412 awk '($1 == "'$size':") {print $2; exit; }')
8413 [ $rpc != 0 ] && ((size * PAGE_SIZE < rsize)) &&
8414 error "Small $((size*PAGE_SIZE)) read IO $rpc!"
8416 echo "$osc_rpc_stats check passed!"
8421 run_test 101c "check stripe_size aligned read-ahead ================="
8424 $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
8425 $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
8429 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8431 local file=$DIR/$tfile
8432 local sz_MB=${FILESIZE_101d:-500}
8433 local ra_MB=${READAHEAD_MB:-40}
8435 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8436 [ $free_MB -lt $sz_MB ] &&
8437 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8439 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8440 $LFS setstripe -c -1 $file || error "setstripe failed"
8442 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8443 echo Cancel LRU locks on lustre client to flush the client cache
8444 cancel_lru_locks osc
8446 echo Disable read-ahead
8447 local old_READAHEAD=$(set_read_ahead 0)
8449 echo Reading the test file $file with read-ahead disabled
8450 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8452 echo Cancel LRU locks on lustre client to flush the client cache
8453 cancel_lru_locks osc
8454 echo Enable read-ahead with ${ra_MB}MB
8455 set_read_ahead $ra_MB
8457 echo Reading the test file $file with read-ahead enabled
8458 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8460 echo "read-ahead disabled time read $raOFF"
8461 echo "read-ahead enabled time read $raON"
8463 set_read_ahead $old_READAHEAD
8465 wait_delete_completed
8467 [ $raOFF -le 1 ] || [ $raON -lt $raOFF ] ||
8468 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8470 run_test 101d "file read with and without read-ahead enabled"
8473 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8475 local file=$DIR/$tfile
8476 local size_KB=500 #KB
8480 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8481 local need_KB=$((count * size_KB))
8482 [[ $free_KB -le $need_KB ]] &&
8483 skip_env "Need free space $need_KB, have $free_KB"
8485 echo "Creating $count ${size_KB}K test files"
8486 for ((i = 0; i < $count; i++)); do
8487 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8490 echo "Cancel LRU locks on lustre client to flush the client cache"
8491 cancel_lru_locks $OSC
8493 echo "Reset readahead stats"
8494 $LCTL set_param -n llite.*.read_ahead_stats 0
8496 for ((i = 0; i < $count; i++)); do
8497 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
8500 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8501 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8503 for ((i = 0; i < $count; i++)); do
8504 rm -rf $file.$i 2>/dev/null
8507 #10000 means 20% reads are missing in readahead
8508 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
8510 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
8513 which iozone || skip_env "no iozone installed"
8515 local old_debug=$($LCTL get_param debug)
8516 old_debug=${old_debug#*=}
8517 $LCTL set_param debug="reada mmap"
8519 # create a test file
8520 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
8522 echo Cancel LRU locks on lustre client to flush the client cache
8523 cancel_lru_locks osc
8525 echo Reset readahead stats
8526 $LCTL set_param -n llite.*.read_ahead_stats 0
8528 echo mmap read the file with small block size
8529 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
8532 echo checking missing pages
8533 $LCTL get_param llite.*.read_ahead_stats
8534 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8535 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8537 $LCTL set_param debug="$old_debug"
8538 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
8541 run_test 101f "check mmap read performance"
8543 test_101g_brw_size_test() {
8545 local pages=$((mb * 1048576 / PAGE_SIZE))
8546 local file=$DIR/$tfile
8548 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
8549 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
8550 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
8551 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
8555 stack_trap "rm -f $file" EXIT
8556 $LCTL set_param -n osc.*.rpc_stats=0
8558 # 10 RPCs should be enough for the test
8560 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
8561 { error "dd write ${mb} MB blocks failed"; return 3; }
8562 cancel_lru_locks osc
8563 dd of=/dev/null if=$file bs=${mb}M count=$count ||
8564 { error "dd write ${mb} MB blocks failed"; return 4; }
8566 # calculate number of full-sized read and write RPCs
8567 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
8568 sed -n '/pages per rpc/,/^$/p' |
8569 awk '/'$pages':/ { reads += $2; writes += $6 }; \
8570 END { print reads,writes }'))
8571 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
8573 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
8580 remote_ost_nodsh && skip "remote OST with nodsh"
8583 local osts=$(get_facets OST)
8584 local list=$(comma_list $(osts_nodes))
8585 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
8586 local brw_size="obdfilter.*.brw_size"
8588 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8590 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
8592 if { [ $OST1_VERSION -ge $(version_code 2.8.52) ] ||
8593 { [ $OST1_VERSION -ge $(version_code 2.7.17) ] &&
8594 [ $OST1_VERSION -lt $(version_code 2.7.50) ]; }; } &&
8595 { [ $CLIENT_VERSION -ge $(version_code 2.8.52) ] ||
8596 { [ $CLIENT_VERSION -ge $(version_code 2.7.17) ] &&
8597 [ $CLIENT_VERSION -lt $(version_code 2.7.50) ]; }; }; then
8599 [ $OST1_VERSION -ge $(version_code 2.9.52) ] &&
8602 if [[ $orig_mb -lt 16 ]]; then
8603 save_lustre_params $osts "$brw_size" > $p
8604 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
8605 error "set 16MB RPC size failed"
8607 echo "remount client to enable new RPC size"
8608 remount_client $MOUNT || error "remount_client failed"
8611 test_101g_brw_size_test 16 || error "16MB RPC test failed"
8612 # should be able to set brw_size=12, but no rpc_stats for that
8613 test_101g_brw_size_test 8 || error "8MB RPC test failed"
8616 test_101g_brw_size_test 4 || error "4MB RPC test failed"
8618 if [[ $orig_mb -lt 16 ]]; then
8619 restore_lustre_params < $p
8620 remount_client $MOUNT || error "remount_client restore failed"
8623 rm -f $p $DIR/$tfile
8625 run_test 101g "Big bulk(4/16 MiB) readahead"
8628 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8630 dd if=/dev/zero of=$DIR/$tfile bs=1M count=70 ||
8631 error "dd 70M file failed"
8632 echo Cancel LRU locks on lustre client to flush the client cache
8633 cancel_lru_locks osc
8635 echo "Reset readahead stats"
8636 $LCTL set_param -n llite.*.read_ahead_stats 0
8638 echo "Read 10M of data but cross 64M bundary"
8639 dd if=$DIR/$tfile of=/dev/null bs=10M skip=6 count=1
8640 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8641 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8642 [ $miss -eq 1 ] || error "expected miss 1 but got $miss"
8643 rm -f $p $DIR/$tfile
8645 run_test 101h "Readahead should cover current read window"
8648 test_mkdir $DIR/$tdir
8649 chown $RUNAS_ID $DIR/$tdir
8652 STRIPE_COUNT=$OSTCOUNT
8653 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
8655 trap cleanup_test102 EXIT
8657 $1 $LFS setstripe -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
8659 for num in 1 2 3 4; do
8660 for count in $(seq 1 $STRIPE_COUNT); do
8661 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
8662 local size=`expr $STRIPE_SIZE \* $num`
8663 local file=file"$num-$idx-$count"
8664 $1 $LFS setstripe -S $size -i $idx -c $count $file
8670 $1 tar cf $TMP/f102.tar $tdir --xattrs
8676 rm -rf $DIR/d0.sanity/d102
8680 [ "$UID" != 0 ] && skip "must run as root"
8681 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
8682 skip_env "must have user_xattr"
8684 [ -z "$(which setfattr 2>/dev/null)" ] &&
8685 skip_env "could not find setfattr"
8687 local testfile=$DIR/$tfile
8690 echo "set/get xattr..."
8691 setfattr -n trusted.name1 -v value1 $testfile ||
8692 error "setfattr -n trusted.name1=value1 $testfile failed"
8693 getfattr -n trusted.name1 $testfile 2> /dev/null |
8694 grep "trusted.name1=.value1" ||
8695 error "$testfile missing trusted.name1=value1"
8697 setfattr -n user.author1 -v author1 $testfile ||
8698 error "setfattr -n user.author1=author1 $testfile failed"
8699 getfattr -n user.author1 $testfile 2> /dev/null |
8700 grep "user.author1=.author1" ||
8701 error "$testfile missing trusted.author1=author1"
8704 setfattr -n trusted.name2 -v value2 $testfile ||
8705 error "$testfile unable to set trusted.name2"
8706 setfattr -n trusted.name3 -v value3 $testfile ||
8707 error "$testfile unable to set trusted.name3"
8708 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
8709 grep "trusted.name" | wc -l) -eq 3 ] ||
8710 error "$testfile missing 3 trusted.name xattrs"
8712 setfattr -n user.author2 -v author2 $testfile ||
8713 error "$testfile unable to set user.author2"
8714 setfattr -n user.author3 -v author3 $testfile ||
8715 error "$testfile unable to set user.author3"
8716 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
8717 grep "user.author" | wc -l) -eq 3 ] ||
8718 error "$testfile missing 3 user.author xattrs"
8720 echo "remove xattr..."
8721 setfattr -x trusted.name1 $testfile ||
8722 error "$testfile error deleting trusted.name1"
8723 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
8724 error "$testfile did not delete trusted.name1 xattr"
8726 setfattr -x user.author1 $testfile ||
8727 error "$testfile error deleting user.author1"
8728 echo "set lustre special xattr ..."
8729 $LFS setstripe -c1 $testfile
8730 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
8731 awk -F "=" '/trusted.lov/ { print $2 }' )
8732 setfattr -n "trusted.lov" -v $lovea $testfile ||
8733 error "$testfile doesn't ignore setting trusted.lov again"
8734 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
8735 error "$testfile allow setting invalid trusted.lov"
8738 run_test 102a "user xattr test =================================="
8741 [ -z "$(which setfattr 2>/dev/null)" ] &&
8742 skip_env "could not find setfattr"
8743 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8745 # b10930: get/set/list trusted.lov xattr
8746 echo "get/set/list trusted.lov xattr ..."
8747 local testfile=$DIR/$tfile
8748 $LFS setstripe -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8749 error "setstripe failed"
8750 local STRIPECOUNT=$($LFS getstripe -c $testfile) ||
8751 error "getstripe failed"
8752 getfattr -d -m "^trusted" $testfile 2>/dev/null | grep "trusted.lov" ||
8753 error "can't get trusted.lov from $testfile"
8755 local testfile2=${testfile}2
8756 local value=$(getfattr -n trusted.lov $testfile 2>/dev/null |
8757 grep "trusted.lov" | sed -e 's/[^=]\+=//')
8760 setfattr -n trusted.lov -v $value $testfile2
8761 local stripe_size=$($LFS getstripe -S $testfile2)
8762 local stripe_count=$($LFS getstripe -c $testfile2)
8763 [[ $stripe_size -eq 65536 ]] ||
8764 error "stripe size $stripe_size != 65536"
8765 [[ $stripe_count -eq $STRIPECOUNT ]] ||
8766 error "stripe count $stripe_count != $STRIPECOUNT"
8769 run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
8772 [ -z "$(which setfattr 2>/dev/null)" ] &&
8773 skip_env "could not find setfattr"
8774 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8776 # b10930: get/set/list lustre.lov xattr
8777 echo "get/set/list lustre.lov xattr ..."
8778 test_mkdir $DIR/$tdir
8779 chown $RUNAS_ID $DIR/$tdir
8780 local testfile=$DIR/$tdir/$tfile
8781 $RUNAS $LFS setstripe -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8782 error "setstripe failed"
8783 local STRIPECOUNT=$($RUNAS $LFS getstripe -c $testfile) ||
8784 error "getstripe failed"
8785 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
8786 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
8788 local testfile2=${testfile}2
8789 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
8790 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
8792 $RUNAS $MCREATE $testfile2
8793 $RUNAS setfattr -n lustre.lov -v $value $testfile2
8794 local stripe_size=$($RUNAS $LFS getstripe -S $testfile2)
8795 local stripe_count=$($RUNAS $LFS getstripe -c $testfile2)
8796 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
8797 [ $stripe_count -eq $STRIPECOUNT ] ||
8798 error "stripe count $stripe_count != $STRIPECOUNT"
8800 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
8802 compare_stripe_info1() {
8803 local stripe_index_all_zero=true
8805 for num in 1 2 3 4; do
8806 for count in $(seq 1 $STRIPE_COUNT); do
8807 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
8808 local size=$((STRIPE_SIZE * num))
8809 local file=file"$num-$offset-$count"
8810 stripe_size=$($LFS getstripe -S $PWD/$file)
8811 [[ $stripe_size -ne $size ]] &&
8812 error "$file: size $stripe_size != $size"
8813 stripe_count=$($LFS getstripe -c $PWD/$file)
8814 # allow fewer stripes to be created, ORI-601
8815 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
8816 error "$file: count $stripe_count != $count"
8817 stripe_index=$($LFS getstripe -i $PWD/$file)
8818 [[ $stripe_index -ne 0 ]] &&
8819 stripe_index_all_zero=false
8823 $stripe_index_all_zero &&
8824 error "all files are being extracted starting from OST index 0"
8828 have_xattrs_include() {
8829 tar --help | grep -q xattrs-include &&
8830 echo --xattrs-include="lustre.*"
8834 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8835 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8837 XINC=$(have_xattrs_include)
8839 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8841 compare_stripe_info1
8843 run_test 102d "tar restore stripe info from tarfile,not keep osts"
8846 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8847 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8849 XINC=$(have_xattrs_include)
8851 test_mkdir $DIR/$tdir.restore
8853 tar cf - --xattrs $tdir | tar xf - \
8854 -C $DIR/$tdir.restore --xattrs $XINC
8855 cd $DIR/$tdir.restore/$tdir
8856 compare_stripe_info1
8858 run_test 102f "tar copy files, not keep osts"
8861 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
8862 skip "must have user_xattr"
8863 [ -z "$(which setfattr 2>/dev/null)" ] &&
8864 skip_env "could not find setfattr"
8865 [ -z "$(which getfattr 2>/dev/null)" ] &&
8866 skip_env "could not find getfattr"
8868 local xsize=${1:-1024} # in bytes
8869 local file=$DIR/$tfile
8870 local value="$(generate_string $xsize)"
8871 local xbig=trusted.big
8875 log "save $xbig on $file"
8878 setfattr -n $xbig -v $value $file ||
8879 error "saving $xbig on $file failed"
8881 setfattr -n $xbig -v $value $file &&
8882 error "saving $xbig on $file succeeded"
8886 local orig=$(get_xattr_value $xbig $file)
8887 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
8889 local xsml=trusted.sml
8890 log "save $xsml on $file"
8891 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
8893 local new=$(get_xattr_value $xbig $file)
8894 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
8896 log "grow $xsml on $file"
8897 setfattr -n $xsml -v "$value" $file ||
8898 error "growing $xsml on $file failed"
8900 new=$(get_xattr_value $xbig $file)
8901 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
8902 log "$xbig still valid after growing $xsml"
8907 test_102h() { # bug 15777
8910 run_test 102h "grow xattr from inside inode to external block"
8913 large_xattr_enabled || skip_env "ea_inode feature disabled"
8915 echo "setting xattr of max xattr size: $(max_xattr_size)"
8916 grow_xattr $(max_xattr_size)
8918 echo "setting xattr of > max xattr size: $(max_xattr_size) + 10"
8919 echo "This should fail:"
8920 grow_xattr $(($(max_xattr_size) + 10)) 1
8922 run_test 102ha "grow xattr from inside inode to external inode"
8924 test_102i() { # bug 17038
8925 [ -z "$(which getfattr 2>/dev/null)" ] &&
8926 skip "could not find getfattr"
8929 ln -s $DIR/$tfile $DIR/${tfile}link
8930 getfattr -n trusted.lov $DIR/$tfile ||
8931 error "lgetxattr on $DIR/$tfile failed"
8932 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
8933 grep -i "no such attr" ||
8934 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
8935 rm -f $DIR/$tfile $DIR/${tfile}link
8937 run_test 102i "lgetxattr test on symbolic link ============"
8940 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8941 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8943 XINC=$(have_xattrs_include)
8944 setup_test102 "$RUNAS"
8945 chown $RUNAS_ID $DIR/$tdir
8946 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8948 compare_stripe_info1 "$RUNAS"
8950 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
8953 [ -z "$(which setfattr 2>/dev/null)" ] &&
8954 skip "could not find setfattr"
8957 # b22187 just check that does not crash for regular file.
8958 setfattr -n trusted.lov $DIR/$tfile
8959 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
8960 local test_kdir=$DIR/$tdir
8961 test_mkdir $test_kdir
8962 local default_size=$($LFS getstripe -S $test_kdir)
8963 local default_count=$($LFS getstripe -c $test_kdir)
8964 local default_offset=$($LFS getstripe -i $test_kdir)
8965 $LFS setstripe -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
8966 error 'dir setstripe failed'
8967 setfattr -n trusted.lov $test_kdir
8968 local stripe_size=$($LFS getstripe -S $test_kdir)
8969 local stripe_count=$($LFS getstripe -c $test_kdir)
8970 local stripe_offset=$($LFS getstripe -i $test_kdir)
8971 [ $stripe_size -eq $default_size ] ||
8972 error "stripe size $stripe_size != $default_size"
8973 [ $stripe_count -eq $default_count ] ||
8974 error "stripe count $stripe_count != $default_count"
8975 [ $stripe_offset -eq $default_offset ] ||
8976 error "stripe offset $stripe_offset != $default_offset"
8977 rm -rf $DIR/$tfile $test_kdir
8979 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
8982 [ -z "$(which getfattr 2>/dev/null)" ] &&
8983 skip "could not find getfattr"
8985 # LU-532 trusted. xattr is invisible to non-root
8986 local testfile=$DIR/$tfile
8990 echo "listxattr as user..."
8991 chown $RUNAS_ID $testfile
8992 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
8993 grep -q "trusted" &&
8994 error "$testfile trusted xattrs are user visible"
8998 run_test 102l "listxattr size test =================================="
9000 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
9001 local path=$DIR/$tfile
9004 listxattr_size_check $path || error "listattr_size_check $path failed"
9006 run_test 102m "Ensure listxattr fails on small bufffer ========"
9010 getxattr() { # getxattr path name
9011 # Return the base64 encoding of the value of xattr name on path.
9015 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
9017 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
9019 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
9021 getfattr --absolute-names --encoding=base64 --name=$name $path |
9022 awk -F= -v name=$name '$1 == name {
9023 print substr($0, index($0, "=") + 1);
9027 test_102n() { # LU-4101 mdt: protect internal xattrs
9028 [ -z "$(which setfattr 2>/dev/null)" ] &&
9029 skip "could not find setfattr"
9030 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
9032 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
9035 local file0=$DIR/$tfile.0
9036 local file1=$DIR/$tfile.1
9037 local xattr0=$TMP/$tfile.0
9038 local xattr1=$TMP/$tfile.1
9039 local namelist="lov lma lmv link fid version som hsm"
9043 rm -rf $file0 $file1 $xattr0 $xattr1
9046 # Get 'before' xattrs of $file1.
9047 getfattr --absolute-names --dump --match=- $file1 > $xattr0
9049 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
9050 namelist+=" lfsck_namespace"
9051 for name in $namelist; do
9052 # Try to copy xattr from $file0 to $file1.
9053 value=$(getxattr $file0 trusted.$name 2> /dev/null)
9055 setfattr --name=trusted.$name --value="$value" $file1 ||
9056 error "setxattr 'trusted.$name' failed"
9058 # Try to set a garbage xattr.
9059 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9061 if [[ x$name == "xlov" ]]; then
9062 setfattr --name=trusted.lov --value="$value" $file1 &&
9063 error "setxattr invalid 'trusted.lov' success"
9065 setfattr --name=trusted.$name --value="$value" $file1 ||
9066 error "setxattr invalid 'trusted.$name' failed"
9069 # Try to remove the xattr from $file1. We don't care if this
9070 # appears to succeed or fail, we just don't want there to be
9071 # any changes or crashes.
9072 setfattr --remove=$trusted.$name $file1 2> /dev/null
9075 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
9078 # Try to copy xattr from $file0 to $file1.
9079 value=$(getxattr $file0 trusted.$name 2> /dev/null)
9081 setfattr --name=trusted.$name --value="$value" $file1 ||
9082 error "setxattr 'trusted.$name' failed"
9084 # Try to set a garbage xattr.
9085 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9087 setfattr --name=trusted.$name --value="$value" $file1 ||
9088 error "setxattr 'trusted.$name' failed"
9090 # Try to remove the xattr from $file1. We don't care if this
9091 # appears to succeed or fail, we just don't want there to be
9092 # any changes or crashes.
9093 setfattr --remove=$trusted.$name $file1 2> /dev/null
9096 # Get 'after' xattrs of file1.
9097 getfattr --absolute-names --dump --match=- $file1 > $xattr1
9099 if ! diff $xattr0 $xattr1; then
9100 error "before and after xattrs of '$file1' differ"
9103 rm -rf $file0 $file1 $xattr0 $xattr1
9107 run_test 102n "silently ignore setxattr on internal trusted xattrs"
9109 test_102p() { # LU-4703 setxattr did not check ownership
9110 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
9111 skip "MDS needs to be at least 2.5.56"
9113 local testfile=$DIR/$tfile
9117 echo "setfacl as user..."
9118 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
9119 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
9121 echo "setfattr as user..."
9122 setfacl -m "u:$RUNAS_ID:---" $testfile
9123 $RUNAS setfattr -x system.posix_acl_access $testfile
9124 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
9126 run_test 102p "check setxattr(2) correctly fails without permission"
9129 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
9130 skip "MDS needs to be at least 2.6.92"
9132 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
9134 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
9137 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
9138 skip "MDS needs to be at least 2.6.93"
9140 touch $DIR/$tfile || error "touch"
9141 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
9142 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
9143 rm $DIR/$tfile || error "rm"
9146 mkdir -p $DIR/$tdir || error "mkdir"
9147 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9148 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9149 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9150 error "$testfile error deleting user.author1"
9151 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9152 grep "user.$(basename $tdir)" &&
9153 error "$tdir did not delete user.$(basename $tdir)"
9154 rmdir $DIR/$tdir || error "rmdir"
9157 test_mkdir $DIR/$tdir
9158 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9159 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9160 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9161 error "$testfile error deleting user.author1"
9162 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9163 grep "user.$(basename $tdir)" &&
9164 error "$tdir did not delete user.$(basename $tdir)"
9165 rmdir $DIR/$tdir || error "rm striped dir"
9167 run_test 102r "set EAs with empty values"
9170 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9171 skip "MDS needs to be at least 2.11.52"
9173 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9175 save_lustre_params client "llite.*.xattr_cache" > $save
9177 for cache in 0 1; do
9178 lctl set_param llite.*.xattr_cache=$cache
9181 touch $DIR/$tfile || error "touch"
9182 for prefix in lustre security system trusted user; do
9183 # Note getxattr() may fail with 'Operation not
9184 # supported' or 'No such attribute' depending
9185 # on prefix and cache.
9186 getfattr -n $prefix.n102s $DIR/$tfile &&
9187 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
9191 restore_lustre_params < $save
9193 run_test 102s "getting nonexistent xattrs should fail"
9196 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9197 skip "MDS needs to be at least 2.11.52"
9199 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9201 save_lustre_params client "llite.*.xattr_cache" > $save
9203 for cache in 0 1; do
9204 lctl set_param llite.*.xattr_cache=$cache
9206 for buf_size in 0 256; do
9208 touch $DIR/$tfile || error "touch"
9209 setfattr -n user.multiop $DIR/$tfile
9210 $MULTIOP $DIR/$tfile oa$buf_size ||
9211 error "cannot get zero length xattr value (buf_size = $buf_size)"
9215 restore_lustre_params < $save
9217 run_test 102t "zero length xattr values handled correctly"
9221 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
9226 [ "$UID" != 0 ] && skip "must run as root"
9227 $GSS && skip_env "could not run under gss"
9228 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
9229 skip_env "must have acl enabled"
9230 [ -z "$(which setfacl 2>/dev/null)" ] &&
9231 skip_env "could not find setfacl"
9232 remote_mds_nodsh && skip "remote MDS with nodsh"
9234 gpasswd -a daemon bin # LU-5641
9235 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
9237 declare -a identity_old
9239 for num in $(seq $MDSCOUNT); do
9240 switch_identity $num true || identity_old[$num]=$?
9248 echo "performing cp ..."
9249 run_acl_subtest cp || error "run_acl_subtest cp failed"
9250 echo "performing getfacl-noacl..."
9251 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
9252 echo "performing misc..."
9253 run_acl_subtest misc || error "misc test failed"
9254 echo "performing permissions..."
9255 run_acl_subtest permissions || error "permissions failed"
9256 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
9257 if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] ||
9258 { [ $MDS1_VERSION -lt $(version_code 2.6) ] &&
9259 [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; }
9261 echo "performing permissions xattr..."
9262 run_acl_subtest permissions_xattr ||
9263 error "permissions_xattr failed"
9265 echo "performing setfacl..."
9266 run_acl_subtest setfacl || error "setfacl test failed"
9268 # inheritance test got from HP
9269 echo "performing inheritance..."
9270 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
9271 chmod +x make-tree || error "chmod +x failed"
9272 run_acl_subtest inheritance || error "inheritance test failed"
9275 echo "LU-974 ignore umask when acl is enabled..."
9276 run_acl_subtest 974 || error "LU-974 umask test failed"
9277 if [ $MDSCOUNT -ge 2 ]; then
9278 run_acl_subtest 974_remote ||
9279 error "LU-974 umask test failed under remote dir"
9282 echo "LU-2561 newly created file is same size as directory..."
9283 if [ "$mds1_FSTYPE" != "zfs" ]; then
9284 run_acl_subtest 2561 || error "LU-2561 test failed"
9286 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
9289 run_acl_subtest 4924 || error "LU-4924 test failed"
9294 for num in $(seq $MDSCOUNT); do
9295 if [ "${identity_old[$num]}" = 1 ]; then
9296 switch_identity $num false || identity_old[$num]=$?
9300 run_test 103a "acl test"
9306 for U in {0..511}; do
9308 local O=$(printf "%04o" $U)
9310 umask $(printf "%04o" $((511 ^ $O)))
9311 $LFS setstripe -c 1 $DIR/$tfile.s$O
9312 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
9314 (( $S == ($O & 0666) )) ||
9315 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
9317 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
9318 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
9319 (( $S == ($O & 0666) )) ||
9320 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
9322 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
9323 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
9324 (( $S == ($O & 0666) )) ||
9325 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
9326 rm -f $DIR/$tfile.[smp]$0
9330 # limit the concurrently running threads to 64. LU-11878
9331 local idx=$((U % 64))
9332 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
9337 run_test 103b "umask lfs setstripe"
9341 cp -rp $DIR/$tdir $DIR/$tdir.bak
9343 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
9344 error "$DIR/$tdir shouldn't contain default ACL"
9345 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
9346 error "$DIR/$tdir.bak shouldn't contain default ACL"
9349 run_test 103c "'cp -rp' won't set empty acl"
9352 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9355 lfs df || error "lfs df failed"
9356 lfs df -ih || error "lfs df -ih failed"
9357 lfs df -h $DIR || error "lfs df -h $DIR failed"
9358 lfs df -i $DIR || error "lfs df -i $DIR failed"
9359 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
9360 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
9362 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
9363 lctl --device %$OSC deactivate
9364 lfs df || error "lfs df with deactivated OSC failed"
9365 lctl --device %$OSC activate
9366 # wait the osc back to normal
9367 wait_osc_import_ready client ost
9369 lfs df || error "lfs df with reactivated OSC failed"
9372 run_test 104a "lfs df [-ih] [path] test ========================="
9375 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9376 [ $RUNAS_ID -eq $UID ] &&
9377 skip_env "RUNAS_ID = UID = $UID -- skipping"
9379 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
9380 grep "Permission denied" | wc -l)))
9381 if [ $denied_cnt -ne 0 ]; then
9382 error "lfs check servers test failed"
9385 run_test 104b "$RUNAS lfs check servers test ===================="
9388 # doesn't work on 2.4 kernels
9390 if $(flock_is_enabled); then
9391 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
9393 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
9397 run_test 105a "flock when mounted without -o flock test ========"
9401 if $(flock_is_enabled); then
9402 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
9404 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
9408 run_test 105b "fcntl when mounted without -o flock test ========"
9412 if $(flock_is_enabled); then
9413 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
9415 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
9419 run_test 105c "lockf when mounted without -o flock test"
9421 test_105d() { # bug 15924
9422 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9424 test_mkdir $DIR/$tdir
9425 flock_is_enabled || skip_env "mount w/o flock enabled"
9426 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
9427 $LCTL set_param fail_loc=0x80000315
9428 flocks_test 2 $DIR/$tdir
9430 run_test 105d "flock race (should not freeze) ========"
9432 test_105e() { # bug 22660 && 22040
9433 flock_is_enabled || skip_env "mount w/o flock enabled"
9436 flocks_test 3 $DIR/$tfile
9438 run_test 105e "Two conflicting flocks from same process"
9440 test_106() { #bug 10921
9441 test_mkdir $DIR/$tdir
9442 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9443 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9445 run_test 106 "attempt exec of dir followed by chown of that dir"
9448 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9456 local save_pattern=$(sysctl -n kernel.core_pattern)
9457 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9458 sysctl -w kernel.core_pattern=$file
9459 sysctl -w kernel.core_uses_pid=0
9467 kill -s 11 $SLEEPPID
9469 if [ -e $file ]; then
9470 size=`stat -c%s $file`
9471 [ $size -eq 0 ] && error "Fail to create core file $file"
9473 error "Fail to create core file $file"
9476 sysctl -w kernel.core_pattern=$save_pattern
9477 sysctl -w kernel.core_uses_pid=$save_uses_pid
9480 run_test 107 "Coredump on SIG"
9483 test_mkdir $DIR/$tdir
9484 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9485 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9486 error "mkdir with 256 char should fail, but did not"
9487 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9488 error "create with 255 char failed"
9489 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9490 error "create with 256 char should fail, but did not"
9495 run_test 110 "filename length checking"
9498 # Purpose: To verify dynamic thread (OSS) creation.
9501 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9502 remote_ost_nodsh && skip "remote OST with nodsh"
9504 # Lustre does not stop service threads once they are started.
9505 # Reset number of running threads to default.
9510 local save_params="$TMP/sanity-$TESTNAME.parameters"
9512 # Get ll_ost_io count before I/O
9513 OSTIO_pre=$(do_facet ost1 \
9514 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9515 # Exit if lustre is not running (ll_ost_io not running).
9516 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9518 echo "Starting with $OSTIO_pre threads"
9519 local thread_max=$((OSTIO_pre * 2))
9520 local rpc_in_flight=$((thread_max * 2))
9521 # Number of I/O Process proposed to be started.
9523 local facets=$(get_facets OST)
9525 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9526 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9528 # Set in_flight to $rpc_in_flight
9529 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9530 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9531 nfiles=${rpc_in_flight}
9532 # Set ost thread_max to $thread_max
9533 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9535 # 5 Minutes should be sufficient for max number of OSS
9536 # threads(thread_max) to be created.
9540 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9541 test_mkdir $DIR/$tdir
9542 for i in $(seq $nfiles); do
9543 local file=$DIR/$tdir/${tfile}-$i
9544 $LFS setstripe -c -1 -i 0 $file
9545 ($WTL $file $timeout)&
9548 # I/O Started - Wait for thread_started to reach thread_max or report
9549 # error if thread_started is more than thread_max.
9550 echo "Waiting for thread_started to reach thread_max"
9551 local thread_started=0
9552 local end_time=$((SECONDS + timeout))
9554 while [ $SECONDS -le $end_time ] ; do
9556 # Get ost i/o thread_started count.
9557 thread_started=$(do_facet ost1 \
9559 ost.OSS.ost_io.threads_started | cut -d= -f2")
9560 # Break out if thread_started is equal/greater than thread_max
9561 if [[ $thread_started -ge $thread_max ]]; then
9562 echo ll_ost_io thread_started $thread_started, \
9563 equal/greater than thread_max $thread_max
9569 # Cleanup - We have the numbers, Kill i/o jobs if running.
9570 jobcount=($(jobs -p))
9571 for i in $(seq 0 $((${#jobcount[@]}-1)))
9573 kill -9 ${jobcount[$i]}
9574 if [ $? -ne 0 ] ; then
9576 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
9580 # Cleanup files left by WTL binary.
9581 for i in $(seq $nfiles); do
9582 local file=$DIR/$tdir/${tfile}-$i
9584 if [ $? -ne 0 ] ; then
9585 echo "Warning: Failed to delete file $file"
9589 restore_lustre_params <$save_params
9590 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
9592 # Error out if no new thread has started or Thread started is greater
9594 if [[ $thread_started -le $OSTIO_pre ||
9595 $thread_started -gt $thread_max ]]; then
9596 error "ll_ost_io: thread_started $thread_started" \
9597 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
9598 "No new thread started or thread started greater " \
9602 run_test 115 "verify dynamic thread creation===================="
9605 wait_delete_completed
9606 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
9607 echo "OST kbytes available: ${AVAIL[@]}"
9612 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
9613 #echo OST $i: ${AVAIL[i]}kb
9614 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
9618 if [[ ${AVAIL[i]} -lt $MINV ]]; then
9623 echo "Min free space: OST $MINI: $MINV"
9624 echo "Max free space: OST $MAXI: $MAXV"
9627 test_116a() { # was previously test_116()
9628 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9629 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9630 remote_mds_nodsh && skip "remote MDS with nodsh"
9632 echo -n "Free space priority "
9633 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
9638 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
9639 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
9640 trap simple_cleanup_common EXIT
9642 # Check if we need to generate uneven OSTs
9643 test_mkdir -p $DIR/$tdir/OST${MINI}
9644 local FILL=$((MINV / 4))
9645 local DIFF=$((MAXV - MINV))
9646 local DIFF2=$((DIFF * 100 / MINV))
9648 local threshold=$(do_facet $SINGLEMDS \
9649 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
9650 threshold=${threshold%%%}
9651 echo -n "Check for uneven OSTs: "
9652 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
9654 if [[ $DIFF2 -gt $threshold ]]; then
9656 echo "Don't need to fill OST$MINI"
9658 # generate uneven OSTs. Write 2% over the QOS threshold value
9660 DIFF=$((threshold - DIFF2 + 2))
9661 DIFF2=$((MINV * DIFF / 100))
9662 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
9663 $LFS setstripe -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
9664 error "setstripe failed"
9665 DIFF=$((DIFF2 / 2048))
9667 while [ $i -lt $DIFF ]; do
9669 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
9670 bs=2M count=1 2>/dev/null
9679 DIFF=$((MAXV - MINV))
9680 DIFF2=$((DIFF * 100 / MINV))
9681 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
9682 if [ $DIFF2 -gt $threshold ]; then
9685 echo "failed - QOS mode won't be used"
9686 simple_cleanup_common
9687 skip "QOS imbalance criteria not met"
9695 # now fill using QOS
9696 $LFS setstripe -c 1 $DIR/$tdir
9697 FILL=$((FILL / 200))
9698 if [ $FILL -gt 600 ]; then
9701 echo "writing $FILL files to QOS-assigned OSTs"
9703 while [ $i -lt $FILL ]; do
9705 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
9709 echo "wrote $i 200k files"
9713 echo "Note: free space may not be updated, so measurements might be off"
9715 DIFF2=$((MAXV - MINV))
9716 echo "free space delta: orig $DIFF final $DIFF2"
9717 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
9718 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
9719 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
9720 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
9721 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
9722 if [[ $DIFF -gt 0 ]]; then
9723 FILL=$((DIFF2 * 100 / DIFF - 100))
9724 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
9727 # Figure out which files were written where
9728 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9729 awk '/'$MINI1': / {print $2; exit}')
9731 MINC=$($LFS getstripe --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9732 echo "$MINC files created on smaller OST $MINI1"
9733 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9734 awk '/'$MAXI1': / {print $2; exit}')
9736 MAXC=$($LFS getstripe --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9737 echo "$MAXC files created on larger OST $MAXI1"
9738 if [[ $MINC -gt 0 ]]; then
9739 FILL=$((MAXC * 100 / MINC - 100))
9740 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
9742 [[ $MAXC -gt $MINC ]] ||
9743 error_ignore LU-9 "stripe QOS didn't balance free space"
9744 simple_cleanup_common
9746 run_test 116a "stripe QOS: free space balance ==================="
9748 test_116b() { # LU-2093
9749 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9750 remote_mds_nodsh && skip "remote MDS with nodsh"
9752 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
9753 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
9754 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
9755 [ -z "$old_rr" ] && skip "no QOS"
9756 do_facet $SINGLEMDS lctl set_param \
9757 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
9759 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
9760 createmany -o $DIR/$tdir/f- 20 || error "can't create"
9761 do_facet $SINGLEMDS lctl set_param fail_loc=0
9763 do_facet $SINGLEMDS lctl set_param \
9764 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
9766 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
9768 test_117() # bug 10891
9770 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9772 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
9773 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
9774 lctl set_param fail_loc=0x21e
9775 > $DIR/$tfile || error "truncate failed"
9776 lctl set_param fail_loc=0
9777 echo "Truncate succeeded."
9780 run_test 117 "verify osd extend =========="
9782 NO_SLOW_RESENDCOUNT=4
9783 export OLD_RESENDCOUNT=""
9784 set_resend_count () {
9785 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
9786 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
9787 lctl set_param -n $PROC_RESENDCOUNT $1
9788 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
9791 # for reduce test_118* time (b=14842)
9792 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9794 # Reset async IO behavior after error case
9796 FILE=$DIR/reset_async
9798 # Ensure all OSCs are cleared
9799 $LFS setstripe -c -1 $FILE
9800 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
9805 test_118a() #bug 11710
9807 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9811 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9812 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9813 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9815 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9816 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9821 run_test 118a "verify O_SYNC works =========="
9825 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9826 remote_ost_nodsh && skip "remote OST with nodsh"
9830 #define OBD_FAIL_SRV_ENOENT 0x217
9831 set_nodes_failloc "$(osts_nodes)" 0x217
9832 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9834 set_nodes_failloc "$(osts_nodes)" 0
9835 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9836 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9839 if [[ $RC -eq 0 ]]; then
9840 error "Must return error due to dropped pages, rc=$RC"
9844 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9845 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9849 echo "Dirty pages not leaked on ENOENT"
9851 # Due to the above error the OSC will issue all RPCs syncronously
9852 # until a subsequent RPC completes successfully without error.
9853 $MULTIOP $DIR/$tfile Ow4096yc
9858 run_test 118b "Reclaim dirty pages on fatal error =========="
9862 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9864 # for 118c, restore the original resend count, LU-1940
9865 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
9866 set_resend_count $OLD_RESENDCOUNT
9867 remote_ost_nodsh && skip "remote OST with nodsh"
9871 #define OBD_FAIL_OST_EROFS 0x216
9872 set_nodes_failloc "$(osts_nodes)" 0x216
9874 # multiop should block due to fsync until pages are written
9875 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9879 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9880 error "Multiop failed to block on fsync, pid=$MULTIPID"
9883 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9885 if [[ $WRITEBACK -eq 0 ]]; then
9886 error "No page in writeback, writeback=$WRITEBACK"
9889 set_nodes_failloc "$(osts_nodes)" 0
9892 if [[ $RC -ne 0 ]]; then
9893 error "Multiop fsync failed, rc=$RC"
9896 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9897 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9899 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9900 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9904 echo "Dirty pages flushed via fsync on EROFS"
9907 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
9909 # continue to use small resend count to reduce test_118* time (b=14842)
9910 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9914 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9915 remote_ost_nodsh && skip "remote OST with nodsh"
9919 #define OBD_FAIL_OST_BRW_PAUSE_BULK
9920 set_nodes_failloc "$(osts_nodes)" 0x214
9921 # multiop should block due to fsync until pages are written
9922 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9926 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9927 error "Multiop failed to block on fsync, pid=$MULTIPID"
9930 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9932 if [[ $WRITEBACK -eq 0 ]]; then
9933 error "No page in writeback, writeback=$WRITEBACK"
9936 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
9937 set_nodes_failloc "$(osts_nodes)" 0
9939 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9940 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9942 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9943 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9947 echo "Dirty pages gaurenteed flushed via fsync"
9950 run_test 118d "Fsync validation inject a delay of the bulk =========="
9953 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9957 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
9958 lctl set_param fail_loc=0x8000040a
9960 # Should simulate EINVAL error which is fatal
9961 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9963 if [[ $RC -eq 0 ]]; then
9964 error "Must return error due to dropped pages, rc=$RC"
9967 lctl set_param fail_loc=0x0
9969 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9970 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9971 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9973 if [[ $LOCKED -ne 0 ]]; then
9974 error "Locked pages remain in cache, locked=$LOCKED"
9977 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9978 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9982 echo "No pages locked after fsync"
9987 run_test 118f "Simulate unrecoverable OSC side error =========="
9990 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9994 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
9995 lctl set_param fail_loc=0x406
9997 # simulate local -ENOMEM
9998 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10001 lctl set_param fail_loc=0
10002 if [[ $RC -eq 0 ]]; then
10003 error "Must return error due to dropped pages, rc=$RC"
10006 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10007 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10008 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10010 if [[ $LOCKED -ne 0 ]]; then
10011 error "Locked pages remain in cache, locked=$LOCKED"
10014 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10015 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10019 echo "No pages locked after fsync"
10024 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
10027 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10028 remote_ost_nodsh && skip "remote OST with nodsh"
10032 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10033 set_nodes_failloc "$(osts_nodes)" 0x20e
10034 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
10035 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10038 set_nodes_failloc "$(osts_nodes)" 0
10039 if [[ $RC -eq 0 ]]; then
10040 error "Must return error due to dropped pages, rc=$RC"
10043 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10044 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10045 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10047 if [[ $LOCKED -ne 0 ]]; then
10048 error "Locked pages remain in cache, locked=$LOCKED"
10051 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10052 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10056 echo "No pages locked after fsync"
10060 run_test 118h "Verify timeout in handling recoverables errors =========="
10062 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10065 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10066 remote_ost_nodsh && skip "remote OST with nodsh"
10070 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10071 set_nodes_failloc "$(osts_nodes)" 0x20e
10073 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
10074 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
10077 set_nodes_failloc "$(osts_nodes)" 0
10081 if [[ $RC -ne 0 ]]; then
10082 error "got error, but should be not, rc=$RC"
10085 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10086 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10087 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10088 if [[ $LOCKED -ne 0 ]]; then
10089 error "Locked pages remain in cache, locked=$LOCKED"
10092 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10093 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10097 echo "No pages locked after fsync"
10101 run_test 118i "Fix error before timeout in recoverable error =========="
10103 [ "$SLOW" = "no" ] && set_resend_count 4
10106 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10107 remote_ost_nodsh && skip "remote OST with nodsh"
10111 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
10112 set_nodes_failloc "$(osts_nodes)" 0x220
10114 # return -EIO from OST
10115 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10117 set_nodes_failloc "$(osts_nodes)" 0x0
10118 if [[ $RC -eq 0 ]]; then
10119 error "Must return error due to dropped pages, rc=$RC"
10122 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10123 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10124 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10125 if [[ $LOCKED -ne 0 ]]; then
10126 error "Locked pages remain in cache, locked=$LOCKED"
10129 # in recoverable error on OST we want resend and stay until it finished
10130 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10131 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10135 echo "No pages locked after fsync"
10139 run_test 118j "Simulate unrecoverable OST side error =========="
10143 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10144 remote_ost_nodsh && skip "remote OSTs with nodsh"
10146 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10147 set_nodes_failloc "$(osts_nodes)" 0x20e
10148 test_mkdir $DIR/$tdir
10150 for ((i=0;i<10;i++)); do
10151 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
10152 error "dd to $DIR/$tdir/$tfile-$i failed" )&
10159 set_nodes_failloc "$(osts_nodes)" 0
10162 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
10164 test_118l() # LU-646
10166 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10168 test_mkdir $DIR/$tdir
10169 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
10172 run_test 118l "fsync dir"
10174 test_118m() # LU-3066
10176 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10178 test_mkdir $DIR/$tdir
10179 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
10182 run_test 118m "fdatasync dir ========="
10184 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10191 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10192 remote_ost_nodsh && skip "remote OSTs with nodsh"
10194 # Sleep to avoid a cached response.
10195 #define OBD_STATFS_CACHE_SECONDS 1
10198 # Inject a 10 second delay in the OST_STATFS handler.
10199 #define OBD_FAIL_OST_STATFS_DELAY 0x242
10200 set_nodes_failloc "$(osts_nodes)" 0x242
10203 stat --file-system $MOUNT > /dev/null
10206 set_nodes_failloc "$(osts_nodes)" 0
10208 if ((end - begin > 20)); then
10209 error "statfs took $((end - begin)) seconds, expected 10"
10212 run_test 118n "statfs() sends OST_STATFS requests in parallel"
10214 test_119a() # bug 11737
10216 BSIZE=$((512 * 1024))
10217 directio write $DIR/$tfile 0 1 $BSIZE
10218 # We ask to read two blocks, which is more than a file size.
10219 # directio will indicate an error when requested and actual
10220 # sizes aren't equeal (a normal situation in this case) and
10221 # print actual read amount.
10222 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
10223 if [ "$NOB" != "$BSIZE" ]; then
10224 error "read $NOB bytes instead of $BSIZE"
10228 run_test 119a "Short directIO read must return actual read amount"
10230 test_119b() # bug 11737
10232 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10234 $LFS setstripe -c 2 $DIR/$tfile || error "setstripe failed"
10235 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
10237 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
10238 error "direct read failed"
10241 run_test 119b "Sparse directIO read must return actual read amount"
10243 test_119c() # bug 13099
10246 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
10247 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
10250 run_test 119c "Testing for direct read hitting hole"
10252 test_119d() # bug 15950
10254 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10256 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
10257 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
10259 $LFS setstripe $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
10260 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
10261 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
10262 lctl set_param fail_loc=0x40d
10263 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
10266 cat $DIR/$tfile > /dev/null &
10267 lctl set_param fail_loc=0
10270 log "the DIO writes have completed, now wait for the reads (should not block very long)"
10272 [ -n "`ps h -p $pid_reads -o comm`" ] && \
10273 error "the read rpcs have not completed in 2s"
10275 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
10277 run_test 119d "The DIO path should try to send a new rpc once one is completed"
10280 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10281 remote_mds_nodsh && skip "remote MDS with nodsh"
10282 test_mkdir -i0 -c1 $DIR/$tdir
10283 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10284 skip_env "no early lock cancel on server"
10286 lru_resize_disable mdc
10287 lru_resize_disable osc
10288 cancel_lru_locks mdc
10289 # asynchronous object destroy at MDT could cause bl ast to client
10290 cancel_lru_locks osc
10292 stat $DIR/$tdir > /dev/null
10293 can1=$(do_facet mds1 \
10294 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10295 awk '/ldlm_cancel/ {print $2}')
10296 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10297 awk '/ldlm_bl_callback/ {print $2}')
10298 test_mkdir -i0 -c1 $DIR/$tdir/d1
10299 can2=$(do_facet mds1 \
10300 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10301 awk '/ldlm_cancel/ {print $2}')
10302 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10303 awk '/ldlm_bl_callback/ {print $2}')
10304 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10305 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10306 lru_resize_enable mdc
10307 lru_resize_enable osc
10309 run_test 120a "Early Lock Cancel: mkdir test"
10312 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10313 remote_mds_nodsh && skip "remote MDS with nodsh"
10314 test_mkdir $DIR/$tdir
10315 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10316 skip_env "no early lock cancel on server"
10318 lru_resize_disable mdc
10319 lru_resize_disable osc
10320 cancel_lru_locks mdc
10321 stat $DIR/$tdir > /dev/null
10322 can1=$(do_facet $SINGLEMDS \
10323 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10324 awk '/ldlm_cancel/ {print $2}')
10325 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10326 awk '/ldlm_bl_callback/ {print $2}')
10327 touch $DIR/$tdir/f1
10328 can2=$(do_facet $SINGLEMDS \
10329 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10330 awk '/ldlm_cancel/ {print $2}')
10331 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10332 awk '/ldlm_bl_callback/ {print $2}')
10333 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10334 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10335 lru_resize_enable mdc
10336 lru_resize_enable osc
10338 run_test 120b "Early Lock Cancel: create test"
10341 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10342 remote_mds_nodsh && skip "remote MDS with nodsh"
10343 test_mkdir -i0 -c1 $DIR/$tdir
10344 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10345 skip "no early lock cancel on server"
10347 lru_resize_disable mdc
10348 lru_resize_disable osc
10349 test_mkdir -i0 -c1 $DIR/$tdir/d1
10350 test_mkdir -i0 -c1 $DIR/$tdir/d2
10351 touch $DIR/$tdir/d1/f1
10352 cancel_lru_locks mdc
10353 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
10354 can1=$(do_facet mds1 \
10355 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10356 awk '/ldlm_cancel/ {print $2}')
10357 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10358 awk '/ldlm_bl_callback/ {print $2}')
10359 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10360 can2=$(do_facet mds1 \
10361 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10362 awk '/ldlm_cancel/ {print $2}')
10363 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10364 awk '/ldlm_bl_callback/ {print $2}')
10365 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10366 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10367 lru_resize_enable mdc
10368 lru_resize_enable osc
10370 run_test 120c "Early Lock Cancel: link test"
10373 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10374 remote_mds_nodsh && skip "remote MDS with nodsh"
10375 test_mkdir -i0 -c1 $DIR/$tdir
10376 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10377 skip_env "no early lock cancel on server"
10379 lru_resize_disable mdc
10380 lru_resize_disable osc
10382 cancel_lru_locks mdc
10383 stat $DIR/$tdir > /dev/null
10384 can1=$(do_facet mds1 \
10385 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10386 awk '/ldlm_cancel/ {print $2}')
10387 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10388 awk '/ldlm_bl_callback/ {print $2}')
10389 chmod a+x $DIR/$tdir
10390 can2=$(do_facet mds1 \
10391 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10392 awk '/ldlm_cancel/ {print $2}')
10393 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10394 awk '/ldlm_bl_callback/ {print $2}')
10395 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10396 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10397 lru_resize_enable mdc
10398 lru_resize_enable osc
10400 run_test 120d "Early Lock Cancel: setattr test"
10403 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10404 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10405 skip_env "no early lock cancel on server"
10406 remote_mds_nodsh && skip "remote MDS with nodsh"
10408 local dlmtrace_set=false
10410 test_mkdir -i0 -c1 $DIR/$tdir
10411 lru_resize_disable mdc
10412 lru_resize_disable osc
10413 ! $LCTL get_param debug | grep -q dlmtrace &&
10414 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
10415 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
10416 cancel_lru_locks mdc
10417 cancel_lru_locks osc
10418 dd if=$DIR/$tdir/f1 of=/dev/null
10419 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
10420 # XXX client can not do early lock cancel of OST lock
10421 # during unlink (LU-4206), so cancel osc lock now.
10423 cancel_lru_locks osc
10424 can1=$(do_facet mds1 \
10425 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10426 awk '/ldlm_cancel/ {print $2}')
10427 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10428 awk '/ldlm_bl_callback/ {print $2}')
10429 unlink $DIR/$tdir/f1
10431 can2=$(do_facet mds1 \
10432 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10433 awk '/ldlm_cancel/ {print $2}')
10434 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10435 awk '/ldlm_bl_callback/ {print $2}')
10436 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10437 $LCTL dk $TMP/cancel.debug.txt
10438 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10439 $LCTL dk $TMP/blocking.debug.txt
10440 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10441 lru_resize_enable mdc
10442 lru_resize_enable osc
10444 run_test 120e "Early Lock Cancel: unlink test"
10447 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10448 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10449 skip_env "no early lock cancel on server"
10450 remote_mds_nodsh && skip "remote MDS with nodsh"
10452 test_mkdir -i0 -c1 $DIR/$tdir
10453 lru_resize_disable mdc
10454 lru_resize_disable osc
10455 test_mkdir -i0 -c1 $DIR/$tdir/d1
10456 test_mkdir -i0 -c1 $DIR/$tdir/d2
10457 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10458 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10459 cancel_lru_locks mdc
10460 cancel_lru_locks osc
10461 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10462 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10463 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10464 # XXX client can not do early lock cancel of OST lock
10465 # during rename (LU-4206), so cancel osc lock now.
10467 cancel_lru_locks osc
10468 can1=$(do_facet mds1 \
10469 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10470 awk '/ldlm_cancel/ {print $2}')
10471 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10472 awk '/ldlm_bl_callback/ {print $2}')
10473 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10475 can2=$(do_facet mds1 \
10476 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10477 awk '/ldlm_cancel/ {print $2}')
10478 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10479 awk '/ldlm_bl_callback/ {print $2}')
10480 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10481 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10482 lru_resize_enable mdc
10483 lru_resize_enable osc
10485 run_test 120f "Early Lock Cancel: rename test"
10488 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10489 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10490 skip_env "no early lock cancel on server"
10491 remote_mds_nodsh && skip "remote MDS with nodsh"
10493 lru_resize_disable mdc
10494 lru_resize_disable osc
10496 echo create $count files
10497 test_mkdir $DIR/$tdir
10498 cancel_lru_locks mdc
10499 cancel_lru_locks osc
10502 can0=$(do_facet $SINGLEMDS \
10503 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10504 awk '/ldlm_cancel/ {print $2}')
10505 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10506 awk '/ldlm_bl_callback/ {print $2}')
10507 createmany -o $DIR/$tdir/f $count
10509 can1=$(do_facet $SINGLEMDS \
10510 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10511 awk '/ldlm_cancel/ {print $2}')
10512 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10513 awk '/ldlm_bl_callback/ {print $2}')
10515 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10516 echo rm $count files
10519 can2=$(do_facet $SINGLEMDS \
10520 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10521 awk '/ldlm_cancel/ {print $2}')
10522 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10523 awk '/ldlm_bl_callback/ {print $2}')
10525 echo total: $count removes in $((t2-t1))
10526 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10528 # wait for commitment of removal
10529 lru_resize_enable mdc
10530 lru_resize_enable osc
10532 run_test 120g "Early Lock Cancel: performance test"
10534 test_121() { #bug #10589
10535 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10538 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10539 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10540 lctl set_param fail_loc=0x310
10541 cancel_lru_locks osc > /dev/null
10542 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10543 lctl set_param fail_loc=0
10544 [[ $reads -eq $writes ]] ||
10545 error "read $reads blocks, must be $writes blocks"
10547 run_test 121 "read cancel race ========="
10549 test_123a() { # was test 123, statahead(bug 11401)
10550 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10553 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10554 log "testing UP system. Performance may be lower than expected."
10559 test_mkdir $DIR/$tdir
10560 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10561 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10563 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10564 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10566 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10567 lctl set_param -n llite.*.statahead_max 0
10568 lctl get_param llite.*.statahead_max
10569 cancel_lru_locks mdc
10570 cancel_lru_locks osc
10572 time ls -l $DIR/$tdir | wc -l
10574 delta=$((etime - stime))
10575 log "ls $i files without statahead: $delta sec"
10576 lctl set_param llite.*.statahead_max=$max
10578 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10579 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
10580 cancel_lru_locks mdc
10581 cancel_lru_locks osc
10583 time ls -l $DIR/$tdir | wc -l
10585 delta_sa=$((etime - stime))
10586 log "ls $i files with statahead: $delta_sa sec"
10587 lctl get_param -n llite.*.statahead_stats
10588 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10590 [[ $swrong -lt $ewrong ]] &&
10591 log "statahead was stopped, maybe too many locks held!"
10592 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
10594 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10595 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10596 lctl set_param -n llite.*.statahead_max 0
10597 lctl get_param llite.*.statahead_max
10598 cancel_lru_locks mdc
10599 cancel_lru_locks osc
10601 time ls -l $DIR/$tdir | wc -l
10603 delta=$((etime - stime))
10604 log "ls $i files again without statahead: $delta sec"
10605 lctl set_param llite.*.statahead_max=$max
10606 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10607 if [ $SLOWOK -eq 0 ]; then
10608 error "ls $i files is slower with statahead!"
10610 log "ls $i files is slower with statahead!"
10616 [ $delta -gt 20 ] && break
10617 [ $delta -gt 8 ] && MULT=$((50 / delta))
10618 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
10626 delta=$((etime - stime))
10627 log "rm -r $DIR/$tdir/: $delta seconds"
10629 lctl get_param -n llite.*.statahead_stats
10631 run_test 123a "verify statahead work"
10633 test_123b () { # statahead(bug 15027)
10634 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10636 test_mkdir $DIR/$tdir
10637 createmany -o $DIR/$tdir/$tfile-%d 1000
10639 cancel_lru_locks mdc
10640 cancel_lru_locks osc
10642 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
10643 lctl set_param fail_loc=0x80000803
10644 ls -lR $DIR/$tdir > /dev/null
10646 lctl set_param fail_loc=0x0
10647 lctl get_param -n llite.*.statahead_stats
10652 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
10655 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10656 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10657 skip_env "no lru resize on server"
10661 test_mkdir $DIR/$tdir
10663 log "create $NR files at $DIR/$tdir"
10664 createmany -o $DIR/$tdir/f $NR ||
10665 error "failed to create $NR files in $DIR/$tdir"
10667 cancel_lru_locks mdc
10668 ls -l $DIR/$tdir > /dev/null
10672 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
10673 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
10674 LRU_SIZE=$($LCTL get_param -n $PARAM)
10675 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
10676 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
10678 log "NS=$(basename $NSDIR)"
10683 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
10684 skip "Not enough cached locks created!"
10686 log "LRU=$LRU_SIZE"
10690 # We know that lru resize allows one client to hold $LIMIT locks
10691 # for 10h. After that locks begin to be killed by client.
10693 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
10695 if [ $LIMIT -lt $LRU_SIZE ]; then
10696 skip "Limit is too small $LIMIT"
10699 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
10700 # killing locks. Some time was spent for creating locks. This means
10701 # that up to the moment of sleep finish we must have killed some of
10702 # them (10-100 locks). This depends on how fast ther were created.
10703 # Many of them were touched in almost the same moment and thus will
10704 # be killed in groups.
10705 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
10707 # Use $LRU_SIZE_B here to take into account real number of locks
10708 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
10709 local LRU_SIZE_B=$LRU_SIZE
10711 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
10712 log "OLD_LVF=$OLD_LVF"
10713 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
10715 # Let's make sure that we really have some margin. Client checks
10716 # cached locks every 10 sec.
10717 SLEEP=$((SLEEP+20))
10718 log "Sleep ${SLEEP} sec"
10720 while ((SEC<$SLEEP)); do
10724 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
10725 echo -n "$LRU_SIZE"
10728 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
10729 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
10731 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
10732 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
10733 unlinkmany $DIR/$tdir/f $NR
10737 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
10738 log "unlink $NR files at $DIR/$tdir"
10739 unlinkmany $DIR/$tdir/f $NR
10741 run_test 124a "lru resize ======================================="
10743 get_max_pool_limit()
10745 local limit=$($LCTL get_param \
10746 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
10748 for l in $limit; do
10749 if [[ $l -gt $max ]]; then
10757 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10758 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10759 skip_env "no lru resize on server"
10761 LIMIT=$(get_max_pool_limit)
10763 NR=$(($(default_lru_size)*20))
10764 if [[ $NR -gt $LIMIT ]]; then
10765 log "Limit lock number by $LIMIT locks"
10769 IFree=$(mdsrate_inodes_available)
10770 if [ $IFree -lt $NR ]; then
10771 log "Limit lock number by $IFree inodes"
10775 lru_resize_disable mdc
10776 test_mkdir -p $DIR/$tdir/disable_lru_resize
10778 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
10779 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
10780 cancel_lru_locks mdc
10783 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10786 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10789 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10793 nolruresize_delta=$((etime-stime))
10794 log "ls -la time: $nolruresize_delta seconds"
10795 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10796 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
10798 lru_resize_enable mdc
10799 test_mkdir -p $DIR/$tdir/enable_lru_resize
10801 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
10802 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
10803 cancel_lru_locks mdc
10806 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10809 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10812 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10816 lruresize_delta=$((etime-stime))
10817 log "ls -la time: $lruresize_delta seconds"
10818 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10820 if [ $lruresize_delta -gt $nolruresize_delta ]; then
10821 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
10822 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
10823 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
10825 log "lru resize performs the same with no lru resize"
10827 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
10829 run_test 124b "lru resize (performance test) ======================="
10832 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10833 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10834 skip_env "no lru resize on server"
10836 # cache ununsed locks on client
10838 cancel_lru_locks mdc
10839 test_mkdir $DIR/$tdir
10840 createmany -o $DIR/$tdir/f $nr ||
10841 error "failed to create $nr files in $DIR/$tdir"
10842 ls -l $DIR/$tdir > /dev/null
10844 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10845 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10846 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10847 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10848 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10850 # set lru_max_age to 1 sec
10851 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10852 echo "sleep $((recalc_p * 2)) seconds..."
10853 sleep $((recalc_p * 2))
10855 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10856 # restore lru_max_age
10857 $LCTL set_param -n $nsdir.lru_max_age $max_age
10858 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10859 unlinkmany $DIR/$tdir/f $nr
10861 run_test 124c "LRUR cancel very aged locks"
10864 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10865 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10866 skip_env "no lru resize on server"
10868 # cache ununsed locks on client
10871 lru_resize_disable mdc
10872 stack_trap "lru_resize_enable mdc" EXIT
10874 cancel_lru_locks mdc
10876 # asynchronous object destroy at MDT could cause bl ast to client
10877 test_mkdir $DIR/$tdir
10878 createmany -o $DIR/$tdir/f $nr ||
10879 error "failed to create $nr files in $DIR/$tdir"
10880 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
10882 ls -l $DIR/$tdir > /dev/null
10884 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10885 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10886 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10887 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10889 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10891 # set lru_max_age to 1 sec
10892 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10893 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
10895 echo "sleep $((recalc_p * 2)) seconds..."
10896 sleep $((recalc_p * 2))
10898 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10900 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10902 run_test 124d "cancel very aged locks if lru-resize diasbaled"
10904 test_125() { # 13358
10905 $LCTL get_param -n llite.*.client_type | grep -q local ||
10906 skip "must run as local client"
10907 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
10908 skip_env "must have acl enabled"
10909 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
10911 test_mkdir $DIR/$tdir
10912 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
10913 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
10914 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
10916 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
10918 test_126() { # bug 12829/13455
10919 $GSS && skip_env "must run as gss disabled"
10920 $LCTL get_param -n llite.*.client_type | grep -q local ||
10921 skip "must run as local client"
10922 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
10924 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
10925 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
10927 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
10929 run_test 126 "check that the fsgid provided by the client is taken into account"
10931 test_127a() { # bug 15521
10932 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10934 $LFS setstripe -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
10935 $LCTL set_param osc.*.stats=0
10936 FSIZE=$((2048 * 1024))
10937 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
10938 cancel_lru_locks osc
10939 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
10941 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
10942 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
10943 echo "got $COUNT $NAME"
10944 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
10945 eval $NAME=$COUNT || error "Wrong proc format"
10948 read_bytes|write_bytes)
10949 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
10950 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
10951 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
10952 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
10953 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
10954 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
10955 error "sumsquare is too small: $SUMSQ"
10956 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
10957 error "sumsquare is too big: $SUMSQ"
10961 done < $DIR/${tfile}.tmp
10963 #check that we actually got some stats
10964 [ "$read_bytes" ] || error "Missing read_bytes stats"
10965 [ "$write_bytes" ] || error "Missing write_bytes stats"
10966 [ "$read_bytes" != 0 ] || error "no read done"
10967 [ "$write_bytes" != 0 ] || error "no write done"
10969 run_test 127a "verify the client stats are sane"
10971 test_127b() { # bug LU-333
10972 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10973 local name count samp unit min max sum sumsq
10975 $LCTL set_param llite.*.stats=0
10977 # perform 2 reads and writes so MAX is different from SUM.
10978 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10979 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
10980 cancel_lru_locks osc
10981 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10982 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
10984 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
10985 while read name count samp unit min max sum sumsq; do
10986 echo "got $count $name"
10987 eval $name=$count || error "Wrong proc format"
10991 [ $count -ne 2 ] && error "count is not 2: $count"
10992 [ $min -ne $PAGE_SIZE ] &&
10993 error "min is not $PAGE_SIZE: $min"
10994 [ $max -ne $PAGE_SIZE ] &&
10995 error "max is incorrect: $max"
10996 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
10997 error "sum is wrong: $sum"
11000 [ $count -ne 2 ] && error "count is not 2: $count"
11001 [ $min -ne $PAGE_SIZE ] &&
11002 error "min is not $PAGE_SIZE: $min"
11003 [ $max -ne $PAGE_SIZE ] &&
11004 error "max is incorrect: $max"
11005 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
11006 error "sum is wrong: $sum"
11010 done < $TMP/$tfile.tmp
11012 #check that we actually got some stats
11013 [ "$read_bytes" ] || error "Missing read_bytes stats"
11014 [ "$write_bytes" ] || error "Missing write_bytes stats"
11015 [ "$read_bytes" != 0 ] || error "no read done"
11016 [ "$write_bytes" != 0 ] || error "no write done"
11018 rm -f $TMP/${tfile}.tmp
11020 run_test 127b "verify the llite client stats are sane"
11022 test_127c() { # LU-12394
11023 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11030 $LCTL set_param llite.*.extents_stats=1
11031 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
11033 # Use two stripes so there is enough space in default config
11034 $LFS setstripe -c 2 $DIR/$tfile
11036 # Extent stats start at 0-4K and go in power of two buckets
11037 # LL_HIST_START = 12 --> 2^12 = 4K
11038 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
11039 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
11041 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
11043 # Write and read, 2x each, second time at a non-zero offset
11044 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
11045 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
11046 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
11047 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
11051 $LCTL get_param llite.*.extents_stats
11054 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
11056 local bucket=$($LCTL get_param -n llite.*.extents_stats |
11058 reads=$(echo $bucket | awk '{print $5}')
11059 writes=$(echo $bucket | awk '{print $9}')
11060 [ "$reads" -eq $count ] ||
11061 error "$reads reads in < $bsize bucket, expect $count"
11062 [ "$writes" -eq $count ] ||
11063 error "$writes writes in < $bsize bucket, expect $count"
11066 # Test mmap write and read
11067 $LCTL set_param llite.*.extents_stats=c
11069 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
11070 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
11071 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
11073 $LCTL get_param llite.*.extents_stats
11075 count=$(((size*1024) / PAGE_SIZE))
11077 bsize=$((2 * PAGE_SIZE / 1024))K
11079 bucket=$($LCTL get_param -n llite.*.extents_stats |
11081 reads=$(echo $bucket | awk '{print $5}')
11082 writes=$(echo $bucket | awk '{print $9}')
11083 # mmap writes fault in the page first, creating an additonal read
11084 [ "$reads" -eq $((2 * count)) ] ||
11085 error "$reads reads in < $bsize bucket, expect $count"
11086 [ "$writes" -eq $count ] ||
11087 error "$writes writes in < $bsize bucket, expect $count"
11089 run_test 127c "test llite extent stats with regular & mmap i/o"
11091 test_128() { # bug 15212
11093 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
11098 result=$(grep error $TMP/$tfile.log)
11099 rm -f $DIR/$tfile $TMP/$tfile.log
11100 [ -z "$result" ] ||
11101 error "consecutive find's under interactive lfs failed"
11103 run_test 128 "interactive lfs for 2 consecutive find's"
11105 set_dir_limits () {
11110 local ldproc=/proc/fs/ldiskfs
11111 local facets=$(get_facets MDS)
11113 for facet in ${facets//,/ }; do
11114 canondev=$(ldiskfs_canon \
11115 *.$(convert_facet2label $facet).mntdev $facet)
11116 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
11117 ldproc=/sys/fs/ldiskfs
11118 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
11119 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
11123 check_mds_dmesg() {
11124 local facets=$(get_facets MDS)
11125 for facet in ${facets//,/ }; do
11126 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
11132 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11133 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
11134 skip "Need MDS version with at least 2.5.56"
11135 if [ "$mds1_FSTYPE" != ldiskfs ]; then
11136 skip_env "ldiskfs only test"
11138 remote_mds_nodsh && skip "remote MDS with nodsh"
11142 local has_warning=false
11145 mkdir -p $DIR/$tdir
11147 # block size of mds1
11148 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
11149 set_dir_limits $maxsize $maxsize
11150 local dirsize=$(stat -c%s "$DIR/$tdir")
11152 while [[ $dirsize -le $maxsize ]]; do
11153 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
11155 if ! $has_warning; then
11156 check_mds_dmesg '"is approaching"' && has_warning=true
11158 # check two errors:
11159 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
11160 # EFBIG for previous versions included in ldiskfs series
11161 if [ $rc -eq $EFBIG ] || [ $rc -eq $ENOSPC ]; then
11163 echo "return code $rc received as expected"
11165 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
11166 error_exit "create failed w/o dir size limit"
11168 check_mds_dmesg '"has reached"' ||
11169 error_exit "reached message should be output"
11171 [ $has_warning = "false" ] &&
11172 error_exit "warning message should be output"
11174 dirsize=$(stat -c%s "$DIR/$tdir")
11176 [[ $dirsize -ge $maxsize ]] && return 0
11177 error_exit "current dir size $dirsize, " \
11178 "previous limit $maxsize"
11179 elif [ $rc -ne 0 ]; then
11181 error_exit "return $rc received instead of expected " \
11182 "$EFBIG or $ENOSPC, files in dir $dirsize"
11184 nfiles=$((nfiles + 1))
11185 dirsize=$(stat -c%s "$DIR/$tdir")
11189 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
11191 run_test 129 "test directory size limit ========================"
11200 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11201 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11203 trap cleanup_130 EXIT RETURN
11205 local fm_file=$DIR/$tfile
11206 $LFS setstripe -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
11207 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
11208 error "dd failed for $fm_file"
11210 # LU-1795: test filefrag/FIEMAP once, even if unsupported
11211 filefrag -ves $fm_file
11213 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11214 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11215 [ $RC != 0 ] && error "filefrag $fm_file failed"
11217 filefrag_op=$(filefrag -ve -k $fm_file |
11218 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11219 lun=$($LFS getstripe -i $fm_file)
11221 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
11224 for line in $filefrag_op
11226 frag_lun=`echo $line | cut -d: -f5`
11227 ext_len=`echo $line | cut -d: -f4`
11228 if (( $frag_lun != $lun )); then
11230 error "FIEMAP on 1-stripe file($fm_file) failed"
11233 (( tot_len += ext_len ))
11236 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
11238 error "FIEMAP on 1-stripe file($fm_file) failed;"
11244 echo "FIEMAP on single striped file succeeded"
11246 run_test 130a "FIEMAP (1-stripe file)"
11249 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11251 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11252 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11254 trap cleanup_130 EXIT RETURN
11256 local fm_file=$DIR/$tfile
11257 $LFS setstripe -S 65536 -c $OSTCOUNT $fm_file ||
11258 error "setstripe on $fm_file"
11259 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11260 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11262 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
11263 error "dd failed on $fm_file"
11265 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11266 filefrag_op=$(filefrag -ve -k $fm_file |
11267 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11269 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11270 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11275 for line in $filefrag_op
11277 frag_lun=$(echo $line | cut -d: -f5 |
11278 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11279 ext_len=$(echo $line | cut -d: -f4)
11280 if (( $frag_lun != $last_lun )); then
11281 if (( tot_len != 1024 )); then
11283 error "FIEMAP on $fm_file failed; returned " \
11284 "len $tot_len for OST $last_lun instead of 1024"
11287 (( num_luns += 1 ))
11291 (( tot_len += ext_len ))
11294 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
11296 error "FIEMAP on $fm_file failed; returned wrong number of " \
11297 "luns or wrong len for OST $last_lun"
11303 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
11305 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
11308 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11310 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11311 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11313 trap cleanup_130 EXIT RETURN
11315 local fm_file=$DIR/$tfile
11316 $LFS setstripe -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
11317 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11318 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11320 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
11321 error "dd failed on $fm_file"
11323 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11324 filefrag_op=$(filefrag -ve -k $fm_file |
11325 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11327 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11328 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11333 for line in $filefrag_op
11335 frag_lun=$(echo $line | cut -d: -f5 |
11336 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11337 ext_len=$(echo $line | cut -d: -f4)
11338 if (( $frag_lun != $last_lun )); then
11339 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
11340 if (( logical != 512 )); then
11342 error "FIEMAP on $fm_file failed; returned " \
11343 "logical start for lun $logical instead of 512"
11346 if (( tot_len != 512 )); then
11348 error "FIEMAP on $fm_file failed; returned " \
11349 "len $tot_len for OST $last_lun instead of 1024"
11352 (( num_luns += 1 ))
11356 (( tot_len += ext_len ))
11359 if (( num_luns != 2 || tot_len != 512 )); then
11361 error "FIEMAP on $fm_file failed; returned wrong number of " \
11362 "luns or wrong len for OST $last_lun"
11368 echo "FIEMAP on 2-stripe file with hole succeeded"
11370 run_test 130c "FIEMAP (2-stripe file with hole)"
11373 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
11375 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11376 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11378 trap cleanup_130 EXIT RETURN
11380 local fm_file=$DIR/$tfile
11381 $LFS setstripe -S 65536 -c $OSTCOUNT $fm_file ||
11382 error "setstripe on $fm_file"
11383 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11384 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11386 local actual_stripe_count=$($LFS getstripe -c $fm_file)
11387 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
11388 error "dd failed on $fm_file"
11390 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11391 filefrag_op=$(filefrag -ve -k $fm_file |
11392 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11394 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11395 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11400 for line in $filefrag_op
11402 frag_lun=$(echo $line | cut -d: -f5 |
11403 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11404 ext_len=$(echo $line | cut -d: -f4)
11405 if (( $frag_lun != $last_lun )); then
11406 if (( tot_len != 1024 )); then
11408 error "FIEMAP on $fm_file failed; returned " \
11409 "len $tot_len for OST $last_lun instead of 1024"
11412 (( num_luns += 1 ))
11416 (( tot_len += ext_len ))
11419 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
11421 error "FIEMAP on $fm_file failed; returned wrong number of " \
11422 "luns or wrong len for OST $last_lun"
11428 echo "FIEMAP on N-stripe file succeeded"
11430 run_test 130d "FIEMAP (N-stripe file)"
11433 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11435 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11436 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11438 trap cleanup_130 EXIT RETURN
11440 local fm_file=$DIR/$tfile
11441 $LFS setstripe -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11442 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11443 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11446 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11447 for ((i = 0; i < $NUM_BLKS; i++))
11449 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11452 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11453 filefrag_op=$(filefrag -ve -k $fm_file |
11454 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11456 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11457 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11462 for line in $filefrag_op
11464 frag_lun=$(echo $line | cut -d: -f5 |
11465 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11466 ext_len=$(echo $line | cut -d: -f4)
11467 if (( $frag_lun != $last_lun )); then
11468 if (( tot_len != $EXPECTED_LEN )); then
11470 error "FIEMAP on $fm_file failed; returned " \
11471 "len $tot_len for OST $last_lun instead " \
11475 (( num_luns += 1 ))
11479 (( tot_len += ext_len ))
11482 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11484 error "FIEMAP on $fm_file failed; returned wrong number " \
11485 "of luns or wrong len for OST $last_lun"
11491 echo "FIEMAP with continuation calls succeeded"
11493 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11496 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11497 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11499 local fm_file=$DIR/$tfile
11500 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11501 error "multiop create with lov_delay_create on $fm_file"
11503 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11504 filefrag_extents=$(filefrag -vek $fm_file |
11505 awk '/extents? found/ { print $2 }')
11506 if [[ "$filefrag_extents" != "0" ]]; then
11507 error "FIEMAP on $fm_file failed; " \
11508 "returned $filefrag_extents expected 0"
11513 run_test 130f "FIEMAP (unstriped file)"
11515 # Test for writev/readv
11517 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11518 error "writev test failed"
11519 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11520 error "readv failed"
11523 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11526 local fsize=$((524288 + 1048576 + 1572864))
11527 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11528 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11529 error "append writev test failed"
11531 ((fsize += 1572864 + 1048576))
11532 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11533 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11534 error "append writev test failed"
11537 run_test 131b "test append writev"
11540 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11543 run_test 131c "test read/write on file w/o objects"
11546 rwv -f $DIR/$tfile -w -n 1 1572864
11547 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11548 if [ "$NOB" != 1572864 ]; then
11549 error "Short read filed: read $NOB bytes instead of 1572864"
11553 run_test 131d "test short read"
11556 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11557 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11558 error "read hitting hole failed"
11561 run_test 131e "test read hitting hole"
11570 mds*) res=$(do_facet $facet \
11571 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11573 ost*) res=$(do_facet $facet \
11574 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
11576 *) error "Wrong facet '$facet'" ;;
11578 [ "$res" ] || error "The counter for $op on $facet was not incremented"
11579 # if the argument $3 is zero, it means any stat increment is ok.
11580 if [[ $want -gt 0 ]]; then
11581 local count=$(echo $res | awk '{ print $2 }')
11582 [[ $count -ne $want ]] &&
11583 error "The $op counter on $facet is $count, not $want"
11588 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11589 remote_ost_nodsh && skip "remote OST with nodsh"
11590 remote_mds_nodsh && skip "remote MDS with nodsh"
11591 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11592 skip_env "MDS doesn't support rename stats"
11594 local testdir=$DIR/${tdir}/stats_testdir
11596 mkdir -p $DIR/${tdir}
11599 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11600 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11602 # verify mdt stats first.
11603 mkdir ${testdir} || error "mkdir failed"
11604 check_stats $SINGLEMDS "mkdir" 1
11605 touch ${testdir}/${tfile} || error "touch failed"
11606 check_stats $SINGLEMDS "open" 1
11607 check_stats $SINGLEMDS "close" 1
11608 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
11609 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
11610 check_stats $SINGLEMDS "mknod" 2
11612 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
11613 check_stats $SINGLEMDS "unlink" 1
11614 rm -f ${testdir}/${tfile} || error "file remove failed"
11615 check_stats $SINGLEMDS "unlink" 2
11617 # remove working dir and check mdt stats again.
11618 rmdir ${testdir} || error "rmdir failed"
11619 check_stats $SINGLEMDS "rmdir" 1
11621 local testdir1=$DIR/${tdir}/stats_testdir1
11622 mkdir -p ${testdir}
11623 mkdir -p ${testdir1}
11624 touch ${testdir1}/test1
11625 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
11626 check_stats $SINGLEMDS "crossdir_rename" 1
11628 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
11629 check_stats $SINGLEMDS "samedir_rename" 1
11631 rm -rf $DIR/${tdir}
11633 run_test 133a "Verifying MDT stats ========================================"
11638 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11639 remote_ost_nodsh && skip "remote OST with nodsh"
11640 remote_mds_nodsh && skip "remote MDS with nodsh"
11642 local testdir=$DIR/${tdir}/stats_testdir
11644 mkdir -p ${testdir} || error "mkdir failed"
11645 touch ${testdir}/${tfile} || error "touch failed"
11646 cancel_lru_locks mdc
11649 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11650 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11652 # extra mdt stats verification.
11653 chmod 444 ${testdir}/${tfile} || error "chmod failed"
11654 check_stats $SINGLEMDS "setattr" 1
11655 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11656 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
11658 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
11659 check_stats $SINGLEMDS "getattr" 1
11661 rm -rf $DIR/${tdir}
11663 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
11664 # so the check below is not reliable
11665 [ $MDSCOUNT -eq 1 ] || return 0
11667 # Sleep to avoid a cached response.
11668 #define OBD_STATFS_CACHE_SECONDS 1
11670 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11671 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11672 $LFS df || error "lfs failed"
11673 check_stats $SINGLEMDS "statfs" 1
11675 # check aggregated statfs (LU-10018)
11676 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
11678 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
11681 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11682 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11684 check_stats $SINGLEMDS "statfs" 1
11686 # We want to check that the client didn't send OST_STATFS to
11687 # ost1 but the MDT also uses OST_STATFS for precreate. So some
11688 # extra care is needed here.
11689 if remote_mds; then
11690 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
11691 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
11693 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
11694 [ "$res" ] && error "OST got STATFS"
11699 run_test 133b "Verifying extra MDT stats =================================="
11702 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11703 remote_ost_nodsh && skip "remote OST with nodsh"
11704 remote_mds_nodsh && skip "remote MDS with nodsh"
11706 local testdir=$DIR/$tdir/stats_testdir
11708 test_mkdir -p $testdir
11710 # verify obdfilter stats.
11711 $LFS setstripe -c 1 -i 0 $testdir/$tfile
11713 cancel_lru_locks osc
11714 wait_delete_completed
11717 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11718 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11720 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
11723 cancel_lru_locks osc
11724 check_stats ost1 "write" 1
11726 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
11727 check_stats ost1 "read" 1
11729 > $testdir/$tfile || error "truncate failed"
11730 check_stats ost1 "punch" 1
11732 rm -f $testdir/$tfile || error "file remove failed"
11733 wait_delete_completed
11734 check_stats ost1 "destroy" 1
11738 run_test 133c "Verifying OST stats ========================================"
11745 while [ $value -ge 2 ]; do
11750 if [ $orig -gt $order ]; then
11758 local size=('K' 'M' 'G' 'T');
11760 local size_string=$value
11762 while [ $value -ge 1024 ]; do
11763 if [ $i -gt 3 ]; then
11764 #T is the biggest unit we get here, if that is bigger,
11766 size_string=${value}T
11769 value=$((value >> 10))
11770 if [ $value -lt 1024 ]; then
11771 size_string=${value}${size[$i]}
11780 get_rename_size() {
11782 local context=${2:-.}
11783 local sample=$(do_facet $SINGLEMDS $LCTL \
11784 get_param mdt.$FSNAME-MDT0000.rename_stats |
11785 grep -A1 $context |
11786 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
11791 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11792 remote_ost_nodsh && skip "remote OST with nodsh"
11793 remote_mds_nodsh && skip "remote MDS with nodsh"
11794 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11795 skip_env "MDS doesn't support rename stats"
11797 local testdir1=$DIR/${tdir}/stats_testdir1
11798 local testdir2=$DIR/${tdir}/stats_testdir2
11799 mkdir -p $DIR/${tdir}
11801 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11803 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
11804 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
11806 createmany -o $testdir1/test 512 || error "createmany failed"
11808 # check samedir rename size
11809 mv ${testdir1}/test0 ${testdir1}/test_0
11811 local testdir1_size=$(ls -l $DIR/${tdir} |
11812 awk '/stats_testdir1/ {print $5}')
11813 local testdir2_size=$(ls -l $DIR/${tdir} |
11814 awk '/stats_testdir2/ {print $5}')
11816 testdir1_size=$(order_2 $testdir1_size)
11817 testdir2_size=$(order_2 $testdir2_size)
11819 testdir1_size=$(size_in_KMGT $testdir1_size)
11820 testdir2_size=$(size_in_KMGT $testdir2_size)
11822 echo "source rename dir size: ${testdir1_size}"
11823 echo "target rename dir size: ${testdir2_size}"
11825 local cmd="do_facet $SINGLEMDS $LCTL "
11826 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
11828 eval $cmd || error "$cmd failed"
11829 local samedir=$($cmd | grep 'same_dir')
11830 local same_sample=$(get_rename_size $testdir1_size)
11831 [ -z "$samedir" ] && error "samedir_rename_size count error"
11832 [[ $same_sample -eq 1 ]] ||
11833 error "samedir_rename_size error $same_sample"
11834 echo "Check same dir rename stats success"
11836 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11838 # check crossdir rename size
11839 mv ${testdir1}/test_0 ${testdir2}/test_0
11841 testdir1_size=$(ls -l $DIR/${tdir} |
11842 awk '/stats_testdir1/ {print $5}')
11843 testdir2_size=$(ls -l $DIR/${tdir} |
11844 awk '/stats_testdir2/ {print $5}')
11846 testdir1_size=$(order_2 $testdir1_size)
11847 testdir2_size=$(order_2 $testdir2_size)
11849 testdir1_size=$(size_in_KMGT $testdir1_size)
11850 testdir2_size=$(size_in_KMGT $testdir2_size)
11852 echo "source rename dir size: ${testdir1_size}"
11853 echo "target rename dir size: ${testdir2_size}"
11855 eval $cmd || error "$cmd failed"
11856 local crossdir=$($cmd | grep 'crossdir')
11857 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
11858 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
11859 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
11860 [[ $src_sample -eq 1 ]] ||
11861 error "crossdir_rename_size error $src_sample"
11862 [[ $tgt_sample -eq 1 ]] ||
11863 error "crossdir_rename_size error $tgt_sample"
11864 echo "Check cross dir rename stats success"
11865 rm -rf $DIR/${tdir}
11867 run_test 133d "Verifying rename_stats ========================================"
11870 remote_mds_nodsh && skip "remote MDS with nodsh"
11871 remote_ost_nodsh && skip "remote OST with nodsh"
11872 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11874 local testdir=$DIR/${tdir}/stats_testdir
11875 local ctr f0 f1 bs=32768 count=42 sum
11877 mkdir -p ${testdir} || error "mkdir failed"
11879 $LFS setstripe -c 1 -i 0 ${testdir}/${tfile}
11881 for ctr in {write,read}_bytes; do
11883 cancel_lru_locks osc
11885 do_facet ost1 $LCTL set_param -n \
11886 "obdfilter.*.exports.clear=clear"
11888 if [ $ctr = write_bytes ]; then
11890 f1=${testdir}/${tfile}
11892 f0=${testdir}/${tfile}
11896 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
11899 cancel_lru_locks osc
11901 sum=$(do_facet ost1 $LCTL get_param \
11902 "obdfilter.*.exports.*.stats" |
11903 awk -v ctr=$ctr 'BEGIN { sum = 0 }
11904 $1 == ctr { sum += $7 }
11905 END { printf("%0.0f", sum) }')
11907 if ((sum != bs * count)); then
11908 error "Bad $ctr sum, expected $((bs * count)), got $sum"
11912 rm -rf $DIR/${tdir}
11914 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
11916 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
11918 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
11919 # not honor the -ignore_readdir_race option correctly. So we call
11920 # error_ignore() rather than error() in these cases. See LU-11152.
11922 if (find --version; do_facet mds1 find --version) |
11923 grep -q '\b4\.5\.1[1-4]\b'; then
11924 error_ignore LU-11152 "$@"
11931 # First without trusting modes.
11932 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
11933 echo "proc_dirs='$proc_dirs'"
11934 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
11935 find $proc_dirs -exec cat '{}' \; &> /dev/null
11937 # Second verifying readability.
11938 $LCTL get_param -R '*' &> /dev/null
11940 # Verifing writability with badarea_io.
11942 -ignore_readdir_race \
11944 -not -name force_lbug \
11945 -not -name changelog_mask \
11946 -exec badarea_io '{}' \; ||
11947 error_133 "find $proc_dirs failed"
11949 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
11952 remote_mds_nodsh && skip "remote MDS with nodsh"
11953 remote_ost_nodsh && skip "remote OST with nodsh"
11955 # eventually, this can also be replaced with "lctl get_param -R",
11956 # but not until that option is always available on the server
11958 for facet in mds1 ost1; do
11959 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
11960 skip_noexit "Too old lustre on $facet"
11961 local facet_proc_dirs=$(do_facet $facet \
11962 \\\ls -d $proc_regexp 2>/dev/null)
11963 echo "${facet}_proc_dirs='$facet_proc_dirs'"
11964 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
11965 do_facet $facet find $facet_proc_dirs \
11966 ! -name req_history \
11967 -exec cat '{}' \\\; &> /dev/null
11969 do_facet $facet find $facet_proc_dirs \
11970 ! -name req_history \
11972 -exec cat '{}' \\\; &> /dev/null ||
11973 error "proc file read failed"
11975 do_facet $facet find $facet_proc_dirs \
11976 -ignore_readdir_race \
11978 -not -name force_lbug \
11979 -not -name changelog_mask \
11980 -exec badarea_io '{}' \\\; ||
11981 error_133 "$facet find $facet_proc_dirs failed"
11984 # remount the FS in case writes/reads /proc break the FS
11985 cleanup || error "failed to unmount"
11986 setup || error "failed to setup"
11989 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
11992 remote_mds_nodsh && skip "remote MDS with nodsh"
11993 remote_ost_nodsh && skip "remote OST with nodsh"
11994 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
11995 skip "Need MDS version at least 2.9.54"
11999 for facet in client mds1 ost1; do
12000 local facet_proc_dirs=$(do_facet $facet \
12001 \\\ls -d $proc_regexp 2> /dev/null)
12002 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
12003 echo "${facet}_proc_dirs='$facet_proc_dirs'"
12004 # Get the list of files that are missing the terminating newline
12005 local missing=($(do_facet $facet \
12006 find ${facet_proc_dirs} -type f \| \
12007 while read F\; do \
12008 awk -v FS='\v' -v RS='\v\v' \
12009 "'END { if(NR>0 && \
12010 \\\$NF !~ /.*\\\n\$/) \
12011 print FILENAME}'" \
12014 [ ${#missing[*]} -eq 0 ] ||
12015 error "files do not end with newline: ${missing[*]}"
12018 run_test 133h "Proc files should end with newlines"
12021 remote_mds_nodsh && skip "remote MDS with nodsh"
12022 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
12023 skip "Need MDS version at least 2.7.54"
12025 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12026 cancel_lru_locks mdc
12028 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
12029 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
12030 [ $unused -eq 0 ] || error "$unused locks are not cleared"
12033 createmany -o $DIR/$tdir/f $nr ||
12034 error "failed to create $nr files in $DIR/$tdir"
12035 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
12037 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
12038 do_facet mds1 $LCTL set_param fail_loc=0x327
12039 do_facet mds1 $LCTL set_param fail_val=500
12042 echo "sleep 10 seconds ..."
12044 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
12046 do_facet mds1 $LCTL set_param fail_loc=0
12047 do_facet mds1 $LCTL set_param fail_val=0
12048 [ $lck_cnt -lt $unused ] ||
12049 error "No locks reclaimed, before:$unused, after:$lck_cnt"
12052 unlinkmany $DIR/$tdir/f $nr
12054 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
12057 remote_mds_nodsh && skip "remote MDS with nodsh"
12058 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
12059 skip "Need MDS version at least 2.7.54"
12061 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12062 cancel_lru_locks mdc
12064 local low_wm=$(do_facet mds1 $LCTL get_param -n \
12065 ldlm.lock_reclaim_threshold_mb)
12066 # disable reclaim temporarily
12067 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
12069 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
12070 do_facet mds1 $LCTL set_param fail_loc=0x328
12071 do_facet mds1 $LCTL set_param fail_val=500
12073 $LCTL set_param debug=+trace
12076 createmany -o $DIR/$tdir/f $nr &
12077 local create_pid=$!
12079 echo "Sleep $TIMEOUT seconds ..."
12081 if ! ps -p $create_pid > /dev/null 2>&1; then
12082 do_facet mds1 $LCTL set_param fail_loc=0
12083 do_facet mds1 $LCTL set_param fail_val=0
12084 do_facet mds1 $LCTL set_param \
12085 ldlm.lock_reclaim_threshold_mb=${low_wm}m
12086 error "createmany finished incorrectly!"
12088 do_facet mds1 $LCTL set_param fail_loc=0
12089 do_facet mds1 $LCTL set_param fail_val=0
12090 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
12091 wait $create_pid || return 1
12093 unlinkmany $DIR/$tdir/f $nr
12095 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
12097 test_140() { #bug-17379
12098 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12100 test_mkdir $DIR/$tdir
12101 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
12102 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
12104 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
12105 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
12107 while i=$((i + 1)); do
12109 cd $i || error "Changing to $i"
12110 ln -s ../stat stat || error "Creating stat symlink"
12111 # Read the symlink until ELOOP present,
12112 # not LBUGing the system is considered success,
12113 # we didn't overrun the stack.
12114 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
12115 if [ $ret -ne 0 ]; then
12116 if [ $ret -eq 40 ]; then
12119 error "Open stat symlink"
12125 echo "The symlink depth = $i"
12126 [ $i -eq 5 ] || [ $i -eq 7 ] || [ $i -eq 8 ] || [ $i -eq 40 ] ||
12127 error "Invalid symlink depth"
12129 # Test recursive symlink
12130 ln -s symlink_self symlink_self
12131 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
12132 echo "open symlink_self returns $ret"
12133 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
12135 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
12138 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12140 local TF="$TMP/$tfile"
12142 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12144 cancel_lru_locks $OSC
12145 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
12146 remount_client $MOUNT
12148 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
12151 $TRUNCATE $DIR/$tfile 6000
12152 cancel_lru_locks $OSC
12153 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
12156 echo "12345" >>$DIR/$tfile
12157 cancel_lru_locks $OSC
12158 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
12161 echo "12345" >>$DIR/$tfile
12162 cancel_lru_locks $OSC
12163 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
12168 run_test 150 "truncate/append tests"
12170 #LU-2902 roc_hit was not able to read all values from lproc
12171 function roc_hit_init() {
12172 local list=$(comma_list $(osts_nodes))
12173 local dir=$DIR/$tdir-check
12174 local file=$dir/$tfile
12180 #use setstripe to do a write to every ost
12181 for i in $(seq 0 $((OSTCOUNT-1))); do
12182 $LFS setstripe -c 1 -i $i $dir || error "$LFS setstripe $file failed"
12183 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
12184 idx=$(printf %04x $i)
12185 BEFORE=$(get_osd_param $list *OST*$idx stats |
12186 awk '$1 == "cache_access" {sum += $7}
12187 END { printf("%0.0f", sum) }')
12189 cancel_lru_locks osc
12190 cat $file >/dev/null
12192 AFTER=$(get_osd_param $list *OST*$idx stats |
12193 awk '$1 == "cache_access" {sum += $7}
12194 END { printf("%0.0f", sum) }')
12196 echo BEFORE:$BEFORE AFTER:$AFTER
12197 if ! let "AFTER - BEFORE == 4"; then
12199 error "roc_hit is not safe to use"
12207 function roc_hit() {
12208 local list=$(comma_list $(osts_nodes))
12209 echo $(get_osd_param $list '' stats |
12210 awk '$1 == "cache_hit" {sum += $7}
12211 END { printf("%0.0f", sum) }')
12214 function set_cache() {
12217 if [ "$2" == "off" ]; then
12220 local list=$(comma_list $(osts_nodes))
12221 set_osd_param $list '' $1_cache_enable $on
12223 cancel_lru_locks osc
12227 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12228 remote_ost_nodsh && skip "remote OST with nodsh"
12231 local list=$(comma_list $(osts_nodes))
12233 # check whether obdfilter is cache capable at all
12234 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
12235 skip "not cache-capable obdfilter"
12238 # check cache is enabled on all obdfilters
12239 if get_osd_param $list '' read_cache_enable | grep 0; then
12240 skip "oss cache is disabled"
12243 set_osd_param $list '' writethrough_cache_enable 1
12245 # check write cache is enabled on all obdfilters
12246 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
12247 skip "oss write cache is NOT enabled"
12252 #define OBD_FAIL_OBD_NO_LRU 0x609
12253 do_nodes $list $LCTL set_param fail_loc=0x609
12255 # pages should be in the case right after write
12256 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
12259 local BEFORE=$(roc_hit)
12260 cancel_lru_locks osc
12261 cat $DIR/$tfile >/dev/null
12262 local AFTER=$(roc_hit)
12264 do_nodes $list $LCTL set_param fail_loc=0
12266 if ! let "AFTER - BEFORE == CPAGES"; then
12267 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12270 # the following read invalidates the cache
12271 cancel_lru_locks osc
12272 set_osd_param $list '' read_cache_enable 0
12273 cat $DIR/$tfile >/dev/null
12275 # now data shouldn't be found in the cache
12277 cancel_lru_locks osc
12278 cat $DIR/$tfile >/dev/null
12280 if let "AFTER - BEFORE != 0"; then
12281 error "IN CACHE: before: $BEFORE, after: $AFTER"
12284 set_osd_param $list '' read_cache_enable 1
12287 run_test 151 "test cache on oss and controls ==============================="
12290 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12292 local TF="$TMP/$tfile"
12294 # simulate ENOMEM during write
12295 #define OBD_FAIL_OST_NOMEM 0x226
12296 lctl set_param fail_loc=0x80000226
12297 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12299 sync || error "sync failed"
12300 lctl set_param fail_loc=0
12302 # discard client's cache
12303 cancel_lru_locks osc
12305 # simulate ENOMEM during read
12306 lctl set_param fail_loc=0x80000226
12307 cmp $TF $DIR/$tfile || error "cmp failed"
12308 lctl set_param fail_loc=0
12312 run_test 152 "test read/write with enomem ============================"
12315 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
12317 run_test 153 "test if fdatasync does not crash ======================="
12319 dot_lustre_fid_permission_check() {
12321 local ffid=$MOUNT/.lustre/fid/$fid
12324 echo "stat fid $fid"
12325 stat $ffid > /dev/null || error "stat $ffid failed."
12326 echo "touch fid $fid"
12327 touch $ffid || error "touch $ffid failed."
12328 echo "write to fid $fid"
12329 cat /etc/hosts > $ffid || error "write $ffid failed."
12330 echo "read fid $fid"
12331 diff /etc/hosts $ffid || error "read $ffid failed."
12332 echo "append write to fid $fid"
12333 cat /etc/hosts >> $ffid || error "append write $ffid failed."
12334 echo "rename fid $fid"
12335 mv $ffid $test_dir/$tfile.1 &&
12336 error "rename $ffid to $tfile.1 should fail."
12337 touch $test_dir/$tfile.1
12338 mv $test_dir/$tfile.1 $ffid &&
12339 error "rename $tfile.1 to $ffid should fail."
12340 rm -f $test_dir/$tfile.1
12341 echo "truncate fid $fid"
12342 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
12343 echo "link fid $fid"
12344 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
12345 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
12346 echo "setfacl fid $fid"
12347 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
12348 echo "getfacl fid $fid"
12349 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
12351 echo "unlink fid $fid"
12352 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
12353 echo "mknod fid $fid"
12354 mknod $ffid c 1 3 && error "mknod $ffid should fail."
12356 fid=[0xf00000400:0x1:0x0]
12357 ffid=$MOUNT/.lustre/fid/$fid
12359 echo "stat non-exist fid $fid"
12360 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
12361 echo "write to non-exist fid $fid"
12362 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
12363 echo "link new fid $fid"
12364 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
12366 mkdir -p $test_dir/$tdir
12367 touch $test_dir/$tdir/$tfile
12368 fid=$($LFS path2fid $test_dir/$tdir)
12371 error "error: could not get fid for $test_dir/$dir/$tfile."
12373 ffid=$MOUNT/.lustre/fid/$fid
12376 ls $ffid > /dev/null || error "ls $ffid failed."
12377 echo "touch $fid/$tfile.1"
12378 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
12380 echo "touch $MOUNT/.lustre/fid/$tfile"
12381 touch $MOUNT/.lustre/fid/$tfile && \
12382 error "touch $MOUNT/.lustre/fid/$tfile should fail."
12384 echo "setxattr to $MOUNT/.lustre/fid"
12385 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
12387 echo "listxattr for $MOUNT/.lustre/fid"
12388 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
12390 echo "delxattr from $MOUNT/.lustre/fid"
12391 setfattr -x trusted.name1 $MOUNT/.lustre/fid
12393 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
12394 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
12395 error "touch invalid fid should fail."
12397 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
12398 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
12399 error "touch non-normal fid should fail."
12401 echo "rename $tdir to $MOUNT/.lustre/fid"
12402 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
12403 error "rename to $MOUNT/.lustre/fid should fail."
12405 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
12407 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
12408 local new_obf_mode=777
12410 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
12411 chmod $new_obf_mode $DIR/.lustre/fid ||
12412 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
12414 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
12415 [ $obf_mode -eq $new_obf_mode ] ||
12416 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
12418 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
12419 chmod $old_obf_mode $DIR/.lustre/fid ||
12420 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
12423 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
12424 fid=$($LFS path2fid $test_dir/$tfile-2)
12426 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
12428 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
12429 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
12430 error "create lov data thru .lustre failed"
12432 echo "cp /etc/passwd $test_dir/$tfile-2"
12433 cp /etc/passwd $test_dir/$tfile-2 ||
12434 error "copy to $test_dir/$tfile-2 failed."
12435 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
12436 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12437 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12439 rm -rf $test_dir/tfile.lnk
12440 rm -rf $test_dir/$tfile-2
12444 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12445 skip "Need MDS version at least 2.4.1"
12447 local tf=$DIR/$tfile
12450 local fid=$($LFS path2fid $tf)
12451 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12453 # check that we get the same pathname back
12454 local found=$($LFS fid2path $MOUNT "$fid")
12455 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12456 [ "$found" == "$tf" ] ||
12457 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12459 run_test 154A "lfs path2fid and fid2path basic checks"
12462 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12463 skip "Need MDS version at least 2.4.1"
12465 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12466 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12467 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12468 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12470 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12471 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12473 # check that we get the same pathname
12474 echo "PFID: $PFID, name: $name"
12475 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12476 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12477 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12478 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12480 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12482 run_test 154B "verify the ll_decode_linkea tool"
12485 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12486 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12487 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12488 skip "Need MDS version at least 2.2.51"
12489 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12491 cp /etc/hosts $DIR/$tfile
12493 fid=$($LFS path2fid $DIR/$tfile)
12495 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12497 dot_lustre_fid_permission_check "$fid" $DIR ||
12498 error "dot lustre permission check $fid failed"
12500 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12502 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12504 touch $MOUNT/.lustre/file &&
12505 error "creation is not allowed under .lustre"
12507 mkdir $MOUNT/.lustre/dir &&
12508 error "mkdir is not allowed under .lustre"
12512 run_test 154a "Open-by-FID"
12515 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12516 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12517 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12518 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12519 skip "Need MDS version at least 2.2.51"
12521 local remote_dir=$DIR/$tdir/remote_dir
12525 mkdir -p $DIR/$tdir
12526 $LFS mkdir -i $MDTIDX $remote_dir ||
12527 error "create remote directory failed"
12529 cp /etc/hosts $remote_dir/$tfile
12531 fid=$($LFS path2fid $remote_dir/$tfile)
12533 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12535 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12536 error "dot lustre permission check $fid failed"
12539 run_test 154b "Open-by-FID for remote directory"
12542 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12543 skip "Need MDS version at least 2.4.1"
12545 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12546 local FID1=$($LFS path2fid $DIR/$tfile.1)
12547 local FID2=$($LFS path2fid $DIR/$tfile.2)
12548 local FID3=$($LFS path2fid $DIR/$tfile.3)
12551 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12552 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12553 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12555 [ "$FID" = "${!want}" ] ||
12556 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12560 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12562 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12563 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12567 run_test 154c "lfs path2fid and fid2path multiple arguments"
12570 remote_mds_nodsh && skip "remote MDS with nodsh"
12571 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12572 skip "Need MDS version at least 2.5.53"
12574 if remote_mds; then
12575 nid=$($LCTL list_nids | sed "s/\./\\\./g")
12579 local proc_ofile="mdt.*.exports.'$nid'.open_files"
12586 local fid=$($LFS path2fid $DIR/$tfile)
12589 cmd="exec $fd<$DIR/$tfile"
12591 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
12592 echo "$fid_list" | grep "$fid"
12595 cmd="exec $fd>/dev/null"
12597 if [ $rc -ne 0 ]; then
12598 error "FID $fid not found in open files list $fid_list"
12601 run_test 154d "Verify open file fid"
12605 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
12606 skip "Need MDS version at least 2.6.50"
12608 if ls -a $MOUNT | grep -q '^\.lustre$'; then
12609 error ".lustre returned by readdir"
12612 run_test 154e ".lustre is not returned by readdir"
12615 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12617 # create parent directory on a single MDT to avoid cross-MDT hardlinks
12618 test_mkdir -p -c1 $DIR/$tdir/d
12619 # test dirs inherit from its stripe
12620 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
12621 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
12622 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
12623 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
12626 # get fid of parents
12627 local FID0=$($LFS path2fid $DIR/$tdir/d)
12628 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
12629 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
12630 local FID3=$($LFS path2fid $DIR)
12632 # check that path2fid --parents returns expected <parent_fid>/name
12633 # 1) test for a directory (single parent)
12634 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
12635 [ "$parent" == "$FID0/foo1" ] ||
12636 error "expected parent: $FID0/foo1, got: $parent"
12638 # 2) test for a file with nlink > 1 (multiple parents)
12639 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
12640 echo "$parent" | grep -F "$FID1/$tfile" ||
12641 error "$FID1/$tfile not returned in parent list"
12642 echo "$parent" | grep -F "$FID2/link" ||
12643 error "$FID2/link not returned in parent list"
12645 # 3) get parent by fid
12646 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
12647 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12648 echo "$parent" | grep -F "$FID1/$tfile" ||
12649 error "$FID1/$tfile not returned in parent list (by fid)"
12650 echo "$parent" | grep -F "$FID2/link" ||
12651 error "$FID2/link not returned in parent list (by fid)"
12653 # 4) test for entry in root directory
12654 parent=$($LFS path2fid --parents $DIR/f)
12655 echo "$parent" | grep -F "$FID3/f" ||
12656 error "$FID3/f not returned in parent list"
12658 # 5) test it on root directory
12659 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
12660 error "$MOUNT should not have parents"
12662 # enable xattr caching and check that linkea is correctly updated
12663 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
12664 save_lustre_params client "llite.*.xattr_cache" > $save
12665 lctl set_param llite.*.xattr_cache 1
12667 # 6.1) linkea update on rename
12668 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
12670 # get parents by fid
12671 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12672 # foo1 should no longer be returned in parent list
12673 echo "$parent" | grep -F "$FID1" &&
12674 error "$FID1 should no longer be in parent list"
12675 # the new path should appear
12676 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
12677 error "$FID2/$tfile.moved is not in parent list"
12679 # 6.2) linkea update on unlink
12680 rm -f $DIR/$tdir/d/foo2/link
12681 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12682 # foo2/link should no longer be returned in parent list
12683 echo "$parent" | grep -F "$FID2/link" &&
12684 error "$FID2/link should no longer be in parent list"
12688 restore_lustre_params < $save
12691 run_test 154f "get parent fids by reading link ea"
12695 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12696 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
12697 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
12698 skip "Need MDS version at least 2.6.92"
12700 mkdir -p $DIR/$tdir
12701 llapi_fid_test -d $DIR/$tdir
12703 run_test 154g "various llapi FID tests"
12705 test_155_small_load() {
12706 local temp=$TMP/$tfile
12707 local file=$DIR/$tfile
12709 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
12710 error "dd of=$temp bs=6096 count=1 failed"
12712 cancel_lru_locks $OSC
12713 cmp $temp $file || error "$temp $file differ"
12715 $TRUNCATE $temp 6000
12716 $TRUNCATE $file 6000
12717 cmp $temp $file || error "$temp $file differ (truncate1)"
12719 echo "12345" >>$temp
12720 echo "12345" >>$file
12721 cmp $temp $file || error "$temp $file differ (append1)"
12723 echo "12345" >>$temp
12724 echo "12345" >>$file
12725 cmp $temp $file || error "$temp $file differ (append2)"
12731 test_155_big_load() {
12732 remote_ost_nodsh && skip "remote OST with nodsh"
12734 local temp=$TMP/$tfile
12735 local file=$DIR/$tfile
12738 local cache_size=$(do_facet ost$((MAXI+1)) \
12739 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
12740 local large_file_size=$((cache_size * 2))
12742 echo "OSS cache size: $cache_size KB"
12743 echo "Large file size: $large_file_size KB"
12745 [ $MAXV -le $large_file_size ] &&
12746 skip_env "max available OST size needs > $large_file_size KB"
12748 $LFS setstripe $file -c 1 -i $MAXI || error "$LFS setstripe $file failed"
12750 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
12751 error "dd of=$temp bs=$large_file_size count=1k failed"
12754 cancel_lru_locks osc
12755 cmp $temp $file || error "$temp $file differ"
12761 save_writethrough() {
12762 local facets=$(get_facets OST)
12764 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
12768 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12770 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12772 save_writethrough $p
12775 set_cache writethrough on
12776 test_155_small_load
12777 restore_lustre_params < $p
12780 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
12783 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12785 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12787 save_writethrough $p
12790 set_cache writethrough off
12791 test_155_small_load
12792 restore_lustre_params < $p
12795 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
12798 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12800 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12802 save_writethrough $p
12805 set_cache writethrough on
12806 test_155_small_load
12807 restore_lustre_params < $p
12810 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
12813 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12815 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12817 save_writethrough $p
12820 set_cache writethrough off
12821 test_155_small_load
12822 restore_lustre_params < $p
12825 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
12828 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12830 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12832 save_writethrough $p
12835 set_cache writethrough on
12837 restore_lustre_params < $p
12840 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
12843 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12845 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12847 save_writethrough $p
12850 set_cache writethrough off
12852 restore_lustre_params < $p
12855 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
12858 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12860 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12862 save_writethrough $p
12865 set_cache writethrough on
12867 restore_lustre_params < $p
12870 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
12873 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12875 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12877 save_writethrough $p
12880 set_cache writethrough off
12882 restore_lustre_params < $p
12885 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
12888 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12889 remote_ost_nodsh && skip "remote OST with nodsh"
12890 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
12891 skip "stats not implemented on old servers"
12892 [ "$ost1_FSTYPE" = "zfs" ] &&
12893 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
12898 local file="$DIR/$tfile"
12899 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12901 save_writethrough $p
12904 log "Turn on read and write cache"
12906 set_cache writethrough on
12908 log "Write data and read it back."
12909 log "Read should be satisfied from the cache."
12910 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12912 cancel_lru_locks osc
12913 cat $file >/dev/null
12915 if ! let "AFTER - BEFORE == CPAGES"; then
12916 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12918 log "cache hits:: before: $BEFORE, after: $AFTER"
12921 log "Read again; it should be satisfied from the cache."
12923 cancel_lru_locks osc
12924 cat $file >/dev/null
12926 if ! let "AFTER - BEFORE == CPAGES"; then
12927 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12929 log "cache hits:: before: $BEFORE, after: $AFTER"
12932 log "Turn off the read cache and turn on the write cache"
12934 set_cache writethrough on
12936 log "Read again; it should be satisfied from the cache."
12938 cancel_lru_locks osc
12939 cat $file >/dev/null
12941 if ! let "AFTER - BEFORE == CPAGES"; then
12942 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12944 log "cache hits:: before: $BEFORE, after: $AFTER"
12947 log "Read again; it should not be satisfied from the cache."
12949 cancel_lru_locks osc
12950 cat $file >/dev/null
12952 if ! let "AFTER - BEFORE == 0"; then
12953 error "IN CACHE: before: $BEFORE, after: $AFTER"
12955 log "cache hits:: before: $BEFORE, after: $AFTER"
12958 log "Write data and read it back."
12959 log "Read should be satisfied from the cache."
12960 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12962 cancel_lru_locks osc
12963 cat $file >/dev/null
12965 if ! let "AFTER - BEFORE == CPAGES"; then
12966 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12968 log "cache hits:: before: $BEFORE, after: $AFTER"
12971 log "Read again; it should not be satisfied from the cache."
12973 cancel_lru_locks osc
12974 cat $file >/dev/null
12976 if ! let "AFTER - BEFORE == 0"; then
12977 error "IN CACHE: before: $BEFORE, after: $AFTER"
12979 log "cache hits:: before: $BEFORE, after: $AFTER"
12982 log "Turn off read and write cache"
12984 set_cache writethrough off
12986 log "Write data and read it back"
12987 log "It should not be satisfied from the cache."
12989 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12990 cancel_lru_locks osc
12992 cat $file >/dev/null
12994 if ! let "AFTER - BEFORE == 0"; then
12995 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
12997 log "cache hits:: before: $BEFORE, after: $AFTER"
13000 log "Turn on the read cache and turn off the write cache"
13002 set_cache writethrough off
13004 log "Write data and read it back"
13005 log "It should not be satisfied from the cache."
13007 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13009 cancel_lru_locks osc
13010 cat $file >/dev/null
13012 if ! let "AFTER - BEFORE == 0"; then
13013 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
13015 log "cache hits:: before: $BEFORE, after: $AFTER"
13018 log "Read again; it should be satisfied from the cache."
13020 cancel_lru_locks osc
13021 cat $file >/dev/null
13023 if ! let "AFTER - BEFORE == CPAGES"; then
13024 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
13026 log "cache hits:: before: $BEFORE, after: $AFTER"
13029 restore_lustre_params < $p
13032 run_test 156 "Verification of tunables"
13035 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13036 remote_mds_nodsh && skip "remote MDS with nodsh"
13037 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13038 skip "Need MDS version at least 2.2.0"
13040 changelog_register || error "changelog_register failed"
13041 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13042 changelog_users $SINGLEMDS | grep -q $cl_user ||
13043 error "User $cl_user not found in changelog_users"
13046 test_mkdir -p $DIR/$tdir/pics/2008/zachy
13047 changelog_clear 0 || error "changelog_clear failed"
13048 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
13049 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
13050 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
13051 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
13052 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
13053 rm $DIR/$tdir/pics/desktop.jpg
13055 changelog_dump | tail -10
13057 echo "verifying changelog mask"
13058 changelog_chmask "-MKDIR"
13059 changelog_chmask "-CLOSE"
13061 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
13062 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
13064 changelog_chmask "+MKDIR"
13065 changelog_chmask "+CLOSE"
13067 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
13068 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
13070 changelog_dump | tail -10
13071 MKDIRS=$(changelog_dump | grep -c "MKDIR")
13072 CLOSES=$(changelog_dump | grep -c "CLOSE")
13073 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
13074 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
13077 echo "verifying target fid"
13078 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
13079 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
13080 [ "$fidc" == "$fidf" ] ||
13081 error "changelog '$tfile' fid $fidc != file fid $fidf"
13082 echo "verifying parent fid"
13083 # The FID returned from the Changelog may be the directory shard on
13084 # a different MDT, and not the FID returned by path2fid on the parent.
13085 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
13086 # since this is what will matter when recreating this file in the tree.
13087 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
13088 local pathp=$($LFS fid2path $MOUNT "$fidp")
13089 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
13090 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
13092 echo "getting records for $cl_user"
13093 changelog_users $SINGLEMDS
13094 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
13096 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
13097 error "changelog_clear failed"
13098 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
13099 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
13100 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
13101 error "user index expect $user_rec1 + $nclr != $user_rec2"
13103 local min0_rec=$(changelog_users $SINGLEMDS |
13104 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
13105 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
13106 awk '{ print $1; exit; }')
13108 changelog_dump | tail -n 5
13109 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
13110 [ $first_rec == $((min0_rec + 1)) ] ||
13111 error "first index should be $min0_rec + 1 not $first_rec"
13113 # LU-3446 changelog index reset on MDT restart
13114 local cur_rec1=$(changelog_users $SINGLEMDS |
13115 awk '/^current.index:/ { print $NF }')
13116 changelog_clear 0 ||
13117 error "clear all changelog records for $cl_user failed"
13118 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
13119 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
13120 error "Fail to start $SINGLEMDS"
13121 local cur_rec2=$(changelog_users $SINGLEMDS |
13122 awk '/^current.index:/ { print $NF }')
13123 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
13124 [ $cur_rec1 == $cur_rec2 ] ||
13125 error "current index should be $cur_rec1 not $cur_rec2"
13127 echo "verifying users from this test are deregistered"
13128 changelog_deregister || error "changelog_deregister failed"
13129 changelog_users $SINGLEMDS | grep -q $cl_user &&
13130 error "User '$cl_user' still in changelog_users"
13132 # lctl get_param -n mdd.*.changelog_users
13133 # current index: 144
13134 # ID index (idle seconds)
13136 if ! changelog_users $SINGLEMDS | grep "^cl"; then
13137 # this is the normal case where all users were deregistered
13138 # make sure no new records are added when no users are present
13139 local last_rec1=$(changelog_users $SINGLEMDS |
13140 awk '/^current.index:/ { print $NF }')
13141 touch $DIR/$tdir/chloe
13142 local last_rec2=$(changelog_users $SINGLEMDS |
13143 awk '/^current.index:/ { print $NF }')
13144 echo "verify changelogs are off: $last_rec1 == $last_rec2"
13145 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
13147 # any changelog users must be leftovers from a previous test
13148 changelog_users $SINGLEMDS
13149 echo "other changelog users; can't verify off"
13152 run_test 160a "changelog sanity"
13154 test_160b() { # LU-3587
13155 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13156 remote_mds_nodsh && skip "remote MDS with nodsh"
13157 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13158 skip "Need MDS version at least 2.2.0"
13160 changelog_register || error "changelog_register failed"
13161 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13162 changelog_users $SINGLEMDS | grep -q $cl_user ||
13163 error "User '$cl_user' not found in changelog_users"
13165 local longname1=$(str_repeat a 255)
13166 local longname2=$(str_repeat b 255)
13169 echo "creating very long named file"
13170 touch $longname1 || error "create of '$longname1' failed"
13171 echo "renaming very long named file"
13172 mv $longname1 $longname2
13174 changelog_dump | grep RENME | tail -n 5
13177 run_test 160b "Verify that very long rename doesn't crash in changelog"
13180 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13181 remote_mds_nodsh && skip "remote MDS with nodsh"
13183 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
13184 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
13185 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
13186 skip "Need MDS version at least 2.5.58 or 2.5.2+"
13190 # Registration step
13191 changelog_register || error "changelog_register failed"
13194 mkdir -p $DIR/$tdir
13195 $MCREATE $DIR/$tdir/foo_160c
13196 changelog_chmask "-TRUNC"
13197 $TRUNCATE $DIR/$tdir/foo_160c 200
13198 changelog_chmask "+TRUNC"
13199 $TRUNCATE $DIR/$tdir/foo_160c 199
13200 changelog_dump | tail -n 5
13201 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
13202 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
13204 run_test 160c "verify that changelog log catch the truncate event"
13207 remote_mds_nodsh && skip "remote MDS with nodsh"
13208 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13209 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13210 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
13211 skip "Need MDS version at least 2.7.60"
13213 # Registration step
13214 changelog_register || error "changelog_register failed"
13216 mkdir -p $DIR/$tdir/migrate_dir
13217 changelog_clear 0 || error "changelog_clear failed"
13219 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
13220 changelog_dump | tail -n 5
13221 local migrates=$(changelog_dump | grep -c "MIGRT")
13222 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
13224 run_test 160d "verify that changelog log catch the migrate event"
13227 remote_mds_nodsh && skip "remote MDS with nodsh"
13230 changelog_register || error "changelog_register failed"
13232 # Delete a future user (expect fail)
13233 local MDT0=$(facet_svc $SINGLEMDS)
13234 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
13237 if [ $rc -eq 0 ]; then
13238 error "Deleted non-existant user cl77"
13239 elif [ $rc -ne 2 ]; then
13240 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
13243 # Clear to a bad index (1 billion should be safe)
13244 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
13247 if [ $rc -eq 0 ]; then
13248 error "Successfully cleared to invalid CL index"
13249 elif [ $rc -ne 22 ]; then
13250 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
13253 run_test 160e "changelog negative testing (should return errors)"
13256 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13257 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13258 skip "Need MDS version at least 2.10.56"
13260 local mdts=$(comma_list $(mdts_nodes))
13263 changelog_register || error "first changelog_register failed"
13264 changelog_register || error "second changelog_register failed"
13266 declare -A cl_user1
13267 declare -A cl_user2
13272 # generate some changelog records to accumulate on each MDT
13273 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13274 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13275 error "create $DIR/$tdir/$tfile failed"
13277 # check changelogs have been generated
13278 local nbcl=$(changelog_dump | wc -l)
13279 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13281 for param in "changelog_max_idle_time=10" \
13283 "changelog_min_gc_interval=2" \
13284 "changelog_min_free_cat_entries=3"; do
13285 local MDT0=$(facet_svc $SINGLEMDS)
13286 local var="${param%=*}"
13287 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13289 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13290 do_nodes $mdts $LCTL set_param mdd.*.$param
13293 # force cl_user2 to be idle (1st part)
13296 # simulate changelog catalog almost full
13297 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13298 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13300 for i in $(seq $MDSCOUNT); do
13301 cl_users=(${CL_USERS[mds$i]})
13302 cl_user1[mds$i]="${cl_users[0]}"
13303 cl_user2[mds$i]="${cl_users[1]}"
13305 [ -n "${cl_user1[mds$i]}" ] ||
13306 error "mds$i: no user registered"
13307 [ -n "${cl_user2[mds$i]}" ] ||
13308 error "mds$i: only ${cl_user2[mds$i]} is registered"
13310 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13311 [ -n "$user_rec1" ] ||
13312 error "mds$i: User ${cl_user1[mds$i]} not registered"
13313 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13314 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13315 [ -n "$user_rec2" ] ||
13316 error "mds$i: User ${cl_user1[mds$i]} not registered"
13317 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13318 "$user_rec1 + 2 == $user_rec2"
13319 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13320 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13321 "$user_rec1 + 2, but is $user_rec2"
13322 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13323 [ -n "$user_rec2" ] ||
13324 error "mds$i: User ${cl_user2[mds$i]} not registered"
13325 [ $user_rec1 == $user_rec2 ] ||
13326 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13327 "$user_rec1, but is $user_rec2"
13330 # force cl_user2 to be idle (2nd part) and to reach
13331 # changelog_max_idle_time
13334 # generate one more changelog to trigger fail_loc
13335 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13336 error "create $DIR/$tdir/${tfile}bis failed"
13338 # ensure gc thread is done
13339 for i in $(mdts_nodes); do
13341 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13342 error "$i: GC-thread not done"
13346 for i in $(seq $MDSCOUNT); do
13347 # check cl_user1 still registered
13348 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13349 error "mds$i: User ${cl_user1[mds$i]} not registered"
13350 # check cl_user2 unregistered
13351 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13352 error "mds$i: User ${cl_user2[mds$i]} still registered"
13354 # check changelogs are present and starting at $user_rec1 + 1
13355 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13356 [ -n "$user_rec1" ] ||
13357 error "mds$i: User ${cl_user1[mds$i]} not registered"
13358 first_rec=$($LFS changelog $(facet_svc mds$i) |
13359 awk '{ print $1; exit; }')
13361 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13362 [ $((user_rec1 + 1)) == $first_rec ] ||
13363 error "mds$i: first index should be $user_rec1 + 1, " \
13364 "but is $first_rec"
13367 run_test 160f "changelog garbage collect (timestamped users)"
13370 remote_mds_nodsh && skip "remote MDS with nodsh"
13371 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13372 skip "Need MDS version at least 2.10.56"
13374 local mdts=$(comma_list $(mdts_nodes))
13376 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
13377 do_nodes $mdts $LCTL set_param fail_loc=0x1314
13380 changelog_register || error "first changelog_register failed"
13381 changelog_register || error "second changelog_register failed"
13383 declare -A cl_user1
13384 declare -A cl_user2
13389 # generate some changelog records to accumulate on each MDT
13390 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13391 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13392 error "create $DIR/$tdir/$tfile failed"
13394 # check changelogs have been generated
13395 local nbcl=$(changelog_dump | wc -l)
13396 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13398 # reduce the max_idle_indexes value to make sure we exceed it
13399 max_ndx=$((nbcl / 2 - 1))
13401 for param in "changelog_max_idle_indexes=$max_ndx" \
13403 "changelog_min_gc_interval=2" \
13404 "changelog_min_free_cat_entries=3"; do
13405 local MDT0=$(facet_svc $SINGLEMDS)
13406 local var="${param%=*}"
13407 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13409 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13410 do_nodes $mdts $LCTL set_param mdd.*.$param ||
13411 error "unable to set mdd.*.$param"
13414 # simulate changelog catalog almost full
13415 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13416 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13418 for i in $(seq $MDSCOUNT); do
13419 cl_users=(${CL_USERS[mds$i]})
13420 cl_user1[mds$i]="${cl_users[0]}"
13421 cl_user2[mds$i]="${cl_users[1]}"
13423 [ -n "${cl_user1[mds$i]}" ] ||
13424 error "mds$i: no user registered"
13425 [ -n "${cl_user2[mds$i]}" ] ||
13426 error "mds$i: only ${cl_user1[mds$i]} is registered"
13428 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13429 [ -n "$user_rec1" ] ||
13430 error "mds$i: User ${cl_user1[mds$i]} not registered"
13431 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13432 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13433 [ -n "$user_rec2" ] ||
13434 error "mds$i: User ${cl_user1[mds$i]} not registered"
13435 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13436 "$user_rec1 + 2 == $user_rec2"
13437 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13438 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13439 "$user_rec1 + 2, but is $user_rec2"
13440 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13441 [ -n "$user_rec2" ] ||
13442 error "mds$i: User ${cl_user2[mds$i]} not registered"
13443 [ $user_rec1 == $user_rec2 ] ||
13444 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13445 "$user_rec1, but is $user_rec2"
13448 # ensure we are past the previous changelog_min_gc_interval set above
13451 # generate one more changelog to trigger fail_loc
13452 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13453 error "create $DIR/$tdir/${tfile}bis failed"
13455 # ensure gc thread is done
13456 for i in $(mdts_nodes); do
13458 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13459 error "$i: GC-thread not done"
13463 for i in $(seq $MDSCOUNT); do
13464 # check cl_user1 still registered
13465 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13466 error "mds$i: User ${cl_user1[mds$i]} not registered"
13467 # check cl_user2 unregistered
13468 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13469 error "mds$i: User ${cl_user2[mds$i]} still registered"
13471 # check changelogs are present and starting at $user_rec1 + 1
13472 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13473 [ -n "$user_rec1" ] ||
13474 error "mds$i: User ${cl_user1[mds$i]} not registered"
13475 first_rec=$($LFS changelog $(facet_svc mds$i) |
13476 awk '{ print $1; exit; }')
13478 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13479 [ $((user_rec1 + 1)) == $first_rec ] ||
13480 error "mds$i: first index should be $user_rec1 + 1, " \
13481 "but is $first_rec"
13484 run_test 160g "changelog garbage collect (old users)"
13487 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13488 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13489 skip "Need MDS version at least 2.10.56"
13491 local mdts=$(comma_list $(mdts_nodes))
13494 changelog_register || error "first changelog_register failed"
13495 changelog_register || error "second changelog_register failed"
13497 declare -A cl_user1
13498 declare -A cl_user2
13503 # generate some changelog records to accumulate on each MDT
13504 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13505 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13506 error "create $DIR/$tdir/$tfile failed"
13508 # check changelogs have been generated
13509 local nbcl=$(changelog_dump | wc -l)
13510 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13512 for param in "changelog_max_idle_time=10" \
13514 "changelog_min_gc_interval=2"; do
13515 local MDT0=$(facet_svc $SINGLEMDS)
13516 local var="${param%=*}"
13517 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13519 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13520 do_nodes $mdts $LCTL set_param mdd.*.$param
13523 # force cl_user2 to be idle (1st part)
13526 for i in $(seq $MDSCOUNT); do
13527 cl_users=(${CL_USERS[mds$i]})
13528 cl_user1[mds$i]="${cl_users[0]}"
13529 cl_user2[mds$i]="${cl_users[1]}"
13531 [ -n "${cl_user1[mds$i]}" ] ||
13532 error "mds$i: no user registered"
13533 [ -n "${cl_user2[mds$i]}" ] ||
13534 error "mds$i: only ${cl_user2[mds$i]} is registered"
13536 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13537 [ -n "$user_rec1" ] ||
13538 error "mds$i: User ${cl_user1[mds$i]} not registered"
13539 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13540 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13541 [ -n "$user_rec2" ] ||
13542 error "mds$i: User ${cl_user1[mds$i]} not registered"
13543 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13544 "$user_rec1 + 2 == $user_rec2"
13545 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13546 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13547 "$user_rec1 + 2, but is $user_rec2"
13548 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13549 [ -n "$user_rec2" ] ||
13550 error "mds$i: User ${cl_user2[mds$i]} not registered"
13551 [ $user_rec1 == $user_rec2 ] ||
13552 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13553 "$user_rec1, but is $user_rec2"
13556 # force cl_user2 to be idle (2nd part) and to reach
13557 # changelog_max_idle_time
13560 # force each GC-thread start and block then
13561 # one per MDT/MDD, set fail_val accordingly
13562 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13563 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13565 # generate more changelogs to trigger fail_loc
13566 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13567 error "create $DIR/$tdir/${tfile}bis failed"
13569 # stop MDT to stop GC-thread, should be done in back-ground as it will
13570 # block waiting for the thread to be released and exit
13571 declare -A stop_pids
13572 for i in $(seq $MDSCOUNT); do
13574 stop_pids[mds$i]=$!
13577 for i in $(mdts_nodes); do
13580 local facets=$(facets_up_on_host $i)
13582 for facet in ${facets//,/ }; do
13583 if [[ $facet == mds* ]]; then
13587 # ensure each MDS's gc threads are still present and all in "R"
13588 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
13589 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
13590 error "$i: expected $nb GC-thread"
13592 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
13594 error "$i: GC-thread not found in R-state"
13595 # check umounts of each MDT on MDS have reached kthread_stop()
13596 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
13597 error "$i: expected $nb umount"
13599 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
13600 error "$i: umount not found in D-state"
13603 # release all GC-threads
13604 do_nodes $mdts $LCTL set_param fail_loc=0
13606 # wait for MDT stop to complete
13607 for i in $(seq $MDSCOUNT); do
13608 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
13612 # may try to check if any orphan changelog records are present
13613 # via ldiskfs/zfs and llog_reader...
13615 # re-start/mount MDTs
13616 for i in $(seq $MDSCOUNT); do
13617 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
13618 error "Fail to start mds$i"
13622 for i in $(seq $MDSCOUNT); do
13623 # check cl_user1 still registered
13624 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13625 error "mds$i: User ${cl_user1[mds$i]} not registered"
13626 # check cl_user2 unregistered
13627 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13628 error "mds$i: User ${cl_user2[mds$i]} still registered"
13630 # check changelogs are present and starting at $user_rec1 + 1
13631 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13632 [ -n "$user_rec1" ] ||
13633 error "mds$i: User ${cl_user1[mds$i]} not registered"
13634 first_rec=$($LFS changelog $(facet_svc mds$i) |
13635 awk '{ print $1; exit; }')
13637 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13638 [ $((user_rec1 + 1)) == $first_rec ] ||
13639 error "mds$i: first index should be $user_rec1 + 1, " \
13640 "but is $first_rec"
13643 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
13648 local mdts=$(comma_list $(mdts_nodes))
13650 changelog_register || error "first changelog_register failed"
13652 # generate some changelog records to accumulate on each MDT
13653 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13654 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13655 error "create $DIR/$tdir/$tfile failed"
13657 # check changelogs have been generated
13658 local nbcl=$(changelog_dump | wc -l)
13659 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13661 # simulate race between register and unregister
13662 # XXX as fail_loc is set per-MDS, with DNE configs the race
13663 # simulation will only occur for one MDT per MDS and for the
13664 # others the normal race scenario will take place
13665 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
13666 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
13667 do_nodes $mdts $LCTL set_param fail_val=1
13669 # unregister 1st user
13670 changelog_deregister &
13672 # wait some time for deregister work to reach race rdv
13674 # register 2nd user
13675 changelog_register || error "2nd user register failed"
13677 wait $pid1 || error "1st user deregister failed"
13681 declare -A LAST_REC
13682 for i in $(seq $MDSCOUNT); do
13683 if changelog_users mds$i | grep "^cl"; then
13684 # make sure new records are added with one user present
13685 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
13686 awk '/^current.index:/ { print $NF }')
13688 error "mds$i has no user registered"
13692 # generate more changelog records to accumulate on each MDT
13693 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13694 error "create $DIR/$tdir/${tfile}bis failed"
13696 for i in $(seq $MDSCOUNT); do
13697 last_rec=$(changelog_users $SINGLEMDS |
13698 awk '/^current.index:/ { print $NF }')
13699 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
13700 [ $last_rec != ${LAST_REC[mds$i]} ] ||
13701 error "changelogs are off on mds$i"
13704 run_test 160i "changelog user register/unregister race"
13707 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13709 test_mkdir -c1 $DIR/$tdir
13710 cp /etc/hosts $DIR/$tdir/$tfile
13711 test_mkdir -c1 $DIR/$tdir/foo1
13712 test_mkdir -c1 $DIR/$tdir/foo2
13713 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
13714 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
13715 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
13716 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
13717 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
13718 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13719 $LFS fid2path $DIR $FID
13720 error "bad link ea"
13723 rm $DIR/$tdir/foo2/zachary
13725 rm $DIR/$tdir/foo2/thor
13727 rm $DIR/$tdir/$tfile
13729 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
13730 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
13731 { $LFS fid2path $DIR $FID; error "bad link rename"; }
13732 rm $DIR/$tdir/foo2/maggie
13735 local longname=$tfile.avg_len_is_thirty_two_
13736 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
13737 error_noexit 'failed to unlink many hardlinks'" EXIT
13738 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
13739 error "failed to hardlink many files"
13740 links=$($LFS fid2path $DIR $FID | wc -l)
13741 echo -n "${links}/1000 links in link EA"
13742 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
13744 run_test 161a "link ea sanity"
13747 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13748 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
13751 local remote_dir=$DIR/$tdir/remote_dir
13753 mkdir -p $DIR/$tdir
13754 $LFS mkdir -i $MDTIDX $remote_dir ||
13755 error "create remote directory failed"
13757 cp /etc/hosts $remote_dir/$tfile
13758 mkdir -p $remote_dir/foo1
13759 mkdir -p $remote_dir/foo2
13760 ln $remote_dir/$tfile $remote_dir/foo1/sofia
13761 ln $remote_dir/$tfile $remote_dir/foo2/zachary
13762 ln $remote_dir/$tfile $remote_dir/foo1/luna
13763 ln $remote_dir/$tfile $remote_dir/foo2/thor
13765 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
13767 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13768 $LFS fid2path $DIR $FID
13769 error "bad link ea"
13772 rm $remote_dir/foo2/zachary
13774 rm $remote_dir/foo2/thor
13776 rm $remote_dir/$tfile
13778 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
13779 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
13780 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
13781 $LFS fid2path $DIR $FID
13782 error "bad link rename"
13784 rm $remote_dir/foo2/maggie
13787 local longname=filename_avg_len_is_thirty_two_
13788 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
13789 error "failed to hardlink many files"
13790 links=$($LFS fid2path $DIR $FID | wc -l)
13791 echo -n "${links}/1000 links in link EA"
13792 [[ ${links} -gt 60 ]] ||
13793 error "expected at least 60 links in link EA"
13794 unlinkmany $remote_dir/foo2/$longname 1000 ||
13795 error "failed to unlink many hardlinks"
13797 run_test 161b "link ea sanity under remote directory"
13800 remote_mds_nodsh && skip "remote MDS with nodsh"
13801 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13802 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
13803 skip "Need MDS version at least 2.1.5"
13805 # define CLF_RENAME_LAST 0x0001
13806 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
13807 changelog_register || error "changelog_register failed"
13810 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
13811 touch $DIR/$tdir/foo_161c
13812 touch $DIR/$tdir/bar_161c
13813 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13814 changelog_dump | grep RENME | tail -n 5
13815 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13816 changelog_clear 0 || error "changelog_clear failed"
13817 if [ x$flags != "x0x1" ]; then
13818 error "flag $flags is not 0x1"
13821 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
13822 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
13823 touch $DIR/$tdir/foo_161c
13824 touch $DIR/$tdir/bar_161c
13825 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13826 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13827 changelog_dump | grep RENME | tail -n 5
13828 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13829 changelog_clear 0 || error "changelog_clear failed"
13830 if [ x$flags != "x0x0" ]; then
13831 error "flag $flags is not 0x0"
13833 echo "rename overwrite a target having nlink > 1," \
13834 "changelog record has flags of $flags"
13836 # rename doesn't overwrite a target (changelog flag 0x0)
13837 touch $DIR/$tdir/foo_161c
13838 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
13839 changelog_dump | grep RENME | tail -n 5
13840 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
13841 changelog_clear 0 || error "changelog_clear failed"
13842 if [ x$flags != "x0x0" ]; then
13843 error "flag $flags is not 0x0"
13845 echo "rename doesn't overwrite a target," \
13846 "changelog record has flags of $flags"
13848 # define CLF_UNLINK_LAST 0x0001
13849 # unlink a file having nlink = 1 (changelog flag 0x1)
13850 rm -f $DIR/$tdir/foo2_161c
13851 changelog_dump | grep UNLNK | tail -n 5
13852 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13853 changelog_clear 0 || error "changelog_clear failed"
13854 if [ x$flags != "x0x1" ]; then
13855 error "flag $flags is not 0x1"
13857 echo "unlink a file having nlink = 1," \
13858 "changelog record has flags of $flags"
13860 # unlink a file having nlink > 1 (changelog flag 0x0)
13861 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13862 rm -f $DIR/$tdir/foobar_161c
13863 changelog_dump | grep UNLNK | tail -n 5
13864 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13865 changelog_clear 0 || error "changelog_clear failed"
13866 if [ x$flags != "x0x0" ]; then
13867 error "flag $flags is not 0x0"
13869 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
13871 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
13874 remote_mds_nodsh && skip "remote MDS with nodsh"
13875 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
13880 changelog_register || error "changelog_register failed"
13882 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
13883 # interfer with $MOUNT/.lustre/fid/ access
13885 [[ $? -eq 0 ]] || error "mkdir failed"
13887 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
13888 $LCTL set_param fail_loc=0x8000140c
13890 $LCTL set_param fail_val=5
13893 echo foofoo > $DIR/$tdir/$tfile &
13896 # wait for create to be delayed
13900 [[ $? -eq 0 ]] || error "create should be blocked"
13902 local tempfile="$(mktemp --tmpdir $tfile.XXXXXX)"
13903 stack_trap "rm -f $tempfile"
13904 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
13905 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
13906 # some delay may occur during ChangeLog publishing and file read just
13907 # above, that could allow file write to happen finally
13908 [[ -s $tempfile ]] && echo "file should be empty"
13910 $LCTL set_param fail_loc=0
13913 [[ $? -eq 0 ]] || error "create failed"
13915 run_test 161d "create with concurrent .lustre/fid access"
13918 local expected="$1"
13923 path=$($LFS fid2path "$@")
13926 if [ $rc -ne 0 ]; then
13927 error "path looked up of '$expected' failed: rc=$rc"
13928 elif [ "$path" != "$expected" ]; then
13929 error "path looked up '$path' instead of '$expected'"
13931 echo "FID '$fid' resolves to path '$path' as expected"
13935 test_162a() { # was test_162
13936 test_mkdir -p -c1 $DIR/$tdir/d2
13937 touch $DIR/$tdir/d2/$tfile
13938 touch $DIR/$tdir/d2/x1
13939 touch $DIR/$tdir/d2/x2
13940 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
13941 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
13943 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
13944 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
13947 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
13948 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
13949 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
13951 # softlink to wrong file
13952 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
13953 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
13954 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
13957 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
13958 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
13959 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
13960 # fid2path dir/fsname should both work
13961 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
13962 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
13964 # hardlink count: check that there are 2 links
13965 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
13966 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
13968 # hardlink indexing: remove the first link
13969 rm $DIR/$tdir/d2/p/q/r/hlink
13970 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
13972 run_test 162a "path lookup sanity"
13975 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13976 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13979 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
13980 error "create striped dir failed"
13982 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
13983 tail -n 1 | awk '{print $2}')
13984 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
13986 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
13987 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
13990 for ((i=0;i<5;i++)); do
13991 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
13992 error "get fid for f$i failed"
13993 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
13995 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
13996 error "get fid for d$i failed"
13997 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
14002 run_test 162b "striped directory path lookup sanity"
14004 # LU-4239: Verify fid2path works with paths 100 or more directories deep
14006 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
14007 skip "Need MDS version at least 2.7.51"
14009 local lpath=$tdir.local
14010 local rpath=$tdir.remote
14012 test_mkdir $DIR/$lpath
14013 test_mkdir $DIR/$rpath
14015 for ((i = 0; i <= 101; i++)); do
14018 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
14019 error "get fid for local directory $DIR/$lpath failed"
14020 check_path "$DIR/$lpath" $MOUNT $FID --link 0
14023 test_mkdir $DIR/$rpath
14024 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
14025 error "get fid for remote directory $DIR/$rpath failed"
14026 check_path "$DIR/$rpath" $MOUNT $FID --link 0
14031 run_test 162c "fid2path works with paths 100 or more directories deep"
14034 # do directio so as not to populate the page cache
14035 log "creating a 10 Mb file"
14036 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
14037 log "starting reads"
14038 dd if=$DIR/$tfile of=/dev/null bs=4096 &
14039 log "truncating the file"
14040 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
14042 kill %+ || true # reads might have finished
14043 echo "wait until dd is finished"
14045 log "removing the temporary file"
14046 rm -rf $DIR/$tfile || error "tmp file removal failed"
14048 run_test 169 "parallel read and truncate should not deadlock"
14051 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14053 $LCTL clear # bug 18514
14054 $LCTL debug_daemon start $TMP/${tfile}_log_good
14056 $LCTL debug_daemon stop
14057 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
14058 error "sed failed to read log_good"
14060 $LCTL debug_daemon start $TMP/${tfile}_log_good
14062 $LCTL debug_daemon stop
14064 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
14065 error "lctl df log_bad failed"
14067 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14068 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14070 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
14071 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
14073 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
14074 error "bad_line good_line1 good_line2 are empty"
14076 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14077 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
14078 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14080 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
14081 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14082 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14084 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
14085 error "bad_line_new good_line_new are empty"
14087 local expected_good=$((good_line1 + good_line2*2))
14089 rm -f $TMP/${tfile}*
14090 # LU-231, short malformed line may not be counted into bad lines
14091 if [ $bad_line -ne $bad_line_new ] &&
14092 [ $bad_line -ne $((bad_line_new - 1)) ]; then
14093 error "expected $bad_line bad lines, but got $bad_line_new"
14097 if [ $expected_good -ne $good_line_new ]; then
14098 error "expected $expected_good good lines, but got $good_line_new"
14103 run_test 170 "test lctl df to handle corrupted log ====================="
14105 test_171() { # bug20592
14106 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14108 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
14109 $LCTL set_param fail_loc=0x50e
14110 $LCTL set_param fail_val=3000
14111 multiop_bg_pause $DIR/$tfile O_s || true
14113 kill -USR1 $MULTIPID
14117 if dmesg | grep "recursive fault"; then
14118 error "caught a recursive fault"
14120 $LCTL set_param fail_loc=0
14123 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
14125 # it would be good to share it with obdfilter-survey/iokit-libecho code
14126 setup_obdecho_osc () {
14129 local obdfilter_name=$2
14130 echo "Creating new osc for $obdfilter_name on $ost_nid"
14131 # make sure we can find loopback nid
14132 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
14134 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
14135 ${obdfilter_name}_osc_UUID || rc=2; }
14136 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
14137 ${obdfilter_name}_UUID $ost_nid || rc=3; }
14141 cleanup_obdecho_osc () {
14142 local obdfilter_name=$1
14143 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
14144 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
14151 local pages=${3:-64}
14156 local obd_size=$(get_obd_size $node $OBD)
14157 local page_size=$(get_page_size $node)
14158 if [[ -n "$obd_size" ]]; then
14159 local new_count=$((obd_size / (pages * page_size / 1024)))
14160 [[ $new_count -ge $count ]] || count=$new_count
14163 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
14164 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
14166 if [ $rc -eq 0 ]; then
14167 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
14168 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
14170 echo "New object id is $id"
14171 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
14173 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
14174 "test_brw $count w v $pages $id" || rc=4; }
14175 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
14177 [ $rc -eq 0 ] || [ $rc -gt 2 ] &&
14178 { do_facet $node "$LCTL --device ec cleanup" || rc=5; }
14179 [ $rc -eq 0 ] || [ $rc -gt 1 ] &&
14180 { do_facet $node "$LCTL --device ec detach" || rc=6; }
14181 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
14186 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14188 if ! module_loaded obdecho; then
14189 load_module obdecho/obdecho &&
14190 stack_trap "rmmod obdecho" EXIT ||
14191 error "unable to load obdecho on client"
14194 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
14195 local host=$($LCTL get_param -n osc.$osc.import |
14196 awk '/current_connection:/ { print $2 }' )
14197 local target=$($LCTL get_param -n osc.$osc.import |
14198 awk '/target:/ { print $2 }' )
14199 target=${target%_UUID}
14201 if [ -n "$target" ]; then
14202 setup_obdecho_osc $host $target &&
14203 stack_trap "cleanup_obdecho_osc $target" EXIT ||
14204 { error "obdecho setup failed with $?"; return; }
14206 obdecho_test ${target}_osc client ||
14207 error "obdecho_test failed on ${target}_osc"
14209 $LCTL get_param osc.$osc.import
14210 error "there is no osc.$osc.import target"
14213 run_test 180a "test obdecho on osc"
14216 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14217 remote_ost_nodsh && skip "remote OST with nodsh"
14219 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14220 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14221 error "failed to load module obdecho"
14223 local target=$(do_facet ost1 $LCTL dl |
14224 awk '/obdfilter/ { print $4; exit; }')
14226 if [ -n "$target" ]; then
14227 obdecho_test $target ost1 || error "obdecho_test failed with $?"
14229 do_facet ost1 $LCTL dl
14230 error "there is no obdfilter target on ost1"
14233 run_test 180b "test obdecho directly on obdfilter"
14235 test_180c() { # LU-2598
14236 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14237 remote_ost_nodsh && skip "remote OST with nodsh"
14238 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
14239 skip "Need MDS version at least 2.4.0"
14241 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14242 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14243 error "failed to load module obdecho"
14245 local target=$(do_facet ost1 $LCTL dl |
14246 awk '/obdfilter/ { print $4; exit; }')
14248 if [ -n "$target" ]; then
14249 local pages=16384 # 64MB bulk I/O RPC size
14251 obdecho_test "$target" ost1 "$pages" ||
14252 error "obdecho_test with pages=$pages failed with $?"
14254 do_facet ost1 $LCTL dl
14255 error "there is no obdfilter target on ost1"
14258 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
14260 test_181() { # bug 22177
14261 test_mkdir $DIR/$tdir
14262 # create enough files to index the directory
14263 createmany -o $DIR/$tdir/foobar 4000
14264 # print attributes for debug purpose
14267 multiop_bg_pause $DIR/$tdir D_Sc || return 1
14269 # remove the files & current working dir
14270 unlinkmany $DIR/$tdir/foobar 4000
14272 kill -USR1 $MULTIPID
14274 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
14277 run_test 181 "Test open-unlinked dir ========================"
14283 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14285 $LCTL set_param mdc.*.rpc_stats=clear
14287 for (( i = 0; i < $tcount; i++ )) ; do
14288 mkdir $DIR/$tdir/$i
14291 for (( i = 0; i < $tcount; i++ )) ; do
14292 createmany -o $DIR/$tdir/$i/f- $fcount &
14296 for (( i = 0; i < $tcount; i++ )) ; do
14297 unlinkmany $DIR/$tdir/$i/f- $fcount &
14301 $LCTL get_param mdc.*.rpc_stats
14305 run_test 182 "Test parallel modify metadata operations ================"
14307 test_183() { # LU-2275
14308 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14309 remote_mds_nodsh && skip "remote MDS with nodsh"
14310 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
14311 skip "Need MDS version at least 2.3.56"
14313 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14314 echo aaa > $DIR/$tdir/$tfile
14316 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
14317 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
14319 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
14320 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
14322 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
14324 # Flush negative dentry cache
14325 touch $DIR/$tdir/$tfile
14327 # We are not checking for any leaked references here, they'll
14328 # become evident next time we do cleanup with module unload.
14331 run_test 183 "No crash or request leak in case of strange dispositions ========"
14333 # test suite 184 is for LU-2016, LU-2017
14335 check_swap_layouts_support
14337 dir0=$DIR/$tdir/$testnum
14338 test_mkdir -p -c1 $dir0
14343 $LFS setstripe -c1 $file1
14345 $LFS setstripe -c2 $file2
14347 gen1=$($LFS getstripe -g $file1)
14348 gen2=$($LFS getstripe -g $file2)
14350 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
14351 gen=$($LFS getstripe -g $file1)
14352 [[ $gen1 != $gen ]] ||
14353 "Layout generation on $file1 does not change"
14354 gen=$($LFS getstripe -g $file2)
14355 [[ $gen2 != $gen ]] ||
14356 "Layout generation on $file2 does not change"
14358 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
14359 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
14361 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
14363 run_test 184a "Basic layout swap"
14366 check_swap_layouts_support
14368 dir0=$DIR/$tdir/$testnum
14369 mkdir -p $dir0 || error "creating dir $dir0"
14376 $LFS setstripe -c1 $file1
14377 $LFS setstripe -c2 $file2
14378 $LFS setstripe -c1 $file3
14379 chown $RUNAS_ID $file3
14380 gen1=$($LFS getstripe -g $file1)
14381 gen2=$($LFS getstripe -g $file2)
14383 $LFS swap_layouts $dir1 $dir2 &&
14384 error "swap of directories layouts should fail"
14385 $LFS swap_layouts $dir1 $file1 &&
14386 error "swap of directory and file layouts should fail"
14387 $RUNAS $LFS swap_layouts $file1 $file2 &&
14388 error "swap of file we cannot write should fail"
14389 $LFS swap_layouts $file1 $file3 &&
14390 error "swap of file with different owner should fail"
14391 /bin/true # to clear error code
14393 run_test 184b "Forbidden layout swap (will generate errors)"
14396 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14397 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14398 check_swap_layouts_support
14400 local dir0=$DIR/$tdir/$testnum
14401 mkdir -p $dir0 || error "creating dir $dir0"
14403 local ref1=$dir0/ref1
14404 local ref2=$dir0/ref2
14405 local file1=$dir0/file1
14406 local file2=$dir0/file2
14407 # create a file large enough for the concurrent test
14408 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14409 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14410 echo "ref file size: ref1($(stat -c %s $ref1))," \
14411 "ref2($(stat -c %s $ref2))"
14414 dd if=$ref1 of=$file1 bs=16k &
14417 # Make sure dd starts to copy file
14418 while [ ! -f $file1 ]; do sleep 0.1; done
14420 $LFS swap_layouts $file1 $file2
14423 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14424 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14426 # how many bytes copied before swapping layout
14427 local copied=$(stat -c %s $file2)
14428 local remaining=$(stat -c %s $ref1)
14429 remaining=$((remaining - copied))
14430 echo "Copied $copied bytes before swapping layout..."
14432 cmp -n $copied $file1 $ref2 | grep differ &&
14433 error "Content mismatch [0, $copied) of ref2 and file1"
14434 cmp -n $copied $file2 $ref1 ||
14435 error "Content mismatch [0, $copied) of ref1 and file2"
14436 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14437 error "Content mismatch [$copied, EOF) of ref1 and file1"
14440 rm -f $ref1 $ref2 $file1 $file2
14442 run_test 184c "Concurrent write and layout swap"
14445 check_swap_layouts_support
14446 [ -z "$(which getfattr 2>/dev/null)" ] &&
14447 skip_env "no getfattr command"
14449 local file1=$DIR/$tdir/$tfile-1
14450 local file2=$DIR/$tdir/$tfile-2
14451 local file3=$DIR/$tdir/$tfile-3
14455 mkdir -p $DIR/$tdir
14456 touch $file1 || error "create $file1 failed"
14457 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14458 error "create $file2 failed"
14459 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14460 error "create $file3 failed"
14461 lovea1=$(get_layout_param $file1)
14463 $LFS swap_layouts $file2 $file3 ||
14464 error "swap $file2 $file3 layouts failed"
14465 $LFS swap_layouts $file1 $file2 ||
14466 error "swap $file1 $file2 layouts failed"
14468 lovea2=$(get_layout_param $file2)
14471 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14473 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14474 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14476 run_test 184d "allow stripeless layouts swap"
14479 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14480 skip "Need MDS version at least 2.6.94"
14481 check_swap_layouts_support
14482 [ -z "$(which getfattr 2>/dev/null)" ] &&
14483 skip_env "no getfattr command"
14485 local file1=$DIR/$tdir/$tfile-1
14486 local file2=$DIR/$tdir/$tfile-2
14487 local file3=$DIR/$tdir/$tfile-3
14490 mkdir -p $DIR/$tdir
14491 touch $file1 || error "create $file1 failed"
14492 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14493 error "create $file2 failed"
14494 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14495 error "create $file3 failed"
14497 $LFS swap_layouts $file1 $file2 ||
14498 error "swap $file1 $file2 layouts failed"
14500 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14501 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14503 echo 123 > $file1 || error "Should be able to write into $file1"
14505 $LFS swap_layouts $file1 $file3 ||
14506 error "swap $file1 $file3 layouts failed"
14508 echo 123 > $file1 || error "Should be able to write into $file1"
14510 rm -rf $file1 $file2 $file3
14512 run_test 184e "Recreate layout after stripeless layout swaps"
14515 # Create a file with name longer than sizeof(struct stat) ==
14516 # 144 to see if we can get chars from the file name to appear
14517 # in the returned striping. Note that 'f' == 0x66.
14518 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
14520 mkdir -p $DIR/$tdir
14521 mcreate $DIR/$tdir/$file
14522 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
14523 error "IOC_MDC_GETFILEINFO returned garbage striping"
14526 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
14528 test_185() { # LU-2441
14529 # LU-3553 - no volatile file support in old servers
14530 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
14531 skip "Need MDS version at least 2.3.60"
14533 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14534 touch $DIR/$tdir/spoo
14535 local mtime1=$(stat -c "%Y" $DIR/$tdir)
14536 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
14537 error "cannot create/write a volatile file"
14538 [ "$FILESET" == "" ] &&
14539 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
14540 error "FID is still valid after close"
14542 multiop_bg_pause $DIR/$tdir vVw4096_c
14549 # assume that the next FID for this client is sequential, since stdout
14550 # is unfortunately eaten by multiop_bg_pause
14551 local n=$((${fidv[1]} + 1))
14552 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
14553 if [ "$FILESET" == "" ]; then
14554 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
14555 error "FID is missing before close"
14557 kill -USR1 $multi_pid
14558 # 1 second delay, so if mtime change we will see it
14560 local mtime2=$(stat -c "%Y" $DIR/$tdir)
14561 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
14563 run_test 185 "Volatile file support"
14565 function create_check_volatile() {
14569 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
14572 local FID=$(cat /tmp/${tfile}.fid)
14573 [ "$FID" == "" ] && error "can't get FID for volatile"
14574 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
14575 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
14576 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
14580 cancel_lru_locks mdc # flush opencache
14581 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
14586 # LU-12516 - volatile creation via .lustre
14587 [[ $MDS1_VERSION -ge $(version_code 2.12.55) ]] ||
14588 skip "Need MDS version at least 2.3.55"
14590 create_check_volatile 0
14591 [ $MDSCOUNT -lt 2 ] && return 0
14594 create_check_volatile 1
14598 run_test 185a "Volatile file creation in .lustre/fid/"
14601 remote_mds_nodsh && skip "remote MDS with nodsh"
14602 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14603 skip "Need MDS version at least 2.3.0"
14605 local dir0=$DIR/$tdir/$testnum
14606 mkdir -p $dir0 || error "creating dir $dir0"
14608 local file=$dir0/file1
14609 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
14610 local dv1=$($LFS data_version $file)
14611 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
14612 local dv2=$($LFS data_version $file)
14613 [[ $dv1 != $dv2 ]] ||
14614 error "data version did not change on write $dv1 == $dv2"
14619 run_test 187a "Test data version change"
14622 remote_mds_nodsh && skip "remote MDS with nodsh"
14623 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14624 skip "Need MDS version at least 2.3.0"
14626 local dir0=$DIR/$tdir/$testnum
14627 mkdir -p $dir0 || error "creating dir $dir0"
14629 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
14630 [[ ${DV[0]} != ${DV[1]} ]] ||
14631 error "data version did not change on write"\
14632 " ${DV[0]} == ${DV[1]}"
14637 run_test 187b "Test data version change on volatile file"
14640 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14641 remote_mgs_nodsh && skip "remote MGS with nodsh"
14642 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
14644 local POOL=${POOL:-cea1}
14645 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
14646 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
14649 local last_ost=$(($OSTCOUNT - 1))
14651 local ost_list=$(seq $first_ost $ost_step $last_ost)
14652 local ost_range="$first_ost $last_ost $ost_step"
14653 local test_path=$POOL_ROOT/$POOL_DIR_NAME
14654 local file_dir=$POOL_ROOT/file_tst
14655 local subdir=$test_path/subdir
14658 if ! combined_mgs_mds ; then
14663 # former test_200a test_200b
14664 pool_add $POOL || { rc=$? ; break; }
14665 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
14666 # former test_200c test_200d
14667 mkdir -p $test_path
14668 pool_set_dir $POOL $test_path || { rc=$? ; break; }
14669 pool_check_dir $POOL $test_path || { rc=$? ; break; }
14671 pool_check_dir $POOL $subdir || { rc=$? ; break; }
14672 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
14673 || { rc=$? ; break; }
14674 # former test_200e test_200f
14675 local files=$((OSTCOUNT*3))
14676 pool_alloc_files $POOL $test_path $files "$ost_list" \
14677 || { rc=$? ; break; }
14678 pool_create_files $POOL $file_dir $files "$ost_list" \
14679 || { rc=$? ; break; }
14680 # former test_200g test_200h
14681 pool_lfs_df $POOL || { rc=$? ; break; }
14682 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
14684 # former test_201a test_201b test_201c
14685 pool_remove_first_target $POOL || { rc=$? ; break; }
14687 local f=$test_path/$tfile
14688 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
14689 pool_remove $POOL $f || { rc=$? ; break; }
14695 if ! combined_mgs_mds ; then
14700 run_test 200 "OST pools"
14702 # usage: default_attr <count | size | offset>
14704 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
14707 # usage: check_default_stripe_attr
14708 check_default_stripe_attr() {
14709 ACTUAL=$($LFS getstripe $* $DIR/$tdir)
14712 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
14714 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
14718 error "unknown getstripe attr '$1'"
14721 [ $ACTUAL == $EXPECTED ] ||
14722 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
14726 test_mkdir $DIR/$tdir
14727 $LFS setstripe --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
14729 check_default_stripe_attr --stripe-count
14730 check_default_stripe_attr --stripe-size
14731 check_default_stripe_attr --stripe-index
14733 run_test 204a "Print default stripe attributes"
14736 test_mkdir $DIR/$tdir
14737 $LFS setstripe --stripe-count 1 $DIR/$tdir
14739 check_default_stripe_attr --stripe-size
14740 check_default_stripe_attr --stripe-index
14742 run_test 204b "Print default stripe size and offset"
14745 test_mkdir $DIR/$tdir
14746 $LFS setstripe --stripe-size 65536 $DIR/$tdir
14748 check_default_stripe_attr --stripe-count
14749 check_default_stripe_attr --stripe-index
14751 run_test 204c "Print default stripe count and offset"
14754 test_mkdir $DIR/$tdir
14755 $LFS setstripe --stripe-index 0 $DIR/$tdir
14757 check_default_stripe_attr --stripe-count
14758 check_default_stripe_attr --stripe-size
14760 run_test 204d "Print default stripe count and size"
14763 test_mkdir $DIR/$tdir
14764 $LFS setstripe -d $DIR/$tdir
14766 check_default_stripe_attr --stripe-count --raw
14767 check_default_stripe_attr --stripe-size --raw
14768 check_default_stripe_attr --stripe-index --raw
14770 run_test 204e "Print raw stripe attributes"
14773 test_mkdir $DIR/$tdir
14774 $LFS setstripe --stripe-count 1 $DIR/$tdir
14776 check_default_stripe_attr --stripe-size --raw
14777 check_default_stripe_attr --stripe-index --raw
14779 run_test 204f "Print raw stripe size and offset"
14782 test_mkdir $DIR/$tdir
14783 $LFS setstripe --stripe-size 65536 $DIR/$tdir
14785 check_default_stripe_attr --stripe-count --raw
14786 check_default_stripe_attr --stripe-index --raw
14788 run_test 204g "Print raw stripe count and offset"
14791 test_mkdir $DIR/$tdir
14792 $LFS setstripe --stripe-index 0 $DIR/$tdir
14794 check_default_stripe_attr --stripe-count --raw
14795 check_default_stripe_attr --stripe-size --raw
14797 run_test 204h "Print raw stripe count and size"
14799 # Figure out which job scheduler is being used, if any,
14800 # or use a fake one
14801 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
14802 JOBENV=SLURM_JOB_ID
14803 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
14805 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
14807 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
14808 JOBENV=LOADL_STEP_ID
14809 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
14812 $LCTL list_param jobid_name > /dev/null 2>&1
14813 if [ $? -eq 0 ]; then
14819 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
14821 verify_jobstats() {
14826 # we don't really need to clear the stats for this test to work, since each
14827 # command has a unique jobid, but it makes debugging easier if needed.
14828 # for facet in $facets; do
14829 # local dev=$(convert_facet2label $facet)
14830 # # clear old jobstats
14831 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
14834 # use a new JobID for each test, or we might see an old one
14835 [ "$JOBENV" = "FAKE_JOBID" ] &&
14836 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
14838 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
14840 [ "$JOBENV" = "nodelocal" ] && {
14841 FAKE_JOBID=id.$testnum.%e.$RANDOM
14842 $LCTL set_param jobid_name=$FAKE_JOBID
14843 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
14846 log "Test: ${cmd[*]}"
14847 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
14849 if [ $JOBENV = "FAKE_JOBID" ]; then
14850 FAKE_JOBID=$JOBVAL ${cmd[*]}
14855 # all files are created on OST0000
14856 for facet in $facets; do
14857 local stats="*.$(convert_facet2label $facet).job_stats"
14859 # strip out libtool wrappers for in-tree executables
14860 if [ $(do_facet $facet lctl get_param $stats |
14861 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
14862 do_facet $facet lctl get_param $stats
14863 error "No jobstats for $JOBVAL found on $facet::$stats"
14869 local new_jobenv=$1
14871 set_persistent_param_and_check client "jobid_var" \
14872 "$FSNAME.sys.jobid_var" $new_jobenv
14875 test_205() { # Job stats
14876 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14877 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
14878 skip "Need MDS version with at least 2.7.1"
14879 remote_mgs_nodsh && skip "remote MGS with nodsh"
14880 remote_mds_nodsh && skip "remote MDS with nodsh"
14881 remote_ost_nodsh && skip "remote OST with nodsh"
14882 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
14883 skip "Server doesn't support jobstats"
14884 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
14886 local old_jobenv=$($LCTL get_param -n jobid_var)
14887 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
14889 if [[ $PERM_CMD == *"set_param -P"* ]]; then
14890 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
14892 stack_trap "do_facet mgs $PERM_CMD \
14893 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
14897 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
14898 mdt.*.job_cleanup_interval | head -n 1)
14899 local new_interval=5
14900 do_facet $SINGLEMDS \
14901 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
14902 stack_trap "do_facet $SINGLEMDS \
14903 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
14904 local start=$SECONDS
14908 cmd="mkdir $DIR/$tdir"
14909 verify_jobstats "$cmd" "$SINGLEMDS"
14911 cmd="rmdir $DIR/$tdir"
14912 verify_jobstats "$cmd" "$SINGLEMDS"
14913 # mkdir on secondary MDT
14914 if [ $MDSCOUNT -gt 1 ]; then
14915 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
14916 verify_jobstats "$cmd" "mds2"
14919 cmd="mknod $DIR/$tfile c 1 3"
14920 verify_jobstats "$cmd" "$SINGLEMDS"
14922 cmd="rm -f $DIR/$tfile"
14923 verify_jobstats "$cmd" "$SINGLEMDS"
14924 # create all files on OST0000 so verify_jobstats can find OST stats
14926 cmd="$LFS setstripe -i 0 -c 1 $DIR/$tfile"
14927 verify_jobstats "$cmd" "$SINGLEMDS"
14929 cmd="touch $DIR/$tfile"
14930 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14932 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
14933 verify_jobstats "$cmd" "ost1"
14935 cancel_lru_locks osc
14936 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
14937 verify_jobstats "$cmd" "ost1"
14939 cmd="$TRUNCATE $DIR/$tfile 0"
14940 verify_jobstats "$cmd" "$SINGLEMDS ost1"
14942 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
14943 verify_jobstats "$cmd" "$SINGLEMDS"
14944 # jobstats expiry - sleep until old stats should be expired
14945 local left=$((new_interval + 5 - (SECONDS - start)))
14946 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
14947 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
14949 cmd="mkdir $DIR/$tdir.expire"
14950 verify_jobstats "$cmd" "$SINGLEMDS"
14951 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
14952 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
14954 # Ensure that jobid are present in changelog (if supported by MDS)
14955 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
14956 changelog_dump | tail -10
14957 jobids=$(changelog_dump | tail -9 | grep -c "j=")
14958 [ $jobids -eq 9 ] ||
14959 error "Wrong changelog jobid count $jobids != 9"
14963 jobstats_set $JOBENV
14965 changelog_dump | grep $tfile
14966 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
14967 [ $jobids -eq 0 ] ||
14968 error "Unexpected jobids when jobid_var=$JOBENV"
14971 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
14972 JOBENV="JOBCOMPLEX"
14973 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
14975 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
14977 run_test 205 "Verify job stats"
14979 # LU-1480, LU-1773 and LU-1657
14981 mkdir -p $DIR/$tdir
14982 $LFS setstripe -c -1 $DIR/$tdir
14983 #define OBD_FAIL_LOV_INIT 0x1403
14984 $LCTL set_param fail_loc=0xa0001403
14985 $LCTL set_param fail_val=1
14986 touch $DIR/$tdir/$tfile || true
14988 run_test 206 "fail lov_init_raid0() doesn't lbug"
14991 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
14992 local fsz=`stat -c %s $DIR/$tfile`
14993 cancel_lru_locks mdc
14995 # do not return layout in getattr intent
14996 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
14997 $LCTL set_param fail_loc=0x170
14998 local sz=`stat -c %s $DIR/$tfile`
15000 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
15004 run_test 207a "can refresh layout at glimpse"
15007 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15008 local cksum=`md5sum $DIR/$tfile`
15009 local fsz=`stat -c %s $DIR/$tfile`
15010 cancel_lru_locks mdc
15011 cancel_lru_locks osc
15013 # do not return layout in getattr intent
15014 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
15015 $LCTL set_param fail_loc=0x171
15017 # it will refresh layout after the file is opened but before read issues
15018 echo checksum is "$cksum"
15019 echo "$cksum" |md5sum -c --quiet || error "file differs"
15023 run_test 207b "can refresh layout at open"
15026 # FIXME: in this test suite, only RD lease is used. This is okay
15027 # for now as only exclusive open is supported. After generic lease
15028 # is done, this test suite should be revised. - Jinshan
15030 remote_mds_nodsh && skip "remote MDS with nodsh"
15031 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
15032 skip "Need MDS version at least 2.4.52"
15034 echo "==== test 1: verify get lease work"
15035 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
15037 echo "==== test 2: verify lease can be broken by upcoming open"
15038 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15042 $MULTIOP $DIR/$tfile oO_RDONLY:c
15043 kill -USR1 $PID && wait $PID || error "break lease error"
15045 echo "==== test 3: verify lease can't be granted if an open already exists"
15046 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
15050 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
15051 kill -USR1 $PID && wait $PID || error "open file error"
15053 echo "==== test 4: lease can sustain over recovery"
15054 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
15060 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
15062 echo "==== test 5: lease broken can't be regained by replay"
15063 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15067 # open file to break lease and then recovery
15068 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
15071 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
15075 run_test 208 "Exclusive open"
15078 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
15079 skip_env "must have disp_stripe"
15082 sync; sleep 5; sync;
15084 echo 3 > /proc/sys/vm/drop_caches
15085 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15087 # open/close 500 times
15088 for i in $(seq 500); do
15092 echo 3 > /proc/sys/vm/drop_caches
15093 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15095 echo "before: $req_before, after: $req_after"
15096 [ $((req_after - req_before)) -ge 300 ] &&
15097 error "open/close requests are not freed"
15100 run_test 209 "read-only open/close requests should be freed promptly"
15104 size=$((size % 8192 + 1))
15105 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
15106 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
15107 rm -f $DIR/f212 $DIR/f212.xyz
15109 run_test 212 "Sendfile test ============================================"
15112 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
15113 cancel_lru_locks osc
15114 lctl set_param fail_loc=0x8000040f
15115 # generate a read lock
15116 cat $DIR/$tfile > /dev/null
15117 # write to the file, it will try to cancel the above read lock.
15118 cat /etc/hosts >> $DIR/$tfile
15120 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
15122 test_214() { # for bug 20133
15123 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
15124 for (( i=0; i < 340; i++ )) ; do
15125 touch $DIR/$tdir/d214c/a$i
15128 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
15129 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
15130 ls $DIR/d214c || error "ls $DIR/d214c failed"
15131 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
15132 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
15134 run_test 214 "hash-indexed directory test - bug 20133"
15136 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
15137 create_lnet_proc_files() {
15138 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
15141 # counterpart of create_lnet_proc_files
15142 remove_lnet_proc_files() {
15143 rm -f $TMP/lnet_$1.sys
15146 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15147 # 3rd arg as regexp for body
15148 check_lnet_proc_stats() {
15149 local l=$(cat "$TMP/lnet_$1" |wc -l)
15150 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
15152 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
15155 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15156 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
15157 # optional and can be regexp for 2nd line (lnet.routes case)
15158 check_lnet_proc_entry() {
15159 local blp=2 # blp stands for 'position of 1st line of body'
15160 [ -z "$5" ] || blp=3 # lnet.routes case
15162 local l=$(cat "$TMP/lnet_$1" |wc -l)
15163 # subtracting one from $blp because the body can be empty
15164 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
15166 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
15167 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
15169 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
15170 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
15172 # bail out if any unexpected line happened
15173 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
15174 [ "$?" != 0 ] || error "$2 misformatted"
15177 test_215() { # for bugs 18102, 21079, 21517
15178 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15180 local N='(0|[1-9][0-9]*)' # non-negative numeric
15181 local P='[1-9][0-9]*' # positive numeric
15182 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
15183 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
15184 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
15185 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
15187 local L1 # regexp for 1st line
15188 local L2 # regexp for 2nd line (optional)
15189 local BR # regexp for the rest (body)
15191 # lnet.stats should look as 11 space-separated non-negative numerics
15192 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
15193 create_lnet_proc_files "stats"
15194 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
15195 remove_lnet_proc_files "stats"
15197 # lnet.routes should look like this:
15198 # Routing disabled/enabled
15199 # net hops priority state router
15200 # where net is a string like tcp0, hops > 0, priority >= 0,
15201 # state is up/down,
15202 # router is a string like 192.168.1.1@tcp2
15203 L1="^Routing (disabled|enabled)$"
15204 L2="^net +hops +priority +state +router$"
15205 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
15206 create_lnet_proc_files "routes"
15207 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
15208 remove_lnet_proc_files "routes"
15210 # lnet.routers should look like this:
15211 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
15212 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
15213 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
15214 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
15215 L1="^ref +rtr_ref +alive +router$"
15216 BR="^$P +$P +(up|down) +$NID$"
15217 create_lnet_proc_files "routers"
15218 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
15219 remove_lnet_proc_files "routers"
15221 # lnet.peers should look like this:
15222 # nid refs state last max rtr min tx min queue
15223 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
15224 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
15225 # numeric (0 or >0 or <0), queue >= 0.
15226 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
15227 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
15228 create_lnet_proc_files "peers"
15229 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
15230 remove_lnet_proc_files "peers"
15232 # lnet.buffers should look like this:
15233 # pages count credits min
15234 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
15235 L1="^pages +count +credits +min$"
15236 BR="^ +$N +$N +$I +$I$"
15237 create_lnet_proc_files "buffers"
15238 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
15239 remove_lnet_proc_files "buffers"
15241 # lnet.nis should look like this:
15242 # nid status alive refs peer rtr max tx min
15243 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
15244 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
15245 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
15246 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
15247 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
15248 create_lnet_proc_files "nis"
15249 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
15250 remove_lnet_proc_files "nis"
15252 # can we successfully write to lnet.stats?
15253 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
15255 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
15257 test_216() { # bug 20317
15258 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15259 remote_ost_nodsh && skip "remote OST with nodsh"
15262 local facets=$(get_facets OST)
15263 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15265 save_lustre_params client "osc.*.contention_seconds" > $p
15266 save_lustre_params $facets \
15267 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
15268 save_lustre_params $facets \
15269 "ldlm.namespaces.filter-*.contended_locks" >> $p
15270 save_lustre_params $facets \
15271 "ldlm.namespaces.filter-*.contention_seconds" >> $p
15272 clear_stats osc.*.osc_stats
15274 # agressive lockless i/o settings
15275 do_nodes $(comma_list $(osts_nodes)) \
15276 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
15277 ldlm.namespaces.filter-*.contended_locks=0 \
15278 ldlm.namespaces.filter-*.contention_seconds=60"
15279 lctl set_param -n osc.*.contention_seconds=60
15281 $DIRECTIO write $DIR/$tfile 0 10 4096
15282 $CHECKSTAT -s 40960 $DIR/$tfile
15284 # disable lockless i/o
15285 do_nodes $(comma_list $(osts_nodes)) \
15286 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
15287 ldlm.namespaces.filter-*.contended_locks=32 \
15288 ldlm.namespaces.filter-*.contention_seconds=0"
15289 lctl set_param -n osc.*.contention_seconds=0
15290 clear_stats osc.*.osc_stats
15292 dd if=/dev/zero of=$DIR/$tfile count=0
15293 $CHECKSTAT -s 0 $DIR/$tfile
15295 restore_lustre_params <$p
15299 run_test 216 "check lockless direct write updates file size and kms correctly"
15301 test_217() { # bug 22430
15302 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15307 for node in $(nodes_list); do
15308 nid=$(host_nids_address $node $NETTYPE)
15309 if [[ $nid = *-* ]] ; then
15310 echo "lctl ping $(h2nettype $nid)"
15311 lctl ping $(h2nettype $nid)
15313 echo "skipping $node (no hyphen detected)"
15317 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
15320 # do directio so as not to populate the page cache
15321 log "creating a 10 Mb file"
15322 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
15323 log "starting reads"
15324 dd if=$DIR/$tfile of=/dev/null bs=4096 &
15325 log "truncating the file"
15326 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
15328 kill %+ || true # reads might have finished
15329 echo "wait until dd is finished"
15331 log "removing the temporary file"
15332 rm -rf $DIR/$tfile || error "tmp file removal failed"
15334 run_test 218 "parallel read and truncate should not deadlock"
15337 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15339 # write one partial page
15340 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
15341 # set no grant so vvp_io_commit_write will do sync write
15342 $LCTL set_param fail_loc=0x411
15343 # write a full page at the end of file
15344 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
15346 $LCTL set_param fail_loc=0
15347 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
15348 $LCTL set_param fail_loc=0x411
15349 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
15352 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
15353 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
15355 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
15357 test_220() { #LU-325
15358 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15359 remote_ost_nodsh && skip "remote OST with nodsh"
15360 remote_mds_nodsh && skip "remote MDS with nodsh"
15361 remote_mgs_nodsh && skip "remote MGS with nodsh"
15365 # create on MDT0000 so the last_id and next_id are correct
15367 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
15371 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
15372 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
15373 osp.$mdtosc_proc1.prealloc_last_id)
15374 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15375 osp.$mdtosc_proc1.prealloc_next_id)
15379 if ! combined_mgs_mds ; then
15383 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15384 #define OBD_FAIL_OST_ENOINO 0x229
15385 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15386 create_pool $FSNAME.$TESTNAME || return 1
15387 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15389 $LFS setstripe $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15391 MDSOBJS=$((last_id - next_id))
15392 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15394 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15395 echo "OST still has $count kbytes free"
15397 echo "create $MDSOBJS files @next_id..."
15398 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15400 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15401 osp.$mdtosc_proc1.prealloc_last_id)
15402 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15403 osp.$mdtosc_proc1.prealloc_next_id)
15405 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15410 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15411 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15413 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15414 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15415 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15416 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15417 echo "unlink $MDSOBJS files @$next_id..."
15418 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15420 if ! combined_mgs_mds ; then
15424 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15427 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15429 dd if=`which date` of=$MOUNT/date oflag=sync
15430 chmod +x $MOUNT/date
15432 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15433 $LCTL set_param fail_loc=0x80001401
15435 $MOUNT/date > /dev/null
15438 run_test 221 "make sure fault and truncate race to not cause OOM"
15441 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15444 test_mkdir $DIR/$tdir
15445 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15446 createmany -o $DIR/$tdir/$tfile 10
15447 cancel_lru_locks mdc
15448 cancel_lru_locks osc
15449 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15450 $LCTL set_param fail_loc=0x31a
15451 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15452 $LCTL set_param fail_loc=0
15455 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15458 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15461 test_mkdir $DIR/$tdir
15462 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15463 createmany -o $DIR/$tdir/$tfile 10
15464 cancel_lru_locks mdc
15465 cancel_lru_locks osc
15466 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15467 $LCTL set_param fail_loc=0x31a
15468 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15469 $LCTL set_param fail_loc=0
15471 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15474 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15477 test_mkdir $DIR/$tdir
15478 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15479 createmany -o $DIR/$tdir/$tfile 10
15480 cancel_lru_locks mdc
15481 cancel_lru_locks osc
15482 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15483 $LCTL set_param fail_loc=0x31b
15484 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15485 $LCTL set_param fail_loc=0
15488 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15490 test_224a() { # LU-1039, MRP-303
15491 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15493 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15494 $LCTL set_param fail_loc=0x508
15495 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15496 $LCTL set_param fail_loc=0
15499 run_test 224a "Don't panic on bulk IO failure"
15501 test_224b() { # LU-1039, MRP-303
15502 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15504 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15505 cancel_lru_locks osc
15506 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15507 $LCTL set_param fail_loc=0x515
15508 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15509 $LCTL set_param fail_loc=0
15512 run_test 224b "Don't panic on bulk IO failure"
15514 test_224c() { # LU-6441
15515 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15516 remote_mds_nodsh && skip "remote MDS with nodsh"
15518 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15519 save_writethrough $p
15520 set_cache writethrough on
15522 local pages_per_rpc=$($LCTL get_param \
15523 osc.*.max_pages_per_rpc)
15524 local at_max=$($LCTL get_param -n at_max)
15525 local timeout=$($LCTL get_param -n timeout)
15526 local test_at="at_max"
15527 local param_at="$FSNAME.sys.at_max"
15528 local test_timeout="timeout"
15529 local param_timeout="$FSNAME.sys.timeout"
15531 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
15533 set_persistent_param_and_check client "$test_at" "$param_at" 0
15534 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
15536 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
15537 do_facet ost1 "$LCTL set_param fail_loc=0x520"
15538 $LFS setstripe -c 1 -i 0 $DIR/$tfile
15539 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
15541 do_facet ost1 "$LCTL set_param fail_loc=0"
15543 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
15544 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
15547 $LCTL set_param -n $pages_per_rpc
15548 restore_lustre_params < $p
15551 run_test 224c "Don't hang if one of md lost during large bulk RPC"
15553 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
15555 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15556 if [ -z ${MDSSURVEY} ]; then
15557 skip_env "mds-survey not found"
15559 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15560 skip "Need MDS version at least 2.2.51"
15562 local mds=$(facet_host $SINGLEMDS)
15563 local target=$(do_nodes $mds 'lctl dl' |
15564 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15566 local cmd1="file_count=1000 thrhi=4"
15567 local cmd2="dir_count=2 layer=mdd stripe_count=0"
15568 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15569 local cmd="$cmd1 $cmd2 $cmd3"
15571 rm -f ${TMP}/mds_survey*
15573 eval $cmd || error "mds-survey with zero-stripe failed"
15574 cat ${TMP}/mds_survey*
15575 rm -f ${TMP}/mds_survey*
15577 run_test 225a "Metadata survey sanity with zero-stripe"
15580 if [ -z ${MDSSURVEY} ]; then
15581 skip_env "mds-survey not found"
15583 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15584 skip "Need MDS version at least 2.2.51"
15585 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15586 remote_mds_nodsh && skip "remote MDS with nodsh"
15587 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
15588 skip_env "Need to mount OST to test"
15591 local mds=$(facet_host $SINGLEMDS)
15592 local target=$(do_nodes $mds 'lctl dl' |
15593 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15595 local cmd1="file_count=1000 thrhi=4"
15596 local cmd2="dir_count=2 layer=mdd stripe_count=1"
15597 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15598 local cmd="$cmd1 $cmd2 $cmd3"
15600 rm -f ${TMP}/mds_survey*
15602 eval $cmd || error "mds-survey with stripe_count failed"
15603 cat ${TMP}/mds_survey*
15604 rm -f ${TMP}/mds_survey*
15606 run_test 225b "Metadata survey sanity with stripe_count = 1"
15608 mcreate_path2fid () {
15614 local path=$DIR/$tdir/$name
15619 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
15620 error "cannot create $desc"
15622 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
15624 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
15626 fid_path=$($LFS fid2path $MOUNT $fid)
15628 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
15630 [ "$path" == "$fid_path" ] ||
15631 error "fid2path returned $fid_path, expected $path"
15633 echo "pass with $path and $fid"
15638 mkdir -p $DIR/$tdir
15640 mcreate_path2fid 0010666 0 0 fifo "FIFO"
15641 mcreate_path2fid 0020666 1 3 null "character special file (null)"
15642 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
15643 mcreate_path2fid 0040666 0 0 dir "directory"
15644 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
15645 mcreate_path2fid 0100666 0 0 file "regular file"
15646 mcreate_path2fid 0120666 0 0 link "symbolic link"
15647 mcreate_path2fid 0140666 0 0 sock "socket"
15649 run_test 226a "call path2fid and fid2path on files of all type"
15652 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15657 mkdir -p $DIR/$tdir
15658 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
15659 error "create remote directory failed"
15660 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
15661 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
15662 "character special file (null)"
15663 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
15664 "character special file (no device)"
15665 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
15666 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
15667 "block special file (loop)"
15668 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
15669 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
15670 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
15672 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
15674 # LU-1299 Executing or running ldd on a truncated executable does not
15675 # cause an out-of-memory condition.
15677 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15678 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
15680 dd if=$(which date) of=$MOUNT/date bs=1k count=1
15681 chmod +x $MOUNT/date
15683 $MOUNT/date > /dev/null
15684 ldd $MOUNT/date > /dev/null
15687 run_test 227 "running truncated executable does not cause OOM"
15689 # LU-1512 try to reuse idle OI blocks
15691 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15692 remote_mds_nodsh && skip "remote MDS with nodsh"
15693 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15695 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15696 local myDIR=$DIR/$tdir
15699 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15700 $LCTL set_param fail_loc=0x80001002
15701 createmany -o $myDIR/t- 10000
15702 $LCTL set_param fail_loc=0
15703 # The guard is current the largest FID holder
15705 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15707 local IDX=$(($SEQ % 64))
15709 do_facet $SINGLEMDS sync
15710 # Make sure journal flushed.
15712 local blk1=$(do_facet $SINGLEMDS \
15713 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15714 grep Blockcount | awk '{print $4}')
15716 # Remove old files, some OI blocks will become idle.
15717 unlinkmany $myDIR/t- 10000
15718 # Create new files, idle OI blocks should be reused.
15719 createmany -o $myDIR/t- 2000
15720 do_facet $SINGLEMDS sync
15721 # Make sure journal flushed.
15723 local blk2=$(do_facet $SINGLEMDS \
15724 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15725 grep Blockcount | awk '{print $4}')
15727 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15729 run_test 228a "try to reuse idle OI blocks"
15732 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15733 remote_mds_nodsh && skip "remote MDS with nodsh"
15734 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15736 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15737 local myDIR=$DIR/$tdir
15740 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15741 $LCTL set_param fail_loc=0x80001002
15742 createmany -o $myDIR/t- 10000
15743 $LCTL set_param fail_loc=0
15744 # The guard is current the largest FID holder
15746 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15748 local IDX=$(($SEQ % 64))
15750 do_facet $SINGLEMDS sync
15751 # Make sure journal flushed.
15753 local blk1=$(do_facet $SINGLEMDS \
15754 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15755 grep Blockcount | awk '{print $4}')
15757 # Remove old files, some OI blocks will become idle.
15758 unlinkmany $myDIR/t- 10000
15761 stop $SINGLEMDS || error "Fail to stop MDT."
15763 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
15765 df $MOUNT || error "Fail to df."
15766 # Create new files, idle OI blocks should be reused.
15767 createmany -o $myDIR/t- 2000
15768 do_facet $SINGLEMDS sync
15769 # Make sure journal flushed.
15771 local blk2=$(do_facet $SINGLEMDS \
15772 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15773 grep Blockcount | awk '{print $4}')
15775 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15777 run_test 228b "idle OI blocks can be reused after MDT restart"
15781 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15782 remote_mds_nodsh && skip "remote MDS with nodsh"
15783 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15785 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15786 local myDIR=$DIR/$tdir
15789 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15790 $LCTL set_param fail_loc=0x80001002
15791 # 20000 files can guarantee there are index nodes in the OI file
15792 createmany -o $myDIR/t- 20000
15793 $LCTL set_param fail_loc=0
15794 # The guard is current the largest FID holder
15796 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15798 local IDX=$(($SEQ % 64))
15800 do_facet $SINGLEMDS sync
15801 # Make sure journal flushed.
15803 local blk1=$(do_facet $SINGLEMDS \
15804 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15805 grep Blockcount | awk '{print $4}')
15807 # Remove old files, some OI blocks will become idle.
15808 unlinkmany $myDIR/t- 20000
15810 # The OI file should become empty now
15812 # Create new files, idle OI blocks should be reused.
15813 createmany -o $myDIR/t- 2000
15814 do_facet $SINGLEMDS sync
15815 # Make sure journal flushed.
15817 local blk2=$(do_facet $SINGLEMDS \
15818 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15819 grep Blockcount | awk '{print $4}')
15821 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15823 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
15825 test_229() { # LU-2482, LU-3448
15826 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15827 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
15828 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
15829 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
15833 # Create a file with a released layout and stripe count 2.
15834 $MULTIOP $DIR/$tfile H2c ||
15835 error "failed to create file with released layout"
15837 $LFS getstripe -v $DIR/$tfile
15839 local pattern=$($LFS getstripe -L $DIR/$tfile)
15840 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
15842 local stripe_count=$($LFS getstripe -c $DIR/$tfile) ||
15844 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
15845 stat $DIR/$tfile || error "failed to stat released file"
15847 chown $RUNAS_ID $DIR/$tfile ||
15848 error "chown $RUNAS_ID $DIR/$tfile failed"
15850 chgrp $RUNAS_ID $DIR/$tfile ||
15851 error "chgrp $RUNAS_ID $DIR/$tfile failed"
15853 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
15854 rm $DIR/$tfile || error "failed to remove released file"
15856 run_test 229 "getstripe/stat/rm/attr changes work on released files"
15859 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15860 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15861 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15862 skip "Need MDS version at least 2.11.52"
15866 test_mkdir $DIR/$tdir
15867 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
15868 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
15869 [ $mdt_idx -ne 0 ] &&
15870 error "create local directory on wrong MDT $mdt_idx"
15872 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
15873 error "create remote directory failed"
15874 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
15875 [ $mdt_idx -ne $MDTIDX ] &&
15876 error "create remote directory on wrong MDT $mdt_idx"
15878 createmany -o $DIR/$tdir/test_230/t- 10 ||
15879 error "create files on remote directory failed"
15880 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
15881 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
15882 rm -r $DIR/$tdir || error "unlink remote directory failed"
15884 run_test 230a "Create remote directory and files under the remote directory"
15887 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15888 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15889 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15890 skip "Need MDS version at least 2.11.52"
15898 local migrate_dir=$DIR/$tdir/migrate_dir
15899 local other_dir=$DIR/$tdir/other_dir
15901 test_mkdir $DIR/$tdir
15902 test_mkdir -i0 -c1 $migrate_dir
15903 test_mkdir -i0 -c1 $other_dir
15904 for ((i=0; i<10; i++)); do
15905 mkdir -p $migrate_dir/dir_${i}
15906 createmany -o $migrate_dir/dir_${i}/f 10 ||
15907 error "create files under remote dir failed $i"
15910 cp /etc/passwd $migrate_dir/$tfile
15911 cp /etc/passwd $other_dir/$tfile
15912 chattr +SAD $migrate_dir
15913 chattr +SAD $migrate_dir/$tfile
15915 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15916 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15917 local old_dir_mode=$(stat -c%f $migrate_dir)
15918 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
15920 mkdir -p $migrate_dir/dir_default_stripe2
15921 $LFS setstripe -c 2 $migrate_dir/dir_default_stripe2
15922 $LFS setstripe -c 2 $migrate_dir/${tfile}_stripe2
15924 mkdir -p $other_dir
15925 ln $migrate_dir/$tfile $other_dir/luna
15926 ln $migrate_dir/$tfile $migrate_dir/sofia
15927 ln $other_dir/$tfile $migrate_dir/david
15928 ln -s $migrate_dir/$tfile $other_dir/zachary
15929 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
15930 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
15932 $LFS migrate -m $MDTIDX $migrate_dir ||
15933 error "fails on migrating remote dir to MDT1"
15935 echo "migratate to MDT1, then checking.."
15936 for ((i = 0; i < 10; i++)); do
15937 for file in $(find $migrate_dir/dir_${i}); do
15938 mdt_index=$($LFS getstripe -m $file)
15939 [ $mdt_index == $MDTIDX ] ||
15940 error "$file is not on MDT${MDTIDX}"
15944 # the multiple link file should still in MDT0
15945 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
15946 [ $mdt_index == 0 ] ||
15947 error "$file is not on MDT${MDTIDX}"
15949 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15950 [ "$old_dir_flag" = "$new_dir_flag" ] ||
15951 error " expect $old_dir_flag get $new_dir_flag"
15953 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15954 [ "$old_file_flag" = "$new_file_flag" ] ||
15955 error " expect $old_file_flag get $new_file_flag"
15957 local new_dir_mode=$(stat -c%f $migrate_dir)
15958 [ "$old_dir_mode" = "$new_dir_mode" ] ||
15959 error "expect mode $old_dir_mode get $new_dir_mode"
15961 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
15962 [ "$old_file_mode" = "$new_file_mode" ] ||
15963 error "expect mode $old_file_mode get $new_file_mode"
15965 diff /etc/passwd $migrate_dir/$tfile ||
15966 error "$tfile different after migration"
15968 diff /etc/passwd $other_dir/luna ||
15969 error "luna different after migration"
15971 diff /etc/passwd $migrate_dir/sofia ||
15972 error "sofia different after migration"
15974 diff /etc/passwd $migrate_dir/david ||
15975 error "david different after migration"
15977 diff /etc/passwd $other_dir/zachary ||
15978 error "zachary different after migration"
15980 diff /etc/passwd $migrate_dir/${tfile}_ln ||
15981 error "${tfile}_ln different after migration"
15983 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
15984 error "${tfile}_ln_other different after migration"
15986 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
15987 [ $stripe_count = 2 ] ||
15988 error "dir strpe_count $d != 2 after migration."
15990 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
15991 [ $stripe_count = 2 ] ||
15992 error "file strpe_count $d != 2 after migration."
15994 #migrate back to MDT0
15997 $LFS migrate -m $MDTIDX $migrate_dir ||
15998 error "fails on migrating remote dir to MDT0"
16000 echo "migrate back to MDT0, checking.."
16001 for file in $(find $migrate_dir); do
16002 mdt_index=$($LFS getstripe -m $file)
16003 [ $mdt_index == $MDTIDX ] ||
16004 error "$file is not on MDT${MDTIDX}"
16007 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16008 [ "$old_dir_flag" = "$new_dir_flag" ] ||
16009 error " expect $old_dir_flag get $new_dir_flag"
16011 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16012 [ "$old_file_flag" = "$new_file_flag" ] ||
16013 error " expect $old_file_flag get $new_file_flag"
16015 local new_dir_mode=$(stat -c%f $migrate_dir)
16016 [ "$old_dir_mode" = "$new_dir_mode" ] ||
16017 error "expect mode $old_dir_mode get $new_dir_mode"
16019 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
16020 [ "$old_file_mode" = "$new_file_mode" ] ||
16021 error "expect mode $old_file_mode get $new_file_mode"
16023 diff /etc/passwd ${migrate_dir}/$tfile ||
16024 error "$tfile different after migration"
16026 diff /etc/passwd ${other_dir}/luna ||
16027 error "luna different after migration"
16029 diff /etc/passwd ${migrate_dir}/sofia ||
16030 error "sofia different after migration"
16032 diff /etc/passwd ${other_dir}/zachary ||
16033 error "zachary different after migration"
16035 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16036 error "${tfile}_ln different after migration"
16038 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16039 error "${tfile}_ln_other different after migration"
16041 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
16042 [ $stripe_count = 2 ] ||
16043 error "dir strpe_count $d != 2 after migration."
16045 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
16046 [ $stripe_count = 2 ] ||
16047 error "file strpe_count $d != 2 after migration."
16049 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16051 run_test 230b "migrate directory"
16054 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16055 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16056 remote_mds_nodsh && skip "remote MDS with nodsh"
16057 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16058 skip "Need MDS version at least 2.11.52"
16064 local migrate_dir=$DIR/$tdir/migrate_dir
16066 #If migrating directory fails in the middle, all entries of
16067 #the directory is still accessiable.
16068 test_mkdir $DIR/$tdir
16069 test_mkdir -i0 -c1 $migrate_dir
16070 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
16072 createmany -o $migrate_dir/f $total ||
16073 error "create files under ${migrate_dir} failed"
16075 # fail after migrating top dir, and this will fail only once, so the
16076 # first sub file migration will fail (currently f3), others succeed.
16077 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
16078 do_facet mds1 lctl set_param fail_loc=0x1801
16079 local t=$(ls $migrate_dir | wc -l)
16080 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
16081 error "migrate should fail"
16082 local u=$(ls $migrate_dir | wc -l)
16083 [ "$u" == "$t" ] || error "$u != $t during migration"
16085 # add new dir/file should succeed
16086 mkdir $migrate_dir/dir ||
16087 error "mkdir failed under migrating directory"
16088 touch $migrate_dir/file ||
16089 error "create file failed under migrating directory"
16091 # add file with existing name should fail
16092 for file in $migrate_dir/f*; do
16093 stat $file > /dev/null || error "stat $file failed"
16094 $OPENFILE -f O_CREAT:O_EXCL $file &&
16095 error "open(O_CREAT|O_EXCL) $file should fail"
16096 $MULTIOP $file m && error "create $file should fail"
16097 touch $DIR/$tdir/remote_dir/$tfile ||
16098 error "touch $tfile failed"
16099 ln $DIR/$tdir/remote_dir/$tfile $file &&
16100 error "link $file should fail"
16101 mdt_index=$($LFS getstripe -m $file)
16102 if [ $mdt_index == 0 ]; then
16103 # file failed to migrate is not allowed to rename to
16104 mv $DIR/$tdir/remote_dir/$tfile $file &&
16105 error "rename to $file should fail"
16107 mv $DIR/$tdir/remote_dir/$tfile $file ||
16108 error "rename to $file failed"
16110 echo hello >> $file || error "write $file failed"
16113 # resume migration with different options should fail
16114 $LFS migrate -m 0 $migrate_dir &&
16115 error "migrate -m 0 $migrate_dir should fail"
16117 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
16118 error "migrate -c 2 $migrate_dir should fail"
16120 # resume migration should succeed
16121 $LFS migrate -m $MDTIDX $migrate_dir ||
16122 error "migrate $migrate_dir failed"
16124 echo "Finish migration, then checking.."
16125 for file in $(find $migrate_dir); do
16126 mdt_index=$($LFS getstripe -m $file)
16127 [ $mdt_index == $MDTIDX ] ||
16128 error "$file is not on MDT${MDTIDX}"
16131 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16133 run_test 230c "check directory accessiblity if migration failed"
16136 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16137 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16138 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16139 skip "Need MDS version at least 2.11.52"
16141 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
16143 local migrate_dir=$DIR/$tdir/migrate_dir
16153 old_index=$((RANDOM % MDSCOUNT))
16154 old_count=$((MDSCOUNT - old_index))
16155 new_index=$((RANDOM % MDSCOUNT))
16156 new_count=$((MDSCOUNT - new_index))
16157 new_hash="all_char"
16159 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
16160 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
16162 test_mkdir $DIR/$tdir
16163 test_mkdir -i $old_index -c $old_count $migrate_dir
16165 for ((i=0; i<100; i++)); do
16166 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
16167 createmany -o $migrate_dir/dir_${i}/f 100 ||
16168 error "create files under remote dir failed $i"
16171 echo -n "Migrate from MDT$old_index "
16172 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
16173 echo -n "to MDT$new_index"
16174 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
16177 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
16178 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
16179 error "migrate remote dir error"
16181 echo "Finish migration, then checking.."
16182 for file in $(find $migrate_dir); do
16183 mdt_index=$($LFS getstripe -m $file)
16184 if [ $mdt_index -lt $new_index ] ||
16185 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
16186 error "$file is on MDT$mdt_index"
16190 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16192 run_test 230d "check migrate big directory"
16195 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16196 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16197 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16198 skip "Need MDS version at least 2.11.52"
16205 mkdir -p $DIR/$tdir
16206 mkdir $DIR/$tdir/migrate_dir
16207 mkdir $DIR/$tdir/other_dir
16208 touch $DIR/$tdir/migrate_dir/a
16209 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
16210 ls $DIR/$tdir/other_dir
16212 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16213 error "migrate dir fails"
16215 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16216 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16218 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16219 [ $mdt_index == 0 ] || error "a is not on MDT0"
16221 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
16222 error "migrate dir fails"
16224 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
16225 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
16227 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16228 [ $mdt_index == 1 ] || error "a is not on MDT1"
16230 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
16231 [ $mdt_index == 1 ] || error "b is not on MDT1"
16233 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16234 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
16236 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
16238 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16240 run_test 230e "migrate mulitple local link files"
16243 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16244 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16245 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16246 skip "Need MDS version at least 2.11.52"
16251 mkdir -p $DIR/$tdir
16252 mkdir $DIR/$tdir/migrate_dir
16253 $LFS mkdir -i1 $DIR/$tdir/other_dir
16254 touch $DIR/$tdir/migrate_dir/a
16255 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
16256 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
16257 ls $DIR/$tdir/other_dir
16259 # a should be migrated to MDT1, since no other links on MDT0
16260 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16261 error "#1 migrate dir fails"
16262 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16263 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16264 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16265 [ $mdt_index == 1 ] || error "a is not on MDT1"
16267 # a should stay on MDT1, because it is a mulitple link file
16268 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16269 error "#2 migrate dir fails"
16270 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16271 [ $mdt_index == 1 ] || error "a is not on MDT1"
16273 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16274 error "#3 migrate dir fails"
16276 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16277 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
16278 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
16280 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
16281 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
16283 # a should be migrated to MDT0, since no other links on MDT1
16284 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16285 error "#4 migrate dir fails"
16286 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16287 [ $mdt_index == 0 ] || error "a is not on MDT0"
16289 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16291 run_test 230f "migrate mulitple remote link files"
16294 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16295 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16296 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16297 skip "Need MDS version at least 2.11.52"
16299 mkdir -p $DIR/$tdir/migrate_dir
16301 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
16302 error "migrating dir to non-exist MDT succeeds"
16305 run_test 230g "migrate dir to non-exist MDT"
16308 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16309 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16310 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16311 skip "Need MDS version at least 2.11.52"
16315 mkdir -p $DIR/$tdir/migrate_dir
16317 $LFS migrate -m1 $DIR &&
16318 error "migrating mountpoint1 should fail"
16320 $LFS migrate -m1 $DIR/$tdir/.. &&
16321 error "migrating mountpoint2 should fail"
16324 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
16325 error "migrating $tdir/migrate_dir/.. should fail"
16329 run_test 230h "migrate .. and root"
16332 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16333 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16334 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16335 skip "Need MDS version at least 2.11.52"
16337 mkdir -p $DIR/$tdir/migrate_dir
16339 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
16340 error "migration fails with a tailing slash"
16342 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
16343 error "migration fails with two tailing slashes"
16345 run_test 230i "lfs migrate -m tolerates trailing slashes"
16348 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16349 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16350 skip "Need MDS version at least 2.11.52"
16352 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
16353 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
16354 error "create $tfile failed"
16355 cat /etc/passwd > $DIR/$tdir/$tfile
16357 $LFS migrate -m 1 $DIR/$tdir
16359 cmp /etc/passwd $DIR/$tdir/$tfile ||
16360 error "DoM file mismatch after migration"
16362 run_test 230j "DoM file data not changed after dir migration"
16365 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
16366 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16367 skip "Need MDS version at least 2.11.56"
16370 local files_on_starting_mdt=0
16372 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
16373 $LFS getdirstripe $DIR/$tdir
16374 for i in $(seq $total); do
16375 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
16376 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16377 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16380 echo "$files_on_starting_mdt files on MDT0"
16382 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
16383 $LFS getdirstripe $DIR/$tdir
16385 files_on_starting_mdt=0
16386 for i in $(seq $total); do
16387 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16388 error "file $tfile.$i mismatch after migration"
16389 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16390 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16393 echo "$files_on_starting_mdt files on MDT1 after migration"
16394 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16396 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16397 $LFS getdirstripe $DIR/$tdir
16399 files_on_starting_mdt=0
16400 for i in $(seq $total); do
16401 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16402 error "file $tfile.$i mismatch after 2nd migration"
16403 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16404 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16407 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
16408 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16412 run_test 230k "file data not changed after dir migration"
16415 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16416 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16417 skip "Need MDS version at least 2.11.56"
16419 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16420 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16421 error "create files under remote dir failed $i"
16422 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16424 run_test 230l "readdir between MDTs won't crash"
16428 # For simplicity this test assumes that max_pages_per_rpc
16429 # is the same across all OSCs
16430 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16431 local bulk_size=$((max_pages * PAGE_SIZE))
16432 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16435 mkdir -p $DIR/$tdir
16436 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16437 error "failed to set stripe with -S ${brw_size}M option"
16439 # clear the OSC stats
16440 $LCTL set_param osc.*.stats=0 &>/dev/null
16443 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16444 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16445 oflag=direct &>/dev/null || error "dd failed"
16447 sync; sleep 1; sync # just to be safe
16448 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16449 if [ x$nrpcs != "x1" ]; then
16450 $LCTL get_param osc.*.stats
16451 error "found $nrpcs ost_write RPCs, not 1 as expected"
16455 # Drop the OSC cache, otherwise we will read from it
16456 cancel_lru_locks osc
16458 # clear the OSC stats
16459 $LCTL set_param osc.*.stats=0 &>/dev/null
16461 # Client reads $bulk_size.
16462 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16463 iflag=direct &>/dev/null || error "dd failed"
16465 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16466 if [ x$nrpcs != "x1" ]; then
16467 $LCTL get_param osc.*.stats
16468 error "found $nrpcs ost_read RPCs, not 1 as expected"
16471 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16474 mkdir -p $DIR/$tdir
16476 for i in {0..1023}; do
16477 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16478 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16479 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16483 run_test 231b "must not assert on fully utilized OST request buffer"
16486 mkdir -p $DIR/$tdir
16487 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16489 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16490 do_facet ost1 $LCTL set_param fail_loc=0x31c
16492 # ignore dd failure
16493 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16495 do_facet ost1 $LCTL set_param fail_loc=0
16496 umount_client $MOUNT || error "umount failed"
16497 mount_client $MOUNT || error "mount failed"
16498 stop ost1 || error "cannot stop ost1"
16499 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16501 run_test 232a "failed lock should not block umount"
16504 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16505 skip "Need MDS version at least 2.10.58"
16507 mkdir -p $DIR/$tdir
16508 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16509 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16511 cancel_lru_locks osc
16513 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16514 do_facet ost1 $LCTL set_param fail_loc=0x31c
16517 $LFS data_version $DIR/$tdir/$tfile || true
16519 do_facet ost1 $LCTL set_param fail_loc=0
16520 umount_client $MOUNT || error "umount failed"
16521 mount_client $MOUNT || error "mount failed"
16522 stop ost1 || error "cannot stop ost1"
16523 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16525 run_test 232b "failed data version lock should not block umount"
16528 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
16529 skip "Need MDS version at least 2.3.64"
16530 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16532 local fid=$($LFS path2fid $MOUNT)
16534 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16535 error "cannot access $MOUNT using its FID '$fid'"
16537 run_test 233a "checking that OBF of the FS root succeeds"
16540 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
16541 skip "Need MDS version at least 2.5.90"
16542 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16544 local fid=$($LFS path2fid $MOUNT/.lustre)
16546 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16547 error "cannot access $MOUNT/.lustre using its FID '$fid'"
16549 fid=$($LFS path2fid $MOUNT/.lustre/fid)
16550 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16551 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
16553 run_test 233b "checking that OBF of the FS .lustre succeeds"
16556 local p="$TMP/sanityN-$TESTNAME.parameters"
16557 save_lustre_params client "llite.*.xattr_cache" > $p
16558 lctl set_param llite.*.xattr_cache 1 ||
16559 skip_env "xattr cache is not supported"
16561 mkdir -p $DIR/$tdir || error "mkdir failed"
16562 touch $DIR/$tdir/$tfile || error "touch failed"
16563 # OBD_FAIL_LLITE_XATTR_ENOMEM
16564 $LCTL set_param fail_loc=0x1405
16565 getfattr -n user.attr $DIR/$tdir/$tfile &&
16566 error "getfattr should have failed with ENOMEM"
16567 $LCTL set_param fail_loc=0x0
16570 restore_lustre_params < $p
16573 run_test 234 "xattr cache should not crash on ENOMEM"
16576 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
16577 skip "Need MDS version at least 2.4.52"
16579 flock_deadlock $DIR/$tfile
16584 124) error "process hangs on a deadlock"
16586 *) error "error executing flock_deadlock $DIR/$tfile"
16590 run_test 235 "LU-1715: flock deadlock detection does not work properly"
16594 check_swap_layouts_support
16596 local ref1=/etc/passwd
16597 local ref2=/etc/group
16598 local file1=$DIR/$tdir/f1
16599 local file2=$DIR/$tdir/f2
16601 test_mkdir -c1 $DIR/$tdir
16602 $LFS setstripe -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
16603 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
16604 $LFS setstripe -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
16605 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
16606 local fd=$(free_fd)
16607 local cmd="exec $fd<>$file2"
16610 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
16611 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
16614 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
16619 run_test 236 "Layout swap on open unlinked file"
16621 # LU-4659 linkea consistency
16623 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
16624 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
16625 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
16626 skip "Need MDS version at least 2.5.58 or 2.5.2+"
16629 ln $DIR/$tfile $DIR/$tfile.lnk
16630 touch $DIR/$tfile.new
16631 mv $DIR/$tfile.new $DIR/$tfile
16632 local fid1=$($LFS path2fid $DIR/$tfile)
16633 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
16634 local path1=$($LFS fid2path $FSNAME "$fid1")
16635 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
16636 local path2=$($LFS fid2path $FSNAME "$fid2")
16637 [ $tfile.lnk == $path2 ] ||
16638 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
16641 run_test 238 "Verify linkea consistency"
16643 test_239A() { # was test_239
16644 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
16645 skip "Need MDS version at least 2.5.60"
16647 local list=$(comma_list $(mdts_nodes))
16649 mkdir -p $DIR/$tdir
16650 createmany -o $DIR/$tdir/f- 5000
16651 unlinkmany $DIR/$tdir/f- 5000
16652 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
16653 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
16654 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
16655 osp.*MDT*.sync_in_flight" | calc_sum)
16656 [ "$changes" -eq 0 ] || error "$changes not synced"
16658 run_test 239A "osp_sync test"
16660 test_239a() { #LU-5297
16661 remote_mds_nodsh && skip "remote MDS with nodsh"
16664 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
16665 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
16666 chgrp $RUNAS_GID $DIR/$tfile
16667 wait_delete_completed
16669 run_test 239a "process invalid osp sync record correctly"
16671 test_239b() { #LU-5297
16672 remote_mds_nodsh && skip "remote MDS with nodsh"
16675 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
16676 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
16677 chgrp $RUNAS_GID $DIR/$tfile1
16678 wait_delete_completed
16679 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
16681 chgrp $RUNAS_GID $DIR/$tfile2
16682 wait_delete_completed
16684 run_test 239b "process osp sync record with ENOMEM error correctly"
16687 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16688 remote_mds_nodsh && skip "remote MDS with nodsh"
16690 mkdir -p $DIR/$tdir
16692 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
16693 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
16694 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
16695 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
16697 umount_client $MOUNT || error "umount failed"
16698 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
16699 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
16700 mount_client $MOUNT || error "failed to mount client"
16702 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
16703 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
16705 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
16711 for LOOP in $(seq $count); do
16712 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
16713 cancel_lru_locks $OSC || true
16721 for LOOP in $(seq $1); do
16722 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
16727 test_241a() { # was test_241
16728 local bsize=$PAGE_SIZE
16730 (( bsize < 40960 )) && bsize=40960
16731 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16733 cancel_lru_locks $OSC
16734 test_241_bio 1000 $bsize &
16736 test_241_dio 1000 $bsize
16739 run_test 241a "bio vs dio"
16742 local bsize=$PAGE_SIZE
16744 (( bsize < 40960 )) && bsize=40960
16745 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16747 test_241_dio 1000 $bsize &
16749 test_241_dio 1000 $bsize
16752 run_test 241b "dio vs dio"
16755 remote_mds_nodsh && skip "remote MDS with nodsh"
16757 mkdir -p $DIR/$tdir
16758 touch $DIR/$tdir/$tfile
16760 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
16761 do_facet mds1 lctl set_param fail_loc=0x105
16762 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
16764 do_facet mds1 lctl set_param fail_loc=0
16765 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
16767 run_test 242 "mdt_readpage failure should not cause directory unreadable"
16771 test_mkdir $DIR/$tdir
16772 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
16774 run_test 243 "various group lock tests"
16778 test_mkdir $DIR/$tdir
16779 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
16780 sendfile_grouplock $DIR/$tdir/$tfile || \
16781 error "sendfile+grouplock failed"
16784 run_test 244 "sendfile with group lock tests"
16787 local flagname="multi_mod_rpcs"
16788 local connect_data_name="max_mod_rpcs"
16791 # check if multiple modify RPCs flag is set
16792 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
16793 grep "connect_flags:")
16796 echo "$out" | grep -qw $flagname
16797 if [ $? -ne 0 ]; then
16798 echo "connect flag $flagname is not set"
16802 # check if multiple modify RPCs data is set
16803 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
16806 echo "$out" | grep -qw $connect_data_name ||
16807 error "import should have connect data $connect_data_name"
16809 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
16811 test_246() { # LU-7371
16812 remote_ost_nodsh && skip "remote OST with nodsh"
16813 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
16814 skip "Need OST version >= 2.7.62"
16816 do_facet ost1 $LCTL set_param fail_val=4095
16817 #define OBD_FAIL_OST_READ_SIZE 0x234
16818 do_facet ost1 $LCTL set_param fail_loc=0x234
16819 $LFS setstripe $DIR/$tfile -i 0 -c 1
16820 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
16821 cancel_lru_locks $FSNAME-OST0000
16822 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
16824 run_test 246 "Read file of size 4095 should return right length"
16830 umount_client $submount
16835 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16837 skip_env "Fileset feature is not supported"
16839 local submount=${MOUNT}_$tdir
16842 mkdir -p $submount || error "mkdir $submount failed"
16843 FILESET="$FILESET/$tdir" mount_client $submount ||
16844 error "mount $submount failed"
16845 trap "cleanup_247 $submount" EXIT
16846 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
16847 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
16848 error "read $MOUNT/$tdir/$tfile failed"
16849 cleanup_247 $submount
16851 run_test 247a "mount subdir as fileset"
16854 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16855 skip_env "Fileset feature is not supported"
16857 local submount=${MOUNT}_$tdir
16859 rm -rf $MOUNT/$tdir
16860 mkdir -p $submount || error "mkdir $submount failed"
16862 FILESET="$FILESET/$tdir" mount_client $submount &&
16863 error "mount $submount should fail"
16866 run_test 247b "mount subdir that dose not exist"
16869 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16870 skip_env "Fileset feature is not supported"
16872 local submount=${MOUNT}_$tdir
16874 mkdir -p $MOUNT/$tdir/dir1
16875 mkdir -p $submount || error "mkdir $submount failed"
16876 trap "cleanup_247 $submount" EXIT
16877 FILESET="$FILESET/$tdir" mount_client $submount ||
16878 error "mount $submount failed"
16879 local fid=$($LFS path2fid $MOUNT/)
16880 $LFS fid2path $submount $fid && error "fid2path should fail"
16881 cleanup_247 $submount
16883 run_test 247c "running fid2path outside root"
16886 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16887 skip "Fileset feature is not supported"
16889 local submount=${MOUNT}_$tdir
16891 mkdir -p $MOUNT/$tdir/dir1
16892 mkdir -p $submount || error "mkdir $submount failed"
16893 FILESET="$FILESET/$tdir" mount_client $submount ||
16894 error "mount $submount failed"
16895 trap "cleanup_247 $submount" EXIT
16896 local fid=$($LFS path2fid $submount/dir1)
16897 $LFS fid2path $submount $fid || error "fid2path should succeed"
16898 cleanup_247 $submount
16900 run_test 247d "running fid2path inside root"
16904 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16906 skip "Fileset feature is not supported"
16908 local submount=${MOUNT}_$tdir
16911 mkdir -p $submount || error "mkdir $submount failed"
16912 FILESET="$FILESET/.." mount_client $submount &&
16913 error "mount $submount should fail"
16916 run_test 247e "mount .. as fileset"
16919 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
16920 [ -z "$fast_read_sav" ] && skip "no fast read support"
16922 # create a large file for fast read verification
16923 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
16925 # make sure the file is created correctly
16926 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
16927 { rm -f $DIR/$tfile; skip "file creation error"; }
16929 echo "Test 1: verify that fast read is 4 times faster on cache read"
16931 # small read with fast read enabled
16932 $LCTL set_param -n llite.*.fast_read=1
16933 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16934 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16935 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16936 # small read with fast read disabled
16937 $LCTL set_param -n llite.*.fast_read=0
16938 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
16939 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16940 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16942 # verify that fast read is 4 times faster for cache read
16943 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
16944 error_not_in_vm "fast read was not 4 times faster: " \
16945 "$t_fast vs $t_slow"
16947 echo "Test 2: verify the performance between big and small read"
16948 $LCTL set_param -n llite.*.fast_read=1
16950 # 1k non-cache read
16951 cancel_lru_locks osc
16952 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16953 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16954 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16956 # 1M non-cache read
16957 cancel_lru_locks osc
16958 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
16959 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
16960 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
16962 # verify that big IO is not 4 times faster than small IO
16963 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
16964 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
16966 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
16969 run_test 248 "fast read verification"
16971 test_249() { # LU-7890
16972 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
16973 skip "Need at least version 2.8.54"
16976 $LFS setstripe -c 1 $DIR/$tfile
16977 # Offset 2T == 4k * 512M
16978 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
16979 error "dd to 2T offset failed"
16981 run_test 249 "Write above 2T file size"
16984 [ "$(facet_fstype ost$(($($LFS getstripe -i $DIR/$tfile) + 1)))" = "zfs" ] \
16985 && skip "no 16TB file size limit on ZFS"
16987 $LFS setstripe -c 1 $DIR/$tfile
16988 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
16989 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
16990 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
16991 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
16992 conv=notrunc,fsync && error "append succeeded"
16995 run_test 250 "Write above 16T limit"
16998 $LFS setstripe -c -1 -S 1048576 $DIR/$tfile
17000 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
17001 #Skip once - writing the first stripe will succeed
17002 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17003 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
17004 error "short write happened"
17006 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17007 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
17008 error "short read happened"
17012 run_test 251 "Handling short read and write correctly"
17015 remote_mds_nodsh && skip "remote MDS with nodsh"
17016 remote_ost_nodsh && skip "remote OST with nodsh"
17017 if [ "$ost1_FSTYPE" != ldiskfs ] || [ "$mds1_FSTYPE" != ldiskfs ]; then
17018 skip_env "ldiskfs only test"
17028 # check lr_reader on OST0000
17030 dev=$(facet_device $tgt)
17031 out=$(do_facet $tgt $LR_READER $dev)
17032 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17034 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
17035 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
17036 error "Invalid uuid returned by $LR_READER on target $tgt"
17037 echo -e "uuid returned by $LR_READER is '$uuid'\n"
17039 # check lr_reader -c on MDT0000
17041 dev=$(facet_device $tgt)
17042 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
17043 skip "$LR_READER does not support additional options"
17045 out=$(do_facet $tgt $LR_READER -c $dev)
17046 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17048 num=$(echo "$out" | grep -c "mdtlov")
17049 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
17050 error "Invalid number of mdtlov clients returned by $LR_READER"
17051 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
17053 # check lr_reader -cr on MDT0000
17054 out=$(do_facet $tgt $LR_READER -cr $dev)
17055 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17057 echo "$out" | grep -q "^reply_data:$" ||
17058 error "$LR_READER should have returned 'reply_data' section"
17059 num=$(echo "$out" | grep -c "client_generation")
17060 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
17062 run_test 252 "check lr_reader tool"
17065 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17066 remote_mds_nodsh && skip "remote MDS with nodsh"
17067 remote_mgs_nodsh && skip "remote MGS with nodsh"
17071 local ost_name=$(ostname_from_index $ostidx)
17074 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
17075 do_facet $SINGLEMDS $LCTL get_param -n \
17076 osp.$mdtosc_proc1.reserved_mb_high ||
17077 skip "remote MDS does not support reserved_mb_high"
17081 wait_delete_completed
17084 if ! combined_mgs_mds ; then
17087 pool_add $TESTNAME || error "Pool creation failed"
17088 pool_add_targets $TESTNAME 0 || error "Pool add targets failed"
17090 $LFS setstripe $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
17091 error "Setstripe failed"
17093 dd if=/dev/zero of=$DIR/$tdir/$tfile.0 bs=1M count=10
17095 local wms=$(ost_watermarks_set_enospc $tfile $ostidx |
17097 stack_trap "ost_watermarks_clear_enospc $tfile $ostidx $wms" EXIT
17099 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17100 osp.$mdtosc_proc1.prealloc_status)
17101 echo "prealloc_status $oa_status"
17103 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1M count=1 &&
17104 error "File creation should fail"
17106 #object allocation was stopped, but we still able to append files
17107 dd if=/dev/zero of=$DIR/$tdir/$tfile.0 bs=1M seek=6 count=5 \
17108 oflag=append || error "Append failed"
17110 rm -f $DIR/$tdir/$tfile.0
17112 # For this test, we want to delete the files we created to go out of
17113 # space but leave the watermark, so we remain nearly out of space
17114 ost_watermarks_enospc_delete_files $tfile $ostidx
17116 wait_delete_completed
17120 for i in $(seq 10 12); do
17121 dd if=/dev/zero of=$DIR/$tdir/$tfile.$i bs=1M count=1 \
17122 2>/dev/null || error "File creation failed after rm"
17125 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17126 osp.$mdtosc_proc1.prealloc_status)
17127 echo "prealloc_status $oa_status"
17129 if (( oa_status != 0 )); then
17130 error "Object allocation still disable after rm"
17133 if ! combined_mgs_mds ; then
17137 run_test 253 "Check object allocation limit"
17140 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17141 remote_mds_nodsh && skip "remote MDS with nodsh"
17142 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
17143 skip "MDS does not support changelog_size"
17146 local MDT0=$(facet_svc $SINGLEMDS)
17148 changelog_register || error "changelog_register failed"
17150 changelog_clear 0 || error "changelog_clear failed"
17152 local size1=$(do_facet $SINGLEMDS \
17153 $LCTL get_param -n mdd.$MDT0.changelog_size)
17154 echo "Changelog size $size1"
17157 $LFS mkdir -i 0 $DIR/$tdir
17159 mkdir -p $DIR/$tdir/pics/2008/zachy
17160 touch $DIR/$tdir/pics/2008/zachy/timestamp
17161 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
17162 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
17163 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
17164 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
17165 rm $DIR/$tdir/pics/desktop.jpg
17167 local size2=$(do_facet $SINGLEMDS \
17168 $LCTL get_param -n mdd.$MDT0.changelog_size)
17169 echo "Changelog size after work $size2"
17171 (( $size2 > $size1 )) ||
17172 error "new Changelog size=$size2 less than old size=$size1"
17174 run_test 254 "Check changelog size"
17181 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
17182 awk -F: '{print $2}' | grep $type > /dev/null
17183 if [ $? -ne 0 ]; then
17193 lfs ladvise -a willread $file > /dev/null 2>&1
17194 if [ $? -eq 0 ]; then
17198 lfs ladvise -a willread $file 2>&1 |
17199 grep "Inappropriate ioctl for device" > /dev/null
17200 if [ $? -eq 0 ]; then
17207 bc <<<"scale=2; ($1 - $2) * 100 / $2"
17210 # run a random read IO workload
17211 # usage: random_read_iops <filename> <filesize> <iosize>
17212 random_read_iops() {
17215 local iosize=${3:-4096}
17217 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
17218 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
17221 drop_file_oss_cache() {
17225 $LFS ladvise -a dontneed $file 2>/dev/null ||
17226 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
17229 ladvise_willread_performance()
17232 local average_origin=0
17233 local average_cache=0
17234 local average_ladvise=0
17236 for ((i = 1; i <= $repeat; i++)); do
17237 echo "Iter $i/$repeat: reading without willread hint"
17238 cancel_lru_locks osc
17239 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17240 local speed_origin=$(random_read_iops $DIR/$tfile $size)
17241 echo "Iter $i/$repeat: uncached speed: $speed_origin"
17242 average_origin=$(bc <<<"$average_origin + $speed_origin")
17244 cancel_lru_locks osc
17245 local speed_cache=$(random_read_iops $DIR/$tfile $size)
17246 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
17247 average_cache=$(bc <<<"$average_cache + $speed_cache")
17249 cancel_lru_locks osc
17250 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17251 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
17252 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
17253 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
17254 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
17256 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
17257 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
17258 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
17260 speedup_cache=$(percent $average_cache $average_origin)
17261 speedup_ladvise=$(percent $average_ladvise $average_origin)
17263 echo "Average uncached read: $average_origin"
17264 echo "Average speedup with OSS cached read: " \
17265 "$average_cache = +$speedup_cache%"
17266 echo "Average speedup with ladvise willread: " \
17267 "$average_ladvise = +$speedup_ladvise%"
17269 local lowest_speedup=20
17270 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
17271 echo "Speedup with OSS cached read less than $lowest_speedup%," \
17272 "got $average_cache%. Skipping ladvise willread check."
17276 # the test won't work on ZFS until it supports 'ladvise dontneed', but
17277 # it is still good to run until then to exercise 'ladvise willread'
17278 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17279 [ "$ost1_FSTYPE" = "zfs" ] &&
17280 echo "osd-zfs does not support dontneed or drop_caches" &&
17283 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
17284 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
17285 error_not_in_vm "Speedup with willread is less than " \
17286 "$lowest_speedup%, got $average_ladvise%"
17290 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17291 skip "lustre < 2.8.54 does not support ladvise "
17292 remote_ost_nodsh && skip "remote OST with nodsh"
17294 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
17296 ladvise_no_type willread $DIR/$tfile &&
17297 skip "willread ladvise is not supported"
17299 ladvise_no_ioctl $DIR/$tfile &&
17300 skip "ladvise ioctl is not supported"
17303 local size=$((size_mb * 1048576))
17304 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17305 error "dd to $DIR/$tfile failed"
17307 lfs ladvise -a willread $DIR/$tfile ||
17308 error "Ladvise failed with no range argument"
17310 lfs ladvise -a willread -s 0 $DIR/$tfile ||
17311 error "Ladvise failed with no -l or -e argument"
17313 lfs ladvise -a willread -e 1 $DIR/$tfile ||
17314 error "Ladvise failed with only -e argument"
17316 lfs ladvise -a willread -l 1 $DIR/$tfile ||
17317 error "Ladvise failed with only -l argument"
17319 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
17320 error "End offset should not be smaller than start offset"
17322 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
17323 error "End offset should not be equal to start offset"
17325 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
17326 error "Ladvise failed with overflowing -s argument"
17328 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
17329 error "Ladvise failed with overflowing -e argument"
17331 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
17332 error "Ladvise failed with overflowing -l argument"
17334 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
17335 error "Ladvise succeeded with conflicting -l and -e arguments"
17337 echo "Synchronous ladvise should wait"
17339 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17340 do_nodes $(comma_list $(osts_nodes)) \
17341 $LCTL set_param fail_val=$delay fail_loc=0x237
17343 local start_ts=$SECONDS
17344 lfs ladvise -a willread $DIR/$tfile ||
17345 error "Ladvise failed with no range argument"
17346 local end_ts=$SECONDS
17347 local inteval_ts=$((end_ts - start_ts))
17349 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17350 error "Synchronous advice didn't wait reply"
17353 echo "Asynchronous ladvise shouldn't wait"
17354 local start_ts=$SECONDS
17355 lfs ladvise -a willread -b $DIR/$tfile ||
17356 error "Ladvise failed with no range argument"
17357 local end_ts=$SECONDS
17358 local inteval_ts=$((end_ts - start_ts))
17360 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17361 error "Asynchronous advice blocked"
17364 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17365 ladvise_willread_performance
17367 run_test 255a "check 'lfs ladvise -a willread'"
17373 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17377 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17378 skip "lustre < 2.8.54 does not support ladvise "
17379 remote_ost_nodsh && skip "remote OST with nodsh"
17381 lfs setstripe -c 1 -i 0 $DIR/$tfile
17383 ladvise_no_type dontneed $DIR/$tfile &&
17384 skip "dontneed ladvise is not supported"
17386 ladvise_no_ioctl $DIR/$tfile &&
17387 skip "ladvise ioctl is not supported"
17389 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17390 [ "$ost1_FSTYPE" = "zfs" ] &&
17391 skip "zfs-osd does not support 'ladvise dontneed'"
17394 local size=$((size_mb * 1048576))
17395 # In order to prevent disturbance of other processes, only check 3/4
17396 # of the memory usage
17397 local kibibytes=$((size_mb * 1024 * 3 / 4))
17399 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17400 error "dd to $DIR/$tfile failed"
17402 #force write to complete before dropping OST cache & checking memory
17405 local total=$(facet_meminfo ost1 MemTotal)
17406 echo "Total memory: $total KiB"
17408 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17409 local before_read=$(facet_meminfo ost1 Cached)
17410 echo "Cache used before read: $before_read KiB"
17412 lfs ladvise -a willread $DIR/$tfile ||
17413 error "Ladvise willread failed"
17414 local after_read=$(facet_meminfo ost1 Cached)
17415 echo "Cache used after read: $after_read KiB"
17417 lfs ladvise -a dontneed $DIR/$tfile ||
17418 error "Ladvise dontneed again failed"
17419 local no_read=$(facet_meminfo ost1 Cached)
17420 echo "Cache used after dontneed ladvise: $no_read KiB"
17422 if [ $total -lt $((before_read + kibibytes)) ]; then
17423 echo "Memory is too small, abort checking"
17427 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17428 error "Ladvise willread should use more memory" \
17429 "than $kibibytes KiB"
17432 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17433 error "Ladvise dontneed should release more memory" \
17434 "than $kibibytes KiB"
17437 run_test 255b "check 'lfs ladvise -a dontneed'"
17440 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17441 skip "lustre < 2.10.53 does not support lockahead"
17449 test_mkdir -p $DIR/$tdir
17450 $LFS setstripe -i 0 -c 1 $DIR/$tdir
17452 #test 10 returns only success/failure
17454 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17456 if [ $rc -eq 255 ]; then
17457 error "Ladvise test${i} failed, ${rc}"
17460 #test 11 counts lock enqueue requests, all others count new locks
17462 count=$(do_facet ost1 \
17463 $LCTL get_param -n ost.OSS.ost.stats)
17464 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17466 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17468 if [ $rc -eq 255 ]; then
17469 error "Ladvise test${i} failed, ${rc}"
17472 new_count=$(do_facet ost1 \
17473 $LCTL get_param -n ost.OSS.ost.stats)
17474 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17475 awk '{ print $2 }')
17477 difference="$((new_count - count))"
17478 if [ $difference -ne $rc ]; then
17479 error "Ladvise test${i}, bad enqueue count, returned " \
17480 "${rc}, actual ${difference}"
17483 for i in $(seq 12 21); do
17484 # If we do not do this, we run the risk of having too many
17485 # locks and starting lock cancellation while we are checking
17487 cancel_lru_locks osc
17489 count=$($LCTL get_param -n \
17490 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17492 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17494 if [ $rc -eq 255 ]; then
17495 error "Ladvise test ${i} failed, ${rc}"
17498 new_count=$($LCTL get_param -n \
17499 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17500 difference="$((new_count - count))"
17502 # Test 15 output is divided by 100 to map down to valid return
17503 if [ $i -eq 15 ]; then
17507 if [ $difference -ne $rc ]; then
17508 error "Ladvise test ${i}, bad lock count, returned " \
17509 "${rc}, actual ${difference}"
17513 #test 22 returns only success/failure
17515 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17517 if [ $rc -eq 255 ]; then
17518 error "Ladvise test${i} failed, ${rc}"
17521 run_test 255c "suite of ladvise lockahead tests"
17524 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17525 remote_mds_nodsh && skip "remote MDS with nodsh"
17526 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17527 changelog_users $SINGLEMDS | grep "^cl" &&
17528 skip "active changelog user"
17534 mdt_dev=$(mdsdevname 1)
17537 changelog_register || error "changelog_register failed"
17540 mkdir -p $DIR/$tdir
17542 changelog_clear 0 || error "changelog_clear failed"
17545 touch $DIR/$tdir/{1..10}
17548 stop $SINGLEMDS || error "Fail to stop MDT"
17552 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
17554 #after mount new plainllog is used
17555 touch $DIR/$tdir/{11..19}
17556 local tmpfile="$(mktemp --tmpdir -u $tfile.XXXXXX)"
17557 stack_trap "rm -f $tmpfile"
17558 cat_sl=$(do_facet $SINGLEMDS "sync; \
17559 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17560 llog_reader $tmpfile | grep -c type=1064553b")
17561 do_facet $SINGLEMDS llog_reader $tmpfile
17563 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
17565 changelog_clear 0 || error "changelog_clear failed"
17567 cat_sl=$(do_facet $SINGLEMDS "sync; \
17568 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17569 llog_reader $tmpfile | grep -c type=1064553b")
17571 if (( cat_sl == 2 )); then
17572 error "Empty plain llog was not deleted from changelog catalog"
17573 elif (( cat_sl != 1 )); then
17574 error "Active plain llog shouldn't be deleted from catalog"
17577 run_test 256 "Check llog delete for empty and not full state"
17580 remote_mds_nodsh && skip "remote MDS with nodsh"
17581 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
17582 skip "Need MDS version at least 2.8.55"
17584 test_mkdir $DIR/$tdir
17586 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
17587 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
17590 #define OBD_FAIL_MDS_XATTR_REP 0x161
17591 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17592 local facet=mds$((mdtidx + 1))
17593 set_nodes_failloc $(facet_active_host $facet) 0x80000161
17594 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
17596 stop $facet || error "stop MDS failed"
17597 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
17598 error "start MDS fail"
17599 wait_recovery_complete $facet
17601 run_test 257 "xattr locks are not lost"
17603 # Verify we take the i_mutex when security requires it
17605 #define OBD_FAIL_IMUTEX_SEC 0x141c
17606 $LCTL set_param fail_loc=0x141c
17608 chmod u+s $DIR/$tfile
17609 chmod a+rwx $DIR/$tfile
17610 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17612 if [ $RC -ne 0 ]; then
17613 error "error, failed to take i_mutex, rc=$?"
17617 run_test 258a "verify i_mutex security behavior when suid attributes is set"
17619 # Verify we do NOT take the i_mutex in the normal case
17621 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
17622 $LCTL set_param fail_loc=0x141d
17625 chmod a+rw $DIR/$tfile
17626 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17628 if [ $RC -ne 0 ]; then
17629 error "error, took i_mutex unnecessarily, rc=$?"
17634 run_test 258b "verify i_mutex security behavior"
17637 local file=$DIR/$tfile
17641 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17643 stack_trap "rm -f $file" EXIT
17645 wait_delete_completed
17646 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17647 echo "before: $before"
17649 $LFS setstripe -i 0 -c 1 $file
17650 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
17652 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17653 echo "after write: $after"
17655 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
17656 do_facet ost1 $LCTL set_param fail_loc=0x2301
17658 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17659 echo "after truncate: $after"
17662 do_facet ost1 $LCTL set_param fail_loc=0
17663 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17665 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17666 echo "after restart: $after"
17667 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
17668 error "missing truncate?"
17672 run_test 259 "crash at delayed truncate"
17675 #define OBD_FAIL_MDC_CLOSE 0x806
17676 $LCTL set_param fail_loc=0x80000806
17680 run_test 260 "Check mdc_close fail"
17682 ### Data-on-MDT sanity tests ###
17684 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17685 skip "Need MDS version at least 2.10.55 for DoM"
17688 local dom=$DIR/$tdir/dom_file
17689 local tmp=$DIR/$tdir/tmp_file
17691 mkdir -p $DIR/$tdir
17693 # basic checks for DoM component creation
17694 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
17695 error "Can set MDT layout to non-first entry"
17697 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
17698 error "Can define multiple entries as MDT layout"
17700 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
17702 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
17703 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
17704 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
17706 local mdtidx=$($LFS getstripe -m $dom)
17707 local mdtname=MDT$(printf %04x $mdtidx)
17708 local facet=mds$((mdtidx + 1))
17709 local space_check=1
17711 # Skip free space checks with ZFS
17712 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
17716 local size_tmp=$((65536 * 3))
17717 local mdtfree1=$(do_facet $facet \
17718 lctl get_param -n osd*.*$mdtname.kbytesfree)
17720 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17721 # check also direct IO along write
17722 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
17723 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17725 cmp $tmp $dom || error "file data is different"
17726 [ $(stat -c%s $dom) == $size_tmp ] ||
17727 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17728 if [ $space_check == 1 ]; then
17729 local mdtfree2=$(do_facet $facet \
17730 lctl get_param -n osd*.*$mdtname.kbytesfree)
17732 # increase in usage from by $size_tmp
17733 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17734 error "MDT free space wrong after write: " \
17735 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17739 local size_dom=10000
17741 $TRUNCATE $dom $size_dom
17742 [ $(stat -c%s $dom) == $size_dom ] ||
17743 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
17744 if [ $space_check == 1 ]; then
17745 mdtfree1=$(do_facet $facet \
17746 lctl get_param -n osd*.*$mdtname.kbytesfree)
17747 # decrease in usage from $size_tmp to new $size_dom
17748 [ $(($mdtfree1 - $mdtfree2)) -ge \
17749 $(((size_tmp - size_dom) / 1024)) ] ||
17750 error "MDT free space is wrong after truncate: " \
17751 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
17757 size_dom=$((size_dom + size_tmp))
17758 [ $(stat -c%s $dom) == $size_dom ] ||
17759 error "bad size after append: $(stat -c%s $dom) != $size_dom"
17760 if [ $space_check == 1 ]; then
17761 mdtfree2=$(do_facet $facet \
17762 lctl get_param -n osd*.*$mdtname.kbytesfree)
17763 # increase in usage by $size_tmp from previous
17764 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17765 error "MDT free space is wrong after append: " \
17766 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17771 if [ $space_check == 1 ]; then
17772 mdtfree1=$(do_facet $facet \
17773 lctl get_param -n osd*.*$mdtname.kbytesfree)
17774 # decrease in usage by $size_dom from previous
17775 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
17776 error "MDT free space is wrong after removal: " \
17777 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
17780 # combined striping
17781 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
17782 error "Can't create DoM + OST striping"
17784 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
17785 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17786 # check also direct IO along write
17787 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17789 cmp $tmp $dom || error "file data is different"
17790 [ $(stat -c%s $dom) == $size_tmp ] ||
17791 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17796 run_test 270a "DoM: basic functionality tests"
17799 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17800 skip "Need MDS version at least 2.10.55"
17802 local dom=$DIR/$tdir/dom_file
17803 local max_size=1048576
17805 mkdir -p $DIR/$tdir
17806 $LFS setstripe -E $max_size -L mdt $dom
17808 # truncate over the limit
17809 $TRUNCATE $dom $(($max_size + 1)) &&
17810 error "successful truncate over the maximum size"
17811 # write over the limit
17812 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
17813 error "successful write over the maximum size"
17814 # append over the limit
17815 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
17816 echo "12345" >> $dom && error "successful append over the maximum size"
17821 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
17824 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17825 skip "Need MDS version at least 2.10.55"
17827 mkdir -p $DIR/$tdir
17828 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17830 # check files inherit DoM EA
17831 touch $DIR/$tdir/first
17832 [ $($LFS getstripe -L $DIR/$tdir/first) == "mdt" ] ||
17833 error "bad pattern"
17834 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
17835 error "bad stripe count"
17836 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
17837 error "bad stripe size"
17839 # check directory inherits DoM EA and uses it as default
17840 mkdir $DIR/$tdir/subdir
17841 touch $DIR/$tdir/subdir/second
17842 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
17843 error "bad pattern in sub-directory"
17844 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
17845 error "bad stripe count in sub-directory"
17846 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
17847 error "bad stripe size in sub-directory"
17850 run_test 270c "DoM: DoM EA inheritance tests"
17853 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17854 skip "Need MDS version at least 2.10.55"
17856 mkdir -p $DIR/$tdir
17857 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17859 # inherit default DoM striping
17860 mkdir $DIR/$tdir/subdir
17861 touch $DIR/$tdir/subdir/f1
17863 # change default directory striping
17864 $LFS setstripe -c 1 $DIR/$tdir/subdir
17865 touch $DIR/$tdir/subdir/f2
17866 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
17867 error "wrong default striping in file 2"
17868 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
17869 error "bad pattern in file 2"
17872 run_test 270d "DoM: change striping from DoM to RAID0"
17875 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17876 skip "Need MDS version at least 2.10.55"
17878 mkdir -p $DIR/$tdir/dom
17879 mkdir -p $DIR/$tdir/norm
17882 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
17883 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
17885 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
17886 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
17888 # find DoM files by layout
17889 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
17890 [ $NUM -eq $DOMFILES ] ||
17891 error "lfs find -L: found $NUM, expected $DOMFILES"
17892 echo "Test 1: lfs find 20 DOM files by layout: OK"
17894 # there should be 1 dir with default DOM striping
17895 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
17897 error "lfs find -L: found $NUM, expected 1 dir"
17898 echo "Test 2: lfs find 1 DOM dir by layout: OK"
17900 # find DoM files by stripe size
17901 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
17902 [ $NUM -eq $DOMFILES ] ||
17903 error "lfs find -S: found $NUM, expected $DOMFILES"
17904 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
17906 # find files by stripe offset except DoM files
17907 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
17908 [ $NUM -eq $NORMFILES ] ||
17909 error "lfs find -i: found $NUM, expected $NORMFILES"
17910 echo "Test 5: lfs find no DOM files by stripe index: OK"
17913 run_test 270e "DoM: lfs find with DoM files test"
17916 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17917 skip "Need MDS version at least 2.10.55"
17919 local mdtname=${FSNAME}-MDT0000-mdtlov
17920 local dom=$DIR/$tdir/dom_file
17921 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
17922 lod.$mdtname.dom_stripesize)
17923 local dom_limit=131072
17925 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
17926 local dom_current=$(do_facet mds1 $LCTL get_param -n \
17927 lod.$mdtname.dom_stripesize)
17928 [ ${dom_limit} -eq ${dom_current} ] ||
17929 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
17931 $LFS mkdir -i 0 -c 1 $DIR/$tdir
17932 $LFS setstripe -d $DIR/$tdir
17933 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
17934 error "Can't set directory default striping"
17936 # exceed maximum stripe size
17937 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
17938 error "Can't create file with $((dom_limit * 2)) DoM stripe"
17939 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
17940 error "Able to create DoM component size more than LOD limit"
17942 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
17943 dom_current=$(do_facet mds1 $LCTL get_param -n \
17944 lod.$mdtname.dom_stripesize)
17945 [ 0 -eq ${dom_current} ] ||
17946 error "Can't set zero DoM stripe limit"
17949 # attempt to create DoM file on server with disabled DoM should
17950 # remove DoM entry from layout and be succeed
17951 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
17952 error "Can't create DoM file (DoM is disabled)"
17953 [ $($LFS getstripe -L $dom) == "mdt" ] &&
17954 error "File has DoM component while DoM is disabled"
17957 # attempt to create DoM file with only DoM stripe should return error
17958 $LFS setstripe -E $dom_limit -L mdt $dom &&
17959 error "Able to create DoM-only file while DoM is disabled"
17961 # too low values to be aligned with smallest stripe size 64K
17962 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
17963 dom_current=$(do_facet mds1 $LCTL get_param -n \
17964 lod.$mdtname.dom_stripesize)
17965 [ 30000 -eq ${dom_current} ] &&
17966 error "Can set too small DoM stripe limit"
17968 # 64K is a minimal stripe size in Lustre, expect limit of that size
17969 [ 65536 -eq ${dom_current} ] ||
17970 error "Limit is not set to 64K but ${dom_current}"
17972 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
17973 dom_current=$(do_facet mds1 $LCTL get_param -n \
17974 lod.$mdtname.dom_stripesize)
17976 [ 2147483648 -eq ${dom_current} ] &&
17977 error "Can set too large DoM stripe limit"
17979 do_facet mds1 $LCTL set_param -n \
17980 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
17981 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
17982 error "Can't create DoM component size after limit change"
17983 do_facet mds1 $LCTL set_param -n \
17984 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
17985 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
17986 error "Can't create DoM file after limit decrease"
17987 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
17988 error "Can create big DoM component after limit decrease"
17989 touch ${dom}_def ||
17990 error "Can't create file with old default layout"
17992 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
17995 run_test 270f "DoM: maximum DoM stripe size checks"
17998 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17999 skip "Need MDS version at least 2.10.55"
18001 local dom=$DIR/$tdir/dom
18003 mkdir -p $DIR/$tdir
18005 $LFS setstripe -E 1024K -L mdt $dom
18007 lctl set_param -n mdc.*.stats=clear
18008 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18009 cat $dom > /dev/null
18010 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
18011 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
18015 run_test 271a "DoM: data is cached for read after write"
18018 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18019 skip "Need MDS version at least 2.10.55"
18021 local dom=$DIR/$tdir/dom
18023 mkdir -p $DIR/$tdir
18025 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18027 lctl set_param -n mdc.*.stats=clear
18028 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18029 cancel_lru_locks mdc
18030 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
18031 # second stat to check size is cached on client
18032 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
18033 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18034 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
18037 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
18040 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18041 skip "Need MDS version at least 2.10.55"
18043 local dom=$DIR/$tdir/dom
18045 mkdir -p $DIR/$tdir
18047 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18049 lctl set_param -n mdc.*.stats=clear
18050 lctl set_param -n osc.*.stats=clear
18051 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
18052 cancel_lru_locks mdc
18053 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18054 # second stat to check size is cached on client
18055 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18056 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18057 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
18058 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
18059 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
18062 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
18068 local mdt=MDT$(printf %04x $mdtidx)
18070 if [ -z $param ]; then
18071 lctl get_param -n mdc.*$mdt*.stats
18073 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
18078 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18079 skip "Need MDS version at least 2.10.55"
18081 local dom=$DIR/$tdir/dom
18083 mkdir -p $DIR/$tdir
18085 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18087 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18088 local facet=mds$((mdtidx + 1))
18090 cancel_lru_locks mdc
18091 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
18092 createmany -o $dom 1000
18093 lctl set_param -n mdc.*.stats=clear
18094 smalliomany -w $dom 1000 200
18095 get_mdc_stats $mdtidx
18096 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18097 # Each file has 1 open, 1 IO enqueues, total 2000
18098 # but now we have also +1 getxattr for security.capability, total 3000
18099 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
18100 unlinkmany $dom 1000
18102 cancel_lru_locks mdc
18103 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
18104 createmany -o $dom 1000
18105 lctl set_param -n mdc.*.stats=clear
18106 smalliomany -w $dom 1000 200
18107 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18108 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
18109 # for OPEN and IO lock.
18110 [ $((enq - enq_2)) -ge 1000 ] ||
18111 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
18112 unlinkmany $dom 1000
18115 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
18117 cleanup_271def_tests() {
18123 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18124 skip "Need MDS version at least 2.10.57"
18126 local dom=$DIR/$tdir/dom
18127 local tmp=$TMP/$tfile
18128 trap "cleanup_271def_tests $tmp" EXIT
18130 mkdir -p $DIR/$tdir
18132 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18134 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18136 cancel_lru_locks mdc
18137 dd if=/dev/urandom of=$tmp bs=1000 count=1
18138 dd if=$tmp of=$dom bs=1000 count=1
18139 cancel_lru_locks mdc
18141 cat /etc/hosts >> $tmp
18142 lctl set_param -n mdc.*.stats=clear
18144 # append data to the same file it should update local page
18145 echo "Append to the same page"
18146 cat /etc/hosts >> $dom
18147 local num=$(get_mdc_stats $mdtidx ost_read)
18148 local ra=$(get_mdc_stats $mdtidx req_active)
18149 local rw=$(get_mdc_stats $mdtidx req_waittime)
18151 [ -z $num ] || error "$num READ RPC occured"
18152 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18156 cmp $tmp $dom || error "file miscompare"
18158 cancel_lru_locks mdc
18159 lctl set_param -n mdc.*.stats=clear
18161 echo "Open and read file"
18162 cat $dom > /dev/null
18163 local num=$(get_mdc_stats $mdtidx ost_read)
18164 local ra=$(get_mdc_stats $mdtidx req_active)
18165 local rw=$(get_mdc_stats $mdtidx req_waittime)
18167 [ -z $num ] || error "$num READ RPC occured"
18168 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18172 cmp $tmp $dom || error "file miscompare"
18176 run_test 271d "DoM: read on open (1K file in reply buffer)"
18179 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18180 skip "Need MDS version at least 2.10.57"
18182 local dom=$DIR/$tdir/dom
18183 local tmp=$TMP/$tfile
18184 trap "cleanup_271def_tests $tmp" EXIT
18186 mkdir -p $DIR/$tdir
18188 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18190 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18192 cancel_lru_locks mdc
18193 dd if=/dev/urandom of=$tmp bs=200000 count=1
18194 dd if=$tmp of=$dom bs=200000 count=1
18195 cancel_lru_locks mdc
18196 cat /etc/hosts >> $tmp
18197 lctl set_param -n mdc.*.stats=clear
18199 echo "Append to the same page"
18200 cat /etc/hosts >> $dom
18201 local num=$(get_mdc_stats $mdtidx ost_read)
18202 local ra=$(get_mdc_stats $mdtidx req_active)
18203 local rw=$(get_mdc_stats $mdtidx req_waittime)
18205 [ -z $num ] || error "$num READ RPC occured"
18206 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18210 cmp $tmp $dom || error "file miscompare"
18212 cancel_lru_locks mdc
18213 lctl set_param -n mdc.*.stats=clear
18215 echo "Open and read file"
18216 cat $dom > /dev/null
18217 local num=$(get_mdc_stats $mdtidx ost_read)
18218 local ra=$(get_mdc_stats $mdtidx req_active)
18219 local rw=$(get_mdc_stats $mdtidx req_waittime)
18221 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
18222 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18226 cmp $tmp $dom || error "file miscompare"
18230 run_test 271f "DoM: read on open (200K file and read tail)"
18233 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
18234 skip "Skipping due to old client or server version"
18236 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
18238 $CHECKSTAT -t file $DIR1/$tfile
18240 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
18243 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
18244 $LCTL set_param fail_loc=0x80000314
18245 rm $DIR1/$tfile || error "Unlink fails"
18247 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
18248 [ $RC -eq 0 ] || error "Failed write to stale object"
18250 run_test 271g "Discard DoM data vs client flush race"
18253 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18254 skip "Need MDS version at least 2.11.50"
18256 local dom=$DIR/$tdir/dom
18257 mkdir -p $DIR/$tdir
18259 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
18260 dd if=/dev/urandom of=$dom bs=512K count=1 ||
18261 error "failed to write data into $dom"
18262 local old_md5=$(md5sum $dom)
18264 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
18265 error "failed to migrate to the same DoM component"
18267 local new_md5=$(md5sum $dom)
18269 [ "$old_md5" == "$new_md5" ] ||
18270 error "md5sum differ: $old_md5, $new_md5"
18272 [ $($LFS getstripe -c $dom) -eq 2 ] ||
18273 error "migrate stripe count bad: $(LFS getstripe -c $dom) != 2"
18275 run_test 272a "DoM migration: new layout with the same DOM component"
18278 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18279 skip "Need MDS version at least 2.11.50"
18281 local dom=$DIR/$tdir/dom
18282 mkdir -p $DIR/$tdir
18283 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18285 local mdtidx=$($LFS getstripe -m $dom)
18286 local mdtname=MDT$(printf %04x $mdtidx)
18287 local facet=mds$((mdtidx + 1))
18289 local mdtfree1=$(do_facet $facet \
18290 lctl get_param -n osd*.*$mdtname.kbytesfree)
18291 dd if=/dev/urandom of=$dom bs=2M count=1 ||
18292 error "failed to write data into $dom"
18293 local old_md5=$(md5sum $dom)
18294 cancel_lru_locks mdc
18295 local mdtfree1=$(do_facet $facet \
18296 lctl get_param -n osd*.*$mdtname.kbytesfree)
18298 $LFS migrate -c2 $dom ||
18299 error "failed to migrate to the new composite layout"
18300 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18301 error "MDT stripe was not removed"
18303 cancel_lru_locks mdc
18304 local new_md5=$(md5sum $dom)
18305 [ "$old_md5" != "$new_md5" ] &&
18306 error "$old_md5 != $new_md5"
18308 # Skip free space checks with ZFS
18309 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18310 local mdtfree2=$(do_facet $facet \
18311 lctl get_param -n osd*.*$mdtname.kbytesfree)
18312 [ $mdtfree2 -gt $mdtfree1 ] ||
18313 error "MDT space is not freed after migration"
18317 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
18320 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18321 skip "Need MDS version at least 2.11.50"
18323 local dom=$DIR/$tdir/$tfile
18324 mkdir -p $DIR/$tdir
18325 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18327 local mdtidx=$($LFS getstripe -m $dom)
18328 local mdtname=MDT$(printf %04x $mdtidx)
18329 local facet=mds$((mdtidx + 1))
18331 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18332 error "failed to write data into $dom"
18333 local old_md5=$(md5sum $dom)
18334 cancel_lru_locks mdc
18335 local mdtfree1=$(do_facet $facet \
18336 lctl get_param -n osd*.*$mdtname.kbytesfree)
18338 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18339 error "failed to migrate to the new composite layout"
18340 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18341 error "MDT stripe was not removed"
18343 cancel_lru_locks mdc
18344 local new_md5=$(md5sum $dom)
18345 [ "$old_md5" != "$new_md5" ] &&
18346 error "$old_md5 != $new_md5"
18348 # Skip free space checks with ZFS
18349 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18350 local mdtfree2=$(do_facet $facet \
18351 lctl get_param -n osd*.*$mdtname.kbytesfree)
18352 [ $mdtfree2 -gt $mdtfree1 ] ||
18353 error "MDS space is not freed after migration"
18357 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18360 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18361 skip "Need MDS version at least 2.11.50"
18363 # Layout swap cannot be done if either file has DOM component,
18364 # this will never be supported, migration should be used instead
18366 local dom=$DIR/$tdir/$tfile
18367 mkdir -p $DIR/$tdir
18369 $LFS setstripe -c2 ${dom}_plain
18370 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18371 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18372 error "can swap layout with DoM component"
18373 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18374 error "can swap layout with DoM component"
18376 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18377 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18378 error "can swap layout with DoM component"
18379 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18380 error "can swap layout with DoM component"
18383 run_test 273a "DoM: layout swapping should fail with DOM"
18386 remote_ost_nodsh && skip "remote OST with nodsh"
18387 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18388 skip "Need OST version >= 2.10.57"
18390 local file=$DIR/$tfile
18393 oss=$(comma_list $(osts_nodes))
18395 dd if=/dev/urandom of=$file bs=1M count=2 ||
18396 error "failed to create a file"
18397 cancel_lru_locks osc
18400 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18401 error "failed to read a file"
18403 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
18404 $LCTL set_param fail_loc=0x8000031f
18406 cancel_lru_locks osc &
18409 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
18410 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
18411 #IO takes another lock, but matches the PENDING one
18412 #and places it to the IO RPC
18413 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18414 error "failed to read a file with PENDING lock"
18416 run_test 275 "Read on a canceled duplicate lock"
18419 remote_ost_nodsh && skip "remote OST with nodsh"
18422 do_facet ost1 "(while true; do \
18423 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
18424 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
18427 for LOOP in $(seq 20); do
18429 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
18432 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
18433 rm $TMP/sanity_276_pid"
18435 run_test 276 "Race between mount and obd_statfs"
18438 $LCTL set_param ldlm.namespaces.*.lru_size=0
18439 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
18440 local cached_mb=$($LCTL get_param llite.*.max_cached_mb |
18441 grep ^used_mb | awk '{print $2}')
18442 [ $cached_mb -eq 1 ] || error "expected mb 1 got $cached_mb"
18443 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 \
18444 oflag=direct conv=notrunc
18445 cached_mb=$($LCTL get_param llite.*.max_cached_mb |
18446 grep ^used_mb | awk '{print $2}')
18447 [ $cached_mb -eq 0 ] || error "expected mb 0 got $cached_mb"
18449 run_test 277 "Direct IO shall drop page cache"
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 $LFS 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 ] || [ $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 ] ||
18746 [ $stripe_index -eq $default_index ] ||
18747 error "$stripe_index != $default_index for $dir"
18749 #check default stripe
18750 stripe_count=$($LFS getdirstripe -D -c $dir)
18751 [ $stripe_count -eq $default_count ] ||
18752 error "default count $default_count != $stripe_count for $dir"
18754 stripe_index=$($LFS getdirstripe -D -i $dir)
18755 [ $stripe_index -eq $default_index ] ||
18756 error "default index $default_index != $stripe_index for $dir"
18758 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
18762 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18763 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18764 skip "Need MDS version at least 2.7.55"
18771 mkdir $DIR/$tdir/normal_dir
18773 #Checking when client cache stripe index
18774 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
18775 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
18776 error "create striped_dir failed"
18778 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
18779 error "create dir0 fails"
18780 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
18781 [ $stripe_index -eq 0 ] ||
18782 error "dir0 expect index 0 got $stripe_index"
18784 mkdir $DIR/$tdir/striped_dir/dir1 ||
18785 error "create dir1 fails"
18786 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
18787 [ $stripe_index -eq 1 ] ||
18788 error "dir1 expect index 1 got $stripe_index"
18790 #check default stripe count/stripe index
18791 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
18792 test_300_check_default_striped_dir normal_dir 1 0
18793 test_300_check_default_striped_dir normal_dir 2 1
18794 test_300_check_default_striped_dir normal_dir 2 -1
18796 #delete default stripe information
18797 echo "delete default stripeEA"
18798 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
18799 error "set default stripe on striped dir error"
18801 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
18802 for dir in $(find $DIR/$tdir/normal_dir/*); do
18803 stripe_count=$($LFS getdirstripe -c $dir)
18804 [ $stripe_count -eq 0 ] ||
18805 error "expect 1 get $stripe_count for $dir"
18806 stripe_index=$($LFS getdirstripe -i $dir)
18807 [ $stripe_index -eq 0 ] ||
18808 error "expect 0 get $stripe_index for $dir"
18811 run_test 300g "check default striped directory for normal directory"
18814 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18815 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18816 skip "Need MDS version at least 2.7.55"
18822 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18823 error "set striped dir error"
18825 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
18826 test_300_check_default_striped_dir striped_dir 1 0
18827 test_300_check_default_striped_dir striped_dir 2 1
18828 test_300_check_default_striped_dir striped_dir 2 -1
18830 #delete default stripe information
18831 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
18832 error "set default stripe on striped dir error"
18834 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
18835 for dir in $(find $DIR/$tdir/striped_dir/*); do
18836 stripe_count=$($LFS getdirstripe -c $dir)
18837 [ $stripe_count -eq 0 ] ||
18838 error "expect 1 get $stripe_count for $dir"
18841 run_test 300h "check default striped directory for striped directory"
18844 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18845 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18846 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18847 skip "Need MDS version at least 2.7.55"
18854 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18855 error "set striped dir error"
18857 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18858 error "create files under striped dir failed"
18860 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
18861 error "set striped hashdir error"
18863 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
18864 error "create dir0 under hash dir failed"
18865 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
18866 error "create dir1 under hash dir failed"
18868 # unfortunately, we need to umount to clear dir layout cache for now
18869 # once we fully implement dir layout, we can drop this
18870 umount_client $MOUNT || error "umount failed"
18871 mount_client $MOUNT || error "mount failed"
18873 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
18874 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
18875 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
18877 #set the stripe to be unknown hash type
18878 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
18879 $LCTL set_param fail_loc=0x1901
18880 for ((i = 0; i < 10; i++)); do
18881 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
18882 error "stat f-$i failed"
18883 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
18886 touch $DIR/$tdir/striped_dir/f0 &&
18887 error "create under striped dir with unknown hash should fail"
18889 $LCTL set_param fail_loc=0
18891 umount_client $MOUNT || error "umount failed"
18892 mount_client $MOUNT || error "mount failed"
18896 run_test 300i "client handle unknown hash type striped directory"
18899 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18900 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18901 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18902 skip "Need MDS version at least 2.7.55"
18909 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
18910 $LCTL set_param fail_loc=0x1702
18911 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18912 error "set striped dir error"
18914 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18915 error "create files under striped dir failed"
18917 $LCTL set_param fail_loc=0
18919 rm -rf $DIR/$tdir || error "unlink striped dir fails"
18923 run_test 300j "test large update record"
18926 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18927 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18928 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18929 skip "Need MDS version at least 2.7.55"
18931 # this test needs a huge transaction
18933 kb=$(do_facet $SINGLEMDS lctl get_param -n osd*.lustre-MDT0000.kbytestotal)
18934 [ $kb -lt $((1024*1024)) ] && skip "too small mds: $kb"
18941 #define OBD_FAIL_LARGE_STRIPE 0x1703
18942 $LCTL set_param fail_loc=0x1703
18943 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
18944 error "set striped dir error"
18945 $LCTL set_param fail_loc=0
18947 $LFS getdirstripe $DIR/$tdir/striped_dir ||
18948 error "getstripeddir fails"
18949 rm -rf $DIR/$tdir/striped_dir ||
18950 error "unlink striped dir fails"
18954 run_test 300k "test large striped directory"
18957 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18958 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18959 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18960 skip "Need MDS version at least 2.7.55"
18964 test_mkdir -p $DIR/$tdir/striped_dir
18965 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
18966 error "chown $RUNAS_ID failed"
18967 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
18968 error "set default striped dir failed"
18970 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
18971 $LCTL set_param fail_loc=0x80000158
18972 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
18974 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
18975 [ $stripe_index -eq 1 ] ||
18976 error "expect 1 get $stripe_index for $dir"
18978 run_test 300l "non-root user to create dir under striped dir with stale layout"
18981 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18982 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
18983 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18984 skip "Need MDS version at least 2.7.55"
18986 mkdir -p $DIR/$tdir/striped_dir
18987 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
18988 error "set default stripes dir error"
18990 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
18992 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
18993 [ $stripe_count -eq 0 ] ||
18994 error "expect 0 get $stripe_count for a"
18996 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
18997 error "set default stripes dir error"
18999 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
19001 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
19002 [ $stripe_count -eq 0 ] ||
19003 error "expect 0 get $stripe_count for b"
19005 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
19006 error "set default stripes dir error"
19008 mkdir $DIR/$tdir/striped_dir/c &&
19009 error "default stripe_index is invalid, mkdir c should fails"
19011 rm -rf $DIR/$tdir || error "rmdir fails"
19013 run_test 300m "setstriped directory on single MDT FS"
19016 local list=$(comma_list $(mdts_nodes))
19019 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19023 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19024 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19025 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19026 skip "Need MDS version at least 2.7.55"
19027 remote_mds_nodsh && skip "remote MDS with nodsh"
19030 local list=$(comma_list $(mdts_nodes))
19032 trap cleanup_300n RETURN EXIT
19033 mkdir -p $DIR/$tdir
19034 chmod 777 $DIR/$tdir
19035 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
19036 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19037 error "create striped dir succeeds with gid=0"
19039 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19040 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
19041 error "create striped dir fails with gid=-1"
19043 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19044 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
19045 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19046 error "set default striped dir succeeds with gid=0"
19049 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19050 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
19051 error "set default striped dir fails with gid=-1"
19054 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19055 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
19056 error "create test_dir fails"
19057 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
19058 error "create test_dir1 fails"
19059 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
19060 error "create test_dir2 fails"
19063 run_test 300n "non-root user to create dir under striped dir with default EA"
19066 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19067 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19068 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19069 skip "Need MDS version at least 2.7.55"
19074 mkdir -p $DIR/$tdir
19076 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
19077 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
19078 if [ $numfree1 -lt 66000 ] || [ $numfree2 -lt 66000 ]; then
19079 skip "not enough free inodes $numfree1 $numfree2"
19082 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
19083 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
19084 if [ $numfree1 -lt 300000 ] || [ $numfree2 -lt 300000 ]; then
19085 skip "not enough free space $numfree1 $numfree2"
19088 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
19089 error "setdirstripe fails"
19091 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
19092 error "create dirs fails"
19094 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
19095 ls $DIR/$tdir/striped_dir > /dev/null ||
19096 error "ls striped dir fails"
19097 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
19098 error "unlink big striped dir fails"
19100 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
19103 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19104 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19105 remote_mds_nodsh && skip "remote MDS with nodsh"
19107 mkdir -p $DIR/$tdir
19109 #define OBD_FAIL_OUT_ENOSPC 0x1704
19110 do_facet mds2 lctl set_param fail_loc=0x80001704
19111 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
19112 && error "create striped directory should fail"
19114 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
19116 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
19119 run_test 300p "create striped directory without space"
19122 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19123 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19125 local fd=$(free_fd)
19126 local cmd="exec $fd<$tdir"
19128 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
19131 trap "eval $cmd" EXIT
19132 cd $tdir || error "cd $tdir fails"
19133 rmdir ../$tdir || error "rmdir $tdir fails"
19134 mkdir local_dir && error "create dir succeeds"
19135 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
19139 run_test 300q "create remote directory under orphan directory"
19142 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
19143 skip "Need MDS version at least 2.7.55" && return
19144 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19148 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
19149 error "set striped dir error"
19151 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19152 error "getstripeddir fails"
19155 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
19156 awk '/lmv_stripe_count:/ { print $2 }')
19158 [ $MDSCOUNT -ne $stripe_count ] &&
19159 error "wrong stripe count $stripe_count expected $MDSCOUNT"
19161 rm -rf $DIR/$tdir/striped_dir ||
19162 error "unlink striped dir fails"
19164 run_test 300r "test -1 striped directory"
19166 prepare_remote_file() {
19167 mkdir $DIR/$tdir/src_dir ||
19168 error "create remote source failed"
19170 cp /etc/hosts $DIR/$tdir/src_dir/a ||
19171 error "cp to remote source failed"
19172 touch $DIR/$tdir/src_dir/a
19174 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
19175 error "create remote target dir failed"
19177 touch $DIR/$tdir/tgt_dir/b
19179 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
19180 error "rename dir cross MDT failed!"
19182 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
19183 error "src_child still exists after rename"
19185 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
19186 error "missing file(a) after rename"
19188 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
19189 error "diff after rename"
19193 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19194 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19196 local remote_file=$DIR/$tdir/tgt_dir/b
19198 mkdir -p $DIR/$tdir
19200 prepare_remote_file || error "prepare remote file failed"
19203 $OPENUNLINK $remote_file $remote_file ||
19204 error "openunlink $remote_file failed"
19205 $CHECKSTAT -a $remote_file || error "$remote_file exists"
19207 run_test 310a "open unlink remote file"
19210 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19211 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19213 local remote_file=$DIR/$tdir/tgt_dir/b
19215 mkdir -p $DIR/$tdir
19217 prepare_remote_file || error "prepare remote file failed"
19219 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19220 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
19221 $CHECKSTAT -t file $remote_file || error "check file failed"
19223 run_test 310b "unlink remote file with multiple links while open"
19226 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19227 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
19229 local remote_file=$DIR/$tdir/tgt_dir/b
19231 mkdir -p $DIR/$tdir
19233 prepare_remote_file || error "prepare remote file failed"
19235 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19236 multiop_bg_pause $remote_file O_uc ||
19237 error "mulitop failed for remote file"
19239 $MULTIOP $DIR/$tfile Ouc
19240 kill -USR1 $MULTIPID
19243 run_test 310c "open-unlink remote file with multiple links"
19247 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19248 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19249 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
19250 skip "lustre < 2.8.54 does not contain LU-4825 fix"
19251 remote_mds_nodsh && skip "remote MDS with nodsh"
19253 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19254 local mdts=$(comma_list $(mdts_nodes))
19256 mkdir -p $DIR/$tdir
19257 $LFS setstripe -i 0 -c 1 $DIR/$tdir
19258 createmany -o $DIR/$tdir/$tfile. 1000
19260 # statfs data is not real time, let's just calculate it
19261 old_iused=$((old_iused + 1000))
19263 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19264 osp.*OST0000*MDT0000.create_count")
19265 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19266 osp.*OST0000*MDT0000.max_create_count")
19267 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
19269 $LFS setstripe -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
19270 local index=$($LFS getstripe -i $DIR/$tdir/$tfile)
19271 [ $index -ne 0 ] || error "$tfile stripe index is 0"
19273 unlinkmany $DIR/$tdir/$tfile. 1000
19275 do_nodes $mdts "$LCTL set_param -n \
19276 osp.*OST0000*.max_create_count=$max_count"
19277 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
19278 do_nodes $mdts "$LCTL set_param -n \
19279 osp.*OST0000*.create_count=$count"
19280 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
19281 grep "=0" && error "create_count is zero"
19284 for i in $(seq 120); do
19285 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19286 # system may be too busy to destroy all objs in time, use
19287 # a somewhat small value to not fail autotest
19288 [ $((old_iused - new_iused)) -gt 400 ] && break
19292 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
19293 [ $((old_iused - new_iused)) -gt 400 ] ||
19294 error "objs not destroyed after unlink"
19296 run_test 311 "disable OSP precreate, and unlink should destroy objs"
19303 local vdevdir=$(dirname $(facet_vdevice $ost))
19304 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
19305 local zfs_zapid=$(do_facet $ost $cmd |
19306 grep -w "/O/0/d$((objid%32))" -C 5 |
19307 awk '/Object/{getline; print $1}')
19308 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
19309 awk "/$objid = /"'{printf $3}')
19314 zfs_object_blksz() {
19318 local vdevdir=$(dirname $(facet_vdevice $ost))
19319 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
19320 local blksz=$(do_facet $ost $cmd $objid |
19321 awk '/dblk/{getline; printf $4}')
19323 case "${blksz: -1}" in
19324 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
19325 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
19332 test_312() { # LU-4856
19333 remote_ost_nodsh && skip "remote OST with nodsh"
19334 [ "$ost1_FSTYPE" = "zfs" ] ||
19335 skip_env "the test only applies to zfs"
19337 local max_blksz=$(do_facet ost1 \
19338 $ZFS get -p recordsize $(facet_device ost1) |
19339 awk '!/VALUE/{print $3}')
19341 # to make life a little bit easier
19342 $LFS mkdir -c 1 -i 0 $DIR/$tdir
19343 $LFS setstripe -c 1 -i 0 $DIR/$tdir
19345 local tf=$DIR/$tdir/$tfile
19347 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19349 # Get ZFS object id
19350 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19351 # block size change by sequential overwrite
19354 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
19355 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
19357 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
19358 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19362 # block size change by sequential append write
19363 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19364 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19365 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19368 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19369 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19370 oflag=sync conv=notrunc
19372 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19373 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19374 error "blksz error, actual $blksz, " \
19375 "expected: 2 * $count * $PAGE_SIZE"
19381 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19382 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19384 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
19385 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19386 [ $blksz -eq $PAGE_SIZE ] ||
19387 error "blksz error: $blksz, expected: $PAGE_SIZE"
19389 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
19390 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19391 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
19393 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
19394 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19395 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
19397 run_test 312 "make sure ZFS adjusts its block size by write pattern"
19400 remote_ost_nodsh && skip "remote OST with nodsh"
19402 local file=$DIR/$tfile
19405 $LFS setstripe -c 1 -i 0 $file || error "setstripe failed"
19407 # define OBD_FAIL_TGT_RCVD_EIO 0x720
19408 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19409 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
19410 error "write should failed"
19411 do_facet ost1 "$LCTL set_param fail_loc=0"
19414 run_test 313 "io should fail after last_rcvd update fail"
19417 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19419 $LFS setstripe -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
19420 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19422 wait_delete_completed
19423 do_facet ost1 "$LCTL set_param fail_loc=0"
19425 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
19427 test_315() { # LU-618
19428 [ -f /proc/$$/io ] || skip_env "no IO accounting in kernel"
19430 local file=$DIR/$tfile
19433 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
19434 error "multiop file write failed"
19435 $MULTIOP $file oO_RDONLY:r4063232_c &
19440 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
19443 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
19446 run_test 315 "read should be accounted"
19449 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19450 large_xattr_enabled || skip_env "ea_inode feature disabled"
19452 rm -rf $DIR/$tdir/d
19453 mkdir -p $DIR/$tdir/d
19454 chown nobody $DIR/$tdir/d
19455 touch $DIR/$tdir/d/file
19457 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
19459 run_test 316 "lfs mv"
19462 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
19463 skip "Need MDS version at least 2.11.53"
19464 if [ "$ost1_FSTYPE" == "zfs" ]; then
19465 skip "LU-10370: no implementation for ZFS"
19469 local grant_blk_size
19471 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
19472 awk '/grant_block_size:/ { print $2; exit; }')
19474 # Create File of size 5M. Truncate it to below size's and verify
19477 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
19478 error "Create file $DIR/$tfile failed"
19479 stack_trap "rm -f $DIR/$tfile" EXIT
19481 for trunc_sz in 2097152 4097 4000 509 0; do
19482 $TRUNCATE $DIR/$tfile $trunc_sz ||
19483 error "truncate $tfile to $trunc_sz failed"
19484 local sz=$(stat --format=%s $DIR/$tfile)
19485 local blk=$(stat --format=%b $DIR/$tfile)
19486 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
19487 grant_blk_size) * 8))
19489 if [[ $blk -ne $trunc_blk ]]; then
19490 $(which stat) $DIR/$tfile
19491 error "Expected Block $trunc_blk got $blk for $tfile"
19494 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19495 error "Expected Size $trunc_sz got $sz for $tfile"
19500 # Create file with a hole and write actual two blocks. Block count
19503 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
19504 conv=fsync || error "Create file : $DIR/$tfile"
19506 # Calculate the final truncate size.
19507 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
19510 # truncate to size $trunc_sz bytes. Strip the last block
19511 # The block count must drop to 8
19513 $TRUNCATE $DIR/$tfile $trunc_sz ||
19514 error "truncate $tfile to $trunc_sz failed"
19516 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
19517 sz=$(stat --format=%s $DIR/$tfile)
19518 blk=$(stat --format=%b $DIR/$tfile)
19520 if [[ $blk -ne $trunc_bsz ]]; then
19521 $(which stat) $DIR/$tfile
19522 error "Expected Block $trunc_bsz got $blk for $tfile"
19525 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19526 error "Expected Size $trunc_sz got $sz for $tfile"
19528 run_test 317 "Verify blocks get correctly update after truncate"
19531 local old_max_active=$($LCTL get_param -n \
19532 llite.*.max_read_ahead_async_active 2>/dev/null)
19534 $LCTL set_param llite.*.max_read_ahead_async_active=256
19535 local max_active=$($LCTL get_param -n \
19536 llite.*.max_read_ahead_async_active 2>/dev/null)
19537 [ $max_active -ne 256 ] && error "expected 256 but got $max_active"
19539 # currently reset to 0 is unsupported, leave it 512 for now.
19540 $LCTL set_param llite.*.max_read_ahead_async_active=0 &&
19541 error "set max_read_ahead_async_active should fail"
19543 $LCTL set_param llite.*.max_read_ahead_async_active=512
19544 max_active=$($LCTL get_param -n \
19545 llite.*.max_read_ahead_async_active 2>/dev/null)
19546 [ $max_active -eq 512 ] || error "expected 512 but got $max_active"
19548 # restore @max_active
19549 [ $old_max_active -ne 0 ] && $LCTL set_param \
19550 llite.*.max_read_ahead_async_active=$old_max_active
19552 local old_threshold=$($LCTL get_param -n \
19553 llite.*.read_ahead_async_file_threshold_mb 2>/dev/null)
19554 local max_per_file_mb=$($LCTL get_param -n \
19555 llite.*.max_read_ahead_per_file_mb 2>/dev/null)
19557 local invalid=$(($max_per_file_mb + 1))
19559 llite.*.read_ahead_async_file_threshold_mb=$invalid\
19560 && error "set $invalid should fail"
19562 local valid=$(($invalid - 1))
19564 llite.*.read_ahead_async_file_threshold_mb=$valid ||
19565 error "set $valid should succeed"
19566 local threshold=$($LCTL get_param -n \
19567 llite.*.read_ahead_async_file_threshold_mb 2>/dev/null)
19568 [ $threshold -eq $valid ] || error \
19569 "expect threshold $valid got $threshold"
19571 llite.*.read_ahead_async_file_threshold_mb=$old_threshold
19573 run_test 318 "Verify async readahead tunables"
19576 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
19578 local before=$(date +%s)
19580 local mdir=$DIR/$tdir
19581 local file=$mdir/xxx
19583 $LFS mkdir -i0 $mdir || error "mkdir $mdir fails"
19586 #define OBD_FAIL_LDLM_LOCAL_CANCEL_PAUSE 0x32c
19587 $LCTL set_param fail_val=5 fail_loc=0x8000032c
19588 $LFS mv -m1 $file &
19591 dd if=$file of=/dev/null
19593 evict=$($LCTL get_param mdc.$FSNAME-MDT*.state |
19594 awk -F"[ [,]" '/EVICTED ]$/ { if (mx<$5) {mx=$5;} } END { print mx }')
19596 [ -z "$evict" ] || [[ $evict -le $before ]] || error "eviction happened"
19598 run_test 319 "lost lease lock on migrate error"
19601 local read_write=$1
19602 if [ "$read_write" = "write" ]; then
19603 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
19604 elif [ "$read_write" = "read" ]; then
19605 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
19607 error "argument error"
19610 # turn off debug for performance testing
19611 local saved_debug=$($LCTL get_param -n debug)
19612 $LCTL set_param debug=0
19614 $LFS setstripe -c 1 -i 0 $DIR/$tfile
19616 # get ost1 size - lustre-OST0000
19617 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
19618 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
19619 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
19621 if [ "$read_write" = "read" ]; then
19622 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
19625 local start_time=$(date +%s.%N)
19626 $dd_cmd bs=1M count=$blocks oflag=sync ||
19627 error "real dd $read_write error"
19628 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
19630 if [ "$read_write" = "write" ]; then
19634 # define OBD_FAIL_OST_FAKE_RW 0x238
19635 do_facet ost1 $LCTL set_param fail_loc=0x238
19637 local start_time=$(date +%s.%N)
19638 $dd_cmd bs=1M count=$blocks oflag=sync ||
19639 error "fake dd $read_write error"
19640 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
19642 if [ "$read_write" = "write" ]; then
19644 cancel_lru_locks osc
19645 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
19646 error "$tfile size not $blocks MB"
19648 do_facet ost1 $LCTL set_param fail_loc=0
19650 echo "fake $read_write $duration_fake vs. normal $read_write" \
19651 "$duration in seconds"
19652 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
19653 error_not_in_vm "fake write is slower"
19655 $LCTL set_param -n debug="$saved_debug"
19658 test_399a() { # LU-7655 for OST fake write
19659 remote_ost_nodsh && skip "remote OST with nodsh"
19663 run_test 399a "fake write should not be slower than normal write"
19665 test_399b() { # LU-8726 for OST fake read
19666 remote_ost_nodsh && skip "remote OST with nodsh"
19667 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
19668 skip_env "ldiskfs only test"
19673 run_test 399b "fake read should not be slower than normal read"
19675 test_400a() { # LU-1606, was conf-sanity test_74
19676 if ! which $CC > /dev/null 2>&1; then
19677 skip_env "$CC is not installed"
19680 local extra_flags=''
19681 local out=$TMP/$tfile
19682 local prefix=/usr/include/lustre
19685 if ! [[ -d $prefix ]]; then
19686 # Assume we're running in tree and fixup the include path.
19687 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
19688 extra_flags+=" -L$LUSTRE/utils/.lib"
19691 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
19692 $CC -Wall -Werror $extra_flags -o $out $prog -llustreapi ||
19693 error "client api broken"
19697 run_test 400a "Lustre client api program can compile and link"
19699 test_400b() { # LU-1606, LU-5011
19701 local out=$TMP/$tfile
19702 local prefix=/usr/include/linux/lustre
19704 # We use a hard coded prefix so that this test will not fail
19705 # when run in tree. There are headers in lustre/include/lustre/
19706 # that are not packaged (like lustre_idl.h) and have more
19707 # complicated include dependencies (like config.h and lnet/types.h).
19708 # Since this test about correct packaging we just skip them when
19709 # they don't exist (see below) rather than try to fixup cppflags.
19711 if ! which $CC > /dev/null 2>&1; then
19712 skip_env "$CC is not installed"
19715 for header in $prefix/*.h; do
19716 if ! [[ -f "$header" ]]; then
19720 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
19721 continue # lustre_ioctl.h is internal header
19724 $CC -Wall -Werror -include $header -c -x c /dev/null -o $out ||
19725 error "cannot compile '$header'"
19729 run_test 400b "packaged headers can be compiled"
19731 test_401a() { #LU-7437
19732 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
19733 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
19735 #count the number of parameters by "list_param -R"
19736 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
19737 #count the number of parameters by listing proc files
19738 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
19739 echo "proc_dirs='$proc_dirs'"
19740 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
19741 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
19744 [ $params -eq $procs ] ||
19745 error "found $params parameters vs. $procs proc files"
19747 # test the list_param -D option only returns directories
19748 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
19749 #count the number of parameters by listing proc directories
19750 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
19753 [ $params -eq $procs ] ||
19754 error "found $params parameters vs. $procs proc files"
19756 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
19759 local save=$($LCTL get_param -n jobid_var)
19762 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
19763 error "no error returned when setting bad parameters"
19765 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
19766 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
19768 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
19769 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
19770 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
19772 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
19775 local jobid_var_old=$($LCTL get_param -n jobid_var)
19776 local jobid_var_new
19778 $LCTL set_param jobid_var= &&
19779 error "no error returned for 'set_param a='"
19781 jobid_var_new=$($LCTL get_param -n jobid_var)
19782 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19783 error "jobid_var was changed by setting without value"
19785 $LCTL set_param jobid_var &&
19786 error "no error returned for 'set_param a'"
19788 jobid_var_new=$($LCTL get_param -n jobid_var)
19789 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19790 error "jobid_var was changed by setting without value"
19792 run_test 401c "Verify 'lctl set_param' without value fails in either format."
19795 local jobid_var_old=$($LCTL get_param -n jobid_var)
19796 local jobid_var_new
19797 local new_value="foo=bar"
19799 $LCTL set_param jobid_var=$new_value ||
19800 error "'set_param a=b' did not accept a value containing '='"
19802 jobid_var_new=$($LCTL get_param -n jobid_var)
19803 [[ "$jobid_var_new" == "$new_value" ]] ||
19804 error "'set_param a=b' failed on a value containing '='"
19806 # Reset the jobid_var to test the other format
19807 $LCTL set_param jobid_var=$jobid_var_old
19808 jobid_var_new=$($LCTL get_param -n jobid_var)
19809 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19810 error "failed to reset jobid_var"
19812 $LCTL set_param jobid_var $new_value ||
19813 error "'set_param a b' did not accept a value containing '='"
19815 jobid_var_new=$($LCTL get_param -n jobid_var)
19816 [[ "$jobid_var_new" == "$new_value" ]] ||
19817 error "'set_param a b' failed on a value containing '='"
19819 $LCTL set_param jobid_var $jobid_var_old
19820 jobid_var_new=$($LCTL get_param -n jobid_var)
19821 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19822 error "failed to reset jobid_var"
19824 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
19827 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
19828 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
19829 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
19830 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
19831 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
19832 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
19833 remote_mds_nodsh && skip "remote MDS with nodsh"
19835 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
19836 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
19837 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
19838 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
19839 echo "Touch failed - OK"
19841 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
19844 local file1=$DIR/$tfile.1
19845 local file2=$DIR/$tfile.2
19846 local tfile=$TMP/$tfile
19848 rm -f $file1 $file2 $tfile
19853 # 30 sec OBD_TIMEOUT in ll_getattr()
19854 # right before populating st_nlink
19855 $LCTL set_param fail_loc=0x80001409
19856 stat -c %h $file1 > $tfile &
19858 # create an alias, drop all locks and reclaim the dentry
19860 cancel_lru_locks mdc
19861 cancel_lru_locks osc
19862 sysctl -w vm.drop_caches=2
19866 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
19868 rm -f $tfile $file1 $file2
19870 run_test 403 "i_nlink should not drop to zero due to aliasing"
19872 test_404() { # LU-6601
19873 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
19874 skip "Need server version newer than 2.8.52"
19875 remote_mds_nodsh && skip "remote MDS with nodsh"
19877 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
19878 awk '/osp .*-osc-MDT/ { print $4}')
19881 for osp in $mosps; do
19882 echo "Deactivate: " $osp
19883 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
19884 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19885 awk -vp=$osp '$4 == p { print $2 }')
19886 [ $stat = IN ] || {
19887 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19888 error "deactivate error"
19890 echo "Activate: " $osp
19891 do_facet $SINGLEMDS $LCTL --device %$osp activate
19892 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19893 awk -vp=$osp '$4 == p { print $2 }')
19894 [ $stat = UP ] || {
19895 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
19896 error "activate error"
19900 run_test 404 "validate manual {de}activated works properly for OSPs"
19903 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
19904 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] ||
19905 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
19906 skip "Layout swap lock is not supported"
19908 check_swap_layouts_support
19910 test_mkdir $DIR/$tdir
19911 swap_lock_test -d $DIR/$tdir ||
19912 error "One layout swap locked test failed"
19914 run_test 405 "Various layout swap lock tests"
19917 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19918 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
19919 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
19920 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19921 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
19922 skip "Need MDS version at least 2.8.50"
19924 local def_stripe_size=$($LFS getstripe -S $MOUNT)
19925 local test_pool=$TESTNAME
19927 if ! combined_mgs_mds ; then
19930 pool_add $test_pool || error "pool_add failed"
19931 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
19932 error "pool_add_targets failed"
19934 save_layout_restore_at_exit $MOUNT
19936 # parent set default stripe count only, child will stripe from both
19937 # parent and fs default
19938 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
19939 error "setstripe $MOUNT failed"
19940 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
19941 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
19942 for i in $(seq 10); do
19943 local f=$DIR/$tdir/$tfile.$i
19944 touch $f || error "touch failed"
19945 local count=$($LFS getstripe -c $f)
19946 [ $count -eq $OSTCOUNT ] ||
19947 error "$f stripe count $count != $OSTCOUNT"
19948 local offset=$($LFS getstripe -i $f)
19949 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
19950 local size=$($LFS getstripe -S $f)
19951 [ $size -eq $((def_stripe_size * 2)) ] ||
19952 error "$f stripe size $size != $((def_stripe_size * 2))"
19953 local pool=$($LFS getstripe -p $f)
19954 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
19957 # change fs default striping, delete parent default striping, now child
19958 # will stripe from new fs default striping only
19959 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
19960 error "change $MOUNT default stripe failed"
19961 $LFS setstripe -c 0 $DIR/$tdir ||
19962 error "delete $tdir default stripe failed"
19963 for i in $(seq 11 20); do
19964 local f=$DIR/$tdir/$tfile.$i
19965 touch $f || error "touch $f failed"
19966 local count=$($LFS getstripe -c $f)
19967 [ $count -eq 1 ] || error "$f stripe count $count != 1"
19968 local offset=$($LFS getstripe -i $f)
19969 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
19970 local size=$($LFS getstripe -S $f)
19971 [ $size -eq $def_stripe_size ] ||
19972 error "$f stripe size $size != $def_stripe_size"
19973 local pool=$($LFS getstripe -p $f)
19974 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
19977 unlinkmany $DIR/$tdir/$tfile. 1 20
19979 local f=$DIR/$tdir/$tfile
19980 pool_remove_all_targets $test_pool $f
19981 pool_remove $test_pool $f
19983 if ! combined_mgs_mds ; then
19987 run_test 406 "DNE support fs default striping"
19990 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19991 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
19992 skip "Need MDS version at least 2.8.55"
19993 remote_mds_nodsh && skip "remote MDS with nodsh"
19995 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
19996 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
19997 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
19998 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
19999 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
20001 #define OBD_FAIL_DT_TXN_STOP 0x2019
20002 for idx in $(seq $MDSCOUNT); do
20003 do_facet mds$idx "lctl set_param fail_loc=0x2019"
20005 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
20006 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
20007 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
20010 run_test 407 "transaction fail should cause operation fail"
20013 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
20015 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
20016 lctl set_param fail_loc=0x8000040a
20017 # let ll_prepare_partial_page() fail
20018 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
20022 # create at least 100 unused inodes so that
20023 # shrink_icache_memory(0) should not return 0
20024 touch $DIR/$tfile-{0..100}
20025 rm -f $DIR/$tfile-{0..100}
20028 echo 2 > /proc/sys/vm/drop_caches
20030 run_test 408 "drop_caches should not hang due to page leaks"
20034 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20036 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
20037 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
20038 touch $DIR/$tdir/guard || error "(2) Fail to create"
20040 local PREFIX=$(str_repeat 'A' 128)
20041 echo "Create 1K hard links start at $(date)"
20042 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20043 error "(3) Fail to hard link"
20045 echo "Links count should be right although linkEA overflow"
20046 stat $DIR/$tdir/guard || error "(4) Fail to stat"
20047 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
20048 [ $linkcount -eq 1001 ] ||
20049 error "(5) Unexpected hard links count: $linkcount"
20051 echo "List all links start at $(date)"
20052 ls -l $DIR/$tdir/foo > /dev/null ||
20053 error "(6) Fail to list $DIR/$tdir/foo"
20055 echo "Unlink hard links start at $(date)"
20056 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20057 error "(7) Fail to unlink"
20058 echo "Unlink hard links finished at $(date)"
20060 run_test 409 "Large amount of cross-MDTs hard links on the same file"
20064 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
20065 skip "Need client version at least 2.9.59"
20067 # Create a file, and stat it from the kernel
20068 local testfile=$DIR/$tfile
20071 local run_id=$RANDOM
20072 local my_ino=$(stat --format "%i" $testfile)
20074 # Try to insert the module. This will always fail as the
20075 # module is designed to not be inserted.
20076 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
20079 # Anything but success is a test failure
20081 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
20082 error "no inode match"
20084 run_test 410 "Test inode number returned from kernel thread"
20086 cleanup_test411_cgroup() {
20092 local cg_basedir=/sys/fs/cgroup/memory
20094 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
20095 skip "no setup for cgroup"
20097 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
20098 error "test file creation failed"
20099 cancel_lru_locks osc
20101 # Create a very small memory cgroup to force a slab allocation error
20102 local cgdir=$cg_basedir/osc_slab_alloc
20103 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
20104 trap "cleanup_test411_cgroup $cgdir" EXIT
20105 echo 2M > $cgdir/memory.kmem.limit_in_bytes
20106 echo 1M > $cgdir/memory.limit_in_bytes
20108 # Should not LBUG, just be killed by oom-killer
20109 # dd will return 0 even allocation failure in some environment.
20110 # So don't check return value
20111 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
20112 cleanup_test411_cgroup $cgdir
20116 run_test 411 "Slab allocation error with cgroup does not LBUG"
20119 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20120 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20121 skip "Need server version at least 2.10.55"
20124 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
20125 error "mkdir failed"
20126 $LFS getdirstripe $DIR/$tdir
20127 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
20128 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
20129 error "expect $((MDSCOUT - 1)) get $stripe_index"
20130 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
20131 [ $stripe_count -eq 2 ] ||
20132 error "expect 2 get $stripe_count"
20134 run_test 412 "mkdir on specific MDTs"
20137 [ $MDSCOUNT -lt 2 ] &&
20138 skip "We need at least 2 MDTs for this test"
20140 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20141 skip "Need server version at least 2.10.55"
20144 mkdir $DIR/$tdir || error "mkdir failed"
20146 # find MDT that is the most full
20147 local max=$($LFS df | grep MDT |
20156 END { split(b, c, ":")
20161 for i in $(seq $((MDSCOUNT - 1))); do
20162 $LFS mkdir -c $i $DIR/$tdir/d$i ||
20163 error "mkdir d$i failed"
20164 $LFS getdirstripe $DIR/$tdir/d$i
20165 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
20166 [ $stripe_index -ne $max ] ||
20167 error "don't expect $max"
20170 run_test 413a "mkdir on less full MDTs"
20173 [ $MDSCOUNT -lt 2 ] &&
20174 skip "We need at least 2 MDTs for this test"
20176 [ $MDS1_VERSION -lt $(version_code 2.12.52) ] &&
20177 skip "Need server version at least 2.12.52"
20179 mkdir $DIR/$tdir || error "mkdir failed"
20180 $LFS setdirstripe -D -i -1 -H space $DIR/$tdir ||
20181 error "setdirstripe failed"
20183 local qos_prio_free
20184 local qos_threshold_rr
20187 qos_prio_free=$($LCTL get_param -n lmv.*.qos_prio_free | head -n1)
20188 qos_prio_free=${qos_prio_free%%%}
20189 qos_threshold_rr=$($LCTL get_param -n lmv.*.qos_threshold_rr | head -n1)
20190 qos_threshold_rr=${qos_threshold_rr%%%}
20191 qos_maxage=$($LCTL get_param -n lmv.*.qos_maxage)
20193 stack_trap "$LCTL set_param lmv.*.qos_prio_free=$qos_prio_free" EXIT
20194 stack_trap "$LCTL set_param lmv.*.qos_threshold_rr=$qos_threshold_rr" \
20196 stack_trap "$LCTL set_param lmv.*.qos_maxage=$qos_maxage" EXIT
20198 echo "mkdir with roundrobin"
20200 $LCTL set_param lmv.*.qos_threshold_rr=100
20201 for i in $(seq $((100 * MDSCOUNT))); do
20202 mkdir $DIR/$tdir/subdir$i || error "mkdir subdir$i failed"
20204 for i in $(seq $MDSCOUNT); do
20205 count=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$((i - 1))$ |
20207 echo "$count directories created on MDT$((i - 1))"
20208 [ $count -eq 100 ] || error "subdirs are not evenly distributed"
20211 rm -rf $DIR/$tdir/*
20213 $LCTL set_param lmv.*.qos_threshold_rr=$qos_threshold_rr
20214 # Shorten statfs result age, so that it can be updated in time
20215 $LCTL set_param lmv.*.qos_maxage=1
20224 ffree=($(lctl get_param -n mdc.*[mM][dD][cC]-[^M]*.filesfree | uniq))
20225 echo "MDT filesfree available: ${ffree[@]}"
20230 for ((i = 0; i < ${#ffree[@]}; i++)); do
20231 if [[ ${ffree[i]} -gt $max ]]; then
20235 if [[ ${ffree[i]} -lt $min ]]; then
20240 echo "Min free files: MDT$min_index: $min"
20241 echo "Max free files: MDT$max_index: $max"
20243 [ $min -eq 0 ] && skip "no free files in MDT$min_index"
20244 [ $min -gt 10000000 ] && skip "too much free files in MDT$min_index"
20246 # Check if we need to generate uneven MDTs
20247 test_mkdir -i $min_index -c 1 -p $DIR/$tdir-MDT$min_index
20249 local diff=$((max - min))
20250 local diff2=$((diff * 100 / min))
20252 echo -n "Check for uneven MDTs: "
20253 echo -n "diff=$diff files ($diff2%) must be > $threshold% ..."
20255 if [ $diff2 -gt $threshold ]; then
20257 echo "Don't need to fill MDT$min_index"
20259 # generate uneven MDTs, create till 25% diff
20261 diff2=$((threshold - diff2))
20262 diff=$((min * diff2 / 100))
20263 # 50 sec per 10000 files in vm
20264 [ $diff -gt 40000 ] && [ "$SLOW" = "no" ] &&
20265 skip "$diff files to create"
20266 echo "Fill $diff2% diff in MDT$min_index with $diff files"
20268 local value="$(generate_string 1024)"
20269 for i in $(seq $diff); do
20270 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE \
20271 $DIR/$tdir-MDT$min_index/f$i > /dev/null ||
20272 error "create f$i failed"
20273 setfattr -n user.413b -v $value \
20274 $DIR/$tdir-MDT$min_index/f$i ||
20275 error "setfattr f$i failed"
20279 min=$((100 *MDSCOUNT))
20282 echo "mkdir with balanced space usage"
20283 $LCTL set_param lmv.*.qos_prio_free=100
20284 for i in $(seq $((100 * MDSCOUNT))); do
20285 mkdir $DIR/$tdir/subdir$i || error "mkdir subdir$i failed"
20287 for i in $(seq $MDSCOUNT); do
20288 count=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$((i - 1))$ |
20290 echo "$count directories created on MDT$((i - 1))"
20291 [ $min -gt $count ] && min=$count
20292 [ $max -lt $count ] && max=$count
20294 [ $((max - min)) -gt $MDSCOUNT ] ||
20295 error "subdirs shouldn't be evenly distributed"
20297 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
20299 $LFS setdirstripe -D -d $DIR/$tdir || error "setdirstripe -d failed"
20300 getfattr -n trusted.dmv $DIR/$tdir && error "default dir layout exists"
20303 run_test 413b "mkdir with balanced space usage"
20306 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
20307 $LCTL set_param fail_loc=0x80000521
20308 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
20311 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
20314 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20315 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
20316 skip "Need server version at least 2.11.52"
20326 # this test may be slow on ZFS
20327 [ "$mds1_FSTYPE" == "zfs" ] && total=100
20329 # though this test is designed for striped directory, let's test normal
20330 # directory too since lock is always saved as CoS lock.
20331 test_mkdir $DIR/$tdir || error "mkdir $tdir"
20332 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
20341 start_time=$(date +%s)
20342 for i in $(seq $total); do
20343 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
20346 end_time=$(date +%s)
20347 duration=$((end_time - start_time))
20349 kill -9 $setattr_pid
20351 echo "rename $total files took $duration sec"
20352 [ $duration -lt 100 ] || error "rename took $duration sec"
20354 run_test 415 "lock revoke is not missing"
20357 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
20358 skip "Need server version at least 2.11.55"
20360 # define OBD_FAIL_OSD_TXN_START 0x19a
20361 do_facet mds1 lctl set_param fail_loc=0x19a
20363 lfs mkdir -c $MDSCOUNT $DIR/$tdir
20367 run_test 416 "transaction start failure won't cause system hung"
20371 do_nodes $(comma_list $(mdts_nodes)) \
20372 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
20373 do_nodes $(comma_list $(mdts_nodes)) \
20374 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
20375 do_nodes $(comma_list $(mdts_nodes)) \
20376 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
20380 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20381 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
20382 skip "Need MDS version at least 2.11.56"
20384 trap cleanup_417 RETURN EXIT
20386 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
20387 do_nodes $(comma_list $(mdts_nodes)) \
20388 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
20389 $LFS migrate -m 0 $DIR/$tdir.1 &&
20390 error "migrate dir $tdir.1 should fail"
20392 do_nodes $(comma_list $(mdts_nodes)) \
20393 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
20394 $LFS mkdir -i 1 $DIR/$tdir.2 &&
20395 error "create remote dir $tdir.2 should fail"
20397 do_nodes $(comma_list $(mdts_nodes)) \
20398 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
20399 $LFS mkdir -c 2 $DIR/$tdir.3 &&
20400 error "create striped dir $tdir.3 should fail"
20403 run_test 417 "disable remote dir, striped dir and dir migration"
20405 # Checks that the outputs of df [-i] and lfs df [-i] match
20407 # usage: check_lfs_df <blocks | inodes> <mountpoint>
20417 [ "$1" == "blocks" ] && inodes= || inodes="-i"
20419 for count in {1..100}; do
20423 # read the lines of interest
20424 df_out=($(df -P $inodes $dir | tail -n +2)) ||
20425 error "df $inodes $dir | tail -n +2 failed"
20426 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
20427 error "lfs df $inodes $dir | grep summary: failed"
20429 # skip first substrings of each output as they are different
20430 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
20431 # compare the two outputs
20433 for i in {1..5}; do
20434 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
20442 lfs df $inodes $dir
20443 error "df and lfs df $1 output mismatch: " \
20444 "df ${inodes}: ${df_out[*]}, " \
20445 "lfs df ${inodes}: ${lfs_df_out[*]}"
20450 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20452 local dir=$DIR/$tdir
20453 local numfiles=$((RANDOM % 4096 + 2))
20454 local numblocks=$((RANDOM % 256 + 1))
20456 wait_delete_completed
20459 # check block output
20460 check_lfs_df blocks $dir
20461 # check inode output
20462 check_lfs_df inodes $dir
20464 # create a single file and retest
20465 echo "Creating a single file and testing"
20466 createmany -o $dir/$tfile- 1 &>/dev/null ||
20467 error "creating 1 file in $dir failed"
20468 check_lfs_df blocks $dir
20469 check_lfs_df inodes $dir
20471 # create a random number of files
20472 echo "Creating $((numfiles - 1)) files and testing"
20473 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
20474 error "creating $((numfiles - 1)) files in $dir failed"
20476 # write a random number of blocks to the first test file
20477 echo "Writing $numblocks 4K blocks and testing"
20478 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
20479 count=$numblocks &>/dev/null ||
20480 error "dd to $dir/${tfile}-0 failed"
20483 check_lfs_df blocks $dir
20484 check_lfs_df inodes $dir
20486 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
20487 error "unlinking $numfiles files in $dir failed"
20489 run_test 418 "df and lfs df outputs match"
20493 local dir=$DIR/$tdir
20498 cancel_lru_locks mdc
20500 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
20501 $LCTL set_param fail_loc=0x1410
20503 $LCTL set_param fail_loc=0
20506 run_test 419 "Verify open file by name doesn't crash kernel"
20510 [[ $MDS1_VERSION -ge $(version_code 2.12.53) ]] ||
20511 skip "Need MDS version at least 2.12.53"
20513 local SAVE_UMASK=$(umask)
20514 local dir=$DIR/$tdir
20515 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
20519 mkdir -m03777 $dir/testdir
20520 ls -dn $dir/testdir
20521 # Need to remove trailing '.' when SELinux is enabled
20522 local dirperms=$(ls -dn $dir/testdir |
20523 awk '{ sub(/\.$/, "", $1); print $1}')
20524 [ $dirperms == "drwxrwsrwt" ] ||
20525 error "incorrect perms on $dir/testdir"
20527 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
20528 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
20529 ls -n $dir/testdir/testfile
20530 local fileperms=$(ls -n $dir/testdir/testfile |
20531 awk '{ sub(/\.$/, "", $1); print $1}')
20532 [ $fileperms == "-rwxr-xr-x" ] ||
20533 error "incorrect perms on $dir/testdir/testfile"
20537 run_test 420 "clear SGID bit on non-directories for non-members"
20544 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20545 skip "Need MDS version at least 2.12.54"
20547 test_mkdir $DIR/$tdir
20548 createmany -o $DIR/$tdir/f 3
20549 cnt=$(ls -1 $DIR/$tdir | wc -l)
20550 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20552 fid1=$(lfs path2fid $DIR/$tdir/f1)
20553 fid2=$(lfs path2fid $DIR/$tdir/f2)
20554 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
20556 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
20557 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
20559 cnt=$(ls -1 $DIR/$tdir | wc -l)
20560 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20562 rm -f $DIR/$tdir/f3 || error "can't remove f3"
20563 createmany -o $DIR/$tdir/f 3
20564 cnt=$(ls -1 $DIR/$tdir | wc -l)
20565 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20567 fid1=$(lfs path2fid $DIR/$tdir/f1)
20568 fid2=$(lfs path2fid $DIR/$tdir/f2)
20569 echo "remove using fsname $FSNAME"
20570 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
20572 cnt=$(ls -1 $DIR/$tdir | wc -l)
20573 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20575 run_test 421a "simple rm by fid"
20582 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20583 skip "Need MDS version at least 2.12.54"
20585 test_mkdir $DIR/$tdir
20586 createmany -o $DIR/$tdir/f 3
20587 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
20590 FID1=$(lfs path2fid $DIR/$tdir/f1)
20591 FID2=$(lfs path2fid $DIR/$tdir/f2)
20592 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
20594 kill -USR1 $MULTIPID
20597 cnt=$(ls $DIR/$tdir | wc -l)
20598 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
20600 run_test 421b "rm by fid on open file"
20606 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20607 skip "Need MDS version at least 2.12.54"
20609 test_mkdir $DIR/$tdir
20610 createmany -o $DIR/$tdir/f 3
20611 touch $DIR/$tdir/$tfile
20612 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
20613 cnt=$(ls -1 $DIR/$tdir | wc -l)
20614 [ $cnt != 184 ] && error "unexpected #files: $cnt"
20616 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
20617 $LFS rmfid $DIR $FID1 || error "rmfid failed"
20619 cnt=$(ls $DIR/$tdir | wc -l)
20620 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
20622 run_test 421c "rm by fid against hardlinked files"
20628 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20629 skip "Need MDS version at least 2.12.54"
20631 test_mkdir $DIR/$tdir
20632 createmany -o $DIR/$tdir/f 4097
20633 cnt=$(ls -1 $DIR/$tdir | wc -l)
20634 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
20636 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
20637 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20639 cnt=$(ls $DIR/$tdir | wc -l)
20641 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20643 run_test 421d "rmfid en masse"
20649 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20650 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20651 skip "Need MDS version at least 2.12.54"
20653 mkdir -p $DIR/$tdir
20654 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20655 createmany -o $DIR/$tdir/striped_dir/f 512
20656 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20657 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20659 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20660 sed "s/[/][^:]*://g")
20661 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20663 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20665 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20667 run_test 421e "rmfid in DNE"
20673 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20674 skip "Need MDS version at least 2.12.54"
20676 test_mkdir $DIR/$tdir
20678 cnt=$(ls -1 $DIR/$tdir | wc -l)
20679 [ $cnt != 1 ] && error "unexpected #files: $cnt"
20681 FID=$(lfs path2fid $DIR/$tdir/f)
20682 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
20683 # rmfid should fail
20684 cnt=$(ls -1 $DIR/$tdir | wc -l)
20685 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
20687 chmod a+rw $DIR/$tdir
20689 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
20690 # rmfid should fail
20691 cnt=$(ls -1 $DIR/$tdir | wc -l)
20692 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
20695 $RUNAS touch $DIR/$tdir/f
20696 FID=$(lfs path2fid $DIR/$tdir/f)
20697 echo "rmfid as root"
20698 $LFS rmfid $DIR $FID || error "rmfid as root failed"
20699 cnt=$(ls -1 $DIR/$tdir | wc -l)
20700 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
20703 $RUNAS touch $DIR/$tdir/f
20704 cnt=$(ls -1 $DIR/$tdir | wc -l)
20705 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
20706 FID=$(lfs path2fid $DIR/$tdir/f)
20707 # rmfid w/o user_fid2path mount option should fail
20708 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
20709 cnt=$(ls -1 $DIR/$tdir | wc -l)
20710 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
20712 umount_client $MOUNT || "failed to umount client"
20713 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
20714 "failed to mount client'"
20716 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
20717 # rmfid should succeed
20718 cnt=$(ls -1 $DIR/$tdir | wc -l)
20719 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
20721 # rmfid shouldn't allow to remove files due to dir's permission
20722 chmod a+rwx $DIR/$tdir
20725 FID=$(lfs path2fid $DIR/$tdir/f)
20726 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
20728 umount_client $MOUNT || "failed to umount client"
20729 mount_client $MOUNT "$MOUNT_OPTS" ||
20730 "failed to mount client'"
20733 run_test 421f "rmfid checks permissions"
20739 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20740 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20741 skip "Need MDS version at least 2.12.54"
20743 mkdir -p $DIR/$tdir
20744 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20745 createmany -o $DIR/$tdir/striped_dir/f 512
20746 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20747 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20749 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20750 sed "s/[/][^:]*://g")
20752 rm -f $DIR/$tdir/striped_dir/f1*
20753 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20754 removed=$((512 - cnt))
20756 # few files have been just removed, so we expect
20757 # rmfid to fail on their fids
20758 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
20759 [ $removed != $errors ] && error "$errors != $removed"
20761 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20763 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20765 run_test 421g "rmfid to return errors properly"
20768 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20769 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20770 skip "Need server version at least 2.9.55"
20772 start_full_debug_logging
20776 stop_full_debug_logging
20780 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20781 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20782 awk '/The barrier for/ { print $7 }')
20785 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
20790 barrier_expired() {
20793 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20794 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20795 awk '/will be expired/ { print $7 }')
20797 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
20806 echo "Start barrier_freeze at: $(date)"
20807 #define OBD_FAIL_BARRIER_DELAY 0x2202
20808 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20809 # Do not reduce barrier time - See LU-11873
20810 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
20813 local b_status=$(barrier_stat)
20814 echo "Got barrier status at: $(date)"
20815 [ "$b_status" = "'freezing_p1'" ] ||
20816 error "(1) unexpected barrier status $b_status"
20818 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20820 b_status=$(barrier_stat)
20821 [ "$b_status" = "'frozen'" ] ||
20822 error "(2) unexpected barrier status $b_status"
20824 local expired=$(barrier_expired)
20825 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
20826 sleep $((expired + 3))
20828 b_status=$(barrier_stat)
20829 [ "$b_status" = "'expired'" ] ||
20830 error "(3) unexpected barrier status $b_status"
20832 # Do not reduce barrier time - See LU-11873
20833 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
20834 error "(4) fail to freeze barrier"
20836 b_status=$(barrier_stat)
20837 [ "$b_status" = "'frozen'" ] ||
20838 error "(5) unexpected barrier status $b_status"
20840 echo "Start barrier_thaw at: $(date)"
20841 #define OBD_FAIL_BARRIER_DELAY 0x2202
20842 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20843 do_facet mgs $LCTL barrier_thaw $FSNAME &
20846 b_status=$(barrier_stat)
20847 echo "Got barrier status at: $(date)"
20848 [ "$b_status" = "'thawing'" ] ||
20849 error "(6) unexpected barrier status $b_status"
20851 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20853 b_status=$(barrier_stat)
20854 [ "$b_status" = "'thawed'" ] ||
20855 error "(7) unexpected barrier status $b_status"
20857 #define OBD_FAIL_BARRIER_FAILURE 0x2203
20858 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
20859 do_facet mgs $LCTL barrier_freeze $FSNAME
20861 b_status=$(barrier_stat)
20862 [ "$b_status" = "'failed'" ] ||
20863 error "(8) unexpected barrier status $b_status"
20865 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
20866 do_facet mgs $LCTL barrier_thaw $FSNAME
20870 run_test 801a "write barrier user interfaces and stat machine"
20875 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20876 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
20877 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
20878 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
20879 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
20881 cancel_lru_locks mdc
20883 # 180 seconds should be long enough
20884 do_facet mgs $LCTL barrier_freeze $FSNAME 180
20886 local b_status=$(barrier_stat)
20887 [ "$b_status" = "'frozen'" ] ||
20888 error "(6) unexpected barrier status $b_status"
20890 mkdir $DIR/$tdir/d0/d10 &
20893 touch $DIR/$tdir/d1/f13 &
20896 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
20899 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
20902 rm -f $DIR/$tdir/d4/f12 &
20905 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
20907 # To guarantee taht the 'stat' is not blocked
20908 b_status=$(barrier_stat)
20909 [ "$b_status" = "'frozen'" ] ||
20910 error "(8) unexpected barrier status $b_status"
20912 # let above commands to run at background
20915 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
20916 ps -p $touch_pid || error "(10) touch should be blocked"
20917 ps -p $ln_pid || error "(11) link should be blocked"
20918 ps -p $mv_pid || error "(12) rename should be blocked"
20919 ps -p $rm_pid || error "(13) unlink should be blocked"
20921 b_status=$(barrier_stat)
20922 [ "$b_status" = "'frozen'" ] ||
20923 error "(14) unexpected barrier status $b_status"
20925 do_facet mgs $LCTL barrier_thaw $FSNAME
20926 b_status=$(barrier_stat)
20927 [ "$b_status" = "'thawed'" ] ||
20928 error "(15) unexpected barrier status $b_status"
20930 wait $mkdir_pid || error "(16) mkdir should succeed"
20931 wait $touch_pid || error "(17) touch should succeed"
20932 wait $ln_pid || error "(18) link should succeed"
20933 wait $mv_pid || error "(19) rename should succeed"
20934 wait $rm_pid || error "(20) unlink should succeed"
20938 run_test 801b "modification will be blocked by write barrier"
20941 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
20945 stop mds2 || error "(1) Fail to stop mds2"
20947 do_facet mgs $LCTL barrier_freeze $FSNAME 30
20949 local b_status=$(barrier_stat)
20950 [ "$b_status" = "'expired'" ] || [ "$b_status" = "'failed'" ] || {
20951 do_facet mgs $LCTL barrier_thaw $FSNAME
20952 error "(2) unexpected barrier status $b_status"
20955 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20956 error "(3) Fail to rescan barrier bitmap"
20958 # Do not reduce barrier time - See LU-11873
20959 do_facet mgs $LCTL barrier_freeze $FSNAME 20
20961 b_status=$(barrier_stat)
20962 [ "$b_status" = "'frozen'" ] ||
20963 error "(4) unexpected barrier status $b_status"
20965 do_facet mgs $LCTL barrier_thaw $FSNAME
20966 b_status=$(barrier_stat)
20967 [ "$b_status" = "'thawed'" ] ||
20968 error "(5) unexpected barrier status $b_status"
20970 local devname=$(mdsdevname 2)
20972 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
20974 do_facet mgs $LCTL barrier_rescan $FSNAME ||
20975 error "(7) Fail to rescan barrier bitmap"
20979 run_test 801c "rescan barrier bitmap"
20981 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
20982 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
20983 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
20984 saved_MOUNT_OPTS=$MOUNT_OPTS
20990 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
20991 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
20992 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
20993 MOUNT_OPTS=$saved_MOUNT_OPTS
20999 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
21000 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
21001 skip "Need server version at least 2.9.55"
21003 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
21005 mkdir $DIR/$tdir || error "(1) fail to mkdir"
21007 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
21008 error "(2) Fail to copy"
21010 trap cleanup_802a EXIT
21012 # sync by force before remount as readonly
21013 sync; sync_all_data; sleep 3; sync_all_data
21017 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
21018 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
21019 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
21021 echo "Mount the server as read only"
21022 setupall server_only || error "(3) Fail to start servers"
21024 echo "Mount client without ro should fail"
21025 mount_client $MOUNT &&
21026 error "(4) Mount client without 'ro' should fail"
21028 echo "Mount client with ro should succeed"
21029 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
21030 mount_client $MOUNT ||
21031 error "(5) Mount client with 'ro' should succeed"
21033 echo "Modify should be refused"
21034 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
21036 echo "Read should be allowed"
21037 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
21038 error "(7) Read should succeed under ro mode"
21042 run_test 802a "simulate readonly device"
21045 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21046 remote_mds_nodsh && skip "remote MDS with nodsh"
21048 do_facet $SINGLEMDS $LCTL get_param mdt.*.readonly ||
21049 skip "readonly option not available"
21051 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "(1) fail to mkdir"
21053 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
21054 error "(2) Fail to copy"
21056 # write back all cached data before setting MDT to readonly
21060 do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=1
21061 stack_trap "do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=0" EXIT
21063 echo "Modify should be refused"
21064 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
21066 echo "Read should be allowed"
21067 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
21068 error "(7) Read should succeed under ro mode"
21071 do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=0
21073 run_test 802b "be able to set MDTs to readonly"
21076 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21077 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
21078 skip "MDS needs to be newer than 2.10.54"
21080 mkdir -p $DIR/$tdir
21081 # Create some objects on all MDTs to trigger related logs objects
21082 for idx in $(seq $MDSCOUNT); do
21083 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
21084 $DIR/$tdir/dir${idx} ||
21085 error "Fail to create $DIR/$tdir/dir${idx}"
21089 wait_delete_completed # ensure old test cleanups are finished
21090 echo "before create:"
21092 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21094 for i in {1..10}; do
21095 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
21096 error "Fail to create $DIR/$tdir/foo$i"
21100 echo "after create:"
21102 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21104 # allow for an llog to be cleaned up during the test
21105 [ $after_used -ge $((before_used + 10 - 1)) ] ||
21106 error "before ($before_used) + 10 > after ($after_used)"
21108 for i in {1..10}; do
21109 rm -rf $DIR/$tdir/foo$i ||
21110 error "Fail to remove $DIR/$tdir/foo$i"
21113 sleep 3 # avoid MDT return cached statfs
21114 wait_delete_completed
21115 echo "after unlink:"
21117 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21119 # allow for an llog to be created during the test
21120 [ $after_used -le $((before_used + 1)) ] ||
21121 error "after ($after_used) > before ($before_used) + 1"
21123 run_test 803 "verify agent object for remote object"
21126 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21127 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
21128 skip "MDS needs to be newer than 2.10.54"
21129 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
21131 mkdir -p $DIR/$tdir
21132 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
21133 error "Fail to create $DIR/$tdir/dir0"
21135 local fid=$($LFS path2fid $DIR/$tdir/dir0)
21136 local dev=$(mdsdevname 2)
21138 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21139 grep ${fid} || error "NOT found agent entry for dir0"
21141 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
21142 error "Fail to create $DIR/$tdir/dir1"
21144 touch $DIR/$tdir/dir1/foo0 ||
21145 error "Fail to create $DIR/$tdir/dir1/foo0"
21146 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
21149 for idx in $(seq $MDSCOUNT); do
21150 dev=$(mdsdevname $idx)
21151 do_facet mds${idx} \
21152 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21153 grep ${fid} && rc=$idx
21156 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
21157 error "Fail to rename foo0 to foo1"
21158 if [ $rc -eq 0 ]; then
21159 for idx in $(seq $MDSCOUNT); do
21160 dev=$(mdsdevname $idx)
21161 do_facet mds${idx} \
21162 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21163 grep ${fid} && rc=$idx
21167 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
21168 error "Fail to rename foo1 to foo2"
21169 if [ $rc -eq 0 ]; then
21170 for idx in $(seq $MDSCOUNT); do
21171 dev=$(mdsdevname $idx)
21172 do_facet mds${idx} \
21173 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21174 grep ${fid} && rc=$idx
21178 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
21180 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
21181 error "Fail to link to $DIR/$tdir/dir1/foo2"
21182 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
21183 error "Fail to rename foo2 to foo0"
21184 unlink $DIR/$tdir/dir1/foo0 ||
21185 error "Fail to unlink $DIR/$tdir/dir1/foo0"
21186 rm -rf $DIR/$tdir/dir0 ||
21187 error "Fail to rm $DIR/$tdir/dir0"
21189 for idx in $(seq $MDSCOUNT); do
21190 dev=$(mdsdevname $idx)
21194 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
21196 start mds${idx} $dev $MDS_MOUNT_OPTS ||
21197 error "mount mds$idx failed"
21198 df $MOUNT > /dev/null 2>&1
21200 # e2fsck should not return error
21202 error "e2fsck detected error on MDT${idx}: rc=$rc"
21205 run_test 804 "verify agent entry for remote entry"
21208 do_facet $SINGLEMDS zfs set quota=$old $fsset
21209 unlinkmany $DIR/$tdir/f- 1000000
21214 local zfs_version=$(do_node $SINGLEMDS cat /sys/module/zfs/version)
21215 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
21216 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
21217 skip "netfree not implemented before 0.7"
21218 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
21219 skip "Need MDS version at least 2.10.57"
21226 local pref="osd-zfs.lustre-MDT0000."
21228 # limit available space on MDS dataset to meet nospace issue
21229 # quickly. then ZFS 0.7.2 can use reserved space if asked
21230 # properly (using netfree flag in osd_declare_destroy()
21231 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
21232 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
21234 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
21235 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
21236 let "usedkb=usedkb-freekb"
21237 let "freekb=freekb/2"
21238 if let "freekb > 5000"; then
21241 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
21242 trap cleanup_805 EXIT
21244 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
21245 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
21246 rm -rf $DIR/$tdir || error "not able to remove"
21247 do_facet $SINGLEMDS zfs set quota=$old $fsset
21250 run_test 805 "ZFS can remove from full fs"
21256 local size=$($LFS getsom -s $file)
21257 local expect=$(stat -c %s $file)
21259 [[ $size == $expect ]] ||
21260 error "$file expected size: $expect, got: $size"
21262 local blocks=$($LFS getsom -b $file)
21263 expect=$(stat -c %b $file)
21264 [[ $blocks == $expect ]] ||
21265 error "$file expected blocks: $expect, got: $blocks"
21270 local size=$($LFS getsom -s $1)
21273 [[ $size == $expect ]] ||
21274 error "$file expected size: $expect, got: $size"
21278 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21279 skip "Need MDS version at least 2.11.52"
21283 touch $DIR/$tfile || error "touch $tfile failed"
21285 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21286 save_lustre_params client "llite.*.xattr_cache" > $save
21287 lctl set_param llite.*.xattr_cache=0
21288 stack_trap "restore_lustre_params < $save; rm -f $save" EXIT
21290 # single-threaded write
21291 echo "Test SOM for single-threaded write"
21292 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
21293 error "write $tfile failed"
21294 check_lsom_size $DIR/$tfile $bs
21297 local size=$(($num * $bs))
21301 echo "Test SOM for single client multi-threaded($num) write"
21302 $TRUNCATE $DIR/$tfile 0
21303 for ((i = 0; i < $num; i++)); do
21304 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21306 offset=$((offset + $bs))
21308 for (( i=0; i < $num; i++ )); do
21311 check_lsom_size $DIR/$tfile $size
21313 $TRUNCATE $DIR/$tfile 0
21314 for ((i = 0; i < $num; i++)); do
21315 offset=$((offset - $bs))
21316 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21319 for (( i=0; i < $num; i++ )); do
21322 check_lsom_size $DIR/$tfile $size
21324 # multi-client wirtes
21325 num=$(get_node_count ${CLIENTS//,/ })
21326 size=$(($num * $bs))
21330 echo "Test SOM for multi-client ($num) writes"
21331 $TRUNCATE $DIR/$tfile 0
21332 for client in ${CLIENTS//,/ }; do
21333 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21336 offset=$((offset + $bs))
21338 for (( i=0; i < $num; i++ )); do
21341 check_lsom_size $DIR/$tfile $offset
21344 $TRUNCATE $DIR/$tfile 0
21345 for client in ${CLIENTS//,/ }; do
21346 offset=$((offset - $bs))
21347 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21351 for (( i=0; i < $num; i++ )); do
21354 check_lsom_size $DIR/$tfile $size
21357 echo "Test SOM for truncate"
21358 $TRUNCATE $DIR/$tfile 1048576
21359 check_lsom_size $DIR/$tfile 1048576
21360 $TRUNCATE $DIR/$tfile 1234
21361 check_lsom_size $DIR/$tfile 1234
21363 # verify SOM blocks count
21364 echo "Verify SOM block count"
21365 $TRUNCATE $DIR/$tfile 0
21366 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
21367 error "failed to write file $tfile"
21368 check_lsom_data $DIR/$tfile
21370 run_test 806 "Verify Lazy Size on MDS"
21373 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
21374 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21375 skip "Need MDS version at least 2.11.52"
21377 # Registration step
21378 changelog_register || error "changelog_register failed"
21379 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
21380 changelog_users $SINGLEMDS | grep -q $cl_user ||
21381 error "User $cl_user not found in changelog_users"
21383 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21384 save_lustre_params client "llite.*.xattr_cache" > $save
21385 lctl set_param llite.*.xattr_cache=0
21386 stack_trap "restore_lustre_params < $save; rm -f $save" EXIT
21388 rm -rf $DIR/$tdir || error "rm $tdir failed"
21389 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
21390 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
21391 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
21392 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
21393 error "truncate $tdir/trunc failed"
21396 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
21397 error "write $tfile failed"
21399 # multi-client wirtes
21400 local num=$(get_node_count ${CLIENTS//,/ })
21404 echo "Test SOM for multi-client ($num) writes"
21405 touch $DIR/$tfile || error "touch $tfile failed"
21406 $TRUNCATE $DIR/$tfile 0
21407 for client in ${CLIENTS//,/ }; do
21408 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21411 offset=$((offset + $bs))
21413 for (( i=0; i < $num; i++ )); do
21418 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
21419 check_lsom_data $DIR/$tdir/trunc
21420 check_lsom_data $DIR/$tdir/single_dd
21421 check_lsom_data $DIR/$tfile
21424 # Deregistration step
21425 changelog_deregister || error "changelog_deregister failed"
21427 run_test 807 "verify LSOM syncing tool"
21429 check_som_nologged()
21431 local lines=$($LFS changelog $FSNAME-MDT0000 |
21432 grep 'x=trusted.som' | wc -l)
21433 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
21437 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
21438 skip "Need MDS version at least 2.11.55"
21440 # Registration step
21441 changelog_register || error "changelog_register failed"
21443 touch $DIR/$tfile || error "touch $tfile failed"
21446 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
21447 error "write $tfile failed"
21450 $TRUNCATE $DIR/$tfile 1234
21453 $TRUNCATE $DIR/$tfile 1048576
21456 # Deregistration step
21457 changelog_deregister || error "changelog_deregister failed"
21459 run_test 808 "Check trusted.som xattr not logged in Changelogs"
21464 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
21468 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
21469 skip "Need MDS version at least 2.11.56"
21471 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
21472 error "failed to create DoM-only file $DIR/$tfile"
21473 touch $DIR/$tfile || error "touch $tfile failed"
21474 check_som_nodata $DIR/$tfile
21476 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
21477 error "write $tfile failed"
21478 check_som_nodata $DIR/$tfile
21480 $TRUNCATE $DIR/$tfile 1234
21481 check_som_nodata $DIR/$tfile
21483 $TRUNCATE $DIR/$tfile 4097
21484 check_som_nodata $DIR/$file
21486 run_test 809 "Verify no SOM xattr store for DoM-only files"
21492 # t10 seem to dislike partial pages
21493 lctl set_param osc.*.checksum_type=adler
21494 lctl set_param fail_loc=0x411
21495 dd if=/dev/urandom of=$DIR/$tfile bs=10240 count=2
21496 ORIG=$(md5sum $DIR/$tfile)
21497 lctl set_param ldlm.namespaces.*osc*.lru_size=clear
21498 CSUM=$(md5sum $DIR/$tfile)
21499 set_checksum_type adler
21500 if [ "$ORIG" != "$CSUM" ]; then
21501 error "$ORIG != $CSUM"
21504 run_test 810 "partial page writes on ZFS (LU-11663)"
21507 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
21508 skip "Need MDS version at least 2.11.56"
21510 #define OBD_FAIL_MDS_ORPHAN_DELETE 0x165
21511 do_facet mds1 $LCTL set_param fail_loc=0x165
21512 $MULTIOP $DIR/$tfile Ouc || error "multiop failed"
21515 start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
21518 [[ $(do_facet mds1 pgrep orph_.*-MDD | wc -l) -eq 0 ]] ||
21519 error "MDD orphan cleanup thread not quit"
21521 run_test 811 "orphan name stub can be cleaned up in startup"
21524 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
21525 skip "OST < 2.12.51 doesn't support this fail_loc"
21526 [ "$SHARED_KEY" = true ] &&
21527 skip "OSC connections never go IDLE with Shared-Keys enabled"
21529 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21530 # ensure ost1 is connected
21531 stat $DIR/$tfile >/dev/null || error "can't stat"
21532 wait_osc_import_state client ost1 FULL
21533 # no locks, no reqs to let the connection idle
21534 cancel_lru_locks osc
21536 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
21537 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
21538 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
21539 wait_osc_import_state client ost1 CONNECTING
21540 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
21542 stat $DIR/$tfile >/dev/null || error "can't stat file"
21544 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
21547 local file_heat_sav=$($LCTL get_param -n llite.*.file_heat 2>/dev/null)
21548 [ -z "$file_heat_sav" ] && skip "no file heat support"
21559 local period_second=$($LCTL get_param -n llite.*.heat_period_second)
21560 local decay_pct=$($LCTL get_param -n llite.*.heat_decay_percentage)
21562 $LCTL set_param -n llite.*.file_heat=1
21563 echo "Turn on file heat"
21564 echo "Period second: $period_second, Decay percentage: $decay_pct"
21566 echo "QQQQ" > $DIR/$tfile
21567 echo "QQQQ" > $DIR/$tfile
21568 echo "QQQQ" > $DIR/$tfile
21569 cat $DIR/$tfile > /dev/null
21570 cat $DIR/$tfile > /dev/null
21571 cat $DIR/$tfile > /dev/null
21572 cat $DIR/$tfile > /dev/null
21574 local out=$($LFS heat_get $DIR/$tfile)
21576 $LFS heat_get $DIR/$tfile
21577 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
21578 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
21579 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
21580 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
21582 [ $readsample -le 4 ] || error "read sample ($readsample) is wrong"
21583 [ $writesample -le 3 ] || error "write sample ($writesample) is wrong"
21584 [ $readbyte -le 20 ] || error "read bytes ($readbyte) is wrong"
21585 [ $writebyte -le 15 ] || error "write bytes ($writebyte) is wrong"
21587 sleep $((period_second + 3))
21588 echo "Sleep $((period_second + 3)) seconds..."
21589 # The recursion formula to calculate the heat of the file f is as
21591 # Hi+1(f) = (1-P)*Hi(f)+ P*Ci
21592 # Where Hi is the heat value in the period between time points i*I and
21593 # (i+1)*I; Ci is the access count in the period; the symbol P refers
21594 # to the weight of Ci.
21595 out=$($LFS heat_get $DIR/$tfile)
21596 $LFS heat_get $DIR/$tfile
21597 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
21598 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
21599 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
21600 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
21602 [ $(bc <<< "$readsample <= 4 * $decay_pct / 100") -eq 1 ] ||
21603 error "read sample ($readsample) is wrong"
21604 [ $(bc <<< "$writesample <= 3 * $decay_pct / 100") -eq 1 ] ||
21605 error "write sample ($writesample) is wrong"
21606 [ $(bc <<< "$readbyte <= 20 * $decay_pct / 100") -eq 1 ] ||
21607 error "read bytes ($readbyte) is wrong"
21608 [ $(bc <<< "$writebyte <= 15 * $decay_pct / 100") -eq 1 ] ||
21609 error "write bytes ($writebyte) is wrong"
21611 echo "QQQQ" > $DIR/$tfile
21612 echo "QQQQ" > $DIR/$tfile
21613 echo "QQQQ" > $DIR/$tfile
21614 cat $DIR/$tfile > /dev/null
21615 cat $DIR/$tfile > /dev/null
21616 cat $DIR/$tfile > /dev/null
21617 cat $DIR/$tfile > /dev/null
21619 sleep $((period_second + 3))
21620 echo "Sleep $((period_second + 3)) seconds..."
21622 out=$($LFS heat_get $DIR/$tfile)
21623 $LFS heat_get $DIR/$tfile
21624 readsample1=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
21625 writesample1=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
21626 readbyte1=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
21627 writebyte1=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
21629 [ $(bc <<< "$readsample1 <= ($readsample * (100 - $decay_pct) + \
21630 4 * $decay_pct) / 100") -eq 1 ] ||
21631 error "read sample ($readsample1) is wrong"
21632 [ $(bc <<< "$writesample1 <= ($writesample * (100 - $decay_pct) + \
21633 3 * $decay_pct) / 100") -eq 1 ] ||
21634 error "write sample ($writesample1) is wrong"
21635 [ $(bc <<< "$readbyte1 <= ($readbyte * (100 - $decay_pct) + \
21636 20 * $decay_pct) / 100") -eq 1 ] ||
21637 error "read bytes ($readbyte1) is wrong"
21638 [ $(bc <<< "$writebyte1 <= ($writebyte * (100 - $decay_pct) + \
21639 15 * $decay_pct) / 100") -eq 1 ] ||
21640 error "write bytes ($writebyte1) is wrong"
21642 echo "Turn off file heat for the file $DIR/$tfile"
21643 $LFS heat_set -o $DIR/$tfile
21645 echo "QQQQ" > $DIR/$tfile
21646 echo "QQQQ" > $DIR/$tfile
21647 echo "QQQQ" > $DIR/$tfile
21648 cat $DIR/$tfile > /dev/null
21649 cat $DIR/$tfile > /dev/null
21650 cat $DIR/$tfile > /dev/null
21651 cat $DIR/$tfile > /dev/null
21653 out=$($LFS heat_get $DIR/$tfile)
21654 $LFS heat_get $DIR/$tfile
21655 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
21656 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
21657 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
21658 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
21660 [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong"
21661 [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong"
21662 [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong"
21663 [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong"
21665 echo "Trun on file heat for the file $DIR/$tfile"
21666 $LFS heat_set -O $DIR/$tfile
21668 echo "QQQQ" > $DIR/$tfile
21669 echo "QQQQ" > $DIR/$tfile
21670 echo "QQQQ" > $DIR/$tfile
21671 cat $DIR/$tfile > /dev/null
21672 cat $DIR/$tfile > /dev/null
21673 cat $DIR/$tfile > /dev/null
21674 cat $DIR/$tfile > /dev/null
21676 out=$($LFS heat_get $DIR/$tfile)
21677 $LFS heat_get $DIR/$tfile
21678 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
21679 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
21680 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
21681 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
21683 [ $readsample -gt 0 ] || error "read sample ($readsample) is wrong"
21684 [ $writesample -gt 0 ] || error "write sample ($writesample) is wrong"
21685 [ $readbyte -gt 0 ] || error "read bytes ($readbyte) is wrong"
21686 [ $writebyte -gt 0 ] || error "write bytes ($writebyte) is wrong"
21688 $LFS heat_set -c $DIR/$tfile
21689 $LCTL set_param -n llite.*.file_heat=0
21690 echo "Turn off file heat support for the Lustre filesystem"
21692 echo "QQQQ" > $DIR/$tfile
21693 echo "QQQQ" > $DIR/$tfile
21694 echo "QQQQ" > $DIR/$tfile
21695 cat $DIR/$tfile > /dev/null
21696 cat $DIR/$tfile > /dev/null
21697 cat $DIR/$tfile > /dev/null
21698 cat $DIR/$tfile > /dev/null
21700 out=$($LFS heat_get $DIR/$tfile)
21701 $LFS heat_get $DIR/$tfile
21702 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
21703 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
21704 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
21705 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
21707 [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong"
21708 [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong"
21709 [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong"
21710 [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong"
21712 $LCTL set_param -n llite.*.file_heat=$file_heat_sav
21715 run_test 813 "File heat verfication"
21719 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
21720 echo -n y >> $DIR/$tfile
21721 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
21722 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
21724 run_test 814 "sparse cp works as expected (LU-12361)"
21728 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
21729 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
21731 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
21734 [ "$SHARED_KEY" = true ] &&
21735 skip "OSC connections never go IDLE with Shared-Keys enabled"
21737 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21738 # ensure ost1 is connected
21739 stat $DIR/$tfile >/dev/null || error "can't stat"
21740 wait_osc_import_state client ost1 FULL
21741 # no locks, no reqs to let the connection idle
21742 cancel_lru_locks osc
21743 lru_resize_disable osc
21746 before=$($LCTL get_param -n \
21747 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21749 wait_osc_import_state client ost1 IDLE
21750 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
21751 now=$($LCTL get_param -n \
21752 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21753 [ $before == $now ] || error "lru_size changed $before != $now"
21755 run_test 816 "do not reset lru_resize on idle reconnect"
21759 exportfs -u localhost:$DIR/nfsexp
21764 systemctl restart nfs-server.service || skip "failed to restart nfsd"
21766 mkdir -p $DIR/nfsexp
21767 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
21768 error "failed to export nfs"
21770 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
21771 stack_trap cleanup_817 EXIT
21773 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
21774 error "failed to mount nfs to $tmpdir"
21776 cp /bin/true $tmpdir
21777 $DIR/nfsexp/true || error "failed to execute 'true' command"
21779 run_test 817 "nfsd won't cache write lock for exec file"
21782 # tests that do cleanup/setup should be run at the end
21786 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21789 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
21790 $LCTL set_param fail_loc=0x903
21792 cancel_lru_locks MGC
21794 FAIL_ON_ERROR=true cleanup
21795 FAIL_ON_ERROR=true setup
21797 run_test 900 "umount should not race with any mgc requeue thread"
21800 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
21801 check_and_cleanup_lustre
21802 if [ "$I_MOUNTED" != "yes" ]; then
21803 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true