3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
6 # e.g. ONLY="22 23" or ONLY="`seq 32 39`" or EXCEPT="31"
11 # Check Grants after these tests
12 GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c 64d"
17 CREATETEST=${CREATETEST:-createtest}
18 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
19 OPENFILE=${OPENFILE:-openfile}
20 OPENUNLINK=${OPENUNLINK:-openunlink}
21 READS=${READS:-"reads"}
22 MUNLINK=${MUNLINK:-munlink}
23 SOCKETSERVER=${SOCKETSERVER:-socketserver}
24 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
25 MEMHOG=${MEMHOG:-memhog}
26 DIRECTIO=${DIRECTIO:-directio}
27 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
29 CHECK_GRANT=${CHECK_GRANT:-"yes"}
30 GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
31 export PARALLEL=${PARALLEL:-"no"}
34 LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
35 LUSTRE=${LUSTRE:-$(dirname $0)/..}
36 . $LUSTRE/tests/test-framework.sh
41 ALWAYS_EXCEPT="$SANITY_EXCEPT "
42 # bug number for skipped test: LU-9693 LU-6493 LU-9693
43 ALWAYS_EXCEPT+=" 42a 42b 42c "
44 # bug number: LU-8411 LU-9054
45 ALWAYS_EXCEPT+=" 407 312 "
48 # bug number: LU-9795 LU-9795 LU-9795 LU-9795
49 ALWAYS_EXCEPT+=" 17n 60a 133g 300f "
52 # skip the grant tests for ARM until they are fixed
53 if [[ $(uname -m) = aarch64 ]]; then
54 # bug number: LU-11596
55 ALWAYS_EXCEPT+=" $GRANT_CHECK_LIST"
56 # bug number: LU-11671 LU-11667 LU-11729 LU-4398
57 ALWAYS_EXCEPT+=" 45 317 810 817"
61 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
63 if [ "$mds1_FSTYPE" = "zfs" ]; then
64 # bug number for skipped test: LU-1957
65 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 180"
67 [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
70 # Get the SLES distro version
72 # Returns a version string that should only be used in comparing
73 # strings returned by version_code()
76 local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2)
78 # All SuSE Linux versions have one decimal. version_code expects two
79 local sles_version=$version.0
80 version_code $sles_version
83 # Check if we are running on Ubuntu or SLES so we can make decisions on
85 if [ -r /etc/SuSE-release ]; then
86 sles_version=$(sles_version_code)
87 [ $sles_version -lt $(version_code 11.4.0) ] &&
88 # bug number for skipped test: LU-4341
89 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170"
90 [ $sles_version -lt $(version_code 12.0.0) ] &&
91 # bug number for skipped test: LU-3703
92 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234"
93 elif [ -r /etc/os-release ]; then
94 if grep -qi ubuntu /etc/os-release; then
95 ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
100 if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
101 # bug number for skipped test:
103 ALWAYS_EXCEPT+=" 103a 410"
113 pgrep ll_sa > /dev/null && { echo "There are ll_sa thread not exit!"; exit 20; }
114 cleanupall ${FORCE} $* || { echo "FAILed to clean up"; exit 20; }
123 check_swap_layouts_support()
125 $LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
126 skip "Does not support layout lock."
129 check_and_setup_lustre
133 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
135 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
136 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
137 rm -rf $DIR/[Rdfs][0-9]*
139 # $RUNAS_ID may get set incorrectly somewhere else
140 [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] &&
141 error "\$RUNAS_ID set to 0, but \$UID is also 0!"
143 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
145 if [ "${ONLY}" = "MOUNT" ] ; then
146 echo "Lustre is up, please go on"
150 echo "preparing for tests involving mounts"
151 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
153 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
154 echo # add a newline after mke2fs.
158 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
159 lctl set_param debug=-1 2> /dev/null || true
162 $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
164 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
166 run_test 0a "touch; rm ====================="
169 chmod 0755 $DIR || error "chmod 0755 $DIR failed"
170 $CHECKSTAT -p 0755 $DIR || error "$DIR permission is not 0755"
172 run_test 0b "chmod 0755 $DIR ============================="
175 $LCTL get_param mdc.*.import | grep "state: FULL" ||
176 error "import not FULL"
177 $LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" ||
180 run_test 0c "check import proc"
182 test_0d() { # LU-3397
183 [ $MGS_VERSION -lt $(version_code 2.10.57) ] &&
184 skip "proc exports not supported before 2.10.57"
186 local mgs_exp="mgs.MGS.exports"
187 local client_uuid=$($LCTL get_param -n mgc.*.uuid)
189 local exp_client_version
192 local temp_imp=$DIR/$tfile.import
193 local temp_exp=$DIR/$tfile.export
195 # save mgc import file to $temp_imp
196 $LCTL get_param mgc.*.import | tee $temp_imp
197 # Check if client uuid is found in MGS export
198 for exp_client_nid in $(do_facet mgs $LCTL get_param -N $mgs_exp.*); do
199 [ $(do_facet mgs $LCTL get_param -n $exp_client_nid.uuid) == \
203 # save mgs export file to $temp_exp
204 do_facet mgs $LCTL get_param $exp_client_nid.export | tee $temp_exp
206 # Compare the value of field "connect_flags"
207 imp_val=$(grep "connect_flags" $temp_imp)
208 exp_val=$(grep "connect_flags" $temp_exp)
209 [ "$exp_val" == "$imp_val" ] ||
210 error "export flags '$exp_val' != import flags '$imp_val'"
212 # Compare the value of client version
213 exp_client_version=$(awk '/target_version:/ { print $2 }' $temp_exp)
214 exp_val=$(version_code $exp_client_version)
215 imp_val=$CLIENT_VERSION
216 [ "$exp_val" == "$imp_val" ] ||
217 error "export client version '$exp_val' != '$imp_val'"
219 run_test 0d "check export proc ============================="
222 test_mkdir $DIR/$tdir
223 test_mkdir $DIR/$tdir/d2
224 mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
225 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir"
228 $CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed"
230 run_test 1 "mkdir; remkdir; rmdir"
233 test_mkdir $DIR/$tdir
234 touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed"
235 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
237 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed"
239 run_test 2 "mkdir; touch; rmdir; check file"
242 test_mkdir $DIR/$tdir
243 $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
244 touch $DIR/$tdir/$tfile
245 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
247 $CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed"
249 run_test 3 "mkdir; touch; rmdir; check dir"
251 # LU-4471 - failed rmdir on remote directories still removes directory on MDT0
253 test_mkdir -i 1 $DIR/$tdir
255 touch $DIR/$tdir/$tfile ||
256 error "Create file under remote directory failed"
259 error "Expect error removing in-use dir $DIR/$tdir"
261 test -d $DIR/$tdir || error "Remote directory disappeared"
263 rm -rf $DIR/$tdir || error "remove remote dir error"
265 run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
268 test_mkdir $DIR/$tdir
269 test_mkdir $DIR/$tdir/d2
270 chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed"
271 $CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707"
272 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
274 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2"
277 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
278 chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
279 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
280 error "$tfile does not have perm 0666 or UID $UID"
281 $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
282 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
283 error "$tfile should be 0666 and owned by UID $UID"
285 run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
288 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
291 chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
292 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
293 error "$tfile should be owned by UID $RUNAS_ID"
294 $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
295 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
296 error "$tfile should be owned by UID $RUNAS_ID"
298 run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
301 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
304 chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
305 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
306 error "$tfile should be owned by GID $UID"
307 $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
308 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
309 error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
311 run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)"
314 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
316 test_mkdir $DIR/$tdir
317 chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed"
318 $RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
319 chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed"
320 test_mkdir $DIR/$tdir/d/subdir
321 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir ||
322 error "$tdir/d/subdir should be GID $RUNAS_GID"
323 if [[ $MDSCOUNT -gt 1 ]]; then
324 # check remote dir sgid inherite
325 $LFS mkdir -i 0 $DIR/$tdir.local ||
326 error "mkdir $tdir.local failed"
327 chmod g+s $DIR/$tdir.local ||
328 error "chmod $tdir.local failed"
329 chgrp $RUNAS_GID $DIR/$tdir.local ||
330 error "chgrp $tdir.local failed"
331 $LFS mkdir -i 1 $DIR/$tdir.local/$tdir.remote ||
332 error "mkdir $tdir.remote failed"
333 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir.local/$tdir.remote ||
334 error "$tdir.remote should be owned by $UID.$RUNAS_ID"
335 $CHECKSTAT -p 02755 $DIR/$tdir.local/$tdir.remote ||
336 error "$tdir.remote should be mode 02755"
339 run_test 6g "verify new dir in sgid dir inherits group"
341 test_6h() { # bug 7331
342 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
344 touch $DIR/$tfile || error "touch failed"
345 chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile || error "initial chown failed"
346 $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/$tfile &&
347 error "chown $RUNAS_ID:0 $tfile worked as GID $RUNAS_GID"
348 $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile ||
349 error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID"
351 run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)"
354 test_mkdir $DIR/$tdir
355 $MCREATE $DIR/$tdir/$tfile
356 chmod 0666 $DIR/$tdir/$tfile
357 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
358 error "$tdir/$tfile should be mode 0666"
360 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
363 if [ ! -d $DIR/$tdir ]; then
364 test_mkdir $DIR/$tdir
366 $MCREATE $DIR/$tdir/$tfile
367 echo -n foo > $DIR/$tdir/$tfile
368 [ "$(cat $DIR/$tdir/$tfile)" = "foo" ] || error "$tdir/$tfile not 'foo'"
369 $CHECKSTAT -t file -s 3 $DIR/$tdir/$tfile || error "$tfile size not 3"
371 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
374 test_mkdir $DIR/$tdir
375 touch $DIR/$tdir/$tfile
376 chmod 0666 $DIR/$tdir/$tfile
377 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
378 error "$tfile mode not 0666"
380 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
383 test_mkdir $DIR/$tdir
384 test_mkdir $DIR/$tdir/d2
385 test_mkdir $DIR/$tdir/d2/d3
386 $CHECKSTAT -t dir $DIR/$tdir/d2/d3 || error "$tdir/d2/d3 not a dir"
388 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
391 test_mkdir $DIR/$tdir
392 test_mkdir $DIR/$tdir/d2
393 touch $DIR/$tdir/d2/$tfile
394 $CHECKSTAT -t file $DIR/$tdir/d2/$tfile ||
395 error "$tdir/d2/$tfile not a file"
397 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
400 test_mkdir $DIR/$tdir
401 test_mkdir $DIR/$tdir/d2
402 chmod 0666 $DIR/$tdir/d2
403 chmod 0705 $DIR/$tdir/d2
404 $CHECKSTAT -t dir -p 0705 $DIR/$tdir/d2 ||
405 error "$tdir/d2 mode not 0705"
407 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
410 test_mkdir $DIR/$tdir
411 touch $DIR/$tdir/$tfile
412 chmod 0666 $DIR/$tdir/$tfile
413 chmod 0654 $DIR/$tdir/$tfile
414 $CHECKSTAT -t file -p 0654 $DIR/$tdir/$tfile ||
415 error "$tdir/d2 mode not 0654"
417 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
420 test_mkdir $DIR/$tdir
421 dd if=/dev/zero of=$DIR/$tdir/$tfile count=10
423 $CHECKSTAT -t file -s 0 $DIR/$tdir/$tfile ||
424 error "$tdir/$tfile size not 0 after truncate"
426 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
429 test_mkdir $DIR/$tdir
430 touch $DIR/$tdir/$tfile
432 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
434 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
437 test_mkdir $DIR/$tdir
438 touch $DIR/$tdir/$tfile
439 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
440 $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
441 error "$tdir/${tfile_2} not a file after rename"
442 rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
444 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
447 test_mkdir $DIR/$tdir
448 touch $DIR/$tdir/$tfile
449 rm -rf $DIR/$tdir/$tfile
450 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
452 run_test 16 "touch .../d16/f; rm -rf .../d16/f"
455 test_mkdir $DIR/$tdir
456 touch $DIR/$tdir/$tfile
457 ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist
459 $CHECKSTAT -l $DIR/$tdir/$tfile $DIR/$tdir/l-exist ||
460 error "$tdir/l-exist not a symlink"
461 $CHECKSTAT -f -t f $DIR/$tdir/l-exist ||
462 error "$tdir/l-exist not referencing a file"
463 rm -f $DIR/$tdir/l-exist
464 $CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed"
466 run_test 17a "symlinks: create, remove (real)"
469 test_mkdir $DIR/$tdir
470 ln -s no-such-file $DIR/$tdir/l-dangle
472 $CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle ||
473 error "$tdir/l-dangle not referencing no-such-file"
474 $CHECKSTAT -fa $DIR/$tdir/l-dangle ||
475 error "$tdir/l-dangle not referencing non-existent file"
476 rm -f $DIR/$tdir/l-dangle
477 $CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed"
479 run_test 17b "symlinks: create, remove (dangling)"
481 test_17c() { # bug 3440 - don't save failed open RPC for replay
482 test_mkdir $DIR/$tdir
483 ln -s foo $DIR/$tdir/$tfile
484 cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true
486 run_test 17c "symlinks: open dangling (should return error)"
489 test_mkdir $DIR/$tdir
490 ln -s foo $DIR/$tdir/$tfile
491 touch $DIR/$tdir/$tfile || error "creating to new symlink"
493 run_test 17d "symlinks: create dangling"
496 test_mkdir $DIR/$tdir
497 local foo=$DIR/$tdir/$tfile
498 ln -s $foo $foo || error "create symlink failed"
499 ls -l $foo || error "ls -l failed"
500 ls $foo && error "ls not failed" || true
502 run_test 17e "symlinks: create recursive symlink (should return error)"
505 test_mkdir $DIR/$tdir
506 ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
507 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
508 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
509 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
510 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
511 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/$tdir/666
514 run_test 17f "symlinks: long and very long symlink name"
516 # str_repeat(S, N) generate a string that is string S repeated N times
521 while [ $((n -= 1)) -ge 0 ]; do
527 # Long symlinks and LU-2241
529 test_mkdir $DIR/$tdir
530 local TESTS="59 60 61 4094 4095"
532 # Fix for inode size boundary in 2.1.4
533 [ $MDS1_VERSION -lt $(version_code 2.1.4) ] &&
536 # Patch not applied to 2.2 or 2.3 branches
537 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
538 [ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
541 # skip long symlink name for rhel6.5.
542 # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
543 grep -q '6.5' /etc/redhat-release &>/dev/null &&
544 TESTS="59 60 61 4062 4063"
547 local SYMNAME=$(str_repeat 'x' $i)
548 ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
549 readlink $DIR/$tdir/f$i || error "failed $i-char readlink"
552 run_test 17g "symlinks: really long symlink name and inode boundaries"
554 test_17h() { #bug 17378
555 [ $PARALLEL == "yes" ] && skip "skip parallel run"
556 remote_mds_nodsh && skip "remote MDS with nodsh"
560 test_mkdir $DIR/$tdir
561 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
562 $LFS setstripe -c -1 $DIR/$tdir
563 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
564 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
565 touch $DIR/$tdir/$tfile || true
567 run_test 17h "create objects: lov_free_memmd() doesn't lbug"
569 test_17i() { #bug 20018
570 [ $PARALLEL == "yes" ] && skip "skip parallel run"
571 remote_mds_nodsh && skip "remote MDS with nodsh"
573 local foo=$DIR/$tdir/$tfile
576 test_mkdir -c1 $DIR/$tdir
577 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
578 ln -s $foo $foo || error "create symlink failed"
579 #define OBD_FAIL_MDS_READLINK_EPROTO 0x143
580 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000143
581 ls -l $foo && error "error not detected"
584 run_test 17i "don't panic on short symlink (should return error)"
586 test_17k() { #bug 22301
587 [ $PARALLEL == "yes" ] && skip "skip parallel run"
588 [[ -z "$(which rsync 2>/dev/null)" ]] &&
589 skip "no rsync command"
590 rsync --help | grep -q xattr ||
591 skip_env "$(rsync --version | head -n1) does not support xattrs"
592 test_mkdir $DIR/$tdir
593 test_mkdir $DIR/$tdir.new
594 touch $DIR/$tdir/$tfile
595 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
596 rsync -av -X $DIR/$tdir/ $DIR/$tdir.new ||
597 error "rsync failed with xattrs enabled"
599 run_test 17k "symlinks: rsync with xattrs enabled"
601 test_17l() { # LU-279
602 [[ -z "$(which getfattr 2>/dev/null)" ]] &&
603 skip "no getfattr command"
605 test_mkdir $DIR/$tdir
606 touch $DIR/$tdir/$tfile
607 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
608 for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
609 # -h to not follow symlinks. -m '' to list all the xattrs.
610 # grep to remove first line: '# file: $path'.
611 for xattr in `getfattr -hm '' $path 2>/dev/null | grep -v '^#'`;
613 lgetxattr_size_check $path $xattr ||
614 error "lgetxattr_size_check $path $xattr failed"
618 run_test 17l "Ensure lgetxattr's returned xattr size is consistent"
622 [ $PARALLEL == "yes" ] && skip "skip parallel run"
623 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
624 remote_mds_nodsh && skip "remote MDS with nodsh"
625 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
626 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
627 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
629 local short_sym="0123456789"
630 local wdir=$DIR/$tdir
635 # create a long symlink file
636 for ((i = 0; i < 4; ++i)); do
637 long_sym=${long_sym}${long_sym}
640 echo "create 512 short and long symlink files under $wdir"
641 for ((i = 0; i < 256; ++i)); do
642 ln -sf ${long_sym}"a5a5" $wdir/long-$i
643 ln -sf ${short_sym}"a5a5" $wdir/short-$i
649 wait_delete_completed
651 echo "recreate the 512 symlink files with a shorter string"
652 for ((i = 0; i < 512; ++i)); do
653 # rewrite the symlink file with a shorter string
654 ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed"
655 ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed"
658 local mds_index=$(($($LFS getstripe -m $wdir) + 1))
659 local devname=$(mdsdevname $mds_index)
661 echo "stop and checking mds${mds_index}:"
662 # e2fsck should not return error
664 run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
667 start mds${mds_index} $devname $MDS_MOUNT_OPTS ||
668 error "start mds${mds_index} failed"
669 df $MOUNT > /dev/null 2>&1
671 error "e2fsck detected error for short/long symlink: rc=$rc"
674 run_test 17m "run e2fsck against MDT which contains short/long symlink"
676 check_fs_consistency_17n() {
680 # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
681 # so it only check MDT1/MDT2 instead of all of MDTs.
682 for mdt_index in 1 2; do
683 local devname=$(mdsdevname $mdt_index)
684 # e2fsck should not return error
686 run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
689 start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
690 error "mount mds$mdt_index failed"
691 df $MOUNT > /dev/null 2>&1
697 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
698 [ $PARALLEL == "yes" ] && skip "skip parallel run"
699 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
700 remote_mds_nodsh && skip "remote MDS with nodsh"
701 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
702 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
703 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
707 test_mkdir $DIR/$tdir
708 for ((i=0; i<10; i++)); do
709 $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
710 error "create remote dir error $i"
711 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
712 error "create files under remote dir failed $i"
715 check_fs_consistency_17n ||
716 error "e2fsck report error after create files under remote dir"
718 for ((i = 0; i < 10; i++)); do
719 rm -rf $DIR/$tdir/remote_dir_${i} ||
720 error "destroy remote dir error $i"
723 check_fs_consistency_17n ||
724 error "e2fsck report error after unlink files under remote dir"
726 [ $MDS1_VERSION -lt $(version_code 2.4.50) ] &&
727 skip "lustre < 2.4.50 does not support migrate mv"
729 for ((i = 0; i < 10; i++)); do
730 mkdir -p $DIR/$tdir/remote_dir_${i}
731 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
732 error "create files under remote dir failed $i"
733 $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
734 error "migrate remote dir error $i"
736 check_fs_consistency_17n || error "e2fsck report error after migration"
738 for ((i = 0; i < 10; i++)); do
739 rm -rf $DIR/$tdir/remote_dir_${i} ||
740 error "destroy remote dir error $i"
743 check_fs_consistency_17n || error "e2fsck report error after unlink"
745 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
748 remote_mds_nodsh && skip "remote MDS with nodsh"
749 [ $MDS1_VERSION -lt $(version_code 2.3.64) ] &&
750 skip "Need MDS version at least 2.3.64"
752 local wdir=$DIR/${tdir}o
758 mdt_index=$($LFS getstripe -m $wdir/$tfile)
759 mdt_index=$((mdt_index + 1))
762 #fail mds will wait the failover finish then set
763 #following fail_loc to avoid interfer the recovery process.
766 #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
767 do_facet mds${mdt_index} lctl set_param fail_loc=0x194
768 ls -l $wdir/$tfile && rc=1
769 do_facet mds${mdt_index} lctl set_param fail_loc=0
770 [[ $rc -eq 0 ]] || error "stat file should fail"
772 run_test 17o "stat file with incompat LMA feature"
775 touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
776 ls $DIR || error "Failed to ls $DIR: $?"
778 run_test 18 "touch .../f ; ls ... =============================="
784 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
786 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
789 ls -l $DIR/$tfile && error "ls -l $tfile failed"|| true
791 run_test 19b "ls -l .../f19 (should return error) =============="
794 [ $RUNAS_ID -eq $UID ] &&
795 skip_env "RUNAS_ID = UID = $UID -- skipping"
797 $RUNAS touch $DIR/$tfile && error "create non-root file failed" || true
799 run_test 19c "$RUNAS touch .../f19 (should return error) =="
802 cat $DIR/f19 && error || true
804 run_test 19d "cat .../f19 (should return error) =============="
813 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
815 run_test 20 "touch .../f ; ls -l ..."
818 test_mkdir $DIR/$tdir
819 [ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle
820 ln -s dangle $DIR/$tdir/link
821 echo foo >> $DIR/$tdir/link
822 cat $DIR/$tdir/dangle
823 $CHECKSTAT -t link $DIR/$tdir/link || error "$tdir/link not a link"
824 $CHECKSTAT -f -t file $DIR/$tdir/link ||
825 error "$tdir/link not linked to a file"
827 run_test 21 "write to dangling link"
830 local wdir=$DIR/$tdir
832 chown $RUNAS_ID:$RUNAS_GID $wdir
833 (cd $wdir || error "cd $wdir failed";
834 $RUNAS tar cf - /etc/hosts /etc/sysconfig/network |
836 ls -lR $wdir/etc || error "ls -lR $wdir/etc failed"
837 $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed"
838 $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc ||
839 error "checkstat -u failed"
841 run_test 22 "unpack tar archive as non-root user"
845 test_mkdir $DIR/$tdir
846 local file=$DIR/$tdir/$tfile
848 openfile -f O_CREAT:O_EXCL $file || error "$file create failed"
849 openfile -f O_CREAT:O_EXCL $file &&
850 error "$file recreate succeeded" || true
852 run_test 23a "O_CREAT|O_EXCL in subdir"
854 test_23b() { # bug 18988
855 test_mkdir $DIR/$tdir
856 local file=$DIR/$tdir/$tfile
859 echo foo > $file || error "write filed"
860 echo bar >> $file || error "append filed"
861 $CHECKSTAT -s 8 $file || error "wrong size"
864 run_test 23b "O_APPEND check"
866 # LU-9409, size with O_APPEND and tiny writes
868 local file=$DIR/$tfile
871 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800
872 $CHECKSTAT -s 6400 $file || error "wrong size, expected 6400"
876 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
877 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
879 $CHECKSTAT -s 12800 $file || error "wrong size, expected 12800"
882 #racing tiny & normal writes
883 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4096 count=4 &
884 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=100 &
886 $CHECKSTAT -s 17184 $file || error "wrong size, expected 17184"
889 #racing tiny & normal writes 2, ugly numbers
890 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4099 count=11 &
891 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=17 count=173 &
893 $CHECKSTAT -s 48030 $file || error "wrong size, expected 48030"
896 run_test 23c "O_APPEND size checks for tiny writes"
898 # LU-11069 file offset is correct after appending writes
900 local file=$DIR/$tfile
903 echo CentaurHauls > $file
904 offset=$($MULTIOP $file oO_WRONLY:O_APPEND:w13Zp)
905 if ((offset != 26)); then
906 error "wrong offset, expected 26, got '$offset'"
909 run_test 23d "file offset is correct after appending writes"
913 echo '-- same directory rename'
914 test_mkdir $DIR/$tdir
915 touch $DIR/$tdir/$tfile.1
916 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
917 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
919 run_test 24a "rename file to non-existent target"
922 test_mkdir $DIR/$tdir
923 touch $DIR/$tdir/$tfile.{1,2}
924 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
925 $CHECKSTAT -a $DIR/$tdir/$tfile.1 || error "$tfile.1 exists"
926 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
928 run_test 24b "rename file to existing target"
931 test_mkdir $DIR/$tdir
932 test_mkdir $DIR/$tdir/d$testnum.1
933 mv $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
934 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
935 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
937 run_test 24c "rename directory to non-existent target"
940 test_mkdir -c1 $DIR/$tdir
941 test_mkdir -c1 $DIR/$tdir/d$testnum.1
942 test_mkdir -c1 $DIR/$tdir/d$testnum.2
943 mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
944 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
945 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
947 run_test 24d "rename directory to existing target"
950 echo '-- cross directory renames --'
954 mv $DIR/R5a/f $DIR/R5b/g
955 $CHECKSTAT -a $DIR/R5a/f || error "$DIR/R5a/f exists"
956 $CHECKSTAT -t file $DIR/R5b/g || error "$DIR/R5b/g not file type"
958 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
963 touch $DIR/R6a/f $DIR/R6b/g
964 mv $DIR/R6a/f $DIR/R6b/g
965 $CHECKSTAT -a $DIR/R6a/f || error "$DIR/R6a/f exists"
966 $CHECKSTAT -t file $DIR/R6b/g || error "$DIR/R6b/g not file type"
968 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
973 test_mkdir $DIR/R7a/d
974 mv $DIR/R7a/d $DIR/R7b/e
975 $CHECKSTAT -a $DIR/R7a/d || error "$DIR/R7a/d exists"
976 $CHECKSTAT -t dir $DIR/R7b/e || error "$DIR/R7b/e not dir type"
978 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
981 test_mkdir -c1 $DIR/R8a
982 test_mkdir -c1 $DIR/R8b
983 test_mkdir -c1 $DIR/R8a/d
984 test_mkdir -c1 $DIR/R8b/e
985 mrename $DIR/R8a/d $DIR/R8b/e
986 $CHECKSTAT -a $DIR/R8a/d || error "$DIR/R8a/d exists"
987 $CHECKSTAT -t dir $DIR/R8b/e || error "$DIR/R8b/e not dir type"
989 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
992 echo "-- rename error cases"
996 mrename $DIR/R9/f $DIR/R9/a
997 $CHECKSTAT -t file $DIR/R9/f || error "$DIR/R9/f not file type"
998 $CHECKSTAT -t dir $DIR/R9/a || error "$DIR/R9/a not dir type"
999 $CHECKSTAT -a $DIR/R9/a/f || error "$DIR/R9/a/f exists"
1001 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
1005 mrename $DIR/R10/f $DIR/R10/g
1006 $CHECKSTAT -t dir $DIR/R10 || error "$DIR/R10 not dir type"
1007 $CHECKSTAT -a $DIR/R10/f || error "$DIR/R10/f exists"
1008 $CHECKSTAT -a $DIR/R10/g || error "$DIR/R10/g exists"
1010 run_test 24j "source does not exist ============================"
1013 test_mkdir $DIR/R11a
1014 test_mkdir $DIR/R11a/d
1016 mv $DIR/R11a/f $DIR/R11a/d
1017 $CHECKSTAT -a $DIR/R11a/f || error "$DIR/R11a/f exists"
1018 $CHECKSTAT -t file $DIR/R11a/d/f || error "$DIR/R11a/d/f not file type"
1020 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
1022 # bug 2429 - rename foo foo foo creates invalid file
1025 $MULTIOP $f OcNs || error "rename of ${f} to itself failed"
1027 run_test 24l "Renaming a file to itself ========================"
1031 $MULTIOP $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
1032 # on ext3 this does not remove either the source or target files
1033 # though the "expected" operation would be to remove the source
1034 $CHECKSTAT -t file ${f} || error "${f} missing"
1035 $CHECKSTAT -t file ${f}2 || error "${f}2 missing"
1037 run_test 24m "Renaming a file to a hard link to itself ========="
1041 # this stats the old file after it was renamed, so it should fail
1043 $CHECKSTAT ${f} || error "${f} missing"
1045 $CHECKSTAT ${f}.rename || error "${f}.rename missing"
1046 $CHECKSTAT -a ${f} || error "${f} exists"
1048 run_test 24n "Statting the old file after renaming (Posix rename 2)"
1051 test_mkdir $DIR/$tdir
1052 rename_many -s random -v -n 10 $DIR/$tdir
1054 run_test 24o "rename of files during htree split"
1057 test_mkdir $DIR/R12a
1058 test_mkdir $DIR/R12b
1059 DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
1060 mrename $DIR/R12a $DIR/R12b
1061 $CHECKSTAT -a $DIR/R12a || error "$DIR/R12a exists"
1062 $CHECKSTAT -t dir $DIR/R12b || error "$DIR/R12b not dir type"
1063 DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
1064 [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
1066 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
1068 cleanup_multiop_pause() {
1070 kill -USR1 $MULTIPID
1074 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1076 test_mkdir $DIR/R13a
1077 test_mkdir $DIR/R13b
1078 local DIRINO=$(ls -lid $DIR/R13a | awk '{ print $1 }')
1079 multiop_bg_pause $DIR/R13b D_c || error "multiop failed to start"
1082 trap cleanup_multiop_pause EXIT
1083 mrename $DIR/R13a $DIR/R13b
1084 $CHECKSTAT -a $DIR/R13a || error "R13a still exists"
1085 $CHECKSTAT -t dir $DIR/R13b || error "R13b does not exist"
1086 local DIRINO2=$(ls -lid $DIR/R13b | awk '{ print $1 }')
1087 [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
1088 cleanup_multiop_pause
1089 wait $MULTIPID || error "multiop close failed"
1091 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
1093 test_24r() { #bug 3789
1094 test_mkdir $DIR/R14a
1095 test_mkdir $DIR/R14a/b
1096 mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
1097 $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
1098 $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
1100 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
1103 test_mkdir $DIR/R15a
1104 test_mkdir $DIR/R15a/b
1105 test_mkdir $DIR/R15a/b/c
1106 mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
1107 $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
1108 $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
1110 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
1112 test_mkdir $DIR/R16a
1113 test_mkdir $DIR/R16a/b
1114 test_mkdir $DIR/R16a/b/c
1115 mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
1116 $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
1117 $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
1119 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
1121 test_24u() { # bug12192
1122 $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error "multiop failed"
1123 $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
1125 run_test 24u "create stripe file"
1127 simple_cleanup_common() {
1130 [ -z "$DIR" ] || [ -z "$tdir" ] && return 0
1132 local start=$SECONDS
1135 wait_delete_completed
1136 echo "cleanup time $((SECONDS - start))"
1140 max_pages_per_rpc() {
1141 local mdtname="$(printf "MDT%04x" ${1:-0})"
1142 $LCTL get_param -n mdc.*$mdtname*.max_pages_per_rpc
1146 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1148 local nrfiles=${COUNT:-100000}
1149 local fname="$DIR/$tdir/$tfile"
1151 # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
1152 [ "$mds1_FSTYPE" = "zfs" ] && nrfiles=${COUNT:-10000}
1154 test_mkdir "$(dirname $fname)"
1155 # assume MDT0000 has the fewest inodes
1156 local stripes=$($LFS getdirstripe -c $(dirname $fname))
1157 local free_inodes=$(($(mdt_free_inodes 0) * stripes))
1158 [[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
1160 trap simple_cleanup_common EXIT
1162 createmany -m "$fname" $nrfiles
1164 cancel_lru_locks mdc
1165 lctl set_param mdc.*.stats clear
1167 # was previously test_24D: LU-6101
1168 # readdir() returns correct number of entries after cursor reload
1169 local num_ls=$(ls $DIR/$tdir | wc -l)
1170 local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l)
1171 local num_all=$(ls -a $DIR/$tdir | wc -l)
1172 if [ $num_ls -ne $nrfiles ] || [ $num_uniq -ne $nrfiles ] ||
1173 [ $num_all -ne $((nrfiles + 2)) ]; then
1174 error "Expected $nrfiles files, got $num_ls " \
1175 "($num_uniq unique $num_all .&..)"
1177 # LU-5 large readdir
1178 # dirent_size = 32 bytes for sizeof(struct lu_dirent) +
1179 # N bytes for name (len($nrfiles) rounded to 8 bytes) +
1180 # 8 bytes for luda_type (4 bytes rounded to 8 bytes)
1181 # take into account of overhead in lu_dirpage header and end mark in
1182 # each page, plus one in rpc_num calculation.
1183 local dirent_size=$((32 + (${#tfile} | 7) + 1 + 8))
1184 local page_entries=$(((PAGE_SIZE - 24) / dirent_size))
1185 local mdt_idx=$($LFS getdirstripe -i $(dirname $fname))
1186 local rpc_pages=$(max_pages_per_rpc $mdt_idx)
1187 local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
1188 local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
1189 echo "readpages: $mds_readpage rpc_max: $rpc_max"
1190 (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
1191 error "large readdir doesn't take effect: " \
1192 "$mds_readpage should be about $rpc_max"
1194 simple_cleanup_common
1196 run_test 24v "list large directory (test hash collision, b=17560)"
1198 test_24w() { # bug21506
1200 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
1201 dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
1202 dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
1203 SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
1204 [[ "$SZ1" -eq "$SZ2" ]] ||
1205 error "Error reading at the end of the file $tfile"
1207 run_test 24w "Reading a file larger than 4Gb"
1210 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1211 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1212 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1213 skip "Need MDS version at least 2.7.56"
1216 local remote_dir=$DIR/$tdir/remote_dir
1218 test_mkdir $DIR/$tdir
1219 $LFS mkdir -i $MDTIDX $remote_dir ||
1220 error "create remote directory failed"
1222 test_mkdir $DIR/$tdir/src_dir
1223 touch $DIR/$tdir/src_file
1224 test_mkdir $remote_dir/tgt_dir
1225 touch $remote_dir/tgt_file
1227 mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
1228 error "rename dir cross MDT failed!"
1230 mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
1231 error "rename file cross MDT failed!"
1233 touch $DIR/$tdir/ln_file
1234 ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
1235 error "ln file cross MDT failed"
1237 rm -rf $DIR/$tdir || error "Can not delete directories"
1239 run_test 24x "cross MDT rename/link"
1242 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1243 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1245 local remote_dir=$DIR/$tdir/remote_dir
1248 test_mkdir $DIR/$tdir
1249 $LFS mkdir -i $mdtidx $remote_dir ||
1250 error "create remote directory failed"
1252 test_mkdir $remote_dir/src_dir
1253 touch $remote_dir/src_file
1254 test_mkdir $remote_dir/tgt_dir
1255 touch $remote_dir/tgt_file
1257 mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
1258 error "rename subdir in the same remote dir failed!"
1260 mrename $remote_dir/src_file $remote_dir/tgt_file ||
1261 error "rename files in the same remote dir failed!"
1263 ln $remote_dir/tgt_file $remote_dir/tgt_file1 ||
1264 error "link files in the same remote dir failed!"
1266 rm -rf $DIR/$tdir || error "Can not delete directories"
1268 run_test 24y "rename/link on the same dir should succeed"
1271 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1272 [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] &&
1273 skip "Need MDS version at least 2.12.51"
1277 for index in 0 1; do
1278 $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed"
1279 touch $DIR/$tdir.0/$tfile.$index || error "touch failed"
1282 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed"
1284 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0)
1285 [ $index -eq 0 ] || error "$tfile.0 is on MDT$index"
1287 local mdts=$(comma_list $(mdts_nodes))
1289 do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0
1290 stack_trap "do_nodes $mdts $LCTL \
1291 set_param mdt.*.enable_remote_rename=1" EXIT
1293 mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed"
1295 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1)
1296 [ $index -eq 1 ] || error "$tfile.1 is on MDT$index"
1298 run_test 24z "cross-MDT rename is done as cp"
1300 test_24A() { # LU-3182
1304 test_mkdir $DIR/$tdir
1305 trap simple_cleanup_common EXIT
1306 createmany -m $DIR/$tdir/$tfile $NFILES
1307 local t=$(ls $DIR/$tdir | wc -l)
1308 local u=$(ls $DIR/$tdir | sort -u | wc -l)
1309 local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
1310 if [ $t -ne $NFILES ] || [ $u -ne $NFILES ] ||
1311 [ $v -ne $((NFILES + 2)) ] ; then
1312 error "Expected $NFILES files, got $t ($u unique $v .&..)"
1315 simple_cleanup_common || error "Can not delete directories"
1317 run_test 24A "readdir() returns correct number of entries."
1319 test_24B() { # LU-4805
1320 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1324 test_mkdir $DIR/$tdir
1325 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
1326 error "create striped dir failed"
1328 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1329 [ $count -eq 2 ] || error "Expected 2, got $count"
1331 touch $DIR/$tdir/striped_dir/a
1333 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1334 [ $count -eq 3 ] || error "Expected 3, got $count"
1336 touch $DIR/$tdir/striped_dir/.f
1338 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1339 [ $count -eq 4 ] || error "Expected 4, got $count"
1341 rm -rf $DIR/$tdir || error "Can not delete directories"
1343 run_test 24B "readdir for striped dir return correct number of entries"
1346 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1352 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
1353 error "create striped dir failed"
1355 cd $DIR/$tdir/d0/striped_dir
1357 local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
1358 local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
1359 local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1361 [ "$d0_ino" = "$parent_ino" ] ||
1362 error ".. wrong, expect $d0_ino, get $parent_ino"
1364 mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
1365 error "mv striped dir failed"
1367 parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1369 [ "$d1_ino" = "$parent_ino" ] ||
1370 error ".. wrong after mv, expect $d1_ino, get $parent_ino"
1372 run_test 24C "check .. in striped dir"
1375 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
1376 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1379 mkdir $DIR/$tdir/src_dir
1380 $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
1381 error "create remote source failed"
1383 touch $DIR/$tdir/src_dir/src_child/a
1385 $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
1386 error "create remote target dir failed"
1388 $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
1389 error "create remote target child failed"
1391 mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
1392 error "rename dir cross MDT failed!"
1396 $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
1397 error "src_child still exists after rename"
1399 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
1400 error "missing file(a) after rename"
1402 rm -rf $DIR/$tdir || error "Can not delete directories"
1404 run_test 24E "cross MDT rename/link"
1407 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
1410 [ "$SLOW" = "no" ] && repeats=100
1414 echo "$repeats repeats"
1415 for ((i = 0; i < repeats; i++)); do
1416 $LFS mkdir -i0 -c2 $DIR/$tdir/test || error "mkdir fails"
1417 touch $DIR/$tdir/test/a || error "touch fails"
1418 mkdir $DIR/$tdir/test/b || error "mkdir fails"
1419 rm -rf $DIR/$tdir/test || error "rmdir fails"
1424 run_test 24F "hash order vs readdir (LU-11330)"
1427 echo '== symlink sanity ============================================='
1431 touch $DIR/s25/foo ||
1432 error "File creation in symlinked directory failed"
1434 run_test 25a "create file in symlinked directory ==============="
1437 [ ! -d $DIR/d25 ] && test_25a
1438 $CHECKSTAT -t file $DIR/s25/foo || error "$DIR/s25/foo not file type"
1440 run_test 25b "lookup file in symlinked directory ==============="
1444 test_mkdir $DIR/d26/d26-2
1445 ln -s d26/d26-2 $DIR/s26
1446 touch $DIR/s26/foo || error "File creation failed"
1448 run_test 26a "multiple component symlink ======================="
1451 test_mkdir -p $DIR/$tdir/d26-2
1452 ln -s $tdir/d26-2/foo $DIR/s26-2
1453 touch $DIR/s26-2 || error "File creation failed"
1455 run_test 26b "multiple component symlink at end of lookup ======"
1458 test_mkdir $DIR/d26.2
1459 touch $DIR/d26.2/foo
1460 ln -s d26.2 $DIR/s26.2-1
1461 ln -s s26.2-1 $DIR/s26.2-2
1462 ln -s s26.2-2 $DIR/s26.2-3
1463 chmod 0666 $DIR/s26.2-3/foo
1465 run_test 26c "chain of symlinks"
1467 # recursive symlinks (bug 439)
1469 ln -s d26-3/foo $DIR/d26-3
1471 run_test 26d "create multiple component recursive symlink"
1474 [ ! -h $DIR/d26-3 ] && test_26d
1477 run_test 26e "unlink multiple component recursive symlink"
1479 # recursive symlinks (bug 7022)
1481 test_mkdir $DIR/$tdir
1482 test_mkdir $DIR/$tdir/$tfile
1483 cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed"
1484 test_mkdir -p lndir/bar1
1485 test_mkdir $DIR/$tdir/$tfile/$tfile
1486 cd $tfile || error "cd $tfile failed"
1487 ln -s .. dotdot || error "ln dotdot failed"
1488 ln -s dotdot/lndir lndir || error "ln lndir failed"
1489 cd $DIR/$tdir || error "cd $DIR/$tdir failed"
1490 output=`ls $tfile/$tfile/lndir/bar1`
1491 [ "$output" = bar1 ] && error "unexpected output"
1492 rm -r $tfile || error "rm $tfile failed"
1493 $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
1495 run_test 26f "rm -r of a directory which has recursive symlink"
1498 test_mkdir $DIR/$tdir
1499 $LFS getstripe $DIR/$tdir
1500 $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed"
1501 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1502 cp /etc/hosts $DIR/$tdir/$tfile || error "Can't copy to one stripe file"
1504 run_test 27a "one stripe file"
1507 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1509 test_mkdir $DIR/$tdir
1510 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1511 $LFS getstripe -c $DIR/$tdir/$tfile
1512 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
1513 error "two-stripe file doesn't have two stripes"
1515 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1517 run_test 27b "create and write to two stripe file"
1519 # 27c family tests specific striping, setstripe -o
1521 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1522 test_mkdir -p $DIR/$tdir
1525 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1526 $LFS getstripe -i $DIR/$tdir/$tfile
1527 [ $($LFS getstripe -i $DIR/$tdir/$tfile ) -eq $osts ] ||
1528 error "stripe not on specified OST"
1530 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1532 run_test 27ca "one stripe on specified OST"
1535 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1536 test_mkdir -p $DIR/$tdir
1538 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1539 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1542 # Strip getstripe output to a space separated list of OSTs
1543 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1544 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1545 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1546 error "stripes not on specified OSTs"
1548 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1550 run_test 27cb "two stripes on specified OSTs"
1553 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1554 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
1555 skip "server does not support overstriping"
1557 test_mkdir -p $DIR/$tdir
1559 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1560 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1563 # Strip getstripe output to a space separated list of OSTs
1564 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1565 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1566 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1567 error "stripes not on specified OSTs"
1569 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1571 run_test 27cc "two stripes on the same OST"
1574 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1575 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
1576 skip "server does not support overstriping"
1577 test_mkdir -p $DIR/$tdir
1578 local osts="0,1,1,0"
1579 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1580 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1583 # Strip getstripe output to a space separated list of OSTs
1584 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1585 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1586 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1587 error "stripes not on specified OSTs"
1589 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1591 run_test 27cd "four stripes on two OSTs"
1594 [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
1595 skip_env "too many osts, skipping"
1596 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
1597 skip "server does not support overstriping"
1598 # We do one more stripe than we have OSTs
1599 [ $OSTCOUNT -ge 159 ] || large_xattr_enabled ||
1600 skip_env "ea_inode feature disabled"
1602 test_mkdir -p $DIR/$tdir
1604 for i in $(seq 0 $OSTCOUNT);
1607 if [ $i -ne $OSTCOUNT ]; then
1611 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1612 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1615 # Strip getstripe output to a space separated list of OSTs
1616 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1617 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1618 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1619 error "stripes not on specified OSTs"
1621 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1623 run_test 27ce "more stripes than OSTs with -o"
1626 test_mkdir $DIR/$tdir
1627 $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
1628 error "setstripe failed"
1629 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1630 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1632 run_test 27d "create file with default settings"
1635 # LU-5839 adds check for existed layout before setting it
1636 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1637 skip "Need MDS version at least 2.7.56"
1639 test_mkdir $DIR/$tdir
1640 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1641 $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice"
1642 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1644 run_test 27e "setstripe existing file (should return error)"
1647 test_mkdir $DIR/$tdir
1648 $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
1649 error "$LFS setstripe $DIR/$tdir/$tfile failed"
1650 $CHECKSTAT -t file $DIR/$tdir/$tfile &&
1651 error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
1652 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1653 $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed"
1655 run_test 27f "setstripe with bad stripe size (should return error)"
1658 test_mkdir $DIR/$tdir
1659 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1660 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" ||
1661 error "$DIR/$tdir/$tfile has object"
1663 run_test 27g "$LFS getstripe with no objects"
1666 test_mkdir $DIR/$tdir
1667 touch $DIR/$tdir/$tfile || error "touch failed"
1668 ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed"
1669 $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2
1671 (( rc == 2 )) || error "getstripe did not return ENOENT"
1673 run_test 27ga "$LFS getstripe with missing file (should return error)"
1676 test_mkdir $DIR/$tdir
1677 touch $DIR/$tdir/$tfile || error "touch failed"
1678 [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] ||
1679 error "missing objects"
1681 run_test 27i "$LFS getstripe with some objects"
1684 test_mkdir $DIR/$tdir
1685 $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile &&
1686 error "setstripe failed" || true
1688 run_test 27j "setstripe with bad stripe offset (should return error)"
1690 test_27k() { # bug 2844
1691 test_mkdir $DIR/$tdir
1692 local file=$DIR/$tdir/$tfile
1693 local ll_max_blksize=$((4 * 1024 * 1024))
1694 $LFS setstripe -S 67108864 $file || error "setstripe failed"
1695 local blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1696 [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize"
1697 dd if=/dev/zero of=$file bs=4k count=1
1698 blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1699 [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize"
1701 run_test 27k "limit i_blksize for broken user apps"
1704 mcreate $DIR/$tfile || error "creating file"
1705 $RUNAS $LFS setstripe -c 1 $DIR/$tfile &&
1706 error "setstripe should have failed" || true
1708 run_test 27l "check setstripe permissions (should return error)"
1711 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1713 [ -n "$RCLIENTS" -o -n "$MOUNT_2" ] &&
1714 skip_env "multiple clients -- skipping"
1716 ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
1718 if [[ $ORIGFREE -gt $MAXFREE ]]; then
1719 skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
1721 trap simple_cleanup_common EXIT
1722 test_mkdir $DIR/$tdir
1723 $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
1724 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
1725 error "dd should fill OST0"
1727 while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do
1729 [ $i -gt 256 ] && break
1732 touch $DIR/$tdir/$tfile.$i
1733 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1734 awk '{print $1}'| grep -w "0") ] &&
1735 error "OST0 was full but new created file still use it"
1737 touch $DIR/$tdir/$tfile.$i
1738 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1739 awk '{print $1}'| grep -w "0") ] &&
1740 error "OST0 was full but new created file still use it"
1741 simple_cleanup_common
1743 run_test 27m "create file while OST0 was full"
1745 # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage)
1746 # if the OST isn't full anymore.
1748 local OSTIDX=${1:-""}
1750 local list=$(comma_list $(osts_nodes))
1751 [ "$OSTIDX" ] && list=$(facet_host ost$((OSTIDX + 1)))
1753 do_nodes $list lctl set_param fail_loc=0
1754 sync # initiate all OST_DESTROYs from MDS to OST
1758 exhaust_precreations() {
1761 local FAILIDX=${3:-$OSTIDX}
1762 local ofacet=ost$((OSTIDX + 1))
1764 test_mkdir -p -c1 $DIR/$tdir
1765 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
1766 local mfacet=mds$((mdtidx + 1))
1767 echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
1769 local OST=$(ostname_from_index $OSTIDX)
1772 local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST)
1773 local last_id=$(do_facet $mfacet lctl get_param -n \
1774 osp.$mdtosc_proc1.prealloc_last_id)
1775 local next_id=$(do_facet $mfacet lctl get_param -n \
1776 osp.$mdtosc_proc1.prealloc_next_id)
1778 local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet)
1779 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1781 test_mkdir -p $DIR/$tdir/${OST}
1782 $LFS setstripe -i $OSTIDX -c 1 $DIR/$tdir/${OST}
1783 #define OBD_FAIL_OST_ENOSPC 0x215
1784 do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215
1785 echo "Creating to objid $last_id on ost $OST..."
1786 createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
1787 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1788 do_facet $ofacet lctl set_param fail_loc=$FAILLOC
1792 exhaust_all_precreations() {
1794 for (( i=0; i < OSTCOUNT; i++ )) ; do
1795 exhaust_precreations $i $1 -1
1800 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1801 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1802 remote_mds_nodsh && skip "remote MDS with nodsh"
1803 remote_ost_nodsh && skip "remote OST with nodsh"
1806 rm -f $DIR/$tdir/$tfile
1807 exhaust_precreations 0 0x80000215
1808 $LFS setstripe -c -1 $DIR/$tdir || error "setstripe failed"
1809 touch $DIR/$tdir/$tfile || error "touch failed"
1810 $LFS getstripe $DIR/$tdir/$tfile
1813 run_test 27n "create file with some full OSTs"
1816 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1817 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1818 remote_mds_nodsh && skip "remote MDS with nodsh"
1819 remote_ost_nodsh && skip "remote OST with nodsh"
1822 rm -f $DIR/$tdir/$tfile
1823 exhaust_all_precreations 0x215
1825 touch $DIR/$tdir/$tfile && error "able to create $DIR/$tdir/$tfile"
1830 run_test 27o "create file with all full OSTs (should error)"
1833 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1834 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1835 remote_mds_nodsh && skip "remote MDS with nodsh"
1836 remote_ost_nodsh && skip "remote OST with nodsh"
1839 rm -f $DIR/$tdir/$tfile
1840 test_mkdir $DIR/$tdir
1842 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1843 $TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed"
1844 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1846 exhaust_precreations 0 0x80000215
1847 echo foo >> $DIR/$tdir/$tfile || error "append failed"
1848 $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed"
1849 $LFS getstripe $DIR/$tdir/$tfile
1853 run_test 27p "append to a truncated file with some full OSTs"
1856 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1857 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1858 remote_mds_nodsh && skip "remote MDS with nodsh"
1859 remote_ost_nodsh && skip "remote OST with nodsh"
1862 rm -f $DIR/$tdir/$tfile
1864 test_mkdir $DIR/$tdir
1865 $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
1866 $TRUNCATE $DIR/$tdir/$tfile 80000000 ||
1867 error "truncate $DIR/$tdir/$tfile failed"
1868 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1870 exhaust_all_precreations 0x215
1872 echo foo >> $DIR/$tdir/$tfile && error "append succeeded"
1873 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat 2 failed"
1877 run_test 27q "append to truncated file with all OSTs full (should error)"
1880 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1881 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1882 remote_mds_nodsh && skip "remote MDS with nodsh"
1883 remote_ost_nodsh && skip "remote OST with nodsh"
1886 rm -f $DIR/$tdir/$tfile
1887 exhaust_precreations 0 0x80000215
1889 $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1893 run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
1895 test_27s() { # bug 10725
1896 test_mkdir $DIR/$tdir
1897 local stripe_size=$((4096 * 1024 * 1024)) # 2^32
1898 local stripe_count=0
1899 [ $OSTCOUNT -eq 1 ] || stripe_count=2
1900 $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir &&
1901 error "stripe width >= 2^32 succeeded" || true
1904 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
1906 test_27t() { # bug 10864
1911 $WLFS getstripe $tfile
1914 run_test 27t "check that utils parse path correctly"
1916 test_27u() { # bug 4900
1917 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1918 remote_mds_nodsh && skip "remote MDS with nodsh"
1921 local list=$(comma_list $(mdts_nodes))
1923 #define OBD_FAIL_MDS_OSC_PRECREATE 0x139
1924 do_nodes $list $LCTL set_param fail_loc=0x139
1925 test_mkdir -p $DIR/$tdir
1926 trap simple_cleanup_common EXIT
1927 createmany -o $DIR/$tdir/t- 1000
1928 do_nodes $list $LCTL set_param fail_loc=0
1930 TLOG=$TMP/$tfile.getstripe
1931 $LFS getstripe $DIR/$tdir > $TLOG
1932 OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
1933 unlinkmany $DIR/$tdir/t- 1000
1935 [[ $OBJS -gt 0 ]] &&
1936 error "$OBJS objects created on OST-0. See $TLOG" ||
1939 run_test 27u "skip object creation on OSC w/o objects"
1941 test_27v() { # bug 4900
1942 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1943 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1944 remote_mds_nodsh && skip "remote MDS with nodsh"
1945 remote_ost_nodsh && skip "remote OST with nodsh"
1947 exhaust_all_precreations 0x215
1950 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1952 touch $DIR/$tdir/$tfile
1953 #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
1955 for (( i=1; i < OSTCOUNT; i++ )); do
1956 do_facet ost$i lctl set_param fail_loc=0x705
1958 local START=`date +%s`
1959 createmany -o $DIR/$tdir/$tfile 32
1961 local FINISH=`date +%s`
1962 local TIMEOUT=`lctl get_param -n timeout`
1963 local PROCESS=$((FINISH - START))
1964 [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
1965 error "$FINISH - $START >= $TIMEOUT / 2"
1966 sleep $((TIMEOUT / 2 - PROCESS))
1969 run_test 27v "skip object creation on slow OST"
1971 test_27w() { # bug 10997
1972 test_mkdir $DIR/$tdir
1973 $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
1974 [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
1975 error "stripe size $size != 65536" || true
1976 [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
1977 error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
1979 run_test 27w "check $LFS setstripe -S and getstrip -d options"
1982 [[ $OSTCOUNT -lt 2 ]] &&
1983 skip_env "skipping multiple stripe count/offset test"
1985 test_mkdir $DIR/$tdir
1986 for i in $(seq 1 $OSTCOUNT); do
1988 $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i ||
1989 error "setstripe -c $i -i $offset failed"
1990 count=$($LFS getstripe -c $DIR/$tdir/f$i)
1991 index=$($LFS getstripe -i $DIR/$tdir/f$i)
1992 [ $count -ne $i ] && error "stripe count $count != $i" || true
1993 [ $index -ne $offset ] &&
1994 error "stripe offset $index != $offset" || true
1997 run_test 27wa "check $LFS setstripe -c -i options"
2000 remote_ost_nodsh && skip "remote OST with nodsh"
2001 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2002 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2004 OFFSET=$(($OSTCOUNT - 1))
2006 local OST=$(ostname_from_index $OSTIDX)
2008 test_mkdir $DIR/$tdir
2009 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file
2010 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1
2012 createmany -o $DIR/$tdir/$tfile $OSTCOUNT
2013 for i in $(seq 0 $OFFSET); do
2014 [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx |
2015 awk '{print $1}' | grep -w "$OSTIDX") ] &&
2016 error "OST0 was degraded but new created file still use it"
2018 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0
2020 run_test 27x "create files while OST0 is degraded"
2023 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2024 remote_mds_nodsh && skip "remote MDS with nodsh"
2025 remote_ost_nodsh && skip "remote OST with nodsh"
2026 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2028 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
2029 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
2030 osp.$mdtosc.prealloc_last_id)
2031 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
2032 osp.$mdtosc.prealloc_next_id)
2033 local fcount=$((last_id - next_id))
2034 [[ $fcount -eq 0 ]] && skip "not enough space on OST0"
2035 [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
2037 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
2038 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
2039 local OST_DEACTIVE_IDX=-1
2044 for OSC in $MDS_OSCS; do
2045 OST=$(osc_to_ost $OSC)
2046 OSTIDX=$(index_from_ostuuid $OST)
2047 if [ $OST_DEACTIVE_IDX == -1 ]; then
2048 OST_DEACTIVE_IDX=$OSTIDX
2050 if [ $OSTIDX != $OST_DEACTIVE_IDX ]; then
2051 echo $OSC "is Deactivated:"
2052 do_facet $SINGLEMDS lctl --device %$OSC deactivate
2056 OSTIDX=$(index_from_ostuuid $OST)
2057 test_mkdir $DIR/$tdir
2058 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
2060 for OSC in $MDS_OSCS; do
2061 OST=$(osc_to_ost $OSC)
2062 OSTIDX=$(index_from_ostuuid $OST)
2063 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
2064 echo $OST "is degraded:"
2065 do_facet ost$((OSTIDX+1)) lctl set_param -n \
2066 obdfilter.$OST.degraded=1
2071 createmany -o $DIR/$tdir/$tfile $fcount
2073 for OSC in $MDS_OSCS; do
2074 OST=$(osc_to_ost $OSC)
2075 OSTIDX=$(index_from_ostuuid $OST)
2076 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
2077 echo $OST "is recovered from degraded:"
2078 do_facet ost$((OSTIDX+1)) lctl set_param -n \
2079 obdfilter.$OST.degraded=0
2081 do_facet $SINGLEMDS lctl --device %$OSC activate
2085 # all osp devices get activated, hence -1 stripe count restored
2086 local stripe_count=0
2088 # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp
2089 # devices get activated.
2091 $LFS setstripe -c -1 $DIR/$tfile
2092 stripe_count=$($LFS getstripe -c $DIR/$tfile)
2094 [ $stripe_count -ne $OSTCOUNT ] &&
2095 error "Of $OSTCOUNT OSTs, only $stripe_count is available"
2098 run_test 27y "create files while OST0 is degraded and the rest inactive"
2104 lmm_count=$($LFS getstripe -c $1)
2105 lmm_seq=$($LFS getstripe -v $1 | awk '/lmm_seq/ { print $2 }')
2106 lmm_oid=$($LFS getstripe -v $1 | awk '/lmm_object_id/ { print $2 }')
2108 local old_ifs="$IFS"
2110 fid=($($LFS path2fid $1))
2113 log "FID seq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}"
2114 log "LOV seq $lmm_seq, oid $lmm_oid, count: $lmm_count"
2116 # compare lmm_seq and lu_fid->f_seq
2117 [ $lmm_seq = ${fid[1]} ] || { error "SEQ mismatch"; return 1; }
2118 # compare lmm_object_id and lu_fid->oid
2119 [ $lmm_oid = ${fid[2]} ] || { error "OID mismatch"; return 2; }
2121 # check the trusted.fid attribute of the OST objects of the file
2122 local have_obdidx=false
2124 $LFS getstripe $1 | while read obdidx oid hex seq; do
2125 # skip lines up to and including "obdidx"
2126 [ -z "$obdidx" ] && break
2127 [ "$obdidx" = "obdidx" ] && have_obdidx=true && continue
2128 $have_obdidx || continue
2130 local ost=$((obdidx + 1))
2131 local dev=$(ostdevname $ost)
2134 log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
2136 seq=$(echo $seq | sed -e "s/^0x//g")
2137 if [ $seq == 0 ] || [ $(facet_fstype ost$ost) == zfs ]; then
2138 oid_hex=$(echo $oid)
2140 oid_hex=$(echo $hex | sed -e "s/^0x//g")
2142 local obj_file="O/$seq/d$((oid %32))/$oid_hex"
2146 # Don't unmount/remount the OSTs if we don't need to do that.
2147 # LU-2577 changes filter_fid to be smaller, so debugfs needs
2148 # update too, until that use mount/ll_decode_filter_fid/mount.
2149 # Re-enable when debugfs will understand new filter_fid.
2151 if [ $(facet_fstype ost$ost) == ldiskfs ]; then
2152 ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
2153 $dev 2>/dev/null" | grep "parent=")
2155 if [ -z "$ff" ]; then
2157 mount_fstype ost$ost
2158 ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
2159 $(facet_mntpt ost$ost)/$obj_file)
2160 unmount_fstype ost$ost
2161 start ost$ost $dev $OST_MOUNT_OPTS
2165 [ -z "$ff" ] && error "$obj_file: no filter_fid info"
2167 echo "$ff" | sed -e 's#.*objid=#got: objid=#'
2169 # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
2170 # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
2172 # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \
2173 # stripe_size=1048576 component_id=1 component_start=0 \
2174 # component_end=33554432
2175 local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff)
2176 local ff_pseq=$(cut -d: -f1 <<<$ff_parent)
2177 local ff_poid=$(cut -d: -f2 <<<$ff_parent)
2179 if grep -q 'stripe=' <<<$ff; then
2180 ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff)
2182 # $LL_DECODE_FILTER_FID does not print "stripe="; look
2183 # into f_ver in this case. See comment on ff_parent.
2184 ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//')
2187 # compare lmm_seq and filter_fid->ff_parent.f_seq
2188 [ $ff_pseq = $lmm_seq ] ||
2189 error "FF parent SEQ $ff_pseq != $lmm_seq"
2190 # compare lmm_object_id and filter_fid->ff_parent.f_oid
2191 [ $ff_poid = $lmm_oid ] ||
2192 error "FF parent OID $ff_poid != $lmm_oid"
2193 (($ff_pstripe == $stripe_nr)) ||
2194 error "FF stripe $ff_pstripe != $stripe_nr"
2196 stripe_nr=$((stripe_nr + 1))
2197 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2199 if grep -q 'stripe_count=' <<<$ff; then
2200 local ff_scnt=$(sed -e 's/.*stripe_count=//' \
2201 -e 's/ .*//' <<<$ff)
2202 [ $lmm_count = $ff_scnt ] ||
2203 error "FF stripe count $lmm_count != $ff_scnt"
2209 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2210 remote_ost_nodsh && skip "remote OST with nodsh"
2212 test_mkdir $DIR/$tdir
2213 $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
2214 { error "setstripe -c -1 failed"; return 1; }
2215 # We need to send a write to every object to get parent FID info set.
2216 # This _should_ also work for setattr, but does not currently.
2217 # touch $DIR/$tdir/$tfile-1 ||
2218 dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
2219 { error "dd $tfile-1 failed"; return 2; }
2220 $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
2221 { error "setstripe -c -1 failed"; return 3; }
2222 dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
2223 { error "dd $tfile-2 failed"; return 4; }
2225 # make sure write RPCs have been sent to OSTs
2228 check_seq_oid $DIR/$tdir/$tfile-1 || return 5
2229 check_seq_oid $DIR/$tdir/$tfile-2 || return 6
2231 run_test 27z "check SEQ/OID on the MDT and OST filesystems"
2233 test_27A() { # b=19102
2234 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2236 save_layout_restore_at_exit $MOUNT
2237 $LFS setstripe -c 0 -i -1 -S 0 $MOUNT
2238 wait_update $HOSTNAME "$LFS getstripe -c $MOUNT | sed 's/ *//g'" "1" 20 ||
2239 error "stripe count $($LFS getstripe -c $MOUNT) != 1"
2240 local default_size=$($LFS getstripe -S $MOUNT)
2241 local default_offset=$($LFS getstripe -i $MOUNT)
2242 local dsize=$(do_facet $SINGLEMDS \
2243 "$LCTL get_param -n lod.$(facet_svc $SINGLEMDS)*.stripesize")
2244 [ $default_size -eq $dsize ] ||
2245 error "stripe size $default_size != $dsize"
2246 [ $default_offset -eq -1 ] ||
2247 error "stripe offset $default_offset != -1"
2249 run_test 27A "check filesystem-wide default LOV EA values"
2251 test_27B() { # LU-2523
2252 test_mkdir $DIR/$tdir
2253 rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
2255 # open f1 with O_LOV_DELAY_CREATE
2257 # call setstripe ioctl on open file descriptor for f1
2259 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:nB1c \
2263 # open f1 with O_LOV_DELAY_CREATE
2265 # call setstripe ioctl on open file descriptor for f1
2267 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:uB1c
2269 # Allow multiop to fail in imitation of NFS's busted semantics.
2272 run_test 27B "call setstripe on open unlinked file/rename victim"
2274 # 27C family tests full striping and overstriping
2275 test_27Ca() { #LU-2871
2276 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2284 test_mkdir $DIR/$tdir
2286 for i in $(seq 0 $((OSTCOUNT - 1))); do
2287 # set stripe across all OSTs starting from OST$i
2288 $LFS setstripe -i $i -c -1 $tfile$i
2289 # get striping information
2290 ost_idx=($($LFS getstripe $tfile$i |
2291 tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
2295 [ ${#ost_idx[@]} -eq $OSTCOUNT ] ||
2296 error "${#ost_idx[@]} != $OSTCOUNT"
2298 for index in $(seq 0 $((OSTCOUNT - 1))); do
2300 for j in $(echo ${ost_idx[@]}); do
2301 if [ $index -eq $j ]; then
2307 error "Can not find $index in ${ost_idx[@]}"
2311 run_test 27Ca "check full striping across all OSTs"
2314 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2315 skip "server does not support overstriping"
2316 [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2317 skip_env "too many osts, skipping"
2319 test_mkdir -p $DIR/$tdir
2320 local setcount=$(($OSTCOUNT * 2))
2321 [ $setcount -ge 160 ] || large_xattr_enabled ||
2322 skip_env "ea_inode feature disabled"
2324 $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
2325 error "setstripe failed"
2327 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2328 [ $count -eq $setcount ] ||
2329 error "stripe count $count, should be $setcount"
2331 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2332 error "overstriped should be set in pattern"
2334 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2337 run_test 27Cb "more stripes than OSTs with -C"
2340 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2341 skip "server does not support overstriping"
2342 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2344 test_mkdir -p $DIR/$tdir
2345 local setcount=$(($OSTCOUNT - 1))
2347 [ $setcount -ge 160 ] || large_xattr_enabled ||
2348 skip_env "ea_inode feature disabled"
2350 $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
2351 error "setstripe failed"
2353 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2354 [ $count -eq $setcount ] ||
2355 error "stripe count $count, should be $setcount"
2357 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" &&
2358 error "overstriped should not be set in pattern"
2360 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2363 run_test 27Cc "fewer stripes than OSTs does not set overstriping"
2366 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2367 skip "server does not support overstriping"
2368 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2369 large_xattr_enabled || skip_env "ea_inode feature disabled"
2371 test_mkdir -p $DIR/$tdir
2372 local setcount=$LOV_MAX_STRIPE_COUNT
2374 $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
2375 error "setstripe failed"
2377 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2378 [ $count -eq $setcount ] ||
2379 error "stripe count $count, should be $setcount"
2381 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2382 error "overstriped should be set in pattern"
2384 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2387 rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
2389 run_test 27Cd "test maximum stripe count"
2392 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2393 skip "server does not support overstriping"
2394 test_mkdir -p $DIR/$tdir
2396 pool_add $TESTNAME || error "Pool creation failed"
2397 pool_add_targets $TESTNAME 0 || error "pool_add_targets failed"
2401 $LFS setstripe -C $setcount -p "$TESTNAME" $DIR/$tdir/$tfile ||
2402 error "setstripe failed"
2404 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2405 [ $count -eq $setcount ] ||
2406 error "stripe count $count, should be $setcount"
2408 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2409 error "overstriped should be set in pattern"
2411 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2414 rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
2416 run_test 27Ce "test pool with overstriping"
2419 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2420 skip "server does not support overstriping"
2421 [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2422 skip_env "too many osts, skipping"
2424 test_mkdir -p $DIR/$tdir
2426 local setcount=$(($OSTCOUNT * 2))
2427 [ $setcount -ge 160 ] || large_xattr_enabled ||
2428 skip_env "ea_inode feature disabled"
2430 $LFS setstripe -C $setcount $DIR/$tdir/ ||
2431 error "setstripe failed"
2433 echo 1 > $DIR/$tdir/$tfile
2435 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2436 [ $count -eq $setcount ] ||
2437 error "stripe count $count, should be $setcount"
2439 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2440 error "overstriped should be set in pattern"
2442 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2445 rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
2447 run_test 27Cf "test default inheritance with overstriping"
2450 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2451 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2452 remote_mds_nodsh && skip "remote MDS with nodsh"
2454 local POOL=${POOL:-testpool}
2456 local last_ost=$(($OSTCOUNT - 1))
2458 local ost_list=$(seq $first_ost $ost_step $last_ost)
2459 local ost_range="$first_ost $last_ost $ost_step"
2461 if ! combined_mgs_mds ; then
2465 test_mkdir $DIR/$tdir
2466 pool_add $POOL || error "pool_add failed"
2467 pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
2470 [ $MDS1_VERSION -lt $(version_code 2.8.55) ] &&
2472 [ $MDS1_VERSION -lt $(version_code 2.9.55) ] ||
2473 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2474 skip27D+=" -s 30,31"
2475 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] &&
2477 [[ ! $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ||
2478 $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2479 skip27D+=" -s 32,33"
2480 llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
2481 error "llapi_layout_test failed"
2483 destroy_test_pools || error "destroy test pools failed"
2485 if ! combined_mgs_mds ; then
2489 run_test 27D "validate llapi_layout API"
2491 # Verify that default_easize is increased from its initial value after
2492 # accessing a widely striped file.
2494 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2495 [ $CLIENT_VERSION -lt $(version_code 2.5.57) ] &&
2496 skip "client does not have LU-3338 fix"
2498 # 72 bytes is the minimum space required to store striping
2499 # information for a file striped across one OST:
2500 # (sizeof(struct lov_user_md_v3) +
2501 # sizeof(struct lov_user_ost_data_v1))
2503 $LCTL set_param -n llite.*.default_easize $min_easize ||
2504 error "lctl set_param failed"
2505 local easize=$($LCTL get_param -n llite.*.default_easize)
2507 [ $easize -eq $min_easize ] ||
2508 error "failed to set default_easize"
2510 $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
2511 error "setstripe failed"
2512 # In order to ensure stat() call actually talks to MDS we need to
2513 # do something drastic to this file to shake off all lock, e.g.
2514 # rename it (kills lookup lock forcing cache cleaning)
2515 mv $DIR/$tfile $DIR/${tfile}-1
2516 ls -l $DIR/${tfile}-1
2519 easize=$($LCTL get_param -n llite.*.default_easize)
2521 [ $easize -gt $min_easize ] ||
2522 error "default_easize not updated"
2524 run_test 27E "check that default extended attribute size properly increases"
2526 test_27F() { # LU-5346/LU-7975
2527 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2528 [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs"
2529 [[ $MDS1_VERSION -lt $(version_code 2.8.51) ]] &&
2530 skip "Need MDS version at least 2.8.51"
2531 remote_ost_nodsh && skip "remote OST with nodsh"
2533 test_mkdir $DIR/$tdir
2535 $LFS setstripe -c 2 $DIR/$tdir
2537 # stop all OSTs to reproduce situation for LU-7975 ticket
2538 for num in $(seq $OSTCOUNT); do
2542 # open/create f0 with O_LOV_DELAY_CREATE
2543 # truncate f0 to a non-0 size
2545 multiop $DIR/$tdir/f0 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T1050000c
2547 $CHECKSTAT -s 1050000 $DIR/$tdir/f0 || error "checkstat failed"
2548 # open/write it again to force delayed layout creation
2549 cat /etc/hosts > $DIR/$tdir/f0 &
2553 for num in $(seq $OSTCOUNT); do
2554 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS ||
2555 error "ost$num failed to start"
2558 wait $catpid || error "cat failed"
2560 cmp /etc/hosts $DIR/$tdir/f0 || error "cmp failed"
2561 [[ $($LFS getstripe -c $DIR/$tdir/f0) == 2 ]] ||
2562 error "wrong stripecount"
2565 run_test 27F "Client resend delayed layout creation with non-zero size"
2567 test_27G() { #LU-10629
2568 [ $MDS1_VERSION -lt $(version_code 2.11.51) ] &&
2569 skip "Need MDS version at least 2.11.51"
2570 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2571 remote_mds_nodsh && skip "remote MDS with nodsh"
2572 local POOL=${POOL:-testpool}
2573 local ostrange="0 0 1"
2575 test_mkdir $DIR/$tdir
2576 pool_add $POOL || error "pool_add failed"
2577 pool_add_targets $POOL $ostrange || error "pool_add_targets failed"
2578 $LFS setstripe -p $POOL $DIR/$tdir
2580 local pool=$($LFS getstripe -p $DIR/$tdir)
2582 [ "$pool" = "$POOL" ] || error "Striping failed got '$pool' not '$POOL'"
2584 $LFS setstripe -d $DIR/$tdir
2586 pool=$($LFS getstripe -p $DIR/$tdir)
2590 [ -z "$pool" ] || error "'$pool' is not empty"
2592 run_test 27G "Clear OST pool from stripe"
2595 [[ $MDS1_VERSION -le $(version_code 2.11.54) ]] &&
2596 skip "Need MDS version newer than 2.11.54"
2597 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
2598 test_mkdir $DIR/$tdir
2599 $LFS setstripe -o 0 -o 2 $DIR/$tdir || error "setstripe failed"
2600 touch $DIR/$tdir/$tfile
2601 $LFS getstripe -c $DIR/$tdir/$tfile
2602 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
2603 error "two-stripe file doesn't have two stripes"
2605 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
2606 $LFS getstripe -y $DIR/$tdir/$tfile
2607 (( $($LFS getstripe -y $DIR/$tdir/$tfile |
2608 egrep -c "l_ost_idx: [02]$") == "2" )) ||
2609 error "expected l_ost_idx: [02]$ not matched"
2611 # make sure ost list has been cleared
2612 local stripesize=$($LFS getstripe -S $DIR/$tdir)
2613 $LFS setstripe -S $((stripesize * 4)) -i 1 \
2614 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
2616 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
2618 run_test 27H "Set specific OSTs stripe"
2621 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2622 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2623 local pool=$TESTNAME
2624 local ostrange="1 1 1"
2626 save_layout_restore_at_exit $MOUNT
2627 $LFS setstripe -c 2 -i 0 $MOUNT
2628 pool_add $pool || error "pool_add failed"
2629 pool_add_targets $pool $ostrange || "pool_add_targets failed"
2630 test_mkdir $DIR/$tdir
2631 $LFS setstripe -p $pool $DIR/$tdir
2632 $MULTIOP $DIR/$tdir/$tfile Oc || error "multiop failed"
2633 $LFS getstripe $DIR/$tdir/$tfile
2635 run_test 27I "check that root dir striping does not break parent dir one"
2638 [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.51) ]] &&
2639 skip "Need MDS version newer than 2.12.51"
2641 test_mkdir $DIR/$tdir
2642 local uuid1=$(cat /proc/sys/kernel/random/uuid)
2643 local uuid2=$(cat /proc/sys/kernel/random/uuid)
2645 # create foreign file (raw way)
2646 create_foreign_file -f $DIR/$tdir/$tfile -x "${uuid1}@${uuid2}" \
2647 -t 1 -F 0xda08 || error "create_foreign_file failed"
2649 # verify foreign file (raw way)
2650 parse_foreign_file -f $DIR/$tdir/$tfile |
2651 grep "lov_foreign_magic: 0x0BD70BD0" ||
2652 error "$DIR/$tdir/$tfile: invalid LOV EA foreign magic"
2653 parse_foreign_file -f $DIR/$tdir/$tfile | grep "lov_xattr_size: 89" ||
2654 error "$DIR/$tdir/$tfile: invalid LOV EA foreign size"
2655 parse_foreign_file -f $DIR/$tdir/$tfile |
2656 grep "lov_foreign_size: 73" ||
2657 error "$DIR/$tdir/$tfile: invalid LOV EA foreign size"
2658 parse_foreign_file -f $DIR/$tdir/$tfile |
2659 grep "lov_foreign_type: 1" ||
2660 error "$DIR/$tdir/$tfile: invalid LOV EA foreign type"
2661 parse_foreign_file -f $DIR/$tdir/$tfile |
2662 grep "lov_foreign_flags: 0x0000DA08" ||
2663 error "$DIR/$tdir/$tfile: invalid LOV EA foreign flags"
2664 local lov=$(parse_foreign_file -f $DIR/$tdir/$tfile |
2665 grep "lov_foreign_value: 0x" |
2666 sed -e 's/lov_foreign_value: 0x//')
2667 local lov2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160)
2668 [[ $lov = ${lov2// /} ]] ||
2669 error "$DIR/$tdir/$tfile: invalid LOV EA foreign value"
2671 # create foreign file (lfs + API)
2672 $LFS setstripe --foreign=daos --flags 0xda08 \
2673 -x "${uuid1}@${uuid2}" $DIR/$tdir/${tfile}2 ||
2674 error "$DIR/$tdir/${tfile}2: create failed"
2676 $LFS getstripe -v $DIR/$tdir/${tfile}2 |
2677 grep "lfm_magic:.*0x0BD70BD0" ||
2678 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign magic"
2679 # lfm_length is LOV EA size - sizeof(lfm_magic) - sizeof(lfm_length)
2680 $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_length:.*73" ||
2681 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign size"
2682 $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_type:.*daos" ||
2683 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign type"
2684 $LFS getstripe -v $DIR/$tdir/${tfile}2 |
2685 grep "lfm_flags:.*0x0000DA08" ||
2686 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign flags"
2687 $LFS getstripe $DIR/$tdir/${tfile}2 |
2688 grep "lfm_value:.*${uuid1}@${uuid2}" ||
2689 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign value"
2691 # modify striping should fail
2692 $LFS setstripe -c 2 $DIR/$tdir/$tfile &&
2693 error "$DIR/$tdir/$tfile: setstripe should fail"
2694 $LFS setstripe -c 2 $DIR/$tdir/${tfile}2 &&
2695 error "$DIR/$tdir/${tfile}2: setstripe should fail"
2698 cat $DIR/$tdir/$tfile && error "$DIR/$tdir/$tfile: read should fail"
2699 cat $DIR/$tdir/${tfile}2 &&
2700 error "$DIR/$tdir/${tfile}2: read should fail"
2701 cat /etc/passwd > $DIR/$tdir/$tfile &&
2702 error "$DIR/$tdir/$tfile: write should fail"
2703 cat /etc/passwd > $DIR/$tdir/${tfile}2 &&
2704 error "$DIR/$tdir/${tfile}2: write should fail"
2707 chmod 222 $DIR/$tdir/$tfile ||
2708 error "$DIR/$tdir/$tfile: chmod failed"
2709 chmod 222 $DIR/$tdir/${tfile}2 ||
2710 error "$DIR/$tdir/${tfile}2: chmod failed"
2713 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tfile ||
2714 error "$DIR/$tdir/$tfile: chown failed"
2715 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tfile}2 ||
2716 error "$DIR/$tdir/${tfile}2: chown failed"
2718 # rename should work
2719 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}.new ||
2720 error "$DIR/$tdir/$tfile: rename of foreign file has failed"
2721 mv $DIR/$tdir/${tfile}2 $DIR/$tdir/${tfile}2.new ||
2722 error "$DIR/$tdir/${tfile}2: rename of foreign file has failed"
2724 #remove foreign file
2725 rm $DIR/$tdir/${tfile}.new ||
2726 error "$DIR/$tdir/${tfile}.new: remove of foreign file has failed"
2727 rm $DIR/$tdir/${tfile}2.new ||
2728 error "$DIR/$tdir/${tfile}2.new: remove of foreign file has failed"
2730 run_test 27J "basic ops on file with foreign LOV"
2733 [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.49) ]] &&
2734 skip "Need MDS version newer than 2.12.49"
2736 test_mkdir $DIR/$tdir
2737 local uuid1=$(cat /proc/sys/kernel/random/uuid)
2738 local uuid2=$(cat /proc/sys/kernel/random/uuid)
2740 # create foreign dir (raw way)
2741 create_foreign_dir -d $DIR/$tdir/$tdir -x "${uuid1}@${uuid2}" -t 1 ||
2742 error "create_foreign_dir FAILED"
2744 # verify foreign dir (raw way)
2745 parse_foreign_dir -d $DIR/$tdir/$tdir |
2746 grep "lmv_foreign_magic:.*0xcd50cd0" ||
2747 error "$DIR/$tdir/$tfile: invalid LMV EA magic"
2748 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_xattr_size:.*89$" ||
2749 error "$DIR/$tdir/$tdir: invalid LMV EA size"
2750 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_type: 1$" ||
2751 error "$DIR/$tdir/$tdir: invalid LMV EA type"
2752 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_flags: 0$" ||
2753 error "$DIR/$tdir/$tdir: invalid LMV EA flags"
2754 local lmv=$(parse_foreign_dir -d $DIR/$tdir/$tdir |
2755 grep "lmv_foreign_value: 0x" |
2756 sed 's/lmv_foreign_value: 0x//')
2757 local lmv2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160 |
2759 [[ $lmv == $lmv2 ]] || error "$DIR/$tdir/$tdir: invalid LMV EA value"
2761 # create foreign dir (lfs + API)
2762 $LFS mkdir --foreign=daos --xattr="${uuid1}@${uuid2}" --flags=0xda05 \
2763 $DIR/$tdir/${tdir}2 ||
2764 error "$DIR/$tdir/${tdir}2: create failed"
2766 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
2767 grep "lfm_magic:.*0x0CD50CD0" ||
2768 error "$DIR/$tdir/${tdir}2: invalid LMV EA magic"
2769 # lfm_length is LMV EA size - sizeof(lfm_magic) - sizeof(lfm_length)
2770 # - sizeof(lfm_type) - sizeof(lfm_flags)
2771 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_length:.*73" ||
2772 error "$DIR/$tdir/${tdir}2: invalid LMV EA size"
2773 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_type:.*daos" ||
2774 error "$DIR/$tdir/${tdir}2: invalid LMV EA type"
2775 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
2776 grep "lfm_flags:.*0x0000DA05" ||
2777 error "$DIR/$tdir/${tdir}2: invalid LMV EA flags"
2778 $LFS getdirstripe $DIR/$tdir/${tdir}2 |
2779 grep "lfm_value.*${uuid1}@${uuid2}" ||
2780 error "$DIR/$tdir/${tdir}2: invalid LMV EA value"
2782 # file create in dir should fail
2783 touch $DIR/$tdir/$tdir/$tfile && "$DIR/$tdir: file create should fail"
2784 touch $DIR/$tdir/${tdir}2/$tfile &&
2785 "$DIR/${tdir}2: file create should fail"
2788 chmod 777 $DIR/$tdir/$tdir ||
2789 error "$DIR/$tdir: chmod failed"
2790 chmod 777 $DIR/$tdir/${tdir}2 ||
2791 error "$DIR/${tdir}2: chmod failed"
2794 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tdir ||
2795 error "$DIR/$tdir: chown failed"
2796 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tdir}2 ||
2797 error "$DIR/${tdir}2: chown failed"
2799 # rename should work
2800 mv $DIR/$tdir/$tdir $DIR/$tdir/${tdir}.new ||
2801 error "$DIR/$tdir/$tdir: rename of foreign dir has failed"
2802 mv $DIR/$tdir/${tdir}2 $DIR/$tdir/${tdir}2.new ||
2803 error "$DIR/$tdir/${tdir}2: rename of foreign dir has failed"
2806 rmdir $DIR/$tdir/${tdir}.new ||
2807 error "$DIR/$tdir/${tdir}.new: remove of foreign dir has failed"
2808 rmdir $DIR/$tdir/${tdir}2.new ||
2809 error "$DIR/$tdir/${tdir}2.new: remove of foreign dir has failed"
2811 run_test 27K "basic ops on dir with foreign LMV"
2814 remote_mds_nodsh && skip "remote MDS with nodsh"
2816 local POOL=${POOL:-$TESTNAME}
2818 if ! combined_mgs_mds ; then
2820 trap umount_mgs_client EXIT
2823 pool_add $POOL || error "pool_add failed"
2825 lfs pool_list $MOUNT | grep -Fx "${FSNAME}.${POOL}" ||
2826 error "pool_list does not contain ${FSNAME}.${POOL}:" \
2827 "$(lfs pool_list $MOUNT | grep -F "${POOL}")"
2829 run_test 27L "lfs pool_list gives correct pool name"
2831 # createtest also checks that device nodes are created and
2832 # then visible correctly (#2091)
2833 test_28() { # bug 2091
2835 $CREATETEST $DIR/d28/ct || error "createtest failed"
2837 run_test 28 "create/mknod/mkdir with bad file types ============"
2840 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2842 sync; sleep 1; sync # flush out any dirty pages from previous tests
2849 declare -i LOCKCOUNTORIG=0
2850 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2851 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
2853 [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
2855 declare -i LOCKUNUSEDCOUNTORIG=0
2856 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2857 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
2864 declare -i LOCKCOUNTCURRENT=0
2865 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2866 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
2869 declare -i LOCKUNUSEDCOUNTCURRENT=0
2870 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2871 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
2874 if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
2875 $LCTL set_param -n ldlm.dump_namespaces ""
2876 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
2877 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2878 log "dumped log to $TMP/test_29.dk (bug 5793)"
2881 if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
2882 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
2883 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2884 log "dumped log to $TMP/test_29.dk (bug 5793)"
2888 run_test 29 "IT_GETATTR regression ============================"
2890 test_30a() { # was test_30
2891 cp $(which ls) $DIR || cp /bin/ls $DIR
2892 $DIR/ls / || error "Can't execute binary from lustre"
2895 run_test 30a "execute binary from Lustre (execve) =============="
2898 cp `which ls` $DIR || cp /bin/ls $DIR
2900 $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
2903 run_test 30b "execute binary from Lustre as non-root ==========="
2905 test_30c() { # b=22376
2906 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2908 cp `which ls` $DIR || cp /bin/ls $DIR
2910 cancel_lru_locks mdc
2911 cancel_lru_locks osc
2912 $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
2915 run_test 30c "execute binary from Lustre without read perms ===="
2918 $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
2919 $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
2921 run_test 31a "open-unlink file =================================="
2924 touch $DIR/f31 || error "touch $DIR/f31 failed"
2925 ln $DIR/f31 $DIR/f31b || error "ln failed"
2926 $MULTIOP $DIR/f31b Ouc || error "multiop failed"
2927 $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
2929 run_test 31b "unlink file with multiple links while open ======="
2932 touch $DIR/f31 || error "touch $DIR/f31 failed"
2933 ln $DIR/f31 $DIR/f31c || error "ln failed"
2934 multiop_bg_pause $DIR/f31 O_uc ||
2935 error "multiop_bg_pause for $DIR/f31 failed"
2937 $MULTIOP $DIR/f31c Ouc
2938 kill -USR1 $MULTIPID
2941 run_test 31c "open-unlink file with multiple links ============="
2944 opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
2945 $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
2947 run_test 31d "remove of open directory ========================="
2949 test_31e() { # bug 2904
2950 openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
2952 run_test 31e "remove of open non-empty directory ==============="
2954 test_31f() { # bug 4554
2955 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2958 test_mkdir $DIR/d31f
2959 $LFS setstripe -S 1048576 -c 1 $DIR/d31f
2960 cp /etc/hosts $DIR/d31f
2962 $LFS getstripe $DIR/d31f/hosts
2963 multiop_bg_pause $DIR/d31f D_c || return 1
2966 rm -rv $DIR/d31f || error "first of $DIR/d31f"
2967 test_mkdir $DIR/d31f
2968 $LFS setstripe -S 1048576 -c 1 $DIR/d31f
2969 cp /etc/hosts $DIR/d31f
2971 $LFS getstripe $DIR/d31f/hosts
2972 multiop_bg_pause $DIR/d31f D_c || return 1
2975 kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
2976 wait $MULTIPID || error "first opendir $MULTIPID failed"
2980 kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
2981 wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
2984 run_test 31f "remove of open directory with open-unlink file ==="
2987 echo "-- cross directory link --"
2988 test_mkdir -c1 $DIR/${tdir}ga
2989 test_mkdir -c1 $DIR/${tdir}gb
2990 touch $DIR/${tdir}ga/f
2991 ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
2992 $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
2993 [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
2994 $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
2995 [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
2997 run_test 31g "cross directory link==============="
3000 echo "-- cross directory link --"
3001 test_mkdir -c1 $DIR/${tdir}
3002 test_mkdir -c1 $DIR/${tdir}/dir
3003 touch $DIR/${tdir}/f
3004 ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
3005 $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
3006 [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
3007 $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
3008 [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
3010 run_test 31h "cross directory link under child==============="
3013 echo "-- cross directory link --"
3014 test_mkdir -c1 $DIR/$tdir
3015 test_mkdir -c1 $DIR/$tdir/dir
3016 touch $DIR/$tdir/dir/f
3017 ln $DIR/$tdir/dir/f $DIR/$tdir/g
3018 $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
3019 [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
3020 $CHECKSTAT -t file $DIR/$tdir/g || error "target"
3021 [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
3023 run_test 31i "cross directory link under parent==============="
3026 test_mkdir -c1 -p $DIR/$tdir
3027 test_mkdir -c1 -p $DIR/$tdir/dir1
3028 ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
3029 link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
3030 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
3031 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
3034 run_test 31j "link for directory==============="
3037 test_mkdir -c1 -p $DIR/$tdir
3039 touch $DIR/$tdir/exist
3040 mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
3041 mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
3042 mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
3043 mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
3044 mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
3045 mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
3046 mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
3049 run_test 31k "link to file: the same, non-existing, dir==============="
3055 touch $DIR/d31m2/exist
3056 mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
3057 mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
3058 mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
3059 mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
3060 mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
3061 mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
3064 run_test 31m "link to file: the same, non-existing, dir==============="
3067 touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
3068 nlink=$(stat --format=%h $DIR/$tfile)
3069 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
3071 local cmd="exec $fd<$DIR/$tfile"
3074 trap "eval $cmd" EXIT
3075 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
3076 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
3077 rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
3078 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
3079 [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
3082 run_test 31n "check link count of unlinked file"
3085 local tempfile=$(mktemp $1_XXXXXX)
3086 mlink $tempfile $1 2> /dev/null &&
3087 echo "$BASHPID: link $tempfile to $1 succeeded"
3091 test_31o() { # LU-2901
3092 test_mkdir $DIR/$tdir
3093 for LOOP in $(seq 100); do
3094 rm -f $DIR/$tdir/$tfile*
3095 for THREAD in $(seq 8); do
3096 link_one $DIR/$tdir/$tfile.$LOOP &
3099 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
3100 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
3101 error "$LINKS duplicate links to $tfile.$LOOP" &&
3105 run_test 31o "duplicate hard links with same filename"
3108 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3110 test_mkdir $DIR/$tdir
3111 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3112 $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
3114 opendirunlink $DIR/$tdir/striped_dir/test1 ||
3115 error "open unlink test1 failed"
3116 opendirunlink $DIR/$tdir/striped_dir/test2 ||
3117 error "open unlink test2 failed"
3119 $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
3120 error "test1 still exists"
3121 $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
3122 error "test2 still exists"
3124 run_test 31p "remove of open striped directory"
3126 cleanup_test32_mount() {
3129 local loopdev=$(losetup -a | grep $EXT2_DEV | sed -ne 's/:.*$//p')
3130 $UMOUNT $DIR/$tdir/ext2-mountpoint || rc=$?
3131 losetup -d $loopdev || true
3137 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3139 echo "== more mountpoints and symlinks ================="
3140 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3141 trap cleanup_test32_mount EXIT
3142 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3143 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3144 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3145 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/.. ||
3146 error "$DIR/$tdir/ext2-mountpoint/.. not dir type"
3147 cleanup_test32_mount
3149 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
3152 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3154 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3155 trap cleanup_test32_mount EXIT
3156 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3157 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3158 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3159 ls -al $DIR/$tdir/ext2-mountpoint/.. ||
3160 error "Can't list $DIR/$tdir/ext2-mountpoint/.."
3161 cleanup_test32_mount
3163 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
3166 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3168 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3169 trap cleanup_test32_mount EXIT
3170 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3171 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3172 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3173 test_mkdir -p $DIR/$tdir/d2/test_dir
3174 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
3175 error "$DIR/$tdir/ext2-mountpoint/../d2/test_dir not dir type"
3176 cleanup_test32_mount
3178 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
3181 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3183 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3184 trap cleanup_test32_mount EXIT
3185 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3186 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3187 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3188 test_mkdir -p $DIR/$tdir/d2/test_dir
3189 ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
3190 error "Can't list $DIR/$tdir/ext2-mountpoint/../d2/test_dir"
3191 cleanup_test32_mount
3193 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
3197 test_mkdir -p $DIR/$tdir/tmp
3198 local tmp_dir=$DIR/$tdir/tmp
3199 ln -s $DIR/$tdir $tmp_dir/symlink11
3200 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
3201 $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
3202 $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
3204 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
3208 test_mkdir -p $DIR/$tdir/tmp
3209 local tmp_dir=$DIR/$tdir/tmp
3210 ln -s $DIR/$tdir $tmp_dir/symlink11
3211 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
3212 ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
3213 ls $DIR/$tdir/symlink01 || error "symlink01 bad"
3215 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
3218 local tmp_dir=$DIR/$tdir/tmp
3219 test_mkdir -p $tmp_dir
3220 test_mkdir $DIR/${tdir}2
3221 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
3222 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
3223 $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
3224 $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
3225 $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
3226 $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
3228 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
3231 rm -fr $DIR/$tdir $DIR/${tdir}2
3232 tmp_dir=$DIR/$tdir/tmp
3233 test_mkdir -p $tmp_dir
3234 test_mkdir $DIR/${tdir}2
3235 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
3236 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
3237 ls $tmp_dir/symlink12 || error "listing symlink12"
3238 ls $DIR/$tdir/symlink02 || error "listing symlink02"
3240 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
3243 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3245 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3246 trap cleanup_test32_mount EXIT
3247 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3248 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3249 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3250 touch $DIR/$tdir/test_file
3251 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../test_file ||
3252 error "$DIR/$tdir/ext2-mountpoint/../test_file not file type"
3253 cleanup_test32_mount
3255 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
3258 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3260 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3261 trap cleanup_test32_mount EXIT
3262 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3263 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3264 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3265 touch $DIR/$tdir/test_file
3266 cat $DIR/$tdir/ext2-mountpoint/../test_file ||
3267 error "Can't open $DIR/$tdir/ext2-mountpoint/../test_file"
3268 cleanup_test32_mount
3270 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
3273 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3276 trap cleanup_test32_mount EXIT
3277 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3278 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3279 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3280 test_mkdir -p $DIR/$tdir/d2
3281 touch $DIR/$tdir/d2/test_file || error "touch failed"
3282 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
3283 error "$DIR/$tdir/ext2-mountpoint/../d2/test_file not file type"
3284 cleanup_test32_mount
3286 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
3289 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3292 trap cleanup_test32_mount EXIT
3293 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3294 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3295 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3296 test_mkdir -p $DIR/$tdir/d2
3297 touch $DIR/$tdir/d2/test_file || error "touch failed"
3298 cat $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
3299 error "Can't open $DIR/$tdir/ext2-mountpoint/../d2/test_file"
3300 cleanup_test32_mount
3302 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
3306 test_mkdir -p $DIR/d32m/tmp
3307 TMP_DIR=$DIR/d32m/tmp
3308 ln -s $DIR $TMP_DIR/symlink11
3309 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3310 $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 ||
3311 error "symlink11 not a link"
3312 $CHECKSTAT -t link $DIR/d32m/symlink01 ||
3313 error "symlink01 not a link"
3315 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
3319 test_mkdir -p $DIR/d32n/tmp
3320 TMP_DIR=$DIR/d32n/tmp
3321 ln -s $DIR $TMP_DIR/symlink11
3322 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3323 ls -l $DIR/d32n/tmp/symlink11 || error "listing symlink11"
3324 ls -l $DIR/d32n/symlink01 || error "listing symlink01"
3326 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
3330 test_mkdir -p $DIR/d32o/tmp
3331 TMP_DIR=$DIR/d32o/tmp
3332 ln -s $DIR/$tfile $TMP_DIR/symlink12
3333 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3334 $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 ||
3335 error "symlink12 not a link"
3336 $CHECKSTAT -t link $DIR/d32o/symlink02 || error "symlink02 not a link"
3337 $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 ||
3338 error "$DIR/d32o/tmp/symlink12 not file type"
3339 $CHECKSTAT -t file -f $DIR/d32o/symlink02 ||
3340 error "$DIR/d32o/symlink02 not file type"
3342 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
3352 test_mkdir -p $DIR/d32p/tmp
3354 TMP_DIR=$DIR/d32p/tmp
3356 ln -s $DIR/$tfile $TMP_DIR/symlink12
3358 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3360 cat $DIR/d32p/tmp/symlink12 ||
3361 error "Can't open $DIR/d32p/tmp/symlink12"
3363 cat $DIR/d32p/symlink02 || error "Can't open $DIR/d32p/symlink02"
3366 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
3369 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3371 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3372 trap cleanup_test32_mount EXIT
3373 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3374 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3375 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3376 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3377 ls $DIR/$tdir/ext2-mountpoint | grep "\<under_the_mount\>" && error
3378 cleanup_test32_mount
3380 run_test 32q "stat follows mountpoints in Lustre (should return error)"
3383 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3385 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3386 trap cleanup_test32_mount EXIT
3387 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3388 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3389 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3390 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3391 ls $DIR/$tdir/ext2-mountpoint | grep -q under_the_mount && error || true
3392 cleanup_test32_mount
3394 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
3399 chmod 444 $DIR/$tfile
3400 chown $RUNAS_ID $DIR/$tfile
3402 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3405 run_test 33aa "write file with mode 444 (should return error)"
3409 test_mkdir $DIR/$tdir
3410 chown $RUNAS_ID $DIR/$tdir
3411 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
3412 error "$RUNAS create $tdir/$tfile failed"
3413 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
3414 error "open RDWR" || true
3416 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
3420 test_mkdir $DIR/$tdir
3421 chown $RUNAS_ID $DIR/$tdir
3422 $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
3424 run_test 33b "test open file with malformed flags (No panic)"
3427 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3428 remote_ost_nodsh && skip "remote OST with nodsh"
3437 test_mkdir $DIR/$tdir
3438 # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
3441 for ostnum in $(seq $OSTCOUNT); do
3442 # test-framework's OST numbering is one-based, while Lustre's
3444 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3445 # Parsing llobdstat's output sucks; we could grep the /proc
3446 # path, but that's likely to not be as portable as using the
3447 # llobdstat utility. So we parse lctl output instead.
3448 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3449 obdfilter/$ostname/stats |
3450 awk '/^write_bytes/ {print $7}' )
3451 echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes"
3452 if (( ${write_bytes:-0} > 0 ))
3459 $all_zeros || return 0
3462 echo foo > $DIR/$tdir/bar
3466 # Total up write_bytes after writing. We'd better find non-zeros.
3467 for ostnum in $(seq $OSTCOUNT); do
3468 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3469 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3470 obdfilter/$ostname/stats |
3471 awk '/^write_bytes/ {print $7}' )
3472 echo "write_bytes@$OSTnum/$ostname=$write_bytes"
3473 if (( ${write_bytes:-0} > 0 ))
3482 for ostnum in $(seq $OSTCOUNT); do
3483 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3484 echo "Check that write_bytes is present in obdfilter/*/stats:"
3485 do_facet ost$ostnum lctl get_param -n \
3486 obdfilter/$ostname/stats
3488 error "OST not keeping write_bytes stats (b22312)"
3491 run_test 33c "test llobdstat and write_bytes"
3494 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3495 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3498 local remote_dir=$DIR/$tdir/remote_dir
3500 test_mkdir $DIR/$tdir
3501 $LFS mkdir -i $MDTIDX $remote_dir ||
3502 error "create remote directory failed"
3504 touch $remote_dir/$tfile
3505 chmod 444 $remote_dir/$tfile
3506 chown $RUNAS_ID $remote_dir/$tfile
3508 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3510 chown $RUNAS_ID $remote_dir
3511 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
3512 error "create" || true
3513 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
3514 error "open RDWR" || true
3515 $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
3517 run_test 33d "openfile with 444 modes and malformed flags under remote dir"
3520 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3524 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3525 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3526 mkdir $DIR/$tdir/local_dir
3528 local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3529 local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3530 local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3532 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3533 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
3535 rmdir $DIR/$tdir/* || error "rmdir failed"
3538 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3539 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3540 mkdir $DIR/$tdir/local_dir
3542 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3543 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3544 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3546 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3547 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
3549 rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
3552 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3553 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3554 mkdir $DIR/$tdir/local_dir
3556 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3557 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3558 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3560 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3561 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
3563 run_test 33e "mkdir and striped directory should have same mode"
3567 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
3571 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3572 remote_mds_nodsh && skip "remote MDS with nodsh"
3575 chmod go+rwx $DIR/$tdir
3576 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
3577 trap cleanup_33f EXIT
3579 $RUNAS lfs mkdir -i 0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
3580 error "cannot create striped directory"
3582 $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
3583 error "cannot create files in striped directory"
3585 $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
3586 error "cannot remove files in striped directory"
3588 $RUNAS rmdir $DIR/$tdir/striped_dir ||
3589 error "cannot remove striped directory"
3593 run_test 33f "nonroot user can create, access, and remove a striped directory"
3596 mkdir -p $DIR/$tdir/dir2
3598 local err=$($RUNAS mkdir $DIR/$tdir/dir2 2>&1)
3600 [[ $err =~ "exists" ]] || error "Not exists error"
3602 run_test 33g "nonroot user create already existing root created file"
3604 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
3607 $MCREATE $DIR/f34 || error "mcreate failed"
3608 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" ||
3609 error "getstripe failed"
3610 $TRUNCATE $DIR/f34 $TEST_34_SIZE || error "truncate failed"
3611 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" ||
3612 error "getstripe failed"
3613 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3614 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3616 run_test 34a "truncate file that has not been opened ==========="
3619 [ ! -f $DIR/f34 ] && test_34a
3620 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3621 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3622 $OPENFILE -f O_RDONLY $DIR/f34
3623 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" ||
3624 error "getstripe failed"
3625 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3626 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3628 run_test 34b "O_RDONLY opening file doesn't create objects ====="
3631 [ ! -f $DIR/f34 ] && test_34a
3632 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3633 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3634 $OPENFILE -f O_RDWR $DIR/f34
3635 $LFS getstripe $DIR/f34 2>&1 | grep -q "no stripe info" &&
3636 error "$LFS getstripe failed"
3637 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3638 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3640 run_test 34c "O_RDWR opening file-with-size works =============="
3643 [ ! -f $DIR/f34 ] && test_34a
3644 dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 ||
3646 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3647 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3650 run_test 34d "write to sparse file ============================="
3654 $MCREATE $DIR/f34e || error "mcreate failed"
3655 $TRUNCATE $DIR/f34e 1000 || error "truncate failed"
3656 $CHECKSTAT -s 1000 $DIR/f34e ||
3657 error "Size of $DIR/f34e not equal to 1000 bytes"
3658 $OPENFILE -f O_RDWR $DIR/f34e
3659 $CHECKSTAT -s 1000 $DIR/f34e ||
3660 error "Size of $DIR/f34e not equal to 1000 bytes"
3662 run_test 34e "create objects, some with size and some without =="
3664 test_34f() { # bug 6242, 6243
3665 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3669 $MCREATE $DIR/f34f || error "mcreate failed"
3670 $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
3671 dd if=$DIR/f34f of=$TMP/f34f
3672 $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
3673 dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
3674 cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
3675 cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
3676 rm $TMP/f34f $TMP/f34fzero $DIR/f34f
3678 run_test 34f "read from a file with no objects until EOF ======="
3681 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3683 dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE ||
3685 $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error "truncate failed"
3686 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3687 error "Size of $DIR/$tfile not equal to $((TEST_34_SIZE / 2))"
3688 cancel_lru_locks osc
3689 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3690 error "wrong size after lock cancel"
3692 $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error "truncate failed"
3693 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3694 error "expanding truncate failed"
3695 cancel_lru_locks osc
3696 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3697 error "wrong expanded size after lock cancel"
3699 run_test 34g "truncate long file ==============================="
3702 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3707 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error "dd failed"
3708 sync # Flush the cache so that multiop below does not block on cache
3709 # flush when getting the group lock
3710 $MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
3713 # Since just timed wait is not good enough, let's do a sync write
3714 # that way we are sure enough time for a roundtrip + processing
3715 # passed + 2 seconds of extra margin.
3716 dd if=/dev/zero of=$DIR/${tfile}-1 bs=$PAGE_SIZE oflag=direct count=1
3720 if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then
3721 error "Multiop blocked on ftruncate, pid=$MULTIPID"
3725 local nsz=`stat -c %s $DIR/$tfile`
3726 [[ $nsz == $sz ]] || error "New size wrong $nsz != $sz"
3728 run_test 34h "ftruncate file under grouplock should not block"
3731 cp /bin/sh $DIR/f35a
3733 chown $RUNAS_ID $DIR/f35a
3734 $RUNAS $DIR/f35a && error || true
3737 run_test 35a "exec file with mode 444 (should return and not leak)"
3741 utime $DIR/f36 || error "utime failed for MDS"
3743 run_test 36a "MDS utime check (mknod, utime)"
3747 utime $DIR/f36 || error "utime failed for OST"
3749 run_test 36b "OST utime check (open, utime)"
3754 chown $RUNAS_ID $DIR/d36
3755 $RUNAS utime $DIR/d36/f36 || error "utime failed for MDS as non-root"
3757 run_test 36c "non-root MDS utime check (mknod, utime)"
3760 [ ! -d $DIR/d36 ] && test_36c
3761 echo "" > $DIR/d36/f36
3762 $RUNAS utime $DIR/d36/f36 || error "utime failed for OST as non-root"
3764 run_test 36d "non-root OST utime check (open, utime)"
3767 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping"
3769 test_mkdir $DIR/$tdir
3770 touch $DIR/$tdir/$tfile
3771 $RUNAS utime $DIR/$tdir/$tfile &&
3772 error "utime worked, expected failure" || true
3774 run_test 36e "utime on non-owned file (should return error)"
3778 local LANG_SAVE=$LANG
3779 local LC_LANG_SAVE=$LC_LANG
3780 export LANG=C LC_LANG=C # for date language
3782 DATESTR="Dec 20 2000"
3783 test_mkdir $DIR/$tdir
3784 lctl set_param fail_loc=$fl
3786 cp /etc/hosts $DIR/$tdir/$tfile
3787 sync & # write RPC generated with "current" inode timestamp, but delayed
3789 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
3790 LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
3791 cancel_lru_locks $OSC
3792 LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object
3794 [ "$LS_BEFORE" != "$LS_AFTER" ] && \
3795 echo "BEFORE: $LS_BEFORE" && \
3796 echo "AFTER : $LS_AFTER" && \
3797 echo "WANT : $DATESTR" && \
3798 error "$DIR/$tdir/$tfile timestamps changed" || true
3800 export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE
3804 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3806 #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
3807 subr_36fh "0x80000214"
3809 run_test 36f "utime on file racing with OST BRW write =========="
3812 remote_ost_nodsh && skip "remote OST with nodsh"
3813 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3814 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
3815 skip "Need MDS version at least 2.12.51"
3820 local tgt="obdfilter"
3822 [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1"
3824 test_mkdir $DIR/$tdir
3825 fmd_max_age=$(do_facet $facet \
3826 "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \
3829 echo "FMD max age: ${fmd_max_age}s"
3830 touch $DIR/$tdir/$tfile
3831 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3832 gawk '{cnt=cnt+$1} END{print cnt}')
3833 echo "FMD before: $fmd"
3835 error "FMD wasn't create by touch"
3836 sleep $((fmd_max_age + 12))
3837 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3838 gawk '{cnt=cnt+$1} END{print cnt}')
3839 echo "FMD after: $fmd"
3841 error "FMD wasn't expired by ping"
3843 run_test 36g "FMD cache expiry ====================="
3846 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3848 #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227
3849 subr_36fh "0x80000227"
3851 run_test 36h "utime on file racing with OST BRW write =========="
3854 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3856 test_mkdir $DIR/$tdir
3857 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
3859 local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
3860 local new_mtime=$((mtime + 200))
3862 #change Modify time of striped dir
3863 touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
3864 error "change mtime failed"
3866 local got=$(stat -c%Y $DIR/$tdir/striped_dir)
3868 [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
3870 run_test 36i "change mtime on striped directory"
3872 # test_37 - duplicate with tests 32q 32r
3875 local file=$DIR/$tfile
3877 openfile -f O_DIRECTORY $file
3880 [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true
3881 [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)"
3883 run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ==="
3885 test_39a() { # was test_39
3887 touch $DIR/${tfile}2
3888 # ls -l $DIR/$tfile $DIR/${tfile}2
3889 # ls -lu $DIR/$tfile $DIR/${tfile}2
3890 # ls -lc $DIR/$tfile $DIR/${tfile}2
3892 $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
3893 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
3895 ls -l --full-time $DIR/$tfile $DIR/${tfile}2
3897 ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
3899 ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
3900 error "O_TRUNC didn't change timestamps"
3903 run_test 39a "mtime changed on create"
3906 test_mkdir -c1 $DIR/$tdir
3907 cp -p /etc/passwd $DIR/$tdir/fopen
3908 cp -p /etc/passwd $DIR/$tdir/flink
3909 cp -p /etc/passwd $DIR/$tdir/funlink
3910 cp -p /etc/passwd $DIR/$tdir/frename
3911 ln $DIR/$tdir/funlink $DIR/$tdir/funlink2
3914 echo "aaaaaa" >> $DIR/$tdir/fopen
3915 echo "aaaaaa" >> $DIR/$tdir/flink
3916 echo "aaaaaa" >> $DIR/$tdir/funlink
3917 echo "aaaaaa" >> $DIR/$tdir/frename
3919 local open_new=`stat -c %Y $DIR/$tdir/fopen`
3920 local link_new=`stat -c %Y $DIR/$tdir/flink`
3921 local unlink_new=`stat -c %Y $DIR/$tdir/funlink`
3922 local rename_new=`stat -c %Y $DIR/$tdir/frename`
3924 cat $DIR/$tdir/fopen > /dev/null
3925 ln $DIR/$tdir/flink $DIR/$tdir/flink2
3926 rm -f $DIR/$tdir/funlink2
3927 mv -f $DIR/$tdir/frename $DIR/$tdir/frename2
3929 for (( i=0; i < 2; i++ )) ; do
3930 local open_new2=`stat -c %Y $DIR/$tdir/fopen`
3931 local link_new2=`stat -c %Y $DIR/$tdir/flink`
3932 local unlink_new2=`stat -c %Y $DIR/$tdir/funlink`
3933 local rename_new2=`stat -c %Y $DIR/$tdir/frename2`
3935 [ $open_new2 -eq $open_new ] || error "open file reverses mtime"
3936 [ $link_new2 -eq $link_new ] || error "link file reverses mtime"
3937 [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime"
3938 [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime"
3940 cancel_lru_locks $OSC
3941 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3944 run_test 39b "mtime change on open, link, unlink, rename ======"
3946 # this should be set to past
3947 TEST_39_MTIME=`date -d "1 year ago" +%s`
3953 local mtime0=`stat -c %Y $DIR1/$tfile`
3955 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3956 local mtime1=`stat -c %Y $DIR1/$tfile`
3957 [ "$mtime1" = $TEST_39_MTIME ] || \
3958 error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME"
3961 echo hello >> $DIR1/$tfile
3963 local mtime2=`stat -c %Y $DIR1/$tfile`
3964 [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \
3965 error "mtime is not updated on write: $d1 <= $mtime2 <= $d2"
3967 mv $DIR1/$tfile $DIR1/$tfile-1
3969 for (( i=0; i < 2; i++ )) ; do
3970 local mtime3=`stat -c %Y $DIR1/$tfile-1`
3971 [ "$mtime2" = "$mtime3" ] || \
3972 error "mtime ($mtime2) changed (to $mtime3) on rename"
3974 cancel_lru_locks $OSC
3975 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3978 run_test 39c "mtime change on rename ==========================="
3982 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3985 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3987 for (( i=0; i < 2; i++ )) ; do
3988 local mtime=`stat -c %Y $DIR1/$tfile`
3989 [ $mtime = $TEST_39_MTIME ] || \
3990 error "mtime($mtime) is not set to $TEST_39_MTIME"
3992 cancel_lru_locks $OSC
3993 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3996 run_test 39d "create, utime, stat =============================="
4000 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4003 local mtime1=`stat -c %Y $DIR1/$tfile`
4005 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4007 for (( i=0; i < 2; i++ )) ; do
4008 local mtime2=`stat -c %Y $DIR1/$tfile`
4009 [ $mtime2 = $TEST_39_MTIME ] || \
4010 error "mtime($mtime2) is not set to $TEST_39_MTIME"
4012 cancel_lru_locks $OSC
4013 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4016 run_test 39e "create, stat, utime, stat ========================"
4020 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4023 mtime1=`stat -c %Y $DIR1/$tfile`
4026 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4028 for (( i=0; i < 2; i++ )) ; do
4029 local mtime2=`stat -c %Y $DIR1/$tfile`
4030 [ $mtime2 = $TEST_39_MTIME ] || \
4031 error "mtime($mtime2) is not set to $TEST_39_MTIME"
4033 cancel_lru_locks $OSC
4034 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4037 run_test 39f "create, stat, sleep, utime, stat ================="
4041 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4043 echo hello >> $DIR1/$tfile
4044 local mtime1=`stat -c %Y $DIR1/$tfile`
4047 chmod o+r $DIR1/$tfile
4049 for (( i=0; i < 2; i++ )) ; do
4050 local mtime2=`stat -c %Y $DIR1/$tfile`
4051 [ "$mtime1" = "$mtime2" ] || \
4052 error "lost mtime: $mtime2, should be $mtime1"
4054 cancel_lru_locks $OSC
4055 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4058 run_test 39g "write, chmod, stat ==============================="
4062 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4068 echo hello >> $DIR1/$tfile
4069 local mtime1=`stat -c %Y $DIR1/$tfile`
4071 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4073 if [ "$d1" != "$d2" ]; then
4074 echo "write and touch not within one second"
4076 for (( i=0; i < 2; i++ )) ; do
4077 local mtime2=`stat -c %Y $DIR1/$tfile`
4078 [ "$mtime2" = $TEST_39_MTIME ] || \
4079 error "lost mtime: $mtime2, should be $TEST_39_MTIME"
4081 cancel_lru_locks $OSC
4082 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4086 run_test 39h "write, utime within one second, stat ============="
4089 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4094 echo hello >> $DIR1/$tfile
4095 local mtime1=`stat -c %Y $DIR1/$tfile`
4097 mv $DIR1/$tfile $DIR1/$tfile-1
4099 for (( i=0; i < 2; i++ )) ; do
4100 local mtime2=`stat -c %Y $DIR1/$tfile-1`
4102 [ "$mtime1" = "$mtime2" ] || \
4103 error "lost mtime: $mtime2, should be $mtime1"
4105 cancel_lru_locks $OSC
4106 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4109 run_test 39i "write, rename, stat =============================="
4112 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4114 start_full_debug_logging
4118 #define OBD_FAIL_OSC_DELAY_SETTIME 0x412
4119 lctl set_param fail_loc=0x80000412
4120 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c ||
4121 error "multiop failed"
4123 local mtime1=`stat -c %Y $DIR1/$tfile`
4125 mv $DIR1/$tfile $DIR1/$tfile-1
4127 kill -USR1 $multipid
4128 wait $multipid || error "multiop close failed"
4130 for (( i=0; i < 2; i++ )) ; do
4131 local mtime2=`stat -c %Y $DIR1/$tfile-1`
4132 [ "$mtime1" = "$mtime2" ] ||
4133 error "mtime is lost on close: $mtime2, " \
4136 cancel_lru_locks $OSC
4137 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4139 lctl set_param fail_loc=0
4140 stop_full_debug_logging
4142 run_test 39j "write, rename, close, stat ======================="
4145 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4150 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed"
4152 local mtime1=`stat -c %Y $DIR1/$tfile`
4154 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
4156 kill -USR1 $multipid
4157 wait $multipid || error "multiop close failed"
4159 for (( i=0; i < 2; i++ )) ; do
4160 local mtime2=`stat -c %Y $DIR1/$tfile`
4162 [ "$mtime2" = $TEST_39_MTIME ] || \
4163 error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
4165 cancel_lru_locks osc
4166 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4169 run_test 39k "write, utime, close, stat ========================"
4171 # this should be set to future
4172 TEST_39_ATIME=`date -d "1 year" +%s`
4175 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4176 remote_mds_nodsh && skip "remote MDS with nodsh"
4178 local atime_diff=$(do_facet $SINGLEMDS \
4179 lctl get_param -n mdd.*MDT0000*.atime_diff)
4183 # test setting directory atime to future
4184 touch -a -d @$TEST_39_ATIME $DIR/$tdir
4185 local atime=$(stat -c %X $DIR/$tdir)
4186 [ "$atime" = $TEST_39_ATIME ] ||
4187 error "atime is not set to future: $atime, $TEST_39_ATIME"
4189 # test setting directory atime from future to now
4190 local now=$(date +%s)
4191 touch -a -d @$now $DIR/$tdir
4193 atime=$(stat -c %X $DIR/$tdir)
4194 [ "$atime" -eq "$now" ] ||
4195 error "atime is not updated from future: $atime, $now"
4197 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=2
4200 # test setting directory atime when now > dir atime + atime_diff
4201 local d1=$(date +%s)
4203 local d2=$(date +%s)
4204 cancel_lru_locks mdc
4205 atime=$(stat -c %X $DIR/$tdir)
4206 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
4207 error "atime is not updated : $atime, should be $d2"
4209 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=60
4212 # test not setting directory atime when now < dir atime + atime_diff
4214 cancel_lru_locks mdc
4215 atime=$(stat -c %X $DIR/$tdir)
4216 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
4217 error "atime is updated to $atime, should remain $d1<atime<$d2"
4219 do_facet $SINGLEMDS \
4220 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
4222 run_test 39l "directory atime update ==========================="
4225 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4229 local far_past_mtime=$(date -d "May 29 1953" +%s)
4230 local far_past_atime=$(date -d "Dec 17 1903" +%s)
4232 touch -m -d @$far_past_mtime $DIR1/$tfile
4233 touch -a -d @$far_past_atime $DIR1/$tfile
4235 for (( i=0; i < 2; i++ )) ; do
4236 local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
4237 [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
4238 error "atime or mtime set incorrectly"
4240 cancel_lru_locks $OSC
4241 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
4244 run_test 39m "test atime and mtime before 1970"
4246 test_39n() { # LU-3832
4247 remote_mds_nodsh && skip "remote MDS with nodsh"
4249 local atime_diff=$(do_facet $SINGLEMDS \
4250 lctl get_param -n mdd.*MDT0000*.atime_diff)
4255 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
4258 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
4259 atime0=$(stat -c %X $DIR/$tfile)
4262 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
4263 atime1=$(stat -c %X $DIR/$tfile)
4266 cancel_lru_locks mdc
4267 cancel_lru_locks osc
4268 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
4269 atime2=$(stat -c %X $DIR/$tfile)
4271 do_facet $SINGLEMDS \
4272 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
4274 [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
4275 [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
4277 run_test 39n "check that O_NOATIME is honored"
4280 TESTDIR=$DIR/$tdir/$tfile
4281 [ -e $TESTDIR ] && rm -rf $TESTDIR
4288 links2=$(stat -c %h .)
4289 [ $(($links1 + 2)) != $links2 ] &&
4290 error "wrong links count $(($links1 + 2)) != $links2"
4292 links3=$(stat -c %h .)
4293 [ $(($links1 + 1)) != $links3 ] &&
4294 error "wrong links count $links1 != $links3"
4297 run_test 39o "directory cached attributes updated after create"
4300 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
4303 TESTDIR=$DIR/$tdir/$tdir
4304 [ -e $TESTDIR ] && rm -rf $TESTDIR
4305 test_mkdir -p $TESTDIR
4309 test_mkdir -i $MDTIDX $TESTDIR/remote_dir1
4310 test_mkdir -i $MDTIDX $TESTDIR/remote_dir2
4312 links2=$(stat -c %h .)
4313 [ $(($links1 + 2)) != $links2 ] &&
4314 error "wrong links count $(($links1 + 2)) != $links2"
4316 links3=$(stat -c %h .)
4317 [ $(($links1 + 1)) != $links3 ] &&
4318 error "wrong links count $links1 != $links3"
4321 run_test 39p "remote directory cached attributes updated after create ========"
4324 test_39q() { # LU-8041
4325 local testdir=$DIR/$tdir
4327 multiop_bg_pause $testdir D_c || error "multiop failed"
4329 cancel_lru_locks mdc
4330 kill -USR1 $multipid
4331 local atime=$(stat -c %X $testdir)
4332 [ "$atime" -ne 0 ] || error "atime is zero"
4334 run_test 39q "close won't zero out atime"
4337 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
4338 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
4339 error "openfile O_WRONLY:O_TRUNC $tfile failed"
4340 $CHECKSTAT -t file -s 4096 $DIR/$tfile ||
4341 error "$tfile is not 4096 bytes in size"
4343 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
4347 small_write $DIR/f41 18
4349 run_test 41 "test small file write + fstat ====================="
4351 count_ost_writes() {
4352 lctl get_param -n ${OSC}.*.stats |
4353 awk -vwrites=0 '/ost_write/ { writes += $2 } \
4354 END { printf("%0.0f", writes) }'
4361 BG_DIRTY_RATIO_SAVE=10
4362 MAX_BG_DIRTY_RATIO=25
4366 # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs,
4367 # dirty_ratio, dirty_background_ratio
4368 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4369 sysctl -w vm.dirty_writeback_centisecs=$WRITEBACK_SAVE
4370 sysctl -w vm.dirty_background_ratio=$BG_DIRTY_RATIO_SAVE
4371 sysctl -w vm.dirty_ratio=$DIRTY_RATIO_SAVE
4373 # if file not here, we are a 2.4 kernel
4374 kill -CONT `pidof kupdated`
4379 # setup the trap first, so someone cannot exit the test at the
4380 # exact wrong time and mess up a machine
4381 trap start_writeback EXIT
4382 # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
4383 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4384 WRITEBACK_SAVE=`sysctl -n vm.dirty_writeback_centisecs`
4385 sysctl -w vm.dirty_writeback_centisecs=0
4386 sysctl -w vm.dirty_writeback_centisecs=0
4387 # save and increase /proc/sys/vm/dirty_ratio
4388 DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_ratio`
4389 sysctl -w vm.dirty_ratio=$MAX_DIRTY_RATIO
4390 # save and increase /proc/sys/vm/dirty_background_ratio
4391 BG_DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_background_ratio`
4392 sysctl -w vm.dirty_background_ratio=$MAX_BG_DIRTY_RATIO
4394 # if file not here, we are a 2.4 kernel
4395 kill -STOP `pidof kupdated`
4399 # ensure that all stripes have some grant before we test client-side cache
4401 for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
4402 dd if=/dev/zero of=$i bs=4k count=1
4407 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
4408 # file truncation, and file removal.
4410 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4413 cancel_lru_locks $OSC
4415 sync; sleep 1; sync # just to be safe
4416 BEFOREWRITES=`count_ost_writes`
4417 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur_grant_bytes | grep "[0-9]"
4418 dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
4419 AFTERWRITES=`count_ost_writes`
4420 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
4421 error "$BEFOREWRITES < $AFTERWRITES"
4424 run_test 42a "ensure that we don't flush on close"
4427 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4430 cancel_lru_locks $OSC
4433 dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
4434 BEFOREWRITES=$(count_ost_writes)
4435 $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
4436 AFTERWRITES=$(count_ost_writes)
4437 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4438 error "$BEFOREWRITES < $AFTERWRITES on unlink"
4440 BEFOREWRITES=$(count_ost_writes)
4441 sync || error "sync: $?"
4442 AFTERWRITES=$(count_ost_writes)
4443 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4444 error "$BEFOREWRITES < $AFTERWRITES on sync"
4446 dmesg | grep 'error from obd_brw_async' && error 'error writing back'
4450 run_test 42b "test destroy of file with cached dirty data ======"
4452 # if these tests just want to test the effect of truncation,
4453 # they have to be very careful. consider:
4454 # - the first open gets a {0,EOF}PR lock
4455 # - the first write conflicts and gets a {0, count-1}PW
4456 # - the rest of the writes are under {count,EOF}PW
4457 # - the open for truncate tries to match a {0,EOF}PR
4458 # for the filesize and cancels the PWs.
4459 # any number of fixes (don't get {0,EOF} on open, match
4460 # composite locks, do smarter file size management) fix
4461 # this, but for now we want these tests to verify that
4462 # the cancellation with truncate intent works, so we
4463 # start the file with a full-file pw lock to match against
4464 # until the truncate.
4469 cancel_lru_locks $OSC
4471 # prime the file with 0,EOF PW to match
4475 # now the real test..
4476 dd if=/dev/zero of=$file bs=1024 count=100
4477 BEFOREWRITES=`count_ost_writes`
4478 $TRUNCATE $file $offset
4479 cancel_lru_locks $OSC
4480 AFTERWRITES=`count_ost_writes`
4485 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4488 [ $BEFOREWRITES -eq $AFTERWRITES ] &&
4489 error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
4492 run_test 42c "test partial truncate of file with cached dirty data"
4495 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4498 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
4499 error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
4502 run_test 42d "test complete truncate of file with cached dirty data"
4504 test_42e() { # bug22074
4505 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4507 local TDIR=$DIR/${tdir}e
4508 local pages=16 # hardcoded 16 pages, don't change it.
4509 local files=$((OSTCOUNT * 500)) # hopefully 500 files on each OST
4510 local proc_osc0="osc.${FSNAME}-OST0000-osc-[^MDT]*"
4514 test_mkdir $DIR/${tdir}e
4515 $LFS setstripe -c 1 $TDIR
4516 createmany -o $TDIR/f $files
4518 max_dirty_mb=$($LCTL get_param -n $proc_osc0/max_dirty_mb)
4520 # we assume that with $OSTCOUNT files, at least one of them will
4521 # be allocated on OST0.
4522 warmup_files=$((OSTCOUNT * max_dirty_mb))
4523 createmany -o $TDIR/w $warmup_files
4525 # write a large amount of data into one file and sync, to get good
4526 # avail_grant number from OST.
4527 for ((i=0; i<$warmup_files; i++)); do
4528 idx=$($LFS getstripe -i $TDIR/w$i)
4529 [ $idx -ne 0 ] && continue
4530 dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1
4533 [[ $i -gt $warmup_files ]] && error "OST0 is still cold"
4535 $LCTL get_param $proc_osc0/cur_dirty_bytes
4536 $LCTL get_param $proc_osc0/cur_grant_bytes
4538 # create as much dirty pages as we can while not to trigger the actual
4539 # RPCs directly. but depends on the env, VFS may trigger flush during this
4540 # period, hopefully we are good.
4541 for ((i=0; i<$warmup_files; i++)); do
4542 idx=$($LFS getstripe -i $TDIR/w$i)
4543 [ $idx -ne 0 ] && continue
4544 dd if=/dev/zero of=$TDIR/w$i bs=1M count=1 2>/dev/null
4546 $LCTL get_param $proc_osc0/cur_dirty_bytes
4547 $LCTL get_param $proc_osc0/cur_grant_bytes
4549 # perform the real test
4550 $LCTL set_param $proc_osc0/rpc_stats 0
4551 for ((;i<$files; i++)); do
4552 [ $($LFS getstripe -i $TDIR/f$i) -eq 0 ] || continue
4553 dd if=/dev/zero of=$TDIR/f$i bs=$PAGE_SIZE count=$pages 2>/dev/null
4556 $LCTL get_param $proc_osc0/rpc_stats
4559 local have_ppr=false
4560 $LCTL get_param $proc_osc0/rpc_stats |
4561 while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do
4562 # skip lines until we are at the RPC histogram data
4563 [ "$PPR" == "pages" ] && have_ppr=true && continue
4564 $have_ppr || continue
4566 # we only want the percent stat for < 16 pages
4567 [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break
4569 percent=$((percent + WPCT))
4570 if [[ $percent -gt 15 ]]; then
4571 error "less than 16-pages write RPCs" \
4578 run_test 42e "verify sub-RPC writes are not done synchronously"
4580 test_43A() { # was test_43
4581 test_mkdir $DIR/$tdir
4582 cp -p /bin/ls $DIR/$tdir/$tfile
4583 $MULTIOP $DIR/$tdir/$tfile Ow_c &
4585 # give multiop a chance to open
4588 $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true
4591 run_test 43A "execution of file opened for write should return -ETXTBSY"
4594 test_mkdir $DIR/$tdir
4595 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4596 $DIR/$tdir/sleep 60 &
4598 # Make sure exec of $tdir/sleep wins race with truncate
4600 $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success"
4603 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
4606 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4608 test_mkdir $DIR/$tdir
4609 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4610 $DIR/$tdir/sleep 60 &
4612 # Make sure exec of $tdir/sleep wins race with truncate
4614 $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success"
4617 run_test 43b "truncate of file being executed should return -ETXTBSY"
4620 local testdir="$DIR/$tdir"
4623 ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) |
4624 ( cd $testdir && md5sum -c )
4626 run_test 43c "md5sum of copy into lustre"
4628 test_44A() { # was test_44
4629 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4631 dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
4632 dd if=$DIR/f1 bs=4k count=1 > /dev/null
4634 run_test 44A "zero length read from a sparse stripe"
4637 local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
4639 [ -z "$nstripe" ] && skip "can't get stripe info"
4640 [[ $nstripe -gt $OSTCOUNT ]] &&
4641 skip "Wrong default_stripe_count: $nstripe OSTCOUNT: $OSTCOUNT"
4643 local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: |
4645 if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then
4646 nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: |
4650 OFFSETS="0 $((stride/2)) $((stride-1))"
4651 for offset in $OFFSETS; do
4652 for i in $(seq 0 $((nstripe-1))); do
4653 local GLOBALOFFSETS=""
4655 local size=$((((i + 2 * $nstripe )*$stride + $offset)))
4656 local myfn=$DIR/d44a-$size
4657 echo "--------writing $myfn at $size"
4658 ll_sparseness_write $myfn $size ||
4659 error "ll_sparseness_write"
4660 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4661 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4662 error "ll_sparseness_verify $GLOBALOFFSETS"
4664 for j in $(seq 0 $((nstripe-1))); do
4666 size=$((((j + $nstripe )*$stride + $offset)))
4667 ll_sparseness_write $myfn $size ||
4668 error "ll_sparseness_write"
4669 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4671 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4672 error "ll_sparseness_verify $GLOBALOFFSETS"
4677 run_test 44a "test sparse pwrite ==============================="
4681 for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
4687 before=`dirty_osc_total`
4688 echo executing "\"$*\""
4690 after=`dirty_osc_total`
4691 echo before $before, after $after
4694 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4697 # Obtain grants from OST if it supports it
4698 echo blah > ${f}_grant
4701 do_dirty_record "echo blah > $f"
4702 [[ $before -eq $after ]] && error "write wasn't cached"
4703 do_dirty_record "> $f"
4704 [[ $before -gt $after ]] || error "truncate didn't lower dirty count"
4705 do_dirty_record "echo blah > $f"
4706 [[ $before -eq $after ]] && error "write wasn't cached"
4707 do_dirty_record "sync"
4708 [[ $before -gt $after ]] || error "writeback didn't lower dirty count"
4709 do_dirty_record "echo blah > $f"
4710 [[ $before -eq $after ]] && error "write wasn't cached"
4711 do_dirty_record "cancel_lru_locks osc"
4712 [[ $before -gt $after ]] ||
4713 error "lock cancellation didn't lower dirty count"
4716 run_test 45 "osc io page accounting ============================"
4718 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this
4719 # test tickles a bug where re-dirtying a page was failing to be mapped to the
4720 # objects offset and an assert hit when an rpc was built with 1023's mapped
4721 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
4723 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4728 dd if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4730 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=1023 count=1
4731 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4735 run_test 46 "dirtying a previously written page ================"
4737 # test_47 is removed "Device nodes check" is moved to test_28
4739 test_48a() { # bug 2399
4740 [ "$mds1_FSTYPE" = "zfs" ] &&
4741 [ $MDS1_VERSION -lt $(version_code 2.3.63) ] &&
4742 skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly"
4744 test_mkdir $DIR/$tdir
4746 mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
4747 test_mkdir $DIR/$tdir
4748 touch foo || error "'touch foo' failed after recreating cwd"
4750 touch .foo || error "'touch .foo' failed after recreating cwd"
4752 ls . > /dev/null || error "'ls .' failed after recreating cwd"
4753 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4754 cd . || error "'cd .' failed after recreating cwd"
4755 mkdir . && error "'mkdir .' worked after recreating cwd"
4756 rmdir . && error "'rmdir .' worked after recreating cwd"
4757 ln -s . baz || error "'ln -s .' failed after recreating cwd"
4758 cd .. || error "'cd ..' failed after recreating cwd"
4760 run_test 48a "Access renamed working dir (should return errors)="
4762 test_48b() { # bug 2399
4764 test_mkdir $DIR/$tdir
4766 rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
4767 touch foo && error "'touch foo' worked after removing cwd"
4768 mkdir foo && error "'mkdir foo' worked after removing cwd"
4769 touch .foo && error "'touch .foo' worked after removing cwd"
4770 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
4771 ls . > /dev/null && error "'ls .' worked after removing cwd"
4772 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4773 mkdir . && error "'mkdir .' worked after removing cwd"
4774 rmdir . && error "'rmdir .' worked after removing cwd"
4775 ln -s . foo && error "'ln -s .' worked after removing cwd"
4776 cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
4778 run_test 48b "Access removed working dir (should return errors)="
4780 test_48c() { # bug 2350
4781 #lctl set_param debug=-1
4784 test_mkdir -p $DIR/$tdir/dir
4786 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4787 $TRACE touch foo && error "touch foo worked after removing cwd"
4788 $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
4789 touch .foo && error "touch .foo worked after removing cwd"
4790 mkdir .foo && error "mkdir .foo worked after removing cwd"
4791 $TRACE ls . && error "'ls .' worked after removing cwd"
4792 $TRACE ls .. || error "'ls ..' failed after removing cwd"
4793 $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
4794 $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
4795 $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
4796 $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
4798 run_test 48c "Access removed working subdir (should return errors)"
4800 test_48d() { # bug 2350
4801 #lctl set_param debug=-1
4804 test_mkdir -p $DIR/$tdir/dir
4806 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4807 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4808 $TRACE touch foo && error "'touch foo' worked after removing parent"
4809 $TRACE mkdir foo && error "mkdir foo worked after removing parent"
4810 touch .foo && error "'touch .foo' worked after removing parent"
4811 mkdir .foo && error "mkdir .foo worked after removing parent"
4812 $TRACE ls . && error "'ls .' worked after removing parent"
4813 $TRACE ls .. && error "'ls ..' worked after removing parent"
4814 $TRACE mkdir . && error "'mkdir .' worked after removing parent"
4815 $TRACE rmdir . && error "'rmdir .' worked after removing parent"
4816 $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
4819 run_test 48d "Access removed parent subdir (should return errors)"
4821 test_48e() { # bug 4134
4822 #lctl set_param debug=-1
4825 test_mkdir -p $DIR/$tdir/dir
4827 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4828 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4829 $TRACE touch $DIR/$tdir || error "'touch $DIR/$tdir' failed"
4830 $TRACE chmod +x $DIR/$tdir || error "'chmod +x $DIR/$tdir' failed"
4831 # On a buggy kernel addition of "touch foo" after cd .. will
4832 # produce kernel oops in lookup_hash_it
4833 touch ../foo && error "'cd ..' worked after recreate parent"
4835 $TRACE rm $DIR/$tdir || error "rm '$DIR/$tdir' failed"
4837 run_test 48e "Access to recreated parent subdir (should return errors)"
4839 test_49() { # LU-1030
4840 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4841 remote_ost_nodsh && skip "remote OST with nodsh"
4843 # get ost1 size - lustre-OST0000
4844 ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
4846 # write 800M at maximum
4847 [[ $ost1_size -lt 2 ]] && ost1_size=2
4848 [[ $ost1_size -gt 819200 ]] && ost1_size=819200
4850 $LFS setstripe -c 1 -i 0 $DIR/$tfile
4851 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) &
4854 # change max_pages_per_rpc while writing the file
4855 local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc
4856 local orig_mppc=$($LCTL get_param -n $osc1_mppc)
4857 # loop until dd process exits
4858 while ps ax -opid | grep -wq $dd_pid; do
4859 $LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1))
4860 sleep $((RANDOM % 5 + 1))
4862 # restore original max_pages_per_rpc
4863 $LCTL set_param $osc1_mppc=$orig_mppc
4864 rm $DIR/$tfile || error "rm $DIR/$tfile failed"
4866 run_test 49 "Change max_pages_per_rpc won't break osc extent"
4870 test_mkdir $DIR/$tdir
4872 ls /proc/$$/cwd || error "ls /proc/$$/cwd failed"
4874 run_test 50 "special situations: /proc symlinks ==============="
4876 test_51a() { # was test_51
4877 # bug 1516 - create an empty entry right after ".." then split dir
4878 test_mkdir -c1 $DIR/$tdir
4879 touch $DIR/$tdir/foo
4880 $MCREATE $DIR/$tdir/bar
4882 createmany -m $DIR/$tdir/longfile 201
4884 while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do
4885 $MCREATE $DIR/$tdir/longfile$FNUM
4890 ls -l $DIR/$tdir > /dev/null || error "ls -l $DIR/$tdir failed"
4892 run_test 51a "special situations: split htree with empty entry =="
4894 cleanup_print_lfs_df () {
4901 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4903 local dir=$DIR/$tdir
4904 local nrdirs=$((65536 + 100))
4906 # cleanup the directory
4913 local mdtidx=$(printf "%04x" $($LFS getstripe -m $dir))
4914 local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
4915 [[ $numfree -lt $nrdirs ]] &&
4916 skip "not enough free inodes ($numfree) on MDT$mdtidx"
4918 # need to check free space for the directories as well
4919 local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
4920 numfree=$(( blkfree / $(fs_inode_ksize) ))
4921 [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)"
4923 trap cleanup_print_lfs_df EXIT
4926 createmany -d $dir/d $nrdirs || {
4927 unlinkmany $dir/d $nrdirs
4928 error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
4932 nrdirs=$(ls -U $dir | wc -l)
4934 # unlink all but 100 subdirectories, then check it still works
4936 local delete=$((nrdirs - left))
4941 # for ldiskfs the nlink count should be 1, but this is OSD specific
4942 # and so this is listed for informational purposes only
4943 echo "nlink before: $(stat -c %h $dir), created before: $nrdirs"
4944 unlinkmany -d $dir/d $delete ||
4945 error "unlink of first $delete subdirs failed"
4947 echo "nlink between: $(stat -c %h $dir)"
4948 local found=$(ls -U $dir | wc -l)
4949 [ $found -ne $left ] &&
4950 error "can't find subdirs: found only $found, expected $left"
4952 unlinkmany -d $dir/d $delete $left ||
4953 error "unlink of second $left subdirs failed"
4954 # regardless of whether the backing filesystem tracks nlink accurately
4955 # or not, the nlink count shouldn't be more than "." and ".." here
4956 local after=$(stat -c %h $dir)
4957 [[ $after -gt 2 ]] && error "nlink after: $after > 2" ||
4958 echo "nlink after: $after"
4960 cleanup_print_lfs_df
4962 run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
4965 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4966 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
4968 test_mkdir $DIR/$tdir
4969 createmany -o $DIR/$tdir/t- 1000
4970 $LFS getstripe $DIR/$tdir > $TMP/$tfile
4971 for N in $(seq 0 $((OSTCOUNT - 1))); do
4972 OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
4973 END { printf("%0.0f", objs) }' $TMP/$tfile)
4974 OBJS0[$N]=$(grep -A 1 idx $TMP/$tfile | awk -vobjs=0 \
4975 '($1 == '$N') { objs += 1 } \
4976 END { printf("%0.0f", objs) }')
4977 log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
4979 unlinkmany $DIR/$tdir/t- 1000
4982 for N in $(seq 1 $((OSTCOUNT - 1))); do
4983 [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] &&
4984 error "OST $N has less objects vs OST $NLAST" \
4985 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4986 [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] &&
4987 error "OST $N has less objects vs OST $NLAST" \
4988 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4990 [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] &&
4991 error "OST $N has less #0 objects vs OST $NLAST" \
4992 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4993 [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] &&
4994 error "OST $N has less #0 objects vs OST $NLAST" \
4995 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
5000 run_test 51d "check object distribution"
5003 if [ "$mds1_FSTYPE" != ldiskfs ]; then
5004 skip_env "ldiskfs only test"
5007 test_mkdir -c1 $DIR/$tdir
5008 test_mkdir -c1 $DIR/$tdir/d0
5010 touch $DIR/$tdir/d0/foo
5011 createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
5012 error "file exceed 65000 nlink limit!"
5013 unlinkmany $DIR/$tdir/d0/f- 65001
5016 run_test 51e "check file nlink limit"
5019 test_mkdir $DIR/$tdir
5022 local ulimit_old=$(ulimit -n)
5023 local spare=20 # number of spare fd's for scripts/libraries, etc.
5024 local mdt=$($LFS getstripe -m $DIR/$tdir)
5025 local numfree=$($LFS df -i $DIR/$tdir | awk '/MDT:'$mdt'/ { print $4 }')
5027 echo "MDT$mdt numfree=$numfree, max=$max"
5028 [[ $numfree -gt $max ]] && numfree=$max || numfree=$((numfree * 7 / 8))
5029 if [ $((numfree + spare)) -gt $ulimit_old ]; then
5030 while ! ulimit -n $((numfree + spare)); do
5031 numfree=$((numfree * 3 / 4))
5033 echo "changed ulimit from $ulimit_old to $((numfree + spare))"
5035 echo "left ulimit at $ulimit_old"
5038 createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
5039 unlinkmany $DIR/$tdir/f $numfree
5040 error "create+open $numfree files in $DIR/$tdir failed"
5042 ulimit -n $ulimit_old
5044 # if createmany exits at 120s there will be fewer than $numfree files
5045 unlinkmany $DIR/$tdir/f $numfree || true
5047 run_test 51f "check many open files limit"
5050 [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
5051 test_mkdir $DIR/$tdir
5052 touch $DIR/$tdir/foo
5053 chattr +a $DIR/$tdir/foo || error "chattr +a failed"
5054 echo bar >> $DIR/$tdir/foo || error "append bar failed"
5055 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
5056 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
5057 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
5059 echo foo >> $DIR/$tdir/foo || error "append foo failed"
5060 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
5061 lsattr $DIR/$tdir/foo | egrep -q "^-+a[-e]+ $DIR/$tdir/foo" ||
5063 chattr -a $DIR/$tdir/foo || error "chattr -a failed"
5064 cp -r $DIR/$tdir $TMP/
5065 rm -fr $DIR/$tdir $TMP/$tdir || error "cleanup rm failed"
5067 run_test 52a "append-only flag test (should return errors)"
5070 [ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo
5071 test_mkdir $DIR/$tdir
5072 touch $DIR/$tdir/foo
5073 chattr +i $DIR/$tdir/foo || error "chattr +i failed"
5074 cat test > $DIR/$tdir/foo && error "cat test worked"
5075 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
5076 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
5077 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
5079 echo foo >> $DIR/$tdir/foo && error "echo worked"
5080 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
5081 [ -f $DIR/$tdir/foo ] || error "$tdir/foo is not a file"
5082 [ -f $DIR/$tdir/foo_ren ] && error "$tdir/foo_ren is not a file"
5083 lsattr $DIR/$tdir/foo | egrep -q "^-+i[-e]+ $DIR/$tdir/foo" ||
5085 chattr -i $DIR/$tdir/foo || error "chattr failed"
5087 rm -fr $DIR/$tdir || error "unable to remove $DIR/$tdir"
5089 run_test 52b "immutable flag test (should return errors) ======="
5092 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5093 remote_mds_nodsh && skip "remote MDS with nodsh"
5094 remote_ost_nodsh && skip "remote OST with nodsh"
5107 local support_last_seq=true
5109 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
5110 support_last_seq=false
5113 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
5115 for value in $(do_facet $SINGLEMDS \
5116 $LCTL get_param osp.$mdtosc.prealloc_last_id) ; do
5117 param=$(echo ${value[0]} | cut -d "=" -f1)
5118 ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
5120 if $support_last_seq; then
5121 param_seq=$(echo $param |
5122 sed -e s/prealloc_last_id/prealloc_last_seq/g)
5123 mds_last_seq=$(do_facet $SINGLEMDS \
5124 $LCTL get_param -n $param_seq)
5126 mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
5128 ostnum=$(index_from_ostuuid ${ostname}_UUID)
5129 node=$(facet_active_host ost$((ostnum+1)))
5130 param="obdfilter.$ostname.last_id"
5131 for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
5132 echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
5133 ost_last_id=$ost_last
5135 if $support_last_seq; then
5136 ost_last_id=$(echo $ost_last |
5137 awk -F':' '{print $2}' |
5139 ost_last_seq=$(echo $ost_last |
5140 awk -F':' '{print $1}')
5141 [[ $ost_last_seq = $mds_last_seq ]] || continue
5144 if [[ $ost_last_id != $mds_last ]]; then
5145 error "$ost_last_id != $mds_last"
5152 $found || error "can not match last_seq/last_id for $mdtosc"
5155 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
5158 perl -MSocket -e ';' || skip "no Socket perl module installed"
5160 $SOCKETSERVER $DIR/socket ||
5161 error "$SOCKETSERVER $DIR/socket failed: $?"
5162 $SOCKETCLIENT $DIR/socket ||
5163 error "$SOCKETCLIENT $DIR/socket failed: $?"
5164 $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
5166 run_test 54a "unix domain socket test =========================="
5172 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1
5174 run_test 54b "char device works in lustre ======================"
5177 [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
5178 [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
5179 [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
5181 for i in $(seq 3 7); do
5182 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
5191 loopdev="$DIR/loop54c"
5194 $UMOUNT $DIR/$tdir || rc=$?
5195 losetup -d $loopdev || true
5196 losetup -d $LOOPDEV || true
5197 rm -rf $loopdev $DIR/$tfile $DIR/$tdir
5202 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5204 loopdev="$DIR/loop54c"
5207 [ -z "$LOOPNUM" ] && skip_env "couldn't find empty loop device"
5208 trap cleanup_54c EXIT
5209 mknod $loopdev b 7 $LOOPNUM
5210 echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
5211 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE seek=1024 count=1 > /dev/null
5212 losetup $loopdev $DIR/$tfile ||
5213 error "can't set up $loopdev for $DIR/$tfile"
5214 mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
5215 test_mkdir $DIR/$tdir
5216 mount -t ext2 $loopdev $DIR/$tdir ||
5217 error "error mounting $loopdev on $DIR/$tdir"
5218 dd if=/dev/zero of=$DIR/$tdir/tmp bs=$PAGE_SIZE count=30 ||
5221 dd if=$DIR/$tdir/tmp of=/dev/zero bs=$PAGE_SIZE count=30 ||
5225 run_test 54c "block device works in lustre ====================="
5231 [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string"
5233 run_test 54d "fifo device works in lustre ======================"
5238 cp -aL /dev/console $f
5239 echo $string > $f || error "echo $string to $f failed"
5241 run_test 54e "console/tty device works in lustre ======================"
5245 local dir=$DIR/$tdir
5248 test_mkdir -p $dir/dir
5249 for i in $(seq $numfiles); do
5251 touch $dir/dir/file$i
5254 local numcomp=$($LFS getstripe --component-count $dir)
5256 [[ $numcomp == 0 ]] && numcomp=1
5258 # test lfs getstripe with --recursive
5259 local filenum=$($LFS getstripe -r $dir | egrep -c "obdidx|l_ost_idx")
5261 [[ $filenum -eq $((numfiles * 2)) ]] ||
5262 error "$LFS getstripe -r: found $filenum != $((numfiles * 2))"
5263 filenum=$($LFS getstripe $dir | egrep -c "obdidx|l_ost_idx")
5264 [[ $filenum -eq $numfiles ]] ||
5265 error "$LFS getstripe $dir: found $filenum, not $numfiles"
5266 echo "$LFS getstripe showed obdidx or l_ost_idx"
5268 # test lfs getstripe with file instead of dir
5269 filenum=$($LFS getstripe $dir/file1 | egrep -c "obdidx|l_ost_idx")
5270 [[ $filenum -eq 1 ]] ||
5271 error "$LFS getstripe $dir/file1: found $filenum, not 1"
5272 echo "$LFS getstripe file1 passed"
5274 #test lfs getstripe with --verbose
5275 filenum=$($LFS getstripe --verbose $dir | grep -c lmm_magic)
5276 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
5277 error "$LFS getstripe --verbose $dir: "\
5278 "got $filenum want $((numfiles * numcomp)) lmm_magic"
5279 [[ $($LFS getstripe $dir | grep -c lmm_magic) -eq 0 ]] ||
5280 error "$LFS getstripe $dir: showed lmm_magic"
5282 #test lfs getstripe with -v prints lmm_fid
5283 filenum=$($LFS getstripe -v $dir | grep -c lmm_fid)
5284 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
5285 error "$LFS getstripe -v $dir: "\
5286 "got $filenum want $((numfiles * numcomp)) lmm_fid"
5287 [[ $($LFS getstripe $dir | grep -c lmm_fid) -eq 0 ]] ||
5288 error "$LFS getstripe $dir: showed lmm_fid by default"
5289 echo "$LFS getstripe --verbose passed"
5291 #check for FID information
5292 local fid1=$($LFS getstripe --fid $dir/file1)
5293 local fid2=$($LFS getstripe --verbose $dir/file1 |
5294 awk '/lmm_fid: / { print $2; exit; }')
5295 local fid3=$($LFS path2fid $dir/file1)
5297 [ "$fid1" != "$fid2" ] &&
5298 error "getstripe --fid '$fid1' != getstripe --verbose '$fid2'"
5299 [ "$fid1" != "$fid3" ] &&
5300 error "getstripe --fid '$fid1' != lfs path2fid '$fid3'"
5301 echo "$LFS getstripe --fid passed"
5303 #test lfs getstripe with --obd
5304 $LFS getstripe --obd wrong_uuid $dir 2>&1 | grep -q "unknown obduuid" ||
5305 error "$LFS getstripe --obd wrong_uuid: should return error"
5307 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5310 local obduuid=$(ostuuid_from_index $ostidx)
5311 local found=$($LFS getstripe -r --obd $obduuid $dir |
5312 grep 'lmm_stripe_offset:' | grep -c " $ostidx\$")
5314 filenum=$($LFS getstripe -ir $dir | grep -c "^$ostidx\$")
5315 [[ $($LFS getstripe -id $dir) -ne $ostidx ]] ||
5317 [[ $($LFS getstripe -id $dir/dir) -ne $ostidx ]] ||
5320 [[ $found -eq $filenum ]] ||
5321 error "$LFS getstripe --obd: found $found expect $filenum"
5322 [[ $($LFS getstripe -r -v --obd $obduuid $dir |
5323 sed '/^[ ]*'${ostidx}'[ ]/d' |
5324 sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] ||
5325 error "$LFS getstripe --obd: should not show file on other obd"
5326 echo "$LFS getstripe --obd passed"
5328 run_test 56a "check $LFS getstripe"
5331 local dir=$DIR/$tdir
5335 for i in $(seq $numdirs); do
5336 test_mkdir $dir/dir$i
5339 # test lfs getdirstripe default mode is non-recursion, which is
5340 # different from lfs getstripe
5341 local dircnt=$($LFS getdirstripe $dir | grep -c lmv_stripe_count)
5343 [[ $dircnt -eq 1 ]] ||
5344 error "$LFS getdirstripe: found $dircnt, not 1"
5345 dircnt=$($LFS getdirstripe --recursive $dir |
5346 grep -c lmv_stripe_count)
5347 [[ $dircnt -eq $((numdirs + 1)) ]] ||
5348 error "$LFS getdirstripe -r: $dircnt, != $((numdirs + 1))"
5350 run_test 56b "check $LFS getdirstripe"
5353 remote_ost_nodsh && skip "remote OST with nodsh"
5356 local ost_name=$(ostname_from_index $ost_idx)
5357 local old_status=$(ost_dev_status $ost_idx)
5359 [[ -z "$old_status" ]] ||
5360 skip_env "OST $ost_name is in $old_status status"
5362 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
5365 local new_status=$(ost_dev_status $ost_idx)
5367 [[ "$new_status" = "D" ]] ||
5368 error "OST $ost_name is in status of '$new_status', not 'D'"
5370 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
5373 new_status=$(ost_dev_status $ost_idx)
5374 [[ -z "$new_status" ]] ||
5375 error "OST $ost_name is in status of '$new_status', not ''"
5377 run_test 56c "check 'lfs df' showing device status"
5382 local local_tdir="$1"
5383 local local_numfiles="$2"
5384 local local_numdirs="$3"
5385 local dir_params="$4"
5386 local dir_stripe_params="$5"
5388 if [ ! -d "$local_tdir" ] ; then
5389 test_mkdir -p $dir_stripe_params $local_tdir
5390 [ "$dir_params" ] && $LFS setstripe $dir_params $local_tdir
5391 for i in $(seq $local_numfiles) ; do
5392 touch $local_tdir/file$i
5394 for i in $(seq $local_numdirs) ; do
5395 test_mkdir $dir_stripe_params $local_tdir/dir$i
5396 for j in $(seq $local_numfiles) ; do
5397 touch $local_tdir/dir$i/file$j
5403 setup_56_special() {
5405 local local_numfiles=$2
5406 local local_numdirs=$3
5408 setup_56 $local_tdir $local_numfiles $local_numdirs
5410 if [ ! -e "$local_tdir/loop${local_numfiles}b" ] ; then
5411 for i in $(seq $local_numfiles) ; do
5412 mknod $local_tdir/loop${i}b b 7 $i
5413 mknod $local_tdir/null${i}c c 1 3
5414 ln -s $local_tdir/file1 $local_tdir/link${i}
5416 for i in $(seq $local_numdirs) ; do
5417 mknod $local_tdir/dir$i/loop${i}b b 7 $i
5418 mknod $local_tdir/dir$i/null${i}c c 1 3
5419 ln -s $local_tdir/dir$i/file1 $local_tdir/dir$i/link${i}
5425 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5426 local expected=$(($NUMDIRS + 2))
5428 setup_56 $dir $NUMFILES $NUMDIRS
5430 # test lfs find with -name
5431 for i in $(seq $NUMFILES) ; do
5432 local nums=$($LFS find -name "*$i" $dir | wc -l)
5434 [ $nums -eq $expected ] ||
5435 error "lfs find -name '*$i' $dir wrong: "\
5436 "found $nums, expected $expected"
5439 run_test 56g "check lfs find -name"
5442 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5443 local expected=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES))
5445 setup_56 $dir $NUMFILES $NUMDIRS
5447 # test lfs find with ! -name
5448 for i in $(seq $NUMFILES) ; do
5449 local nums=$($LFS find ! -name "*$i" $dir | wc -l)
5451 [ $nums -eq $expected ] ||
5452 error "lfs find ! -name '*$i' $dir wrong: "\
5453 "found $nums, expected $expected"
5456 run_test 56h "check lfs find ! -name"
5459 local dir=$DIR/$tdir
5463 local cmd="$LFS find -ost $(ostuuid_from_index 0 $dir) $dir"
5466 [ -z "$out" ] || error "'$cmd' returned directory '$out'"
5468 run_test 56i "check 'lfs find -ost UUID' skips directories"
5471 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5473 setup_56_special $dir $NUMFILES $NUMDIRS
5475 local expected=$((NUMDIRS + 1))
5476 local cmd="$LFS find -type d $dir"
5477 local nums=$($cmd | wc -l)
5479 [ $nums -eq $expected ] ||
5480 error "'$cmd' wrong: found $nums, expected $expected"
5482 run_test 56j "check lfs find -type d"
5485 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5487 setup_56_special $dir $NUMFILES $NUMDIRS
5489 local expected=$(((NUMDIRS + 1) * NUMFILES))
5490 local cmd="$LFS find -type f $dir"
5491 local nums=$($cmd | wc -l)
5493 [ $nums -eq $expected ] ||
5494 error "'$cmd' wrong: found $nums, expected $expected"
5496 run_test 56k "check lfs find -type f"
5499 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5501 setup_56_special $dir $NUMFILES $NUMDIRS
5503 local expected=$((NUMDIRS + NUMFILES))
5504 local cmd="$LFS find -type b $dir"
5505 local nums=$($cmd | wc -l)
5507 [ $nums -eq $expected ] ||
5508 error "'$cmd' wrong: found $nums, expected $expected"
5510 run_test 56l "check lfs find -type b"
5513 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5515 setup_56_special $dir $NUMFILES $NUMDIRS
5517 local expected=$((NUMDIRS + NUMFILES))
5518 local cmd="$LFS find -type c $dir"
5519 local nums=$($cmd | wc -l)
5520 [ $nums -eq $expected ] ||
5521 error "'$cmd' wrong: found $nums, expected $expected"
5523 run_test 56m "check lfs find -type c"
5526 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5527 setup_56_special $dir $NUMFILES $NUMDIRS
5529 local expected=$((NUMDIRS + NUMFILES))
5530 local cmd="$LFS find -type l $dir"
5531 local nums=$($cmd | wc -l)
5533 [ $nums -eq $expected ] ||
5534 error "'$cmd' wrong: found $nums, expected $expected"
5536 run_test 56n "check lfs find -type l"
5539 local dir=$DIR/$tdir
5541 setup_56 $dir $NUMFILES $NUMDIRS
5542 utime $dir/file1 > /dev/null || error "utime (1)"
5543 utime $dir/file2 > /dev/null || error "utime (2)"
5544 utime $dir/dir1 > /dev/null || error "utime (3)"
5545 utime $dir/dir2 > /dev/null || error "utime (4)"
5546 utime $dir/dir1/file1 > /dev/null || error "utime (5)"
5547 dd if=/dev/zero count=1 >> $dir/dir1/file1 && sync
5550 local nums=$($LFS find -mtime +0 $dir | wc -l)
5552 [ $nums -eq $expected ] ||
5553 error "lfs find -mtime +0 $dir: found $nums expect $expected"
5556 cmd="$LFS find -mtime 0 $dir"
5557 nums=$($cmd | wc -l)
5558 [ $nums -eq $expected ] ||
5559 error "'$cmd' wrong: found $nums, expected $expected"
5561 run_test 56o "check lfs find -mtime for old files"
5564 local dir=$DIR/$tdir
5568 # just to make sure there is something that won't be found
5570 touch $dir/$tfile.now
5572 for age in year week day hour min; do
5573 count=$((count + 1))
5575 touch $dir/$tfile-a.$age $dir/$tfile-m.$age
5576 touch --date="$count $age ago" -a $dir/$tfile-a.$age
5577 touch --date="$count $age ago" -m $dir/$tfile-m.$age
5579 local cmd="$LFS find $dir -mtime $count${age:0:1}"
5580 local nums=$($cmd | wc -l)
5581 [ $nums -eq $expected ] ||
5582 error "'$cmd' wrong: found $nums, expected $expected"
5584 cmd="$LFS find $dir -atime $count${age:0:1}"
5585 nums=$($cmd | wc -l)
5586 [ $nums -eq $expected ] ||
5587 error "'$cmd' wrong: found $nums, expected $expected"
5591 cmd="$LFS find $dir -ctime +1s -type f"
5592 nums=$($cmd | wc -l)
5593 (( $nums == $count * 2 + 1)) ||
5594 error "'$cmd' wrong: found $nums, expected $((expected*2+1))"
5596 run_test 56ob "check lfs find -atime -mtime -ctime with units"
5599 [ $RUNAS_ID -eq $UID ] &&
5600 skip_env "RUNAS_ID = UID = $UID -- skipping"
5602 local dir=$DIR/$tdir
5604 setup_56 $dir $NUMFILES $NUMDIRS
5605 chown $RUNAS_ID $dir/file* || error "chown $DIR/${tdir}g/file$i failed"
5607 local expected=$NUMFILES
5608 local cmd="$LFS find -uid $RUNAS_ID $dir"
5609 local nums=$($cmd | wc -l)
5611 [ $nums -eq $expected ] ||
5612 error "'$cmd' wrong: found $nums, expected $expected"
5614 expected=$(((NUMFILES + 1) * NUMDIRS + 1))
5615 cmd="$LFS find ! -uid $RUNAS_ID $dir"
5616 nums=$($cmd | wc -l)
5617 [ $nums -eq $expected ] ||
5618 error "'$cmd' wrong: found $nums, expected $expected"
5620 run_test 56p "check lfs find -uid and ! -uid"
5623 [ $RUNAS_ID -eq $UID ] &&
5624 skip_env "RUNAS_ID = UID = $UID -- skipping"
5626 local dir=$DIR/$tdir
5628 setup_56 $dir $NUMFILES $NUMDIRS
5629 chgrp $RUNAS_GID $dir/file* || error "chown $dir/file$i failed"
5631 local expected=$NUMFILES
5632 local cmd="$LFS find -gid $RUNAS_GID $dir"
5633 local nums=$($cmd | wc -l)
5635 [ $nums -eq $expected ] ||
5636 error "'$cmd' wrong: found $nums, expected $expected"
5638 expected=$(( ($NUMFILES+1) * $NUMDIRS + 1))
5639 cmd="$LFS find ! -gid $RUNAS_GID $dir"
5640 nums=$($cmd | wc -l)
5641 [ $nums -eq $expected ] ||
5642 error "'$cmd' wrong: found $nums, expected $expected"
5644 run_test 56q "check lfs find -gid and ! -gid"
5647 local dir=$DIR/$tdir
5649 setup_56 $dir $NUMFILES $NUMDIRS
5652 local cmd="$LFS find -size 0 -type f $dir"
5653 local nums=$($cmd | wc -l)
5655 [ $nums -eq $expected ] ||
5656 error "'$cmd' wrong: found $nums, expected $expected"
5658 cmd="$LFS find ! -size 0 -type f $dir"
5659 nums=$($cmd | wc -l)
5660 [ $nums -eq $expected ] ||
5661 error "'$cmd' wrong: found $nums, expected $expected"
5662 echo "test" > $dir/$tfile
5663 echo "test2" > $dir/$tfile.2 && sync
5665 cmd="$LFS find -size 5 -type f $dir"
5666 nums=$($cmd | wc -l)
5667 [ $nums -eq $expected ] ||
5668 error "'$cmd' wrong: found $nums, expected $expected"
5670 cmd="$LFS find -size +5 -type f $dir"
5671 nums=$($cmd | wc -l)
5672 [ $nums -eq $expected ] ||
5673 error "'$cmd' wrong: found $nums, expected $expected"
5675 cmd="$LFS find -size +0 -type f $dir"
5676 nums=$($cmd | wc -l)
5677 [ $nums -eq $expected ] ||
5678 error "'$cmd' wrong: found $nums, expected $expected"
5680 cmd="$LFS find ! -size -5 -type f $dir"
5681 nums=$($cmd | wc -l)
5682 [ $nums -eq $expected ] ||
5683 error "'$cmd' wrong: found $nums, expected $expected"
5685 cmd="$LFS find -size -5 -type f $dir"
5686 nums=$($cmd | wc -l)
5687 [ $nums -eq $expected ] ||
5688 error "'$cmd' wrong: found $nums, expected $expected"
5690 run_test 56r "check lfs find -size works"
5692 test_56s() { # LU-611 #LU-9369
5693 [[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
5695 local dir=$DIR/$tdir
5696 local onestripe=$(((NUMDIRS + 1) * NUMFILES))
5698 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5699 for i in $(seq $NUMDIRS); do
5700 $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile
5703 local expected=$NUMDIRS
5704 local cmd="$LFS find -c $OSTCOUNT $dir"
5705 local nums=$($cmd | wc -l)
5707 [ $nums -eq $expected ] || {
5708 $LFS getstripe -R $dir
5709 error "'$cmd' wrong: found $nums, expected $expected"
5712 expected=$((NUMDIRS + onestripe))
5713 cmd="$LFS find -stripe-count +0 -type f $dir"
5714 nums=$($cmd | wc -l)
5715 [ $nums -eq $expected ] || {
5716 $LFS getstripe -R $dir
5717 error "'$cmd' wrong: found $nums, expected $expected"
5721 cmd="$LFS find -stripe-count 1 -type f $dir"
5722 nums=$($cmd | wc -l)
5723 [ $nums -eq $expected ] || {
5724 $LFS getstripe -R $dir
5725 error "'$cmd' wrong: found $nums, expected $expected"
5728 cmd="$LFS find -stripe-count -2 -type f $dir"
5729 nums=$($cmd | wc -l)
5730 [ $nums -eq $expected ] || {
5731 $LFS getstripe -R $dir
5732 error "'$cmd' wrong: found $nums, expected $expected"
5736 cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir"
5737 nums=$($cmd | wc -l)
5738 [ $nums -eq $expected ] || {
5739 $LFS getstripe -R $dir
5740 error "'$cmd' wrong: found $nums, expected $expected"
5743 run_test 56s "check lfs find -stripe-count works"
5745 test_56t() { # LU-611 #LU-9369
5746 local dir=$DIR/$tdir
5748 setup_56 $dir 0 $NUMDIRS
5749 for i in $(seq $NUMDIRS); do
5750 $LFS setstripe -S 8M $dir/dir$i/$tfile
5753 local expected=$NUMDIRS
5754 local cmd="$LFS find -S 8M $dir"
5755 local nums=$($cmd | wc -l)
5757 [ $nums -eq $expected ] || {
5758 $LFS getstripe -R $dir
5759 error "'$cmd' wrong: found $nums, expected $expected"
5763 setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k"
5765 $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3}
5767 expected=$(((NUMDIRS + 1) * NUMFILES))
5768 cmd="$LFS find -stripe-size 512k -type f $dir"
5769 nums=$($cmd | wc -l)
5770 [ $nums -eq $expected ] ||
5771 error "'$cmd' wrong: found $nums, expected $expected"
5773 cmd="$LFS find -stripe-size +320k -type f $dir"
5774 nums=$($cmd | wc -l)
5775 [ $nums -eq $expected ] ||
5776 error "'$cmd' wrong: found $nums, expected $expected"
5778 expected=$(((NUMDIRS + 1) * NUMFILES + 4))
5779 cmd="$LFS find -stripe-size +200k -type f $dir"
5780 nums=$($cmd | wc -l)
5781 [ $nums -eq $expected ] ||
5782 error "'$cmd' wrong: found $nums, expected $expected"
5784 cmd="$LFS find -stripe-size -640k -type f $dir"
5785 nums=$($cmd | wc -l)
5786 [ $nums -eq $expected ] ||
5787 error "'$cmd' wrong: found $nums, expected $expected"
5790 cmd="$LFS find -stripe-size 256k -type f $dir"
5791 nums=$($cmd | wc -l)
5792 [ $nums -eq $expected ] ||
5793 error "'$cmd' wrong: found $nums, expected $expected"
5795 cmd="$LFS find -stripe-size -320k -type f $dir"
5796 nums=$($cmd | wc -l)
5797 [ $nums -eq $expected ] ||
5798 error "'$cmd' wrong: found $nums, expected $expected"
5801 cmd="$LFS find -stripe-size 1024k -type f $dir"
5802 nums=$($cmd | wc -l)
5803 [ $nums -eq $expected ] ||
5804 error "'$cmd' wrong: found $nums, expected $expected"
5806 run_test 56t "check lfs find -stripe-size works"
5808 test_56u() { # LU-611
5809 local dir=$DIR/$tdir
5811 setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1"
5813 if [[ $OSTCOUNT -gt 1 ]]; then
5814 $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3}
5820 local expected=$(((NUMDIRS + 1) * NUMFILES))
5821 local cmd="$LFS find -stripe-index 0 -type f $dir"
5822 local nums=$($cmd | wc -l)
5824 [ $nums -eq $expected ] ||
5825 error "'$cmd' wrong: found $nums, expected $expected"
5828 cmd="$LFS find -stripe-index 1 -type f $dir"
5829 nums=$($cmd | wc -l)
5830 [ $nums -eq $expected ] ||
5831 error "'$cmd' wrong: found $nums, expected $expected"
5833 cmd="$LFS find ! -stripe-index 0 -type f $dir"
5834 nums=$($cmd | wc -l)
5835 [ $nums -eq $expected ] ||
5836 error "'$cmd' wrong: found $nums, expected $expected"
5839 # This should produce an error and not return any files
5840 cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir"
5841 nums=$($cmd 2>/dev/null | wc -l)
5842 [ $nums -eq $expected ] ||
5843 error "'$cmd' wrong: found $nums, expected $expected"
5845 if [[ $OSTCOUNT -gt 1 ]]; then
5846 expected=$(((NUMDIRS + 1) * NUMFILES + onestripe))
5847 cmd="$LFS find -stripe-index 0,1 -type f $dir"
5848 nums=$($cmd | wc -l)
5849 [ $nums -eq $expected ] ||
5850 error "'$cmd' wrong: found $nums, expected $expected"
5853 run_test 56u "check lfs find -stripe-index works"
5857 local dir=$DIR/$tdir
5859 setup_56 $dir $NUMFILES $NUMDIRS
5861 UUID=$(mdtuuid_from_index $mdt_idx $dir)
5862 [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $mdt_idx"
5864 for file in $($LFS find -m $UUID $dir); do
5865 file_midx=$($LFS getstripe -m $file)
5866 [ $file_midx -eq $mdt_idx ] ||
5867 error "lfs find -m $UUID != getstripe -m $file_midx"
5870 run_test 56v "check 'lfs find -m match with lfs getstripe -m'"
5873 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5874 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5876 local dir=$DIR/$tdir
5878 setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
5880 local stripe_size=$($LFS getstripe -S -d $dir) ||
5881 error "$LFS getstripe -S -d $dir failed"
5882 stripe_size=${stripe_size%% *}
5884 local file_size=$((stripe_size * OSTCOUNT))
5885 local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
5886 local required_space=$((file_num * file_size))
5887 local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
5889 [[ $free_space -le $((required_space / 1024)) ]] &&
5890 skip_env "need $required_space, have $free_space kbytes"
5893 local dd_count=$((file_size / dd_bs))
5895 # write data into the files
5900 for i in $(seq $NUMFILES); do
5902 yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5903 error "write data into $file failed"
5905 for i in $(seq $NUMDIRS); do
5906 for j in $(seq $NUMFILES); do
5907 file=$dir/dir$i/file$j
5908 yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5909 error "write data into $file failed"
5913 # $LFS_MIGRATE will fail if hard link migration is unsupported
5914 if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then
5915 createmany -l$dir/dir1/file1 $dir/dir1/link 200 ||
5916 error "creating links to $dir/dir1/file1 failed"
5921 [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
5924 local cmd="$LFS_MIGRATE -y -c $expected $dir/file1"
5927 eval $cmd || error "$cmd failed"
5929 check_stripe_count $dir/file1 $expected
5931 if [ $MDS1_VERSION -ge $(version_code 2.6.90) ];
5933 # lfs_migrate file onto OST 0 if it is on OST 1, or onto
5934 # OST 1 if it is on OST 0. This file is small enough to
5935 # be on only one stripe.
5936 file=$dir/migr_1_ost
5937 dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
5938 error "write data into $file failed"
5939 local obdidx=$($LFS getstripe -i $file)
5940 local oldmd5=$(md5sum $file)
5943 [[ $obdidx -eq 0 ]] && newobdidx=1
5944 cmd="$LFS migrate -i $newobdidx $file"
5946 eval $cmd || error "$cmd failed"
5948 local realobdix=$($LFS getstripe -i $file)
5949 local newmd5=$(md5sum $file)
5951 [[ $newobdidx -ne $realobdix ]] &&
5952 error "new OST is different (was=$obdidx, "\
5953 "wanted=$newobdidx, got=$realobdix)"
5954 [[ "$oldmd5" != "$newmd5" ]] &&
5955 error "md5sum differ: $oldmd5, $newmd5"
5959 cmd="$LFS_MIGRATE -y -c $expected $dir/dir1"
5961 eval $cmd || error "$cmd failed"
5963 for j in $(seq $NUMFILES); do
5964 check_stripe_count $dir/dir1/file$j $expected
5967 # lfs_migrate works with lfs find
5968 cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir |
5969 $LFS_MIGRATE -y -c $expected"
5971 eval $cmd || error "$cmd failed"
5973 for i in $(seq 2 $NUMFILES); do
5974 check_stripe_count $dir/file$i $expected
5976 for i in $(seq 2 $NUMDIRS); do
5977 for j in $(seq $NUMFILES); do
5978 check_stripe_count $dir/dir$i/file$j $expected
5982 run_test 56w "check lfs_migrate -c stripe_count works"
5985 local file1=$DIR/$tdir/file1
5986 local create_pool=false
5987 local initial_pool=$($LFS getstripe -p $DIR)
5991 echo -n "Creating test dir..."
5992 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5995 echo -n "Creating test file..."
5996 touch $file1 || error "cannot create file"
5999 echo -n "Detecting existing pools..."
6000 pool_list=($($LFS pool_list $FSNAME | grep "$FSNAME\." | cut -d. -f2))
6002 if [ ${#pool_list[@]} -gt 0 ]; then
6003 echo "${pool_list[@]}"
6004 for thispool in "${pool_list[@]}"; do
6005 if [[ -z "$initial_pool" ||
6006 "$initial_pool" != "$thispool" ]]; then
6008 echo "Using existing pool '$pool'"
6013 echo "none detected."
6015 if [ -z "$pool" ]; then
6016 pool=${POOL:-testpool}
6017 [ "$initial_pool" = "$pool" ] && pool="testpool2"
6018 echo -n "Creating pool '$pool'..."
6020 pool_add $pool &> /dev/null ||
6021 error "pool_add failed"
6024 echo -n "Adding target to pool..."
6025 pool_add_targets $pool 0 0 1 &> /dev/null ||
6026 error "pool_add_targets failed"
6030 echo -n "Setting pool using -p option..."
6031 $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null ||
6032 error "migrate failed rc = $?"
6035 echo -n "Verifying test file is in pool after migrating..."
6036 [ "$($LFS getstripe -p $file1)" = $pool ] ||
6037 error "file was not migrated to pool $pool"
6040 echo -n "Removing test file from pool '$pool'..."
6041 $LFS migrate $file1 &> /dev/null ||
6042 error "cannot remove from pool"
6043 [ "$($LFS getstripe -p $file1)" ] &&
6044 error "pool still set"
6047 echo -n "Setting pool using --pool option..."
6048 $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null ||
6049 error "migrate failed rc = $?"
6054 if $create_pool; then
6055 destroy_test_pools 2> /dev/null ||
6056 error "destroy test pools failed"
6059 run_test 56wb "check lfs_migrate pool support"
6062 local file1="$DIR/$tdir/file1"
6064 echo -n "Creating test dir..."
6065 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
6066 local def_stripe_size=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
6067 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
6068 error "cannot set stripe"
6071 echo -n "Setting initial stripe for test file..."
6072 $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
6073 error "cannot set stripe"
6074 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
6075 error "stripe size not set"
6078 # File currently set to -S 512K -c 1
6080 # Ensure -c and -S options are rejected when -R is set
6081 echo -n "Verifying incompatible options are detected..."
6082 $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null &&
6083 error "incompatible -c and -R options not detected"
6084 $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null &&
6085 error "incompatible -S and -R options not detected"
6088 # Ensure unrecognized options are passed through to 'lfs migrate'
6089 echo -n "Verifying -S option is passed through to lfs migrate..."
6090 $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
6091 error "migration failed"
6092 [ $($LFS getstripe -S "$file1") -eq 1048576 ] ||
6093 error "file was not restriped"
6096 # File currently set to -S 1M -c 1
6098 # Ensure long options are supported
6099 echo -n "Verifying long options supported..."
6100 $LFS_MIGRATE -y --non-block "$file1" &> /dev/null ||
6101 error "long option without argument not supported"
6102 $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
6103 error "long option with argument not supported"
6104 [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
6105 error "file not restriped with --stripe-size option"
6108 # File currently set to -S 512K -c 1
6110 if [ "$OSTCOUNT" -gt 1 ]; then
6111 echo -n "Verifying explicit stripe count can be set..."
6112 $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
6113 error "migrate failed"
6114 [ $($LFS getstripe -c "$file1") -eq 2 ] ||
6115 error "file not restriped to explicit count"
6119 # File currently set to -S 512K -c 1 or -S 512K -c 2
6121 # Ensure parent striping is used if -R is set, and no stripe
6122 # count or size is specified
6123 echo -n "Setting stripe for parent directory..."
6124 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
6125 error "cannot set stripe"
6128 echo -n "Verifying restripe option uses parent stripe settings..."
6129 $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
6130 error "migrate failed"
6131 [ $($LFS getstripe -S "$file1") -eq $def_stripe_size ] ||
6132 error "file not restriped to parent settings"
6133 [ $($LFS getstripe -c "$file1") -eq 1 ] ||
6134 error "file not restriped to parent settings"
6137 # File currently set to -S 1M -c 1
6139 # Ensure striping is preserved if -R is not set, and no stripe
6140 # count or size is specified
6141 echo -n "Verifying striping size preserved when not specified..."
6142 local orig_stripe_size=$($LFS getstripe -S "$file1" 2>/dev/null)
6143 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
6144 error "cannot set stripe on parent directory"
6145 $LFS_MIGRATE -y "$file1" &> /dev/null ||
6146 error "migrate failed"
6147 [ $($LFS getstripe -S "$file1") -eq $orig_stripe_size ] ||
6148 error "file was restriped"
6151 # Ensure file name properly detected when final option has no argument
6152 echo -n "Verifying file name properly detected..."
6153 $LFS_MIGRATE -y "$file1" &> /dev/null ||
6154 error "file name interpreted as option argument"
6160 run_test 56wc "check unrecognized options for lfs_migrate are passed through"
6163 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6165 local file1=$DIR/$tdir/file1
6167 echo -n "Creating test dir..."
6168 test_mkdir $DIR/$tdir || error "cannot create dir"
6171 echo -n "Creating test file..."
6175 # Ensure 'lfs migrate' will fail by using a non-existent option,
6176 # and make sure rsync is not called to recover
6177 echo -n "Make sure --no-rsync option works..."
6178 $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 |
6179 grep -q 'refusing to fall back to rsync' ||
6180 error "rsync was called with --no-rsync set"
6183 # Ensure rsync is called without trying 'lfs migrate' first
6184 echo -n "Make sure --rsync option works..."
6185 $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 |
6186 grep -q 'falling back to rsync' &&
6187 error "lfs migrate was called with --rsync set"
6190 echo -n "Make sure --rsync and --no-rsync options are exclusive..."
6191 $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 |
6192 grep -q 'at the same time' ||
6193 error "--rsync and --no-rsync accepted concurrently"
6199 run_test 56wd "check lfs_migrate --rsync and --no-rsync work"
6202 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6203 check_swap_layouts_support
6205 local dir=$DIR/$tdir
6206 local ref1=/etc/passwd
6207 local file1=$dir/file1
6209 test_mkdir $dir || error "creating dir $dir"
6210 $LFS setstripe -c 2 $file1
6212 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
6213 stripe=$($LFS getstripe -c $file1)
6214 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6215 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6220 run_test 56x "lfs migration support"
6223 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6224 check_swap_layouts_support
6226 local dir=$DIR/$tdir/$testnum
6230 local ref1=/etc/passwd
6231 local file1=$dir/file1
6233 $LFS setstripe -c 2 $file1
6235 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
6237 local stripe=$($LFS getstripe -c $file1)
6239 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6240 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6245 run_test 56xa "lfs migration --block support"
6247 check_migrate_links() {
6249 local file1="$dir/file1"
6252 local total_count=$(($begin + $count - 1))
6253 local symlink_count=10
6256 if [ ! -f "$file1" ]; then
6257 echo -n "creating initial file..."
6258 $LFS setstripe -c 1 -S "512k" "$file1" ||
6259 error "cannot setstripe initial file"
6262 echo -n "creating symlinks..."
6263 for s in $(seq 1 $symlink_count); do
6264 ln -s "$file1" "$dir/slink$s" ||
6265 error "cannot create symlinks"
6269 echo -n "creating nonlinked files..."
6270 createmany -o "$dir/uniq" 1 10 &> /dev/null ||
6271 error "cannot create nonlinked files"
6276 if [ ! -f "$dir/file$total_count" ]; then
6277 echo -n "creating hard links $begin:$total_count..."
6278 createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
6279 /dev/null || error "cannot create hard links"
6283 echo -n "checking number of hard links listed in xattrs..."
6284 local fid=$($LFS getstripe -F "$file1")
6285 local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
6288 if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
6289 skip "hard link list has unexpected size, skipping test"
6291 if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
6292 error "link names should exceed xattrs size"
6295 echo -n "migrating files..."
6296 local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir)
6298 [ $rc -eq 0 ] || error "migrate failed rc = $rc"
6301 # make sure all links have been properly migrated
6302 echo -n "verifying files..."
6303 fid=$($LFS getstripe -F "$file1") ||
6304 error "cannot get fid for file $file1"
6305 for i in $(seq 2 $total_count); do
6306 local fid2=$($LFS getstripe -F $dir/file$i)
6308 [ "$fid2" == "$fid" ] ||
6309 error "migrated hard link has mismatched FID"
6312 # make sure hard links were properly detected, and migration was
6313 # performed only once for the entire link set; nonlinked files should
6315 local actual=$(grep -c 'done' <<< "$migrate_out")
6316 local expected=$(($uniq_count + 1))
6318 [ "$actual" -eq "$expected" ] ||
6319 error "hard links individually migrated ($actual != $expected)"
6321 # make sure the correct number of hard links are present
6322 local hardlinks=$(stat -c '%h' "$file1")
6324 [ $hardlinks -eq $total_count ] ||
6325 error "num hard links $hardlinks != $total_count"
6332 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
6333 skip "Need MDS version at least 2.10.55"
6335 local dir="$DIR/$tdir"
6337 test_mkdir "$dir" || error "cannot create dir $dir"
6339 echo "testing lfs migrate mode when all links fit within xattrs"
6340 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 2 99
6342 echo "testing rsync mode when all links fit within xattrs"
6343 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 2 99
6345 echo "testing lfs migrate mode when all links do not fit within xattrs"
6346 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100
6348 echo "testing rsync mode when all links do not fit within xattrs"
6349 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 101 100
6355 run_test 56xb "lfs migration hard link support"
6358 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6360 local dir="$DIR/$tdir"
6362 test_mkdir "$dir" || error "cannot create dir $dir"
6364 # Test 1: ensure file < 1 GB is always migrated with 1 stripe
6365 echo -n "Setting initial stripe for 20MB test file..."
6366 $LFS setstripe -c 2 -i 0 "$dir/20mb" ||
6367 error "cannot setstripe 20MB file"
6369 echo -n "Sizing 20MB test file..."
6370 truncate "$dir/20mb" 20971520 || error "cannot create 20MB test file"
6372 echo -n "Verifying small file autostripe count is 1..."
6373 $LFS_MIGRATE -y -A -C 1 "$dir/20mb" ||
6374 error "cannot migrate 20MB file"
6375 local stripe_count=$($LFS getstripe -c "$dir/20mb") ||
6376 error "cannot get stripe for $dir/20mb"
6377 [ $stripe_count -eq 1 ] ||
6378 error "unexpected stripe count $stripe_count for 20MB file"
6382 # Test 2: File is small enough to fit within the available space on
6383 # sqrt(size_in_gb) + 1 OSTs but is larger than 1GB. The file must
6384 # have at least an additional 1KB for each desired stripe for test 3
6385 echo -n "Setting stripe for 1GB test file..."
6386 $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe 1GB file"
6388 echo -n "Sizing 1GB test file..."
6389 # File size is 1GB + 3KB
6390 truncate "$dir/1gb" 1073744896 || error "cannot create 1GB test file"
6393 # need at least 512MB per OST for 1GB file to fit in 2 stripes
6394 local avail=$($LCTL get_param -n llite.$FSNAME*.kbytesavail)
6395 if (( avail > 524288 * OSTCOUNT )); then
6396 echo -n "Migrating 1GB file..."
6397 $LFS_MIGRATE -y -A -C 1 "$dir/1gb" ||
6398 error "cannot migrate 1GB file"
6400 echo -n "Verifying autostripe count is sqrt(n) + 1..."
6401 stripe_count=$($LFS getstripe -c "$dir/1gb") ||
6402 error "cannot getstripe for 1GB file"
6403 [ $stripe_count -eq 2 ] ||
6404 error "unexpected stripe count $stripe_count != 2"
6408 # Test 3: File is too large to fit within the available space on
6409 # sqrt(n) + 1 OSTs. Simulate limited available space with -X
6410 if [ $OSTCOUNT -ge 3 ]; then
6411 # The required available space is calculated as
6412 # file size (1GB + 3KB) / OST count (3).
6413 local kb_per_ost=349526
6415 echo -n "Migrating 1GB file with limit..."
6416 $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" ||
6417 error "cannot migrate 1GB file with limit"
6420 stripe_count=$($LFS getstripe -c "$dir/1gb")
6421 echo -n "Verifying 1GB autostripe count with limited space..."
6422 [ "$stripe_count" -a $stripe_count -ge 3 ] ||
6423 error "unexpected stripe count $stripe_count (min 3)"
6430 run_test 56xc "lfs migration autostripe"
6433 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
6434 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
6437 local dir=$DIR/$tdir
6441 test_mkdir -p $dir || error "creating dir $dir"
6442 touch $f1 || error "creating std file $f1"
6443 $MULTIOP $f2 H2c || error "creating released file $f2"
6445 # a directory can be raid0, so ask only for files
6446 res=$($LFS find $dir -L raid0 -type f | wc -l)
6447 [[ $res == 2 ]] || error "search raid0: found $res files != 2"
6449 res=$($LFS find $dir \! -L raid0 -type f | wc -l)
6450 [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
6452 # only files can be released, so no need to force file search
6453 res=$($LFS find $dir -L released)
6454 [[ $res == $f2 ]] || error "search released: found $res != $f2"
6456 res=$($LFS find $dir -type f \! -L released)
6457 [[ $res == $f1 ]] || error "search !released: found $res != $f1"
6459 run_test 56y "lfs find -L raid0|released"
6461 test_56z() { # LU-4824
6462 # This checks to make sure 'lfs find' continues after errors
6463 # There are two classes of errors that should be caught:
6464 # - If multiple paths are provided, all should be searched even if one
6466 # - If errors are encountered during the search, it should not terminate
6468 local dir=$DIR/$tdir
6472 for i in d{0..9}; do
6474 touch $dir/$i/$tfile
6476 $LFS find $DIR/non_existent_dir $dir &&
6477 error "$LFS find did not return an error"
6478 # Make a directory unsearchable. This should NOT be the last entry in
6479 # directory order. Arbitrarily pick the 6th entry
6480 chmod 700 $($LFS find $dir -type d | sed '6!d')
6482 $RUNAS $LFS find $DIR/non_existent $dir
6483 local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l)
6485 # The user should be able to see 10 directories and 9 files
6486 (( count == 19 )) ||
6487 error "$LFS find found $count != 19 entries after error"
6489 run_test 56z "lfs find should continue after an error"
6491 test_56aa() { # LU-5937
6492 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
6494 local dir=$DIR/$tdir
6497 $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
6499 createmany -o $dir/striped_dir/${tfile}- 1024
6500 local dirs=$($LFS find --size +8k $dir/)
6502 [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
6504 run_test 56aa "lfs find --size under striped dir"
6506 test_56ab() { # LU-10705
6507 test_mkdir $DIR/$tdir
6508 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
6509 dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
6510 dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
6511 # Flush writes to ensure valid blocks. Need to be more thorough for
6512 # ZFS, since blocks are not allocated/returned to client immediately.
6514 wait_zfs_commit ost1 2
6515 cancel_lru_locks osc
6518 local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
6520 [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
6522 files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
6523 [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
6525 rm -f $DIR/$tdir/$tfile.[123]
6527 run_test 56ab "lfs find --blocks"
6530 [ $MDS1_VERSION -lt $(version_code 2.10.50) ] &&
6531 skip "Need MDS version at least 2.10.50"
6533 # Create composite files with one component
6534 local dir=$DIR/$tdir
6536 setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
6537 # Create composite files with three components
6538 setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
6539 # Create non-composite files
6540 createmany -o $dir/${tfile}- 10
6542 local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l)
6544 [[ $nfiles == 10 ]] ||
6545 error "lfs find -E 1M found $nfiles != 10 files"
6547 nfiles=$($LFS find ! -E 1M --type f $dir | wc -l)
6548 [[ $nfiles == 25 ]] ||
6549 error "lfs find ! -E 1M found $nfiles != 25 files"
6551 # All files have a component that starts at 0
6552 nfiles=$($LFS find --component-start 0 --type f $dir | wc -l)
6553 [[ $nfiles == 35 ]] ||
6554 error "lfs find --component-start 0 - $nfiles != 35 files"
6556 nfiles=$($LFS find --component-start 2M --type f $dir | wc -l)
6557 [[ $nfiles == 15 ]] ||
6558 error "lfs find --component-start 2M - $nfiles != 15 files"
6560 # All files created here have a componenet that does not starts at 2M
6561 nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l)
6562 [[ $nfiles == 35 ]] ||
6563 error "lfs find ! --component-start 2M - $nfiles != 35 files"
6565 # Find files with a specified number of components
6566 local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l)
6567 [[ $nfiles == 15 ]] ||
6568 error "lfs find --component-count 3 - $nfiles != 15 files"
6570 # Remember non-composite files have a component count of zero
6571 local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l)
6572 [[ $nfiles == 10 ]] ||
6573 error "lfs find --component-count 0 - $nfiles != 10 files"
6575 nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l)
6576 [[ $nfiles == 20 ]] ||
6577 error "lfs find ! --component-count 3 - $nfiles != 20 files"
6579 # All files have a flag called "init"
6580 local nfiles=$($LFS find --component-flags init --type f $dir | wc -l)
6581 [[ $nfiles == 35 ]] ||
6582 error "lfs find --component-flags init - $nfiles != 35 files"
6584 # Multi-component files will have a component not initialized
6585 local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l)
6586 [[ $nfiles == 15 ]] ||
6587 error "lfs find !--component-flags init - $nfiles != 15 files"
6592 run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
6595 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
6596 skip "Need MDS version at least 2.10.57"
6606 # create mirrored directories and mirrored files
6607 mkdir $td || error "mkdir $td failed"
6608 $LFS mirror create -N3 $td || error "create mirrored dir $td failed"
6609 createmany -o $tf- 10 || error "create $tf- failed"
6611 for i in $(seq 2); do
6613 mkdir $dir || error "mkdir $dir failed"
6614 $LFS mirror create -N$((3 + i)) $dir ||
6615 error "create mirrored dir $dir failed"
6616 createmany -o $dir/$tfile- 10 ||
6617 error "create $dir/$tfile- failed"
6620 # change the states of some mirrored files
6622 for i in $(seq 2); do
6624 for j in $(seq 4 9); do
6625 echo foo > $dir/$tfile-$j
6629 # find mirrored files with specific mirror count
6630 cmd="$LFS find --mirror-count 3 --type f $td"
6631 nfiles=$($cmd | wc -l)
6632 [[ $nfiles = 10 ]] || error "$cmd: $nfiles != 10 files"
6634 cmd="$LFS find ! --mirror-count 3 --type f $td"
6635 nfiles=$($cmd | wc -l)
6636 [[ $nfiles = 20 ]] || error "$cmd: $nfiles != 20 files"
6638 cmd="$LFS find --mirror-count +2 --type f $td"
6639 nfiles=$($cmd | wc -l)
6640 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6642 cmd="$LFS find --mirror-count -6 --type f $td"
6643 nfiles=$($cmd | wc -l)
6644 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6646 # find mirrored files with specific file state
6647 cmd="$LFS find --maxdepth 1 --mirror-state=^ro --type f $td"
6648 [[ $($cmd) = $tf-6 ]] || error "$cmd: didn't return $tf-6"
6650 cmd="$LFS find --mirror-state=ro --type f $td"
6651 nfiles=$($cmd | wc -l)
6652 [[ $nfiles = 17 ]] || error "$cmd: $nfiles != 17 files"
6654 cmd="$LFS find ! --mirror-state=ro --type f $td"
6655 nfiles=$($cmd | wc -l)
6656 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6658 cmd="$LFS find --mirror-state=wp --type f $td"
6659 nfiles=$($cmd | wc -l)
6660 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6662 cmd="$LFS find ! --mirror-state=sp --type f $td"
6663 nfiles=$($cmd | wc -l)
6664 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6666 run_test 56ca "check lfs find --mirror-count|-N and --mirror-state"
6669 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6670 # note test will not do anything if MDS is not local
6671 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6672 skip_env "ldiskfs only test"
6674 remote_mds_nodsh && skip "remote MDS with nodsh"
6676 local MNTDEV="osd*.*MDT*.mntdev"
6677 DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV)
6678 [ -z "$DEV" ] && error "can't access $MNTDEV"
6679 for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
6680 do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
6681 error "can't access $DEV"
6682 DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
6683 [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
6687 run_test 57a "verify MDS filesystem created with large inodes =="
6690 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6691 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6692 skip_env "ldiskfs only test"
6694 remote_mds_nodsh && skip "remote MDS with nodsh"
6696 local dir=$DIR/$tdir
6699 local fileN=$dir/f$filecount
6701 rm -rf $dir || error "removing $dir"
6703 local mdtidx=$($LFS getstripe -m $dir)
6704 local mdtname=MDT$(printf %04x $mdtidx)
6705 local facet=mds$((mdtidx + 1))
6707 echo "mcreating $filecount files"
6708 createmany -m $dir/f 1 $filecount || error "creating files in $dir"
6710 # verify that files do not have EAs yet
6711 $LFS getstripe $file1 2>&1 | grep -q "no stripe" ||
6712 error "$file1 has an EA"
6713 $LFS getstripe $fileN 2>&1 | grep -q "no stripe" ||
6714 error "$fileN has an EA"
6718 df $dir #make sure we get new statfs data
6719 local mdsfree=$(do_facet $facet \
6720 lctl get_param -n osd*.*$mdtname.kbytesfree)
6721 local mdcfree=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6724 echo "opening files to create objects/EAs"
6725 for file in $(seq -f $dir/f%g 1 $filecount); do
6726 $OPENFILE -f O_RDWR $file > /dev/null 2>&1 ||
6727 error "opening $file"
6730 # verify that files have EAs now
6731 $LFS getstripe $file1 | grep -q "obdidx" || error "$file1 missing EA"
6732 $LFS getstripe $fileN | grep -q "obdidx" || error "$fileN missing EA"
6734 sleep 1 #make sure we get new statfs data
6736 local mdsfree2=$(do_facet $facet \
6737 lctl get_param -n osd*.*$mdtname.kbytesfree)
6738 local mdcfree2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6740 if [[ $mdcfree2 -lt $((mdcfree - 16)) ]]; then
6741 if [ "$mdsfree" != "$mdsfree2" ]; then
6742 error "MDC before $mdcfree != after $mdcfree2"
6744 echo "MDC before $mdcfree != after $mdcfree2"
6745 echo "unable to confirm if MDS has large inodes"
6750 run_test 57b "default LOV EAs are stored inside large inodes ==="
6753 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6754 [ -z "$(which wiretest 2>/dev/null)" ] &&
6755 skip_env "could not find wiretest"
6759 run_test 58 "verify cross-platform wire constants =============="
6762 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6764 echo "touch 130 files"
6765 createmany -o $DIR/f59- 130
6767 unlinkmany $DIR/f59- 130
6769 # wait for commitment of removal
6770 wait_delete_completed
6772 run_test 59 "verify cancellation of llog records async ========="
6774 TEST60_HEAD="test_60 run $RANDOM"
6776 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6777 remote_mgs_nodsh && skip "remote MGS with nodsh"
6778 do_facet mgs "! which run-llog.sh &> /dev/null" &&
6779 do_facet mgs "! ls run-llog.sh &> /dev/null" &&
6780 skip_env "missing subtest run-llog.sh"
6782 log "$TEST60_HEAD - from kernel mode"
6783 do_facet mgs "$LCTL dk > /dev/null"
6784 do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed"
6785 do_facet mgs $LCTL dk > $TMP/$tfile
6787 # LU-6388: test llog_reader
6788 local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
6789 llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
6790 [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
6791 skip_env "missing llog_reader"
6792 local fstype=$(facet_fstype mgs)
6793 [ $fstype != ldiskfs -a $fstype != zfs ] &&
6794 skip_env "Only for ldiskfs or zfs type mgs"
6796 local mntpt=$(facet_mntpt mgs)
6797 local mgsdev=$(mgsdevname 1)
6809 #get fid and record list
6810 fid_list=($(awk '/9_sub.*record/ { print $NF }' $TMP/$tfile |
6812 rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' $TMP/$tfile |
6814 #remount mgs as ldiskfs or zfs type
6815 stop mgs || error "stop mgs failed"
6816 mount_fstype mgs || error "remount mgs failed"
6817 for ((i = 0; i < ${#fid_list[@]}; i++)); do
6820 seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
6821 oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
6826 obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
6828 obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
6830 echo "obj_file is $obj_file"
6831 do_facet mgs $llog_reader $obj_file
6833 rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
6834 awk '{ print $3 }' | sed -e "s/^type=//g")
6835 if [ $rec_type != $rec ]; then
6836 echo "FAILED test_60a wrong record type $rec_type," \
6842 #check obj path if record type is LLOG_LOGID_MAGIC
6843 if [ "$rec" == "1064553b" ]; then
6844 path=$(do_facet mgs $llog_reader $obj_file |
6845 grep "path=" | awk '{ print $NF }' |
6846 sed -e "s/^path=//g")
6847 if [ $obj_file != $mntpt/$path ]; then
6848 echo "FAILED test_60a wrong obj path" \
6849 "$montpt/$path, should be $obj_file"
6856 #restart mgs before "error", otherwise it will block the next test
6857 stop mgs || error "stop mgs failed"
6858 start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
6859 $pass || error "test failed, see FAILED test_60a messages for specifics"
6861 run_test 60a "llog_test run from kernel module and test llog_reader"
6863 test_60b() { # bug 6411
6864 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6867 LLOG_COUNT=$(do_facet mgs dmesg |
6868 awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
6869 /llog_[a-z]*.c:[0-9]/ {
6881 [[ $LLOG_COUNT -gt 120 ]] &&
6882 error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
6884 run_test 60b "limit repeated messages from CERROR/CWARN"
6887 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6889 echo "create 5000 files"
6890 createmany -o $DIR/f60c- 5000
6891 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137
6892 lctl set_param fail_loc=0x80000137
6893 unlinkmany $DIR/f60c- 5000
6894 lctl set_param fail_loc=0
6896 run_test 60c "unlink file when mds full"
6899 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6901 SAVEPRINTK=$(lctl get_param -n printk)
6902 # verify "lctl mark" is even working"
6903 MESSAGE="test message ID $RANDOM $$"
6904 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6905 dmesg | grep -q "$MESSAGE" || error "didn't find debug marker in log"
6907 lctl set_param printk=0 || error "set lnet.printk failed"
6908 lctl get_param -n printk | grep emerg || error "lnet.printk dropped emerg"
6909 MESSAGE="new test message ID $RANDOM $$"
6910 # Assume here that libcfs_debug_mark_buffer() uses D_WARNING
6911 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6912 dmesg | grep -q "$MESSAGE" && error "D_WARNING wasn't masked" || true
6914 lctl set_param -n printk="$SAVEPRINTK"
6916 run_test 60d "test printk console message masking"
6919 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6920 remote_mds_nodsh && skip "remote MDS with nodsh"
6923 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
6924 do_facet mds1 lctl set_param fail_loc=0x15b
6927 run_test 60e "no space while new llog is being created"
6933 test_mkdir -c $MDSCOUNT $DIR/$tdir
6938 $LFS setdirstripe -i $(($index % $MDSCOUNT)) \
6939 -c $MDSCOUNT $DIR/$tdir/subdir$index \
6941 mkdir $DIR/$tdir/subdir$index 2>/dev/null
6942 rmdir $DIR/$tdir/subdir$index 2>/dev/null
6943 index=$((index + 1))
6949 for i in {0..100}; do
6950 # define OBD_FAIL_OSD_TXN_START 0x19a
6951 local index=$((i % MDSCOUNT + 1))
6953 do_facet mds$index $LCTL set_param fail_loc=0x8000019a \
6960 for i in $(seq $MDSCOUNT); do
6961 do_facet mds$i $LCTL set_param fail_loc=0 > /dev/null
6964 mkdir $DIR/$tdir/new || error "mkdir failed"
6965 rmdir $DIR/$tdir/new || error "rmdir failed"
6967 do_facet mds1 $LCTL lfsck_start -M $(facet_svc mds1) -A -C \
6969 for i in $(seq $MDSCOUNT); do
6970 wait_update_facet mds$i "$LCTL get_param -n \
6971 mdd.$(facet_svc mds$i).lfsck_namespace |
6972 awk '/^status/ { print \\\$2 }'" "completed"
6975 ls -R $DIR/$tdir || error "ls failed"
6976 rm -rf $DIR/$tdir || error "rmdir failed"
6978 run_test 60g "transaction abort won't cause MDT hung"
6981 [ $MDS1_VERSION -le $(version_code 2.12.52) ] &&
6982 skip "Need MDS version at least 2.12.52"
6983 [ $MDSCOUNT -lt 2 ] && skip "Need at least 2 MDTs"
6987 #define OBD_FAIL_MDS_STRIPE_CREATE 0x188
6988 #define OBD_FAIL_MDS_STRIPE_FID 0x189
6989 for fail_loc in 0x80000188 0x80000189; do
6990 do_facet mds1 "$LCTL set_param fail_loc=$fail_loc"
6991 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir-$fail_loc ||
6992 error "mkdir $dir-$fail_loc failed"
6993 for i in {0..10}; do
6994 # create may fail on missing stripe
6995 echo $i > $DIR/$tdir-$fail_loc/$i
6997 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6998 error "getdirstripe $tdir-$fail_loc failed"
6999 $LFS migrate -m 1 $DIR/$tdir-$fail_loc ||
7000 error "migrate $tdir-$fail_loc failed"
7001 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
7002 error "getdirstripe $tdir-$fail_loc failed"
7003 pushd $DIR/$tdir-$fail_loc
7005 echo $f | cmp $f - || error "$f data mismatch"
7008 rm -rf $DIR/$tdir-$fail_loc
7011 run_test 60h "striped directory with missing stripes can be accessed"
7014 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7017 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1 || error "dd $f failed"
7018 cancel_lru_locks osc
7019 $MULTIOP $f OSMWUc || error "$MULTIOP $f failed"
7022 run_test 61a "mmap() writes don't make sync hang ================"
7025 mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
7027 run_test 61b "mmap() of unstriped file is successful"
7029 # bug 2330 - insufficient obd_match error checking causes LBUG
7031 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7035 cancel_lru_locks osc
7036 lctl set_param fail_loc=0x405
7037 cat $f && error "cat succeeded, expect -EIO"
7038 lctl set_param fail_loc=0
7040 # This test is now irrelevant (as of bug 10718 inclusion), we no longer
7041 # match every page all of the time.
7042 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
7044 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
7045 # Though this test is irrelevant anymore, it helped to reveal some
7046 # other grant bugs (LU-4482), let's keep it.
7047 test_63a() { # was test_63
7048 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7050 MAX_DIRTY_MB=$(lctl get_param -n osc.*.max_dirty_mb | head -n 1)
7052 for i in `seq 10` ; do
7053 dd if=/dev/zero of=$DIR/f63 bs=8k &
7059 rm -f $DIR/f63 || true
7061 run_test 63a "Verify oig_wait interruption does not crash ======="
7063 # bug 2248 - async write errors didn't return to application on sync
7064 # bug 3677 - async write errors left page locked
7066 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7069 lctl set_param debug=-1
7071 # ensure we have a grant to do async writes
7072 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
7075 sync # sync lest earlier test intercept the fail_loc
7077 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
7078 lctl set_param fail_loc=0x80000406
7079 $MULTIOP $DIR/$tfile Owy && \
7080 error "sync didn't return ENOMEM"
7081 sync; sleep 2; sync # do a real sync this time to flush page
7082 lctl get_param -n llite.*.dump_page_cache | grep locked && \
7083 error "locked page left in cache after async error" || true
7086 run_test 63b "async write errors should be returned to fsync ==="
7089 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7092 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
7094 run_test 64a "verify filter grant calculations (in kernel) ====="
7097 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7099 sh oos.sh $MOUNT || error "oos.sh failed: $?"
7101 run_test 64b "check out-of-space detection on client"
7104 $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
7106 run_test 64c "verify grant shrink"
7108 # this does exactly what osc_request.c:osc_announce_cached() does in
7109 # order to calculate max amount of grants to ask from server
7113 local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc)
7114 local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight)
7116 ((rpc_in_flight ++));
7117 nrpages=$((nrpages * rpc_in_flight))
7119 local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb)
7121 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
7123 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
7124 local undirty=$((nrpages * PAGE_SIZE))
7126 local max_extent_pages
7127 max_extent_pages=$($LCTL get_param osc.${tgt}.import |
7128 grep grant_max_extent_size | awk '{print $2}')
7129 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
7130 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
7131 local grant_extent_tax
7132 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
7133 grep grant_extent_tax | awk '{print $2}')
7135 undirty=$((undirty + nrextents * grant_extent_tax))
7140 # this is size of unit for grant allocation. It should be equal to
7141 # what tgt_grant.c:tgt_grant_chunk() calculates
7145 local grant_extent_tax
7147 max_brw_size=$($LCTL get_param osc.${tgt}.import |
7148 grep max_brw_size | awk '{print $2}')
7150 grant_extent_tax=$($LCTL get_param osc.${tgt}.import |
7151 grep grant_extent_tax | awk '{print $2}')
7153 echo $(((max_brw_size + grant_extent_tax) * 2))
7157 [ $OST1_VERSION -lt $(version_code 2.10.56) ] &&
7158 skip "OST < 2.10.55 doesn't limit grants enough"
7160 local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}')
7161 local file=$DIR/$tfile
7163 [[ $($LCTL get_param osc.${tgt}.import |
7164 grep "connect_flags:.*grant_param") ]] ||
7165 skip "no grant_param connect flag"
7167 local olddebug=$($LCTL get_param -n debug 2> /dev/null)
7169 $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true
7171 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
7172 stack_trap "rm -f $file" EXIT
7174 $LFS setstripe $file -i 0 -c 1
7175 dd if=/dev/zero of=$file bs=1M count=1000 &
7180 local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes)
7181 if [[ $cur_grant -gt $max_cur_granted ]]
7184 error "cur_grant $cur_grant > $max_cur_granted"
7187 [[ $? -ne 0 ]] && break;
7192 wait_delete_completed
7193 $LCTL set_param debug="$olddebug" 2> /dev/null || true
7195 run_test 64d "check grant limit exceed"
7197 # bug 1414 - set/get directories' stripe info
7199 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7201 test_mkdir $DIR/$tdir
7203 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
7205 run_test 65a "directory with no stripe info"
7208 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7210 test_mkdir $DIR/$tdir
7211 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7213 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7216 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
7218 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
7221 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7222 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
7224 test_mkdir $DIR/$tdir
7225 local stripesize=$($LFS getstripe -S $DIR/$tdir)
7227 $LFS setstripe -S $((stripesize * 4)) -i 1 \
7228 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
7230 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
7232 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
7235 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7237 test_mkdir $DIR/$tdir
7238 local STRIPECOUNT=$($LFS getstripe -c $DIR/$tdir)
7239 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7241 if [[ $STRIPECOUNT -le 0 ]]; then
7243 elif [[ $STRIPECOUNT -gt $LOV_MAX_STRIPE_COUNT ]]; then
7244 [[ $OSTCOUNT -gt $LOV_MAX_STRIPE_COUNT ]] &&
7245 sc=$LOV_MAX_STRIPE_COUNT || sc=$(($OSTCOUNT - 1))
7247 sc=$(($STRIPECOUNT - 1))
7249 $LFS setstripe -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
7250 touch $DIR/$tdir/f4 $DIR/$tdir/f5
7251 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
7252 error "lverify failed"
7254 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
7257 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7259 test_mkdir $DIR/$tdir
7261 $LFS setstripe $DIR/$tdir || error "setstripe"
7262 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7263 error "no stripe info failed"
7265 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
7267 run_test 65e "directory setstripe defaults"
7270 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7272 test_mkdir $DIR/${tdir}f
7273 $RUNAS $LFS setstripe $DIR/${tdir}f &&
7274 error "setstripe succeeded" || true
7276 run_test 65f "dir setstripe permission (should return error) ==="
7279 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7281 test_mkdir $DIR/$tdir
7282 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7284 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7285 error "setstripe -S failed"
7286 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
7287 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7288 error "delete default stripe failed"
7290 run_test 65g "directory setstripe -d"
7293 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7295 test_mkdir $DIR/$tdir
7296 local STRIPESIZE=$($LFS getstripe -S $DIR/$tdir)
7298 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7299 error "setstripe -S failed"
7300 test_mkdir $DIR/$tdir/dd1
7301 [ $($LFS getstripe -c $DIR/$tdir) = $($LFS getstripe -c $DIR/$tdir/dd1) ] ||
7302 error "stripe info inherit failed"
7304 run_test 65h "directory stripe info inherit ===================="
7307 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7309 save_layout_restore_at_exit $MOUNT
7311 # bug6367: set non-default striping on root directory
7312 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
7314 # bug12836: getstripe on -1 default directory striping
7315 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
7317 # bug12836: getstripe -v on -1 default directory striping
7318 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
7320 # bug12836: new find on -1 default directory striping
7321 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
7323 run_test 65i "various tests to set root directory striping"
7325 test_65j() { # bug6367
7326 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7330 # if we aren't already remounting for each test, do so for this test
7331 if [ "$I_MOUNTED" = "yes" ]; then
7332 cleanup || error "failed to unmount"
7336 save_layout_restore_at_exit $MOUNT
7338 $LFS setstripe -d $MOUNT || error "setstripe failed"
7340 run_test 65j "set default striping on root directory (bug 6367)="
7344 wait_delete_completed
7345 do_facet $SINGLEMDS "lctl set_param -n \
7346 osp.$ost*MDT0000.max_create_count=$max_count"
7347 do_facet $SINGLEMDS "lctl set_param -n \
7348 osp.$ost*MDT0000.create_count=$count"
7349 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7350 echo $INACTIVE_OSC "is Activate"
7352 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7355 test_65k() { # bug11679
7356 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7357 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7358 remote_mds_nodsh && skip "remote MDS with nodsh"
7360 local disable_precreate=true
7361 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
7362 disable_precreate=false
7364 echo "Check OST status: "
7365 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
7366 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
7368 for OSC in $MDS_OSCS; do
7369 echo $OSC "is active"
7370 do_facet $SINGLEMDS lctl --device %$OSC activate
7373 for INACTIVE_OSC in $MDS_OSCS; do
7374 local ost=$(osc_to_ost $INACTIVE_OSC)
7375 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
7376 lov.*md*.target_obd |
7377 awk -F: /$ost/'{ print $1 }' | head -n 1)
7380 $LFS setstripe -i $ostnum -c 1 $DIR/$tdir
7381 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
7383 echo "Deactivate: " $INACTIVE_OSC
7384 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
7386 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
7387 osp.$ost*MDT0000.create_count")
7388 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
7389 osp.$ost*MDT0000.max_create_count")
7390 $disable_precreate &&
7391 do_facet $SINGLEMDS "lctl set_param -n \
7392 osp.$ost*MDT0000.max_create_count=0"
7394 for idx in $(seq 0 $((OSTCOUNT - 1))); do
7395 [ -f $DIR/$tdir/$idx ] && continue
7396 echo "$LFS setstripe -i $idx -c 1 $DIR/$tdir/$idx"
7397 $LFS setstripe -i $idx -c 1 $DIR/$tdir/$idx ||
7399 error "setstripe $idx should succeed"; }
7400 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
7402 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
7405 do_facet $SINGLEMDS "lctl set_param -n \
7406 osp.$ost*MDT0000.max_create_count=$max_count"
7407 do_facet $SINGLEMDS "lctl set_param -n \
7408 osp.$ost*MDT0000.create_count=$count"
7409 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7410 echo $INACTIVE_OSC "is Activate"
7412 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7415 run_test 65k "validate manual striping works properly with deactivated OSCs"
7417 test_65l() { # bug 12836
7418 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7420 test_mkdir -p $DIR/$tdir/test_dir
7421 $LFS setstripe -c -1 $DIR/$tdir/test_dir
7422 $LFS find -mtime -1 $DIR/$tdir >/dev/null
7424 run_test 65l "lfs find on -1 stripe dir ========================"
7427 local layout=$(save_layout $MOUNT)
7428 $RUNAS $LFS setstripe -c 2 $MOUNT && {
7429 restore_layout $MOUNT $layout
7430 error "setstripe should fail by non-root users"
7434 run_test 65m "normal user can't set filesystem default stripe"
7437 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
7438 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.50) ]] ||
7439 skip "Need MDS version at least 2.12.50"
7440 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7442 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7443 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7444 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7446 local root_layout=$(save_layout $MOUNT)
7447 stack_trap "restore_layout $MOUNT $root_layout" EXIT
7449 # new subdirectory under root directory should not inherit
7450 # the default layout from root
7451 local dir1=$MOUNT/$tdir-1
7452 mkdir $dir1 || error "mkdir $dir1 failed"
7453 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7454 error "$dir1 shouldn't have LOV EA"
7456 # delete the default layout on root directory
7457 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7459 local dir2=$MOUNT/$tdir-2
7460 mkdir $dir2 || error "mkdir $dir2 failed"
7461 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7462 error "$dir2 shouldn't have LOV EA"
7464 # set a new striping pattern on root directory
7465 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7466 local new_def_stripe_size=$((def_stripe_size * 2))
7467 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7468 error "set stripe size on $MOUNT failed"
7470 # new file created in $dir2 should inherit the new stripe size from
7471 # the filesystem default
7472 local file2=$dir2/$tfile-2
7473 touch $file2 || error "touch $file2 failed"
7475 local file2_stripe_size=$($LFS getstripe -S $file2)
7476 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7477 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7479 local dir3=$MOUNT/$tdir-3
7480 mkdir $dir3 || error "mkdir $dir3 failed"
7481 ! getfattr -n trusted.lov $dir3 &> /dev/null ||
7482 error "$dir3 shouldn't have LOV EA"
7484 # set OST pool on root directory
7485 local pool=$TESTNAME
7486 pool_add $pool || error "add $pool failed"
7487 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7488 error "add targets to $pool failed"
7490 $LFS setstripe -p $pool $MOUNT ||
7491 error "set OST pool on $MOUNT failed"
7493 # new file created in $dir3 should inherit the pool from
7494 # the filesystem default
7495 local file3=$dir3/$tfile-3
7496 touch $file3 || error "touch $file3 failed"
7498 local file3_pool=$($LFS getstripe -p $file3)
7499 [[ "$file3_pool" = "$pool" ]] ||
7500 error "$file3 didn't inherit OST pool $pool"
7502 local dir4=$MOUNT/$tdir-4
7503 mkdir $dir4 || error "mkdir $dir4 failed"
7504 ! getfattr -n trusted.lov $dir4 &> /dev/null ||
7505 error "$dir4 shouldn't have LOV EA"
7507 # new file created in $dir4 should inherit the pool from
7508 # the filesystem default
7509 local file4=$dir4/$tfile-4
7510 touch $file4 || error "touch $file4 failed"
7512 local file4_pool=$($LFS getstripe -p $file4)
7513 [[ "$file4_pool" = "$pool" ]] ||
7514 error "$file4 didn't inherit OST pool $pool"
7516 # new subdirectory under non-root directory should inherit
7517 # the default layout from its parent directory
7518 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7519 error "set directory layout on $dir4 failed"
7521 local dir5=$dir4/$tdir-5
7522 mkdir $dir5 || error "mkdir $dir5 failed"
7524 local dir4_layout=$(get_layout_param $dir4)
7525 local dir5_layout=$(get_layout_param $dir5)
7526 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7527 error "$dir5 should inherit the default layout from $dir4"
7529 run_test 65n "don't inherit default layout from root for new subdirectories"
7531 # bug 2543 - update blocks count on client
7533 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7536 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7537 sync; sync_all_data; sync; sync_all_data
7538 cancel_lru_locks osc
7539 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7540 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7542 run_test 66 "update inode blocks count on client ==============="
7545 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7549 swapon -s | awk '($1 == "'$1'") { print $4 }'
7552 # bug5265, obdfilter oa2dentry return -ENOENT
7553 # #define OBD_FAIL_SRV_ENOENT 0x217
7555 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7556 remote_ost_nodsh && skip "remote OST with nodsh"
7559 $LFS setstripe -c 1 -i 0 $f
7561 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
7563 do_facet ost1 lctl set_param fail_loc=0x217
7564 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
7565 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
7567 do_facet ost1 lctl set_param fail_loc=0
7568 $DIRECTIO write $f 0 2 || error "write error"
7570 cancel_lru_locks osc
7571 $DIRECTIO read $f 0 1 || error "read error"
7573 do_facet ost1 lctl set_param fail_loc=0x217
7574 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
7576 do_facet ost1 lctl set_param fail_loc=0
7579 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
7582 test_mkdir $DIR/$tdir
7583 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
7584 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
7586 run_test 71 "Running dbench on lustre (don't segment fault) ===="
7588 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
7589 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7590 [ "$RUNAS_ID" = "$UID" ] &&
7591 skip_env "RUNAS_ID = UID = $UID -- skipping"
7592 # Check that testing environment is properly set up. Skip if not
7593 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
7594 skip_env "User $RUNAS_ID does not exist - skipping"
7597 chmod 777 $DIR/$tfile
7598 chmod ug+s $DIR/$tfile
7599 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
7600 error "$RUNAS dd $DIR/$tfile failed"
7601 # See if we are still setuid/sgid
7602 [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] &&
7603 error "S/gid is not dropped on write"
7604 # Now test that MDS is updated too
7605 cancel_lru_locks mdc
7606 [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] &&
7607 error "S/gid is not dropped on MDS"
7610 run_test 72a "Test that remove suid works properly (bug5695) ===="
7612 test_72b() { # bug 24226 -- keep mode setting when size is not changing
7615 [ "$RUNAS_ID" = "$UID" ] &&
7616 skip_env "RUNAS_ID = UID = $UID -- skipping"
7617 [ "$RUNAS_ID" -eq 0 ] &&
7618 skip_env "RUNAS_ID = 0 -- skipping"
7619 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7620 # Check that testing environment is properly set up. Skip if not
7621 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
7622 skip_env "User $RUNAS_ID does not exist - skipping"
7624 touch $DIR/${tfile}-f{g,u}
7625 test_mkdir $DIR/${tfile}-dg
7626 test_mkdir $DIR/${tfile}-du
7627 chmod 770 $DIR/${tfile}-{f,d}{g,u}
7628 chmod g+s $DIR/${tfile}-{f,d}g
7629 chmod u+s $DIR/${tfile}-{f,d}u
7630 for perm in 777 2777 4777; do
7631 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
7632 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
7633 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
7634 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
7638 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
7640 # bug 3462 - multiple simultaneous MDC requests
7642 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7644 test_mkdir $DIR/d73-1
7645 test_mkdir $DIR/d73-2
7646 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
7649 lctl set_param fail_loc=0x80000129
7650 $MULTIOP $DIR/d73-1/f73-2 Oc &
7652 lctl set_param fail_loc=0
7654 $MULTIOP $DIR/d73-2/f73-3 Oc &
7658 wait $pid1 || return 1
7662 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
7663 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
7664 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
7668 run_test 73 "multiple MDC requests (should not deadlock)"
7670 test_74a() { # bug 6149, 6184
7671 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7674 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7676 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7677 # will spin in a tight reconnection loop
7678 $LCTL set_param fail_loc=0x8000030e
7679 # get any lock that won't be difficult - lookup works.
7681 $LCTL set_param fail_loc=0
7685 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
7687 test_74b() { # bug 13310
7688 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7690 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7692 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7693 # will spin in a tight reconnection loop
7694 $LCTL set_param fail_loc=0x8000030e
7695 # get a "difficult" lock
7697 $LCTL set_param fail_loc=0
7701 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
7704 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7706 #define OBD_FAIL_LDLM_NEW_LOCK
7707 $LCTL set_param fail_loc=0x319
7708 touch $DIR/$tfile && error "touch successful"
7709 $LCTL set_param fail_loc=0
7712 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
7715 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
7718 test_76() { # Now for bug 20433, added originally in bug 1443
7719 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7721 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
7723 cancel_lru_locks osc
7724 BEFORE_INODES=$(num_inodes)
7725 echo "before inodes: $BEFORE_INODES"
7727 [ "$SLOW" = "no" ] && COUNT=100
7728 for i in $(seq $COUNT); do
7732 cancel_lru_locks osc
7733 AFTER_INODES=$(num_inodes)
7734 echo "after inodes: $AFTER_INODES"
7736 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
7738 AFTER_INODES=$(num_inodes)
7740 echo "wait $wait seconds inodes: $AFTER_INODES"
7741 if [ $wait -gt 30 ]; then
7742 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
7746 run_test 76 "confirm clients recycle inodes properly ===="
7752 # Note: in sptlrpc modes which enable its own bulk checksum, the
7753 # original crc32_le bulk checksum will be automatically disabled,
7754 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
7755 # will be checked by sptlrpc code against sptlrpc bulk checksum.
7756 # In this case set_checksums() will not be no-op, because sptlrpc
7757 # bulk checksum will be enabled all through the test.
7759 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
7760 lctl set_param -n osc.*.checksums $1
7764 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7765 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
7766 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7767 tr -d [] | head -n1)}
7770 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
7772 log "set checksum type to $1, rc = $rc"
7776 get_osc_checksum_type()
7778 # arugment 1: OST name, like OST0000
7780 checksum_type=$(lctl get_param -n osc.*${ost}-osc-[^mM]*.checksum_type |
7781 sed 's/.*\[\(.*\)\].*/\1/g')
7783 [ $rc -ne 0 ] && error "failed to get checksum type of $ost, rc = $rc, output = $checksum_type"
7787 F77_TMP=$TMP/f77-temp
7790 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
7791 error "error writing to $F77_TMP"
7794 test_77a() { # bug 10889
7795 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7796 $GSS && skip_env "could not run with gss"
7798 [ ! -f $F77_TMP ] && setup_f77
7800 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
7804 run_test 77a "normal checksum read/write operation"
7806 test_77b() { # bug 10889
7807 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7808 $GSS && skip_env "could not run with gss"
7810 [ ! -f $F77_TMP ] && setup_f77
7811 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7812 $LCTL set_param fail_loc=0x80000409
7815 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7816 error "dd error: $?"
7817 $LCTL set_param fail_loc=0
7819 for algo in $CKSUM_TYPES; do
7820 cancel_lru_locks osc
7821 set_checksum_type $algo
7822 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7823 $LCTL set_param fail_loc=0x80000408
7824 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
7825 $LCTL set_param fail_loc=0
7828 set_checksum_type $ORIG_CSUM_TYPE
7831 run_test 77b "checksum error on client write, read"
7836 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
7838 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
7839 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
7840 $check_ost && [ -n "$ost_file_prefix" ] &&
7841 do_facet ost1 rm -f ${ost_file_prefix}\*
7845 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7846 $GSS && skip_env "could not run with gss"
7847 remote_ost_nodsh && skip "remote OST with nodsh"
7850 local osc_file_prefix
7852 local check_ost=false
7853 local ost_file_prefix
7859 # ensure corruption will occur on first OSS/OST
7860 $LFS setstripe -i 0 $DIR/$tfile
7862 [ ! -f $F77_TMP ] && setup_f77
7863 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7864 error "dd write error: $?"
7865 fid=$($LFS path2fid $DIR/$tfile)
7867 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
7870 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
7871 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
7873 echo "OSS do not support bulk pages dump upon error"
7876 osc_file_prefix=$($LCTL get_param -n debug_path)
7877 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
7879 trap cleanup_77c EXIT
7882 # enable bulk pages dump upon error on Client
7883 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
7884 # enable bulk pages dump upon error on OSS
7886 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
7888 # flush Client cache to allow next read to reach OSS
7889 cancel_lru_locks osc
7891 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7892 $LCTL set_param fail_loc=0x80000408
7893 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
7894 $LCTL set_param fail_loc=0
7898 # check cksum dump on Client
7899 osc_file=$(ls ${osc_file_prefix}*)
7900 [ -n "$osc_file" ] || error "no checksum dump file on Client"
7901 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
7902 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
7903 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
7904 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
7906 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
7907 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7908 error "dump content does not match on Client"
7910 $check_ost || skip "No need to check cksum dump on OSS"
7912 # check cksum dump on OSS
7913 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
7914 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
7915 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
7916 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
7917 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7918 error "dump content does not match on OSS"
7922 run_test 77c "checksum error on client read with debug"
7924 test_77d() { # bug 10889
7925 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7926 $GSS && skip_env "could not run with gss"
7928 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7929 $LCTL set_param fail_loc=0x80000409
7931 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7932 error "direct write: rc=$?"
7933 $LCTL set_param fail_loc=0
7936 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7937 $LCTL set_param fail_loc=0x80000408
7939 cancel_lru_locks osc
7940 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7941 error "direct read: rc=$?"
7942 $LCTL set_param fail_loc=0
7945 run_test 77d "checksum error on OST direct write, read"
7947 test_77f() { # bug 10889
7948 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7949 $GSS && skip_env "could not run with gss"
7952 for algo in $CKSUM_TYPES; do
7953 cancel_lru_locks osc
7954 set_checksum_type $algo
7955 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7956 $LCTL set_param fail_loc=0x409
7957 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
7958 error "direct write succeeded"
7959 $LCTL set_param fail_loc=0
7961 set_checksum_type $ORIG_CSUM_TYPE
7964 run_test 77f "repeat checksum error on write (expect error)"
7966 test_77g() { # bug 10889
7967 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7968 $GSS && skip_env "could not run with gss"
7969 remote_ost_nodsh && skip "remote OST with nodsh"
7971 [ ! -f $F77_TMP ] && setup_f77
7973 local file=$DIR/$tfile
7974 stack_trap "rm -f $file" EXIT
7976 $LFS setstripe -c 1 -i 0 $file
7977 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
7978 do_facet ost1 lctl set_param fail_loc=0x8000021a
7980 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
7981 error "write error: rc=$?"
7982 do_facet ost1 lctl set_param fail_loc=0
7985 cancel_lru_locks osc
7986 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
7987 do_facet ost1 lctl set_param fail_loc=0x8000021b
7989 cmp $F77_TMP $file || error "file compare failed"
7990 do_facet ost1 lctl set_param fail_loc=0
7993 run_test 77g "checksum error on OST write, read"
7995 test_77k() { # LU-10906
7996 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7997 $GSS && skip_env "could not run with gss"
7999 local cksum_param="osc.$FSNAME*.checksums"
8000 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
8004 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
8005 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
8006 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
8010 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
8011 error "failed to set checksum=$i on MGS"
8012 wait_update $HOSTNAME "$get_checksum" $i
8014 echo "remount client, checksum should be $i"
8015 remount_client $MOUNT || "failed to remount client"
8016 checksum=$(eval $get_checksum)
8017 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
8019 # remove persistent param to avoid races with checksum mountopt below
8020 do_facet mgs $LCTL set_param -P -d $cksum_param ||
8021 error "failed to delete checksum on MGS"
8023 for opt in "checksum" "nochecksum"; do
8024 #remount with mount option
8025 echo "remount client with option $opt, checksum should be $i"
8026 umount_client $MOUNT || "failed to umount client"
8027 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
8028 "failed to mount client with option '$opt'"
8029 checksum=$(eval $get_checksum)
8030 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
8034 remount_client $MOUNT || "failed to remount client"
8036 run_test 77k "enable/disable checksum correctly"
8039 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8040 $GSS && skip_env "could not run with gss"
8043 stack_trap "set_checksums $ORIG_CSUM" EXIT
8044 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
8046 set_checksum_type invalid && error "unexpected success of invalid checksum type"
8048 $LFS setstripe -c 1 -i 0 $DIR/$tfile
8049 for algo in $CKSUM_TYPES; do
8050 set_checksum_type $algo || error "fail to set checksum type $algo"
8051 osc_algo=$(get_osc_checksum_type OST0000)
8052 [ "$osc_algo" != "$algo" ] && error "checksum type is $osc_algo after setting it to $algo"
8054 # no locks, no reqs to let the connection idle
8055 cancel_lru_locks osc
8056 lru_resize_disable osc
8057 wait_osc_import_state client ost1 IDLE
8059 # ensure ost1 is connected
8060 stat $DIR/$tfile >/dev/null || error "can't stat"
8061 wait_osc_import_state client ost1 FULL
8063 osc_algo=$(get_osc_checksum_type OST0000)
8064 [ "$osc_algo" != "$algo" ] && error "checksum type changed from $algo to $osc_algo after reconnection"
8068 run_test 77l "preferred checksum type is remembered after reconnected"
8070 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
8079 test_78() { # bug 10901
8080 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8081 remote_ost || skip_env "local OST"
8084 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
8085 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
8086 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
8087 echo "MemTotal: $MEMTOTAL"
8089 # reserve 256MB of memory for the kernel and other running processes,
8090 # and then take 1/2 of the remaining memory for the read/write buffers.
8091 if [ $MEMTOTAL -gt 512 ] ;then
8092 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
8094 # for those poor memory-starved high-end clusters...
8095 MEMTOTAL=$((MEMTOTAL / 2))
8097 echo "Mem to use for directio: $MEMTOTAL"
8099 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
8100 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
8101 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
8102 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
8104 echo "Smallest OST: $SMALLESTOST"
8105 [[ $SMALLESTOST -lt 10240 ]] &&
8106 skip "too small OSTSIZE, useless to run large O_DIRECT test"
8108 trap cleanup_test_78 EXIT
8110 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
8111 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
8113 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
8114 echo "File size: $F78SIZE"
8115 $LFS setstripe -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
8116 for i in $(seq 1 $NSEQ); do
8117 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
8118 echo directIO rdwr round $i of $NSEQ
8119 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
8124 run_test 78 "handle large O_DIRECT writes correctly ============"
8126 test_79() { # bug 12743
8127 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8129 wait_delete_completed
8131 BKTOTAL=$(calc_osc_kbytes kbytestotal)
8132 BKFREE=$(calc_osc_kbytes kbytesfree)
8133 BKAVAIL=$(calc_osc_kbytes kbytesavail)
8135 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
8136 DFTOTAL=`echo $STRING | cut -d, -f1`
8137 DFUSED=`echo $STRING | cut -d, -f2`
8138 DFAVAIL=`echo $STRING | cut -d, -f3`
8139 DFFREE=$(($DFTOTAL - $DFUSED))
8141 ALLOWANCE=$((64 * $OSTCOUNT))
8143 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
8144 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
8145 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
8147 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
8148 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
8149 error "df free($DFFREE) mismatch OST free($BKFREE)"
8151 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
8152 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
8153 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
8156 run_test 79 "df report consistency check ======================="
8158 test_80() { # bug 10718
8159 remote_ost_nodsh && skip "remote OST with nodsh"
8160 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8162 # relax strong synchronous semantics for slow backends like ZFS
8163 local soc="obdfilter.*.sync_on_lock_cancel"
8164 local soc_old=$(do_facet ost1 lctl get_param -n $soc | head -n1)
8166 if [ "$soc_old" != "never" ] &&
8167 [ "$ost1_FSTYPE" != "ldiskfs" ]; then
8168 hosts=$(for host in $(seq -f "ost%g" 1 $OSTCOUNT); do
8169 facet_active_host $host; done | sort -u)
8170 do_nodes $hosts lctl set_param $soc=never
8173 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
8175 local BEFORE=`date +%s`
8176 cancel_lru_locks osc
8177 local AFTER=`date +%s`
8178 local DIFF=$((AFTER-BEFORE))
8179 if [ $DIFF -gt 1 ] ; then
8180 error "elapsed for 1M@1T = $DIFF"
8183 [ -n "$hosts" ] && do_nodes $hosts lctl set_param $soc=$soc_old
8187 run_test 80 "Page eviction is equally fast at high offsets too ===="
8189 test_81a() { # LU-456
8190 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8191 remote_ost_nodsh && skip "remote OST with nodsh"
8193 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8194 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
8195 do_facet ost1 lctl set_param fail_loc=0x80000228
8197 # write should trigger a retry and success
8198 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8199 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8201 if [ $RC -ne 0 ] ; then
8202 error "write should success, but failed for $RC"
8205 run_test 81a "OST should retry write when get -ENOSPC ==============="
8207 test_81b() { # LU-456
8208 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8209 remote_ost_nodsh && skip "remote OST with nodsh"
8211 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8212 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
8213 do_facet ost1 lctl set_param fail_loc=0x228
8215 # write should retry several times and return -ENOSPC finally
8216 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8217 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8220 if [ $RC -ne $ENOSPC ] ; then
8221 error "dd should fail for -ENOSPC, but succeed."
8224 run_test 81b "OST should return -ENOSPC when retry still fails ======="
8226 test_82() { # LU-1031
8227 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
8231 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
8233 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
8235 kill -USR1 $MULTIPID2
8237 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
8238 error "First grouplock does not block second one"
8240 echo "Second grouplock blocks first one"
8242 kill -USR1 $MULTIPID1
8246 run_test 82 "Basic grouplock test"
8249 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
8251 test_mkdir $DIR/$tdir.cvsroot
8252 chown $RUNAS_ID $DIR/$tdir.cvsroot
8255 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
8258 # some versions of cvs import exit(1) when asked to import links or
8259 # files they can't read. ignore those files.
8260 local toignore=$(find . -type l -printf '-I %f\n' -o \
8261 ! -perm /4 -printf '-I %f\n')
8262 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
8263 $tdir.reposname vtag rtag
8266 test_mkdir $DIR/$tdir.reposname
8267 chown $RUNAS_ID $DIR/$tdir.reposname
8268 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
8270 cd $DIR/$tdir.reposname
8272 $RUNAS cvs add -m 'addmsg' foo99
8274 $RUNAS cvs commit -m 'nomsg' foo99
8275 rm -fr $DIR/$tdir.cvsroot
8277 run_test 99 "cvs strange file/directory operations"
8280 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8281 [[ "$NETTYPE" =~ tcp ]] ||
8282 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
8283 remote_ost_nodsh && skip "remote OST with nodsh"
8284 remote_mds_nodsh && skip "remote MDS with nodsh"
8286 skip "useless for local single node setup"
8288 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
8289 [ "$PROT" != "tcp" ] && continue
8290 RPORT=$(echo $REMOTE | cut -d: -f2)
8291 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
8294 LPORT=`echo $LOCAL | cut -d: -f2`
8295 if [ $LPORT -ge 1024 ]; then
8296 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
8298 error_exit "local: $LPORT > 1024, remote: $RPORT"
8301 [ "$rc" = 0 ] || error_exit "privileged port not found" )
8303 run_test 100 "check local port using privileged port ==========="
8305 function get_named_value()
8314 echo $line | sed "s/^$tag[ ]*//"
8321 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
8322 awk '/^max_cached_mb/ { print $2 }')
8325 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
8330 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8331 [ $MDSCOUNT -ge 2 ] && skip_env "needs < 2 MDTs" #LU-4322
8336 local cache_limit=32
8338 $LCTL set_param -n osc.*-osc*.rpc_stats 0
8339 trap cleanup_101a EXIT
8340 $LCTL set_param -n llite.*.read_ahead_stats 0
8341 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
8344 # randomly read 10000 of 64K chunks from file 3x 32MB in size
8346 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
8347 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
8350 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
8351 get_named_value 'read but discarded' | cut -d" " -f1); do
8352 discard=$(($discard + $s))
8356 if [[ $(($discard * 10)) -gt $nreads ]]; then
8357 $LCTL get_param osc.*-osc*.rpc_stats
8358 $LCTL get_param llite.*.read_ahead_stats
8359 error "too many ($discard) discarded pages"
8361 rm -f $DIR/$tfile || true
8363 run_test 101a "check read-ahead for random reads"
8366 test_mkdir $DIR/$tdir
8368 local FILE_LENGTH=$2
8371 local FILE_SIZE_MB=$((FILE_LENGTH / ssize))
8373 local list=$(comma_list $(osts_nodes))
8374 set_osd_param $list '' read_cache_enable 0
8375 set_osd_param $list '' writethrough_cache_enable 0
8377 trap cleanup_test101bc EXIT
8378 # prepare the read-ahead file
8379 $LFS setstripe -S $ssize -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
8381 dd if=/dev/zero of=$DIR/$tfile bs=$ssize \
8382 count=$FILE_SIZE_MB 2> /dev/null
8386 cleanup_test101bc() {
8391 local list=$(comma_list $(osts_nodes))
8392 set_osd_param $list '' read_cache_enable 1
8393 set_osd_param $list '' writethrough_cache_enable 1
8397 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
8402 local STRIPE_SIZE=$2
8403 local FILE_LENGTH=$3
8404 local RA_INC=1048576
8405 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
8406 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
8407 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
8408 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
8409 get_named_value 'read but discarded' |
8410 cut -d" " -f1 | calc_total)
8411 if [[ $DISCARD -gt $discard_limit ]]; then
8412 $LCTL get_param llite.*.read_ahead_stats
8413 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
8415 echo "Read-ahead success for size ${READ_SIZE}"
8420 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8421 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8423 local STRIPE_SIZE=1048576
8424 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
8426 if [ $SLOW == "yes" ]; then
8427 local FILE_LENGTH=$((STRIDE_SIZE * 64))
8429 local FILE_LENGTH=$((STRIDE_SIZE * 8))
8432 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
8434 # prepare the read-ahead file
8435 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8436 cancel_lru_locks osc
8437 for BIDX in 2 4 8 16 32 64 128 256
8439 local BSIZE=$((BIDX*4096))
8440 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
8441 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
8442 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
8443 $LCTL set_param -n llite.*.read_ahead_stats 0
8444 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
8445 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
8446 cancel_lru_locks osc
8447 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
8452 run_test 101b "check stride-io mode read-ahead ================="
8455 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8457 local STRIPE_SIZE=1048576
8458 local FILE_LENGTH=$((STRIPE_SIZE*100))
8463 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8465 cancel_lru_locks osc
8466 $LCTL set_param osc.*.rpc_stats 0
8467 $READS -f $DIR/$tfile -s$FILE_LENGTH -b$rsize -n$nreads -t 180
8468 $LCTL get_param osc.*.rpc_stats
8469 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8470 local stats=$($LCTL get_param -n $osc_rpc_stats)
8471 local lines=$(echo "$stats" | awk 'END {print NR;}')
8474 if [ $lines -le 20 ]; then
8475 echo "continue debug"
8478 for size in 1 2 4 8; do
8479 local rpc=$(echo "$stats" |
8480 awk '($1 == "'$size':") {print $2; exit; }')
8481 [ $rpc != 0 ] && ((size * PAGE_SIZE < rsize)) &&
8482 error "Small $((size*PAGE_SIZE)) read IO $rpc!"
8484 echo "$osc_rpc_stats check passed!"
8489 run_test 101c "check stripe_size aligned read-ahead ================="
8492 $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
8493 $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
8497 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8499 local file=$DIR/$tfile
8500 local sz_MB=${FILESIZE_101d:-500}
8501 local ra_MB=${READAHEAD_MB:-40}
8503 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8504 [ $free_MB -lt $sz_MB ] &&
8505 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8507 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8508 $LFS setstripe -c -1 $file || error "setstripe failed"
8510 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8511 echo Cancel LRU locks on lustre client to flush the client cache
8512 cancel_lru_locks osc
8514 echo Disable read-ahead
8515 local old_READAHEAD=$(set_read_ahead 0)
8517 echo Reading the test file $file with read-ahead disabled
8518 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8520 echo Cancel LRU locks on lustre client to flush the client cache
8521 cancel_lru_locks osc
8522 echo Enable read-ahead with ${ra_MB}MB
8523 set_read_ahead $ra_MB
8525 echo Reading the test file $file with read-ahead enabled
8526 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8528 echo "read-ahead disabled time read $raOFF"
8529 echo "read-ahead enabled time read $raON"
8531 set_read_ahead $old_READAHEAD
8533 wait_delete_completed
8535 [ $raOFF -le 1 ] || [ $raON -lt $raOFF ] ||
8536 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8538 run_test 101d "file read with and without read-ahead enabled"
8541 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8543 local file=$DIR/$tfile
8544 local size_KB=500 #KB
8548 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8549 local need_KB=$((count * size_KB))
8550 [[ $free_KB -le $need_KB ]] &&
8551 skip_env "Need free space $need_KB, have $free_KB"
8553 echo "Creating $count ${size_KB}K test files"
8554 for ((i = 0; i < $count; i++)); do
8555 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8558 echo "Cancel LRU locks on lustre client to flush the client cache"
8559 cancel_lru_locks $OSC
8561 echo "Reset readahead stats"
8562 $LCTL set_param -n llite.*.read_ahead_stats 0
8564 for ((i = 0; i < $count; i++)); do
8565 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
8568 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8569 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8571 for ((i = 0; i < $count; i++)); do
8572 rm -rf $file.$i 2>/dev/null
8575 #10000 means 20% reads are missing in readahead
8576 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
8578 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
8581 which iozone || skip_env "no iozone installed"
8583 local old_debug=$($LCTL get_param debug)
8584 old_debug=${old_debug#*=}
8585 $LCTL set_param debug="reada mmap"
8587 # create a test file
8588 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
8590 echo Cancel LRU locks on lustre client to flush the client cache
8591 cancel_lru_locks osc
8593 echo Reset readahead stats
8594 $LCTL set_param -n llite.*.read_ahead_stats 0
8596 echo mmap read the file with small block size
8597 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
8600 echo checking missing pages
8601 $LCTL get_param llite.*.read_ahead_stats
8602 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8603 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8605 $LCTL set_param debug="$old_debug"
8606 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
8609 run_test 101f "check mmap read performance"
8611 test_101g_brw_size_test() {
8613 local pages=$((mb * 1048576 / PAGE_SIZE))
8614 local file=$DIR/$tfile
8616 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
8617 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
8618 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
8619 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
8623 stack_trap "rm -f $file" EXIT
8624 $LCTL set_param -n osc.*.rpc_stats=0
8626 # 10 RPCs should be enough for the test
8628 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
8629 { error "dd write ${mb} MB blocks failed"; return 3; }
8630 cancel_lru_locks osc
8631 dd of=/dev/null if=$file bs=${mb}M count=$count ||
8632 { error "dd write ${mb} MB blocks failed"; return 4; }
8634 # calculate number of full-sized read and write RPCs
8635 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
8636 sed -n '/pages per rpc/,/^$/p' |
8637 awk '/'$pages':/ { reads += $2; writes += $6 }; \
8638 END { print reads,writes }'))
8639 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
8641 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
8648 remote_ost_nodsh && skip "remote OST with nodsh"
8651 local osts=$(get_facets OST)
8652 local list=$(comma_list $(osts_nodes))
8653 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
8654 local brw_size="obdfilter.*.brw_size"
8656 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8658 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
8660 if { [ $OST1_VERSION -ge $(version_code 2.8.52) ] ||
8661 { [ $OST1_VERSION -ge $(version_code 2.7.17) ] &&
8662 [ $OST1_VERSION -lt $(version_code 2.7.50) ]; }; } &&
8663 { [ $CLIENT_VERSION -ge $(version_code 2.8.52) ] ||
8664 { [ $CLIENT_VERSION -ge $(version_code 2.7.17) ] &&
8665 [ $CLIENT_VERSION -lt $(version_code 2.7.50) ]; }; }; then
8667 [ $OST1_VERSION -ge $(version_code 2.9.52) ] &&
8670 if [[ $orig_mb -lt 16 ]]; then
8671 save_lustre_params $osts "$brw_size" > $p
8672 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
8673 error "set 16MB RPC size failed"
8675 echo "remount client to enable new RPC size"
8676 remount_client $MOUNT || error "remount_client failed"
8679 test_101g_brw_size_test 16 || error "16MB RPC test failed"
8680 # should be able to set brw_size=12, but no rpc_stats for that
8681 test_101g_brw_size_test 8 || error "8MB RPC test failed"
8684 test_101g_brw_size_test 4 || error "4MB RPC test failed"
8686 if [[ $orig_mb -lt 16 ]]; then
8687 restore_lustre_params < $p
8688 remount_client $MOUNT || error "remount_client restore failed"
8691 rm -f $p $DIR/$tfile
8693 run_test 101g "Big bulk(4/16 MiB) readahead"
8696 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8698 dd if=/dev/zero of=$DIR/$tfile bs=1M count=70 ||
8699 error "dd 70M file failed"
8700 echo Cancel LRU locks on lustre client to flush the client cache
8701 cancel_lru_locks osc
8703 echo "Reset readahead stats"
8704 $LCTL set_param -n llite.*.read_ahead_stats 0
8706 echo "Read 10M of data but cross 64M bundary"
8707 dd if=$DIR/$tfile of=/dev/null bs=10M skip=6 count=1
8708 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8709 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8710 [ $miss -eq 1 ] || error "expected miss 1 but got $miss"
8711 rm -f $p $DIR/$tfile
8713 run_test 101h "Readahead should cover current read window"
8716 test_mkdir $DIR/$tdir
8717 chown $RUNAS_ID $DIR/$tdir
8720 STRIPE_COUNT=$OSTCOUNT
8721 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
8723 trap cleanup_test102 EXIT
8725 $1 $LFS setstripe -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
8727 for num in 1 2 3 4; do
8728 for count in $(seq 1 $STRIPE_COUNT); do
8729 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
8730 local size=`expr $STRIPE_SIZE \* $num`
8731 local file=file"$num-$idx-$count"
8732 $1 $LFS setstripe -S $size -i $idx -c $count $file
8738 $1 tar cf $TMP/f102.tar $tdir --xattrs
8744 rm -rf $DIR/d0.sanity/d102
8748 [ "$UID" != 0 ] && skip "must run as root"
8749 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
8750 skip_env "must have user_xattr"
8752 [ -z "$(which setfattr 2>/dev/null)" ] &&
8753 skip_env "could not find setfattr"
8755 local testfile=$DIR/$tfile
8758 echo "set/get xattr..."
8759 setfattr -n trusted.name1 -v value1 $testfile ||
8760 error "setfattr -n trusted.name1=value1 $testfile failed"
8761 getfattr -n trusted.name1 $testfile 2> /dev/null |
8762 grep "trusted.name1=.value1" ||
8763 error "$testfile missing trusted.name1=value1"
8765 setfattr -n user.author1 -v author1 $testfile ||
8766 error "setfattr -n user.author1=author1 $testfile failed"
8767 getfattr -n user.author1 $testfile 2> /dev/null |
8768 grep "user.author1=.author1" ||
8769 error "$testfile missing trusted.author1=author1"
8772 setfattr -n trusted.name2 -v value2 $testfile ||
8773 error "$testfile unable to set trusted.name2"
8774 setfattr -n trusted.name3 -v value3 $testfile ||
8775 error "$testfile unable to set trusted.name3"
8776 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
8777 grep "trusted.name" | wc -l) -eq 3 ] ||
8778 error "$testfile missing 3 trusted.name xattrs"
8780 setfattr -n user.author2 -v author2 $testfile ||
8781 error "$testfile unable to set user.author2"
8782 setfattr -n user.author3 -v author3 $testfile ||
8783 error "$testfile unable to set user.author3"
8784 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
8785 grep "user.author" | wc -l) -eq 3 ] ||
8786 error "$testfile missing 3 user.author xattrs"
8788 echo "remove xattr..."
8789 setfattr -x trusted.name1 $testfile ||
8790 error "$testfile error deleting trusted.name1"
8791 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
8792 error "$testfile did not delete trusted.name1 xattr"
8794 setfattr -x user.author1 $testfile ||
8795 error "$testfile error deleting user.author1"
8796 echo "set lustre special xattr ..."
8797 $LFS setstripe -c1 $testfile
8798 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
8799 awk -F "=" '/trusted.lov/ { print $2 }' )
8800 setfattr -n "trusted.lov" -v $lovea $testfile ||
8801 error "$testfile doesn't ignore setting trusted.lov again"
8802 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
8803 error "$testfile allow setting invalid trusted.lov"
8806 run_test 102a "user xattr test =================================="
8809 [ -z "$(which setfattr 2>/dev/null)" ] &&
8810 skip_env "could not find setfattr"
8811 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8813 # b10930: get/set/list trusted.lov xattr
8814 echo "get/set/list trusted.lov xattr ..."
8815 local testfile=$DIR/$tfile
8816 $LFS setstripe -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8817 error "setstripe failed"
8818 local STRIPECOUNT=$($LFS getstripe -c $testfile) ||
8819 error "getstripe failed"
8820 getfattr -d -m "^trusted" $testfile 2>/dev/null | grep "trusted.lov" ||
8821 error "can't get trusted.lov from $testfile"
8823 local testfile2=${testfile}2
8824 local value=$(getfattr -n trusted.lov $testfile 2>/dev/null |
8825 grep "trusted.lov" | sed -e 's/[^=]\+=//')
8828 setfattr -n trusted.lov -v $value $testfile2
8829 local stripe_size=$($LFS getstripe -S $testfile2)
8830 local stripe_count=$($LFS getstripe -c $testfile2)
8831 [[ $stripe_size -eq 65536 ]] ||
8832 error "stripe size $stripe_size != 65536"
8833 [[ $stripe_count -eq $STRIPECOUNT ]] ||
8834 error "stripe count $stripe_count != $STRIPECOUNT"
8837 run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
8840 [ -z "$(which setfattr 2>/dev/null)" ] &&
8841 skip_env "could not find setfattr"
8842 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8844 # b10930: get/set/list lustre.lov xattr
8845 echo "get/set/list lustre.lov xattr ..."
8846 test_mkdir $DIR/$tdir
8847 chown $RUNAS_ID $DIR/$tdir
8848 local testfile=$DIR/$tdir/$tfile
8849 $RUNAS $LFS setstripe -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8850 error "setstripe failed"
8851 local STRIPECOUNT=$($RUNAS $LFS getstripe -c $testfile) ||
8852 error "getstripe failed"
8853 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
8854 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
8856 local testfile2=${testfile}2
8857 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
8858 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
8860 $RUNAS $MCREATE $testfile2
8861 $RUNAS setfattr -n lustre.lov -v $value $testfile2
8862 local stripe_size=$($RUNAS $LFS getstripe -S $testfile2)
8863 local stripe_count=$($RUNAS $LFS getstripe -c $testfile2)
8864 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
8865 [ $stripe_count -eq $STRIPECOUNT ] ||
8866 error "stripe count $stripe_count != $STRIPECOUNT"
8868 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
8870 compare_stripe_info1() {
8871 local stripe_index_all_zero=true
8873 for num in 1 2 3 4; do
8874 for count in $(seq 1 $STRIPE_COUNT); do
8875 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
8876 local size=$((STRIPE_SIZE * num))
8877 local file=file"$num-$offset-$count"
8878 stripe_size=$($LFS getstripe -S $PWD/$file)
8879 [[ $stripe_size -ne $size ]] &&
8880 error "$file: size $stripe_size != $size"
8881 stripe_count=$($LFS getstripe -c $PWD/$file)
8882 # allow fewer stripes to be created, ORI-601
8883 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
8884 error "$file: count $stripe_count != $count"
8885 stripe_index=$($LFS getstripe -i $PWD/$file)
8886 [[ $stripe_index -ne 0 ]] &&
8887 stripe_index_all_zero=false
8891 $stripe_index_all_zero &&
8892 error "all files are being extracted starting from OST index 0"
8896 have_xattrs_include() {
8897 tar --help | grep -q xattrs-include &&
8898 echo --xattrs-include="lustre.*"
8902 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8903 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8905 XINC=$(have_xattrs_include)
8907 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8909 compare_stripe_info1
8911 run_test 102d "tar restore stripe info from tarfile,not keep osts"
8914 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8915 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8917 XINC=$(have_xattrs_include)
8919 test_mkdir $DIR/$tdir.restore
8921 tar cf - --xattrs $tdir | tar xf - \
8922 -C $DIR/$tdir.restore --xattrs $XINC
8923 cd $DIR/$tdir.restore/$tdir
8924 compare_stripe_info1
8926 run_test 102f "tar copy files, not keep osts"
8929 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
8930 skip "must have user_xattr"
8931 [ -z "$(which setfattr 2>/dev/null)" ] &&
8932 skip_env "could not find setfattr"
8933 [ -z "$(which getfattr 2>/dev/null)" ] &&
8934 skip_env "could not find getfattr"
8936 local xsize=${1:-1024} # in bytes
8937 local file=$DIR/$tfile
8938 local value="$(generate_string $xsize)"
8939 local xbig=trusted.big
8943 log "save $xbig on $file"
8946 setfattr -n $xbig -v $value $file ||
8947 error "saving $xbig on $file failed"
8949 setfattr -n $xbig -v $value $file &&
8950 error "saving $xbig on $file succeeded"
8954 local orig=$(get_xattr_value $xbig $file)
8955 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
8957 local xsml=trusted.sml
8958 log "save $xsml on $file"
8959 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
8961 local new=$(get_xattr_value $xbig $file)
8962 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
8964 log "grow $xsml on $file"
8965 setfattr -n $xsml -v "$value" $file ||
8966 error "growing $xsml on $file failed"
8968 new=$(get_xattr_value $xbig $file)
8969 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
8970 log "$xbig still valid after growing $xsml"
8975 test_102h() { # bug 15777
8978 run_test 102h "grow xattr from inside inode to external block"
8981 large_xattr_enabled || skip_env "ea_inode feature disabled"
8983 echo "setting xattr of max xattr size: $(max_xattr_size)"
8984 grow_xattr $(max_xattr_size)
8986 echo "setting xattr of > max xattr size: $(max_xattr_size) + 10"
8987 echo "This should fail:"
8988 grow_xattr $(($(max_xattr_size) + 10)) 1
8990 run_test 102ha "grow xattr from inside inode to external inode"
8992 test_102i() { # bug 17038
8993 [ -z "$(which getfattr 2>/dev/null)" ] &&
8994 skip "could not find getfattr"
8997 ln -s $DIR/$tfile $DIR/${tfile}link
8998 getfattr -n trusted.lov $DIR/$tfile ||
8999 error "lgetxattr on $DIR/$tfile failed"
9000 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
9001 grep -i "no such attr" ||
9002 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
9003 rm -f $DIR/$tfile $DIR/${tfile}link
9005 run_test 102i "lgetxattr test on symbolic link ============"
9008 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9009 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9011 XINC=$(have_xattrs_include)
9012 setup_test102 "$RUNAS"
9013 chown $RUNAS_ID $DIR/$tdir
9014 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
9016 compare_stripe_info1 "$RUNAS"
9018 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
9021 [ -z "$(which setfattr 2>/dev/null)" ] &&
9022 skip "could not find setfattr"
9025 # b22187 just check that does not crash for regular file.
9026 setfattr -n trusted.lov $DIR/$tfile
9027 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
9028 local test_kdir=$DIR/$tdir
9029 test_mkdir $test_kdir
9030 local default_size=$($LFS getstripe -S $test_kdir)
9031 local default_count=$($LFS getstripe -c $test_kdir)
9032 local default_offset=$($LFS getstripe -i $test_kdir)
9033 $LFS setstripe -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
9034 error 'dir setstripe failed'
9035 setfattr -n trusted.lov $test_kdir
9036 local stripe_size=$($LFS getstripe -S $test_kdir)
9037 local stripe_count=$($LFS getstripe -c $test_kdir)
9038 local stripe_offset=$($LFS getstripe -i $test_kdir)
9039 [ $stripe_size -eq $default_size ] ||
9040 error "stripe size $stripe_size != $default_size"
9041 [ $stripe_count -eq $default_count ] ||
9042 error "stripe count $stripe_count != $default_count"
9043 [ $stripe_offset -eq $default_offset ] ||
9044 error "stripe offset $stripe_offset != $default_offset"
9045 rm -rf $DIR/$tfile $test_kdir
9047 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
9050 [ -z "$(which getfattr 2>/dev/null)" ] &&
9051 skip "could not find getfattr"
9053 # LU-532 trusted. xattr is invisible to non-root
9054 local testfile=$DIR/$tfile
9058 echo "listxattr as user..."
9059 chown $RUNAS_ID $testfile
9060 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
9061 grep -q "trusted" &&
9062 error "$testfile trusted xattrs are user visible"
9066 run_test 102l "listxattr size test =================================="
9068 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
9069 local path=$DIR/$tfile
9072 listxattr_size_check $path || error "listattr_size_check $path failed"
9074 run_test 102m "Ensure listxattr fails on small bufffer ========"
9078 getxattr() { # getxattr path name
9079 # Return the base64 encoding of the value of xattr name on path.
9083 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
9085 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
9087 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
9089 getfattr --absolute-names --encoding=base64 --name=$name $path |
9090 awk -F= -v name=$name '$1 == name {
9091 print substr($0, index($0, "=") + 1);
9095 test_102n() { # LU-4101 mdt: protect internal xattrs
9096 [ -z "$(which setfattr 2>/dev/null)" ] &&
9097 skip "could not find setfattr"
9098 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
9100 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
9103 local file0=$DIR/$tfile.0
9104 local file1=$DIR/$tfile.1
9105 local xattr0=$TMP/$tfile.0
9106 local xattr1=$TMP/$tfile.1
9107 local namelist="lov lma lmv link fid version som hsm"
9111 rm -rf $file0 $file1 $xattr0 $xattr1
9114 # Get 'before' xattrs of $file1.
9115 getfattr --absolute-names --dump --match=- $file1 > $xattr0
9117 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
9118 namelist+=" lfsck_namespace"
9119 for name in $namelist; do
9120 # Try to copy xattr from $file0 to $file1.
9121 value=$(getxattr $file0 trusted.$name 2> /dev/null)
9123 setfattr --name=trusted.$name --value="$value" $file1 ||
9124 error "setxattr 'trusted.$name' failed"
9126 # Try to set a garbage xattr.
9127 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9129 if [[ x$name == "xlov" ]]; then
9130 setfattr --name=trusted.lov --value="$value" $file1 &&
9131 error "setxattr invalid 'trusted.lov' success"
9133 setfattr --name=trusted.$name --value="$value" $file1 ||
9134 error "setxattr invalid 'trusted.$name' failed"
9137 # Try to remove the xattr from $file1. We don't care if this
9138 # appears to succeed or fail, we just don't want there to be
9139 # any changes or crashes.
9140 setfattr --remove=$trusted.$name $file1 2> /dev/null
9143 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
9146 # Try to copy xattr from $file0 to $file1.
9147 value=$(getxattr $file0 trusted.$name 2> /dev/null)
9149 setfattr --name=trusted.$name --value="$value" $file1 ||
9150 error "setxattr 'trusted.$name' failed"
9152 # Try to set a garbage xattr.
9153 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9155 setfattr --name=trusted.$name --value="$value" $file1 ||
9156 error "setxattr 'trusted.$name' failed"
9158 # Try to remove the xattr from $file1. We don't care if this
9159 # appears to succeed or fail, we just don't want there to be
9160 # any changes or crashes.
9161 setfattr --remove=$trusted.$name $file1 2> /dev/null
9164 # Get 'after' xattrs of file1.
9165 getfattr --absolute-names --dump --match=- $file1 > $xattr1
9167 if ! diff $xattr0 $xattr1; then
9168 error "before and after xattrs of '$file1' differ"
9171 rm -rf $file0 $file1 $xattr0 $xattr1
9175 run_test 102n "silently ignore setxattr on internal trusted xattrs"
9177 test_102p() { # LU-4703 setxattr did not check ownership
9178 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
9179 skip "MDS needs to be at least 2.5.56"
9181 local testfile=$DIR/$tfile
9185 echo "setfacl as user..."
9186 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
9187 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
9189 echo "setfattr as user..."
9190 setfacl -m "u:$RUNAS_ID:---" $testfile
9191 $RUNAS setfattr -x system.posix_acl_access $testfile
9192 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
9194 run_test 102p "check setxattr(2) correctly fails without permission"
9197 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
9198 skip "MDS needs to be at least 2.6.92"
9200 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
9202 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
9205 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
9206 skip "MDS needs to be at least 2.6.93"
9208 touch $DIR/$tfile || error "touch"
9209 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
9210 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
9211 rm $DIR/$tfile || error "rm"
9214 mkdir -p $DIR/$tdir || error "mkdir"
9215 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9216 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9217 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9218 error "$testfile error deleting user.author1"
9219 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9220 grep "user.$(basename $tdir)" &&
9221 error "$tdir did not delete user.$(basename $tdir)"
9222 rmdir $DIR/$tdir || error "rmdir"
9225 test_mkdir $DIR/$tdir
9226 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9227 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9228 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9229 error "$testfile error deleting user.author1"
9230 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9231 grep "user.$(basename $tdir)" &&
9232 error "$tdir did not delete user.$(basename $tdir)"
9233 rmdir $DIR/$tdir || error "rm striped dir"
9235 run_test 102r "set EAs with empty values"
9238 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9239 skip "MDS needs to be at least 2.11.52"
9241 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9243 save_lustre_params client "llite.*.xattr_cache" > $save
9245 for cache in 0 1; do
9246 lctl set_param llite.*.xattr_cache=$cache
9249 touch $DIR/$tfile || error "touch"
9250 for prefix in lustre security system trusted user; do
9251 # Note getxattr() may fail with 'Operation not
9252 # supported' or 'No such attribute' depending
9253 # on prefix and cache.
9254 getfattr -n $prefix.n102s $DIR/$tfile &&
9255 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
9259 restore_lustre_params < $save
9261 run_test 102s "getting nonexistent xattrs should fail"
9264 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9265 skip "MDS needs to be at least 2.11.52"
9267 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9269 save_lustre_params client "llite.*.xattr_cache" > $save
9271 for cache in 0 1; do
9272 lctl set_param llite.*.xattr_cache=$cache
9274 for buf_size in 0 256; do
9276 touch $DIR/$tfile || error "touch"
9277 setfattr -n user.multiop $DIR/$tfile
9278 $MULTIOP $DIR/$tfile oa$buf_size ||
9279 error "cannot get zero length xattr value (buf_size = $buf_size)"
9283 restore_lustre_params < $save
9285 run_test 102t "zero length xattr values handled correctly"
9289 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
9294 [ "$UID" != 0 ] && skip "must run as root"
9295 $GSS && skip_env "could not run under gss"
9296 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
9297 skip_env "must have acl enabled"
9298 [ -z "$(which setfacl 2>/dev/null)" ] &&
9299 skip_env "could not find setfacl"
9300 remote_mds_nodsh && skip "remote MDS with nodsh"
9302 gpasswd -a daemon bin # LU-5641
9303 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
9305 declare -a identity_old
9307 for num in $(seq $MDSCOUNT); do
9308 switch_identity $num true || identity_old[$num]=$?
9316 echo "performing cp ..."
9317 run_acl_subtest cp || error "run_acl_subtest cp failed"
9318 echo "performing getfacl-noacl..."
9319 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
9320 echo "performing misc..."
9321 run_acl_subtest misc || error "misc test failed"
9322 echo "performing permissions..."
9323 run_acl_subtest permissions || error "permissions failed"
9324 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
9325 if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] ||
9326 { [ $MDS1_VERSION -lt $(version_code 2.6) ] &&
9327 [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; }
9329 echo "performing permissions xattr..."
9330 run_acl_subtest permissions_xattr ||
9331 error "permissions_xattr failed"
9333 echo "performing setfacl..."
9334 run_acl_subtest setfacl || error "setfacl test failed"
9336 # inheritance test got from HP
9337 echo "performing inheritance..."
9338 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
9339 chmod +x make-tree || error "chmod +x failed"
9340 run_acl_subtest inheritance || error "inheritance test failed"
9343 echo "LU-974 ignore umask when acl is enabled..."
9344 run_acl_subtest 974 || error "LU-974 umask test failed"
9345 if [ $MDSCOUNT -ge 2 ]; then
9346 run_acl_subtest 974_remote ||
9347 error "LU-974 umask test failed under remote dir"
9350 echo "LU-2561 newly created file is same size as directory..."
9351 if [ "$mds1_FSTYPE" != "zfs" ]; then
9352 run_acl_subtest 2561 || error "LU-2561 test failed"
9354 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
9357 run_acl_subtest 4924 || error "LU-4924 test failed"
9362 for num in $(seq $MDSCOUNT); do
9363 if [ "${identity_old[$num]}" = 1 ]; then
9364 switch_identity $num false || identity_old[$num]=$?
9368 run_test 103a "acl test"
9374 for U in {0..511}; do
9376 local O=$(printf "%04o" $U)
9378 umask $(printf "%04o" $((511 ^ $O)))
9379 $LFS setstripe -c 1 $DIR/$tfile.s$O
9380 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
9382 (( $S == ($O & 0666) )) ||
9383 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
9385 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
9386 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
9387 (( $S == ($O & 0666) )) ||
9388 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
9390 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
9391 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
9392 (( $S == ($O & 0666) )) ||
9393 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
9394 rm -f $DIR/$tfile.[smp]$0
9398 # limit the concurrently running threads to 64. LU-11878
9399 local idx=$((U % 64))
9400 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
9405 run_test 103b "umask lfs setstripe"
9409 cp -rp $DIR/$tdir $DIR/$tdir.bak
9411 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
9412 error "$DIR/$tdir shouldn't contain default ACL"
9413 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
9414 error "$DIR/$tdir.bak shouldn't contain default ACL"
9417 run_test 103c "'cp -rp' won't set empty acl"
9420 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9423 lfs df || error "lfs df failed"
9424 lfs df -ih || error "lfs df -ih failed"
9425 lfs df -h $DIR || error "lfs df -h $DIR failed"
9426 lfs df -i $DIR || error "lfs df -i $DIR failed"
9427 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
9428 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
9430 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
9431 lctl --device %$OSC deactivate
9432 lfs df || error "lfs df with deactivated OSC failed"
9433 lctl --device %$OSC activate
9434 # wait the osc back to normal
9435 wait_osc_import_ready client ost
9437 lfs df || error "lfs df with reactivated OSC failed"
9440 run_test 104a "lfs df [-ih] [path] test ========================="
9443 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9444 [ $RUNAS_ID -eq $UID ] &&
9445 skip_env "RUNAS_ID = UID = $UID -- skipping"
9447 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
9448 grep "Permission denied" | wc -l)))
9449 if [ $denied_cnt -ne 0 ]; then
9450 error "lfs check servers test failed"
9453 run_test 104b "$RUNAS lfs check servers test ===================="
9456 # doesn't work on 2.4 kernels
9458 if $(flock_is_enabled); then
9459 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
9461 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
9465 run_test 105a "flock when mounted without -o flock test ========"
9469 if $(flock_is_enabled); then
9470 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
9472 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
9476 run_test 105b "fcntl when mounted without -o flock test ========"
9480 if $(flock_is_enabled); then
9481 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
9483 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
9487 run_test 105c "lockf when mounted without -o flock test"
9489 test_105d() { # bug 15924
9490 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9492 test_mkdir $DIR/$tdir
9493 flock_is_enabled || skip_env "mount w/o flock enabled"
9494 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
9495 $LCTL set_param fail_loc=0x80000315
9496 flocks_test 2 $DIR/$tdir
9498 run_test 105d "flock race (should not freeze) ========"
9500 test_105e() { # bug 22660 && 22040
9501 flock_is_enabled || skip_env "mount w/o flock enabled"
9504 flocks_test 3 $DIR/$tfile
9506 run_test 105e "Two conflicting flocks from same process"
9508 test_106() { #bug 10921
9509 test_mkdir $DIR/$tdir
9510 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9511 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9513 run_test 106 "attempt exec of dir followed by chown of that dir"
9516 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9524 local save_pattern=$(sysctl -n kernel.core_pattern)
9525 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9526 sysctl -w kernel.core_pattern=$file
9527 sysctl -w kernel.core_uses_pid=0
9535 kill -s 11 $SLEEPPID
9537 if [ -e $file ]; then
9538 size=`stat -c%s $file`
9539 [ $size -eq 0 ] && error "Fail to create core file $file"
9541 error "Fail to create core file $file"
9544 sysctl -w kernel.core_pattern=$save_pattern
9545 sysctl -w kernel.core_uses_pid=$save_uses_pid
9548 run_test 107 "Coredump on SIG"
9551 test_mkdir $DIR/$tdir
9552 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9553 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9554 error "mkdir with 256 char should fail, but did not"
9555 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9556 error "create with 255 char failed"
9557 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9558 error "create with 256 char should fail, but did not"
9563 run_test 110 "filename length checking"
9566 # Purpose: To verify dynamic thread (OSS) creation.
9569 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9570 remote_ost_nodsh && skip "remote OST with nodsh"
9572 # Lustre does not stop service threads once they are started.
9573 # Reset number of running threads to default.
9578 local save_params="$TMP/sanity-$TESTNAME.parameters"
9580 # Get ll_ost_io count before I/O
9581 OSTIO_pre=$(do_facet ost1 \
9582 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9583 # Exit if lustre is not running (ll_ost_io not running).
9584 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9586 echo "Starting with $OSTIO_pre threads"
9587 local thread_max=$((OSTIO_pre * 2))
9588 local rpc_in_flight=$((thread_max * 2))
9589 # Number of I/O Process proposed to be started.
9591 local facets=$(get_facets OST)
9593 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9594 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9596 # Set in_flight to $rpc_in_flight
9597 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9598 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9599 nfiles=${rpc_in_flight}
9600 # Set ost thread_max to $thread_max
9601 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9603 # 5 Minutes should be sufficient for max number of OSS
9604 # threads(thread_max) to be created.
9608 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9609 test_mkdir $DIR/$tdir
9610 for i in $(seq $nfiles); do
9611 local file=$DIR/$tdir/${tfile}-$i
9612 $LFS setstripe -c -1 -i 0 $file
9613 ($WTL $file $timeout)&
9616 # I/O Started - Wait for thread_started to reach thread_max or report
9617 # error if thread_started is more than thread_max.
9618 echo "Waiting for thread_started to reach thread_max"
9619 local thread_started=0
9620 local end_time=$((SECONDS + timeout))
9622 while [ $SECONDS -le $end_time ] ; do
9624 # Get ost i/o thread_started count.
9625 thread_started=$(do_facet ost1 \
9627 ost.OSS.ost_io.threads_started | cut -d= -f2")
9628 # Break out if thread_started is equal/greater than thread_max
9629 if [[ $thread_started -ge $thread_max ]]; then
9630 echo ll_ost_io thread_started $thread_started, \
9631 equal/greater than thread_max $thread_max
9637 # Cleanup - We have the numbers, Kill i/o jobs if running.
9638 jobcount=($(jobs -p))
9639 for i in $(seq 0 $((${#jobcount[@]}-1)))
9641 kill -9 ${jobcount[$i]}
9642 if [ $? -ne 0 ] ; then
9644 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
9648 # Cleanup files left by WTL binary.
9649 for i in $(seq $nfiles); do
9650 local file=$DIR/$tdir/${tfile}-$i
9652 if [ $? -ne 0 ] ; then
9653 echo "Warning: Failed to delete file $file"
9657 restore_lustre_params <$save_params
9658 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
9660 # Error out if no new thread has started or Thread started is greater
9662 if [[ $thread_started -le $OSTIO_pre ||
9663 $thread_started -gt $thread_max ]]; then
9664 error "ll_ost_io: thread_started $thread_started" \
9665 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
9666 "No new thread started or thread started greater " \
9670 run_test 115 "verify dynamic thread creation===================="
9673 wait_delete_completed
9674 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
9675 echo "OST kbytes available: ${AVAIL[@]}"
9680 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
9681 #echo OST $i: ${AVAIL[i]}kb
9682 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
9686 if [[ ${AVAIL[i]} -lt $MINV ]]; then
9691 echo "Min free space: OST $MINI: $MINV"
9692 echo "Max free space: OST $MAXI: $MAXV"
9695 test_116a() { # was previously test_116()
9696 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9697 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9698 remote_mds_nodsh && skip "remote MDS with nodsh"
9700 echo -n "Free space priority "
9701 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
9706 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
9707 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
9708 trap simple_cleanup_common EXIT
9710 # Check if we need to generate uneven OSTs
9711 test_mkdir -p $DIR/$tdir/OST${MINI}
9712 local FILL=$((MINV / 4))
9713 local DIFF=$((MAXV - MINV))
9714 local DIFF2=$((DIFF * 100 / MINV))
9716 local threshold=$(do_facet $SINGLEMDS \
9717 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
9718 threshold=${threshold%%%}
9719 echo -n "Check for uneven OSTs: "
9720 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
9722 if [[ $DIFF2 -gt $threshold ]]; then
9724 echo "Don't need to fill OST$MINI"
9726 # generate uneven OSTs. Write 2% over the QOS threshold value
9728 DIFF=$((threshold - DIFF2 + 2))
9729 DIFF2=$((MINV * DIFF / 100))
9730 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
9731 $LFS setstripe -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
9732 error "setstripe failed"
9733 DIFF=$((DIFF2 / 2048))
9735 while [ $i -lt $DIFF ]; do
9737 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
9738 bs=2M count=1 2>/dev/null
9747 DIFF=$((MAXV - MINV))
9748 DIFF2=$((DIFF * 100 / MINV))
9749 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
9750 if [ $DIFF2 -gt $threshold ]; then
9753 echo "failed - QOS mode won't be used"
9754 simple_cleanup_common
9755 skip "QOS imbalance criteria not met"
9763 # now fill using QOS
9764 $LFS setstripe -c 1 $DIR/$tdir
9765 FILL=$((FILL / 200))
9766 if [ $FILL -gt 600 ]; then
9769 echo "writing $FILL files to QOS-assigned OSTs"
9771 while [ $i -lt $FILL ]; do
9773 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
9777 echo "wrote $i 200k files"
9781 echo "Note: free space may not be updated, so measurements might be off"
9783 DIFF2=$((MAXV - MINV))
9784 echo "free space delta: orig $DIFF final $DIFF2"
9785 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
9786 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
9787 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
9788 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
9789 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
9790 if [[ $DIFF -gt 0 ]]; then
9791 FILL=$((DIFF2 * 100 / DIFF - 100))
9792 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
9795 # Figure out which files were written where
9796 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9797 awk '/'$MINI1': / {print $2; exit}')
9799 MINC=$($LFS getstripe --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9800 echo "$MINC files created on smaller OST $MINI1"
9801 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9802 awk '/'$MAXI1': / {print $2; exit}')
9804 MAXC=$($LFS getstripe --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9805 echo "$MAXC files created on larger OST $MAXI1"
9806 if [[ $MINC -gt 0 ]]; then
9807 FILL=$((MAXC * 100 / MINC - 100))
9808 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
9810 [[ $MAXC -gt $MINC ]] ||
9811 error_ignore LU-9 "stripe QOS didn't balance free space"
9812 simple_cleanup_common
9814 run_test 116a "stripe QOS: free space balance ==================="
9816 test_116b() { # LU-2093
9817 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9818 remote_mds_nodsh && skip "remote MDS with nodsh"
9820 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
9821 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
9822 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
9823 [ -z "$old_rr" ] && skip "no QOS"
9824 do_facet $SINGLEMDS lctl set_param \
9825 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
9827 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
9828 createmany -o $DIR/$tdir/f- 20 || error "can't create"
9829 do_facet $SINGLEMDS lctl set_param fail_loc=0
9831 do_facet $SINGLEMDS lctl set_param \
9832 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
9834 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
9836 test_117() # bug 10891
9838 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9840 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
9841 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
9842 lctl set_param fail_loc=0x21e
9843 > $DIR/$tfile || error "truncate failed"
9844 lctl set_param fail_loc=0
9845 echo "Truncate succeeded."
9848 run_test 117 "verify osd extend =========="
9850 NO_SLOW_RESENDCOUNT=4
9851 export OLD_RESENDCOUNT=""
9852 set_resend_count () {
9853 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
9854 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
9855 lctl set_param -n $PROC_RESENDCOUNT $1
9856 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
9859 # for reduce test_118* time (b=14842)
9860 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9862 # Reset async IO behavior after error case
9864 FILE=$DIR/reset_async
9866 # Ensure all OSCs are cleared
9867 $LFS setstripe -c -1 $FILE
9868 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
9873 test_118a() #bug 11710
9875 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9879 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9880 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9881 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9883 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9884 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9889 run_test 118a "verify O_SYNC works =========="
9893 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9894 remote_ost_nodsh && skip "remote OST with nodsh"
9898 #define OBD_FAIL_SRV_ENOENT 0x217
9899 set_nodes_failloc "$(osts_nodes)" 0x217
9900 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9902 set_nodes_failloc "$(osts_nodes)" 0
9903 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9904 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9907 if [[ $RC -eq 0 ]]; then
9908 error "Must return error due to dropped pages, rc=$RC"
9912 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9913 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9917 echo "Dirty pages not leaked on ENOENT"
9919 # Due to the above error the OSC will issue all RPCs syncronously
9920 # until a subsequent RPC completes successfully without error.
9921 $MULTIOP $DIR/$tfile Ow4096yc
9926 run_test 118b "Reclaim dirty pages on fatal error =========="
9930 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9932 # for 118c, restore the original resend count, LU-1940
9933 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
9934 set_resend_count $OLD_RESENDCOUNT
9935 remote_ost_nodsh && skip "remote OST with nodsh"
9939 #define OBD_FAIL_OST_EROFS 0x216
9940 set_nodes_failloc "$(osts_nodes)" 0x216
9942 # multiop should block due to fsync until pages are written
9943 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9947 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9948 error "Multiop failed to block on fsync, pid=$MULTIPID"
9951 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9953 if [[ $WRITEBACK -eq 0 ]]; then
9954 error "No page in writeback, writeback=$WRITEBACK"
9957 set_nodes_failloc "$(osts_nodes)" 0
9960 if [[ $RC -ne 0 ]]; then
9961 error "Multiop fsync failed, rc=$RC"
9964 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9965 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9967 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9968 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9972 echo "Dirty pages flushed via fsync on EROFS"
9975 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
9977 # continue to use small resend count to reduce test_118* time (b=14842)
9978 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9982 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9983 remote_ost_nodsh && skip "remote OST with nodsh"
9987 #define OBD_FAIL_OST_BRW_PAUSE_BULK
9988 set_nodes_failloc "$(osts_nodes)" 0x214
9989 # multiop should block due to fsync until pages are written
9990 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9994 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9995 error "Multiop failed to block on fsync, pid=$MULTIPID"
9998 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10000 if [[ $WRITEBACK -eq 0 ]]; then
10001 error "No page in writeback, writeback=$WRITEBACK"
10004 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
10005 set_nodes_failloc "$(osts_nodes)" 0
10007 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10008 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10010 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10011 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10015 echo "Dirty pages gaurenteed flushed via fsync"
10018 run_test 118d "Fsync validation inject a delay of the bulk =========="
10021 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10025 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
10026 lctl set_param fail_loc=0x8000040a
10028 # Should simulate EINVAL error which is fatal
10029 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10031 if [[ $RC -eq 0 ]]; then
10032 error "Must return error due to dropped pages, rc=$RC"
10035 lctl set_param fail_loc=0x0
10037 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10038 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10039 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10041 if [[ $LOCKED -ne 0 ]]; then
10042 error "Locked pages remain in cache, locked=$LOCKED"
10045 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10046 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10050 echo "No pages locked after fsync"
10055 run_test 118f "Simulate unrecoverable OSC side error =========="
10058 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10062 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
10063 lctl set_param fail_loc=0x406
10065 # simulate local -ENOMEM
10066 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10069 lctl set_param fail_loc=0
10070 if [[ $RC -eq 0 ]]; then
10071 error "Must return error due to dropped pages, rc=$RC"
10074 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10075 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10076 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10078 if [[ $LOCKED -ne 0 ]]; then
10079 error "Locked pages remain in cache, locked=$LOCKED"
10082 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10083 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10087 echo "No pages locked after fsync"
10092 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
10095 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10096 remote_ost_nodsh && skip "remote OST with nodsh"
10100 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10101 set_nodes_failloc "$(osts_nodes)" 0x20e
10102 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
10103 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10106 set_nodes_failloc "$(osts_nodes)" 0
10107 if [[ $RC -eq 0 ]]; then
10108 error "Must return error due to dropped pages, rc=$RC"
10111 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10112 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10113 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10115 if [[ $LOCKED -ne 0 ]]; then
10116 error "Locked pages remain in cache, locked=$LOCKED"
10119 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10120 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10124 echo "No pages locked after fsync"
10128 run_test 118h "Verify timeout in handling recoverables errors =========="
10130 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10133 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10134 remote_ost_nodsh && skip "remote OST with nodsh"
10138 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10139 set_nodes_failloc "$(osts_nodes)" 0x20e
10141 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
10142 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
10145 set_nodes_failloc "$(osts_nodes)" 0
10149 if [[ $RC -ne 0 ]]; then
10150 error "got error, but should be not, rc=$RC"
10153 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10154 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10155 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10156 if [[ $LOCKED -ne 0 ]]; then
10157 error "Locked pages remain in cache, locked=$LOCKED"
10160 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10161 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10165 echo "No pages locked after fsync"
10169 run_test 118i "Fix error before timeout in recoverable error =========="
10171 [ "$SLOW" = "no" ] && set_resend_count 4
10174 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10175 remote_ost_nodsh && skip "remote OST with nodsh"
10179 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
10180 set_nodes_failloc "$(osts_nodes)" 0x220
10182 # return -EIO from OST
10183 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10185 set_nodes_failloc "$(osts_nodes)" 0x0
10186 if [[ $RC -eq 0 ]]; then
10187 error "Must return error due to dropped pages, rc=$RC"
10190 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10191 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10192 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10193 if [[ $LOCKED -ne 0 ]]; then
10194 error "Locked pages remain in cache, locked=$LOCKED"
10197 # in recoverable error on OST we want resend and stay until it finished
10198 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10199 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10203 echo "No pages locked after fsync"
10207 run_test 118j "Simulate unrecoverable OST side error =========="
10211 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10212 remote_ost_nodsh && skip "remote OSTs with nodsh"
10214 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10215 set_nodes_failloc "$(osts_nodes)" 0x20e
10216 test_mkdir $DIR/$tdir
10218 for ((i=0;i<10;i++)); do
10219 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
10220 error "dd to $DIR/$tdir/$tfile-$i failed" )&
10227 set_nodes_failloc "$(osts_nodes)" 0
10230 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
10232 test_118l() # LU-646
10234 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10236 test_mkdir $DIR/$tdir
10237 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
10240 run_test 118l "fsync dir"
10242 test_118m() # LU-3066
10244 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10246 test_mkdir $DIR/$tdir
10247 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
10250 run_test 118m "fdatasync dir ========="
10252 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10259 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10260 remote_ost_nodsh && skip "remote OSTs with nodsh"
10262 # Sleep to avoid a cached response.
10263 #define OBD_STATFS_CACHE_SECONDS 1
10266 # Inject a 10 second delay in the OST_STATFS handler.
10267 #define OBD_FAIL_OST_STATFS_DELAY 0x242
10268 set_nodes_failloc "$(osts_nodes)" 0x242
10271 stat --file-system $MOUNT > /dev/null
10274 set_nodes_failloc "$(osts_nodes)" 0
10276 if ((end - begin > 20)); then
10277 error "statfs took $((end - begin)) seconds, expected 10"
10280 run_test 118n "statfs() sends OST_STATFS requests in parallel"
10282 test_119a() # bug 11737
10284 BSIZE=$((512 * 1024))
10285 directio write $DIR/$tfile 0 1 $BSIZE
10286 # We ask to read two blocks, which is more than a file size.
10287 # directio will indicate an error when requested and actual
10288 # sizes aren't equeal (a normal situation in this case) and
10289 # print actual read amount.
10290 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
10291 if [ "$NOB" != "$BSIZE" ]; then
10292 error "read $NOB bytes instead of $BSIZE"
10296 run_test 119a "Short directIO read must return actual read amount"
10298 test_119b() # bug 11737
10300 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10302 $LFS setstripe -c 2 $DIR/$tfile || error "setstripe failed"
10303 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
10305 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
10306 error "direct read failed"
10309 run_test 119b "Sparse directIO read must return actual read amount"
10311 test_119c() # bug 13099
10314 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
10315 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
10318 run_test 119c "Testing for direct read hitting hole"
10320 test_119d() # bug 15950
10322 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10324 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
10325 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
10327 $LFS setstripe $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
10328 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
10329 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
10330 lctl set_param fail_loc=0x40d
10331 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
10334 cat $DIR/$tfile > /dev/null &
10335 lctl set_param fail_loc=0
10338 log "the DIO writes have completed, now wait for the reads (should not block very long)"
10340 [ -n "`ps h -p $pid_reads -o comm`" ] && \
10341 error "the read rpcs have not completed in 2s"
10343 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
10345 run_test 119d "The DIO path should try to send a new rpc once one is completed"
10348 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10349 remote_mds_nodsh && skip "remote MDS with nodsh"
10350 test_mkdir -i0 -c1 $DIR/$tdir
10351 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10352 skip_env "no early lock cancel on server"
10354 lru_resize_disable mdc
10355 lru_resize_disable osc
10356 cancel_lru_locks mdc
10357 # asynchronous object destroy at MDT could cause bl ast to client
10358 cancel_lru_locks osc
10360 stat $DIR/$tdir > /dev/null
10361 can1=$(do_facet mds1 \
10362 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10363 awk '/ldlm_cancel/ {print $2}')
10364 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10365 awk '/ldlm_bl_callback/ {print $2}')
10366 test_mkdir -i0 -c1 $DIR/$tdir/d1
10367 can2=$(do_facet mds1 \
10368 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10369 awk '/ldlm_cancel/ {print $2}')
10370 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10371 awk '/ldlm_bl_callback/ {print $2}')
10372 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10373 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10374 lru_resize_enable mdc
10375 lru_resize_enable osc
10377 run_test 120a "Early Lock Cancel: mkdir test"
10380 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10381 remote_mds_nodsh && skip "remote MDS with nodsh"
10382 test_mkdir $DIR/$tdir
10383 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10384 skip_env "no early lock cancel on server"
10386 lru_resize_disable mdc
10387 lru_resize_disable osc
10388 cancel_lru_locks mdc
10389 stat $DIR/$tdir > /dev/null
10390 can1=$(do_facet $SINGLEMDS \
10391 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10392 awk '/ldlm_cancel/ {print $2}')
10393 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10394 awk '/ldlm_bl_callback/ {print $2}')
10395 touch $DIR/$tdir/f1
10396 can2=$(do_facet $SINGLEMDS \
10397 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10398 awk '/ldlm_cancel/ {print $2}')
10399 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10400 awk '/ldlm_bl_callback/ {print $2}')
10401 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10402 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10403 lru_resize_enable mdc
10404 lru_resize_enable osc
10406 run_test 120b "Early Lock Cancel: create test"
10409 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10410 remote_mds_nodsh && skip "remote MDS with nodsh"
10411 test_mkdir -i0 -c1 $DIR/$tdir
10412 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10413 skip "no early lock cancel on server"
10415 lru_resize_disable mdc
10416 lru_resize_disable osc
10417 test_mkdir -i0 -c1 $DIR/$tdir/d1
10418 test_mkdir -i0 -c1 $DIR/$tdir/d2
10419 touch $DIR/$tdir/d1/f1
10420 cancel_lru_locks mdc
10421 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
10422 can1=$(do_facet mds1 \
10423 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10424 awk '/ldlm_cancel/ {print $2}')
10425 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10426 awk '/ldlm_bl_callback/ {print $2}')
10427 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10428 can2=$(do_facet mds1 \
10429 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10430 awk '/ldlm_cancel/ {print $2}')
10431 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10432 awk '/ldlm_bl_callback/ {print $2}')
10433 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10434 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10435 lru_resize_enable mdc
10436 lru_resize_enable osc
10438 run_test 120c "Early Lock Cancel: link test"
10441 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10442 remote_mds_nodsh && skip "remote MDS with nodsh"
10443 test_mkdir -i0 -c1 $DIR/$tdir
10444 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10445 skip_env "no early lock cancel on server"
10447 lru_resize_disable mdc
10448 lru_resize_disable osc
10450 cancel_lru_locks mdc
10451 stat $DIR/$tdir > /dev/null
10452 can1=$(do_facet mds1 \
10453 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10454 awk '/ldlm_cancel/ {print $2}')
10455 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10456 awk '/ldlm_bl_callback/ {print $2}')
10457 chmod a+x $DIR/$tdir
10458 can2=$(do_facet mds1 \
10459 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10460 awk '/ldlm_cancel/ {print $2}')
10461 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10462 awk '/ldlm_bl_callback/ {print $2}')
10463 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10464 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10465 lru_resize_enable mdc
10466 lru_resize_enable osc
10468 run_test 120d "Early Lock Cancel: setattr test"
10471 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10472 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10473 skip_env "no early lock cancel on server"
10474 remote_mds_nodsh && skip "remote MDS with nodsh"
10476 local dlmtrace_set=false
10478 test_mkdir -i0 -c1 $DIR/$tdir
10479 lru_resize_disable mdc
10480 lru_resize_disable osc
10481 ! $LCTL get_param debug | grep -q dlmtrace &&
10482 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
10483 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
10484 cancel_lru_locks mdc
10485 cancel_lru_locks osc
10486 dd if=$DIR/$tdir/f1 of=/dev/null
10487 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
10488 # XXX client can not do early lock cancel of OST lock
10489 # during unlink (LU-4206), so cancel osc lock now.
10491 cancel_lru_locks osc
10492 can1=$(do_facet mds1 \
10493 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10494 awk '/ldlm_cancel/ {print $2}')
10495 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10496 awk '/ldlm_bl_callback/ {print $2}')
10497 unlink $DIR/$tdir/f1
10499 can2=$(do_facet mds1 \
10500 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10501 awk '/ldlm_cancel/ {print $2}')
10502 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10503 awk '/ldlm_bl_callback/ {print $2}')
10504 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10505 $LCTL dk $TMP/cancel.debug.txt
10506 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10507 $LCTL dk $TMP/blocking.debug.txt
10508 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10509 lru_resize_enable mdc
10510 lru_resize_enable osc
10512 run_test 120e "Early Lock Cancel: unlink test"
10515 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10516 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10517 skip_env "no early lock cancel on server"
10518 remote_mds_nodsh && skip "remote MDS with nodsh"
10520 test_mkdir -i0 -c1 $DIR/$tdir
10521 lru_resize_disable mdc
10522 lru_resize_disable osc
10523 test_mkdir -i0 -c1 $DIR/$tdir/d1
10524 test_mkdir -i0 -c1 $DIR/$tdir/d2
10525 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10526 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10527 cancel_lru_locks mdc
10528 cancel_lru_locks osc
10529 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10530 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10531 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10532 # XXX client can not do early lock cancel of OST lock
10533 # during rename (LU-4206), so cancel osc lock now.
10535 cancel_lru_locks osc
10536 can1=$(do_facet mds1 \
10537 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10538 awk '/ldlm_cancel/ {print $2}')
10539 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10540 awk '/ldlm_bl_callback/ {print $2}')
10541 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10543 can2=$(do_facet mds1 \
10544 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10545 awk '/ldlm_cancel/ {print $2}')
10546 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10547 awk '/ldlm_bl_callback/ {print $2}')
10548 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10549 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10550 lru_resize_enable mdc
10551 lru_resize_enable osc
10553 run_test 120f "Early Lock Cancel: rename test"
10556 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10557 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10558 skip_env "no early lock cancel on server"
10559 remote_mds_nodsh && skip "remote MDS with nodsh"
10561 lru_resize_disable mdc
10562 lru_resize_disable osc
10564 echo create $count files
10565 test_mkdir $DIR/$tdir
10566 cancel_lru_locks mdc
10567 cancel_lru_locks osc
10570 can0=$(do_facet $SINGLEMDS \
10571 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10572 awk '/ldlm_cancel/ {print $2}')
10573 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10574 awk '/ldlm_bl_callback/ {print $2}')
10575 createmany -o $DIR/$tdir/f $count
10577 can1=$(do_facet $SINGLEMDS \
10578 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10579 awk '/ldlm_cancel/ {print $2}')
10580 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10581 awk '/ldlm_bl_callback/ {print $2}')
10583 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10584 echo rm $count files
10587 can2=$(do_facet $SINGLEMDS \
10588 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10589 awk '/ldlm_cancel/ {print $2}')
10590 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10591 awk '/ldlm_bl_callback/ {print $2}')
10593 echo total: $count removes in $((t2-t1))
10594 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10596 # wait for commitment of removal
10597 lru_resize_enable mdc
10598 lru_resize_enable osc
10600 run_test 120g "Early Lock Cancel: performance test"
10602 test_121() { #bug #10589
10603 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10606 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10607 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10608 lctl set_param fail_loc=0x310
10609 cancel_lru_locks osc > /dev/null
10610 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10611 lctl set_param fail_loc=0
10612 [[ $reads -eq $writes ]] ||
10613 error "read $reads blocks, must be $writes blocks"
10615 run_test 121 "read cancel race ========="
10617 test_123a() { # was test 123, statahead(bug 11401)
10618 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10621 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10622 log "testing UP system. Performance may be lower than expected."
10627 test_mkdir $DIR/$tdir
10628 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10629 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10631 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10632 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10634 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10635 lctl set_param -n llite.*.statahead_max 0
10636 lctl get_param llite.*.statahead_max
10637 cancel_lru_locks mdc
10638 cancel_lru_locks osc
10640 time ls -l $DIR/$tdir | wc -l
10642 delta=$((etime - stime))
10643 log "ls $i files without statahead: $delta sec"
10644 lctl set_param llite.*.statahead_max=$max
10646 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10647 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
10648 cancel_lru_locks mdc
10649 cancel_lru_locks osc
10651 time ls -l $DIR/$tdir | wc -l
10653 delta_sa=$((etime - stime))
10654 log "ls $i files with statahead: $delta_sa sec"
10655 lctl get_param -n llite.*.statahead_stats
10656 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10658 [[ $swrong -lt $ewrong ]] &&
10659 log "statahead was stopped, maybe too many locks held!"
10660 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
10662 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10663 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10664 lctl set_param -n llite.*.statahead_max 0
10665 lctl get_param llite.*.statahead_max
10666 cancel_lru_locks mdc
10667 cancel_lru_locks osc
10669 time ls -l $DIR/$tdir | wc -l
10671 delta=$((etime - stime))
10672 log "ls $i files again without statahead: $delta sec"
10673 lctl set_param llite.*.statahead_max=$max
10674 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10675 if [ $SLOWOK -eq 0 ]; then
10676 error "ls $i files is slower with statahead!"
10678 log "ls $i files is slower with statahead!"
10684 [ $delta -gt 20 ] && break
10685 [ $delta -gt 8 ] && MULT=$((50 / delta))
10686 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
10694 delta=$((etime - stime))
10695 log "rm -r $DIR/$tdir/: $delta seconds"
10697 lctl get_param -n llite.*.statahead_stats
10699 run_test 123a "verify statahead work"
10701 test_123b () { # statahead(bug 15027)
10702 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10704 test_mkdir $DIR/$tdir
10705 createmany -o $DIR/$tdir/$tfile-%d 1000
10707 cancel_lru_locks mdc
10708 cancel_lru_locks osc
10710 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
10711 lctl set_param fail_loc=0x80000803
10712 ls -lR $DIR/$tdir > /dev/null
10714 lctl set_param fail_loc=0x0
10715 lctl get_param -n llite.*.statahead_stats
10720 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
10723 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10724 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10725 skip_env "no lru resize on server"
10729 test_mkdir $DIR/$tdir
10731 log "create $NR files at $DIR/$tdir"
10732 createmany -o $DIR/$tdir/f $NR ||
10733 error "failed to create $NR files in $DIR/$tdir"
10735 cancel_lru_locks mdc
10736 ls -l $DIR/$tdir > /dev/null
10740 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
10741 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
10742 LRU_SIZE=$($LCTL get_param -n $PARAM)
10743 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
10744 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
10746 log "NS=$(basename $NSDIR)"
10751 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
10752 skip "Not enough cached locks created!"
10754 log "LRU=$LRU_SIZE"
10758 # We know that lru resize allows one client to hold $LIMIT locks
10759 # for 10h. After that locks begin to be killed by client.
10761 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
10763 if [ $LIMIT -lt $LRU_SIZE ]; then
10764 skip "Limit is too small $LIMIT"
10767 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
10768 # killing locks. Some time was spent for creating locks. This means
10769 # that up to the moment of sleep finish we must have killed some of
10770 # them (10-100 locks). This depends on how fast ther were created.
10771 # Many of them were touched in almost the same moment and thus will
10772 # be killed in groups.
10773 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
10775 # Use $LRU_SIZE_B here to take into account real number of locks
10776 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
10777 local LRU_SIZE_B=$LRU_SIZE
10779 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
10780 log "OLD_LVF=$OLD_LVF"
10781 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
10783 # Let's make sure that we really have some margin. Client checks
10784 # cached locks every 10 sec.
10785 SLEEP=$((SLEEP+20))
10786 log "Sleep ${SLEEP} sec"
10788 while ((SEC<$SLEEP)); do
10792 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
10793 echo -n "$LRU_SIZE"
10796 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
10797 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
10799 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
10800 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
10801 unlinkmany $DIR/$tdir/f $NR
10805 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
10806 log "unlink $NR files at $DIR/$tdir"
10807 unlinkmany $DIR/$tdir/f $NR
10809 run_test 124a "lru resize ======================================="
10811 get_max_pool_limit()
10813 local limit=$($LCTL get_param \
10814 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
10816 for l in $limit; do
10817 if [[ $l -gt $max ]]; then
10825 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10826 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10827 skip_env "no lru resize on server"
10829 LIMIT=$(get_max_pool_limit)
10831 NR=$(($(default_lru_size)*20))
10832 if [[ $NR -gt $LIMIT ]]; then
10833 log "Limit lock number by $LIMIT locks"
10837 IFree=$(mdsrate_inodes_available)
10838 if [ $IFree -lt $NR ]; then
10839 log "Limit lock number by $IFree inodes"
10843 lru_resize_disable mdc
10844 test_mkdir -p $DIR/$tdir/disable_lru_resize
10846 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
10847 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
10848 cancel_lru_locks mdc
10851 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10854 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10857 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10861 nolruresize_delta=$((etime-stime))
10862 log "ls -la time: $nolruresize_delta seconds"
10863 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10864 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
10866 lru_resize_enable mdc
10867 test_mkdir -p $DIR/$tdir/enable_lru_resize
10869 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
10870 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
10871 cancel_lru_locks mdc
10874 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10877 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10880 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10884 lruresize_delta=$((etime-stime))
10885 log "ls -la time: $lruresize_delta seconds"
10886 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10888 if [ $lruresize_delta -gt $nolruresize_delta ]; then
10889 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
10890 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
10891 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
10893 log "lru resize performs the same with no lru resize"
10895 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
10897 run_test 124b "lru resize (performance test) ======================="
10900 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10901 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10902 skip_env "no lru resize on server"
10904 # cache ununsed locks on client
10906 cancel_lru_locks mdc
10907 test_mkdir $DIR/$tdir
10908 createmany -o $DIR/$tdir/f $nr ||
10909 error "failed to create $nr files in $DIR/$tdir"
10910 ls -l $DIR/$tdir > /dev/null
10912 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10913 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10914 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10915 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10916 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10918 # set lru_max_age to 1 sec
10919 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10920 echo "sleep $((recalc_p * 2)) seconds..."
10921 sleep $((recalc_p * 2))
10923 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10924 # restore lru_max_age
10925 $LCTL set_param -n $nsdir.lru_max_age $max_age
10926 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10927 unlinkmany $DIR/$tdir/f $nr
10929 run_test 124c "LRUR cancel very aged locks"
10932 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10933 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10934 skip_env "no lru resize on server"
10936 # cache ununsed locks on client
10939 lru_resize_disable mdc
10940 stack_trap "lru_resize_enable mdc" EXIT
10942 cancel_lru_locks mdc
10944 # asynchronous object destroy at MDT could cause bl ast to client
10945 test_mkdir $DIR/$tdir
10946 createmany -o $DIR/$tdir/f $nr ||
10947 error "failed to create $nr files in $DIR/$tdir"
10948 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
10950 ls -l $DIR/$tdir > /dev/null
10952 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10953 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10954 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10955 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10957 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10959 # set lru_max_age to 1 sec
10960 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10961 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
10963 echo "sleep $((recalc_p * 2)) seconds..."
10964 sleep $((recalc_p * 2))
10966 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10968 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10970 run_test 124d "cancel very aged locks if lru-resize diasbaled"
10972 test_125() { # 13358
10973 $LCTL get_param -n llite.*.client_type | grep -q local ||
10974 skip "must run as local client"
10975 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
10976 skip_env "must have acl enabled"
10977 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
10979 test_mkdir $DIR/$tdir
10980 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
10981 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
10982 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
10984 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
10986 test_126() { # bug 12829/13455
10987 $GSS && skip_env "must run as gss disabled"
10988 $LCTL get_param -n llite.*.client_type | grep -q local ||
10989 skip "must run as local client"
10990 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
10992 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
10993 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
10995 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
10997 run_test 126 "check that the fsgid provided by the client is taken into account"
10999 test_127a() { # bug 15521
11000 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11002 $LFS setstripe -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
11003 $LCTL set_param osc.*.stats=0
11004 FSIZE=$((2048 * 1024))
11005 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
11006 cancel_lru_locks osc
11007 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
11009 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
11010 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
11011 echo "got $COUNT $NAME"
11012 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
11013 eval $NAME=$COUNT || error "Wrong proc format"
11016 read_bytes|write_bytes)
11017 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
11018 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
11019 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
11020 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
11021 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
11022 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
11023 error "sumsquare is too small: $SUMSQ"
11024 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
11025 error "sumsquare is too big: $SUMSQ"
11029 done < $DIR/${tfile}.tmp
11031 #check that we actually got some stats
11032 [ "$read_bytes" ] || error "Missing read_bytes stats"
11033 [ "$write_bytes" ] || error "Missing write_bytes stats"
11034 [ "$read_bytes" != 0 ] || error "no read done"
11035 [ "$write_bytes" != 0 ] || error "no write done"
11037 run_test 127a "verify the client stats are sane"
11039 test_127b() { # bug LU-333
11040 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11041 local name count samp unit min max sum sumsq
11043 $LCTL set_param llite.*.stats=0
11045 # perform 2 reads and writes so MAX is different from SUM.
11046 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
11047 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
11048 cancel_lru_locks osc
11049 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
11050 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
11052 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
11053 while read name count samp unit min max sum sumsq; do
11054 echo "got $count $name"
11055 eval $name=$count || error "Wrong proc format"
11059 [ $count -ne 2 ] && error "count is not 2: $count"
11060 [ $min -ne $PAGE_SIZE ] &&
11061 error "min is not $PAGE_SIZE: $min"
11062 [ $max -ne $PAGE_SIZE ] &&
11063 error "max is incorrect: $max"
11064 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
11065 error "sum is wrong: $sum"
11068 [ $count -ne 2 ] && error "count is not 2: $count"
11069 [ $min -ne $PAGE_SIZE ] &&
11070 error "min is not $PAGE_SIZE: $min"
11071 [ $max -ne $PAGE_SIZE ] &&
11072 error "max is incorrect: $max"
11073 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
11074 error "sum is wrong: $sum"
11078 done < $TMP/$tfile.tmp
11080 #check that we actually got some stats
11081 [ "$read_bytes" ] || error "Missing read_bytes stats"
11082 [ "$write_bytes" ] || error "Missing write_bytes stats"
11083 [ "$read_bytes" != 0 ] || error "no read done"
11084 [ "$write_bytes" != 0 ] || error "no write done"
11086 rm -f $TMP/${tfile}.tmp
11088 run_test 127b "verify the llite client stats are sane"
11090 test_127c() { # LU-12394
11091 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11098 $LCTL set_param llite.*.extents_stats=1
11099 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
11101 # Use two stripes so there is enough space in default config
11102 $LFS setstripe -c 2 $DIR/$tfile
11104 # Extent stats start at 0-4K and go in power of two buckets
11105 # LL_HIST_START = 12 --> 2^12 = 4K
11106 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
11107 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
11109 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
11111 # Write and read, 2x each, second time at a non-zero offset
11112 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
11113 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
11114 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
11115 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
11119 $LCTL get_param llite.*.extents_stats
11122 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
11124 local bucket=$($LCTL get_param -n llite.*.extents_stats |
11126 reads=$(echo $bucket | awk '{print $5}')
11127 writes=$(echo $bucket | awk '{print $9}')
11128 [ "$reads" -eq $count ] ||
11129 error "$reads reads in < $bsize bucket, expect $count"
11130 [ "$writes" -eq $count ] ||
11131 error "$writes writes in < $bsize bucket, expect $count"
11134 # Test mmap write and read
11135 $LCTL set_param llite.*.extents_stats=c
11137 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
11138 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
11139 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
11141 $LCTL get_param llite.*.extents_stats
11143 count=$(((size*1024) / PAGE_SIZE))
11145 bsize=$((2 * PAGE_SIZE / 1024))K
11147 bucket=$($LCTL get_param -n llite.*.extents_stats |
11149 reads=$(echo $bucket | awk '{print $5}')
11150 writes=$(echo $bucket | awk '{print $9}')
11151 # mmap writes fault in the page first, creating an additonal read
11152 [ "$reads" -eq $((2 * count)) ] ||
11153 error "$reads reads in < $bsize bucket, expect $count"
11154 [ "$writes" -eq $count ] ||
11155 error "$writes writes in < $bsize bucket, expect $count"
11157 run_test 127c "test llite extent stats with regular & mmap i/o"
11159 test_128() { # bug 15212
11161 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
11166 result=$(grep error $TMP/$tfile.log)
11167 rm -f $DIR/$tfile $TMP/$tfile.log
11168 [ -z "$result" ] ||
11169 error "consecutive find's under interactive lfs failed"
11171 run_test 128 "interactive lfs for 2 consecutive find's"
11173 set_dir_limits () {
11178 local ldproc=/proc/fs/ldiskfs
11179 local facets=$(get_facets MDS)
11181 for facet in ${facets//,/ }; do
11182 canondev=$(ldiskfs_canon \
11183 *.$(convert_facet2label $facet).mntdev $facet)
11184 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
11185 ldproc=/sys/fs/ldiskfs
11186 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
11187 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
11191 check_mds_dmesg() {
11192 local facets=$(get_facets MDS)
11193 for facet in ${facets//,/ }; do
11194 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
11200 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11201 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
11202 skip "Need MDS version with at least 2.5.56"
11203 if [ "$mds1_FSTYPE" != ldiskfs ]; then
11204 skip_env "ldiskfs only test"
11206 remote_mds_nodsh && skip "remote MDS with nodsh"
11210 local has_warning=false
11213 mkdir -p $DIR/$tdir
11215 # block size of mds1
11216 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
11217 set_dir_limits $maxsize $maxsize
11218 local dirsize=$(stat -c%s "$DIR/$tdir")
11220 while [[ $dirsize -le $maxsize ]]; do
11221 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
11223 if ! $has_warning; then
11224 check_mds_dmesg '"is approaching"' && has_warning=true
11226 # check two errors:
11227 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
11228 # EFBIG for previous versions included in ldiskfs series
11229 if [ $rc -eq $EFBIG ] || [ $rc -eq $ENOSPC ]; then
11231 echo "return code $rc received as expected"
11233 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
11234 error_exit "create failed w/o dir size limit"
11236 check_mds_dmesg '"has reached"' ||
11237 error_exit "reached message should be output"
11239 [ $has_warning = "false" ] &&
11240 error_exit "warning message should be output"
11242 dirsize=$(stat -c%s "$DIR/$tdir")
11244 [[ $dirsize -ge $maxsize ]] && return 0
11245 error_exit "current dir size $dirsize, " \
11246 "previous limit $maxsize"
11247 elif [ $rc -ne 0 ]; then
11249 error_exit "return $rc received instead of expected " \
11250 "$EFBIG or $ENOSPC, files in dir $dirsize"
11252 nfiles=$((nfiles + 1))
11253 dirsize=$(stat -c%s "$DIR/$tdir")
11257 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
11259 run_test 129 "test directory size limit ========================"
11268 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11269 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11271 trap cleanup_130 EXIT RETURN
11273 local fm_file=$DIR/$tfile
11274 $LFS setstripe -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
11275 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
11276 error "dd failed for $fm_file"
11278 # LU-1795: test filefrag/FIEMAP once, even if unsupported
11279 filefrag -ves $fm_file
11281 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11282 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11283 [ $RC != 0 ] && error "filefrag $fm_file failed"
11285 filefrag_op=$(filefrag -ve -k $fm_file |
11286 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11287 lun=$($LFS getstripe -i $fm_file)
11289 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
11292 for line in $filefrag_op
11294 frag_lun=`echo $line | cut -d: -f5`
11295 ext_len=`echo $line | cut -d: -f4`
11296 if (( $frag_lun != $lun )); then
11298 error "FIEMAP on 1-stripe file($fm_file) failed"
11301 (( tot_len += ext_len ))
11304 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
11306 error "FIEMAP on 1-stripe file($fm_file) failed;"
11312 echo "FIEMAP on single striped file succeeded"
11314 run_test 130a "FIEMAP (1-stripe file)"
11317 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11319 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11320 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11322 trap cleanup_130 EXIT RETURN
11324 local fm_file=$DIR/$tfile
11325 $LFS setstripe -S 65536 -c $OSTCOUNT $fm_file ||
11326 error "setstripe on $fm_file"
11327 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11328 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11330 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
11331 error "dd failed on $fm_file"
11333 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11334 filefrag_op=$(filefrag -ve -k $fm_file |
11335 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11337 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11338 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11343 for line in $filefrag_op
11345 frag_lun=$(echo $line | cut -d: -f5 |
11346 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11347 ext_len=$(echo $line | cut -d: -f4)
11348 if (( $frag_lun != $last_lun )); then
11349 if (( tot_len != 1024 )); then
11351 error "FIEMAP on $fm_file failed; returned " \
11352 "len $tot_len for OST $last_lun instead of 1024"
11355 (( num_luns += 1 ))
11359 (( tot_len += ext_len ))
11362 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
11364 error "FIEMAP on $fm_file failed; returned wrong number of " \
11365 "luns or wrong len for OST $last_lun"
11371 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
11373 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
11376 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11378 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11379 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11381 trap cleanup_130 EXIT RETURN
11383 local fm_file=$DIR/$tfile
11384 $LFS setstripe -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
11385 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11386 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11388 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
11389 error "dd failed on $fm_file"
11391 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11392 filefrag_op=$(filefrag -ve -k $fm_file |
11393 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11395 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11396 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11401 for line in $filefrag_op
11403 frag_lun=$(echo $line | cut -d: -f5 |
11404 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11405 ext_len=$(echo $line | cut -d: -f4)
11406 if (( $frag_lun != $last_lun )); then
11407 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
11408 if (( logical != 512 )); then
11410 error "FIEMAP on $fm_file failed; returned " \
11411 "logical start for lun $logical instead of 512"
11414 if (( tot_len != 512 )); then
11416 error "FIEMAP on $fm_file failed; returned " \
11417 "len $tot_len for OST $last_lun instead of 1024"
11420 (( num_luns += 1 ))
11424 (( tot_len += ext_len ))
11427 if (( num_luns != 2 || tot_len != 512 )); then
11429 error "FIEMAP on $fm_file failed; returned wrong number of " \
11430 "luns or wrong len for OST $last_lun"
11436 echo "FIEMAP on 2-stripe file with hole succeeded"
11438 run_test 130c "FIEMAP (2-stripe file with hole)"
11441 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
11443 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11444 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11446 trap cleanup_130 EXIT RETURN
11448 local fm_file=$DIR/$tfile
11449 $LFS setstripe -S 65536 -c $OSTCOUNT $fm_file ||
11450 error "setstripe on $fm_file"
11451 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11452 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11454 local actual_stripe_count=$($LFS getstripe -c $fm_file)
11455 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
11456 error "dd failed on $fm_file"
11458 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11459 filefrag_op=$(filefrag -ve -k $fm_file |
11460 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11462 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11463 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11468 for line in $filefrag_op
11470 frag_lun=$(echo $line | cut -d: -f5 |
11471 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11472 ext_len=$(echo $line | cut -d: -f4)
11473 if (( $frag_lun != $last_lun )); then
11474 if (( tot_len != 1024 )); then
11476 error "FIEMAP on $fm_file failed; returned " \
11477 "len $tot_len for OST $last_lun instead of 1024"
11480 (( num_luns += 1 ))
11484 (( tot_len += ext_len ))
11487 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
11489 error "FIEMAP on $fm_file failed; returned wrong number of " \
11490 "luns or wrong len for OST $last_lun"
11496 echo "FIEMAP on N-stripe file succeeded"
11498 run_test 130d "FIEMAP (N-stripe file)"
11501 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11503 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11504 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11506 trap cleanup_130 EXIT RETURN
11508 local fm_file=$DIR/$tfile
11509 $LFS setstripe -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11510 [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] &&
11511 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11514 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11515 for ((i = 0; i < $NUM_BLKS; i++))
11517 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11520 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11521 filefrag_op=$(filefrag -ve -k $fm_file |
11522 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11524 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11525 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11530 for line in $filefrag_op
11532 frag_lun=$(echo $line | cut -d: -f5 |
11533 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11534 ext_len=$(echo $line | cut -d: -f4)
11535 if (( $frag_lun != $last_lun )); then
11536 if (( tot_len != $EXPECTED_LEN )); then
11538 error "FIEMAP on $fm_file failed; returned " \
11539 "len $tot_len for OST $last_lun instead " \
11543 (( num_luns += 1 ))
11547 (( tot_len += ext_len ))
11550 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11552 error "FIEMAP on $fm_file failed; returned wrong number " \
11553 "of luns or wrong len for OST $last_lun"
11559 echo "FIEMAP with continuation calls succeeded"
11561 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11564 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11565 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11567 local fm_file=$DIR/$tfile
11568 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11569 error "multiop create with lov_delay_create on $fm_file"
11571 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11572 filefrag_extents=$(filefrag -vek $fm_file |
11573 awk '/extents? found/ { print $2 }')
11574 if [[ "$filefrag_extents" != "0" ]]; then
11575 error "FIEMAP on $fm_file failed; " \
11576 "returned $filefrag_extents expected 0"
11581 run_test 130f "FIEMAP (unstriped file)"
11583 # Test for writev/readv
11585 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11586 error "writev test failed"
11587 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11588 error "readv failed"
11591 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11594 local fsize=$((524288 + 1048576 + 1572864))
11595 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11596 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11597 error "append writev test failed"
11599 ((fsize += 1572864 + 1048576))
11600 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11601 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11602 error "append writev test failed"
11605 run_test 131b "test append writev"
11608 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11611 run_test 131c "test read/write on file w/o objects"
11614 rwv -f $DIR/$tfile -w -n 1 1572864
11615 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11616 if [ "$NOB" != 1572864 ]; then
11617 error "Short read filed: read $NOB bytes instead of 1572864"
11621 run_test 131d "test short read"
11624 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11625 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11626 error "read hitting hole failed"
11629 run_test 131e "test read hitting hole"
11638 mds*) res=$(do_facet $facet \
11639 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11641 ost*) res=$(do_facet $facet \
11642 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
11644 *) error "Wrong facet '$facet'" ;;
11646 [ "$res" ] || error "The counter for $op on $facet was not incremented"
11647 # if the argument $3 is zero, it means any stat increment is ok.
11648 if [[ $want -gt 0 ]]; then
11649 local count=$(echo $res | awk '{ print $2 }')
11650 [[ $count -ne $want ]] &&
11651 error "The $op counter on $facet is $count, not $want"
11656 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11657 remote_ost_nodsh && skip "remote OST with nodsh"
11658 remote_mds_nodsh && skip "remote MDS with nodsh"
11659 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11660 skip_env "MDS doesn't support rename stats"
11662 local testdir=$DIR/${tdir}/stats_testdir
11664 mkdir -p $DIR/${tdir}
11667 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11668 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11670 # verify mdt stats first.
11671 mkdir ${testdir} || error "mkdir failed"
11672 check_stats $SINGLEMDS "mkdir" 1
11673 touch ${testdir}/${tfile} || error "touch failed"
11674 check_stats $SINGLEMDS "open" 1
11675 check_stats $SINGLEMDS "close" 1
11676 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
11677 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
11678 check_stats $SINGLEMDS "mknod" 2
11680 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
11681 check_stats $SINGLEMDS "unlink" 1
11682 rm -f ${testdir}/${tfile} || error "file remove failed"
11683 check_stats $SINGLEMDS "unlink" 2
11685 # remove working dir and check mdt stats again.
11686 rmdir ${testdir} || error "rmdir failed"
11687 check_stats $SINGLEMDS "rmdir" 1
11689 local testdir1=$DIR/${tdir}/stats_testdir1
11690 mkdir -p ${testdir}
11691 mkdir -p ${testdir1}
11692 touch ${testdir1}/test1
11693 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
11694 check_stats $SINGLEMDS "crossdir_rename" 1
11696 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
11697 check_stats $SINGLEMDS "samedir_rename" 1
11699 rm -rf $DIR/${tdir}
11701 run_test 133a "Verifying MDT stats ========================================"
11706 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11707 remote_ost_nodsh && skip "remote OST with nodsh"
11708 remote_mds_nodsh && skip "remote MDS with nodsh"
11710 local testdir=$DIR/${tdir}/stats_testdir
11712 mkdir -p ${testdir} || error "mkdir failed"
11713 touch ${testdir}/${tfile} || error "touch failed"
11714 cancel_lru_locks mdc
11717 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11718 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11720 # extra mdt stats verification.
11721 chmod 444 ${testdir}/${tfile} || error "chmod failed"
11722 check_stats $SINGLEMDS "setattr" 1
11723 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11724 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
11726 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
11727 check_stats $SINGLEMDS "getattr" 1
11729 rm -rf $DIR/${tdir}
11731 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
11732 # so the check below is not reliable
11733 [ $MDSCOUNT -eq 1 ] || return 0
11735 # Sleep to avoid a cached response.
11736 #define OBD_STATFS_CACHE_SECONDS 1
11738 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11739 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11740 $LFS df || error "lfs failed"
11741 check_stats $SINGLEMDS "statfs" 1
11743 # check aggregated statfs (LU-10018)
11744 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
11746 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
11749 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11750 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11752 check_stats $SINGLEMDS "statfs" 1
11754 # We want to check that the client didn't send OST_STATFS to
11755 # ost1 but the MDT also uses OST_STATFS for precreate. So some
11756 # extra care is needed here.
11757 if remote_mds; then
11758 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
11759 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
11761 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
11762 [ "$res" ] && error "OST got STATFS"
11767 run_test 133b "Verifying extra MDT stats =================================="
11770 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11771 remote_ost_nodsh && skip "remote OST with nodsh"
11772 remote_mds_nodsh && skip "remote MDS with nodsh"
11774 local testdir=$DIR/$tdir/stats_testdir
11776 test_mkdir -p $testdir
11778 # verify obdfilter stats.
11779 $LFS setstripe -c 1 -i 0 $testdir/$tfile
11781 cancel_lru_locks osc
11782 wait_delete_completed
11785 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11786 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11788 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
11791 cancel_lru_locks osc
11792 check_stats ost1 "write" 1
11794 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
11795 check_stats ost1 "read" 1
11797 > $testdir/$tfile || error "truncate failed"
11798 check_stats ost1 "punch" 1
11800 rm -f $testdir/$tfile || error "file remove failed"
11801 wait_delete_completed
11802 check_stats ost1 "destroy" 1
11806 run_test 133c "Verifying OST stats ========================================"
11813 while [ $value -ge 2 ]; do
11818 if [ $orig -gt $order ]; then
11826 local size=('K' 'M' 'G' 'T');
11828 local size_string=$value
11830 while [ $value -ge 1024 ]; do
11831 if [ $i -gt 3 ]; then
11832 #T is the biggest unit we get here, if that is bigger,
11834 size_string=${value}T
11837 value=$((value >> 10))
11838 if [ $value -lt 1024 ]; then
11839 size_string=${value}${size[$i]}
11848 get_rename_size() {
11850 local context=${2:-.}
11851 local sample=$(do_facet $SINGLEMDS $LCTL \
11852 get_param mdt.$FSNAME-MDT0000.rename_stats |
11853 grep -A1 $context |
11854 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
11859 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11860 remote_ost_nodsh && skip "remote OST with nodsh"
11861 remote_mds_nodsh && skip "remote MDS with nodsh"
11862 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11863 skip_env "MDS doesn't support rename stats"
11865 local testdir1=$DIR/${tdir}/stats_testdir1
11866 local testdir2=$DIR/${tdir}/stats_testdir2
11867 mkdir -p $DIR/${tdir}
11869 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11871 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
11872 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
11874 createmany -o $testdir1/test 512 || error "createmany failed"
11876 # check samedir rename size
11877 mv ${testdir1}/test0 ${testdir1}/test_0
11879 local testdir1_size=$(ls -l $DIR/${tdir} |
11880 awk '/stats_testdir1/ {print $5}')
11881 local testdir2_size=$(ls -l $DIR/${tdir} |
11882 awk '/stats_testdir2/ {print $5}')
11884 testdir1_size=$(order_2 $testdir1_size)
11885 testdir2_size=$(order_2 $testdir2_size)
11887 testdir1_size=$(size_in_KMGT $testdir1_size)
11888 testdir2_size=$(size_in_KMGT $testdir2_size)
11890 echo "source rename dir size: ${testdir1_size}"
11891 echo "target rename dir size: ${testdir2_size}"
11893 local cmd="do_facet $SINGLEMDS $LCTL "
11894 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
11896 eval $cmd || error "$cmd failed"
11897 local samedir=$($cmd | grep 'same_dir')
11898 local same_sample=$(get_rename_size $testdir1_size)
11899 [ -z "$samedir" ] && error "samedir_rename_size count error"
11900 [[ $same_sample -eq 1 ]] ||
11901 error "samedir_rename_size error $same_sample"
11902 echo "Check same dir rename stats success"
11904 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11906 # check crossdir rename size
11907 mv ${testdir1}/test_0 ${testdir2}/test_0
11909 testdir1_size=$(ls -l $DIR/${tdir} |
11910 awk '/stats_testdir1/ {print $5}')
11911 testdir2_size=$(ls -l $DIR/${tdir} |
11912 awk '/stats_testdir2/ {print $5}')
11914 testdir1_size=$(order_2 $testdir1_size)
11915 testdir2_size=$(order_2 $testdir2_size)
11917 testdir1_size=$(size_in_KMGT $testdir1_size)
11918 testdir2_size=$(size_in_KMGT $testdir2_size)
11920 echo "source rename dir size: ${testdir1_size}"
11921 echo "target rename dir size: ${testdir2_size}"
11923 eval $cmd || error "$cmd failed"
11924 local crossdir=$($cmd | grep 'crossdir')
11925 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
11926 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
11927 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
11928 [[ $src_sample -eq 1 ]] ||
11929 error "crossdir_rename_size error $src_sample"
11930 [[ $tgt_sample -eq 1 ]] ||
11931 error "crossdir_rename_size error $tgt_sample"
11932 echo "Check cross dir rename stats success"
11933 rm -rf $DIR/${tdir}
11935 run_test 133d "Verifying rename_stats ========================================"
11938 remote_mds_nodsh && skip "remote MDS with nodsh"
11939 remote_ost_nodsh && skip "remote OST with nodsh"
11940 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11942 local testdir=$DIR/${tdir}/stats_testdir
11943 local ctr f0 f1 bs=32768 count=42 sum
11945 mkdir -p ${testdir} || error "mkdir failed"
11947 $LFS setstripe -c 1 -i 0 ${testdir}/${tfile}
11949 for ctr in {write,read}_bytes; do
11951 cancel_lru_locks osc
11953 do_facet ost1 $LCTL set_param -n \
11954 "obdfilter.*.exports.clear=clear"
11956 if [ $ctr = write_bytes ]; then
11958 f1=${testdir}/${tfile}
11960 f0=${testdir}/${tfile}
11964 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
11967 cancel_lru_locks osc
11969 sum=$(do_facet ost1 $LCTL get_param \
11970 "obdfilter.*.exports.*.stats" |
11971 awk -v ctr=$ctr 'BEGIN { sum = 0 }
11972 $1 == ctr { sum += $7 }
11973 END { printf("%0.0f", sum) }')
11975 if ((sum != bs * count)); then
11976 error "Bad $ctr sum, expected $((bs * count)), got $sum"
11980 rm -rf $DIR/${tdir}
11982 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
11984 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
11986 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
11987 # not honor the -ignore_readdir_race option correctly. So we call
11988 # error_ignore() rather than error() in these cases. See LU-11152.
11990 if (find --version; do_facet mds1 find --version) |
11991 grep -q '\b4\.5\.1[1-4]\b'; then
11992 error_ignore LU-11152 "$@"
11999 # First without trusting modes.
12000 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
12001 echo "proc_dirs='$proc_dirs'"
12002 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
12003 find $proc_dirs -exec cat '{}' \; &> /dev/null
12005 # Second verifying readability.
12006 $LCTL get_param -R '*' &> /dev/null
12008 # Verifing writability with badarea_io.
12010 -ignore_readdir_race \
12012 -not -name force_lbug \
12013 -not -name changelog_mask \
12014 -exec badarea_io '{}' \; ||
12015 error_133 "find $proc_dirs failed"
12017 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
12020 remote_mds_nodsh && skip "remote MDS with nodsh"
12021 remote_ost_nodsh && skip "remote OST with nodsh"
12023 # eventually, this can also be replaced with "lctl get_param -R",
12024 # but not until that option is always available on the server
12026 for facet in mds1 ost1; do
12027 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
12028 skip_noexit "Too old lustre on $facet"
12029 local facet_proc_dirs=$(do_facet $facet \
12030 \\\ls -d $proc_regexp 2>/dev/null)
12031 echo "${facet}_proc_dirs='$facet_proc_dirs'"
12032 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
12033 do_facet $facet find $facet_proc_dirs \
12034 ! -name req_history \
12035 -exec cat '{}' \\\; &> /dev/null
12037 do_facet $facet find $facet_proc_dirs \
12038 ! -name req_history \
12040 -exec cat '{}' \\\; &> /dev/null ||
12041 error "proc file read failed"
12043 do_facet $facet find $facet_proc_dirs \
12044 -ignore_readdir_race \
12046 -not -name force_lbug \
12047 -not -name changelog_mask \
12048 -exec badarea_io '{}' \\\; ||
12049 error_133 "$facet find $facet_proc_dirs failed"
12052 # remount the FS in case writes/reads /proc break the FS
12053 cleanup || error "failed to unmount"
12054 setup || error "failed to setup"
12057 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
12060 remote_mds_nodsh && skip "remote MDS with nodsh"
12061 remote_ost_nodsh && skip "remote OST with nodsh"
12062 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
12063 skip "Need MDS version at least 2.9.54"
12067 for facet in client mds1 ost1; do
12068 local facet_proc_dirs=$(do_facet $facet \
12069 \\\ls -d $proc_regexp 2> /dev/null)
12070 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
12071 echo "${facet}_proc_dirs='$facet_proc_dirs'"
12072 # Get the list of files that are missing the terminating newline
12073 local missing=($(do_facet $facet \
12074 find ${facet_proc_dirs} -type f \| \
12075 while read F\; do \
12076 awk -v FS='\v' -v RS='\v\v' \
12077 "'END { if(NR>0 && \
12078 \\\$NF !~ /.*\\\n\$/) \
12079 print FILENAME}'" \
12082 [ ${#missing[*]} -eq 0 ] ||
12083 error "files do not end with newline: ${missing[*]}"
12086 run_test 133h "Proc files should end with newlines"
12089 remote_mds_nodsh && skip "remote MDS with nodsh"
12090 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
12091 skip "Need MDS version at least 2.7.54"
12093 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12094 cancel_lru_locks mdc
12096 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
12097 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
12098 [ $unused -eq 0 ] || error "$unused locks are not cleared"
12101 createmany -o $DIR/$tdir/f $nr ||
12102 error "failed to create $nr files in $DIR/$tdir"
12103 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
12105 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
12106 do_facet mds1 $LCTL set_param fail_loc=0x327
12107 do_facet mds1 $LCTL set_param fail_val=500
12110 echo "sleep 10 seconds ..."
12112 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
12114 do_facet mds1 $LCTL set_param fail_loc=0
12115 do_facet mds1 $LCTL set_param fail_val=0
12116 [ $lck_cnt -lt $unused ] ||
12117 error "No locks reclaimed, before:$unused, after:$lck_cnt"
12120 unlinkmany $DIR/$tdir/f $nr
12122 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
12125 remote_mds_nodsh && skip "remote MDS with nodsh"
12126 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
12127 skip "Need MDS version at least 2.7.54"
12129 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12130 cancel_lru_locks mdc
12132 local low_wm=$(do_facet mds1 $LCTL get_param -n \
12133 ldlm.lock_reclaim_threshold_mb)
12134 # disable reclaim temporarily
12135 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
12137 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
12138 do_facet mds1 $LCTL set_param fail_loc=0x328
12139 do_facet mds1 $LCTL set_param fail_val=500
12141 $LCTL set_param debug=+trace
12144 createmany -o $DIR/$tdir/f $nr &
12145 local create_pid=$!
12147 echo "Sleep $TIMEOUT seconds ..."
12149 if ! ps -p $create_pid > /dev/null 2>&1; then
12150 do_facet mds1 $LCTL set_param fail_loc=0
12151 do_facet mds1 $LCTL set_param fail_val=0
12152 do_facet mds1 $LCTL set_param \
12153 ldlm.lock_reclaim_threshold_mb=${low_wm}m
12154 error "createmany finished incorrectly!"
12156 do_facet mds1 $LCTL set_param fail_loc=0
12157 do_facet mds1 $LCTL set_param fail_val=0
12158 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
12159 wait $create_pid || return 1
12161 unlinkmany $DIR/$tdir/f $nr
12163 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
12165 test_140() { #bug-17379
12166 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12168 test_mkdir $DIR/$tdir
12169 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
12170 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
12172 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
12173 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
12175 while i=$((i + 1)); do
12177 cd $i || error "Changing to $i"
12178 ln -s ../stat stat || error "Creating stat symlink"
12179 # Read the symlink until ELOOP present,
12180 # not LBUGing the system is considered success,
12181 # we didn't overrun the stack.
12182 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
12183 if [ $ret -ne 0 ]; then
12184 if [ $ret -eq 40 ]; then
12187 error "Open stat symlink"
12193 echo "The symlink depth = $i"
12194 [ $i -eq 5 ] || [ $i -eq 7 ] || [ $i -eq 8 ] || [ $i -eq 40 ] ||
12195 error "Invalid symlink depth"
12197 # Test recursive symlink
12198 ln -s symlink_self symlink_self
12199 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
12200 echo "open symlink_self returns $ret"
12201 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
12203 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
12206 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12208 local TF="$TMP/$tfile"
12210 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12212 cancel_lru_locks $OSC
12213 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
12214 remount_client $MOUNT
12216 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
12219 $TRUNCATE $DIR/$tfile 6000
12220 cancel_lru_locks $OSC
12221 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
12224 echo "12345" >>$DIR/$tfile
12225 cancel_lru_locks $OSC
12226 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
12229 echo "12345" >>$DIR/$tfile
12230 cancel_lru_locks $OSC
12231 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
12236 run_test 150 "truncate/append tests"
12238 #LU-2902 roc_hit was not able to read all values from lproc
12239 function roc_hit_init() {
12240 local list=$(comma_list $(osts_nodes))
12241 local dir=$DIR/$tdir-check
12242 local file=$dir/$tfile
12248 #use setstripe to do a write to every ost
12249 for i in $(seq 0 $((OSTCOUNT-1))); do
12250 $LFS setstripe -c 1 -i $i $dir || error "$LFS setstripe $file failed"
12251 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
12252 idx=$(printf %04x $i)
12253 BEFORE=$(get_osd_param $list *OST*$idx stats |
12254 awk '$1 == "cache_access" {sum += $7}
12255 END { printf("%0.0f", sum) }')
12257 cancel_lru_locks osc
12258 cat $file >/dev/null
12260 AFTER=$(get_osd_param $list *OST*$idx stats |
12261 awk '$1 == "cache_access" {sum += $7}
12262 END { printf("%0.0f", sum) }')
12264 echo BEFORE:$BEFORE AFTER:$AFTER
12265 if ! let "AFTER - BEFORE == 4"; then
12267 error "roc_hit is not safe to use"
12275 function roc_hit() {
12276 local list=$(comma_list $(osts_nodes))
12277 echo $(get_osd_param $list '' stats |
12278 awk '$1 == "cache_hit" {sum += $7}
12279 END { printf("%0.0f", sum) }')
12282 function set_cache() {
12285 if [ "$2" == "off" ]; then
12288 local list=$(comma_list $(osts_nodes))
12289 set_osd_param $list '' $1_cache_enable $on
12291 cancel_lru_locks osc
12295 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12296 remote_ost_nodsh && skip "remote OST with nodsh"
12299 local list=$(comma_list $(osts_nodes))
12301 # check whether obdfilter is cache capable at all
12302 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
12303 skip "not cache-capable obdfilter"
12306 # check cache is enabled on all obdfilters
12307 if get_osd_param $list '' read_cache_enable | grep 0; then
12308 skip "oss cache is disabled"
12311 set_osd_param $list '' writethrough_cache_enable 1
12313 # check write cache is enabled on all obdfilters
12314 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
12315 skip "oss write cache is NOT enabled"
12320 #define OBD_FAIL_OBD_NO_LRU 0x609
12321 do_nodes $list $LCTL set_param fail_loc=0x609
12323 # pages should be in the case right after write
12324 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
12327 local BEFORE=$(roc_hit)
12328 cancel_lru_locks osc
12329 cat $DIR/$tfile >/dev/null
12330 local AFTER=$(roc_hit)
12332 do_nodes $list $LCTL set_param fail_loc=0
12334 if ! let "AFTER - BEFORE == CPAGES"; then
12335 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12338 # the following read invalidates the cache
12339 cancel_lru_locks osc
12340 set_osd_param $list '' read_cache_enable 0
12341 cat $DIR/$tfile >/dev/null
12343 # now data shouldn't be found in the cache
12345 cancel_lru_locks osc
12346 cat $DIR/$tfile >/dev/null
12348 if let "AFTER - BEFORE != 0"; then
12349 error "IN CACHE: before: $BEFORE, after: $AFTER"
12352 set_osd_param $list '' read_cache_enable 1
12355 run_test 151 "test cache on oss and controls ==============================="
12358 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12360 local TF="$TMP/$tfile"
12362 # simulate ENOMEM during write
12363 #define OBD_FAIL_OST_NOMEM 0x226
12364 lctl set_param fail_loc=0x80000226
12365 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12367 sync || error "sync failed"
12368 lctl set_param fail_loc=0
12370 # discard client's cache
12371 cancel_lru_locks osc
12373 # simulate ENOMEM during read
12374 lctl set_param fail_loc=0x80000226
12375 cmp $TF $DIR/$tfile || error "cmp failed"
12376 lctl set_param fail_loc=0
12380 run_test 152 "test read/write with enomem ============================"
12383 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
12385 run_test 153 "test if fdatasync does not crash ======================="
12387 dot_lustre_fid_permission_check() {
12389 local ffid=$MOUNT/.lustre/fid/$fid
12392 echo "stat fid $fid"
12393 stat $ffid > /dev/null || error "stat $ffid failed."
12394 echo "touch fid $fid"
12395 touch $ffid || error "touch $ffid failed."
12396 echo "write to fid $fid"
12397 cat /etc/hosts > $ffid || error "write $ffid failed."
12398 echo "read fid $fid"
12399 diff /etc/hosts $ffid || error "read $ffid failed."
12400 echo "append write to fid $fid"
12401 cat /etc/hosts >> $ffid || error "append write $ffid failed."
12402 echo "rename fid $fid"
12403 mv $ffid $test_dir/$tfile.1 &&
12404 error "rename $ffid to $tfile.1 should fail."
12405 touch $test_dir/$tfile.1
12406 mv $test_dir/$tfile.1 $ffid &&
12407 error "rename $tfile.1 to $ffid should fail."
12408 rm -f $test_dir/$tfile.1
12409 echo "truncate fid $fid"
12410 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
12411 echo "link fid $fid"
12412 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
12413 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
12414 echo "setfacl fid $fid"
12415 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
12416 echo "getfacl fid $fid"
12417 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
12419 echo "unlink fid $fid"
12420 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
12421 echo "mknod fid $fid"
12422 mknod $ffid c 1 3 && error "mknod $ffid should fail."
12424 fid=[0xf00000400:0x1:0x0]
12425 ffid=$MOUNT/.lustre/fid/$fid
12427 echo "stat non-exist fid $fid"
12428 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
12429 echo "write to non-exist fid $fid"
12430 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
12431 echo "link new fid $fid"
12432 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
12434 mkdir -p $test_dir/$tdir
12435 touch $test_dir/$tdir/$tfile
12436 fid=$($LFS path2fid $test_dir/$tdir)
12439 error "error: could not get fid for $test_dir/$dir/$tfile."
12441 ffid=$MOUNT/.lustre/fid/$fid
12444 ls $ffid > /dev/null || error "ls $ffid failed."
12445 echo "touch $fid/$tfile.1"
12446 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
12448 echo "touch $MOUNT/.lustre/fid/$tfile"
12449 touch $MOUNT/.lustre/fid/$tfile && \
12450 error "touch $MOUNT/.lustre/fid/$tfile should fail."
12452 echo "setxattr to $MOUNT/.lustre/fid"
12453 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
12455 echo "listxattr for $MOUNT/.lustre/fid"
12456 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
12458 echo "delxattr from $MOUNT/.lustre/fid"
12459 setfattr -x trusted.name1 $MOUNT/.lustre/fid
12461 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
12462 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
12463 error "touch invalid fid should fail."
12465 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
12466 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
12467 error "touch non-normal fid should fail."
12469 echo "rename $tdir to $MOUNT/.lustre/fid"
12470 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
12471 error "rename to $MOUNT/.lustre/fid should fail."
12473 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
12475 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
12476 local new_obf_mode=777
12478 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
12479 chmod $new_obf_mode $DIR/.lustre/fid ||
12480 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
12482 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
12483 [ $obf_mode -eq $new_obf_mode ] ||
12484 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
12486 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
12487 chmod $old_obf_mode $DIR/.lustre/fid ||
12488 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
12491 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
12492 fid=$($LFS path2fid $test_dir/$tfile-2)
12494 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
12496 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
12497 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
12498 error "create lov data thru .lustre failed"
12500 echo "cp /etc/passwd $test_dir/$tfile-2"
12501 cp /etc/passwd $test_dir/$tfile-2 ||
12502 error "copy to $test_dir/$tfile-2 failed."
12503 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
12504 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12505 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12507 rm -rf $test_dir/tfile.lnk
12508 rm -rf $test_dir/$tfile-2
12512 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12513 skip "Need MDS version at least 2.4.1"
12515 local tf=$DIR/$tfile
12518 local fid=$($LFS path2fid $tf)
12519 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12521 # check that we get the same pathname back
12522 local found=$($LFS fid2path $MOUNT "$fid")
12523 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12524 [ "$found" == "$tf" ] ||
12525 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12527 run_test 154A "lfs path2fid and fid2path basic checks"
12530 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12531 skip "Need MDS version at least 2.4.1"
12533 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12534 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12535 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12536 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12538 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12539 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12541 # check that we get the same pathname
12542 echo "PFID: $PFID, name: $name"
12543 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12544 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12545 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12546 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12548 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12550 run_test 154B "verify the ll_decode_linkea tool"
12553 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12554 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12555 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12556 skip "Need MDS version at least 2.2.51"
12557 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12559 cp /etc/hosts $DIR/$tfile
12561 fid=$($LFS path2fid $DIR/$tfile)
12563 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12565 dot_lustre_fid_permission_check "$fid" $DIR ||
12566 error "dot lustre permission check $fid failed"
12568 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12570 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12572 touch $MOUNT/.lustre/file &&
12573 error "creation is not allowed under .lustre"
12575 mkdir $MOUNT/.lustre/dir &&
12576 error "mkdir is not allowed under .lustre"
12580 run_test 154a "Open-by-FID"
12583 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12584 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12585 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12586 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12587 skip "Need MDS version at least 2.2.51"
12589 local remote_dir=$DIR/$tdir/remote_dir
12593 mkdir -p $DIR/$tdir
12594 $LFS mkdir -i $MDTIDX $remote_dir ||
12595 error "create remote directory failed"
12597 cp /etc/hosts $remote_dir/$tfile
12599 fid=$($LFS path2fid $remote_dir/$tfile)
12601 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12603 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12604 error "dot lustre permission check $fid failed"
12607 run_test 154b "Open-by-FID for remote directory"
12610 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12611 skip "Need MDS version at least 2.4.1"
12613 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12614 local FID1=$($LFS path2fid $DIR/$tfile.1)
12615 local FID2=$($LFS path2fid $DIR/$tfile.2)
12616 local FID3=$($LFS path2fid $DIR/$tfile.3)
12619 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12620 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12621 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12623 [ "$FID" = "${!want}" ] ||
12624 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12628 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12630 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12631 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12635 run_test 154c "lfs path2fid and fid2path multiple arguments"
12638 remote_mds_nodsh && skip "remote MDS with nodsh"
12639 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12640 skip "Need MDS version at least 2.5.53"
12642 if remote_mds; then
12643 nid=$($LCTL list_nids | sed "s/\./\\\./g")
12647 local proc_ofile="mdt.*.exports.'$nid'.open_files"
12654 local fid=$($LFS path2fid $DIR/$tfile)
12657 cmd="exec $fd<$DIR/$tfile"
12659 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
12660 echo "$fid_list" | grep "$fid"
12663 cmd="exec $fd>/dev/null"
12665 if [ $rc -ne 0 ]; then
12666 error "FID $fid not found in open files list $fid_list"
12669 run_test 154d "Verify open file fid"
12673 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
12674 skip "Need MDS version at least 2.6.50"
12676 if ls -a $MOUNT | grep -q '^\.lustre$'; then
12677 error ".lustre returned by readdir"
12680 run_test 154e ".lustre is not returned by readdir"
12683 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12685 # create parent directory on a single MDT to avoid cross-MDT hardlinks
12686 test_mkdir -p -c1 $DIR/$tdir/d
12687 # test dirs inherit from its stripe
12688 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
12689 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
12690 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
12691 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
12694 # get fid of parents
12695 local FID0=$($LFS path2fid $DIR/$tdir/d)
12696 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
12697 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
12698 local FID3=$($LFS path2fid $DIR)
12700 # check that path2fid --parents returns expected <parent_fid>/name
12701 # 1) test for a directory (single parent)
12702 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
12703 [ "$parent" == "$FID0/foo1" ] ||
12704 error "expected parent: $FID0/foo1, got: $parent"
12706 # 2) test for a file with nlink > 1 (multiple parents)
12707 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
12708 echo "$parent" | grep -F "$FID1/$tfile" ||
12709 error "$FID1/$tfile not returned in parent list"
12710 echo "$parent" | grep -F "$FID2/link" ||
12711 error "$FID2/link not returned in parent list"
12713 # 3) get parent by fid
12714 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
12715 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12716 echo "$parent" | grep -F "$FID1/$tfile" ||
12717 error "$FID1/$tfile not returned in parent list (by fid)"
12718 echo "$parent" | grep -F "$FID2/link" ||
12719 error "$FID2/link not returned in parent list (by fid)"
12721 # 4) test for entry in root directory
12722 parent=$($LFS path2fid --parents $DIR/f)
12723 echo "$parent" | grep -F "$FID3/f" ||
12724 error "$FID3/f not returned in parent list"
12726 # 5) test it on root directory
12727 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
12728 error "$MOUNT should not have parents"
12730 # enable xattr caching and check that linkea is correctly updated
12731 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
12732 save_lustre_params client "llite.*.xattr_cache" > $save
12733 lctl set_param llite.*.xattr_cache 1
12735 # 6.1) linkea update on rename
12736 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
12738 # get parents by fid
12739 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12740 # foo1 should no longer be returned in parent list
12741 echo "$parent" | grep -F "$FID1" &&
12742 error "$FID1 should no longer be in parent list"
12743 # the new path should appear
12744 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
12745 error "$FID2/$tfile.moved is not in parent list"
12747 # 6.2) linkea update on unlink
12748 rm -f $DIR/$tdir/d/foo2/link
12749 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12750 # foo2/link should no longer be returned in parent list
12751 echo "$parent" | grep -F "$FID2/link" &&
12752 error "$FID2/link should no longer be in parent list"
12756 restore_lustre_params < $save
12759 run_test 154f "get parent fids by reading link ea"
12763 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12764 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
12765 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
12766 skip "Need MDS version at least 2.6.92"
12768 mkdir -p $DIR/$tdir
12769 llapi_fid_test -d $DIR/$tdir
12771 run_test 154g "various llapi FID tests"
12773 test_155_small_load() {
12774 local temp=$TMP/$tfile
12775 local file=$DIR/$tfile
12777 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
12778 error "dd of=$temp bs=6096 count=1 failed"
12780 cancel_lru_locks $OSC
12781 cmp $temp $file || error "$temp $file differ"
12783 $TRUNCATE $temp 6000
12784 $TRUNCATE $file 6000
12785 cmp $temp $file || error "$temp $file differ (truncate1)"
12787 echo "12345" >>$temp
12788 echo "12345" >>$file
12789 cmp $temp $file || error "$temp $file differ (append1)"
12791 echo "12345" >>$temp
12792 echo "12345" >>$file
12793 cmp $temp $file || error "$temp $file differ (append2)"
12799 test_155_big_load() {
12800 remote_ost_nodsh && skip "remote OST with nodsh"
12802 local temp=$TMP/$tfile
12803 local file=$DIR/$tfile
12806 local cache_size=$(do_facet ost$((MAXI+1)) \
12807 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
12808 local large_file_size=$((cache_size * 2))
12810 echo "OSS cache size: $cache_size KB"
12811 echo "Large file size: $large_file_size KB"
12813 [ $MAXV -le $large_file_size ] &&
12814 skip_env "max available OST size needs > $large_file_size KB"
12816 $LFS setstripe $file -c 1 -i $MAXI || error "$LFS setstripe $file failed"
12818 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
12819 error "dd of=$temp bs=$large_file_size count=1k failed"
12822 cancel_lru_locks osc
12823 cmp $temp $file || error "$temp $file differ"
12829 save_writethrough() {
12830 local facets=$(get_facets OST)
12832 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
12836 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12838 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12840 save_writethrough $p
12843 set_cache writethrough on
12844 test_155_small_load
12845 restore_lustre_params < $p
12848 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
12851 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12853 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12855 save_writethrough $p
12858 set_cache writethrough off
12859 test_155_small_load
12860 restore_lustre_params < $p
12863 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
12866 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12868 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12870 save_writethrough $p
12873 set_cache writethrough on
12874 test_155_small_load
12875 restore_lustre_params < $p
12878 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
12881 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12883 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12885 save_writethrough $p
12888 set_cache writethrough off
12889 test_155_small_load
12890 restore_lustre_params < $p
12893 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
12896 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12898 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12900 save_writethrough $p
12903 set_cache writethrough on
12905 restore_lustre_params < $p
12908 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
12911 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12913 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12915 save_writethrough $p
12918 set_cache writethrough off
12920 restore_lustre_params < $p
12923 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
12926 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12928 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12930 save_writethrough $p
12933 set_cache writethrough on
12935 restore_lustre_params < $p
12938 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
12941 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12943 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12945 save_writethrough $p
12948 set_cache writethrough off
12950 restore_lustre_params < $p
12953 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
12956 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12957 remote_ost_nodsh && skip "remote OST with nodsh"
12958 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
12959 skip "stats not implemented on old servers"
12960 [ "$ost1_FSTYPE" = "zfs" ] &&
12961 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
12966 local file="$DIR/$tfile"
12967 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12969 save_writethrough $p
12972 log "Turn on read and write cache"
12974 set_cache writethrough on
12976 log "Write data and read it back."
12977 log "Read should be satisfied from the cache."
12978 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12980 cancel_lru_locks osc
12981 cat $file >/dev/null
12983 if ! let "AFTER - BEFORE == CPAGES"; then
12984 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12986 log "cache hits:: before: $BEFORE, after: $AFTER"
12989 log "Read again; it should be satisfied from the cache."
12991 cancel_lru_locks osc
12992 cat $file >/dev/null
12994 if ! let "AFTER - BEFORE == CPAGES"; then
12995 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12997 log "cache hits:: before: $BEFORE, after: $AFTER"
13000 log "Turn off the read cache and turn on the write cache"
13002 set_cache writethrough on
13004 log "Read again; it should be satisfied from the cache."
13006 cancel_lru_locks osc
13007 cat $file >/dev/null
13009 if ! let "AFTER - BEFORE == CPAGES"; then
13010 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
13012 log "cache hits:: before: $BEFORE, after: $AFTER"
13015 log "Read again; it should not be satisfied from the cache."
13017 cancel_lru_locks osc
13018 cat $file >/dev/null
13020 if ! let "AFTER - BEFORE == 0"; then
13021 error "IN CACHE: before: $BEFORE, after: $AFTER"
13023 log "cache hits:: before: $BEFORE, after: $AFTER"
13026 log "Write data and read it back."
13027 log "Read should be satisfied from the cache."
13028 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13030 cancel_lru_locks osc
13031 cat $file >/dev/null
13033 if ! let "AFTER - BEFORE == CPAGES"; then
13034 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
13036 log "cache hits:: before: $BEFORE, after: $AFTER"
13039 log "Read again; it should not be satisfied from the cache."
13041 cancel_lru_locks osc
13042 cat $file >/dev/null
13044 if ! let "AFTER - BEFORE == 0"; then
13045 error "IN CACHE: before: $BEFORE, after: $AFTER"
13047 log "cache hits:: before: $BEFORE, after: $AFTER"
13050 log "Turn off read and write cache"
13052 set_cache writethrough off
13054 log "Write data and read it back"
13055 log "It should not be satisfied from the cache."
13057 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13058 cancel_lru_locks osc
13060 cat $file >/dev/null
13062 if ! let "AFTER - BEFORE == 0"; then
13063 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
13065 log "cache hits:: before: $BEFORE, after: $AFTER"
13068 log "Turn on the read cache and turn off the write cache"
13070 set_cache writethrough off
13072 log "Write data and read it back"
13073 log "It should not be satisfied from the cache."
13075 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13077 cancel_lru_locks osc
13078 cat $file >/dev/null
13080 if ! let "AFTER - BEFORE == 0"; then
13081 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
13083 log "cache hits:: before: $BEFORE, after: $AFTER"
13086 log "Read again; it should be satisfied from the cache."
13088 cancel_lru_locks osc
13089 cat $file >/dev/null
13091 if ! let "AFTER - BEFORE == CPAGES"; then
13092 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
13094 log "cache hits:: before: $BEFORE, after: $AFTER"
13097 restore_lustre_params < $p
13100 run_test 156 "Verification of tunables"
13103 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13104 remote_mds_nodsh && skip "remote MDS with nodsh"
13105 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13106 skip "Need MDS version at least 2.2.0"
13108 changelog_register || error "changelog_register failed"
13109 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13110 changelog_users $SINGLEMDS | grep -q $cl_user ||
13111 error "User $cl_user not found in changelog_users"
13114 test_mkdir -p $DIR/$tdir/pics/2008/zachy
13115 changelog_clear 0 || error "changelog_clear failed"
13116 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
13117 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
13118 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
13119 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
13120 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
13121 rm $DIR/$tdir/pics/desktop.jpg
13123 changelog_dump | tail -10
13125 echo "verifying changelog mask"
13126 changelog_chmask "-MKDIR"
13127 changelog_chmask "-CLOSE"
13129 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
13130 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
13132 changelog_chmask "+MKDIR"
13133 changelog_chmask "+CLOSE"
13135 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
13136 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
13138 changelog_dump | tail -10
13139 MKDIRS=$(changelog_dump | grep -c "MKDIR")
13140 CLOSES=$(changelog_dump | grep -c "CLOSE")
13141 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
13142 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
13145 echo "verifying target fid"
13146 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
13147 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
13148 [ "$fidc" == "$fidf" ] ||
13149 error "changelog '$tfile' fid $fidc != file fid $fidf"
13150 echo "verifying parent fid"
13151 # The FID returned from the Changelog may be the directory shard on
13152 # a different MDT, and not the FID returned by path2fid on the parent.
13153 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
13154 # since this is what will matter when recreating this file in the tree.
13155 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
13156 local pathp=$($LFS fid2path $MOUNT "$fidp")
13157 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
13158 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
13160 echo "getting records for $cl_user"
13161 changelog_users $SINGLEMDS
13162 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
13164 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
13165 error "changelog_clear failed"
13166 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
13167 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
13168 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
13169 error "user index expect $user_rec1 + $nclr != $user_rec2"
13171 local min0_rec=$(changelog_users $SINGLEMDS |
13172 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
13173 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
13174 awk '{ print $1; exit; }')
13176 changelog_dump | tail -n 5
13177 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
13178 [ $first_rec == $((min0_rec + 1)) ] ||
13179 error "first index should be $min0_rec + 1 not $first_rec"
13181 # LU-3446 changelog index reset on MDT restart
13182 local cur_rec1=$(changelog_users $SINGLEMDS |
13183 awk '/^current.index:/ { print $NF }')
13184 changelog_clear 0 ||
13185 error "clear all changelog records for $cl_user failed"
13186 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
13187 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
13188 error "Fail to start $SINGLEMDS"
13189 local cur_rec2=$(changelog_users $SINGLEMDS |
13190 awk '/^current.index:/ { print $NF }')
13191 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
13192 [ $cur_rec1 == $cur_rec2 ] ||
13193 error "current index should be $cur_rec1 not $cur_rec2"
13195 echo "verifying users from this test are deregistered"
13196 changelog_deregister || error "changelog_deregister failed"
13197 changelog_users $SINGLEMDS | grep -q $cl_user &&
13198 error "User '$cl_user' still in changelog_users"
13200 # lctl get_param -n mdd.*.changelog_users
13201 # current index: 144
13202 # ID index (idle seconds)
13204 if ! changelog_users $SINGLEMDS | grep "^cl"; then
13205 # this is the normal case where all users were deregistered
13206 # make sure no new records are added when no users are present
13207 local last_rec1=$(changelog_users $SINGLEMDS |
13208 awk '/^current.index:/ { print $NF }')
13209 touch $DIR/$tdir/chloe
13210 local last_rec2=$(changelog_users $SINGLEMDS |
13211 awk '/^current.index:/ { print $NF }')
13212 echo "verify changelogs are off: $last_rec1 == $last_rec2"
13213 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
13215 # any changelog users must be leftovers from a previous test
13216 changelog_users $SINGLEMDS
13217 echo "other changelog users; can't verify off"
13220 run_test 160a "changelog sanity"
13222 test_160b() { # LU-3587
13223 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13224 remote_mds_nodsh && skip "remote MDS with nodsh"
13225 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13226 skip "Need MDS version at least 2.2.0"
13228 changelog_register || error "changelog_register failed"
13229 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13230 changelog_users $SINGLEMDS | grep -q $cl_user ||
13231 error "User '$cl_user' not found in changelog_users"
13233 local longname1=$(str_repeat a 255)
13234 local longname2=$(str_repeat b 255)
13237 echo "creating very long named file"
13238 touch $longname1 || error "create of '$longname1' failed"
13239 echo "renaming very long named file"
13240 mv $longname1 $longname2
13242 changelog_dump | grep RENME | tail -n 5
13245 run_test 160b "Verify that very long rename doesn't crash in changelog"
13248 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13249 remote_mds_nodsh && skip "remote MDS with nodsh"
13251 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
13252 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
13253 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
13254 skip "Need MDS version at least 2.5.58 or 2.5.2+"
13258 # Registration step
13259 changelog_register || error "changelog_register failed"
13262 mkdir -p $DIR/$tdir
13263 $MCREATE $DIR/$tdir/foo_160c
13264 changelog_chmask "-TRUNC"
13265 $TRUNCATE $DIR/$tdir/foo_160c 200
13266 changelog_chmask "+TRUNC"
13267 $TRUNCATE $DIR/$tdir/foo_160c 199
13268 changelog_dump | tail -n 5
13269 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
13270 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
13272 run_test 160c "verify that changelog log catch the truncate event"
13275 remote_mds_nodsh && skip "remote MDS with nodsh"
13276 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13277 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13278 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
13279 skip "Need MDS version at least 2.7.60"
13281 # Registration step
13282 changelog_register || error "changelog_register failed"
13284 mkdir -p $DIR/$tdir/migrate_dir
13285 changelog_clear 0 || error "changelog_clear failed"
13287 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
13288 changelog_dump | tail -n 5
13289 local migrates=$(changelog_dump | grep -c "MIGRT")
13290 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
13292 run_test 160d "verify that changelog log catch the migrate event"
13295 remote_mds_nodsh && skip "remote MDS with nodsh"
13298 changelog_register || error "changelog_register failed"
13300 # Delete a future user (expect fail)
13301 local MDT0=$(facet_svc $SINGLEMDS)
13302 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
13305 if [ $rc -eq 0 ]; then
13306 error "Deleted non-existant user cl77"
13307 elif [ $rc -ne 2 ]; then
13308 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
13311 # Clear to a bad index (1 billion should be safe)
13312 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
13315 if [ $rc -eq 0 ]; then
13316 error "Successfully cleared to invalid CL index"
13317 elif [ $rc -ne 22 ]; then
13318 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
13321 run_test 160e "changelog negative testing (should return errors)"
13324 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13325 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13326 skip "Need MDS version at least 2.10.56"
13328 local mdts=$(comma_list $(mdts_nodes))
13331 changelog_register || error "first changelog_register failed"
13332 changelog_register || error "second changelog_register failed"
13334 declare -A cl_user1
13335 declare -A cl_user2
13340 # generate some changelog records to accumulate on each MDT
13341 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13342 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13343 error "create $DIR/$tdir/$tfile failed"
13345 # check changelogs have been generated
13346 local nbcl=$(changelog_dump | wc -l)
13347 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13349 for param in "changelog_max_idle_time=10" \
13351 "changelog_min_gc_interval=2" \
13352 "changelog_min_free_cat_entries=3"; do
13353 local MDT0=$(facet_svc $SINGLEMDS)
13354 local var="${param%=*}"
13355 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13357 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13358 do_nodes $mdts $LCTL set_param mdd.*.$param
13361 # force cl_user2 to be idle (1st part)
13364 # simulate changelog catalog almost full
13365 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13366 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13368 for i in $(seq $MDSCOUNT); do
13369 cl_users=(${CL_USERS[mds$i]})
13370 cl_user1[mds$i]="${cl_users[0]}"
13371 cl_user2[mds$i]="${cl_users[1]}"
13373 [ -n "${cl_user1[mds$i]}" ] ||
13374 error "mds$i: no user registered"
13375 [ -n "${cl_user2[mds$i]}" ] ||
13376 error "mds$i: only ${cl_user2[mds$i]} is registered"
13378 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13379 [ -n "$user_rec1" ] ||
13380 error "mds$i: User ${cl_user1[mds$i]} not registered"
13381 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13382 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13383 [ -n "$user_rec2" ] ||
13384 error "mds$i: User ${cl_user1[mds$i]} not registered"
13385 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13386 "$user_rec1 + 2 == $user_rec2"
13387 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13388 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13389 "$user_rec1 + 2, but is $user_rec2"
13390 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13391 [ -n "$user_rec2" ] ||
13392 error "mds$i: User ${cl_user2[mds$i]} not registered"
13393 [ $user_rec1 == $user_rec2 ] ||
13394 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13395 "$user_rec1, but is $user_rec2"
13398 # force cl_user2 to be idle (2nd part) and to reach
13399 # changelog_max_idle_time
13402 # generate one more changelog to trigger fail_loc
13403 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13404 error "create $DIR/$tdir/${tfile}bis failed"
13406 # ensure gc thread is done
13407 for i in $(mdts_nodes); do
13409 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13410 error "$i: GC-thread not done"
13414 for i in $(seq $MDSCOUNT); do
13415 # check cl_user1 still registered
13416 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13417 error "mds$i: User ${cl_user1[mds$i]} not registered"
13418 # check cl_user2 unregistered
13419 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13420 error "mds$i: User ${cl_user2[mds$i]} still registered"
13422 # check changelogs are present and starting at $user_rec1 + 1
13423 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13424 [ -n "$user_rec1" ] ||
13425 error "mds$i: User ${cl_user1[mds$i]} not registered"
13426 first_rec=$($LFS changelog $(facet_svc mds$i) |
13427 awk '{ print $1; exit; }')
13429 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13430 [ $((user_rec1 + 1)) == $first_rec ] ||
13431 error "mds$i: first index should be $user_rec1 + 1, " \
13432 "but is $first_rec"
13435 run_test 160f "changelog garbage collect (timestamped users)"
13438 remote_mds_nodsh && skip "remote MDS with nodsh"
13439 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13440 skip "Need MDS version at least 2.10.56"
13442 local mdts=$(comma_list $(mdts_nodes))
13444 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
13445 do_nodes $mdts $LCTL set_param fail_loc=0x1314
13448 changelog_register || error "first changelog_register failed"
13449 changelog_register || error "second changelog_register failed"
13451 declare -A cl_user1
13452 declare -A cl_user2
13457 # generate some changelog records to accumulate on each MDT
13458 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13459 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13460 error "create $DIR/$tdir/$tfile failed"
13462 # check changelogs have been generated
13463 local nbcl=$(changelog_dump | wc -l)
13464 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13466 # reduce the max_idle_indexes value to make sure we exceed it
13467 max_ndx=$((nbcl / 2 - 1))
13469 for param in "changelog_max_idle_indexes=$max_ndx" \
13471 "changelog_min_gc_interval=2" \
13472 "changelog_min_free_cat_entries=3"; do
13473 local MDT0=$(facet_svc $SINGLEMDS)
13474 local var="${param%=*}"
13475 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13477 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13478 do_nodes $mdts $LCTL set_param mdd.*.$param ||
13479 error "unable to set mdd.*.$param"
13482 # simulate changelog catalog almost full
13483 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13484 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13486 for i in $(seq $MDSCOUNT); do
13487 cl_users=(${CL_USERS[mds$i]})
13488 cl_user1[mds$i]="${cl_users[0]}"
13489 cl_user2[mds$i]="${cl_users[1]}"
13491 [ -n "${cl_user1[mds$i]}" ] ||
13492 error "mds$i: no user registered"
13493 [ -n "${cl_user2[mds$i]}" ] ||
13494 error "mds$i: only ${cl_user1[mds$i]} is registered"
13496 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13497 [ -n "$user_rec1" ] ||
13498 error "mds$i: User ${cl_user1[mds$i]} not registered"
13499 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13500 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13501 [ -n "$user_rec2" ] ||
13502 error "mds$i: User ${cl_user1[mds$i]} not registered"
13503 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13504 "$user_rec1 + 2 == $user_rec2"
13505 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13506 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13507 "$user_rec1 + 2, but is $user_rec2"
13508 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13509 [ -n "$user_rec2" ] ||
13510 error "mds$i: User ${cl_user2[mds$i]} not registered"
13511 [ $user_rec1 == $user_rec2 ] ||
13512 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13513 "$user_rec1, but is $user_rec2"
13516 # ensure we are past the previous changelog_min_gc_interval set above
13519 # generate one more changelog to trigger fail_loc
13520 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13521 error "create $DIR/$tdir/${tfile}bis failed"
13523 # ensure gc thread is done
13524 for i in $(mdts_nodes); do
13526 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13527 error "$i: GC-thread not done"
13531 for i in $(seq $MDSCOUNT); do
13532 # check cl_user1 still registered
13533 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13534 error "mds$i: User ${cl_user1[mds$i]} not registered"
13535 # check cl_user2 unregistered
13536 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13537 error "mds$i: User ${cl_user2[mds$i]} still registered"
13539 # check changelogs are present and starting at $user_rec1 + 1
13540 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13541 [ -n "$user_rec1" ] ||
13542 error "mds$i: User ${cl_user1[mds$i]} not registered"
13543 first_rec=$($LFS changelog $(facet_svc mds$i) |
13544 awk '{ print $1; exit; }')
13546 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13547 [ $((user_rec1 + 1)) == $first_rec ] ||
13548 error "mds$i: first index should be $user_rec1 + 1, " \
13549 "but is $first_rec"
13552 run_test 160g "changelog garbage collect (old users)"
13555 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13556 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13557 skip "Need MDS version at least 2.10.56"
13559 local mdts=$(comma_list $(mdts_nodes))
13562 changelog_register || error "first changelog_register failed"
13563 changelog_register || error "second changelog_register failed"
13565 declare -A cl_user1
13566 declare -A cl_user2
13571 # generate some changelog records to accumulate on each MDT
13572 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13573 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13574 error "create $DIR/$tdir/$tfile failed"
13576 # check changelogs have been generated
13577 local nbcl=$(changelog_dump | wc -l)
13578 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13580 for param in "changelog_max_idle_time=10" \
13582 "changelog_min_gc_interval=2"; do
13583 local MDT0=$(facet_svc $SINGLEMDS)
13584 local var="${param%=*}"
13585 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13587 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13588 do_nodes $mdts $LCTL set_param mdd.*.$param
13591 # force cl_user2 to be idle (1st part)
13594 for i in $(seq $MDSCOUNT); do
13595 cl_users=(${CL_USERS[mds$i]})
13596 cl_user1[mds$i]="${cl_users[0]}"
13597 cl_user2[mds$i]="${cl_users[1]}"
13599 [ -n "${cl_user1[mds$i]}" ] ||
13600 error "mds$i: no user registered"
13601 [ -n "${cl_user2[mds$i]}" ] ||
13602 error "mds$i: only ${cl_user2[mds$i]} is registered"
13604 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13605 [ -n "$user_rec1" ] ||
13606 error "mds$i: User ${cl_user1[mds$i]} not registered"
13607 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13608 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13609 [ -n "$user_rec2" ] ||
13610 error "mds$i: User ${cl_user1[mds$i]} not registered"
13611 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13612 "$user_rec1 + 2 == $user_rec2"
13613 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13614 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13615 "$user_rec1 + 2, but is $user_rec2"
13616 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13617 [ -n "$user_rec2" ] ||
13618 error "mds$i: User ${cl_user2[mds$i]} not registered"
13619 [ $user_rec1 == $user_rec2 ] ||
13620 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13621 "$user_rec1, but is $user_rec2"
13624 # force cl_user2 to be idle (2nd part) and to reach
13625 # changelog_max_idle_time
13628 # force each GC-thread start and block then
13629 # one per MDT/MDD, set fail_val accordingly
13630 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13631 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13633 # generate more changelogs to trigger fail_loc
13634 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13635 error "create $DIR/$tdir/${tfile}bis failed"
13637 # stop MDT to stop GC-thread, should be done in back-ground as it will
13638 # block waiting for the thread to be released and exit
13639 declare -A stop_pids
13640 for i in $(seq $MDSCOUNT); do
13642 stop_pids[mds$i]=$!
13645 for i in $(mdts_nodes); do
13648 local facets=$(facets_up_on_host $i)
13650 for facet in ${facets//,/ }; do
13651 if [[ $facet == mds* ]]; then
13655 # ensure each MDS's gc threads are still present and all in "R"
13656 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
13657 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
13658 error "$i: expected $nb GC-thread"
13660 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
13662 error "$i: GC-thread not found in R-state"
13663 # check umounts of each MDT on MDS have reached kthread_stop()
13664 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
13665 error "$i: expected $nb umount"
13667 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
13668 error "$i: umount not found in D-state"
13671 # release all GC-threads
13672 do_nodes $mdts $LCTL set_param fail_loc=0
13674 # wait for MDT stop to complete
13675 for i in $(seq $MDSCOUNT); do
13676 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
13680 # may try to check if any orphan changelog records are present
13681 # via ldiskfs/zfs and llog_reader...
13683 # re-start/mount MDTs
13684 for i in $(seq $MDSCOUNT); do
13685 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
13686 error "Fail to start mds$i"
13690 for i in $(seq $MDSCOUNT); do
13691 # check cl_user1 still registered
13692 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13693 error "mds$i: User ${cl_user1[mds$i]} not registered"
13694 # check cl_user2 unregistered
13695 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13696 error "mds$i: User ${cl_user2[mds$i]} still registered"
13698 # check changelogs are present and starting at $user_rec1 + 1
13699 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13700 [ -n "$user_rec1" ] ||
13701 error "mds$i: User ${cl_user1[mds$i]} not registered"
13702 first_rec=$($LFS changelog $(facet_svc mds$i) |
13703 awk '{ print $1; exit; }')
13705 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13706 [ $((user_rec1 + 1)) == $first_rec ] ||
13707 error "mds$i: first index should be $user_rec1 + 1, " \
13708 "but is $first_rec"
13711 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
13716 local mdts=$(comma_list $(mdts_nodes))
13718 changelog_register || error "first changelog_register failed"
13720 # generate some changelog records to accumulate on each MDT
13721 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13722 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13723 error "create $DIR/$tdir/$tfile failed"
13725 # check changelogs have been generated
13726 local nbcl=$(changelog_dump | wc -l)
13727 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13729 # simulate race between register and unregister
13730 # XXX as fail_loc is set per-MDS, with DNE configs the race
13731 # simulation will only occur for one MDT per MDS and for the
13732 # others the normal race scenario will take place
13733 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
13734 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
13735 do_nodes $mdts $LCTL set_param fail_val=1
13737 # unregister 1st user
13738 changelog_deregister &
13740 # wait some time for deregister work to reach race rdv
13742 # register 2nd user
13743 changelog_register || error "2nd user register failed"
13745 wait $pid1 || error "1st user deregister failed"
13749 declare -A LAST_REC
13750 for i in $(seq $MDSCOUNT); do
13751 if changelog_users mds$i | grep "^cl"; then
13752 # make sure new records are added with one user present
13753 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
13754 awk '/^current.index:/ { print $NF }')
13756 error "mds$i has no user registered"
13760 # generate more changelog records to accumulate on each MDT
13761 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13762 error "create $DIR/$tdir/${tfile}bis failed"
13764 for i in $(seq $MDSCOUNT); do
13765 last_rec=$(changelog_users $SINGLEMDS |
13766 awk '/^current.index:/ { print $NF }')
13767 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
13768 [ $last_rec != ${LAST_REC[mds$i]} ] ||
13769 error "changelogs are off on mds$i"
13772 run_test 160i "changelog user register/unregister race"
13775 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13777 test_mkdir -c1 $DIR/$tdir
13778 cp /etc/hosts $DIR/$tdir/$tfile
13779 test_mkdir -c1 $DIR/$tdir/foo1
13780 test_mkdir -c1 $DIR/$tdir/foo2
13781 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
13782 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
13783 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
13784 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
13785 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
13786 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13787 $LFS fid2path $DIR $FID
13788 error "bad link ea"
13791 rm $DIR/$tdir/foo2/zachary
13793 rm $DIR/$tdir/foo2/thor
13795 rm $DIR/$tdir/$tfile
13797 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
13798 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
13799 { $LFS fid2path $DIR $FID; error "bad link rename"; }
13800 rm $DIR/$tdir/foo2/maggie
13803 local longname=$tfile.avg_len_is_thirty_two_
13804 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
13805 error_noexit 'failed to unlink many hardlinks'" EXIT
13806 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
13807 error "failed to hardlink many files"
13808 links=$($LFS fid2path $DIR $FID | wc -l)
13809 echo -n "${links}/1000 links in link EA"
13810 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
13812 run_test 161a "link ea sanity"
13815 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13816 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
13819 local remote_dir=$DIR/$tdir/remote_dir
13821 mkdir -p $DIR/$tdir
13822 $LFS mkdir -i $MDTIDX $remote_dir ||
13823 error "create remote directory failed"
13825 cp /etc/hosts $remote_dir/$tfile
13826 mkdir -p $remote_dir/foo1
13827 mkdir -p $remote_dir/foo2
13828 ln $remote_dir/$tfile $remote_dir/foo1/sofia
13829 ln $remote_dir/$tfile $remote_dir/foo2/zachary
13830 ln $remote_dir/$tfile $remote_dir/foo1/luna
13831 ln $remote_dir/$tfile $remote_dir/foo2/thor
13833 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
13835 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13836 $LFS fid2path $DIR $FID
13837 error "bad link ea"
13840 rm $remote_dir/foo2/zachary
13842 rm $remote_dir/foo2/thor
13844 rm $remote_dir/$tfile
13846 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
13847 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
13848 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
13849 $LFS fid2path $DIR $FID
13850 error "bad link rename"
13852 rm $remote_dir/foo2/maggie
13855 local longname=filename_avg_len_is_thirty_two_
13856 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
13857 error "failed to hardlink many files"
13858 links=$($LFS fid2path $DIR $FID | wc -l)
13859 echo -n "${links}/1000 links in link EA"
13860 [[ ${links} -gt 60 ]] ||
13861 error "expected at least 60 links in link EA"
13862 unlinkmany $remote_dir/foo2/$longname 1000 ||
13863 error "failed to unlink many hardlinks"
13865 run_test 161b "link ea sanity under remote directory"
13868 remote_mds_nodsh && skip "remote MDS with nodsh"
13869 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13870 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
13871 skip "Need MDS version at least 2.1.5"
13873 # define CLF_RENAME_LAST 0x0001
13874 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
13875 changelog_register || error "changelog_register failed"
13878 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
13879 touch $DIR/$tdir/foo_161c
13880 touch $DIR/$tdir/bar_161c
13881 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13882 changelog_dump | grep RENME | tail -n 5
13883 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13884 changelog_clear 0 || error "changelog_clear failed"
13885 if [ x$flags != "x0x1" ]; then
13886 error "flag $flags is not 0x1"
13889 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
13890 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
13891 touch $DIR/$tdir/foo_161c
13892 touch $DIR/$tdir/bar_161c
13893 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13894 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13895 changelog_dump | grep RENME | tail -n 5
13896 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13897 changelog_clear 0 || error "changelog_clear failed"
13898 if [ x$flags != "x0x0" ]; then
13899 error "flag $flags is not 0x0"
13901 echo "rename overwrite a target having nlink > 1," \
13902 "changelog record has flags of $flags"
13904 # rename doesn't overwrite a target (changelog flag 0x0)
13905 touch $DIR/$tdir/foo_161c
13906 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
13907 changelog_dump | grep RENME | tail -n 5
13908 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
13909 changelog_clear 0 || error "changelog_clear failed"
13910 if [ x$flags != "x0x0" ]; then
13911 error "flag $flags is not 0x0"
13913 echo "rename doesn't overwrite a target," \
13914 "changelog record has flags of $flags"
13916 # define CLF_UNLINK_LAST 0x0001
13917 # unlink a file having nlink = 1 (changelog flag 0x1)
13918 rm -f $DIR/$tdir/foo2_161c
13919 changelog_dump | grep UNLNK | tail -n 5
13920 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13921 changelog_clear 0 || error "changelog_clear failed"
13922 if [ x$flags != "x0x1" ]; then
13923 error "flag $flags is not 0x1"
13925 echo "unlink a file having nlink = 1," \
13926 "changelog record has flags of $flags"
13928 # unlink a file having nlink > 1 (changelog flag 0x0)
13929 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13930 rm -f $DIR/$tdir/foobar_161c
13931 changelog_dump | grep UNLNK | tail -n 5
13932 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13933 changelog_clear 0 || error "changelog_clear failed"
13934 if [ x$flags != "x0x0" ]; then
13935 error "flag $flags is not 0x0"
13937 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
13939 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
13942 remote_mds_nodsh && skip "remote MDS with nodsh"
13943 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
13948 changelog_register || error "changelog_register failed"
13950 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
13951 # interfer with $MOUNT/.lustre/fid/ access
13953 [[ $? -eq 0 ]] || error "mkdir failed"
13955 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
13956 $LCTL set_param fail_loc=0x8000140c
13958 $LCTL set_param fail_val=5
13961 echo foofoo > $DIR/$tdir/$tfile &
13964 # wait for create to be delayed
13968 [[ $? -eq 0 ]] || error "create should be blocked"
13970 local tempfile="$(mktemp --tmpdir $tfile.XXXXXX)"
13971 stack_trap "rm -f $tempfile"
13972 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
13973 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
13974 # some delay may occur during ChangeLog publishing and file read just
13975 # above, that could allow file write to happen finally
13976 [[ -s $tempfile ]] && echo "file should be empty"
13978 $LCTL set_param fail_loc=0
13981 [[ $? -eq 0 ]] || error "create failed"
13983 run_test 161d "create with concurrent .lustre/fid access"
13986 local expected="$1"
13991 path=$($LFS fid2path "$@")
13994 if [ $rc -ne 0 ]; then
13995 error "path looked up of '$expected' failed: rc=$rc"
13996 elif [ "$path" != "$expected" ]; then
13997 error "path looked up '$path' instead of '$expected'"
13999 echo "FID '$fid' resolves to path '$path' as expected"
14003 test_162a() { # was test_162
14004 test_mkdir -p -c1 $DIR/$tdir/d2
14005 touch $DIR/$tdir/d2/$tfile
14006 touch $DIR/$tdir/d2/x1
14007 touch $DIR/$tdir/d2/x2
14008 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
14009 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
14011 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
14012 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
14015 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
14016 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
14017 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
14019 # softlink to wrong file
14020 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
14021 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
14022 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
14025 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
14026 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
14027 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
14028 # fid2path dir/fsname should both work
14029 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
14030 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
14032 # hardlink count: check that there are 2 links
14033 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
14034 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
14036 # hardlink indexing: remove the first link
14037 rm $DIR/$tdir/d2/p/q/r/hlink
14038 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
14040 run_test 162a "path lookup sanity"
14043 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14044 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
14047 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
14048 error "create striped dir failed"
14050 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
14051 tail -n 1 | awk '{print $2}')
14052 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
14054 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
14055 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
14058 for ((i=0;i<5;i++)); do
14059 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
14060 error "get fid for f$i failed"
14061 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
14063 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
14064 error "get fid for d$i failed"
14065 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
14070 run_test 162b "striped directory path lookup sanity"
14072 # LU-4239: Verify fid2path works with paths 100 or more directories deep
14074 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
14075 skip "Need MDS version at least 2.7.51"
14077 local lpath=$tdir.local
14078 local rpath=$tdir.remote
14080 test_mkdir $DIR/$lpath
14081 test_mkdir $DIR/$rpath
14083 for ((i = 0; i <= 101; i++)); do
14086 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
14087 error "get fid for local directory $DIR/$lpath failed"
14088 check_path "$DIR/$lpath" $MOUNT $FID --link 0
14091 test_mkdir $DIR/$rpath
14092 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
14093 error "get fid for remote directory $DIR/$rpath failed"
14094 check_path "$DIR/$rpath" $MOUNT $FID --link 0
14099 run_test 162c "fid2path works with paths 100 or more directories deep"
14102 # do directio so as not to populate the page cache
14103 log "creating a 10 Mb file"
14104 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
14105 log "starting reads"
14106 dd if=$DIR/$tfile of=/dev/null bs=4096 &
14107 log "truncating the file"
14108 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
14110 kill %+ || true # reads might have finished
14111 echo "wait until dd is finished"
14113 log "removing the temporary file"
14114 rm -rf $DIR/$tfile || error "tmp file removal failed"
14116 run_test 169 "parallel read and truncate should not deadlock"
14119 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14121 $LCTL clear # bug 18514
14122 $LCTL debug_daemon start $TMP/${tfile}_log_good
14124 $LCTL debug_daemon stop
14125 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
14126 error "sed failed to read log_good"
14128 $LCTL debug_daemon start $TMP/${tfile}_log_good
14130 $LCTL debug_daemon stop
14132 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
14133 error "lctl df log_bad failed"
14135 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14136 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14138 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
14139 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
14141 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
14142 error "bad_line good_line1 good_line2 are empty"
14144 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14145 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
14146 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14148 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
14149 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14150 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14152 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
14153 error "bad_line_new good_line_new are empty"
14155 local expected_good=$((good_line1 + good_line2*2))
14157 rm -f $TMP/${tfile}*
14158 # LU-231, short malformed line may not be counted into bad lines
14159 if [ $bad_line -ne $bad_line_new ] &&
14160 [ $bad_line -ne $((bad_line_new - 1)) ]; then
14161 error "expected $bad_line bad lines, but got $bad_line_new"
14165 if [ $expected_good -ne $good_line_new ]; then
14166 error "expected $expected_good good lines, but got $good_line_new"
14171 run_test 170 "test lctl df to handle corrupted log ====================="
14173 test_171() { # bug20592
14174 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14176 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
14177 $LCTL set_param fail_loc=0x50e
14178 $LCTL set_param fail_val=3000
14179 multiop_bg_pause $DIR/$tfile O_s || true
14181 kill -USR1 $MULTIPID
14185 if dmesg | grep "recursive fault"; then
14186 error "caught a recursive fault"
14188 $LCTL set_param fail_loc=0
14191 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
14193 # it would be good to share it with obdfilter-survey/iokit-libecho code
14194 setup_obdecho_osc () {
14197 local obdfilter_name=$2
14198 echo "Creating new osc for $obdfilter_name on $ost_nid"
14199 # make sure we can find loopback nid
14200 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
14202 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
14203 ${obdfilter_name}_osc_UUID || rc=2; }
14204 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
14205 ${obdfilter_name}_UUID $ost_nid || rc=3; }
14209 cleanup_obdecho_osc () {
14210 local obdfilter_name=$1
14211 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
14212 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
14219 local pages=${3:-64}
14224 local obd_size=$(get_obd_size $node $OBD)
14225 local page_size=$(get_page_size $node)
14226 if [[ -n "$obd_size" ]]; then
14227 local new_count=$((obd_size / (pages * page_size / 1024)))
14228 [[ $new_count -ge $count ]] || count=$new_count
14231 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
14232 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
14234 if [ $rc -eq 0 ]; then
14235 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
14236 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
14238 echo "New object id is $id"
14239 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
14241 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
14242 "test_brw $count w v $pages $id" || rc=4; }
14243 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
14245 [ $rc -eq 0 ] || [ $rc -gt 2 ] &&
14246 { do_facet $node "$LCTL --device ec cleanup" || rc=5; }
14247 [ $rc -eq 0 ] || [ $rc -gt 1 ] &&
14248 { do_facet $node "$LCTL --device ec detach" || rc=6; }
14249 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
14254 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14256 if ! module_loaded obdecho; then
14257 load_module obdecho/obdecho &&
14258 stack_trap "rmmod obdecho" EXIT ||
14259 error "unable to load obdecho on client"
14262 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
14263 local host=$($LCTL get_param -n osc.$osc.import |
14264 awk '/current_connection:/ { print $2 }' )
14265 local target=$($LCTL get_param -n osc.$osc.import |
14266 awk '/target:/ { print $2 }' )
14267 target=${target%_UUID}
14269 if [ -n "$target" ]; then
14270 setup_obdecho_osc $host $target &&
14271 stack_trap "cleanup_obdecho_osc $target" EXIT ||
14272 { error "obdecho setup failed with $?"; return; }
14274 obdecho_test ${target}_osc client ||
14275 error "obdecho_test failed on ${target}_osc"
14277 $LCTL get_param osc.$osc.import
14278 error "there is no osc.$osc.import target"
14281 run_test 180a "test obdecho on osc"
14284 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14285 remote_ost_nodsh && skip "remote OST with nodsh"
14287 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14288 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14289 error "failed to load module obdecho"
14291 local target=$(do_facet ost1 $LCTL dl |
14292 awk '/obdfilter/ { print $4; exit; }')
14294 if [ -n "$target" ]; then
14295 obdecho_test $target ost1 || error "obdecho_test failed with $?"
14297 do_facet ost1 $LCTL dl
14298 error "there is no obdfilter target on ost1"
14301 run_test 180b "test obdecho directly on obdfilter"
14303 test_180c() { # LU-2598
14304 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14305 remote_ost_nodsh && skip "remote OST with nodsh"
14306 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
14307 skip "Need MDS version at least 2.4.0"
14309 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14310 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14311 error "failed to load module obdecho"
14313 local target=$(do_facet ost1 $LCTL dl |
14314 awk '/obdfilter/ { print $4; exit; }')
14316 if [ -n "$target" ]; then
14317 local pages=16384 # 64MB bulk I/O RPC size
14319 obdecho_test "$target" ost1 "$pages" ||
14320 error "obdecho_test with pages=$pages failed with $?"
14322 do_facet ost1 $LCTL dl
14323 error "there is no obdfilter target on ost1"
14326 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
14328 test_181() { # bug 22177
14329 test_mkdir $DIR/$tdir
14330 # create enough files to index the directory
14331 createmany -o $DIR/$tdir/foobar 4000
14332 # print attributes for debug purpose
14335 multiop_bg_pause $DIR/$tdir D_Sc || return 1
14337 # remove the files & current working dir
14338 unlinkmany $DIR/$tdir/foobar 4000
14340 kill -USR1 $MULTIPID
14342 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
14345 run_test 181 "Test open-unlinked dir ========================"
14351 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14353 $LCTL set_param mdc.*.rpc_stats=clear
14355 for (( i = 0; i < $tcount; i++ )) ; do
14356 mkdir $DIR/$tdir/$i
14359 for (( i = 0; i < $tcount; i++ )) ; do
14360 createmany -o $DIR/$tdir/$i/f- $fcount &
14364 for (( i = 0; i < $tcount; i++ )) ; do
14365 unlinkmany $DIR/$tdir/$i/f- $fcount &
14369 $LCTL get_param mdc.*.rpc_stats
14373 run_test 182 "Test parallel modify metadata operations ================"
14375 test_183() { # LU-2275
14376 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14377 remote_mds_nodsh && skip "remote MDS with nodsh"
14378 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
14379 skip "Need MDS version at least 2.3.56"
14381 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14382 echo aaa > $DIR/$tdir/$tfile
14384 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
14385 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
14387 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
14388 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
14390 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
14392 # Flush negative dentry cache
14393 touch $DIR/$tdir/$tfile
14395 # We are not checking for any leaked references here, they'll
14396 # become evident next time we do cleanup with module unload.
14399 run_test 183 "No crash or request leak in case of strange dispositions ========"
14401 # test suite 184 is for LU-2016, LU-2017
14403 check_swap_layouts_support
14405 dir0=$DIR/$tdir/$testnum
14406 test_mkdir -p -c1 $dir0
14411 $LFS setstripe -c1 $file1
14413 $LFS setstripe -c2 $file2
14415 gen1=$($LFS getstripe -g $file1)
14416 gen2=$($LFS getstripe -g $file2)
14418 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
14419 gen=$($LFS getstripe -g $file1)
14420 [[ $gen1 != $gen ]] ||
14421 "Layout generation on $file1 does not change"
14422 gen=$($LFS getstripe -g $file2)
14423 [[ $gen2 != $gen ]] ||
14424 "Layout generation on $file2 does not change"
14426 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
14427 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
14429 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
14431 run_test 184a "Basic layout swap"
14434 check_swap_layouts_support
14436 dir0=$DIR/$tdir/$testnum
14437 mkdir -p $dir0 || error "creating dir $dir0"
14444 $LFS setstripe -c1 $file1
14445 $LFS setstripe -c2 $file2
14446 $LFS setstripe -c1 $file3
14447 chown $RUNAS_ID $file3
14448 gen1=$($LFS getstripe -g $file1)
14449 gen2=$($LFS getstripe -g $file2)
14451 $LFS swap_layouts $dir1 $dir2 &&
14452 error "swap of directories layouts should fail"
14453 $LFS swap_layouts $dir1 $file1 &&
14454 error "swap of directory and file layouts should fail"
14455 $RUNAS $LFS swap_layouts $file1 $file2 &&
14456 error "swap of file we cannot write should fail"
14457 $LFS swap_layouts $file1 $file3 &&
14458 error "swap of file with different owner should fail"
14459 /bin/true # to clear error code
14461 run_test 184b "Forbidden layout swap (will generate errors)"
14464 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14465 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14466 check_swap_layouts_support
14468 local dir0=$DIR/$tdir/$testnum
14469 mkdir -p $dir0 || error "creating dir $dir0"
14471 local ref1=$dir0/ref1
14472 local ref2=$dir0/ref2
14473 local file1=$dir0/file1
14474 local file2=$dir0/file2
14475 # create a file large enough for the concurrent test
14476 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14477 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14478 echo "ref file size: ref1($(stat -c %s $ref1))," \
14479 "ref2($(stat -c %s $ref2))"
14482 dd if=$ref1 of=$file1 bs=16k &
14485 # Make sure dd starts to copy file
14486 while [ ! -f $file1 ]; do sleep 0.1; done
14488 $LFS swap_layouts $file1 $file2
14491 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14492 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14494 # how many bytes copied before swapping layout
14495 local copied=$(stat -c %s $file2)
14496 local remaining=$(stat -c %s $ref1)
14497 remaining=$((remaining - copied))
14498 echo "Copied $copied bytes before swapping layout..."
14500 cmp -n $copied $file1 $ref2 | grep differ &&
14501 error "Content mismatch [0, $copied) of ref2 and file1"
14502 cmp -n $copied $file2 $ref1 ||
14503 error "Content mismatch [0, $copied) of ref1 and file2"
14504 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14505 error "Content mismatch [$copied, EOF) of ref1 and file1"
14508 rm -f $ref1 $ref2 $file1 $file2
14510 run_test 184c "Concurrent write and layout swap"
14513 check_swap_layouts_support
14514 [ -z "$(which getfattr 2>/dev/null)" ] &&
14515 skip_env "no getfattr command"
14517 local file1=$DIR/$tdir/$tfile-1
14518 local file2=$DIR/$tdir/$tfile-2
14519 local file3=$DIR/$tdir/$tfile-3
14523 mkdir -p $DIR/$tdir
14524 touch $file1 || error "create $file1 failed"
14525 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14526 error "create $file2 failed"
14527 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14528 error "create $file3 failed"
14529 lovea1=$(get_layout_param $file1)
14531 $LFS swap_layouts $file2 $file3 ||
14532 error "swap $file2 $file3 layouts failed"
14533 $LFS swap_layouts $file1 $file2 ||
14534 error "swap $file1 $file2 layouts failed"
14536 lovea2=$(get_layout_param $file2)
14539 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14541 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14542 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14544 run_test 184d "allow stripeless layouts swap"
14547 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14548 skip "Need MDS version at least 2.6.94"
14549 check_swap_layouts_support
14550 [ -z "$(which getfattr 2>/dev/null)" ] &&
14551 skip_env "no getfattr command"
14553 local file1=$DIR/$tdir/$tfile-1
14554 local file2=$DIR/$tdir/$tfile-2
14555 local file3=$DIR/$tdir/$tfile-3
14558 mkdir -p $DIR/$tdir
14559 touch $file1 || error "create $file1 failed"
14560 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14561 error "create $file2 failed"
14562 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14563 error "create $file3 failed"
14565 $LFS swap_layouts $file1 $file2 ||
14566 error "swap $file1 $file2 layouts failed"
14568 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14569 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14571 echo 123 > $file1 || error "Should be able to write into $file1"
14573 $LFS swap_layouts $file1 $file3 ||
14574 error "swap $file1 $file3 layouts failed"
14576 echo 123 > $file1 || error "Should be able to write into $file1"
14578 rm -rf $file1 $file2 $file3
14580 run_test 184e "Recreate layout after stripeless layout swaps"
14583 # Create a file with name longer than sizeof(struct stat) ==
14584 # 144 to see if we can get chars from the file name to appear
14585 # in the returned striping. Note that 'f' == 0x66.
14586 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
14588 mkdir -p $DIR/$tdir
14589 mcreate $DIR/$tdir/$file
14590 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
14591 error "IOC_MDC_GETFILEINFO returned garbage striping"
14594 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
14596 test_185() { # LU-2441
14597 # LU-3553 - no volatile file support in old servers
14598 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
14599 skip "Need MDS version at least 2.3.60"
14601 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14602 touch $DIR/$tdir/spoo
14603 local mtime1=$(stat -c "%Y" $DIR/$tdir)
14604 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
14605 error "cannot create/write a volatile file"
14606 [ "$FILESET" == "" ] &&
14607 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
14608 error "FID is still valid after close"
14610 multiop_bg_pause $DIR/$tdir vVw4096_c
14617 # assume that the next FID for this client is sequential, since stdout
14618 # is unfortunately eaten by multiop_bg_pause
14619 local n=$((${fidv[1]} + 1))
14620 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
14621 if [ "$FILESET" == "" ]; then
14622 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
14623 error "FID is missing before close"
14625 kill -USR1 $multi_pid
14626 # 1 second delay, so if mtime change we will see it
14628 local mtime2=$(stat -c "%Y" $DIR/$tdir)
14629 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
14631 run_test 185 "Volatile file support"
14633 function create_check_volatile() {
14637 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
14640 local FID=$(cat /tmp/${tfile}.fid)
14641 [ "$FID" == "" ] && error "can't get FID for volatile"
14642 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
14643 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
14644 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
14648 cancel_lru_locks mdc # flush opencache
14649 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
14654 # LU-12516 - volatile creation via .lustre
14655 [[ $MDS1_VERSION -ge $(version_code 2.12.55) ]] ||
14656 skip "Need MDS version at least 2.3.55"
14658 create_check_volatile 0
14659 [ $MDSCOUNT -lt 2 ] && return 0
14662 create_check_volatile 1
14666 run_test 185a "Volatile file creation in .lustre/fid/"
14669 remote_mds_nodsh && skip "remote MDS with nodsh"
14670 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14671 skip "Need MDS version at least 2.3.0"
14673 local dir0=$DIR/$tdir/$testnum
14674 mkdir -p $dir0 || error "creating dir $dir0"
14676 local file=$dir0/file1
14677 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
14678 local dv1=$($LFS data_version $file)
14679 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
14680 local dv2=$($LFS data_version $file)
14681 [[ $dv1 != $dv2 ]] ||
14682 error "data version did not change on write $dv1 == $dv2"
14687 run_test 187a "Test data version change"
14690 remote_mds_nodsh && skip "remote MDS with nodsh"
14691 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14692 skip "Need MDS version at least 2.3.0"
14694 local dir0=$DIR/$tdir/$testnum
14695 mkdir -p $dir0 || error "creating dir $dir0"
14697 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
14698 [[ ${DV[0]} != ${DV[1]} ]] ||
14699 error "data version did not change on write"\
14700 " ${DV[0]} == ${DV[1]}"
14705 run_test 187b "Test data version change on volatile file"
14708 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14709 remote_mgs_nodsh && skip "remote MGS with nodsh"
14710 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
14712 local POOL=${POOL:-cea1}
14713 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
14714 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
14717 local last_ost=$(($OSTCOUNT - 1))
14719 local ost_list=$(seq $first_ost $ost_step $last_ost)
14720 local ost_range="$first_ost $last_ost $ost_step"
14721 local test_path=$POOL_ROOT/$POOL_DIR_NAME
14722 local file_dir=$POOL_ROOT/file_tst
14723 local subdir=$test_path/subdir
14726 if ! combined_mgs_mds ; then
14731 # former test_200a test_200b
14732 pool_add $POOL || { rc=$? ; break; }
14733 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
14734 # former test_200c test_200d
14735 mkdir -p $test_path
14736 pool_set_dir $POOL $test_path || { rc=$? ; break; }
14737 pool_check_dir $POOL $test_path || { rc=$? ; break; }
14739 pool_check_dir $POOL $subdir || { rc=$? ; break; }
14740 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
14741 || { rc=$? ; break; }
14742 # former test_200e test_200f
14743 local files=$((OSTCOUNT*3))
14744 pool_alloc_files $POOL $test_path $files "$ost_list" \
14745 || { rc=$? ; break; }
14746 pool_create_files $POOL $file_dir $files "$ost_list" \
14747 || { rc=$? ; break; }
14748 # former test_200g test_200h
14749 pool_lfs_df $POOL || { rc=$? ; break; }
14750 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
14752 # former test_201a test_201b test_201c
14753 pool_remove_first_target $POOL || { rc=$? ; break; }
14755 local f=$test_path/$tfile
14756 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
14757 pool_remove $POOL $f || { rc=$? ; break; }
14763 if ! combined_mgs_mds ; then
14768 run_test 200 "OST pools"
14770 # usage: default_attr <count | size | offset>
14772 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
14775 # usage: check_default_stripe_attr
14776 check_default_stripe_attr() {
14777 ACTUAL=$($LFS getstripe $* $DIR/$tdir)
14780 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
14782 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
14786 error "unknown getstripe attr '$1'"
14789 [ $ACTUAL == $EXPECTED ] ||
14790 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
14794 test_mkdir $DIR/$tdir
14795 $LFS setstripe --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
14797 check_default_stripe_attr --stripe-count
14798 check_default_stripe_attr --stripe-size
14799 check_default_stripe_attr --stripe-index
14801 run_test 204a "Print default stripe attributes"
14804 test_mkdir $DIR/$tdir
14805 $LFS setstripe --stripe-count 1 $DIR/$tdir
14807 check_default_stripe_attr --stripe-size
14808 check_default_stripe_attr --stripe-index
14810 run_test 204b "Print default stripe size and offset"
14813 test_mkdir $DIR/$tdir
14814 $LFS setstripe --stripe-size 65536 $DIR/$tdir
14816 check_default_stripe_attr --stripe-count
14817 check_default_stripe_attr --stripe-index
14819 run_test 204c "Print default stripe count and offset"
14822 test_mkdir $DIR/$tdir
14823 $LFS setstripe --stripe-index 0 $DIR/$tdir
14825 check_default_stripe_attr --stripe-count
14826 check_default_stripe_attr --stripe-size
14828 run_test 204d "Print default stripe count and size"
14831 test_mkdir $DIR/$tdir
14832 $LFS setstripe -d $DIR/$tdir
14834 check_default_stripe_attr --stripe-count --raw
14835 check_default_stripe_attr --stripe-size --raw
14836 check_default_stripe_attr --stripe-index --raw
14838 run_test 204e "Print raw stripe attributes"
14841 test_mkdir $DIR/$tdir
14842 $LFS setstripe --stripe-count 1 $DIR/$tdir
14844 check_default_stripe_attr --stripe-size --raw
14845 check_default_stripe_attr --stripe-index --raw
14847 run_test 204f "Print raw stripe size and offset"
14850 test_mkdir $DIR/$tdir
14851 $LFS setstripe --stripe-size 65536 $DIR/$tdir
14853 check_default_stripe_attr --stripe-count --raw
14854 check_default_stripe_attr --stripe-index --raw
14856 run_test 204g "Print raw stripe count and offset"
14859 test_mkdir $DIR/$tdir
14860 $LFS setstripe --stripe-index 0 $DIR/$tdir
14862 check_default_stripe_attr --stripe-count --raw
14863 check_default_stripe_attr --stripe-size --raw
14865 run_test 204h "Print raw stripe count and size"
14867 # Figure out which job scheduler is being used, if any,
14868 # or use a fake one
14869 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
14870 JOBENV=SLURM_JOB_ID
14871 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
14873 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
14875 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
14876 JOBENV=LOADL_STEP_ID
14877 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
14880 $LCTL list_param jobid_name > /dev/null 2>&1
14881 if [ $? -eq 0 ]; then
14887 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
14889 verify_jobstats() {
14894 # we don't really need to clear the stats for this test to work, since each
14895 # command has a unique jobid, but it makes debugging easier if needed.
14896 # for facet in $facets; do
14897 # local dev=$(convert_facet2label $facet)
14898 # # clear old jobstats
14899 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
14902 # use a new JobID for each test, or we might see an old one
14903 [ "$JOBENV" = "FAKE_JOBID" ] &&
14904 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
14906 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
14908 [ "$JOBENV" = "nodelocal" ] && {
14909 FAKE_JOBID=id.$testnum.%e.$RANDOM
14910 $LCTL set_param jobid_name=$FAKE_JOBID
14911 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
14914 log "Test: ${cmd[*]}"
14915 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
14917 if [ $JOBENV = "FAKE_JOBID" ]; then
14918 FAKE_JOBID=$JOBVAL ${cmd[*]}
14923 # all files are created on OST0000
14924 for facet in $facets; do
14925 local stats="*.$(convert_facet2label $facet).job_stats"
14927 # strip out libtool wrappers for in-tree executables
14928 if [ $(do_facet $facet lctl get_param $stats |
14929 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
14930 do_facet $facet lctl get_param $stats
14931 error "No jobstats for $JOBVAL found on $facet::$stats"
14937 local new_jobenv=$1
14939 set_persistent_param_and_check client "jobid_var" \
14940 "$FSNAME.sys.jobid_var" $new_jobenv
14943 test_205() { # Job stats
14944 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14945 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
14946 skip "Need MDS version with at least 2.7.1"
14947 remote_mgs_nodsh && skip "remote MGS with nodsh"
14948 remote_mds_nodsh && skip "remote MDS with nodsh"
14949 remote_ost_nodsh && skip "remote OST with nodsh"
14950 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
14951 skip "Server doesn't support jobstats"
14952 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
14954 local old_jobenv=$($LCTL get_param -n jobid_var)
14955 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
14957 if [[ $PERM_CMD == *"set_param -P"* ]]; then
14958 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
14960 stack_trap "do_facet mgs $PERM_CMD \
14961 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
14965 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
14966 mdt.*.job_cleanup_interval | head -n 1)
14967 local new_interval=5
14968 do_facet $SINGLEMDS \
14969 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
14970 stack_trap "do_facet $SINGLEMDS \
14971 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
14972 local start=$SECONDS
14976 cmd="mkdir $DIR/$tdir"
14977 verify_jobstats "$cmd" "$SINGLEMDS"
14979 cmd="rmdir $DIR/$tdir"
14980 verify_jobstats "$cmd" "$SINGLEMDS"
14981 # mkdir on secondary MDT
14982 if [ $MDSCOUNT -gt 1 ]; then
14983 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
14984 verify_jobstats "$cmd" "mds2"
14987 cmd="mknod $DIR/$tfile c 1 3"
14988 verify_jobstats "$cmd" "$SINGLEMDS"
14990 cmd="rm -f $DIR/$tfile"
14991 verify_jobstats "$cmd" "$SINGLEMDS"
14992 # create all files on OST0000 so verify_jobstats can find OST stats
14994 cmd="$LFS setstripe -i 0 -c 1 $DIR/$tfile"
14995 verify_jobstats "$cmd" "$SINGLEMDS"
14997 cmd="touch $DIR/$tfile"
14998 verify_jobstats "$cmd" "$SINGLEMDS ost1"
15000 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
15001 verify_jobstats "$cmd" "ost1"
15003 cancel_lru_locks osc
15004 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
15005 verify_jobstats "$cmd" "ost1"
15007 cmd="$TRUNCATE $DIR/$tfile 0"
15008 verify_jobstats "$cmd" "$SINGLEMDS ost1"
15010 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
15011 verify_jobstats "$cmd" "$SINGLEMDS"
15012 # jobstats expiry - sleep until old stats should be expired
15013 local left=$((new_interval + 5 - (SECONDS - start)))
15014 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
15015 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
15017 cmd="mkdir $DIR/$tdir.expire"
15018 verify_jobstats "$cmd" "$SINGLEMDS"
15019 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
15020 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
15022 # Ensure that jobid are present in changelog (if supported by MDS)
15023 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
15024 changelog_dump | tail -10
15025 jobids=$(changelog_dump | tail -9 | grep -c "j=")
15026 [ $jobids -eq 9 ] ||
15027 error "Wrong changelog jobid count $jobids != 9"
15031 jobstats_set $JOBENV
15033 changelog_dump | grep $tfile
15034 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
15035 [ $jobids -eq 0 ] ||
15036 error "Unexpected jobids when jobid_var=$JOBENV"
15039 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
15040 JOBENV="JOBCOMPLEX"
15041 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
15043 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
15045 run_test 205 "Verify job stats"
15047 # LU-1480, LU-1773 and LU-1657
15049 mkdir -p $DIR/$tdir
15050 $LFS setstripe -c -1 $DIR/$tdir
15051 #define OBD_FAIL_LOV_INIT 0x1403
15052 $LCTL set_param fail_loc=0xa0001403
15053 $LCTL set_param fail_val=1
15054 touch $DIR/$tdir/$tfile || true
15056 run_test 206 "fail lov_init_raid0() doesn't lbug"
15059 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15060 local fsz=`stat -c %s $DIR/$tfile`
15061 cancel_lru_locks mdc
15063 # do not return layout in getattr intent
15064 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
15065 $LCTL set_param fail_loc=0x170
15066 local sz=`stat -c %s $DIR/$tfile`
15068 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
15072 run_test 207a "can refresh layout at glimpse"
15075 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15076 local cksum=`md5sum $DIR/$tfile`
15077 local fsz=`stat -c %s $DIR/$tfile`
15078 cancel_lru_locks mdc
15079 cancel_lru_locks osc
15081 # do not return layout in getattr intent
15082 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
15083 $LCTL set_param fail_loc=0x171
15085 # it will refresh layout after the file is opened but before read issues
15086 echo checksum is "$cksum"
15087 echo "$cksum" |md5sum -c --quiet || error "file differs"
15091 run_test 207b "can refresh layout at open"
15094 # FIXME: in this test suite, only RD lease is used. This is okay
15095 # for now as only exclusive open is supported. After generic lease
15096 # is done, this test suite should be revised. - Jinshan
15098 remote_mds_nodsh && skip "remote MDS with nodsh"
15099 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
15100 skip "Need MDS version at least 2.4.52"
15102 echo "==== test 1: verify get lease work"
15103 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
15105 echo "==== test 2: verify lease can be broken by upcoming open"
15106 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15110 $MULTIOP $DIR/$tfile oO_RDONLY:c
15111 kill -USR1 $PID && wait $PID || error "break lease error"
15113 echo "==== test 3: verify lease can't be granted if an open already exists"
15114 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
15118 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
15119 kill -USR1 $PID && wait $PID || error "open file error"
15121 echo "==== test 4: lease can sustain over recovery"
15122 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
15128 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
15130 echo "==== test 5: lease broken can't be regained by replay"
15131 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15135 # open file to break lease and then recovery
15136 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
15139 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
15143 run_test 208 "Exclusive open"
15146 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
15147 skip_env "must have disp_stripe"
15150 sync; sleep 5; sync;
15152 echo 3 > /proc/sys/vm/drop_caches
15153 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15155 # open/close 500 times
15156 for i in $(seq 500); do
15160 echo 3 > /proc/sys/vm/drop_caches
15161 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15163 echo "before: $req_before, after: $req_after"
15164 [ $((req_after - req_before)) -ge 300 ] &&
15165 error "open/close requests are not freed"
15168 run_test 209 "read-only open/close requests should be freed promptly"
15172 size=$((size % 8192 + 1))
15173 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
15174 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
15175 rm -f $DIR/f212 $DIR/f212.xyz
15177 run_test 212 "Sendfile test ============================================"
15180 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
15181 cancel_lru_locks osc
15182 lctl set_param fail_loc=0x8000040f
15183 # generate a read lock
15184 cat $DIR/$tfile > /dev/null
15185 # write to the file, it will try to cancel the above read lock.
15186 cat /etc/hosts >> $DIR/$tfile
15188 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
15190 test_214() { # for bug 20133
15191 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
15192 for (( i=0; i < 340; i++ )) ; do
15193 touch $DIR/$tdir/d214c/a$i
15196 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
15197 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
15198 ls $DIR/d214c || error "ls $DIR/d214c failed"
15199 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
15200 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
15202 run_test 214 "hash-indexed directory test - bug 20133"
15204 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
15205 create_lnet_proc_files() {
15206 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
15209 # counterpart of create_lnet_proc_files
15210 remove_lnet_proc_files() {
15211 rm -f $TMP/lnet_$1.sys
15214 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15215 # 3rd arg as regexp for body
15216 check_lnet_proc_stats() {
15217 local l=$(cat "$TMP/lnet_$1" |wc -l)
15218 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
15220 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
15223 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15224 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
15225 # optional and can be regexp for 2nd line (lnet.routes case)
15226 check_lnet_proc_entry() {
15227 local blp=2 # blp stands for 'position of 1st line of body'
15228 [ -z "$5" ] || blp=3 # lnet.routes case
15230 local l=$(cat "$TMP/lnet_$1" |wc -l)
15231 # subtracting one from $blp because the body can be empty
15232 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
15234 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
15235 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
15237 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
15238 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
15240 # bail out if any unexpected line happened
15241 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
15242 [ "$?" != 0 ] || error "$2 misformatted"
15245 test_215() { # for bugs 18102, 21079, 21517
15246 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15248 local N='(0|[1-9][0-9]*)' # non-negative numeric
15249 local P='[1-9][0-9]*' # positive numeric
15250 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
15251 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
15252 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
15253 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
15255 local L1 # regexp for 1st line
15256 local L2 # regexp for 2nd line (optional)
15257 local BR # regexp for the rest (body)
15259 # lnet.stats should look as 11 space-separated non-negative numerics
15260 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
15261 create_lnet_proc_files "stats"
15262 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
15263 remove_lnet_proc_files "stats"
15265 # lnet.routes should look like this:
15266 # Routing disabled/enabled
15267 # net hops priority state router
15268 # where net is a string like tcp0, hops > 0, priority >= 0,
15269 # state is up/down,
15270 # router is a string like 192.168.1.1@tcp2
15271 L1="^Routing (disabled|enabled)$"
15272 L2="^net +hops +priority +state +router$"
15273 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
15274 create_lnet_proc_files "routes"
15275 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
15276 remove_lnet_proc_files "routes"
15278 # lnet.routers should look like this:
15279 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
15280 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
15281 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
15282 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
15283 L1="^ref +rtr_ref +alive +router$"
15284 BR="^$P +$P +(up|down) +$NID$"
15285 create_lnet_proc_files "routers"
15286 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
15287 remove_lnet_proc_files "routers"
15289 # lnet.peers should look like this:
15290 # nid refs state last max rtr min tx min queue
15291 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
15292 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
15293 # numeric (0 or >0 or <0), queue >= 0.
15294 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
15295 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
15296 create_lnet_proc_files "peers"
15297 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
15298 remove_lnet_proc_files "peers"
15300 # lnet.buffers should look like this:
15301 # pages count credits min
15302 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
15303 L1="^pages +count +credits +min$"
15304 BR="^ +$N +$N +$I +$I$"
15305 create_lnet_proc_files "buffers"
15306 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
15307 remove_lnet_proc_files "buffers"
15309 # lnet.nis should look like this:
15310 # nid status alive refs peer rtr max tx min
15311 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
15312 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
15313 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
15314 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
15315 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
15316 create_lnet_proc_files "nis"
15317 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
15318 remove_lnet_proc_files "nis"
15320 # can we successfully write to lnet.stats?
15321 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
15323 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
15325 test_216() { # bug 20317
15326 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15327 remote_ost_nodsh && skip "remote OST with nodsh"
15330 local facets=$(get_facets OST)
15331 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15333 save_lustre_params client "osc.*.contention_seconds" > $p
15334 save_lustre_params $facets \
15335 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
15336 save_lustre_params $facets \
15337 "ldlm.namespaces.filter-*.contended_locks" >> $p
15338 save_lustre_params $facets \
15339 "ldlm.namespaces.filter-*.contention_seconds" >> $p
15340 clear_stats osc.*.osc_stats
15342 # agressive lockless i/o settings
15343 do_nodes $(comma_list $(osts_nodes)) \
15344 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
15345 ldlm.namespaces.filter-*.contended_locks=0 \
15346 ldlm.namespaces.filter-*.contention_seconds=60"
15347 lctl set_param -n osc.*.contention_seconds=60
15349 $DIRECTIO write $DIR/$tfile 0 10 4096
15350 $CHECKSTAT -s 40960 $DIR/$tfile
15352 # disable lockless i/o
15353 do_nodes $(comma_list $(osts_nodes)) \
15354 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
15355 ldlm.namespaces.filter-*.contended_locks=32 \
15356 ldlm.namespaces.filter-*.contention_seconds=0"
15357 lctl set_param -n osc.*.contention_seconds=0
15358 clear_stats osc.*.osc_stats
15360 dd if=/dev/zero of=$DIR/$tfile count=0
15361 $CHECKSTAT -s 0 $DIR/$tfile
15363 restore_lustre_params <$p
15367 run_test 216 "check lockless direct write updates file size and kms correctly"
15369 test_217() { # bug 22430
15370 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15375 for node in $(nodes_list); do
15376 nid=$(host_nids_address $node $NETTYPE)
15377 if [[ $nid = *-* ]] ; then
15378 echo "lctl ping $(h2nettype $nid)"
15379 lctl ping $(h2nettype $nid)
15381 echo "skipping $node (no hyphen detected)"
15385 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
15388 # do directio so as not to populate the page cache
15389 log "creating a 10 Mb file"
15390 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
15391 log "starting reads"
15392 dd if=$DIR/$tfile of=/dev/null bs=4096 &
15393 log "truncating the file"
15394 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
15396 kill %+ || true # reads might have finished
15397 echo "wait until dd is finished"
15399 log "removing the temporary file"
15400 rm -rf $DIR/$tfile || error "tmp file removal failed"
15402 run_test 218 "parallel read and truncate should not deadlock"
15405 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15407 # write one partial page
15408 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
15409 # set no grant so vvp_io_commit_write will do sync write
15410 $LCTL set_param fail_loc=0x411
15411 # write a full page at the end of file
15412 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
15414 $LCTL set_param fail_loc=0
15415 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
15416 $LCTL set_param fail_loc=0x411
15417 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
15420 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
15421 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
15423 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
15425 test_220() { #LU-325
15426 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15427 remote_ost_nodsh && skip "remote OST with nodsh"
15428 remote_mds_nodsh && skip "remote MDS with nodsh"
15429 remote_mgs_nodsh && skip "remote MGS with nodsh"
15433 # create on MDT0000 so the last_id and next_id are correct
15435 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
15439 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
15440 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
15441 osp.$mdtosc_proc1.prealloc_last_id)
15442 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15443 osp.$mdtosc_proc1.prealloc_next_id)
15447 if ! combined_mgs_mds ; then
15451 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15452 #define OBD_FAIL_OST_ENOINO 0x229
15453 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15454 create_pool $FSNAME.$TESTNAME || return 1
15455 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15457 $LFS setstripe $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15459 MDSOBJS=$((last_id - next_id))
15460 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15462 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15463 echo "OST still has $count kbytes free"
15465 echo "create $MDSOBJS files @next_id..."
15466 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15468 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15469 osp.$mdtosc_proc1.prealloc_last_id)
15470 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15471 osp.$mdtosc_proc1.prealloc_next_id)
15473 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15478 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15479 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15481 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15482 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15483 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15484 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15485 echo "unlink $MDSOBJS files @$next_id..."
15486 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15488 if ! combined_mgs_mds ; then
15492 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15495 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15497 dd if=`which date` of=$MOUNT/date oflag=sync
15498 chmod +x $MOUNT/date
15500 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15501 $LCTL set_param fail_loc=0x80001401
15503 $MOUNT/date > /dev/null
15506 run_test 221 "make sure fault and truncate race to not cause OOM"
15509 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15512 test_mkdir $DIR/$tdir
15513 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15514 createmany -o $DIR/$tdir/$tfile 10
15515 cancel_lru_locks mdc
15516 cancel_lru_locks osc
15517 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15518 $LCTL set_param fail_loc=0x31a
15519 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15520 $LCTL set_param fail_loc=0
15523 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15526 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15529 test_mkdir $DIR/$tdir
15530 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15531 createmany -o $DIR/$tdir/$tfile 10
15532 cancel_lru_locks mdc
15533 cancel_lru_locks osc
15534 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15535 $LCTL set_param fail_loc=0x31a
15536 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15537 $LCTL set_param fail_loc=0
15539 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15542 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15545 test_mkdir $DIR/$tdir
15546 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15547 createmany -o $DIR/$tdir/$tfile 10
15548 cancel_lru_locks mdc
15549 cancel_lru_locks osc
15550 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15551 $LCTL set_param fail_loc=0x31b
15552 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15553 $LCTL set_param fail_loc=0
15556 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15558 test_224a() { # LU-1039, MRP-303
15559 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15561 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15562 $LCTL set_param fail_loc=0x508
15563 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15564 $LCTL set_param fail_loc=0
15567 run_test 224a "Don't panic on bulk IO failure"
15569 test_224b() { # LU-1039, MRP-303
15570 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15572 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15573 cancel_lru_locks osc
15574 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15575 $LCTL set_param fail_loc=0x515
15576 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15577 $LCTL set_param fail_loc=0
15580 run_test 224b "Don't panic on bulk IO failure"
15582 test_224c() { # LU-6441
15583 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15584 remote_mds_nodsh && skip "remote MDS with nodsh"
15586 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15587 save_writethrough $p
15588 set_cache writethrough on
15590 local pages_per_rpc=$($LCTL get_param \
15591 osc.*.max_pages_per_rpc)
15592 local at_max=$($LCTL get_param -n at_max)
15593 local timeout=$($LCTL get_param -n timeout)
15594 local test_at="at_max"
15595 local param_at="$FSNAME.sys.at_max"
15596 local test_timeout="timeout"
15597 local param_timeout="$FSNAME.sys.timeout"
15599 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
15601 set_persistent_param_and_check client "$test_at" "$param_at" 0
15602 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
15604 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
15605 do_facet ost1 "$LCTL set_param fail_loc=0x520"
15606 $LFS setstripe -c 1 -i 0 $DIR/$tfile
15607 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
15609 do_facet ost1 "$LCTL set_param fail_loc=0"
15611 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
15612 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
15615 $LCTL set_param -n $pages_per_rpc
15616 restore_lustre_params < $p
15619 run_test 224c "Don't hang if one of md lost during large bulk RPC"
15621 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
15623 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15624 if [ -z ${MDSSURVEY} ]; then
15625 skip_env "mds-survey not found"
15627 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15628 skip "Need MDS version at least 2.2.51"
15630 local mds=$(facet_host $SINGLEMDS)
15631 local target=$(do_nodes $mds 'lctl dl' |
15632 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15634 local cmd1="file_count=1000 thrhi=4"
15635 local cmd2="dir_count=2 layer=mdd stripe_count=0"
15636 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15637 local cmd="$cmd1 $cmd2 $cmd3"
15639 rm -f ${TMP}/mds_survey*
15641 eval $cmd || error "mds-survey with zero-stripe failed"
15642 cat ${TMP}/mds_survey*
15643 rm -f ${TMP}/mds_survey*
15645 run_test 225a "Metadata survey sanity with zero-stripe"
15648 if [ -z ${MDSSURVEY} ]; then
15649 skip_env "mds-survey not found"
15651 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15652 skip "Need MDS version at least 2.2.51"
15653 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15654 remote_mds_nodsh && skip "remote MDS with nodsh"
15655 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
15656 skip_env "Need to mount OST to test"
15659 local mds=$(facet_host $SINGLEMDS)
15660 local target=$(do_nodes $mds 'lctl dl' |
15661 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15663 local cmd1="file_count=1000 thrhi=4"
15664 local cmd2="dir_count=2 layer=mdd stripe_count=1"
15665 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15666 local cmd="$cmd1 $cmd2 $cmd3"
15668 rm -f ${TMP}/mds_survey*
15670 eval $cmd || error "mds-survey with stripe_count failed"
15671 cat ${TMP}/mds_survey*
15672 rm -f ${TMP}/mds_survey*
15674 run_test 225b "Metadata survey sanity with stripe_count = 1"
15676 mcreate_path2fid () {
15682 local path=$DIR/$tdir/$name
15687 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
15688 error "cannot create $desc"
15690 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
15692 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
15694 fid_path=$($LFS fid2path $MOUNT $fid)
15696 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
15698 [ "$path" == "$fid_path" ] ||
15699 error "fid2path returned $fid_path, expected $path"
15701 echo "pass with $path and $fid"
15706 mkdir -p $DIR/$tdir
15708 mcreate_path2fid 0010666 0 0 fifo "FIFO"
15709 mcreate_path2fid 0020666 1 3 null "character special file (null)"
15710 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
15711 mcreate_path2fid 0040666 0 0 dir "directory"
15712 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
15713 mcreate_path2fid 0100666 0 0 file "regular file"
15714 mcreate_path2fid 0120666 0 0 link "symbolic link"
15715 mcreate_path2fid 0140666 0 0 sock "socket"
15717 run_test 226a "call path2fid and fid2path on files of all type"
15720 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15725 mkdir -p $DIR/$tdir
15726 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
15727 error "create remote directory failed"
15728 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
15729 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
15730 "character special file (null)"
15731 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
15732 "character special file (no device)"
15733 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
15734 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
15735 "block special file (loop)"
15736 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
15737 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
15738 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
15740 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
15742 # LU-1299 Executing or running ldd on a truncated executable does not
15743 # cause an out-of-memory condition.
15745 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15746 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
15748 dd if=$(which date) of=$MOUNT/date bs=1k count=1
15749 chmod +x $MOUNT/date
15751 $MOUNT/date > /dev/null
15752 ldd $MOUNT/date > /dev/null
15755 run_test 227 "running truncated executable does not cause OOM"
15757 # LU-1512 try to reuse idle OI blocks
15759 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15760 remote_mds_nodsh && skip "remote MDS with nodsh"
15761 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15763 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15764 local myDIR=$DIR/$tdir
15767 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15768 $LCTL set_param fail_loc=0x80001002
15769 createmany -o $myDIR/t- 10000
15770 $LCTL set_param fail_loc=0
15771 # The guard is current the largest FID holder
15773 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15775 local IDX=$(($SEQ % 64))
15777 do_facet $SINGLEMDS sync
15778 # Make sure journal flushed.
15780 local blk1=$(do_facet $SINGLEMDS \
15781 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15782 grep Blockcount | awk '{print $4}')
15784 # Remove old files, some OI blocks will become idle.
15785 unlinkmany $myDIR/t- 10000
15786 # Create new files, idle OI blocks should be reused.
15787 createmany -o $myDIR/t- 2000
15788 do_facet $SINGLEMDS sync
15789 # Make sure journal flushed.
15791 local blk2=$(do_facet $SINGLEMDS \
15792 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15793 grep Blockcount | awk '{print $4}')
15795 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15797 run_test 228a "try to reuse idle OI blocks"
15800 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15801 remote_mds_nodsh && skip "remote MDS with nodsh"
15802 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15804 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15805 local myDIR=$DIR/$tdir
15808 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15809 $LCTL set_param fail_loc=0x80001002
15810 createmany -o $myDIR/t- 10000
15811 $LCTL set_param fail_loc=0
15812 # The guard is current the largest FID holder
15814 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15816 local IDX=$(($SEQ % 64))
15818 do_facet $SINGLEMDS sync
15819 # Make sure journal flushed.
15821 local blk1=$(do_facet $SINGLEMDS \
15822 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15823 grep Blockcount | awk '{print $4}')
15825 # Remove old files, some OI blocks will become idle.
15826 unlinkmany $myDIR/t- 10000
15829 stop $SINGLEMDS || error "Fail to stop MDT."
15831 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
15833 df $MOUNT || error "Fail to df."
15834 # Create new files, idle OI blocks should be reused.
15835 createmany -o $myDIR/t- 2000
15836 do_facet $SINGLEMDS sync
15837 # Make sure journal flushed.
15839 local blk2=$(do_facet $SINGLEMDS \
15840 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15841 grep Blockcount | awk '{print $4}')
15843 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15845 run_test 228b "idle OI blocks can be reused after MDT restart"
15849 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15850 remote_mds_nodsh && skip "remote MDS with nodsh"
15851 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15853 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15854 local myDIR=$DIR/$tdir
15857 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15858 $LCTL set_param fail_loc=0x80001002
15859 # 20000 files can guarantee there are index nodes in the OI file
15860 createmany -o $myDIR/t- 20000
15861 $LCTL set_param fail_loc=0
15862 # The guard is current the largest FID holder
15864 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15866 local IDX=$(($SEQ % 64))
15868 do_facet $SINGLEMDS sync
15869 # Make sure journal flushed.
15871 local blk1=$(do_facet $SINGLEMDS \
15872 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15873 grep Blockcount | awk '{print $4}')
15875 # Remove old files, some OI blocks will become idle.
15876 unlinkmany $myDIR/t- 20000
15878 # The OI file should become empty now
15880 # Create new files, idle OI blocks should be reused.
15881 createmany -o $myDIR/t- 2000
15882 do_facet $SINGLEMDS sync
15883 # Make sure journal flushed.
15885 local blk2=$(do_facet $SINGLEMDS \
15886 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15887 grep Blockcount | awk '{print $4}')
15889 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15891 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
15893 test_229() { # LU-2482, LU-3448
15894 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15895 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
15896 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
15897 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
15901 # Create a file with a released layout and stripe count 2.
15902 $MULTIOP $DIR/$tfile H2c ||
15903 error "failed to create file with released layout"
15905 $LFS getstripe -v $DIR/$tfile
15907 local pattern=$($LFS getstripe -L $DIR/$tfile)
15908 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
15910 local stripe_count=$($LFS getstripe -c $DIR/$tfile) ||
15912 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
15913 stat $DIR/$tfile || error "failed to stat released file"
15915 chown $RUNAS_ID $DIR/$tfile ||
15916 error "chown $RUNAS_ID $DIR/$tfile failed"
15918 chgrp $RUNAS_ID $DIR/$tfile ||
15919 error "chgrp $RUNAS_ID $DIR/$tfile failed"
15921 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
15922 rm $DIR/$tfile || error "failed to remove released file"
15924 run_test 229 "getstripe/stat/rm/attr changes work on released files"
15927 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15928 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15929 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15930 skip "Need MDS version at least 2.11.52"
15934 test_mkdir $DIR/$tdir
15935 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
15936 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
15937 [ $mdt_idx -ne 0 ] &&
15938 error "create local directory on wrong MDT $mdt_idx"
15940 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
15941 error "create remote directory failed"
15942 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
15943 [ $mdt_idx -ne $MDTIDX ] &&
15944 error "create remote directory on wrong MDT $mdt_idx"
15946 createmany -o $DIR/$tdir/test_230/t- 10 ||
15947 error "create files on remote directory failed"
15948 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
15949 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
15950 rm -r $DIR/$tdir || error "unlink remote directory failed"
15952 run_test 230a "Create remote directory and files under the remote directory"
15955 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15956 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15957 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15958 skip "Need MDS version at least 2.11.52"
15966 local migrate_dir=$DIR/$tdir/migrate_dir
15967 local other_dir=$DIR/$tdir/other_dir
15969 test_mkdir $DIR/$tdir
15970 test_mkdir -i0 -c1 $migrate_dir
15971 test_mkdir -i0 -c1 $other_dir
15972 for ((i=0; i<10; i++)); do
15973 mkdir -p $migrate_dir/dir_${i}
15974 createmany -o $migrate_dir/dir_${i}/f 10 ||
15975 error "create files under remote dir failed $i"
15978 cp /etc/passwd $migrate_dir/$tfile
15979 cp /etc/passwd $other_dir/$tfile
15980 chattr +SAD $migrate_dir
15981 chattr +SAD $migrate_dir/$tfile
15983 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
15984 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
15985 local old_dir_mode=$(stat -c%f $migrate_dir)
15986 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
15988 mkdir -p $migrate_dir/dir_default_stripe2
15989 $LFS setstripe -c 2 $migrate_dir/dir_default_stripe2
15990 $LFS setstripe -c 2 $migrate_dir/${tfile}_stripe2
15992 mkdir -p $other_dir
15993 ln $migrate_dir/$tfile $other_dir/luna
15994 ln $migrate_dir/$tfile $migrate_dir/sofia
15995 ln $other_dir/$tfile $migrate_dir/david
15996 ln -s $migrate_dir/$tfile $other_dir/zachary
15997 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
15998 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
16000 $LFS migrate -m $MDTIDX $migrate_dir ||
16001 error "fails on migrating remote dir to MDT1"
16003 echo "migratate to MDT1, then checking.."
16004 for ((i = 0; i < 10; i++)); do
16005 for file in $(find $migrate_dir/dir_${i}); do
16006 mdt_index=$($LFS getstripe -m $file)
16007 [ $mdt_index == $MDTIDX ] ||
16008 error "$file is not on MDT${MDTIDX}"
16012 # the multiple link file should still in MDT0
16013 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
16014 [ $mdt_index == 0 ] ||
16015 error "$file is not on MDT${MDTIDX}"
16017 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16018 [ "$old_dir_flag" = "$new_dir_flag" ] ||
16019 error " expect $old_dir_flag get $new_dir_flag"
16021 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16022 [ "$old_file_flag" = "$new_file_flag" ] ||
16023 error " expect $old_file_flag get $new_file_flag"
16025 local new_dir_mode=$(stat -c%f $migrate_dir)
16026 [ "$old_dir_mode" = "$new_dir_mode" ] ||
16027 error "expect mode $old_dir_mode get $new_dir_mode"
16029 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
16030 [ "$old_file_mode" = "$new_file_mode" ] ||
16031 error "expect mode $old_file_mode get $new_file_mode"
16033 diff /etc/passwd $migrate_dir/$tfile ||
16034 error "$tfile different after migration"
16036 diff /etc/passwd $other_dir/luna ||
16037 error "luna different after migration"
16039 diff /etc/passwd $migrate_dir/sofia ||
16040 error "sofia different after migration"
16042 diff /etc/passwd $migrate_dir/david ||
16043 error "david different after migration"
16045 diff /etc/passwd $other_dir/zachary ||
16046 error "zachary different after migration"
16048 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16049 error "${tfile}_ln different after migration"
16051 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16052 error "${tfile}_ln_other different after migration"
16054 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
16055 [ $stripe_count = 2 ] ||
16056 error "dir strpe_count $d != 2 after migration."
16058 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
16059 [ $stripe_count = 2 ] ||
16060 error "file strpe_count $d != 2 after migration."
16062 #migrate back to MDT0
16065 $LFS migrate -m $MDTIDX $migrate_dir ||
16066 error "fails on migrating remote dir to MDT0"
16068 echo "migrate back to MDT0, checking.."
16069 for file in $(find $migrate_dir); do
16070 mdt_index=$($LFS getstripe -m $file)
16071 [ $mdt_index == $MDTIDX ] ||
16072 error "$file is not on MDT${MDTIDX}"
16075 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16076 [ "$old_dir_flag" = "$new_dir_flag" ] ||
16077 error " expect $old_dir_flag get $new_dir_flag"
16079 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16080 [ "$old_file_flag" = "$new_file_flag" ] ||
16081 error " expect $old_file_flag get $new_file_flag"
16083 local new_dir_mode=$(stat -c%f $migrate_dir)
16084 [ "$old_dir_mode" = "$new_dir_mode" ] ||
16085 error "expect mode $old_dir_mode get $new_dir_mode"
16087 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
16088 [ "$old_file_mode" = "$new_file_mode" ] ||
16089 error "expect mode $old_file_mode get $new_file_mode"
16091 diff /etc/passwd ${migrate_dir}/$tfile ||
16092 error "$tfile different after migration"
16094 diff /etc/passwd ${other_dir}/luna ||
16095 error "luna different after migration"
16097 diff /etc/passwd ${migrate_dir}/sofia ||
16098 error "sofia different after migration"
16100 diff /etc/passwd ${other_dir}/zachary ||
16101 error "zachary different after migration"
16103 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16104 error "${tfile}_ln different after migration"
16106 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16107 error "${tfile}_ln_other different after migration"
16109 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
16110 [ $stripe_count = 2 ] ||
16111 error "dir strpe_count $d != 2 after migration."
16113 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
16114 [ $stripe_count = 2 ] ||
16115 error "file strpe_count $d != 2 after migration."
16117 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16119 run_test 230b "migrate directory"
16122 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16123 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16124 remote_mds_nodsh && skip "remote MDS with nodsh"
16125 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16126 skip "Need MDS version at least 2.11.52"
16132 local migrate_dir=$DIR/$tdir/migrate_dir
16134 #If migrating directory fails in the middle, all entries of
16135 #the directory is still accessiable.
16136 test_mkdir $DIR/$tdir
16137 test_mkdir -i0 -c1 $migrate_dir
16138 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
16140 createmany -o $migrate_dir/f $total ||
16141 error "create files under ${migrate_dir} failed"
16143 # fail after migrating top dir, and this will fail only once, so the
16144 # first sub file migration will fail (currently f3), others succeed.
16145 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
16146 do_facet mds1 lctl set_param fail_loc=0x1801
16147 local t=$(ls $migrate_dir | wc -l)
16148 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
16149 error "migrate should fail"
16150 local u=$(ls $migrate_dir | wc -l)
16151 [ "$u" == "$t" ] || error "$u != $t during migration"
16153 # add new dir/file should succeed
16154 mkdir $migrate_dir/dir ||
16155 error "mkdir failed under migrating directory"
16156 touch $migrate_dir/file ||
16157 error "create file failed under migrating directory"
16159 # add file with existing name should fail
16160 for file in $migrate_dir/f*; do
16161 stat $file > /dev/null || error "stat $file failed"
16162 $OPENFILE -f O_CREAT:O_EXCL $file &&
16163 error "open(O_CREAT|O_EXCL) $file should fail"
16164 $MULTIOP $file m && error "create $file should fail"
16165 touch $DIR/$tdir/remote_dir/$tfile ||
16166 error "touch $tfile failed"
16167 ln $DIR/$tdir/remote_dir/$tfile $file &&
16168 error "link $file should fail"
16169 mdt_index=$($LFS getstripe -m $file)
16170 if [ $mdt_index == 0 ]; then
16171 # file failed to migrate is not allowed to rename to
16172 mv $DIR/$tdir/remote_dir/$tfile $file &&
16173 error "rename to $file should fail"
16175 mv $DIR/$tdir/remote_dir/$tfile $file ||
16176 error "rename to $file failed"
16178 echo hello >> $file || error "write $file failed"
16181 # resume migration with different options should fail
16182 $LFS migrate -m 0 $migrate_dir &&
16183 error "migrate -m 0 $migrate_dir should fail"
16185 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
16186 error "migrate -c 2 $migrate_dir should fail"
16188 # resume migration should succeed
16189 $LFS migrate -m $MDTIDX $migrate_dir ||
16190 error "migrate $migrate_dir failed"
16192 echo "Finish migration, then checking.."
16193 for file in $(find $migrate_dir); do
16194 mdt_index=$($LFS getstripe -m $file)
16195 [ $mdt_index == $MDTIDX ] ||
16196 error "$file is not on MDT${MDTIDX}"
16199 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16201 run_test 230c "check directory accessiblity if migration failed"
16204 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16205 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16206 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16207 skip "Need MDS version at least 2.11.52"
16209 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
16211 local migrate_dir=$DIR/$tdir/migrate_dir
16221 old_index=$((RANDOM % MDSCOUNT))
16222 old_count=$((MDSCOUNT - old_index))
16223 new_index=$((RANDOM % MDSCOUNT))
16224 new_count=$((MDSCOUNT - new_index))
16225 new_hash="all_char"
16227 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
16228 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
16230 test_mkdir $DIR/$tdir
16231 test_mkdir -i $old_index -c $old_count $migrate_dir
16233 for ((i=0; i<100; i++)); do
16234 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
16235 createmany -o $migrate_dir/dir_${i}/f 100 ||
16236 error "create files under remote dir failed $i"
16239 echo -n "Migrate from MDT$old_index "
16240 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
16241 echo -n "to MDT$new_index"
16242 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
16245 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
16246 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
16247 error "migrate remote dir error"
16249 echo "Finish migration, then checking.."
16250 for file in $(find $migrate_dir); do
16251 mdt_index=$($LFS getstripe -m $file)
16252 if [ $mdt_index -lt $new_index ] ||
16253 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
16254 error "$file is on MDT$mdt_index"
16258 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16260 run_test 230d "check migrate big directory"
16263 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16264 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16265 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16266 skip "Need MDS version at least 2.11.52"
16273 mkdir -p $DIR/$tdir
16274 mkdir $DIR/$tdir/migrate_dir
16275 mkdir $DIR/$tdir/other_dir
16276 touch $DIR/$tdir/migrate_dir/a
16277 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
16278 ls $DIR/$tdir/other_dir
16280 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16281 error "migrate dir fails"
16283 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16284 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16286 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16287 [ $mdt_index == 0 ] || error "a is not on MDT0"
16289 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
16290 error "migrate dir fails"
16292 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
16293 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
16295 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16296 [ $mdt_index == 1 ] || error "a is not on MDT1"
16298 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
16299 [ $mdt_index == 1 ] || error "b is not on MDT1"
16301 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16302 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
16304 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
16306 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16308 run_test 230e "migrate mulitple local link files"
16311 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16312 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16313 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16314 skip "Need MDS version at least 2.11.52"
16319 mkdir -p $DIR/$tdir
16320 mkdir $DIR/$tdir/migrate_dir
16321 $LFS mkdir -i1 $DIR/$tdir/other_dir
16322 touch $DIR/$tdir/migrate_dir/a
16323 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
16324 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
16325 ls $DIR/$tdir/other_dir
16327 # a should be migrated to MDT1, since no other links on MDT0
16328 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16329 error "#1 migrate dir fails"
16330 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16331 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16332 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16333 [ $mdt_index == 1 ] || error "a is not on MDT1"
16335 # a should stay on MDT1, because it is a mulitple link file
16336 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16337 error "#2 migrate dir fails"
16338 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16339 [ $mdt_index == 1 ] || error "a is not on MDT1"
16341 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16342 error "#3 migrate dir fails"
16344 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16345 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
16346 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
16348 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
16349 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
16351 # a should be migrated to MDT0, since no other links on MDT1
16352 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16353 error "#4 migrate dir fails"
16354 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16355 [ $mdt_index == 0 ] || error "a is not on MDT0"
16357 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16359 run_test 230f "migrate mulitple remote link files"
16362 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16363 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16364 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16365 skip "Need MDS version at least 2.11.52"
16367 mkdir -p $DIR/$tdir/migrate_dir
16369 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
16370 error "migrating dir to non-exist MDT succeeds"
16373 run_test 230g "migrate dir to non-exist MDT"
16376 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16377 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16378 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16379 skip "Need MDS version at least 2.11.52"
16383 mkdir -p $DIR/$tdir/migrate_dir
16385 $LFS migrate -m1 $DIR &&
16386 error "migrating mountpoint1 should fail"
16388 $LFS migrate -m1 $DIR/$tdir/.. &&
16389 error "migrating mountpoint2 should fail"
16392 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
16393 error "migrating $tdir/migrate_dir/.. should fail"
16397 run_test 230h "migrate .. and root"
16400 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16401 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16402 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16403 skip "Need MDS version at least 2.11.52"
16405 mkdir -p $DIR/$tdir/migrate_dir
16407 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
16408 error "migration fails with a tailing slash"
16410 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
16411 error "migration fails with two tailing slashes"
16413 run_test 230i "lfs migrate -m tolerates trailing slashes"
16416 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16417 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16418 skip "Need MDS version at least 2.11.52"
16420 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
16421 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
16422 error "create $tfile failed"
16423 cat /etc/passwd > $DIR/$tdir/$tfile
16425 $LFS migrate -m 1 $DIR/$tdir
16427 cmp /etc/passwd $DIR/$tdir/$tfile ||
16428 error "DoM file mismatch after migration"
16430 run_test 230j "DoM file data not changed after dir migration"
16433 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
16434 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16435 skip "Need MDS version at least 2.11.56"
16438 local files_on_starting_mdt=0
16440 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
16441 $LFS getdirstripe $DIR/$tdir
16442 for i in $(seq $total); do
16443 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
16444 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16445 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16448 echo "$files_on_starting_mdt files on MDT0"
16450 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
16451 $LFS getdirstripe $DIR/$tdir
16453 files_on_starting_mdt=0
16454 for i in $(seq $total); do
16455 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16456 error "file $tfile.$i mismatch after migration"
16457 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16458 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16461 echo "$files_on_starting_mdt files on MDT1 after migration"
16462 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16464 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16465 $LFS getdirstripe $DIR/$tdir
16467 files_on_starting_mdt=0
16468 for i in $(seq $total); do
16469 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16470 error "file $tfile.$i mismatch after 2nd migration"
16471 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16472 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16475 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
16476 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16480 run_test 230k "file data not changed after dir migration"
16483 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16484 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16485 skip "Need MDS version at least 2.11.56"
16487 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16488 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16489 error "create files under remote dir failed $i"
16490 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16492 run_test 230l "readdir between MDTs won't crash"
16496 # For simplicity this test assumes that max_pages_per_rpc
16497 # is the same across all OSCs
16498 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16499 local bulk_size=$((max_pages * PAGE_SIZE))
16500 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16503 mkdir -p $DIR/$tdir
16504 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16505 error "failed to set stripe with -S ${brw_size}M option"
16507 # clear the OSC stats
16508 $LCTL set_param osc.*.stats=0 &>/dev/null
16511 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16512 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16513 oflag=direct &>/dev/null || error "dd failed"
16515 sync; sleep 1; sync # just to be safe
16516 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16517 if [ x$nrpcs != "x1" ]; then
16518 $LCTL get_param osc.*.stats
16519 error "found $nrpcs ost_write RPCs, not 1 as expected"
16523 # Drop the OSC cache, otherwise we will read from it
16524 cancel_lru_locks osc
16526 # clear the OSC stats
16527 $LCTL set_param osc.*.stats=0 &>/dev/null
16529 # Client reads $bulk_size.
16530 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16531 iflag=direct &>/dev/null || error "dd failed"
16533 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16534 if [ x$nrpcs != "x1" ]; then
16535 $LCTL get_param osc.*.stats
16536 error "found $nrpcs ost_read RPCs, not 1 as expected"
16539 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16542 mkdir -p $DIR/$tdir
16544 for i in {0..1023}; do
16545 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16546 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16547 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16551 run_test 231b "must not assert on fully utilized OST request buffer"
16554 mkdir -p $DIR/$tdir
16555 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16557 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16558 do_facet ost1 $LCTL set_param fail_loc=0x31c
16560 # ignore dd failure
16561 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16563 do_facet ost1 $LCTL set_param fail_loc=0
16564 umount_client $MOUNT || error "umount failed"
16565 mount_client $MOUNT || error "mount failed"
16566 stop ost1 || error "cannot stop ost1"
16567 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16569 run_test 232a "failed lock should not block umount"
16572 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16573 skip "Need MDS version at least 2.10.58"
16575 mkdir -p $DIR/$tdir
16576 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16577 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16579 cancel_lru_locks osc
16581 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16582 do_facet ost1 $LCTL set_param fail_loc=0x31c
16585 $LFS data_version $DIR/$tdir/$tfile || true
16587 do_facet ost1 $LCTL set_param fail_loc=0
16588 umount_client $MOUNT || error "umount failed"
16589 mount_client $MOUNT || error "mount failed"
16590 stop ost1 || error "cannot stop ost1"
16591 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16593 run_test 232b "failed data version lock should not block umount"
16596 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
16597 skip "Need MDS version at least 2.3.64"
16598 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16600 local fid=$($LFS path2fid $MOUNT)
16602 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16603 error "cannot access $MOUNT using its FID '$fid'"
16605 run_test 233a "checking that OBF of the FS root succeeds"
16608 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
16609 skip "Need MDS version at least 2.5.90"
16610 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16612 local fid=$($LFS path2fid $MOUNT/.lustre)
16614 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16615 error "cannot access $MOUNT/.lustre using its FID '$fid'"
16617 fid=$($LFS path2fid $MOUNT/.lustre/fid)
16618 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16619 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
16621 run_test 233b "checking that OBF of the FS .lustre succeeds"
16624 local p="$TMP/sanityN-$TESTNAME.parameters"
16625 save_lustre_params client "llite.*.xattr_cache" > $p
16626 lctl set_param llite.*.xattr_cache 1 ||
16627 skip_env "xattr cache is not supported"
16629 mkdir -p $DIR/$tdir || error "mkdir failed"
16630 touch $DIR/$tdir/$tfile || error "touch failed"
16631 # OBD_FAIL_LLITE_XATTR_ENOMEM
16632 $LCTL set_param fail_loc=0x1405
16633 getfattr -n user.attr $DIR/$tdir/$tfile &&
16634 error "getfattr should have failed with ENOMEM"
16635 $LCTL set_param fail_loc=0x0
16638 restore_lustre_params < $p
16641 run_test 234 "xattr cache should not crash on ENOMEM"
16644 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
16645 skip "Need MDS version at least 2.4.52"
16647 flock_deadlock $DIR/$tfile
16652 124) error "process hangs on a deadlock"
16654 *) error "error executing flock_deadlock $DIR/$tfile"
16658 run_test 235 "LU-1715: flock deadlock detection does not work properly"
16662 check_swap_layouts_support
16664 local ref1=/etc/passwd
16665 local ref2=/etc/group
16666 local file1=$DIR/$tdir/f1
16667 local file2=$DIR/$tdir/f2
16669 test_mkdir -c1 $DIR/$tdir
16670 $LFS setstripe -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
16671 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
16672 $LFS setstripe -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
16673 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
16674 local fd=$(free_fd)
16675 local cmd="exec $fd<>$file2"
16678 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
16679 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
16682 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
16687 run_test 236 "Layout swap on open unlinked file"
16689 # LU-4659 linkea consistency
16691 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
16692 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
16693 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
16694 skip "Need MDS version at least 2.5.58 or 2.5.2+"
16697 ln $DIR/$tfile $DIR/$tfile.lnk
16698 touch $DIR/$tfile.new
16699 mv $DIR/$tfile.new $DIR/$tfile
16700 local fid1=$($LFS path2fid $DIR/$tfile)
16701 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
16702 local path1=$($LFS fid2path $FSNAME "$fid1")
16703 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
16704 local path2=$($LFS fid2path $FSNAME "$fid2")
16705 [ $tfile.lnk == $path2 ] ||
16706 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
16709 run_test 238 "Verify linkea consistency"
16711 test_239A() { # was test_239
16712 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
16713 skip "Need MDS version at least 2.5.60"
16715 local list=$(comma_list $(mdts_nodes))
16717 mkdir -p $DIR/$tdir
16718 createmany -o $DIR/$tdir/f- 5000
16719 unlinkmany $DIR/$tdir/f- 5000
16720 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
16721 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
16722 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
16723 osp.*MDT*.sync_in_flight" | calc_sum)
16724 [ "$changes" -eq 0 ] || error "$changes not synced"
16726 run_test 239A "osp_sync test"
16728 test_239a() { #LU-5297
16729 remote_mds_nodsh && skip "remote MDS with nodsh"
16732 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
16733 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
16734 chgrp $RUNAS_GID $DIR/$tfile
16735 wait_delete_completed
16737 run_test 239a "process invalid osp sync record correctly"
16739 test_239b() { #LU-5297
16740 remote_mds_nodsh && skip "remote MDS with nodsh"
16743 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
16744 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
16745 chgrp $RUNAS_GID $DIR/$tfile1
16746 wait_delete_completed
16747 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
16749 chgrp $RUNAS_GID $DIR/$tfile2
16750 wait_delete_completed
16752 run_test 239b "process osp sync record with ENOMEM error correctly"
16755 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16756 remote_mds_nodsh && skip "remote MDS with nodsh"
16758 mkdir -p $DIR/$tdir
16760 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
16761 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
16762 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
16763 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
16765 umount_client $MOUNT || error "umount failed"
16766 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
16767 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
16768 mount_client $MOUNT || error "failed to mount client"
16770 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
16771 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
16773 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
16779 for LOOP in $(seq $count); do
16780 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
16781 cancel_lru_locks $OSC || true
16789 for LOOP in $(seq $1); do
16790 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
16795 test_241a() { # was test_241
16796 local bsize=$PAGE_SIZE
16798 (( bsize < 40960 )) && bsize=40960
16799 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16801 cancel_lru_locks $OSC
16802 test_241_bio 1000 $bsize &
16804 test_241_dio 1000 $bsize
16807 run_test 241a "bio vs dio"
16810 local bsize=$PAGE_SIZE
16812 (( bsize < 40960 )) && bsize=40960
16813 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16815 test_241_dio 1000 $bsize &
16817 test_241_dio 1000 $bsize
16820 run_test 241b "dio vs dio"
16823 remote_mds_nodsh && skip "remote MDS with nodsh"
16825 mkdir -p $DIR/$tdir
16826 touch $DIR/$tdir/$tfile
16828 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
16829 do_facet mds1 lctl set_param fail_loc=0x105
16830 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
16832 do_facet mds1 lctl set_param fail_loc=0
16833 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
16835 run_test 242 "mdt_readpage failure should not cause directory unreadable"
16839 test_mkdir $DIR/$tdir
16840 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
16842 run_test 243 "various group lock tests"
16846 test_mkdir $DIR/$tdir
16847 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
16848 sendfile_grouplock $DIR/$tdir/$tfile || \
16849 error "sendfile+grouplock failed"
16852 run_test 244a "sendfile with group lock tests"
16856 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
16859 local size=$((1024*1024))
16861 test_mkdir $DIR/$tdir
16862 for i in $(seq 1 $threads); do
16863 local file=$DIR/$tdir/file_$((i / 10))
16864 $MULTIOP $file OG1234w$size_$((i % 3))w$size_$((i % 4))g1234c &
16867 for i in $(seq 1 $threads); do
16871 run_test 244b "multi-threaded write with group lock"
16874 local flagname="multi_mod_rpcs"
16875 local connect_data_name="max_mod_rpcs"
16878 # check if multiple modify RPCs flag is set
16879 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
16880 grep "connect_flags:")
16883 echo "$out" | grep -qw $flagname
16884 if [ $? -ne 0 ]; then
16885 echo "connect flag $flagname is not set"
16889 # check if multiple modify RPCs data is set
16890 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
16893 echo "$out" | grep -qw $connect_data_name ||
16894 error "import should have connect data $connect_data_name"
16896 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
16898 test_246() { # LU-7371
16899 remote_ost_nodsh && skip "remote OST with nodsh"
16900 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
16901 skip "Need OST version >= 2.7.62"
16903 do_facet ost1 $LCTL set_param fail_val=4095
16904 #define OBD_FAIL_OST_READ_SIZE 0x234
16905 do_facet ost1 $LCTL set_param fail_loc=0x234
16906 $LFS setstripe $DIR/$tfile -i 0 -c 1
16907 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
16908 cancel_lru_locks $FSNAME-OST0000
16909 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
16911 run_test 246 "Read file of size 4095 should return right length"
16917 umount_client $submount
16922 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16924 skip_env "Fileset feature is not supported"
16926 local submount=${MOUNT}_$tdir
16929 mkdir -p $submount || error "mkdir $submount failed"
16930 FILESET="$FILESET/$tdir" mount_client $submount ||
16931 error "mount $submount failed"
16932 trap "cleanup_247 $submount" EXIT
16933 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
16934 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
16935 error "read $MOUNT/$tdir/$tfile failed"
16936 cleanup_247 $submount
16938 run_test 247a "mount subdir as fileset"
16941 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16942 skip_env "Fileset feature is not supported"
16944 local submount=${MOUNT}_$tdir
16946 rm -rf $MOUNT/$tdir
16947 mkdir -p $submount || error "mkdir $submount failed"
16949 FILESET="$FILESET/$tdir" mount_client $submount &&
16950 error "mount $submount should fail"
16953 run_test 247b "mount subdir that dose not exist"
16956 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16957 skip_env "Fileset feature is not supported"
16959 local submount=${MOUNT}_$tdir
16961 mkdir -p $MOUNT/$tdir/dir1
16962 mkdir -p $submount || error "mkdir $submount failed"
16963 trap "cleanup_247 $submount" EXIT
16964 FILESET="$FILESET/$tdir" mount_client $submount ||
16965 error "mount $submount failed"
16966 local fid=$($LFS path2fid $MOUNT/)
16967 $LFS fid2path $submount $fid && error "fid2path should fail"
16968 cleanup_247 $submount
16970 run_test 247c "running fid2path outside root"
16973 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
16974 skip "Fileset feature is not supported"
16976 local submount=${MOUNT}_$tdir
16978 mkdir -p $MOUNT/$tdir/dir1
16979 mkdir -p $submount || error "mkdir $submount failed"
16980 FILESET="$FILESET/$tdir" mount_client $submount ||
16981 error "mount $submount failed"
16982 trap "cleanup_247 $submount" EXIT
16983 local fid=$($LFS path2fid $submount/dir1)
16984 $LFS fid2path $submount $fid || error "fid2path should succeed"
16985 cleanup_247 $submount
16987 run_test 247d "running fid2path inside root"
16991 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
16993 skip "Fileset feature is not supported"
16995 local submount=${MOUNT}_$tdir
16998 mkdir -p $submount || error "mkdir $submount failed"
16999 FILESET="$FILESET/.." mount_client $submount &&
17000 error "mount $submount should fail"
17003 run_test 247e "mount .. as fileset"
17006 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
17007 [ -z "$fast_read_sav" ] && skip "no fast read support"
17009 # create a large file for fast read verification
17010 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
17012 # make sure the file is created correctly
17013 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
17014 { rm -f $DIR/$tfile; skip "file creation error"; }
17016 echo "Test 1: verify that fast read is 4 times faster on cache read"
17018 # small read with fast read enabled
17019 $LCTL set_param -n llite.*.fast_read=1
17020 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
17021 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17022 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17023 # small read with fast read disabled
17024 $LCTL set_param -n llite.*.fast_read=0
17025 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
17026 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17027 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17029 # verify that fast read is 4 times faster for cache read
17030 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
17031 error_not_in_vm "fast read was not 4 times faster: " \
17032 "$t_fast vs $t_slow"
17034 echo "Test 2: verify the performance between big and small read"
17035 $LCTL set_param -n llite.*.fast_read=1
17037 # 1k non-cache read
17038 cancel_lru_locks osc
17039 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17040 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17041 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17043 # 1M non-cache read
17044 cancel_lru_locks osc
17045 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17046 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17047 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17049 # verify that big IO is not 4 times faster than small IO
17050 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
17051 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
17053 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
17056 run_test 248 "fast read verification"
17058 test_249() { # LU-7890
17059 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
17060 skip "Need at least version 2.8.54"
17063 $LFS setstripe -c 1 $DIR/$tfile
17064 # Offset 2T == 4k * 512M
17065 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
17066 error "dd to 2T offset failed"
17068 run_test 249 "Write above 2T file size"
17071 [ "$(facet_fstype ost$(($($LFS getstripe -i $DIR/$tfile) + 1)))" = "zfs" ] \
17072 && skip "no 16TB file size limit on ZFS"
17074 $LFS setstripe -c 1 $DIR/$tfile
17075 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
17076 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
17077 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
17078 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
17079 conv=notrunc,fsync && error "append succeeded"
17082 run_test 250 "Write above 16T limit"
17085 $LFS setstripe -c -1 -S 1048576 $DIR/$tfile
17087 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
17088 #Skip once - writing the first stripe will succeed
17089 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17090 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
17091 error "short write happened"
17093 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17094 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
17095 error "short read happened"
17099 run_test 251 "Handling short read and write correctly"
17102 remote_mds_nodsh && skip "remote MDS with nodsh"
17103 remote_ost_nodsh && skip "remote OST with nodsh"
17104 if [ "$ost1_FSTYPE" != ldiskfs ] || [ "$mds1_FSTYPE" != ldiskfs ]; then
17105 skip_env "ldiskfs only test"
17115 # check lr_reader on OST0000
17117 dev=$(facet_device $tgt)
17118 out=$(do_facet $tgt $LR_READER $dev)
17119 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17121 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
17122 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
17123 error "Invalid uuid returned by $LR_READER on target $tgt"
17124 echo -e "uuid returned by $LR_READER is '$uuid'\n"
17126 # check lr_reader -c on MDT0000
17128 dev=$(facet_device $tgt)
17129 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
17130 skip "$LR_READER does not support additional options"
17132 out=$(do_facet $tgt $LR_READER -c $dev)
17133 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17135 num=$(echo "$out" | grep -c "mdtlov")
17136 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
17137 error "Invalid number of mdtlov clients returned by $LR_READER"
17138 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
17140 # check lr_reader -cr on MDT0000
17141 out=$(do_facet $tgt $LR_READER -cr $dev)
17142 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17144 echo "$out" | grep -q "^reply_data:$" ||
17145 error "$LR_READER should have returned 'reply_data' section"
17146 num=$(echo "$out" | grep -c "client_generation")
17147 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
17149 run_test 252 "check lr_reader tool"
17152 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17153 remote_mds_nodsh && skip "remote MDS with nodsh"
17154 remote_mgs_nodsh && skip "remote MGS with nodsh"
17158 local ost_name=$(ostname_from_index $ostidx)
17161 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
17162 do_facet $SINGLEMDS $LCTL get_param -n \
17163 osp.$mdtosc_proc1.reserved_mb_high ||
17164 skip "remote MDS does not support reserved_mb_high"
17168 wait_delete_completed
17171 if ! combined_mgs_mds ; then
17174 pool_add $TESTNAME || error "Pool creation failed"
17175 pool_add_targets $TESTNAME 0 || error "Pool add targets failed"
17177 $LFS setstripe $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
17178 error "Setstripe failed"
17180 dd if=/dev/zero of=$DIR/$tdir/$tfile.0 bs=1M count=10
17182 local wms=$(ost_watermarks_set_enospc $tfile $ostidx |
17184 stack_trap "ost_watermarks_clear_enospc $tfile $ostidx $wms" EXIT
17186 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17187 osp.$mdtosc_proc1.prealloc_status)
17188 echo "prealloc_status $oa_status"
17190 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1M count=1 &&
17191 error "File creation should fail"
17193 #object allocation was stopped, but we still able to append files
17194 dd if=/dev/zero of=$DIR/$tdir/$tfile.0 bs=1M seek=6 count=5 \
17195 oflag=append || error "Append failed"
17197 rm -f $DIR/$tdir/$tfile.0
17199 # For this test, we want to delete the files we created to go out of
17200 # space but leave the watermark, so we remain nearly out of space
17201 ost_watermarks_enospc_delete_files $tfile $ostidx
17203 wait_delete_completed
17207 for i in $(seq 10 12); do
17208 dd if=/dev/zero of=$DIR/$tdir/$tfile.$i bs=1M count=1 \
17209 2>/dev/null || error "File creation failed after rm"
17212 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17213 osp.$mdtosc_proc1.prealloc_status)
17214 echo "prealloc_status $oa_status"
17216 if (( oa_status != 0 )); then
17217 error "Object allocation still disable after rm"
17220 if ! combined_mgs_mds ; then
17224 run_test 253 "Check object allocation limit"
17227 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17228 remote_mds_nodsh && skip "remote MDS with nodsh"
17229 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
17230 skip "MDS does not support changelog_size"
17233 local MDT0=$(facet_svc $SINGLEMDS)
17235 changelog_register || error "changelog_register failed"
17237 changelog_clear 0 || error "changelog_clear failed"
17239 local size1=$(do_facet $SINGLEMDS \
17240 $LCTL get_param -n mdd.$MDT0.changelog_size)
17241 echo "Changelog size $size1"
17244 $LFS mkdir -i 0 $DIR/$tdir
17246 mkdir -p $DIR/$tdir/pics/2008/zachy
17247 touch $DIR/$tdir/pics/2008/zachy/timestamp
17248 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
17249 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
17250 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
17251 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
17252 rm $DIR/$tdir/pics/desktop.jpg
17254 local size2=$(do_facet $SINGLEMDS \
17255 $LCTL get_param -n mdd.$MDT0.changelog_size)
17256 echo "Changelog size after work $size2"
17258 (( $size2 > $size1 )) ||
17259 error "new Changelog size=$size2 less than old size=$size1"
17261 run_test 254 "Check changelog size"
17268 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
17269 awk -F: '{print $2}' | grep $type > /dev/null
17270 if [ $? -ne 0 ]; then
17280 lfs ladvise -a willread $file > /dev/null 2>&1
17281 if [ $? -eq 0 ]; then
17285 lfs ladvise -a willread $file 2>&1 |
17286 grep "Inappropriate ioctl for device" > /dev/null
17287 if [ $? -eq 0 ]; then
17294 bc <<<"scale=2; ($1 - $2) * 100 / $2"
17297 # run a random read IO workload
17298 # usage: random_read_iops <filename> <filesize> <iosize>
17299 random_read_iops() {
17302 local iosize=${3:-4096}
17304 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
17305 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
17308 drop_file_oss_cache() {
17312 $LFS ladvise -a dontneed $file 2>/dev/null ||
17313 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
17316 ladvise_willread_performance()
17319 local average_origin=0
17320 local average_cache=0
17321 local average_ladvise=0
17323 for ((i = 1; i <= $repeat; i++)); do
17324 echo "Iter $i/$repeat: reading without willread hint"
17325 cancel_lru_locks osc
17326 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17327 local speed_origin=$(random_read_iops $DIR/$tfile $size)
17328 echo "Iter $i/$repeat: uncached speed: $speed_origin"
17329 average_origin=$(bc <<<"$average_origin + $speed_origin")
17331 cancel_lru_locks osc
17332 local speed_cache=$(random_read_iops $DIR/$tfile $size)
17333 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
17334 average_cache=$(bc <<<"$average_cache + $speed_cache")
17336 cancel_lru_locks osc
17337 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17338 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
17339 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
17340 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
17341 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
17343 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
17344 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
17345 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
17347 speedup_cache=$(percent $average_cache $average_origin)
17348 speedup_ladvise=$(percent $average_ladvise $average_origin)
17350 echo "Average uncached read: $average_origin"
17351 echo "Average speedup with OSS cached read: " \
17352 "$average_cache = +$speedup_cache%"
17353 echo "Average speedup with ladvise willread: " \
17354 "$average_ladvise = +$speedup_ladvise%"
17356 local lowest_speedup=20
17357 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
17358 echo "Speedup with OSS cached read less than $lowest_speedup%," \
17359 "got $average_cache%. Skipping ladvise willread check."
17363 # the test won't work on ZFS until it supports 'ladvise dontneed', but
17364 # it is still good to run until then to exercise 'ladvise willread'
17365 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17366 [ "$ost1_FSTYPE" = "zfs" ] &&
17367 echo "osd-zfs does not support dontneed or drop_caches" &&
17370 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
17371 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
17372 error_not_in_vm "Speedup with willread is less than " \
17373 "$lowest_speedup%, got $average_ladvise%"
17377 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17378 skip "lustre < 2.8.54 does not support ladvise "
17379 remote_ost_nodsh && skip "remote OST with nodsh"
17381 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
17383 ladvise_no_type willread $DIR/$tfile &&
17384 skip "willread ladvise is not supported"
17386 ladvise_no_ioctl $DIR/$tfile &&
17387 skip "ladvise ioctl is not supported"
17390 local size=$((size_mb * 1048576))
17391 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17392 error "dd to $DIR/$tfile failed"
17394 lfs ladvise -a willread $DIR/$tfile ||
17395 error "Ladvise failed with no range argument"
17397 lfs ladvise -a willread -s 0 $DIR/$tfile ||
17398 error "Ladvise failed with no -l or -e argument"
17400 lfs ladvise -a willread -e 1 $DIR/$tfile ||
17401 error "Ladvise failed with only -e argument"
17403 lfs ladvise -a willread -l 1 $DIR/$tfile ||
17404 error "Ladvise failed with only -l argument"
17406 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
17407 error "End offset should not be smaller than start offset"
17409 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
17410 error "End offset should not be equal to start offset"
17412 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
17413 error "Ladvise failed with overflowing -s argument"
17415 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
17416 error "Ladvise failed with overflowing -e argument"
17418 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
17419 error "Ladvise failed with overflowing -l argument"
17421 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
17422 error "Ladvise succeeded with conflicting -l and -e arguments"
17424 echo "Synchronous ladvise should wait"
17426 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17427 do_nodes $(comma_list $(osts_nodes)) \
17428 $LCTL set_param fail_val=$delay fail_loc=0x237
17430 local start_ts=$SECONDS
17431 lfs ladvise -a willread $DIR/$tfile ||
17432 error "Ladvise failed with no range argument"
17433 local end_ts=$SECONDS
17434 local inteval_ts=$((end_ts - start_ts))
17436 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17437 error "Synchronous advice didn't wait reply"
17440 echo "Asynchronous ladvise shouldn't wait"
17441 local start_ts=$SECONDS
17442 lfs ladvise -a willread -b $DIR/$tfile ||
17443 error "Ladvise failed with no range argument"
17444 local end_ts=$SECONDS
17445 local inteval_ts=$((end_ts - start_ts))
17447 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17448 error "Asynchronous advice blocked"
17451 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17452 ladvise_willread_performance
17454 run_test 255a "check 'lfs ladvise -a willread'"
17460 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17464 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17465 skip "lustre < 2.8.54 does not support ladvise "
17466 remote_ost_nodsh && skip "remote OST with nodsh"
17468 lfs setstripe -c 1 -i 0 $DIR/$tfile
17470 ladvise_no_type dontneed $DIR/$tfile &&
17471 skip "dontneed ladvise is not supported"
17473 ladvise_no_ioctl $DIR/$tfile &&
17474 skip "ladvise ioctl is not supported"
17476 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17477 [ "$ost1_FSTYPE" = "zfs" ] &&
17478 skip "zfs-osd does not support 'ladvise dontneed'"
17481 local size=$((size_mb * 1048576))
17482 # In order to prevent disturbance of other processes, only check 3/4
17483 # of the memory usage
17484 local kibibytes=$((size_mb * 1024 * 3 / 4))
17486 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17487 error "dd to $DIR/$tfile failed"
17489 #force write to complete before dropping OST cache & checking memory
17492 local total=$(facet_meminfo ost1 MemTotal)
17493 echo "Total memory: $total KiB"
17495 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17496 local before_read=$(facet_meminfo ost1 Cached)
17497 echo "Cache used before read: $before_read KiB"
17499 lfs ladvise -a willread $DIR/$tfile ||
17500 error "Ladvise willread failed"
17501 local after_read=$(facet_meminfo ost1 Cached)
17502 echo "Cache used after read: $after_read KiB"
17504 lfs ladvise -a dontneed $DIR/$tfile ||
17505 error "Ladvise dontneed again failed"
17506 local no_read=$(facet_meminfo ost1 Cached)
17507 echo "Cache used after dontneed ladvise: $no_read KiB"
17509 if [ $total -lt $((before_read + kibibytes)) ]; then
17510 echo "Memory is too small, abort checking"
17514 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17515 error "Ladvise willread should use more memory" \
17516 "than $kibibytes KiB"
17519 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17520 error "Ladvise dontneed should release more memory" \
17521 "than $kibibytes KiB"
17524 run_test 255b "check 'lfs ladvise -a dontneed'"
17527 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17528 skip "lustre < 2.10.53 does not support lockahead"
17536 test_mkdir -p $DIR/$tdir
17537 $LFS setstripe -i 0 -c 1 $DIR/$tdir
17539 #test 10 returns only success/failure
17541 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17543 if [ $rc -eq 255 ]; then
17544 error "Ladvise test${i} failed, ${rc}"
17547 #test 11 counts lock enqueue requests, all others count new locks
17549 count=$(do_facet ost1 \
17550 $LCTL get_param -n ost.OSS.ost.stats)
17551 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17553 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17555 if [ $rc -eq 255 ]; then
17556 error "Ladvise test${i} failed, ${rc}"
17559 new_count=$(do_facet ost1 \
17560 $LCTL get_param -n ost.OSS.ost.stats)
17561 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17562 awk '{ print $2 }')
17564 difference="$((new_count - count))"
17565 if [ $difference -ne $rc ]; then
17566 error "Ladvise test${i}, bad enqueue count, returned " \
17567 "${rc}, actual ${difference}"
17570 for i in $(seq 12 21); do
17571 # If we do not do this, we run the risk of having too many
17572 # locks and starting lock cancellation while we are checking
17574 cancel_lru_locks osc
17576 count=$($LCTL get_param -n \
17577 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17579 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17581 if [ $rc -eq 255 ]; then
17582 error "Ladvise test ${i} failed, ${rc}"
17585 new_count=$($LCTL get_param -n \
17586 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17587 difference="$((new_count - count))"
17589 # Test 15 output is divided by 100 to map down to valid return
17590 if [ $i -eq 15 ]; then
17594 if [ $difference -ne $rc ]; then
17595 error "Ladvise test ${i}, bad lock count, returned " \
17596 "${rc}, actual ${difference}"
17600 #test 22 returns only success/failure
17602 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17604 if [ $rc -eq 255 ]; then
17605 error "Ladvise test${i} failed, ${rc}"
17608 run_test 255c "suite of ladvise lockahead tests"
17611 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17612 remote_mds_nodsh && skip "remote MDS with nodsh"
17613 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17614 changelog_users $SINGLEMDS | grep "^cl" &&
17615 skip "active changelog user"
17621 mdt_dev=$(mdsdevname 1)
17624 changelog_register || error "changelog_register failed"
17627 mkdir -p $DIR/$tdir
17629 changelog_clear 0 || error "changelog_clear failed"
17632 touch $DIR/$tdir/{1..10}
17635 stop $SINGLEMDS || error "Fail to stop MDT"
17639 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
17641 #after mount new plainllog is used
17642 touch $DIR/$tdir/{11..19}
17643 local tmpfile="$(mktemp --tmpdir -u $tfile.XXXXXX)"
17644 stack_trap "rm -f $tmpfile"
17645 cat_sl=$(do_facet $SINGLEMDS "sync; \
17646 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17647 llog_reader $tmpfile | grep -c type=1064553b")
17648 do_facet $SINGLEMDS llog_reader $tmpfile
17650 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
17652 changelog_clear 0 || error "changelog_clear failed"
17654 cat_sl=$(do_facet $SINGLEMDS "sync; \
17655 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17656 llog_reader $tmpfile | grep -c type=1064553b")
17658 if (( cat_sl == 2 )); then
17659 error "Empty plain llog was not deleted from changelog catalog"
17660 elif (( cat_sl != 1 )); then
17661 error "Active plain llog shouldn't be deleted from catalog"
17664 run_test 256 "Check llog delete for empty and not full state"
17667 remote_mds_nodsh && skip "remote MDS with nodsh"
17668 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
17669 skip "Need MDS version at least 2.8.55"
17671 test_mkdir $DIR/$tdir
17673 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
17674 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
17677 #define OBD_FAIL_MDS_XATTR_REP 0x161
17678 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17679 local facet=mds$((mdtidx + 1))
17680 set_nodes_failloc $(facet_active_host $facet) 0x80000161
17681 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
17683 stop $facet || error "stop MDS failed"
17684 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
17685 error "start MDS fail"
17686 wait_recovery_complete $facet
17688 run_test 257 "xattr locks are not lost"
17690 # Verify we take the i_mutex when security requires it
17692 #define OBD_FAIL_IMUTEX_SEC 0x141c
17693 $LCTL set_param fail_loc=0x141c
17695 chmod u+s $DIR/$tfile
17696 chmod a+rwx $DIR/$tfile
17697 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17699 if [ $RC -ne 0 ]; then
17700 error "error, failed to take i_mutex, rc=$?"
17704 run_test 258a "verify i_mutex security behavior when suid attributes is set"
17706 # Verify we do NOT take the i_mutex in the normal case
17708 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
17709 $LCTL set_param fail_loc=0x141d
17712 chmod a+rw $DIR/$tfile
17713 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17715 if [ $RC -ne 0 ]; then
17716 error "error, took i_mutex unnecessarily, rc=$?"
17721 run_test 258b "verify i_mutex security behavior"
17724 local file=$DIR/$tfile
17728 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17730 stack_trap "rm -f $file" EXIT
17732 wait_delete_completed
17733 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17734 echo "before: $before"
17736 $LFS setstripe -i 0 -c 1 $file
17737 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
17739 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17740 echo "after write: $after"
17742 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
17743 do_facet ost1 $LCTL set_param fail_loc=0x2301
17745 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17746 echo "after truncate: $after"
17749 do_facet ost1 $LCTL set_param fail_loc=0
17750 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
17752 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17753 echo "after restart: $after"
17754 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
17755 error "missing truncate?"
17759 run_test 259 "crash at delayed truncate"
17762 #define OBD_FAIL_MDC_CLOSE 0x806
17763 $LCTL set_param fail_loc=0x80000806
17767 run_test 260 "Check mdc_close fail"
17769 ### Data-on-MDT sanity tests ###
17771 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17772 skip "Need MDS version at least 2.10.55 for DoM"
17775 local dom=$DIR/$tdir/dom_file
17776 local tmp=$DIR/$tdir/tmp_file
17778 mkdir -p $DIR/$tdir
17780 # basic checks for DoM component creation
17781 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
17782 error "Can set MDT layout to non-first entry"
17784 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
17785 error "Can define multiple entries as MDT layout"
17787 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
17789 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
17790 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
17791 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
17793 local mdtidx=$($LFS getstripe -m $dom)
17794 local mdtname=MDT$(printf %04x $mdtidx)
17795 local facet=mds$((mdtidx + 1))
17796 local space_check=1
17798 # Skip free space checks with ZFS
17799 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
17803 local size_tmp=$((65536 * 3))
17804 local mdtfree1=$(do_facet $facet \
17805 lctl get_param -n osd*.*$mdtname.kbytesfree)
17807 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17808 # check also direct IO along write
17809 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
17810 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17812 cmp $tmp $dom || error "file data is different"
17813 [ $(stat -c%s $dom) == $size_tmp ] ||
17814 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17815 if [ $space_check == 1 ]; then
17816 local mdtfree2=$(do_facet $facet \
17817 lctl get_param -n osd*.*$mdtname.kbytesfree)
17819 # increase in usage from by $size_tmp
17820 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17821 error "MDT free space wrong after write: " \
17822 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17826 local size_dom=10000
17828 $TRUNCATE $dom $size_dom
17829 [ $(stat -c%s $dom) == $size_dom ] ||
17830 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
17831 if [ $space_check == 1 ]; then
17832 mdtfree1=$(do_facet $facet \
17833 lctl get_param -n osd*.*$mdtname.kbytesfree)
17834 # decrease in usage from $size_tmp to new $size_dom
17835 [ $(($mdtfree1 - $mdtfree2)) -ge \
17836 $(((size_tmp - size_dom) / 1024)) ] ||
17837 error "MDT free space is wrong after truncate: " \
17838 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
17844 size_dom=$((size_dom + size_tmp))
17845 [ $(stat -c%s $dom) == $size_dom ] ||
17846 error "bad size after append: $(stat -c%s $dom) != $size_dom"
17847 if [ $space_check == 1 ]; then
17848 mdtfree2=$(do_facet $facet \
17849 lctl get_param -n osd*.*$mdtname.kbytesfree)
17850 # increase in usage by $size_tmp from previous
17851 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
17852 error "MDT free space is wrong after append: " \
17853 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
17858 if [ $space_check == 1 ]; then
17859 mdtfree1=$(do_facet $facet \
17860 lctl get_param -n osd*.*$mdtname.kbytesfree)
17861 # decrease in usage by $size_dom from previous
17862 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
17863 error "MDT free space is wrong after removal: " \
17864 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
17867 # combined striping
17868 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
17869 error "Can't create DoM + OST striping"
17871 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
17872 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
17873 # check also direct IO along write
17874 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
17876 cmp $tmp $dom || error "file data is different"
17877 [ $(stat -c%s $dom) == $size_tmp ] ||
17878 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
17883 run_test 270a "DoM: basic functionality tests"
17886 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17887 skip "Need MDS version at least 2.10.55"
17889 local dom=$DIR/$tdir/dom_file
17890 local max_size=1048576
17892 mkdir -p $DIR/$tdir
17893 $LFS setstripe -E $max_size -L mdt $dom
17895 # truncate over the limit
17896 $TRUNCATE $dom $(($max_size + 1)) &&
17897 error "successful truncate over the maximum size"
17898 # write over the limit
17899 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
17900 error "successful write over the maximum size"
17901 # append over the limit
17902 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
17903 echo "12345" >> $dom && error "successful append over the maximum size"
17908 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
17911 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17912 skip "Need MDS version at least 2.10.55"
17914 mkdir -p $DIR/$tdir
17915 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17917 # check files inherit DoM EA
17918 touch $DIR/$tdir/first
17919 [ $($LFS getstripe -L $DIR/$tdir/first) == "mdt" ] ||
17920 error "bad pattern"
17921 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
17922 error "bad stripe count"
17923 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
17924 error "bad stripe size"
17926 # check directory inherits DoM EA and uses it as default
17927 mkdir $DIR/$tdir/subdir
17928 touch $DIR/$tdir/subdir/second
17929 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
17930 error "bad pattern in sub-directory"
17931 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
17932 error "bad stripe count in sub-directory"
17933 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
17934 error "bad stripe size in sub-directory"
17937 run_test 270c "DoM: DoM EA inheritance tests"
17940 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17941 skip "Need MDS version at least 2.10.55"
17943 mkdir -p $DIR/$tdir
17944 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
17946 # inherit default DoM striping
17947 mkdir $DIR/$tdir/subdir
17948 touch $DIR/$tdir/subdir/f1
17950 # change default directory striping
17951 $LFS setstripe -c 1 $DIR/$tdir/subdir
17952 touch $DIR/$tdir/subdir/f2
17953 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
17954 error "wrong default striping in file 2"
17955 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
17956 error "bad pattern in file 2"
17959 run_test 270d "DoM: change striping from DoM to RAID0"
17962 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
17963 skip "Need MDS version at least 2.10.55"
17965 mkdir -p $DIR/$tdir/dom
17966 mkdir -p $DIR/$tdir/norm
17969 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
17970 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
17972 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
17973 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
17975 # find DoM files by layout
17976 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
17977 [ $NUM -eq $DOMFILES ] ||
17978 error "lfs find -L: found $NUM, expected $DOMFILES"
17979 echo "Test 1: lfs find 20 DOM files by layout: OK"
17981 # there should be 1 dir with default DOM striping
17982 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
17984 error "lfs find -L: found $NUM, expected 1 dir"
17985 echo "Test 2: lfs find 1 DOM dir by layout: OK"
17987 # find DoM files by stripe size
17988 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
17989 [ $NUM -eq $DOMFILES ] ||
17990 error "lfs find -S: found $NUM, expected $DOMFILES"
17991 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
17993 # find files by stripe offset except DoM files
17994 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
17995 [ $NUM -eq $NORMFILES ] ||
17996 error "lfs find -i: found $NUM, expected $NORMFILES"
17997 echo "Test 5: lfs find no DOM files by stripe index: OK"
18000 run_test 270e "DoM: lfs find with DoM files test"
18003 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18004 skip "Need MDS version at least 2.10.55"
18006 local mdtname=${FSNAME}-MDT0000-mdtlov
18007 local dom=$DIR/$tdir/dom_file
18008 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
18009 lod.$mdtname.dom_stripesize)
18010 local dom_limit=131072
18012 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
18013 local dom_current=$(do_facet mds1 $LCTL get_param -n \
18014 lod.$mdtname.dom_stripesize)
18015 [ ${dom_limit} -eq ${dom_current} ] ||
18016 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
18018 $LFS mkdir -i 0 -c 1 $DIR/$tdir
18019 $LFS setstripe -d $DIR/$tdir
18020 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
18021 error "Can't set directory default striping"
18023 # exceed maximum stripe size
18024 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18025 error "Can't create file with $((dom_limit * 2)) DoM stripe"
18026 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
18027 error "Able to create DoM component size more than LOD limit"
18029 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
18030 dom_current=$(do_facet mds1 $LCTL get_param -n \
18031 lod.$mdtname.dom_stripesize)
18032 [ 0 -eq ${dom_current} ] ||
18033 error "Can't set zero DoM stripe limit"
18036 # attempt to create DoM file on server with disabled DoM should
18037 # remove DoM entry from layout and be succeed
18038 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
18039 error "Can't create DoM file (DoM is disabled)"
18040 [ $($LFS getstripe -L $dom) == "mdt" ] &&
18041 error "File has DoM component while DoM is disabled"
18044 # attempt to create DoM file with only DoM stripe should return error
18045 $LFS setstripe -E $dom_limit -L mdt $dom &&
18046 error "Able to create DoM-only file while DoM is disabled"
18048 # too low values to be aligned with smallest stripe size 64K
18049 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
18050 dom_current=$(do_facet mds1 $LCTL get_param -n \
18051 lod.$mdtname.dom_stripesize)
18052 [ 30000 -eq ${dom_current} ] &&
18053 error "Can set too small DoM stripe limit"
18055 # 64K is a minimal stripe size in Lustre, expect limit of that size
18056 [ 65536 -eq ${dom_current} ] ||
18057 error "Limit is not set to 64K but ${dom_current}"
18059 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
18060 dom_current=$(do_facet mds1 $LCTL get_param -n \
18061 lod.$mdtname.dom_stripesize)
18063 [ 2147483648 -eq ${dom_current} ] &&
18064 error "Can set too large DoM stripe limit"
18066 do_facet mds1 $LCTL set_param -n \
18067 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
18068 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18069 error "Can't create DoM component size after limit change"
18070 do_facet mds1 $LCTL set_param -n \
18071 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
18072 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
18073 error "Can't create DoM file after limit decrease"
18074 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
18075 error "Can create big DoM component after limit decrease"
18076 touch ${dom}_def ||
18077 error "Can't create file with old default layout"
18079 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
18082 run_test 270f "DoM: maximum DoM stripe size checks"
18085 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18086 skip "Need MDS version at least 2.10.55"
18088 local dom=$DIR/$tdir/dom
18090 mkdir -p $DIR/$tdir
18092 $LFS setstripe -E 1024K -L mdt $dom
18094 lctl set_param -n mdc.*.stats=clear
18095 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18096 cat $dom > /dev/null
18097 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
18098 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
18102 run_test 271a "DoM: data is cached for read after write"
18105 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18106 skip "Need MDS version at least 2.10.55"
18108 local dom=$DIR/$tdir/dom
18110 mkdir -p $DIR/$tdir
18112 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18114 lctl set_param -n mdc.*.stats=clear
18115 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18116 cancel_lru_locks mdc
18117 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
18118 # second stat to check size is cached on client
18119 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
18120 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18121 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
18124 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
18127 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18128 skip "Need MDS version at least 2.10.55"
18130 local dom=$DIR/$tdir/dom
18132 mkdir -p $DIR/$tdir
18134 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18136 lctl set_param -n mdc.*.stats=clear
18137 lctl set_param -n osc.*.stats=clear
18138 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
18139 cancel_lru_locks mdc
18140 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18141 # second stat to check size is cached on client
18142 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18143 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18144 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
18145 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
18146 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
18149 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
18155 local mdt=MDT$(printf %04x $mdtidx)
18157 if [ -z $param ]; then
18158 lctl get_param -n mdc.*$mdt*.stats
18160 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
18165 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18166 skip "Need MDS version at least 2.10.55"
18168 local dom=$DIR/$tdir/dom
18170 mkdir -p $DIR/$tdir
18172 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18174 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18175 local facet=mds$((mdtidx + 1))
18177 cancel_lru_locks mdc
18178 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
18179 createmany -o $dom 1000
18180 lctl set_param -n mdc.*.stats=clear
18181 smalliomany -w $dom 1000 200
18182 get_mdc_stats $mdtidx
18183 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18184 # Each file has 1 open, 1 IO enqueues, total 2000
18185 # but now we have also +1 getxattr for security.capability, total 3000
18186 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
18187 unlinkmany $dom 1000
18189 cancel_lru_locks mdc
18190 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
18191 createmany -o $dom 1000
18192 lctl set_param -n mdc.*.stats=clear
18193 smalliomany -w $dom 1000 200
18194 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18195 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
18196 # for OPEN and IO lock.
18197 [ $((enq - enq_2)) -ge 1000 ] ||
18198 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
18199 unlinkmany $dom 1000
18202 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
18204 cleanup_271def_tests() {
18210 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18211 skip "Need MDS version at least 2.10.57"
18213 local dom=$DIR/$tdir/dom
18214 local tmp=$TMP/$tfile
18215 trap "cleanup_271def_tests $tmp" EXIT
18217 mkdir -p $DIR/$tdir
18219 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18221 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18223 cancel_lru_locks mdc
18224 dd if=/dev/urandom of=$tmp bs=1000 count=1
18225 dd if=$tmp of=$dom bs=1000 count=1
18226 cancel_lru_locks mdc
18228 cat /etc/hosts >> $tmp
18229 lctl set_param -n mdc.*.stats=clear
18231 # append data to the same file it should update local page
18232 echo "Append to the same page"
18233 cat /etc/hosts >> $dom
18234 local num=$(get_mdc_stats $mdtidx ost_read)
18235 local ra=$(get_mdc_stats $mdtidx req_active)
18236 local rw=$(get_mdc_stats $mdtidx req_waittime)
18238 [ -z $num ] || error "$num READ RPC occured"
18239 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18243 cmp $tmp $dom || error "file miscompare"
18245 cancel_lru_locks mdc
18246 lctl set_param -n mdc.*.stats=clear
18248 echo "Open and read file"
18249 cat $dom > /dev/null
18250 local num=$(get_mdc_stats $mdtidx ost_read)
18251 local ra=$(get_mdc_stats $mdtidx req_active)
18252 local rw=$(get_mdc_stats $mdtidx req_waittime)
18254 [ -z $num ] || error "$num READ RPC occured"
18255 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18259 cmp $tmp $dom || error "file miscompare"
18263 run_test 271d "DoM: read on open (1K file in reply buffer)"
18266 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18267 skip "Need MDS version at least 2.10.57"
18269 local dom=$DIR/$tdir/dom
18270 local tmp=$TMP/$tfile
18271 trap "cleanup_271def_tests $tmp" EXIT
18273 mkdir -p $DIR/$tdir
18275 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18277 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18279 cancel_lru_locks mdc
18280 dd if=/dev/urandom of=$tmp bs=200000 count=1
18281 dd if=$tmp of=$dom bs=200000 count=1
18282 cancel_lru_locks mdc
18283 cat /etc/hosts >> $tmp
18284 lctl set_param -n mdc.*.stats=clear
18286 echo "Append to the same page"
18287 cat /etc/hosts >> $dom
18288 local num=$(get_mdc_stats $mdtidx ost_read)
18289 local ra=$(get_mdc_stats $mdtidx req_active)
18290 local rw=$(get_mdc_stats $mdtidx req_waittime)
18292 [ -z $num ] || error "$num READ RPC occured"
18293 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18297 cmp $tmp $dom || error "file miscompare"
18299 cancel_lru_locks mdc
18300 lctl set_param -n mdc.*.stats=clear
18302 echo "Open and read file"
18303 cat $dom > /dev/null
18304 local num=$(get_mdc_stats $mdtidx ost_read)
18305 local ra=$(get_mdc_stats $mdtidx req_active)
18306 local rw=$(get_mdc_stats $mdtidx req_waittime)
18308 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
18309 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18313 cmp $tmp $dom || error "file miscompare"
18317 run_test 271f "DoM: read on open (200K file and read tail)"
18320 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
18321 skip "Skipping due to old client or server version"
18323 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
18325 $CHECKSTAT -t file $DIR1/$tfile
18327 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
18330 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
18331 $LCTL set_param fail_loc=0x80000314
18332 rm $DIR1/$tfile || error "Unlink fails"
18334 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
18335 [ $RC -eq 0 ] || error "Failed write to stale object"
18337 run_test 271g "Discard DoM data vs client flush race"
18340 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18341 skip "Need MDS version at least 2.11.50"
18343 local dom=$DIR/$tdir/dom
18344 mkdir -p $DIR/$tdir
18346 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
18347 dd if=/dev/urandom of=$dom bs=512K count=1 ||
18348 error "failed to write data into $dom"
18349 local old_md5=$(md5sum $dom)
18351 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
18352 error "failed to migrate to the same DoM component"
18354 local new_md5=$(md5sum $dom)
18356 [ "$old_md5" == "$new_md5" ] ||
18357 error "md5sum differ: $old_md5, $new_md5"
18359 [ $($LFS getstripe -c $dom) -eq 2 ] ||
18360 error "migrate stripe count bad: $(LFS getstripe -c $dom) != 2"
18362 run_test 272a "DoM migration: new layout with the same DOM component"
18365 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18366 skip "Need MDS version at least 2.11.50"
18368 local dom=$DIR/$tdir/dom
18369 mkdir -p $DIR/$tdir
18370 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18372 local mdtidx=$($LFS getstripe -m $dom)
18373 local mdtname=MDT$(printf %04x $mdtidx)
18374 local facet=mds$((mdtidx + 1))
18376 local mdtfree1=$(do_facet $facet \
18377 lctl get_param -n osd*.*$mdtname.kbytesfree)
18378 dd if=/dev/urandom of=$dom bs=2M count=1 ||
18379 error "failed to write data into $dom"
18380 local old_md5=$(md5sum $dom)
18381 cancel_lru_locks mdc
18382 local mdtfree1=$(do_facet $facet \
18383 lctl get_param -n osd*.*$mdtname.kbytesfree)
18385 $LFS migrate -c2 $dom ||
18386 error "failed to migrate to the new composite layout"
18387 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18388 error "MDT stripe was not removed"
18390 cancel_lru_locks mdc
18391 local new_md5=$(md5sum $dom)
18392 [ "$old_md5" != "$new_md5" ] &&
18393 error "$old_md5 != $new_md5"
18395 # Skip free space checks with ZFS
18396 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18397 local mdtfree2=$(do_facet $facet \
18398 lctl get_param -n osd*.*$mdtname.kbytesfree)
18399 [ $mdtfree2 -gt $mdtfree1 ] ||
18400 error "MDT space is not freed after migration"
18404 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
18407 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18408 skip "Need MDS version at least 2.11.50"
18410 local dom=$DIR/$tdir/$tfile
18411 mkdir -p $DIR/$tdir
18412 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18414 local mdtidx=$($LFS getstripe -m $dom)
18415 local mdtname=MDT$(printf %04x $mdtidx)
18416 local facet=mds$((mdtidx + 1))
18418 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18419 error "failed to write data into $dom"
18420 local old_md5=$(md5sum $dom)
18421 cancel_lru_locks mdc
18422 local mdtfree1=$(do_facet $facet \
18423 lctl get_param -n osd*.*$mdtname.kbytesfree)
18425 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18426 error "failed to migrate to the new composite layout"
18427 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18428 error "MDT stripe was not removed"
18430 cancel_lru_locks mdc
18431 local new_md5=$(md5sum $dom)
18432 [ "$old_md5" != "$new_md5" ] &&
18433 error "$old_md5 != $new_md5"
18435 # Skip free space checks with ZFS
18436 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18437 local mdtfree2=$(do_facet $facet \
18438 lctl get_param -n osd*.*$mdtname.kbytesfree)
18439 [ $mdtfree2 -gt $mdtfree1 ] ||
18440 error "MDS space is not freed after migration"
18444 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18447 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18448 skip "Need MDS version at least 2.11.50"
18450 # Layout swap cannot be done if either file has DOM component,
18451 # this will never be supported, migration should be used instead
18453 local dom=$DIR/$tdir/$tfile
18454 mkdir -p $DIR/$tdir
18456 $LFS setstripe -c2 ${dom}_plain
18457 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18458 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18459 error "can swap layout with DoM component"
18460 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18461 error "can swap layout with DoM component"
18463 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18464 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18465 error "can swap layout with DoM component"
18466 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18467 error "can swap layout with DoM component"
18470 run_test 273a "DoM: layout swapping should fail with DOM"
18473 remote_ost_nodsh && skip "remote OST with nodsh"
18474 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18475 skip "Need OST version >= 2.10.57"
18477 local file=$DIR/$tfile
18480 oss=$(comma_list $(osts_nodes))
18482 dd if=/dev/urandom of=$file bs=1M count=2 ||
18483 error "failed to create a file"
18484 cancel_lru_locks osc
18487 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18488 error "failed to read a file"
18490 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
18491 $LCTL set_param fail_loc=0x8000031f
18493 cancel_lru_locks osc &
18496 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
18497 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
18498 #IO takes another lock, but matches the PENDING one
18499 #and places it to the IO RPC
18500 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18501 error "failed to read a file with PENDING lock"
18503 run_test 275 "Read on a canceled duplicate lock"
18506 remote_ost_nodsh && skip "remote OST with nodsh"
18509 do_facet ost1 "(while true; do \
18510 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
18511 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
18514 for LOOP in $(seq 20); do
18516 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
18519 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
18520 rm $TMP/sanity_276_pid"
18522 run_test 276 "Race between mount and obd_statfs"
18525 $LCTL set_param ldlm.namespaces.*.lru_size=0
18526 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
18527 local cached_mb=$($LCTL get_param llite.*.max_cached_mb |
18528 grep ^used_mb | awk '{print $2}')
18529 [ $cached_mb -eq 1 ] || error "expected mb 1 got $cached_mb"
18530 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 \
18531 oflag=direct conv=notrunc
18532 cached_mb=$($LCTL get_param llite.*.max_cached_mb |
18533 grep ^used_mb | awk '{print $2}')
18534 [ $cached_mb -eq 0 ] || error "expected mb 0 got $cached_mb"
18536 run_test 277 "Direct IO shall drop page cache"
18539 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
18540 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
18541 [[ "$(facet_host mds1)" != "$(facet_host mds2)" ]] &&
18542 skip "needs the same host for mdt1 mdt2" && return
18547 #define OBD_FAIL_OBD_STOP_MDS_RACE 0x60b
18548 do_facet mds2 $LCTL set_param fail_loc=0x8000060c
18554 echo "Starting MDTs"
18555 start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
18557 #For the error assertion will happen. lu_env_get_key(..., &mdt_thread_key)
18559 do_facet mds2 $LCTL set_param fail_loc=0
18561 start mds2 $(mdsdevname 2) $MDS_MOUNT_OPTS
18563 run_test 278 "Race starting MDS between MDTs stop/start"
18565 cleanup_test_300() {
18569 test_striped_dir() {
18574 mkdir -p $DIR/$tdir
18576 SAVE_UMASK=$(umask)
18577 trap cleanup_test_300 RETURN EXIT
18579 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
18580 $DIR/$tdir/striped_dir ||
18581 error "set striped dir error"
18583 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
18584 [ "$mode" = "755" ] || error "expect 755 got $mode"
18586 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
18587 error "getdirstripe failed"
18588 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
18589 if [ "$stripe_count" != "2" ]; then
18590 error "1:stripe_count is $stripe_count, expect 2"
18592 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
18593 if [ "$stripe_count" != "2" ]; then
18594 error "2:stripe_count is $stripe_count, expect 2"
18597 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
18598 if [ "$stripe_index" != "$mdt_index" ]; then
18599 error "stripe_index is $stripe_index, expect $mdt_index"
18602 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18603 error "nlink error after create striped dir"
18605 mkdir $DIR/$tdir/striped_dir/a
18606 mkdir $DIR/$tdir/striped_dir/b
18608 stat $DIR/$tdir/striped_dir/a ||
18609 error "create dir under striped dir failed"
18610 stat $DIR/$tdir/striped_dir/b ||
18611 error "create dir under striped dir failed"
18613 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
18614 error "nlink error after mkdir"
18616 rmdir $DIR/$tdir/striped_dir/a
18617 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
18618 error "nlink error after rmdir"
18620 rmdir $DIR/$tdir/striped_dir/b
18621 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18622 error "nlink error after rmdir"
18624 chattr +i $DIR/$tdir/striped_dir
18625 createmany -o $DIR/$tdir/striped_dir/f 10 &&
18626 error "immutable flags not working under striped dir!"
18627 chattr -i $DIR/$tdir/striped_dir
18629 rmdir $DIR/$tdir/striped_dir ||
18630 error "rmdir striped dir error"
18638 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18639 skip "skipped for lustre < 2.7.0"
18640 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18641 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18643 test_striped_dir 0 || error "failed on striped dir on MDT0"
18644 test_striped_dir 1 || error "failed on striped dir on MDT0"
18646 run_test 300a "basic striped dir sanity test"
18649 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18650 skip "skipped for lustre < 2.7.0"
18651 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18652 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18659 test_mkdir $DIR/$tdir || error "mkdir fail"
18660 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18661 error "set striped dir error"
18662 for i in {0..9}; do
18663 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
18665 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
18666 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
18667 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
18669 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
18670 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
18671 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
18675 run_test 300b "check ctime/mtime for striped dir"
18678 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18679 skip "skipped for lustre < 2.7.0"
18680 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18681 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18685 mkdir -p $DIR/$tdir
18686 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
18687 error "set striped dir error"
18689 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
18690 error "chown striped dir failed"
18692 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
18693 error "create 5k files failed"
18695 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
18697 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
18701 run_test 300c "chown && check ls under striped directory"
18704 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18705 skip "skipped for lustre < 2.7.0"
18706 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18707 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18712 mkdir -p $DIR/$tdir
18713 $LFS setstripe -c 2 $DIR/$tdir
18715 #local striped directory
18716 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18717 error "set striped dir error"
18718 createmany -o $DIR/$tdir/striped_dir/f 10 ||
18719 error "create 10 files failed"
18721 #remote striped directory
18722 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
18723 error "set striped dir error"
18724 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
18725 error "create 10 files failed"
18727 for file in $(find $DIR/$tdir); do
18728 stripe_count=$($LFS getstripe -c $file)
18729 [ $stripe_count -eq 2 ] ||
18730 error "wrong stripe $stripe_count for $file"
18735 run_test 300d "check default stripe under striped directory"
18738 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18739 skip "Need MDS version at least 2.7.55"
18740 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18741 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18746 mkdir -p $DIR/$tdir
18748 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18749 error "set striped dir error"
18751 touch $DIR/$tdir/striped_dir/a
18752 touch $DIR/$tdir/striped_dir/b
18753 touch $DIR/$tdir/striped_dir/c
18755 mkdir $DIR/$tdir/striped_dir/dir_a
18756 mkdir $DIR/$tdir/striped_dir/dir_b
18757 mkdir $DIR/$tdir/striped_dir/dir_c
18759 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
18760 error "set striped adir under striped dir error"
18762 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
18763 error "set striped bdir under striped dir error"
18765 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
18766 error "set striped cdir under striped dir error"
18768 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
18769 error "rename dir under striped dir fails"
18771 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
18772 error "rename dir under different stripes fails"
18774 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
18775 error "rename file under striped dir should succeed"
18777 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
18778 error "rename dir under striped dir should succeed"
18782 run_test 300e "check rename under striped directory"
18785 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18786 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18787 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18788 skip "Need MDS version at least 2.7.55"
18794 mkdir -p $DIR/$tdir
18796 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18797 error "set striped dir error"
18799 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
18800 error "set striped dir error"
18802 touch $DIR/$tdir/striped_dir/a
18803 mkdir $DIR/$tdir/striped_dir/dir_a
18804 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
18805 error "create striped dir under striped dir fails"
18807 touch $DIR/$tdir/striped_dir1/b
18808 mkdir $DIR/$tdir/striped_dir1/dir_b
18809 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
18810 error "create striped dir under striped dir fails"
18812 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
18813 error "rename dir under different striped dir should fail"
18815 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
18816 error "rename striped dir under diff striped dir should fail"
18818 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
18819 error "rename file under diff striped dirs fails"
18823 run_test 300f "check rename cross striped directory"
18825 test_300_check_default_striped_dir()
18828 local default_count=$2
18829 local default_index=$3
18832 local dir_stripe_index
18835 echo "checking $dirname $default_count $default_index"
18836 $LFS setdirstripe -D -c $default_count -i $default_index \
18837 -t all_char $DIR/$tdir/$dirname ||
18838 error "set default stripe on striped dir error"
18839 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
18840 [ $stripe_count -eq $default_count ] ||
18841 error "expect $default_count get $stripe_count for $dirname"
18843 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
18844 [ $stripe_index -eq $default_index ] ||
18845 error "expect $default_index get $stripe_index for $dirname"
18847 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
18848 error "create dirs failed"
18850 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
18851 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
18852 for dir in $(find $DIR/$tdir/$dirname/*); do
18853 stripe_count=$($LFS getdirstripe -c $dir)
18854 [ $stripe_count -eq $default_count ] ||
18855 [ $stripe_count -eq 0 ] || [ $default_count -eq 1 ] ||
18856 error "stripe count $default_count != $stripe_count for $dir"
18858 stripe_index=$($LFS getdirstripe -i $dir)
18859 [ $default_index -eq -1 ] ||
18860 [ $stripe_index -eq $default_index ] ||
18861 error "$stripe_index != $default_index for $dir"
18863 #check default stripe
18864 stripe_count=$($LFS getdirstripe -D -c $dir)
18865 [ $stripe_count -eq $default_count ] ||
18866 error "default count $default_count != $stripe_count for $dir"
18868 stripe_index=$($LFS getdirstripe -D -i $dir)
18869 [ $stripe_index -eq $default_index ] ||
18870 error "default index $default_index != $stripe_index for $dir"
18872 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
18876 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18877 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18878 skip "Need MDS version at least 2.7.55"
18885 mkdir $DIR/$tdir/normal_dir
18887 #Checking when client cache stripe index
18888 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
18889 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
18890 error "create striped_dir failed"
18892 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
18893 error "create dir0 fails"
18894 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
18895 [ $stripe_index -eq 0 ] ||
18896 error "dir0 expect index 0 got $stripe_index"
18898 mkdir $DIR/$tdir/striped_dir/dir1 ||
18899 error "create dir1 fails"
18900 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
18901 [ $stripe_index -eq 1 ] ||
18902 error "dir1 expect index 1 got $stripe_index"
18904 #check default stripe count/stripe index
18905 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
18906 test_300_check_default_striped_dir normal_dir 1 0
18907 test_300_check_default_striped_dir normal_dir 2 1
18908 test_300_check_default_striped_dir normal_dir 2 -1
18910 #delete default stripe information
18911 echo "delete default stripeEA"
18912 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
18913 error "set default stripe on striped dir error"
18915 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
18916 for dir in $(find $DIR/$tdir/normal_dir/*); do
18917 stripe_count=$($LFS getdirstripe -c $dir)
18918 [ $stripe_count -eq 0 ] ||
18919 error "expect 1 get $stripe_count for $dir"
18920 stripe_index=$($LFS getdirstripe -i $dir)
18921 [ $stripe_index -eq 0 ] ||
18922 error "expect 0 get $stripe_index for $dir"
18925 run_test 300g "check default striped directory for normal directory"
18928 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18929 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18930 skip "Need MDS version at least 2.7.55"
18936 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18937 error "set striped dir error"
18939 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
18940 test_300_check_default_striped_dir striped_dir 1 0
18941 test_300_check_default_striped_dir striped_dir 2 1
18942 test_300_check_default_striped_dir striped_dir 2 -1
18944 #delete default stripe information
18945 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
18946 error "set default stripe on striped dir error"
18948 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
18949 for dir in $(find $DIR/$tdir/striped_dir/*); do
18950 stripe_count=$($LFS getdirstripe -c $dir)
18951 [ $stripe_count -eq 0 ] ||
18952 error "expect 1 get $stripe_count for $dir"
18955 run_test 300h "check default striped directory for striped directory"
18958 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18959 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18960 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18961 skip "Need MDS version at least 2.7.55"
18968 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
18969 error "set striped dir error"
18971 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
18972 error "create files under striped dir failed"
18974 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
18975 error "set striped hashdir error"
18977 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
18978 error "create dir0 under hash dir failed"
18979 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
18980 error "create dir1 under hash dir failed"
18982 # unfortunately, we need to umount to clear dir layout cache for now
18983 # once we fully implement dir layout, we can drop this
18984 umount_client $MOUNT || error "umount failed"
18985 mount_client $MOUNT || error "mount failed"
18987 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
18988 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
18989 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
18991 #set the stripe to be unknown hash type
18992 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
18993 $LCTL set_param fail_loc=0x1901
18994 for ((i = 0; i < 10; i++)); do
18995 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
18996 error "stat f-$i failed"
18997 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
19000 touch $DIR/$tdir/striped_dir/f0 &&
19001 error "create under striped dir with unknown hash should fail"
19003 $LCTL set_param fail_loc=0
19005 umount_client $MOUNT || error "umount failed"
19006 mount_client $MOUNT || error "mount failed"
19010 run_test 300i "client handle unknown hash type striped directory"
19013 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19014 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19015 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19016 skip "Need MDS version at least 2.7.55"
19023 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
19024 $LCTL set_param fail_loc=0x1702
19025 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19026 error "set striped dir error"
19028 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
19029 error "create files under striped dir failed"
19031 $LCTL set_param fail_loc=0
19033 rm -rf $DIR/$tdir || error "unlink striped dir fails"
19037 run_test 300j "test large update record"
19040 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19041 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19042 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19043 skip "Need MDS version at least 2.7.55"
19045 # this test needs a huge transaction
19047 kb=$(do_facet $SINGLEMDS lctl get_param -n osd*.lustre-MDT0000.kbytestotal)
19048 [ $kb -lt $((1024*1024)) ] && skip "too small mds: $kb"
19055 #define OBD_FAIL_LARGE_STRIPE 0x1703
19056 $LCTL set_param fail_loc=0x1703
19057 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
19058 error "set striped dir error"
19059 $LCTL set_param fail_loc=0
19061 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19062 error "getstripeddir fails"
19063 rm -rf $DIR/$tdir/striped_dir ||
19064 error "unlink striped dir fails"
19068 run_test 300k "test large striped directory"
19071 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19072 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19073 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19074 skip "Need MDS version at least 2.7.55"
19078 test_mkdir -p $DIR/$tdir/striped_dir
19079 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
19080 error "chown $RUNAS_ID failed"
19081 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
19082 error "set default striped dir failed"
19084 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
19085 $LCTL set_param fail_loc=0x80000158
19086 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
19088 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
19089 [ $stripe_index -eq 1 ] ||
19090 error "expect 1 get $stripe_index for $dir"
19092 run_test 300l "non-root user to create dir under striped dir with stale layout"
19095 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19096 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
19097 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19098 skip "Need MDS version at least 2.7.55"
19100 mkdir -p $DIR/$tdir/striped_dir
19101 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
19102 error "set default stripes dir error"
19104 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
19106 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
19107 [ $stripe_count -eq 0 ] ||
19108 error "expect 0 get $stripe_count for a"
19110 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
19111 error "set default stripes dir error"
19113 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
19115 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
19116 [ $stripe_count -eq 0 ] ||
19117 error "expect 0 get $stripe_count for b"
19119 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
19120 error "set default stripes dir error"
19122 mkdir $DIR/$tdir/striped_dir/c &&
19123 error "default stripe_index is invalid, mkdir c should fails"
19125 rm -rf $DIR/$tdir || error "rmdir fails"
19127 run_test 300m "setstriped directory on single MDT FS"
19130 local list=$(comma_list $(mdts_nodes))
19133 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19137 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19138 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19139 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19140 skip "Need MDS version at least 2.7.55"
19141 remote_mds_nodsh && skip "remote MDS with nodsh"
19144 local list=$(comma_list $(mdts_nodes))
19146 trap cleanup_300n RETURN EXIT
19147 mkdir -p $DIR/$tdir
19148 chmod 777 $DIR/$tdir
19149 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
19150 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19151 error "create striped dir succeeds with gid=0"
19153 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19154 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
19155 error "create striped dir fails with gid=-1"
19157 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19158 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
19159 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19160 error "set default striped dir succeeds with gid=0"
19163 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19164 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
19165 error "set default striped dir fails with gid=-1"
19168 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19169 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
19170 error "create test_dir fails"
19171 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
19172 error "create test_dir1 fails"
19173 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
19174 error "create test_dir2 fails"
19177 run_test 300n "non-root user to create dir under striped dir with default EA"
19180 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19181 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19182 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19183 skip "Need MDS version at least 2.7.55"
19188 mkdir -p $DIR/$tdir
19190 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
19191 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
19192 if [ $numfree1 -lt 66000 ] || [ $numfree2 -lt 66000 ]; then
19193 skip "not enough free inodes $numfree1 $numfree2"
19196 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
19197 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
19198 if [ $numfree1 -lt 300000 ] || [ $numfree2 -lt 300000 ]; then
19199 skip "not enough free space $numfree1 $numfree2"
19202 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
19203 error "setdirstripe fails"
19205 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
19206 error "create dirs fails"
19208 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
19209 ls $DIR/$tdir/striped_dir > /dev/null ||
19210 error "ls striped dir fails"
19211 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
19212 error "unlink big striped dir fails"
19214 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
19217 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19218 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19219 remote_mds_nodsh && skip "remote MDS with nodsh"
19221 mkdir -p $DIR/$tdir
19223 #define OBD_FAIL_OUT_ENOSPC 0x1704
19224 do_facet mds2 lctl set_param fail_loc=0x80001704
19225 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
19226 && error "create striped directory should fail"
19228 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
19230 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
19233 run_test 300p "create striped directory without space"
19236 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19237 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19239 local fd=$(free_fd)
19240 local cmd="exec $fd<$tdir"
19242 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
19245 trap "eval $cmd" EXIT
19246 cd $tdir || error "cd $tdir fails"
19247 rmdir ../$tdir || error "rmdir $tdir fails"
19248 mkdir local_dir && error "create dir succeeds"
19249 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
19253 run_test 300q "create remote directory under orphan directory"
19256 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
19257 skip "Need MDS version at least 2.7.55" && return
19258 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19262 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
19263 error "set striped dir error"
19265 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19266 error "getstripeddir fails"
19269 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
19270 awk '/lmv_stripe_count:/ { print $2 }')
19272 [ $MDSCOUNT -ne $stripe_count ] &&
19273 error "wrong stripe count $stripe_count expected $MDSCOUNT"
19275 rm -rf $DIR/$tdir/striped_dir ||
19276 error "unlink striped dir fails"
19278 run_test 300r "test -1 striped directory"
19280 prepare_remote_file() {
19281 mkdir $DIR/$tdir/src_dir ||
19282 error "create remote source failed"
19284 cp /etc/hosts $DIR/$tdir/src_dir/a ||
19285 error "cp to remote source failed"
19286 touch $DIR/$tdir/src_dir/a
19288 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
19289 error "create remote target dir failed"
19291 touch $DIR/$tdir/tgt_dir/b
19293 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
19294 error "rename dir cross MDT failed!"
19296 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
19297 error "src_child still exists after rename"
19299 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
19300 error "missing file(a) after rename"
19302 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
19303 error "diff after rename"
19307 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19308 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19310 local remote_file=$DIR/$tdir/tgt_dir/b
19312 mkdir -p $DIR/$tdir
19314 prepare_remote_file || error "prepare remote file failed"
19317 $OPENUNLINK $remote_file $remote_file ||
19318 error "openunlink $remote_file failed"
19319 $CHECKSTAT -a $remote_file || error "$remote_file exists"
19321 run_test 310a "open unlink remote file"
19324 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19325 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19327 local remote_file=$DIR/$tdir/tgt_dir/b
19329 mkdir -p $DIR/$tdir
19331 prepare_remote_file || error "prepare remote file failed"
19333 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19334 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
19335 $CHECKSTAT -t file $remote_file || error "check file failed"
19337 run_test 310b "unlink remote file with multiple links while open"
19340 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19341 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
19343 local remote_file=$DIR/$tdir/tgt_dir/b
19345 mkdir -p $DIR/$tdir
19347 prepare_remote_file || error "prepare remote file failed"
19349 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19350 multiop_bg_pause $remote_file O_uc ||
19351 error "mulitop failed for remote file"
19353 $MULTIOP $DIR/$tfile Ouc
19354 kill -USR1 $MULTIPID
19357 run_test 310c "open-unlink remote file with multiple links"
19361 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19362 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19363 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
19364 skip "lustre < 2.8.54 does not contain LU-4825 fix"
19365 remote_mds_nodsh && skip "remote MDS with nodsh"
19367 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19368 local mdts=$(comma_list $(mdts_nodes))
19370 mkdir -p $DIR/$tdir
19371 $LFS setstripe -i 0 -c 1 $DIR/$tdir
19372 createmany -o $DIR/$tdir/$tfile. 1000
19374 # statfs data is not real time, let's just calculate it
19375 old_iused=$((old_iused + 1000))
19377 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19378 osp.*OST0000*MDT0000.create_count")
19379 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19380 osp.*OST0000*MDT0000.max_create_count")
19381 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
19383 $LFS setstripe -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
19384 local index=$($LFS getstripe -i $DIR/$tdir/$tfile)
19385 [ $index -ne 0 ] || error "$tfile stripe index is 0"
19387 unlinkmany $DIR/$tdir/$tfile. 1000
19389 do_nodes $mdts "$LCTL set_param -n \
19390 osp.*OST0000*.max_create_count=$max_count"
19391 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
19392 do_nodes $mdts "$LCTL set_param -n \
19393 osp.*OST0000*.create_count=$count"
19394 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
19395 grep "=0" && error "create_count is zero"
19398 for i in $(seq 120); do
19399 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19400 # system may be too busy to destroy all objs in time, use
19401 # a somewhat small value to not fail autotest
19402 [ $((old_iused - new_iused)) -gt 400 ] && break
19406 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
19407 [ $((old_iused - new_iused)) -gt 400 ] ||
19408 error "objs not destroyed after unlink"
19410 run_test 311 "disable OSP precreate, and unlink should destroy objs"
19417 local vdevdir=$(dirname $(facet_vdevice $ost))
19418 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
19419 local zfs_zapid=$(do_facet $ost $cmd |
19420 grep -w "/O/0/d$((objid%32))" -C 5 |
19421 awk '/Object/{getline; print $1}')
19422 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
19423 awk "/$objid = /"'{printf $3}')
19428 zfs_object_blksz() {
19432 local vdevdir=$(dirname $(facet_vdevice $ost))
19433 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
19434 local blksz=$(do_facet $ost $cmd $objid |
19435 awk '/dblk/{getline; printf $4}')
19437 case "${blksz: -1}" in
19438 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
19439 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
19446 test_312() { # LU-4856
19447 remote_ost_nodsh && skip "remote OST with nodsh"
19448 [ "$ost1_FSTYPE" = "zfs" ] ||
19449 skip_env "the test only applies to zfs"
19451 local max_blksz=$(do_facet ost1 \
19452 $ZFS get -p recordsize $(facet_device ost1) |
19453 awk '!/VALUE/{print $3}')
19455 # to make life a little bit easier
19456 $LFS mkdir -c 1 -i 0 $DIR/$tdir
19457 $LFS setstripe -c 1 -i 0 $DIR/$tdir
19459 local tf=$DIR/$tdir/$tfile
19461 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19463 # Get ZFS object id
19464 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19465 # block size change by sequential overwrite
19468 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
19469 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
19471 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
19472 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19476 # block size change by sequential append write
19477 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19478 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19479 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19482 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19483 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19484 oflag=sync conv=notrunc
19486 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19487 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19488 error "blksz error, actual $blksz, " \
19489 "expected: 2 * $count * $PAGE_SIZE"
19495 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19496 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19498 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
19499 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19500 [ $blksz -eq $PAGE_SIZE ] ||
19501 error "blksz error: $blksz, expected: $PAGE_SIZE"
19503 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
19504 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19505 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
19507 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
19508 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19509 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
19511 run_test 312 "make sure ZFS adjusts its block size by write pattern"
19514 remote_ost_nodsh && skip "remote OST with nodsh"
19516 local file=$DIR/$tfile
19519 $LFS setstripe -c 1 -i 0 $file || error "setstripe failed"
19521 # define OBD_FAIL_TGT_RCVD_EIO 0x720
19522 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19523 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
19524 error "write should failed"
19525 do_facet ost1 "$LCTL set_param fail_loc=0"
19528 run_test 313 "io should fail after last_rcvd update fail"
19531 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19533 $LFS setstripe -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
19534 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19536 wait_delete_completed
19537 do_facet ost1 "$LCTL set_param fail_loc=0"
19539 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
19541 test_315() { # LU-618
19542 [ -f /proc/$$/io ] || skip_env "no IO accounting in kernel"
19544 local file=$DIR/$tfile
19547 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
19548 error "multiop file write failed"
19549 $MULTIOP $file oO_RDONLY:r4063232_c &
19554 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
19557 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
19560 run_test 315 "read should be accounted"
19563 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19564 large_xattr_enabled || skip_env "ea_inode feature disabled"
19566 rm -rf $DIR/$tdir/d
19567 mkdir -p $DIR/$tdir/d
19568 chown nobody $DIR/$tdir/d
19569 touch $DIR/$tdir/d/file
19571 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
19573 run_test 316 "lfs mv"
19576 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
19577 skip "Need MDS version at least 2.11.53"
19578 if [ "$ost1_FSTYPE" == "zfs" ]; then
19579 skip "LU-10370: no implementation for ZFS"
19583 local grant_blk_size
19585 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
19586 awk '/grant_block_size:/ { print $2; exit; }')
19588 # Create File of size 5M. Truncate it to below size's and verify
19591 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
19592 error "Create file $DIR/$tfile failed"
19593 stack_trap "rm -f $DIR/$tfile" EXIT
19595 for trunc_sz in 2097152 4097 4000 509 0; do
19596 $TRUNCATE $DIR/$tfile $trunc_sz ||
19597 error "truncate $tfile to $trunc_sz failed"
19598 local sz=$(stat --format=%s $DIR/$tfile)
19599 local blk=$(stat --format=%b $DIR/$tfile)
19600 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
19601 grant_blk_size) * 8))
19603 if [[ $blk -ne $trunc_blk ]]; then
19604 $(which stat) $DIR/$tfile
19605 error "Expected Block $trunc_blk got $blk for $tfile"
19608 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19609 error "Expected Size $trunc_sz got $sz for $tfile"
19614 # Create file with a hole and write actual two blocks. Block count
19617 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
19618 conv=fsync || error "Create file : $DIR/$tfile"
19620 # Calculate the final truncate size.
19621 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
19624 # truncate to size $trunc_sz bytes. Strip the last block
19625 # The block count must drop to 8
19627 $TRUNCATE $DIR/$tfile $trunc_sz ||
19628 error "truncate $tfile to $trunc_sz failed"
19630 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
19631 sz=$(stat --format=%s $DIR/$tfile)
19632 blk=$(stat --format=%b $DIR/$tfile)
19634 if [[ $blk -ne $trunc_bsz ]]; then
19635 $(which stat) $DIR/$tfile
19636 error "Expected Block $trunc_bsz got $blk for $tfile"
19639 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19640 error "Expected Size $trunc_sz got $sz for $tfile"
19642 run_test 317 "Verify blocks get correctly update after truncate"
19645 local old_max_active=$($LCTL get_param -n \
19646 llite.*.max_read_ahead_async_active 2>/dev/null)
19648 $LCTL set_param llite.*.max_read_ahead_async_active=256
19649 local max_active=$($LCTL get_param -n \
19650 llite.*.max_read_ahead_async_active 2>/dev/null)
19651 [ $max_active -ne 256 ] && error "expected 256 but got $max_active"
19653 # currently reset to 0 is unsupported, leave it 512 for now.
19654 $LCTL set_param llite.*.max_read_ahead_async_active=0 &&
19655 error "set max_read_ahead_async_active should fail"
19657 $LCTL set_param llite.*.max_read_ahead_async_active=512
19658 max_active=$($LCTL get_param -n \
19659 llite.*.max_read_ahead_async_active 2>/dev/null)
19660 [ $max_active -eq 512 ] || error "expected 512 but got $max_active"
19662 # restore @max_active
19663 [ $old_max_active -ne 0 ] && $LCTL set_param \
19664 llite.*.max_read_ahead_async_active=$old_max_active
19666 local old_threshold=$($LCTL get_param -n \
19667 llite.*.read_ahead_async_file_threshold_mb 2>/dev/null)
19668 local max_per_file_mb=$($LCTL get_param -n \
19669 llite.*.max_read_ahead_per_file_mb 2>/dev/null)
19671 local invalid=$(($max_per_file_mb + 1))
19673 llite.*.read_ahead_async_file_threshold_mb=$invalid\
19674 && error "set $invalid should fail"
19676 local valid=$(($invalid - 1))
19678 llite.*.read_ahead_async_file_threshold_mb=$valid ||
19679 error "set $valid should succeed"
19680 local threshold=$($LCTL get_param -n \
19681 llite.*.read_ahead_async_file_threshold_mb 2>/dev/null)
19682 [ $threshold -eq $valid ] || error \
19683 "expect threshold $valid got $threshold"
19685 llite.*.read_ahead_async_file_threshold_mb=$old_threshold
19687 run_test 318 "Verify async readahead tunables"
19690 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
19692 local before=$(date +%s)
19694 local mdir=$DIR/$tdir
19695 local file=$mdir/xxx
19697 $LFS mkdir -i0 $mdir || error "mkdir $mdir fails"
19700 #define OBD_FAIL_LDLM_LOCAL_CANCEL_PAUSE 0x32c
19701 $LCTL set_param fail_val=5 fail_loc=0x8000032c
19702 $LFS mv -m1 $file &
19705 dd if=$file of=/dev/null
19707 evict=$($LCTL get_param mdc.$FSNAME-MDT*.state |
19708 awk -F"[ [,]" '/EVICTED ]$/ { if (mx<$5) {mx=$5;} } END { print mx }')
19710 [ -z "$evict" ] || [[ $evict -le $before ]] || error "eviction happened"
19712 run_test 319 "lost lease lock on migrate error"
19715 local read_write=$1
19716 if [ "$read_write" = "write" ]; then
19717 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
19718 elif [ "$read_write" = "read" ]; then
19719 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
19721 error "argument error"
19724 # turn off debug for performance testing
19725 local saved_debug=$($LCTL get_param -n debug)
19726 $LCTL set_param debug=0
19728 $LFS setstripe -c 1 -i 0 $DIR/$tfile
19730 # get ost1 size - lustre-OST0000
19731 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
19732 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
19733 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
19735 if [ "$read_write" = "read" ]; then
19736 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
19739 local start_time=$(date +%s.%N)
19740 $dd_cmd bs=1M count=$blocks oflag=sync ||
19741 error "real dd $read_write error"
19742 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
19744 if [ "$read_write" = "write" ]; then
19748 # define OBD_FAIL_OST_FAKE_RW 0x238
19749 do_facet ost1 $LCTL set_param fail_loc=0x238
19751 local start_time=$(date +%s.%N)
19752 $dd_cmd bs=1M count=$blocks oflag=sync ||
19753 error "fake dd $read_write error"
19754 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
19756 if [ "$read_write" = "write" ]; then
19758 cancel_lru_locks osc
19759 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
19760 error "$tfile size not $blocks MB"
19762 do_facet ost1 $LCTL set_param fail_loc=0
19764 echo "fake $read_write $duration_fake vs. normal $read_write" \
19765 "$duration in seconds"
19766 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
19767 error_not_in_vm "fake write is slower"
19769 $LCTL set_param -n debug="$saved_debug"
19772 test_399a() { # LU-7655 for OST fake write
19773 remote_ost_nodsh && skip "remote OST with nodsh"
19777 run_test 399a "fake write should not be slower than normal write"
19779 test_399b() { # LU-8726 for OST fake read
19780 remote_ost_nodsh && skip "remote OST with nodsh"
19781 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
19782 skip_env "ldiskfs only test"
19787 run_test 399b "fake read should not be slower than normal read"
19789 test_400a() { # LU-1606, was conf-sanity test_74
19790 if ! which $CC > /dev/null 2>&1; then
19791 skip_env "$CC is not installed"
19794 local extra_flags=''
19795 local out=$TMP/$tfile
19796 local prefix=/usr/include/lustre
19799 if ! [[ -d $prefix ]]; then
19800 # Assume we're running in tree and fixup the include path.
19801 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
19802 extra_flags+=" -L$LUSTRE/utils/.lib"
19805 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
19806 $CC -Wall -Werror $extra_flags -o $out $prog -llustreapi ||
19807 error "client api broken"
19811 run_test 400a "Lustre client api program can compile and link"
19813 test_400b() { # LU-1606, LU-5011
19815 local out=$TMP/$tfile
19816 local prefix=/usr/include/linux/lustre
19818 # We use a hard coded prefix so that this test will not fail
19819 # when run in tree. There are headers in lustre/include/lustre/
19820 # that are not packaged (like lustre_idl.h) and have more
19821 # complicated include dependencies (like config.h and lnet/types.h).
19822 # Since this test about correct packaging we just skip them when
19823 # they don't exist (see below) rather than try to fixup cppflags.
19825 if ! which $CC > /dev/null 2>&1; then
19826 skip_env "$CC is not installed"
19829 for header in $prefix/*.h; do
19830 if ! [[ -f "$header" ]]; then
19834 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
19835 continue # lustre_ioctl.h is internal header
19838 $CC -Wall -Werror -include $header -c -x c /dev/null -o $out ||
19839 error "cannot compile '$header'"
19843 run_test 400b "packaged headers can be compiled"
19845 test_401a() { #LU-7437
19846 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
19847 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
19849 #count the number of parameters by "list_param -R"
19850 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
19851 #count the number of parameters by listing proc files
19852 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
19853 echo "proc_dirs='$proc_dirs'"
19854 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
19855 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
19858 [ $params -eq $procs ] ||
19859 error "found $params parameters vs. $procs proc files"
19861 # test the list_param -D option only returns directories
19862 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
19863 #count the number of parameters by listing proc directories
19864 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
19867 [ $params -eq $procs ] ||
19868 error "found $params parameters vs. $procs proc files"
19870 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
19873 local save=$($LCTL get_param -n jobid_var)
19876 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
19877 error "no error returned when setting bad parameters"
19879 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
19880 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
19882 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
19883 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
19884 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
19886 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
19889 local jobid_var_old=$($LCTL get_param -n jobid_var)
19890 local jobid_var_new
19892 $LCTL set_param jobid_var= &&
19893 error "no error returned for 'set_param a='"
19895 jobid_var_new=$($LCTL get_param -n jobid_var)
19896 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19897 error "jobid_var was changed by setting without value"
19899 $LCTL set_param jobid_var &&
19900 error "no error returned for 'set_param a'"
19902 jobid_var_new=$($LCTL get_param -n jobid_var)
19903 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
19904 error "jobid_var was changed by setting without value"
19906 run_test 401c "Verify 'lctl set_param' without value fails in either format."
19909 local jobid_var_old=$($LCTL get_param -n jobid_var)
19910 local jobid_var_new
19911 local new_value="foo=bar"
19913 $LCTL set_param jobid_var=$new_value ||
19914 error "'set_param a=b' did not accept a value containing '='"
19916 jobid_var_new=$($LCTL get_param -n jobid_var)
19917 [[ "$jobid_var_new" == "$new_value" ]] ||
19918 error "'set_param a=b' failed on a value containing '='"
19920 # Reset the jobid_var to test the other format
19921 $LCTL set_param jobid_var=$jobid_var_old
19922 jobid_var_new=$($LCTL get_param -n jobid_var)
19923 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19924 error "failed to reset jobid_var"
19926 $LCTL set_param jobid_var $new_value ||
19927 error "'set_param a b' did not accept a value containing '='"
19929 jobid_var_new=$($LCTL get_param -n jobid_var)
19930 [[ "$jobid_var_new" == "$new_value" ]] ||
19931 error "'set_param a b' failed on a value containing '='"
19933 $LCTL set_param jobid_var $jobid_var_old
19934 jobid_var_new=$($LCTL get_param -n jobid_var)
19935 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
19936 error "failed to reset jobid_var"
19938 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
19941 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
19942 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
19943 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
19944 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
19945 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
19946 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
19947 remote_mds_nodsh && skip "remote MDS with nodsh"
19949 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
19950 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
19951 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
19952 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
19953 echo "Touch failed - OK"
19955 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
19958 local file1=$DIR/$tfile.1
19959 local file2=$DIR/$tfile.2
19960 local tfile=$TMP/$tfile
19962 rm -f $file1 $file2 $tfile
19967 # 30 sec OBD_TIMEOUT in ll_getattr()
19968 # right before populating st_nlink
19969 $LCTL set_param fail_loc=0x80001409
19970 stat -c %h $file1 > $tfile &
19972 # create an alias, drop all locks and reclaim the dentry
19974 cancel_lru_locks mdc
19975 cancel_lru_locks osc
19976 sysctl -w vm.drop_caches=2
19980 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
19982 rm -f $tfile $file1 $file2
19984 run_test 403 "i_nlink should not drop to zero due to aliasing"
19986 test_404() { # LU-6601
19987 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
19988 skip "Need server version newer than 2.8.52"
19989 remote_mds_nodsh && skip "remote MDS with nodsh"
19991 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
19992 awk '/osp .*-osc-MDT/ { print $4}')
19995 for osp in $mosps; do
19996 echo "Deactivate: " $osp
19997 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
19998 local stat=$(do_facet $SINGLEMDS $LCTL dl |
19999 awk -vp=$osp '$4 == p { print $2 }')
20000 [ $stat = IN ] || {
20001 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
20002 error "deactivate error"
20004 echo "Activate: " $osp
20005 do_facet $SINGLEMDS $LCTL --device %$osp activate
20006 local stat=$(do_facet $SINGLEMDS $LCTL dl |
20007 awk -vp=$osp '$4 == p { print $2 }')
20008 [ $stat = UP ] || {
20009 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
20010 error "activate error"
20014 run_test 404 "validate manual {de}activated works properly for OSPs"
20017 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
20018 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] ||
20019 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
20020 skip "Layout swap lock is not supported"
20022 check_swap_layouts_support
20024 test_mkdir $DIR/$tdir
20025 swap_lock_test -d $DIR/$tdir ||
20026 error "One layout swap locked test failed"
20028 run_test 405 "Various layout swap lock tests"
20031 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20032 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
20033 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
20034 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20035 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
20036 skip "Need MDS version at least 2.8.50"
20038 local def_stripe_size=$($LFS getstripe -S $MOUNT)
20039 local test_pool=$TESTNAME
20041 if ! combined_mgs_mds ; then
20044 pool_add $test_pool || error "pool_add failed"
20045 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
20046 error "pool_add_targets failed"
20048 save_layout_restore_at_exit $MOUNT
20050 # parent set default stripe count only, child will stripe from both
20051 # parent and fs default
20052 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
20053 error "setstripe $MOUNT failed"
20054 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
20055 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
20056 for i in $(seq 10); do
20057 local f=$DIR/$tdir/$tfile.$i
20058 touch $f || error "touch failed"
20059 local count=$($LFS getstripe -c $f)
20060 [ $count -eq $OSTCOUNT ] ||
20061 error "$f stripe count $count != $OSTCOUNT"
20062 local offset=$($LFS getstripe -i $f)
20063 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
20064 local size=$($LFS getstripe -S $f)
20065 [ $size -eq $((def_stripe_size * 2)) ] ||
20066 error "$f stripe size $size != $((def_stripe_size * 2))"
20067 local pool=$($LFS getstripe -p $f)
20068 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
20071 # change fs default striping, delete parent default striping, now child
20072 # will stripe from new fs default striping only
20073 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
20074 error "change $MOUNT default stripe failed"
20075 $LFS setstripe -c 0 $DIR/$tdir ||
20076 error "delete $tdir default stripe failed"
20077 for i in $(seq 11 20); do
20078 local f=$DIR/$tdir/$tfile.$i
20079 touch $f || error "touch $f failed"
20080 local count=$($LFS getstripe -c $f)
20081 [ $count -eq 1 ] || error "$f stripe count $count != 1"
20082 local offset=$($LFS getstripe -i $f)
20083 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
20084 local size=$($LFS getstripe -S $f)
20085 [ $size -eq $def_stripe_size ] ||
20086 error "$f stripe size $size != $def_stripe_size"
20087 local pool=$($LFS getstripe -p $f)
20088 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
20091 unlinkmany $DIR/$tdir/$tfile. 1 20
20093 local f=$DIR/$tdir/$tfile
20094 pool_remove_all_targets $test_pool $f
20095 pool_remove $test_pool $f
20097 if ! combined_mgs_mds ; then
20101 run_test 406 "DNE support fs default striping"
20104 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20105 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
20106 skip "Need MDS version at least 2.8.55"
20107 remote_mds_nodsh && skip "remote MDS with nodsh"
20109 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
20110 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
20111 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
20112 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
20113 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
20115 #define OBD_FAIL_DT_TXN_STOP 0x2019
20116 for idx in $(seq $MDSCOUNT); do
20117 do_facet mds$idx "lctl set_param fail_loc=0x2019"
20119 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
20120 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
20121 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
20124 run_test 407 "transaction fail should cause operation fail"
20127 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
20129 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
20130 lctl set_param fail_loc=0x8000040a
20131 # let ll_prepare_partial_page() fail
20132 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
20136 # create at least 100 unused inodes so that
20137 # shrink_icache_memory(0) should not return 0
20138 touch $DIR/$tfile-{0..100}
20139 rm -f $DIR/$tfile-{0..100}
20142 echo 2 > /proc/sys/vm/drop_caches
20144 run_test 408 "drop_caches should not hang due to page leaks"
20148 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20150 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
20151 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
20152 touch $DIR/$tdir/guard || error "(2) Fail to create"
20154 local PREFIX=$(str_repeat 'A' 128)
20155 echo "Create 1K hard links start at $(date)"
20156 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20157 error "(3) Fail to hard link"
20159 echo "Links count should be right although linkEA overflow"
20160 stat $DIR/$tdir/guard || error "(4) Fail to stat"
20161 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
20162 [ $linkcount -eq 1001 ] ||
20163 error "(5) Unexpected hard links count: $linkcount"
20165 echo "List all links start at $(date)"
20166 ls -l $DIR/$tdir/foo > /dev/null ||
20167 error "(6) Fail to list $DIR/$tdir/foo"
20169 echo "Unlink hard links start at $(date)"
20170 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20171 error "(7) Fail to unlink"
20172 echo "Unlink hard links finished at $(date)"
20174 run_test 409 "Large amount of cross-MDTs hard links on the same file"
20178 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
20179 skip "Need client version at least 2.9.59"
20181 # Create a file, and stat it from the kernel
20182 local testfile=$DIR/$tfile
20185 local run_id=$RANDOM
20186 local my_ino=$(stat --format "%i" $testfile)
20188 # Try to insert the module. This will always fail as the
20189 # module is designed to not be inserted.
20190 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
20193 # Anything but success is a test failure
20195 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
20196 error "no inode match"
20198 run_test 410 "Test inode number returned from kernel thread"
20200 cleanup_test411_cgroup() {
20206 local cg_basedir=/sys/fs/cgroup/memory
20208 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
20209 skip "no setup for cgroup"
20211 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
20212 error "test file creation failed"
20213 cancel_lru_locks osc
20215 # Create a very small memory cgroup to force a slab allocation error
20216 local cgdir=$cg_basedir/osc_slab_alloc
20217 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
20218 trap "cleanup_test411_cgroup $cgdir" EXIT
20219 echo 2M > $cgdir/memory.kmem.limit_in_bytes
20220 echo 1M > $cgdir/memory.limit_in_bytes
20222 # Should not LBUG, just be killed by oom-killer
20223 # dd will return 0 even allocation failure in some environment.
20224 # So don't check return value
20225 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
20226 cleanup_test411_cgroup $cgdir
20230 run_test 411 "Slab allocation error with cgroup does not LBUG"
20233 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20234 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20235 skip "Need server version at least 2.10.55"
20238 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
20239 error "mkdir failed"
20240 $LFS getdirstripe $DIR/$tdir
20241 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
20242 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
20243 error "expect $((MDSCOUT - 1)) get $stripe_index"
20244 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
20245 [ $stripe_count -eq 2 ] ||
20246 error "expect 2 get $stripe_count"
20248 run_test 412 "mkdir on specific MDTs"
20251 [ $MDSCOUNT -lt 2 ] &&
20252 skip "We need at least 2 MDTs for this test"
20254 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20255 skip "Need server version at least 2.10.55"
20258 mkdir $DIR/$tdir || error "mkdir failed"
20260 # find MDT that is the most full
20261 local max=$($LFS df | grep MDT |
20270 END { split(b, c, ":")
20275 for i in $(seq $((MDSCOUNT - 1))); do
20276 $LFS mkdir -c $i $DIR/$tdir/d$i ||
20277 error "mkdir d$i failed"
20278 $LFS getdirstripe $DIR/$tdir/d$i
20279 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
20280 [ $stripe_index -ne $max ] ||
20281 error "don't expect $max"
20284 run_test 413a "mkdir on less full MDTs"
20287 [ $MDSCOUNT -lt 2 ] &&
20288 skip "We need at least 2 MDTs for this test"
20290 [ $MDS1_VERSION -lt $(version_code 2.12.52) ] &&
20291 skip "Need server version at least 2.12.52"
20293 mkdir $DIR/$tdir || error "mkdir failed"
20294 $LFS setdirstripe -D -i -1 -H space $DIR/$tdir ||
20295 error "setdirstripe failed"
20297 local qos_prio_free
20298 local qos_threshold_rr
20301 qos_prio_free=$($LCTL get_param -n lmv.*.qos_prio_free | head -n1)
20302 qos_prio_free=${qos_prio_free%%%}
20303 qos_threshold_rr=$($LCTL get_param -n lmv.*.qos_threshold_rr | head -n1)
20304 qos_threshold_rr=${qos_threshold_rr%%%}
20305 qos_maxage=$($LCTL get_param -n lmv.*.qos_maxage)
20307 stack_trap "$LCTL set_param lmv.*.qos_prio_free=$qos_prio_free" EXIT
20308 stack_trap "$LCTL set_param lmv.*.qos_threshold_rr=$qos_threshold_rr" \
20310 stack_trap "$LCTL set_param lmv.*.qos_maxage=$qos_maxage" EXIT
20312 echo "mkdir with roundrobin"
20314 $LCTL set_param lmv.*.qos_threshold_rr=100
20315 for i in $(seq $((100 * MDSCOUNT))); do
20316 mkdir $DIR/$tdir/subdir$i || error "mkdir subdir$i failed"
20318 for i in $(seq $MDSCOUNT); do
20319 count=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$((i - 1))$ |
20321 echo "$count directories created on MDT$((i - 1))"
20322 [ $count -eq 100 ] || error "subdirs are not evenly distributed"
20325 rm -rf $DIR/$tdir/*
20327 $LCTL set_param lmv.*.qos_threshold_rr=$qos_threshold_rr
20328 # Shorten statfs result age, so that it can be updated in time
20329 $LCTL set_param lmv.*.qos_maxage=1
20338 ffree=($(lctl get_param -n mdc.*[mM][dD][cC]-[^M]*.filesfree | uniq))
20339 echo "MDT filesfree available: ${ffree[@]}"
20344 for ((i = 0; i < ${#ffree[@]}; i++)); do
20345 if [[ ${ffree[i]} -gt $max ]]; then
20349 if [[ ${ffree[i]} -lt $min ]]; then
20354 echo "Min free files: MDT$min_index: $min"
20355 echo "Max free files: MDT$max_index: $max"
20357 [ $min -eq 0 ] && skip "no free files in MDT$min_index"
20358 [ $min -gt 10000000 ] && skip "too much free files in MDT$min_index"
20360 # Check if we need to generate uneven MDTs
20361 test_mkdir -i $min_index -c 1 -p $DIR/$tdir-MDT$min_index
20363 local diff=$((max - min))
20364 local diff2=$((diff * 100 / min))
20366 echo -n "Check for uneven MDTs: "
20367 echo -n "diff=$diff files ($diff2%) must be > $threshold% ..."
20369 if [ $diff2 -gt $threshold ]; then
20371 echo "Don't need to fill MDT$min_index"
20373 # generate uneven MDTs, create till 25% diff
20375 diff2=$((threshold - diff2))
20376 diff=$((min * diff2 / 100))
20377 # 50 sec per 10000 files in vm
20378 [ $diff -gt 40000 ] && [ "$SLOW" = "no" ] &&
20379 skip "$diff files to create"
20380 echo "Fill $diff2% diff in MDT$min_index with $diff files"
20382 local value="$(generate_string 1024)"
20383 for i in $(seq $diff); do
20384 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE \
20385 $DIR/$tdir-MDT$min_index/f$i > /dev/null ||
20386 error "create f$i failed"
20387 setfattr -n user.413b -v $value \
20388 $DIR/$tdir-MDT$min_index/f$i ||
20389 error "setfattr f$i failed"
20393 min=$((100 *MDSCOUNT))
20396 echo "mkdir with balanced space usage"
20397 $LCTL set_param lmv.*.qos_prio_free=100
20398 for i in $(seq $((100 * MDSCOUNT))); do
20399 mkdir $DIR/$tdir/subdir$i || error "mkdir subdir$i failed"
20401 for i in $(seq $MDSCOUNT); do
20402 count=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$((i - 1))$ |
20404 echo "$count directories created on MDT$((i - 1))"
20405 [ $min -gt $count ] && min=$count
20406 [ $max -lt $count ] && max=$count
20408 [ $((max - min)) -gt $MDSCOUNT ] ||
20409 error "subdirs shouldn't be evenly distributed"
20411 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
20413 $LFS setdirstripe -D -d $DIR/$tdir || error "setdirstripe -d failed"
20414 getfattr -n trusted.dmv $DIR/$tdir && error "default dir layout exists"
20417 run_test 413b "mkdir with balanced space usage"
20420 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
20421 $LCTL set_param fail_loc=0x80000521
20422 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
20425 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
20428 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20429 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
20430 skip "Need server version at least 2.11.52"
20440 # this test may be slow on ZFS
20441 [ "$mds1_FSTYPE" == "zfs" ] && total=100
20443 # though this test is designed for striped directory, let's test normal
20444 # directory too since lock is always saved as CoS lock.
20445 test_mkdir $DIR/$tdir || error "mkdir $tdir"
20446 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
20455 start_time=$(date +%s)
20456 for i in $(seq $total); do
20457 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
20460 end_time=$(date +%s)
20461 duration=$((end_time - start_time))
20463 kill -9 $setattr_pid
20465 echo "rename $total files took $duration sec"
20466 [ $duration -lt 100 ] || error "rename took $duration sec"
20468 run_test 415 "lock revoke is not missing"
20471 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
20472 skip "Need server version at least 2.11.55"
20474 # define OBD_FAIL_OSD_TXN_START 0x19a
20475 do_facet mds1 lctl set_param fail_loc=0x19a
20477 lfs mkdir -c $MDSCOUNT $DIR/$tdir
20481 run_test 416 "transaction start failure won't cause system hung"
20485 do_nodes $(comma_list $(mdts_nodes)) \
20486 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
20487 do_nodes $(comma_list $(mdts_nodes)) \
20488 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
20489 do_nodes $(comma_list $(mdts_nodes)) \
20490 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
20494 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20495 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
20496 skip "Need MDS version at least 2.11.56"
20498 trap cleanup_417 RETURN EXIT
20500 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
20501 do_nodes $(comma_list $(mdts_nodes)) \
20502 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
20503 $LFS migrate -m 0 $DIR/$tdir.1 &&
20504 error "migrate dir $tdir.1 should fail"
20506 do_nodes $(comma_list $(mdts_nodes)) \
20507 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
20508 $LFS mkdir -i 1 $DIR/$tdir.2 &&
20509 error "create remote dir $tdir.2 should fail"
20511 do_nodes $(comma_list $(mdts_nodes)) \
20512 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
20513 $LFS mkdir -c 2 $DIR/$tdir.3 &&
20514 error "create striped dir $tdir.3 should fail"
20517 run_test 417 "disable remote dir, striped dir and dir migration"
20519 # Checks that the outputs of df [-i] and lfs df [-i] match
20521 # usage: check_lfs_df <blocks | inodes> <mountpoint>
20531 [ "$1" == "blocks" ] && inodes= || inodes="-i"
20533 for count in {1..100}; do
20537 # read the lines of interest
20538 df_out=($(df -P $inodes $dir | tail -n +2)) ||
20539 error "df $inodes $dir | tail -n +2 failed"
20540 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
20541 error "lfs df $inodes $dir | grep summary: failed"
20543 # skip first substrings of each output as they are different
20544 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
20545 # compare the two outputs
20547 for i in {1..5}; do
20548 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
20556 lfs df $inodes $dir
20557 error "df and lfs df $1 output mismatch: " \
20558 "df ${inodes}: ${df_out[*]}, " \
20559 "lfs df ${inodes}: ${lfs_df_out[*]}"
20564 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20566 local dir=$DIR/$tdir
20567 local numfiles=$((RANDOM % 4096 + 2))
20568 local numblocks=$((RANDOM % 256 + 1))
20570 wait_delete_completed
20573 # check block output
20574 check_lfs_df blocks $dir
20575 # check inode output
20576 check_lfs_df inodes $dir
20578 # create a single file and retest
20579 echo "Creating a single file and testing"
20580 createmany -o $dir/$tfile- 1 &>/dev/null ||
20581 error "creating 1 file in $dir failed"
20582 check_lfs_df blocks $dir
20583 check_lfs_df inodes $dir
20585 # create a random number of files
20586 echo "Creating $((numfiles - 1)) files and testing"
20587 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
20588 error "creating $((numfiles - 1)) files in $dir failed"
20590 # write a random number of blocks to the first test file
20591 echo "Writing $numblocks 4K blocks and testing"
20592 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
20593 count=$numblocks &>/dev/null ||
20594 error "dd to $dir/${tfile}-0 failed"
20597 check_lfs_df blocks $dir
20598 check_lfs_df inodes $dir
20600 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
20601 error "unlinking $numfiles files in $dir failed"
20603 run_test 418 "df and lfs df outputs match"
20607 local dir=$DIR/$tdir
20612 cancel_lru_locks mdc
20614 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
20615 $LCTL set_param fail_loc=0x1410
20617 $LCTL set_param fail_loc=0
20620 run_test 419 "Verify open file by name doesn't crash kernel"
20624 [[ $MDS1_VERSION -ge $(version_code 2.12.53) ]] ||
20625 skip "Need MDS version at least 2.12.53"
20627 local SAVE_UMASK=$(umask)
20628 local dir=$DIR/$tdir
20629 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
20633 mkdir -m03777 $dir/testdir
20634 ls -dn $dir/testdir
20635 # Need to remove trailing '.' when SELinux is enabled
20636 local dirperms=$(ls -dn $dir/testdir |
20637 awk '{ sub(/\.$/, "", $1); print $1}')
20638 [ $dirperms == "drwxrwsrwt" ] ||
20639 error "incorrect perms on $dir/testdir"
20641 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
20642 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
20643 ls -n $dir/testdir/testfile
20644 local fileperms=$(ls -n $dir/testdir/testfile |
20645 awk '{ sub(/\.$/, "", $1); print $1}')
20646 [ $fileperms == "-rwxr-xr-x" ] ||
20647 error "incorrect perms on $dir/testdir/testfile"
20651 run_test 420 "clear SGID bit on non-directories for non-members"
20658 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20659 skip "Need MDS version at least 2.12.54"
20661 test_mkdir $DIR/$tdir
20662 createmany -o $DIR/$tdir/f 3
20663 cnt=$(ls -1 $DIR/$tdir | wc -l)
20664 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20666 fid1=$(lfs path2fid $DIR/$tdir/f1)
20667 fid2=$(lfs path2fid $DIR/$tdir/f2)
20668 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
20670 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
20671 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
20673 cnt=$(ls -1 $DIR/$tdir | wc -l)
20674 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20676 rm -f $DIR/$tdir/f3 || error "can't remove f3"
20677 createmany -o $DIR/$tdir/f 3
20678 cnt=$(ls -1 $DIR/$tdir | wc -l)
20679 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20681 fid1=$(lfs path2fid $DIR/$tdir/f1)
20682 fid2=$(lfs path2fid $DIR/$tdir/f2)
20683 echo "remove using fsname $FSNAME"
20684 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
20686 cnt=$(ls -1 $DIR/$tdir | wc -l)
20687 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20689 run_test 421a "simple rm by fid"
20696 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20697 skip "Need MDS version at least 2.12.54"
20699 test_mkdir $DIR/$tdir
20700 createmany -o $DIR/$tdir/f 3
20701 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
20704 FID1=$(lfs path2fid $DIR/$tdir/f1)
20705 FID2=$(lfs path2fid $DIR/$tdir/f2)
20706 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
20708 kill -USR1 $MULTIPID
20711 cnt=$(ls $DIR/$tdir | wc -l)
20712 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
20714 run_test 421b "rm by fid on open file"
20720 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20721 skip "Need MDS version at least 2.12.54"
20723 test_mkdir $DIR/$tdir
20724 createmany -o $DIR/$tdir/f 3
20725 touch $DIR/$tdir/$tfile
20726 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
20727 cnt=$(ls -1 $DIR/$tdir | wc -l)
20728 [ $cnt != 184 ] && error "unexpected #files: $cnt"
20730 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
20731 $LFS rmfid $DIR $FID1 || error "rmfid failed"
20733 cnt=$(ls $DIR/$tdir | wc -l)
20734 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
20736 run_test 421c "rm by fid against hardlinked files"
20742 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20743 skip "Need MDS version at least 2.12.54"
20745 test_mkdir $DIR/$tdir
20746 createmany -o $DIR/$tdir/f 4097
20747 cnt=$(ls -1 $DIR/$tdir | wc -l)
20748 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
20750 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
20751 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20753 cnt=$(ls $DIR/$tdir | wc -l)
20755 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20757 run_test 421d "rmfid en masse"
20763 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20764 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20765 skip "Need MDS version at least 2.12.54"
20767 mkdir -p $DIR/$tdir
20768 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20769 createmany -o $DIR/$tdir/striped_dir/f 512
20770 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20771 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20773 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20774 sed "s/[/][^:]*://g")
20775 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20777 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20779 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20781 run_test 421e "rmfid in DNE"
20787 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20788 skip "Need MDS version at least 2.12.54"
20790 test_mkdir $DIR/$tdir
20792 cnt=$(ls -1 $DIR/$tdir | wc -l)
20793 [ $cnt != 1 ] && error "unexpected #files: $cnt"
20795 FID=$(lfs path2fid $DIR/$tdir/f)
20796 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
20797 # rmfid should fail
20798 cnt=$(ls -1 $DIR/$tdir | wc -l)
20799 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
20801 chmod a+rw $DIR/$tdir
20803 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
20804 # rmfid should fail
20805 cnt=$(ls -1 $DIR/$tdir | wc -l)
20806 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
20809 $RUNAS touch $DIR/$tdir/f
20810 FID=$(lfs path2fid $DIR/$tdir/f)
20811 echo "rmfid as root"
20812 $LFS rmfid $DIR $FID || error "rmfid as root failed"
20813 cnt=$(ls -1 $DIR/$tdir | wc -l)
20814 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
20817 $RUNAS touch $DIR/$tdir/f
20818 cnt=$(ls -1 $DIR/$tdir | wc -l)
20819 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
20820 FID=$(lfs path2fid $DIR/$tdir/f)
20821 # rmfid w/o user_fid2path mount option should fail
20822 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
20823 cnt=$(ls -1 $DIR/$tdir | wc -l)
20824 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
20826 umount_client $MOUNT || "failed to umount client"
20827 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
20828 "failed to mount client'"
20830 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
20831 # rmfid should succeed
20832 cnt=$(ls -1 $DIR/$tdir | wc -l)
20833 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
20835 # rmfid shouldn't allow to remove files due to dir's permission
20836 chmod a+rwx $DIR/$tdir
20839 FID=$(lfs path2fid $DIR/$tdir/f)
20840 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
20842 umount_client $MOUNT || "failed to umount client"
20843 mount_client $MOUNT "$MOUNT_OPTS" ||
20844 "failed to mount client'"
20847 run_test 421f "rmfid checks permissions"
20853 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20854 [ $MDS1_VERSION -lt $(version_code 2.12.54) ] &&
20855 skip "Need MDS version at least 2.12.54"
20857 mkdir -p $DIR/$tdir
20858 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20859 createmany -o $DIR/$tdir/striped_dir/f 512
20860 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20861 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20863 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20864 sed "s/[/][^:]*://g")
20866 rm -f $DIR/$tdir/striped_dir/f1*
20867 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20868 removed=$((512 - cnt))
20870 # few files have been just removed, so we expect
20871 # rmfid to fail on their fids
20872 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
20873 [ $removed != $errors ] && error "$errors != $removed"
20875 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20877 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20879 run_test 421g "rmfid to return errors properly"
20882 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20883 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20884 skip "Need server version at least 2.9.55"
20886 start_full_debug_logging
20890 stop_full_debug_logging
20894 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20895 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20896 awk '/The barrier for/ { print $7 }')
20899 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
20904 barrier_expired() {
20907 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20908 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20909 awk '/will be expired/ { print $7 }')
20911 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
20920 echo "Start barrier_freeze at: $(date)"
20921 #define OBD_FAIL_BARRIER_DELAY 0x2202
20922 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20923 # Do not reduce barrier time - See LU-11873
20924 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
20927 local b_status=$(barrier_stat)
20928 echo "Got barrier status at: $(date)"
20929 [ "$b_status" = "'freezing_p1'" ] ||
20930 error "(1) unexpected barrier status $b_status"
20932 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20934 b_status=$(barrier_stat)
20935 [ "$b_status" = "'frozen'" ] ||
20936 error "(2) unexpected barrier status $b_status"
20938 local expired=$(barrier_expired)
20939 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
20940 sleep $((expired + 3))
20942 b_status=$(barrier_stat)
20943 [ "$b_status" = "'expired'" ] ||
20944 error "(3) unexpected barrier status $b_status"
20946 # Do not reduce barrier time - See LU-11873
20947 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
20948 error "(4) fail to freeze barrier"
20950 b_status=$(barrier_stat)
20951 [ "$b_status" = "'frozen'" ] ||
20952 error "(5) unexpected barrier status $b_status"
20954 echo "Start barrier_thaw at: $(date)"
20955 #define OBD_FAIL_BARRIER_DELAY 0x2202
20956 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
20957 do_facet mgs $LCTL barrier_thaw $FSNAME &
20960 b_status=$(barrier_stat)
20961 echo "Got barrier status at: $(date)"
20962 [ "$b_status" = "'thawing'" ] ||
20963 error "(6) unexpected barrier status $b_status"
20965 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
20967 b_status=$(barrier_stat)
20968 [ "$b_status" = "'thawed'" ] ||
20969 error "(7) unexpected barrier status $b_status"
20971 #define OBD_FAIL_BARRIER_FAILURE 0x2203
20972 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
20973 do_facet mgs $LCTL barrier_freeze $FSNAME
20975 b_status=$(barrier_stat)
20976 [ "$b_status" = "'failed'" ] ||
20977 error "(8) unexpected barrier status $b_status"
20979 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
20980 do_facet mgs $LCTL barrier_thaw $FSNAME
20984 run_test 801a "write barrier user interfaces and stat machine"
20989 mkdir $DIR/$tdir || error "(1) fail to mkdir"
20990 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
20991 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
20992 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
20993 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
20995 cancel_lru_locks mdc
20997 # 180 seconds should be long enough
20998 do_facet mgs $LCTL barrier_freeze $FSNAME 180
21000 local b_status=$(barrier_stat)
21001 [ "$b_status" = "'frozen'" ] ||
21002 error "(6) unexpected barrier status $b_status"
21004 mkdir $DIR/$tdir/d0/d10 &
21007 touch $DIR/$tdir/d1/f13 &
21010 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
21013 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
21016 rm -f $DIR/$tdir/d4/f12 &
21019 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
21021 # To guarantee taht the 'stat' is not blocked
21022 b_status=$(barrier_stat)
21023 [ "$b_status" = "'frozen'" ] ||
21024 error "(8) unexpected barrier status $b_status"
21026 # let above commands to run at background
21029 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
21030 ps -p $touch_pid || error "(10) touch should be blocked"
21031 ps -p $ln_pid || error "(11) link should be blocked"
21032 ps -p $mv_pid || error "(12) rename should be blocked"
21033 ps -p $rm_pid || error "(13) unlink should be blocked"
21035 b_status=$(barrier_stat)
21036 [ "$b_status" = "'frozen'" ] ||
21037 error "(14) unexpected barrier status $b_status"
21039 do_facet mgs $LCTL barrier_thaw $FSNAME
21040 b_status=$(barrier_stat)
21041 [ "$b_status" = "'thawed'" ] ||
21042 error "(15) unexpected barrier status $b_status"
21044 wait $mkdir_pid || error "(16) mkdir should succeed"
21045 wait $touch_pid || error "(17) touch should succeed"
21046 wait $ln_pid || error "(18) link should succeed"
21047 wait $mv_pid || error "(19) rename should succeed"
21048 wait $rm_pid || error "(20) unlink should succeed"
21052 run_test 801b "modification will be blocked by write barrier"
21055 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21059 stop mds2 || error "(1) Fail to stop mds2"
21061 do_facet mgs $LCTL barrier_freeze $FSNAME 30
21063 local b_status=$(barrier_stat)
21064 [ "$b_status" = "'expired'" ] || [ "$b_status" = "'failed'" ] || {
21065 do_facet mgs $LCTL barrier_thaw $FSNAME
21066 error "(2) unexpected barrier status $b_status"
21069 do_facet mgs $LCTL barrier_rescan $FSNAME ||
21070 error "(3) Fail to rescan barrier bitmap"
21072 # Do not reduce barrier time - See LU-11873
21073 do_facet mgs $LCTL barrier_freeze $FSNAME 20
21075 b_status=$(barrier_stat)
21076 [ "$b_status" = "'frozen'" ] ||
21077 error "(4) unexpected barrier status $b_status"
21079 do_facet mgs $LCTL barrier_thaw $FSNAME
21080 b_status=$(barrier_stat)
21081 [ "$b_status" = "'thawed'" ] ||
21082 error "(5) unexpected barrier status $b_status"
21084 local devname=$(mdsdevname 2)
21086 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
21088 do_facet mgs $LCTL barrier_rescan $FSNAME ||
21089 error "(7) Fail to rescan barrier bitmap"
21093 run_test 801c "rescan barrier bitmap"
21095 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
21096 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
21097 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
21098 saved_MOUNT_OPTS=$MOUNT_OPTS
21104 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
21105 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
21106 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
21107 MOUNT_OPTS=$saved_MOUNT_OPTS
21113 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
21114 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
21115 skip "Need server version at least 2.9.55"
21117 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
21119 mkdir $DIR/$tdir || error "(1) fail to mkdir"
21121 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
21122 error "(2) Fail to copy"
21124 trap cleanup_802a EXIT
21126 # sync by force before remount as readonly
21127 sync; sync_all_data; sleep 3; sync_all_data
21131 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
21132 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
21133 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
21135 echo "Mount the server as read only"
21136 setupall server_only || error "(3) Fail to start servers"
21138 echo "Mount client without ro should fail"
21139 mount_client $MOUNT &&
21140 error "(4) Mount client without 'ro' should fail"
21142 echo "Mount client with ro should succeed"
21143 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
21144 mount_client $MOUNT ||
21145 error "(5) Mount client with 'ro' should succeed"
21147 echo "Modify should be refused"
21148 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
21150 echo "Read should be allowed"
21151 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
21152 error "(7) Read should succeed under ro mode"
21156 run_test 802a "simulate readonly device"
21159 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21160 remote_mds_nodsh && skip "remote MDS with nodsh"
21162 do_facet $SINGLEMDS $LCTL get_param mdt.*.readonly ||
21163 skip "readonly option not available"
21165 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "(1) fail to mkdir"
21167 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
21168 error "(2) Fail to copy"
21170 # write back all cached data before setting MDT to readonly
21174 do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=1
21175 stack_trap "do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=0" EXIT
21177 echo "Modify should be refused"
21178 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
21180 echo "Read should be allowed"
21181 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
21182 error "(7) Read should succeed under ro mode"
21185 do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=0
21187 run_test 802b "be able to set MDTs to readonly"
21190 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21191 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
21192 skip "MDS needs to be newer than 2.10.54"
21194 mkdir -p $DIR/$tdir
21195 # Create some objects on all MDTs to trigger related logs objects
21196 for idx in $(seq $MDSCOUNT); do
21197 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
21198 $DIR/$tdir/dir${idx} ||
21199 error "Fail to create $DIR/$tdir/dir${idx}"
21203 wait_delete_completed # ensure old test cleanups are finished
21204 echo "before create:"
21206 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21208 for i in {1..10}; do
21209 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
21210 error "Fail to create $DIR/$tdir/foo$i"
21214 echo "after create:"
21216 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21218 # allow for an llog to be cleaned up during the test
21219 [ $after_used -ge $((before_used + 10 - 1)) ] ||
21220 error "before ($before_used) + 10 > after ($after_used)"
21222 for i in {1..10}; do
21223 rm -rf $DIR/$tdir/foo$i ||
21224 error "Fail to remove $DIR/$tdir/foo$i"
21227 sleep 3 # avoid MDT return cached statfs
21228 wait_delete_completed
21229 echo "after unlink:"
21231 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21233 # allow for an llog to be created during the test
21234 [ $after_used -le $((before_used + 1)) ] ||
21235 error "after ($after_used) > before ($before_used) + 1"
21237 run_test 803 "verify agent object for remote object"
21240 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21241 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
21242 skip "MDS needs to be newer than 2.10.54"
21243 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
21245 mkdir -p $DIR/$tdir
21246 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
21247 error "Fail to create $DIR/$tdir/dir0"
21249 local fid=$($LFS path2fid $DIR/$tdir/dir0)
21250 local dev=$(mdsdevname 2)
21252 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21253 grep ${fid} || error "NOT found agent entry for dir0"
21255 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
21256 error "Fail to create $DIR/$tdir/dir1"
21258 touch $DIR/$tdir/dir1/foo0 ||
21259 error "Fail to create $DIR/$tdir/dir1/foo0"
21260 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
21263 for idx in $(seq $MDSCOUNT); do
21264 dev=$(mdsdevname $idx)
21265 do_facet mds${idx} \
21266 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21267 grep ${fid} && rc=$idx
21270 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
21271 error "Fail to rename foo0 to foo1"
21272 if [ $rc -eq 0 ]; then
21273 for idx in $(seq $MDSCOUNT); do
21274 dev=$(mdsdevname $idx)
21275 do_facet mds${idx} \
21276 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21277 grep ${fid} && rc=$idx
21281 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
21282 error "Fail to rename foo1 to foo2"
21283 if [ $rc -eq 0 ]; then
21284 for idx in $(seq $MDSCOUNT); do
21285 dev=$(mdsdevname $idx)
21286 do_facet mds${idx} \
21287 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21288 grep ${fid} && rc=$idx
21292 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
21294 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
21295 error "Fail to link to $DIR/$tdir/dir1/foo2"
21296 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
21297 error "Fail to rename foo2 to foo0"
21298 unlink $DIR/$tdir/dir1/foo0 ||
21299 error "Fail to unlink $DIR/$tdir/dir1/foo0"
21300 rm -rf $DIR/$tdir/dir0 ||
21301 error "Fail to rm $DIR/$tdir/dir0"
21303 for idx in $(seq $MDSCOUNT); do
21304 dev=$(mdsdevname $idx)
21308 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
21310 start mds${idx} $dev $MDS_MOUNT_OPTS ||
21311 error "mount mds$idx failed"
21312 df $MOUNT > /dev/null 2>&1
21314 # e2fsck should not return error
21316 error "e2fsck detected error on MDT${idx}: rc=$rc"
21319 run_test 804 "verify agent entry for remote entry"
21322 do_facet $SINGLEMDS zfs set quota=$old $fsset
21323 unlinkmany $DIR/$tdir/f- 1000000
21328 local zfs_version=$(do_node $SINGLEMDS cat /sys/module/zfs/version)
21329 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
21330 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
21331 skip "netfree not implemented before 0.7"
21332 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
21333 skip "Need MDS version at least 2.10.57"
21340 local pref="osd-zfs.lustre-MDT0000."
21342 # limit available space on MDS dataset to meet nospace issue
21343 # quickly. then ZFS 0.7.2 can use reserved space if asked
21344 # properly (using netfree flag in osd_declare_destroy()
21345 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
21346 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
21348 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
21349 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
21350 let "usedkb=usedkb-freekb"
21351 let "freekb=freekb/2"
21352 if let "freekb > 5000"; then
21355 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
21356 trap cleanup_805 EXIT
21358 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
21359 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
21360 rm -rf $DIR/$tdir || error "not able to remove"
21361 do_facet $SINGLEMDS zfs set quota=$old $fsset
21364 run_test 805 "ZFS can remove from full fs"
21370 local size=$($LFS getsom -s $file)
21371 local expect=$(stat -c %s $file)
21373 [[ $size == $expect ]] ||
21374 error "$file expected size: $expect, got: $size"
21376 local blocks=$($LFS getsom -b $file)
21377 expect=$(stat -c %b $file)
21378 [[ $blocks == $expect ]] ||
21379 error "$file expected blocks: $expect, got: $blocks"
21384 local size=$($LFS getsom -s $1)
21387 [[ $size == $expect ]] ||
21388 error "$file expected size: $expect, got: $size"
21392 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21393 skip "Need MDS version at least 2.11.52"
21397 touch $DIR/$tfile || error "touch $tfile failed"
21399 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21400 save_lustre_params client "llite.*.xattr_cache" > $save
21401 lctl set_param llite.*.xattr_cache=0
21402 stack_trap "restore_lustre_params < $save; rm -f $save" EXIT
21404 # single-threaded write
21405 echo "Test SOM for single-threaded write"
21406 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
21407 error "write $tfile failed"
21408 check_lsom_size $DIR/$tfile $bs
21411 local size=$(($num * $bs))
21415 echo "Test SOM for single client multi-threaded($num) write"
21416 $TRUNCATE $DIR/$tfile 0
21417 for ((i = 0; i < $num; i++)); do
21418 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21420 offset=$((offset + $bs))
21422 for (( i=0; i < $num; i++ )); do
21425 check_lsom_size $DIR/$tfile $size
21427 $TRUNCATE $DIR/$tfile 0
21428 for ((i = 0; i < $num; i++)); do
21429 offset=$((offset - $bs))
21430 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21433 for (( i=0; i < $num; i++ )); do
21436 check_lsom_size $DIR/$tfile $size
21438 # multi-client wirtes
21439 num=$(get_node_count ${CLIENTS//,/ })
21440 size=$(($num * $bs))
21444 echo "Test SOM for multi-client ($num) writes"
21445 $TRUNCATE $DIR/$tfile 0
21446 for client in ${CLIENTS//,/ }; do
21447 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21450 offset=$((offset + $bs))
21452 for (( i=0; i < $num; i++ )); do
21455 check_lsom_size $DIR/$tfile $offset
21458 $TRUNCATE $DIR/$tfile 0
21459 for client in ${CLIENTS//,/ }; do
21460 offset=$((offset - $bs))
21461 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21465 for (( i=0; i < $num; i++ )); do
21468 check_lsom_size $DIR/$tfile $size
21471 echo "Test SOM for truncate"
21472 $TRUNCATE $DIR/$tfile 1048576
21473 check_lsom_size $DIR/$tfile 1048576
21474 $TRUNCATE $DIR/$tfile 1234
21475 check_lsom_size $DIR/$tfile 1234
21477 # verify SOM blocks count
21478 echo "Verify SOM block count"
21479 $TRUNCATE $DIR/$tfile 0
21480 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
21481 error "failed to write file $tfile"
21482 check_lsom_data $DIR/$tfile
21484 run_test 806 "Verify Lazy Size on MDS"
21487 [ -n "$FILESET" ] && skip "Not functional for FILESET set"
21488 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21489 skip "Need MDS version at least 2.11.52"
21491 # Registration step
21492 changelog_register || error "changelog_register failed"
21493 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
21494 changelog_users $SINGLEMDS | grep -q $cl_user ||
21495 error "User $cl_user not found in changelog_users"
21497 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21498 save_lustre_params client "llite.*.xattr_cache" > $save
21499 lctl set_param llite.*.xattr_cache=0
21500 stack_trap "restore_lustre_params < $save; rm -f $save" EXIT
21502 rm -rf $DIR/$tdir || error "rm $tdir failed"
21503 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
21504 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
21505 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
21506 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
21507 error "truncate $tdir/trunc failed"
21510 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
21511 error "write $tfile failed"
21513 # multi-client wirtes
21514 local num=$(get_node_count ${CLIENTS//,/ })
21518 echo "Test SOM for multi-client ($num) writes"
21519 touch $DIR/$tfile || error "touch $tfile failed"
21520 $TRUNCATE $DIR/$tfile 0
21521 for client in ${CLIENTS//,/ }; do
21522 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21525 offset=$((offset + $bs))
21527 for (( i=0; i < $num; i++ )); do
21532 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
21533 check_lsom_data $DIR/$tdir/trunc
21534 check_lsom_data $DIR/$tdir/single_dd
21535 check_lsom_data $DIR/$tfile
21538 # Deregistration step
21539 changelog_deregister || error "changelog_deregister failed"
21541 run_test 807 "verify LSOM syncing tool"
21543 check_som_nologged()
21545 local lines=$($LFS changelog $FSNAME-MDT0000 |
21546 grep 'x=trusted.som' | wc -l)
21547 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
21551 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
21552 skip "Need MDS version at least 2.11.55"
21554 # Registration step
21555 changelog_register || error "changelog_register failed"
21557 touch $DIR/$tfile || error "touch $tfile failed"
21560 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
21561 error "write $tfile failed"
21564 $TRUNCATE $DIR/$tfile 1234
21567 $TRUNCATE $DIR/$tfile 1048576
21570 # Deregistration step
21571 changelog_deregister || error "changelog_deregister failed"
21573 run_test 808 "Check trusted.som xattr not logged in Changelogs"
21578 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
21582 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
21583 skip "Need MDS version at least 2.11.56"
21585 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
21586 error "failed to create DoM-only file $DIR/$tfile"
21587 touch $DIR/$tfile || error "touch $tfile failed"
21588 check_som_nodata $DIR/$tfile
21590 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
21591 error "write $tfile failed"
21592 check_som_nodata $DIR/$tfile
21594 $TRUNCATE $DIR/$tfile 1234
21595 check_som_nodata $DIR/$tfile
21597 $TRUNCATE $DIR/$tfile 4097
21598 check_som_nodata $DIR/$file
21600 run_test 809 "Verify no SOM xattr store for DoM-only files"
21606 # t10 seem to dislike partial pages
21607 lctl set_param osc.*.checksum_type=adler
21608 lctl set_param fail_loc=0x411
21609 dd if=/dev/urandom of=$DIR/$tfile bs=10240 count=2
21610 ORIG=$(md5sum $DIR/$tfile)
21611 lctl set_param ldlm.namespaces.*osc*.lru_size=clear
21612 CSUM=$(md5sum $DIR/$tfile)
21613 set_checksum_type adler
21614 if [ "$ORIG" != "$CSUM" ]; then
21615 error "$ORIG != $CSUM"
21618 run_test 810 "partial page writes on ZFS (LU-11663)"
21621 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
21622 skip "Need MDS version at least 2.11.56"
21624 #define OBD_FAIL_MDS_ORPHAN_DELETE 0x165
21625 do_facet mds1 $LCTL set_param fail_loc=0x165
21626 $MULTIOP $DIR/$tfile Ouc || error "multiop failed"
21629 start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
21632 [[ $(do_facet mds1 pgrep orph_.*-MDD | wc -l) -eq 0 ]] ||
21633 error "MDD orphan cleanup thread not quit"
21635 run_test 811 "orphan name stub can be cleaned up in startup"
21638 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
21639 skip "OST < 2.12.51 doesn't support this fail_loc"
21640 [ "$SHARED_KEY" = true ] &&
21641 skip "OSC connections never go IDLE with Shared-Keys enabled"
21643 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21644 # ensure ost1 is connected
21645 stat $DIR/$tfile >/dev/null || error "can't stat"
21646 wait_osc_import_state client ost1 FULL
21647 # no locks, no reqs to let the connection idle
21648 cancel_lru_locks osc
21650 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
21651 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
21652 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
21653 wait_osc_import_state client ost1 CONNECTING
21654 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
21656 stat $DIR/$tfile >/dev/null || error "can't stat file"
21658 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
21661 local file_heat_sav=$($LCTL get_param -n llite.*.file_heat 2>/dev/null)
21662 [ -z "$file_heat_sav" ] && skip "no file heat support"
21673 local period_second=$($LCTL get_param -n llite.*.heat_period_second)
21674 local decay_pct=$($LCTL get_param -n llite.*.heat_decay_percentage)
21676 $LCTL set_param -n llite.*.file_heat=1
21677 echo "Turn on file heat"
21678 echo "Period second: $period_second, Decay percentage: $decay_pct"
21680 echo "QQQQ" > $DIR/$tfile
21681 echo "QQQQ" > $DIR/$tfile
21682 echo "QQQQ" > $DIR/$tfile
21683 cat $DIR/$tfile > /dev/null
21684 cat $DIR/$tfile > /dev/null
21685 cat $DIR/$tfile > /dev/null
21686 cat $DIR/$tfile > /dev/null
21688 local out=$($LFS heat_get $DIR/$tfile)
21690 $LFS heat_get $DIR/$tfile
21691 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
21692 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
21693 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
21694 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
21696 [ $readsample -le 4 ] || error "read sample ($readsample) is wrong"
21697 [ $writesample -le 3 ] || error "write sample ($writesample) is wrong"
21698 [ $readbyte -le 20 ] || error "read bytes ($readbyte) is wrong"
21699 [ $writebyte -le 15 ] || error "write bytes ($writebyte) is wrong"
21701 sleep $((period_second + 3))
21702 echo "Sleep $((period_second + 3)) seconds..."
21703 # The recursion formula to calculate the heat of the file f is as
21705 # Hi+1(f) = (1-P)*Hi(f)+ P*Ci
21706 # Where Hi is the heat value in the period between time points i*I and
21707 # (i+1)*I; Ci is the access count in the period; the symbol P refers
21708 # to the weight of Ci.
21709 out=$($LFS heat_get $DIR/$tfile)
21710 $LFS heat_get $DIR/$tfile
21711 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
21712 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
21713 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
21714 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
21716 [ $(bc <<< "$readsample <= 4 * $decay_pct / 100") -eq 1 ] ||
21717 error "read sample ($readsample) is wrong"
21718 [ $(bc <<< "$writesample <= 3 * $decay_pct / 100") -eq 1 ] ||
21719 error "write sample ($writesample) is wrong"
21720 [ $(bc <<< "$readbyte <= 20 * $decay_pct / 100") -eq 1 ] ||
21721 error "read bytes ($readbyte) is wrong"
21722 [ $(bc <<< "$writebyte <= 15 * $decay_pct / 100") -eq 1 ] ||
21723 error "write bytes ($writebyte) is wrong"
21725 echo "QQQQ" > $DIR/$tfile
21726 echo "QQQQ" > $DIR/$tfile
21727 echo "QQQQ" > $DIR/$tfile
21728 cat $DIR/$tfile > /dev/null
21729 cat $DIR/$tfile > /dev/null
21730 cat $DIR/$tfile > /dev/null
21731 cat $DIR/$tfile > /dev/null
21733 sleep $((period_second + 3))
21734 echo "Sleep $((period_second + 3)) seconds..."
21736 out=$($LFS heat_get $DIR/$tfile)
21737 $LFS heat_get $DIR/$tfile
21738 readsample1=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
21739 writesample1=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
21740 readbyte1=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
21741 writebyte1=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
21743 [ $(bc <<< "$readsample1 <= ($readsample * (100 - $decay_pct) + \
21744 4 * $decay_pct) / 100") -eq 1 ] ||
21745 error "read sample ($readsample1) is wrong"
21746 [ $(bc <<< "$writesample1 <= ($writesample * (100 - $decay_pct) + \
21747 3 * $decay_pct) / 100") -eq 1 ] ||
21748 error "write sample ($writesample1) is wrong"
21749 [ $(bc <<< "$readbyte1 <= ($readbyte * (100 - $decay_pct) + \
21750 20 * $decay_pct) / 100") -eq 1 ] ||
21751 error "read bytes ($readbyte1) is wrong"
21752 [ $(bc <<< "$writebyte1 <= ($writebyte * (100 - $decay_pct) + \
21753 15 * $decay_pct) / 100") -eq 1 ] ||
21754 error "write bytes ($writebyte1) is wrong"
21756 echo "Turn off file heat for the file $DIR/$tfile"
21757 $LFS heat_set -o $DIR/$tfile
21759 echo "QQQQ" > $DIR/$tfile
21760 echo "QQQQ" > $DIR/$tfile
21761 echo "QQQQ" > $DIR/$tfile
21762 cat $DIR/$tfile > /dev/null
21763 cat $DIR/$tfile > /dev/null
21764 cat $DIR/$tfile > /dev/null
21765 cat $DIR/$tfile > /dev/null
21767 out=$($LFS heat_get $DIR/$tfile)
21768 $LFS heat_get $DIR/$tfile
21769 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
21770 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
21771 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
21772 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
21774 [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong"
21775 [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong"
21776 [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong"
21777 [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong"
21779 echo "Trun on file heat for the file $DIR/$tfile"
21780 $LFS heat_set -O $DIR/$tfile
21782 echo "QQQQ" > $DIR/$tfile
21783 echo "QQQQ" > $DIR/$tfile
21784 echo "QQQQ" > $DIR/$tfile
21785 cat $DIR/$tfile > /dev/null
21786 cat $DIR/$tfile > /dev/null
21787 cat $DIR/$tfile > /dev/null
21788 cat $DIR/$tfile > /dev/null
21790 out=$($LFS heat_get $DIR/$tfile)
21791 $LFS heat_get $DIR/$tfile
21792 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
21793 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
21794 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
21795 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
21797 [ $readsample -gt 0 ] || error "read sample ($readsample) is wrong"
21798 [ $writesample -gt 0 ] || error "write sample ($writesample) is wrong"
21799 [ $readbyte -gt 0 ] || error "read bytes ($readbyte) is wrong"
21800 [ $writebyte -gt 0 ] || error "write bytes ($writebyte) is wrong"
21802 $LFS heat_set -c $DIR/$tfile
21803 $LCTL set_param -n llite.*.file_heat=0
21804 echo "Turn off file heat support for the Lustre filesystem"
21806 echo "QQQQ" > $DIR/$tfile
21807 echo "QQQQ" > $DIR/$tfile
21808 echo "QQQQ" > $DIR/$tfile
21809 cat $DIR/$tfile > /dev/null
21810 cat $DIR/$tfile > /dev/null
21811 cat $DIR/$tfile > /dev/null
21812 cat $DIR/$tfile > /dev/null
21814 out=$($LFS heat_get $DIR/$tfile)
21815 $LFS heat_get $DIR/$tfile
21816 readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
21817 writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
21818 readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
21819 writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
21821 [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong"
21822 [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong"
21823 [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong"
21824 [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong"
21826 $LCTL set_param -n llite.*.file_heat=$file_heat_sav
21829 run_test 813 "File heat verfication"
21833 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
21834 echo -n y >> $DIR/$tfile
21835 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
21836 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
21838 run_test 814 "sparse cp works as expected (LU-12361)"
21842 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
21843 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
21845 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
21848 [ "$SHARED_KEY" = true ] &&
21849 skip "OSC connections never go IDLE with Shared-Keys enabled"
21851 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21852 # ensure ost1 is connected
21853 stat $DIR/$tfile >/dev/null || error "can't stat"
21854 wait_osc_import_state client ost1 FULL
21855 # no locks, no reqs to let the connection idle
21856 cancel_lru_locks osc
21857 lru_resize_disable osc
21860 before=$($LCTL get_param -n \
21861 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21863 wait_osc_import_state client ost1 IDLE
21864 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
21865 now=$($LCTL get_param -n \
21866 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21867 [ $before == $now ] || error "lru_size changed $before != $now"
21869 run_test 816 "do not reset lru_resize on idle reconnect"
21873 exportfs -u localhost:$DIR/nfsexp
21878 systemctl restart nfs-server.service || skip "failed to restart nfsd"
21880 mkdir -p $DIR/nfsexp
21881 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
21882 error "failed to export nfs"
21884 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
21885 stack_trap cleanup_817 EXIT
21887 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
21888 error "failed to mount nfs to $tmpdir"
21890 cp /bin/true $tmpdir
21891 $DIR/nfsexp/true || error "failed to execute 'true' command"
21893 run_test 817 "nfsd won't cache write lock for exec file"
21897 $LFS setstripe -c1 -i0 $DIR/$tfile
21898 $LFS setstripe -c1 -i1 $DIR/$tfile
21900 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
21901 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
21902 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
21903 error "start $SINGLEMDS failed"
21906 run_test 818 "unlink with failed llog"
21909 # tests that do cleanup/setup should be run at the end
21913 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21916 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
21917 $LCTL set_param fail_loc=0x903
21919 cancel_lru_locks MGC
21921 FAIL_ON_ERROR=true cleanup
21922 FAIL_ON_ERROR=true setup
21924 run_test 900 "umount should not race with any mgc requeue thread"
21927 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
21928 check_and_cleanup_lustre
21929 if [ "$I_MOUNTED" != "yes" ]; then
21930 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true