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-4398
57 ALWAYS_EXCEPT+=" 45 317 817"
61 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
63 if [ "$mds1_FSTYPE" = "zfs" ]; then
64 # bug number for skipped test:
65 ALWAYS_EXCEPT="$ALWAYS_EXCEPT "
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 test_mkdir $DIR/$tdir
2462 pool_add $POOL || error "pool_add failed"
2463 pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
2466 [ $MDS1_VERSION -lt $(version_code 2.8.55) ] &&
2468 [ $MDS1_VERSION -lt $(version_code 2.9.55) ] ||
2469 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2470 skip27D+=" -s 30,31"
2471 [[ ! $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ||
2472 $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2473 skip27D+=" -s 32,33"
2474 [[ $MDS_VERSION -lt $(version_code $SEL_VER) ]] &&
2476 llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
2477 error "llapi_layout_test failed"
2479 destroy_test_pools || error "destroy test pools failed"
2481 run_test 27D "validate llapi_layout API"
2483 # Verify that default_easize is increased from its initial value after
2484 # accessing a widely striped file.
2486 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2487 [ $CLIENT_VERSION -lt $(version_code 2.5.57) ] &&
2488 skip "client does not have LU-3338 fix"
2490 # 72 bytes is the minimum space required to store striping
2491 # information for a file striped across one OST:
2492 # (sizeof(struct lov_user_md_v3) +
2493 # sizeof(struct lov_user_ost_data_v1))
2495 $LCTL set_param -n llite.*.default_easize $min_easize ||
2496 error "lctl set_param failed"
2497 local easize=$($LCTL get_param -n llite.*.default_easize)
2499 [ $easize -eq $min_easize ] ||
2500 error "failed to set default_easize"
2502 $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
2503 error "setstripe failed"
2504 # In order to ensure stat() call actually talks to MDS we need to
2505 # do something drastic to this file to shake off all lock, e.g.
2506 # rename it (kills lookup lock forcing cache cleaning)
2507 mv $DIR/$tfile $DIR/${tfile}-1
2508 ls -l $DIR/${tfile}-1
2511 easize=$($LCTL get_param -n llite.*.default_easize)
2513 [ $easize -gt $min_easize ] ||
2514 error "default_easize not updated"
2516 run_test 27E "check that default extended attribute size properly increases"
2518 test_27F() { # LU-5346/LU-7975
2519 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2520 [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs"
2521 [[ $MDS1_VERSION -lt $(version_code 2.8.51) ]] &&
2522 skip "Need MDS version at least 2.8.51"
2523 remote_ost_nodsh && skip "remote OST with nodsh"
2525 test_mkdir $DIR/$tdir
2527 $LFS setstripe -c 2 $DIR/$tdir
2529 # stop all OSTs to reproduce situation for LU-7975 ticket
2530 for num in $(seq $OSTCOUNT); do
2534 # open/create f0 with O_LOV_DELAY_CREATE
2535 # truncate f0 to a non-0 size
2537 multiop $DIR/$tdir/f0 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T1050000c
2539 $CHECKSTAT -s 1050000 $DIR/$tdir/f0 || error "checkstat failed"
2540 # open/write it again to force delayed layout creation
2541 cat /etc/hosts > $DIR/$tdir/f0 &
2545 for num in $(seq $OSTCOUNT); do
2546 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS ||
2547 error "ost$num failed to start"
2550 wait $catpid || error "cat failed"
2552 cmp /etc/hosts $DIR/$tdir/f0 || error "cmp failed"
2553 [[ $($LFS getstripe -c $DIR/$tdir/f0) == 2 ]] ||
2554 error "wrong stripecount"
2557 run_test 27F "Client resend delayed layout creation with non-zero size"
2559 test_27G() { #LU-10629
2560 [ $MDS1_VERSION -lt $(version_code 2.11.51) ] &&
2561 skip "Need MDS version at least 2.11.51"
2562 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2563 remote_mds_nodsh && skip "remote MDS with nodsh"
2564 local POOL=${POOL:-testpool}
2565 local ostrange="0 0 1"
2567 test_mkdir $DIR/$tdir
2568 pool_add $POOL || error "pool_add failed"
2569 pool_add_targets $POOL $ostrange || error "pool_add_targets failed"
2570 $LFS setstripe -p $POOL $DIR/$tdir
2572 local pool=$($LFS getstripe -p $DIR/$tdir)
2574 [ "$pool" = "$POOL" ] || error "Striping failed got '$pool' not '$POOL'"
2576 $LFS setstripe -d $DIR/$tdir
2578 pool=$($LFS getstripe -p $DIR/$tdir)
2582 [ -z "$pool" ] || error "'$pool' is not empty"
2584 run_test 27G "Clear OST pool from stripe"
2587 [[ $MDS1_VERSION -le $(version_code 2.11.54) ]] &&
2588 skip "Need MDS version newer than 2.11.54"
2589 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
2590 test_mkdir $DIR/$tdir
2591 $LFS setstripe -o 0 -o 2 $DIR/$tdir || error "setstripe failed"
2592 touch $DIR/$tdir/$tfile
2593 $LFS getstripe -c $DIR/$tdir/$tfile
2594 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
2595 error "two-stripe file doesn't have two stripes"
2597 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
2598 $LFS getstripe -y $DIR/$tdir/$tfile
2599 (( $($LFS getstripe -y $DIR/$tdir/$tfile |
2600 egrep -c "l_ost_idx: [02]$") == "2" )) ||
2601 error "expected l_ost_idx: [02]$ not matched"
2603 # make sure ost list has been cleared
2604 local stripesize=$($LFS getstripe -S $DIR/$tdir)
2605 $LFS setstripe -S $((stripesize * 4)) -i 1 \
2606 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
2608 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
2610 run_test 27H "Set specific OSTs stripe"
2613 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2614 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2615 [[ $MDS1_VERSION -gt $(version_code 2.12.52) ]] ||
2616 skip "Need MDS version newer than 2.12.52"
2617 local pool=$TESTNAME
2618 local ostrange="1 1 1"
2620 save_layout_restore_at_exit $MOUNT
2621 $LFS setstripe -c 2 -i 0 $MOUNT
2622 pool_add $pool || error "pool_add failed"
2623 pool_add_targets $pool $ostrange || "pool_add_targets failed"
2624 test_mkdir $DIR/$tdir
2625 $LFS setstripe -p $pool $DIR/$tdir
2626 $MULTIOP $DIR/$tdir/$tfile Oc || error "multiop failed"
2627 $LFS getstripe $DIR/$tdir/$tfile
2629 run_test 27I "check that root dir striping does not break parent dir one"
2632 [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.51) ]] &&
2633 skip "Need MDS version newer than 2.12.51"
2635 test_mkdir $DIR/$tdir
2636 local uuid1=$(cat /proc/sys/kernel/random/uuid)
2637 local uuid2=$(cat /proc/sys/kernel/random/uuid)
2639 # create foreign file (raw way)
2640 create_foreign_file -f $DIR/$tdir/$tfile -x "${uuid1}@${uuid2}" \
2641 -t 1 -F 0xda08 || error "create_foreign_file failed"
2643 # verify foreign file (raw way)
2644 parse_foreign_file -f $DIR/$tdir/$tfile |
2645 grep "lov_foreign_magic: 0x0BD70BD0" ||
2646 error "$DIR/$tdir/$tfile: invalid LOV EA foreign magic"
2647 parse_foreign_file -f $DIR/$tdir/$tfile | grep "lov_xattr_size: 89" ||
2648 error "$DIR/$tdir/$tfile: invalid LOV EA foreign size"
2649 parse_foreign_file -f $DIR/$tdir/$tfile |
2650 grep "lov_foreign_size: 73" ||
2651 error "$DIR/$tdir/$tfile: invalid LOV EA foreign size"
2652 parse_foreign_file -f $DIR/$tdir/$tfile |
2653 grep "lov_foreign_type: 1" ||
2654 error "$DIR/$tdir/$tfile: invalid LOV EA foreign type"
2655 parse_foreign_file -f $DIR/$tdir/$tfile |
2656 grep "lov_foreign_flags: 0x0000DA08" ||
2657 error "$DIR/$tdir/$tfile: invalid LOV EA foreign flags"
2658 local lov=$(parse_foreign_file -f $DIR/$tdir/$tfile |
2659 grep "lov_foreign_value: 0x" |
2660 sed -e 's/lov_foreign_value: 0x//')
2661 local lov2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160)
2662 [[ $lov = ${lov2// /} ]] ||
2663 error "$DIR/$tdir/$tfile: invalid LOV EA foreign value"
2665 # create foreign file (lfs + API)
2666 $LFS setstripe --foreign=daos --flags 0xda08 \
2667 -x "${uuid1}@${uuid2}" $DIR/$tdir/${tfile}2 ||
2668 error "$DIR/$tdir/${tfile}2: create failed"
2670 $LFS getstripe -v $DIR/$tdir/${tfile}2 |
2671 grep "lfm_magic:.*0x0BD70BD0" ||
2672 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign magic"
2673 # lfm_length is LOV EA size - sizeof(lfm_magic) - sizeof(lfm_length)
2674 $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_length:.*73" ||
2675 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign size"
2676 $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_type:.*daos" ||
2677 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign type"
2678 $LFS getstripe -v $DIR/$tdir/${tfile}2 |
2679 grep "lfm_flags:.*0x0000DA08" ||
2680 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign flags"
2681 $LFS getstripe $DIR/$tdir/${tfile}2 |
2682 grep "lfm_value:.*${uuid1}@${uuid2}" ||
2683 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign value"
2685 # modify striping should fail
2686 $LFS setstripe -c 2 $DIR/$tdir/$tfile &&
2687 error "$DIR/$tdir/$tfile: setstripe should fail"
2688 $LFS setstripe -c 2 $DIR/$tdir/${tfile}2 &&
2689 error "$DIR/$tdir/${tfile}2: setstripe should fail"
2692 cat $DIR/$tdir/$tfile && error "$DIR/$tdir/$tfile: read should fail"
2693 cat $DIR/$tdir/${tfile}2 &&
2694 error "$DIR/$tdir/${tfile}2: read should fail"
2695 cat /etc/passwd > $DIR/$tdir/$tfile &&
2696 error "$DIR/$tdir/$tfile: write should fail"
2697 cat /etc/passwd > $DIR/$tdir/${tfile}2 &&
2698 error "$DIR/$tdir/${tfile}2: write should fail"
2701 chmod 222 $DIR/$tdir/$tfile ||
2702 error "$DIR/$tdir/$tfile: chmod failed"
2703 chmod 222 $DIR/$tdir/${tfile}2 ||
2704 error "$DIR/$tdir/${tfile}2: chmod failed"
2707 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tfile ||
2708 error "$DIR/$tdir/$tfile: chown failed"
2709 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tfile}2 ||
2710 error "$DIR/$tdir/${tfile}2: chown failed"
2712 # rename should work
2713 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}.new ||
2714 error "$DIR/$tdir/$tfile: rename of foreign file has failed"
2715 mv $DIR/$tdir/${tfile}2 $DIR/$tdir/${tfile}2.new ||
2716 error "$DIR/$tdir/${tfile}2: rename of foreign file has failed"
2718 #remove foreign file
2719 rm $DIR/$tdir/${tfile}.new ||
2720 error "$DIR/$tdir/${tfile}.new: remove of foreign file has failed"
2721 rm $DIR/$tdir/${tfile}2.new ||
2722 error "$DIR/$tdir/${tfile}2.new: remove of foreign file has failed"
2724 run_test 27J "basic ops on file with foreign LOV"
2727 [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.49) ]] &&
2728 skip "Need MDS version newer than 2.12.49"
2730 test_mkdir $DIR/$tdir
2731 local uuid1=$(cat /proc/sys/kernel/random/uuid)
2732 local uuid2=$(cat /proc/sys/kernel/random/uuid)
2734 # create foreign dir (raw way)
2735 create_foreign_dir -d $DIR/$tdir/$tdir -x "${uuid1}@${uuid2}" -t 1 ||
2736 error "create_foreign_dir FAILED"
2738 # verify foreign dir (raw way)
2739 parse_foreign_dir -d $DIR/$tdir/$tdir |
2740 grep "lmv_foreign_magic:.*0xcd50cd0" ||
2741 error "$DIR/$tdir/$tfile: invalid LMV EA magic"
2742 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_xattr_size:.*89$" ||
2743 error "$DIR/$tdir/$tdir: invalid LMV EA size"
2744 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_type: 1$" ||
2745 error "$DIR/$tdir/$tdir: invalid LMV EA type"
2746 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_flags: 0$" ||
2747 error "$DIR/$tdir/$tdir: invalid LMV EA flags"
2748 local lmv=$(parse_foreign_dir -d $DIR/$tdir/$tdir |
2749 grep "lmv_foreign_value: 0x" |
2750 sed 's/lmv_foreign_value: 0x//')
2751 local lmv2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160 |
2753 [[ $lmv == $lmv2 ]] || error "$DIR/$tdir/$tdir: invalid LMV EA value"
2755 # create foreign dir (lfs + API)
2756 $LFS mkdir --foreign=daos --xattr="${uuid1}@${uuid2}" --flags=0xda05 \
2757 $DIR/$tdir/${tdir}2 ||
2758 error "$DIR/$tdir/${tdir}2: create failed"
2760 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
2761 grep "lfm_magic:.*0x0CD50CD0" ||
2762 error "$DIR/$tdir/${tdir}2: invalid LMV EA magic"
2763 # lfm_length is LMV EA size - sizeof(lfm_magic) - sizeof(lfm_length)
2764 # - sizeof(lfm_type) - sizeof(lfm_flags)
2765 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_length:.*73" ||
2766 error "$DIR/$tdir/${tdir}2: invalid LMV EA size"
2767 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_type:.*daos" ||
2768 error "$DIR/$tdir/${tdir}2: invalid LMV EA type"
2769 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
2770 grep "lfm_flags:.*0x0000DA05" ||
2771 error "$DIR/$tdir/${tdir}2: invalid LMV EA flags"
2772 $LFS getdirstripe $DIR/$tdir/${tdir}2 |
2773 grep "lfm_value.*${uuid1}@${uuid2}" ||
2774 error "$DIR/$tdir/${tdir}2: invalid LMV EA value"
2776 # file create in dir should fail
2777 touch $DIR/$tdir/$tdir/$tfile && "$DIR/$tdir: file create should fail"
2778 touch $DIR/$tdir/${tdir}2/$tfile &&
2779 "$DIR/${tdir}2: file create should fail"
2782 chmod 777 $DIR/$tdir/$tdir ||
2783 error "$DIR/$tdir: chmod failed"
2784 chmod 777 $DIR/$tdir/${tdir}2 ||
2785 error "$DIR/${tdir}2: chmod failed"
2788 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tdir ||
2789 error "$DIR/$tdir: chown failed"
2790 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tdir}2 ||
2791 error "$DIR/${tdir}2: chown failed"
2793 # rename should work
2794 mv $DIR/$tdir/$tdir $DIR/$tdir/${tdir}.new ||
2795 error "$DIR/$tdir/$tdir: rename of foreign dir has failed"
2796 mv $DIR/$tdir/${tdir}2 $DIR/$tdir/${tdir}2.new ||
2797 error "$DIR/$tdir/${tdir}2: rename of foreign dir has failed"
2800 rmdir $DIR/$tdir/${tdir}.new ||
2801 error "$DIR/$tdir/${tdir}.new: remove of foreign dir has failed"
2802 rmdir $DIR/$tdir/${tdir}2.new ||
2803 error "$DIR/$tdir/${tdir}2.new: remove of foreign dir has failed"
2805 run_test 27K "basic ops on dir with foreign LMV"
2808 remote_mds_nodsh && skip "remote MDS with nodsh"
2810 local POOL=${POOL:-$TESTNAME}
2812 pool_add $POOL || error "pool_add failed"
2814 lfs pool_list $MOUNT | grep -Fx "${FSNAME}.${POOL}" ||
2815 error "pool_list does not contain ${FSNAME}.${POOL}:" \
2816 "$(lfs pool_list $MOUNT | grep -F "${POOL}")"
2818 run_test 27L "lfs pool_list gives correct pool name"
2821 [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.12.57) ]] &&
2822 skip "Need MDS version >= than 2.12.57"
2823 remote_mds_nodsh && skip "remote MDS with nodsh"
2824 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2826 test_mkdir $DIR/$tdir
2828 # Set default striping on directory
2829 $LFS setstripe -C 4 $DIR/$tdir
2831 echo 1 > $DIR/$tdir/${tfile}.1
2832 local count=$($LFS getstripe -c $DIR/$tdir/${tfile}.1)
2834 [ $count -eq $setcount ] ||
2835 error "(1) stripe count $count, should be $setcount"
2837 # Capture existing append_stripe_count setting for restore
2838 local orig_count=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_stripe_count)
2839 local mdts=$(comma_list $(mdts_nodes))
2840 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=$orig_count" EXIT
2842 local appendcount=$orig_count
2843 echo 1 >> $DIR/$tdir/${tfile}.2_append
2844 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.2_append)
2845 [ $count -eq $appendcount ] ||
2846 error "(2)stripe count $count, should be $appendcount for append"
2848 # Disable O_APPEND striping, verify it works
2849 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2851 # Should now get the default striping, which is 4
2853 echo 1 >> $DIR/$tdir/${tfile}.3_append
2854 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.3_append)
2855 [ $count -eq $setcount ] ||
2856 error "(3) stripe count $count, should be $setcount"
2858 # Try changing the stripe count for append files
2859 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=2
2861 # Append striping is now 2 (directory default is still 4)
2863 echo 1 >> $DIR/$tdir/${tfile}.4_append
2864 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.4_append)
2865 [ $count -eq $appendcount ] ||
2866 error "(4) stripe count $count, should be $appendcount for append"
2868 # Test append stripe count of -1
2869 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=-1
2870 appendcount=$OSTCOUNT
2871 echo 1 >> $DIR/$tdir/${tfile}.5
2872 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.5)
2873 [ $count -eq $appendcount ] ||
2874 error "(5) stripe count $count, should be $appendcount for append"
2876 # Set append striping back to default of 1
2877 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=1
2879 # Try a new default striping, PFL + DOM
2880 $LFS setstripe -L mdt -E 1M -E -1 -c 2 $DIR/$tdir
2882 # Create normal DOM file, DOM returns stripe count == 0
2884 touch $DIR/$tdir/${tfile}.6
2885 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.6)
2886 [ $count -eq $setcount ] ||
2887 error "(6) stripe count $count, should be $setcount"
2891 echo 1 >> $DIR/$tdir/${tfile}.7_append
2892 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.7_append)
2893 [ $count -eq $appendcount ] ||
2894 error "(7) stripe count $count, should be $appendcount for append"
2896 # Clean up DOM layout
2897 $LFS setstripe -d $DIR/$tdir
2899 # Now test that append striping works when layout is from root
2900 $LFS setstripe -c 2 $MOUNT
2901 # Make a special directory for this
2902 mkdir $DIR/${tdir}/${tdir}.2
2903 stack_trap "$LFS setstripe -d $MOUNT" EXIT
2905 # Verify for normal file
2907 echo 1 > $DIR/${tdir}/${tdir}.2/${tfile}.8
2908 count=$($LFS getstripe -c $DIR/$tdir/${tdir}.2/${tfile}.8)
2909 [ $count -eq $setcount ] ||
2910 error "(8) stripe count $count, should be $setcount"
2913 echo 1 >> $DIR/${tdir}/${tdir}.2/${tfile}.9_append
2914 count=$($LFS getstripe -c $DIR/${tdir}/${tdir}.2/${tfile}.9_append)
2915 [ $count -eq $appendcount ] ||
2916 error "(9) stripe count $count, should be $appendcount for append"
2918 # Now test O_APPEND striping with pools
2919 do_nodes $mdts $LCTL set_param mdd.*.append_pool="$TESTNAME"
2920 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'" EXIT
2923 pool_add $TESTNAME || error "pool creation failed"
2924 pool_add_targets $TESTNAME 0 1 || error "Pool add targets failed"
2926 echo 1 >> $DIR/$tdir/${tfile}.10_append
2928 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.10_append)
2929 [ "$pool" = "$TESTNAME" ] || error "(10) incorrect pool: $pool"
2931 # Check that count is still correct
2933 echo 1 >> $DIR/$tdir/${tfile}.11_append
2934 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.11_append)
2935 [ $count -eq $appendcount ] ||
2936 error "(11) stripe count $count, should be $appendcount for append"
2938 # Disable O_APPEND stripe count, verify pool works separately
2939 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2941 echo 1 >> $DIR/$tdir/${tfile}.12_append
2943 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.12_append)
2944 [ "$pool" = "$TESTNAME" ] || error "(12) incorrect pool: $pool"
2946 # Remove pool setting, verify it's not applied
2947 do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'
2949 echo 1 >> $DIR/$tdir/${tfile}.13_append
2951 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.13_append)
2952 [ "$pool" = "" ] || error "(13) pool found: $pool"
2954 run_test 27M "test O_APPEND striping"
2957 combined_mgs_mds && skip "needs separate MGS/MDT"
2959 pool_add $TESTNAME || error "pool_add failed"
2960 do_facet mgs "$LCTL pool_list $FSNAME" |
2961 grep -Fx "${FSNAME}.${TESTNAME}" ||
2962 error "lctl pool_list on MGS failed"
2964 run_test 27N "lctl pool_list on separate MGS gives correct pool name"
2966 # createtest also checks that device nodes are created and
2967 # then visible correctly (#2091)
2968 test_28() { # bug 2091
2970 $CREATETEST $DIR/d28/ct || error "createtest failed"
2972 run_test 28 "create/mknod/mkdir with bad file types ============"
2975 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2977 sync; sleep 1; sync # flush out any dirty pages from previous tests
2984 declare -i LOCKCOUNTORIG=0
2985 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2986 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
2988 [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
2990 declare -i LOCKUNUSEDCOUNTORIG=0
2991 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2992 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
2999 declare -i LOCKCOUNTCURRENT=0
3000 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
3001 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
3004 declare -i LOCKUNUSEDCOUNTCURRENT=0
3005 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
3006 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
3009 if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
3010 $LCTL set_param -n ldlm.dump_namespaces ""
3011 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
3012 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
3013 log "dumped log to $TMP/test_29.dk (bug 5793)"
3016 if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
3017 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
3018 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
3019 log "dumped log to $TMP/test_29.dk (bug 5793)"
3023 run_test 29 "IT_GETATTR regression ============================"
3025 test_30a() { # was test_30
3026 cp $(which ls) $DIR || cp /bin/ls $DIR
3027 $DIR/ls / || error "Can't execute binary from lustre"
3030 run_test 30a "execute binary from Lustre (execve) =============="
3033 cp `which ls` $DIR || cp /bin/ls $DIR
3035 $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
3038 run_test 30b "execute binary from Lustre as non-root ==========="
3040 test_30c() { # b=22376
3041 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3043 cp `which ls` $DIR || cp /bin/ls $DIR
3045 cancel_lru_locks mdc
3046 cancel_lru_locks osc
3047 $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
3050 run_test 30c "execute binary from Lustre without read perms ===="
3053 $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
3054 $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
3056 run_test 31a "open-unlink file =================================="
3059 touch $DIR/f31 || error "touch $DIR/f31 failed"
3060 ln $DIR/f31 $DIR/f31b || error "ln failed"
3061 $MULTIOP $DIR/f31b Ouc || error "multiop failed"
3062 $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
3064 run_test 31b "unlink file with multiple links while open ======="
3067 touch $DIR/f31 || error "touch $DIR/f31 failed"
3068 ln $DIR/f31 $DIR/f31c || error "ln failed"
3069 multiop_bg_pause $DIR/f31 O_uc ||
3070 error "multiop_bg_pause for $DIR/f31 failed"
3072 $MULTIOP $DIR/f31c Ouc
3073 kill -USR1 $MULTIPID
3076 run_test 31c "open-unlink file with multiple links ============="
3079 opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
3080 $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
3082 run_test 31d "remove of open directory ========================="
3084 test_31e() { # bug 2904
3085 openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
3087 run_test 31e "remove of open non-empty directory ==============="
3089 test_31f() { # bug 4554
3090 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3093 test_mkdir $DIR/d31f
3094 $LFS setstripe -S 1048576 -c 1 $DIR/d31f
3095 cp /etc/hosts $DIR/d31f
3097 $LFS getstripe $DIR/d31f/hosts
3098 multiop_bg_pause $DIR/d31f D_c || return 1
3101 rm -rv $DIR/d31f || error "first of $DIR/d31f"
3102 test_mkdir $DIR/d31f
3103 $LFS setstripe -S 1048576 -c 1 $DIR/d31f
3104 cp /etc/hosts $DIR/d31f
3106 $LFS getstripe $DIR/d31f/hosts
3107 multiop_bg_pause $DIR/d31f D_c || return 1
3110 kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
3111 wait $MULTIPID || error "first opendir $MULTIPID failed"
3115 kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
3116 wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
3119 run_test 31f "remove of open directory with open-unlink file ==="
3122 echo "-- cross directory link --"
3123 test_mkdir -c1 $DIR/${tdir}ga
3124 test_mkdir -c1 $DIR/${tdir}gb
3125 touch $DIR/${tdir}ga/f
3126 ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
3127 $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
3128 [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
3129 $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
3130 [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
3132 run_test 31g "cross directory link==============="
3135 echo "-- cross directory link --"
3136 test_mkdir -c1 $DIR/${tdir}
3137 test_mkdir -c1 $DIR/${tdir}/dir
3138 touch $DIR/${tdir}/f
3139 ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
3140 $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
3141 [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
3142 $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
3143 [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
3145 run_test 31h "cross directory link under child==============="
3148 echo "-- cross directory link --"
3149 test_mkdir -c1 $DIR/$tdir
3150 test_mkdir -c1 $DIR/$tdir/dir
3151 touch $DIR/$tdir/dir/f
3152 ln $DIR/$tdir/dir/f $DIR/$tdir/g
3153 $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
3154 [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
3155 $CHECKSTAT -t file $DIR/$tdir/g || error "target"
3156 [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
3158 run_test 31i "cross directory link under parent==============="
3161 test_mkdir -c1 -p $DIR/$tdir
3162 test_mkdir -c1 -p $DIR/$tdir/dir1
3163 ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
3164 link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
3165 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
3166 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
3169 run_test 31j "link for directory==============="
3172 test_mkdir -c1 -p $DIR/$tdir
3174 touch $DIR/$tdir/exist
3175 mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
3176 mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
3177 mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
3178 mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
3179 mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
3180 mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
3181 mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
3184 run_test 31k "link to file: the same, non-existing, dir==============="
3190 touch $DIR/d31m2/exist
3191 mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
3192 mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
3193 mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
3194 mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
3195 mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
3196 mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
3199 run_test 31m "link to file: the same, non-existing, dir==============="
3202 touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
3203 nlink=$(stat --format=%h $DIR/$tfile)
3204 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
3206 local cmd="exec $fd<$DIR/$tfile"
3209 trap "eval $cmd" EXIT
3210 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
3211 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
3212 rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
3213 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
3214 [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
3217 run_test 31n "check link count of unlinked file"
3220 local tempfile=$(mktemp $1_XXXXXX)
3221 mlink $tempfile $1 2> /dev/null &&
3222 echo "$BASHPID: link $tempfile to $1 succeeded"
3226 test_31o() { # LU-2901
3227 test_mkdir $DIR/$tdir
3228 for LOOP in $(seq 100); do
3229 rm -f $DIR/$tdir/$tfile*
3230 for THREAD in $(seq 8); do
3231 link_one $DIR/$tdir/$tfile.$LOOP &
3234 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
3235 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
3236 error "$LINKS duplicate links to $tfile.$LOOP" &&
3240 run_test 31o "duplicate hard links with same filename"
3243 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3245 test_mkdir $DIR/$tdir
3246 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3247 $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
3249 opendirunlink $DIR/$tdir/striped_dir/test1 ||
3250 error "open unlink test1 failed"
3251 opendirunlink $DIR/$tdir/striped_dir/test2 ||
3252 error "open unlink test2 failed"
3254 $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
3255 error "test1 still exists"
3256 $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
3257 error "test2 still exists"
3259 run_test 31p "remove of open striped directory"
3261 cleanup_test32_mount() {
3264 local loopdev=$(losetup -a | grep $EXT2_DEV | sed -ne 's/:.*$//p')
3265 $UMOUNT $DIR/$tdir/ext2-mountpoint || rc=$?
3266 losetup -d $loopdev || true
3272 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3274 echo "== more mountpoints and symlinks ================="
3275 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
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 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/.. ||
3281 error "$DIR/$tdir/ext2-mountpoint/.. not dir type"
3282 cleanup_test32_mount
3284 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
3287 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3289 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3290 trap cleanup_test32_mount EXIT
3291 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3292 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3293 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3294 ls -al $DIR/$tdir/ext2-mountpoint/.. ||
3295 error "Can't list $DIR/$tdir/ext2-mountpoint/.."
3296 cleanup_test32_mount
3298 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
3301 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3303 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3304 trap cleanup_test32_mount EXIT
3305 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3306 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3307 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3308 test_mkdir -p $DIR/$tdir/d2/test_dir
3309 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
3310 error "$DIR/$tdir/ext2-mountpoint/../d2/test_dir not dir type"
3311 cleanup_test32_mount
3313 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
3316 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3318 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3319 trap cleanup_test32_mount EXIT
3320 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3321 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3322 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3323 test_mkdir -p $DIR/$tdir/d2/test_dir
3324 ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
3325 error "Can't list $DIR/$tdir/ext2-mountpoint/../d2/test_dir"
3326 cleanup_test32_mount
3328 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
3332 test_mkdir -p $DIR/$tdir/tmp
3333 local tmp_dir=$DIR/$tdir/tmp
3334 ln -s $DIR/$tdir $tmp_dir/symlink11
3335 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
3336 $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
3337 $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
3339 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
3343 test_mkdir -p $DIR/$tdir/tmp
3344 local tmp_dir=$DIR/$tdir/tmp
3345 ln -s $DIR/$tdir $tmp_dir/symlink11
3346 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
3347 ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
3348 ls $DIR/$tdir/symlink01 || error "symlink01 bad"
3350 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
3353 local tmp_dir=$DIR/$tdir/tmp
3354 test_mkdir -p $tmp_dir
3355 test_mkdir $DIR/${tdir}2
3356 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
3357 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
3358 $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
3359 $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
3360 $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
3361 $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
3363 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
3366 rm -fr $DIR/$tdir $DIR/${tdir}2
3367 tmp_dir=$DIR/$tdir/tmp
3368 test_mkdir -p $tmp_dir
3369 test_mkdir $DIR/${tdir}2
3370 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
3371 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
3372 ls $tmp_dir/symlink12 || error "listing symlink12"
3373 ls $DIR/$tdir/symlink02 || error "listing symlink02"
3375 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
3378 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3380 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3381 trap cleanup_test32_mount EXIT
3382 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3383 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3384 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3385 touch $DIR/$tdir/test_file
3386 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../test_file ||
3387 error "$DIR/$tdir/ext2-mountpoint/../test_file not file type"
3388 cleanup_test32_mount
3390 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
3393 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3395 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3396 trap cleanup_test32_mount EXIT
3397 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3398 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3399 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3400 touch $DIR/$tdir/test_file
3401 cat $DIR/$tdir/ext2-mountpoint/../test_file ||
3402 error "Can't open $DIR/$tdir/ext2-mountpoint/../test_file"
3403 cleanup_test32_mount
3405 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
3408 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3411 trap cleanup_test32_mount EXIT
3412 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3413 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3414 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3415 test_mkdir -p $DIR/$tdir/d2
3416 touch $DIR/$tdir/d2/test_file || error "touch failed"
3417 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
3418 error "$DIR/$tdir/ext2-mountpoint/../d2/test_file not file type"
3419 cleanup_test32_mount
3421 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
3424 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3427 trap cleanup_test32_mount EXIT
3428 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3429 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3430 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3431 test_mkdir -p $DIR/$tdir/d2
3432 touch $DIR/$tdir/d2/test_file || error "touch failed"
3433 cat $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
3434 error "Can't open $DIR/$tdir/ext2-mountpoint/../d2/test_file"
3435 cleanup_test32_mount
3437 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
3441 test_mkdir -p $DIR/d32m/tmp
3442 TMP_DIR=$DIR/d32m/tmp
3443 ln -s $DIR $TMP_DIR/symlink11
3444 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3445 $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 ||
3446 error "symlink11 not a link"
3447 $CHECKSTAT -t link $DIR/d32m/symlink01 ||
3448 error "symlink01 not a link"
3450 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
3454 test_mkdir -p $DIR/d32n/tmp
3455 TMP_DIR=$DIR/d32n/tmp
3456 ln -s $DIR $TMP_DIR/symlink11
3457 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3458 ls -l $DIR/d32n/tmp/symlink11 || error "listing symlink11"
3459 ls -l $DIR/d32n/symlink01 || error "listing symlink01"
3461 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
3465 test_mkdir -p $DIR/d32o/tmp
3466 TMP_DIR=$DIR/d32o/tmp
3467 ln -s $DIR/$tfile $TMP_DIR/symlink12
3468 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3469 $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 ||
3470 error "symlink12 not a link"
3471 $CHECKSTAT -t link $DIR/d32o/symlink02 || error "symlink02 not a link"
3472 $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 ||
3473 error "$DIR/d32o/tmp/symlink12 not file type"
3474 $CHECKSTAT -t file -f $DIR/d32o/symlink02 ||
3475 error "$DIR/d32o/symlink02 not file type"
3477 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
3487 test_mkdir -p $DIR/d32p/tmp
3489 TMP_DIR=$DIR/d32p/tmp
3491 ln -s $DIR/$tfile $TMP_DIR/symlink12
3493 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3495 cat $DIR/d32p/tmp/symlink12 ||
3496 error "Can't open $DIR/d32p/tmp/symlink12"
3498 cat $DIR/d32p/symlink02 || error "Can't open $DIR/d32p/symlink02"
3501 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
3504 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3506 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3507 trap cleanup_test32_mount EXIT
3508 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3509 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3510 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3511 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3512 ls $DIR/$tdir/ext2-mountpoint | grep "\<under_the_mount\>" && error
3513 cleanup_test32_mount
3515 run_test 32q "stat follows mountpoints in Lustre (should return error)"
3518 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3520 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3521 trap cleanup_test32_mount EXIT
3522 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3523 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3524 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3525 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3526 ls $DIR/$tdir/ext2-mountpoint | grep -q under_the_mount && error || true
3527 cleanup_test32_mount
3529 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
3534 chmod 444 $DIR/$tfile
3535 chown $RUNAS_ID $DIR/$tfile
3537 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3540 run_test 33aa "write file with mode 444 (should return error)"
3544 test_mkdir $DIR/$tdir
3545 chown $RUNAS_ID $DIR/$tdir
3546 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
3547 error "$RUNAS create $tdir/$tfile failed"
3548 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
3549 error "open RDWR" || true
3551 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
3555 test_mkdir $DIR/$tdir
3556 chown $RUNAS_ID $DIR/$tdir
3557 $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
3559 run_test 33b "test open file with malformed flags (No panic)"
3562 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3563 remote_ost_nodsh && skip "remote OST with nodsh"
3572 test_mkdir $DIR/$tdir
3573 # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
3576 for ostnum in $(seq $OSTCOUNT); do
3577 # test-framework's OST numbering is one-based, while Lustre's
3579 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3580 # Parsing llobdstat's output sucks; we could grep the /proc
3581 # path, but that's likely to not be as portable as using the
3582 # llobdstat utility. So we parse lctl output instead.
3583 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3584 obdfilter/$ostname/stats |
3585 awk '/^write_bytes/ {print $7}' )
3586 echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes"
3587 if (( ${write_bytes:-0} > 0 ))
3594 $all_zeros || return 0
3597 echo foo > $DIR/$tdir/bar
3601 # Total up write_bytes after writing. We'd better find non-zeros.
3602 for ostnum in $(seq $OSTCOUNT); do
3603 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3604 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3605 obdfilter/$ostname/stats |
3606 awk '/^write_bytes/ {print $7}' )
3607 echo "write_bytes@$OSTnum/$ostname=$write_bytes"
3608 if (( ${write_bytes:-0} > 0 ))
3617 for ostnum in $(seq $OSTCOUNT); do
3618 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3619 echo "Check that write_bytes is present in obdfilter/*/stats:"
3620 do_facet ost$ostnum lctl get_param -n \
3621 obdfilter/$ostname/stats
3623 error "OST not keeping write_bytes stats (b22312)"
3626 run_test 33c "test llobdstat and write_bytes"
3629 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3630 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3633 local remote_dir=$DIR/$tdir/remote_dir
3635 test_mkdir $DIR/$tdir
3636 $LFS mkdir -i $MDTIDX $remote_dir ||
3637 error "create remote directory failed"
3639 touch $remote_dir/$tfile
3640 chmod 444 $remote_dir/$tfile
3641 chown $RUNAS_ID $remote_dir/$tfile
3643 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3645 chown $RUNAS_ID $remote_dir
3646 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
3647 error "create" || true
3648 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
3649 error "open RDWR" || true
3650 $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
3652 run_test 33d "openfile with 444 modes and malformed flags under remote dir"
3655 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3659 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3660 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3661 mkdir $DIR/$tdir/local_dir
3663 local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3664 local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3665 local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3667 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3668 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
3670 rmdir $DIR/$tdir/* || error "rmdir failed"
3673 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3674 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3675 mkdir $DIR/$tdir/local_dir
3677 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3678 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3679 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3681 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3682 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
3684 rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
3687 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3688 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3689 mkdir $DIR/$tdir/local_dir
3691 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3692 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3693 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3695 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3696 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
3698 run_test 33e "mkdir and striped directory should have same mode"
3702 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
3706 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3707 remote_mds_nodsh && skip "remote MDS with nodsh"
3710 chmod go+rwx $DIR/$tdir
3711 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
3712 trap cleanup_33f EXIT
3714 $RUNAS lfs mkdir -i 0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
3715 error "cannot create striped directory"
3717 $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
3718 error "cannot create files in striped directory"
3720 $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
3721 error "cannot remove files in striped directory"
3723 $RUNAS rmdir $DIR/$tdir/striped_dir ||
3724 error "cannot remove striped directory"
3728 run_test 33f "nonroot user can create, access, and remove a striped directory"
3731 mkdir -p $DIR/$tdir/dir2
3733 local err=$($RUNAS mkdir $DIR/$tdir/dir2 2>&1)
3735 [[ $err =~ "exists" ]] || error "Not exists error"
3737 run_test 33g "nonroot user create already existing root created file"
3739 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
3742 $MCREATE $DIR/f34 || error "mcreate failed"
3743 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" ||
3744 error "getstripe failed"
3745 $TRUNCATE $DIR/f34 $TEST_34_SIZE || error "truncate failed"
3746 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" ||
3747 error "getstripe failed"
3748 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3749 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3751 run_test 34a "truncate file that has not been opened ==========="
3754 [ ! -f $DIR/f34 ] && test_34a
3755 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3756 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3757 $OPENFILE -f O_RDONLY $DIR/f34
3758 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" ||
3759 error "getstripe failed"
3760 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3761 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3763 run_test 34b "O_RDONLY opening file doesn't create objects ====="
3766 [ ! -f $DIR/f34 ] && test_34a
3767 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3768 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3769 $OPENFILE -f O_RDWR $DIR/f34
3770 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" &&
3771 error "$LFS getstripe failed"
3772 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3773 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3775 run_test 34c "O_RDWR opening file-with-size works =============="
3778 [ ! -f $DIR/f34 ] && test_34a
3779 dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 ||
3781 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3782 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3785 run_test 34d "write to sparse file ============================="
3789 $MCREATE $DIR/f34e || error "mcreate failed"
3790 $TRUNCATE $DIR/f34e 1000 || error "truncate failed"
3791 $CHECKSTAT -s 1000 $DIR/f34e ||
3792 error "Size of $DIR/f34e not equal to 1000 bytes"
3793 $OPENFILE -f O_RDWR $DIR/f34e
3794 $CHECKSTAT -s 1000 $DIR/f34e ||
3795 error "Size of $DIR/f34e not equal to 1000 bytes"
3797 run_test 34e "create objects, some with size and some without =="
3799 test_34f() { # bug 6242, 6243
3800 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3804 $MCREATE $DIR/f34f || error "mcreate failed"
3805 $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
3806 dd if=$DIR/f34f of=$TMP/f34f
3807 $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
3808 dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
3809 cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
3810 cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
3811 rm $TMP/f34f $TMP/f34fzero $DIR/f34f
3813 run_test 34f "read from a file with no objects until EOF ======="
3816 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3818 dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE ||
3820 $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error "truncate failed"
3821 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3822 error "Size of $DIR/$tfile not equal to $((TEST_34_SIZE / 2))"
3823 cancel_lru_locks osc
3824 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3825 error "wrong size after lock cancel"
3827 $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error "truncate failed"
3828 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3829 error "expanding truncate failed"
3830 cancel_lru_locks osc
3831 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3832 error "wrong expanded size after lock cancel"
3834 run_test 34g "truncate long file ==============================="
3837 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3842 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error "dd failed"
3843 sync # Flush the cache so that multiop below does not block on cache
3844 # flush when getting the group lock
3845 $MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
3848 # Since just timed wait is not good enough, let's do a sync write
3849 # that way we are sure enough time for a roundtrip + processing
3850 # passed + 2 seconds of extra margin.
3851 dd if=/dev/zero of=$DIR/${tfile}-1 bs=$PAGE_SIZE oflag=direct count=1
3855 if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then
3856 error "Multiop blocked on ftruncate, pid=$MULTIPID"
3860 local nsz=`stat -c %s $DIR/$tfile`
3861 [[ $nsz == $sz ]] || error "New size wrong $nsz != $sz"
3863 run_test 34h "ftruncate file under grouplock should not block"
3866 cp /bin/sh $DIR/f35a
3868 chown $RUNAS_ID $DIR/f35a
3869 $RUNAS $DIR/f35a && error || true
3872 run_test 35a "exec file with mode 444 (should return and not leak)"
3876 utime $DIR/f36 || error "utime failed for MDS"
3878 run_test 36a "MDS utime check (mknod, utime)"
3882 utime $DIR/f36 || error "utime failed for OST"
3884 run_test 36b "OST utime check (open, utime)"
3889 chown $RUNAS_ID $DIR/d36
3890 $RUNAS utime $DIR/d36/f36 || error "utime failed for MDS as non-root"
3892 run_test 36c "non-root MDS utime check (mknod, utime)"
3895 [ ! -d $DIR/d36 ] && test_36c
3896 echo "" > $DIR/d36/f36
3897 $RUNAS utime $DIR/d36/f36 || error "utime failed for OST as non-root"
3899 run_test 36d "non-root OST utime check (open, utime)"
3902 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping"
3904 test_mkdir $DIR/$tdir
3905 touch $DIR/$tdir/$tfile
3906 $RUNAS utime $DIR/$tdir/$tfile &&
3907 error "utime worked, expected failure" || true
3909 run_test 36e "utime on non-owned file (should return error)"
3913 local LANG_SAVE=$LANG
3914 local LC_LANG_SAVE=$LC_LANG
3915 export LANG=C LC_LANG=C # for date language
3917 DATESTR="Dec 20 2000"
3918 test_mkdir $DIR/$tdir
3919 lctl set_param fail_loc=$fl
3921 cp /etc/hosts $DIR/$tdir/$tfile
3922 sync & # write RPC generated with "current" inode timestamp, but delayed
3924 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
3925 LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
3926 cancel_lru_locks $OSC
3927 LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object
3929 [ "$LS_BEFORE" != "$LS_AFTER" ] && \
3930 echo "BEFORE: $LS_BEFORE" && \
3931 echo "AFTER : $LS_AFTER" && \
3932 echo "WANT : $DATESTR" && \
3933 error "$DIR/$tdir/$tfile timestamps changed" || true
3935 export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE
3939 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3941 #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
3942 subr_36fh "0x80000214"
3944 run_test 36f "utime on file racing with OST BRW write =========="
3947 remote_ost_nodsh && skip "remote OST with nodsh"
3948 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3949 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
3950 skip "Need MDS version at least 2.12.51"
3955 local tgt="obdfilter"
3957 [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1"
3959 test_mkdir $DIR/$tdir
3960 fmd_max_age=$(do_facet $facet \
3961 "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \
3964 echo "FMD max age: ${fmd_max_age}s"
3965 touch $DIR/$tdir/$tfile
3966 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3967 gawk '{cnt=cnt+$1} END{print cnt}')
3968 echo "FMD before: $fmd"
3970 error "FMD wasn't create by touch"
3971 sleep $((fmd_max_age + 12))
3972 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3973 gawk '{cnt=cnt+$1} END{print cnt}')
3974 echo "FMD after: $fmd"
3976 error "FMD wasn't expired by ping"
3978 run_test 36g "FMD cache expiry ====================="
3981 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3983 #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227
3984 subr_36fh "0x80000227"
3986 run_test 36h "utime on file racing with OST BRW write =========="
3989 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3991 test_mkdir $DIR/$tdir
3992 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
3994 local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
3995 local new_mtime=$((mtime + 200))
3997 #change Modify time of striped dir
3998 touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
3999 error "change mtime failed"
4001 local got=$(stat -c%Y $DIR/$tdir/striped_dir)
4003 [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
4005 run_test 36i "change mtime on striped directory"
4007 # test_37 - duplicate with tests 32q 32r
4010 local file=$DIR/$tfile
4012 openfile -f O_DIRECTORY $file
4015 [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true
4016 [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)"
4018 run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ==="
4020 test_39a() { # was test_39
4022 touch $DIR/${tfile}2
4023 # ls -l $DIR/$tfile $DIR/${tfile}2
4024 # ls -lu $DIR/$tfile $DIR/${tfile}2
4025 # ls -lc $DIR/$tfile $DIR/${tfile}2
4027 $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
4028 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
4030 ls -l --full-time $DIR/$tfile $DIR/${tfile}2
4032 ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
4034 ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
4035 error "O_TRUNC didn't change timestamps"
4038 run_test 39a "mtime changed on create"
4041 test_mkdir -c1 $DIR/$tdir
4042 cp -p /etc/passwd $DIR/$tdir/fopen
4043 cp -p /etc/passwd $DIR/$tdir/flink
4044 cp -p /etc/passwd $DIR/$tdir/funlink
4045 cp -p /etc/passwd $DIR/$tdir/frename
4046 ln $DIR/$tdir/funlink $DIR/$tdir/funlink2
4049 echo "aaaaaa" >> $DIR/$tdir/fopen
4050 echo "aaaaaa" >> $DIR/$tdir/flink
4051 echo "aaaaaa" >> $DIR/$tdir/funlink
4052 echo "aaaaaa" >> $DIR/$tdir/frename
4054 local open_new=`stat -c %Y $DIR/$tdir/fopen`
4055 local link_new=`stat -c %Y $DIR/$tdir/flink`
4056 local unlink_new=`stat -c %Y $DIR/$tdir/funlink`
4057 local rename_new=`stat -c %Y $DIR/$tdir/frename`
4059 cat $DIR/$tdir/fopen > /dev/null
4060 ln $DIR/$tdir/flink $DIR/$tdir/flink2
4061 rm -f $DIR/$tdir/funlink2
4062 mv -f $DIR/$tdir/frename $DIR/$tdir/frename2
4064 for (( i=0; i < 2; i++ )) ; do
4065 local open_new2=`stat -c %Y $DIR/$tdir/fopen`
4066 local link_new2=`stat -c %Y $DIR/$tdir/flink`
4067 local unlink_new2=`stat -c %Y $DIR/$tdir/funlink`
4068 local rename_new2=`stat -c %Y $DIR/$tdir/frename2`
4070 [ $open_new2 -eq $open_new ] || error "open file reverses mtime"
4071 [ $link_new2 -eq $link_new ] || error "link file reverses mtime"
4072 [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime"
4073 [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime"
4075 cancel_lru_locks $OSC
4076 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4079 run_test 39b "mtime change on open, link, unlink, rename ======"
4081 # this should be set to past
4082 TEST_39_MTIME=`date -d "1 year ago" +%s`
4088 local mtime0=`stat -c %Y $DIR1/$tfile`
4090 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4091 local mtime1=`stat -c %Y $DIR1/$tfile`
4092 [ "$mtime1" = $TEST_39_MTIME ] || \
4093 error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME"
4096 echo hello >> $DIR1/$tfile
4098 local mtime2=`stat -c %Y $DIR1/$tfile`
4099 [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \
4100 error "mtime is not updated on write: $d1 <= $mtime2 <= $d2"
4102 mv $DIR1/$tfile $DIR1/$tfile-1
4104 for (( i=0; i < 2; i++ )) ; do
4105 local mtime3=`stat -c %Y $DIR1/$tfile-1`
4106 [ "$mtime2" = "$mtime3" ] || \
4107 error "mtime ($mtime2) changed (to $mtime3) on rename"
4109 cancel_lru_locks $OSC
4110 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4113 run_test 39c "mtime change on rename ==========================="
4117 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4120 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4122 for (( i=0; i < 2; i++ )) ; do
4123 local mtime=`stat -c %Y $DIR1/$tfile`
4124 [ $mtime = $TEST_39_MTIME ] || \
4125 error "mtime($mtime) is not set to $TEST_39_MTIME"
4127 cancel_lru_locks $OSC
4128 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4131 run_test 39d "create, utime, stat =============================="
4135 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4138 local mtime1=`stat -c %Y $DIR1/$tfile`
4140 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4142 for (( i=0; i < 2; i++ )) ; do
4143 local mtime2=`stat -c %Y $DIR1/$tfile`
4144 [ $mtime2 = $TEST_39_MTIME ] || \
4145 error "mtime($mtime2) is not set to $TEST_39_MTIME"
4147 cancel_lru_locks $OSC
4148 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4151 run_test 39e "create, stat, utime, stat ========================"
4155 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4158 mtime1=`stat -c %Y $DIR1/$tfile`
4161 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4163 for (( i=0; i < 2; i++ )) ; do
4164 local mtime2=`stat -c %Y $DIR1/$tfile`
4165 [ $mtime2 = $TEST_39_MTIME ] || \
4166 error "mtime($mtime2) is not set to $TEST_39_MTIME"
4168 cancel_lru_locks $OSC
4169 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4172 run_test 39f "create, stat, sleep, utime, stat ================="
4176 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4178 echo hello >> $DIR1/$tfile
4179 local mtime1=`stat -c %Y $DIR1/$tfile`
4182 chmod o+r $DIR1/$tfile
4184 for (( i=0; i < 2; i++ )) ; do
4185 local mtime2=`stat -c %Y $DIR1/$tfile`
4186 [ "$mtime1" = "$mtime2" ] || \
4187 error "lost mtime: $mtime2, should be $mtime1"
4189 cancel_lru_locks $OSC
4190 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4193 run_test 39g "write, chmod, stat ==============================="
4197 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4203 echo hello >> $DIR1/$tfile
4204 local mtime1=`stat -c %Y $DIR1/$tfile`
4206 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4208 if [ "$d1" != "$d2" ]; then
4209 echo "write and touch not within one second"
4211 for (( i=0; i < 2; i++ )) ; do
4212 local mtime2=`stat -c %Y $DIR1/$tfile`
4213 [ "$mtime2" = $TEST_39_MTIME ] || \
4214 error "lost mtime: $mtime2, should be $TEST_39_MTIME"
4216 cancel_lru_locks $OSC
4217 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4221 run_test 39h "write, utime within one second, stat ============="
4224 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4229 echo hello >> $DIR1/$tfile
4230 local mtime1=`stat -c %Y $DIR1/$tfile`
4232 mv $DIR1/$tfile $DIR1/$tfile-1
4234 for (( i=0; i < 2; i++ )) ; do
4235 local mtime2=`stat -c %Y $DIR1/$tfile-1`
4237 [ "$mtime1" = "$mtime2" ] || \
4238 error "lost mtime: $mtime2, should be $mtime1"
4240 cancel_lru_locks $OSC
4241 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4244 run_test 39i "write, rename, stat =============================="
4247 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4249 start_full_debug_logging
4253 #define OBD_FAIL_OSC_DELAY_SETTIME 0x412
4254 lctl set_param fail_loc=0x80000412
4255 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c ||
4256 error "multiop failed"
4258 local mtime1=`stat -c %Y $DIR1/$tfile`
4260 mv $DIR1/$tfile $DIR1/$tfile-1
4262 kill -USR1 $multipid
4263 wait $multipid || error "multiop close failed"
4265 for (( i=0; i < 2; i++ )) ; do
4266 local mtime2=`stat -c %Y $DIR1/$tfile-1`
4267 [ "$mtime1" = "$mtime2" ] ||
4268 error "mtime is lost on close: $mtime2, " \
4272 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4274 lctl set_param fail_loc=0
4275 stop_full_debug_logging
4277 run_test 39j "write, rename, close, stat ======================="
4280 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4285 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed"
4287 local mtime1=`stat -c %Y $DIR1/$tfile`
4289 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4291 kill -USR1 $multipid
4292 wait $multipid || error "multiop close failed"
4294 for (( i=0; i < 2; i++ )) ; do
4295 local mtime2=`stat -c %Y $DIR1/$tfile`
4297 [ "$mtime2" = $TEST_39_MTIME ] || \
4298 error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
4301 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4304 run_test 39k "write, utime, close, stat ========================"
4306 # this should be set to future
4307 TEST_39_ATIME=`date -d "1 year" +%s`
4310 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4311 remote_mds_nodsh && skip "remote MDS with nodsh"
4313 local atime_diff=$(do_facet $SINGLEMDS \
4314 lctl get_param -n mdd.*MDT0000*.atime_diff)
4318 # test setting directory atime to future
4319 touch -a -d @$TEST_39_ATIME $DIR/$tdir
4320 local atime=$(stat -c %X $DIR/$tdir)
4321 [ "$atime" = $TEST_39_ATIME ] ||
4322 error "atime is not set to future: $atime, $TEST_39_ATIME"
4324 # test setting directory atime from future to now
4325 local now=$(date +%s)
4326 touch -a -d @$now $DIR/$tdir
4328 atime=$(stat -c %X $DIR/$tdir)
4329 [ "$atime" -eq "$now" ] ||
4330 error "atime is not updated from future: $atime, $now"
4332 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=2
4335 # test setting directory atime when now > dir atime + atime_diff
4336 local d1=$(date +%s)
4338 local d2=$(date +%s)
4339 cancel_lru_locks mdc
4340 atime=$(stat -c %X $DIR/$tdir)
4341 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
4342 error "atime is not updated : $atime, should be $d2"
4344 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=60
4347 # test not setting directory atime when now < dir atime + atime_diff
4349 cancel_lru_locks mdc
4350 atime=$(stat -c %X $DIR/$tdir)
4351 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
4352 error "atime is updated to $atime, should remain $d1<atime<$d2"
4354 do_facet $SINGLEMDS \
4355 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
4357 run_test 39l "directory atime update ==========================="
4360 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4364 local far_past_mtime=$(date -d "May 29 1953" +%s)
4365 local far_past_atime=$(date -d "Dec 17 1903" +%s)
4367 touch -m -d @$far_past_mtime $DIR1/$tfile
4368 touch -a -d @$far_past_atime $DIR1/$tfile
4370 for (( i=0; i < 2; i++ )) ; do
4371 local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
4372 [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
4373 error "atime or mtime set incorrectly"
4375 cancel_lru_locks $OSC
4376 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4379 run_test 39m "test atime and mtime before 1970"
4381 test_39n() { # LU-3832
4382 remote_mds_nodsh && skip "remote MDS with nodsh"
4384 local atime_diff=$(do_facet $SINGLEMDS \
4385 lctl get_param -n mdd.*MDT0000*.atime_diff)
4390 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
4393 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
4394 atime0=$(stat -c %X $DIR/$tfile)
4397 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
4398 atime1=$(stat -c %X $DIR/$tfile)
4401 cancel_lru_locks mdc
4402 cancel_lru_locks osc
4403 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
4404 atime2=$(stat -c %X $DIR/$tfile)
4406 do_facet $SINGLEMDS \
4407 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
4409 [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
4410 [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
4412 run_test 39n "check that O_NOATIME is honored"
4415 TESTDIR=$DIR/$tdir/$tfile
4416 [ -e $TESTDIR ] && rm -rf $TESTDIR
4423 links2=$(stat -c %h .)
4424 [ $(($links1 + 2)) != $links2 ] &&
4425 error "wrong links count $(($links1 + 2)) != $links2"
4427 links3=$(stat -c %h .)
4428 [ $(($links1 + 1)) != $links3 ] &&
4429 error "wrong links count $links1 != $links3"
4432 run_test 39o "directory cached attributes updated after create"
4435 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
4438 TESTDIR=$DIR/$tdir/$tdir
4439 [ -e $TESTDIR ] && rm -rf $TESTDIR
4440 test_mkdir -p $TESTDIR
4444 test_mkdir -i $MDTIDX $TESTDIR/remote_dir1
4445 test_mkdir -i $MDTIDX $TESTDIR/remote_dir2
4447 links2=$(stat -c %h .)
4448 [ $(($links1 + 2)) != $links2 ] &&
4449 error "wrong links count $(($links1 + 2)) != $links2"
4451 links3=$(stat -c %h .)
4452 [ $(($links1 + 1)) != $links3 ] &&
4453 error "wrong links count $links1 != $links3"
4456 run_test 39p "remote directory cached attributes updated after create ========"
4459 test_39q() { # LU-8041
4460 local testdir=$DIR/$tdir
4462 multiop_bg_pause $testdir D_c || error "multiop failed"
4464 cancel_lru_locks mdc
4465 kill -USR1 $multipid
4466 local atime=$(stat -c %X $testdir)
4467 [ "$atime" -ne 0 ] || error "atime is zero"
4469 run_test 39q "close won't zero out atime"
4472 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
4473 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
4474 error "openfile O_WRONLY:O_TRUNC $tfile failed"
4475 $CHECKSTAT -t file -s 4096 $DIR/$tfile ||
4476 error "$tfile is not 4096 bytes in size"
4478 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
4482 small_write $DIR/f41 18
4484 run_test 41 "test small file write + fstat ====================="
4486 count_ost_writes() {
4487 lctl get_param -n ${OSC}.*.stats |
4488 awk -vwrites=0 '/ost_write/ { writes += $2 } \
4489 END { printf("%0.0f", writes) }'
4496 BG_DIRTY_RATIO_SAVE=10
4497 MAX_BG_DIRTY_RATIO=25
4501 # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs,
4502 # dirty_ratio, dirty_background_ratio
4503 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4504 sysctl -w vm.dirty_writeback_centisecs=$WRITEBACK_SAVE
4505 sysctl -w vm.dirty_background_ratio=$BG_DIRTY_RATIO_SAVE
4506 sysctl -w vm.dirty_ratio=$DIRTY_RATIO_SAVE
4508 # if file not here, we are a 2.4 kernel
4509 kill -CONT `pidof kupdated`
4514 # setup the trap first, so someone cannot exit the test at the
4515 # exact wrong time and mess up a machine
4516 trap start_writeback EXIT
4517 # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
4518 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4519 WRITEBACK_SAVE=`sysctl -n vm.dirty_writeback_centisecs`
4520 sysctl -w vm.dirty_writeback_centisecs=0
4521 sysctl -w vm.dirty_writeback_centisecs=0
4522 # save and increase /proc/sys/vm/dirty_ratio
4523 DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_ratio`
4524 sysctl -w vm.dirty_ratio=$MAX_DIRTY_RATIO
4525 # save and increase /proc/sys/vm/dirty_background_ratio
4526 BG_DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_background_ratio`
4527 sysctl -w vm.dirty_background_ratio=$MAX_BG_DIRTY_RATIO
4529 # if file not here, we are a 2.4 kernel
4530 kill -STOP `pidof kupdated`
4534 # ensure that all stripes have some grant before we test client-side cache
4536 for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
4537 dd if=/dev/zero of=$i bs=4k count=1
4542 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
4543 # file truncation, and file removal.
4545 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4548 cancel_lru_locks $OSC
4550 sync; sleep 1; sync # just to be safe
4551 BEFOREWRITES=`count_ost_writes`
4552 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur_grant_bytes | grep "[0-9]"
4553 dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
4554 AFTERWRITES=`count_ost_writes`
4555 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
4556 error "$BEFOREWRITES < $AFTERWRITES"
4559 run_test 42a "ensure that we don't flush on close"
4562 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4565 cancel_lru_locks $OSC
4568 dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
4569 BEFOREWRITES=$(count_ost_writes)
4570 $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
4571 AFTERWRITES=$(count_ost_writes)
4572 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4573 error "$BEFOREWRITES < $AFTERWRITES on unlink"
4575 BEFOREWRITES=$(count_ost_writes)
4576 sync || error "sync: $?"
4577 AFTERWRITES=$(count_ost_writes)
4578 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4579 error "$BEFOREWRITES < $AFTERWRITES on sync"
4581 dmesg | grep 'error from obd_brw_async' && error 'error writing back'
4585 run_test 42b "test destroy of file with cached dirty data ======"
4587 # if these tests just want to test the effect of truncation,
4588 # they have to be very careful. consider:
4589 # - the first open gets a {0,EOF}PR lock
4590 # - the first write conflicts and gets a {0, count-1}PW
4591 # - the rest of the writes are under {count,EOF}PW
4592 # - the open for truncate tries to match a {0,EOF}PR
4593 # for the filesize and cancels the PWs.
4594 # any number of fixes (don't get {0,EOF} on open, match
4595 # composite locks, do smarter file size management) fix
4596 # this, but for now we want these tests to verify that
4597 # the cancellation with truncate intent works, so we
4598 # start the file with a full-file pw lock to match against
4599 # until the truncate.
4604 cancel_lru_locks $OSC
4606 # prime the file with 0,EOF PW to match
4610 # now the real test..
4611 dd if=/dev/zero of=$file bs=1024 count=100
4612 BEFOREWRITES=`count_ost_writes`
4613 $TRUNCATE $file $offset
4614 cancel_lru_locks $OSC
4615 AFTERWRITES=`count_ost_writes`
4620 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4623 [ $BEFOREWRITES -eq $AFTERWRITES ] &&
4624 error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
4627 run_test 42c "test partial truncate of file with cached dirty data"
4630 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4633 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
4634 error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
4637 run_test 42d "test complete truncate of file with cached dirty data"
4639 test_42e() { # bug22074
4640 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4642 local TDIR=$DIR/${tdir}e
4643 local pages=16 # hardcoded 16 pages, don't change it.
4644 local files=$((OSTCOUNT * 500)) # hopefully 500 files on each OST
4645 local proc_osc0="osc.${FSNAME}-OST0000-osc-[^MDT]*"
4649 test_mkdir $DIR/${tdir}e
4650 $LFS setstripe -c 1 $TDIR
4651 createmany -o $TDIR/f $files
4653 max_dirty_mb=$($LCTL get_param -n $proc_osc0/max_dirty_mb)
4655 # we assume that with $OSTCOUNT files, at least one of them will
4656 # be allocated on OST0.
4657 warmup_files=$((OSTCOUNT * max_dirty_mb))
4658 createmany -o $TDIR/w $warmup_files
4660 # write a large amount of data into one file and sync, to get good
4661 # avail_grant number from OST.
4662 for ((i=0; i<$warmup_files; i++)); do
4663 idx=$($LFS getstripe -i $TDIR/w$i)
4664 [ $idx -ne 0 ] && continue
4665 dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1
4668 [[ $i -gt $warmup_files ]] && error "OST0 is still cold"
4670 $LCTL get_param $proc_osc0/cur_dirty_bytes
4671 $LCTL get_param $proc_osc0/cur_grant_bytes
4673 # create as much dirty pages as we can while not to trigger the actual
4674 # RPCs directly. but depends on the env, VFS may trigger flush during this
4675 # period, hopefully we are good.
4676 for ((i=0; i<$warmup_files; i++)); do
4677 idx=$($LFS getstripe -i $TDIR/w$i)
4678 [ $idx -ne 0 ] && continue
4679 dd if=/dev/zero of=$TDIR/w$i bs=1M count=1 2>/dev/null
4681 $LCTL get_param $proc_osc0/cur_dirty_bytes
4682 $LCTL get_param $proc_osc0/cur_grant_bytes
4684 # perform the real test
4685 $LCTL set_param $proc_osc0/rpc_stats 0
4686 for ((;i<$files; i++)); do
4687 [ $($LFS getstripe -i $TDIR/f$i) -eq 0 ] || continue
4688 dd if=/dev/zero of=$TDIR/f$i bs=$PAGE_SIZE count=$pages 2>/dev/null
4691 $LCTL get_param $proc_osc0/rpc_stats
4694 local have_ppr=false
4695 $LCTL get_param $proc_osc0/rpc_stats |
4696 while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do
4697 # skip lines until we are at the RPC histogram data
4698 [ "$PPR" == "pages" ] && have_ppr=true && continue
4699 $have_ppr || continue
4701 # we only want the percent stat for < 16 pages
4702 [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break
4704 percent=$((percent + WPCT))
4705 if [[ $percent -gt 15 ]]; then
4706 error "less than 16-pages write RPCs" \
4713 run_test 42e "verify sub-RPC writes are not done synchronously"
4715 test_43A() { # was test_43
4716 test_mkdir $DIR/$tdir
4717 cp -p /bin/ls $DIR/$tdir/$tfile
4718 $MULTIOP $DIR/$tdir/$tfile Ow_c &
4720 # give multiop a chance to open
4723 $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true
4726 run_test 43A "execution of file opened for write should return -ETXTBSY"
4729 test_mkdir $DIR/$tdir
4730 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4731 $DIR/$tdir/sleep 60 &
4733 # Make sure exec of $tdir/sleep wins race with truncate
4735 $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success"
4738 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
4741 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4743 test_mkdir $DIR/$tdir
4744 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4745 $DIR/$tdir/sleep 60 &
4747 # Make sure exec of $tdir/sleep wins race with truncate
4749 $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success"
4752 run_test 43b "truncate of file being executed should return -ETXTBSY"
4755 local testdir="$DIR/$tdir"
4758 ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) |
4759 ( cd $testdir && md5sum -c )
4761 run_test 43c "md5sum of copy into lustre"
4763 test_44A() { # was test_44
4764 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4766 dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
4767 dd if=$DIR/f1 bs=4k count=1 > /dev/null
4769 run_test 44A "zero length read from a sparse stripe"
4772 local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
4774 [ -z "$nstripe" ] && skip "can't get stripe info"
4775 [[ $nstripe -gt $OSTCOUNT ]] &&
4776 skip "Wrong default_stripe_count: $nstripe OSTCOUNT: $OSTCOUNT"
4778 local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: |
4780 if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then
4781 nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: |
4785 OFFSETS="0 $((stride/2)) $((stride-1))"
4786 for offset in $OFFSETS; do
4787 for i in $(seq 0 $((nstripe-1))); do
4788 local GLOBALOFFSETS=""
4790 local size=$((((i + 2 * $nstripe )*$stride + $offset)))
4791 local myfn=$DIR/d44a-$size
4792 echo "--------writing $myfn at $size"
4793 ll_sparseness_write $myfn $size ||
4794 error "ll_sparseness_write"
4795 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4796 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4797 error "ll_sparseness_verify $GLOBALOFFSETS"
4799 for j in $(seq 0 $((nstripe-1))); do
4801 size=$((((j + $nstripe )*$stride + $offset)))
4802 ll_sparseness_write $myfn $size ||
4803 error "ll_sparseness_write"
4804 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4806 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4807 error "ll_sparseness_verify $GLOBALOFFSETS"
4812 run_test 44a "test sparse pwrite ==============================="
4816 for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
4822 before=`dirty_osc_total`
4823 echo executing "\"$*\""
4825 after=`dirty_osc_total`
4826 echo before $before, after $after
4829 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4832 # Obtain grants from OST if it supports it
4833 echo blah > ${f}_grant
4836 do_dirty_record "echo blah > $f"
4837 [[ $before -eq $after ]] && error "write wasn't cached"
4838 do_dirty_record "> $f"
4839 [[ $before -gt $after ]] || error "truncate didn't lower dirty count"
4840 do_dirty_record "echo blah > $f"
4841 [[ $before -eq $after ]] && error "write wasn't cached"
4842 do_dirty_record "sync"
4843 [[ $before -gt $after ]] || error "writeback didn't lower dirty count"
4844 do_dirty_record "echo blah > $f"
4845 [[ $before -eq $after ]] && error "write wasn't cached"
4846 do_dirty_record "cancel_lru_locks osc"
4847 [[ $before -gt $after ]] ||
4848 error "lock cancellation didn't lower dirty count"
4851 run_test 45 "osc io page accounting ============================"
4853 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this
4854 # test tickles a bug where re-dirtying a page was failing to be mapped to the
4855 # objects offset and an assert hit when an rpc was built with 1023's mapped
4856 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
4858 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4863 dd if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4865 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=1023 count=1
4866 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4870 run_test 46 "dirtying a previously written page ================"
4872 # test_47 is removed "Device nodes check" is moved to test_28
4874 test_48a() { # bug 2399
4875 [ "$mds1_FSTYPE" = "zfs" ] &&
4876 [ $MDS1_VERSION -lt $(version_code 2.3.63) ] &&
4877 skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly"
4879 test_mkdir $DIR/$tdir
4881 mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
4882 test_mkdir $DIR/$tdir
4883 touch foo || error "'touch foo' failed after recreating cwd"
4885 touch .foo || error "'touch .foo' failed after recreating cwd"
4887 ls . > /dev/null || error "'ls .' failed after recreating cwd"
4888 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4889 cd . || error "'cd .' failed after recreating cwd"
4890 mkdir . && error "'mkdir .' worked after recreating cwd"
4891 rmdir . && error "'rmdir .' worked after recreating cwd"
4892 ln -s . baz || error "'ln -s .' failed after recreating cwd"
4893 cd .. || error "'cd ..' failed after recreating cwd"
4895 run_test 48a "Access renamed working dir (should return errors)="
4897 test_48b() { # bug 2399
4899 test_mkdir $DIR/$tdir
4901 rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
4902 touch foo && error "'touch foo' worked after removing cwd"
4903 mkdir foo && error "'mkdir foo' worked after removing cwd"
4904 touch .foo && error "'touch .foo' worked after removing cwd"
4905 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
4906 ls . > /dev/null && error "'ls .' worked after removing cwd"
4907 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4908 mkdir . && error "'mkdir .' worked after removing cwd"
4909 rmdir . && error "'rmdir .' worked after removing cwd"
4910 ln -s . foo && error "'ln -s .' worked after removing cwd"
4911 cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
4913 run_test 48b "Access removed working dir (should return errors)="
4915 test_48c() { # bug 2350
4916 #lctl set_param debug=-1
4919 test_mkdir -p $DIR/$tdir/dir
4921 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4922 $TRACE touch foo && error "touch foo worked after removing cwd"
4923 $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
4924 touch .foo && error "touch .foo worked after removing cwd"
4925 mkdir .foo && error "mkdir .foo worked after removing cwd"
4926 $TRACE ls . && error "'ls .' worked after removing cwd"
4927 $TRACE ls .. || error "'ls ..' failed after removing cwd"
4928 $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
4929 $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
4930 $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
4931 $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
4933 run_test 48c "Access removed working subdir (should return errors)"
4935 test_48d() { # bug 2350
4936 #lctl set_param debug=-1
4939 test_mkdir -p $DIR/$tdir/dir
4941 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4942 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4943 $TRACE touch foo && error "'touch foo' worked after removing parent"
4944 $TRACE mkdir foo && error "mkdir foo worked after removing parent"
4945 touch .foo && error "'touch .foo' worked after removing parent"
4946 mkdir .foo && error "mkdir .foo worked after removing parent"
4947 $TRACE ls . && error "'ls .' worked after removing parent"
4948 $TRACE ls .. && error "'ls ..' worked after removing parent"
4949 $TRACE mkdir . && error "'mkdir .' worked after removing parent"
4950 $TRACE rmdir . && error "'rmdir .' worked after removing parent"
4951 $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
4954 run_test 48d "Access removed parent subdir (should return errors)"
4956 test_48e() { # bug 4134
4957 #lctl set_param debug=-1
4960 test_mkdir -p $DIR/$tdir/dir
4962 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4963 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4964 $TRACE touch $DIR/$tdir || error "'touch $DIR/$tdir' failed"
4965 $TRACE chmod +x $DIR/$tdir || error "'chmod +x $DIR/$tdir' failed"
4966 # On a buggy kernel addition of "touch foo" after cd .. will
4967 # produce kernel oops in lookup_hash_it
4968 touch ../foo && error "'cd ..' worked after recreate parent"
4970 $TRACE rm $DIR/$tdir || error "rm '$DIR/$tdir' failed"
4972 run_test 48e "Access to recreated parent subdir (should return errors)"
4974 test_49() { # LU-1030
4975 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4976 remote_ost_nodsh && skip "remote OST with nodsh"
4978 # get ost1 size - lustre-OST0000
4979 ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
4981 # write 800M at maximum
4982 [[ $ost1_size -lt 2 ]] && ost1_size=2
4983 [[ $ost1_size -gt 819200 ]] && ost1_size=819200
4985 $LFS setstripe -c 1 -i 0 $DIR/$tfile
4986 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) &
4989 # change max_pages_per_rpc while writing the file
4990 local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc
4991 local orig_mppc=$($LCTL get_param -n $osc1_mppc)
4992 # loop until dd process exits
4993 while ps ax -opid | grep -wq $dd_pid; do
4994 $LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1))
4995 sleep $((RANDOM % 5 + 1))
4997 # restore original max_pages_per_rpc
4998 $LCTL set_param $osc1_mppc=$orig_mppc
4999 rm $DIR/$tfile || error "rm $DIR/$tfile failed"
5001 run_test 49 "Change max_pages_per_rpc won't break osc extent"
5005 test_mkdir $DIR/$tdir
5007 ls /proc/$$/cwd || error "ls /proc/$$/cwd failed"
5009 run_test 50 "special situations: /proc symlinks ==============="
5011 test_51a() { # was test_51
5012 # bug 1516 - create an empty entry right after ".." then split dir
5013 test_mkdir -c1 $DIR/$tdir
5014 touch $DIR/$tdir/foo
5015 $MCREATE $DIR/$tdir/bar
5017 createmany -m $DIR/$tdir/longfile 201
5019 while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do
5020 $MCREATE $DIR/$tdir/longfile$FNUM
5025 ls -l $DIR/$tdir > /dev/null || error "ls -l $DIR/$tdir failed"
5027 run_test 51a "special situations: split htree with empty entry =="
5029 cleanup_print_lfs_df () {
5036 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5038 local dir=$DIR/$tdir
5039 local nrdirs=$((65536 + 100))
5041 # cleanup the directory
5048 local mdtidx=$(printf "%04x" $($LFS getstripe -m $dir))
5049 local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
5050 [[ $numfree -lt $nrdirs ]] &&
5051 skip "not enough free inodes ($numfree) on MDT$mdtidx"
5053 # need to check free space for the directories as well
5054 local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
5055 numfree=$(( blkfree / $(fs_inode_ksize) ))
5056 [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)"
5058 trap cleanup_print_lfs_df EXIT
5061 createmany -d $dir/d $nrdirs || {
5062 unlinkmany $dir/d $nrdirs
5063 error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
5067 nrdirs=$(ls -U $dir | wc -l)
5069 # unlink all but 100 subdirectories, then check it still works
5071 local delete=$((nrdirs - left))
5076 # for ldiskfs the nlink count should be 1, but this is OSD specific
5077 # and so this is listed for informational purposes only
5078 echo "nlink before: $(stat -c %h $dir), created before: $nrdirs"
5079 unlinkmany -d $dir/d $delete ||
5080 error "unlink of first $delete subdirs failed"
5082 echo "nlink between: $(stat -c %h $dir)"
5083 local found=$(ls -U $dir | wc -l)
5084 [ $found -ne $left ] &&
5085 error "can't find subdirs: found only $found, expected $left"
5087 unlinkmany -d $dir/d $delete $left ||
5088 error "unlink of second $left subdirs failed"
5089 # regardless of whether the backing filesystem tracks nlink accurately
5090 # or not, the nlink count shouldn't be more than "." and ".." here
5091 local after=$(stat -c %h $dir)
5092 [[ $after -gt 2 ]] && error "nlink after: $after > 2" ||
5093 echo "nlink after: $after"
5095 cleanup_print_lfs_df
5097 run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
5100 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5101 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
5103 test_mkdir $DIR/$tdir
5104 createmany -o $DIR/$tdir/t- 1000
5105 $LFS getstripe $DIR/$tdir > $TMP/$tfile
5106 for N in $(seq 0 $((OSTCOUNT - 1))); do
5107 OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
5108 END { printf("%0.0f", objs) }' $TMP/$tfile)
5109 OBJS0[$N]=$(grep -A 1 idx $TMP/$tfile | awk -vobjs=0 \
5110 '($1 == '$N') { objs += 1 } \
5111 END { printf("%0.0f", objs) }')
5112 log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
5114 unlinkmany $DIR/$tdir/t- 1000
5117 for N in $(seq 1 $((OSTCOUNT - 1))); do
5118 [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] &&
5119 error "OST $N has less objects vs OST $NLAST" \
5120 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
5121 [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] &&
5122 error "OST $N has less objects vs OST $NLAST" \
5123 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
5125 [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] &&
5126 error "OST $N has less #0 objects vs OST $NLAST" \
5127 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
5128 [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] &&
5129 error "OST $N has less #0 objects vs OST $NLAST" \
5130 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
5135 run_test 51d "check object distribution"
5138 if [ "$mds1_FSTYPE" != ldiskfs ]; then
5139 skip_env "ldiskfs only test"
5142 test_mkdir -c1 $DIR/$tdir
5143 test_mkdir -c1 $DIR/$tdir/d0
5145 touch $DIR/$tdir/d0/foo
5146 createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
5147 error "file exceed 65000 nlink limit!"
5148 unlinkmany $DIR/$tdir/d0/f- 65001
5151 run_test 51e "check file nlink limit"
5154 test_mkdir $DIR/$tdir
5157 local ulimit_old=$(ulimit -n)
5158 local spare=20 # number of spare fd's for scripts/libraries, etc.
5159 local mdt=$($LFS getstripe -m $DIR/$tdir)
5160 local numfree=$($LFS df -i $DIR/$tdir | awk '/MDT:'$mdt'/ { print $4 }')
5162 echo "MDT$mdt numfree=$numfree, max=$max"
5163 [[ $numfree -gt $max ]] && numfree=$max || numfree=$((numfree * 7 / 8))
5164 if [ $((numfree + spare)) -gt $ulimit_old ]; then
5165 while ! ulimit -n $((numfree + spare)); do
5166 numfree=$((numfree * 3 / 4))
5168 echo "changed ulimit from $ulimit_old to $((numfree + spare))"
5170 echo "left ulimit at $ulimit_old"
5173 createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
5174 unlinkmany $DIR/$tdir/f $numfree
5175 error "create+open $numfree files in $DIR/$tdir failed"
5177 ulimit -n $ulimit_old
5179 # if createmany exits at 120s there will be fewer than $numfree files
5180 unlinkmany $DIR/$tdir/f $numfree || true
5182 run_test 51f "check many open files limit"
5185 [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
5186 test_mkdir $DIR/$tdir
5187 touch $DIR/$tdir/foo
5188 chattr +a $DIR/$tdir/foo || error "chattr +a failed"
5189 echo bar >> $DIR/$tdir/foo || error "append bar failed"
5190 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
5191 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
5192 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
5194 echo foo >> $DIR/$tdir/foo || error "append foo failed"
5195 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
5196 lsattr $DIR/$tdir/foo | egrep -q "^-+a[-e]+ $DIR/$tdir/foo" ||
5198 chattr -a $DIR/$tdir/foo || error "chattr -a failed"
5199 cp -r $DIR/$tdir $TMP/
5200 rm -fr $DIR/$tdir $TMP/$tdir || error "cleanup rm failed"
5202 run_test 52a "append-only flag test (should return errors)"
5205 [ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo
5206 test_mkdir $DIR/$tdir
5207 touch $DIR/$tdir/foo
5208 chattr +i $DIR/$tdir/foo || error "chattr +i failed"
5209 cat test > $DIR/$tdir/foo && error "cat test worked"
5210 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
5211 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
5212 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
5214 echo foo >> $DIR/$tdir/foo && error "echo worked"
5215 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
5216 [ -f $DIR/$tdir/foo ] || error "$tdir/foo is not a file"
5217 [ -f $DIR/$tdir/foo_ren ] && error "$tdir/foo_ren is not a file"
5218 lsattr $DIR/$tdir/foo | egrep -q "^-+i[-e]+ $DIR/$tdir/foo" ||
5220 chattr -i $DIR/$tdir/foo || error "chattr failed"
5222 rm -fr $DIR/$tdir || error "unable to remove $DIR/$tdir"
5224 run_test 52b "immutable flag test (should return errors) ======="
5227 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5228 remote_mds_nodsh && skip "remote MDS with nodsh"
5229 remote_ost_nodsh && skip "remote OST with nodsh"
5242 local support_last_seq=true
5244 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
5245 support_last_seq=false
5248 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
5250 for value in $(do_facet $SINGLEMDS \
5251 $LCTL get_param osp.$mdtosc.prealloc_last_id) ; do
5252 param=$(echo ${value[0]} | cut -d "=" -f1)
5253 ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
5255 if $support_last_seq; then
5256 param_seq=$(echo $param |
5257 sed -e s/prealloc_last_id/prealloc_last_seq/g)
5258 mds_last_seq=$(do_facet $SINGLEMDS \
5259 $LCTL get_param -n $param_seq)
5261 mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
5263 ostnum=$(index_from_ostuuid ${ostname}_UUID)
5264 node=$(facet_active_host ost$((ostnum+1)))
5265 param="obdfilter.$ostname.last_id"
5266 for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
5267 echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
5268 ost_last_id=$ost_last
5270 if $support_last_seq; then
5271 ost_last_id=$(echo $ost_last |
5272 awk -F':' '{print $2}' |
5274 ost_last_seq=$(echo $ost_last |
5275 awk -F':' '{print $1}')
5276 [[ $ost_last_seq = $mds_last_seq ]] || continue
5279 if [[ $ost_last_id != $mds_last ]]; then
5280 error "$ost_last_id != $mds_last"
5287 $found || error "can not match last_seq/last_id for $mdtosc"
5290 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
5293 perl -MSocket -e ';' || skip "no Socket perl module installed"
5295 $SOCKETSERVER $DIR/socket ||
5296 error "$SOCKETSERVER $DIR/socket failed: $?"
5297 $SOCKETCLIENT $DIR/socket ||
5298 error "$SOCKETCLIENT $DIR/socket failed: $?"
5299 $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
5301 run_test 54a "unix domain socket test =========================="
5307 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1
5309 run_test 54b "char device works in lustre ======================"
5312 [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
5313 [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
5314 [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
5316 for i in $(seq 3 7); do
5317 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
5326 loopdev="$DIR/loop54c"
5329 $UMOUNT $DIR/$tdir || rc=$?
5330 losetup -d $loopdev || true
5331 losetup -d $LOOPDEV || true
5332 rm -rf $loopdev $DIR/$tfile $DIR/$tdir
5337 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5339 loopdev="$DIR/loop54c"
5342 [ -z "$LOOPNUM" ] && skip_env "couldn't find empty loop device"
5343 trap cleanup_54c EXIT
5344 mknod $loopdev b 7 $LOOPNUM
5345 echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
5346 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE seek=1024 count=1 > /dev/null
5347 losetup $loopdev $DIR/$tfile ||
5348 error "can't set up $loopdev for $DIR/$tfile"
5349 mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
5350 test_mkdir $DIR/$tdir
5351 mount -t ext2 $loopdev $DIR/$tdir ||
5352 error "error mounting $loopdev on $DIR/$tdir"
5353 dd if=/dev/zero of=$DIR/$tdir/tmp bs=$PAGE_SIZE count=30 ||
5356 dd if=$DIR/$tdir/tmp of=/dev/zero bs=$PAGE_SIZE count=30 ||
5360 run_test 54c "block device works in lustre ====================="
5366 [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string"
5368 run_test 54d "fifo device works in lustre ======================"
5373 cp -aL /dev/console $f
5374 echo $string > $f || error "echo $string to $f failed"
5376 run_test 54e "console/tty device works in lustre ======================"
5380 local dir=$DIR/$tdir
5383 test_mkdir -p $dir/dir
5384 for i in $(seq $numfiles); do
5386 touch $dir/dir/file$i
5389 local numcomp=$($LFS getstripe --component-count $dir)
5391 [[ $numcomp == 0 ]] && numcomp=1
5393 # test lfs getstripe with --recursive
5394 local filenum=$($LFS getstripe -r $dir | egrep -c "obdidx|l_ost_idx")
5396 [[ $filenum -eq $((numfiles * 2)) ]] ||
5397 error "$LFS getstripe -r: found $filenum != $((numfiles * 2))"
5398 filenum=$($LFS getstripe $dir | egrep -c "obdidx|l_ost_idx")
5399 [[ $filenum -eq $numfiles ]] ||
5400 error "$LFS getstripe $dir: found $filenum, not $numfiles"
5401 echo "$LFS getstripe showed obdidx or l_ost_idx"
5403 # test lfs getstripe with file instead of dir
5404 filenum=$($LFS getstripe $dir/file1 | egrep -c "obdidx|l_ost_idx")
5405 [[ $filenum -eq 1 ]] ||
5406 error "$LFS getstripe $dir/file1: found $filenum, not 1"
5407 echo "$LFS getstripe file1 passed"
5409 #test lfs getstripe with --verbose
5410 filenum=$($LFS getstripe --verbose $dir | grep -c lmm_magic)
5411 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
5412 error "$LFS getstripe --verbose $dir: "\
5413 "got $filenum want $((numfiles * numcomp)) lmm_magic"
5414 [[ $($LFS getstripe $dir | grep -c lmm_magic) -eq 0 ]] ||
5415 error "$LFS getstripe $dir: showed lmm_magic"
5417 #test lfs getstripe with -v prints lmm_fid
5418 filenum=$($LFS getstripe -v $dir | grep -c lmm_fid)
5419 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
5420 error "$LFS getstripe -v $dir: "\
5421 "got $filenum want $((numfiles * numcomp)) lmm_fid"
5422 [[ $($LFS getstripe $dir | grep -c lmm_fid) -eq 0 ]] ||
5423 error "$LFS getstripe $dir: showed lmm_fid by default"
5424 echo "$LFS getstripe --verbose passed"
5426 #check for FID information
5427 local fid1=$($LFS getstripe --fid $dir/file1)
5428 local fid2=$($LFS getstripe --verbose $dir/file1 |
5429 awk '/lmm_fid: / { print $2; exit; }')
5430 local fid3=$($LFS path2fid $dir/file1)
5432 [ "$fid1" != "$fid2" ] &&
5433 error "getstripe --fid '$fid1' != getstripe --verbose '$fid2'"
5434 [ "$fid1" != "$fid3" ] &&
5435 error "getstripe --fid '$fid1' != lfs path2fid '$fid3'"
5436 echo "$LFS getstripe --fid passed"
5438 #test lfs getstripe with --obd
5439 $LFS getstripe --obd wrong_uuid $dir 2>&1 | grep -q "unknown obduuid" ||
5440 error "$LFS getstripe --obd wrong_uuid: should return error"
5442 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5445 local obduuid=$(ostuuid_from_index $ostidx)
5446 local found=$($LFS getstripe -r --obd $obduuid $dir |
5447 grep 'lmm_stripe_offset:' | grep -c " $ostidx\$")
5449 filenum=$($LFS getstripe -ir $dir | grep -c "^$ostidx\$")
5450 [[ $($LFS getstripe -id $dir) -ne $ostidx ]] ||
5452 [[ $($LFS getstripe -id $dir/dir) -ne $ostidx ]] ||
5455 [[ $found -eq $filenum ]] ||
5456 error "$LFS getstripe --obd: found $found expect $filenum"
5457 [[ $($LFS getstripe -r -v --obd $obduuid $dir |
5458 sed '/^[ ]*'${ostidx}'[ ]/d' |
5459 sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] ||
5460 error "$LFS getstripe --obd: should not show file on other obd"
5461 echo "$LFS getstripe --obd passed"
5463 run_test 56a "check $LFS getstripe"
5466 local dir=$DIR/$tdir
5470 for i in $(seq $numdirs); do
5471 test_mkdir $dir/dir$i
5474 # test lfs getdirstripe default mode is non-recursion, which is
5475 # different from lfs getstripe
5476 local dircnt=$($LFS getdirstripe $dir | grep -c lmv_stripe_count)
5478 [[ $dircnt -eq 1 ]] ||
5479 error "$LFS getdirstripe: found $dircnt, not 1"
5480 dircnt=$($LFS getdirstripe --recursive $dir |
5481 grep -c lmv_stripe_count)
5482 [[ $dircnt -eq $((numdirs + 1)) ]] ||
5483 error "$LFS getdirstripe -r: $dircnt, != $((numdirs + 1))"
5485 run_test 56b "check $LFS getdirstripe"
5488 remote_ost_nodsh && skip "remote OST with nodsh"
5491 local ost_name=$(ostname_from_index $ost_idx)
5492 local old_status=$(ost_dev_status $ost_idx)
5494 [[ -z "$old_status" ]] ||
5495 skip_env "OST $ost_name is in $old_status status"
5497 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
5498 [[ $OST1_VERSION -ge $(version_code 2.12.55) ]] && do_facet ost1 \
5499 $LCTL set_param -n obdfilter.$ost_name.no_precreate=1
5502 local new_status=$(ost_dev_status $ost_idx)
5504 [[ "$new_status" =~ "D" ]] ||
5505 error "$ost_name status is '$new_status', missing 'D'"
5506 if [[ $OST1_VERSION -ge $(version_code 2.12.55) ]]; then
5507 [[ "$new_status" =~ "N" ]] ||
5508 error "$ost_name status is '$new_status', missing 'N'"
5511 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
5512 [[ $OST1_VERSION -ge $(version_code 2.12.55) ]] && do_facet ost1 \
5513 $LCTL set_param -n obdfilter.$ost_name.no_precreate=0
5516 new_status=$(ost_dev_status $ost_idx)
5517 [[ ! "$new_status" =~ "D" && ! "$new_status" =~ "N" ]] ||
5518 error "$ost_name status is '$new_status', has 'D' and/or 'N'"
5520 run_test 56c "check 'lfs df' showing device status"
5525 local local_tdir="$1"
5526 local local_numfiles="$2"
5527 local local_numdirs="$3"
5528 local dir_params="$4"
5529 local dir_stripe_params="$5"
5531 if [ ! -d "$local_tdir" ] ; then
5532 test_mkdir -p $dir_stripe_params $local_tdir
5533 [ "$dir_params" ] && $LFS setstripe $dir_params $local_tdir
5534 for i in $(seq $local_numfiles) ; do
5535 touch $local_tdir/file$i
5537 for i in $(seq $local_numdirs) ; do
5538 test_mkdir $dir_stripe_params $local_tdir/dir$i
5539 for j in $(seq $local_numfiles) ; do
5540 touch $local_tdir/dir$i/file$j
5546 setup_56_special() {
5548 local local_numfiles=$2
5549 local local_numdirs=$3
5551 setup_56 $local_tdir $local_numfiles $local_numdirs
5553 if [ ! -e "$local_tdir/loop${local_numfiles}b" ] ; then
5554 for i in $(seq $local_numfiles) ; do
5555 mknod $local_tdir/loop${i}b b 7 $i
5556 mknod $local_tdir/null${i}c c 1 3
5557 ln -s $local_tdir/file1 $local_tdir/link${i}
5559 for i in $(seq $local_numdirs) ; do
5560 mknod $local_tdir/dir$i/loop${i}b b 7 $i
5561 mknod $local_tdir/dir$i/null${i}c c 1 3
5562 ln -s $local_tdir/dir$i/file1 $local_tdir/dir$i/link${i}
5568 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5569 local expected=$(($NUMDIRS + 2))
5571 setup_56 $dir $NUMFILES $NUMDIRS
5573 # test lfs find with -name
5574 for i in $(seq $NUMFILES) ; do
5575 local nums=$($LFS find -name "*$i" $dir | wc -l)
5577 [ $nums -eq $expected ] ||
5578 error "lfs find -name '*$i' $dir wrong: "\
5579 "found $nums, expected $expected"
5582 run_test 56g "check lfs find -name"
5585 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5586 local expected=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES))
5588 setup_56 $dir $NUMFILES $NUMDIRS
5590 # test lfs find with ! -name
5591 for i in $(seq $NUMFILES) ; do
5592 local nums=$($LFS find ! -name "*$i" $dir | wc -l)
5594 [ $nums -eq $expected ] ||
5595 error "lfs find ! -name '*$i' $dir wrong: "\
5596 "found $nums, expected $expected"
5599 run_test 56h "check lfs find ! -name"
5602 local dir=$DIR/$tdir
5606 local cmd="$LFS find -ost $(ostuuid_from_index 0 $dir) $dir"
5609 [ -z "$out" ] || error "'$cmd' returned directory '$out'"
5611 run_test 56i "check 'lfs find -ost UUID' skips directories"
5614 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5616 setup_56_special $dir $NUMFILES $NUMDIRS
5618 local expected=$((NUMDIRS + 1))
5619 local cmd="$LFS find -type d $dir"
5620 local nums=$($cmd | wc -l)
5622 [ $nums -eq $expected ] ||
5623 error "'$cmd' wrong: found $nums, expected $expected"
5625 run_test 56j "check lfs find -type d"
5628 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5630 setup_56_special $dir $NUMFILES $NUMDIRS
5632 local expected=$(((NUMDIRS + 1) * NUMFILES))
5633 local cmd="$LFS find -type f $dir"
5634 local nums=$($cmd | wc -l)
5636 [ $nums -eq $expected ] ||
5637 error "'$cmd' wrong: found $nums, expected $expected"
5639 run_test 56k "check lfs find -type f"
5642 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5644 setup_56_special $dir $NUMFILES $NUMDIRS
5646 local expected=$((NUMDIRS + NUMFILES))
5647 local cmd="$LFS find -type b $dir"
5648 local nums=$($cmd | wc -l)
5650 [ $nums -eq $expected ] ||
5651 error "'$cmd' wrong: found $nums, expected $expected"
5653 run_test 56l "check lfs find -type b"
5656 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5658 setup_56_special $dir $NUMFILES $NUMDIRS
5660 local expected=$((NUMDIRS + NUMFILES))
5661 local cmd="$LFS find -type c $dir"
5662 local nums=$($cmd | wc -l)
5663 [ $nums -eq $expected ] ||
5664 error "'$cmd' wrong: found $nums, expected $expected"
5666 run_test 56m "check lfs find -type c"
5669 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5670 setup_56_special $dir $NUMFILES $NUMDIRS
5672 local expected=$((NUMDIRS + NUMFILES))
5673 local cmd="$LFS find -type l $dir"
5674 local nums=$($cmd | wc -l)
5676 [ $nums -eq $expected ] ||
5677 error "'$cmd' wrong: found $nums, expected $expected"
5679 run_test 56n "check lfs find -type l"
5682 local dir=$DIR/$tdir
5684 setup_56 $dir $NUMFILES $NUMDIRS
5685 utime $dir/file1 > /dev/null || error "utime (1)"
5686 utime $dir/file2 > /dev/null || error "utime (2)"
5687 utime $dir/dir1 > /dev/null || error "utime (3)"
5688 utime $dir/dir2 > /dev/null || error "utime (4)"
5689 utime $dir/dir1/file1 > /dev/null || error "utime (5)"
5690 dd if=/dev/zero count=1 >> $dir/dir1/file1 && sync
5693 local nums=$($LFS find -mtime +0 $dir | wc -l)
5695 [ $nums -eq $expected ] ||
5696 error "lfs find -mtime +0 $dir: found $nums expect $expected"
5699 cmd="$LFS find -mtime 0 $dir"
5700 nums=$($cmd | wc -l)
5701 [ $nums -eq $expected ] ||
5702 error "'$cmd' wrong: found $nums, expected $expected"
5704 run_test 56o "check lfs find -mtime for old files"
5707 local dir=$DIR/$tdir
5711 # just to make sure there is something that won't be found
5713 touch $dir/$tfile.now
5715 for age in year week day hour min; do
5716 count=$((count + 1))
5718 touch $dir/$tfile-a.$age $dir/$tfile-m.$age
5719 touch --date="$count $age ago" -a $dir/$tfile-a.$age
5720 touch --date="$count $age ago" -m $dir/$tfile-m.$age
5722 local cmd="$LFS find $dir -mtime $count${age:0:1}"
5723 local nums=$($cmd | wc -l)
5724 [ $nums -eq $expected ] ||
5725 error "'$cmd' wrong: found $nums, expected $expected"
5727 cmd="$LFS find $dir -atime $count${age:0:1}"
5728 nums=$($cmd | wc -l)
5729 [ $nums -eq $expected ] ||
5730 error "'$cmd' wrong: found $nums, expected $expected"
5734 cmd="$LFS find $dir -ctime +1s -type f"
5735 nums=$($cmd | wc -l)
5736 (( $nums == $count * 2 + 1)) ||
5737 error "'$cmd' wrong: found $nums, expected $((expected*2+1))"
5739 run_test 56ob "check lfs find -atime -mtime -ctime with units"
5742 [ $RUNAS_ID -eq $UID ] &&
5743 skip_env "RUNAS_ID = UID = $UID -- skipping"
5745 local dir=$DIR/$tdir
5747 setup_56 $dir $NUMFILES $NUMDIRS
5748 chown $RUNAS_ID $dir/file* || error "chown $DIR/${tdir}g/file$i failed"
5750 local expected=$NUMFILES
5751 local cmd="$LFS find -uid $RUNAS_ID $dir"
5752 local nums=$($cmd | wc -l)
5754 [ $nums -eq $expected ] ||
5755 error "'$cmd' wrong: found $nums, expected $expected"
5757 expected=$(((NUMFILES + 1) * NUMDIRS + 1))
5758 cmd="$LFS find ! -uid $RUNAS_ID $dir"
5759 nums=$($cmd | wc -l)
5760 [ $nums -eq $expected ] ||
5761 error "'$cmd' wrong: found $nums, expected $expected"
5763 run_test 56p "check lfs find -uid and ! -uid"
5766 [ $RUNAS_ID -eq $UID ] &&
5767 skip_env "RUNAS_ID = UID = $UID -- skipping"
5769 local dir=$DIR/$tdir
5771 setup_56 $dir $NUMFILES $NUMDIRS
5772 chgrp $RUNAS_GID $dir/file* || error "chown $dir/file$i failed"
5774 local expected=$NUMFILES
5775 local cmd="$LFS find -gid $RUNAS_GID $dir"
5776 local nums=$($cmd | wc -l)
5778 [ $nums -eq $expected ] ||
5779 error "'$cmd' wrong: found $nums, expected $expected"
5781 expected=$(( ($NUMFILES+1) * $NUMDIRS + 1))
5782 cmd="$LFS find ! -gid $RUNAS_GID $dir"
5783 nums=$($cmd | wc -l)
5784 [ $nums -eq $expected ] ||
5785 error "'$cmd' wrong: found $nums, expected $expected"
5787 run_test 56q "check lfs find -gid and ! -gid"
5790 local dir=$DIR/$tdir
5792 setup_56 $dir $NUMFILES $NUMDIRS
5795 local cmd="$LFS find -size 0 -type f -lazy $dir"
5796 local nums=$($cmd | wc -l)
5798 [ $nums -eq $expected ] ||
5799 error "'$cmd' wrong: found $nums, expected $expected"
5800 cmd="$LFS find -size 0 -type f $dir"
5801 nums=$($cmd | wc -l)
5802 [ $nums -eq $expected ] ||
5803 error "'$cmd' wrong: found $nums, expected $expected"
5806 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5807 nums=$($cmd | wc -l)
5808 [ $nums -eq $expected ] ||
5809 error "'$cmd' wrong: found $nums, expected $expected"
5810 cmd="$LFS find ! -size 0 -type f $dir"
5811 nums=$($cmd | wc -l)
5812 [ $nums -eq $expected ] ||
5813 error "'$cmd' wrong: found $nums, expected $expected"
5815 echo "test" > $dir/$tfile
5816 echo "test2" > $dir/$tfile.2 && sync
5818 cmd="$LFS find -size 5 -type f -lazy $dir"
5819 nums=$($cmd | wc -l)
5820 [ $nums -eq $expected ] ||
5821 error "'$cmd' wrong: found $nums, expected $expected"
5822 cmd="$LFS find -size 5 -type f $dir"
5823 nums=$($cmd | wc -l)
5824 [ $nums -eq $expected ] ||
5825 error "'$cmd' wrong: found $nums, expected $expected"
5828 cmd="$LFS find -size +5 -type f -lazy $dir"
5829 nums=$($cmd | wc -l)
5830 [ $nums -eq $expected ] ||
5831 error "'$cmd' wrong: found $nums, expected $expected"
5832 cmd="$LFS find -size +5 -type f $dir"
5833 nums=$($cmd | wc -l)
5834 [ $nums -eq $expected ] ||
5835 error "'$cmd' wrong: found $nums, expected $expected"
5838 cmd="$LFS find -size +0 -type f -lazy $dir"
5839 nums=$($cmd | wc -l)
5840 [ $nums -eq $expected ] ||
5841 error "'$cmd' wrong: found $nums, expected $expected"
5842 cmd="$LFS find -size +0 -type f $dir"
5843 nums=$($cmd | wc -l)
5844 [ $nums -eq $expected ] ||
5845 error "'$cmd' wrong: found $nums, expected $expected"
5848 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5849 nums=$($cmd | wc -l)
5850 [ $nums -eq $expected ] ||
5851 error "'$cmd' wrong: found $nums, expected $expected"
5852 cmd="$LFS find ! -size -5 -type f $dir"
5853 nums=$($cmd | wc -l)
5854 [ $nums -eq $expected ] ||
5855 error "'$cmd' wrong: found $nums, expected $expected"
5858 cmd="$LFS find -size -5 -type f -lazy $dir"
5859 nums=$($cmd | wc -l)
5860 [ $nums -eq $expected ] ||
5861 error "'$cmd' wrong: found $nums, expected $expected"
5862 cmd="$LFS find -size -5 -type f $dir"
5863 nums=$($cmd | wc -l)
5864 [ $nums -eq $expected ] ||
5865 error "'$cmd' wrong: found $nums, expected $expected"
5867 run_test 56r "check lfs find -size works"
5870 [[ $MDS1_VERSION -gt $(version_code 2.12.58) ]] ||
5871 skip "MDS < 2.12.58 doesn't return LSOM data"
5872 local dir=$DIR/$tdir
5874 [[ $OSC == "mdc" ]] && skip "DoM files" && return
5876 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5878 cancel_lru_locks $OSC
5880 local rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5882 local cmd="$LFS find -size 0 -type f -lazy $dir"
5883 local nums=$($cmd | wc -l)
5885 [ $nums -eq $expected ] ||
5886 error "'$cmd' wrong: found $nums, expected $expected"
5888 local rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5889 [ $rpcs_before -eq $rpcs_after ] ||
5890 error "'$cmd' should not send glimpse RPCs to OST"
5891 cmd="$LFS find -size 0 -type f $dir"
5892 nums=$($cmd | wc -l)
5893 [ $nums -eq $expected ] ||
5894 error "'$cmd' wrong: found $nums, expected $expected"
5895 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5896 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5897 $LCTL get_param osc.*.stats
5898 [ $rpcs_after -eq $((rpcs_before + 12)) ] ||
5899 error "'$cmd' should send 12 glimpse RPCs to OST"
5901 cancel_lru_locks $OSC
5902 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5904 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5905 nums=$($cmd | wc -l)
5906 [ $nums -eq $expected ] ||
5907 error "'$cmd' wrong: found $nums, expected $expected"
5908 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5909 $LCTL get_param mdc.*.stats
5910 [ $rpcs_before -eq $rpcs_after ] ||
5911 error "'$cmd' should not send glimpse RPCs to OST"
5912 cmd="$LFS find ! -size 0 -type f $dir"
5913 nums=$($cmd | wc -l)
5914 [ $nums -eq $expected ] ||
5915 error "'$cmd' wrong: found $nums, expected $expected"
5916 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5917 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5918 [ $rpcs_after -eq $((rpcs_before + 12)) ] ||
5919 error "'$cmd' should send 12 glimpse RPCs to OST"
5921 echo "test" > $dir/$tfile
5922 echo "test2" > $dir/$tfile.2 && sync
5923 cancel_lru_locks $OSC
5924 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5926 cmd="$LFS find -size 5 -type f -lazy $dir"
5927 nums=$($cmd | wc -l)
5928 [ $nums -eq $expected ] ||
5929 error "'$cmd' wrong: found $nums, expected $expected"
5930 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5931 [ $rpcs_before -eq $rpcs_after ] ||
5932 error "'$cmd' should not send glimpse RPCs to OST"
5933 cmd="$LFS find -size 5 -type f $dir"
5934 nums=$($cmd | wc -l)
5935 [ $nums -eq $expected ] ||
5936 error "'$cmd' wrong: found $nums, expected $expected"
5937 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5938 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5939 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5940 error "'$cmd' should send 14 glimpse RPCs to OST"
5942 cancel_lru_locks $OSC
5943 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5945 cmd="$LFS find -size +5 -type f -lazy $dir"
5946 nums=$($cmd | wc -l)
5947 [ $nums -eq $expected ] ||
5948 error "'$cmd' wrong: found $nums, expected $expected"
5949 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5950 [ $rpcs_before -eq $rpcs_after ] ||
5951 error "'$cmd' should not send glimpse RPCs to OST"
5952 cmd="$LFS find -size +5 -type f $dir"
5953 nums=$($cmd | wc -l)
5954 [ $nums -eq $expected ] ||
5955 error "'$cmd' wrong: found $nums, expected $expected"
5956 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5957 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5958 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5959 error "'$cmd' should send 14 glimpse RPCs to OST"
5961 cancel_lru_locks $OSC
5962 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5964 cmd="$LFS find -size +0 -type f -lazy $dir"
5965 nums=$($cmd | wc -l)
5966 [ $nums -eq $expected ] ||
5967 error "'$cmd' wrong: found $nums, expected $expected"
5968 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5969 [ $rpcs_before -eq $rpcs_after ] ||
5970 error "'$cmd' should not send glimpse RPCs to OST"
5971 cmd="$LFS find -size +0 -type f $dir"
5972 nums=$($cmd | wc -l)
5973 [ $nums -eq $expected ] ||
5974 error "'$cmd' wrong: found $nums, expected $expected"
5975 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5976 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5977 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5978 error "'$cmd' should send 14 glimpse RPCs to OST"
5980 cancel_lru_locks $OSC
5981 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5983 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5984 nums=$($cmd | wc -l)
5985 [ $nums -eq $expected ] ||
5986 error "'$cmd' wrong: found $nums, expected $expected"
5987 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5988 [ $rpcs_before -eq $rpcs_after ] ||
5989 error "'$cmd' should not send glimpse RPCs to OST"
5990 cmd="$LFS find ! -size -5 -type f $dir"
5991 nums=$($cmd | wc -l)
5992 [ $nums -eq $expected ] ||
5993 error "'$cmd' wrong: found $nums, expected $expected"
5994 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5995 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5996 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
5997 error "'$cmd' should send 14 glimpse RPCs to OST"
5999 cancel_lru_locks $OSC
6000 rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6002 cmd="$LFS find -size -5 -type f -lazy $dir"
6003 nums=$($cmd | wc -l)
6004 [ $nums -eq $expected ] ||
6005 error "'$cmd' wrong: found $nums, expected $expected"
6006 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6007 [ $rpcs_before -eq $rpcs_after ] ||
6008 error "'$cmd' should not send glimpse RPCs to OST"
6009 cmd="$LFS find -size -5 -type f $dir"
6010 nums=$($cmd | wc -l)
6011 [ $nums -eq $expected ] ||
6012 error "'$cmd' wrong: found $nums, expected $expected"
6013 rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
6014 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
6015 [ $rpcs_after -eq $((rpcs_before + 14)) ] ||
6016 error "'$cmd' should send 14 glimpse RPCs to OST"
6018 run_test 56ra "check lfs find -size -lazy works for data on OSTs"
6020 test_56s() { # LU-611 #LU-9369
6021 [[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
6023 local dir=$DIR/$tdir
6024 local onestripe=$(((NUMDIRS + 1) * NUMFILES))
6026 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
6027 for i in $(seq $NUMDIRS); do
6028 $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile
6031 local expected=$NUMDIRS
6032 local cmd="$LFS find -c $OSTCOUNT $dir"
6033 local nums=$($cmd | wc -l)
6035 [ $nums -eq $expected ] || {
6036 $LFS getstripe -R $dir
6037 error "'$cmd' wrong: found $nums, expected $expected"
6040 expected=$((NUMDIRS + onestripe))
6041 cmd="$LFS find -stripe-count +0 -type f $dir"
6042 nums=$($cmd | wc -l)
6043 [ $nums -eq $expected ] || {
6044 $LFS getstripe -R $dir
6045 error "'$cmd' wrong: found $nums, expected $expected"
6049 cmd="$LFS find -stripe-count 1 -type f $dir"
6050 nums=$($cmd | wc -l)
6051 [ $nums -eq $expected ] || {
6052 $LFS getstripe -R $dir
6053 error "'$cmd' wrong: found $nums, expected $expected"
6056 cmd="$LFS find -stripe-count -2 -type f $dir"
6057 nums=$($cmd | wc -l)
6058 [ $nums -eq $expected ] || {
6059 $LFS getstripe -R $dir
6060 error "'$cmd' wrong: found $nums, expected $expected"
6064 cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir"
6065 nums=$($cmd | wc -l)
6066 [ $nums -eq $expected ] || {
6067 $LFS getstripe -R $dir
6068 error "'$cmd' wrong: found $nums, expected $expected"
6071 run_test 56s "check lfs find -stripe-count works"
6073 test_56t() { # LU-611 #LU-9369
6074 local dir=$DIR/$tdir
6076 setup_56 $dir 0 $NUMDIRS
6077 for i in $(seq $NUMDIRS); do
6078 $LFS setstripe -S 8M $dir/dir$i/$tfile
6081 local expected=$NUMDIRS
6082 local cmd="$LFS find -S 8M $dir"
6083 local nums=$($cmd | wc -l)
6085 [ $nums -eq $expected ] || {
6086 $LFS getstripe -R $dir
6087 error "'$cmd' wrong: found $nums, expected $expected"
6091 setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k"
6093 $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3}
6095 expected=$(((NUMDIRS + 1) * NUMFILES))
6096 cmd="$LFS find -stripe-size 512k -type f $dir"
6097 nums=$($cmd | wc -l)
6098 [ $nums -eq $expected ] ||
6099 error "'$cmd' wrong: found $nums, expected $expected"
6101 cmd="$LFS find -stripe-size +320k -type f $dir"
6102 nums=$($cmd | wc -l)
6103 [ $nums -eq $expected ] ||
6104 error "'$cmd' wrong: found $nums, expected $expected"
6106 expected=$(((NUMDIRS + 1) * NUMFILES + 4))
6107 cmd="$LFS find -stripe-size +200k -type f $dir"
6108 nums=$($cmd | wc -l)
6109 [ $nums -eq $expected ] ||
6110 error "'$cmd' wrong: found $nums, expected $expected"
6112 cmd="$LFS find -stripe-size -640k -type f $dir"
6113 nums=$($cmd | wc -l)
6114 [ $nums -eq $expected ] ||
6115 error "'$cmd' wrong: found $nums, expected $expected"
6118 cmd="$LFS find -stripe-size 256k -type f $dir"
6119 nums=$($cmd | wc -l)
6120 [ $nums -eq $expected ] ||
6121 error "'$cmd' wrong: found $nums, expected $expected"
6123 cmd="$LFS find -stripe-size -320k -type f $dir"
6124 nums=$($cmd | wc -l)
6125 [ $nums -eq $expected ] ||
6126 error "'$cmd' wrong: found $nums, expected $expected"
6129 cmd="$LFS find -stripe-size 1024k -type f $dir"
6130 nums=$($cmd | wc -l)
6131 [ $nums -eq $expected ] ||
6132 error "'$cmd' wrong: found $nums, expected $expected"
6134 run_test 56t "check lfs find -stripe-size works"
6136 test_56u() { # LU-611
6137 local dir=$DIR/$tdir
6139 setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1"
6141 if [[ $OSTCOUNT -gt 1 ]]; then
6142 $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3}
6148 local expected=$(((NUMDIRS + 1) * NUMFILES))
6149 local cmd="$LFS find -stripe-index 0 -type f $dir"
6150 local nums=$($cmd | wc -l)
6152 [ $nums -eq $expected ] ||
6153 error "'$cmd' wrong: found $nums, expected $expected"
6156 cmd="$LFS find -stripe-index 1 -type f $dir"
6157 nums=$($cmd | wc -l)
6158 [ $nums -eq $expected ] ||
6159 error "'$cmd' wrong: found $nums, expected $expected"
6161 cmd="$LFS find ! -stripe-index 0 -type f $dir"
6162 nums=$($cmd | wc -l)
6163 [ $nums -eq $expected ] ||
6164 error "'$cmd' wrong: found $nums, expected $expected"
6167 # This should produce an error and not return any files
6168 cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir"
6169 nums=$($cmd 2>/dev/null | wc -l)
6170 [ $nums -eq $expected ] ||
6171 error "'$cmd' wrong: found $nums, expected $expected"
6173 if [[ $OSTCOUNT -gt 1 ]]; then
6174 expected=$(((NUMDIRS + 1) * NUMFILES + onestripe))
6175 cmd="$LFS find -stripe-index 0,1 -type f $dir"
6176 nums=$($cmd | wc -l)
6177 [ $nums -eq $expected ] ||
6178 error "'$cmd' wrong: found $nums, expected $expected"
6181 run_test 56u "check lfs find -stripe-index works"
6185 local dir=$DIR/$tdir
6187 setup_56 $dir $NUMFILES $NUMDIRS
6189 UUID=$(mdtuuid_from_index $mdt_idx $dir)
6190 [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $mdt_idx"
6192 for file in $($LFS find -m $UUID $dir); do
6193 file_midx=$($LFS getstripe -m $file)
6194 [ $file_midx -eq $mdt_idx ] ||
6195 error "lfs find -m $UUID != getstripe -m $file_midx"
6198 run_test 56v "check 'lfs find -m match with lfs getstripe -m'"
6201 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6202 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6204 local dir=$DIR/$tdir
6206 setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
6208 local stripe_size=$($LFS getstripe -S -d $dir) ||
6209 error "$LFS getstripe -S -d $dir failed"
6210 stripe_size=${stripe_size%% *}
6212 local file_size=$((stripe_size * OSTCOUNT))
6213 local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
6214 local required_space=$((file_num * file_size))
6215 local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
6217 [[ $free_space -le $((required_space / 1024)) ]] &&
6218 skip_env "need $required_space, have $free_space kbytes"
6221 local dd_count=$((file_size / dd_bs))
6223 # write data into the files
6228 for i in $(seq $NUMFILES); do
6230 yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
6231 error "write data into $file failed"
6233 for i in $(seq $NUMDIRS); do
6234 for j in $(seq $NUMFILES); do
6235 file=$dir/dir$i/file$j
6236 yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
6237 error "write data into $file failed"
6241 # $LFS_MIGRATE will fail if hard link migration is unsupported
6242 if [[ $MDS1_VERSION -gt $(version_code 2.5.55) ]]; then
6243 createmany -l$dir/dir1/file1 $dir/dir1/link 200 ||
6244 error "creating links to $dir/dir1/file1 failed"
6249 [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
6252 local cmd="$LFS_MIGRATE -y -c $expected $dir/file1"
6255 eval $cmd || error "$cmd failed"
6257 check_stripe_count $dir/file1 $expected
6259 if [ $MDS1_VERSION -ge $(version_code 2.6.90) ];
6261 # lfs_migrate file onto OST 0 if it is on OST 1, or onto
6262 # OST 1 if it is on OST 0. This file is small enough to
6263 # be on only one stripe.
6264 file=$dir/migr_1_ost
6265 dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
6266 error "write data into $file failed"
6267 local obdidx=$($LFS getstripe -i $file)
6268 local oldmd5=$(md5sum $file)
6271 [[ $obdidx -eq 0 ]] && newobdidx=1
6272 cmd="$LFS migrate -i $newobdidx $file"
6274 eval $cmd || error "$cmd failed"
6276 local realobdix=$($LFS getstripe -i $file)
6277 local newmd5=$(md5sum $file)
6279 [[ $newobdidx -ne $realobdix ]] &&
6280 error "new OST is different (was=$obdidx, "\
6281 "wanted=$newobdidx, got=$realobdix)"
6282 [[ "$oldmd5" != "$newmd5" ]] &&
6283 error "md5sum differ: $oldmd5, $newmd5"
6287 cmd="$LFS_MIGRATE -y -c $expected $dir/dir1"
6289 eval $cmd || error "$cmd failed"
6291 for j in $(seq $NUMFILES); do
6292 check_stripe_count $dir/dir1/file$j $expected
6295 # lfs_migrate works with lfs find
6296 cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir |
6297 $LFS_MIGRATE -y -c $expected"
6299 eval $cmd || error "$cmd failed"
6301 for i in $(seq 2 $NUMFILES); do
6302 check_stripe_count $dir/file$i $expected
6304 for i in $(seq 2 $NUMDIRS); do
6305 for j in $(seq $NUMFILES); do
6306 check_stripe_count $dir/dir$i/file$j $expected
6310 run_test 56w "check lfs_migrate -c stripe_count works"
6313 local file1=$DIR/$tdir/file1
6314 local create_pool=false
6315 local initial_pool=$($LFS getstripe -p $DIR)
6319 echo -n "Creating test dir..."
6320 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
6323 echo -n "Creating test file..."
6324 touch $file1 || error "cannot create file"
6327 echo -n "Detecting existing pools..."
6328 pool_list=($($LFS pool_list $FSNAME | grep "$FSNAME\." | cut -d. -f2))
6330 if [ ${#pool_list[@]} -gt 0 ]; then
6331 echo "${pool_list[@]}"
6332 for thispool in "${pool_list[@]}"; do
6333 if [[ -z "$initial_pool" ||
6334 "$initial_pool" != "$thispool" ]]; then
6336 echo "Using existing pool '$pool'"
6341 echo "none detected."
6343 if [ -z "$pool" ]; then
6344 pool=${POOL:-testpool}
6345 [ "$initial_pool" = "$pool" ] && pool="testpool2"
6346 echo -n "Creating pool '$pool'..."
6348 pool_add $pool &> /dev/null ||
6349 error "pool_add failed"
6352 echo -n "Adding target to pool..."
6353 pool_add_targets $pool 0 0 1 &> /dev/null ||
6354 error "pool_add_targets failed"
6358 echo -n "Setting pool using -p option..."
6359 $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null ||
6360 error "migrate failed rc = $?"
6363 echo -n "Verifying test file is in pool after migrating..."
6364 [ "$($LFS getstripe -p $file1)" = $pool ] ||
6365 error "file was not migrated to pool $pool"
6368 echo -n "Removing test file from pool '$pool'..."
6369 $LFS migrate $file1 &> /dev/null ||
6370 error "cannot remove from pool"
6371 [ "$($LFS getstripe -p $file1)" ] &&
6372 error "pool still set"
6375 echo -n "Setting pool using --pool option..."
6376 $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null ||
6377 error "migrate failed rc = $?"
6382 if $create_pool; then
6383 destroy_test_pools 2> /dev/null ||
6384 error "destroy test pools failed"
6387 run_test 56wb "check lfs_migrate pool support"
6390 local file1="$DIR/$tdir/file1"
6392 echo -n "Creating test dir..."
6393 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
6394 local def_stripe_size=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
6395 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
6396 error "cannot set stripe"
6399 echo -n "Setting initial stripe for test file..."
6400 $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
6401 error "cannot set stripe"
6402 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
6403 error "stripe size not set"
6406 # File currently set to -S 512K -c 1
6408 # Ensure -c and -S options are rejected when -R is set
6409 echo -n "Verifying incompatible options are detected..."
6410 $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null &&
6411 error "incompatible -c and -R options not detected"
6412 $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null &&
6413 error "incompatible -S and -R options not detected"
6416 # Ensure unrecognized options are passed through to 'lfs migrate'
6417 echo -n "Verifying -S option is passed through to lfs migrate..."
6418 $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
6419 error "migration failed"
6420 [ $($LFS getstripe -S "$file1") -eq 1048576 ] ||
6421 error "file was not restriped"
6424 # File currently set to -S 1M -c 1
6426 # Ensure long options are supported
6427 echo -n "Verifying long options supported..."
6428 $LFS_MIGRATE -y --non-block "$file1" &> /dev/null ||
6429 error "long option without argument not supported"
6430 $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
6431 error "long option with argument not supported"
6432 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
6433 error "file not restriped with --stripe-size option"
6436 # File currently set to -S 512K -c 1
6438 if [ "$OSTCOUNT" -gt 1 ]; then
6439 echo -n "Verifying explicit stripe count can be set..."
6440 $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
6441 error "migrate failed"
6442 [ $($LFS getstripe -c "$file1") -eq 2 ] ||
6443 error "file not restriped to explicit count"
6447 # File currently set to -S 512K -c 1 or -S 512K -c 2
6449 # Ensure parent striping is used if -R is set, and no stripe
6450 # count or size is specified
6451 echo -n "Setting stripe for parent directory..."
6452 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
6453 error "cannot set stripe"
6456 echo -n "Verifying restripe option uses parent stripe settings..."
6457 $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
6458 error "migrate failed"
6459 [ $($LFS getstripe -S "$file1") -eq $def_stripe_size ] ||
6460 error "file not restriped to parent settings"
6461 [ $($LFS getstripe -c "$file1") -eq 1 ] ||
6462 error "file not restriped to parent settings"
6465 # File currently set to -S 1M -c 1
6467 # Ensure striping is preserved if -R is not set, and no stripe
6468 # count or size is specified
6469 echo -n "Verifying striping size preserved when not specified..."
6470 local orig_stripe_size=$($LFS getstripe -S "$file1" 2>/dev/null)
6471 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
6472 error "cannot set stripe on parent directory"
6473 $LFS_MIGRATE -y "$file1" &> /dev/null ||
6474 error "migrate failed"
6475 [ $($LFS getstripe -S "$file1") -eq $orig_stripe_size ] ||
6476 error "file was restriped"
6479 # Ensure file name properly detected when final option has no argument
6480 echo -n "Verifying file name properly detected..."
6481 $LFS_MIGRATE -y "$file1" &> /dev/null ||
6482 error "file name interpreted as option argument"
6488 run_test 56wc "check unrecognized options for lfs_migrate are passed through"
6491 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6493 local file1=$DIR/$tdir/file1
6495 echo -n "Creating test dir..."
6496 test_mkdir $DIR/$tdir || error "cannot create dir"
6499 echo -n "Creating test file..."
6503 # Ensure 'lfs migrate' will fail by using a non-existent option,
6504 # and make sure rsync is not called to recover
6505 echo -n "Make sure --no-rsync option works..."
6506 $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 |
6507 grep -q 'refusing to fall back to rsync' ||
6508 error "rsync was called with --no-rsync set"
6511 # Ensure rsync is called without trying 'lfs migrate' first
6512 echo -n "Make sure --rsync option works..."
6513 $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 |
6514 grep -q 'falling back to rsync' &&
6515 error "lfs migrate was called with --rsync set"
6518 echo -n "Make sure --rsync and --no-rsync options are exclusive..."
6519 $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 |
6520 grep -q 'at the same time' ||
6521 error "--rsync and --no-rsync accepted concurrently"
6527 run_test 56wd "check lfs_migrate --rsync and --no-rsync work"
6530 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6531 check_swap_layouts_support
6533 local dir=$DIR/$tdir
6534 local ref1=/etc/passwd
6535 local file1=$dir/file1
6537 test_mkdir $dir || error "creating dir $dir"
6538 $LFS setstripe -c 2 $file1
6540 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
6541 stripe=$($LFS getstripe -c $file1)
6542 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6543 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6548 run_test 56x "lfs migration support"
6551 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6552 check_swap_layouts_support
6554 local dir=$DIR/$tdir/$testnum
6558 local ref1=/etc/passwd
6559 local file1=$dir/file1
6561 $LFS setstripe -c 2 $file1
6563 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
6565 local stripe=$($LFS getstripe -c $file1)
6567 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6568 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6573 run_test 56xa "lfs migration --block support"
6575 check_migrate_links() {
6577 local file1="$dir/file1"
6581 local total_count=$(($begin + $count - 1))
6582 local symlink_count=10
6585 if [ ! -f "$file1" ]; then
6586 echo -n "creating initial file..."
6587 $LFS setstripe -c 1 -S "512k" "$file1" ||
6588 error "cannot setstripe initial file"
6591 echo -n "creating symlinks..."
6592 for s in $(seq 1 $symlink_count); do
6593 ln -s "$file1" "$dir/slink$s" ||
6594 error "cannot create symlinks"
6598 echo -n "creating nonlinked files..."
6599 createmany -o "$dir/uniq" 1 10 &> /dev/null ||
6600 error "cannot create nonlinked files"
6605 if [ ! -f "$dir/file$total_count" ]; then
6606 echo -n "creating hard links $begin:$total_count..."
6607 createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
6608 /dev/null || error "cannot create hard links"
6612 echo -n "checking number of hard links listed in xattrs..."
6613 local fid=$($LFS getstripe -F "$file1")
6614 local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
6617 if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
6618 skip "hard link list has unexpected size, skipping test"
6620 if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
6621 error "link names should exceed xattrs size"
6624 echo -n "migrating files..."
6625 local migrate_out=$($runas $LFS_MIGRATE -y -S '1m' $dir)
6627 [ $rc -eq 0 ] || error "migrate failed rc = $rc"
6630 # make sure all links have been properly migrated
6631 echo -n "verifying files..."
6632 fid=$($LFS getstripe -F "$file1") ||
6633 error "cannot get fid for file $file1"
6634 for i in $(seq 2 $total_count); do
6635 local fid2=$($LFS getstripe -F $dir/file$i)
6637 [ "$fid2" == "$fid" ] ||
6638 error "migrated hard link has mismatched FID"
6641 # make sure hard links were properly detected, and migration was
6642 # performed only once for the entire link set; nonlinked files should
6644 local actual=$(grep -c 'done' <<< "$migrate_out")
6645 local expected=$(($uniq_count + 1))
6647 [ "$actual" -eq "$expected" ] ||
6648 error "hard links individually migrated ($actual != $expected)"
6650 # make sure the correct number of hard links are present
6651 local hardlinks=$(stat -c '%h' "$file1")
6653 [ $hardlinks -eq $total_count ] ||
6654 error "num hard links $hardlinks != $total_count"
6661 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
6662 skip "Need MDS version at least 2.10.55"
6664 local dir="$DIR/$tdir"
6666 test_mkdir "$dir" || error "cannot create dir $dir"
6668 echo "testing lfs migrate mode when all links fit within xattrs"
6669 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 2 99
6671 echo "testing rsync mode when all links fit within xattrs"
6672 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 2 99
6674 echo "testing lfs migrate mode when all links do not fit within xattrs"
6675 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100
6677 echo "testing rsync mode when all links do not fit within xattrs"
6678 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 101 100
6680 chown -R $RUNAS_ID $dir
6681 echo "testing non-root lfs migrate mode when not all links are in xattr"
6682 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100 "$RUNAS"
6687 run_test 56xb "lfs migration hard link support"
6690 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6692 local dir="$DIR/$tdir"
6694 test_mkdir "$dir" || error "cannot create dir $dir"
6696 # Test 1: ensure file < 1 GB is always migrated with 1 stripe
6697 echo -n "Setting initial stripe for 20MB test file..."
6698 $LFS setstripe -c 2 -i 0 "$dir/20mb" ||
6699 error "cannot setstripe 20MB file"
6701 echo -n "Sizing 20MB test file..."
6702 truncate "$dir/20mb" 20971520 || error "cannot create 20MB test file"
6704 echo -n "Verifying small file autostripe count is 1..."
6705 $LFS_MIGRATE -y -A -C 1 "$dir/20mb" ||
6706 error "cannot migrate 20MB file"
6707 local stripe_count=$($LFS getstripe -c "$dir/20mb") ||
6708 error "cannot get stripe for $dir/20mb"
6709 [ $stripe_count -eq 1 ] ||
6710 error "unexpected stripe count $stripe_count for 20MB file"
6714 # Test 2: File is small enough to fit within the available space on
6715 # sqrt(size_in_gb) + 1 OSTs but is larger than 1GB. The file must
6716 # have at least an additional 1KB for each desired stripe for test 3
6717 echo -n "Setting stripe for 1GB test file..."
6718 $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe 1GB file"
6720 echo -n "Sizing 1GB test file..."
6721 # File size is 1GB + 3KB
6722 truncate "$dir/1gb" 1073744896 || error "cannot create 1GB test file"
6725 # need at least 512MB per OST for 1GB file to fit in 2 stripes
6726 local avail=$($LCTL get_param -n llite.$FSNAME*.kbytesavail)
6727 if (( avail > 524288 * OSTCOUNT )); then
6728 echo -n "Migrating 1GB file..."
6729 $LFS_MIGRATE -y -A -C 1 "$dir/1gb" ||
6730 error "cannot migrate 1GB file"
6732 echo -n "Verifying autostripe count is sqrt(n) + 1..."
6733 stripe_count=$($LFS getstripe -c "$dir/1gb") ||
6734 error "cannot getstripe for 1GB file"
6735 [ $stripe_count -eq 2 ] ||
6736 error "unexpected stripe count $stripe_count != 2"
6740 # Test 3: File is too large to fit within the available space on
6741 # sqrt(n) + 1 OSTs. Simulate limited available space with -X
6742 if [ $OSTCOUNT -ge 3 ]; then
6743 # The required available space is calculated as
6744 # file size (1GB + 3KB) / OST count (3).
6745 local kb_per_ost=349526
6747 echo -n "Migrating 1GB file with limit..."
6748 $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" ||
6749 error "cannot migrate 1GB file with limit"
6752 stripe_count=$($LFS getstripe -c "$dir/1gb")
6753 echo -n "Verifying 1GB autostripe count with limited space..."
6754 [ "$stripe_count" -a $stripe_count -ge 3 ] ||
6755 error "unexpected stripe count $stripe_count (min 3)"
6762 run_test 56xc "lfs migration autostripe"
6765 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
6766 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
6769 local dir=$DIR/$tdir
6773 test_mkdir -p $dir || error "creating dir $dir"
6774 touch $f1 || error "creating std file $f1"
6775 $MULTIOP $f2 H2c || error "creating released file $f2"
6777 # a directory can be raid0, so ask only for files
6778 res=$($LFS find $dir -L raid0 -type f | wc -l)
6779 [[ $res == 2 ]] || error "search raid0: found $res files != 2"
6781 res=$($LFS find $dir \! -L raid0 -type f | wc -l)
6782 [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
6784 # only files can be released, so no need to force file search
6785 res=$($LFS find $dir -L released)
6786 [[ $res == $f2 ]] || error "search released: found $res != $f2"
6788 res=$($LFS find $dir -type f \! -L released)
6789 [[ $res == $f1 ]] || error "search !released: found $res != $f1"
6791 run_test 56y "lfs find -L raid0|released"
6793 test_56z() { # LU-4824
6794 # This checks to make sure 'lfs find' continues after errors
6795 # There are two classes of errors that should be caught:
6796 # - If multiple paths are provided, all should be searched even if one
6798 # - If errors are encountered during the search, it should not terminate
6800 local dir=$DIR/$tdir
6804 for i in d{0..9}; do
6806 touch $dir/$i/$tfile
6808 $LFS find $DIR/non_existent_dir $dir &&
6809 error "$LFS find did not return an error"
6810 # Make a directory unsearchable. This should NOT be the last entry in
6811 # directory order. Arbitrarily pick the 6th entry
6812 chmod 700 $($LFS find $dir -type d | sed '6!d')
6814 $RUNAS $LFS find $DIR/non_existent $dir
6815 local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l)
6817 # The user should be able to see 10 directories and 9 files
6818 (( count == 19 )) ||
6819 error "$LFS find found $count != 19 entries after error"
6821 run_test 56z "lfs find should continue after an error"
6823 test_56aa() { # LU-5937
6824 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
6826 local dir=$DIR/$tdir
6829 $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
6831 createmany -o $dir/striped_dir/${tfile}- 1024
6832 local dirs=$($LFS find --size +8k $dir/)
6834 [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
6836 run_test 56aa "lfs find --size under striped dir"
6838 test_56ab() { # LU-10705
6839 test_mkdir $DIR/$tdir
6840 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
6841 dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
6842 dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
6843 # Flush writes to ensure valid blocks. Need to be more thorough for
6844 # ZFS, since blocks are not allocated/returned to client immediately.
6846 wait_zfs_commit ost1 2
6847 cancel_lru_locks osc
6850 local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
6852 [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
6854 files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
6855 [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
6857 rm -f $DIR/$tdir/$tfile.[123]
6859 run_test 56ab "lfs find --blocks"
6862 [ $MDS1_VERSION -lt $(version_code 2.10.50) ] &&
6863 skip "Need MDS version at least 2.10.50"
6865 # Create composite files with one component
6866 local dir=$DIR/$tdir
6868 setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
6869 # Create composite files with three components
6870 setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
6871 # Create non-composite files
6872 createmany -o $dir/${tfile}- 10
6874 local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l)
6876 [[ $nfiles == 10 ]] ||
6877 error "lfs find -E 1M found $nfiles != 10 files"
6879 nfiles=$($LFS find ! -E 1M --type f $dir | wc -l)
6880 [[ $nfiles == 25 ]] ||
6881 error "lfs find ! -E 1M found $nfiles != 25 files"
6883 # All files have a component that starts at 0
6884 nfiles=$($LFS find --component-start 0 --type f $dir | wc -l)
6885 [[ $nfiles == 35 ]] ||
6886 error "lfs find --component-start 0 - $nfiles != 35 files"
6888 nfiles=$($LFS find --component-start 2M --type f $dir | wc -l)
6889 [[ $nfiles == 15 ]] ||
6890 error "lfs find --component-start 2M - $nfiles != 15 files"
6892 # All files created here have a componenet that does not starts at 2M
6893 nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l)
6894 [[ $nfiles == 35 ]] ||
6895 error "lfs find ! --component-start 2M - $nfiles != 35 files"
6897 # Find files with a specified number of components
6898 local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l)
6899 [[ $nfiles == 15 ]] ||
6900 error "lfs find --component-count 3 - $nfiles != 15 files"
6902 # Remember non-composite files have a component count of zero
6903 local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l)
6904 [[ $nfiles == 10 ]] ||
6905 error "lfs find --component-count 0 - $nfiles != 10 files"
6907 nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l)
6908 [[ $nfiles == 20 ]] ||
6909 error "lfs find ! --component-count 3 - $nfiles != 20 files"
6911 # All files have a flag called "init"
6912 local nfiles=$($LFS find --component-flags init --type f $dir | wc -l)
6913 [[ $nfiles == 35 ]] ||
6914 error "lfs find --component-flags init - $nfiles != 35 files"
6916 # Multi-component files will have a component not initialized
6917 local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l)
6918 [[ $nfiles == 15 ]] ||
6919 error "lfs find !--component-flags init - $nfiles != 15 files"
6924 run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
6927 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
6928 skip "Need MDS version at least 2.10.57"
6938 # create mirrored directories and mirrored files
6939 mkdir $td || error "mkdir $td failed"
6940 $LFS mirror create -N3 $td || error "create mirrored dir $td failed"
6941 createmany -o $tf- 10 || error "create $tf- failed"
6943 for i in $(seq 2); do
6945 mkdir $dir || error "mkdir $dir failed"
6946 $LFS mirror create -N$((3 + i)) $dir ||
6947 error "create mirrored dir $dir failed"
6948 createmany -o $dir/$tfile- 10 ||
6949 error "create $dir/$tfile- failed"
6952 # change the states of some mirrored files
6954 for i in $(seq 2); do
6956 for j in $(seq 4 9); do
6957 echo foo > $dir/$tfile-$j
6961 # find mirrored files with specific mirror count
6962 cmd="$LFS find --mirror-count 3 --type f $td"
6963 nfiles=$($cmd | wc -l)
6964 [[ $nfiles = 10 ]] || error "$cmd: $nfiles != 10 files"
6966 cmd="$LFS find ! --mirror-count 3 --type f $td"
6967 nfiles=$($cmd | wc -l)
6968 [[ $nfiles = 20 ]] || error "$cmd: $nfiles != 20 files"
6970 cmd="$LFS find --mirror-count +2 --type f $td"
6971 nfiles=$($cmd | wc -l)
6972 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6974 cmd="$LFS find --mirror-count -6 --type f $td"
6975 nfiles=$($cmd | wc -l)
6976 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6978 # find mirrored files with specific file state
6979 cmd="$LFS find --maxdepth 1 --mirror-state=^ro --type f $td"
6980 [[ $($cmd) = $tf-6 ]] || error "$cmd: didn't return $tf-6"
6982 cmd="$LFS find --mirror-state=ro --type f $td"
6983 nfiles=$($cmd | wc -l)
6984 [[ $nfiles = 17 ]] || error "$cmd: $nfiles != 17 files"
6986 cmd="$LFS find ! --mirror-state=ro --type f $td"
6987 nfiles=$($cmd | wc -l)
6988 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6990 cmd="$LFS find --mirror-state=wp --type f $td"
6991 nfiles=$($cmd | wc -l)
6992 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6994 cmd="$LFS find ! --mirror-state=sp --type f $td"
6995 nfiles=$($cmd | wc -l)
6996 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6998 run_test 56ca "check lfs find --mirror-count|-N and --mirror-state"
7001 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7002 # note test will not do anything if MDS is not local
7003 if [ "$mds1_FSTYPE" != ldiskfs ]; then
7004 skip_env "ldiskfs only test"
7006 remote_mds_nodsh && skip "remote MDS with nodsh"
7008 local MNTDEV="osd*.*MDT*.mntdev"
7009 DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV)
7010 [ -z "$DEV" ] && error "can't access $MNTDEV"
7011 for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
7012 do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
7013 error "can't access $DEV"
7014 DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
7015 [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
7019 run_test 57a "verify MDS filesystem created with large inodes =="
7022 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7023 if [ "$mds1_FSTYPE" != ldiskfs ]; then
7024 skip_env "ldiskfs only test"
7026 remote_mds_nodsh && skip "remote MDS with nodsh"
7028 local dir=$DIR/$tdir
7031 local fileN=$dir/f$filecount
7033 rm -rf $dir || error "removing $dir"
7035 local mdtidx=$($LFS getstripe -m $dir)
7036 local mdtname=MDT$(printf %04x $mdtidx)
7037 local facet=mds$((mdtidx + 1))
7039 echo "mcreating $filecount files"
7040 createmany -m $dir/f 1 $filecount || error "creating files in $dir"
7042 # verify that files do not have EAs yet
7043 $LFS getstripe $file1 2>&1 | grep -q "no stripe" ||
7044 error "$file1 has an EA"
7045 $LFS getstripe $fileN 2>&1 | grep -q "no stripe" ||
7046 error "$fileN has an EA"
7050 df $dir #make sure we get new statfs data
7051 local mdsfree=$(do_facet $facet \
7052 lctl get_param -n osd*.*$mdtname.kbytesfree)
7053 local mdcfree=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
7056 echo "opening files to create objects/EAs"
7057 for file in $(seq -f $dir/f%g 1 $filecount); do
7058 $OPENFILE -f O_RDWR $file > /dev/null 2>&1 ||
7059 error "opening $file"
7062 # verify that files have EAs now
7063 $LFS getstripe $file1 | grep -q "obdidx" || error "$file1 missing EA"
7064 $LFS getstripe $fileN | grep -q "obdidx" || error "$fileN missing EA"
7066 sleep 1 #make sure we get new statfs data
7068 local mdsfree2=$(do_facet $facet \
7069 lctl get_param -n osd*.*$mdtname.kbytesfree)
7070 local mdcfree2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
7072 if [[ $mdcfree2 -lt $((mdcfree - 16)) ]]; then
7073 if [ "$mdsfree" != "$mdsfree2" ]; then
7074 error "MDC before $mdcfree != after $mdcfree2"
7076 echo "MDC before $mdcfree != after $mdcfree2"
7077 echo "unable to confirm if MDS has large inodes"
7082 run_test 57b "default LOV EAs are stored inside large inodes ==="
7085 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7086 [ -z "$(which wiretest 2>/dev/null)" ] &&
7087 skip_env "could not find wiretest"
7091 run_test 58 "verify cross-platform wire constants =============="
7094 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7096 echo "touch 130 files"
7097 createmany -o $DIR/f59- 130
7099 unlinkmany $DIR/f59- 130
7101 # wait for commitment of removal
7102 wait_delete_completed
7104 run_test 59 "verify cancellation of llog records async ========="
7106 TEST60_HEAD="test_60 run $RANDOM"
7108 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7109 remote_mgs_nodsh && skip "remote MGS with nodsh"
7110 do_facet mgs "! which run-llog.sh &> /dev/null" &&
7111 do_facet mgs "! ls run-llog.sh &> /dev/null" &&
7112 skip_env "missing subtest run-llog.sh"
7114 log "$TEST60_HEAD - from kernel mode"
7115 do_facet mgs "$LCTL dk > /dev/null"
7116 do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed"
7117 do_facet mgs $LCTL dk > $TMP/$tfile
7119 # LU-6388: test llog_reader
7120 local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
7121 llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
7122 [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
7123 skip_env "missing llog_reader"
7124 local fstype=$(facet_fstype mgs)
7125 [ $fstype != ldiskfs -a $fstype != zfs ] &&
7126 skip_env "Only for ldiskfs or zfs type mgs"
7128 local mntpt=$(facet_mntpt mgs)
7129 local mgsdev=$(mgsdevname 1)
7141 #get fid and record list
7142 fid_list=($(awk '/9_sub.*record/ { print $NF }' $TMP/$tfile |
7144 rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' $TMP/$tfile |
7146 #remount mgs as ldiskfs or zfs type
7147 stop mgs || error "stop mgs failed"
7148 mount_fstype mgs || error "remount mgs failed"
7149 for ((i = 0; i < ${#fid_list[@]}; i++)); do
7152 seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
7153 oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
7158 obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
7160 obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
7162 echo "obj_file is $obj_file"
7163 do_facet mgs $llog_reader $obj_file
7165 rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
7166 awk '{ print $3 }' | sed -e "s/^type=//g")
7167 if [ $rec_type != $rec ]; then
7168 echo "FAILED test_60a wrong record type $rec_type," \
7174 #check obj path if record type is LLOG_LOGID_MAGIC
7175 if [ "$rec" == "1064553b" ]; then
7176 path=$(do_facet mgs $llog_reader $obj_file |
7177 grep "path=" | awk '{ print $NF }' |
7178 sed -e "s/^path=//g")
7179 if [ $obj_file != $mntpt/$path ]; then
7180 echo "FAILED test_60a wrong obj path" \
7181 "$montpt/$path, should be $obj_file"
7188 #restart mgs before "error", otherwise it will block the next test
7189 stop mgs || error "stop mgs failed"
7190 start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
7191 $pass || error "test failed, see FAILED test_60a messages for specifics"
7193 run_test 60a "llog_test run from kernel module and test llog_reader"
7195 test_60b() { # bug 6411
7196 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7199 LLOG_COUNT=$(do_facet mgs dmesg |
7200 awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
7201 /llog_[a-z]*.c:[0-9]/ {
7213 [[ $LLOG_COUNT -gt 120 ]] &&
7214 error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
7216 run_test 60b "limit repeated messages from CERROR/CWARN"
7219 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7221 echo "create 5000 files"
7222 createmany -o $DIR/f60c- 5000
7223 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137
7224 lctl set_param fail_loc=0x80000137
7225 unlinkmany $DIR/f60c- 5000
7226 lctl set_param fail_loc=0
7228 run_test 60c "unlink file when mds full"
7231 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7233 SAVEPRINTK=$(lctl get_param -n printk)
7234 # verify "lctl mark" is even working"
7235 MESSAGE="test message ID $RANDOM $$"
7236 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
7237 dmesg | grep -q "$MESSAGE" || error "didn't find debug marker in log"
7239 lctl set_param printk=0 || error "set lnet.printk failed"
7240 lctl get_param -n printk | grep emerg || error "lnet.printk dropped emerg"
7241 MESSAGE="new test message ID $RANDOM $$"
7242 # Assume here that libcfs_debug_mark_buffer() uses D_WARNING
7243 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
7244 dmesg | grep -q "$MESSAGE" && error "D_WARNING wasn't masked" || true
7246 lctl set_param -n printk="$SAVEPRINTK"
7248 run_test 60d "test printk console message masking"
7251 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7252 remote_mds_nodsh && skip "remote MDS with nodsh"
7255 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
7256 do_facet mds1 lctl set_param fail_loc=0x15b
7259 run_test 60e "no space while new llog is being created"
7265 test_mkdir -c $MDSCOUNT $DIR/$tdir
7270 $LFS setdirstripe -i $(($index % $MDSCOUNT)) \
7271 -c $MDSCOUNT $DIR/$tdir/subdir$index \
7273 mkdir $DIR/$tdir/subdir$index 2>/dev/null
7274 rmdir $DIR/$tdir/subdir$index 2>/dev/null
7275 index=$((index + 1))
7281 for i in {0..100}; do
7282 # define OBD_FAIL_OSD_TXN_START 0x19a
7283 local index=$((i % MDSCOUNT + 1))
7285 do_facet mds$index $LCTL set_param fail_loc=0x8000019a \
7292 for i in $(seq $MDSCOUNT); do
7293 do_facet mds$i $LCTL set_param fail_loc=0 > /dev/null
7296 mkdir $DIR/$tdir/new || error "mkdir failed"
7297 rmdir $DIR/$tdir/new || error "rmdir failed"
7299 do_facet mds1 $LCTL lfsck_start -M $(facet_svc mds1) -A -C \
7301 for i in $(seq $MDSCOUNT); do
7302 wait_update_facet mds$i "$LCTL get_param -n \
7303 mdd.$(facet_svc mds$i).lfsck_namespace |
7304 awk '/^status/ { print \\\$2 }'" "completed"
7307 ls -R $DIR/$tdir || error "ls failed"
7308 rm -rf $DIR/$tdir || error "rmdir failed"
7310 run_test 60g "transaction abort won't cause MDT hung"
7313 [ $MDS1_VERSION -le $(version_code 2.12.52) ] &&
7314 skip "Need MDS version at least 2.12.52"
7315 [ $MDSCOUNT -lt 2 ] && skip "Need at least 2 MDTs"
7319 #define OBD_FAIL_MDS_STRIPE_CREATE 0x188
7320 #define OBD_FAIL_MDS_STRIPE_FID 0x189
7321 for fail_loc in 0x80000188 0x80000189; do
7322 do_facet mds1 "$LCTL set_param fail_loc=$fail_loc"
7323 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir-$fail_loc ||
7324 error "mkdir $dir-$fail_loc failed"
7325 for i in {0..10}; do
7326 # create may fail on missing stripe
7327 echo $i > $DIR/$tdir-$fail_loc/$i
7329 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
7330 error "getdirstripe $tdir-$fail_loc failed"
7331 $LFS migrate -m 1 $DIR/$tdir-$fail_loc ||
7332 error "migrate $tdir-$fail_loc failed"
7333 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
7334 error "getdirstripe $tdir-$fail_loc failed"
7335 pushd $DIR/$tdir-$fail_loc
7337 echo $f | cmp $f - || error "$f data mismatch"
7340 rm -rf $DIR/$tdir-$fail_loc
7343 run_test 60h "striped directory with missing stripes can be accessed"
7346 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7349 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1 || error "dd $f failed"
7350 cancel_lru_locks osc
7351 $MULTIOP $f OSMWUc || error "$MULTIOP $f failed"
7354 run_test 61a "mmap() writes don't make sync hang ================"
7357 mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
7359 run_test 61b "mmap() of unstriped file is successful"
7361 # bug 2330 - insufficient obd_match error checking causes LBUG
7363 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7367 cancel_lru_locks osc
7368 lctl set_param fail_loc=0x405
7369 cat $f && error "cat succeeded, expect -EIO"
7370 lctl set_param fail_loc=0
7372 # This test is now irrelevant (as of bug 10718 inclusion), we no longer
7373 # match every page all of the time.
7374 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
7376 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
7377 # Though this test is irrelevant anymore, it helped to reveal some
7378 # other grant bugs (LU-4482), let's keep it.
7379 test_63a() { # was test_63
7380 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7382 MAX_DIRTY_MB=$(lctl get_param -n osc.*.max_dirty_mb | head -n 1)
7384 for i in `seq 10` ; do
7385 dd if=/dev/zero of=$DIR/f63 bs=8k &
7391 rm -f $DIR/f63 || true
7393 run_test 63a "Verify oig_wait interruption does not crash ======="
7395 # bug 2248 - async write errors didn't return to application on sync
7396 # bug 3677 - async write errors left page locked
7398 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7401 lctl set_param debug=-1
7403 # ensure we have a grant to do async writes
7404 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
7407 sync # sync lest earlier test intercept the fail_loc
7409 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
7410 lctl set_param fail_loc=0x80000406
7411 $MULTIOP $DIR/$tfile Owy && \
7412 error "sync didn't return ENOMEM"
7413 sync; sleep 2; sync # do a real sync this time to flush page
7414 lctl get_param -n llite.*.dump_page_cache | grep locked && \
7415 error "locked page left in cache after async error" || true
7418 run_test 63b "async write errors should be returned to fsync ==="
7421 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7424 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
7426 run_test 64a "verify filter grant calculations (in kernel) ====="
7429 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7431 sh oos.sh $MOUNT || error "oos.sh failed: $?"
7433 run_test 64b "check out-of-space detection on client"
7436 $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
7438 run_test 64c "verify grant shrink"
7440 # this does exactly what osc_request.c:osc_announce_cached() does in
7441 # order to calculate max amount of grants to ask from server
7445 local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc)
7446 local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight)
7448 ((rpc_in_flight ++));
7449 nrpages=$((nrpages * rpc_in_flight))
7451 local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb)
7453 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
7455 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
7456 local undirty=$((nrpages * PAGE_SIZE))
7458 local max_extent_pages
7459 max_extent_pages=$($LCTL get_param osc.${tgt}.import |
7460 grep grant_max_extent_size | awk '{print $2}')
7461 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
7462 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
7463 local grant_extent_tax
7464 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
7465 grep grant_extent_tax | awk '{print $2}')
7467 undirty=$((undirty + nrextents * grant_extent_tax))
7472 # this is size of unit for grant allocation. It should be equal to
7473 # what tgt_grant.c:tgt_grant_chunk() calculates
7477 local grant_extent_tax
7479 max_brw_size=$($LCTL get_param osc.${tgt}.import |
7480 grep max_brw_size | awk '{print $2}')
7482 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
7483 grep grant_extent_tax | awk '{print $2}')
7485 echo $(((max_brw_size + grant_extent_tax) * 2))
7489 [ $OST1_VERSION -lt $(version_code 2.10.56) ] &&
7490 skip "OST < 2.10.55 doesn't limit grants enough"
7492 local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}')
7493 local file=$DIR/$tfile
7495 [[ $($LCTL get_param osc.${tgt}.import |
7496 grep "connect_flags:.*grant_param") ]] ||
7497 skip "no grant_param connect flag"
7499 local olddebug=$($LCTL get_param -n debug 2> /dev/null)
7501 $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true
7503 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
7504 stack_trap "rm -f $file" EXIT
7506 $LFS setstripe $file -i 0 -c 1
7507 dd if=/dev/zero of=$file bs=1M count=1000 &
7512 local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes)
7513 if [[ $cur_grant -gt $max_cur_granted ]]
7516 error "cur_grant $cur_grant > $max_cur_granted"
7519 [[ $? -ne 0 ]] && break;
7524 wait_delete_completed
7525 $LCTL set_param debug="$olddebug" 2> /dev/null || true
7527 run_test 64d "check grant limit exceed"
7529 # bug 1414 - set/get directories' stripe info
7531 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7533 test_mkdir $DIR/$tdir
7535 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
7537 run_test 65a "directory with no stripe info"
7540 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7542 test_mkdir $DIR/$tdir
7543 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7545 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7548 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
7550 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
7553 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7554 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
7556 test_mkdir $DIR/$tdir
7557 local stripesize=$($LFS getstripe -S $DIR/$tdir)
7559 $LFS setstripe -S $((stripesize * 4)) -i 1 \
7560 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
7562 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
7564 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
7567 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7569 test_mkdir $DIR/$tdir
7570 local STRIPECOUNT=$($LFS getstripe -c $DIR/$tdir)
7571 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7573 if [[ $STRIPECOUNT -le 0 ]]; then
7575 elif [[ $STRIPECOUNT -gt $LOV_MAX_STRIPE_COUNT ]]; then
7576 [[ $OSTCOUNT -gt $LOV_MAX_STRIPE_COUNT ]] &&
7577 sc=$LOV_MAX_STRIPE_COUNT || sc=$(($OSTCOUNT - 1))
7579 sc=$(($STRIPECOUNT - 1))
7581 $LFS setstripe -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
7582 touch $DIR/$tdir/f4 $DIR/$tdir/f5
7583 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
7584 error "lverify failed"
7586 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
7589 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7591 test_mkdir $DIR/$tdir
7593 $LFS setstripe $DIR/$tdir || error "setstripe"
7594 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7595 error "no stripe info failed"
7597 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
7599 run_test 65e "directory setstripe defaults"
7602 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7604 test_mkdir $DIR/${tdir}f
7605 $RUNAS $LFS setstripe $DIR/${tdir}f &&
7606 error "setstripe succeeded" || true
7608 run_test 65f "dir setstripe permission (should return error) ==="
7611 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7613 test_mkdir $DIR/$tdir
7614 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7616 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7617 error "setstripe -S failed"
7618 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
7619 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7620 error "delete default stripe failed"
7622 run_test 65g "directory setstripe -d"
7625 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7627 test_mkdir $DIR/$tdir
7628 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7630 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7631 error "setstripe -S failed"
7632 test_mkdir $DIR/$tdir/dd1
7633 [ $($LFS getstripe -c $DIR/$tdir) = $($LFS getstripe -c $DIR/$tdir/dd1) ] ||
7634 error "stripe info inherit failed"
7636 run_test 65h "directory stripe info inherit ===================="
7639 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7641 save_layout_restore_at_exit $MOUNT
7643 # bug6367: set non-default striping on root directory
7644 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
7646 # bug12836: getstripe on -1 default directory striping
7647 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
7649 # bug12836: getstripe -v on -1 default directory striping
7650 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
7652 # bug12836: new find on -1 default directory striping
7653 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
7655 run_test 65i "various tests to set root directory striping"
7657 test_65j() { # bug6367
7658 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7662 # if we aren't already remounting for each test, do so for this test
7663 if [ "$I_MOUNTED" = "yes" ]; then
7664 cleanup || error "failed to unmount"
7668 save_layout_restore_at_exit $MOUNT
7670 $LFS setstripe -d $MOUNT || error "setstripe failed"
7672 run_test 65j "set default striping on root directory (bug 6367)="
7676 wait_delete_completed
7677 do_facet $SINGLEMDS "lctl set_param -n \
7678 osp.$ost*MDT0000.max_create_count=$max_count"
7679 do_facet $SINGLEMDS "lctl set_param -n \
7680 osp.$ost*MDT0000.create_count=$count"
7681 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7682 echo $INACTIVE_OSC "is Activate"
7684 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7687 test_65k() { # bug11679
7688 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7689 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7690 remote_mds_nodsh && skip "remote MDS with nodsh"
7692 local disable_precreate=true
7693 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
7694 disable_precreate=false
7696 echo "Check OST status: "
7697 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
7698 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
7700 for OSC in $MDS_OSCS; do
7701 echo $OSC "is active"
7702 do_facet $SINGLEMDS lctl --device %$OSC activate
7705 for INACTIVE_OSC in $MDS_OSCS; do
7706 local ost=$(osc_to_ost $INACTIVE_OSC)
7707 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
7708 lov.*md*.target_obd |
7709 awk -F: /$ost/'{ print $1 }' | head -n 1)
7712 $LFS setstripe -i $ostnum -c 1 $DIR/$tdir
7713 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
7715 echo "Deactivate: " $INACTIVE_OSC
7716 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
7718 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
7719 osp.$ost*MDT0000.create_count")
7720 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
7721 osp.$ost*MDT0000.max_create_count")
7722 $disable_precreate &&
7723 do_facet $SINGLEMDS "lctl set_param -n \
7724 osp.$ost*MDT0000.max_create_count=0"
7726 for idx in $(seq 0 $((OSTCOUNT - 1))); do
7727 [ -f $DIR/$tdir/$idx ] && continue
7728 echo "$LFS setstripe -i $idx -c 1 $DIR/$tdir/$idx"
7729 $LFS setstripe -i $idx -c 1 $DIR/$tdir/$idx ||
7731 error "setstripe $idx should succeed"; }
7732 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
7734 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
7737 do_facet $SINGLEMDS "lctl set_param -n \
7738 osp.$ost*MDT0000.max_create_count=$max_count"
7739 do_facet $SINGLEMDS "lctl set_param -n \
7740 osp.$ost*MDT0000.create_count=$count"
7741 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7742 echo $INACTIVE_OSC "is Activate"
7744 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7747 run_test 65k "validate manual striping works properly with deactivated OSCs"
7749 test_65l() { # bug 12836
7750 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7752 test_mkdir -p $DIR/$tdir/test_dir
7753 $LFS setstripe -c -1 $DIR/$tdir/test_dir
7754 $LFS find -mtime -1 $DIR/$tdir >/dev/null
7756 run_test 65l "lfs find on -1 stripe dir ========================"
7759 local layout=$(save_layout $MOUNT)
7760 $RUNAS $LFS setstripe -c 2 $MOUNT && {
7761 restore_layout $MOUNT $layout
7762 error "setstripe should fail by non-root users"
7766 run_test 65m "normal user can't set filesystem default stripe"
7769 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
7770 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.50) ]] ||
7771 skip "Need MDS version at least 2.12.50"
7772 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7774 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7775 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7776 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7778 local root_layout=$(save_layout $MOUNT)
7779 stack_trap "restore_layout $MOUNT $root_layout" EXIT
7781 # new subdirectory under root directory should not inherit
7782 # the default layout from root
7783 local dir1=$MOUNT/$tdir-1
7784 mkdir $dir1 || error "mkdir $dir1 failed"
7785 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7786 error "$dir1 shouldn't have LOV EA"
7788 # delete the default layout on root directory
7789 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7791 local dir2=$MOUNT/$tdir-2
7792 mkdir $dir2 || error "mkdir $dir2 failed"
7793 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7794 error "$dir2 shouldn't have LOV EA"
7796 # set a new striping pattern on root directory
7797 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7798 local new_def_stripe_size=$((def_stripe_size * 2))
7799 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7800 error "set stripe size on $MOUNT failed"
7802 # new file created in $dir2 should inherit the new stripe size from
7803 # the filesystem default
7804 local file2=$dir2/$tfile-2
7805 touch $file2 || error "touch $file2 failed"
7807 local file2_stripe_size=$($LFS getstripe -S $file2)
7808 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7809 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7811 local dir3=$MOUNT/$tdir-3
7812 mkdir $dir3 || error "mkdir $dir3 failed"
7813 ! getfattr -n trusted.lov $dir3 &> /dev/null ||
7814 error "$dir3 shouldn't have LOV EA"
7816 # set OST pool on root directory
7817 local pool=$TESTNAME
7818 pool_add $pool || error "add $pool failed"
7819 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7820 error "add targets to $pool failed"
7822 $LFS setstripe -p $pool $MOUNT ||
7823 error "set OST pool on $MOUNT failed"
7825 # new file created in $dir3 should inherit the pool from
7826 # the filesystem default
7827 local file3=$dir3/$tfile-3
7828 touch $file3 || error "touch $file3 failed"
7830 local file3_pool=$($LFS getstripe -p $file3)
7831 [[ "$file3_pool" = "$pool" ]] ||
7832 error "$file3 didn't inherit OST pool $pool"
7834 local dir4=$MOUNT/$tdir-4
7835 mkdir $dir4 || error "mkdir $dir4 failed"
7836 ! getfattr -n trusted.lov $dir4 &> /dev/null ||
7837 error "$dir4 shouldn't have LOV EA"
7839 # new file created in $dir4 should inherit the pool from
7840 # the filesystem default
7841 local file4=$dir4/$tfile-4
7842 touch $file4 || error "touch $file4 failed"
7844 local file4_pool=$($LFS getstripe -p $file4)
7845 [[ "$file4_pool" = "$pool" ]] ||
7846 error "$file4 didn't inherit OST pool $pool"
7848 # new subdirectory under non-root directory should inherit
7849 # the default layout from its parent directory
7850 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7851 error "set directory layout on $dir4 failed"
7853 local dir5=$dir4/$tdir-5
7854 mkdir $dir5 || error "mkdir $dir5 failed"
7856 local dir4_layout=$(get_layout_param $dir4)
7857 local dir5_layout=$(get_layout_param $dir5)
7858 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7859 error "$dir5 should inherit the default layout from $dir4"
7861 # though subdir under ROOT doesn't inherit default layout, but
7862 # its sub dir/file should be created with default layout.
7863 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
7864 [[ $MDS1_VERSION -ge $(version_code 2.12.59) ]] ||
7865 skip "Need MDS version at least 2.12.59"
7867 local default_lmv_count=$($LFS getdirstripe -D -c $MOUNT)
7868 local default_lmv_index=$($LFS getdirstripe -D -i $MOUNT)
7869 local default_lmv_hash=$($LFS getdirstripe -D -H $MOUNT)
7871 if [ $default_lmv_hash == "none" ]; then
7872 stack_trap "$LFS setdirstripe -D -d $MOUNT" EXIT
7874 stack_trap "$LFS setdirstripe -D -i $default_lmv_index \
7875 -c $default_lmv_count -H $default_lmv_hash $MOUNT" EXIT
7878 $LFS setdirstripe -D -c 2 $MOUNT ||
7879 error "setdirstripe -D -c 2 failed"
7880 mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed"
7881 local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6)
7882 [ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count"
7884 run_test 65n "don't inherit default layout from root for new subdirectories"
7886 # bug 2543 - update blocks count on client
7888 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7891 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7892 sync; sync_all_data; sync; sync_all_data
7893 cancel_lru_locks osc
7894 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7895 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7897 run_test 66 "update inode blocks count on client ==============="
7900 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7904 swapon -s | awk '($1 == "'$1'") { print $4 }'
7907 # bug5265, obdfilter oa2dentry return -ENOENT
7908 # #define OBD_FAIL_SRV_ENOENT 0x217
7910 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7911 remote_ost_nodsh && skip "remote OST with nodsh"
7914 $LFS setstripe -c 1 -i 0 $f
7916 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
7918 do_facet ost1 lctl set_param fail_loc=0x217
7919 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
7920 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
7922 do_facet ost1 lctl set_param fail_loc=0
7923 $DIRECTIO write $f 0 2 || error "write error"
7925 cancel_lru_locks osc
7926 $DIRECTIO read $f 0 1 || error "read error"
7928 do_facet ost1 lctl set_param fail_loc=0x217
7929 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
7931 do_facet ost1 lctl set_param fail_loc=0
7934 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
7937 test_mkdir $DIR/$tdir
7938 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
7939 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
7941 run_test 71 "Running dbench on lustre (don't segment fault) ===="
7943 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
7944 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7945 [ "$RUNAS_ID" = "$UID" ] &&
7946 skip_env "RUNAS_ID = UID = $UID -- skipping"
7947 # Check that testing environment is properly set up. Skip if not
7948 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
7949 skip_env "User $RUNAS_ID does not exist - skipping"
7952 chmod 777 $DIR/$tfile
7953 chmod ug+s $DIR/$tfile
7954 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
7955 error "$RUNAS dd $DIR/$tfile failed"
7956 # See if we are still setuid/sgid
7957 [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] &&
7958 error "S/gid is not dropped on write"
7959 # Now test that MDS is updated too
7960 cancel_lru_locks mdc
7961 [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] &&
7962 error "S/gid is not dropped on MDS"
7965 run_test 72a "Test that remove suid works properly (bug5695) ===="
7967 test_72b() { # bug 24226 -- keep mode setting when size is not changing
7970 [ "$RUNAS_ID" = "$UID" ] &&
7971 skip_env "RUNAS_ID = UID = $UID -- skipping"
7972 [ "$RUNAS_ID" -eq 0 ] &&
7973 skip_env "RUNAS_ID = 0 -- skipping"
7974 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7975 # Check that testing environment is properly set up. Skip if not
7976 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
7977 skip_env "User $RUNAS_ID does not exist - skipping"
7979 touch $DIR/${tfile}-f{g,u}
7980 test_mkdir $DIR/${tfile}-dg
7981 test_mkdir $DIR/${tfile}-du
7982 chmod 770 $DIR/${tfile}-{f,d}{g,u}
7983 chmod g+s $DIR/${tfile}-{f,d}g
7984 chmod u+s $DIR/${tfile}-{f,d}u
7985 for perm in 777 2777 4777; do
7986 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
7987 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
7988 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
7989 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
7993 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
7995 # bug 3462 - multiple simultaneous MDC requests
7997 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7999 test_mkdir $DIR/d73-1
8000 test_mkdir $DIR/d73-2
8001 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
8004 lctl set_param fail_loc=0x80000129
8005 $MULTIOP $DIR/d73-1/f73-2 Oc &
8007 lctl set_param fail_loc=0
8009 $MULTIOP $DIR/d73-2/f73-3 Oc &
8013 wait $pid1 || return 1
8017 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
8018 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
8019 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
8023 run_test 73 "multiple MDC requests (should not deadlock)"
8025 test_74a() { # bug 6149, 6184
8026 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8029 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
8031 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
8032 # will spin in a tight reconnection loop
8033 $LCTL set_param fail_loc=0x8000030e
8034 # get any lock that won't be difficult - lookup works.
8036 $LCTL set_param fail_loc=0
8040 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
8042 test_74b() { # bug 13310
8043 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8045 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
8047 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
8048 # will spin in a tight reconnection loop
8049 $LCTL set_param fail_loc=0x8000030e
8050 # get a "difficult" lock
8052 $LCTL set_param fail_loc=0
8056 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
8059 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8061 #define OBD_FAIL_LDLM_NEW_LOCK
8062 $LCTL set_param fail_loc=0x319
8063 touch $DIR/$tfile && error "touch successful"
8064 $LCTL set_param fail_loc=0
8067 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
8070 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
8073 test_76() { # Now for bug 20433, added originally in bug 1443
8074 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8076 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
8078 cancel_lru_locks osc
8079 BEFORE_INODES=$(num_inodes)
8080 echo "before inodes: $BEFORE_INODES"
8082 [ "$SLOW" = "no" ] && COUNT=100
8083 for i in $(seq $COUNT); do
8087 cancel_lru_locks osc
8088 AFTER_INODES=$(num_inodes)
8089 echo "after inodes: $AFTER_INODES"
8091 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
8093 AFTER_INODES=$(num_inodes)
8095 echo "wait $wait seconds inodes: $AFTER_INODES"
8096 if [ $wait -gt 30 ]; then
8097 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
8101 run_test 76 "confirm clients recycle inodes properly ===="
8107 # Note: in sptlrpc modes which enable its own bulk checksum, the
8108 # original crc32_le bulk checksum will be automatically disabled,
8109 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
8110 # will be checked by sptlrpc code against sptlrpc bulk checksum.
8111 # In this case set_checksums() will not be no-op, because sptlrpc
8112 # bulk checksum will be enabled all through the test.
8114 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
8115 lctl set_param -n osc.*.checksums $1
8119 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
8120 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
8121 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
8122 tr -d [] | head -n1)}
8125 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
8127 log "set checksum type to $1, rc = $rc"
8131 get_osc_checksum_type()
8133 # arugment 1: OST name, like OST0000
8135 checksum_type=$(lctl get_param -n osc.*${ost}-osc-[^mM]*.checksum_type |
8136 sed 's/.*\[\(.*\)\].*/\1/g')
8138 [ $rc -ne 0 ] && error "failed to get checksum type of $ost, rc = $rc, output = $checksum_type"
8142 F77_TMP=$TMP/f77-temp
8145 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
8146 error "error writing to $F77_TMP"
8149 test_77a() { # bug 10889
8150 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8151 $GSS && skip_env "could not run with gss"
8153 [ ! -f $F77_TMP ] && setup_f77
8155 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
8159 run_test 77a "normal checksum read/write operation"
8161 test_77b() { # bug 10889
8162 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8163 $GSS && skip_env "could not run with gss"
8165 [ ! -f $F77_TMP ] && setup_f77
8166 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
8167 $LCTL set_param fail_loc=0x80000409
8170 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
8171 error "dd error: $?"
8172 $LCTL set_param fail_loc=0
8174 for algo in $CKSUM_TYPES; do
8175 cancel_lru_locks osc
8176 set_checksum_type $algo
8177 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
8178 $LCTL set_param fail_loc=0x80000408
8179 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
8180 $LCTL set_param fail_loc=0
8183 set_checksum_type $ORIG_CSUM_TYPE
8186 run_test 77b "checksum error on client write, read"
8191 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
8193 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
8194 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
8195 $check_ost && [ -n "$ost_file_prefix" ] &&
8196 do_facet ost1 rm -f ${ost_file_prefix}\*
8200 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8201 $GSS && skip_env "could not run with gss"
8202 remote_ost_nodsh && skip "remote OST with nodsh"
8205 local osc_file_prefix
8207 local check_ost=false
8208 local ost_file_prefix
8214 # ensure corruption will occur on first OSS/OST
8215 $LFS setstripe -i 0 $DIR/$tfile
8217 [ ! -f $F77_TMP ] && setup_f77
8218 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
8219 error "dd write error: $?"
8220 fid=$($LFS path2fid $DIR/$tfile)
8222 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
8225 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
8226 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
8228 echo "OSS do not support bulk pages dump upon error"
8231 osc_file_prefix=$($LCTL get_param -n debug_path)
8232 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
8234 trap cleanup_77c EXIT
8237 # enable bulk pages dump upon error on Client
8238 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
8239 # enable bulk pages dump upon error on OSS
8241 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
8243 # flush Client cache to allow next read to reach OSS
8244 cancel_lru_locks osc
8246 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
8247 $LCTL set_param fail_loc=0x80000408
8248 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
8249 $LCTL set_param fail_loc=0
8253 # check cksum dump on Client
8254 osc_file=$(ls ${osc_file_prefix}*)
8255 [ -n "$osc_file" ] || error "no checksum dump file on Client"
8256 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
8257 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
8258 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
8259 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
8261 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
8262 [[ "$orig_cksum" == "$dump_cksum" ]] ||
8263 error "dump content does not match on Client"
8265 $check_ost || skip "No need to check cksum dump on OSS"
8267 # check cksum dump on OSS
8268 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
8269 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
8270 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
8271 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
8272 [[ "$orig_cksum" == "$dump_cksum" ]] ||
8273 error "dump content does not match on OSS"
8277 run_test 77c "checksum error on client read with debug"
8279 test_77d() { # bug 10889
8280 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8281 $GSS && skip_env "could not run with gss"
8283 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
8284 $LCTL set_param fail_loc=0x80000409
8286 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
8287 error "direct write: rc=$?"
8288 $LCTL set_param fail_loc=0
8291 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
8292 $LCTL set_param fail_loc=0x80000408
8294 cancel_lru_locks osc
8295 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
8296 error "direct read: rc=$?"
8297 $LCTL set_param fail_loc=0
8300 run_test 77d "checksum error on OST direct write, read"
8302 test_77f() { # bug 10889
8303 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8304 $GSS && skip_env "could not run with gss"
8307 for algo in $CKSUM_TYPES; do
8308 cancel_lru_locks osc
8309 set_checksum_type $algo
8310 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
8311 $LCTL set_param fail_loc=0x409
8312 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
8313 error "direct write succeeded"
8314 $LCTL set_param fail_loc=0
8316 set_checksum_type $ORIG_CSUM_TYPE
8319 run_test 77f "repeat checksum error on write (expect error)"
8321 test_77g() { # bug 10889
8322 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8323 $GSS && skip_env "could not run with gss"
8324 remote_ost_nodsh && skip "remote OST with nodsh"
8326 [ ! -f $F77_TMP ] && setup_f77
8328 local file=$DIR/$tfile
8329 stack_trap "rm -f $file" EXIT
8331 $LFS setstripe -c 1 -i 0 $file
8332 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
8333 do_facet ost1 lctl set_param fail_loc=0x8000021a
8335 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
8336 error "write error: rc=$?"
8337 do_facet ost1 lctl set_param fail_loc=0
8340 cancel_lru_locks osc
8341 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
8342 do_facet ost1 lctl set_param fail_loc=0x8000021b
8344 cmp $F77_TMP $file || error "file compare failed"
8345 do_facet ost1 lctl set_param fail_loc=0
8348 run_test 77g "checksum error on OST write, read"
8350 test_77k() { # LU-10906
8351 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8352 $GSS && skip_env "could not run with gss"
8354 local cksum_param="osc.$FSNAME*.checksums"
8355 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
8359 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
8360 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
8361 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
8365 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
8366 error "failed to set checksum=$i on MGS"
8367 wait_update $HOSTNAME "$get_checksum" $i
8369 echo "remount client, checksum should be $i"
8370 remount_client $MOUNT || error "failed to remount client"
8371 checksum=$(eval $get_checksum)
8372 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
8374 # remove persistent param to avoid races with checksum mountopt below
8375 do_facet mgs $LCTL set_param -P -d $cksum_param ||
8376 error "failed to delete checksum on MGS"
8378 for opt in "checksum" "nochecksum"; do
8379 #remount with mount option
8380 echo "remount client with option $opt, checksum should be $i"
8381 umount_client $MOUNT || error "failed to umount client"
8382 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
8383 error "failed to mount client with option '$opt'"
8384 checksum=$(eval $get_checksum)
8385 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
8389 remount_client $MOUNT || error "failed to remount client"
8391 run_test 77k "enable/disable checksum correctly"
8394 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8395 $GSS && skip_env "could not run with gss"
8398 stack_trap "set_checksums $ORIG_CSUM" EXIT
8399 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
8401 set_checksum_type invalid && error "unexpected success of invalid checksum type"
8403 $LFS setstripe -c 1 -i 0 $DIR/$tfile
8404 for algo in $CKSUM_TYPES; do
8405 set_checksum_type $algo || error "fail to set checksum type $algo"
8406 osc_algo=$(get_osc_checksum_type OST0000)
8407 [ "$osc_algo" != "$algo" ] && error "checksum type is $osc_algo after setting it to $algo"
8409 # no locks, no reqs to let the connection idle
8410 cancel_lru_locks osc
8411 lru_resize_disable osc
8412 wait_osc_import_state client ost1 IDLE
8414 # ensure ost1 is connected
8415 stat $DIR/$tfile >/dev/null || error "can't stat"
8416 wait_osc_import_state client ost1 FULL
8418 osc_algo=$(get_osc_checksum_type OST0000)
8419 [ "$osc_algo" != "$algo" ] && error "checksum type changed from $algo to $osc_algo after reconnection"
8423 run_test 77l "preferred checksum type is remembered after reconnected"
8425 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
8434 test_78() { # bug 10901
8435 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8436 remote_ost || skip_env "local OST"
8439 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
8440 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
8441 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
8442 echo "MemTotal: $MEMTOTAL"
8444 # reserve 256MB of memory for the kernel and other running processes,
8445 # and then take 1/2 of the remaining memory for the read/write buffers.
8446 if [ $MEMTOTAL -gt 512 ] ;then
8447 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
8449 # for those poor memory-starved high-end clusters...
8450 MEMTOTAL=$((MEMTOTAL / 2))
8452 echo "Mem to use for directio: $MEMTOTAL"
8454 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
8455 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
8456 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
8457 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
8459 echo "Smallest OST: $SMALLESTOST"
8460 [[ $SMALLESTOST -lt 10240 ]] &&
8461 skip "too small OSTSIZE, useless to run large O_DIRECT test"
8463 trap cleanup_test_78 EXIT
8465 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
8466 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
8468 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
8469 echo "File size: $F78SIZE"
8470 $LFS setstripe -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
8471 for i in $(seq 1 $NSEQ); do
8472 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
8473 echo directIO rdwr round $i of $NSEQ
8474 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
8479 run_test 78 "handle large O_DIRECT writes correctly ============"
8481 test_79() { # bug 12743
8482 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8484 wait_delete_completed
8486 BKTOTAL=$(calc_osc_kbytes kbytestotal)
8487 BKFREE=$(calc_osc_kbytes kbytesfree)
8488 BKAVAIL=$(calc_osc_kbytes kbytesavail)
8490 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
8491 DFTOTAL=`echo $STRING | cut -d, -f1`
8492 DFUSED=`echo $STRING | cut -d, -f2`
8493 DFAVAIL=`echo $STRING | cut -d, -f3`
8494 DFFREE=$(($DFTOTAL - $DFUSED))
8496 ALLOWANCE=$((64 * $OSTCOUNT))
8498 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
8499 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
8500 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
8502 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
8503 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
8504 error "df free($DFFREE) mismatch OST free($BKFREE)"
8506 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
8507 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
8508 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
8511 run_test 79 "df report consistency check ======================="
8513 test_80() { # bug 10718
8514 remote_ost_nodsh && skip "remote OST with nodsh"
8515 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8517 # relax strong synchronous semantics for slow backends like ZFS
8518 local soc="obdfilter.*.sync_on_lock_cancel"
8519 local soc_old=$(do_facet ost1 lctl get_param -n $soc | head -n1)
8521 if [ "$soc_old" != "never" ] &&
8522 [ "$ost1_FSTYPE" != "ldiskfs" ]; then
8523 hosts=$(for host in $(seq -f "ost%g" 1 $OSTCOUNT); do
8524 facet_active_host $host; done | sort -u)
8525 do_nodes $hosts lctl set_param $soc=never
8528 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
8530 local BEFORE=`date +%s`
8531 cancel_lru_locks osc
8532 local AFTER=`date +%s`
8533 local DIFF=$((AFTER-BEFORE))
8534 if [ $DIFF -gt 1 ] ; then
8535 error "elapsed for 1M@1T = $DIFF"
8538 [ -n "$hosts" ] && do_nodes $hosts lctl set_param $soc=$soc_old
8542 run_test 80 "Page eviction is equally fast at high offsets too ===="
8544 test_81a() { # LU-456
8545 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8546 remote_ost_nodsh && skip "remote OST with nodsh"
8548 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8549 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
8550 do_facet ost1 lctl set_param fail_loc=0x80000228
8552 # write should trigger a retry and success
8553 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8554 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8556 if [ $RC -ne 0 ] ; then
8557 error "write should success, but failed for $RC"
8560 run_test 81a "OST should retry write when get -ENOSPC ==============="
8562 test_81b() { # LU-456
8563 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8564 remote_ost_nodsh && skip "remote OST with nodsh"
8566 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8567 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
8568 do_facet ost1 lctl set_param fail_loc=0x228
8570 # write should retry several times and return -ENOSPC finally
8571 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8572 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8575 if [ $RC -ne $ENOSPC ] ; then
8576 error "dd should fail for -ENOSPC, but succeed."
8579 run_test 81b "OST should return -ENOSPC when retry still fails ======="
8581 test_82() { # LU-1031
8582 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
8586 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
8588 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
8590 kill -USR1 $MULTIPID2
8592 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
8593 error "First grouplock does not block second one"
8595 echo "Second grouplock blocks first one"
8597 kill -USR1 $MULTIPID1
8601 run_test 82 "Basic grouplock test"
8604 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
8606 test_mkdir $DIR/$tdir.cvsroot
8607 chown $RUNAS_ID $DIR/$tdir.cvsroot
8610 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
8613 # some versions of cvs import exit(1) when asked to import links or
8614 # files they can't read. ignore those files.
8615 local toignore=$(find . -type l -printf '-I %f\n' -o \
8616 ! -perm /4 -printf '-I %f\n')
8617 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
8618 $tdir.reposname vtag rtag
8621 test_mkdir $DIR/$tdir.reposname
8622 chown $RUNAS_ID $DIR/$tdir.reposname
8623 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
8625 cd $DIR/$tdir.reposname
8627 $RUNAS cvs add -m 'addmsg' foo99
8629 $RUNAS cvs commit -m 'nomsg' foo99
8630 rm -fr $DIR/$tdir.cvsroot
8632 run_test 99 "cvs strange file/directory operations"
8635 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8636 [[ "$NETTYPE" =~ tcp ]] ||
8637 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
8638 remote_ost_nodsh && skip "remote OST with nodsh"
8639 remote_mds_nodsh && skip "remote MDS with nodsh"
8641 skip "useless for local single node setup"
8643 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
8644 [ "$PROT" != "tcp" ] && continue
8645 RPORT=$(echo $REMOTE | cut -d: -f2)
8646 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
8649 LPORT=`echo $LOCAL | cut -d: -f2`
8650 if [ $LPORT -ge 1024 ]; then
8651 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
8653 error_exit "local: $LPORT > 1024, remote: $RPORT"
8656 [ "$rc" = 0 ] || error_exit "privileged port not found" )
8658 run_test 100 "check local port using privileged port ==========="
8660 function get_named_value()
8669 echo $line | sed "s/^$tag[ ]*//"
8676 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
8677 awk '/^max_cached_mb/ { print $2 }')
8680 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
8685 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8690 local cache_limit=32
8692 $LCTL set_param -n osc.*-osc*.rpc_stats 0
8693 trap cleanup_101a EXIT
8694 $LCTL set_param -n llite.*.read_ahead_stats 0
8695 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
8698 # randomly read 10000 of 64K chunks from file 3x 32MB in size
8700 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
8701 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
8704 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
8705 get_named_value 'read but discarded' | cut -d" " -f1); do
8706 discard=$(($discard + $s))
8710 $LCTL get_param osc.*-osc*.rpc_stats
8711 $LCTL get_param llite.*.read_ahead_stats
8713 # Discard is generally zero, but sometimes a few random reads line up
8714 # and trigger larger readahead, which is wasted & leads to discards.
8715 if [[ $(($discard)) -gt $nreads ]]; then
8716 error "too many ($discard) discarded pages"
8718 rm -f $DIR/$tfile || true
8720 run_test 101a "check read-ahead for random reads"
8723 test_mkdir $DIR/$tdir
8725 local FILE_LENGTH=$2
8728 local FILE_SIZE_MB=$((FILE_LENGTH / ssize))
8730 local list=$(comma_list $(osts_nodes))
8731 set_osd_param $list '' read_cache_enable 0
8732 set_osd_param $list '' writethrough_cache_enable 0
8734 trap cleanup_test101bc EXIT
8735 # prepare the read-ahead file
8736 $LFS setstripe -S $ssize -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
8738 dd if=/dev/zero of=$DIR/$tfile bs=$ssize \
8739 count=$FILE_SIZE_MB 2> /dev/null
8743 cleanup_test101bc() {
8748 local list=$(comma_list $(osts_nodes))
8749 set_osd_param $list '' read_cache_enable 1
8750 set_osd_param $list '' writethrough_cache_enable 1
8754 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
8759 local STRIPE_SIZE=$2
8760 local FILE_LENGTH=$3
8761 local RA_INC=1048576
8762 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
8763 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
8764 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
8765 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
8766 get_named_value 'read but discarded' |
8767 cut -d" " -f1 | calc_total)
8768 if [[ $DISCARD -gt $discard_limit ]]; then
8769 $LCTL get_param llite.*.read_ahead_stats
8770 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
8772 echo "Read-ahead success for size ${READ_SIZE}"
8777 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8778 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8780 local STRIPE_SIZE=1048576
8781 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
8783 if [ $SLOW == "yes" ]; then
8784 local FILE_LENGTH=$((STRIDE_SIZE * 64))
8786 local FILE_LENGTH=$((STRIDE_SIZE * 8))
8789 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
8791 # prepare the read-ahead file
8792 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8793 cancel_lru_locks osc
8794 for BIDX in 2 4 8 16 32 64 128 256
8796 local BSIZE=$((BIDX*4096))
8797 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
8798 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
8799 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
8800 $LCTL set_param -n llite.*.read_ahead_stats 0
8801 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
8802 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
8803 cancel_lru_locks osc
8804 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
8809 run_test 101b "check stride-io mode read-ahead ================="
8812 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8814 local STRIPE_SIZE=1048576
8815 local FILE_LENGTH=$((STRIPE_SIZE*100))
8820 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8822 cancel_lru_locks osc
8823 $LCTL set_param osc.*.rpc_stats 0
8824 $READS -f $DIR/$tfile -s$FILE_LENGTH -b$rsize -n$nreads -t 180
8825 $LCTL get_param osc.*.rpc_stats
8826 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8827 local stats=$($LCTL get_param -n $osc_rpc_stats)
8828 local lines=$(echo "$stats" | awk 'END {print NR;}')
8831 if [ $lines -le 20 ]; then
8832 echo "continue debug"
8835 for size in 1 2 4 8; do
8836 local rpc=$(echo "$stats" |
8837 awk '($1 == "'$size':") {print $2; exit; }')
8838 [ $rpc != 0 ] && ((size * PAGE_SIZE < rsize)) &&
8839 error "Small $((size*PAGE_SIZE)) read IO $rpc!"
8841 echo "$osc_rpc_stats check passed!"
8846 run_test 101c "check stripe_size aligned read-ahead ================="
8849 $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
8850 $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
8854 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8856 local file=$DIR/$tfile
8857 local sz_MB=${FILESIZE_101d:-500}
8858 local ra_MB=${READAHEAD_MB:-40}
8860 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8861 [ $free_MB -lt $sz_MB ] &&
8862 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8864 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8865 $LFS setstripe -c -1 $file || error "setstripe failed"
8867 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8868 echo Cancel LRU locks on lustre client to flush the client cache
8869 cancel_lru_locks osc
8871 echo Disable read-ahead
8872 local old_READAHEAD=$(set_read_ahead 0)
8874 echo Reading the test file $file with read-ahead disabled
8875 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8877 echo Cancel LRU locks on lustre client to flush the client cache
8878 cancel_lru_locks osc
8879 echo Enable read-ahead with ${ra_MB}MB
8880 set_read_ahead $ra_MB
8882 echo Reading the test file $file with read-ahead enabled
8883 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8885 echo "read-ahead disabled time read $raOFF"
8886 echo "read-ahead enabled time read $raON"
8888 set_read_ahead $old_READAHEAD
8890 wait_delete_completed
8892 [ $raOFF -le 1 ] || [ $raON -lt $raOFF ] ||
8893 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8895 run_test 101d "file read with and without read-ahead enabled"
8898 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8900 local file=$DIR/$tfile
8901 local size_KB=500 #KB
8905 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8906 local need_KB=$((count * size_KB))
8907 [[ $free_KB -le $need_KB ]] &&
8908 skip_env "Need free space $need_KB, have $free_KB"
8910 echo "Creating $count ${size_KB}K test files"
8911 for ((i = 0; i < $count; i++)); do
8912 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8915 echo "Cancel LRU locks on lustre client to flush the client cache"
8916 cancel_lru_locks $OSC
8918 echo "Reset readahead stats"
8919 $LCTL set_param -n llite.*.read_ahead_stats 0
8921 for ((i = 0; i < $count; i++)); do
8922 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
8925 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8926 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8928 for ((i = 0; i < $count; i++)); do
8929 rm -rf $file.$i 2>/dev/null
8932 #10000 means 20% reads are missing in readahead
8933 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
8935 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
8938 which iozone || skip_env "no iozone installed"
8940 local old_debug=$($LCTL get_param debug)
8941 old_debug=${old_debug#*=}
8942 $LCTL set_param debug="reada mmap"
8944 # create a test file
8945 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
8947 echo Cancel LRU locks on lustre client to flush the client cache
8948 cancel_lru_locks osc
8950 echo Reset readahead stats
8951 $LCTL set_param -n llite.*.read_ahead_stats 0
8953 echo mmap read the file with small block size
8954 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
8957 echo checking missing pages
8958 $LCTL get_param llite.*.read_ahead_stats
8959 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8960 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8962 $LCTL set_param debug="$old_debug"
8963 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
8966 run_test 101f "check mmap read performance"
8968 test_101g_brw_size_test() {
8970 local pages=$((mb * 1048576 / PAGE_SIZE))
8971 local file=$DIR/$tfile
8973 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
8974 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
8975 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
8976 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
8980 stack_trap "rm -f $file" EXIT
8981 $LCTL set_param -n osc.*.rpc_stats=0
8983 # 10 RPCs should be enough for the test
8985 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
8986 { error "dd write ${mb} MB blocks failed"; return 3; }
8987 cancel_lru_locks osc
8988 dd of=/dev/null if=$file bs=${mb}M count=$count ||
8989 { error "dd write ${mb} MB blocks failed"; return 4; }
8991 # calculate number of full-sized read and write RPCs
8992 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
8993 sed -n '/pages per rpc/,/^$/p' |
8994 awk '/'$pages':/ { reads += $2; writes += $6 }; \
8995 END { print reads,writes }'))
8996 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
8998 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
9005 remote_ost_nodsh && skip "remote OST with nodsh"
9008 local osts=$(get_facets OST)
9009 local list=$(comma_list $(osts_nodes))
9010 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
9011 local brw_size="obdfilter.*.brw_size"
9013 $LFS setstripe -i 0 -c 1 $DIR/$tfile
9015 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
9017 if { [ $OST1_VERSION -ge $(version_code 2.8.52) ] ||
9018 { [ $OST1_VERSION -ge $(version_code 2.7.17) ] &&
9019 [ $OST1_VERSION -lt $(version_code 2.7.50) ]; }; } &&
9020 { [ $CLIENT_VERSION -ge $(version_code 2.8.52) ] ||
9021 { [ $CLIENT_VERSION -ge $(version_code 2.7.17) ] &&
9022 [ $CLIENT_VERSION -lt $(version_code 2.7.50) ]; }; }; then
9024 [ $OST1_VERSION -ge $(version_code 2.9.52) ] &&
9027 if [[ $orig_mb -lt 16 ]]; then
9028 save_lustre_params $osts "$brw_size" > $p
9029 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
9030 error "set 16MB RPC size failed"
9032 echo "remount client to enable new RPC size"
9033 remount_client $MOUNT || error "remount_client failed"
9036 test_101g_brw_size_test 16 || error "16MB RPC test failed"
9037 # should be able to set brw_size=12, but no rpc_stats for that
9038 test_101g_brw_size_test 8 || error "8MB RPC test failed"
9041 test_101g_brw_size_test 4 || error "4MB RPC test failed"
9043 if [[ $orig_mb -lt 16 ]]; then
9044 restore_lustre_params < $p
9045 remount_client $MOUNT || error "remount_client restore failed"
9048 rm -f $p $DIR/$tfile
9050 run_test 101g "Big bulk(4/16 MiB) readahead"
9053 $LFS setstripe -i 0 -c 1 $DIR/$tfile
9055 dd if=/dev/zero of=$DIR/$tfile bs=1M count=70 ||
9056 error "dd 70M file failed"
9057 echo Cancel LRU locks on lustre client to flush the client cache
9058 cancel_lru_locks osc
9060 echo "Reset readahead stats"
9061 $LCTL set_param -n llite.*.read_ahead_stats 0
9063 echo "Read 10M of data but cross 64M bundary"
9064 dd if=$DIR/$tfile of=/dev/null bs=10M skip=6 count=1
9065 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
9066 get_named_value 'misses' | cut -d" " -f1 | calc_total)
9067 [ $miss -eq 1 ] || error "expected miss 1 but got $miss"
9068 rm -f $p $DIR/$tfile
9070 run_test 101h "Readahead should cover current read window"
9073 test_mkdir $DIR/$tdir
9074 chown $RUNAS_ID $DIR/$tdir
9077 STRIPE_COUNT=$OSTCOUNT
9078 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
9080 trap cleanup_test102 EXIT
9082 $1 $LFS setstripe -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
9084 for num in 1 2 3 4; do
9085 for count in $(seq 1 $STRIPE_COUNT); do
9086 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
9087 local size=`expr $STRIPE_SIZE \* $num`
9088 local file=file"$num-$idx-$count"
9089 $1 $LFS setstripe -S $size -i $idx -c $count $file
9095 $1 tar cf $TMP/f102.tar $tdir --xattrs
9101 rm -rf $DIR/d0.sanity/d102
9105 [ "$UID" != 0 ] && skip "must run as root"
9106 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
9107 skip_env "must have user_xattr"
9109 [ -z "$(which setfattr 2>/dev/null)" ] &&
9110 skip_env "could not find setfattr"
9112 local testfile=$DIR/$tfile
9115 echo "set/get xattr..."
9116 setfattr -n trusted.name1 -v value1 $testfile ||
9117 error "setfattr -n trusted.name1=value1 $testfile failed"
9118 getfattr -n trusted.name1 $testfile 2> /dev/null |
9119 grep "trusted.name1=.value1" ||
9120 error "$testfile missing trusted.name1=value1"
9122 setfattr -n user.author1 -v author1 $testfile ||
9123 error "setfattr -n user.author1=author1 $testfile failed"
9124 getfattr -n user.author1 $testfile 2> /dev/null |
9125 grep "user.author1=.author1" ||
9126 error "$testfile missing trusted.author1=author1"
9129 setfattr -n trusted.name2 -v value2 $testfile ||
9130 error "$testfile unable to set trusted.name2"
9131 setfattr -n trusted.name3 -v value3 $testfile ||
9132 error "$testfile unable to set trusted.name3"
9133 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
9134 grep "trusted.name" | wc -l) -eq 3 ] ||
9135 error "$testfile missing 3 trusted.name xattrs"
9137 setfattr -n user.author2 -v author2 $testfile ||
9138 error "$testfile unable to set user.author2"
9139 setfattr -n user.author3 -v author3 $testfile ||
9140 error "$testfile unable to set user.author3"
9141 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
9142 grep "user.author" | wc -l) -eq 3 ] ||
9143 error "$testfile missing 3 user.author xattrs"
9145 echo "remove xattr..."
9146 setfattr -x trusted.name1 $testfile ||
9147 error "$testfile error deleting trusted.name1"
9148 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
9149 error "$testfile did not delete trusted.name1 xattr"
9151 setfattr -x user.author1 $testfile ||
9152 error "$testfile error deleting user.author1"
9153 echo "set lustre special xattr ..."
9154 $LFS setstripe -c1 $testfile
9155 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
9156 awk -F "=" '/trusted.lov/ { print $2 }' )
9157 setfattr -n "trusted.lov" -v $lovea $testfile ||
9158 error "$testfile doesn't ignore setting trusted.lov again"
9159 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
9160 error "$testfile allow setting invalid trusted.lov"
9163 run_test 102a "user xattr test =================================="
9166 [ -z "$(which setfattr 2>/dev/null)" ] &&
9167 skip_env "could not find setfattr"
9168 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9170 # b10930: get/set/list trusted.lov xattr
9171 echo "get/set/list trusted.lov xattr ..."
9172 local testfile=$DIR/$tfile
9173 $LFS setstripe -S 65536 -i 1 -c $OSTCOUNT $testfile ||
9174 error "setstripe failed"
9175 local STRIPECOUNT=$($LFS getstripe -c $testfile) ||
9176 error "getstripe failed"
9177 getfattr -d -m "^trusted" $testfile 2>/dev/null | grep "trusted.lov" ||
9178 error "can't get trusted.lov from $testfile"
9180 local testfile2=${testfile}2
9181 local value=$(getfattr -n trusted.lov $testfile 2>/dev/null |
9182 grep "trusted.lov" | sed -e 's/[^=]\+=//')
9185 setfattr -n trusted.lov -v $value $testfile2
9186 local stripe_size=$($LFS getstripe -S $testfile2)
9187 local stripe_count=$($LFS getstripe -c $testfile2)
9188 [[ $stripe_size -eq 65536 ]] ||
9189 error "stripe size $stripe_size != 65536"
9190 [[ $stripe_count -eq $STRIPECOUNT ]] ||
9191 error "stripe count $stripe_count != $STRIPECOUNT"
9194 run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
9197 [ -z "$(which setfattr 2>/dev/null)" ] &&
9198 skip_env "could not find setfattr"
9199 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9201 # b10930: get/set/list lustre.lov xattr
9202 echo "get/set/list lustre.lov xattr ..."
9203 test_mkdir $DIR/$tdir
9204 chown $RUNAS_ID $DIR/$tdir
9205 local testfile=$DIR/$tdir/$tfile
9206 $RUNAS $LFS setstripe -S 65536 -i 1 -c $OSTCOUNT $testfile ||
9207 error "setstripe failed"
9208 local STRIPECOUNT=$($RUNAS $LFS getstripe -c $testfile) ||
9209 error "getstripe failed"
9210 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
9211 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
9213 local testfile2=${testfile}2
9214 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
9215 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
9217 $RUNAS $MCREATE $testfile2
9218 $RUNAS setfattr -n lustre.lov -v $value $testfile2
9219 local stripe_size=$($RUNAS $LFS getstripe -S $testfile2)
9220 local stripe_count=$($RUNAS $LFS getstripe -c $testfile2)
9221 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
9222 [ $stripe_count -eq $STRIPECOUNT ] ||
9223 error "stripe count $stripe_count != $STRIPECOUNT"
9225 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
9227 compare_stripe_info1() {
9228 local stripe_index_all_zero=true
9230 for num in 1 2 3 4; do
9231 for count in $(seq 1 $STRIPE_COUNT); do
9232 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
9233 local size=$((STRIPE_SIZE * num))
9234 local file=file"$num-$offset-$count"
9235 stripe_size=$($LFS getstripe -S $PWD/$file)
9236 [[ $stripe_size -ne $size ]] &&
9237 error "$file: size $stripe_size != $size"
9238 stripe_count=$($LFS getstripe -c $PWD/$file)
9239 # allow fewer stripes to be created, ORI-601
9240 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
9241 error "$file: count $stripe_count != $count"
9242 stripe_index=$($LFS getstripe -i $PWD/$file)
9243 [[ $stripe_index -ne 0 ]] &&
9244 stripe_index_all_zero=false
9248 $stripe_index_all_zero &&
9249 error "all files are being extracted starting from OST index 0"
9253 have_xattrs_include() {
9254 tar --help | grep -q xattrs-include &&
9255 echo --xattrs-include="lustre.*"
9259 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9260 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9262 XINC=$(have_xattrs_include)
9264 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
9266 compare_stripe_info1
9268 run_test 102d "tar restore stripe info from tarfile,not keep osts"
9271 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9272 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9274 XINC=$(have_xattrs_include)
9276 test_mkdir $DIR/$tdir.restore
9278 tar cf - --xattrs $tdir | tar xf - \
9279 -C $DIR/$tdir.restore --xattrs $XINC
9280 cd $DIR/$tdir.restore/$tdir
9281 compare_stripe_info1
9283 run_test 102f "tar copy files, not keep osts"
9286 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
9287 skip "must have user_xattr"
9288 [ -z "$(which setfattr 2>/dev/null)" ] &&
9289 skip_env "could not find setfattr"
9290 [ -z "$(which getfattr 2>/dev/null)" ] &&
9291 skip_env "could not find getfattr"
9293 local xsize=${1:-1024} # in bytes
9294 local file=$DIR/$tfile
9295 local value="$(generate_string $xsize)"
9296 local xbig=trusted.big
9300 log "save $xbig on $file"
9303 setfattr -n $xbig -v $value $file ||
9304 error "saving $xbig on $file failed"
9306 setfattr -n $xbig -v $value $file &&
9307 error "saving $xbig on $file succeeded"
9311 local orig=$(get_xattr_value $xbig $file)
9312 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
9314 local xsml=trusted.sml
9315 log "save $xsml on $file"
9316 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
9318 local new=$(get_xattr_value $xbig $file)
9319 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
9321 log "grow $xsml on $file"
9322 setfattr -n $xsml -v "$value" $file ||
9323 error "growing $xsml on $file failed"
9325 new=$(get_xattr_value $xbig $file)
9326 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
9327 log "$xbig still valid after growing $xsml"
9332 test_102h() { # bug 15777
9335 run_test 102h "grow xattr from inside inode to external block"
9338 large_xattr_enabled || skip_env "ea_inode feature disabled"
9340 echo "setting xattr of max xattr size: $(max_xattr_size)"
9341 grow_xattr $(max_xattr_size)
9343 echo "setting xattr of > max xattr size: $(max_xattr_size) + 10"
9344 echo "This should fail:"
9345 grow_xattr $(($(max_xattr_size) + 10)) 1
9347 run_test 102ha "grow xattr from inside inode to external inode"
9349 test_102i() { # bug 17038
9350 [ -z "$(which getfattr 2>/dev/null)" ] &&
9351 skip "could not find getfattr"
9354 ln -s $DIR/$tfile $DIR/${tfile}link
9355 getfattr -n trusted.lov $DIR/$tfile ||
9356 error "lgetxattr on $DIR/$tfile failed"
9357 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
9358 grep -i "no such attr" ||
9359 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
9360 rm -f $DIR/$tfile $DIR/${tfile}link
9362 run_test 102i "lgetxattr test on symbolic link ============"
9365 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9366 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9368 XINC=$(have_xattrs_include)
9369 setup_test102 "$RUNAS"
9370 chown $RUNAS_ID $DIR/$tdir
9371 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
9373 compare_stripe_info1 "$RUNAS"
9375 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
9378 [ -z "$(which setfattr 2>/dev/null)" ] &&
9379 skip "could not find setfattr"
9382 # b22187 just check that does not crash for regular file.
9383 setfattr -n trusted.lov $DIR/$tfile
9384 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
9385 local test_kdir=$DIR/$tdir
9386 test_mkdir $test_kdir
9387 local default_size=$($LFS getstripe -S $test_kdir)
9388 local default_count=$($LFS getstripe -c $test_kdir)
9389 local default_offset=$($LFS getstripe -i $test_kdir)
9390 $LFS setstripe -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
9391 error 'dir setstripe failed'
9392 setfattr -n trusted.lov $test_kdir
9393 local stripe_size=$($LFS getstripe -S $test_kdir)
9394 local stripe_count=$($LFS getstripe -c $test_kdir)
9395 local stripe_offset=$($LFS getstripe -i $test_kdir)
9396 [ $stripe_size -eq $default_size ] ||
9397 error "stripe size $stripe_size != $default_size"
9398 [ $stripe_count -eq $default_count ] ||
9399 error "stripe count $stripe_count != $default_count"
9400 [ $stripe_offset -eq $default_offset ] ||
9401 error "stripe offset $stripe_offset != $default_offset"
9402 rm -rf $DIR/$tfile $test_kdir
9404 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
9407 [ -z "$(which getfattr 2>/dev/null)" ] &&
9408 skip "could not find getfattr"
9410 # LU-532 trusted. xattr is invisible to non-root
9411 local testfile=$DIR/$tfile
9415 echo "listxattr as user..."
9416 chown $RUNAS_ID $testfile
9417 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
9418 grep -q "trusted" &&
9419 error "$testfile trusted xattrs are user visible"
9423 run_test 102l "listxattr size test =================================="
9425 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
9426 local path=$DIR/$tfile
9429 listxattr_size_check $path || error "listattr_size_check $path failed"
9431 run_test 102m "Ensure listxattr fails on small bufffer ========"
9435 getxattr() { # getxattr path name
9436 # Return the base64 encoding of the value of xattr name on path.
9440 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
9442 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
9444 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
9446 getfattr --absolute-names --encoding=base64 --name=$name $path |
9447 awk -F= -v name=$name '$1 == name {
9448 print substr($0, index($0, "=") + 1);
9452 test_102n() { # LU-4101 mdt: protect internal xattrs
9453 [ -z "$(which setfattr 2>/dev/null)" ] &&
9454 skip "could not find setfattr"
9455 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
9457 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
9460 local file0=$DIR/$tfile.0
9461 local file1=$DIR/$tfile.1
9462 local xattr0=$TMP/$tfile.0
9463 local xattr1=$TMP/$tfile.1
9464 local namelist="lov lma lmv link fid version som hsm"
9468 rm -rf $file0 $file1 $xattr0 $xattr1
9471 # Get 'before' xattrs of $file1.
9472 getfattr --absolute-names --dump --match=- $file1 > $xattr0
9474 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
9475 namelist+=" lfsck_namespace"
9476 for name in $namelist; do
9477 # Try to copy xattr from $file0 to $file1.
9478 value=$(getxattr $file0 trusted.$name 2> /dev/null)
9480 setfattr --name=trusted.$name --value="$value" $file1 ||
9481 error "setxattr 'trusted.$name' failed"
9483 # Try to set a garbage xattr.
9484 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9486 if [[ x$name == "xlov" ]]; then
9487 setfattr --name=trusted.lov --value="$value" $file1 &&
9488 error "setxattr invalid 'trusted.lov' success"
9490 setfattr --name=trusted.$name --value="$value" $file1 ||
9491 error "setxattr invalid 'trusted.$name' failed"
9494 # Try to remove the xattr from $file1. We don't care if this
9495 # appears to succeed or fail, we just don't want there to be
9496 # any changes or crashes.
9497 setfattr --remove=$trusted.$name $file1 2> /dev/null
9500 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
9503 # Try to copy xattr from $file0 to $file1.
9504 value=$(getxattr $file0 trusted.$name 2> /dev/null)
9506 setfattr --name=trusted.$name --value="$value" $file1 ||
9507 error "setxattr 'trusted.$name' failed"
9509 # Try to set a garbage xattr.
9510 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9512 setfattr --name=trusted.$name --value="$value" $file1 ||
9513 error "setxattr 'trusted.$name' failed"
9515 # Try to remove the xattr from $file1. We don't care if this
9516 # appears to succeed or fail, we just don't want there to be
9517 # any changes or crashes.
9518 setfattr --remove=$trusted.$name $file1 2> /dev/null
9521 # Get 'after' xattrs of file1.
9522 getfattr --absolute-names --dump --match=- $file1 > $xattr1
9524 if ! diff $xattr0 $xattr1; then
9525 error "before and after xattrs of '$file1' differ"
9528 rm -rf $file0 $file1 $xattr0 $xattr1
9532 run_test 102n "silently ignore setxattr on internal trusted xattrs"
9534 test_102p() { # LU-4703 setxattr did not check ownership
9535 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
9536 skip "MDS needs to be at least 2.5.56"
9538 local testfile=$DIR/$tfile
9542 echo "setfacl as user..."
9543 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
9544 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
9546 echo "setfattr as user..."
9547 setfacl -m "u:$RUNAS_ID:---" $testfile
9548 $RUNAS setfattr -x system.posix_acl_access $testfile
9549 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
9551 run_test 102p "check setxattr(2) correctly fails without permission"
9554 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
9555 skip "MDS needs to be at least 2.6.92"
9557 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
9559 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
9562 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
9563 skip "MDS needs to be at least 2.6.93"
9565 touch $DIR/$tfile || error "touch"
9566 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
9567 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
9568 rm $DIR/$tfile || error "rm"
9571 mkdir -p $DIR/$tdir || error "mkdir"
9572 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9573 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9574 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9575 error "$testfile error deleting user.author1"
9576 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9577 grep "user.$(basename $tdir)" &&
9578 error "$tdir did not delete user.$(basename $tdir)"
9579 rmdir $DIR/$tdir || error "rmdir"
9582 test_mkdir $DIR/$tdir
9583 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9584 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9585 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9586 error "$testfile error deleting user.author1"
9587 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9588 grep "user.$(basename $tdir)" &&
9589 error "$tdir did not delete user.$(basename $tdir)"
9590 rmdir $DIR/$tdir || error "rm striped dir"
9592 run_test 102r "set EAs with empty values"
9595 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9596 skip "MDS needs to be at least 2.11.52"
9598 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9600 save_lustre_params client "llite.*.xattr_cache" > $save
9602 for cache in 0 1; do
9603 lctl set_param llite.*.xattr_cache=$cache
9606 touch $DIR/$tfile || error "touch"
9607 for prefix in lustre security system trusted user; do
9608 # Note getxattr() may fail with 'Operation not
9609 # supported' or 'No such attribute' depending
9610 # on prefix and cache.
9611 getfattr -n $prefix.n102s $DIR/$tfile &&
9612 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
9616 restore_lustre_params < $save
9618 run_test 102s "getting nonexistent xattrs should fail"
9621 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9622 skip "MDS needs to be at least 2.11.52"
9624 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9626 save_lustre_params client "llite.*.xattr_cache" > $save
9628 for cache in 0 1; do
9629 lctl set_param llite.*.xattr_cache=$cache
9631 for buf_size in 0 256; do
9633 touch $DIR/$tfile || error "touch"
9634 setfattr -n user.multiop $DIR/$tfile
9635 $MULTIOP $DIR/$tfile oa$buf_size ||
9636 error "cannot get zero length xattr value (buf_size = $buf_size)"
9640 restore_lustre_params < $save
9642 run_test 102t "zero length xattr values handled correctly"
9646 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
9651 [ "$UID" != 0 ] && skip "must run as root"
9652 $GSS && skip_env "could not run under gss"
9653 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
9654 skip_env "must have acl enabled"
9655 [ -z "$(which setfacl 2>/dev/null)" ] &&
9656 skip_env "could not find setfacl"
9657 remote_mds_nodsh && skip "remote MDS with nodsh"
9659 gpasswd -a daemon bin # LU-5641
9660 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
9662 declare -a identity_old
9664 for num in $(seq $MDSCOUNT); do
9665 switch_identity $num true || identity_old[$num]=$?
9673 echo "performing cp ..."
9674 run_acl_subtest cp || error "run_acl_subtest cp failed"
9675 echo "performing getfacl-noacl..."
9676 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
9677 echo "performing misc..."
9678 run_acl_subtest misc || error "misc test failed"
9679 echo "performing permissions..."
9680 run_acl_subtest permissions || error "permissions failed"
9681 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
9682 if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] ||
9683 { [ $MDS1_VERSION -lt $(version_code 2.6) ] &&
9684 [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; }
9686 echo "performing permissions xattr..."
9687 run_acl_subtest permissions_xattr ||
9688 error "permissions_xattr failed"
9690 echo "performing setfacl..."
9691 run_acl_subtest setfacl || error "setfacl test failed"
9693 # inheritance test got from HP
9694 echo "performing inheritance..."
9695 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
9696 chmod +x make-tree || error "chmod +x failed"
9697 run_acl_subtest inheritance || error "inheritance test failed"
9700 echo "LU-974 ignore umask when acl is enabled..."
9701 run_acl_subtest 974 || error "LU-974 umask test failed"
9702 if [ $MDSCOUNT -ge 2 ]; then
9703 run_acl_subtest 974_remote ||
9704 error "LU-974 umask test failed under remote dir"
9707 echo "LU-2561 newly created file is same size as directory..."
9708 if [ "$mds1_FSTYPE" != "zfs" ]; then
9709 run_acl_subtest 2561 || error "LU-2561 test failed"
9711 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
9714 run_acl_subtest 4924 || error "LU-4924 test failed"
9719 for num in $(seq $MDSCOUNT); do
9720 if [ "${identity_old[$num]}" = 1 ]; then
9721 switch_identity $num false || identity_old[$num]=$?
9725 run_test 103a "acl test"
9731 for U in {0..511}; do
9733 local O=$(printf "%04o" $U)
9735 umask $(printf "%04o" $((511 ^ $O)))
9736 $LFS setstripe -c 1 $DIR/$tfile.s$O
9737 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
9739 (( $S == ($O & 0666) )) ||
9740 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
9742 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
9743 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
9744 (( $S == ($O & 0666) )) ||
9745 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
9747 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
9748 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
9749 (( $S == ($O & 0666) )) ||
9750 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
9751 rm -f $DIR/$tfile.[smp]$0
9755 # limit the concurrently running threads to 64. LU-11878
9756 local idx=$((U % 64))
9757 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
9762 run_test 103b "umask lfs setstripe"
9766 cp -rp $DIR/$tdir $DIR/$tdir.bak
9768 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
9769 error "$DIR/$tdir shouldn't contain default ACL"
9770 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
9771 error "$DIR/$tdir.bak shouldn't contain default ACL"
9774 run_test 103c "'cp -rp' won't set empty acl"
9777 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9780 lfs df || error "lfs df failed"
9781 lfs df -ih || error "lfs df -ih failed"
9782 lfs df -h $DIR || error "lfs df -h $DIR failed"
9783 lfs df -i $DIR || error "lfs df -i $DIR failed"
9784 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
9785 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
9787 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
9788 lctl --device %$OSC deactivate
9789 lfs df || error "lfs df with deactivated OSC failed"
9790 lctl --device %$OSC activate
9791 # wait the osc back to normal
9792 wait_osc_import_ready client ost
9794 lfs df || error "lfs df with reactivated OSC failed"
9797 run_test 104a "lfs df [-ih] [path] test ========================="
9800 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9801 [ $RUNAS_ID -eq $UID ] &&
9802 skip_env "RUNAS_ID = UID = $UID -- skipping"
9804 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
9805 grep "Permission denied" | wc -l)))
9806 if [ $denied_cnt -ne 0 ]; then
9807 error "lfs check servers test failed"
9810 run_test 104b "$RUNAS lfs check servers test ===================="
9813 # doesn't work on 2.4 kernels
9815 if $(flock_is_enabled); then
9816 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
9818 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
9822 run_test 105a "flock when mounted without -o flock test ========"
9826 if $(flock_is_enabled); then
9827 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
9829 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
9833 run_test 105b "fcntl when mounted without -o flock test ========"
9837 if $(flock_is_enabled); then
9838 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
9840 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
9844 run_test 105c "lockf when mounted without -o flock test"
9846 test_105d() { # bug 15924
9847 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9849 test_mkdir $DIR/$tdir
9850 flock_is_enabled || skip_env "mount w/o flock enabled"
9851 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
9852 $LCTL set_param fail_loc=0x80000315
9853 flocks_test 2 $DIR/$tdir
9855 run_test 105d "flock race (should not freeze) ========"
9857 test_105e() { # bug 22660 && 22040
9858 flock_is_enabled || skip_env "mount w/o flock enabled"
9861 flocks_test 3 $DIR/$tfile
9863 run_test 105e "Two conflicting flocks from same process"
9865 test_106() { #bug 10921
9866 test_mkdir $DIR/$tdir
9867 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9868 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9870 run_test 106 "attempt exec of dir followed by chown of that dir"
9873 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9881 local save_pattern=$(sysctl -n kernel.core_pattern)
9882 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9883 sysctl -w kernel.core_pattern=$file
9884 sysctl -w kernel.core_uses_pid=0
9892 kill -s 11 $SLEEPPID
9894 if [ -e $file ]; then
9895 size=`stat -c%s $file`
9896 [ $size -eq 0 ] && error "Fail to create core file $file"
9898 error "Fail to create core file $file"
9901 sysctl -w kernel.core_pattern=$save_pattern
9902 sysctl -w kernel.core_uses_pid=$save_uses_pid
9905 run_test 107 "Coredump on SIG"
9908 test_mkdir $DIR/$tdir
9909 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9910 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9911 error "mkdir with 256 char should fail, but did not"
9912 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9913 error "create with 255 char failed"
9914 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9915 error "create with 256 char should fail, but did not"
9920 run_test 110 "filename length checking"
9923 # Purpose: To verify dynamic thread (OSS) creation.
9926 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9927 remote_ost_nodsh && skip "remote OST with nodsh"
9929 # Lustre does not stop service threads once they are started.
9930 # Reset number of running threads to default.
9935 local save_params="$TMP/sanity-$TESTNAME.parameters"
9937 # Get ll_ost_io count before I/O
9938 OSTIO_pre=$(do_facet ost1 \
9939 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9940 # Exit if lustre is not running (ll_ost_io not running).
9941 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9943 echo "Starting with $OSTIO_pre threads"
9944 local thread_max=$((OSTIO_pre * 2))
9945 local rpc_in_flight=$((thread_max * 2))
9946 # Number of I/O Process proposed to be started.
9948 local facets=$(get_facets OST)
9950 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9951 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9953 # Set in_flight to $rpc_in_flight
9954 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9955 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9956 nfiles=${rpc_in_flight}
9957 # Set ost thread_max to $thread_max
9958 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9960 # 5 Minutes should be sufficient for max number of OSS
9961 # threads(thread_max) to be created.
9965 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9966 test_mkdir $DIR/$tdir
9967 for i in $(seq $nfiles); do
9968 local file=$DIR/$tdir/${tfile}-$i
9969 $LFS setstripe -c -1 -i 0 $file
9970 ($WTL $file $timeout)&
9973 # I/O Started - Wait for thread_started to reach thread_max or report
9974 # error if thread_started is more than thread_max.
9975 echo "Waiting for thread_started to reach thread_max"
9976 local thread_started=0
9977 local end_time=$((SECONDS + timeout))
9979 while [ $SECONDS -le $end_time ] ; do
9981 # Get ost i/o thread_started count.
9982 thread_started=$(do_facet ost1 \
9984 ost.OSS.ost_io.threads_started | cut -d= -f2")
9985 # Break out if thread_started is equal/greater than thread_max
9986 if [[ $thread_started -ge $thread_max ]]; then
9987 echo ll_ost_io thread_started $thread_started, \
9988 equal/greater than thread_max $thread_max
9994 # Cleanup - We have the numbers, Kill i/o jobs if running.
9995 jobcount=($(jobs -p))
9996 for i in $(seq 0 $((${#jobcount[@]}-1)))
9998 kill -9 ${jobcount[$i]}
9999 if [ $? -ne 0 ] ; then
10001 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
10005 # Cleanup files left by WTL binary.
10006 for i in $(seq $nfiles); do
10007 local file=$DIR/$tdir/${tfile}-$i
10009 if [ $? -ne 0 ] ; then
10010 echo "Warning: Failed to delete file $file"
10014 restore_lustre_params <$save_params
10015 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
10017 # Error out if no new thread has started or Thread started is greater
10019 if [[ $thread_started -le $OSTIO_pre ||
10020 $thread_started -gt $thread_max ]]; then
10021 error "ll_ost_io: thread_started $thread_started" \
10022 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
10023 "No new thread started or thread started greater " \
10027 run_test 115 "verify dynamic thread creation===================="
10030 wait_delete_completed
10031 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
10032 echo "OST kbytes available: ${AVAIL[@]}"
10037 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
10038 #echo OST $i: ${AVAIL[i]}kb
10039 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
10043 if [[ ${AVAIL[i]} -lt $MINV ]]; then
10048 echo "Min free space: OST $MINI: $MINV"
10049 echo "Max free space: OST $MAXI: $MAXV"
10052 test_116a() { # was previously test_116()
10053 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10054 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10055 remote_mds_nodsh && skip "remote MDS with nodsh"
10057 echo -n "Free space priority "
10058 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
10063 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
10064 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
10065 trap simple_cleanup_common EXIT
10067 # Check if we need to generate uneven OSTs
10068 test_mkdir -p $DIR/$tdir/OST${MINI}
10069 local FILL=$((MINV / 4))
10070 local DIFF=$((MAXV - MINV))
10071 local DIFF2=$((DIFF * 100 / MINV))
10073 local threshold=$(do_facet $SINGLEMDS \
10074 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
10075 threshold=${threshold%%%}
10076 echo -n "Check for uneven OSTs: "
10077 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
10079 if [[ $DIFF2 -gt $threshold ]]; then
10081 echo "Don't need to fill OST$MINI"
10083 # generate uneven OSTs. Write 2% over the QOS threshold value
10085 DIFF=$((threshold - DIFF2 + 2))
10086 DIFF2=$((MINV * DIFF / 100))
10087 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
10088 $LFS setstripe -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
10089 error "setstripe failed"
10090 DIFF=$((DIFF2 / 2048))
10092 while [ $i -lt $DIFF ]; do
10094 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
10095 bs=2M count=1 2>/dev/null
10104 DIFF=$((MAXV - MINV))
10105 DIFF2=$((DIFF * 100 / MINV))
10106 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
10107 if [ $DIFF2 -gt $threshold ]; then
10110 echo "failed - QOS mode won't be used"
10111 simple_cleanup_common
10112 skip "QOS imbalance criteria not met"
10120 # now fill using QOS
10121 $LFS setstripe -c 1 $DIR/$tdir
10122 FILL=$((FILL / 200))
10123 if [ $FILL -gt 600 ]; then
10126 echo "writing $FILL files to QOS-assigned OSTs"
10128 while [ $i -lt $FILL ]; do
10130 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
10131 count=1 2>/dev/null
10134 echo "wrote $i 200k files"
10138 echo "Note: free space may not be updated, so measurements might be off"
10140 DIFF2=$((MAXV - MINV))
10141 echo "free space delta: orig $DIFF final $DIFF2"
10142 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
10143 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
10144 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
10145 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
10146 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
10147 if [[ $DIFF -gt 0 ]]; then
10148 FILL=$((DIFF2 * 100 / DIFF - 100))
10149 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
10152 # Figure out which files were written where
10153 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
10154 awk '/'$MINI1': / {print $2; exit}')
10156 MINC=$($LFS getstripe --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
10157 echo "$MINC files created on smaller OST $MINI1"
10158 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
10159 awk '/'$MAXI1': / {print $2; exit}')
10161 MAXC=$($LFS getstripe --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
10162 echo "$MAXC files created on larger OST $MAXI1"
10163 if [[ $MINC -gt 0 ]]; then
10164 FILL=$((MAXC * 100 / MINC - 100))
10165 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
10167 [[ $MAXC -gt $MINC ]] ||
10168 error_ignore LU-9 "stripe QOS didn't balance free space"
10169 simple_cleanup_common
10171 run_test 116a "stripe QOS: free space balance ==================="
10173 test_116b() { # LU-2093
10174 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10175 remote_mds_nodsh && skip "remote MDS with nodsh"
10177 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
10178 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
10179 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
10180 [ -z "$old_rr" ] && skip "no QOS"
10181 do_facet $SINGLEMDS lctl set_param \
10182 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
10183 mkdir -p $DIR/$tdir
10184 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
10185 createmany -o $DIR/$tdir/f- 20 || error "can't create"
10186 do_facet $SINGLEMDS lctl set_param fail_loc=0
10188 do_facet $SINGLEMDS lctl set_param \
10189 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
10191 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
10193 test_117() # bug 10891
10195 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10197 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
10198 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
10199 lctl set_param fail_loc=0x21e
10200 > $DIR/$tfile || error "truncate failed"
10201 lctl set_param fail_loc=0
10202 echo "Truncate succeeded."
10205 run_test 117 "verify osd extend =========="
10207 NO_SLOW_RESENDCOUNT=4
10208 export OLD_RESENDCOUNT=""
10209 set_resend_count () {
10210 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
10211 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
10212 lctl set_param -n $PROC_RESENDCOUNT $1
10213 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
10216 # for reduce test_118* time (b=14842)
10217 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
10219 # Reset async IO behavior after error case
10221 FILE=$DIR/reset_async
10223 # Ensure all OSCs are cleared
10224 $LFS setstripe -c -1 $FILE
10225 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
10230 test_118a() #bug 11710
10232 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10236 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10237 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10238 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10240 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10241 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10246 run_test 118a "verify O_SYNC works =========="
10250 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10251 remote_ost_nodsh && skip "remote OST with nodsh"
10255 #define OBD_FAIL_SRV_ENOENT 0x217
10256 set_nodes_failloc "$(osts_nodes)" 0x217
10257 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10259 set_nodes_failloc "$(osts_nodes)" 0
10260 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10261 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10264 if [[ $RC -eq 0 ]]; then
10265 error "Must return error due to dropped pages, rc=$RC"
10269 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10270 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10274 echo "Dirty pages not leaked on ENOENT"
10276 # Due to the above error the OSC will issue all RPCs syncronously
10277 # until a subsequent RPC completes successfully without error.
10278 $MULTIOP $DIR/$tfile Ow4096yc
10283 run_test 118b "Reclaim dirty pages on fatal error =========="
10287 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10289 # for 118c, restore the original resend count, LU-1940
10290 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
10291 set_resend_count $OLD_RESENDCOUNT
10292 remote_ost_nodsh && skip "remote OST with nodsh"
10296 #define OBD_FAIL_OST_EROFS 0x216
10297 set_nodes_failloc "$(osts_nodes)" 0x216
10299 # multiop should block due to fsync until pages are written
10300 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
10304 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
10305 error "Multiop failed to block on fsync, pid=$MULTIPID"
10308 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10310 if [[ $WRITEBACK -eq 0 ]]; then
10311 error "No page in writeback, writeback=$WRITEBACK"
10314 set_nodes_failloc "$(osts_nodes)" 0
10317 if [[ $RC -ne 0 ]]; then
10318 error "Multiop fsync failed, rc=$RC"
10321 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10322 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10324 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10325 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10329 echo "Dirty pages flushed via fsync on EROFS"
10332 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
10334 # continue to use small resend count to reduce test_118* time (b=14842)
10335 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
10339 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10340 remote_ost_nodsh && skip "remote OST with nodsh"
10344 #define OBD_FAIL_OST_BRW_PAUSE_BULK
10345 set_nodes_failloc "$(osts_nodes)" 0x214
10346 # multiop should block due to fsync until pages are written
10347 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
10351 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
10352 error "Multiop failed to block on fsync, pid=$MULTIPID"
10355 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10357 if [[ $WRITEBACK -eq 0 ]]; then
10358 error "No page in writeback, writeback=$WRITEBACK"
10361 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
10362 set_nodes_failloc "$(osts_nodes)" 0
10364 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10365 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10367 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10368 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10372 echo "Dirty pages gaurenteed flushed via fsync"
10375 run_test 118d "Fsync validation inject a delay of the bulk =========="
10378 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10382 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
10383 lctl set_param fail_loc=0x8000040a
10385 # Should simulate EINVAL error which is fatal
10386 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10388 if [[ $RC -eq 0 ]]; then
10389 error "Must return error due to dropped pages, rc=$RC"
10392 lctl set_param fail_loc=0x0
10394 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10395 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10396 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10398 if [[ $LOCKED -ne 0 ]]; then
10399 error "Locked pages remain in cache, locked=$LOCKED"
10402 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10403 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10407 echo "No pages locked after fsync"
10412 run_test 118f "Simulate unrecoverable OSC side error =========="
10415 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10419 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
10420 lctl set_param fail_loc=0x406
10422 # simulate local -ENOMEM
10423 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10426 lctl set_param fail_loc=0
10427 if [[ $RC -eq 0 ]]; then
10428 error "Must return error due to dropped pages, rc=$RC"
10431 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10432 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10433 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10435 if [[ $LOCKED -ne 0 ]]; then
10436 error "Locked pages remain in cache, locked=$LOCKED"
10439 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10440 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10444 echo "No pages locked after fsync"
10449 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
10452 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10453 remote_ost_nodsh && skip "remote OST with nodsh"
10457 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10458 set_nodes_failloc "$(osts_nodes)" 0x20e
10459 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
10460 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10463 set_nodes_failloc "$(osts_nodes)" 0
10464 if [[ $RC -eq 0 ]]; then
10465 error "Must return error due to dropped pages, rc=$RC"
10468 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10469 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10470 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10472 if [[ $LOCKED -ne 0 ]]; then
10473 error "Locked pages remain in cache, locked=$LOCKED"
10476 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10477 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10481 echo "No pages locked after fsync"
10485 run_test 118h "Verify timeout in handling recoverables errors =========="
10487 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10490 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10491 remote_ost_nodsh && skip "remote OST with nodsh"
10495 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10496 set_nodes_failloc "$(osts_nodes)" 0x20e
10498 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
10499 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
10502 set_nodes_failloc "$(osts_nodes)" 0
10506 if [[ $RC -ne 0 ]]; then
10507 error "got error, but should be not, rc=$RC"
10510 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10511 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10512 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10513 if [[ $LOCKED -ne 0 ]]; then
10514 error "Locked pages remain in cache, locked=$LOCKED"
10517 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10518 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10522 echo "No pages locked after fsync"
10526 run_test 118i "Fix error before timeout in recoverable error =========="
10528 [ "$SLOW" = "no" ] && set_resend_count 4
10531 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10532 remote_ost_nodsh && skip "remote OST with nodsh"
10536 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
10537 set_nodes_failloc "$(osts_nodes)" 0x220
10539 # return -EIO from OST
10540 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10542 set_nodes_failloc "$(osts_nodes)" 0x0
10543 if [[ $RC -eq 0 ]]; then
10544 error "Must return error due to dropped pages, rc=$RC"
10547 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10548 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10549 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10550 if [[ $LOCKED -ne 0 ]]; then
10551 error "Locked pages remain in cache, locked=$LOCKED"
10554 # in recoverable error on OST we want resend and stay until it finished
10555 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10556 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10560 echo "No pages locked after fsync"
10564 run_test 118j "Simulate unrecoverable OST side error =========="
10568 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10569 remote_ost_nodsh && skip "remote OSTs with nodsh"
10571 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10572 set_nodes_failloc "$(osts_nodes)" 0x20e
10573 test_mkdir $DIR/$tdir
10575 for ((i=0;i<10;i++)); do
10576 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
10577 error "dd to $DIR/$tdir/$tfile-$i failed" )&
10584 set_nodes_failloc "$(osts_nodes)" 0
10587 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
10589 test_118l() # LU-646
10591 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10593 test_mkdir $DIR/$tdir
10594 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
10597 run_test 118l "fsync dir"
10599 test_118m() # LU-3066
10601 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10603 test_mkdir $DIR/$tdir
10604 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
10607 run_test 118m "fdatasync dir ========="
10609 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10616 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10617 remote_ost_nodsh && skip "remote OSTs with nodsh"
10619 # Sleep to avoid a cached response.
10620 #define OBD_STATFS_CACHE_SECONDS 1
10623 # Inject a 10 second delay in the OST_STATFS handler.
10624 #define OBD_FAIL_OST_STATFS_DELAY 0x242
10625 set_nodes_failloc "$(osts_nodes)" 0x242
10628 stat --file-system $MOUNT > /dev/null
10631 set_nodes_failloc "$(osts_nodes)" 0
10633 if ((end - begin > 20)); then
10634 error "statfs took $((end - begin)) seconds, expected 10"
10637 run_test 118n "statfs() sends OST_STATFS requests in parallel"
10639 test_119a() # bug 11737
10641 BSIZE=$((512 * 1024))
10642 directio write $DIR/$tfile 0 1 $BSIZE
10643 # We ask to read two blocks, which is more than a file size.
10644 # directio will indicate an error when requested and actual
10645 # sizes aren't equeal (a normal situation in this case) and
10646 # print actual read amount.
10647 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
10648 if [ "$NOB" != "$BSIZE" ]; then
10649 error "read $NOB bytes instead of $BSIZE"
10653 run_test 119a "Short directIO read must return actual read amount"
10655 test_119b() # bug 11737
10657 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10659 $LFS setstripe -c 2 $DIR/$tfile || error "setstripe failed"
10660 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
10662 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
10663 error "direct read failed"
10666 run_test 119b "Sparse directIO read must return actual read amount"
10668 test_119c() # bug 13099
10671 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
10672 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
10675 run_test 119c "Testing for direct read hitting hole"
10677 test_119d() # bug 15950
10679 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10681 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
10682 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
10684 $LFS setstripe $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
10685 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
10686 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
10687 lctl set_param fail_loc=0x40d
10688 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
10691 cat $DIR/$tfile > /dev/null &
10692 lctl set_param fail_loc=0
10695 log "the DIO writes have completed, now wait for the reads (should not block very long)"
10697 [ -n "`ps h -p $pid_reads -o comm`" ] && \
10698 error "the read rpcs have not completed in 2s"
10700 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
10702 run_test 119d "The DIO path should try to send a new rpc once one is completed"
10705 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10706 remote_mds_nodsh && skip "remote MDS with nodsh"
10707 test_mkdir -i0 -c1 $DIR/$tdir
10708 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10709 skip_env "no early lock cancel on server"
10711 lru_resize_disable mdc
10712 lru_resize_disable osc
10713 cancel_lru_locks mdc
10714 # asynchronous object destroy at MDT could cause bl ast to client
10715 cancel_lru_locks osc
10717 stat $DIR/$tdir > /dev/null
10718 can1=$(do_facet mds1 \
10719 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10720 awk '/ldlm_cancel/ {print $2}')
10721 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10722 awk '/ldlm_bl_callback/ {print $2}')
10723 test_mkdir -i0 -c1 $DIR/$tdir/d1
10724 can2=$(do_facet mds1 \
10725 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10726 awk '/ldlm_cancel/ {print $2}')
10727 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10728 awk '/ldlm_bl_callback/ {print $2}')
10729 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10730 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10731 lru_resize_enable mdc
10732 lru_resize_enable osc
10734 run_test 120a "Early Lock Cancel: mkdir test"
10737 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10738 remote_mds_nodsh && skip "remote MDS with nodsh"
10739 test_mkdir $DIR/$tdir
10740 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10741 skip_env "no early lock cancel on server"
10743 lru_resize_disable mdc
10744 lru_resize_disable osc
10745 cancel_lru_locks mdc
10746 stat $DIR/$tdir > /dev/null
10747 can1=$(do_facet $SINGLEMDS \
10748 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10749 awk '/ldlm_cancel/ {print $2}')
10750 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10751 awk '/ldlm_bl_callback/ {print $2}')
10752 touch $DIR/$tdir/f1
10753 can2=$(do_facet $SINGLEMDS \
10754 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10755 awk '/ldlm_cancel/ {print $2}')
10756 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10757 awk '/ldlm_bl_callback/ {print $2}')
10758 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10759 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10760 lru_resize_enable mdc
10761 lru_resize_enable osc
10763 run_test 120b "Early Lock Cancel: create test"
10766 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10767 remote_mds_nodsh && skip "remote MDS with nodsh"
10768 test_mkdir -i0 -c1 $DIR/$tdir
10769 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10770 skip "no early lock cancel on server"
10772 lru_resize_disable mdc
10773 lru_resize_disable osc
10774 test_mkdir -i0 -c1 $DIR/$tdir/d1
10775 test_mkdir -i0 -c1 $DIR/$tdir/d2
10776 touch $DIR/$tdir/d1/f1
10777 cancel_lru_locks mdc
10778 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
10779 can1=$(do_facet mds1 \
10780 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10781 awk '/ldlm_cancel/ {print $2}')
10782 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10783 awk '/ldlm_bl_callback/ {print $2}')
10784 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10785 can2=$(do_facet mds1 \
10786 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10787 awk '/ldlm_cancel/ {print $2}')
10788 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10789 awk '/ldlm_bl_callback/ {print $2}')
10790 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10791 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10792 lru_resize_enable mdc
10793 lru_resize_enable osc
10795 run_test 120c "Early Lock Cancel: link test"
10798 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10799 remote_mds_nodsh && skip "remote MDS with nodsh"
10800 test_mkdir -i0 -c1 $DIR/$tdir
10801 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10802 skip_env "no early lock cancel on server"
10804 lru_resize_disable mdc
10805 lru_resize_disable osc
10807 cancel_lru_locks mdc
10808 stat $DIR/$tdir > /dev/null
10809 can1=$(do_facet mds1 \
10810 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10811 awk '/ldlm_cancel/ {print $2}')
10812 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10813 awk '/ldlm_bl_callback/ {print $2}')
10814 chmod a+x $DIR/$tdir
10815 can2=$(do_facet mds1 \
10816 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10817 awk '/ldlm_cancel/ {print $2}')
10818 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10819 awk '/ldlm_bl_callback/ {print $2}')
10820 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10821 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10822 lru_resize_enable mdc
10823 lru_resize_enable osc
10825 run_test 120d "Early Lock Cancel: setattr test"
10828 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10829 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10830 skip_env "no early lock cancel on server"
10831 remote_mds_nodsh && skip "remote MDS with nodsh"
10833 local dlmtrace_set=false
10835 test_mkdir -i0 -c1 $DIR/$tdir
10836 lru_resize_disable mdc
10837 lru_resize_disable osc
10838 ! $LCTL get_param debug | grep -q dlmtrace &&
10839 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
10840 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
10841 cancel_lru_locks mdc
10842 cancel_lru_locks osc
10843 dd if=$DIR/$tdir/f1 of=/dev/null
10844 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
10845 # XXX client can not do early lock cancel of OST lock
10846 # during unlink (LU-4206), so cancel osc lock now.
10848 cancel_lru_locks osc
10849 can1=$(do_facet mds1 \
10850 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10851 awk '/ldlm_cancel/ {print $2}')
10852 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10853 awk '/ldlm_bl_callback/ {print $2}')
10854 unlink $DIR/$tdir/f1
10856 can2=$(do_facet mds1 \
10857 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10858 awk '/ldlm_cancel/ {print $2}')
10859 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10860 awk '/ldlm_bl_callback/ {print $2}')
10861 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10862 $LCTL dk $TMP/cancel.debug.txt
10863 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10864 $LCTL dk $TMP/blocking.debug.txt
10865 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10866 lru_resize_enable mdc
10867 lru_resize_enable osc
10869 run_test 120e "Early Lock Cancel: unlink test"
10872 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10873 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10874 skip_env "no early lock cancel on server"
10875 remote_mds_nodsh && skip "remote MDS with nodsh"
10877 test_mkdir -i0 -c1 $DIR/$tdir
10878 lru_resize_disable mdc
10879 lru_resize_disable osc
10880 test_mkdir -i0 -c1 $DIR/$tdir/d1
10881 test_mkdir -i0 -c1 $DIR/$tdir/d2
10882 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10883 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10884 cancel_lru_locks mdc
10885 cancel_lru_locks osc
10886 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10887 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10888 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10889 # XXX client can not do early lock cancel of OST lock
10890 # during rename (LU-4206), so cancel osc lock now.
10892 cancel_lru_locks osc
10893 can1=$(do_facet mds1 \
10894 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10895 awk '/ldlm_cancel/ {print $2}')
10896 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10897 awk '/ldlm_bl_callback/ {print $2}')
10898 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10900 can2=$(do_facet mds1 \
10901 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10902 awk '/ldlm_cancel/ {print $2}')
10903 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10904 awk '/ldlm_bl_callback/ {print $2}')
10905 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10906 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10907 lru_resize_enable mdc
10908 lru_resize_enable osc
10910 run_test 120f "Early Lock Cancel: rename test"
10913 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10914 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10915 skip_env "no early lock cancel on server"
10916 remote_mds_nodsh && skip "remote MDS with nodsh"
10918 lru_resize_disable mdc
10919 lru_resize_disable osc
10921 echo create $count files
10922 test_mkdir $DIR/$tdir
10923 cancel_lru_locks mdc
10924 cancel_lru_locks osc
10927 can0=$(do_facet $SINGLEMDS \
10928 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10929 awk '/ldlm_cancel/ {print $2}')
10930 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10931 awk '/ldlm_bl_callback/ {print $2}')
10932 createmany -o $DIR/$tdir/f $count
10934 can1=$(do_facet $SINGLEMDS \
10935 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10936 awk '/ldlm_cancel/ {print $2}')
10937 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10938 awk '/ldlm_bl_callback/ {print $2}')
10940 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10941 echo rm $count files
10944 can2=$(do_facet $SINGLEMDS \
10945 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10946 awk '/ldlm_cancel/ {print $2}')
10947 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10948 awk '/ldlm_bl_callback/ {print $2}')
10950 echo total: $count removes in $((t2-t1))
10951 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10953 # wait for commitment of removal
10954 lru_resize_enable mdc
10955 lru_resize_enable osc
10957 run_test 120g "Early Lock Cancel: performance test"
10959 test_121() { #bug #10589
10960 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10963 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10964 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10965 lctl set_param fail_loc=0x310
10966 cancel_lru_locks osc > /dev/null
10967 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10968 lctl set_param fail_loc=0
10969 [[ $reads -eq $writes ]] ||
10970 error "read $reads blocks, must be $writes blocks"
10972 run_test 121 "read cancel race ========="
10974 test_123a() { # was test 123, statahead(bug 11401)
10975 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10978 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10979 log "testing UP system. Performance may be lower than expected."
10984 test_mkdir $DIR/$tdir
10985 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10986 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10988 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10989 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10991 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10992 lctl set_param -n llite.*.statahead_max 0
10993 lctl get_param llite.*.statahead_max
10994 cancel_lru_locks mdc
10995 cancel_lru_locks osc
10997 time ls -l $DIR/$tdir | wc -l
10999 delta=$((etime - stime))
11000 log "ls $i files without statahead: $delta sec"
11001 lctl set_param llite.*.statahead_max=$max
11003 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
11004 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
11005 cancel_lru_locks mdc
11006 cancel_lru_locks osc
11008 time ls -l $DIR/$tdir | wc -l
11010 delta_sa=$((etime - stime))
11011 log "ls $i files with statahead: $delta_sa sec"
11012 lctl get_param -n llite.*.statahead_stats
11013 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
11015 [[ $swrong -lt $ewrong ]] &&
11016 log "statahead was stopped, maybe too many locks held!"
11017 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
11019 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
11020 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
11021 lctl set_param -n llite.*.statahead_max 0
11022 lctl get_param llite.*.statahead_max
11023 cancel_lru_locks mdc
11024 cancel_lru_locks osc
11026 time ls -l $DIR/$tdir | wc -l
11028 delta=$((etime - stime))
11029 log "ls $i files again without statahead: $delta sec"
11030 lctl set_param llite.*.statahead_max=$max
11031 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
11032 if [ $SLOWOK -eq 0 ]; then
11033 error "ls $i files is slower with statahead!"
11035 log "ls $i files is slower with statahead!"
11041 [ $delta -gt 20 ] && break
11042 [ $delta -gt 8 ] && MULT=$((50 / delta))
11043 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
11051 delta=$((etime - stime))
11052 log "rm -r $DIR/$tdir/: $delta seconds"
11054 lctl get_param -n llite.*.statahead_stats
11056 run_test 123a "verify statahead work"
11058 test_123b () { # statahead(bug 15027)
11059 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11061 test_mkdir $DIR/$tdir
11062 createmany -o $DIR/$tdir/$tfile-%d 1000
11064 cancel_lru_locks mdc
11065 cancel_lru_locks osc
11067 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
11068 lctl set_param fail_loc=0x80000803
11069 ls -lR $DIR/$tdir > /dev/null
11071 lctl set_param fail_loc=0x0
11072 lctl get_param -n llite.*.statahead_stats
11077 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
11080 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11081 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
11082 skip_env "no lru resize on server"
11086 test_mkdir $DIR/$tdir
11088 log "create $NR files at $DIR/$tdir"
11089 createmany -o $DIR/$tdir/f $NR ||
11090 error "failed to create $NR files in $DIR/$tdir"
11092 cancel_lru_locks mdc
11093 ls -l $DIR/$tdir > /dev/null
11097 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
11098 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
11099 LRU_SIZE=$($LCTL get_param -n $PARAM)
11100 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
11101 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
11103 log "NS=$(basename $NSDIR)"
11108 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
11109 skip "Not enough cached locks created!"
11111 log "LRU=$LRU_SIZE"
11115 # We know that lru resize allows one client to hold $LIMIT locks
11116 # for 10h. After that locks begin to be killed by client.
11118 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
11120 if [ $LIMIT -lt $LRU_SIZE ]; then
11121 skip "Limit is too small $LIMIT"
11124 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
11125 # killing locks. Some time was spent for creating locks. This means
11126 # that up to the moment of sleep finish we must have killed some of
11127 # them (10-100 locks). This depends on how fast ther were created.
11128 # Many of them were touched in almost the same moment and thus will
11129 # be killed in groups.
11130 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
11132 # Use $LRU_SIZE_B here to take into account real number of locks
11133 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
11134 local LRU_SIZE_B=$LRU_SIZE
11136 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
11137 log "OLD_LVF=$OLD_LVF"
11138 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
11140 # Let's make sure that we really have some margin. Client checks
11141 # cached locks every 10 sec.
11142 SLEEP=$((SLEEP+20))
11143 log "Sleep ${SLEEP} sec"
11145 while ((SEC<$SLEEP)); do
11149 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
11150 echo -n "$LRU_SIZE"
11153 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
11154 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
11156 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
11157 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
11158 unlinkmany $DIR/$tdir/f $NR
11162 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
11163 log "unlink $NR files at $DIR/$tdir"
11164 unlinkmany $DIR/$tdir/f $NR
11166 run_test 124a "lru resize ======================================="
11168 get_max_pool_limit()
11170 local limit=$($LCTL get_param \
11171 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
11173 for l in $limit; do
11174 if [[ $l -gt $max ]]; then
11182 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11183 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
11184 skip_env "no lru resize on server"
11186 LIMIT=$(get_max_pool_limit)
11188 NR=$(($(default_lru_size)*20))
11189 if [[ $NR -gt $LIMIT ]]; then
11190 log "Limit lock number by $LIMIT locks"
11194 IFree=$(mdsrate_inodes_available)
11195 if [ $IFree -lt $NR ]; then
11196 log "Limit lock number by $IFree inodes"
11200 lru_resize_disable mdc
11201 test_mkdir -p $DIR/$tdir/disable_lru_resize
11203 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
11204 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
11205 cancel_lru_locks mdc
11208 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
11211 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
11214 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
11218 nolruresize_delta=$((etime-stime))
11219 log "ls -la time: $nolruresize_delta seconds"
11220 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
11221 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
11223 lru_resize_enable mdc
11224 test_mkdir -p $DIR/$tdir/enable_lru_resize
11226 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
11227 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
11228 cancel_lru_locks mdc
11231 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
11234 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
11237 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
11241 lruresize_delta=$((etime-stime))
11242 log "ls -la time: $lruresize_delta seconds"
11243 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
11245 if [ $lruresize_delta -gt $nolruresize_delta ]; then
11246 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
11247 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
11248 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
11250 log "lru resize performs the same with no lru resize"
11252 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
11254 run_test 124b "lru resize (performance test) ======================="
11257 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11258 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
11259 skip_env "no lru resize on server"
11261 # cache ununsed locks on client
11263 cancel_lru_locks mdc
11264 test_mkdir $DIR/$tdir
11265 createmany -o $DIR/$tdir/f $nr ||
11266 error "failed to create $nr files in $DIR/$tdir"
11267 ls -l $DIR/$tdir > /dev/null
11269 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
11270 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11271 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
11272 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
11273 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
11275 # set lru_max_age to 1 sec
11276 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
11277 echo "sleep $((recalc_p * 2)) seconds..."
11278 sleep $((recalc_p * 2))
11280 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
11281 # restore lru_max_age
11282 $LCTL set_param -n $nsdir.lru_max_age $max_age
11283 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
11284 unlinkmany $DIR/$tdir/f $nr
11286 run_test 124c "LRUR cancel very aged locks"
11289 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11290 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
11291 skip_env "no lru resize on server"
11293 # cache ununsed locks on client
11296 lru_resize_disable mdc
11297 stack_trap "lru_resize_enable mdc" EXIT
11299 cancel_lru_locks mdc
11301 # asynchronous object destroy at MDT could cause bl ast to client
11302 test_mkdir $DIR/$tdir
11303 createmany -o $DIR/$tdir/f $nr ||
11304 error "failed to create $nr files in $DIR/$tdir"
11305 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
11307 ls -l $DIR/$tdir > /dev/null
11309 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
11310 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
11311 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
11312 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
11314 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
11316 # set lru_max_age to 1 sec
11317 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
11318 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
11320 echo "sleep $((recalc_p * 2)) seconds..."
11321 sleep $((recalc_p * 2))
11323 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
11325 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
11327 run_test 124d "cancel very aged locks if lru-resize diasbaled"
11329 test_125() { # 13358
11330 $LCTL get_param -n llite.*.client_type | grep -q local ||
11331 skip "must run as local client"
11332 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
11333 skip_env "must have acl enabled"
11334 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
11336 test_mkdir $DIR/$tdir
11337 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
11338 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
11339 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
11341 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
11343 test_126() { # bug 12829/13455
11344 $GSS && skip_env "must run as gss disabled"
11345 $LCTL get_param -n llite.*.client_type | grep -q local ||
11346 skip "must run as local client"
11347 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
11349 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
11350 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
11352 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
11354 run_test 126 "check that the fsgid provided by the client is taken into account"
11356 test_127a() { # bug 15521
11357 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11359 $LFS setstripe -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
11360 $LCTL set_param osc.*.stats=0
11361 FSIZE=$((2048 * 1024))
11362 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
11363 cancel_lru_locks osc
11364 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
11366 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
11367 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
11368 echo "got $COUNT $NAME"
11369 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
11370 eval $NAME=$COUNT || error "Wrong proc format"
11373 read_bytes|write_bytes)
11374 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
11375 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
11376 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
11377 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
11378 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
11379 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
11380 error "sumsquare is too small: $SUMSQ"
11381 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
11382 error "sumsquare is too big: $SUMSQ"
11386 done < $DIR/${tfile}.tmp
11388 #check that we actually got some stats
11389 [ "$read_bytes" ] || error "Missing read_bytes stats"
11390 [ "$write_bytes" ] || error "Missing write_bytes stats"
11391 [ "$read_bytes" != 0 ] || error "no read done"
11392 [ "$write_bytes" != 0 ] || error "no write done"
11394 run_test 127a "verify the client stats are sane"
11396 test_127b() { # bug LU-333
11397 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11398 local name count samp unit min max sum sumsq
11400 $LCTL set_param llite.*.stats=0
11402 # perform 2 reads and writes so MAX is different from SUM.
11403 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
11404 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
11405 cancel_lru_locks osc
11406 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
11407 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
11409 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
11410 while read name count samp unit min max sum sumsq; do
11411 echo "got $count $name"
11412 eval $name=$count || error "Wrong proc format"
11416 [ $count -ne 2 ] && error "count is not 2: $count"
11417 [ $min -ne $PAGE_SIZE ] &&
11418 error "min is not $PAGE_SIZE: $min"
11419 [ $max -ne $PAGE_SIZE ] &&
11420 error "max is incorrect: $max"
11421 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
11422 error "sum is wrong: $sum"
11425 [ $count -ne 2 ] && error "count is not 2: $count"
11426 [ $min -ne $PAGE_SIZE ] &&
11427 error "min is not $PAGE_SIZE: $min"
11428 [ $max -ne $PAGE_SIZE ] &&
11429 error "max is incorrect: $max"
11430 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
11431 error "sum is wrong: $sum"
11435 done < $TMP/$tfile.tmp
11437 #check that we actually got some stats
11438 [ "$read_bytes" ] || error "Missing read_bytes stats"
11439 [ "$write_bytes" ] || error "Missing write_bytes stats"
11440 [ "$read_bytes" != 0 ] || error "no read done"
11441 [ "$write_bytes" != 0 ] || error "no write done"
11443 rm -f $TMP/${tfile}.tmp
11445 run_test 127b "verify the llite client stats are sane"
11447 test_127c() { # LU-12394
11448 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11455 $LCTL set_param llite.*.extents_stats=1
11456 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
11458 # Use two stripes so there is enough space in default config
11459 $LFS setstripe -c 2 $DIR/$tfile
11461 # Extent stats start at 0-4K and go in power of two buckets
11462 # LL_HIST_START = 12 --> 2^12 = 4K
11463 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
11464 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
11466 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
11468 # Write and read, 2x each, second time at a non-zero offset
11469 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
11470 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
11471 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
11472 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
11476 $LCTL get_param llite.*.extents_stats
11479 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
11481 local bucket=$($LCTL get_param -n llite.*.extents_stats |
11483 reads=$(echo $bucket | awk '{print $5}')
11484 writes=$(echo $bucket | awk '{print $9}')
11485 [ "$reads" -eq $count ] ||
11486 error "$reads reads in < $bsize bucket, expect $count"
11487 [ "$writes" -eq $count ] ||
11488 error "$writes writes in < $bsize bucket, expect $count"
11491 # Test mmap write and read
11492 $LCTL set_param llite.*.extents_stats=c
11494 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
11495 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
11496 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
11498 $LCTL get_param llite.*.extents_stats
11500 count=$(((size*1024) / PAGE_SIZE))
11502 bsize=$((2 * PAGE_SIZE / 1024))K
11504 bucket=$($LCTL get_param -n llite.*.extents_stats |
11506 reads=$(echo $bucket | awk '{print $5}')
11507 writes=$(echo $bucket | awk '{print $9}')
11508 # mmap writes fault in the page first, creating an additonal read
11509 [ "$reads" -eq $((2 * count)) ] ||
11510 error "$reads reads in < $bsize bucket, expect $count"
11511 [ "$writes" -eq $count ] ||
11512 error "$writes writes in < $bsize bucket, expect $count"
11514 run_test 127c "test llite extent stats with regular & mmap i/o"
11516 test_128() { # bug 15212
11518 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
11523 result=$(grep error $TMP/$tfile.log)
11524 rm -f $DIR/$tfile $TMP/$tfile.log
11525 [ -z "$result" ] ||
11526 error "consecutive find's under interactive lfs failed"
11528 run_test 128 "interactive lfs for 2 consecutive find's"
11530 set_dir_limits () {
11535 local ldproc=/proc/fs/ldiskfs
11536 local facets=$(get_facets MDS)
11538 for facet in ${facets//,/ }; do
11539 canondev=$(ldiskfs_canon \
11540 *.$(convert_facet2label $facet).mntdev $facet)
11541 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
11542 ldproc=/sys/fs/ldiskfs
11543 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
11544 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
11548 check_mds_dmesg() {
11549 local facets=$(get_facets MDS)
11550 for facet in ${facets//,/ }; do
11551 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
11557 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11558 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
11559 skip "Need MDS version with at least 2.5.56"
11560 if [ "$mds1_FSTYPE" != ldiskfs ]; then
11561 skip_env "ldiskfs only test"
11563 remote_mds_nodsh && skip "remote MDS with nodsh"
11567 local has_warning=false
11570 mkdir -p $DIR/$tdir
11572 # block size of mds1
11573 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
11574 set_dir_limits $maxsize $maxsize
11575 local dirsize=$(stat -c%s "$DIR/$tdir")
11577 while [[ $dirsize -le $maxsize ]]; do
11578 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
11580 if ! $has_warning; then
11581 check_mds_dmesg '"is approaching"' && has_warning=true
11583 # check two errors:
11584 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
11585 # EFBIG for previous versions included in ldiskfs series
11586 if [ $rc -eq $EFBIG ] || [ $rc -eq $ENOSPC ]; then
11588 echo "return code $rc received as expected"
11590 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
11591 error_exit "create failed w/o dir size limit"
11593 check_mds_dmesg '"has reached"' ||
11594 error_exit "reached message should be output"
11596 [ $has_warning = "false" ] &&
11597 error_exit "warning message should be output"
11599 dirsize=$(stat -c%s "$DIR/$tdir")
11601 [[ $dirsize -ge $maxsize ]] && return 0
11602 error_exit "current dir size $dirsize, " \
11603 "previous limit $maxsize"
11604 elif [ $rc -ne 0 ]; then
11606 error_exit "return $rc received instead of expected " \
11607 "$EFBIG or $ENOSPC, files in dir $dirsize"
11609 nfiles=$((nfiles + 1))
11610 dirsize=$(stat -c%s "$DIR/$tdir")
11614 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
11616 run_test 129 "test directory size limit ========================"
11625 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11626 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11628 trap cleanup_130 EXIT RETURN
11630 local fm_file=$DIR/$tfile
11631 $LFS setstripe -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
11632 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
11633 error "dd failed for $fm_file"
11635 # LU-1795: test filefrag/FIEMAP once, even if unsupported
11636 filefrag -ves $fm_file
11638 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11639 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11640 [ $RC != 0 ] && error "filefrag $fm_file failed"
11642 filefrag_op=$(filefrag -ve -k $fm_file |
11643 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11644 lun=$($LFS getstripe -i $fm_file)
11646 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
11649 for line in $filefrag_op
11651 frag_lun=`echo $line | cut -d: -f5`
11652 ext_len=`echo $line | cut -d: -f4`
11653 if (( $frag_lun != $lun )); then
11655 error "FIEMAP on 1-stripe file($fm_file) failed"
11658 (( tot_len += ext_len ))
11661 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
11663 error "FIEMAP on 1-stripe file($fm_file) failed;"
11669 echo "FIEMAP on single striped file succeeded"
11671 run_test 130a "FIEMAP (1-stripe file)"
11674 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11676 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11677 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11679 trap cleanup_130 EXIT RETURN
11681 local fm_file=$DIR/$tfile
11682 $LFS setstripe -S 65536 -c $OSTCOUNT $fm_file ||
11683 error "setstripe on $fm_file"
11684 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11685 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11687 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
11688 error "dd failed on $fm_file"
11690 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11691 filefrag_op=$(filefrag -ve -k $fm_file |
11692 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11694 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11695 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11700 for line in $filefrag_op
11702 frag_lun=$(echo $line | cut -d: -f5 |
11703 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11704 ext_len=$(echo $line | cut -d: -f4)
11705 if (( $frag_lun != $last_lun )); then
11706 if (( tot_len != 1024 )); then
11708 error "FIEMAP on $fm_file failed; returned " \
11709 "len $tot_len for OST $last_lun instead of 1024"
11712 (( num_luns += 1 ))
11716 (( tot_len += ext_len ))
11719 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
11721 error "FIEMAP on $fm_file failed; returned wrong number of " \
11722 "luns or wrong len for OST $last_lun"
11728 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
11730 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
11733 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11735 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11736 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11738 trap cleanup_130 EXIT RETURN
11740 local fm_file=$DIR/$tfile
11741 $LFS setstripe -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
11742 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11743 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11745 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
11746 error "dd failed on $fm_file"
11748 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11749 filefrag_op=$(filefrag -ve -k $fm_file |
11750 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11752 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11753 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11758 for line in $filefrag_op
11760 frag_lun=$(echo $line | cut -d: -f5 |
11761 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11762 ext_len=$(echo $line | cut -d: -f4)
11763 if (( $frag_lun != $last_lun )); then
11764 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
11765 if (( logical != 512 )); then
11767 error "FIEMAP on $fm_file failed; returned " \
11768 "logical start for lun $logical instead of 512"
11771 if (( tot_len != 512 )); then
11773 error "FIEMAP on $fm_file failed; returned " \
11774 "len $tot_len for OST $last_lun instead of 1024"
11777 (( num_luns += 1 ))
11781 (( tot_len += ext_len ))
11784 if (( num_luns != 2 || tot_len != 512 )); then
11786 error "FIEMAP on $fm_file failed; returned wrong number of " \
11787 "luns or wrong len for OST $last_lun"
11793 echo "FIEMAP on 2-stripe file with hole succeeded"
11795 run_test 130c "FIEMAP (2-stripe file with hole)"
11798 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
11800 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11801 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11803 trap cleanup_130 EXIT RETURN
11805 local fm_file=$DIR/$tfile
11806 $LFS setstripe -S 65536 -c $OSTCOUNT $fm_file ||
11807 error "setstripe on $fm_file"
11808 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11809 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11811 local actual_stripe_count=$($LFS getstripe -c $fm_file)
11812 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
11813 error "dd failed on $fm_file"
11815 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11816 filefrag_op=$(filefrag -ve -k $fm_file |
11817 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11819 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11820 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11825 for line in $filefrag_op
11827 frag_lun=$(echo $line | cut -d: -f5 |
11828 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11829 ext_len=$(echo $line | cut -d: -f4)
11830 if (( $frag_lun != $last_lun )); then
11831 if (( tot_len != 1024 )); then
11833 error "FIEMAP on $fm_file failed; returned " \
11834 "len $tot_len for OST $last_lun instead of 1024"
11837 (( num_luns += 1 ))
11841 (( tot_len += ext_len ))
11844 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
11846 error "FIEMAP on $fm_file failed; returned wrong number of " \
11847 "luns or wrong len for OST $last_lun"
11853 echo "FIEMAP on N-stripe file succeeded"
11855 run_test 130d "FIEMAP (N-stripe file)"
11858 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11860 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11861 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11863 trap cleanup_130 EXIT RETURN
11865 local fm_file=$DIR/$tfile
11866 $LFS setstripe -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11867 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11868 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11871 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11872 for ((i = 0; i < $NUM_BLKS; i++))
11874 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11877 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11878 filefrag_op=$(filefrag -ve -k $fm_file |
11879 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11881 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11882 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11887 for line in $filefrag_op
11889 frag_lun=$(echo $line | cut -d: -f5 |
11890 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11891 ext_len=$(echo $line | cut -d: -f4)
11892 if (( $frag_lun != $last_lun )); then
11893 if (( tot_len != $EXPECTED_LEN )); then
11895 error "FIEMAP on $fm_file failed; returned " \
11896 "len $tot_len for OST $last_lun instead " \
11900 (( num_luns += 1 ))
11904 (( tot_len += ext_len ))
11907 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11909 error "FIEMAP on $fm_file failed; returned wrong number " \
11910 "of luns or wrong len for OST $last_lun"
11916 echo "FIEMAP with continuation calls succeeded"
11918 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11921 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11922 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11924 local fm_file=$DIR/$tfile
11925 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11926 error "multiop create with lov_delay_create on $fm_file"
11928 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11929 filefrag_extents=$(filefrag -vek $fm_file |
11930 awk '/extents? found/ { print $2 }')
11931 if [[ "$filefrag_extents" != "0" ]]; then
11932 error "FIEMAP on $fm_file failed; " \
11933 "returned $filefrag_extents expected 0"
11938 run_test 130f "FIEMAP (unstriped file)"
11940 # Test for writev/readv
11942 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11943 error "writev test failed"
11944 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11945 error "readv failed"
11948 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11951 local fsize=$((524288 + 1048576 + 1572864))
11952 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11953 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11954 error "append writev test failed"
11956 ((fsize += 1572864 + 1048576))
11957 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11958 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11959 error "append writev test failed"
11962 run_test 131b "test append writev"
11965 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11968 run_test 131c "test read/write on file w/o objects"
11971 rwv -f $DIR/$tfile -w -n 1 1572864
11972 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11973 if [ "$NOB" != 1572864 ]; then
11974 error "Short read filed: read $NOB bytes instead of 1572864"
11978 run_test 131d "test short read"
11981 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11982 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11983 error "read hitting hole failed"
11986 run_test 131e "test read hitting hole"
11995 mds*) res=$(do_facet $facet \
11996 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11998 ost*) res=$(do_facet $facet \
11999 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
12001 *) error "Wrong facet '$facet'" ;;
12003 [ "$res" ] || error "The counter for $op on $facet was not incremented"
12004 # if the argument $3 is zero, it means any stat increment is ok.
12005 if [[ $want -gt 0 ]]; then
12006 local count=$(echo $res | awk '{ print $2 }')
12007 [[ $count -ne $want ]] &&
12008 error "The $op counter on $facet is $count, not $want"
12013 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12014 remote_ost_nodsh && skip "remote OST with nodsh"
12015 remote_mds_nodsh && skip "remote MDS with nodsh"
12016 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
12017 skip_env "MDS doesn't support rename stats"
12019 local testdir=$DIR/${tdir}/stats_testdir
12021 mkdir -p $DIR/${tdir}
12024 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
12025 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
12027 # verify mdt stats first.
12028 mkdir ${testdir} || error "mkdir failed"
12029 check_stats $SINGLEMDS "mkdir" 1
12030 touch ${testdir}/${tfile} || error "touch failed"
12031 check_stats $SINGLEMDS "open" 1
12032 check_stats $SINGLEMDS "close" 1
12033 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
12034 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
12035 check_stats $SINGLEMDS "mknod" 2
12037 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
12038 check_stats $SINGLEMDS "unlink" 1
12039 rm -f ${testdir}/${tfile} || error "file remove failed"
12040 check_stats $SINGLEMDS "unlink" 2
12042 # remove working dir and check mdt stats again.
12043 rmdir ${testdir} || error "rmdir failed"
12044 check_stats $SINGLEMDS "rmdir" 1
12046 local testdir1=$DIR/${tdir}/stats_testdir1
12047 mkdir -p ${testdir}
12048 mkdir -p ${testdir1}
12049 touch ${testdir1}/test1
12050 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
12051 check_stats $SINGLEMDS "crossdir_rename" 1
12053 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
12054 check_stats $SINGLEMDS "samedir_rename" 1
12056 rm -rf $DIR/${tdir}
12058 run_test 133a "Verifying MDT stats ========================================"
12063 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12064 remote_ost_nodsh && skip "remote OST with nodsh"
12065 remote_mds_nodsh && skip "remote MDS with nodsh"
12067 local testdir=$DIR/${tdir}/stats_testdir
12069 mkdir -p ${testdir} || error "mkdir failed"
12070 touch ${testdir}/${tfile} || error "touch failed"
12071 cancel_lru_locks mdc
12074 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
12075 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
12077 # extra mdt stats verification.
12078 chmod 444 ${testdir}/${tfile} || error "chmod failed"
12079 check_stats $SINGLEMDS "setattr" 1
12080 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
12081 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
12083 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
12084 check_stats $SINGLEMDS "getattr" 1
12086 rm -rf $DIR/${tdir}
12088 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
12089 # so the check below is not reliable
12090 [ $MDSCOUNT -eq 1 ] || return 0
12092 # Sleep to avoid a cached response.
12093 #define OBD_STATFS_CACHE_SECONDS 1
12095 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
12096 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
12097 $LFS df || error "lfs failed"
12098 check_stats $SINGLEMDS "statfs" 1
12100 # check aggregated statfs (LU-10018)
12101 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
12103 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
12106 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
12107 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
12109 check_stats $SINGLEMDS "statfs" 1
12111 # We want to check that the client didn't send OST_STATFS to
12112 # ost1 but the MDT also uses OST_STATFS for precreate. So some
12113 # extra care is needed here.
12114 if remote_mds; then
12115 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
12116 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
12118 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
12119 [ "$res" ] && error "OST got STATFS"
12124 run_test 133b "Verifying extra MDT stats =================================="
12127 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12128 remote_ost_nodsh && skip "remote OST with nodsh"
12129 remote_mds_nodsh && skip "remote MDS with nodsh"
12131 local testdir=$DIR/$tdir/stats_testdir
12133 test_mkdir -p $testdir
12135 # verify obdfilter stats.
12136 $LFS setstripe -c 1 -i 0 $testdir/$tfile
12138 cancel_lru_locks osc
12139 wait_delete_completed
12142 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
12143 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
12145 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
12148 cancel_lru_locks osc
12149 check_stats ost1 "write" 1
12151 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
12152 check_stats ost1 "read" 1
12154 > $testdir/$tfile || error "truncate failed"
12155 check_stats ost1 "punch" 1
12157 rm -f $testdir/$tfile || error "file remove failed"
12158 wait_delete_completed
12159 check_stats ost1 "destroy" 1
12163 run_test 133c "Verifying OST stats ========================================"
12170 while [ $value -ge 2 ]; do
12175 if [ $orig -gt $order ]; then
12183 local size=('K' 'M' 'G' 'T');
12185 local size_string=$value
12187 while [ $value -ge 1024 ]; do
12188 if [ $i -gt 3 ]; then
12189 #T is the biggest unit we get here, if that is bigger,
12191 size_string=${value}T
12194 value=$((value >> 10))
12195 if [ $value -lt 1024 ]; then
12196 size_string=${value}${size[$i]}
12205 get_rename_size() {
12207 local context=${2:-.}
12208 local sample=$(do_facet $SINGLEMDS $LCTL \
12209 get_param mdt.$FSNAME-MDT0000.rename_stats |
12210 grep -A1 $context |
12211 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
12216 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12217 remote_ost_nodsh && skip "remote OST with nodsh"
12218 remote_mds_nodsh && skip "remote MDS with nodsh"
12219 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
12220 skip_env "MDS doesn't support rename stats"
12222 local testdir1=$DIR/${tdir}/stats_testdir1
12223 local testdir2=$DIR/${tdir}/stats_testdir2
12224 mkdir -p $DIR/${tdir}
12226 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
12228 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
12229 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
12231 createmany -o $testdir1/test 512 || error "createmany failed"
12233 # check samedir rename size
12234 mv ${testdir1}/test0 ${testdir1}/test_0
12236 local testdir1_size=$(ls -l $DIR/${tdir} |
12237 awk '/stats_testdir1/ {print $5}')
12238 local testdir2_size=$(ls -l $DIR/${tdir} |
12239 awk '/stats_testdir2/ {print $5}')
12241 testdir1_size=$(order_2 $testdir1_size)
12242 testdir2_size=$(order_2 $testdir2_size)
12244 testdir1_size=$(size_in_KMGT $testdir1_size)
12245 testdir2_size=$(size_in_KMGT $testdir2_size)
12247 echo "source rename dir size: ${testdir1_size}"
12248 echo "target rename dir size: ${testdir2_size}"
12250 local cmd="do_facet $SINGLEMDS $LCTL "
12251 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
12253 eval $cmd || error "$cmd failed"
12254 local samedir=$($cmd | grep 'same_dir')
12255 local same_sample=$(get_rename_size $testdir1_size)
12256 [ -z "$samedir" ] && error "samedir_rename_size count error"
12257 [[ $same_sample -eq 1 ]] ||
12258 error "samedir_rename_size error $same_sample"
12259 echo "Check same dir rename stats success"
12261 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
12263 # check crossdir rename size
12264 mv ${testdir1}/test_0 ${testdir2}/test_0
12266 testdir1_size=$(ls -l $DIR/${tdir} |
12267 awk '/stats_testdir1/ {print $5}')
12268 testdir2_size=$(ls -l $DIR/${tdir} |
12269 awk '/stats_testdir2/ {print $5}')
12271 testdir1_size=$(order_2 $testdir1_size)
12272 testdir2_size=$(order_2 $testdir2_size)
12274 testdir1_size=$(size_in_KMGT $testdir1_size)
12275 testdir2_size=$(size_in_KMGT $testdir2_size)
12277 echo "source rename dir size: ${testdir1_size}"
12278 echo "target rename dir size: ${testdir2_size}"
12280 eval $cmd || error "$cmd failed"
12281 local crossdir=$($cmd | grep 'crossdir')
12282 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
12283 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
12284 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
12285 [[ $src_sample -eq 1 ]] ||
12286 error "crossdir_rename_size error $src_sample"
12287 [[ $tgt_sample -eq 1 ]] ||
12288 error "crossdir_rename_size error $tgt_sample"
12289 echo "Check cross dir rename stats success"
12290 rm -rf $DIR/${tdir}
12292 run_test 133d "Verifying rename_stats ========================================"
12295 remote_mds_nodsh && skip "remote MDS with nodsh"
12296 remote_ost_nodsh && skip "remote OST with nodsh"
12297 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12299 local testdir=$DIR/${tdir}/stats_testdir
12300 local ctr f0 f1 bs=32768 count=42 sum
12302 mkdir -p ${testdir} || error "mkdir failed"
12304 $LFS setstripe -c 1 -i 0 ${testdir}/${tfile}
12306 for ctr in {write,read}_bytes; do
12308 cancel_lru_locks osc
12310 do_facet ost1 $LCTL set_param -n \
12311 "obdfilter.*.exports.clear=clear"
12313 if [ $ctr = write_bytes ]; then
12315 f1=${testdir}/${tfile}
12317 f0=${testdir}/${tfile}
12321 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
12324 cancel_lru_locks osc
12326 sum=$(do_facet ost1 $LCTL get_param \
12327 "obdfilter.*.exports.*.stats" |
12328 awk -v ctr=$ctr 'BEGIN { sum = 0 }
12329 $1 == ctr { sum += $7 }
12330 END { printf("%0.0f", sum) }')
12332 if ((sum != bs * count)); then
12333 error "Bad $ctr sum, expected $((bs * count)), got $sum"
12337 rm -rf $DIR/${tdir}
12339 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
12341 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
12343 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
12344 # not honor the -ignore_readdir_race option correctly. So we call
12345 # error_ignore() rather than error() in these cases. See LU-11152.
12347 if (find --version; do_facet mds1 find --version) |
12348 grep -q '\b4\.5\.1[1-4]\b'; then
12349 error_ignore LU-11152 "$@"
12356 # First without trusting modes.
12357 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
12358 echo "proc_dirs='$proc_dirs'"
12359 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
12360 find $proc_dirs -exec cat '{}' \; &> /dev/null
12362 # Second verifying readability.
12363 $LCTL get_param -R '*' &> /dev/null
12365 # Verifing writability with badarea_io.
12367 -ignore_readdir_race \
12369 -not -name force_lbug \
12370 -not -name changelog_mask \
12371 -exec badarea_io '{}' \; ||
12372 error_133 "find $proc_dirs failed"
12374 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
12377 remote_mds_nodsh && skip "remote MDS with nodsh"
12378 remote_ost_nodsh && skip "remote OST with nodsh"
12380 # eventually, this can also be replaced with "lctl get_param -R",
12381 # but not until that option is always available on the server
12383 for facet in mds1 ost1; do
12384 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
12385 skip_noexit "Too old lustre on $facet"
12386 local facet_proc_dirs=$(do_facet $facet \
12387 \\\ls -d $proc_regexp 2>/dev/null)
12388 echo "${facet}_proc_dirs='$facet_proc_dirs'"
12389 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
12390 do_facet $facet find $facet_proc_dirs \
12391 ! -name req_history \
12392 -exec cat '{}' \\\; &> /dev/null
12394 do_facet $facet find $facet_proc_dirs \
12395 ! -name req_history \
12397 -exec cat '{}' \\\; &> /dev/null ||
12398 error "proc file read failed"
12400 do_facet $facet find $facet_proc_dirs \
12401 -ignore_readdir_race \
12403 -not -name force_lbug \
12404 -not -name changelog_mask \
12405 -exec badarea_io '{}' \\\; ||
12406 error_133 "$facet find $facet_proc_dirs failed"
12409 # remount the FS in case writes/reads /proc break the FS
12410 cleanup || error "failed to unmount"
12411 setup || error "failed to setup"
12414 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
12417 remote_mds_nodsh && skip "remote MDS with nodsh"
12418 remote_ost_nodsh && skip "remote OST with nodsh"
12419 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
12420 skip "Need MDS version at least 2.9.54"
12424 for facet in client mds1 ost1; do
12425 local facet_proc_dirs=$(do_facet $facet \
12426 \\\ls -d $proc_regexp 2> /dev/null)
12427 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
12428 echo "${facet}_proc_dirs='$facet_proc_dirs'"
12429 # Get the list of files that are missing the terminating newline
12430 local missing=($(do_facet $facet \
12431 find ${facet_proc_dirs} -type f \| \
12432 while read F\; do \
12433 awk -v FS='\v' -v RS='\v\v' \
12434 "'END { if(NR>0 && \
12435 \\\$NF !~ /.*\\\n\$/) \
12436 print FILENAME}'" \
12439 [ ${#missing[*]} -eq 0 ] ||
12440 error "files do not end with newline: ${missing[*]}"
12443 run_test 133h "Proc files should end with newlines"
12446 remote_mds_nodsh && skip "remote MDS with nodsh"
12447 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
12448 skip "Need MDS version at least 2.7.54"
12450 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12451 cancel_lru_locks mdc
12453 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
12454 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
12455 [ $unused -eq 0 ] || error "$unused locks are not cleared"
12458 createmany -o $DIR/$tdir/f $nr ||
12459 error "failed to create $nr files in $DIR/$tdir"
12460 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
12462 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
12463 do_facet mds1 $LCTL set_param fail_loc=0x327
12464 do_facet mds1 $LCTL set_param fail_val=500
12467 echo "sleep 10 seconds ..."
12469 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
12471 do_facet mds1 $LCTL set_param fail_loc=0
12472 do_facet mds1 $LCTL set_param fail_val=0
12473 [ $lck_cnt -lt $unused ] ||
12474 error "No locks reclaimed, before:$unused, after:$lck_cnt"
12477 unlinkmany $DIR/$tdir/f $nr
12479 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
12482 remote_mds_nodsh && skip "remote MDS with nodsh"
12483 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
12484 skip "Need MDS version at least 2.7.54"
12486 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12487 cancel_lru_locks mdc
12489 local low_wm=$(do_facet mds1 $LCTL get_param -n \
12490 ldlm.lock_reclaim_threshold_mb)
12491 # disable reclaim temporarily
12492 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
12494 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
12495 do_facet mds1 $LCTL set_param fail_loc=0x328
12496 do_facet mds1 $LCTL set_param fail_val=500
12498 $LCTL set_param debug=+trace
12501 createmany -o $DIR/$tdir/f $nr &
12502 local create_pid=$!
12504 echo "Sleep $TIMEOUT seconds ..."
12506 if ! ps -p $create_pid > /dev/null 2>&1; then
12507 do_facet mds1 $LCTL set_param fail_loc=0
12508 do_facet mds1 $LCTL set_param fail_val=0
12509 do_facet mds1 $LCTL set_param \
12510 ldlm.lock_reclaim_threshold_mb=${low_wm}m
12511 error "createmany finished incorrectly!"
12513 do_facet mds1 $LCTL set_param fail_loc=0
12514 do_facet mds1 $LCTL set_param fail_val=0
12515 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
12516 wait $create_pid || return 1
12518 unlinkmany $DIR/$tdir/f $nr
12520 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
12522 test_140() { #bug-17379
12523 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12525 test_mkdir $DIR/$tdir
12526 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
12527 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
12529 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
12530 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
12532 while i=$((i + 1)); do
12534 cd $i || error "Changing to $i"
12535 ln -s ../stat stat || error "Creating stat symlink"
12536 # Read the symlink until ELOOP present,
12537 # not LBUGing the system is considered success,
12538 # we didn't overrun the stack.
12539 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
12540 if [ $ret -ne 0 ]; then
12541 if [ $ret -eq 40 ]; then
12544 error "Open stat symlink"
12550 echo "The symlink depth = $i"
12551 [ $i -eq 5 ] || [ $i -eq 7 ] || [ $i -eq 8 ] || [ $i -eq 40 ] ||
12552 error "Invalid symlink depth"
12554 # Test recursive symlink
12555 ln -s symlink_self symlink_self
12556 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
12557 echo "open symlink_self returns $ret"
12558 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
12560 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
12563 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12565 local TF="$TMP/$tfile"
12567 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12569 cancel_lru_locks $OSC
12570 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
12571 remount_client $MOUNT
12573 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
12576 $TRUNCATE $DIR/$tfile 6000
12577 cancel_lru_locks $OSC
12578 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
12581 echo "12345" >>$DIR/$tfile
12582 cancel_lru_locks $OSC
12583 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
12586 echo "12345" >>$DIR/$tfile
12587 cancel_lru_locks $OSC
12588 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
12593 run_test 150 "truncate/append tests"
12595 #LU-2902 roc_hit was not able to read all values from lproc
12596 function roc_hit_init() {
12597 local list=$(comma_list $(osts_nodes))
12598 local dir=$DIR/$tdir-check
12599 local file=$dir/$tfile
12605 #use setstripe to do a write to every ost
12606 for i in $(seq 0 $((OSTCOUNT-1))); do
12607 $LFS setstripe -c 1 -i $i $dir || error "$LFS setstripe $file failed"
12608 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
12609 idx=$(printf %04x $i)
12610 BEFORE=$(get_osd_param $list *OST*$idx stats |
12611 awk '$1 == "cache_access" {sum += $7}
12612 END { printf("%0.0f", sum) }')
12614 cancel_lru_locks osc
12615 cat $file >/dev/null
12617 AFTER=$(get_osd_param $list *OST*$idx stats |
12618 awk '$1 == "cache_access" {sum += $7}
12619 END { printf("%0.0f", sum) }')
12621 echo BEFORE:$BEFORE AFTER:$AFTER
12622 if ! let "AFTER - BEFORE == 4"; then
12624 error "roc_hit is not safe to use"
12632 function roc_hit() {
12633 local list=$(comma_list $(osts_nodes))
12634 echo $(get_osd_param $list '' stats |
12635 awk '$1 == "cache_hit" {sum += $7}
12636 END { printf("%0.0f", sum) }')
12639 function set_cache() {
12642 if [ "$2" == "off" ]; then
12645 local list=$(comma_list $(osts_nodes))
12646 set_osd_param $list '' $1_cache_enable $on
12648 cancel_lru_locks osc
12652 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12653 remote_ost_nodsh && skip "remote OST with nodsh"
12656 local list=$(comma_list $(osts_nodes))
12658 # check whether obdfilter is cache capable at all
12659 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
12660 skip "not cache-capable obdfilter"
12663 # check cache is enabled on all obdfilters
12664 if get_osd_param $list '' read_cache_enable | grep 0; then
12665 skip "oss cache is disabled"
12668 set_osd_param $list '' writethrough_cache_enable 1
12670 # check write cache is enabled on all obdfilters
12671 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
12672 skip "oss write cache is NOT enabled"
12677 #define OBD_FAIL_OBD_NO_LRU 0x609
12678 do_nodes $list $LCTL set_param fail_loc=0x609
12680 # pages should be in the case right after write
12681 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
12684 local BEFORE=$(roc_hit)
12685 cancel_lru_locks osc
12686 cat $DIR/$tfile >/dev/null
12687 local AFTER=$(roc_hit)
12689 do_nodes $list $LCTL set_param fail_loc=0
12691 if ! let "AFTER - BEFORE == CPAGES"; then
12692 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12695 # the following read invalidates the cache
12696 cancel_lru_locks osc
12697 set_osd_param $list '' read_cache_enable 0
12698 cat $DIR/$tfile >/dev/null
12700 # now data shouldn't be found in the cache
12702 cancel_lru_locks osc
12703 cat $DIR/$tfile >/dev/null
12705 if let "AFTER - BEFORE != 0"; then
12706 error "IN CACHE: before: $BEFORE, after: $AFTER"
12709 set_osd_param $list '' read_cache_enable 1
12712 run_test 151 "test cache on oss and controls ==============================="
12715 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12717 local TF="$TMP/$tfile"
12719 # simulate ENOMEM during write
12720 #define OBD_FAIL_OST_NOMEM 0x226
12721 lctl set_param fail_loc=0x80000226
12722 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12724 sync || error "sync failed"
12725 lctl set_param fail_loc=0
12727 # discard client's cache
12728 cancel_lru_locks osc
12730 # simulate ENOMEM during read
12731 lctl set_param fail_loc=0x80000226
12732 cmp $TF $DIR/$tfile || error "cmp failed"
12733 lctl set_param fail_loc=0
12737 run_test 152 "test read/write with enomem ============================"
12740 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
12742 run_test 153 "test if fdatasync does not crash ======================="
12744 dot_lustre_fid_permission_check() {
12746 local ffid=$MOUNT/.lustre/fid/$fid
12749 echo "stat fid $fid"
12750 stat $ffid > /dev/null || error "stat $ffid failed."
12751 echo "touch fid $fid"
12752 touch $ffid || error "touch $ffid failed."
12753 echo "write to fid $fid"
12754 cat /etc/hosts > $ffid || error "write $ffid failed."
12755 echo "read fid $fid"
12756 diff /etc/hosts $ffid || error "read $ffid failed."
12757 echo "append write to fid $fid"
12758 cat /etc/hosts >> $ffid || error "append write $ffid failed."
12759 echo "rename fid $fid"
12760 mv $ffid $test_dir/$tfile.1 &&
12761 error "rename $ffid to $tfile.1 should fail."
12762 touch $test_dir/$tfile.1
12763 mv $test_dir/$tfile.1 $ffid &&
12764 error "rename $tfile.1 to $ffid should fail."
12765 rm -f $test_dir/$tfile.1
12766 echo "truncate fid $fid"
12767 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
12768 echo "link fid $fid"
12769 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
12770 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
12771 echo "setfacl fid $fid"
12772 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
12773 echo "getfacl fid $fid"
12774 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
12776 echo "unlink fid $fid"
12777 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
12778 echo "mknod fid $fid"
12779 mknod $ffid c 1 3 && error "mknod $ffid should fail."
12781 fid=[0xf00000400:0x1:0x0]
12782 ffid=$MOUNT/.lustre/fid/$fid
12784 echo "stat non-exist fid $fid"
12785 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
12786 echo "write to non-exist fid $fid"
12787 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
12788 echo "link new fid $fid"
12789 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
12791 mkdir -p $test_dir/$tdir
12792 touch $test_dir/$tdir/$tfile
12793 fid=$($LFS path2fid $test_dir/$tdir)
12796 error "error: could not get fid for $test_dir/$dir/$tfile."
12798 ffid=$MOUNT/.lustre/fid/$fid
12801 ls $ffid > /dev/null || error "ls $ffid failed."
12802 echo "touch $fid/$tfile.1"
12803 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
12805 echo "touch $MOUNT/.lustre/fid/$tfile"
12806 touch $MOUNT/.lustre/fid/$tfile && \
12807 error "touch $MOUNT/.lustre/fid/$tfile should fail."
12809 echo "setxattr to $MOUNT/.lustre/fid"
12810 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
12812 echo "listxattr for $MOUNT/.lustre/fid"
12813 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
12815 echo "delxattr from $MOUNT/.lustre/fid"
12816 setfattr -x trusted.name1 $MOUNT/.lustre/fid
12818 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
12819 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
12820 error "touch invalid fid should fail."
12822 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
12823 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
12824 error "touch non-normal fid should fail."
12826 echo "rename $tdir to $MOUNT/.lustre/fid"
12827 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
12828 error "rename to $MOUNT/.lustre/fid should fail."
12830 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
12832 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
12833 local new_obf_mode=777
12835 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
12836 chmod $new_obf_mode $DIR/.lustre/fid ||
12837 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
12839 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
12840 [ $obf_mode -eq $new_obf_mode ] ||
12841 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
12843 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
12844 chmod $old_obf_mode $DIR/.lustre/fid ||
12845 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
12848 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
12849 fid=$($LFS path2fid $test_dir/$tfile-2)
12851 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
12853 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
12854 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
12855 error "create lov data thru .lustre failed"
12857 echo "cp /etc/passwd $test_dir/$tfile-2"
12858 cp /etc/passwd $test_dir/$tfile-2 ||
12859 error "copy to $test_dir/$tfile-2 failed."
12860 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
12861 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12862 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12864 rm -rf $test_dir/tfile.lnk
12865 rm -rf $test_dir/$tfile-2
12869 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12870 skip "Need MDS version at least 2.4.1"
12872 local tf=$DIR/$tfile
12875 local fid=$($LFS path2fid $tf)
12876 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12878 # check that we get the same pathname back
12879 local found=$($LFS fid2path $MOUNT "$fid")
12880 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12881 [ "$found" == "$tf" ] ||
12882 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12884 run_test 154A "lfs path2fid and fid2path basic checks"
12887 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12888 skip "Need MDS version at least 2.4.1"
12890 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12891 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12892 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12893 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12895 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12896 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12898 # check that we get the same pathname
12899 echo "PFID: $PFID, name: $name"
12900 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12901 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12902 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12903 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12905 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12907 run_test 154B "verify the ll_decode_linkea tool"
12910 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12911 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12912 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12913 skip "Need MDS version at least 2.2.51"
12914 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12916 cp /etc/hosts $DIR/$tfile
12918 fid=$($LFS path2fid $DIR/$tfile)
12920 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12922 dot_lustre_fid_permission_check "$fid" $DIR ||
12923 error "dot lustre permission check $fid failed"
12925 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12927 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12929 touch $MOUNT/.lustre/file &&
12930 error "creation is not allowed under .lustre"
12932 mkdir $MOUNT/.lustre/dir &&
12933 error "mkdir is not allowed under .lustre"
12937 run_test 154a "Open-by-FID"
12940 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12941 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12942 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12943 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12944 skip "Need MDS version at least 2.2.51"
12946 local remote_dir=$DIR/$tdir/remote_dir
12950 mkdir -p $DIR/$tdir
12951 $LFS mkdir -i $MDTIDX $remote_dir ||
12952 error "create remote directory failed"
12954 cp /etc/hosts $remote_dir/$tfile
12956 fid=$($LFS path2fid $remote_dir/$tfile)
12958 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12960 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12961 error "dot lustre permission check $fid failed"
12964 run_test 154b "Open-by-FID for remote directory"
12967 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12968 skip "Need MDS version at least 2.4.1"
12970 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12971 local FID1=$($LFS path2fid $DIR/$tfile.1)
12972 local FID2=$($LFS path2fid $DIR/$tfile.2)
12973 local FID3=$($LFS path2fid $DIR/$tfile.3)
12976 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12977 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12978 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12980 [ "$FID" = "${!want}" ] ||
12981 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12985 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12987 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12988 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12992 run_test 154c "lfs path2fid and fid2path multiple arguments"
12995 remote_mds_nodsh && skip "remote MDS with nodsh"
12996 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12997 skip "Need MDS version at least 2.5.53"
12999 if remote_mds; then
13000 nid=$($LCTL list_nids | sed "s/\./\\\./g")
13004 local proc_ofile="mdt.*.exports.'$nid'.open_files"
13011 local fid=$($LFS path2fid $DIR/$tfile)
13014 cmd="exec $fd<$DIR/$tfile"
13016 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
13017 echo "$fid_list" | grep "$fid"
13020 cmd="exec $fd>/dev/null"
13022 if [ $rc -ne 0 ]; then
13023 error "FID $fid not found in open files list $fid_list"
13026 run_test 154d "Verify open file fid"
13030 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
13031 skip "Need MDS version at least 2.6.50"
13033 if ls -a $MOUNT | grep -q '^\.lustre$'; then
13034 error ".lustre returned by readdir"
13037 run_test 154e ".lustre is not returned by readdir"
13040 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
13042 # create parent directory on a single MDT to avoid cross-MDT hardlinks
13043 test_mkdir -p -c1 $DIR/$tdir/d
13044 # test dirs inherit from its stripe
13045 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
13046 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
13047 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
13048 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
13051 # get fid of parents
13052 local FID0=$($LFS path2fid $DIR/$tdir/d)
13053 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
13054 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
13055 local FID3=$($LFS path2fid $DIR)
13057 # check that path2fid --parents returns expected <parent_fid>/name
13058 # 1) test for a directory (single parent)
13059 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
13060 [ "$parent" == "$FID0/foo1" ] ||
13061 error "expected parent: $FID0/foo1, got: $parent"
13063 # 2) test for a file with nlink > 1 (multiple parents)
13064 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
13065 echo "$parent" | grep -F "$FID1/$tfile" ||
13066 error "$FID1/$tfile not returned in parent list"
13067 echo "$parent" | grep -F "$FID2/link" ||
13068 error "$FID2/link not returned in parent list"
13070 # 3) get parent by fid
13071 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
13072 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
13073 echo "$parent" | grep -F "$FID1/$tfile" ||
13074 error "$FID1/$tfile not returned in parent list (by fid)"
13075 echo "$parent" | grep -F "$FID2/link" ||
13076 error "$FID2/link not returned in parent list (by fid)"
13078 # 4) test for entry in root directory
13079 parent=$($LFS path2fid --parents $DIR/f)
13080 echo "$parent" | grep -F "$FID3/f" ||
13081 error "$FID3/f not returned in parent list"
13083 # 5) test it on root directory
13084 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
13085 error "$MOUNT should not have parents"
13087 # enable xattr caching and check that linkea is correctly updated
13088 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
13089 save_lustre_params client "llite.*.xattr_cache" > $save
13090 lctl set_param llite.*.xattr_cache 1
13092 # 6.1) linkea update on rename
13093 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
13095 # get parents by fid
13096 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
13097 # foo1 should no longer be returned in parent list
13098 echo "$parent" | grep -F "$FID1" &&
13099 error "$FID1 should no longer be in parent list"
13100 # the new path should appear
13101 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
13102 error "$FID2/$tfile.moved is not in parent list"
13104 # 6.2) linkea update on unlink
13105 rm -f $DIR/$tdir/d/foo2/link
13106 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
13107 # foo2/link should no longer be returned in parent list
13108 echo "$parent" | grep -F "$FID2/link" &&
13109 error "$FID2/link should no longer be in parent list"
13113 restore_lustre_params < $save
13116 run_test 154f "get parent fids by reading link ea"
13120 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
13121 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
13122 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
13123 skip "Need MDS version at least 2.6.92"
13125 mkdir -p $DIR/$tdir
13126 llapi_fid_test -d $DIR/$tdir
13128 run_test 154g "various llapi FID tests"
13130 test_155_small_load() {
13131 local temp=$TMP/$tfile
13132 local file=$DIR/$tfile
13134 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
13135 error "dd of=$temp bs=6096 count=1 failed"
13137 cancel_lru_locks $OSC
13138 cmp $temp $file || error "$temp $file differ"
13140 $TRUNCATE $temp 6000
13141 $TRUNCATE $file 6000
13142 cmp $temp $file || error "$temp $file differ (truncate1)"
13144 echo "12345" >>$temp
13145 echo "12345" >>$file
13146 cmp $temp $file || error "$temp $file differ (append1)"
13148 echo "12345" >>$temp
13149 echo "12345" >>$file
13150 cmp $temp $file || error "$temp $file differ (append2)"
13156 test_155_big_load() {
13157 remote_ost_nodsh && skip "remote OST with nodsh"
13159 local temp=$TMP/$tfile
13160 local file=$DIR/$tfile
13163 local cache_size=$(do_facet ost$((MAXI+1)) \
13164 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
13165 local large_file_size=$((cache_size * 2))
13167 echo "OSS cache size: $cache_size KB"
13168 echo "Large file size: $large_file_size KB"
13170 [ $MAXV -le $large_file_size ] &&
13171 skip_env "max available OST size needs > $large_file_size KB"
13173 $LFS setstripe $file -c 1 -i $MAXI || error "$LFS setstripe $file failed"
13175 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
13176 error "dd of=$temp bs=$large_file_size count=1k failed"
13179 cancel_lru_locks osc
13180 cmp $temp $file || error "$temp $file differ"
13186 save_writethrough() {
13187 local facets=$(get_facets OST)
13189 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
13193 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13195 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13197 save_writethrough $p
13200 set_cache writethrough on
13201 test_155_small_load
13202 restore_lustre_params < $p
13205 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
13208 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13210 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13212 save_writethrough $p
13215 set_cache writethrough off
13216 test_155_small_load
13217 restore_lustre_params < $p
13220 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
13223 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13225 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13227 save_writethrough $p
13230 set_cache writethrough on
13231 test_155_small_load
13232 restore_lustre_params < $p
13235 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
13238 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13240 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13242 save_writethrough $p
13245 set_cache writethrough off
13246 test_155_small_load
13247 restore_lustre_params < $p
13250 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
13253 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13255 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13257 save_writethrough $p
13260 set_cache writethrough on
13262 restore_lustre_params < $p
13265 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
13268 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13270 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13272 save_writethrough $p
13275 set_cache writethrough off
13277 restore_lustre_params < $p
13280 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
13283 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13285 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13287 save_writethrough $p
13290 set_cache writethrough on
13292 restore_lustre_params < $p
13295 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
13298 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13300 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13302 save_writethrough $p
13305 set_cache writethrough off
13307 restore_lustre_params < $p
13310 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
13313 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13314 remote_ost_nodsh && skip "remote OST with nodsh"
13315 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
13316 skip "stats not implemented on old servers"
13317 [ "$ost1_FSTYPE" = "zfs" ] &&
13318 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
13323 local file="$DIR/$tfile"
13324 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
13326 save_writethrough $p
13329 log "Turn on read and write cache"
13331 set_cache writethrough on
13333 log "Write data and read it back."
13334 log "Read should be satisfied from the cache."
13335 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13337 cancel_lru_locks osc
13338 cat $file >/dev/null
13340 if ! let "AFTER - BEFORE == CPAGES"; then
13341 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
13343 log "cache hits:: before: $BEFORE, after: $AFTER"
13346 log "Read again; it should be satisfied from the cache."
13348 cancel_lru_locks osc
13349 cat $file >/dev/null
13351 if ! let "AFTER - BEFORE == CPAGES"; then
13352 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
13354 log "cache hits:: before: $BEFORE, after: $AFTER"
13357 log "Turn off the read cache and turn on the write cache"
13359 set_cache writethrough on
13361 log "Read again; it should be satisfied from the cache."
13363 cancel_lru_locks osc
13364 cat $file >/dev/null
13366 if ! let "AFTER - BEFORE == CPAGES"; then
13367 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
13369 log "cache hits:: before: $BEFORE, after: $AFTER"
13372 log "Read again; it should not be satisfied from the cache."
13374 cancel_lru_locks osc
13375 cat $file >/dev/null
13377 if ! let "AFTER - BEFORE == 0"; then
13378 error "IN CACHE: before: $BEFORE, after: $AFTER"
13380 log "cache hits:: before: $BEFORE, after: $AFTER"
13383 log "Write data and read it back."
13384 log "Read should be satisfied from the cache."
13385 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13387 cancel_lru_locks osc
13388 cat $file >/dev/null
13390 if ! let "AFTER - BEFORE == CPAGES"; then
13391 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
13393 log "cache hits:: before: $BEFORE, after: $AFTER"
13396 log "Read again; it should not be satisfied from the cache."
13398 cancel_lru_locks osc
13399 cat $file >/dev/null
13401 if ! let "AFTER - BEFORE == 0"; then
13402 error "IN CACHE: before: $BEFORE, after: $AFTER"
13404 log "cache hits:: before: $BEFORE, after: $AFTER"
13407 log "Turn off read and write cache"
13409 set_cache writethrough off
13411 log "Write data and read it back"
13412 log "It should not be satisfied from the cache."
13414 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13415 cancel_lru_locks osc
13417 cat $file >/dev/null
13419 if ! let "AFTER - BEFORE == 0"; then
13420 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
13422 log "cache hits:: before: $BEFORE, after: $AFTER"
13425 log "Turn on the read cache and turn off the write cache"
13427 set_cache writethrough off
13429 log "Write data and read it back"
13430 log "It should not be satisfied from the cache."
13432 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13434 cancel_lru_locks osc
13435 cat $file >/dev/null
13437 if ! let "AFTER - BEFORE == 0"; then
13438 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
13440 log "cache hits:: before: $BEFORE, after: $AFTER"
13443 log "Read again; it should be satisfied from the cache."
13445 cancel_lru_locks osc
13446 cat $file >/dev/null
13448 if ! let "AFTER - BEFORE == CPAGES"; then
13449 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
13451 log "cache hits:: before: $BEFORE, after: $AFTER"
13454 restore_lustre_params < $p
13457 run_test 156 "Verification of tunables"
13460 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13461 remote_mds_nodsh && skip "remote MDS with nodsh"
13462 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13463 skip "Need MDS version at least 2.2.0"
13465 changelog_register || error "changelog_register failed"
13466 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13467 changelog_users $SINGLEMDS | grep -q $cl_user ||
13468 error "User $cl_user not found in changelog_users"
13471 test_mkdir -p $DIR/$tdir/pics/2008/zachy
13472 changelog_clear 0 || error "changelog_clear failed"
13473 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
13474 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
13475 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
13476 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
13477 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
13478 rm $DIR/$tdir/pics/desktop.jpg
13480 changelog_dump | tail -10
13482 echo "verifying changelog mask"
13483 changelog_chmask "-MKDIR"
13484 changelog_chmask "-CLOSE"
13486 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
13487 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
13489 changelog_chmask "+MKDIR"
13490 changelog_chmask "+CLOSE"
13492 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
13493 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
13495 changelog_dump | tail -10
13496 MKDIRS=$(changelog_dump | grep -c "MKDIR")
13497 CLOSES=$(changelog_dump | grep -c "CLOSE")
13498 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
13499 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
13502 echo "verifying target fid"
13503 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
13504 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
13505 [ "$fidc" == "$fidf" ] ||
13506 error "changelog '$tfile' fid $fidc != file fid $fidf"
13507 echo "verifying parent fid"
13508 # The FID returned from the Changelog may be the directory shard on
13509 # a different MDT, and not the FID returned by path2fid on the parent.
13510 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
13511 # since this is what will matter when recreating this file in the tree.
13512 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
13513 local pathp=$($LFS fid2path $MOUNT "$fidp")
13514 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
13515 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
13517 echo "getting records for $cl_user"
13518 changelog_users $SINGLEMDS
13519 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
13521 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
13522 error "changelog_clear failed"
13523 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
13524 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
13525 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
13526 error "user index expect $user_rec1 + $nclr != $user_rec2"
13528 local min0_rec=$(changelog_users $SINGLEMDS |
13529 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
13530 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
13531 awk '{ print $1; exit; }')
13533 changelog_dump | tail -n 5
13534 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
13535 [ $first_rec == $((min0_rec + 1)) ] ||
13536 error "first index should be $min0_rec + 1 not $first_rec"
13538 # LU-3446 changelog index reset on MDT restart
13539 local cur_rec1=$(changelog_users $SINGLEMDS |
13540 awk '/^current.index:/ { print $NF }')
13541 changelog_clear 0 ||
13542 error "clear all changelog records for $cl_user failed"
13543 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
13544 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
13545 error "Fail to start $SINGLEMDS"
13546 local cur_rec2=$(changelog_users $SINGLEMDS |
13547 awk '/^current.index:/ { print $NF }')
13548 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
13549 [ $cur_rec1 == $cur_rec2 ] ||
13550 error "current index should be $cur_rec1 not $cur_rec2"
13552 echo "verifying users from this test are deregistered"
13553 changelog_deregister || error "changelog_deregister failed"
13554 changelog_users $SINGLEMDS | grep -q $cl_user &&
13555 error "User '$cl_user' still in changelog_users"
13557 # lctl get_param -n mdd.*.changelog_users
13558 # current index: 144
13559 # ID index (idle seconds)
13561 if ! changelog_users $SINGLEMDS | grep "^cl"; then
13562 # this is the normal case where all users were deregistered
13563 # make sure no new records are added when no users are present
13564 local last_rec1=$(changelog_users $SINGLEMDS |
13565 awk '/^current.index:/ { print $NF }')
13566 touch $DIR/$tdir/chloe
13567 local last_rec2=$(changelog_users $SINGLEMDS |
13568 awk '/^current.index:/ { print $NF }')
13569 echo "verify changelogs are off: $last_rec1 == $last_rec2"
13570 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
13572 # any changelog users must be leftovers from a previous test
13573 changelog_users $SINGLEMDS
13574 echo "other changelog users; can't verify off"
13577 run_test 160a "changelog sanity"
13579 test_160b() { # LU-3587
13580 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13581 remote_mds_nodsh && skip "remote MDS with nodsh"
13582 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13583 skip "Need MDS version at least 2.2.0"
13585 changelog_register || error "changelog_register failed"
13586 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13587 changelog_users $SINGLEMDS | grep -q $cl_user ||
13588 error "User '$cl_user' not found in changelog_users"
13590 local longname1=$(str_repeat a 255)
13591 local longname2=$(str_repeat b 255)
13594 echo "creating very long named file"
13595 touch $longname1 || error "create of '$longname1' failed"
13596 echo "renaming very long named file"
13597 mv $longname1 $longname2
13599 changelog_dump | grep RENME | tail -n 5
13602 run_test 160b "Verify that very long rename doesn't crash in changelog"
13605 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13606 remote_mds_nodsh && skip "remote MDS with nodsh"
13608 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
13609 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
13610 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
13611 skip "Need MDS version at least 2.5.58 or 2.5.2+"
13615 # Registration step
13616 changelog_register || error "changelog_register failed"
13619 mkdir -p $DIR/$tdir
13620 $MCREATE $DIR/$tdir/foo_160c
13621 changelog_chmask "-TRUNC"
13622 $TRUNCATE $DIR/$tdir/foo_160c 200
13623 changelog_chmask "+TRUNC"
13624 $TRUNCATE $DIR/$tdir/foo_160c 199
13625 changelog_dump | tail -n 5
13626 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
13627 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
13629 run_test 160c "verify that changelog log catch the truncate event"
13632 remote_mds_nodsh && skip "remote MDS with nodsh"
13633 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13634 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13635 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
13636 skip "Need MDS version at least 2.7.60"
13638 # Registration step
13639 changelog_register || error "changelog_register failed"
13641 mkdir -p $DIR/$tdir/migrate_dir
13642 changelog_clear 0 || error "changelog_clear failed"
13644 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
13645 changelog_dump | tail -n 5
13646 local migrates=$(changelog_dump | grep -c "MIGRT")
13647 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
13649 run_test 160d "verify that changelog log catch the migrate event"
13652 remote_mds_nodsh && skip "remote MDS with nodsh"
13655 changelog_register || error "changelog_register failed"
13657 # Delete a future user (expect fail)
13658 local MDT0=$(facet_svc $SINGLEMDS)
13659 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
13662 if [ $rc -eq 0 ]; then
13663 error "Deleted non-existant user cl77"
13664 elif [ $rc -ne 2 ]; then
13665 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
13668 # Clear to a bad index (1 billion should be safe)
13669 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
13672 if [ $rc -eq 0 ]; then
13673 error "Successfully cleared to invalid CL index"
13674 elif [ $rc -ne 22 ]; then
13675 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
13678 run_test 160e "changelog negative testing (should return errors)"
13681 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13682 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13683 skip "Need MDS version at least 2.10.56"
13685 local mdts=$(comma_list $(mdts_nodes))
13688 changelog_register || error "first changelog_register failed"
13689 changelog_register || error "second changelog_register failed"
13691 declare -A cl_user1
13692 declare -A cl_user2
13697 # generate some changelog records to accumulate on each MDT
13698 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13699 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13700 error "create $DIR/$tdir/$tfile failed"
13702 # check changelogs have been generated
13703 local nbcl=$(changelog_dump | wc -l)
13704 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13706 for param in "changelog_max_idle_time=10" \
13708 "changelog_min_gc_interval=2" \
13709 "changelog_min_free_cat_entries=3"; do
13710 local MDT0=$(facet_svc $SINGLEMDS)
13711 local var="${param%=*}"
13712 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13714 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13715 do_nodes $mdts $LCTL set_param mdd.*.$param
13718 # force cl_user2 to be idle (1st part)
13721 # simulate changelog catalog almost full
13722 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13723 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13725 for i in $(seq $MDSCOUNT); do
13726 cl_users=(${CL_USERS[mds$i]})
13727 cl_user1[mds$i]="${cl_users[0]}"
13728 cl_user2[mds$i]="${cl_users[1]}"
13730 [ -n "${cl_user1[mds$i]}" ] ||
13731 error "mds$i: no user registered"
13732 [ -n "${cl_user2[mds$i]}" ] ||
13733 error "mds$i: only ${cl_user2[mds$i]} is registered"
13735 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13736 [ -n "$user_rec1" ] ||
13737 error "mds$i: User ${cl_user1[mds$i]} not registered"
13738 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13739 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13740 [ -n "$user_rec2" ] ||
13741 error "mds$i: User ${cl_user1[mds$i]} not registered"
13742 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13743 "$user_rec1 + 2 == $user_rec2"
13744 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13745 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13746 "$user_rec1 + 2, but is $user_rec2"
13747 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13748 [ -n "$user_rec2" ] ||
13749 error "mds$i: User ${cl_user2[mds$i]} not registered"
13750 [ $user_rec1 == $user_rec2 ] ||
13751 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13752 "$user_rec1, but is $user_rec2"
13755 # force cl_user2 to be idle (2nd part) and to reach
13756 # changelog_max_idle_time
13759 # generate one more changelog to trigger fail_loc
13760 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13761 error "create $DIR/$tdir/${tfile}bis failed"
13763 # ensure gc thread is done
13764 for i in $(mdts_nodes); do
13766 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13767 error "$i: GC-thread not done"
13771 for i in $(seq $MDSCOUNT); do
13772 # check cl_user1 still registered
13773 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13774 error "mds$i: User ${cl_user1[mds$i]} not registered"
13775 # check cl_user2 unregistered
13776 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13777 error "mds$i: User ${cl_user2[mds$i]} still registered"
13779 # check changelogs are present and starting at $user_rec1 + 1
13780 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13781 [ -n "$user_rec1" ] ||
13782 error "mds$i: User ${cl_user1[mds$i]} not registered"
13783 first_rec=$($LFS changelog $(facet_svc mds$i) |
13784 awk '{ print $1; exit; }')
13786 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13787 [ $((user_rec1 + 1)) == $first_rec ] ||
13788 error "mds$i: first index should be $user_rec1 + 1, " \
13789 "but is $first_rec"
13792 run_test 160f "changelog garbage collect (timestamped users)"
13795 remote_mds_nodsh && skip "remote MDS with nodsh"
13796 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13797 skip "Need MDS version at least 2.10.56"
13799 local mdts=$(comma_list $(mdts_nodes))
13801 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
13802 do_nodes $mdts $LCTL set_param fail_loc=0x1314
13805 changelog_register || error "first changelog_register failed"
13806 changelog_register || error "second changelog_register failed"
13808 declare -A cl_user1
13809 declare -A cl_user2
13814 # generate some changelog records to accumulate on each MDT
13815 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13816 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13817 error "create $DIR/$tdir/$tfile failed"
13819 # check changelogs have been generated
13820 local nbcl=$(changelog_dump | wc -l)
13821 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13823 # reduce the max_idle_indexes value to make sure we exceed it
13824 max_ndx=$((nbcl / 2 - 1))
13826 for param in "changelog_max_idle_indexes=$max_ndx" \
13828 "changelog_min_gc_interval=2" \
13829 "changelog_min_free_cat_entries=3"; do
13830 local MDT0=$(facet_svc $SINGLEMDS)
13831 local var="${param%=*}"
13832 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13834 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13835 do_nodes $mdts $LCTL set_param mdd.*.$param ||
13836 error "unable to set mdd.*.$param"
13839 # simulate changelog catalog almost full
13840 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13841 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13843 for i in $(seq $MDSCOUNT); do
13844 cl_users=(${CL_USERS[mds$i]})
13845 cl_user1[mds$i]="${cl_users[0]}"
13846 cl_user2[mds$i]="${cl_users[1]}"
13848 [ -n "${cl_user1[mds$i]}" ] ||
13849 error "mds$i: no user registered"
13850 [ -n "${cl_user2[mds$i]}" ] ||
13851 error "mds$i: only ${cl_user1[mds$i]} is registered"
13853 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13854 [ -n "$user_rec1" ] ||
13855 error "mds$i: User ${cl_user1[mds$i]} not registered"
13856 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13857 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13858 [ -n "$user_rec2" ] ||
13859 error "mds$i: User ${cl_user1[mds$i]} not registered"
13860 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13861 "$user_rec1 + 2 == $user_rec2"
13862 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13863 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13864 "$user_rec1 + 2, but is $user_rec2"
13865 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13866 [ -n "$user_rec2" ] ||
13867 error "mds$i: User ${cl_user2[mds$i]} not registered"
13868 [ $user_rec1 == $user_rec2 ] ||
13869 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13870 "$user_rec1, but is $user_rec2"
13873 # ensure we are past the previous changelog_min_gc_interval set above
13876 # generate one more changelog to trigger fail_loc
13877 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13878 error "create $DIR/$tdir/${tfile}bis failed"
13880 # ensure gc thread is done
13881 for i in $(mdts_nodes); do
13883 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13884 error "$i: GC-thread not done"
13888 for i in $(seq $MDSCOUNT); do
13889 # check cl_user1 still registered
13890 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13891 error "mds$i: User ${cl_user1[mds$i]} not registered"
13892 # check cl_user2 unregistered
13893 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13894 error "mds$i: User ${cl_user2[mds$i]} still registered"
13896 # check changelogs are present and starting at $user_rec1 + 1
13897 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13898 [ -n "$user_rec1" ] ||
13899 error "mds$i: User ${cl_user1[mds$i]} not registered"
13900 first_rec=$($LFS changelog $(facet_svc mds$i) |
13901 awk '{ print $1; exit; }')
13903 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13904 [ $((user_rec1 + 1)) == $first_rec ] ||
13905 error "mds$i: first index should be $user_rec1 + 1, " \
13906 "but is $first_rec"
13909 run_test 160g "changelog garbage collect (old users)"
13912 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13913 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13914 skip "Need MDS version at least 2.10.56"
13916 local mdts=$(comma_list $(mdts_nodes))
13919 changelog_register || error "first changelog_register failed"
13920 changelog_register || error "second changelog_register failed"
13922 declare -A cl_user1
13923 declare -A cl_user2
13928 # generate some changelog records to accumulate on each MDT
13929 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13930 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13931 error "create $DIR/$tdir/$tfile failed"
13933 # check changelogs have been generated
13934 local nbcl=$(changelog_dump | wc -l)
13935 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13937 for param in "changelog_max_idle_time=10" \
13939 "changelog_min_gc_interval=2"; do
13940 local MDT0=$(facet_svc $SINGLEMDS)
13941 local var="${param%=*}"
13942 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13944 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13945 do_nodes $mdts $LCTL set_param mdd.*.$param
13948 # force cl_user2 to be idle (1st part)
13951 for i in $(seq $MDSCOUNT); do
13952 cl_users=(${CL_USERS[mds$i]})
13953 cl_user1[mds$i]="${cl_users[0]}"
13954 cl_user2[mds$i]="${cl_users[1]}"
13956 [ -n "${cl_user1[mds$i]}" ] ||
13957 error "mds$i: no user registered"
13958 [ -n "${cl_user2[mds$i]}" ] ||
13959 error "mds$i: only ${cl_user2[mds$i]} is registered"
13961 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13962 [ -n "$user_rec1" ] ||
13963 error "mds$i: User ${cl_user1[mds$i]} not registered"
13964 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13965 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13966 [ -n "$user_rec2" ] ||
13967 error "mds$i: User ${cl_user1[mds$i]} not registered"
13968 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13969 "$user_rec1 + 2 == $user_rec2"
13970 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13971 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13972 "$user_rec1 + 2, but is $user_rec2"
13973 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13974 [ -n "$user_rec2" ] ||
13975 error "mds$i: User ${cl_user2[mds$i]} not registered"
13976 [ $user_rec1 == $user_rec2 ] ||
13977 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13978 "$user_rec1, but is $user_rec2"
13981 # force cl_user2 to be idle (2nd part) and to reach
13982 # changelog_max_idle_time
13985 # force each GC-thread start and block then
13986 # one per MDT/MDD, set fail_val accordingly
13987 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13988 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13990 # generate more changelogs to trigger fail_loc
13991 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13992 error "create $DIR/$tdir/${tfile}bis failed"
13994 # stop MDT to stop GC-thread, should be done in back-ground as it will
13995 # block waiting for the thread to be released and exit
13996 declare -A stop_pids
13997 for i in $(seq $MDSCOUNT); do
13999 stop_pids[mds$i]=$!
14002 for i in $(mdts_nodes); do
14005 local facets=$(facets_up_on_host $i)
14007 for facet in ${facets//,/ }; do
14008 if [[ $facet == mds* ]]; then
14012 # ensure each MDS's gc threads are still present and all in "R"
14013 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
14014 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
14015 error "$i: expected $nb GC-thread"
14017 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
14019 error "$i: GC-thread not found in R-state"
14020 # check umounts of each MDT on MDS have reached kthread_stop()
14021 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
14022 error "$i: expected $nb umount"
14024 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
14025 error "$i: umount not found in D-state"
14028 # release all GC-threads
14029 do_nodes $mdts $LCTL set_param fail_loc=0
14031 # wait for MDT stop to complete
14032 for i in $(seq $MDSCOUNT); do
14033 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
14037 # may try to check if any orphan changelog records are present
14038 # via ldiskfs/zfs and llog_reader...
14040 # re-start/mount MDTs
14041 for i in $(seq $MDSCOUNT); do
14042 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
14043 error "Fail to start mds$i"
14047 for i in $(seq $MDSCOUNT); do
14048 # check cl_user1 still registered
14049 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
14050 error "mds$i: User ${cl_user1[mds$i]} not registered"
14051 # check cl_user2 unregistered
14052 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
14053 error "mds$i: User ${cl_user2[mds$i]} still registered"
14055 # check changelogs are present and starting at $user_rec1 + 1
14056 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
14057 [ -n "$user_rec1" ] ||
14058 error "mds$i: User ${cl_user1[mds$i]} not registered"
14059 first_rec=$($LFS changelog $(facet_svc mds$i) |
14060 awk '{ print $1; exit; }')
14062 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
14063 [ $((user_rec1 + 1)) == $first_rec ] ||
14064 error "mds$i: first index should be $user_rec1 + 1, " \
14065 "but is $first_rec"
14068 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
14073 local mdts=$(comma_list $(mdts_nodes))
14075 changelog_register || error "first changelog_register failed"
14077 # generate some changelog records to accumulate on each MDT
14078 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
14079 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
14080 error "create $DIR/$tdir/$tfile failed"
14082 # check changelogs have been generated
14083 local nbcl=$(changelog_dump | wc -l)
14084 [[ $nbcl -eq 0 ]] && error "no changelogs found"
14086 # simulate race between register and unregister
14087 # XXX as fail_loc is set per-MDS, with DNE configs the race
14088 # simulation will only occur for one MDT per MDS and for the
14089 # others the normal race scenario will take place
14090 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
14091 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
14092 do_nodes $mdts $LCTL set_param fail_val=1
14094 # unregister 1st user
14095 changelog_deregister &
14097 # wait some time for deregister work to reach race rdv
14099 # register 2nd user
14100 changelog_register || error "2nd user register failed"
14102 wait $pid1 || error "1st user deregister failed"
14106 declare -A LAST_REC
14107 for i in $(seq $MDSCOUNT); do
14108 if changelog_users mds$i | grep "^cl"; then
14109 # make sure new records are added with one user present
14110 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
14111 awk '/^current.index:/ { print $NF }')
14113 error "mds$i has no user registered"
14117 # generate more changelog records to accumulate on each MDT
14118 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
14119 error "create $DIR/$tdir/${tfile}bis failed"
14121 for i in $(seq $MDSCOUNT); do
14122 last_rec=$(changelog_users $SINGLEMDS |
14123 awk '/^current.index:/ { print $NF }')
14124 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
14125 [ $last_rec != ${LAST_REC[mds$i]} ] ||
14126 error "changelogs are off on mds$i"
14129 run_test 160i "changelog user register/unregister race"
14132 remote_mds_nodsh && skip "remote MDS with nodsh"
14133 [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] &&
14134 skip "Need MDS version at least 2.12.56"
14136 mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
14138 changelog_register || error "first changelog_register failed"
14140 # generate some changelog
14141 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
14142 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
14143 error "create $DIR/$tdir/${tfile}bis failed"
14145 # open the changelog device
14146 exec 3>/dev/changelog-$FSNAME-MDT0000
14147 exec 4</dev/changelog-$FSNAME-MDT0000
14149 # umount the first lustre mount
14153 cat <&4 >/dev/null || error "read changelog failed"
14156 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
14157 changelog_users $SINGLEMDS | grep -q $cl_user ||
14158 error "User $cl_user not found in changelog_users"
14160 printf 'clear:'$cl_user':0' >&3
14167 changelog_deregister || error "changelog_deregister failed"
14170 mount_client $MOUNT || error "mount_client on $MOUNT failed"
14172 run_test 160j "client can be umounted while its chanangelog is being used"
14175 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14176 remote_mds_nodsh && skip "remote MDS with nodsh"
14178 mkdir -p $DIR/$tdir/1/1
14180 changelog_register || error "changelog_register failed"
14181 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
14183 changelog_users $SINGLEMDS | grep -q $cl_user ||
14184 error "User '$cl_user' not found in changelog_users"
14185 #define OBD_FAIL_MDS_CHANGELOG_REORDER 0x15d
14186 do_facet mds1 $LCTL set_param fail_loc=0x8000015d fail_val=3
14187 rmdir $DIR/$tdir/1/1 & sleep 1
14189 touch $DIR/$tdir/2/2
14190 rm -rf $DIR/$tdir/2
14195 changelog_dump | grep rmdir || error "rmdir not recorded"
14198 changelog_deregister
14200 run_test 160k "Verify that changelog records are not lost"
14203 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14205 test_mkdir -c1 $DIR/$tdir
14206 cp /etc/hosts $DIR/$tdir/$tfile
14207 test_mkdir -c1 $DIR/$tdir/foo1
14208 test_mkdir -c1 $DIR/$tdir/foo2
14209 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
14210 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
14211 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
14212 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
14213 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
14214 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
14215 $LFS fid2path $DIR $FID
14216 error "bad link ea"
14219 rm $DIR/$tdir/foo2/zachary
14221 rm $DIR/$tdir/foo2/thor
14223 rm $DIR/$tdir/$tfile
14225 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
14226 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
14227 { $LFS fid2path $DIR $FID; error "bad link rename"; }
14228 rm $DIR/$tdir/foo2/maggie
14231 local longname=$tfile.avg_len_is_thirty_two_
14232 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
14233 error_noexit 'failed to unlink many hardlinks'" EXIT
14234 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
14235 error "failed to hardlink many files"
14236 links=$($LFS fid2path $DIR $FID | wc -l)
14237 echo -n "${links}/1000 links in link EA"
14238 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
14240 run_test 161a "link ea sanity"
14243 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14244 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
14247 local remote_dir=$DIR/$tdir/remote_dir
14249 mkdir -p $DIR/$tdir
14250 $LFS mkdir -i $MDTIDX $remote_dir ||
14251 error "create remote directory failed"
14253 cp /etc/hosts $remote_dir/$tfile
14254 mkdir -p $remote_dir/foo1
14255 mkdir -p $remote_dir/foo2
14256 ln $remote_dir/$tfile $remote_dir/foo1/sofia
14257 ln $remote_dir/$tfile $remote_dir/foo2/zachary
14258 ln $remote_dir/$tfile $remote_dir/foo1/luna
14259 ln $remote_dir/$tfile $remote_dir/foo2/thor
14261 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
14263 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
14264 $LFS fid2path $DIR $FID
14265 error "bad link ea"
14268 rm $remote_dir/foo2/zachary
14270 rm $remote_dir/foo2/thor
14272 rm $remote_dir/$tfile
14274 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
14275 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
14276 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
14277 $LFS fid2path $DIR $FID
14278 error "bad link rename"
14280 rm $remote_dir/foo2/maggie
14283 local longname=filename_avg_len_is_thirty_two_
14284 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
14285 error "failed to hardlink many files"
14286 links=$($LFS fid2path $DIR $FID | wc -l)
14287 echo -n "${links}/1000 links in link EA"
14288 [[ ${links} -gt 60 ]] ||
14289 error "expected at least 60 links in link EA"
14290 unlinkmany $remote_dir/foo2/$longname 1000 ||
14291 error "failed to unlink many hardlinks"
14293 run_test 161b "link ea sanity under remote directory"
14296 remote_mds_nodsh && skip "remote MDS with nodsh"
14297 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14298 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
14299 skip "Need MDS version at least 2.1.5"
14301 # define CLF_RENAME_LAST 0x0001
14302 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
14303 changelog_register || error "changelog_register failed"
14306 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
14307 touch $DIR/$tdir/foo_161c
14308 touch $DIR/$tdir/bar_161c
14309 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
14310 changelog_dump | grep RENME | tail -n 5
14311 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
14312 changelog_clear 0 || error "changelog_clear failed"
14313 if [ x$flags != "x0x1" ]; then
14314 error "flag $flags is not 0x1"
14317 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
14318 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
14319 touch $DIR/$tdir/foo_161c
14320 touch $DIR/$tdir/bar_161c
14321 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
14322 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
14323 changelog_dump | grep RENME | tail -n 5
14324 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
14325 changelog_clear 0 || error "changelog_clear failed"
14326 if [ x$flags != "x0x0" ]; then
14327 error "flag $flags is not 0x0"
14329 echo "rename overwrite a target having nlink > 1," \
14330 "changelog record has flags of $flags"
14332 # rename doesn't overwrite a target (changelog flag 0x0)
14333 touch $DIR/$tdir/foo_161c
14334 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
14335 changelog_dump | grep RENME | tail -n 5
14336 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
14337 changelog_clear 0 || error "changelog_clear failed"
14338 if [ x$flags != "x0x0" ]; then
14339 error "flag $flags is not 0x0"
14341 echo "rename doesn't overwrite a target," \
14342 "changelog record has flags of $flags"
14344 # define CLF_UNLINK_LAST 0x0001
14345 # unlink a file having nlink = 1 (changelog flag 0x1)
14346 rm -f $DIR/$tdir/foo2_161c
14347 changelog_dump | grep UNLNK | tail -n 5
14348 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
14349 changelog_clear 0 || error "changelog_clear failed"
14350 if [ x$flags != "x0x1" ]; then
14351 error "flag $flags is not 0x1"
14353 echo "unlink a file having nlink = 1," \
14354 "changelog record has flags of $flags"
14356 # unlink a file having nlink > 1 (changelog flag 0x0)
14357 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
14358 rm -f $DIR/$tdir/foobar_161c
14359 changelog_dump | grep UNLNK | tail -n 5
14360 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
14361 changelog_clear 0 || error "changelog_clear failed"
14362 if [ x$flags != "x0x0" ]; then
14363 error "flag $flags is not 0x0"
14365 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
14367 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
14370 remote_mds_nodsh && skip "remote MDS with nodsh"
14371 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
14376 changelog_register || error "changelog_register failed"
14378 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
14379 # interfer with $MOUNT/.lustre/fid/ access
14381 [[ $? -eq 0 ]] || error "mkdir failed"
14383 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
14384 $LCTL set_param fail_loc=0x8000140c
14386 $LCTL set_param fail_val=5
14389 echo foofoo > $DIR/$tdir/$tfile &
14392 # wait for create to be delayed
14396 [[ $? -eq 0 ]] || error "create should be blocked"
14398 local tempfile="$(mktemp --tmpdir $tfile.XXXXXX)"
14399 stack_trap "rm -f $tempfile"
14400 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
14401 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
14402 # some delay may occur during ChangeLog publishing and file read just
14403 # above, that could allow file write to happen finally
14404 [[ -s $tempfile ]] && echo "file should be empty"
14406 $LCTL set_param fail_loc=0
14409 [[ $? -eq 0 ]] || error "create failed"
14411 run_test 161d "create with concurrent .lustre/fid access"
14414 local expected="$1"
14419 path=$($LFS fid2path "$@")
14422 if [ $rc -ne 0 ]; then
14423 error "path looked up of '$expected' failed: rc=$rc"
14424 elif [ "$path" != "$expected" ]; then
14425 error "path looked up '$path' instead of '$expected'"
14427 echo "FID '$fid' resolves to path '$path' as expected"
14431 test_162a() { # was test_162
14432 test_mkdir -p -c1 $DIR/$tdir/d2
14433 touch $DIR/$tdir/d2/$tfile
14434 touch $DIR/$tdir/d2/x1
14435 touch $DIR/$tdir/d2/x2
14436 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
14437 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
14439 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
14440 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
14443 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
14444 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
14445 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
14447 # softlink to wrong file
14448 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
14449 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
14450 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
14453 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
14454 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
14455 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
14456 # fid2path dir/fsname should both work
14457 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
14458 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
14460 # hardlink count: check that there are 2 links
14461 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
14462 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
14464 # hardlink indexing: remove the first link
14465 rm $DIR/$tdir/d2/p/q/r/hlink
14466 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
14468 run_test 162a "path lookup sanity"
14471 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14472 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
14475 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
14476 error "create striped dir failed"
14478 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
14479 tail -n 1 | awk '{print $2}')
14480 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
14482 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
14483 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
14486 for ((i=0;i<5;i++)); do
14487 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
14488 error "get fid for f$i failed"
14489 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
14491 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
14492 error "get fid for d$i failed"
14493 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
14498 run_test 162b "striped directory path lookup sanity"
14500 # LU-4239: Verify fid2path works with paths 100 or more directories deep
14502 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
14503 skip "Need MDS version at least 2.7.51"
14505 local lpath=$tdir.local
14506 local rpath=$tdir.remote
14508 test_mkdir $DIR/$lpath
14509 test_mkdir $DIR/$rpath
14511 for ((i = 0; i <= 101; i++)); do
14514 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
14515 error "get fid for local directory $DIR/$lpath failed"
14516 check_path "$DIR/$lpath" $MOUNT $FID --link 0
14519 test_mkdir $DIR/$rpath
14520 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
14521 error "get fid for remote directory $DIR/$rpath failed"
14522 check_path "$DIR/$rpath" $MOUNT $FID --link 0
14527 run_test 162c "fid2path works with paths 100 or more directories deep"
14530 # do directio so as not to populate the page cache
14531 log "creating a 10 Mb file"
14532 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
14533 log "starting reads"
14534 dd if=$DIR/$tfile of=/dev/null bs=4096 &
14535 log "truncating the file"
14536 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
14538 kill %+ || true # reads might have finished
14539 echo "wait until dd is finished"
14541 log "removing the temporary file"
14542 rm -rf $DIR/$tfile || error "tmp file removal failed"
14544 run_test 169 "parallel read and truncate should not deadlock"
14547 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14549 $LCTL clear # bug 18514
14550 $LCTL debug_daemon start $TMP/${tfile}_log_good
14552 $LCTL debug_daemon stop
14553 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
14554 error "sed failed to read log_good"
14556 $LCTL debug_daemon start $TMP/${tfile}_log_good
14558 $LCTL debug_daemon stop
14560 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
14561 error "lctl df log_bad failed"
14563 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14564 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14566 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
14567 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
14569 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
14570 error "bad_line good_line1 good_line2 are empty"
14572 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14573 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
14574 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14576 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
14577 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14578 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14580 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
14581 error "bad_line_new good_line_new are empty"
14583 local expected_good=$((good_line1 + good_line2*2))
14585 rm -f $TMP/${tfile}*
14586 # LU-231, short malformed line may not be counted into bad lines
14587 if [ $bad_line -ne $bad_line_new ] &&
14588 [ $bad_line -ne $((bad_line_new - 1)) ]; then
14589 error "expected $bad_line bad lines, but got $bad_line_new"
14593 if [ $expected_good -ne $good_line_new ]; then
14594 error "expected $expected_good good lines, but got $good_line_new"
14599 run_test 170 "test lctl df to handle corrupted log ====================="
14601 test_171() { # bug20592
14602 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14604 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
14605 $LCTL set_param fail_loc=0x50e
14606 $LCTL set_param fail_val=3000
14607 multiop_bg_pause $DIR/$tfile O_s || true
14609 kill -USR1 $MULTIPID
14613 if dmesg | grep "recursive fault"; then
14614 error "caught a recursive fault"
14616 $LCTL set_param fail_loc=0
14619 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
14621 # it would be good to share it with obdfilter-survey/iokit-libecho code
14622 setup_obdecho_osc () {
14625 local obdfilter_name=$2
14626 echo "Creating new osc for $obdfilter_name on $ost_nid"
14627 # make sure we can find loopback nid
14628 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
14630 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
14631 ${obdfilter_name}_osc_UUID || rc=2; }
14632 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
14633 ${obdfilter_name}_UUID $ost_nid || rc=3; }
14637 cleanup_obdecho_osc () {
14638 local obdfilter_name=$1
14639 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
14640 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
14647 local pages=${3:-64}
14652 local obd_size=$(get_obd_size $node $OBD)
14653 local page_size=$(get_page_size $node)
14654 if [[ -n "$obd_size" ]]; then
14655 local new_count=$((obd_size / (pages * page_size / 1024)))
14656 [[ $new_count -ge $count ]] || count=$new_count
14659 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
14660 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
14662 if [ $rc -eq 0 ]; then
14663 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
14664 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
14666 echo "New object id is $id"
14667 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
14669 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
14670 "test_brw $count w v $pages $id" || rc=4; }
14671 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
14673 [ $rc -eq 0 ] || [ $rc -gt 2 ] &&
14674 { do_facet $node "$LCTL --device ec cleanup" || rc=5; }
14675 [ $rc -eq 0 ] || [ $rc -gt 1 ] &&
14676 { do_facet $node "$LCTL --device ec detach" || rc=6; }
14677 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
14682 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14684 if ! module_loaded obdecho; then
14685 load_module obdecho/obdecho &&
14686 stack_trap "rmmod obdecho" EXIT ||
14687 error "unable to load obdecho on client"
14690 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
14691 local host=$($LCTL get_param -n osc.$osc.import |
14692 awk '/current_connection:/ { print $2 }' )
14693 local target=$($LCTL get_param -n osc.$osc.import |
14694 awk '/target:/ { print $2 }' )
14695 target=${target%_UUID}
14697 if [ -n "$target" ]; then
14698 setup_obdecho_osc $host $target &&
14699 stack_trap "cleanup_obdecho_osc $target" EXIT ||
14700 { error "obdecho setup failed with $?"; return; }
14702 obdecho_test ${target}_osc client ||
14703 error "obdecho_test failed on ${target}_osc"
14705 $LCTL get_param osc.$osc.import
14706 error "there is no osc.$osc.import target"
14709 run_test 180a "test obdecho on osc"
14712 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14713 remote_ost_nodsh && skip "remote OST with nodsh"
14715 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14716 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14717 error "failed to load module obdecho"
14719 local target=$(do_facet ost1 $LCTL dl |
14720 awk '/obdfilter/ { print $4; exit; }')
14722 if [ -n "$target" ]; then
14723 obdecho_test $target ost1 || error "obdecho_test failed with $?"
14725 do_facet ost1 $LCTL dl
14726 error "there is no obdfilter target on ost1"
14729 run_test 180b "test obdecho directly on obdfilter"
14731 test_180c() { # LU-2598
14732 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14733 remote_ost_nodsh && skip "remote OST with nodsh"
14734 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
14735 skip "Need MDS version at least 2.4.0"
14737 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14738 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14739 error "failed to load module obdecho"
14741 local target=$(do_facet ost1 $LCTL dl |
14742 awk '/obdfilter/ { print $4; exit; }')
14744 if [ -n "$target" ]; then
14745 local pages=16384 # 64MB bulk I/O RPC size
14747 obdecho_test "$target" ost1 "$pages" ||
14748 error "obdecho_test with pages=$pages failed with $?"
14750 do_facet ost1 $LCTL dl
14751 error "there is no obdfilter target on ost1"
14754 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
14756 test_181() { # bug 22177
14757 test_mkdir $DIR/$tdir
14758 # create enough files to index the directory
14759 createmany -o $DIR/$tdir/foobar 4000
14760 # print attributes for debug purpose
14763 multiop_bg_pause $DIR/$tdir D_Sc || return 1
14765 # remove the files & current working dir
14766 unlinkmany $DIR/$tdir/foobar 4000
14768 kill -USR1 $MULTIPID
14770 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
14773 run_test 181 "Test open-unlinked dir ========================"
14779 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14781 $LCTL set_param mdc.*.rpc_stats=clear
14783 for (( i = 0; i < $tcount; i++ )) ; do
14784 mkdir $DIR/$tdir/$i
14787 for (( i = 0; i < $tcount; i++ )) ; do
14788 createmany -o $DIR/$tdir/$i/f- $fcount &
14792 for (( i = 0; i < $tcount; i++ )) ; do
14793 unlinkmany $DIR/$tdir/$i/f- $fcount &
14797 $LCTL get_param mdc.*.rpc_stats
14801 run_test 182 "Test parallel modify metadata operations ================"
14803 test_183() { # LU-2275
14804 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14805 remote_mds_nodsh && skip "remote MDS with nodsh"
14806 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
14807 skip "Need MDS version at least 2.3.56"
14809 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14810 echo aaa > $DIR/$tdir/$tfile
14812 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
14813 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
14815 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
14816 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
14818 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
14820 # Flush negative dentry cache
14821 touch $DIR/$tdir/$tfile
14823 # We are not checking for any leaked references here, they'll
14824 # become evident next time we do cleanup with module unload.
14827 run_test 183 "No crash or request leak in case of strange dispositions ========"
14829 # test suite 184 is for LU-2016, LU-2017
14831 check_swap_layouts_support
14833 dir0=$DIR/$tdir/$testnum
14834 test_mkdir -p -c1 $dir0
14839 $LFS setstripe -c1 $file1
14841 $LFS setstripe -c2 $file2
14843 gen1=$($LFS getstripe -g $file1)
14844 gen2=$($LFS getstripe -g $file2)
14846 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
14847 gen=$($LFS getstripe -g $file1)
14848 [[ $gen1 != $gen ]] ||
14849 "Layout generation on $file1 does not change"
14850 gen=$($LFS getstripe -g $file2)
14851 [[ $gen2 != $gen ]] ||
14852 "Layout generation on $file2 does not change"
14854 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
14855 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
14857 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
14859 run_test 184a "Basic layout swap"
14862 check_swap_layouts_support
14864 dir0=$DIR/$tdir/$testnum
14865 mkdir -p $dir0 || error "creating dir $dir0"
14872 $LFS setstripe -c1 $file1
14873 $LFS setstripe -c2 $file2
14874 $LFS setstripe -c1 $file3
14875 chown $RUNAS_ID $file3
14876 gen1=$($LFS getstripe -g $file1)
14877 gen2=$($LFS getstripe -g $file2)
14879 $LFS swap_layouts $dir1 $dir2 &&
14880 error "swap of directories layouts should fail"
14881 $LFS swap_layouts $dir1 $file1 &&
14882 error "swap of directory and file layouts should fail"
14883 $RUNAS $LFS swap_layouts $file1 $file2 &&
14884 error "swap of file we cannot write should fail"
14885 $LFS swap_layouts $file1 $file3 &&
14886 error "swap of file with different owner should fail"
14887 /bin/true # to clear error code
14889 run_test 184b "Forbidden layout swap (will generate errors)"
14892 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14893 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14894 check_swap_layouts_support
14896 local dir0=$DIR/$tdir/$testnum
14897 mkdir -p $dir0 || error "creating dir $dir0"
14899 local ref1=$dir0/ref1
14900 local ref2=$dir0/ref2
14901 local file1=$dir0/file1
14902 local file2=$dir0/file2
14903 # create a file large enough for the concurrent test
14904 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14905 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14906 echo "ref file size: ref1($(stat -c %s $ref1))," \
14907 "ref2($(stat -c %s $ref2))"
14910 dd if=$ref1 of=$file1 bs=16k &
14913 # Make sure dd starts to copy file
14914 while [ ! -f $file1 ]; do sleep 0.1; done
14916 $LFS swap_layouts $file1 $file2
14919 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14920 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14922 # how many bytes copied before swapping layout
14923 local copied=$(stat -c %s $file2)
14924 local remaining=$(stat -c %s $ref1)
14925 remaining=$((remaining - copied))
14926 echo "Copied $copied bytes before swapping layout..."
14928 cmp -n $copied $file1 $ref2 | grep differ &&
14929 error "Content mismatch [0, $copied) of ref2 and file1"
14930 cmp -n $copied $file2 $ref1 ||
14931 error "Content mismatch [0, $copied) of ref1 and file2"
14932 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14933 error "Content mismatch [$copied, EOF) of ref1 and file1"
14936 rm -f $ref1 $ref2 $file1 $file2
14938 run_test 184c "Concurrent write and layout swap"
14941 check_swap_layouts_support
14942 [ -z "$(which getfattr 2>/dev/null)" ] &&
14943 skip_env "no getfattr command"
14945 local file1=$DIR/$tdir/$tfile-1
14946 local file2=$DIR/$tdir/$tfile-2
14947 local file3=$DIR/$tdir/$tfile-3
14951 mkdir -p $DIR/$tdir
14952 touch $file1 || error "create $file1 failed"
14953 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14954 error "create $file2 failed"
14955 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14956 error "create $file3 failed"
14957 lovea1=$(get_layout_param $file1)
14959 $LFS swap_layouts $file2 $file3 ||
14960 error "swap $file2 $file3 layouts failed"
14961 $LFS swap_layouts $file1 $file2 ||
14962 error "swap $file1 $file2 layouts failed"
14964 lovea2=$(get_layout_param $file2)
14967 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14969 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14970 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14972 run_test 184d "allow stripeless layouts swap"
14975 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14976 skip "Need MDS version at least 2.6.94"
14977 check_swap_layouts_support
14978 [ -z "$(which getfattr 2>/dev/null)" ] &&
14979 skip_env "no getfattr command"
14981 local file1=$DIR/$tdir/$tfile-1
14982 local file2=$DIR/$tdir/$tfile-2
14983 local file3=$DIR/$tdir/$tfile-3
14986 mkdir -p $DIR/$tdir
14987 touch $file1 || error "create $file1 failed"
14988 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14989 error "create $file2 failed"
14990 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14991 error "create $file3 failed"
14993 $LFS swap_layouts $file1 $file2 ||
14994 error "swap $file1 $file2 layouts failed"
14996 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14997 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14999 echo 123 > $file1 || error "Should be able to write into $file1"
15001 $LFS swap_layouts $file1 $file3 ||
15002 error "swap $file1 $file3 layouts failed"
15004 echo 123 > $file1 || error "Should be able to write into $file1"
15006 rm -rf $file1 $file2 $file3
15008 run_test 184e "Recreate layout after stripeless layout swaps"
15011 # Create a file with name longer than sizeof(struct stat) ==
15012 # 144 to see if we can get chars from the file name to appear
15013 # in the returned striping. Note that 'f' == 0x66.
15014 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
15016 mkdir -p $DIR/$tdir
15017 mcreate $DIR/$tdir/$file
15018 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
15019 error "IOC_MDC_GETFILEINFO returned garbage striping"
15022 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
15024 test_185() { # LU-2441
15025 # LU-3553 - no volatile file support in old servers
15026 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
15027 skip "Need MDS version at least 2.3.60"
15029 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
15030 touch $DIR/$tdir/spoo
15031 local mtime1=$(stat -c "%Y" $DIR/$tdir)
15032 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
15033 error "cannot create/write a volatile file"
15034 [ "$FILESET" == "" ] &&
15035 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
15036 error "FID is still valid after close"
15038 multiop_bg_pause $DIR/$tdir vVw4096_c
15045 # assume that the next FID for this client is sequential, since stdout
15046 # is unfortunately eaten by multiop_bg_pause
15047 local n=$((${fidv[1]} + 1))
15048 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
15049 if [ "$FILESET" == "" ]; then
15050 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
15051 error "FID is missing before close"
15053 kill -USR1 $multi_pid
15054 # 1 second delay, so if mtime change we will see it
15056 local mtime2=$(stat -c "%Y" $DIR/$tdir)
15057 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
15059 run_test 185 "Volatile file support"
15061 function create_check_volatile() {
15065 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
15068 local FID=$(cat /tmp/${tfile}.fid)
15069 [ "$FID" == "" ] && error "can't get FID for volatile"
15070 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
15071 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
15072 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
15076 cancel_lru_locks mdc # flush opencache
15077 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
15082 # LU-12516 - volatile creation via .lustre
15083 [[ $MDS1_VERSION -ge $(version_code 2.12.55) ]] ||
15084 skip "Need MDS version at least 2.3.55"
15086 create_check_volatile 0
15087 [ $MDSCOUNT -lt 2 ] && return 0
15090 create_check_volatile 1
15094 run_test 185a "Volatile file creation in .lustre/fid/"
15097 remote_mds_nodsh && skip "remote MDS with nodsh"
15098 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
15099 skip "Need MDS version at least 2.3.0"
15101 local dir0=$DIR/$tdir/$testnum
15102 mkdir -p $dir0 || error "creating dir $dir0"
15104 local file=$dir0/file1
15105 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
15106 local dv1=$($LFS data_version $file)
15107 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
15108 local dv2=$($LFS data_version $file)
15109 [[ $dv1 != $dv2 ]] ||
15110 error "data version did not change on write $dv1 == $dv2"
15115 run_test 187a "Test data version change"
15118 remote_mds_nodsh && skip "remote MDS with nodsh"
15119 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
15120 skip "Need MDS version at least 2.3.0"
15122 local dir0=$DIR/$tdir/$testnum
15123 mkdir -p $dir0 || error "creating dir $dir0"
15125 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
15126 [[ ${DV[0]} != ${DV[1]} ]] ||
15127 error "data version did not change on write"\
15128 " ${DV[0]} == ${DV[1]}"
15133 run_test 187b "Test data version change on volatile file"
15136 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15137 remote_mgs_nodsh && skip "remote MGS with nodsh"
15138 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
15140 local POOL=${POOL:-cea1}
15141 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
15142 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
15145 local last_ost=$(($OSTCOUNT - 1))
15147 local ost_list=$(seq $first_ost $ost_step $last_ost)
15148 local ost_range="$first_ost $last_ost $ost_step"
15149 local test_path=$POOL_ROOT/$POOL_DIR_NAME
15150 local file_dir=$POOL_ROOT/file_tst
15151 local subdir=$test_path/subdir
15155 # former test_200a test_200b
15156 pool_add $POOL || { rc=$? ; break; }
15157 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
15158 # former test_200c test_200d
15159 mkdir -p $test_path
15160 pool_set_dir $POOL $test_path || { rc=$? ; break; }
15161 pool_check_dir $POOL $test_path || { rc=$? ; break; }
15163 pool_check_dir $POOL $subdir || { rc=$? ; break; }
15164 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
15165 || { rc=$? ; break; }
15166 # former test_200e test_200f
15167 local files=$((OSTCOUNT*3))
15168 pool_alloc_files $POOL $test_path $files "$ost_list" \
15169 || { rc=$? ; break; }
15170 pool_create_files $POOL $file_dir $files "$ost_list" \
15171 || { rc=$? ; break; }
15172 # former test_200g test_200h
15173 pool_lfs_df $POOL || { rc=$? ; break; }
15174 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
15176 # former test_201a test_201b test_201c
15177 pool_remove_first_target $POOL || { rc=$? ; break; }
15179 local f=$test_path/$tfile
15180 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
15181 pool_remove $POOL $f || { rc=$? ; break; }
15189 run_test 200 "OST pools"
15191 # usage: default_attr <count | size | offset>
15193 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
15196 # usage: check_default_stripe_attr
15197 check_default_stripe_attr() {
15198 ACTUAL=$($LFS getstripe $* $DIR/$tdir)
15201 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
15203 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
15207 error "unknown getstripe attr '$1'"
15210 [ $ACTUAL == $EXPECTED ] ||
15211 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
15215 test_mkdir $DIR/$tdir
15216 $LFS setstripe --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
15218 check_default_stripe_attr --stripe-count
15219 check_default_stripe_attr --stripe-size
15220 check_default_stripe_attr --stripe-index
15222 run_test 204a "Print default stripe attributes"
15225 test_mkdir $DIR/$tdir
15226 $LFS setstripe --stripe-count 1 $DIR/$tdir
15228 check_default_stripe_attr --stripe-size
15229 check_default_stripe_attr --stripe-index
15231 run_test 204b "Print default stripe size and offset"
15234 test_mkdir $DIR/$tdir
15235 $LFS setstripe --stripe-size 65536 $DIR/$tdir
15237 check_default_stripe_attr --stripe-count
15238 check_default_stripe_attr --stripe-index
15240 run_test 204c "Print default stripe count and offset"
15243 test_mkdir $DIR/$tdir
15244 $LFS setstripe --stripe-index 0 $DIR/$tdir
15246 check_default_stripe_attr --stripe-count
15247 check_default_stripe_attr --stripe-size
15249 run_test 204d "Print default stripe count and size"
15252 test_mkdir $DIR/$tdir
15253 $LFS setstripe -d $DIR/$tdir
15255 check_default_stripe_attr --stripe-count --raw
15256 check_default_stripe_attr --stripe-size --raw
15257 check_default_stripe_attr --stripe-index --raw
15259 run_test 204e "Print raw stripe attributes"
15262 test_mkdir $DIR/$tdir
15263 $LFS setstripe --stripe-count 1 $DIR/$tdir
15265 check_default_stripe_attr --stripe-size --raw
15266 check_default_stripe_attr --stripe-index --raw
15268 run_test 204f "Print raw stripe size and offset"
15271 test_mkdir $DIR/$tdir
15272 $LFS setstripe --stripe-size 65536 $DIR/$tdir
15274 check_default_stripe_attr --stripe-count --raw
15275 check_default_stripe_attr --stripe-index --raw
15277 run_test 204g "Print raw stripe count and offset"
15280 test_mkdir $DIR/$tdir
15281 $LFS setstripe --stripe-index 0 $DIR/$tdir
15283 check_default_stripe_attr --stripe-count --raw
15284 check_default_stripe_attr --stripe-size --raw
15286 run_test 204h "Print raw stripe count and size"
15288 # Figure out which job scheduler is being used, if any,
15289 # or use a fake one
15290 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
15291 JOBENV=SLURM_JOB_ID
15292 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
15294 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
15296 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
15297 JOBENV=LOADL_STEP_ID
15298 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
15301 $LCTL list_param jobid_name > /dev/null 2>&1
15302 if [ $? -eq 0 ]; then
15308 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
15310 verify_jobstats() {
15315 # we don't really need to clear the stats for this test to work, since each
15316 # command has a unique jobid, but it makes debugging easier if needed.
15317 # for facet in $facets; do
15318 # local dev=$(convert_facet2label $facet)
15319 # # clear old jobstats
15320 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
15323 # use a new JobID for each test, or we might see an old one
15324 [ "$JOBENV" = "FAKE_JOBID" ] &&
15325 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
15327 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
15329 [ "$JOBENV" = "nodelocal" ] && {
15330 FAKE_JOBID=id.$testnum.%e.$RANDOM
15331 $LCTL set_param jobid_name=$FAKE_JOBID
15332 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
15335 log "Test: ${cmd[*]}"
15336 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
15338 if [ $JOBENV = "FAKE_JOBID" ]; then
15339 FAKE_JOBID=$JOBVAL ${cmd[*]}
15344 # all files are created on OST0000
15345 for facet in $facets; do
15346 local stats="*.$(convert_facet2label $facet).job_stats"
15348 # strip out libtool wrappers for in-tree executables
15349 if [ $(do_facet $facet lctl get_param $stats |
15350 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
15351 do_facet $facet lctl get_param $stats
15352 error "No jobstats for $JOBVAL found on $facet::$stats"
15358 local new_jobenv=$1
15360 set_persistent_param_and_check client "jobid_var" \
15361 "$FSNAME.sys.jobid_var" $new_jobenv
15364 test_205() { # Job stats
15365 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15366 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
15367 skip "Need MDS version with at least 2.7.1"
15368 remote_mgs_nodsh && skip "remote MGS with nodsh"
15369 remote_mds_nodsh && skip "remote MDS with nodsh"
15370 remote_ost_nodsh && skip "remote OST with nodsh"
15371 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
15372 skip "Server doesn't support jobstats"
15373 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
15375 local old_jobenv=$($LCTL get_param -n jobid_var)
15376 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
15378 if [[ $PERM_CMD == *"set_param -P"* ]]; then
15379 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
15381 stack_trap "do_facet mgs $PERM_CMD \
15382 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
15386 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
15387 mdt.*.job_cleanup_interval | head -n 1)
15388 local new_interval=5
15389 do_facet $SINGLEMDS \
15390 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
15391 stack_trap "do_facet $SINGLEMDS \
15392 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
15393 local start=$SECONDS
15397 cmd="mkdir $DIR/$tdir"
15398 verify_jobstats "$cmd" "$SINGLEMDS"
15400 cmd="rmdir $DIR/$tdir"
15401 verify_jobstats "$cmd" "$SINGLEMDS"
15402 # mkdir on secondary MDT
15403 if [ $MDSCOUNT -gt 1 ]; then
15404 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
15405 verify_jobstats "$cmd" "mds2"
15408 cmd="mknod $DIR/$tfile c 1 3"
15409 verify_jobstats "$cmd" "$SINGLEMDS"
15411 cmd="rm -f $DIR/$tfile"
15412 verify_jobstats "$cmd" "$SINGLEMDS"
15413 # create all files on OST0000 so verify_jobstats can find OST stats
15415 cmd="$LFS setstripe -i 0 -c 1 $DIR/$tfile"
15416 verify_jobstats "$cmd" "$SINGLEMDS"
15418 cmd="touch $DIR/$tfile"
15419 verify_jobstats "$cmd" "$SINGLEMDS ost1"
15421 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
15422 verify_jobstats "$cmd" "ost1"
15424 cancel_lru_locks osc
15425 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
15426 verify_jobstats "$cmd" "ost1"
15428 cmd="$TRUNCATE $DIR/$tfile 0"
15429 verify_jobstats "$cmd" "$SINGLEMDS ost1"
15431 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
15432 verify_jobstats "$cmd" "$SINGLEMDS"
15433 # jobstats expiry - sleep until old stats should be expired
15434 local left=$((new_interval + 5 - (SECONDS - start)))
15435 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
15436 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
15438 cmd="mkdir $DIR/$tdir.expire"
15439 verify_jobstats "$cmd" "$SINGLEMDS"
15440 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
15441 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
15443 # Ensure that jobid are present in changelog (if supported by MDS)
15444 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
15445 changelog_dump | tail -10
15446 jobids=$(changelog_dump | tail -9 | grep -c "j=")
15447 [ $jobids -eq 9 ] ||
15448 error "Wrong changelog jobid count $jobids != 9"
15452 jobstats_set $JOBENV
15454 changelog_dump | grep $tfile
15455 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
15456 [ $jobids -eq 0 ] ||
15457 error "Unexpected jobids when jobid_var=$JOBENV"
15460 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
15461 JOBENV="JOBCOMPLEX"
15462 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
15464 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
15466 run_test 205 "Verify job stats"
15468 # LU-1480, LU-1773 and LU-1657
15470 mkdir -p $DIR/$tdir
15471 $LFS setstripe -c -1 $DIR/$tdir
15472 #define OBD_FAIL_LOV_INIT 0x1403
15473 $LCTL set_param fail_loc=0xa0001403
15474 $LCTL set_param fail_val=1
15475 touch $DIR/$tdir/$tfile || true
15477 run_test 206 "fail lov_init_raid0() doesn't lbug"
15480 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15481 local fsz=`stat -c %s $DIR/$tfile`
15482 cancel_lru_locks mdc
15484 # do not return layout in getattr intent
15485 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
15486 $LCTL set_param fail_loc=0x170
15487 local sz=`stat -c %s $DIR/$tfile`
15489 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
15493 run_test 207a "can refresh layout at glimpse"
15496 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15497 local cksum=`md5sum $DIR/$tfile`
15498 local fsz=`stat -c %s $DIR/$tfile`
15499 cancel_lru_locks mdc
15500 cancel_lru_locks osc
15502 # do not return layout in getattr intent
15503 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
15504 $LCTL set_param fail_loc=0x171
15506 # it will refresh layout after the file is opened but before read issues
15507 echo checksum is "$cksum"
15508 echo "$cksum" |md5sum -c --quiet || error "file differs"
15512 run_test 207b "can refresh layout at open"
15515 # FIXME: in this test suite, only RD lease is used. This is okay
15516 # for now as only exclusive open is supported. After generic lease
15517 # is done, this test suite should be revised. - Jinshan
15519 remote_mds_nodsh && skip "remote MDS with nodsh"
15520 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
15521 skip "Need MDS version at least 2.4.52"
15523 echo "==== test 1: verify get lease work"
15524 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
15526 echo "==== test 2: verify lease can be broken by upcoming open"
15527 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15531 $MULTIOP $DIR/$tfile oO_RDONLY:c
15532 kill -USR1 $PID && wait $PID || error "break lease error"
15534 echo "==== test 3: verify lease can't be granted if an open already exists"
15535 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
15539 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
15540 kill -USR1 $PID && wait $PID || error "open file error"
15542 echo "==== test 4: lease can sustain over recovery"
15543 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
15549 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
15551 echo "==== test 5: lease broken can't be regained by replay"
15552 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15556 # open file to break lease and then recovery
15557 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
15560 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
15564 run_test 208 "Exclusive open"
15567 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
15568 skip_env "must have disp_stripe"
15571 sync; sleep 5; sync;
15573 echo 3 > /proc/sys/vm/drop_caches
15574 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15576 # open/close 500 times
15577 for i in $(seq 500); do
15581 echo 3 > /proc/sys/vm/drop_caches
15582 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15584 echo "before: $req_before, after: $req_after"
15585 [ $((req_after - req_before)) -ge 300 ] &&
15586 error "open/close requests are not freed"
15589 run_test 209 "read-only open/close requests should be freed promptly"
15593 size=$((size % 8192 + 1))
15594 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
15595 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
15596 rm -f $DIR/f212 $DIR/f212.xyz
15598 run_test 212 "Sendfile test ============================================"
15601 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
15602 cancel_lru_locks osc
15603 lctl set_param fail_loc=0x8000040f
15604 # generate a read lock
15605 cat $DIR/$tfile > /dev/null
15606 # write to the file, it will try to cancel the above read lock.
15607 cat /etc/hosts >> $DIR/$tfile
15609 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
15611 test_214() { # for bug 20133
15612 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
15613 for (( i=0; i < 340; i++ )) ; do
15614 touch $DIR/$tdir/d214c/a$i
15617 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
15618 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
15619 ls $DIR/d214c || error "ls $DIR/d214c failed"
15620 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
15621 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
15623 run_test 214 "hash-indexed directory test - bug 20133"
15625 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
15626 create_lnet_proc_files() {
15627 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
15630 # counterpart of create_lnet_proc_files
15631 remove_lnet_proc_files() {
15632 rm -f $TMP/lnet_$1.sys
15635 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15636 # 3rd arg as regexp for body
15637 check_lnet_proc_stats() {
15638 local l=$(cat "$TMP/lnet_$1" |wc -l)
15639 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
15641 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
15644 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15645 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
15646 # optional and can be regexp for 2nd line (lnet.routes case)
15647 check_lnet_proc_entry() {
15648 local blp=2 # blp stands for 'position of 1st line of body'
15649 [ -z "$5" ] || blp=3 # lnet.routes case
15651 local l=$(cat "$TMP/lnet_$1" |wc -l)
15652 # subtracting one from $blp because the body can be empty
15653 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
15655 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
15656 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
15658 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
15659 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
15661 # bail out if any unexpected line happened
15662 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
15663 [ "$?" != 0 ] || error "$2 misformatted"
15666 test_215() { # for bugs 18102, 21079, 21517
15667 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15669 local N='(0|[1-9][0-9]*)' # non-negative numeric
15670 local P='[1-9][0-9]*' # positive numeric
15671 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
15672 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
15673 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
15674 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
15676 local L1 # regexp for 1st line
15677 local L2 # regexp for 2nd line (optional)
15678 local BR # regexp for the rest (body)
15680 # lnet.stats should look as 11 space-separated non-negative numerics
15681 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
15682 create_lnet_proc_files "stats"
15683 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
15684 remove_lnet_proc_files "stats"
15686 # lnet.routes should look like this:
15687 # Routing disabled/enabled
15688 # net hops priority state router
15689 # where net is a string like tcp0, hops > 0, priority >= 0,
15690 # state is up/down,
15691 # router is a string like 192.168.1.1@tcp2
15692 L1="^Routing (disabled|enabled)$"
15693 L2="^net +hops +priority +state +router$"
15694 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
15695 create_lnet_proc_files "routes"
15696 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
15697 remove_lnet_proc_files "routes"
15699 # lnet.routers should look like this:
15700 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
15701 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
15702 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
15703 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
15704 L1="^ref +rtr_ref +alive +router$"
15705 BR="^$P +$P +(up|down) +$NID$"
15706 create_lnet_proc_files "routers"
15707 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
15708 remove_lnet_proc_files "routers"
15710 # lnet.peers should look like this:
15711 # nid refs state last max rtr min tx min queue
15712 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
15713 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
15714 # numeric (0 or >0 or <0), queue >= 0.
15715 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
15716 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
15717 create_lnet_proc_files "peers"
15718 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
15719 remove_lnet_proc_files "peers"
15721 # lnet.buffers should look like this:
15722 # pages count credits min
15723 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
15724 L1="^pages +count +credits +min$"
15725 BR="^ +$N +$N +$I +$I$"
15726 create_lnet_proc_files "buffers"
15727 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
15728 remove_lnet_proc_files "buffers"
15730 # lnet.nis should look like this:
15731 # nid status alive refs peer rtr max tx min
15732 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
15733 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
15734 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
15735 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
15736 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
15737 create_lnet_proc_files "nis"
15738 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
15739 remove_lnet_proc_files "nis"
15741 # can we successfully write to lnet.stats?
15742 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
15744 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
15746 test_216() { # bug 20317
15747 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15748 remote_ost_nodsh && skip "remote OST with nodsh"
15751 local facets=$(get_facets OST)
15752 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15754 save_lustre_params client "osc.*.contention_seconds" > $p
15755 save_lustre_params $facets \
15756 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
15757 save_lustre_params $facets \
15758 "ldlm.namespaces.filter-*.contended_locks" >> $p
15759 save_lustre_params $facets \
15760 "ldlm.namespaces.filter-*.contention_seconds" >> $p
15761 clear_stats osc.*.osc_stats
15763 # agressive lockless i/o settings
15764 do_nodes $(comma_list $(osts_nodes)) \
15765 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
15766 ldlm.namespaces.filter-*.contended_locks=0 \
15767 ldlm.namespaces.filter-*.contention_seconds=60"
15768 lctl set_param -n osc.*.contention_seconds=60
15770 $DIRECTIO write $DIR/$tfile 0 10 4096
15771 $CHECKSTAT -s 40960 $DIR/$tfile
15773 # disable lockless i/o
15774 do_nodes $(comma_list $(osts_nodes)) \
15775 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
15776 ldlm.namespaces.filter-*.contended_locks=32 \
15777 ldlm.namespaces.filter-*.contention_seconds=0"
15778 lctl set_param -n osc.*.contention_seconds=0
15779 clear_stats osc.*.osc_stats
15781 dd if=/dev/zero of=$DIR/$tfile count=0
15782 $CHECKSTAT -s 0 $DIR/$tfile
15784 restore_lustre_params <$p
15788 run_test 216 "check lockless direct write updates file size and kms correctly"
15790 test_217() { # bug 22430
15791 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15796 for node in $(nodes_list); do
15797 nid=$(host_nids_address $node $NETTYPE)
15798 if [[ $nid = *-* ]] ; then
15799 echo "lctl ping $(h2nettype $nid)"
15800 lctl ping $(h2nettype $nid)
15802 echo "skipping $node (no hyphen detected)"
15806 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
15809 # do directio so as not to populate the page cache
15810 log "creating a 10 Mb file"
15811 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
15812 log "starting reads"
15813 dd if=$DIR/$tfile of=/dev/null bs=4096 &
15814 log "truncating the file"
15815 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
15817 kill %+ || true # reads might have finished
15818 echo "wait until dd is finished"
15820 log "removing the temporary file"
15821 rm -rf $DIR/$tfile || error "tmp file removal failed"
15823 run_test 218 "parallel read and truncate should not deadlock"
15826 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15828 # write one partial page
15829 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
15830 # set no grant so vvp_io_commit_write will do sync write
15831 $LCTL set_param fail_loc=0x411
15832 # write a full page at the end of file
15833 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
15835 $LCTL set_param fail_loc=0
15836 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
15837 $LCTL set_param fail_loc=0x411
15838 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
15841 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
15842 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
15844 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
15846 test_220() { #LU-325
15847 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15848 remote_ost_nodsh && skip "remote OST with nodsh"
15849 remote_mds_nodsh && skip "remote MDS with nodsh"
15850 remote_mgs_nodsh && skip "remote MGS with nodsh"
15854 # create on MDT0000 so the last_id and next_id are correct
15856 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
15860 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
15861 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
15862 osp.$mdtosc_proc1.prealloc_last_id)
15863 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15864 osp.$mdtosc_proc1.prealloc_next_id)
15868 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15869 #define OBD_FAIL_OST_ENOINO 0x229
15870 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15871 create_pool $FSNAME.$TESTNAME || return 1
15872 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15874 $LFS setstripe $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15876 MDSOBJS=$((last_id - next_id))
15877 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15879 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15880 echo "OST still has $count kbytes free"
15882 echo "create $MDSOBJS files @next_id..."
15883 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15885 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15886 osp.$mdtosc_proc1.prealloc_last_id)
15887 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15888 osp.$mdtosc_proc1.prealloc_next_id)
15890 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15895 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15896 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15898 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15899 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15900 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15901 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15902 echo "unlink $MDSOBJS files @$next_id..."
15903 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15905 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15908 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15910 dd if=`which date` of=$MOUNT/date oflag=sync
15911 chmod +x $MOUNT/date
15913 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15914 $LCTL set_param fail_loc=0x80001401
15916 $MOUNT/date > /dev/null
15919 run_test 221 "make sure fault and truncate race to not cause OOM"
15922 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15925 test_mkdir $DIR/$tdir
15926 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15927 createmany -o $DIR/$tdir/$tfile 10
15928 cancel_lru_locks mdc
15929 cancel_lru_locks osc
15930 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15931 $LCTL set_param fail_loc=0x31a
15932 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15933 $LCTL set_param fail_loc=0
15936 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15939 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15942 test_mkdir $DIR/$tdir
15943 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15944 createmany -o $DIR/$tdir/$tfile 10
15945 cancel_lru_locks mdc
15946 cancel_lru_locks osc
15947 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15948 $LCTL set_param fail_loc=0x31a
15949 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15950 $LCTL set_param fail_loc=0
15952 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15955 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15958 test_mkdir $DIR/$tdir
15959 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15960 createmany -o $DIR/$tdir/$tfile 10
15961 cancel_lru_locks mdc
15962 cancel_lru_locks osc
15963 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15964 $LCTL set_param fail_loc=0x31b
15965 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15966 $LCTL set_param fail_loc=0
15969 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15971 test_224a() { # LU-1039, MRP-303
15972 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15974 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15975 $LCTL set_param fail_loc=0x508
15976 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15977 $LCTL set_param fail_loc=0
15980 run_test 224a "Don't panic on bulk IO failure"
15982 test_224b() { # LU-1039, MRP-303
15983 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15985 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15986 cancel_lru_locks osc
15987 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15988 $LCTL set_param fail_loc=0x515
15989 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15990 $LCTL set_param fail_loc=0
15993 run_test 224b "Don't panic on bulk IO failure"
15995 test_224c() { # LU-6441
15996 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15997 remote_mds_nodsh && skip "remote MDS with nodsh"
15999 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
16000 save_writethrough $p
16001 set_cache writethrough on
16003 local pages_per_rpc=$($LCTL get_param \
16004 osc.*.max_pages_per_rpc)
16005 local at_max=$($LCTL get_param -n at_max)
16006 local timeout=$($LCTL get_param -n timeout)
16007 local test_at="at_max"
16008 local param_at="$FSNAME.sys.at_max"
16009 local test_timeout="timeout"
16010 local param_timeout="$FSNAME.sys.timeout"
16012 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
16014 set_persistent_param_and_check client "$test_at" "$param_at" 0
16015 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
16017 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
16018 do_facet ost1 "$LCTL set_param fail_loc=0x520"
16019 $LFS setstripe -c 1 -i 0 $DIR/$tfile
16020 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
16022 do_facet ost1 "$LCTL set_param fail_loc=0"
16024 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
16025 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
16028 $LCTL set_param -n $pages_per_rpc
16029 restore_lustre_params < $p
16032 run_test 224c "Don't hang if one of md lost during large bulk RPC"
16034 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
16036 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16037 if [ -z ${MDSSURVEY} ]; then
16038 skip_env "mds-survey not found"
16040 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
16041 skip "Need MDS version at least 2.2.51"
16043 local mds=$(facet_host $SINGLEMDS)
16044 local target=$(do_nodes $mds 'lctl dl' |
16045 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
16047 local cmd1="file_count=1000 thrhi=4"
16048 local cmd2="dir_count=2 layer=mdd stripe_count=0"
16049 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
16050 local cmd="$cmd1 $cmd2 $cmd3"
16052 rm -f ${TMP}/mds_survey*
16054 eval $cmd || error "mds-survey with zero-stripe failed"
16055 cat ${TMP}/mds_survey*
16056 rm -f ${TMP}/mds_survey*
16058 run_test 225a "Metadata survey sanity with zero-stripe"
16061 if [ -z ${MDSSURVEY} ]; then
16062 skip_env "mds-survey not found"
16064 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
16065 skip "Need MDS version at least 2.2.51"
16066 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16067 remote_mds_nodsh && skip "remote MDS with nodsh"
16068 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
16069 skip_env "Need to mount OST to test"
16072 local mds=$(facet_host $SINGLEMDS)
16073 local target=$(do_nodes $mds 'lctl dl' |
16074 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
16076 local cmd1="file_count=1000 thrhi=4"
16077 local cmd2="dir_count=2 layer=mdd stripe_count=1"
16078 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
16079 local cmd="$cmd1 $cmd2 $cmd3"
16081 rm -f ${TMP}/mds_survey*
16083 eval $cmd || error "mds-survey with stripe_count failed"
16084 cat ${TMP}/mds_survey*
16085 rm -f ${TMP}/mds_survey*
16087 run_test 225b "Metadata survey sanity with stripe_count = 1"
16089 mcreate_path2fid () {
16095 local path=$DIR/$tdir/$name
16100 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
16101 error "cannot create $desc"
16103 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
16105 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
16107 fid_path=$($LFS fid2path $MOUNT $fid)
16109 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
16111 [ "$path" == "$fid_path" ] ||
16112 error "fid2path returned $fid_path, expected $path"
16114 echo "pass with $path and $fid"
16119 mkdir -p $DIR/$tdir
16121 mcreate_path2fid 0010666 0 0 fifo "FIFO"
16122 mcreate_path2fid 0020666 1 3 null "character special file (null)"
16123 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
16124 mcreate_path2fid 0040666 0 0 dir "directory"
16125 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
16126 mcreate_path2fid 0100666 0 0 file "regular file"
16127 mcreate_path2fid 0120666 0 0 link "symbolic link"
16128 mcreate_path2fid 0140666 0 0 sock "socket"
16130 run_test 226a "call path2fid and fid2path on files of all type"
16133 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16138 mkdir -p $DIR/$tdir
16139 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
16140 error "create remote directory failed"
16141 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
16142 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
16143 "character special file (null)"
16144 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
16145 "character special file (no device)"
16146 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
16147 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
16148 "block special file (loop)"
16149 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
16150 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
16151 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
16153 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
16155 # LU-1299 Executing or running ldd on a truncated executable does not
16156 # cause an out-of-memory condition.
16158 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16159 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
16161 dd if=$(which date) of=$MOUNT/date bs=1k count=1
16162 chmod +x $MOUNT/date
16164 $MOUNT/date > /dev/null
16165 ldd $MOUNT/date > /dev/null
16168 run_test 227 "running truncated executable does not cause OOM"
16170 # LU-1512 try to reuse idle OI blocks
16172 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16173 remote_mds_nodsh && skip "remote MDS with nodsh"
16174 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
16176 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
16177 local myDIR=$DIR/$tdir
16180 #define OBD_FAIL_SEQ_EXHAUST 0x1002
16181 $LCTL set_param fail_loc=0x80001002
16182 createmany -o $myDIR/t- 10000
16183 $LCTL set_param fail_loc=0
16184 # The guard is current the largest FID holder
16186 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
16188 local IDX=$(($SEQ % 64))
16190 do_facet $SINGLEMDS sync
16191 # Make sure journal flushed.
16193 local blk1=$(do_facet $SINGLEMDS \
16194 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
16195 grep Blockcount | awk '{print $4}')
16197 # Remove old files, some OI blocks will become idle.
16198 unlinkmany $myDIR/t- 10000
16199 # Create new files, idle OI blocks should be reused.
16200 createmany -o $myDIR/t- 2000
16201 do_facet $SINGLEMDS sync
16202 # Make sure journal flushed.
16204 local blk2=$(do_facet $SINGLEMDS \
16205 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
16206 grep Blockcount | awk '{print $4}')
16208 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
16210 run_test 228a "try to reuse idle OI blocks"
16213 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16214 remote_mds_nodsh && skip "remote MDS with nodsh"
16215 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
16217 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
16218 local myDIR=$DIR/$tdir
16221 #define OBD_FAIL_SEQ_EXHAUST 0x1002
16222 $LCTL set_param fail_loc=0x80001002
16223 createmany -o $myDIR/t- 10000
16224 $LCTL set_param fail_loc=0
16225 # The guard is current the largest FID holder
16227 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
16229 local IDX=$(($SEQ % 64))
16231 do_facet $SINGLEMDS sync
16232 # Make sure journal flushed.
16234 local blk1=$(do_facet $SINGLEMDS \
16235 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
16236 grep Blockcount | awk '{print $4}')
16238 # Remove old files, some OI blocks will become idle.
16239 unlinkmany $myDIR/t- 10000
16242 stop $SINGLEMDS || error "Fail to stop MDT."
16244 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
16246 df $MOUNT || error "Fail to df."
16247 # Create new files, idle OI blocks should be reused.
16248 createmany -o $myDIR/t- 2000
16249 do_facet $SINGLEMDS sync
16250 # Make sure journal flushed.
16252 local blk2=$(do_facet $SINGLEMDS \
16253 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
16254 grep Blockcount | awk '{print $4}')
16256 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
16258 run_test 228b "idle OI blocks can be reused after MDT restart"
16262 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16263 remote_mds_nodsh && skip "remote MDS with nodsh"
16264 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
16266 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
16267 local myDIR=$DIR/$tdir
16270 #define OBD_FAIL_SEQ_EXHAUST 0x1002
16271 $LCTL set_param fail_loc=0x80001002
16272 # 20000 files can guarantee there are index nodes in the OI file
16273 createmany -o $myDIR/t- 20000
16274 $LCTL set_param fail_loc=0
16275 # The guard is current the largest FID holder
16277 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
16279 local IDX=$(($SEQ % 64))
16281 do_facet $SINGLEMDS sync
16282 # Make sure journal flushed.
16284 local blk1=$(do_facet $SINGLEMDS \
16285 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
16286 grep Blockcount | awk '{print $4}')
16288 # Remove old files, some OI blocks will become idle.
16289 unlinkmany $myDIR/t- 20000
16291 # The OI file should become empty now
16293 # Create new files, idle OI blocks should be reused.
16294 createmany -o $myDIR/t- 2000
16295 do_facet $SINGLEMDS sync
16296 # Make sure journal flushed.
16298 local blk2=$(do_facet $SINGLEMDS \
16299 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
16300 grep Blockcount | awk '{print $4}')
16302 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
16304 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
16306 test_229() { # LU-2482, LU-3448
16307 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16308 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
16309 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
16310 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
16314 # Create a file with a released layout and stripe count 2.
16315 $MULTIOP $DIR/$tfile H2c ||
16316 error "failed to create file with released layout"
16318 $LFS getstripe -v $DIR/$tfile
16320 local pattern=$($LFS getstripe -L $DIR/$tfile)
16321 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
16323 local stripe_count=$($LFS getstripe -c $DIR/$tfile) ||
16325 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
16326 stat $DIR/$tfile || error "failed to stat released file"
16328 chown $RUNAS_ID $DIR/$tfile ||
16329 error "chown $RUNAS_ID $DIR/$tfile failed"
16331 chgrp $RUNAS_ID $DIR/$tfile ||
16332 error "chgrp $RUNAS_ID $DIR/$tfile failed"
16334 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
16335 rm $DIR/$tfile || error "failed to remove released file"
16337 run_test 229 "getstripe/stat/rm/attr changes work on released files"
16340 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16341 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16342 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16343 skip "Need MDS version at least 2.11.52"
16347 test_mkdir $DIR/$tdir
16348 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
16349 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
16350 [ $mdt_idx -ne 0 ] &&
16351 error "create local directory on wrong MDT $mdt_idx"
16353 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
16354 error "create remote directory failed"
16355 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
16356 [ $mdt_idx -ne $MDTIDX ] &&
16357 error "create remote directory on wrong MDT $mdt_idx"
16359 createmany -o $DIR/$tdir/test_230/t- 10 ||
16360 error "create files on remote directory failed"
16361 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
16362 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
16363 rm -r $DIR/$tdir || error "unlink remote directory failed"
16365 run_test 230a "Create remote directory and files under the remote directory"
16368 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16369 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16370 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16371 skip "Need MDS version at least 2.11.52"
16379 local migrate_dir=$DIR/$tdir/migrate_dir
16380 local other_dir=$DIR/$tdir/other_dir
16382 test_mkdir $DIR/$tdir
16383 test_mkdir -i0 -c1 $migrate_dir
16384 test_mkdir -i0 -c1 $other_dir
16385 for ((i=0; i<10; i++)); do
16386 mkdir -p $migrate_dir/dir_${i}
16387 createmany -o $migrate_dir/dir_${i}/f 10 ||
16388 error "create files under remote dir failed $i"
16391 cp /etc/passwd $migrate_dir/$tfile
16392 cp /etc/passwd $other_dir/$tfile
16393 chattr +SAD $migrate_dir
16394 chattr +SAD $migrate_dir/$tfile
16396 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16397 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16398 local old_dir_mode=$(stat -c%f $migrate_dir)
16399 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
16401 mkdir -p $migrate_dir/dir_default_stripe2
16402 $LFS setstripe -c 2 $migrate_dir/dir_default_stripe2
16403 $LFS setstripe -c 2 $migrate_dir/${tfile}_stripe2
16405 mkdir -p $other_dir
16406 ln $migrate_dir/$tfile $other_dir/luna
16407 ln $migrate_dir/$tfile $migrate_dir/sofia
16408 ln $other_dir/$tfile $migrate_dir/david
16409 ln -s $migrate_dir/$tfile $other_dir/zachary
16410 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
16411 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
16413 $LFS migrate -m $MDTIDX $migrate_dir ||
16414 error "fails on migrating remote dir to MDT1"
16416 echo "migratate to MDT1, then checking.."
16417 for ((i = 0; i < 10; i++)); do
16418 for file in $(find $migrate_dir/dir_${i}); do
16419 mdt_index=$($LFS getstripe -m $file)
16420 [ $mdt_index == $MDTIDX ] ||
16421 error "$file is not on MDT${MDTIDX}"
16425 # the multiple link file should still in MDT0
16426 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
16427 [ $mdt_index == 0 ] ||
16428 error "$file is not on MDT${MDTIDX}"
16430 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16431 [ "$old_dir_flag" = "$new_dir_flag" ] ||
16432 error " expect $old_dir_flag get $new_dir_flag"
16434 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16435 [ "$old_file_flag" = "$new_file_flag" ] ||
16436 error " expect $old_file_flag get $new_file_flag"
16438 local new_dir_mode=$(stat -c%f $migrate_dir)
16439 [ "$old_dir_mode" = "$new_dir_mode" ] ||
16440 error "expect mode $old_dir_mode get $new_dir_mode"
16442 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
16443 [ "$old_file_mode" = "$new_file_mode" ] ||
16444 error "expect mode $old_file_mode get $new_file_mode"
16446 diff /etc/passwd $migrate_dir/$tfile ||
16447 error "$tfile different after migration"
16449 diff /etc/passwd $other_dir/luna ||
16450 error "luna different after migration"
16452 diff /etc/passwd $migrate_dir/sofia ||
16453 error "sofia different after migration"
16455 diff /etc/passwd $migrate_dir/david ||
16456 error "david different after migration"
16458 diff /etc/passwd $other_dir/zachary ||
16459 error "zachary different after migration"
16461 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16462 error "${tfile}_ln different after migration"
16464 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16465 error "${tfile}_ln_other different after migration"
16467 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
16468 [ $stripe_count = 2 ] ||
16469 error "dir strpe_count $d != 2 after migration."
16471 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
16472 [ $stripe_count = 2 ] ||
16473 error "file strpe_count $d != 2 after migration."
16475 #migrate back to MDT0
16478 $LFS migrate -m $MDTIDX $migrate_dir ||
16479 error "fails on migrating remote dir to MDT0"
16481 echo "migrate back to MDT0, checking.."
16482 for file in $(find $migrate_dir); do
16483 mdt_index=$($LFS getstripe -m $file)
16484 [ $mdt_index == $MDTIDX ] ||
16485 error "$file is not on MDT${MDTIDX}"
16488 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16489 [ "$old_dir_flag" = "$new_dir_flag" ] ||
16490 error " expect $old_dir_flag get $new_dir_flag"
16492 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16493 [ "$old_file_flag" = "$new_file_flag" ] ||
16494 error " expect $old_file_flag get $new_file_flag"
16496 local new_dir_mode=$(stat -c%f $migrate_dir)
16497 [ "$old_dir_mode" = "$new_dir_mode" ] ||
16498 error "expect mode $old_dir_mode get $new_dir_mode"
16500 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
16501 [ "$old_file_mode" = "$new_file_mode" ] ||
16502 error "expect mode $old_file_mode get $new_file_mode"
16504 diff /etc/passwd ${migrate_dir}/$tfile ||
16505 error "$tfile different after migration"
16507 diff /etc/passwd ${other_dir}/luna ||
16508 error "luna different after migration"
16510 diff /etc/passwd ${migrate_dir}/sofia ||
16511 error "sofia different after migration"
16513 diff /etc/passwd ${other_dir}/zachary ||
16514 error "zachary different after migration"
16516 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16517 error "${tfile}_ln different after migration"
16519 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16520 error "${tfile}_ln_other different after migration"
16522 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
16523 [ $stripe_count = 2 ] ||
16524 error "dir strpe_count $d != 2 after migration."
16526 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
16527 [ $stripe_count = 2 ] ||
16528 error "file strpe_count $d != 2 after migration."
16530 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16532 run_test 230b "migrate directory"
16535 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16536 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16537 remote_mds_nodsh && skip "remote MDS with nodsh"
16538 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16539 skip "Need MDS version at least 2.11.52"
16545 local migrate_dir=$DIR/$tdir/migrate_dir
16547 #If migrating directory fails in the middle, all entries of
16548 #the directory is still accessiable.
16549 test_mkdir $DIR/$tdir
16550 test_mkdir -i0 -c1 $migrate_dir
16551 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
16553 createmany -o $migrate_dir/f $total ||
16554 error "create files under ${migrate_dir} failed"
16556 # fail after migrating top dir, and this will fail only once, so the
16557 # first sub file migration will fail (currently f3), others succeed.
16558 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
16559 do_facet mds1 lctl set_param fail_loc=0x1801
16560 local t=$(ls $migrate_dir | wc -l)
16561 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
16562 error "migrate should fail"
16563 local u=$(ls $migrate_dir | wc -l)
16564 [ "$u" == "$t" ] || error "$u != $t during migration"
16566 # add new dir/file should succeed
16567 mkdir $migrate_dir/dir ||
16568 error "mkdir failed under migrating directory"
16569 touch $migrate_dir/file ||
16570 error "create file failed under migrating directory"
16572 # add file with existing name should fail
16573 for file in $migrate_dir/f*; do
16574 stat $file > /dev/null || error "stat $file failed"
16575 $OPENFILE -f O_CREAT:O_EXCL $file &&
16576 error "open(O_CREAT|O_EXCL) $file should fail"
16577 $MULTIOP $file m && error "create $file should fail"
16578 touch $DIR/$tdir/remote_dir/$tfile ||
16579 error "touch $tfile failed"
16580 ln $DIR/$tdir/remote_dir/$tfile $file &&
16581 error "link $file should fail"
16582 mdt_index=$($LFS getstripe -m $file)
16583 if [ $mdt_index == 0 ]; then
16584 # file failed to migrate is not allowed to rename to
16585 mv $DIR/$tdir/remote_dir/$tfile $file &&
16586 error "rename to $file should fail"
16588 mv $DIR/$tdir/remote_dir/$tfile $file ||
16589 error "rename to $file failed"
16591 echo hello >> $file || error "write $file failed"
16594 # resume migration with different options should fail
16595 $LFS migrate -m 0 $migrate_dir &&
16596 error "migrate -m 0 $migrate_dir should fail"
16598 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
16599 error "migrate -c 2 $migrate_dir should fail"
16601 # resume migration should succeed
16602 $LFS migrate -m $MDTIDX $migrate_dir ||
16603 error "migrate $migrate_dir failed"
16605 echo "Finish migration, then checking.."
16606 for file in $(find $migrate_dir); do
16607 mdt_index=$($LFS getstripe -m $file)
16608 [ $mdt_index == $MDTIDX ] ||
16609 error "$file is not on MDT${MDTIDX}"
16612 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16614 run_test 230c "check directory accessiblity if migration failed"
16617 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16618 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16619 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16620 skip "Need MDS version at least 2.11.52"
16622 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
16624 local migrate_dir=$DIR/$tdir/migrate_dir
16634 old_index=$((RANDOM % MDSCOUNT))
16635 old_count=$((MDSCOUNT - old_index))
16636 new_index=$((RANDOM % MDSCOUNT))
16637 new_count=$((MDSCOUNT - new_index))
16638 new_hash="all_char"
16640 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
16641 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
16643 test_mkdir $DIR/$tdir
16644 test_mkdir -i $old_index -c $old_count $migrate_dir
16646 for ((i=0; i<100; i++)); do
16647 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
16648 createmany -o $migrate_dir/dir_${i}/f 100 ||
16649 error "create files under remote dir failed $i"
16652 echo -n "Migrate from MDT$old_index "
16653 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
16654 echo -n "to MDT$new_index"
16655 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
16658 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
16659 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
16660 error "migrate remote dir error"
16662 echo "Finish migration, then checking.."
16663 for file in $(find $migrate_dir); do
16664 mdt_index=$($LFS getstripe -m $file)
16665 if [ $mdt_index -lt $new_index ] ||
16666 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
16667 error "$file is on MDT$mdt_index"
16671 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16673 run_test 230d "check migrate big directory"
16676 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16677 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16678 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16679 skip "Need MDS version at least 2.11.52"
16686 mkdir -p $DIR/$tdir
16687 mkdir $DIR/$tdir/migrate_dir
16688 mkdir $DIR/$tdir/other_dir
16689 touch $DIR/$tdir/migrate_dir/a
16690 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
16691 ls $DIR/$tdir/other_dir
16693 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16694 error "migrate dir fails"
16696 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16697 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16699 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16700 [ $mdt_index == 0 ] || error "a is not on MDT0"
16702 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
16703 error "migrate dir fails"
16705 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
16706 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
16708 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16709 [ $mdt_index == 1 ] || error "a is not on MDT1"
16711 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
16712 [ $mdt_index == 1 ] || error "b is not on MDT1"
16714 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16715 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
16717 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
16719 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16721 run_test 230e "migrate mulitple local link files"
16724 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16725 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16726 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16727 skip "Need MDS version at least 2.11.52"
16732 mkdir -p $DIR/$tdir
16733 mkdir $DIR/$tdir/migrate_dir
16734 $LFS mkdir -i1 $DIR/$tdir/other_dir
16735 touch $DIR/$tdir/migrate_dir/a
16736 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
16737 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
16738 ls $DIR/$tdir/other_dir
16740 # a should be migrated to MDT1, since no other links on MDT0
16741 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16742 error "#1 migrate dir fails"
16743 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16744 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16745 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16746 [ $mdt_index == 1 ] || error "a is not on MDT1"
16748 # a should stay on MDT1, because it is a mulitple link file
16749 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16750 error "#2 migrate dir fails"
16751 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16752 [ $mdt_index == 1 ] || error "a is not on MDT1"
16754 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16755 error "#3 migrate dir fails"
16757 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16758 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
16759 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
16761 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
16762 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
16764 # a should be migrated to MDT0, since no other links on MDT1
16765 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16766 error "#4 migrate dir fails"
16767 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16768 [ $mdt_index == 0 ] || error "a is not on MDT0"
16770 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16772 run_test 230f "migrate mulitple remote link files"
16775 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16776 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16777 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16778 skip "Need MDS version at least 2.11.52"
16780 mkdir -p $DIR/$tdir/migrate_dir
16782 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
16783 error "migrating dir to non-exist MDT succeeds"
16786 run_test 230g "migrate dir to non-exist MDT"
16789 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16790 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16791 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16792 skip "Need MDS version at least 2.11.52"
16796 mkdir -p $DIR/$tdir/migrate_dir
16798 $LFS migrate -m1 $DIR &&
16799 error "migrating mountpoint1 should fail"
16801 $LFS migrate -m1 $DIR/$tdir/.. &&
16802 error "migrating mountpoint2 should fail"
16805 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
16806 error "migrating $tdir/migrate_dir/.. should fail"
16810 run_test 230h "migrate .. and root"
16813 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16814 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16815 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16816 skip "Need MDS version at least 2.11.52"
16818 mkdir -p $DIR/$tdir/migrate_dir
16820 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
16821 error "migration fails with a tailing slash"
16823 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
16824 error "migration fails with two tailing slashes"
16826 run_test 230i "lfs migrate -m tolerates trailing slashes"
16829 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16830 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16831 skip "Need MDS version at least 2.11.52"
16833 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
16834 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
16835 error "create $tfile failed"
16836 cat /etc/passwd > $DIR/$tdir/$tfile
16838 $LFS migrate -m 1 $DIR/$tdir
16840 cmp /etc/passwd $DIR/$tdir/$tfile ||
16841 error "DoM file mismatch after migration"
16843 run_test 230j "DoM file data not changed after dir migration"
16846 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
16847 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16848 skip "Need MDS version at least 2.11.56"
16851 local files_on_starting_mdt=0
16853 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
16854 $LFS getdirstripe $DIR/$tdir
16855 for i in $(seq $total); do
16856 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
16857 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16858 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16861 echo "$files_on_starting_mdt files on MDT0"
16863 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
16864 $LFS getdirstripe $DIR/$tdir
16866 files_on_starting_mdt=0
16867 for i in $(seq $total); do
16868 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16869 error "file $tfile.$i mismatch after migration"
16870 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16871 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16874 echo "$files_on_starting_mdt files on MDT1 after migration"
16875 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16877 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16878 $LFS getdirstripe $DIR/$tdir
16880 files_on_starting_mdt=0
16881 for i in $(seq $total); do
16882 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16883 error "file $tfile.$i mismatch after 2nd migration"
16884 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16885 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16888 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
16889 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16893 run_test 230k "file data not changed after dir migration"
16896 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16897 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16898 skip "Need MDS version at least 2.11.56"
16900 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16901 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16902 error "create files under remote dir failed $i"
16903 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16905 run_test 230l "readdir between MDTs won't crash"
16909 # For simplicity this test assumes that max_pages_per_rpc
16910 # is the same across all OSCs
16911 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16912 local bulk_size=$((max_pages * PAGE_SIZE))
16913 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16916 mkdir -p $DIR/$tdir
16917 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16918 error "failed to set stripe with -S ${brw_size}M option"
16920 # clear the OSC stats
16921 $LCTL set_param osc.*.stats=0 &>/dev/null
16924 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16925 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16926 oflag=direct &>/dev/null || error "dd failed"
16928 sync; sleep 1; sync # just to be safe
16929 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16930 if [ x$nrpcs != "x1" ]; then
16931 $LCTL get_param osc.*.stats
16932 error "found $nrpcs ost_write RPCs, not 1 as expected"
16936 # Drop the OSC cache, otherwise we will read from it
16937 cancel_lru_locks osc
16939 # clear the OSC stats
16940 $LCTL set_param osc.*.stats=0 &>/dev/null
16942 # Client reads $bulk_size.
16943 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16944 iflag=direct &>/dev/null || error "dd failed"
16946 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16947 if [ x$nrpcs != "x1" ]; then
16948 $LCTL get_param osc.*.stats
16949 error "found $nrpcs ost_read RPCs, not 1 as expected"
16952 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16955 mkdir -p $DIR/$tdir
16957 for i in {0..1023}; do
16958 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16959 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16960 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16964 run_test 231b "must not assert on fully utilized OST request buffer"
16967 mkdir -p $DIR/$tdir
16968 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16970 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16971 do_facet ost1 $LCTL set_param fail_loc=0x31c
16973 # ignore dd failure
16974 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16976 do_facet ost1 $LCTL set_param fail_loc=0
16977 umount_client $MOUNT || error "umount failed"
16978 mount_client $MOUNT || error "mount failed"
16979 stop ost1 || error "cannot stop ost1"
16980 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16982 run_test 232a "failed lock should not block umount"
16985 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16986 skip "Need MDS version at least 2.10.58"
16988 mkdir -p $DIR/$tdir
16989 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16990 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16992 cancel_lru_locks osc
16994 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16995 do_facet ost1 $LCTL set_param fail_loc=0x31c
16998 $LFS data_version $DIR/$tdir/$tfile || true
17000 do_facet ost1 $LCTL set_param fail_loc=0
17001 umount_client $MOUNT || error "umount failed"
17002 mount_client $MOUNT || error "mount failed"
17003 stop ost1 || error "cannot stop ost1"
17004 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17006 run_test 232b "failed data version lock should not block umount"
17009 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
17010 skip "Need MDS version at least 2.3.64"
17011 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
17013 local fid=$($LFS path2fid $MOUNT)
17015 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
17016 error "cannot access $MOUNT using its FID '$fid'"
17018 run_test 233a "checking that OBF of the FS root succeeds"
17021 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
17022 skip "Need MDS version at least 2.5.90"
17023 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
17025 local fid=$($LFS path2fid $MOUNT/.lustre)
17027 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
17028 error "cannot access $MOUNT/.lustre using its FID '$fid'"
17030 fid=$($LFS path2fid $MOUNT/.lustre/fid)
17031 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
17032 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
17034 run_test 233b "checking that OBF of the FS .lustre succeeds"
17037 local p="$TMP/sanityN-$TESTNAME.parameters"
17038 save_lustre_params client "llite.*.xattr_cache" > $p
17039 lctl set_param llite.*.xattr_cache 1 ||
17040 skip_env "xattr cache is not supported"
17042 mkdir -p $DIR/$tdir || error "mkdir failed"
17043 touch $DIR/$tdir/$tfile || error "touch failed"
17044 # OBD_FAIL_LLITE_XATTR_ENOMEM
17045 $LCTL set_param fail_loc=0x1405
17046 getfattr -n user.attr $DIR/$tdir/$tfile &&
17047 error "getfattr should have failed with ENOMEM"
17048 $LCTL set_param fail_loc=0x0
17051 restore_lustre_params < $p
17054 run_test 234 "xattr cache should not crash on ENOMEM"
17057 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
17058 skip "Need MDS version at least 2.4.52"
17060 flock_deadlock $DIR/$tfile
17065 124) error "process hangs on a deadlock"
17067 *) error "error executing flock_deadlock $DIR/$tfile"
17071 run_test 235 "LU-1715: flock deadlock detection does not work properly"
17075 check_swap_layouts_support
17077 local ref1=/etc/passwd
17078 local ref2=/etc/group
17079 local file1=$DIR/$tdir/f1
17080 local file2=$DIR/$tdir/f2
17082 test_mkdir -c1 $DIR/$tdir
17083 $LFS setstripe -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
17084 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
17085 $LFS setstripe -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
17086 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
17087 local fd=$(free_fd)
17088 local cmd="exec $fd<>$file2"
17091 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
17092 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
17095 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
17100 run_test 236 "Layout swap on open unlinked file"
17102 # LU-4659 linkea consistency
17104 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
17105 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
17106 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
17107 skip "Need MDS version at least 2.5.58 or 2.5.2+"
17110 ln $DIR/$tfile $DIR/$tfile.lnk
17111 touch $DIR/$tfile.new
17112 mv $DIR/$tfile.new $DIR/$tfile
17113 local fid1=$($LFS path2fid $DIR/$tfile)
17114 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
17115 local path1=$($LFS fid2path $FSNAME "$fid1")
17116 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
17117 local path2=$($LFS fid2path $FSNAME "$fid2")
17118 [ $tfile.lnk == $path2 ] ||
17119 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
17122 run_test 238 "Verify linkea consistency"
17124 test_239A() { # was test_239
17125 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
17126 skip "Need MDS version at least 2.5.60"
17128 local list=$(comma_list $(mdts_nodes))
17130 mkdir -p $DIR/$tdir
17131 createmany -o $DIR/$tdir/f- 5000
17132 unlinkmany $DIR/$tdir/f- 5000
17133 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
17134 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
17135 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
17136 osp.*MDT*.sync_in_flight" | calc_sum)
17137 [ "$changes" -eq 0 ] || error "$changes not synced"
17139 run_test 239A "osp_sync test"
17141 test_239a() { #LU-5297
17142 remote_mds_nodsh && skip "remote MDS with nodsh"
17145 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
17146 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
17147 chgrp $RUNAS_GID $DIR/$tfile
17148 wait_delete_completed
17150 run_test 239a "process invalid osp sync record correctly"
17152 test_239b() { #LU-5297
17153 remote_mds_nodsh && skip "remote MDS with nodsh"
17156 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
17157 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
17158 chgrp $RUNAS_GID $DIR/$tfile1
17159 wait_delete_completed
17160 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
17162 chgrp $RUNAS_GID $DIR/$tfile2
17163 wait_delete_completed
17165 run_test 239b "process osp sync record with ENOMEM error correctly"
17168 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
17169 remote_mds_nodsh && skip "remote MDS with nodsh"
17171 mkdir -p $DIR/$tdir
17173 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
17174 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
17175 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
17176 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
17178 umount_client $MOUNT || error "umount failed"
17179 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
17180 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
17181 mount_client $MOUNT || error "failed to mount client"
17183 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
17184 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
17186 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
17192 for LOOP in $(seq $count); do
17193 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
17194 cancel_lru_locks $OSC || true
17202 for LOOP in $(seq $1); do
17203 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
17208 test_241a() { # was test_241
17209 local bsize=$PAGE_SIZE
17211 (( bsize < 40960 )) && bsize=40960
17212 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
17214 cancel_lru_locks $OSC
17215 test_241_bio 1000 $bsize &
17217 test_241_dio 1000 $bsize
17220 run_test 241a "bio vs dio"
17223 local bsize=$PAGE_SIZE
17225 (( bsize < 40960 )) && bsize=40960
17226 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
17228 test_241_dio 1000 $bsize &
17230 test_241_dio 1000 $bsize
17233 run_test 241b "dio vs dio"
17236 remote_mds_nodsh && skip "remote MDS with nodsh"
17238 mkdir -p $DIR/$tdir
17239 touch $DIR/$tdir/$tfile
17241 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
17242 do_facet mds1 lctl set_param fail_loc=0x105
17243 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
17245 do_facet mds1 lctl set_param fail_loc=0
17246 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
17248 run_test 242 "mdt_readpage failure should not cause directory unreadable"
17252 test_mkdir $DIR/$tdir
17253 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
17255 run_test 243 "various group lock tests"
17259 test_mkdir $DIR/$tdir
17260 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
17261 sendfile_grouplock $DIR/$tdir/$tfile || \
17262 error "sendfile+grouplock failed"
17265 run_test 244a "sendfile with group lock tests"
17269 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
17272 local size=$((1024*1024))
17274 test_mkdir $DIR/$tdir
17275 for i in $(seq 1 $threads); do
17276 local file=$DIR/$tdir/file_$((i / 10))
17277 $MULTIOP $file OG1234w$size_$((i % 3))w$size_$((i % 4))g1234c &
17280 for i in $(seq 1 $threads); do
17284 run_test 244b "multi-threaded write with group lock"
17287 local flagname="multi_mod_rpcs"
17288 local connect_data_name="max_mod_rpcs"
17291 # check if multiple modify RPCs flag is set
17292 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
17293 grep "connect_flags:")
17296 echo "$out" | grep -qw $flagname
17297 if [ $? -ne 0 ]; then
17298 echo "connect flag $flagname is not set"
17302 # check if multiple modify RPCs data is set
17303 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
17306 echo "$out" | grep -qw $connect_data_name ||
17307 error "import should have connect data $connect_data_name"
17309 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
17311 test_246() { # LU-7371
17312 remote_ost_nodsh && skip "remote OST with nodsh"
17313 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
17314 skip "Need OST version >= 2.7.62"
17316 do_facet ost1 $LCTL set_param fail_val=4095
17317 #define OBD_FAIL_OST_READ_SIZE 0x234
17318 do_facet ost1 $LCTL set_param fail_loc=0x234
17319 $LFS setstripe $DIR/$tfile -i 0 -c 1
17320 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
17321 cancel_lru_locks $FSNAME-OST0000
17322 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
17324 run_test 246 "Read file of size 4095 should return right length"
17330 umount_client $submount
17335 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
17337 skip_env "Fileset feature is not supported"
17339 local submount=${MOUNT}_$tdir
17342 mkdir -p $submount || error "mkdir $submount failed"
17343 FILESET="$FILESET/$tdir" mount_client $submount ||
17344 error "mount $submount failed"
17345 trap "cleanup_247 $submount" EXIT
17346 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
17347 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
17348 error "read $MOUNT/$tdir/$tfile failed"
17349 cleanup_247 $submount
17351 run_test 247a "mount subdir as fileset"
17354 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
17355 skip_env "Fileset feature is not supported"
17357 local submount=${MOUNT}_$tdir
17359 rm -rf $MOUNT/$tdir
17360 mkdir -p $submount || error "mkdir $submount failed"
17362 FILESET="$FILESET/$tdir" mount_client $submount &&
17363 error "mount $submount should fail"
17366 run_test 247b "mount subdir that dose not exist"
17369 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
17370 skip_env "Fileset feature is not supported"
17372 local submount=${MOUNT}_$tdir
17374 mkdir -p $MOUNT/$tdir/dir1
17375 mkdir -p $submount || error "mkdir $submount failed"
17376 trap "cleanup_247 $submount" EXIT
17377 FILESET="$FILESET/$tdir" mount_client $submount ||
17378 error "mount $submount failed"
17379 local fid=$($LFS path2fid $MOUNT/)
17380 $LFS fid2path $submount $fid && error "fid2path should fail"
17381 cleanup_247 $submount
17383 run_test 247c "running fid2path outside root"
17386 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
17387 skip "Fileset feature is not supported"
17389 local submount=${MOUNT}_$tdir
17391 mkdir -p $MOUNT/$tdir/dir1
17392 mkdir -p $submount || error "mkdir $submount failed"
17393 FILESET="$FILESET/$tdir" mount_client $submount ||
17394 error "mount $submount failed"
17395 trap "cleanup_247 $submount" EXIT
17396 local fid=$($LFS path2fid $submount/dir1)
17397 $LFS fid2path $submount $fid || error "fid2path should succeed"
17398 cleanup_247 $submount
17400 run_test 247d "running fid2path inside root"
17404 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
17406 skip "Fileset feature is not supported"
17408 local submount=${MOUNT}_$tdir
17411 mkdir -p $submount || error "mkdir $submount failed"
17412 FILESET="$FILESET/.." mount_client $submount &&
17413 error "mount $submount should fail"
17416 run_test 247e "mount .. as fileset"
17419 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
17420 [ -z "$fast_read_sav" ] && skip "no fast read support"
17422 # create a large file for fast read verification
17423 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
17425 # make sure the file is created correctly
17426 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
17427 { rm -f $DIR/$tfile; skip "file creation error"; }
17429 echo "Test 1: verify that fast read is 4 times faster on cache read"
17431 # small read with fast read enabled
17432 $LCTL set_param -n llite.*.fast_read=1
17433 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
17434 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17435 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17436 # small read with fast read disabled
17437 $LCTL set_param -n llite.*.fast_read=0
17438 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
17439 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17440 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17442 # verify that fast read is 4 times faster for cache read
17443 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
17444 error_not_in_vm "fast read was not 4 times faster: " \
17445 "$t_fast vs $t_slow"
17447 echo "Test 2: verify the performance between big and small read"
17448 $LCTL set_param -n llite.*.fast_read=1
17450 # 1k non-cache read
17451 cancel_lru_locks osc
17452 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17453 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17454 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17456 # 1M non-cache read
17457 cancel_lru_locks osc
17458 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17459 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17460 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17462 # verify that big IO is not 4 times faster than small IO
17463 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
17464 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
17466 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
17469 run_test 248 "fast read verification"
17471 test_249() { # LU-7890
17472 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
17473 skip "Need at least version 2.8.54"
17476 $LFS setstripe -c 1 $DIR/$tfile
17477 # Offset 2T == 4k * 512M
17478 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
17479 error "dd to 2T offset failed"
17481 run_test 249 "Write above 2T file size"
17484 [ "$(facet_fstype ost$(($($LFS getstripe -i $DIR/$tfile) + 1)))" = "zfs" ] \
17485 && skip "no 16TB file size limit on ZFS"
17487 $LFS setstripe -c 1 $DIR/$tfile
17488 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
17489 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
17490 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
17491 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
17492 conv=notrunc,fsync && error "append succeeded"
17495 run_test 250 "Write above 16T limit"
17498 $LFS setstripe -c -1 -S 1048576 $DIR/$tfile
17500 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
17501 #Skip once - writing the first stripe will succeed
17502 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17503 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
17504 error "short write happened"
17506 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17507 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
17508 error "short read happened"
17512 run_test 251 "Handling short read and write correctly"
17515 remote_mds_nodsh && skip "remote MDS with nodsh"
17516 remote_ost_nodsh && skip "remote OST with nodsh"
17517 if [ "$ost1_FSTYPE" != ldiskfs ] || [ "$mds1_FSTYPE" != ldiskfs ]; then
17518 skip_env "ldiskfs only test"
17528 # check lr_reader on OST0000
17530 dev=$(facet_device $tgt)
17531 out=$(do_facet $tgt $LR_READER $dev)
17532 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17534 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
17535 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
17536 error "Invalid uuid returned by $LR_READER on target $tgt"
17537 echo -e "uuid returned by $LR_READER is '$uuid'\n"
17539 # check lr_reader -c on MDT0000
17541 dev=$(facet_device $tgt)
17542 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
17543 skip "$LR_READER does not support additional options"
17545 out=$(do_facet $tgt $LR_READER -c $dev)
17546 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17548 num=$(echo "$out" | grep -c "mdtlov")
17549 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
17550 error "Invalid number of mdtlov clients returned by $LR_READER"
17551 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
17553 # check lr_reader -cr on MDT0000
17554 out=$(do_facet $tgt $LR_READER -cr $dev)
17555 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17557 echo "$out" | grep -q "^reply_data:$" ||
17558 error "$LR_READER should have returned 'reply_data' section"
17559 num=$(echo "$out" | grep -c "client_generation")
17560 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
17562 run_test 252 "check lr_reader tool"
17565 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17566 remote_mds_nodsh && skip "remote MDS with nodsh"
17567 remote_mgs_nodsh && skip "remote MGS with nodsh"
17571 local ost_name=$(ostname_from_index $ostidx)
17574 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
17575 do_facet $SINGLEMDS $LCTL get_param -n \
17576 osp.$mdtosc_proc1.reserved_mb_high ||
17577 skip "remote MDS does not support reserved_mb_high"
17581 wait_delete_completed
17584 pool_add $TESTNAME || error "Pool creation failed"
17585 pool_add_targets $TESTNAME 0 || error "Pool add targets failed"
17587 $LFS setstripe $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
17588 error "Setstripe failed"
17590 dd if=/dev/zero of=$DIR/$tdir/$tfile.0 bs=1M count=10
17592 local wms=$(ost_watermarks_set_enospc $tfile $ostidx |
17594 stack_trap "ost_watermarks_clear_enospc $tfile $ostidx $wms" EXIT
17596 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17597 osp.$mdtosc_proc1.prealloc_status)
17598 echo "prealloc_status $oa_status"
17600 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1M count=1 &&
17601 error "File creation should fail"
17603 #object allocation was stopped, but we still able to append files
17604 dd if=/dev/zero of=$DIR/$tdir/$tfile.0 bs=1M seek=6 count=5 \
17605 oflag=append || error "Append failed"
17607 rm -f $DIR/$tdir/$tfile.0
17609 # For this test, we want to delete the files we created to go out of
17610 # space but leave the watermark, so we remain nearly out of space
17611 ost_watermarks_enospc_delete_files $tfile $ostidx
17613 wait_delete_completed
17617 for i in $(seq 10 12); do
17618 dd if=/dev/zero of=$DIR/$tdir/$tfile.$i bs=1M count=1 \
17619 2>/dev/null || error "File creation failed after rm"
17622 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17623 osp.$mdtosc_proc1.prealloc_status)
17624 echo "prealloc_status $oa_status"
17626 if (( oa_status != 0 )); then
17627 error "Object allocation still disable after rm"
17630 run_test 253 "Check object allocation limit"
17633 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17634 remote_mds_nodsh && skip "remote MDS with nodsh"
17635 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
17636 skip "MDS does not support changelog_size"
17639 local MDT0=$(facet_svc $SINGLEMDS)
17641 changelog_register || error "changelog_register failed"
17643 changelog_clear 0 || error "changelog_clear failed"
17645 local size1=$(do_facet $SINGLEMDS \
17646 $LCTL get_param -n mdd.$MDT0.changelog_size)
17647 echo "Changelog size $size1"
17650 $LFS mkdir -i 0 $DIR/$tdir
17652 mkdir -p $DIR/$tdir/pics/2008/zachy
17653 touch $DIR/$tdir/pics/2008/zachy/timestamp
17654 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
17655 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
17656 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
17657 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
17658 rm $DIR/$tdir/pics/desktop.jpg
17660 local size2=$(do_facet $SINGLEMDS \
17661 $LCTL get_param -n mdd.$MDT0.changelog_size)
17662 echo "Changelog size after work $size2"
17664 (( $size2 > $size1 )) ||
17665 error "new Changelog size=$size2 less than old size=$size1"
17667 run_test 254 "Check changelog size"
17674 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
17675 awk -F: '{print $2}' | grep $type > /dev/null
17676 if [ $? -ne 0 ]; then
17686 lfs ladvise -a willread $file > /dev/null 2>&1
17687 if [ $? -eq 0 ]; then
17691 lfs ladvise -a willread $file 2>&1 |
17692 grep "Inappropriate ioctl for device" > /dev/null
17693 if [ $? -eq 0 ]; then
17700 bc <<<"scale=2; ($1 - $2) * 100 / $2"
17703 # run a random read IO workload
17704 # usage: random_read_iops <filename> <filesize> <iosize>
17705 random_read_iops() {
17708 local iosize=${3:-4096}
17710 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
17711 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
17714 drop_file_oss_cache() {
17718 $LFS ladvise -a dontneed $file 2>/dev/null ||
17719 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
17722 ladvise_willread_performance()
17725 local average_origin=0
17726 local average_cache=0
17727 local average_ladvise=0
17729 for ((i = 1; i <= $repeat; i++)); do
17730 echo "Iter $i/$repeat: reading without willread hint"
17731 cancel_lru_locks osc
17732 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17733 local speed_origin=$(random_read_iops $DIR/$tfile $size)
17734 echo "Iter $i/$repeat: uncached speed: $speed_origin"
17735 average_origin=$(bc <<<"$average_origin + $speed_origin")
17737 cancel_lru_locks osc
17738 local speed_cache=$(random_read_iops $DIR/$tfile $size)
17739 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
17740 average_cache=$(bc <<<"$average_cache + $speed_cache")
17742 cancel_lru_locks osc
17743 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17744 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
17745 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
17746 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
17747 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
17749 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
17750 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
17751 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
17753 speedup_cache=$(percent $average_cache $average_origin)
17754 speedup_ladvise=$(percent $average_ladvise $average_origin)
17756 echo "Average uncached read: $average_origin"
17757 echo "Average speedup with OSS cached read: " \
17758 "$average_cache = +$speedup_cache%"
17759 echo "Average speedup with ladvise willread: " \
17760 "$average_ladvise = +$speedup_ladvise%"
17762 local lowest_speedup=20
17763 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
17764 echo "Speedup with OSS cached read less than $lowest_speedup%," \
17765 "got $average_cache%. Skipping ladvise willread check."
17769 # the test won't work on ZFS until it supports 'ladvise dontneed', but
17770 # it is still good to run until then to exercise 'ladvise willread'
17771 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17772 [ "$ost1_FSTYPE" = "zfs" ] &&
17773 echo "osd-zfs does not support dontneed or drop_caches" &&
17776 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
17777 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
17778 error_not_in_vm "Speedup with willread is less than " \
17779 "$lowest_speedup%, got $average_ladvise%"
17783 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17784 skip "lustre < 2.8.54 does not support ladvise "
17785 remote_ost_nodsh && skip "remote OST with nodsh"
17787 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
17789 ladvise_no_type willread $DIR/$tfile &&
17790 skip "willread ladvise is not supported"
17792 ladvise_no_ioctl $DIR/$tfile &&
17793 skip "ladvise ioctl is not supported"
17796 local size=$((size_mb * 1048576))
17797 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17798 error "dd to $DIR/$tfile failed"
17800 lfs ladvise -a willread $DIR/$tfile ||
17801 error "Ladvise failed with no range argument"
17803 lfs ladvise -a willread -s 0 $DIR/$tfile ||
17804 error "Ladvise failed with no -l or -e argument"
17806 lfs ladvise -a willread -e 1 $DIR/$tfile ||
17807 error "Ladvise failed with only -e argument"
17809 lfs ladvise -a willread -l 1 $DIR/$tfile ||
17810 error "Ladvise failed with only -l argument"
17812 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
17813 error "End offset should not be smaller than start offset"
17815 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
17816 error "End offset should not be equal to start offset"
17818 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
17819 error "Ladvise failed with overflowing -s argument"
17821 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
17822 error "Ladvise failed with overflowing -e argument"
17824 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
17825 error "Ladvise failed with overflowing -l argument"
17827 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
17828 error "Ladvise succeeded with conflicting -l and -e arguments"
17830 echo "Synchronous ladvise should wait"
17832 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17833 do_nodes $(comma_list $(osts_nodes)) \
17834 $LCTL set_param fail_val=$delay fail_loc=0x237
17836 local start_ts=$SECONDS
17837 lfs ladvise -a willread $DIR/$tfile ||
17838 error "Ladvise failed with no range argument"
17839 local end_ts=$SECONDS
17840 local inteval_ts=$((end_ts - start_ts))
17842 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17843 error "Synchronous advice didn't wait reply"
17846 echo "Asynchronous ladvise shouldn't wait"
17847 local start_ts=$SECONDS
17848 lfs ladvise -a willread -b $DIR/$tfile ||
17849 error "Ladvise failed with no range argument"
17850 local end_ts=$SECONDS
17851 local inteval_ts=$((end_ts - start_ts))
17853 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17854 error "Asynchronous advice blocked"
17857 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17858 ladvise_willread_performance
17860 run_test 255a "check 'lfs ladvise -a willread'"
17866 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17870 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17871 skip "lustre < 2.8.54 does not support ladvise "
17872 remote_ost_nodsh && skip "remote OST with nodsh"
17874 lfs setstripe -c 1 -i 0 $DIR/$tfile
17876 ladvise_no_type dontneed $DIR/$tfile &&
17877 skip "dontneed ladvise is not supported"
17879 ladvise_no_ioctl $DIR/$tfile &&
17880 skip "ladvise ioctl is not supported"
17882 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17883 [ "$ost1_FSTYPE" = "zfs" ] &&
17884 skip "zfs-osd does not support 'ladvise dontneed'"
17887 local size=$((size_mb * 1048576))
17888 # In order to prevent disturbance of other processes, only check 3/4
17889 # of the memory usage
17890 local kibibytes=$((size_mb * 1024 * 3 / 4))
17892 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17893 error "dd to $DIR/$tfile failed"
17895 #force write to complete before dropping OST cache & checking memory
17898 local total=$(facet_meminfo ost1 MemTotal)
17899 echo "Total memory: $total KiB"
17901 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17902 local before_read=$(facet_meminfo ost1 Cached)
17903 echo "Cache used before read: $before_read KiB"
17905 lfs ladvise -a willread $DIR/$tfile ||
17906 error "Ladvise willread failed"
17907 local after_read=$(facet_meminfo ost1 Cached)
17908 echo "Cache used after read: $after_read KiB"
17910 lfs ladvise -a dontneed $DIR/$tfile ||
17911 error "Ladvise dontneed again failed"
17912 local no_read=$(facet_meminfo ost1 Cached)
17913 echo "Cache used after dontneed ladvise: $no_read KiB"
17915 if [ $total -lt $((before_read + kibibytes)) ]; then
17916 echo "Memory is too small, abort checking"
17920 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17921 error "Ladvise willread should use more memory" \
17922 "than $kibibytes KiB"
17925 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17926 error "Ladvise dontneed should release more memory" \
17927 "than $kibibytes KiB"
17930 run_test 255b "check 'lfs ladvise -a dontneed'"
17933 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17934 skip "lustre < 2.10.50 does not support lockahead"
17942 test_mkdir -p $DIR/$tdir
17943 $LFS setstripe -i 0 -c 1 $DIR/$tdir
17945 #test 10 returns only success/failure
17947 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17949 if [ $rc -eq 255 ]; then
17950 error "Ladvise test${i} failed, ${rc}"
17953 #test 11 counts lock enqueue requests, all others count new locks
17955 count=$(do_facet ost1 \
17956 $LCTL get_param -n ost.OSS.ost.stats)
17957 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17959 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17961 if [ $rc -eq 255 ]; then
17962 error "Ladvise test${i} failed, ${rc}"
17965 new_count=$(do_facet ost1 \
17966 $LCTL get_param -n ost.OSS.ost.stats)
17967 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17968 awk '{ print $2 }')
17970 difference="$((new_count - count))"
17971 if [ $difference -ne $rc ]; then
17972 error "Ladvise test${i}, bad enqueue count, returned " \
17973 "${rc}, actual ${difference}"
17976 for i in $(seq 12 21); do
17977 # If we do not do this, we run the risk of having too many
17978 # locks and starting lock cancellation while we are checking
17980 cancel_lru_locks osc
17982 count=$($LCTL get_param -n \
17983 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17985 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17987 if [ $rc -eq 255 ]; then
17988 error "Ladvise test ${i} failed, ${rc}"
17991 new_count=$($LCTL get_param -n \
17992 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17993 difference="$((new_count - count))"
17995 # Test 15 output is divided by 100 to map down to valid return
17996 if [ $i -eq 15 ]; then
18000 if [ $difference -ne $rc ]; then
18001 error "Ladvise test ${i}, bad lock count, returned " \
18002 "${rc}, actual ${difference}"
18006 #test 22 returns only success/failure
18008 lockahead_test -d $DIR/$tdir -t $i -f $tfile
18010 if [ $rc -eq 255 ]; then
18011 error "Ladvise test${i} failed, ${rc}"
18014 run_test 255c "suite of ladvise lockahead tests"
18017 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18018 remote_mds_nodsh && skip "remote MDS with nodsh"
18019 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
18020 changelog_users $SINGLEMDS | grep "^cl" &&
18021 skip "active changelog user"
18027 mdt_dev=$(mdsdevname 1)
18030 changelog_register || error "changelog_register failed"
18033 mkdir -p $DIR/$tdir
18035 changelog_clear 0 || error "changelog_clear failed"
18038 touch $DIR/$tdir/{1..10}
18041 stop $SINGLEMDS || error "Fail to stop MDT"
18045 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
18047 #after mount new plainllog is used
18048 touch $DIR/$tdir/{11..19}
18049 local tmpfile="$(mktemp --tmpdir -u $tfile.XXXXXX)"
18050 stack_trap "rm -f $tmpfile"
18051 cat_sl=$(do_facet $SINGLEMDS "sync; \
18052 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
18053 llog_reader $tmpfile | grep -c type=1064553b")
18054 do_facet $SINGLEMDS llog_reader $tmpfile
18056 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
18058 changelog_clear 0 || error "changelog_clear failed"
18060 cat_sl=$(do_facet $SINGLEMDS "sync; \
18061 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
18062 llog_reader $tmpfile | grep -c type=1064553b")
18064 if (( cat_sl == 2 )); then
18065 error "Empty plain llog was not deleted from changelog catalog"
18066 elif (( cat_sl != 1 )); then
18067 error "Active plain llog shouldn't be deleted from catalog"
18070 run_test 256 "Check llog delete for empty and not full state"
18073 remote_mds_nodsh && skip "remote MDS with nodsh"
18074 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
18075 skip "Need MDS version at least 2.8.55"
18077 test_mkdir $DIR/$tdir
18079 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
18080 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
18083 #define OBD_FAIL_MDS_XATTR_REP 0x161
18084 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18085 local facet=mds$((mdtidx + 1))
18086 set_nodes_failloc $(facet_active_host $facet) 0x80000161
18087 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
18089 stop $facet || error "stop MDS failed"
18090 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
18091 error "start MDS fail"
18092 wait_recovery_complete $facet
18094 run_test 257 "xattr locks are not lost"
18096 # Verify we take the i_mutex when security requires it
18098 #define OBD_FAIL_IMUTEX_SEC 0x141c
18099 $LCTL set_param fail_loc=0x141c
18101 chmod u+s $DIR/$tfile
18102 chmod a+rwx $DIR/$tfile
18103 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
18105 if [ $RC -ne 0 ]; then
18106 error "error, failed to take i_mutex, rc=$?"
18110 run_test 258a "verify i_mutex security behavior when suid attributes is set"
18112 # Verify we do NOT take the i_mutex in the normal case
18114 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
18115 $LCTL set_param fail_loc=0x141d
18118 chmod a+rw $DIR/$tfile
18119 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
18121 if [ $RC -ne 0 ]; then
18122 error "error, took i_mutex unnecessarily, rc=$?"
18127 run_test 258b "verify i_mutex security behavior"
18130 local file=$DIR/$tfile
18134 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
18136 stack_trap "rm -f $file" EXIT
18138 wait_delete_completed
18139 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
18140 echo "before: $before"
18142 $LFS setstripe -i 0 -c 1 $file
18143 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
18145 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
18146 echo "after write: $after"
18148 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
18149 do_facet ost1 $LCTL set_param fail_loc=0x2301
18151 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
18152 echo "after truncate: $after"
18155 do_facet ost1 $LCTL set_param fail_loc=0
18156 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
18158 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
18159 echo "after restart: $after"
18160 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
18161 error "missing truncate?"
18165 run_test 259 "crash at delayed truncate"
18168 #define OBD_FAIL_MDC_CLOSE 0x806
18169 $LCTL set_param fail_loc=0x80000806
18173 run_test 260 "Check mdc_close fail"
18175 ### Data-on-MDT sanity tests ###
18177 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18178 skip "Need MDS version at least 2.10.55 for DoM"
18181 local dom=$DIR/$tdir/dom_file
18182 local tmp=$DIR/$tdir/tmp_file
18184 mkdir -p $DIR/$tdir
18186 # basic checks for DoM component creation
18187 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
18188 error "Can set MDT layout to non-first entry"
18190 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
18191 error "Can define multiple entries as MDT layout"
18193 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
18195 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
18196 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
18197 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
18199 local mdtidx=$($LFS getstripe -m $dom)
18200 local mdtname=MDT$(printf %04x $mdtidx)
18201 local facet=mds$((mdtidx + 1))
18202 local space_check=1
18204 # Skip free space checks with ZFS
18205 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
18209 local size_tmp=$((65536 * 3))
18210 local mdtfree1=$(do_facet $facet \
18211 lctl get_param -n osd*.*$mdtname.kbytesfree)
18213 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
18214 # check also direct IO along write
18215 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
18216 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
18218 cmp $tmp $dom || error "file data is different"
18219 [ $(stat -c%s $dom) == $size_tmp ] ||
18220 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
18221 if [ $space_check == 1 ]; then
18222 local mdtfree2=$(do_facet $facet \
18223 lctl get_param -n osd*.*$mdtname.kbytesfree)
18225 # increase in usage from by $size_tmp
18226 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
18227 error "MDT free space wrong after write: " \
18228 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
18232 local size_dom=10000
18234 $TRUNCATE $dom $size_dom
18235 [ $(stat -c%s $dom) == $size_dom ] ||
18236 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
18237 if [ $space_check == 1 ]; then
18238 mdtfree1=$(do_facet $facet \
18239 lctl get_param -n osd*.*$mdtname.kbytesfree)
18240 # decrease in usage from $size_tmp to new $size_dom
18241 [ $(($mdtfree1 - $mdtfree2)) -ge \
18242 $(((size_tmp - size_dom) / 1024)) ] ||
18243 error "MDT free space is wrong after truncate: " \
18244 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
18250 size_dom=$((size_dom + size_tmp))
18251 [ $(stat -c%s $dom) == $size_dom ] ||
18252 error "bad size after append: $(stat -c%s $dom) != $size_dom"
18253 if [ $space_check == 1 ]; then
18254 mdtfree2=$(do_facet $facet \
18255 lctl get_param -n osd*.*$mdtname.kbytesfree)
18256 # increase in usage by $size_tmp from previous
18257 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
18258 error "MDT free space is wrong after append: " \
18259 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
18264 if [ $space_check == 1 ]; then
18265 mdtfree1=$(do_facet $facet \
18266 lctl get_param -n osd*.*$mdtname.kbytesfree)
18267 # decrease in usage by $size_dom from previous
18268 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
18269 error "MDT free space is wrong after removal: " \
18270 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
18273 # combined striping
18274 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
18275 error "Can't create DoM + OST striping"
18277 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
18278 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
18279 # check also direct IO along write
18280 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
18282 cmp $tmp $dom || error "file data is different"
18283 [ $(stat -c%s $dom) == $size_tmp ] ||
18284 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
18289 run_test 270a "DoM: basic functionality tests"
18292 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18293 skip "Need MDS version at least 2.10.55"
18295 local dom=$DIR/$tdir/dom_file
18296 local max_size=1048576
18298 mkdir -p $DIR/$tdir
18299 $LFS setstripe -E $max_size -L mdt $dom
18301 # truncate over the limit
18302 $TRUNCATE $dom $(($max_size + 1)) &&
18303 error "successful truncate over the maximum size"
18304 # write over the limit
18305 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
18306 error "successful write over the maximum size"
18307 # append over the limit
18308 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
18309 echo "12345" >> $dom && error "successful append over the maximum size"
18314 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
18317 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18318 skip "Need MDS version at least 2.10.55"
18320 mkdir -p $DIR/$tdir
18321 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18323 # check files inherit DoM EA
18324 touch $DIR/$tdir/first
18325 [ $($LFS getstripe -L $DIR/$tdir/first) == "mdt" ] ||
18326 error "bad pattern"
18327 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
18328 error "bad stripe count"
18329 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
18330 error "bad stripe size"
18332 # check directory inherits DoM EA and uses it as default
18333 mkdir $DIR/$tdir/subdir
18334 touch $DIR/$tdir/subdir/second
18335 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
18336 error "bad pattern in sub-directory"
18337 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
18338 error "bad stripe count in sub-directory"
18339 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
18340 error "bad stripe size in sub-directory"
18343 run_test 270c "DoM: DoM EA inheritance tests"
18346 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18347 skip "Need MDS version at least 2.10.55"
18349 mkdir -p $DIR/$tdir
18350 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18352 # inherit default DoM striping
18353 mkdir $DIR/$tdir/subdir
18354 touch $DIR/$tdir/subdir/f1
18356 # change default directory striping
18357 $LFS setstripe -c 1 $DIR/$tdir/subdir
18358 touch $DIR/$tdir/subdir/f2
18359 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
18360 error "wrong default striping in file 2"
18361 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
18362 error "bad pattern in file 2"
18365 run_test 270d "DoM: change striping from DoM to RAID0"
18368 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18369 skip "Need MDS version at least 2.10.55"
18371 mkdir -p $DIR/$tdir/dom
18372 mkdir -p $DIR/$tdir/norm
18375 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
18376 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
18378 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
18379 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
18381 # find DoM files by layout
18382 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
18383 [ $NUM -eq $DOMFILES ] ||
18384 error "lfs find -L: found $NUM, expected $DOMFILES"
18385 echo "Test 1: lfs find 20 DOM files by layout: OK"
18387 # there should be 1 dir with default DOM striping
18388 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
18390 error "lfs find -L: found $NUM, expected 1 dir"
18391 echo "Test 2: lfs find 1 DOM dir by layout: OK"
18393 # find DoM files by stripe size
18394 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
18395 [ $NUM -eq $DOMFILES ] ||
18396 error "lfs find -S: found $NUM, expected $DOMFILES"
18397 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
18399 # find files by stripe offset except DoM files
18400 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
18401 [ $NUM -eq $NORMFILES ] ||
18402 error "lfs find -i: found $NUM, expected $NORMFILES"
18403 echo "Test 5: lfs find no DOM files by stripe index: OK"
18406 run_test 270e "DoM: lfs find with DoM files test"
18409 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18410 skip "Need MDS version at least 2.10.55"
18412 local mdtname=${FSNAME}-MDT0000-mdtlov
18413 local dom=$DIR/$tdir/dom_file
18414 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
18415 lod.$mdtname.dom_stripesize)
18416 local dom_limit=131072
18418 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
18419 local dom_current=$(do_facet mds1 $LCTL get_param -n \
18420 lod.$mdtname.dom_stripesize)
18421 [ ${dom_limit} -eq ${dom_current} ] ||
18422 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
18424 $LFS mkdir -i 0 -c 1 $DIR/$tdir
18425 $LFS setstripe -d $DIR/$tdir
18426 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
18427 error "Can't set directory default striping"
18429 # exceed maximum stripe size
18430 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18431 error "Can't create file with $((dom_limit * 2)) DoM stripe"
18432 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
18433 error "Able to create DoM component size more than LOD limit"
18435 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
18436 dom_current=$(do_facet mds1 $LCTL get_param -n \
18437 lod.$mdtname.dom_stripesize)
18438 [ 0 -eq ${dom_current} ] ||
18439 error "Can't set zero DoM stripe limit"
18442 # attempt to create DoM file on server with disabled DoM should
18443 # remove DoM entry from layout and be succeed
18444 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
18445 error "Can't create DoM file (DoM is disabled)"
18446 [ $($LFS getstripe -L $dom) == "mdt" ] &&
18447 error "File has DoM component while DoM is disabled"
18450 # attempt to create DoM file with only DoM stripe should return error
18451 $LFS setstripe -E $dom_limit -L mdt $dom &&
18452 error "Able to create DoM-only file while DoM is disabled"
18454 # too low values to be aligned with smallest stripe size 64K
18455 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
18456 dom_current=$(do_facet mds1 $LCTL get_param -n \
18457 lod.$mdtname.dom_stripesize)
18458 [ 30000 -eq ${dom_current} ] &&
18459 error "Can set too small DoM stripe limit"
18461 # 64K is a minimal stripe size in Lustre, expect limit of that size
18462 [ 65536 -eq ${dom_current} ] ||
18463 error "Limit is not set to 64K but ${dom_current}"
18465 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
18466 dom_current=$(do_facet mds1 $LCTL get_param -n \
18467 lod.$mdtname.dom_stripesize)
18469 [ 2147483648 -eq ${dom_current} ] &&
18470 error "Can set too large DoM stripe limit"
18472 do_facet mds1 $LCTL set_param -n \
18473 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
18474 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18475 error "Can't create DoM component size after limit change"
18476 do_facet mds1 $LCTL set_param -n \
18477 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
18478 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
18479 error "Can't create DoM file after limit decrease"
18480 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
18481 error "Can create big DoM component after limit decrease"
18482 touch ${dom}_def ||
18483 error "Can't create file with old default layout"
18485 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
18488 run_test 270f "DoM: maximum DoM stripe size checks"
18491 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18492 skip "Need MDS version at least 2.10.55"
18494 local dom=$DIR/$tdir/dom
18496 mkdir -p $DIR/$tdir
18498 $LFS setstripe -E 1024K -L mdt $dom
18500 lctl set_param -n mdc.*.stats=clear
18501 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18502 cat $dom > /dev/null
18503 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
18504 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
18508 run_test 271a "DoM: data is cached for read after write"
18511 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18512 skip "Need MDS version at least 2.10.55"
18514 local dom=$DIR/$tdir/dom
18516 mkdir -p $DIR/$tdir
18518 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18520 lctl set_param -n mdc.*.stats=clear
18521 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18522 cancel_lru_locks mdc
18523 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
18524 # second stat to check size is cached on client
18525 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
18526 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18527 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
18530 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
18533 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18534 skip "Need MDS version at least 2.10.55"
18536 local dom=$DIR/$tdir/dom
18538 mkdir -p $DIR/$tdir
18540 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18542 lctl set_param -n mdc.*.stats=clear
18543 lctl set_param -n osc.*.stats=clear
18544 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
18545 cancel_lru_locks mdc
18546 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18547 # second stat to check size is cached on client
18548 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18549 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18550 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
18551 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
18552 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
18555 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
18561 local mdt=MDT$(printf %04x $mdtidx)
18563 if [ -z $param ]; then
18564 lctl get_param -n mdc.*$mdt*.stats
18566 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
18571 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18572 skip "Need MDS version at least 2.10.55"
18574 local dom=$DIR/$tdir/dom
18576 mkdir -p $DIR/$tdir
18578 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18580 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18581 local facet=mds$((mdtidx + 1))
18583 cancel_lru_locks mdc
18584 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
18585 createmany -o $dom 1000
18586 lctl set_param -n mdc.*.stats=clear
18587 smalliomany -w $dom 1000 200
18588 get_mdc_stats $mdtidx
18589 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18590 # Each file has 1 open, 1 IO enqueues, total 2000
18591 # but now we have also +1 getxattr for security.capability, total 3000
18592 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
18593 unlinkmany $dom 1000
18595 cancel_lru_locks mdc
18596 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
18597 createmany -o $dom 1000
18598 lctl set_param -n mdc.*.stats=clear
18599 smalliomany -w $dom 1000 200
18600 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18601 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
18602 # for OPEN and IO lock.
18603 [ $((enq - enq_2)) -ge 1000 ] ||
18604 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
18605 unlinkmany $dom 1000
18608 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
18610 cleanup_271def_tests() {
18616 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18617 skip "Need MDS version at least 2.10.57"
18619 local dom=$DIR/$tdir/dom
18620 local tmp=$TMP/$tfile
18621 trap "cleanup_271def_tests $tmp" EXIT
18623 mkdir -p $DIR/$tdir
18625 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18627 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18629 cancel_lru_locks mdc
18630 dd if=/dev/urandom of=$tmp bs=1000 count=1
18631 dd if=$tmp of=$dom bs=1000 count=1
18632 cancel_lru_locks mdc
18634 cat /etc/hosts >> $tmp
18635 lctl set_param -n mdc.*.stats=clear
18637 # append data to the same file it should update local page
18638 echo "Append to the same page"
18639 cat /etc/hosts >> $dom
18640 local num=$(get_mdc_stats $mdtidx ost_read)
18641 local ra=$(get_mdc_stats $mdtidx req_active)
18642 local rw=$(get_mdc_stats $mdtidx req_waittime)
18644 [ -z $num ] || error "$num READ RPC occured"
18645 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18649 cmp $tmp $dom || error "file miscompare"
18651 cancel_lru_locks mdc
18652 lctl set_param -n mdc.*.stats=clear
18654 echo "Open and read file"
18655 cat $dom > /dev/null
18656 local num=$(get_mdc_stats $mdtidx ost_read)
18657 local ra=$(get_mdc_stats $mdtidx req_active)
18658 local rw=$(get_mdc_stats $mdtidx req_waittime)
18660 [ -z $num ] || error "$num READ RPC occured"
18661 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18665 cmp $tmp $dom || error "file miscompare"
18669 run_test 271d "DoM: read on open (1K file in reply buffer)"
18672 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18673 skip "Need MDS version at least 2.10.57"
18675 local dom=$DIR/$tdir/dom
18676 local tmp=$TMP/$tfile
18677 trap "cleanup_271def_tests $tmp" EXIT
18679 mkdir -p $DIR/$tdir
18681 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18683 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18685 cancel_lru_locks mdc
18686 dd if=/dev/urandom of=$tmp bs=265000 count=1
18687 dd if=$tmp of=$dom bs=265000 count=1
18688 cancel_lru_locks mdc
18689 cat /etc/hosts >> $tmp
18690 lctl set_param -n mdc.*.stats=clear
18692 echo "Append to the same page"
18693 cat /etc/hosts >> $dom
18694 local num=$(get_mdc_stats $mdtidx ost_read)
18695 local ra=$(get_mdc_stats $mdtidx req_active)
18696 local rw=$(get_mdc_stats $mdtidx req_waittime)
18698 [ -z $num ] || error "$num READ RPC occured"
18699 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18703 cmp $tmp $dom || error "file miscompare"
18705 cancel_lru_locks mdc
18706 lctl set_param -n mdc.*.stats=clear
18708 echo "Open and read file"
18709 cat $dom > /dev/null
18710 local num=$(get_mdc_stats $mdtidx ost_read)
18711 local ra=$(get_mdc_stats $mdtidx req_active)
18712 local rw=$(get_mdc_stats $mdtidx req_waittime)
18714 [ -z $num ] && num=0
18715 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
18716 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18720 cmp $tmp $dom || error "file miscompare"
18724 run_test 271f "DoM: read on open (200K file and read tail)"
18727 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
18728 skip "Skipping due to old client or server version"
18730 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
18732 $CHECKSTAT -t file $DIR1/$tfile
18734 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
18737 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
18738 $LCTL set_param fail_loc=0x80000314
18739 rm $DIR1/$tfile || error "Unlink fails"
18741 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
18742 [ $RC -eq 0 ] || error "Failed write to stale object"
18744 run_test 271g "Discard DoM data vs client flush race"
18747 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18748 skip "Need MDS version at least 2.11.50"
18750 local dom=$DIR/$tdir/dom
18751 mkdir -p $DIR/$tdir
18753 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
18754 dd if=/dev/urandom of=$dom bs=512K count=1 ||
18755 error "failed to write data into $dom"
18756 local old_md5=$(md5sum $dom)
18758 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
18759 error "failed to migrate to the same DoM component"
18761 local new_md5=$(md5sum $dom)
18763 [ "$old_md5" == "$new_md5" ] ||
18764 error "md5sum differ: $old_md5, $new_md5"
18766 [ $($LFS getstripe -c $dom) -eq 2 ] ||
18767 error "migrate stripe count bad: $(LFS getstripe -c $dom) != 2"
18769 run_test 272a "DoM migration: new layout with the same DOM component"
18772 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18773 skip "Need MDS version at least 2.11.50"
18775 local dom=$DIR/$tdir/dom
18776 mkdir -p $DIR/$tdir
18777 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18779 local mdtidx=$($LFS getstripe -m $dom)
18780 local mdtname=MDT$(printf %04x $mdtidx)
18781 local facet=mds$((mdtidx + 1))
18783 local mdtfree1=$(do_facet $facet \
18784 lctl get_param -n osd*.*$mdtname.kbytesfree)
18785 dd if=/dev/urandom of=$dom bs=2M count=1 ||
18786 error "failed to write data into $dom"
18787 local old_md5=$(md5sum $dom)
18788 cancel_lru_locks mdc
18789 local mdtfree1=$(do_facet $facet \
18790 lctl get_param -n osd*.*$mdtname.kbytesfree)
18792 $LFS migrate -c2 $dom ||
18793 error "failed to migrate to the new composite layout"
18794 [ $($LFS getstripe -L $dom) != 'mdt' ] ||
18795 error "MDT stripe was not removed"
18797 cancel_lru_locks mdc
18798 local new_md5=$(md5sum $dom)
18799 [ "$old_md5" == "$new_md5" ] ||
18800 error "$old_md5 != $new_md5"
18802 # Skip free space checks with ZFS
18803 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18804 local mdtfree2=$(do_facet $facet \
18805 lctl get_param -n osd*.*$mdtname.kbytesfree)
18806 [ $mdtfree2 -gt $mdtfree1 ] ||
18807 error "MDT space is not freed after migration"
18811 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
18814 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18815 skip "Need MDS version at least 2.11.50"
18817 local dom=$DIR/$tdir/$tfile
18818 mkdir -p $DIR/$tdir
18819 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18821 local mdtidx=$($LFS getstripe -m $dom)
18822 local mdtname=MDT$(printf %04x $mdtidx)
18823 local facet=mds$((mdtidx + 1))
18825 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18826 error "failed to write data into $dom"
18827 local old_md5=$(md5sum $dom)
18828 cancel_lru_locks mdc
18829 local mdtfree1=$(do_facet $facet \
18830 lctl get_param -n osd*.*$mdtname.kbytesfree)
18832 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18833 error "failed to migrate to the new composite layout"
18834 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18835 error "MDT stripe was not removed"
18837 cancel_lru_locks mdc
18838 local new_md5=$(md5sum $dom)
18839 [ "$old_md5" == "$new_md5" ] ||
18840 error "$old_md5 != $new_md5"
18842 # Skip free space checks with ZFS
18843 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18844 local mdtfree2=$(do_facet $facet \
18845 lctl get_param -n osd*.*$mdtname.kbytesfree)
18846 [ $mdtfree2 -gt $mdtfree1 ] ||
18847 error "MDS space is not freed after migration"
18851 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18854 [ $MDS1_VERSION -lt $(version_code 2.12.55) ] &&
18855 skip "Need MDS version at least 2.12.55"
18857 local dom=$DIR/$tdir/$tfile
18858 mkdir -p $DIR/$tdir
18859 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18861 local mdtidx=$($LFS getstripe -m $dom)
18862 local mdtname=MDT$(printf %04x $mdtidx)
18863 local facet=mds$((mdtidx + 1))
18865 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18866 error "failed to write data into $dom"
18867 local old_md5=$(md5sum $dom)
18868 cancel_lru_locks mdc
18869 local mdtfree1=$(do_facet $facet \
18870 lctl get_param -n osd*.*$mdtname.kbytesfree)
18872 $LFS mirror extend -N -E 2M -c1 -E -1 -c2 $dom ||
18873 error "failed mirroring to the new composite layout"
18874 $LFS mirror resync $dom ||
18875 error "failed mirror resync"
18876 $LFS mirror split --mirror-id 1 -d $dom ||
18877 error "failed mirror split"
18879 [ $($LFS getstripe -L $dom) != 'mdt' ] ||
18880 error "MDT stripe was not removed"
18882 cancel_lru_locks mdc
18883 local new_md5=$(md5sum $dom)
18884 [ "$old_md5" == "$new_md5" ] ||
18885 error "$old_md5 != $new_md5"
18887 # Skip free space checks with ZFS
18888 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18889 local mdtfree2=$(do_facet $facet \
18890 lctl get_param -n osd*.*$mdtname.kbytesfree)
18891 [ $mdtfree2 -gt $mdtfree1 ] ||
18892 error "MDS space is not freed after DOM mirror deletion"
18896 run_test 272d "DoM mirroring: OST-striped mirror to DOM file"
18899 [ $MDS1_VERSION -lt $(version_code 2.12.55) ] &&
18900 skip "Need MDS version at least 2.12.55"
18902 local dom=$DIR/$tdir/$tfile
18903 mkdir -p $DIR/$tdir
18904 $LFS setstripe -c 2 $dom
18906 dd if=/dev/urandom of=$dom bs=512K count=1 oflag=direct ||
18907 error "failed to write data into $dom"
18908 local old_md5=$(md5sum $dom)
18909 cancel_lru_locks mdc
18911 $LFS mirror extend -N -E 1M -L mdt -E eof -c2 $dom ||
18912 error "failed mirroring to the DOM layout"
18913 $LFS mirror resync $dom ||
18914 error "failed mirror resync"
18915 $LFS mirror split --mirror-id 1 -d $dom ||
18916 error "failed mirror split"
18918 [ $($LFS getstripe -L $dom) != 'mdt' ] ||
18919 error "MDT stripe was not removed"
18921 cancel_lru_locks mdc
18922 local new_md5=$(md5sum $dom)
18923 [ "$old_md5" == "$new_md5" ] ||
18924 error "$old_md5 != $new_md5"
18928 run_test 272e "DoM mirroring: DOM mirror to the OST-striped file"
18931 [ $MDS1_VERSION -lt $(version_code 2.12.55) ] &&
18932 skip "Need MDS version at least 2.12.55"
18934 local dom=$DIR/$tdir/$tfile
18935 mkdir -p $DIR/$tdir
18936 $LFS setstripe -c 2 $dom
18938 dd if=/dev/urandom of=$dom bs=512K count=1 oflag=direct ||
18939 error "failed to write data into $dom"
18940 local old_md5=$(md5sum $dom)
18941 cancel_lru_locks mdc
18943 $LFS migrate -E 1M -L mdt -E eof -c2 -v $dom ||
18944 error "failed migrating to the DOM file"
18946 cancel_lru_locks mdc
18947 local new_md5=$(md5sum $dom)
18948 [ "$old_md5" != "$new_md5" ] &&
18949 error "$old_md5 != $new_md5"
18953 run_test 272f "DoM migration: OST-striped file to DOM file"
18956 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18957 skip "Need MDS version at least 2.11.50"
18959 # Layout swap cannot be done if either file has DOM component,
18960 # this will never be supported, migration should be used instead
18962 local dom=$DIR/$tdir/$tfile
18963 mkdir -p $DIR/$tdir
18965 $LFS setstripe -c2 ${dom}_plain
18966 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18967 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18968 error "can swap layout with DoM component"
18969 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18970 error "can swap layout with DoM component"
18972 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18973 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18974 error "can swap layout with DoM component"
18975 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18976 error "can swap layout with DoM component"
18979 run_test 273a "DoM: layout swapping should fail with DOM"
18982 remote_ost_nodsh && skip "remote OST with nodsh"
18983 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18984 skip "Need OST version >= 2.10.57"
18986 local file=$DIR/$tfile
18989 oss=$(comma_list $(osts_nodes))
18991 dd if=/dev/urandom of=$file bs=1M count=2 ||
18992 error "failed to create a file"
18993 cancel_lru_locks osc
18996 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18997 error "failed to read a file"
18999 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
19000 $LCTL set_param fail_loc=0x8000031f
19002 cancel_lru_locks osc &
19005 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
19006 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
19007 #IO takes another lock, but matches the PENDING one
19008 #and places it to the IO RPC
19009 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
19010 error "failed to read a file with PENDING lock"
19012 run_test 275 "Read on a canceled duplicate lock"
19015 remote_ost_nodsh && skip "remote OST with nodsh"
19018 do_facet ost1 "(while true; do \
19019 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
19020 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
19023 for LOOP in $(seq 20); do
19025 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
19028 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
19029 rm $TMP/sanity_276_pid"
19031 run_test 276 "Race between mount and obd_statfs"
19034 $LCTL set_param ldlm.namespaces.*.lru_size=0
19035 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
19036 local cached_mb=$($LCTL get_param llite.*.max_cached_mb |
19037 grep ^used_mb | awk '{print $2}')
19038 [ $cached_mb -eq 1 ] || error "expected mb 1 got $cached_mb"
19039 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 \
19040 oflag=direct conv=notrunc
19041 cached_mb=$($LCTL get_param llite.*.max_cached_mb |
19042 grep ^used_mb | awk '{print $2}')
19043 [ $cached_mb -eq 0 ] || error "expected mb 0 got $cached_mb"
19045 run_test 277 "Direct IO shall drop page cache"
19048 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
19049 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19050 [[ "$(facet_host mds1)" != "$(facet_host mds2)" ]] &&
19051 skip "needs the same host for mdt1 mdt2" && return
19056 #define OBD_FAIL_OBD_STOP_MDS_RACE 0x60b
19057 do_facet mds2 $LCTL set_param fail_loc=0x8000060c
19063 echo "Starting MDTs"
19064 start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
19066 #For the error assertion will happen. lu_env_get_key(..., &mdt_thread_key)
19068 do_facet mds2 $LCTL set_param fail_loc=0
19070 start mds2 $(mdsdevname 2) $MDS_MOUNT_OPTS
19071 wait_recovery_complete mds2
19073 run_test 278 "Race starting MDS between MDTs stop/start"
19075 cleanup_test_300() {
19079 test_striped_dir() {
19084 mkdir -p $DIR/$tdir
19086 SAVE_UMASK=$(umask)
19087 trap cleanup_test_300 RETURN EXIT
19089 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
19090 $DIR/$tdir/striped_dir ||
19091 error "set striped dir error"
19093 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
19094 [ "$mode" = "755" ] || error "expect 755 got $mode"
19096 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
19097 error "getdirstripe failed"
19098 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
19099 if [ "$stripe_count" != "2" ]; then
19100 error "1:stripe_count is $stripe_count, expect 2"
19102 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
19103 if [ "$stripe_count" != "2" ]; then
19104 error "2:stripe_count is $stripe_count, expect 2"
19107 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
19108 if [ "$stripe_index" != "$mdt_index" ]; then
19109 error "stripe_index is $stripe_index, expect $mdt_index"
19112 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
19113 error "nlink error after create striped dir"
19115 mkdir $DIR/$tdir/striped_dir/a
19116 mkdir $DIR/$tdir/striped_dir/b
19118 stat $DIR/$tdir/striped_dir/a ||
19119 error "create dir under striped dir failed"
19120 stat $DIR/$tdir/striped_dir/b ||
19121 error "create dir under striped dir failed"
19123 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
19124 error "nlink error after mkdir"
19126 rmdir $DIR/$tdir/striped_dir/a
19127 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
19128 error "nlink error after rmdir"
19130 rmdir $DIR/$tdir/striped_dir/b
19131 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
19132 error "nlink error after rmdir"
19134 chattr +i $DIR/$tdir/striped_dir
19135 createmany -o $DIR/$tdir/striped_dir/f 10 &&
19136 error "immutable flags not working under striped dir!"
19137 chattr -i $DIR/$tdir/striped_dir
19139 rmdir $DIR/$tdir/striped_dir ||
19140 error "rmdir striped dir error"
19148 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
19149 skip "skipped for lustre < 2.7.0"
19150 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19151 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19153 test_striped_dir 0 || error "failed on striped dir on MDT0"
19154 test_striped_dir 1 || error "failed on striped dir on MDT0"
19156 run_test 300a "basic striped dir sanity test"
19159 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
19160 skip "skipped for lustre < 2.7.0"
19161 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19162 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19169 test_mkdir $DIR/$tdir || error "mkdir fail"
19170 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
19171 error "set striped dir error"
19172 for i in {0..9}; do
19173 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
19175 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
19176 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
19177 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
19179 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
19180 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
19181 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
19185 run_test 300b "check ctime/mtime for striped dir"
19188 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
19189 skip "skipped for lustre < 2.7.0"
19190 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19191 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19195 mkdir -p $DIR/$tdir
19196 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
19197 error "set striped dir error"
19199 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
19200 error "chown striped dir failed"
19202 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
19203 error "create 5k files failed"
19205 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
19207 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
19211 run_test 300c "chown && check ls under striped directory"
19214 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
19215 skip "skipped for lustre < 2.7.0"
19216 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19217 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19222 mkdir -p $DIR/$tdir
19223 $LFS setstripe -c 2 $DIR/$tdir
19225 #local striped directory
19226 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
19227 error "set striped dir error"
19228 createmany -o $DIR/$tdir/striped_dir/f 10 ||
19229 error "create 10 files failed"
19231 #remote striped directory
19232 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
19233 error "set striped dir error"
19234 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
19235 error "create 10 files failed"
19237 for file in $(find $DIR/$tdir); do
19238 stripe_count=$($LFS getstripe -c $file)
19239 [ $stripe_count -eq 2 ] ||
19240 error "wrong stripe $stripe_count for $file"
19245 run_test 300d "check default stripe under striped directory"
19248 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19249 skip "Need MDS version at least 2.7.55"
19250 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19251 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19256 mkdir -p $DIR/$tdir
19258 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
19259 error "set striped dir error"
19261 touch $DIR/$tdir/striped_dir/a
19262 touch $DIR/$tdir/striped_dir/b
19263 touch $DIR/$tdir/striped_dir/c
19265 mkdir $DIR/$tdir/striped_dir/dir_a
19266 mkdir $DIR/$tdir/striped_dir/dir_b
19267 mkdir $DIR/$tdir/striped_dir/dir_c
19269 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
19270 error "set striped adir under striped dir error"
19272 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
19273 error "set striped bdir under striped dir error"
19275 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
19276 error "set striped cdir under striped dir error"
19278 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
19279 error "rename dir under striped dir fails"
19281 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
19282 error "rename dir under different stripes fails"
19284 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
19285 error "rename file under striped dir should succeed"
19287 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
19288 error "rename dir under striped dir should succeed"
19292 run_test 300e "check rename under striped directory"
19295 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19296 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19297 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19298 skip "Need MDS version at least 2.7.55"
19304 mkdir -p $DIR/$tdir
19306 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
19307 error "set striped dir error"
19309 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
19310 error "set striped dir error"
19312 touch $DIR/$tdir/striped_dir/a
19313 mkdir $DIR/$tdir/striped_dir/dir_a
19314 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
19315 error "create striped dir under striped dir fails"
19317 touch $DIR/$tdir/striped_dir1/b
19318 mkdir $DIR/$tdir/striped_dir1/dir_b
19319 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
19320 error "create striped dir under striped dir fails"
19322 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
19323 error "rename dir under different striped dir should fail"
19325 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
19326 error "rename striped dir under diff striped dir should fail"
19328 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
19329 error "rename file under diff striped dirs fails"
19333 run_test 300f "check rename cross striped directory"
19335 test_300_check_default_striped_dir()
19338 local default_count=$2
19339 local default_index=$3
19342 local dir_stripe_index
19345 echo "checking $dirname $default_count $default_index"
19346 $LFS setdirstripe -D -c $default_count -i $default_index \
19347 -t all_char $DIR/$tdir/$dirname ||
19348 error "set default stripe on striped dir error"
19349 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
19350 [ $stripe_count -eq $default_count ] ||
19351 error "expect $default_count get $stripe_count for $dirname"
19353 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
19354 [ $stripe_index -eq $default_index ] ||
19355 error "expect $default_index get $stripe_index for $dirname"
19357 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
19358 error "create dirs failed"
19360 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
19361 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
19362 for dir in $(find $DIR/$tdir/$dirname/*); do
19363 stripe_count=$($LFS getdirstripe -c $dir)
19364 [ $stripe_count -eq $default_count ] ||
19365 [ $stripe_count -eq 0 ] || [ $default_count -eq 1 ] ||
19366 error "stripe count $default_count != $stripe_count for $dir"
19368 stripe_index=$($LFS getdirstripe -i $dir)
19369 [ $default_index -eq -1 ] ||
19370 [ $stripe_index -eq $default_index ] ||
19371 error "$stripe_index != $default_index for $dir"
19373 #check default stripe
19374 stripe_count=$($LFS getdirstripe -D -c $dir)
19375 [ $stripe_count -eq $default_count ] ||
19376 error "default count $default_count != $stripe_count for $dir"
19378 stripe_index=$($LFS getdirstripe -D -i $dir)
19379 [ $stripe_index -eq $default_index ] ||
19380 error "default index $default_index != $stripe_index for $dir"
19382 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
19386 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19387 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19388 skip "Need MDS version at least 2.7.55"
19395 mkdir $DIR/$tdir/normal_dir
19397 #Checking when client cache stripe index
19398 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
19399 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
19400 error "create striped_dir failed"
19402 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
19403 error "create dir0 fails"
19404 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
19405 [ $stripe_index -eq 0 ] ||
19406 error "dir0 expect index 0 got $stripe_index"
19408 mkdir $DIR/$tdir/striped_dir/dir1 ||
19409 error "create dir1 fails"
19410 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
19411 [ $stripe_index -eq 1 ] ||
19412 error "dir1 expect index 1 got $stripe_index"
19414 #check default stripe count/stripe index
19415 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
19416 test_300_check_default_striped_dir normal_dir 1 0
19417 test_300_check_default_striped_dir normal_dir 2 1
19418 test_300_check_default_striped_dir normal_dir 2 -1
19420 #delete default stripe information
19421 echo "delete default stripeEA"
19422 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
19423 error "set default stripe on striped dir error"
19425 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
19426 for dir in $(find $DIR/$tdir/normal_dir/*); do
19427 stripe_count=$($LFS getdirstripe -c $dir)
19428 [ $stripe_count -eq 0 ] ||
19429 error "expect 1 get $stripe_count for $dir"
19430 stripe_index=$($LFS getdirstripe -i $dir)
19431 [ $stripe_index -eq 0 ] ||
19432 error "expect 0 get $stripe_index for $dir"
19435 run_test 300g "check default striped directory for normal directory"
19438 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19439 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19440 skip "Need MDS version at least 2.7.55"
19446 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19447 error "set striped dir error"
19449 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
19450 test_300_check_default_striped_dir striped_dir 1 0
19451 test_300_check_default_striped_dir striped_dir 2 1
19452 test_300_check_default_striped_dir striped_dir 2 -1
19454 #delete default stripe information
19455 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
19456 error "set default stripe on striped dir error"
19458 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
19459 for dir in $(find $DIR/$tdir/striped_dir/*); do
19460 stripe_count=$($LFS getdirstripe -c $dir)
19461 [ $stripe_count -eq 0 ] ||
19462 error "expect 1 get $stripe_count for $dir"
19465 run_test 300h "check default striped directory for striped directory"
19468 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19469 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19470 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19471 skip "Need MDS version at least 2.7.55"
19478 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19479 error "set striped dir error"
19481 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
19482 error "create files under striped dir failed"
19484 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
19485 error "set striped hashdir error"
19487 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
19488 error "create dir0 under hash dir failed"
19489 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
19490 error "create dir1 under hash dir failed"
19492 # unfortunately, we need to umount to clear dir layout cache for now
19493 # once we fully implement dir layout, we can drop this
19494 umount_client $MOUNT || error "umount failed"
19495 mount_client $MOUNT || error "mount failed"
19497 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
19498 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
19499 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
19501 #set the stripe to be unknown hash type
19502 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
19503 $LCTL set_param fail_loc=0x1901
19504 for ((i = 0; i < 10; i++)); do
19505 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
19506 error "stat f-$i failed"
19507 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
19510 touch $DIR/$tdir/striped_dir/f0 &&
19511 error "create under striped dir with unknown hash should fail"
19513 $LCTL set_param fail_loc=0
19515 umount_client $MOUNT || error "umount failed"
19516 mount_client $MOUNT || error "mount failed"
19520 run_test 300i "client handle unknown hash type striped directory"
19523 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19524 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19525 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19526 skip "Need MDS version at least 2.7.55"
19533 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
19534 $LCTL set_param fail_loc=0x1702
19535 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19536 error "set striped dir error"
19538 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
19539 error "create files under striped dir failed"
19541 $LCTL set_param fail_loc=0
19543 rm -rf $DIR/$tdir || error "unlink striped dir fails"
19547 run_test 300j "test large update record"
19550 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19551 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19552 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19553 skip "Need MDS version at least 2.7.55"
19555 # this test needs a huge transaction
19557 kb=$(do_facet $SINGLEMDS lctl get_param -n osd*.lustre-MDT0000.kbytestotal)
19558 [ $kb -lt $((1024*1024)) ] && skip "too small mds: $kb"
19565 #define OBD_FAIL_LARGE_STRIPE 0x1703
19566 $LCTL set_param fail_loc=0x1703
19567 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
19568 error "set striped dir error"
19569 $LCTL set_param fail_loc=0
19571 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19572 error "getstripeddir fails"
19573 rm -rf $DIR/$tdir/striped_dir ||
19574 error "unlink striped dir fails"
19578 run_test 300k "test large striped directory"
19581 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19582 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19583 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19584 skip "Need MDS version at least 2.7.55"
19588 test_mkdir -p $DIR/$tdir/striped_dir
19589 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
19590 error "chown $RUNAS_ID failed"
19591 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
19592 error "set default striped dir failed"
19594 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
19595 $LCTL set_param fail_loc=0x80000158
19596 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
19598 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
19599 [ $stripe_index -eq 1 ] ||
19600 error "expect 1 get $stripe_index for $dir"
19602 run_test 300l "non-root user to create dir under striped dir with stale layout"
19605 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19606 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
19607 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19608 skip "Need MDS version at least 2.7.55"
19610 mkdir -p $DIR/$tdir/striped_dir
19611 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
19612 error "set default stripes dir error"
19614 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
19616 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
19617 [ $stripe_count -eq 0 ] ||
19618 error "expect 0 get $stripe_count for a"
19620 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
19621 error "set default stripes dir error"
19623 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
19625 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
19626 [ $stripe_count -eq 0 ] ||
19627 error "expect 0 get $stripe_count for b"
19629 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
19630 error "set default stripes dir error"
19632 mkdir $DIR/$tdir/striped_dir/c &&
19633 error "default stripe_index is invalid, mkdir c should fails"
19635 rm -rf $DIR/$tdir || error "rmdir fails"
19637 run_test 300m "setstriped directory on single MDT FS"
19640 local list=$(comma_list $(mdts_nodes))
19643 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19647 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19648 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19649 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19650 skip "Need MDS version at least 2.7.55"
19651 remote_mds_nodsh && skip "remote MDS with nodsh"
19654 local list=$(comma_list $(mdts_nodes))
19656 trap cleanup_300n RETURN EXIT
19657 mkdir -p $DIR/$tdir
19658 chmod 777 $DIR/$tdir
19659 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
19660 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19661 error "create striped dir succeeds with gid=0"
19663 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19664 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
19665 error "create striped dir fails with gid=-1"
19667 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19668 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
19669 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19670 error "set default striped dir succeeds with gid=0"
19673 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19674 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
19675 error "set default striped dir fails with gid=-1"
19678 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19679 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
19680 error "create test_dir fails"
19681 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
19682 error "create test_dir1 fails"
19683 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
19684 error "create test_dir2 fails"
19687 run_test 300n "non-root user to create dir under striped dir with default EA"
19690 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19691 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19692 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19693 skip "Need MDS version at least 2.7.55"
19698 mkdir -p $DIR/$tdir
19700 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
19701 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
19702 if [ $numfree1 -lt 66000 ] || [ $numfree2 -lt 66000 ]; then
19703 skip "not enough free inodes $numfree1 $numfree2"
19706 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
19707 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
19708 if [ $numfree1 -lt 300000 ] || [ $numfree2 -lt 300000 ]; then
19709 skip "not enough free space $numfree1 $numfree2"
19712 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
19713 error "setdirstripe fails"
19715 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
19716 error "create dirs fails"
19718 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
19719 ls $DIR/$tdir/striped_dir > /dev/null ||
19720 error "ls striped dir fails"
19721 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
19722 error "unlink big striped dir fails"
19724 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
19727 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19728 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19729 remote_mds_nodsh && skip "remote MDS with nodsh"
19731 mkdir -p $DIR/$tdir
19733 #define OBD_FAIL_OUT_ENOSPC 0x1704
19734 do_facet mds2 lctl set_param fail_loc=0x80001704
19735 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
19736 && error "create striped directory should fail"
19738 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
19740 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
19743 run_test 300p "create striped directory without space"
19746 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19747 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19749 local fd=$(free_fd)
19750 local cmd="exec $fd<$tdir"
19752 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
19755 trap "eval $cmd" EXIT
19756 cd $tdir || error "cd $tdir fails"
19757 rmdir ../$tdir || error "rmdir $tdir fails"
19758 mkdir local_dir && error "create dir succeeds"
19759 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
19763 run_test 300q "create remote directory under orphan directory"
19766 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
19767 skip "Need MDS version at least 2.7.55" && return
19768 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19772 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
19773 error "set striped dir error"
19775 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19776 error "getstripeddir fails"
19779 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
19780 awk '/lmv_stripe_count:/ { print $2 }')
19782 [ $MDSCOUNT -ne $stripe_count ] &&
19783 error "wrong stripe count $stripe_count expected $MDSCOUNT"
19785 rm -rf $DIR/$tdir/striped_dir ||
19786 error "unlink striped dir fails"
19788 run_test 300r "test -1 striped directory"
19790 prepare_remote_file() {
19791 mkdir $DIR/$tdir/src_dir ||
19792 error "create remote source failed"
19794 cp /etc/hosts $DIR/$tdir/src_dir/a ||
19795 error "cp to remote source failed"
19796 touch $DIR/$tdir/src_dir/a
19798 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
19799 error "create remote target dir failed"
19801 touch $DIR/$tdir/tgt_dir/b
19803 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
19804 error "rename dir cross MDT failed!"
19806 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
19807 error "src_child still exists after rename"
19809 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
19810 error "missing file(a) after rename"
19812 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
19813 error "diff after rename"
19817 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19818 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19820 local remote_file=$DIR/$tdir/tgt_dir/b
19822 mkdir -p $DIR/$tdir
19824 prepare_remote_file || error "prepare remote file failed"
19827 $OPENUNLINK $remote_file $remote_file ||
19828 error "openunlink $remote_file failed"
19829 $CHECKSTAT -a $remote_file || error "$remote_file exists"
19831 run_test 310a "open unlink remote file"
19834 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19835 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19837 local remote_file=$DIR/$tdir/tgt_dir/b
19839 mkdir -p $DIR/$tdir
19841 prepare_remote_file || error "prepare remote file failed"
19843 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19844 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
19845 $CHECKSTAT -t file $remote_file || error "check file failed"
19847 run_test 310b "unlink remote file with multiple links while open"
19850 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19851 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
19853 local remote_file=$DIR/$tdir/tgt_dir/b
19855 mkdir -p $DIR/$tdir
19857 prepare_remote_file || error "prepare remote file failed"
19859 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19860 multiop_bg_pause $remote_file O_uc ||
19861 error "mulitop failed for remote file"
19863 $MULTIOP $DIR/$tfile Ouc
19864 kill -USR1 $MULTIPID
19867 run_test 310c "open-unlink remote file with multiple links"
19871 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19872 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19873 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
19874 skip "lustre < 2.8.54 does not contain LU-4825 fix"
19875 remote_mds_nodsh && skip "remote MDS with nodsh"
19877 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19878 local mdts=$(comma_list $(mdts_nodes))
19880 mkdir -p $DIR/$tdir
19881 $LFS setstripe -i 0 -c 1 $DIR/$tdir
19882 createmany -o $DIR/$tdir/$tfile. 1000
19884 # statfs data is not real time, let's just calculate it
19885 old_iused=$((old_iused + 1000))
19887 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19888 osp.*OST0000*MDT0000.create_count")
19889 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19890 osp.*OST0000*MDT0000.max_create_count")
19891 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
19893 $LFS setstripe -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
19894 local index=$($LFS getstripe -i $DIR/$tdir/$tfile)
19895 [ $index -ne 0 ] || error "$tfile stripe index is 0"
19897 unlinkmany $DIR/$tdir/$tfile. 1000
19899 do_nodes $mdts "$LCTL set_param -n \
19900 osp.*OST0000*.max_create_count=$max_count"
19901 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
19902 do_nodes $mdts "$LCTL set_param -n \
19903 osp.*OST0000*.create_count=$count"
19904 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
19905 grep "=0" && error "create_count is zero"
19908 for i in $(seq 120); do
19909 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19910 # system may be too busy to destroy all objs in time, use
19911 # a somewhat small value to not fail autotest
19912 [ $((old_iused - new_iused)) -gt 400 ] && break
19916 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
19917 [ $((old_iused - new_iused)) -gt 400 ] ||
19918 error "objs not destroyed after unlink"
19920 run_test 311 "disable OSP precreate, and unlink should destroy objs"
19927 local vdevdir=$(dirname $(facet_vdevice $ost))
19928 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
19929 local zfs_zapid=$(do_facet $ost $cmd |
19930 grep -w "/O/0/d$((objid%32))" -C 5 |
19931 awk '/Object/{getline; print $1}')
19932 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
19933 awk "/$objid = /"'{printf $3}')
19938 zfs_object_blksz() {
19942 local vdevdir=$(dirname $(facet_vdevice $ost))
19943 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
19944 local blksz=$(do_facet $ost $cmd $objid |
19945 awk '/dblk/{getline; printf $4}')
19947 case "${blksz: -1}" in
19948 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
19949 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
19956 test_312() { # LU-4856
19957 remote_ost_nodsh && skip "remote OST with nodsh"
19958 [ "$ost1_FSTYPE" = "zfs" ] ||
19959 skip_env "the test only applies to zfs"
19961 local max_blksz=$(do_facet ost1 \
19962 $ZFS get -p recordsize $(facet_device ost1) |
19963 awk '!/VALUE/{print $3}')
19965 # to make life a little bit easier
19966 $LFS mkdir -c 1 -i 0 $DIR/$tdir
19967 $LFS setstripe -c 1 -i 0 $DIR/$tdir
19969 local tf=$DIR/$tdir/$tfile
19971 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19973 # Get ZFS object id
19974 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19975 # block size change by sequential overwrite
19978 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
19979 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
19981 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
19982 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19986 # block size change by sequential append write
19987 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19988 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19989 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19992 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19993 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19994 oflag=sync conv=notrunc
19996 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19997 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19998 error "blksz error, actual $blksz, " \
19999 "expected: 2 * $count * $PAGE_SIZE"
20005 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
20006 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
20008 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
20009 blksz=$(zfs_object_blksz ost1 $zfs_objid)
20010 [ $blksz -eq $PAGE_SIZE ] ||
20011 error "blksz error: $blksz, expected: $PAGE_SIZE"
20013 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
20014 blksz=$(zfs_object_blksz ost1 $zfs_objid)
20015 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
20017 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
20018 blksz=$(zfs_object_blksz ost1 $zfs_objid)
20019 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
20021 run_test 312 "make sure ZFS adjusts its block size by write pattern"
20024 remote_ost_nodsh && skip "remote OST with nodsh"
20026 local file=$DIR/$tfile
20029 $LFS setstripe -c 1 -i 0 $file || error "setstripe failed"
20031 # define OBD_FAIL_TGT_RCVD_EIO 0x720
20032 do_facet ost1 "$LCTL set_param fail_loc=0x720"
20033 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
20034 error "write should failed"
20035 do_facet ost1 "$LCTL set_param fail_loc=0"
20038 run_test 313 "io should fail after last_rcvd update fail"
20041 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
20043 $LFS setstripe -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
20044 do_facet ost1 "$LCTL set_param fail_loc=0x720"
20046 wait_delete_completed
20047 do_facet ost1 "$LCTL set_param fail_loc=0"
20049 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
20051 test_315() { # LU-618
20052 [ -f /proc/$$/io ] || skip_env "no IO accounting in kernel"
20054 local file=$DIR/$tfile
20057 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
20058 error "multiop file write failed"
20059 $MULTIOP $file oO_RDONLY:r4063232_c &
20064 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
20067 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
20070 run_test 315 "read should be accounted"
20073 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20074 large_xattr_enabled || skip_env "ea_inode feature disabled"
20076 rm -rf $DIR/$tdir/d
20077 mkdir -p $DIR/$tdir/d
20078 chown nobody $DIR/$tdir/d
20079 touch $DIR/$tdir/d/file
20081 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
20083 run_test 316 "lfs mv"
20086 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
20087 skip "Need MDS version at least 2.11.53"
20088 if [ "$ost1_FSTYPE" == "zfs" ]; then
20089 skip "LU-10370: no implementation for ZFS"
20093 local grant_blk_size
20095 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
20096 awk '/grant_block_size:/ { print $2; exit; }')
20098 # Create File of size 5M. Truncate it to below size's and verify
20101 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
20102 error "Create file $DIR/$tfile failed"
20103 stack_trap "rm -f $DIR/$tfile" EXIT
20105 for trunc_sz in 2097152 4097 4000 509 0; do
20106 $TRUNCATE $DIR/$tfile $trunc_sz ||
20107 error "truncate $tfile to $trunc_sz failed"
20108 local sz=$(stat --format=%s $DIR/$tfile)
20109 local blk=$(stat --format=%b $DIR/$tfile)
20110 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
20111 grant_blk_size) * 8))
20113 if [[ $blk -ne $trunc_blk ]]; then
20114 $(which stat) $DIR/$tfile
20115 error "Expected Block $trunc_blk got $blk for $tfile"
20118 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
20119 error "Expected Size $trunc_sz got $sz for $tfile"
20124 # Create file with a hole and write actual two blocks. Block count
20127 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
20128 conv=fsync || error "Create file : $DIR/$tfile"
20130 # Calculate the final truncate size.
20131 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
20134 # truncate to size $trunc_sz bytes. Strip the last block
20135 # The block count must drop to 8
20137 $TRUNCATE $DIR/$tfile $trunc_sz ||
20138 error "truncate $tfile to $trunc_sz failed"
20140 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
20141 sz=$(stat --format=%s $DIR/$tfile)
20142 blk=$(stat --format=%b $DIR/$tfile)
20144 if [[ $blk -ne $trunc_bsz ]]; then
20145 $(which stat) $DIR/$tfile
20146 error "Expected Block $trunc_bsz got $blk for $tfile"
20149 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
20150 error "Expected Size $trunc_sz got $sz for $tfile"
20152 run_test 317 "Verify blocks get correctly update after truncate"
20155 local old_max_active=$($LCTL get_param -n \
20156 llite.*.max_read_ahead_async_active 2>/dev/null)
20158 $LCTL set_param llite.*.max_read_ahead_async_active=256
20159 local max_active=$($LCTL get_param -n \
20160 llite.*.max_read_ahead_async_active 2>/dev/null)
20161 [ $max_active -ne 256 ] && error "expected 256 but got $max_active"
20163 # currently reset to 0 is unsupported, leave it 512 for now.
20164 $LCTL set_param llite.*.max_read_ahead_async_active=0 &&
20165 error "set max_read_ahead_async_active should fail"
20167 $LCTL set_param llite.*.max_read_ahead_async_active=512
20168 max_active=$($LCTL get_param -n \
20169 llite.*.max_read_ahead_async_active 2>/dev/null)
20170 [ $max_active -eq 512 ] || error "expected 512 but got $max_active"
20172 # restore @max_active
20173 [ $old_max_active -ne 0 ] && $LCTL set_param \
20174 llite.*.max_read_ahead_async_active=$old_max_active
20176 local old_threshold=$($LCTL get_param -n \
20177 llite.*.read_ahead_async_file_threshold_mb 2>/dev/null)
20178 local max_per_file_mb=$($LCTL get_param -n \
20179 llite.*.max_read_ahead_per_file_mb 2>/dev/null)
20181 local invalid=$(($max_per_file_mb + 1))
20183 llite.*.read_ahead_async_file_threshold_mb=$invalid\
20184 && error "set $invalid should fail"
20186 local valid=$(($invalid - 1))
20188 llite.*.read_ahead_async_file_threshold_mb=$valid ||
20189 error "set $valid should succeed"
20190 local threshold=$($LCTL get_param -n \
20191 llite.*.read_ahead_async_file_threshold_mb 2>/dev/null)
20192 [ $threshold -eq $valid ] || error \
20193 "expect threshold $valid got $threshold"
20195 llite.*.read_ahead_async_file_threshold_mb=$old_threshold
20197 run_test 318 "Verify async readahead tunables"
20200 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
20202 local before=$(date +%s)
20204 local mdir=$DIR/$tdir
20205 local file=$mdir/xxx
20207 $LFS mkdir -i0 $mdir || error "mkdir $mdir fails"
20210 #define OBD_FAIL_LDLM_LOCAL_CANCEL_PAUSE 0x32c
20211 $LCTL set_param fail_val=5 fail_loc=0x8000032c
20212 $LFS mv -m1 $file &
20215 dd if=$file of=/dev/null
20217 evict=$($LCTL get_param mdc.$FSNAME-MDT*.state |
20218 awk -F"[ [,]" '/EVICTED ]$/ { if (mx<$5) {mx=$5;} } END { print mx }')
20220 [ -z "$evict" ] || [[ $evict -le $before ]] || error "eviction happened"
20222 run_test 319 "lost lease lock on migrate error"
20225 local read_write=$1
20226 if [ "$read_write" = "write" ]; then
20227 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
20228 elif [ "$read_write" = "read" ]; then
20229 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
20231 error "argument error"
20234 # turn off debug for performance testing
20235 local saved_debug=$($LCTL get_param -n debug)
20236 $LCTL set_param debug=0
20238 $LFS setstripe -c 1 -i 0 $DIR/$tfile
20240 # get ost1 size - lustre-OST0000
20241 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
20242 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
20243 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
20245 if [ "$read_write" = "read" ]; then
20246 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
20249 local start_time=$(date +%s.%N)
20250 $dd_cmd bs=1M count=$blocks oflag=sync ||
20251 error "real dd $read_write error"
20252 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
20254 if [ "$read_write" = "write" ]; then
20258 # define OBD_FAIL_OST_FAKE_RW 0x238
20259 do_facet ost1 $LCTL set_param fail_loc=0x238
20261 local start_time=$(date +%s.%N)
20262 $dd_cmd bs=1M count=$blocks oflag=sync ||
20263 error "fake dd $read_write error"
20264 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
20266 if [ "$read_write" = "write" ]; then
20268 cancel_lru_locks osc
20269 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
20270 error "$tfile size not $blocks MB"
20272 do_facet ost1 $LCTL set_param fail_loc=0
20274 echo "fake $read_write $duration_fake vs. normal $read_write" \
20275 "$duration in seconds"
20276 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
20277 error_not_in_vm "fake write is slower"
20279 $LCTL set_param -n debug="$saved_debug"
20282 test_399a() { # LU-7655 for OST fake write
20283 remote_ost_nodsh && skip "remote OST with nodsh"
20287 run_test 399a "fake write should not be slower than normal write"
20289 test_399b() { # LU-8726 for OST fake read
20290 remote_ost_nodsh && skip "remote OST with nodsh"
20291 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
20292 skip_env "ldiskfs only test"
20297 run_test 399b "fake read should not be slower than normal read"
20299 test_400a() { # LU-1606, was conf-sanity test_74
20300 if ! which $CC > /dev/null 2>&1; then
20301 skip_env "$CC is not installed"
20304 local extra_flags=''
20305 local out=$TMP/$tfile
20306 local prefix=/usr/include/lustre
20309 if ! [[ -d $prefix ]]; then
20310 # Assume we're running in tree and fixup the include path.
20311 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
20312 extra_flags+=" -L$LUSTRE/utils/.lib"
20315 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
20316 $CC -Wall -Werror $extra_flags -o $out $prog -llustreapi ||
20317 error "client api broken"
20321 run_test 400a "Lustre client api program can compile and link"
20323 test_400b() { # LU-1606, LU-5011
20325 local out=$TMP/$tfile
20326 local prefix=/usr/include/linux/lustre
20328 # We use a hard coded prefix so that this test will not fail
20329 # when run in tree. There are headers in lustre/include/lustre/
20330 # that are not packaged (like lustre_idl.h) and have more
20331 # complicated include dependencies (like config.h and lnet/types.h).
20332 # Since this test about correct packaging we just skip them when
20333 # they don't exist (see below) rather than try to fixup cppflags.
20335 if ! which $CC > /dev/null 2>&1; then
20336 skip_env "$CC is not installed"
20339 for header in $prefix/*.h; do
20340 if ! [[ -f "$header" ]]; then
20344 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
20345 continue # lustre_ioctl.h is internal header
20348 $CC -Wall -Werror -include $header -c -x c /dev/null -o $out ||
20349 error "cannot compile '$header'"
20353 run_test 400b "packaged headers can be compiled"
20355 test_401a() { #LU-7437
20356 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
20357 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
20359 #count the number of parameters by "list_param -R"
20360 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
20361 #count the number of parameters by listing proc files
20362 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
20363 echo "proc_dirs='$proc_dirs'"
20364 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
20365 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
20368 [ $params -eq $procs ] ||
20369 error "found $params parameters vs. $procs proc files"
20371 # test the list_param -D option only returns directories
20372 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
20373 #count the number of parameters by listing proc directories
20374 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
20377 [ $params -eq $procs ] ||
20378 error "found $params parameters vs. $procs proc files"
20380 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
20383 local save=$($LCTL get_param -n jobid_var)
20386 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
20387 error "no error returned when setting bad parameters"
20389 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
20390 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
20392 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
20393 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
20394 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
20396 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
20399 local jobid_var_old=$($LCTL get_param -n jobid_var)
20400 local jobid_var_new
20402 $LCTL set_param jobid_var= &&
20403 error "no error returned for 'set_param a='"
20405 jobid_var_new=$($LCTL get_param -n jobid_var)
20406 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
20407 error "jobid_var was changed by setting without value"
20409 $LCTL set_param jobid_var &&
20410 error "no error returned for 'set_param a'"
20412 jobid_var_new=$($LCTL get_param -n jobid_var)
20413 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
20414 error "jobid_var was changed by setting without value"
20416 run_test 401c "Verify 'lctl set_param' without value fails in either format."
20419 local jobid_var_old=$($LCTL get_param -n jobid_var)
20420 local jobid_var_new
20421 local new_value="foo=bar"
20423 $LCTL set_param jobid_var=$new_value ||
20424 error "'set_param a=b' did not accept a value containing '='"
20426 jobid_var_new=$($LCTL get_param -n jobid_var)
20427 [[ "$jobid_var_new" == "$new_value" ]] ||
20428 error "'set_param a=b' failed on a value containing '='"
20430 # Reset the jobid_var to test the other format
20431 $LCTL set_param jobid_var=$jobid_var_old
20432 jobid_var_new=$($LCTL get_param -n jobid_var)
20433 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
20434 error "failed to reset jobid_var"
20436 $LCTL set_param jobid_var $new_value ||
20437 error "'set_param a b' did not accept a value containing '='"
20439 jobid_var_new=$($LCTL get_param -n jobid_var)
20440 [[ "$jobid_var_new" == "$new_value" ]] ||
20441 error "'set_param a b' failed on a value containing '='"
20443 $LCTL set_param jobid_var $jobid_var_old
20444 jobid_var_new=$($LCTL get_param -n jobid_var)
20445 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
20446 error "failed to reset jobid_var"
20448 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
20451 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
20452 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
20453 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
20454 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
20455 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
20456 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
20457 remote_mds_nodsh && skip "remote MDS with nodsh"
20459 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
20460 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
20461 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
20462 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
20463 echo "Touch failed - OK"
20465 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
20468 local file1=$DIR/$tfile.1
20469 local file2=$DIR/$tfile.2
20470 local tfile=$TMP/$tfile
20472 rm -f $file1 $file2 $tfile
20477 # 30 sec OBD_TIMEOUT in ll_getattr()
20478 # right before populating st_nlink
20479 $LCTL set_param fail_loc=0x80001409
20480 stat -c %h $file1 > $tfile &
20482 # create an alias, drop all locks and reclaim the dentry
20484 cancel_lru_locks mdc
20485 cancel_lru_locks osc
20486 sysctl -w vm.drop_caches=2
20490 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
20492 rm -f $tfile $file1 $file2
20494 run_test 403 "i_nlink should not drop to zero due to aliasing"
20496 test_404() { # LU-6601
20497 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
20498 skip "Need server version newer than 2.8.52"
20499 remote_mds_nodsh && skip "remote MDS with nodsh"
20501 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
20502 awk '/osp .*-osc-MDT/ { print $4}')
20505 for osp in $mosps; do
20506 echo "Deactivate: " $osp
20507 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
20508 local stat=$(do_facet $SINGLEMDS $LCTL dl |
20509 awk -vp=$osp '$4 == p { print $2 }')
20510 [ $stat = IN ] || {
20511 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
20512 error "deactivate error"
20514 echo "Activate: " $osp
20515 do_facet $SINGLEMDS $LCTL --device %$osp activate
20516 local stat=$(do_facet $SINGLEMDS $LCTL dl |
20517 awk -vp=$osp '$4 == p { print $2 }')
20518 [ $stat = UP ] || {
20519 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
20520 error "activate error"
20524 run_test 404 "validate manual {de}activated works properly for OSPs"
20527 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
20528 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] ||
20529 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
20530 skip "Layout swap lock is not supported"
20532 check_swap_layouts_support
20534 test_mkdir $DIR/$tdir
20535 swap_lock_test -d $DIR/$tdir ||
20536 error "One layout swap locked test failed"
20538 run_test 405 "Various layout swap lock tests"
20541 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20542 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
20543 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
20544 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20545 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
20546 skip "Need MDS version at least 2.8.50"
20548 local def_stripe_size=$($LFS getstripe -S $MOUNT)
20549 local test_pool=$TESTNAME
20551 pool_add $test_pool || error "pool_add failed"
20552 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
20553 error "pool_add_targets failed"
20555 save_layout_restore_at_exit $MOUNT
20557 # parent set default stripe count only, child will stripe from both
20558 # parent and fs default
20559 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
20560 error "setstripe $MOUNT failed"
20561 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
20562 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
20563 for i in $(seq 10); do
20564 local f=$DIR/$tdir/$tfile.$i
20565 touch $f || error "touch failed"
20566 local count=$($LFS getstripe -c $f)
20567 [ $count -eq $OSTCOUNT ] ||
20568 error "$f stripe count $count != $OSTCOUNT"
20569 local offset=$($LFS getstripe -i $f)
20570 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
20571 local size=$($LFS getstripe -S $f)
20572 [ $size -eq $((def_stripe_size * 2)) ] ||
20573 error "$f stripe size $size != $((def_stripe_size * 2))"
20574 local pool=$($LFS getstripe -p $f)
20575 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
20578 # change fs default striping, delete parent default striping, now child
20579 # will stripe from new fs default striping only
20580 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
20581 error "change $MOUNT default stripe failed"
20582 $LFS setstripe -c 0 $DIR/$tdir ||
20583 error "delete $tdir default stripe failed"
20584 for i in $(seq 11 20); do
20585 local f=$DIR/$tdir/$tfile.$i
20586 touch $f || error "touch $f failed"
20587 local count=$($LFS getstripe -c $f)
20588 [ $count -eq 1 ] || error "$f stripe count $count != 1"
20589 local offset=$($LFS getstripe -i $f)
20590 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
20591 local size=$($LFS getstripe -S $f)
20592 [ $size -eq $def_stripe_size ] ||
20593 error "$f stripe size $size != $def_stripe_size"
20594 local pool=$($LFS getstripe -p $f)
20595 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
20598 unlinkmany $DIR/$tdir/$tfile. 1 20
20600 local f=$DIR/$tdir/$tfile
20601 pool_remove_all_targets $test_pool $f
20602 pool_remove $test_pool $f
20604 run_test 406 "DNE support fs default striping"
20607 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20608 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
20609 skip "Need MDS version at least 2.8.55"
20610 remote_mds_nodsh && skip "remote MDS with nodsh"
20612 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
20613 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
20614 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
20615 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
20616 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
20618 #define OBD_FAIL_DT_TXN_STOP 0x2019
20619 for idx in $(seq $MDSCOUNT); do
20620 do_facet mds$idx "lctl set_param fail_loc=0x2019"
20622 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
20623 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
20624 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
20627 run_test 407 "transaction fail should cause operation fail"
20630 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
20632 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
20633 lctl set_param fail_loc=0x8000040a
20634 # let ll_prepare_partial_page() fail
20635 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
20639 # create at least 100 unused inodes so that
20640 # shrink_icache_memory(0) should not return 0
20641 touch $DIR/$tfile-{0..100}
20642 rm -f $DIR/$tfile-{0..100}
20645 echo 2 > /proc/sys/vm/drop_caches
20647 run_test 408 "drop_caches should not hang due to page leaks"
20651 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20653 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
20654 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
20655 touch $DIR/$tdir/guard || error "(2) Fail to create"
20657 local PREFIX=$(str_repeat 'A' 128)
20658 echo "Create 1K hard links start at $(date)"
20659 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20660 error "(3) Fail to hard link"
20662 echo "Links count should be right although linkEA overflow"
20663 stat $DIR/$tdir/guard || error "(4) Fail to stat"
20664 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
20665 [ $linkcount -eq 1001 ] ||
20666 error "(5) Unexpected hard links count: $linkcount"
20668 echo "List all links start at $(date)"
20669 ls -l $DIR/$tdir/foo > /dev/null ||
20670 error "(6) Fail to list $DIR/$tdir/foo"
20672 echo "Unlink hard links start at $(date)"
20673 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20674 error "(7) Fail to unlink"
20675 echo "Unlink hard links finished at $(date)"
20677 run_test 409 "Large amount of cross-MDTs hard links on the same file"
20681 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
20682 skip "Need client version at least 2.9.59"
20684 # Create a file, and stat it from the kernel
20685 local testfile=$DIR/$tfile
20688 local run_id=$RANDOM
20689 local my_ino=$(stat --format "%i" $testfile)
20691 # Try to insert the module. This will always fail as the
20692 # module is designed to not be inserted.
20693 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
20696 # Anything but success is a test failure
20698 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
20699 error "no inode match"
20701 run_test 410 "Test inode number returned from kernel thread"
20703 cleanup_test411_cgroup() {
20709 local cg_basedir=/sys/fs/cgroup/memory
20711 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
20712 skip "no setup for cgroup"
20714 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
20715 error "test file creation failed"
20716 cancel_lru_locks osc
20718 # Create a very small memory cgroup to force a slab allocation error
20719 local cgdir=$cg_basedir/osc_slab_alloc
20720 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
20721 trap "cleanup_test411_cgroup $cgdir" EXIT
20722 echo 2M > $cgdir/memory.kmem.limit_in_bytes
20723 echo 1M > $cgdir/memory.limit_in_bytes
20725 # Should not LBUG, just be killed by oom-killer
20726 # dd will return 0 even allocation failure in some environment.
20727 # So don't check return value
20728 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
20729 cleanup_test411_cgroup $cgdir
20733 run_test 411 "Slab allocation error with cgroup does not LBUG"
20736 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20737 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20738 skip "Need server version at least 2.10.55"
20741 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
20742 error "mkdir failed"
20743 $LFS getdirstripe $DIR/$tdir
20744 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
20745 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
20746 error "expect $((MDSCOUT - 1)) get $stripe_index"
20747 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
20748 [ $stripe_count -eq 2 ] ||
20749 error "expect 2 get $stripe_count"
20751 run_test 412 "mkdir on specific MDTs"
20754 [ $MDSCOUNT -lt 2 ] &&
20755 skip "We need at least 2 MDTs for this test"
20757 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20758 skip "Need server version at least 2.10.55"
20761 mkdir $DIR/$tdir || error "mkdir failed"
20763 # find MDT that is the most full
20764 local max=$($LFS df | grep MDT |
20773 END { split(b, c, ":")
20778 for i in $(seq $((MDSCOUNT - 1))); do
20779 $LFS mkdir -c $i $DIR/$tdir/d$i ||
20780 error "mkdir d$i failed"
20781 $LFS getdirstripe $DIR/$tdir/d$i
20782 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
20783 [ $stripe_index -ne $max ] ||
20784 error "don't expect $max"
20787 run_test 413a "mkdir on less full MDTs"
20790 [ $MDSCOUNT -lt 2 ] &&
20791 skip "We need at least 2 MDTs for this test"
20793 [ $MDS1_VERSION -lt $(version_code 2.12.52) ] &&
20794 skip "Need server version at least 2.12.52"
20796 mkdir $DIR/$tdir || error "mkdir failed"
20797 $LFS setdirstripe -D -i -1 -H space $DIR/$tdir ||
20798 error "setdirstripe failed"
20800 local qos_prio_free
20801 local qos_threshold_rr
20804 qos_prio_free=$($LCTL get_param -n lmv.*.qos_prio_free | head -n1)
20805 qos_prio_free=${qos_prio_free%%%}
20806 qos_threshold_rr=$($LCTL get_param -n lmv.*.qos_threshold_rr | head -n1)
20807 qos_threshold_rr=${qos_threshold_rr%%%}
20808 qos_maxage=$($LCTL get_param -n lmv.*.qos_maxage)
20810 stack_trap "$LCTL set_param lmv.*.qos_prio_free=$qos_prio_free" EXIT
20811 stack_trap "$LCTL set_param lmv.*.qos_threshold_rr=$qos_threshold_rr" \
20813 stack_trap "$LCTL set_param lmv.*.qos_maxage=$qos_maxage" EXIT
20815 echo "mkdir with roundrobin"
20817 $LCTL set_param lmv.*.qos_threshold_rr=100
20818 for i in $(seq $((100 * MDSCOUNT))); do
20819 mkdir $DIR/$tdir/subdir$i || error "mkdir subdir$i failed"
20821 for i in $(seq $MDSCOUNT); do
20822 count=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$((i - 1))$ |
20824 echo "$count directories created on MDT$((i - 1))"
20825 [ $count -eq 100 ] || error "subdirs are not evenly distributed"
20828 rm -rf $DIR/$tdir/*
20830 $LCTL set_param lmv.*.qos_threshold_rr=$qos_threshold_rr
20831 # Shorten statfs result age, so that it can be updated in time
20832 $LCTL set_param lmv.*.qos_maxage=1
20843 ffree=($(lctl get_param -n mdc.*[mM][dD][cC]-[^M]*.filesfree))
20844 bavail=($(lctl get_param -n mdc.*[mM][dD][cC]-[^M]*.kbytesavail))
20845 bsize=$(lctl get_param -n mdc.*MDT0000*.blocksize)
20847 max=$(((${ffree[0]} >> 8) * (${bavail[0]} * bsize >> 16)))
20848 min=$(((${ffree[0]} >> 8) * (${bavail[0]} * bsize >> 16)))
20851 for ((i = 1; i < ${#ffree[@]}; i++)); do
20852 tmp=$(((${ffree[i]} >> 8) * (${bavail[i]} * bsize >> 16)))
20853 if [ $tmp -gt $max ]; then
20857 if [ $tmp -lt $min ]; then
20863 [ ${ffree[min_index]} -eq 0 ] &&
20864 skip "no free files in MDT$min_index"
20865 [ ${ffree[min_index]} -gt 100000000 ] &&
20866 skip "too much free files in MDT$min_index"
20868 # Check if we need to generate uneven MDTs
20870 local diff=$(((max - min ) * 100 / min))
20871 local value="$(generate_string 1024)"
20874 while [ $diff -lt $threshold ]; do
20875 # generate uneven MDTs, create till $threshold% diff
20876 echo -n "weight diff=$diff% must be > $threshold% ..."
20877 count=$((${ffree[min_index]} / 10))
20878 # 50 sec per 10000 files in vm
20879 [ $count -gt 40000 ] && [ "$SLOW" = "no" ] &&
20880 skip "$count files to create"
20881 echo "Fill MDT$min_index with $count files"
20882 [ -d $DIR/$tdir-MDT$min_index ] ||
20883 $LFS mkdir -i $min_index $DIR/$tdir-MDT$min_index ||
20884 error "mkdir $tdir-MDT$min_index failed"
20885 for i in $(seq $count); do
20886 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE \
20887 $DIR/$tdir-MDT$min_index/f$i > /dev/null ||
20888 error "create f$i failed"
20889 setfattr -n user.413b -v $value \
20890 $DIR/$tdir-MDT$min_index/f$i ||
20891 error "setfattr f$i failed"
20894 ffree=($(lctl get_param -n mdc.*[mM][dD][cC]-*.filesfree))
20895 bavail=($(lctl get_param -n mdc.*[mM][dD][cC]-*.kbytesavail))
20896 max=$(((${ffree[max_index]} >> 8) * \
20897 (${bavail[max_index]} * bsize >> 16)))
20898 min=$(((${ffree[min_index]} >> 8) * \
20899 (${bavail[min_index]} * bsize >> 16)))
20900 diff=$(((max - min) * 100 / min))
20903 echo "MDT filesfree available: ${ffree[@]}"
20904 echo "MDT blocks available: ${bavail[@]}"
20905 echo "weight diff=$diff%"
20907 echo "mkdir with balanced space usage"
20908 $LCTL set_param lmv.*.qos_prio_free=100
20909 for i in $(seq $((100 * MDSCOUNT))); do
20910 mkdir $DIR/$tdir/subdir$i || error "mkdir subdir$i failed"
20913 for i in $(seq $MDSCOUNT); do
20914 count=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$((i - 1))$ |
20916 echo "$count directories created on MDT$((i - 1))"
20919 max=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$max_index$ | wc -l)
20920 min=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$min_index$ | wc -l)
20922 [ $((max - min)) -lt 10 ] &&
20923 error "subdirs shouldn't be evenly distributed"
20925 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
20927 $LFS setdirstripe -D -d $DIR/$tdir || error "setdirstripe -d failed"
20928 getfattr -n trusted.dmv $DIR/$tdir &&
20929 error "default dir layout exists" || true
20931 run_test 413b "mkdir with balanced space usage"
20934 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
20935 $LCTL set_param fail_loc=0x80000521
20936 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
20939 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
20942 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20943 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
20944 skip "Need server version at least 2.11.52"
20954 # this test may be slow on ZFS
20955 [ "$mds1_FSTYPE" == "zfs" ] && total=100
20957 # though this test is designed for striped directory, let's test normal
20958 # directory too since lock is always saved as CoS lock.
20959 test_mkdir $DIR/$tdir || error "mkdir $tdir"
20960 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
20969 start_time=$(date +%s)
20970 for i in $(seq $total); do
20971 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
20974 end_time=$(date +%s)
20975 duration=$((end_time - start_time))
20977 kill -9 $setattr_pid
20979 echo "rename $total files took $duration sec"
20980 [ $duration -lt 100 ] || error "rename took $duration sec"
20982 run_test 415 "lock revoke is not missing"
20985 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
20986 skip "Need server version at least 2.11.55"
20988 # define OBD_FAIL_OSD_TXN_START 0x19a
20989 do_facet mds1 lctl set_param fail_loc=0x19a
20991 lfs mkdir -c $MDSCOUNT $DIR/$tdir
20995 run_test 416 "transaction start failure won't cause system hung"
20999 do_nodes $(comma_list $(mdts_nodes)) \
21000 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
21001 do_nodes $(comma_list $(mdts_nodes)) \
21002 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
21003 do_nodes $(comma_list $(mdts_nodes)) \
21004 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
21008 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
21009 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
21010 skip "Need MDS version at least 2.11.56"
21012 trap cleanup_417 RETURN EXIT
21014 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
21015 do_nodes $(comma_list $(mdts_nodes)) \
21016 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
21017 $LFS migrate -m 0 $DIR/$tdir.1 &&
21018 error "migrate dir $tdir.1 should fail"
21020 do_nodes $(comma_list $(mdts_nodes)) \
21021 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
21022 $LFS mkdir -i 1 $DIR/$tdir.2 &&
21023 error "create remote dir $tdir.2 should fail"
21025 do_nodes $(comma_list $(mdts_nodes)) \
21026 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
21027 $LFS mkdir -c 2 $DIR/$tdir.3 &&
21028 error "create striped dir $tdir.3 should fail"
21031 run_test 417 "disable remote dir, striped dir and dir migration"
21033 # Checks that the outputs of df [-i] and lfs df [-i] match
21035 # usage: check_lfs_df <blocks | inodes> <mountpoint>
21045 [ "$1" == "blocks" ] && inodes= || inodes="-i"
21047 for count in {1..100}; do
21051 # read the lines of interest
21052 df_out=($(df -P $inodes $dir | tail -n +2)) ||
21053 error "df $inodes $dir | tail -n +2 failed"
21054 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
21055 error "lfs df $inodes $dir | grep summary: failed"
21057 # skip first substrings of each output as they are different
21058 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
21059 # compare the two outputs
21061 for i in {1..5}; do
21062 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
21070 lfs df $inodes $dir
21071 error "df and lfs df $1 output mismatch: " \
21072 "df ${inodes}: ${df_out[*]}, " \
21073 "lfs df ${inodes}: ${lfs_df_out[*]}"
21078 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21080 local dir=$DIR/$tdir
21081 local numfiles=$((RANDOM % 4096 + 2))
21082 local numblocks=$((RANDOM % 256 + 1))
21084 wait_delete_completed
21087 # check block output
21088 check_lfs_df blocks $dir
21089 # check inode output
21090 check_lfs_df inodes $dir
21092 # create a single file and retest
21093 echo "Creating a single file and testing"
21094 createmany -o $dir/$tfile- 1 &>/dev/null ||
21095 error "creating 1 file in $dir failed"
21096 check_lfs_df blocks $dir
21097 check_lfs_df inodes $dir
21099 # create a random number of files
21100 echo "Creating $((numfiles - 1)) files and testing"
21101 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
21102 error "creating $((numfiles - 1)) files in $dir failed"
21104 # write a random number of blocks to the first test file
21105 echo "Writing $numblocks 4K blocks and testing"
21106 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
21107 count=$numblocks &>/dev/null ||
21108 error "dd to $dir/${tfile}-0 failed"
21111 check_lfs_df blocks $dir
21112 check_lfs_df inodes $dir
21114 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
21115 error "unlinking $numfiles files in $dir failed"
21117 run_test 418 "df and lfs df outputs match"
21121 local dir=$DIR/$tdir
21126 cancel_lru_locks mdc
21128 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
21129 $LCTL set_param fail_loc=0x1410
21131 $LCTL set_param fail_loc=0
21134 run_test 419 "Verify open file by name doesn't crash kernel"
21138 [[ $MDS1_VERSION -ge $(version_code 2.12.53) ]] ||
21139 skip "Need MDS version at least 2.12.53"
21141 local SAVE_UMASK=$(umask)
21142 local dir=$DIR/$tdir
21143 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
21147 mkdir -m03777 $dir/testdir
21148 ls -dn $dir/testdir
21149 # Need to remove trailing '.' when SELinux is enabled
21150 local dirperms=$(ls -dn $dir/testdir |
21151 awk '{ sub(/\.$/, "", $1); print $1}')
21152 [ $dirperms == "drwxrwsrwt" ] ||
21153 error "incorrect perms on $dir/testdir"
21155 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
21156 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
21157 ls -n $dir/testdir/testfile
21158 local fileperms=$(ls -n $dir/testdir/testfile |
21159 awk '{ sub(/\.$/, "", $1); print $1}')
21160 [ $fileperms == "-rwxr-xr-x" ] ||
21161 error "incorrect perms on $dir/testdir/testfile"
21165 run_test 420 "clear SGID bit on non-directories for non-members"
21172 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21173 skip "Need MDS version at least 2.12.54"
21175 test_mkdir $DIR/$tdir
21176 createmany -o $DIR/$tdir/f 3
21177 cnt=$(ls -1 $DIR/$tdir | wc -l)
21178 [ $cnt != 3 ] && error "unexpected #files: $cnt"
21180 fid1=$(lfs path2fid $DIR/$tdir/f1)
21181 fid2=$(lfs path2fid $DIR/$tdir/f2)
21182 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
21184 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
21185 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
21187 cnt=$(ls -1 $DIR/$tdir | wc -l)
21188 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
21190 rm -f $DIR/$tdir/f3 || error "can't remove f3"
21191 createmany -o $DIR/$tdir/f 3
21192 cnt=$(ls -1 $DIR/$tdir | wc -l)
21193 [ $cnt != 3 ] && error "unexpected #files: $cnt"
21195 fid1=$(lfs path2fid $DIR/$tdir/f1)
21196 fid2=$(lfs path2fid $DIR/$tdir/f2)
21197 echo "remove using fsname $FSNAME"
21198 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
21200 cnt=$(ls -1 $DIR/$tdir | wc -l)
21201 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
21203 run_test 421a "simple rm by fid"
21210 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21211 skip "Need MDS version at least 2.12.54"
21213 test_mkdir $DIR/$tdir
21214 createmany -o $DIR/$tdir/f 3
21215 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
21218 FID1=$(lfs path2fid $DIR/$tdir/f1)
21219 FID2=$(lfs path2fid $DIR/$tdir/f2)
21220 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
21222 kill -USR1 $MULTIPID
21225 cnt=$(ls $DIR/$tdir | wc -l)
21226 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
21228 run_test 421b "rm by fid on open file"
21234 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21235 skip "Need MDS version at least 2.12.54"
21237 test_mkdir $DIR/$tdir
21238 createmany -o $DIR/$tdir/f 3
21239 touch $DIR/$tdir/$tfile
21240 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
21241 cnt=$(ls -1 $DIR/$tdir | wc -l)
21242 [ $cnt != 184 ] && error "unexpected #files: $cnt"
21244 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
21245 $LFS rmfid $DIR $FID1 || error "rmfid failed"
21247 cnt=$(ls $DIR/$tdir | wc -l)
21248 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
21250 run_test 421c "rm by fid against hardlinked files"
21256 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21257 skip "Need MDS version at least 2.12.54"
21259 test_mkdir $DIR/$tdir
21260 createmany -o $DIR/$tdir/f 4097
21261 cnt=$(ls -1 $DIR/$tdir | wc -l)
21262 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
21264 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
21265 $LFS rmfid $DIR $FIDS || error "rmfid failed"
21267 cnt=$(ls $DIR/$tdir | wc -l)
21269 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
21271 run_test 421d "rmfid en masse"
21277 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
21278 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21279 skip "Need MDS version at least 2.12.54"
21281 mkdir -p $DIR/$tdir
21282 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
21283 createmany -o $DIR/$tdir/striped_dir/f 512
21284 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
21285 [ $cnt != 512 ] && error "unexpected #files: $cnt"
21287 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
21288 sed "s/[/][^:]*://g")
21289 $LFS rmfid $DIR $FIDS || error "rmfid failed"
21291 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
21293 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
21295 run_test 421e "rmfid in DNE"
21301 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21302 skip "Need MDS version at least 2.12.54"
21304 test_mkdir $DIR/$tdir
21306 cnt=$(ls -1 $DIR/$tdir | wc -l)
21307 [ $cnt != 1 ] && error "unexpected #files: $cnt"
21309 FID=$(lfs path2fid $DIR/$tdir/f)
21310 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
21311 # rmfid should fail
21312 cnt=$(ls -1 $DIR/$tdir | wc -l)
21313 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
21315 chmod a+rw $DIR/$tdir
21317 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
21318 # rmfid should fail
21319 cnt=$(ls -1 $DIR/$tdir | wc -l)
21320 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
21323 $RUNAS touch $DIR/$tdir/f
21324 FID=$(lfs path2fid $DIR/$tdir/f)
21325 echo "rmfid as root"
21326 $LFS rmfid $DIR $FID || error "rmfid as root failed"
21327 cnt=$(ls -1 $DIR/$tdir | wc -l)
21328 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
21331 $RUNAS touch $DIR/$tdir/f
21332 cnt=$(ls -1 $DIR/$tdir | wc -l)
21333 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
21334 FID=$(lfs path2fid $DIR/$tdir/f)
21335 # rmfid w/o user_fid2path mount option should fail
21336 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
21337 cnt=$(ls -1 $DIR/$tdir | wc -l)
21338 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
21340 umount_client $MOUNT || error "failed to umount client"
21341 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
21342 error "failed to mount client'"
21344 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
21345 # rmfid should succeed
21346 cnt=$(ls -1 $DIR/$tdir | wc -l)
21347 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
21349 # rmfid shouldn't allow to remove files due to dir's permission
21350 chmod a+rwx $DIR/$tdir
21353 FID=$(lfs path2fid $DIR/$tdir/f)
21354 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
21356 umount_client $MOUNT || error "failed to umount client"
21357 mount_client $MOUNT "$MOUNT_OPTS" ||
21358 error "failed to mount client'"
21361 run_test 421f "rmfid checks permissions"
21367 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
21368 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
21369 skip "Need MDS version at least 2.12.54"
21371 mkdir -p $DIR/$tdir
21372 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
21373 createmany -o $DIR/$tdir/striped_dir/f 512
21374 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
21375 [ $cnt != 512 ] && error "unexpected #files: $cnt"
21377 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
21378 sed "s/[/][^:]*://g")
21380 rm -f $DIR/$tdir/striped_dir/f1*
21381 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
21382 removed=$((512 - cnt))
21384 # few files have been just removed, so we expect
21385 # rmfid to fail on their fids
21386 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
21387 [ $removed != $errors ] && error "$errors != $removed"
21389 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
21391 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
21393 run_test 421g "rmfid to return errors properly"
21396 test_mkdir -i 0 -c 1 -p $DIR/$tdir/d1
21397 test_mkdir -i 0 -c 1 -p $DIR/$tdir/d2
21398 test_mkdir -i 0 -c 1 -p $DIR/$tdir/d3
21399 dd if=/dev/zero of=$DIR/$tdir/d1/file1 bs=1k count=1
21400 dd if=/dev/zero of=$DIR/$tdir/d2/file1 bs=1k count=1
21402 local amc=$(at_max_get client)
21403 local amo=$(at_max_get mds1)
21404 local timeout=`lctl get_param -n timeout`
21406 at_max_set 0 client
21409 #define OBD_FAIL_PTLRPC_PAUSE_REQ 0x50a
21410 do_facet mds1 $LCTL set_param fail_loc=0x8000050a \
21411 fail_val=$(((2*timeout + 10)*1000))
21412 touch $DIR/$tdir/d3/file &
21414 #define OBD_FAIL_TGT_REPLY_DATA_RACE 0x722
21415 do_facet mds1 $LCTL set_param fail_loc=0x80000722 \
21416 fail_val=$((2*timeout + 5))
21417 mv $DIR/$tdir/d1/file1 $DIR/$tdir/d1/file2 &
21421 sleep $((2 * timeout))
21425 touch $DIR/$tdir/d2/file3
21426 touch $DIR/$tdir/d2/file4
21427 touch $DIR/$tdir/d2/file5
21430 at_max_set $amc client
21431 at_max_set $amo mds1
21433 # LU-12838 - verify the ptlrpc thread watchdog is not always throttled
21434 do_facet mds1 "dmesg | grep 'Dumping the stack trace for debugging'" ||
21435 error "Watchdog is always throttled"
21437 run_test 422 "kill a process with RPC in progress"
21440 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
21441 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
21442 skip "Need server version at least 2.9.55"
21444 start_full_debug_logging
21448 stop_full_debug_logging
21452 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
21453 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
21454 awk '/The barrier for/ { print $7 }')
21457 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
21462 barrier_expired() {
21465 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
21466 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
21467 awk '/will be expired/ { print $7 }')
21469 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
21478 echo "Start barrier_freeze at: $(date)"
21479 #define OBD_FAIL_BARRIER_DELAY 0x2202
21480 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
21481 # Do not reduce barrier time - See LU-11873
21482 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
21485 local b_status=$(barrier_stat)
21486 echo "Got barrier status at: $(date)"
21487 [ "$b_status" = "'freezing_p1'" ] ||
21488 error "(1) unexpected barrier status $b_status"
21490 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
21492 b_status=$(barrier_stat)
21493 [ "$b_status" = "'frozen'" ] ||
21494 error "(2) unexpected barrier status $b_status"
21496 local expired=$(barrier_expired)
21497 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
21498 sleep $((expired + 3))
21500 b_status=$(barrier_stat)
21501 [ "$b_status" = "'expired'" ] ||
21502 error "(3) unexpected barrier status $b_status"
21504 # Do not reduce barrier time - See LU-11873
21505 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
21506 error "(4) fail to freeze barrier"
21508 b_status=$(barrier_stat)
21509 [ "$b_status" = "'frozen'" ] ||
21510 error "(5) unexpected barrier status $b_status"
21512 echo "Start barrier_thaw at: $(date)"
21513 #define OBD_FAIL_BARRIER_DELAY 0x2202
21514 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
21515 do_facet mgs $LCTL barrier_thaw $FSNAME &
21518 b_status=$(barrier_stat)
21519 echo "Got barrier status at: $(date)"
21520 [ "$b_status" = "'thawing'" ] ||
21521 error "(6) unexpected barrier status $b_status"
21523 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
21525 b_status=$(barrier_stat)
21526 [ "$b_status" = "'thawed'" ] ||
21527 error "(7) unexpected barrier status $b_status"
21529 #define OBD_FAIL_BARRIER_FAILURE 0x2203
21530 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
21531 do_facet mgs $LCTL barrier_freeze $FSNAME
21533 b_status=$(barrier_stat)
21534 [ "$b_status" = "'failed'" ] ||
21535 error "(8) unexpected barrier status $b_status"
21537 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
21538 do_facet mgs $LCTL barrier_thaw $FSNAME
21542 run_test 801a "write barrier user interfaces and stat machine"
21547 mkdir $DIR/$tdir || error "(1) fail to mkdir"
21548 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
21549 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
21550 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
21551 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
21553 cancel_lru_locks mdc
21555 # 180 seconds should be long enough
21556 do_facet mgs $LCTL barrier_freeze $FSNAME 180
21558 local b_status=$(barrier_stat)
21559 [ "$b_status" = "'frozen'" ] ||
21560 error "(6) unexpected barrier status $b_status"
21562 mkdir $DIR/$tdir/d0/d10 &
21565 touch $DIR/$tdir/d1/f13 &
21568 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
21571 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
21574 rm -f $DIR/$tdir/d4/f12 &
21577 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
21579 # To guarantee taht the 'stat' is not blocked
21580 b_status=$(barrier_stat)
21581 [ "$b_status" = "'frozen'" ] ||
21582 error "(8) unexpected barrier status $b_status"
21584 # let above commands to run at background
21587 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
21588 ps -p $touch_pid || error "(10) touch should be blocked"
21589 ps -p $ln_pid || error "(11) link should be blocked"
21590 ps -p $mv_pid || error "(12) rename should be blocked"
21591 ps -p $rm_pid || error "(13) unlink should be blocked"
21593 b_status=$(barrier_stat)
21594 [ "$b_status" = "'frozen'" ] ||
21595 error "(14) unexpected barrier status $b_status"
21597 do_facet mgs $LCTL barrier_thaw $FSNAME
21598 b_status=$(barrier_stat)
21599 [ "$b_status" = "'thawed'" ] ||
21600 error "(15) unexpected barrier status $b_status"
21602 wait $mkdir_pid || error "(16) mkdir should succeed"
21603 wait $touch_pid || error "(17) touch should succeed"
21604 wait $ln_pid || error "(18) link should succeed"
21605 wait $mv_pid || error "(19) rename should succeed"
21606 wait $rm_pid || error "(20) unlink should succeed"
21610 run_test 801b "modification will be blocked by write barrier"
21613 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21617 stop mds2 || error "(1) Fail to stop mds2"
21619 do_facet mgs $LCTL barrier_freeze $FSNAME 30
21621 local b_status=$(barrier_stat)
21622 [ "$b_status" = "'expired'" ] || [ "$b_status" = "'failed'" ] || {
21623 do_facet mgs $LCTL barrier_thaw $FSNAME
21624 error "(2) unexpected barrier status $b_status"
21627 do_facet mgs $LCTL barrier_rescan $FSNAME ||
21628 error "(3) Fail to rescan barrier bitmap"
21630 # Do not reduce barrier time - See LU-11873
21631 do_facet mgs $LCTL barrier_freeze $FSNAME 20
21633 b_status=$(barrier_stat)
21634 [ "$b_status" = "'frozen'" ] ||
21635 error "(4) unexpected barrier status $b_status"
21637 do_facet mgs $LCTL barrier_thaw $FSNAME
21638 b_status=$(barrier_stat)
21639 [ "$b_status" = "'thawed'" ] ||
21640 error "(5) unexpected barrier status $b_status"
21642 local devname=$(mdsdevname 2)
21644 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
21646 do_facet mgs $LCTL barrier_rescan $FSNAME ||
21647 error "(7) Fail to rescan barrier bitmap"
21651 run_test 801c "rescan barrier bitmap"
21653 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
21654 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
21655 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
21656 saved_MOUNT_OPTS=$MOUNT_OPTS
21662 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
21663 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
21664 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
21665 MOUNT_OPTS=$saved_MOUNT_OPTS
21670 [[ $mds1_FSTYPE = zfs ]] || skip "ZFS specific test"
21671 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
21672 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
21673 skip "Need server version at least 2.9.55"
21675 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
21677 mkdir $DIR/$tdir || error "(1) fail to mkdir"
21679 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
21680 error "(2) Fail to copy"
21682 trap cleanup_802a EXIT
21684 # sync by force before remount as readonly
21685 sync; sync_all_data; sleep 3; sync_all_data
21689 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
21690 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
21691 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
21693 echo "Mount the server as read only"
21694 setupall server_only || error "(3) Fail to start servers"
21696 echo "Mount client without ro should fail"
21697 mount_client $MOUNT &&
21698 error "(4) Mount client without 'ro' should fail"
21700 echo "Mount client with ro should succeed"
21701 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
21702 mount_client $MOUNT ||
21703 error "(5) Mount client with 'ro' should succeed"
21705 echo "Modify should be refused"
21706 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
21708 echo "Read should be allowed"
21709 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
21710 error "(7) Read should succeed under ro mode"
21714 run_test 802a "simulate readonly device"
21717 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21718 remote_mds_nodsh && skip "remote MDS with nodsh"
21720 do_facet $SINGLEMDS $LCTL get_param mdt.*.readonly ||
21721 skip "readonly option not available"
21723 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "(1) fail to mkdir"
21725 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
21726 error "(2) Fail to copy"
21728 # write back all cached data before setting MDT to readonly
21732 do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=1
21733 stack_trap "do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=0" EXIT
21735 echo "Modify should be refused"
21736 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
21738 echo "Read should be allowed"
21739 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
21740 error "(7) Read should succeed under ro mode"
21743 do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=0
21745 run_test 802b "be able to set MDTs to readonly"
21748 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21749 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
21750 skip "MDS needs to be newer than 2.10.54"
21752 mkdir -p $DIR/$tdir
21753 # Create some objects on all MDTs to trigger related logs objects
21754 for idx in $(seq $MDSCOUNT); do
21755 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
21756 $DIR/$tdir/dir${idx} ||
21757 error "Fail to create $DIR/$tdir/dir${idx}"
21761 wait_delete_completed # ensure old test cleanups are finished
21762 echo "before create:"
21764 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21766 for i in {1..10}; do
21767 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
21768 error "Fail to create $DIR/$tdir/foo$i"
21772 echo "after create:"
21774 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21776 # allow for an llog to be cleaned up during the test
21777 [ $after_used -ge $((before_used + 10 - 1)) ] ||
21778 error "before ($before_used) + 10 > after ($after_used)"
21780 for i in {1..10}; do
21781 rm -rf $DIR/$tdir/foo$i ||
21782 error "Fail to remove $DIR/$tdir/foo$i"
21785 sleep 3 # avoid MDT return cached statfs
21786 wait_delete_completed
21787 echo "after unlink:"
21789 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21791 # allow for an llog to be created during the test
21792 [ $after_used -le $((before_used + 1)) ] ||
21793 error "after ($after_used) > before ($before_used) + 1"
21795 run_test 803 "verify agent object for remote object"
21798 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21799 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
21800 skip "MDS needs to be newer than 2.10.54"
21801 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
21803 mkdir -p $DIR/$tdir
21804 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
21805 error "Fail to create $DIR/$tdir/dir0"
21807 local fid=$($LFS path2fid $DIR/$tdir/dir0)
21808 local dev=$(mdsdevname 2)
21810 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21811 grep ${fid} || error "NOT found agent entry for dir0"
21813 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
21814 error "Fail to create $DIR/$tdir/dir1"
21816 touch $DIR/$tdir/dir1/foo0 ||
21817 error "Fail to create $DIR/$tdir/dir1/foo0"
21818 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
21821 for idx in $(seq $MDSCOUNT); do
21822 dev=$(mdsdevname $idx)
21823 do_facet mds${idx} \
21824 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21825 grep ${fid} && rc=$idx
21828 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
21829 error "Fail to rename foo0 to foo1"
21830 if [ $rc -eq 0 ]; then
21831 for idx in $(seq $MDSCOUNT); do
21832 dev=$(mdsdevname $idx)
21833 do_facet mds${idx} \
21834 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21835 grep ${fid} && rc=$idx
21839 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
21840 error "Fail to rename foo1 to foo2"
21841 if [ $rc -eq 0 ]; then
21842 for idx in $(seq $MDSCOUNT); do
21843 dev=$(mdsdevname $idx)
21844 do_facet mds${idx} \
21845 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21846 grep ${fid} && rc=$idx
21850 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
21852 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
21853 error "Fail to link to $DIR/$tdir/dir1/foo2"
21854 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
21855 error "Fail to rename foo2 to foo0"
21856 unlink $DIR/$tdir/dir1/foo0 ||
21857 error "Fail to unlink $DIR/$tdir/dir1/foo0"
21858 rm -rf $DIR/$tdir/dir0 ||
21859 error "Fail to rm $DIR/$tdir/dir0"
21861 for idx in $(seq $MDSCOUNT); do
21862 dev=$(mdsdevname $idx)
21866 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
21868 start mds${idx} $dev $MDS_MOUNT_OPTS ||
21869 error "mount mds$idx failed"
21870 df $MOUNT > /dev/null 2>&1
21872 # e2fsck should not return error
21874 error "e2fsck detected error on MDT${idx}: rc=$rc"
21877 run_test 804 "verify agent entry for remote entry"
21880 do_facet $SINGLEMDS zfs set quota=$old $fsset
21881 unlinkmany $DIR/$tdir/f- 1000000
21886 local zfs_version=$(do_node $SINGLEMDS cat /sys/module/zfs/version)
21887 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
21888 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
21889 skip "netfree not implemented before 0.7"
21890 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
21891 skip "Need MDS version at least 2.10.57"
21898 local pref="osd-zfs.lustre-MDT0000."
21900 # limit available space on MDS dataset to meet nospace issue
21901 # quickly. then ZFS 0.7.2 can use reserved space if asked
21902 # properly (using netfree flag in osd_declare_destroy()
21903 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
21904 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
21906 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
21907 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
21908 let "usedkb=usedkb-freekb"
21909 let "freekb=freekb/2"
21910 if let "freekb > 5000"; then
21913 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
21914 trap cleanup_805 EXIT
21916 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
21917 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
21918 rm -rf $DIR/$tdir || error "not able to remove"
21919 do_facet $SINGLEMDS zfs set quota=$old $fsset
21922 run_test 805 "ZFS can remove from full fs"
21928 local size=$($LFS getsom -s $file)
21929 local expect=$(stat -c %s $file)
21931 [[ $size == $expect ]] ||
21932 error "$file expected size: $expect, got: $size"
21934 local blocks=$($LFS getsom -b $file)
21935 expect=$(stat -c %b $file)
21936 [[ $blocks == $expect ]] ||
21937 error "$file expected blocks: $expect, got: $blocks"
21942 local size=$($LFS getsom -s $1)
21945 [[ $size == $expect ]] ||
21946 error "$file expected size: $expect, got: $size"
21950 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21951 skip "Need MDS version at least 2.11.52"
21955 touch $DIR/$tfile || error "touch $tfile failed"
21957 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21958 save_lustre_params client "llite.*.xattr_cache" > $save
21959 lctl set_param llite.*.xattr_cache=0
21960 stack_trap "restore_lustre_params < $save; rm -f $save" EXIT
21962 # single-threaded write
21963 echo "Test SOM for single-threaded write"
21964 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
21965 error "write $tfile failed"
21966 check_lsom_size $DIR/$tfile $bs
21969 local size=$(($num * $bs))
21973 echo "Test SOM for single client multi-threaded($num) write"
21974 $TRUNCATE $DIR/$tfile 0
21975 for ((i = 0; i < $num; i++)); do
21976 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21978 offset=$((offset + $bs))
21980 for (( i=0; i < $num; i++ )); do
21983 check_lsom_size $DIR/$tfile $size
21985 $TRUNCATE $DIR/$tfile 0
21986 for ((i = 0; i < $num; i++)); do
21987 offset=$((offset - $bs))
21988 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21991 for (( i=0; i < $num; i++ )); do
21994 check_lsom_size $DIR/$tfile $size
21996 # multi-client writes
21997 num=$(get_node_count ${CLIENTS//,/ })
21998 size=$(($num * $bs))
22002 echo "Test SOM for multi-client ($num) writes"
22003 $TRUNCATE $DIR/$tfile 0
22004 for client in ${CLIENTS//,/ }; do
22005 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
22008 offset=$((offset + $bs))
22010 for (( i=0; i < $num; i++ )); do
22013 check_lsom_size $DIR/$tfile $offset
22016 $TRUNCATE $DIR/$tfile 0
22017 for client in ${CLIENTS//,/ }; do
22018 offset=$((offset - $bs))
22019 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
22023 for (( i=0; i < $num; i++ )); do
22026 check_lsom_size $DIR/$tfile $size
22029 echo "Test SOM for truncate"
22030 $TRUNCATE $DIR/$tfile 1048576
22031 check_lsom_size $DIR/$tfile 1048576
22032 $TRUNCATE $DIR/$tfile 1234
22033 check_lsom_size $DIR/$tfile 1234
22035 # verify SOM blocks count
22036 echo "Verify SOM block count"
22037 $TRUNCATE $DIR/$tfile 0
22038 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
22039 error "failed to write file $tfile"
22040 check_lsom_data $DIR/$tfile
22042 run_test 806 "Verify Lazy Size on MDS"
22045 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
22046 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
22047 skip "Need MDS version at least 2.11.52"
22049 # Registration step
22050 changelog_register || error "changelog_register failed"
22051 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
22052 changelog_users $SINGLEMDS | grep -q $cl_user ||
22053 error "User $cl_user not found in changelog_users"
22055 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
22056 save_lustre_params client "llite.*.xattr_cache" > $save
22057 lctl set_param llite.*.xattr_cache=0
22058 stack_trap "restore_lustre_params < $save; rm -f $save" EXIT
22060 rm -rf $DIR/$tdir || error "rm $tdir failed"
22061 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
22062 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
22063 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
22064 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
22065 error "truncate $tdir/trunc failed"
22068 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
22069 error "write $tfile failed"
22071 # multi-client wirtes
22072 local num=$(get_node_count ${CLIENTS//,/ })
22076 echo "Test SOM for multi-client ($num) writes"
22077 touch $DIR/$tfile || error "touch $tfile failed"
22078 $TRUNCATE $DIR/$tfile 0
22079 for client in ${CLIENTS//,/ }; do
22080 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
22083 offset=$((offset + $bs))
22085 for (( i=0; i < $num; i++ )); do
22090 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
22091 check_lsom_data $DIR/$tdir/trunc
22092 check_lsom_data $DIR/$tdir/single_dd
22093 check_lsom_data $DIR/$tfile
22096 # Deregistration step
22097 changelog_deregister || error "changelog_deregister failed"
22099 run_test 807 "verify LSOM syncing tool"
22101 check_som_nologged()
22103 local lines=$($LFS changelog $FSNAME-MDT0000 |
22104 grep 'x=trusted.som' | wc -l)
22105 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
22109 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
22110 skip "Need MDS version at least 2.11.55"
22112 # Registration step
22113 changelog_register || error "changelog_register failed"
22115 touch $DIR/$tfile || error "touch $tfile failed"
22118 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
22119 error "write $tfile failed"
22122 $TRUNCATE $DIR/$tfile 1234
22125 $TRUNCATE $DIR/$tfile 1048576
22128 # Deregistration step
22129 changelog_deregister || error "changelog_deregister failed"
22131 run_test 808 "Check trusted.som xattr not logged in Changelogs"
22136 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
22140 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
22141 skip "Need MDS version at least 2.11.56"
22143 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
22144 error "failed to create DoM-only file $DIR/$tfile"
22145 touch $DIR/$tfile || error "touch $tfile failed"
22146 check_som_nodata $DIR/$tfile
22148 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
22149 error "write $tfile failed"
22150 check_som_nodata $DIR/$tfile
22152 $TRUNCATE $DIR/$tfile 1234
22153 check_som_nodata $DIR/$tfile
22155 $TRUNCATE $DIR/$tfile 4097
22156 check_som_nodata $DIR/$file
22158 run_test 809 "Verify no SOM xattr store for DoM-only files"
22161 [ $PARALLEL == "yes" ] && skip "skip parallel run"
22162 $GSS && skip_env "could not run with gss"
22163 [[ $OST1_VERSION -gt $(version_code 2.12.58) ]] ||
22164 skip "OST < 2.12.58 doesn't align checksum"
22167 stack_trap "set_checksums $ORIG_CSUM" EXIT
22168 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
22173 for csum in $CKSUM_TYPES; do
22174 #define OBD_FAIL_OSC_NO_GRANT 0x411
22175 $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411
22176 for i in "10240 0" "10000 0" "4000 1" "500 1"; do
22178 dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2
22179 before=$(md5sum $DIR/$tfile)
22180 $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear
22181 after=$(md5sum $DIR/$tfile)
22182 [ "$before" == "$after" ] ||
22183 error "$csum: $before != $after bs=$1 seek=$2"
22187 run_test 810 "partial page writes on ZFS (LU-11663)"
22190 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
22191 skip "Need MDS version at least 2.11.56"
22193 #define OBD_FAIL_MDS_ORPHAN_DELETE 0x165
22194 do_facet mds1 $LCTL set_param fail_loc=0x165
22195 $MULTIOP $DIR/$tfile Ouc || error "multiop failed"
22198 start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
22201 [[ $(do_facet mds1 pgrep orph_.*-MDD | wc -l) -eq 0 ]] ||
22202 error "MDD orphan cleanup thread not quit"
22204 run_test 811 "orphan name stub can be cleaned up in startup"
22207 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
22208 skip "OST < 2.12.51 doesn't support this fail_loc"
22209 [ "$SHARED_KEY" = true ] &&
22210 skip "OSC connections never go IDLE with Shared-Keys enabled"
22212 $LFS setstripe -c 1 -i 0 $DIR/$tfile
22213 # ensure ost1 is connected
22214 stat $DIR/$tfile >/dev/null || error "can't stat"
22215 wait_osc_import_state client ost1 FULL
22216 # no locks, no reqs to let the connection idle
22217 cancel_lru_locks osc
22219 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
22220 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
22221 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
22222 wait_osc_import_state client ost1 CONNECTING
22223 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
22225 stat $DIR/$tfile >/dev/null || error "can't stat file"
22227 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
22230 local file_heat_sav=$($LCTL get_param -n llite.*.file_heat 2>/dev/null)
22231 [ -z "$file_heat_sav" ] && skip "no file heat support"
22242 local period_second=$($LCTL get_param -n llite.*.heat_period_second)
22243 local decay_pct=$($LCTL get_param -n llite.*.heat_decay_percentage)
22245 $LCTL set_param -n llite.*.file_heat=1
22246 echo "Turn on file heat"
22247 echo "Period second: $period_second, Decay percentage: $decay_pct"
22249 echo "QQQQ" > $DIR/$tfile
22250 echo "QQQQ" > $DIR/$tfile
22251 echo "QQQQ" > $DIR/$tfile
22252 cat $DIR/$tfile > /dev/null
22253 cat $DIR/$tfile > /dev/null
22254 cat $DIR/$tfile > /dev/null
22255 cat $DIR/$tfile > /dev/null
22257 local out=$($LFS heat_get $DIR/$tfile)
22259 $LFS heat_get $DIR/$tfile
22260 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
22261 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
22262 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
22263 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
22265 [ $readsample -le 4 ] || error "read sample ($readsample) is wrong"
22266 [ $writesample -le 3 ] || error "write sample ($writesample) is wrong"
22267 [ $readbyte -le 20 ] || error "read bytes ($readbyte) is wrong"
22268 [ $writebyte -le 15 ] || error "write bytes ($writebyte) is wrong"
22270 sleep $((period_second + 3))
22271 echo "Sleep $((period_second + 3)) seconds..."
22272 # The recursion formula to calculate the heat of the file f is as
22274 # Hi+1(f) = (1-P)*Hi(f)+ P*Ci
22275 # Where Hi is the heat value in the period between time points i*I and
22276 # (i+1)*I; Ci is the access count in the period; the symbol P refers
22277 # to the weight of Ci.
22278 out=$($LFS heat_get $DIR/$tfile)
22279 $LFS heat_get $DIR/$tfile
22280 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
22281 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
22282 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
22283 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
22285 [ $(bc <<< "$readsample <= 4 * $decay_pct / 100") -eq 1 ] ||
22286 error "read sample ($readsample) is wrong"
22287 [ $(bc <<< "$writesample <= 3 * $decay_pct / 100") -eq 1 ] ||
22288 error "write sample ($writesample) is wrong"
22289 [ $(bc <<< "$readbyte <= 20 * $decay_pct / 100") -eq 1 ] ||
22290 error "read bytes ($readbyte) is wrong"
22291 [ $(bc <<< "$writebyte <= 15 * $decay_pct / 100") -eq 1 ] ||
22292 error "write bytes ($writebyte) is wrong"
22294 echo "QQQQ" > $DIR/$tfile
22295 echo "QQQQ" > $DIR/$tfile
22296 echo "QQQQ" > $DIR/$tfile
22297 cat $DIR/$tfile > /dev/null
22298 cat $DIR/$tfile > /dev/null
22299 cat $DIR/$tfile > /dev/null
22300 cat $DIR/$tfile > /dev/null
22302 sleep $((period_second + 3))
22303 echo "Sleep $((period_second + 3)) seconds..."
22305 out=$($LFS heat_get $DIR/$tfile)
22306 $LFS heat_get $DIR/$tfile
22307 readsample1=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
22308 writesample1=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
22309 readbyte1=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
22310 writebyte1=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
22312 [ $(bc <<< "$readsample1 <= ($readsample * (100 - $decay_pct) + \
22313 4 * $decay_pct) / 100") -eq 1 ] ||
22314 error "read sample ($readsample1) is wrong"
22315 [ $(bc <<< "$writesample1 <= ($writesample * (100 - $decay_pct) + \
22316 3 * $decay_pct) / 100") -eq 1 ] ||
22317 error "write sample ($writesample1) is wrong"
22318 [ $(bc <<< "$readbyte1 <= ($readbyte * (100 - $decay_pct) + \
22319 20 * $decay_pct) / 100") -eq 1 ] ||
22320 error "read bytes ($readbyte1) is wrong"
22321 [ $(bc <<< "$writebyte1 <= ($writebyte * (100 - $decay_pct) + \
22322 15 * $decay_pct) / 100") -eq 1 ] ||
22323 error "write bytes ($writebyte1) is wrong"
22325 echo "Turn off file heat for the file $DIR/$tfile"
22326 $LFS heat_set -o $DIR/$tfile
22328 echo "QQQQ" > $DIR/$tfile
22329 echo "QQQQ" > $DIR/$tfile
22330 echo "QQQQ" > $DIR/$tfile
22331 cat $DIR/$tfile > /dev/null
22332 cat $DIR/$tfile > /dev/null
22333 cat $DIR/$tfile > /dev/null
22334 cat $DIR/$tfile > /dev/null
22336 out=$($LFS heat_get $DIR/$tfile)
22337 $LFS heat_get $DIR/$tfile
22338 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
22339 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
22340 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
22341 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
22343 [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong"
22344 [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong"
22345 [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong"
22346 [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong"
22348 echo "Trun on file heat for the file $DIR/$tfile"
22349 $LFS heat_set -O $DIR/$tfile
22351 echo "QQQQ" > $DIR/$tfile
22352 echo "QQQQ" > $DIR/$tfile
22353 echo "QQQQ" > $DIR/$tfile
22354 cat $DIR/$tfile > /dev/null
22355 cat $DIR/$tfile > /dev/null
22356 cat $DIR/$tfile > /dev/null
22357 cat $DIR/$tfile > /dev/null
22359 out=$($LFS heat_get $DIR/$tfile)
22360 $LFS heat_get $DIR/$tfile
22361 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
22362 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
22363 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
22364 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
22366 [ $readsample -gt 0 ] || error "read sample ($readsample) is wrong"
22367 [ $writesample -gt 0 ] || error "write sample ($writesample) is wrong"
22368 [ $readbyte -gt 0 ] || error "read bytes ($readbyte) is wrong"
22369 [ $writebyte -gt 0 ] || error "write bytes ($writebyte) is wrong"
22371 $LFS heat_set -c $DIR/$tfile
22372 $LCTL set_param -n llite.*.file_heat=0
22373 echo "Turn off file heat support for the Lustre filesystem"
22375 echo "QQQQ" > $DIR/$tfile
22376 echo "QQQQ" > $DIR/$tfile
22377 echo "QQQQ" > $DIR/$tfile
22378 cat $DIR/$tfile > /dev/null
22379 cat $DIR/$tfile > /dev/null
22380 cat $DIR/$tfile > /dev/null
22381 cat $DIR/$tfile > /dev/null
22383 out=$($LFS heat_get $DIR/$tfile)
22384 $LFS heat_get $DIR/$tfile
22385 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
22386 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
22387 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
22388 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
22390 [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong"
22391 [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong"
22392 [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong"
22393 [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong"
22395 $LCTL set_param -n llite.*.file_heat=$file_heat_sav
22398 run_test 813 "File heat verfication"
22402 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
22403 echo -n y >> $DIR/$tfile
22404 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
22405 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
22407 run_test 814 "sparse cp works as expected (LU-12361)"
22411 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
22412 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
22414 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
22417 [ "$SHARED_KEY" = true ] &&
22418 skip "OSC connections never go IDLE with Shared-Keys enabled"
22420 $LFS setstripe -c 1 -i 0 $DIR/$tfile
22421 # ensure ost1 is connected
22422 stat $DIR/$tfile >/dev/null || error "can't stat"
22423 wait_osc_import_state client ost1 FULL
22424 # no locks, no reqs to let the connection idle
22425 cancel_lru_locks osc
22426 lru_resize_disable osc
22429 before=$($LCTL get_param -n \
22430 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
22432 wait_osc_import_state client ost1 IDLE
22433 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
22434 now=$($LCTL get_param -n \
22435 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
22436 [ $before == $now ] || error "lru_size changed $before != $now"
22438 run_test 816 "do not reset lru_resize on idle reconnect"
22442 exportfs -u localhost:$DIR/nfsexp
22447 systemctl restart nfs-server.service || skip "failed to restart nfsd"
22449 mkdir -p $DIR/nfsexp
22450 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
22451 error "failed to export nfs"
22453 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
22454 stack_trap cleanup_817 EXIT
22456 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
22457 error "failed to mount nfs to $tmpdir"
22459 cp /bin/true $tmpdir
22460 $DIR/nfsexp/true || error "failed to execute 'true' command"
22462 run_test 817 "nfsd won't cache write lock for exec file"
22466 $LFS setstripe -c1 -i0 $DIR/$tfile
22467 $LFS setstripe -c1 -i1 $DIR/$tfile
22469 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
22470 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
22471 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
22472 error "start $SINGLEMDS failed"
22475 run_test 818 "unlink with failed llog"
22478 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
22479 cancel_lru_locks osc
22480 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
22481 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
22482 dd if=$DIR/$tfile of=/dev/null bs=1M count=1
22485 run_test 819a "too big niobuf in read"
22488 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
22489 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
22490 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
22491 cancel_lru_locks osc
22495 run_test 819b "too big niobuf in write"
22498 # tests that do cleanup/setup should be run at the end
22502 [ $PARALLEL == "yes" ] && skip "skip parallel run"
22505 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
22506 $LCTL set_param fail_loc=0x903
22508 cancel_lru_locks MGC
22510 FAIL_ON_ERROR=true cleanup
22511 FAIL_ON_ERROR=true setup
22513 run_test 900 "umount should not race with any mgc requeue thread"
22516 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
22517 check_and_cleanup_lustre
22518 if [ "$I_MOUNTED" != "yes" ]; then
22519 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true