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"
16 CREATETEST=${CREATETEST:-createtest}
17 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
18 OPENFILE=${OPENFILE:-openfile}
19 OPENUNLINK=${OPENUNLINK:-openunlink}
20 READS=${READS:-"reads"}
21 MUNLINK=${MUNLINK:-munlink}
22 SOCKETSERVER=${SOCKETSERVER:-socketserver}
23 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
24 MEMHOG=${MEMHOG:-memhog}
25 DIRECTIO=${DIRECTIO:-directio}
26 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
28 CHECK_GRANT=${CHECK_GRANT:-"yes"}
29 GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
30 export PARALLEL=${PARALLEL:-"no"}
33 LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
34 LUSTRE=${LUSTRE:-$(dirname $0)/..}
35 . $LUSTRE/tests/test-framework.sh
40 ALWAYS_EXCEPT="$SANITY_EXCEPT "
41 # bug number for skipped test: LU-9693 LU-6493 LU-9693 LU-11058
42 ALWAYS_EXCEPT+=" 42a 42b 42c 77k"
43 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
45 # skipped tests: LU-8411 LU-9096 LU-9054 ..
46 ALWAYS_EXCEPT=" 407 253 312 $ALWAYS_EXCEPT"
49 # bug number for skipped tests: LU-9795 (all below)
50 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 17n 60a 133g 300f"
53 if [[ $(uname -m) = aarch64 ]]; then
54 # bug number: LU-11596 (all below)
55 ALWAYS_EXCEPT+=" 42d 42e 63a 63b 64a 64b 64c"
56 # bug number: LU-11671 LU-11665 LU-11594 LU-11667 LU-11729
57 ALWAYS_EXCEPT+=" 45 101c 103a 317 810"
60 # skip nfs tests on kernels >= 4.14.0 until they are fixed
61 if [ $LINUX_VERSION_CODE -ge $(version_code 4.14.0) ]; then
62 # bug number: LU-12661
66 # skip cgroup tests on RHEL8.1 kernels until they are fixed
67 if (( $LINUX_VERSION_CODE >= $(version_code 4.18.0) &&
68 $LINUX_VERSION_CODE < $(version_code 5.4.0) )); then
69 # bug number: LU-13063
74 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
76 if [ "$mds1_FSTYPE" = "zfs" ]; then
77 # bug number for skipped test:
78 ALWAYS_EXCEPT="$ALWAYS_EXCEPT "
80 [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
83 # Get the SLES distro version
85 # Returns a version string that should only be used in comparing
86 # strings returned by version_code()
89 local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2)
91 # All SuSE Linux versions have one decimal. version_code expects two
92 local sles_version=$version.0
93 version_code $sles_version
96 # Check if we are running on Ubuntu or SLES so we can make decisions on
98 if [ -r /etc/SuSE-release ]; then
99 sles_version=$(sles_version_code)
100 [ $sles_version -lt $(version_code 11.4.0) ] &&
101 # bug number for skipped test: LU-4341
102 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170"
103 [ $sles_version -lt $(version_code 12.0.0) ] &&
104 # bug number for skipped test: LU-3703
105 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234"
106 elif [ -r /etc/os-release ]; then
107 if grep -qi ubuntu /etc/os-release; then
108 ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
109 -e 's/^VERSION=//p' \
113 if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
114 # bug number for skipped test:
116 ALWAYS_EXCEPT+=" 103a 410"
126 pgrep ll_sa > /dev/null && { echo "There are ll_sa thread not exit!"; exit 20; }
127 cleanupall ${FORCE} $* || { echo "FAILed to clean up"; exit 20; }
136 check_swap_layouts_support()
138 $LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
139 skip "Does not support layout lock."
142 check_and_setup_lustre
146 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
148 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
149 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
150 rm -rf $DIR/[Rdfs][0-9]*
152 # $RUNAS_ID may get set incorrectly somewhere else
153 [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] &&
154 error "\$RUNAS_ID set to 0, but \$UID is also 0!"
156 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
158 if [ "${ONLY}" = "MOUNT" ] ; then
159 echo "Lustre is up, please go on"
163 echo "preparing for tests involving mounts"
164 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
166 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
167 echo # add a newline after mke2fs.
171 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
172 lctl set_param debug=-1 2> /dev/null || true
175 $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
177 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
179 run_test 0a "touch; rm ====================="
182 chmod 0755 $DIR || error "chmod 0755 $DIR failed"
183 $CHECKSTAT -p 0755 $DIR || error "$DIR permission is not 0755"
185 run_test 0b "chmod 0755 $DIR ============================="
188 $LCTL get_param mdc.*.import | grep "state: FULL" ||
189 error "import not FULL"
190 $LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" ||
193 run_test 0c "check import proc"
195 test_0d() { # LU-3397
196 [ $MGS_VERSION -lt $(version_code 2.10.57) ] &&
197 skip "proc exports not supported before 2.10.57"
199 local mgs_exp="mgs.MGS.exports"
200 local client_uuid=$($LCTL get_param -n mgc.*.uuid)
202 local exp_client_version
205 local temp_imp=$DIR/$tfile.import
206 local temp_exp=$DIR/$tfile.export
208 # save mgc import file to $temp_imp
209 $LCTL get_param mgc.*.import | tee $temp_imp
210 # Check if client uuid is found in MGS export
211 for exp_client_nid in $(do_facet mgs $LCTL get_param -N $mgs_exp.*); do
212 [ $(do_facet mgs $LCTL get_param -n $exp_client_nid.uuid) == \
216 # save mgs export file to $temp_exp
217 do_facet mgs $LCTL get_param $exp_client_nid.export | tee $temp_exp
219 # Compare the value of field "connect_flags"
220 imp_val=$(grep "connect_flags" $temp_imp)
221 exp_val=$(grep "connect_flags" $temp_exp)
222 [ "$exp_val" == "$imp_val" ] ||
223 error "export flags '$exp_val' != import flags '$imp_val'"
225 # Compare the value of client version
226 exp_client_version=$(awk '/target_version:/ { print $2 }' $temp_exp)
227 exp_val=$(version_code $exp_client_version)
228 imp_val=$CLIENT_VERSION
229 [ "$exp_val" == "$imp_val" ] ||
230 error "export client version '$exp_val' != '$imp_val'"
232 run_test 0d "check export proc ============================="
235 test_mkdir $DIR/$tdir
236 test_mkdir $DIR/$tdir/d2
237 mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
238 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir"
241 $CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed"
243 run_test 1 "mkdir; remkdir; rmdir"
246 test_mkdir $DIR/$tdir
247 touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed"
248 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
250 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed"
252 run_test 2 "mkdir; touch; rmdir; check file"
255 test_mkdir $DIR/$tdir
256 $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
257 touch $DIR/$tdir/$tfile
258 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
260 $CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed"
262 run_test 3 "mkdir; touch; rmdir; check dir"
264 # LU-4471 - failed rmdir on remote directories still removes directory on MDT0
266 test_mkdir -i 1 $DIR/$tdir
268 touch $DIR/$tdir/$tfile ||
269 error "Create file under remote directory failed"
272 error "Expect error removing in-use dir $DIR/$tdir"
274 test -d $DIR/$tdir || error "Remote directory disappeared"
276 rm -rf $DIR/$tdir || error "remove remote dir error"
278 run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
281 test_mkdir $DIR/$tdir
282 test_mkdir $DIR/$tdir/d2
283 chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed"
284 $CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707"
285 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
287 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2"
290 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
291 chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
292 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
293 error "$tfile does not have perm 0666 or UID $UID"
294 $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
295 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
296 error "$tfile should be 0666 and owned by UID $UID"
298 run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
301 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
304 chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
305 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
306 error "$tfile should be owned by UID $RUNAS_ID"
307 $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
308 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
309 error "$tfile should be owned by UID $RUNAS_ID"
311 run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
314 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
317 chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
318 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
319 error "$tfile should be owned by GID $UID"
320 $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
321 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
322 error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
324 run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)"
327 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
329 test_mkdir $DIR/$tdir
330 chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed"
331 $RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
332 chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed"
333 test_mkdir $DIR/$tdir/d/subdir
334 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir ||
335 error "$tdir/d/subdir should be GID $RUNAS_GID"
336 if [[ $MDSCOUNT -gt 1 ]]; then
337 # check remote dir sgid inherite
338 $LFS mkdir -i 0 $DIR/$tdir.local ||
339 error "mkdir $tdir.local failed"
340 chmod g+s $DIR/$tdir.local ||
341 error "chmod $tdir.local failed"
342 chgrp $RUNAS_GID $DIR/$tdir.local ||
343 error "chgrp $tdir.local failed"
344 $LFS mkdir -i 1 $DIR/$tdir.local/$tdir.remote ||
345 error "mkdir $tdir.remote failed"
346 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir.local/$tdir.remote ||
347 error "$tdir.remote should be owned by $UID.$RUNAS_ID"
348 $CHECKSTAT -p 02755 $DIR/$tdir.local/$tdir.remote ||
349 error "$tdir.remote should be mode 02755"
352 run_test 6g "verify new dir in sgid dir inherits group"
354 test_6h() { # bug 7331
355 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
357 touch $DIR/$tfile || error "touch failed"
358 chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile || error "initial chown failed"
359 $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/$tfile &&
360 error "chown $RUNAS_ID:0 $tfile worked as GID $RUNAS_GID"
361 $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile ||
362 error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID"
364 run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)"
367 test_mkdir $DIR/$tdir
368 $MCREATE $DIR/$tdir/$tfile
369 chmod 0666 $DIR/$tdir/$tfile
370 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
371 error "$tdir/$tfile should be mode 0666"
373 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
376 if [ ! -d $DIR/$tdir ]; then
377 test_mkdir $DIR/$tdir
379 $MCREATE $DIR/$tdir/$tfile
380 echo -n foo > $DIR/$tdir/$tfile
381 [ "$(cat $DIR/$tdir/$tfile)" = "foo" ] || error "$tdir/$tfile not 'foo'"
382 $CHECKSTAT -t file -s 3 $DIR/$tdir/$tfile || error "$tfile size not 3"
384 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
387 test_mkdir $DIR/$tdir
388 touch $DIR/$tdir/$tfile
389 chmod 0666 $DIR/$tdir/$tfile
390 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
391 error "$tfile mode not 0666"
393 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
396 test_mkdir $DIR/$tdir
397 test_mkdir $DIR/$tdir/d2
398 test_mkdir $DIR/$tdir/d2/d3
399 $CHECKSTAT -t dir $DIR/$tdir/d2/d3 || error "$tdir/d2/d3 not a dir"
401 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
404 test_mkdir $DIR/$tdir
405 test_mkdir $DIR/$tdir/d2
406 touch $DIR/$tdir/d2/$tfile
407 $CHECKSTAT -t file $DIR/$tdir/d2/$tfile ||
408 error "$tdir/d2/$tfile not a file"
410 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
413 test_mkdir $DIR/$tdir
414 test_mkdir $DIR/$tdir/d2
415 chmod 0666 $DIR/$tdir/d2
416 chmod 0705 $DIR/$tdir/d2
417 $CHECKSTAT -t dir -p 0705 $DIR/$tdir/d2 ||
418 error "$tdir/d2 mode not 0705"
420 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
423 test_mkdir $DIR/$tdir
424 touch $DIR/$tdir/$tfile
425 chmod 0666 $DIR/$tdir/$tfile
426 chmod 0654 $DIR/$tdir/$tfile
427 $CHECKSTAT -t file -p 0654 $DIR/$tdir/$tfile ||
428 error "$tdir/d2 mode not 0654"
430 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
433 test_mkdir $DIR/$tdir
434 dd if=/dev/zero of=$DIR/$tdir/$tfile count=10
436 $CHECKSTAT -t file -s 0 $DIR/$tdir/$tfile ||
437 error "$tdir/$tfile size not 0 after truncate"
439 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
442 test_mkdir $DIR/$tdir
443 touch $DIR/$tdir/$tfile
445 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
447 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
450 test_mkdir $DIR/$tdir
451 touch $DIR/$tdir/$tfile
452 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
453 $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
454 error "$tdir/${tfile_2} not a file after rename"
455 rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
457 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
460 test_mkdir $DIR/$tdir
461 touch $DIR/$tdir/$tfile
462 rm -rf $DIR/$tdir/$tfile
463 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
465 run_test 16 "touch .../d16/f; rm -rf .../d16/f"
468 test_mkdir $DIR/$tdir
469 touch $DIR/$tdir/$tfile
470 ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist
472 $CHECKSTAT -l $DIR/$tdir/$tfile $DIR/$tdir/l-exist ||
473 error "$tdir/l-exist not a symlink"
474 $CHECKSTAT -f -t f $DIR/$tdir/l-exist ||
475 error "$tdir/l-exist not referencing a file"
476 rm -f $DIR/$tdir/l-exist
477 $CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed"
479 run_test 17a "symlinks: create, remove (real)"
482 test_mkdir $DIR/$tdir
483 ln -s no-such-file $DIR/$tdir/l-dangle
485 $CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle ||
486 error "$tdir/l-dangle not referencing no-such-file"
487 $CHECKSTAT -fa $DIR/$tdir/l-dangle ||
488 error "$tdir/l-dangle not referencing non-existent file"
489 rm -f $DIR/$tdir/l-dangle
490 $CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed"
492 run_test 17b "symlinks: create, remove (dangling)"
494 test_17c() { # bug 3440 - don't save failed open RPC for replay
495 test_mkdir $DIR/$tdir
496 ln -s foo $DIR/$tdir/$tfile
497 cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true
499 run_test 17c "symlinks: open dangling (should return error)"
502 test_mkdir $DIR/$tdir
503 ln -s foo $DIR/$tdir/$tfile
504 touch $DIR/$tdir/$tfile || error "creating to new symlink"
506 run_test 17d "symlinks: create dangling"
509 test_mkdir $DIR/$tdir
510 local foo=$DIR/$tdir/$tfile
511 ln -s $foo $foo || error "create symlink failed"
512 ls -l $foo || error "ls -l failed"
513 ls $foo && error "ls not failed" || true
515 run_test 17e "symlinks: create recursive symlink (should return error)"
518 test_mkdir $DIR/$tdir
519 ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
520 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
521 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
522 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
523 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
524 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
527 run_test 17f "symlinks: long and very long symlink name"
529 # str_repeat(S, N) generate a string that is string S repeated N times
534 while [ $((n -= 1)) -ge 0 ]; do
540 # Long symlinks and LU-2241
542 test_mkdir $DIR/$tdir
543 local TESTS="59 60 61 4094 4095"
545 # Fix for inode size boundary in 2.1.4
546 [ $MDS1_VERSION -lt $(version_code 2.1.4) ] &&
549 # Patch not applied to 2.2 or 2.3 branches
550 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
551 [ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
554 # skip long symlink name for rhel6.5.
555 # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
556 grep -q '6.5' /etc/redhat-release &>/dev/null &&
557 TESTS="59 60 61 4062 4063"
560 local SYMNAME=$(str_repeat 'x' $i)
561 ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
562 readlink $DIR/$tdir/f$i || error "failed $i-char readlink"
565 run_test 17g "symlinks: really long symlink name and inode boundaries"
567 test_17h() { #bug 17378
568 [ $PARALLEL == "yes" ] && skip "skip parallel run"
569 remote_mds_nodsh && skip "remote MDS with nodsh"
573 test_mkdir $DIR/$tdir
574 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
575 $LFS setstripe -c -1 $DIR/$tdir
576 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
577 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
578 touch $DIR/$tdir/$tfile || true
580 run_test 17h "create objects: lov_free_memmd() doesn't lbug"
582 test_17i() { #bug 20018
583 [ $PARALLEL == "yes" ] && skip "skip parallel run"
584 remote_mds_nodsh && skip "remote MDS with nodsh"
586 local foo=$DIR/$tdir/$tfile
589 test_mkdir -c1 $DIR/$tdir
590 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
591 ln -s $foo $foo || error "create symlink failed"
592 #define OBD_FAIL_MDS_READLINK_EPROTO 0x143
593 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000143
594 ls -l $foo && error "error not detected"
597 run_test 17i "don't panic on short symlink (should return error)"
599 test_17k() { #bug 22301
600 [ $PARALLEL == "yes" ] && skip "skip parallel run"
601 [[ -z "$(which rsync 2>/dev/null)" ]] &&
602 skip "no rsync command"
603 rsync --help | grep -q xattr ||
604 skip_env "$(rsync --version | head -n1) does not support xattrs"
605 test_mkdir $DIR/$tdir
606 test_mkdir $DIR/$tdir.new
607 touch $DIR/$tdir/$tfile
608 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
609 rsync -av -X $DIR/$tdir/ $DIR/$tdir.new ||
610 error "rsync failed with xattrs enabled"
612 run_test 17k "symlinks: rsync with xattrs enabled"
614 test_17l() { # LU-279
615 [[ -z "$(which getfattr 2>/dev/null)" ]] &&
616 skip "no getfattr command"
618 test_mkdir $DIR/$tdir
619 touch $DIR/$tdir/$tfile
620 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
621 for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
622 # -h to not follow symlinks. -m '' to list all the xattrs.
623 # grep to remove first line: '# file: $path'.
624 for xattr in `getfattr -hm '' $path 2>/dev/null | grep -v '^#'`;
626 lgetxattr_size_check $path $xattr ||
627 error "lgetxattr_size_check $path $xattr failed"
631 run_test 17l "Ensure lgetxattr's returned xattr size is consistent"
635 [ $PARALLEL == "yes" ] && skip "skip parallel run"
636 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
637 remote_mds_nodsh && skip "remote MDS with nodsh"
638 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
639 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
640 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
642 local short_sym="0123456789"
643 local wdir=$DIR/$tdir
648 # create a long symlink file
649 for ((i = 0; i < 4; ++i)); do
650 long_sym=${long_sym}${long_sym}
653 echo "create 512 short and long symlink files under $wdir"
654 for ((i = 0; i < 256; ++i)); do
655 ln -sf ${long_sym}"a5a5" $wdir/long-$i
656 ln -sf ${short_sym}"a5a5" $wdir/short-$i
662 wait_delete_completed
664 echo "recreate the 512 symlink files with a shorter string"
665 for ((i = 0; i < 512; ++i)); do
666 # rewrite the symlink file with a shorter string
667 ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed"
668 ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed"
671 local mds_index=$(($($LFS getstripe -m $wdir) + 1))
672 local devname=$(mdsdevname $mds_index)
674 echo "stop and checking mds${mds_index}:"
675 # e2fsck should not return error
677 run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
680 start mds${mds_index} $devname $MDS_MOUNT_OPTS ||
681 error "start mds${mds_index} failed"
682 df $MOUNT > /dev/null 2>&1
684 error "e2fsck detected error for short/long symlink: rc=$rc"
687 run_test 17m "run e2fsck against MDT which contains short/long symlink"
689 check_fs_consistency_17n() {
693 # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
694 # so it only check MDT1/MDT2 instead of all of MDTs.
695 for mdt_index in 1 2; do
696 local devname=$(mdsdevname $mdt_index)
697 # e2fsck should not return error
699 run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
702 start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
703 error "mount mds$mdt_index failed"
704 df $MOUNT > /dev/null 2>&1
710 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
711 [ $PARALLEL == "yes" ] && skip "skip parallel run"
712 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
713 remote_mds_nodsh && skip "remote MDS with nodsh"
714 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
715 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
716 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
720 test_mkdir $DIR/$tdir
721 for ((i=0; i<10; i++)); do
722 $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
723 error "create remote dir error $i"
724 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
725 error "create files under remote dir failed $i"
728 check_fs_consistency_17n ||
729 error "e2fsck report error after create files under remote dir"
731 for ((i = 0; i < 10; i++)); do
732 rm -rf $DIR/$tdir/remote_dir_${i} ||
733 error "destroy remote dir error $i"
736 check_fs_consistency_17n ||
737 error "e2fsck report error after unlink files under remote dir"
739 [ $MDS1_VERSION -lt $(version_code 2.4.50) ] &&
740 skip "lustre < 2.4.50 does not support migrate mv"
742 for ((i = 0; i < 10; i++)); do
743 mkdir -p $DIR/$tdir/remote_dir_${i}
744 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
745 error "create files under remote dir failed $i"
746 $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
747 error "migrate remote dir error $i"
749 check_fs_consistency_17n || error "e2fsck report error after migration"
751 for ((i = 0; i < 10; i++)); do
752 rm -rf $DIR/$tdir/remote_dir_${i} ||
753 error "destroy remote dir error $i"
756 check_fs_consistency_17n || error "e2fsck report error after unlink"
758 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
761 remote_mds_nodsh && skip "remote MDS with nodsh"
762 [ $MDS1_VERSION -lt $(version_code 2.3.64) ] &&
763 skip "Need MDS version at least 2.3.64"
765 local wdir=$DIR/${tdir}o
771 mdt_index=$($LFS getstripe -m $wdir/$tfile)
772 mdt_index=$((mdt_index + 1))
775 #fail mds will wait the failover finish then set
776 #following fail_loc to avoid interfer the recovery process.
779 #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
780 do_facet mds${mdt_index} lctl set_param fail_loc=0x194
781 ls -l $wdir/$tfile && rc=1
782 do_facet mds${mdt_index} lctl set_param fail_loc=0
783 [[ $rc -eq 0 ]] || error "stat file should fail"
785 run_test 17o "stat file with incompat LMA feature"
788 touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
789 ls $DIR || error "Failed to ls $DIR: $?"
791 run_test 18 "touch .../f ; ls ... =============================="
797 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
799 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
802 ls -l $DIR/$tfile && error "ls -l $tfile failed"|| true
804 run_test 19b "ls -l .../f19 (should return error) =============="
807 [ $RUNAS_ID -eq $UID ] &&
808 skip_env "RUNAS_ID = UID = $UID -- skipping"
810 $RUNAS touch $DIR/$tfile && error "create non-root file failed" || true
812 run_test 19c "$RUNAS touch .../f19 (should return error) =="
815 cat $DIR/f19 && error || true
817 run_test 19d "cat .../f19 (should return error) =============="
826 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
828 run_test 20 "touch .../f ; ls -l ..."
831 test_mkdir $DIR/$tdir
832 [ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle
833 ln -s dangle $DIR/$tdir/link
834 echo foo >> $DIR/$tdir/link
835 cat $DIR/$tdir/dangle
836 $CHECKSTAT -t link $DIR/$tdir/link || error "$tdir/link not a link"
837 $CHECKSTAT -f -t file $DIR/$tdir/link ||
838 error "$tdir/link not linked to a file"
840 run_test 21 "write to dangling link"
843 local wdir=$DIR/$tdir
845 chown $RUNAS_ID:$RUNAS_GID $wdir
846 (cd $wdir || error "cd $wdir failed";
847 $RUNAS tar cf - /etc/hosts /etc/sysconfig/network |
849 ls -lR $wdir/etc || error "ls -lR $wdir/etc failed"
850 $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed"
851 $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc ||
852 error "checkstat -u failed"
854 run_test 22 "unpack tar archive as non-root user"
858 test_mkdir $DIR/$tdir
859 local file=$DIR/$tdir/$tfile
861 openfile -f O_CREAT:O_EXCL $file || error "$file create failed"
862 openfile -f O_CREAT:O_EXCL $file &&
863 error "$file recreate succeeded" || true
865 run_test 23a "O_CREAT|O_EXCL in subdir"
867 test_23b() { # bug 18988
868 test_mkdir $DIR/$tdir
869 local file=$DIR/$tdir/$tfile
872 echo foo > $file || error "write filed"
873 echo bar >> $file || error "append filed"
874 $CHECKSTAT -s 8 $file || error "wrong size"
877 run_test 23b "O_APPEND check"
879 # LU-9409, size with O_APPEND and tiny writes
881 local file=$DIR/$tfile
884 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800
885 $CHECKSTAT -s 6400 $file || error "wrong size, expected 6400"
889 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
890 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
892 $CHECKSTAT -s 12800 $file || error "wrong size, expected 12800"
895 #racing tiny & normal writes
896 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4096 count=4 &
897 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=100 &
899 $CHECKSTAT -s 17184 $file || error "wrong size, expected 17184"
902 #racing tiny & normal writes 2, ugly numbers
903 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4099 count=11 &
904 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=17 count=173 &
906 $CHECKSTAT -s 48030 $file || error "wrong size, expected 48030"
909 run_test 23c "O_APPEND size checks for tiny writes"
911 # LU-11069 file offset is correct after appending writes
913 local file=$DIR/$tfile
916 echo CentaurHauls > $file
917 offset=$($MULTIOP $file oO_WRONLY:O_APPEND:w13Zp)
918 if ((offset != 26)); then
919 error "wrong offset, expected 26, got '$offset'"
922 run_test 23d "file offset is correct after appending writes"
926 echo '-- same directory rename'
927 test_mkdir $DIR/$tdir
928 touch $DIR/$tdir/$tfile.1
929 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
930 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
932 run_test 24a "rename file to non-existent target"
935 test_mkdir $DIR/$tdir
936 touch $DIR/$tdir/$tfile.{1,2}
937 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
938 $CHECKSTAT -a $DIR/$tdir/$tfile.1 || error "$tfile.1 exists"
939 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
941 run_test 24b "rename file to existing target"
944 test_mkdir $DIR/$tdir
945 test_mkdir $DIR/$tdir/d$testnum.1
946 mv $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
947 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
948 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
950 run_test 24c "rename directory to non-existent target"
953 test_mkdir -c1 $DIR/$tdir
954 test_mkdir -c1 $DIR/$tdir/d$testnum.1
955 test_mkdir -c1 $DIR/$tdir/d$testnum.2
956 mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
957 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
958 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
960 run_test 24d "rename directory to existing target"
963 echo '-- cross directory renames --'
967 mv $DIR/R5a/f $DIR/R5b/g
968 $CHECKSTAT -a $DIR/R5a/f || error "$DIR/R5a/f exists"
969 $CHECKSTAT -t file $DIR/R5b/g || error "$DIR/R5b/g not file type"
971 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
976 touch $DIR/R6a/f $DIR/R6b/g
977 mv $DIR/R6a/f $DIR/R6b/g
978 $CHECKSTAT -a $DIR/R6a/f || error "$DIR/R6a/f exists"
979 $CHECKSTAT -t file $DIR/R6b/g || error "$DIR/R6b/g not file type"
981 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
986 test_mkdir $DIR/R7a/d
987 mv $DIR/R7a/d $DIR/R7b/e
988 $CHECKSTAT -a $DIR/R7a/d || error "$DIR/R7a/d exists"
989 $CHECKSTAT -t dir $DIR/R7b/e || error "$DIR/R7b/e not dir type"
991 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
994 test_mkdir -c1 $DIR/R8a
995 test_mkdir -c1 $DIR/R8b
996 test_mkdir -c1 $DIR/R8a/d
997 test_mkdir -c1 $DIR/R8b/e
998 mrename $DIR/R8a/d $DIR/R8b/e
999 $CHECKSTAT -a $DIR/R8a/d || error "$DIR/R8a/d exists"
1000 $CHECKSTAT -t dir $DIR/R8b/e || error "$DIR/R8b/e not dir type"
1002 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
1005 echo "-- rename error cases"
1007 test_mkdir $DIR/R9/a
1009 mrename $DIR/R9/f $DIR/R9/a
1010 $CHECKSTAT -t file $DIR/R9/f || error "$DIR/R9/f not file type"
1011 $CHECKSTAT -t dir $DIR/R9/a || error "$DIR/R9/a not dir type"
1012 $CHECKSTAT -a $DIR/R9/a/f || error "$DIR/R9/a/f exists"
1014 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
1018 mrename $DIR/R10/f $DIR/R10/g
1019 $CHECKSTAT -t dir $DIR/R10 || error "$DIR/R10 not dir type"
1020 $CHECKSTAT -a $DIR/R10/f || error "$DIR/R10/f exists"
1021 $CHECKSTAT -a $DIR/R10/g || error "$DIR/R10/g exists"
1023 run_test 24j "source does not exist ============================"
1026 test_mkdir $DIR/R11a
1027 test_mkdir $DIR/R11a/d
1029 mv $DIR/R11a/f $DIR/R11a/d
1030 $CHECKSTAT -a $DIR/R11a/f || error "$DIR/R11a/f exists"
1031 $CHECKSTAT -t file $DIR/R11a/d/f || error "$DIR/R11a/d/f not file type"
1033 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
1035 # bug 2429 - rename foo foo foo creates invalid file
1038 $MULTIOP $f OcNs || error "rename of ${f} to itself failed"
1040 run_test 24l "Renaming a file to itself ========================"
1044 $MULTIOP $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
1045 # on ext3 this does not remove either the source or target files
1046 # though the "expected" operation would be to remove the source
1047 $CHECKSTAT -t file ${f} || error "${f} missing"
1048 $CHECKSTAT -t file ${f}2 || error "${f}2 missing"
1050 run_test 24m "Renaming a file to a hard link to itself ========="
1054 # this stats the old file after it was renamed, so it should fail
1056 $CHECKSTAT ${f} || error "${f} missing"
1058 $CHECKSTAT ${f}.rename || error "${f}.rename missing"
1059 $CHECKSTAT -a ${f} || error "${f} exists"
1061 run_test 24n "Statting the old file after renaming (Posix rename 2)"
1064 test_mkdir $DIR/$tdir
1065 rename_many -s random -v -n 10 $DIR/$tdir
1067 run_test 24o "rename of files during htree split"
1070 test_mkdir $DIR/R12a
1071 test_mkdir $DIR/R12b
1072 DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
1073 mrename $DIR/R12a $DIR/R12b
1074 $CHECKSTAT -a $DIR/R12a || error "$DIR/R12a exists"
1075 $CHECKSTAT -t dir $DIR/R12b || error "$DIR/R12b not dir type"
1076 DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
1077 [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
1079 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
1081 cleanup_multiop_pause() {
1083 kill -USR1 $MULTIPID
1087 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1089 test_mkdir $DIR/R13a
1090 test_mkdir $DIR/R13b
1091 local DIRINO=$(ls -lid $DIR/R13a | awk '{ print $1 }')
1092 multiop_bg_pause $DIR/R13b D_c || error "multiop failed to start"
1095 trap cleanup_multiop_pause EXIT
1096 mrename $DIR/R13a $DIR/R13b
1097 $CHECKSTAT -a $DIR/R13a || error "R13a still exists"
1098 $CHECKSTAT -t dir $DIR/R13b || error "R13b does not exist"
1099 local DIRINO2=$(ls -lid $DIR/R13b | awk '{ print $1 }')
1100 [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
1101 cleanup_multiop_pause
1102 wait $MULTIPID || error "multiop close failed"
1104 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
1106 test_24r() { #bug 3789
1107 test_mkdir $DIR/R14a
1108 test_mkdir $DIR/R14a/b
1109 mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
1110 $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
1111 $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
1113 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
1116 test_mkdir $DIR/R15a
1117 test_mkdir $DIR/R15a/b
1118 test_mkdir $DIR/R15a/b/c
1119 mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
1120 $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
1121 $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
1123 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
1125 test_mkdir $DIR/R16a
1126 test_mkdir $DIR/R16a/b
1127 test_mkdir $DIR/R16a/b/c
1128 mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
1129 $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
1130 $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
1132 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
1134 test_24u() { # bug12192
1135 $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error "multiop failed"
1136 $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
1138 run_test 24u "create stripe file"
1140 simple_cleanup_common() {
1143 [ -z "$DIR" -o -z "$tdir" ] && return 0
1145 local start=$SECONDS
1148 wait_delete_completed
1149 echo "cleanup time $((SECONDS - start))"
1153 max_pages_per_rpc() {
1154 local mdtname="$(printf "MDT%04x" ${1:-0})"
1155 $LCTL get_param -n mdc.*$mdtname*.max_pages_per_rpc
1159 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1161 local nrfiles=${COUNT:-100000}
1162 local fname="$DIR/$tdir/$tfile"
1164 # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
1165 [ "$mds1_FSTYPE" = "zfs" ] && nrfiles=${COUNT:-10000}
1167 test_mkdir "$(dirname $fname)"
1168 # assume MDT0000 has the fewest inodes
1169 local stripes=$($LFS getdirstripe -c $(dirname $fname))
1170 local free_inodes=$(($(mdt_free_inodes 0) * stripes))
1171 [[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
1173 trap simple_cleanup_common EXIT
1175 createmany -m "$fname" $nrfiles
1177 cancel_lru_locks mdc
1178 lctl set_param mdc.*.stats clear
1180 # was previously test_24D: LU-6101
1181 # readdir() returns correct number of entries after cursor reload
1182 local num_ls=$(ls $DIR/$tdir | wc -l)
1183 local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l)
1184 local num_all=$(ls -a $DIR/$tdir | wc -l)
1185 if [ $num_ls -ne $nrfiles -o $num_uniq -ne $nrfiles -o \
1186 $num_all -ne $((nrfiles + 2)) ]; then
1187 error "Expected $nrfiles files, got $num_ls " \
1188 "($num_uniq unique $num_all .&..)"
1190 # LU-5 large readdir
1191 # dirent_size = 32 bytes for sizeof(struct lu_dirent) +
1192 # N bytes for name (len($nrfiles) rounded to 8 bytes) +
1193 # 8 bytes for luda_type (4 bytes rounded to 8 bytes)
1194 # take into account of overhead in lu_dirpage header and end mark in
1195 # each page, plus one in rpc_num calculation.
1196 local dirent_size=$((32 + (${#tfile} | 7) + 1 + 8))
1197 local page_entries=$(((PAGE_SIZE - 24) / dirent_size))
1198 local mdt_idx=$($LFS getdirstripe -i $(dirname $fname))
1199 local rpc_pages=$(max_pages_per_rpc $mdt_idx)
1200 local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
1201 local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
1202 echo "readpages: $mds_readpage rpc_max: $rpc_max"
1203 (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
1204 error "large readdir doesn't take effect: " \
1205 "$mds_readpage should be about $rpc_max"
1207 simple_cleanup_common
1209 run_test 24v "list large directory (test hash collision, b=17560)"
1211 test_24w() { # bug21506
1213 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
1214 dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
1215 dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
1216 SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
1217 [[ "$SZ1" -eq "$SZ2" ]] ||
1218 error "Error reading at the end of the file $tfile"
1220 run_test 24w "Reading a file larger than 4Gb"
1223 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1224 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1225 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1226 skip "Need MDS version at least 2.7.56"
1229 local remote_dir=$DIR/$tdir/remote_dir
1231 test_mkdir $DIR/$tdir
1232 $LFS mkdir -i $MDTIDX $remote_dir ||
1233 error "create remote directory failed"
1235 test_mkdir $DIR/$tdir/src_dir
1236 touch $DIR/$tdir/src_file
1237 test_mkdir $remote_dir/tgt_dir
1238 touch $remote_dir/tgt_file
1240 mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
1241 error "rename dir cross MDT failed!"
1243 mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
1244 error "rename file cross MDT failed!"
1246 touch $DIR/$tdir/ln_file
1247 ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
1248 error "ln file cross MDT failed"
1250 rm -rf $DIR/$tdir || error "Can not delete directories"
1252 run_test 24x "cross MDT rename/link"
1255 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1256 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1258 local remote_dir=$DIR/$tdir/remote_dir
1261 test_mkdir $DIR/$tdir
1262 $LFS mkdir -i $mdtidx $remote_dir ||
1263 error "create remote directory failed"
1265 test_mkdir $remote_dir/src_dir
1266 touch $remote_dir/src_file
1267 test_mkdir $remote_dir/tgt_dir
1268 touch $remote_dir/tgt_file
1270 mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
1271 error "rename subdir in the same remote dir failed!"
1273 mrename $remote_dir/src_file $remote_dir/tgt_file ||
1274 error "rename files in the same remote dir failed!"
1276 ln $remote_dir/tgt_file $remote_dir/tgt_file1 ||
1277 error "link files in the same remote dir failed!"
1279 rm -rf $DIR/$tdir || error "Can not delete directories"
1281 run_test 24y "rename/link on the same dir should succeed"
1284 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1285 [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] &&
1286 skip "Need MDS version at least 2.12.51"
1290 for index in 0 1; do
1291 $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed"
1292 touch $DIR/$tdir.0/$tfile.$index || error "touch failed"
1295 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed"
1297 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0)
1298 [ $index -eq 0 ] || error "$tfile.0 is on MDT$index"
1300 local mdts=$(comma_list $(mdts_nodes))
1302 do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0
1303 stack_trap "do_nodes $mdts $LCTL \
1304 set_param mdt.*.enable_remote_rename=1" EXIT
1306 mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed"
1308 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1)
1309 [ $index -eq 1 ] || error "$tfile.1 is on MDT$index"
1311 run_test 24z "cross-MDT rename is done as cp"
1313 test_24A() { # LU-3182
1317 test_mkdir $DIR/$tdir
1318 trap simple_cleanup_common EXIT
1319 createmany -m $DIR/$tdir/$tfile $NFILES
1320 local t=$(ls $DIR/$tdir | wc -l)
1321 local u=$(ls $DIR/$tdir | sort -u | wc -l)
1322 local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
1323 if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then
1324 error "Expected $NFILES files, got $t ($u unique $v .&..)"
1327 simple_cleanup_common || error "Can not delete directories"
1329 run_test 24A "readdir() returns correct number of entries."
1331 test_24B() { # LU-4805
1332 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1336 test_mkdir $DIR/$tdir
1337 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
1338 error "create striped dir failed"
1340 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1341 [ $count -eq 2 ] || error "Expected 2, got $count"
1343 touch $DIR/$tdir/striped_dir/a
1345 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1346 [ $count -eq 3 ] || error "Expected 3, got $count"
1348 touch $DIR/$tdir/striped_dir/.f
1350 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1351 [ $count -eq 4 ] || error "Expected 4, got $count"
1353 rm -rf $DIR/$tdir || error "Can not delete directories"
1355 run_test 24B "readdir for striped dir return correct number of entries"
1358 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1364 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
1365 error "create striped dir failed"
1367 cd $DIR/$tdir/d0/striped_dir
1369 local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
1370 local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
1371 local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1373 [ "$d0_ino" = "$parent_ino" ] ||
1374 error ".. wrong, expect $d0_ino, get $parent_ino"
1376 mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
1377 error "mv striped dir failed"
1379 parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1381 [ "$d1_ino" = "$parent_ino" ] ||
1382 error ".. wrong after mv, expect $d1_ino, get $parent_ino"
1384 run_test 24C "check .. in striped dir"
1387 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
1388 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1391 mkdir $DIR/$tdir/src_dir
1392 $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
1393 error "create remote source failed"
1395 touch $DIR/$tdir/src_dir/src_child/a
1397 $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
1398 error "create remote target dir failed"
1400 $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
1401 error "create remote target child failed"
1403 mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
1404 error "rename dir cross MDT failed!"
1408 $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
1409 error "src_child still exists after rename"
1411 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
1412 error "missing file(a) after rename"
1414 rm -rf $DIR/$tdir || error "Can not delete directories"
1416 run_test 24E "cross MDT rename/link"
1419 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
1422 [ "$SLOW" = "no" ] && repeats=100
1426 echo "$repeats repeats"
1427 for ((i = 0; i < repeats; i++)); do
1428 $LFS mkdir -i0 -c2 $DIR/$tdir/test || error "mkdir fails"
1429 touch $DIR/$tdir/test/a || error "touch fails"
1430 mkdir $DIR/$tdir/test/b || error "mkdir fails"
1431 rm -rf $DIR/$tdir/test || error "rmdir fails"
1436 run_test 24F "hash order vs readdir (LU-11330)"
1439 echo '== symlink sanity ============================================='
1443 touch $DIR/s25/foo ||
1444 error "File creation in symlinked directory failed"
1446 run_test 25a "create file in symlinked directory ==============="
1449 [ ! -d $DIR/d25 ] && test_25a
1450 $CHECKSTAT -t file $DIR/s25/foo || error "$DIR/s25/foo not file type"
1452 run_test 25b "lookup file in symlinked directory ==============="
1456 test_mkdir $DIR/d26/d26-2
1457 ln -s d26/d26-2 $DIR/s26
1458 touch $DIR/s26/foo || error "File creation failed"
1460 run_test 26a "multiple component symlink ======================="
1463 test_mkdir -p $DIR/$tdir/d26-2
1464 ln -s $tdir/d26-2/foo $DIR/s26-2
1465 touch $DIR/s26-2 || error "File creation failed"
1467 run_test 26b "multiple component symlink at end of lookup ======"
1470 test_mkdir $DIR/d26.2
1471 touch $DIR/d26.2/foo
1472 ln -s d26.2 $DIR/s26.2-1
1473 ln -s s26.2-1 $DIR/s26.2-2
1474 ln -s s26.2-2 $DIR/s26.2-3
1475 chmod 0666 $DIR/s26.2-3/foo
1477 run_test 26c "chain of symlinks"
1479 # recursive symlinks (bug 439)
1481 ln -s d26-3/foo $DIR/d26-3
1483 run_test 26d "create multiple component recursive symlink"
1486 [ ! -h $DIR/d26-3 ] && test_26d
1489 run_test 26e "unlink multiple component recursive symlink"
1491 # recursive symlinks (bug 7022)
1493 test_mkdir $DIR/$tdir
1494 test_mkdir $DIR/$tdir/$tfile
1495 cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed"
1496 test_mkdir -p lndir/bar1
1497 test_mkdir $DIR/$tdir/$tfile/$tfile
1498 cd $tfile || error "cd $tfile failed"
1499 ln -s .. dotdot || error "ln dotdot failed"
1500 ln -s dotdot/lndir lndir || error "ln lndir failed"
1501 cd $DIR/$tdir || error "cd $DIR/$tdir failed"
1502 output=`ls $tfile/$tfile/lndir/bar1`
1503 [ "$output" = bar1 ] && error "unexpected output"
1504 rm -r $tfile || error "rm $tfile failed"
1505 $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
1507 run_test 26f "rm -r of a directory which has recursive symlink"
1510 test_mkdir $DIR/$tdir
1511 $LFS getstripe $DIR/$tdir
1512 $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed"
1513 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1514 cp /etc/hosts $DIR/$tdir/$tfile || error "Can't copy to one stripe file"
1516 run_test 27a "one stripe file"
1519 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1521 test_mkdir $DIR/$tdir
1522 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1523 $LFS getstripe -c $DIR/$tdir/$tfile
1524 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
1525 error "two-stripe file doesn't have two stripes"
1527 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1529 run_test 27b "create and write to two stripe file"
1532 test_mkdir $DIR/$tdir
1533 $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
1534 error "setstripe failed"
1535 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1536 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1538 run_test 27d "create file with default settings"
1541 # LU-5839 adds check for existed layout before setting it
1542 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1543 skip "Need MDS version at least 2.7.56"
1545 test_mkdir $DIR/$tdir
1546 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1547 $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice"
1548 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1550 run_test 27e "setstripe existing file (should return error)"
1553 test_mkdir $DIR/$tdir
1554 $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
1555 error "$SETSTRIPE $DIR/$tdir/$tfile failed"
1556 $CHECKSTAT -t file $DIR/$tdir/$tfile &&
1557 error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
1558 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1559 $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed"
1561 run_test 27f "setstripe with bad stripe size (should return error)"
1564 test_mkdir $DIR/$tdir
1565 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1566 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" ||
1567 error "$DIR/$tdir/$tfile has object"
1569 run_test 27g "$LFS getstripe with no objects"
1572 test_mkdir $DIR/$tdir
1573 touch $DIR/$tdir/$tfile || error "touch failed"
1574 ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed"
1575 $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2
1577 (( rc == 2 )) || error "getstripe did not return ENOENT"
1579 run_test 27ga "$LFS getstripe with missing file (should return error)"
1582 test_mkdir $DIR/$tdir
1583 touch $DIR/$tdir/$tfile || error "touch failed"
1584 [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] ||
1585 error "missing objects"
1587 run_test 27i "$LFS getstripe with some objects"
1590 test_mkdir $DIR/$tdir
1591 $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile &&
1592 error "setstripe failed" || true
1594 run_test 27j "setstripe with bad stripe offset (should return error)"
1596 test_27k() { # bug 2844
1597 test_mkdir $DIR/$tdir
1598 local file=$DIR/$tdir/$tfile
1599 local ll_max_blksize=$((4 * 1024 * 1024))
1600 $LFS setstripe -S 67108864 $file || error "setstripe failed"
1601 local blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1602 [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize"
1603 dd if=/dev/zero of=$file bs=4k count=1
1604 blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1605 [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize"
1607 run_test 27k "limit i_blksize for broken user apps"
1610 mcreate $DIR/$tfile || error "creating file"
1611 $RUNAS $LFS setstripe -c 1 $DIR/$tfile &&
1612 error "setstripe should have failed" || true
1614 run_test 27l "check setstripe permissions (should return error)"
1617 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1619 ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
1621 if [[ $ORIGFREE -gt $MAXFREE ]]; then
1622 skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
1624 trap simple_cleanup_common EXIT
1625 test_mkdir $DIR/$tdir
1626 $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
1627 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
1628 error "dd should fill OST0"
1630 while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do
1632 [ $i -gt 256 ] && break
1635 touch $DIR/$tdir/$tfile.$i
1636 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1637 awk '{print $1}'| grep -w "0") ] &&
1638 error "OST0 was full but new created file still use it"
1640 touch $DIR/$tdir/$tfile.$i
1641 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1642 awk '{print $1}'| grep -w "0") ] &&
1643 error "OST0 was full but new created file still use it"
1644 simple_cleanup_common
1646 run_test 27m "create file while OST0 was full"
1649 local delay=$(do_facet $SINGLEMDS lctl get_param -n lo[vd].*.qos_maxage |
1650 awk '{ print $1 * 2; exit; }')
1654 # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage)
1655 # if the OST isn't full anymore.
1657 local OSTIDX=${1:-""}
1659 local list=$(comma_list $(osts_nodes))
1660 [ "$OSTIDX" ] && list=$(facet_host ost$((OSTIDX + 1)))
1662 do_nodes $list lctl set_param fail_loc=0
1663 sync # initiate all OST_DESTROYs from MDS to OST
1667 exhaust_precreations() {
1670 local FAILIDX=${3:-$OSTIDX}
1671 local ofacet=ost$((OSTIDX + 1))
1673 test_mkdir -p -c1 $DIR/$tdir
1674 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
1675 local mfacet=mds$((mdtidx + 1))
1676 echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
1678 local OST=$(ostname_from_index $OSTIDX)
1681 local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST)
1682 local last_id=$(do_facet $mfacet lctl get_param -n \
1683 osp.$mdtosc_proc1.prealloc_last_id)
1684 local next_id=$(do_facet $mfacet lctl get_param -n \
1685 osp.$mdtosc_proc1.prealloc_next_id)
1687 local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet)
1688 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1690 test_mkdir -p $DIR/$tdir/${OST}
1691 $SETSTRIPE -i $OSTIDX -c 1 $DIR/$tdir/${OST}
1692 #define OBD_FAIL_OST_ENOSPC 0x215
1693 do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215
1694 echo "Creating to objid $last_id on ost $OST..."
1695 createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
1696 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1697 do_facet $ofacet lctl set_param fail_loc=$FAILLOC
1701 exhaust_all_precreations() {
1703 for (( i=0; i < OSTCOUNT; i++ )) ; do
1704 exhaust_precreations $i $1 -1
1709 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1710 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1711 remote_mds_nodsh && skip "remote MDS with nodsh"
1712 remote_ost_nodsh && skip "remote OST with nodsh"
1715 rm -f $DIR/$tdir/$tfile
1716 exhaust_precreations 0 0x80000215
1717 $LFS setstripe -c -1 $DIR/$tdir || error "setstripe failed"
1718 touch $DIR/$tdir/$tfile || error "touch failed"
1719 $LFS getstripe $DIR/$tdir/$tfile
1722 run_test 27n "create file with some full OSTs"
1725 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1726 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1727 remote_mds_nodsh && skip "remote MDS with nodsh"
1728 remote_ost_nodsh && skip "remote OST with nodsh"
1731 rm -f $DIR/$tdir/$tfile
1732 exhaust_all_precreations 0x215
1734 touch $DIR/$tdir/$tfile && error "able to create $DIR/$tdir/$tfile"
1739 run_test 27o "create file with all full OSTs (should error)"
1741 function create_and_checktime() {
1746 for ((i=0; i < $loops; i++)); do
1747 local start=$SECONDS
1748 multiop $fname-$i Oc
1749 ((SECONDS-start < TIMEOUT)) ||
1750 error "creation took " $((SECONDS-$start)) && return 1
1755 local mdts=$(comma_list $(mdts_nodes))
1757 [ $MDS1_VERSION -lt $(version_code 2.12.6) ] &&
1758 skip "Need MDS version at least 2.12.6"
1760 local f0=$DIR/${tfile}-0
1761 local f1=$DIR/${tfile}-1
1763 wait_delete_completed
1765 # refill precreated objects
1766 $LFS setstripe -i0 -c1 $f0
1768 saved=$(do_facet mds1 $LCTL get_param -n lov.*0000*.qos_threshold_rr)
1769 # force QoS allocation policy
1770 do_nodes $mdts $LCTL set_param lov.*.qos_threshold_rr=0%
1771 stack_trap "do_nodes $mdts $LCTL set_param \
1772 lov.*.qos_threshold_rr=$saved" EXIT
1775 # one OST is unavailable, but still have few objects preallocated
1777 stack_trap "start ost1 $(ostdevname 1) $OST_MOUNT_OPTS; \
1778 rm -rf $f1 $DIR/$tdir*" EXIT
1780 for ((i=0; i < 7; i++)); do
1781 mkdir $DIR/$tdir$i || error "can't create dir"
1782 $LFS setstripe -c$((OSTCOUNT-1)) $DIR/$tdir$i ||
1783 error "can't set striping"
1785 for ((i=0; i < 7; i++)); do
1786 create_and_checktime $DIR/$tdir$i/$tfile 100 &
1790 run_test 27oo "don't let few threads to reserve too many objects"
1793 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1794 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1795 remote_mds_nodsh && skip "remote MDS with nodsh"
1796 remote_ost_nodsh && skip "remote OST with nodsh"
1799 rm -f $DIR/$tdir/$tfile
1800 test_mkdir $DIR/$tdir
1802 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1803 $TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed"
1804 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1806 exhaust_precreations 0 0x80000215
1807 echo foo >> $DIR/$tdir/$tfile || error "append failed"
1808 $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed"
1809 $LFS getstripe $DIR/$tdir/$tfile
1813 run_test 27p "append to a truncated 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
1824 test_mkdir $DIR/$tdir
1825 $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
1826 $TRUNCATE $DIR/$tdir/$tfile 80000000 ||
1827 error "truncate $DIR/$tdir/$tfile failed"
1828 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1830 exhaust_all_precreations 0x215
1832 echo foo >> $DIR/$tdir/$tfile && error "append succeeded"
1833 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat 2 failed"
1837 run_test 27q "append to truncated file with all OSTs full (should error)"
1840 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1841 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1842 remote_mds_nodsh && skip "remote MDS with nodsh"
1843 remote_ost_nodsh && skip "remote OST with nodsh"
1846 rm -f $DIR/$tdir/$tfile
1847 exhaust_precreations 0 0x80000215
1849 $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1853 run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
1855 test_27s() { # bug 10725
1856 test_mkdir $DIR/$tdir
1857 local stripe_size=$((4096 * 1024 * 1024)) # 2^32
1858 local stripe_count=0
1859 [ $OSTCOUNT -eq 1 ] || stripe_count=2
1860 $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir &&
1861 error "stripe width >= 2^32 succeeded" || true
1864 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
1866 test_27t() { # bug 10864
1871 $WLFS getstripe $tfile
1874 run_test 27t "check that utils parse path correctly"
1876 test_27u() { # bug 4900
1877 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1878 remote_mds_nodsh && skip "remote MDS with nodsh"
1881 local list=$(comma_list $(mdts_nodes))
1883 #define OBD_FAIL_MDS_OSC_PRECREATE 0x139
1884 do_nodes $list $LCTL set_param fail_loc=0x139
1885 test_mkdir -p $DIR/$tdir
1886 trap simple_cleanup_common EXIT
1887 createmany -o $DIR/$tdir/t- 1000
1888 do_nodes $list $LCTL set_param fail_loc=0
1890 TLOG=$TMP/$tfile.getstripe
1891 $LFS getstripe $DIR/$tdir > $TLOG
1892 OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
1893 unlinkmany $DIR/$tdir/t- 1000
1895 [[ $OBJS -gt 0 ]] &&
1896 error "$OBJS objects created on OST-0. See $TLOG" ||
1899 run_test 27u "skip object creation on OSC w/o objects"
1901 test_27v() { # bug 4900
1902 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1903 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1904 remote_mds_nodsh && skip "remote MDS with nodsh"
1905 remote_ost_nodsh && skip "remote OST with nodsh"
1907 exhaust_all_precreations 0x215
1910 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
1912 touch $DIR/$tdir/$tfile
1913 #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
1915 for (( i=1; i < OSTCOUNT; i++ )); do
1916 do_facet ost$i lctl set_param fail_loc=0x705
1918 local START=`date +%s`
1919 createmany -o $DIR/$tdir/$tfile 32
1921 local FINISH=`date +%s`
1922 local TIMEOUT=`lctl get_param -n timeout`
1923 local PROCESS=$((FINISH - START))
1924 [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
1925 error "$FINISH - $START >= $TIMEOUT / 2"
1926 sleep $((TIMEOUT / 2 - PROCESS))
1929 run_test 27v "skip object creation on slow OST"
1931 test_27w() { # bug 10997
1932 test_mkdir $DIR/$tdir
1933 $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
1934 [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
1935 error "stripe size $size != 65536" || true
1936 [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
1937 error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
1939 run_test 27w "check $LFS setstripe -S and getstrip -d options"
1942 [[ $OSTCOUNT -lt 2 ]] &&
1943 skip_env "skipping multiple stripe count/offset test"
1945 test_mkdir $DIR/$tdir
1946 for i in $(seq 1 $OSTCOUNT); do
1948 $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i ||
1949 error "setstripe -c $i -i $offset failed"
1950 count=$($LFS getstripe -c $DIR/$tdir/f$i)
1951 index=$($LFS getstripe -i $DIR/$tdir/f$i)
1952 [ $count -ne $i ] && error "stripe count $count != $i" || true
1953 [ $index -ne $offset ] &&
1954 error "stripe offset $index != $offset" || true
1957 run_test 27wa "check $LFS setstripe -c -i options"
1960 remote_ost_nodsh && skip "remote OST with nodsh"
1961 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1962 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1964 OFFSET=$(($OSTCOUNT - 1))
1966 local OST=$(ostname_from_index $OSTIDX)
1968 test_mkdir $DIR/$tdir
1969 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file
1970 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1
1972 createmany -o $DIR/$tdir/$tfile $OSTCOUNT
1973 for i in $(seq 0 $OFFSET); do
1974 [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx |
1975 awk '{print $1}' | grep -w "$OSTIDX") ] &&
1976 error "OST0 was degraded but new created file still use it"
1978 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0
1980 run_test 27x "create files while OST0 is degraded"
1983 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1984 remote_mds_nodsh && skip "remote MDS with nodsh"
1985 remote_ost_nodsh && skip "remote OST with nodsh"
1986 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1988 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
1989 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
1990 osp.$mdtosc.prealloc_last_id)
1991 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
1992 osp.$mdtosc.prealloc_next_id)
1993 local fcount=$((last_id - next_id))
1994 [[ $fcount -eq 0 ]] && skip "not enough space on OST0"
1995 [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
1997 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
1998 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
1999 local OST_DEACTIVE_IDX=-1
2004 for OSC in $MDS_OSCS; do
2005 OST=$(osc_to_ost $OSC)
2006 OSTIDX=$(index_from_ostuuid $OST)
2007 if [ $OST_DEACTIVE_IDX == -1 ]; then
2008 OST_DEACTIVE_IDX=$OSTIDX
2010 if [ $OSTIDX != $OST_DEACTIVE_IDX ]; then
2011 echo $OSC "is Deactivated:"
2012 do_facet $SINGLEMDS lctl --device %$OSC deactivate
2016 OSTIDX=$(index_from_ostuuid $OST)
2017 test_mkdir $DIR/$tdir
2018 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
2020 for OSC in $MDS_OSCS; do
2021 OST=$(osc_to_ost $OSC)
2022 OSTIDX=$(index_from_ostuuid $OST)
2023 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
2024 echo $OST "is degraded:"
2025 do_facet ost$((OSTIDX+1)) lctl set_param -n \
2026 obdfilter.$OST.degraded=1
2031 createmany -o $DIR/$tdir/$tfile $fcount
2033 for OSC in $MDS_OSCS; do
2034 OST=$(osc_to_ost $OSC)
2035 OSTIDX=$(index_from_ostuuid $OST)
2036 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
2037 echo $OST "is recovered from degraded:"
2038 do_facet ost$((OSTIDX+1)) lctl set_param -n \
2039 obdfilter.$OST.degraded=0
2041 do_facet $SINGLEMDS lctl --device %$OSC activate
2045 # all osp devices get activated, hence -1 stripe count restored
2046 local stripe_count=0
2048 # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp
2049 # devices get activated.
2051 $LFS setstripe -c -1 $DIR/$tfile
2052 stripe_count=$($LFS getstripe -c $DIR/$tfile)
2054 [ $stripe_count -ne $OSTCOUNT ] &&
2055 error "Of $OSTCOUNT OSTs, only $stripe_count is available"
2058 run_test 27y "create files while OST0 is degraded and the rest inactive"
2064 lmm_count=$($GETSTRIPE -c $1)
2065 lmm_seq=$($GETSTRIPE -v $1 | awk '/lmm_seq/ { print $2 }')
2066 lmm_oid=$($GETSTRIPE -v $1 | awk '/lmm_object_id/ { print $2 }')
2068 local old_ifs="$IFS"
2070 fid=($($LFS path2fid $1))
2073 log "FID seq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}"
2074 log "LOV seq $lmm_seq, oid $lmm_oid, count: $lmm_count"
2076 # compare lmm_seq and lu_fid->f_seq
2077 [ $lmm_seq = ${fid[1]} ] || { error "SEQ mismatch"; return 1; }
2078 # compare lmm_object_id and lu_fid->oid
2079 [ $lmm_oid = ${fid[2]} ] || { error "OID mismatch"; return 2; }
2081 # check the trusted.fid attribute of the OST objects of the file
2082 local have_obdidx=false
2084 $GETSTRIPE $1 | while read obdidx oid hex seq; do
2085 # skip lines up to and including "obdidx"
2086 [ -z "$obdidx" ] && break
2087 [ "$obdidx" = "obdidx" ] && have_obdidx=true && continue
2088 $have_obdidx || continue
2090 local ost=$((obdidx + 1))
2091 local dev=$(ostdevname $ost)
2094 log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
2096 seq=$(echo $seq | sed -e "s/^0x//g")
2097 if [ $seq == 0 ] || [ $(facet_fstype ost$ost) == zfs ]; then
2098 oid_hex=$(echo $oid)
2100 oid_hex=$(echo $hex | sed -e "s/^0x//g")
2102 local obj_file="O/$seq/d$((oid %32))/$oid_hex"
2106 # Don't unmount/remount the OSTs if we don't need to do that.
2107 # LU-2577 changes filter_fid to be smaller, so debugfs needs
2108 # update too, until that use mount/ll_decode_filter_fid/mount.
2109 # Re-enable when debugfs will understand new filter_fid.
2111 if [ $(facet_fstype ost$ost) == ldiskfs ]; then
2112 ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
2113 $dev 2>/dev/null" | grep "parent=")
2115 if [ -z "$ff" ]; then
2117 mount_fstype ost$ost
2118 ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
2119 $(facet_mntpt ost$ost)/$obj_file)
2120 unmount_fstype ost$ost
2121 start ost$ost $dev $OST_MOUNT_OPTS
2125 [ -z "$ff" ] && error "$obj_file: no filter_fid info"
2127 echo "$ff" | sed -e 's#.*objid=#got: objid=#'
2129 # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
2130 # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
2132 # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \
2133 # stripe_size=1048576 component_id=1 component_start=0 \
2134 # component_end=33554432
2135 local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff)
2136 local ff_pseq=$(cut -d: -f1 <<<$ff_parent)
2137 local ff_poid=$(cut -d: -f2 <<<$ff_parent)
2139 if grep -q 'stripe=' <<<$ff; then
2140 ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff)
2142 # $LL_DECODE_FILTER_FID does not print "stripe="; look
2143 # into f_ver in this case. See comment on ff_parent.
2144 ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//')
2147 # compare lmm_seq and filter_fid->ff_parent.f_seq
2148 [ $ff_pseq = $lmm_seq ] ||
2149 error "FF parent SEQ $ff_pseq != $lmm_seq"
2150 # compare lmm_object_id and filter_fid->ff_parent.f_oid
2151 [ $ff_poid = $lmm_oid ] ||
2152 error "FF parent OID $ff_poid != $lmm_oid"
2153 (($ff_pstripe == $stripe_nr)) ||
2154 error "FF stripe $ff_pstripe != $stripe_nr"
2156 stripe_nr=$((stripe_nr + 1))
2157 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2159 if grep -q 'stripe_count=' <<<$ff; then
2160 local ff_scnt=$(sed -e 's/.*stripe_count=//' \
2161 -e 's/ .*//' <<<$ff)
2162 [ $lmm_count = $ff_scnt ] ||
2163 error "FF stripe count $lmm_count != $ff_scnt"
2169 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2170 remote_ost_nodsh && skip "remote OST with nodsh"
2172 test_mkdir $DIR/$tdir
2173 $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
2174 { error "setstripe -c -1 failed"; return 1; }
2175 # We need to send a write to every object to get parent FID info set.
2176 # This _should_ also work for setattr, but does not currently.
2177 # touch $DIR/$tdir/$tfile-1 ||
2178 dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
2179 { error "dd $tfile-1 failed"; return 2; }
2180 $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
2181 { error "setstripe -c -1 failed"; return 3; }
2182 dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
2183 { error "dd $tfile-2 failed"; return 4; }
2185 # make sure write RPCs have been sent to OSTs
2188 check_seq_oid $DIR/$tdir/$tfile-1 || return 5
2189 check_seq_oid $DIR/$tdir/$tfile-2 || return 6
2191 run_test 27z "check SEQ/OID on the MDT and OST filesystems"
2193 test_27A() { # b=19102
2194 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2196 save_layout_restore_at_exit $MOUNT
2197 $LFS setstripe -c 0 -i -1 -S 0 $MOUNT
2198 wait_update $HOSTNAME "$GETSTRIPE -c $MOUNT | sed 's/ *//g'" "1" 20 ||
2199 error "stripe count $($GETSTRIPE -c $MOUNT) != 1"
2200 local default_size=$($GETSTRIPE -S $MOUNT)
2201 local default_offset=$($GETSTRIPE -i $MOUNT)
2202 local dsize=$(do_facet $SINGLEMDS \
2203 "$LCTL get_param -n lod.$(facet_svc $SINGLEMDS)*.stripesize")
2204 [ $default_size -eq $dsize ] ||
2205 error "stripe size $default_size != $dsize"
2206 [ $default_offset -eq -1 ] ||
2207 error "stripe offset $default_offset != -1"
2209 run_test 27A "check filesystem-wide default LOV EA values"
2211 test_27B() { # LU-2523
2212 test_mkdir $DIR/$tdir
2213 rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
2215 # open f1 with O_LOV_DELAY_CREATE
2217 # call setstripe ioctl on open file descriptor for f1
2219 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:nB1c \
2223 # open f1 with O_LOV_DELAY_CREATE
2225 # call setstripe ioctl on open file descriptor for f1
2227 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:uB1c
2229 # Allow multiop to fail in imitation of NFS's busted semantics.
2232 run_test 27B "call setstripe on open unlinked file/rename victim"
2234 test_27C() { #LU-2871
2235 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2243 test_mkdir $DIR/$tdir
2245 for i in $(seq 0 $((OSTCOUNT - 1))); do
2246 # set stripe across all OSTs starting from OST$i
2247 $SETSTRIPE -i $i -c -1 $tfile$i
2248 # get striping information
2249 ost_idx=($($GETSTRIPE $tfile$i |
2250 tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
2254 [ ${#ost_idx[@]} -eq $OSTCOUNT ] ||
2255 error "${#ost_idx[@]} != $OSTCOUNT"
2257 for index in $(seq 0 $((OSTCOUNT - 1))); do
2259 for j in $(echo ${ost_idx[@]}); do
2260 if [ $index -eq $j ]; then
2266 error "Can not find $index in ${ost_idx[@]}"
2270 run_test 27C "check full striping across all OSTs"
2273 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2274 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2275 remote_mds_nodsh && skip "remote MDS with nodsh"
2277 local POOL=${POOL:-testpool}
2279 local last_ost=$(($OSTCOUNT - 1))
2281 local ost_list=$(seq $first_ost $ost_step $last_ost)
2282 local ost_range="$first_ost $last_ost $ost_step"
2284 test_mkdir $DIR/$tdir
2285 pool_add $POOL || error "pool_add failed"
2286 pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
2289 [ $MDS1_VERSION -lt $(version_code 2.8.55) ] &&
2291 [ $MDS1_VERSION -lt $(version_code 2.9.55) -o \
2292 $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2293 skip27D+=" -s 30,31"
2294 llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
2295 error "llapi_layout_test failed"
2297 destroy_test_pools || error "destroy test pools failed"
2299 run_test 27D "validate llapi_layout API"
2301 # Verify that default_easize is increased from its initial value after
2302 # accessing a widely striped file.
2304 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2305 [ $CLIENT_VERSION -lt $(version_code 2.5.57) ] &&
2306 skip "client does not have LU-3338 fix"
2308 # 72 bytes is the minimum space required to store striping
2309 # information for a file striped across one OST:
2310 # (sizeof(struct lov_user_md_v3) +
2311 # sizeof(struct lov_user_ost_data_v1))
2313 $LCTL set_param -n llite.*.default_easize $min_easize ||
2314 error "lctl set_param failed"
2315 local easize=$($LCTL get_param -n llite.*.default_easize)
2317 [ $easize -eq $min_easize ] ||
2318 error "failed to set default_easize"
2320 $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
2321 error "setstripe failed"
2325 easize=$($LCTL get_param -n llite.*.default_easize)
2327 [ $easize -gt $min_easize ] ||
2328 error "default_easize not updated"
2330 run_test 27E "check that default extended attribute size properly increases"
2332 test_27F() { # LU-5346/LU-7975
2333 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2334 [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs"
2335 [[ $MDS1_VERSION -lt $(version_code 2.8.51) ]] &&
2336 skip "Need MDS version at least 2.8.51"
2337 remote_ost_nodsh && skip "remote OST with nodsh"
2339 test_mkdir $DIR/$tdir
2341 $SETSTRIPE -c 2 $DIR/$tdir
2343 # stop all OSTs to reproduce situation for LU-7975 ticket
2344 for num in $(seq $OSTCOUNT); do
2348 # open/create f0 with O_LOV_DELAY_CREATE
2349 # truncate f0 to a non-0 size
2351 multiop $DIR/$tdir/f0 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T1050000c
2353 $CHECKSTAT -s 1050000 $DIR/$tdir/f0 || error "checkstat failed"
2354 # open/write it again to force delayed layout creation
2355 cat /etc/hosts > $DIR/$tdir/f0 &
2359 for num in $(seq $OSTCOUNT); do
2360 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS ||
2361 error "ost$num failed to start"
2364 wait $catpid || error "cat failed"
2366 cmp /etc/hosts $DIR/$tdir/f0 || error "cmp failed"
2367 [[ $($GETSTRIPE -c $DIR/$tdir/f0) == 2 ]] || error "wrong stripecount"
2370 run_test 27F "Client resend delayed layout creation with non-zero size"
2372 test_27G() { #LU-10629
2373 [ $MDS1_VERSION -lt $(version_code 2.11.51) ] &&
2374 skip "Need MDS version at least 2.11.51"
2375 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2376 remote_mds_nodsh && skip "remote MDS with nodsh"
2377 local POOL=${POOL:-testpool}
2378 local ostrange="0 0 1"
2380 test_mkdir $DIR/$tdir
2381 pool_add $POOL || error "pool_add failed"
2382 pool_add_targets $POOL $ostrange || error "pool_add_targets failed"
2383 $LFS setstripe -p $POOL $DIR/$tdir
2385 local pool=$($LFS getstripe -p $DIR/$tdir)
2387 [ "$pool" = "$POOL" ] || error "Striping failed got '$pool' not '$POOL'"
2389 $LFS setstripe -d $DIR/$tdir
2391 pool=$($LFS getstripe -p $DIR/$tdir)
2395 [ -z "$pool" ] || error "'$pool' is not empty"
2397 run_test 27G "Clear OST pool from stripe"
2400 [[ $MDS1_VERSION -le $(version_code 2.11.54) ]] &&
2401 skip "Need MDS version newer than 2.11.54"
2402 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
2403 test_mkdir $DIR/$tdir
2404 $LFS setstripe -o 0 -o 2 $DIR/$tdir || error "setstripe failed"
2405 touch $DIR/$tdir/$tfile
2406 $LFS getstripe -c $DIR/$tdir/$tfile
2407 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
2408 error "two-stripe file doesn't have two stripes"
2410 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
2411 $LFS getstripe -y $DIR/$tdir/$tfile
2412 (( $($LFS getstripe -y $DIR/$tdir/$tfile |
2413 egrep -c "l_ost_idx: [02]$") == "2" )) ||
2414 error "expected l_ost_idx: [02]$ not matched"
2416 # make sure ost list have been cleared
2417 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
2418 $LFS setstripe -S $((stripesize * 4)) -i 1 \
2419 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
2421 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
2423 run_test 27H "Set specific OSTs stripe"
2426 [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.12.57) ]] &&
2427 skip "Need MDS version >= than 2.12.57"
2428 remote_mds_nodsh && skip "remote MDS with nodsh"
2429 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2431 test_mkdir $DIR/$tdir
2433 # Set default striping on directory
2434 $LFS setstripe -C 4 $DIR/$tdir
2436 echo 1 > $DIR/$tdir/${tfile}.1
2437 local count=$($LFS getstripe -c $DIR/$tdir/${tfile}.1)
2439 [ $count -eq $setcount ] ||
2440 error "(1) stripe count $count, should be $setcount"
2442 # Capture existing append_stripe_count setting for restore
2443 local orig_count=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_stripe_count)
2444 local mdts=$(comma_list $(mdts_nodes))
2445 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=$orig_count" EXIT
2447 local appendcount=$orig_count
2448 echo 1 >> $DIR/$tdir/${tfile}.2_append
2449 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.2_append)
2450 [ $count -eq $appendcount ] ||
2451 error "(2)stripe count $count, should be $appendcount for append"
2453 # Disable O_APPEND striping, verify it works
2454 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2456 # Should now get the default striping, which is 4
2458 echo 1 >> $DIR/$tdir/${tfile}.3_append
2459 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.3_append)
2460 [ $count -eq $setcount ] ||
2461 error "(3) stripe count $count, should be $setcount"
2463 # Try changing the stripe count for append files
2464 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=2
2466 # Append striping is now 2 (directory default is still 4)
2468 echo 1 >> $DIR/$tdir/${tfile}.4_append
2469 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.4_append)
2470 [ $count -eq $appendcount ] ||
2471 error "(4) stripe count $count, should be $appendcount for append"
2473 # Test append stripe count of -1
2474 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=-1
2475 appendcount=$OSTCOUNT
2476 echo 1 >> $DIR/$tdir/${tfile}.5
2477 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.5)
2478 [ $count -eq $appendcount ] ||
2479 error "(5) stripe count $count, should be $appendcount for append"
2481 # Set append striping back to default of 1
2482 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=1
2484 # Try a new default striping, PFL + DOM
2485 $LFS setstripe -L mdt -E 1M -E -1 -c 2 $DIR/$tdir
2487 # Create normal DOM file, DOM returns stripe count == 0
2489 touch $DIR/$tdir/${tfile}.6
2490 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.6)
2491 [ $count -eq $setcount ] ||
2492 error "(6) stripe count $count, should be $setcount"
2496 echo 1 >> $DIR/$tdir/${tfile}.7_append
2497 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.7_append)
2498 [ $count -eq $appendcount ] ||
2499 error "(7) stripe count $count, should be $appendcount for append"
2501 # Clean up DOM layout
2502 $LFS setstripe -d $DIR/$tdir
2504 # Now test that append striping works when layout is from root
2505 $LFS setstripe -c 2 $MOUNT
2506 # Make a special directory for this
2507 mkdir $DIR/${tdir}/${tdir}.2
2508 stack_trap "$LFS setstripe -d $MOUNT" EXIT
2510 # Verify for normal file
2512 echo 1 > $DIR/${tdir}/${tdir}.2/${tfile}.8
2513 count=$($LFS getstripe -c $DIR/$tdir/${tdir}.2/${tfile}.8)
2514 [ $count -eq $setcount ] ||
2515 error "(8) stripe count $count, should be $setcount"
2518 echo 1 >> $DIR/${tdir}/${tdir}.2/${tfile}.9_append
2519 count=$($LFS getstripe -c $DIR/${tdir}/${tdir}.2/${tfile}.9_append)
2520 [ $count -eq $appendcount ] ||
2521 error "(9) stripe count $count, should be $appendcount for append"
2523 # Now test O_APPEND striping with pools
2524 do_nodes $mdts $LCTL set_param mdd.*.append_pool="$TESTNAME"
2525 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'" EXIT
2528 pool_add $TESTNAME || error "pool creation failed"
2529 pool_add_targets $TESTNAME 0 1 || error "Pool add targets failed"
2531 echo 1 >> $DIR/$tdir/${tfile}.10_append
2533 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.10_append)
2534 [ "$pool" = "$TESTNAME" ] || error "(10) incorrect pool: $pool"
2536 # Check that count is still correct
2538 echo 1 >> $DIR/$tdir/${tfile}.11_append
2539 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.11_append)
2540 [ $count -eq $appendcount ] ||
2541 error "(11) stripe count $count, should be $appendcount for append"
2543 # Disable O_APPEND stripe count, verify pool works separately
2544 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2546 echo 1 >> $DIR/$tdir/${tfile}.12_append
2548 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.12_append)
2549 [ "$pool" = "$TESTNAME" ] || error "(12) incorrect pool: $pool"
2551 # Remove pool setting, verify it's not applied
2552 do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'
2554 echo 1 >> $DIR/$tdir/${tfile}.13_append
2556 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.13_append)
2557 [ "$pool" = "" ] || error "(13) pool found: $pool"
2559 run_test 27M "test O_APPEND striping"
2561 # createtest also checks that device nodes are created and
2562 # then visible correctly (#2091)
2563 test_28() { # bug 2091
2565 $CREATETEST $DIR/d28/ct || error "createtest failed"
2567 run_test 28 "create/mknod/mkdir with bad file types ============"
2570 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2572 sync; sleep 1; sync # flush out any dirty pages from previous tests
2579 declare -i LOCKCOUNTORIG=0
2580 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2581 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
2583 [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
2585 declare -i LOCKUNUSEDCOUNTORIG=0
2586 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2587 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
2594 declare -i LOCKCOUNTCURRENT=0
2595 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2596 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
2599 declare -i LOCKUNUSEDCOUNTCURRENT=0
2600 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2601 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
2604 if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
2605 $LCTL set_param -n ldlm.dump_namespaces ""
2606 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
2607 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2608 log "dumped log to $TMP/test_29.dk (bug 5793)"
2611 if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
2612 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
2613 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2614 log "dumped log to $TMP/test_29.dk (bug 5793)"
2618 run_test 29 "IT_GETATTR regression ============================"
2620 test_30a() { # was test_30
2621 cp $(which ls) $DIR || cp /bin/ls $DIR
2622 $DIR/ls / || error "Can't execute binary from lustre"
2625 run_test 30a "execute binary from Lustre (execve) =============="
2628 cp `which ls` $DIR || cp /bin/ls $DIR
2630 $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
2633 run_test 30b "execute binary from Lustre as non-root ==========="
2635 test_30c() { # b=22376
2636 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2638 cp `which ls` $DIR || cp /bin/ls $DIR
2640 cancel_lru_locks mdc
2641 cancel_lru_locks osc
2642 $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
2645 run_test 30c "execute binary from Lustre without read perms ===="
2648 $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
2649 $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
2651 run_test 31a "open-unlink file =================================="
2654 touch $DIR/f31 || error "touch $DIR/f31 failed"
2655 ln $DIR/f31 $DIR/f31b || error "ln failed"
2656 $MULTIOP $DIR/f31b Ouc || error "multiop failed"
2657 $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
2659 run_test 31b "unlink file with multiple links while open ======="
2662 touch $DIR/f31 || error "touch $DIR/f31 failed"
2663 ln $DIR/f31 $DIR/f31c || error "ln failed"
2664 multiop_bg_pause $DIR/f31 O_uc ||
2665 error "multiop_bg_pause for $DIR/f31 failed"
2667 $MULTIOP $DIR/f31c Ouc
2668 kill -USR1 $MULTIPID
2671 run_test 31c "open-unlink file with multiple links ============="
2674 opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
2675 $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
2677 run_test 31d "remove of open directory ========================="
2679 test_31e() { # bug 2904
2680 openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
2682 run_test 31e "remove of open non-empty directory ==============="
2684 test_31f() { # bug 4554
2685 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2688 test_mkdir $DIR/d31f
2689 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2690 cp /etc/hosts $DIR/d31f
2692 $GETSTRIPE $DIR/d31f/hosts
2693 multiop_bg_pause $DIR/d31f D_c || return 1
2696 rm -rv $DIR/d31f || error "first of $DIR/d31f"
2697 test_mkdir $DIR/d31f
2698 $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2699 cp /etc/hosts $DIR/d31f
2701 $GETSTRIPE $DIR/d31f/hosts
2702 multiop_bg_pause $DIR/d31f D_c || return 1
2705 kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
2706 wait $MULTIPID || error "first opendir $MULTIPID failed"
2710 kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
2711 wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
2714 run_test 31f "remove of open directory with open-unlink file ==="
2717 echo "-- cross directory link --"
2718 test_mkdir -c1 $DIR/${tdir}ga
2719 test_mkdir -c1 $DIR/${tdir}gb
2720 touch $DIR/${tdir}ga/f
2721 ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
2722 $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
2723 [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
2724 $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
2725 [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
2727 run_test 31g "cross directory link==============="
2730 echo "-- cross directory link --"
2731 test_mkdir -c1 $DIR/${tdir}
2732 test_mkdir -c1 $DIR/${tdir}/dir
2733 touch $DIR/${tdir}/f
2734 ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
2735 $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
2736 [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
2737 $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
2738 [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
2740 run_test 31h "cross directory link under child==============="
2743 echo "-- cross directory link --"
2744 test_mkdir -c1 $DIR/$tdir
2745 test_mkdir -c1 $DIR/$tdir/dir
2746 touch $DIR/$tdir/dir/f
2747 ln $DIR/$tdir/dir/f $DIR/$tdir/g
2748 $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
2749 [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
2750 $CHECKSTAT -t file $DIR/$tdir/g || error "target"
2751 [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
2753 run_test 31i "cross directory link under parent==============="
2756 test_mkdir -c1 -p $DIR/$tdir
2757 test_mkdir -c1 -p $DIR/$tdir/dir1
2758 ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
2759 link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
2760 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
2761 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
2764 run_test 31j "link for directory==============="
2767 test_mkdir -c1 -p $DIR/$tdir
2769 touch $DIR/$tdir/exist
2770 mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
2771 mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
2772 mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
2773 mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
2774 mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
2775 mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
2776 mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
2779 run_test 31k "link to file: the same, non-existing, dir==============="
2785 touch $DIR/d31m2/exist
2786 mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
2787 mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
2788 mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
2789 mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
2790 mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
2791 mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
2794 run_test 31m "link to file: the same, non-existing, dir==============="
2797 touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
2798 nlink=$(stat --format=%h $DIR/$tfile)
2799 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2801 local cmd="exec $fd<$DIR/$tfile"
2804 trap "eval $cmd" EXIT
2805 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2806 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2807 rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
2808 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2809 [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
2812 run_test 31n "check link count of unlinked file"
2815 local TEMPNAME=$(mktemp $1_XXXXXX)
2816 mlink $TEMPNAME $1 2> /dev/null &&
2817 echo "$BASHPID: link $TEMPNAME to $1 succeeded"
2821 test_31o() { # LU-2901
2822 test_mkdir $DIR/$tdir
2823 for LOOP in $(seq 100); do
2824 rm -f $DIR/$tdir/$tfile*
2825 for THREAD in $(seq 8); do
2826 link_one $DIR/$tdir/$tfile.$LOOP &
2829 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
2830 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
2831 error "$LINKS duplicate links to $tfile.$LOOP" &&
2835 run_test 31o "duplicate hard links with same filename"
2838 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
2840 test_mkdir $DIR/$tdir
2841 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
2842 $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
2844 opendirunlink $DIR/$tdir/striped_dir/test1 ||
2845 error "open unlink test1 failed"
2846 opendirunlink $DIR/$tdir/striped_dir/test2 ||
2847 error "open unlink test2 failed"
2849 $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
2850 error "test1 still exists"
2851 $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
2852 error "test2 still exists"
2854 run_test 31p "remove of open striped directory"
2856 cleanup_test32_mount() {
2859 local loopdev=$(losetup -a | grep $EXT2_DEV | sed -ne 's/:.*$//p')
2860 $UMOUNT $DIR/$tdir/ext2-mountpoint || rc=$?
2861 losetup -d $loopdev || true
2867 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2869 echo "== more mountpoints and symlinks ================="
2870 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2871 trap cleanup_test32_mount EXIT
2872 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2873 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2874 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2875 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/.. ||
2876 error "$DIR/$tdir/ext2-mountpoint/.. not dir type"
2877 cleanup_test32_mount
2879 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
2882 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2884 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2885 trap cleanup_test32_mount EXIT
2886 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2887 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2888 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2889 ls -al $DIR/$tdir/ext2-mountpoint/.. ||
2890 error "Can't list $DIR/$tdir/ext2-mountpoint/.."
2891 cleanup_test32_mount
2893 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
2896 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2898 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2899 trap cleanup_test32_mount EXIT
2900 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2901 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2902 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2903 test_mkdir -p $DIR/$tdir/d2/test_dir
2904 $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2905 error "$DIR/$tdir/ext2-mountpoint/../d2/test_dir not dir type"
2906 cleanup_test32_mount
2908 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
2911 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2913 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2914 trap cleanup_test32_mount EXIT
2915 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2916 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2917 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2918 test_mkdir -p $DIR/$tdir/d2/test_dir
2919 ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2920 error "Can't list $DIR/$tdir/ext2-mountpoint/../d2/test_dir"
2921 cleanup_test32_mount
2923 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
2927 test_mkdir -p $DIR/$tdir/tmp
2928 local tmp_dir=$DIR/$tdir/tmp
2929 ln -s $DIR/$tdir $tmp_dir/symlink11
2930 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2931 $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2932 $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
2934 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
2938 test_mkdir -p $DIR/$tdir/tmp
2939 local tmp_dir=$DIR/$tdir/tmp
2940 ln -s $DIR/$tdir $tmp_dir/symlink11
2941 ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2942 ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2943 ls $DIR/$tdir/symlink01 || error "symlink01 bad"
2945 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
2948 local tmp_dir=$DIR/$tdir/tmp
2949 test_mkdir -p $tmp_dir
2950 test_mkdir $DIR/${tdir}2
2951 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2952 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2953 $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
2954 $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
2955 $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
2956 $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
2958 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2961 rm -fr $DIR/$tdir $DIR/${tdir}2
2962 tmp_dir=$DIR/$tdir/tmp
2963 test_mkdir -p $tmp_dir
2964 test_mkdir $DIR/${tdir}2
2965 ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2966 ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2967 ls $tmp_dir/symlink12 || error "listing symlink12"
2968 ls $DIR/$tdir/symlink02 || error "listing symlink02"
2970 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2973 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2975 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2976 trap cleanup_test32_mount EXIT
2977 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2978 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2979 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2980 touch $DIR/$tdir/test_file
2981 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../test_file ||
2982 error "$DIR/$tdir/ext2-mountpoint/../test_file not file type"
2983 cleanup_test32_mount
2985 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
2988 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2990 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2991 trap cleanup_test32_mount EXIT
2992 test_mkdir -p $DIR/$tdir/ext2-mountpoint
2993 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2994 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2995 touch $DIR/$tdir/test_file
2996 cat $DIR/$tdir/ext2-mountpoint/../test_file ||
2997 error "Can't open $DIR/$tdir/ext2-mountpoint/../test_file"
2998 cleanup_test32_mount
3000 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
3003 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3006 trap cleanup_test32_mount EXIT
3007 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3008 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3009 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3010 test_mkdir -p $DIR/$tdir/d2
3011 touch $DIR/$tdir/d2/test_file || error "touch failed"
3012 $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
3013 error "$DIR/$tdir/ext2-mountpoint/../d2/test_file not file type"
3014 cleanup_test32_mount
3016 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
3019 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3022 trap cleanup_test32_mount EXIT
3023 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3024 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3025 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3026 test_mkdir -p $DIR/$tdir/d2
3027 touch $DIR/$tdir/d2/test_file || error "touch failed"
3028 cat $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
3029 error "Can't open $DIR/$tdir/ext2-mountpoint/../d2/test_file"
3030 cleanup_test32_mount
3032 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
3036 test_mkdir -p $DIR/d32m/tmp
3037 TMP_DIR=$DIR/d32m/tmp
3038 ln -s $DIR $TMP_DIR/symlink11
3039 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3040 $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 ||
3041 error "symlink11 not a link"
3042 $CHECKSTAT -t link $DIR/d32m/symlink01 ||
3043 error "symlink01 not a link"
3045 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
3049 test_mkdir -p $DIR/d32n/tmp
3050 TMP_DIR=$DIR/d32n/tmp
3051 ln -s $DIR $TMP_DIR/symlink11
3052 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
3053 ls -l $DIR/d32n/tmp/symlink11 || error "listing symlink11"
3054 ls -l $DIR/d32n/symlink01 || error "listing symlink01"
3056 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
3060 test_mkdir -p $DIR/d32o/tmp
3061 TMP_DIR=$DIR/d32o/tmp
3062 ln -s $DIR/$tfile $TMP_DIR/symlink12
3063 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3064 $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 ||
3065 error "symlink12 not a link"
3066 $CHECKSTAT -t link $DIR/d32o/symlink02 || error "symlink02 not a link"
3067 $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 ||
3068 error "$DIR/d32o/tmp/symlink12 not file type"
3069 $CHECKSTAT -t file -f $DIR/d32o/symlink02 ||
3070 error "$DIR/d32o/symlink02 not file type"
3072 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
3082 test_mkdir -p $DIR/d32p/tmp
3084 TMP_DIR=$DIR/d32p/tmp
3086 ln -s $DIR/$tfile $TMP_DIR/symlink12
3088 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
3090 cat $DIR/d32p/tmp/symlink12 ||
3091 error "Can't open $DIR/d32p/tmp/symlink12"
3093 cat $DIR/d32p/symlink02 || error "Can't open $DIR/d32p/symlink02"
3096 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
3099 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3101 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3102 trap cleanup_test32_mount EXIT
3103 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3104 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3105 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3106 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3107 ls $DIR/$tdir/ext2-mountpoint | grep "\<under_the_mount\>" && error
3108 cleanup_test32_mount
3110 run_test 32q "stat follows mountpoints in Lustre (should return error)"
3113 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3115 [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
3116 trap cleanup_test32_mount EXIT
3117 test_mkdir -p $DIR/$tdir/ext2-mountpoint
3118 touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
3119 mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
3120 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
3121 ls $DIR/$tdir/ext2-mountpoint | grep -q under_the_mount && error || true
3122 cleanup_test32_mount
3124 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
3129 chmod 444 $DIR/$tfile
3130 chown $RUNAS_ID $DIR/$tfile
3132 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3135 run_test 33aa "write file with mode 444 (should return error)"
3139 test_mkdir $DIR/$tdir
3140 chown $RUNAS_ID $DIR/$tdir
3141 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
3142 error "$RUNAS create $tdir/$tfile failed"
3143 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
3144 error "open RDWR" || true
3146 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
3150 test_mkdir $DIR/$tdir
3151 chown $RUNAS_ID $DIR/$tdir
3152 $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
3154 run_test 33b "test open file with malformed flags (No panic)"
3157 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3158 remote_ost_nodsh && skip "remote OST with nodsh"
3167 test_mkdir $DIR/$tdir
3168 # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
3171 for ostnum in $(seq $OSTCOUNT); do
3172 # test-framework's OST numbering is one-based, while Lustre's
3174 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3175 # Parsing llobdstat's output sucks; we could grep the /proc
3176 # path, but that's likely to not be as portable as using the
3177 # llobdstat utility. So we parse lctl output instead.
3178 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3179 obdfilter/$ostname/stats |
3180 awk '/^write_bytes/ {print $7}' )
3181 echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes"
3182 if (( ${write_bytes:-0} > 0 ))
3189 $all_zeros || return 0
3192 echo foo > $DIR/$tdir/bar
3196 # Total up write_bytes after writing. We'd better find non-zeros.
3197 for ostnum in $(seq $OSTCOUNT); do
3198 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3199 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
3200 obdfilter/$ostname/stats |
3201 awk '/^write_bytes/ {print $7}' )
3202 echo "write_bytes@$OSTnum/$ostname=$write_bytes"
3203 if (( ${write_bytes:-0} > 0 ))
3212 for ostnum in $(seq $OSTCOUNT); do
3213 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
3214 echo "Check that write_bytes is present in obdfilter/*/stats:"
3215 do_facet ost$ostnum lctl get_param -n \
3216 obdfilter/$ostname/stats
3218 error "OST not keeping write_bytes stats (b22312)"
3221 run_test 33c "test llobdstat and write_bytes"
3224 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
3225 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3228 local remote_dir=$DIR/$tdir/remote_dir
3230 test_mkdir $DIR/$tdir
3231 $LFS mkdir -i $MDTIDX $remote_dir ||
3232 error "create remote directory failed"
3234 touch $remote_dir/$tfile
3235 chmod 444 $remote_dir/$tfile
3236 chown $RUNAS_ID $remote_dir/$tfile
3238 $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
3240 chown $RUNAS_ID $remote_dir
3241 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
3242 error "create" || true
3243 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
3244 error "open RDWR" || true
3245 $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
3247 run_test 33d "openfile with 444 modes and malformed flags under remote dir"
3250 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3254 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3255 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3256 mkdir $DIR/$tdir/local_dir
3258 local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3259 local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3260 local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3262 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3263 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
3265 rmdir $DIR/$tdir/* || error "rmdir failed"
3268 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3269 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3270 mkdir $DIR/$tdir/local_dir
3272 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3273 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3274 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3276 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3277 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
3279 rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
3282 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3283 $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3284 mkdir $DIR/$tdir/local_dir
3286 s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3287 s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3288 l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3290 [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3291 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
3293 run_test 33e "mkdir and striped directory should have same mode"
3297 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
3301 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3302 remote_mds_nodsh && skip "remote MDS with nodsh"
3305 chmod go+rwx $DIR/$tdir
3306 do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
3307 trap cleanup_33f EXIT
3309 $RUNAS lfs mkdir -i 0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
3310 error "cannot create striped directory"
3312 $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
3313 error "cannot create files in striped directory"
3315 $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
3316 error "cannot remove files in striped directory"
3318 $RUNAS rmdir $DIR/$tdir/striped_dir ||
3319 error "cannot remove striped directory"
3323 run_test 33f "nonroot user can create, access, and remove a striped directory"
3326 mkdir -p $DIR/$tdir/dir2
3328 local err=$($RUNAS mkdir $DIR/$tdir/dir2 2>&1)
3330 [[ $err =~ "exists" ]] || error "Not exists error"
3332 run_test 33g "nonroot user create already existing root created file"
3334 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
3337 $MCREATE $DIR/f34 || error "mcreate failed"
3338 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3339 error "getstripe failed"
3340 $TRUNCATE $DIR/f34 $TEST_34_SIZE || error "truncate failed"
3341 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3342 error "getstripe failed"
3343 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3344 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3346 run_test 34a "truncate file that has not been opened ==========="
3349 [ ! -f $DIR/f34 ] && test_34a
3350 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3351 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3352 $OPENFILE -f O_RDONLY $DIR/f34
3353 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3354 error "getstripe failed"
3355 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3356 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3358 run_test 34b "O_RDONLY opening file doesn't create objects ====="
3361 [ ! -f $DIR/f34 ] && test_34a
3362 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3363 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3364 $OPENFILE -f O_RDWR $DIR/f34
3365 $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" && error
3366 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3367 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3369 run_test 34c "O_RDWR opening file-with-size works =============="
3372 [ ! -f $DIR/f34 ] && test_34a
3373 dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 ||
3375 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3376 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3379 run_test 34d "write to sparse file ============================="
3383 $MCREATE $DIR/f34e || error "mcreate failed"
3384 $TRUNCATE $DIR/f34e 1000 || error "truncate failed"
3385 $CHECKSTAT -s 1000 $DIR/f34e ||
3386 error "Size of $DIR/f34e not equal to 1000 bytes"
3387 $OPENFILE -f O_RDWR $DIR/f34e
3388 $CHECKSTAT -s 1000 $DIR/f34e ||
3389 error "Size of $DIR/f34e not equal to 1000 bytes"
3391 run_test 34e "create objects, some with size and some without =="
3393 test_34f() { # bug 6242, 6243
3394 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3398 $MCREATE $DIR/f34f || error "mcreate failed"
3399 $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
3400 dd if=$DIR/f34f of=$TMP/f34f
3401 $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
3402 dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
3403 cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
3404 cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
3405 rm $TMP/f34f $TMP/f34fzero $DIR/f34f
3407 run_test 34f "read from a file with no objects until EOF ======="
3410 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3412 dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE ||
3414 $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error "truncate failed"
3415 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3416 error "Size of $DIR/$tfile not equal to $((TEST_34_SIZE / 2))"
3417 cancel_lru_locks osc
3418 $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3419 error "wrong size after lock cancel"
3421 $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error "truncate failed"
3422 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3423 error "expanding truncate failed"
3424 cancel_lru_locks osc
3425 $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3426 error "wrong expanded size after lock cancel"
3428 run_test 34g "truncate long file ==============================="
3431 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3436 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error "dd failed"
3437 sync # Flush the cache so that multiop below does not block on cache
3438 # flush when getting the group lock
3439 $MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
3442 # Since just timed wait is not good enough, let's do a sync write
3443 # that way we are sure enough time for a roundtrip + processing
3444 # passed + 2 seconds of extra margin.
3445 dd if=/dev/zero of=$DIR/${tfile}-1 bs=$PAGE_SIZE oflag=direct count=1
3449 if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then
3450 error "Multiop blocked on ftruncate, pid=$MULTIPID"
3454 local nsz=`stat -c %s $DIR/$tfile`
3455 [[ $nsz == $sz ]] || error "New size wrong $nsz != $sz"
3457 run_test 34h "ftruncate file under grouplock should not block"
3460 cp /bin/sh $DIR/f35a
3462 chown $RUNAS_ID $DIR/f35a
3463 $RUNAS $DIR/f35a && error || true
3466 run_test 35a "exec file with mode 444 (should return and not leak)"
3470 utime $DIR/f36 || error "utime failed for MDS"
3472 run_test 36a "MDS utime check (mknod, utime)"
3476 utime $DIR/f36 || error "utime failed for OST"
3478 run_test 36b "OST utime check (open, utime)"
3483 chown $RUNAS_ID $DIR/d36
3484 $RUNAS utime $DIR/d36/f36 || error "utime failed for MDS as non-root"
3486 run_test 36c "non-root MDS utime check (mknod, utime)"
3489 [ ! -d $DIR/d36 ] && test_36c
3490 echo "" > $DIR/d36/f36
3491 $RUNAS utime $DIR/d36/f36 || error "utime failed for OST as non-root"
3493 run_test 36d "non-root OST utime check (open, utime)"
3496 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping"
3498 test_mkdir $DIR/$tdir
3499 touch $DIR/$tdir/$tfile
3500 $RUNAS utime $DIR/$tdir/$tfile &&
3501 error "utime worked, expected failure" || true
3503 run_test 36e "utime on non-owned file (should return error)"
3507 local LANG_SAVE=$LANG
3508 local LC_LANG_SAVE=$LC_LANG
3509 export LANG=C LC_LANG=C # for date language
3511 DATESTR="Dec 20 2000"
3512 test_mkdir $DIR/$tdir
3513 lctl set_param fail_loc=$fl
3515 cp /etc/hosts $DIR/$tdir/$tfile
3516 sync & # write RPC generated with "current" inode timestamp, but delayed
3518 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
3519 LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
3520 cancel_lru_locks $OSC
3521 LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object
3523 [ "$LS_BEFORE" != "$LS_AFTER" ] && \
3524 echo "BEFORE: $LS_BEFORE" && \
3525 echo "AFTER : $LS_AFTER" && \
3526 echo "WANT : $DATESTR" && \
3527 error "$DIR/$tdir/$tfile timestamps changed" || true
3529 export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE
3533 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3535 #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
3536 subr_36fh "0x80000214"
3538 run_test 36f "utime on file racing with OST BRW write =========="
3541 remote_ost_nodsh && skip "remote OST with nodsh"
3542 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3543 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
3544 skip "Need MDS version at least 2.12.51"
3549 local tgt="obdfilter"
3551 [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1"
3553 test_mkdir $DIR/$tdir
3554 fmd_max_age=$(do_facet $facet \
3555 "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \
3558 echo "FMD max age: ${fmd_max_age}s"
3559 touch $DIR/$tdir/$tfile
3560 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3561 gawk '{cnt=cnt+$1} END{print cnt}')
3562 echo "FMD before: $fmd"
3564 error "FMD wasn't create by touch"
3565 sleep $((fmd_max_age + 12))
3566 fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" |
3567 gawk '{cnt=cnt+$1} END{print cnt}')
3568 echo "FMD after: $fmd"
3570 error "FMD wasn't expired by ping"
3572 run_test 36g "FMD cache expiry ====================="
3575 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3577 #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227
3578 subr_36fh "0x80000227"
3580 run_test 36h "utime on file racing with OST BRW write =========="
3583 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3585 test_mkdir $DIR/$tdir
3586 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
3588 local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
3589 local new_mtime=$((mtime + 200))
3591 #change Modify time of striped dir
3592 touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
3593 error "change mtime failed"
3595 local got=$(stat -c%Y $DIR/$tdir/striped_dir)
3597 [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
3599 run_test 36i "change mtime on striped directory"
3601 # test_37 - duplicate with tests 32q 32r
3604 local file=$DIR/$tfile
3606 openfile -f O_DIRECTORY $file
3609 [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true
3610 [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)"
3612 run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ==="
3614 test_39a() { # was test_39
3616 touch $DIR/${tfile}2
3617 # ls -l $DIR/$tfile $DIR/${tfile}2
3618 # ls -lu $DIR/$tfile $DIR/${tfile}2
3619 # ls -lc $DIR/$tfile $DIR/${tfile}2
3621 $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
3622 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
3624 ls -l --full-time $DIR/$tfile $DIR/${tfile}2
3626 ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
3628 ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
3629 error "O_TRUNC didn't change timestamps"
3632 run_test 39a "mtime changed on create"
3635 test_mkdir -c1 $DIR/$tdir
3636 cp -p /etc/passwd $DIR/$tdir/fopen
3637 cp -p /etc/passwd $DIR/$tdir/flink
3638 cp -p /etc/passwd $DIR/$tdir/funlink
3639 cp -p /etc/passwd $DIR/$tdir/frename
3640 ln $DIR/$tdir/funlink $DIR/$tdir/funlink2
3643 echo "aaaaaa" >> $DIR/$tdir/fopen
3644 echo "aaaaaa" >> $DIR/$tdir/flink
3645 echo "aaaaaa" >> $DIR/$tdir/funlink
3646 echo "aaaaaa" >> $DIR/$tdir/frename
3648 local open_new=`stat -c %Y $DIR/$tdir/fopen`
3649 local link_new=`stat -c %Y $DIR/$tdir/flink`
3650 local unlink_new=`stat -c %Y $DIR/$tdir/funlink`
3651 local rename_new=`stat -c %Y $DIR/$tdir/frename`
3653 cat $DIR/$tdir/fopen > /dev/null
3654 ln $DIR/$tdir/flink $DIR/$tdir/flink2
3655 rm -f $DIR/$tdir/funlink2
3656 mv -f $DIR/$tdir/frename $DIR/$tdir/frename2
3658 for (( i=0; i < 2; i++ )) ; do
3659 local open_new2=`stat -c %Y $DIR/$tdir/fopen`
3660 local link_new2=`stat -c %Y $DIR/$tdir/flink`
3661 local unlink_new2=`stat -c %Y $DIR/$tdir/funlink`
3662 local rename_new2=`stat -c %Y $DIR/$tdir/frename2`
3664 [ $open_new2 -eq $open_new ] || error "open file reverses mtime"
3665 [ $link_new2 -eq $link_new ] || error "link file reverses mtime"
3666 [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime"
3667 [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime"
3669 cancel_lru_locks $OSC
3670 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3673 run_test 39b "mtime change on open, link, unlink, rename ======"
3675 # this should be set to past
3676 TEST_39_MTIME=`date -d "1 year ago" +%s`
3682 local mtime0=`stat -c %Y $DIR1/$tfile`
3684 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3685 local mtime1=`stat -c %Y $DIR1/$tfile`
3686 [ "$mtime1" = $TEST_39_MTIME ] || \
3687 error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME"
3690 echo hello >> $DIR1/$tfile
3692 local mtime2=`stat -c %Y $DIR1/$tfile`
3693 [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \
3694 error "mtime is not updated on write: $d1 <= $mtime2 <= $d2"
3696 mv $DIR1/$tfile $DIR1/$tfile-1
3698 for (( i=0; i < 2; i++ )) ; do
3699 local mtime3=`stat -c %Y $DIR1/$tfile-1`
3700 [ "$mtime2" = "$mtime3" ] || \
3701 error "mtime ($mtime2) changed (to $mtime3) on rename"
3703 cancel_lru_locks $OSC
3704 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3707 run_test 39c "mtime change on rename ==========================="
3711 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3714 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3716 for (( i=0; i < 2; i++ )) ; do
3717 local mtime=`stat -c %Y $DIR1/$tfile`
3718 [ $mtime = $TEST_39_MTIME ] || \
3719 error "mtime($mtime) is not set to $TEST_39_MTIME"
3721 cancel_lru_locks $OSC
3722 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3725 run_test 39d "create, utime, stat =============================="
3729 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3732 local mtime1=`stat -c %Y $DIR1/$tfile`
3734 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3736 for (( i=0; i < 2; i++ )) ; do
3737 local mtime2=`stat -c %Y $DIR1/$tfile`
3738 [ $mtime2 = $TEST_39_MTIME ] || \
3739 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3741 cancel_lru_locks $OSC
3742 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3745 run_test 39e "create, stat, utime, stat ========================"
3749 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3752 mtime1=`stat -c %Y $DIR1/$tfile`
3755 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3757 for (( i=0; i < 2; i++ )) ; do
3758 local mtime2=`stat -c %Y $DIR1/$tfile`
3759 [ $mtime2 = $TEST_39_MTIME ] || \
3760 error "mtime($mtime2) is not set to $TEST_39_MTIME"
3762 cancel_lru_locks $OSC
3763 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3766 run_test 39f "create, stat, sleep, utime, stat ================="
3770 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3772 echo hello >> $DIR1/$tfile
3773 local mtime1=`stat -c %Y $DIR1/$tfile`
3776 chmod o+r $DIR1/$tfile
3778 for (( i=0; i < 2; i++ )) ; do
3779 local mtime2=`stat -c %Y $DIR1/$tfile`
3780 [ "$mtime1" = "$mtime2" ] || \
3781 error "lost mtime: $mtime2, should be $mtime1"
3783 cancel_lru_locks $OSC
3784 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3787 run_test 39g "write, chmod, stat ==============================="
3791 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3797 echo hello >> $DIR1/$tfile
3798 local mtime1=`stat -c %Y $DIR1/$tfile`
3800 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3802 if [ "$d1" != "$d2" ]; then
3803 echo "write and touch not within one second"
3805 for (( i=0; i < 2; i++ )) ; do
3806 local mtime2=`stat -c %Y $DIR1/$tfile`
3807 [ "$mtime2" = $TEST_39_MTIME ] || \
3808 error "lost mtime: $mtime2, should be $TEST_39_MTIME"
3810 cancel_lru_locks $OSC
3811 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3815 run_test 39h "write, utime within one second, stat ============="
3818 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3823 echo hello >> $DIR1/$tfile
3824 local mtime1=`stat -c %Y $DIR1/$tfile`
3826 mv $DIR1/$tfile $DIR1/$tfile-1
3828 for (( i=0; i < 2; i++ )) ; do
3829 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3831 [ "$mtime1" = "$mtime2" ] || \
3832 error "lost mtime: $mtime2, should be $mtime1"
3834 cancel_lru_locks $OSC
3835 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3838 run_test 39i "write, rename, stat =============================="
3841 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3843 start_full_debug_logging
3847 #define OBD_FAIL_OSC_DELAY_SETTIME 0x412
3848 lctl set_param fail_loc=0x80000412
3849 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c ||
3850 error "multiop failed"
3852 local mtime1=`stat -c %Y $DIR1/$tfile`
3854 mv $DIR1/$tfile $DIR1/$tfile-1
3856 kill -USR1 $multipid
3857 wait $multipid || error "multiop close failed"
3859 for (( i=0; i < 2; i++ )) ; do
3860 local mtime2=`stat -c %Y $DIR1/$tfile-1`
3861 [ "$mtime1" = "$mtime2" ] ||
3862 error "mtime is lost on close: $mtime2, " \
3865 cancel_lru_locks $OSC
3866 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3868 lctl set_param fail_loc=0
3869 stop_full_debug_logging
3871 run_test 39j "write, rename, close, stat ======================="
3874 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3879 multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed"
3881 local mtime1=`stat -c %Y $DIR1/$tfile`
3883 touch -m -d @$TEST_39_MTIME $DIR1/$tfile
3885 kill -USR1 $multipid
3886 wait $multipid || error "multiop close failed"
3888 for (( i=0; i < 2; i++ )) ; do
3889 local mtime2=`stat -c %Y $DIR1/$tfile`
3891 [ "$mtime2" = $TEST_39_MTIME ] || \
3892 error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
3894 cancel_lru_locks osc
3895 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3898 run_test 39k "write, utime, close, stat ========================"
3900 # this should be set to future
3901 TEST_39_ATIME=`date -d "1 year" +%s`
3904 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3905 remote_mds_nodsh && skip "remote MDS with nodsh"
3907 local atime_diff=$(do_facet $SINGLEMDS \
3908 lctl get_param -n mdd.*MDT0000*.atime_diff)
3912 # test setting directory atime to future
3913 touch -a -d @$TEST_39_ATIME $DIR/$tdir
3914 local atime=$(stat -c %X $DIR/$tdir)
3915 [ "$atime" = $TEST_39_ATIME ] ||
3916 error "atime is not set to future: $atime, $TEST_39_ATIME"
3918 # test setting directory atime from future to now
3919 local now=$(date +%s)
3920 touch -a -d @$now $DIR/$tdir
3922 atime=$(stat -c %X $DIR/$tdir)
3923 [ "$atime" -eq "$now" ] ||
3924 error "atime is not updated from future: $atime, $now"
3926 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=2
3929 # test setting directory atime when now > dir atime + atime_diff
3930 local d1=$(date +%s)
3932 local d2=$(date +%s)
3933 cancel_lru_locks mdc
3934 atime=$(stat -c %X $DIR/$tdir)
3935 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3936 error "atime is not updated : $atime, should be $d2"
3938 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=60
3941 # test not setting directory atime when now < dir atime + atime_diff
3943 cancel_lru_locks mdc
3944 atime=$(stat -c %X $DIR/$tdir)
3945 [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] ||
3946 error "atime is updated to $atime, should remain $d1<atime<$d2"
3948 do_facet $SINGLEMDS \
3949 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
3951 run_test 39l "directory atime update ==========================="
3954 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3958 local far_past_mtime=$(date -d "May 29 1953" +%s)
3959 local far_past_atime=$(date -d "Dec 17 1903" +%s)
3961 touch -m -d @$far_past_mtime $DIR1/$tfile
3962 touch -a -d @$far_past_atime $DIR1/$tfile
3964 for (( i=0; i < 2; i++ )) ; do
3965 local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
3966 [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
3967 error "atime or mtime set incorrectly"
3969 cancel_lru_locks $OSC
3970 if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
3973 run_test 39m "test atime and mtime before 1970"
3975 test_39n() { # LU-3832
3976 remote_mds_nodsh && skip "remote MDS with nodsh"
3978 local atime_diff=$(do_facet $SINGLEMDS \
3979 lctl get_param -n mdd.*MDT0000*.atime_diff)
3984 do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
3987 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
3988 atime0=$(stat -c %X $DIR/$tfile)
3991 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3992 atime1=$(stat -c %X $DIR/$tfile)
3995 cancel_lru_locks mdc
3996 cancel_lru_locks osc
3997 $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
3998 atime2=$(stat -c %X $DIR/$tfile)
4000 do_facet $SINGLEMDS \
4001 lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
4003 [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
4004 [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
4006 run_test 39n "check that O_NOATIME is honored"
4009 TESTDIR=$DIR/$tdir/$tfile
4010 [ -e $TESTDIR ] && rm -rf $TESTDIR
4017 links2=$(stat -c %h .)
4018 [ $(($links1 + 2)) != $links2 ] &&
4019 error "wrong links count $(($links1 + 2)) != $links2"
4021 links3=$(stat -c %h .)
4022 [ $(($links1 + 1)) != $links3 ] &&
4023 error "wrong links count $links1 != $links3"
4026 run_test 39o "directory cached attributes updated after create"
4029 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
4032 TESTDIR=$DIR/$tdir/$tdir
4033 [ -e $TESTDIR ] && rm -rf $TESTDIR
4034 test_mkdir -p $TESTDIR
4038 test_mkdir -i $MDTIDX $TESTDIR/remote_dir1
4039 test_mkdir -i $MDTIDX $TESTDIR/remote_dir2
4041 links2=$(stat -c %h .)
4042 [ $(($links1 + 2)) != $links2 ] &&
4043 error "wrong links count $(($links1 + 2)) != $links2"
4045 links3=$(stat -c %h .)
4046 [ $(($links1 + 1)) != $links3 ] &&
4047 error "wrong links count $links1 != $links3"
4050 run_test 39p "remote directory cached attributes updated after create ========"
4053 test_39q() { # LU-8041
4054 local testdir=$DIR/$tdir
4056 multiop_bg_pause $testdir D_c || error "multiop failed"
4058 cancel_lru_locks mdc
4059 kill -USR1 $multipid
4060 local atime=$(stat -c %X $testdir)
4061 [ "$atime" -ne 0 ] || error "atime is zero"
4063 run_test 39q "close won't zero out atime"
4066 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
4067 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
4068 error "openfile O_WRONLY:O_TRUNC $tfile failed"
4069 $CHECKSTAT -t file -s 4096 $DIR/$tfile ||
4070 error "$tfile is not 4096 bytes in size"
4072 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
4076 small_write $DIR/f41 18
4078 run_test 41 "test small file write + fstat ====================="
4080 count_ost_writes() {
4081 lctl get_param -n ${OSC}.*.stats |
4082 awk -vwrites=0 '/ost_write/ { writes += $2 } \
4083 END { printf("%0.0f", writes) }'
4090 BG_DIRTY_RATIO_SAVE=10
4091 MAX_BG_DIRTY_RATIO=25
4095 # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs,
4096 # dirty_ratio, dirty_background_ratio
4097 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4098 sysctl -w vm.dirty_writeback_centisecs=$WRITEBACK_SAVE
4099 sysctl -w vm.dirty_background_ratio=$BG_DIRTY_RATIO_SAVE
4100 sysctl -w vm.dirty_ratio=$DIRTY_RATIO_SAVE
4102 # if file not here, we are a 2.4 kernel
4103 kill -CONT `pidof kupdated`
4108 # setup the trap first, so someone cannot exit the test at the
4109 # exact wrong time and mess up a machine
4110 trap start_writeback EXIT
4111 # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
4112 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
4113 WRITEBACK_SAVE=`sysctl -n vm.dirty_writeback_centisecs`
4114 sysctl -w vm.dirty_writeback_centisecs=0
4115 sysctl -w vm.dirty_writeback_centisecs=0
4116 # save and increase /proc/sys/vm/dirty_ratio
4117 DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_ratio`
4118 sysctl -w vm.dirty_ratio=$MAX_DIRTY_RATIO
4119 # save and increase /proc/sys/vm/dirty_background_ratio
4120 BG_DIRTY_RATIO_SAVE=`sysctl -n vm.dirty_background_ratio`
4121 sysctl -w vm.dirty_background_ratio=$MAX_BG_DIRTY_RATIO
4123 # if file not here, we are a 2.4 kernel
4124 kill -STOP `pidof kupdated`
4128 # ensure that all stripes have some grant before we test client-side cache
4130 for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
4131 dd if=/dev/zero of=$i bs=4k count=1
4136 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
4137 # file truncation, and file removal.
4139 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4142 cancel_lru_locks $OSC
4144 sync; sleep 1; sync # just to be safe
4145 BEFOREWRITES=`count_ost_writes`
4146 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur_grant_bytes | grep "[0-9]"
4147 dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
4148 AFTERWRITES=`count_ost_writes`
4149 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
4150 error "$BEFOREWRITES < $AFTERWRITES"
4153 run_test 42a "ensure that we don't flush on close"
4156 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4159 cancel_lru_locks $OSC
4162 dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
4163 BEFOREWRITES=$(count_ost_writes)
4164 $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
4165 AFTERWRITES=$(count_ost_writes)
4166 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4167 error "$BEFOREWRITES < $AFTERWRITES on unlink"
4169 BEFOREWRITES=$(count_ost_writes)
4170 sync || error "sync: $?"
4171 AFTERWRITES=$(count_ost_writes)
4172 if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
4173 error "$BEFOREWRITES < $AFTERWRITES on sync"
4175 dmesg | grep 'error from obd_brw_async' && error 'error writing back'
4179 run_test 42b "test destroy of file with cached dirty data ======"
4181 # if these tests just want to test the effect of truncation,
4182 # they have to be very careful. consider:
4183 # - the first open gets a {0,EOF}PR lock
4184 # - the first write conflicts and gets a {0, count-1}PW
4185 # - the rest of the writes are under {count,EOF}PW
4186 # - the open for truncate tries to match a {0,EOF}PR
4187 # for the filesize and cancels the PWs.
4188 # any number of fixes (don't get {0,EOF} on open, match
4189 # composite locks, do smarter file size management) fix
4190 # this, but for now we want these tests to verify that
4191 # the cancellation with truncate intent works, so we
4192 # start the file with a full-file pw lock to match against
4193 # until the truncate.
4198 cancel_lru_locks $OSC
4200 # prime the file with 0,EOF PW to match
4204 # now the real test..
4205 dd if=/dev/zero of=$file bs=1024 count=100
4206 BEFOREWRITES=`count_ost_writes`
4207 $TRUNCATE $file $offset
4208 cancel_lru_locks $OSC
4209 AFTERWRITES=`count_ost_writes`
4214 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4217 [ $BEFOREWRITES -eq $AFTERWRITES ] &&
4218 error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
4221 run_test 42c "test partial truncate of file with cached dirty data"
4224 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4227 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
4228 error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
4231 run_test 42d "test complete truncate of file with cached dirty data"
4233 test_42e() { # bug22074
4234 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4236 local TDIR=$DIR/${tdir}e
4237 local pages=16 # hardcoded 16 pages, don't change it.
4238 local files=$((OSTCOUNT * 500)) # hopefully 500 files on each OST
4239 local proc_osc0="osc.${FSNAME}-OST0000-osc-[^MDT]*"
4243 test_mkdir $DIR/${tdir}e
4244 $SETSTRIPE -c 1 $TDIR
4245 createmany -o $TDIR/f $files
4247 max_dirty_mb=$($LCTL get_param -n $proc_osc0/max_dirty_mb)
4249 # we assume that with $OSTCOUNT files, at least one of them will
4250 # be allocated on OST0.
4251 warmup_files=$((OSTCOUNT * max_dirty_mb))
4252 createmany -o $TDIR/w $warmup_files
4254 # write a large amount of data into one file and sync, to get good
4255 # avail_grant number from OST.
4256 for ((i=0; i<$warmup_files; i++)); do
4257 idx=$($GETSTRIPE -i $TDIR/w$i)
4258 [ $idx -ne 0 ] && continue
4259 dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1
4262 [[ $i -gt $warmup_files ]] && error "OST0 is still cold"
4264 $LCTL get_param $proc_osc0/cur_dirty_bytes
4265 $LCTL get_param $proc_osc0/cur_grant_bytes
4267 # create as much dirty pages as we can while not to trigger the actual
4268 # RPCs directly. but depends on the env, VFS may trigger flush during this
4269 # period, hopefully we are good.
4270 for ((i=0; i<$warmup_files; i++)); do
4271 idx=$($GETSTRIPE -i $TDIR/w$i)
4272 [ $idx -ne 0 ] && continue
4273 dd if=/dev/zero of=$TDIR/w$i bs=1M count=1 2>/dev/null
4275 $LCTL get_param $proc_osc0/cur_dirty_bytes
4276 $LCTL get_param $proc_osc0/cur_grant_bytes
4278 # perform the real test
4279 $LCTL set_param $proc_osc0/rpc_stats 0
4280 for ((;i<$files; i++)); do
4281 [ $($GETSTRIPE -i $TDIR/f$i) -eq 0 ] || continue
4282 dd if=/dev/zero of=$TDIR/f$i bs=$PAGE_SIZE count=$pages 2>/dev/null
4285 $LCTL get_param $proc_osc0/rpc_stats
4288 local have_ppr=false
4289 $LCTL get_param $proc_osc0/rpc_stats |
4290 while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do
4291 # skip lines until we are at the RPC histogram data
4292 [ "$PPR" == "pages" ] && have_ppr=true && continue
4293 $have_ppr || continue
4295 # we only want the percent stat for < 16 pages
4296 [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break
4298 percent=$((percent + WPCT))
4299 if [[ $percent -gt 15 ]]; then
4300 error "less than 16-pages write RPCs" \
4307 run_test 42e "verify sub-RPC writes are not done synchronously"
4309 test_43A() { # was test_43
4310 test_mkdir $DIR/$tdir
4311 cp -p /bin/ls $DIR/$tdir/$tfile
4312 $MULTIOP $DIR/$tdir/$tfile Ow_c &
4314 # give multiop a chance to open
4317 $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true
4320 run_test 43A "execution of file opened for write should return -ETXTBSY"
4323 test_mkdir $DIR/$tdir
4324 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4325 $DIR/$tdir/sleep 60 &
4327 # Make sure exec of $tdir/sleep wins race with truncate
4329 $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success"
4332 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
4335 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4337 test_mkdir $DIR/$tdir
4338 cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy"
4339 $DIR/$tdir/sleep 60 &
4341 # Make sure exec of $tdir/sleep wins race with truncate
4343 $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success"
4346 run_test 43b "truncate of file being executed should return -ETXTBSY"
4349 local testdir="$DIR/$tdir"
4352 ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) |
4353 ( cd $testdir && md5sum -c )
4355 run_test 43c "md5sum of copy into lustre"
4357 test_44A() { # was test_44
4358 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
4360 dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
4361 dd if=$DIR/f1 bs=4k count=1 > /dev/null
4363 run_test 44A "zero length read from a sparse stripe"
4366 local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
4368 [ -z "$nstripe" ] && skip "can't get stripe info"
4369 [[ $nstripe -gt $OSTCOUNT ]] &&
4370 skip "Wrong default_stripe_count: $nstripe OSTCOUNT: $OSTCOUNT"
4372 local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: |
4374 if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then
4375 nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: |
4379 OFFSETS="0 $((stride/2)) $((stride-1))"
4380 for offset in $OFFSETS; do
4381 for i in $(seq 0 $((nstripe-1))); do
4382 local GLOBALOFFSETS=""
4384 local size=$((((i + 2 * $nstripe )*$stride + $offset)))
4385 local myfn=$DIR/d44a-$size
4386 echo "--------writing $myfn at $size"
4387 ll_sparseness_write $myfn $size ||
4388 error "ll_sparseness_write"
4389 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4390 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4391 error "ll_sparseness_verify $GLOBALOFFSETS"
4393 for j in $(seq 0 $((nstripe-1))); do
4395 size=$((((j + $nstripe )*$stride + $offset)))
4396 ll_sparseness_write $myfn $size ||
4397 error "ll_sparseness_write"
4398 GLOBALOFFSETS="$GLOBALOFFSETS $size"
4400 ll_sparseness_verify $myfn $GLOBALOFFSETS ||
4401 error "ll_sparseness_verify $GLOBALOFFSETS"
4406 run_test 44a "test sparse pwrite ==============================="
4410 for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
4416 before=`dirty_osc_total`
4417 echo executing "\"$*\""
4419 after=`dirty_osc_total`
4420 echo before $before, after $after
4423 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4426 # Obtain grants from OST if it supports it
4427 echo blah > ${f}_grant
4430 do_dirty_record "echo blah > $f"
4431 [[ $before -eq $after ]] && error "write wasn't cached"
4432 do_dirty_record "> $f"
4433 [[ $before -gt $after ]] || error "truncate didn't lower dirty count"
4434 do_dirty_record "echo blah > $f"
4435 [[ $before -eq $after ]] && error "write wasn't cached"
4436 do_dirty_record "sync"
4437 [[ $before -gt $after ]] || error "writeback didn't lower dirty count"
4438 do_dirty_record "echo blah > $f"
4439 [[ $before -eq $after ]] && error "write wasn't cached"
4440 do_dirty_record "cancel_lru_locks osc"
4441 [[ $before -gt $after ]] ||
4442 error "lock cancellation didn't lower dirty count"
4445 run_test 45 "osc io page accounting ============================"
4447 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this
4448 # test tickles a bug where re-dirtying a page was failing to be mapped to the
4449 # objects offset and an assert hit when an rpc was built with 1023's mapped
4450 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
4452 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4457 dd if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4459 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=1023 count=1
4460 dd conv=notrunc if=/dev/zero of=$f bs=$PAGE_SIZE seek=511 count=1
4464 run_test 46 "dirtying a previously written page ================"
4466 # test_47 is removed "Device nodes check" is moved to test_28
4468 test_48a() { # bug 2399
4469 [ "$mds1_FSTYPE" = "zfs" ] &&
4470 [ $MDS1_VERSION -lt $(version_code 2.3.63) ] &&
4471 skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly"
4473 test_mkdir $DIR/$tdir
4475 mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
4476 test_mkdir $DIR/$tdir
4477 touch foo || error "'touch foo' failed after recreating cwd"
4479 touch .foo || error "'touch .foo' failed after recreating cwd"
4481 ls . > /dev/null || error "'ls .' failed after recreating cwd"
4482 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4483 cd . || error "'cd .' failed after recreating cwd"
4484 mkdir . && error "'mkdir .' worked after recreating cwd"
4485 rmdir . && error "'rmdir .' worked after recreating cwd"
4486 ln -s . baz || error "'ln -s .' failed after recreating cwd"
4487 cd .. || error "'cd ..' failed after recreating cwd"
4489 run_test 48a "Access renamed working dir (should return errors)="
4491 test_48b() { # bug 2399
4493 test_mkdir $DIR/$tdir
4495 rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
4496 touch foo && error "'touch foo' worked after removing cwd"
4497 mkdir foo && error "'mkdir foo' worked after removing cwd"
4498 touch .foo && error "'touch .foo' worked after removing cwd"
4499 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
4500 ls . > /dev/null && error "'ls .' worked after removing cwd"
4501 ls .. > /dev/null || error "'ls ..' failed after removing cwd"
4502 mkdir . && error "'mkdir .' worked after removing cwd"
4503 rmdir . && error "'rmdir .' worked after removing cwd"
4504 ln -s . foo && error "'ln -s .' worked after removing cwd"
4505 cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
4507 run_test 48b "Access removed working dir (should return errors)="
4509 test_48c() { # bug 2350
4510 #lctl set_param debug=-1
4513 test_mkdir -p $DIR/$tdir/dir
4515 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4516 $TRACE touch foo && error "touch foo worked after removing cwd"
4517 $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
4518 touch .foo && error "touch .foo worked after removing cwd"
4519 mkdir .foo && error "mkdir .foo worked after removing cwd"
4520 $TRACE ls . && error "'ls .' worked after removing cwd"
4521 $TRACE ls .. || error "'ls ..' failed after removing cwd"
4522 $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
4523 $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
4524 $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
4525 $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
4527 run_test 48c "Access removed working subdir (should return errors)"
4529 test_48d() { # bug 2350
4530 #lctl set_param debug=-1
4533 test_mkdir -p $DIR/$tdir/dir
4535 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4536 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4537 $TRACE touch foo && error "'touch foo' worked after removing parent"
4538 $TRACE mkdir foo && error "mkdir foo worked after removing parent"
4539 touch .foo && error "'touch .foo' worked after removing parent"
4540 mkdir .foo && error "mkdir .foo worked after removing parent"
4541 $TRACE ls . && error "'ls .' worked after removing parent"
4542 $TRACE ls .. && error "'ls ..' worked after removing parent"
4543 $TRACE mkdir . && error "'mkdir .' worked after removing parent"
4544 $TRACE rmdir . && error "'rmdir .' worked after removing parent"
4545 $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
4548 run_test 48d "Access removed parent subdir (should return errors)"
4550 test_48e() { # bug 4134
4551 #lctl set_param debug=-1
4554 test_mkdir -p $DIR/$tdir/dir
4556 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
4557 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
4558 $TRACE touch $DIR/$tdir || error "'touch $DIR/$tdir' failed"
4559 $TRACE chmod +x $DIR/$tdir || error "'chmod +x $DIR/$tdir' failed"
4560 # On a buggy kernel addition of "touch foo" after cd .. will
4561 # produce kernel oops in lookup_hash_it
4562 touch ../foo && error "'cd ..' worked after recreate parent"
4564 $TRACE rm $DIR/$tdir || error "rm '$DIR/$tdir' failed"
4566 run_test 48e "Access to recreated parent subdir (should return errors)"
4568 test_49() { # LU-1030
4569 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4570 remote_ost_nodsh && skip "remote OST with nodsh"
4572 # get ost1 size - lustre-OST0000
4573 ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
4575 # write 800M at maximum
4576 [[ $ost1_size -lt 2 ]] && ost1_size=2
4577 [[ $ost1_size -gt 819200 ]] && ost1_size=819200
4579 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
4580 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) &
4583 # change max_pages_per_rpc while writing the file
4584 local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc
4585 local orig_mppc=$($LCTL get_param -n $osc1_mppc)
4586 # loop until dd process exits
4587 while ps ax -opid | grep -wq $dd_pid; do
4588 $LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1))
4589 sleep $((RANDOM % 5 + 1))
4591 # restore original max_pages_per_rpc
4592 $LCTL set_param $osc1_mppc=$orig_mppc
4593 rm $DIR/$tfile || error "rm $DIR/$tfile failed"
4595 run_test 49 "Change max_pages_per_rpc won't break osc extent"
4599 test_mkdir $DIR/$tdir
4601 ls /proc/$$/cwd || error "ls /proc/$$/cwd failed"
4603 run_test 50 "special situations: /proc symlinks ==============="
4605 test_51a() { # was test_51
4606 # bug 1516 - create an empty entry right after ".." then split dir
4607 test_mkdir -c1 $DIR/$tdir
4608 touch $DIR/$tdir/foo
4609 $MCREATE $DIR/$tdir/bar
4611 createmany -m $DIR/$tdir/longfile 201
4613 while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do
4614 $MCREATE $DIR/$tdir/longfile$FNUM
4619 ls -l $DIR/$tdir > /dev/null || error "ls -l $DIR/$tdir failed"
4621 run_test 51a "special situations: split htree with empty entry =="
4623 cleanup_print_lfs_df () {
4630 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4632 local dir=$DIR/$tdir
4633 local nrdirs=$((65536 + 100))
4635 # cleanup the directory
4642 local mdtidx=$(printf "%04x" $($LFS getstripe -m $dir))
4643 local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
4644 [[ $numfree -lt $nrdirs ]] &&
4645 skip "not enough free inodes ($numfree) on MDT$mdtidx"
4647 # need to check free space for the directories as well
4648 local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
4649 numfree=$(( blkfree / $(fs_inode_ksize) ))
4650 [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)"
4652 trap cleanup_print_lfs_df EXIT
4655 createmany -d $dir/d $nrdirs || {
4656 unlinkmany $dir/d $nrdirs
4657 error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
4661 nrdirs=$(ls -U $dir | wc -l)
4663 # unlink all but 100 subdirectories, then check it still works
4665 local delete=$((nrdirs - left))
4670 # for ldiskfs the nlink count should be 1, but this is OSD specific
4671 # and so this is listed for informational purposes only
4672 echo "nlink before: $(stat -c %h $dir), created before: $nrdirs"
4673 unlinkmany -d $dir/d $delete ||
4674 error "unlink of first $delete subdirs failed"
4676 echo "nlink between: $(stat -c %h $dir)"
4677 local found=$(ls -U $dir | wc -l)
4678 [ $found -ne $left ] &&
4679 error "can't find subdirs: found only $found, expected $left"
4681 unlinkmany -d $dir/d $delete $left ||
4682 error "unlink of second $left subdirs failed"
4683 # regardless of whether the backing filesystem tracks nlink accurately
4684 # or not, the nlink count shouldn't be more than "." and ".." here
4685 local after=$(stat -c %h $dir)
4686 [[ $after -gt 2 ]] && error "nlink after: $after > 2" ||
4687 echo "nlink after: $after"
4689 cleanup_print_lfs_df
4691 run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
4694 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4695 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
4697 test_mkdir $DIR/$tdir
4698 createmany -o $DIR/$tdir/t- 1000
4699 $LFS getstripe $DIR/$tdir > $TMP/$tfile
4700 for N in $(seq 0 $((OSTCOUNT - 1))); do
4701 OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
4702 END { printf("%0.0f", objs) }' $TMP/$tfile)
4703 OBJS0[$N]=$(grep -A 1 idx $TMP/$tfile | awk -vobjs=0 \
4704 '($1 == '$N') { objs += 1 } \
4705 END { printf("%0.0f", objs) }')
4706 log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
4708 unlinkmany $DIR/$tdir/t- 1000
4711 for N in $(seq 1 $((OSTCOUNT - 1))); do
4712 [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] &&
4713 error "OST $N has less objects vs OST $NLAST" \
4714 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4715 [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] &&
4716 error "OST $N has less objects vs OST $NLAST" \
4717 " (${OBJS[$N]} < ${OBJS[$NLAST]}"
4719 [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] &&
4720 error "OST $N has less #0 objects vs OST $NLAST" \
4721 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4722 [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] &&
4723 error "OST $N has less #0 objects vs OST $NLAST" \
4724 " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
4729 run_test 51d "check object distribution"
4732 if [ "$mds1_FSTYPE" != ldiskfs ]; then
4733 skip_env "ldiskfs only test"
4736 test_mkdir -c1 $DIR/$tdir
4737 test_mkdir -c1 $DIR/$tdir/d0
4739 touch $DIR/$tdir/d0/foo
4740 createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
4741 error "file exceed 65000 nlink limit!"
4742 unlinkmany $DIR/$tdir/d0/f- 65001
4745 run_test 51e "check file nlink limit"
4748 test_mkdir $DIR/$tdir
4751 local ulimit_old=$(ulimit -n)
4752 local spare=20 # number of spare fd's for scripts/libraries, etc.
4753 local mdt=$($LFS getstripe -m $DIR/$tdir)
4754 local numfree=$($LFS df -i $DIR/$tdir | awk '/MDT:'$mdt'/ { print $4 }')
4756 echo "MDT$mdt numfree=$numfree, max=$max"
4757 [[ $numfree -gt $max ]] && numfree=$max || numfree=$((numfree * 7 / 8))
4758 if [ $((numfree + spare)) -gt $ulimit_old ]; then
4759 while ! ulimit -n $((numfree + spare)); do
4760 numfree=$((numfree * 3 / 4))
4762 echo "changed ulimit from $ulimit_old to $((numfree + spare))"
4764 echo "left ulimit at $ulimit_old"
4767 createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
4768 unlinkmany $DIR/$tdir/f $numfree
4769 error "create+open $numfree files in $DIR/$tdir failed"
4771 ulimit -n $ulimit_old
4773 # if createmany exits at 120s there will be fewer than $numfree files
4774 unlinkmany $DIR/$tdir/f $numfree || true
4776 run_test 51f "check many open files limit"
4779 [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
4780 test_mkdir $DIR/$tdir
4781 touch $DIR/$tdir/foo
4782 chattr +a $DIR/$tdir/foo || error "chattr +a failed"
4783 echo bar >> $DIR/$tdir/foo || error "append bar failed"
4784 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4785 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4786 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4788 echo foo >> $DIR/$tdir/foo || error "append foo failed"
4789 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4790 lsattr $DIR/$tdir/foo | egrep -q "^-+a[-e]+ $DIR/$tdir/foo" ||
4792 chattr -a $DIR/$tdir/foo || error "chattr -a failed"
4793 cp -r $DIR/$tdir $TMP/
4794 rm -fr $DIR/$tdir $TMP/$tdir || error "cleanup rm failed"
4796 run_test 52a "append-only flag test (should return errors)"
4799 [ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo
4800 test_mkdir $DIR/$tdir
4801 touch $DIR/$tdir/foo
4802 chattr +i $DIR/$tdir/foo || error "chattr +i failed"
4803 cat test > $DIR/$tdir/foo && error "cat test worked"
4804 cp /etc/hosts $DIR/$tdir/foo && error "cp worked"
4805 rm -f $DIR/$tdir/foo 2>/dev/null && error "rm worked"
4806 link $DIR/$tdir/foo $DIR/$tdir/foo_link 2>/dev/null &&
4808 echo foo >> $DIR/$tdir/foo && error "echo worked"
4809 mrename $DIR/$tdir/foo $DIR/$tdir/foo_ren && error "rename worked"
4810 [ -f $DIR/$tdir/foo ] || error "$tdir/foo is not a file"
4811 [ -f $DIR/$tdir/foo_ren ] && error "$tdir/foo_ren is not a file"
4812 lsattr $DIR/$tdir/foo | egrep -q "^-+i[-e]+ $DIR/$tdir/foo" ||
4814 chattr -i $DIR/$tdir/foo || error "chattr failed"
4816 rm -fr $DIR/$tdir || error "unable to remove $DIR/$tdir"
4818 run_test 52b "immutable flag test (should return errors) ======="
4821 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4822 remote_mds_nodsh && skip "remote MDS with nodsh"
4823 remote_ost_nodsh && skip "remote OST with nodsh"
4836 local support_last_seq=true
4838 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
4839 support_last_seq=false
4842 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
4844 for value in $(do_facet $SINGLEMDS \
4845 $LCTL get_param osp.$mdtosc.prealloc_last_id) ; do
4846 param=$(echo ${value[0]} | cut -d "=" -f1)
4847 ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
4849 if $support_last_seq; then
4850 param_seq=$(echo $param |
4851 sed -e s/prealloc_last_id/prealloc_last_seq/g)
4852 mds_last_seq=$(do_facet $SINGLEMDS \
4853 $LCTL get_param -n $param_seq)
4855 mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
4857 ostnum=$(index_from_ostuuid ${ostname}_UUID)
4858 node=$(facet_active_host ost$((ostnum+1)))
4859 param="obdfilter.$ostname.last_id"
4860 for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
4861 echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
4862 ost_last_id=$ost_last
4864 if $support_last_seq; then
4865 ost_last_id=$(echo $ost_last |
4866 awk -F':' '{print $2}' |
4868 ost_last_seq=$(echo $ost_last |
4869 awk -F':' '{print $1}')
4870 [[ $ost_last_seq = $mds_last_seq ]] || continue
4873 if [[ $ost_last_id != $mds_last ]]; then
4874 error "$ost_last_id != $mds_last"
4881 $found || error "can not match last_seq/last_id for $mdtosc"
4884 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
4887 perl -MSocket -e ';' || skip "no Socket perl module installed"
4889 $SOCKETSERVER $DIR/socket ||
4890 error "$SOCKETSERVER $DIR/socket failed: $?"
4891 $SOCKETCLIENT $DIR/socket ||
4892 error "$SOCKETCLIENT $DIR/socket failed: $?"
4893 $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
4895 run_test 54a "unix domain socket test =========================="
4901 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1
4903 run_test 54b "char device works in lustre ======================"
4906 [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
4907 [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
4908 [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
4910 for i in $(seq 3 7); do
4911 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
4920 loopdev="$DIR/loop54c"
4923 $UMOUNT $DIR/$tdir || rc=$?
4924 losetup -d $loopdev || true
4925 losetup -d $LOOPDEV || true
4926 rm -rf $loopdev $DIR/$tfile $DIR/$tdir
4931 [ $PARALLEL == "yes" ] && skip "skip parallel run"
4933 loopdev="$DIR/loop54c"
4936 [ -z "$LOOPNUM" ] && skip_env "couldn't find empty loop device"
4937 trap cleanup_54c EXIT
4938 mknod $loopdev b 7 $LOOPNUM
4939 echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
4940 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE seek=1024 count=1 > /dev/null
4941 losetup $loopdev $DIR/$tfile ||
4942 error "can't set up $loopdev for $DIR/$tfile"
4943 mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
4944 test_mkdir $DIR/$tdir
4945 mount -t ext2 $loopdev $DIR/$tdir ||
4946 error "error mounting $loopdev on $DIR/$tdir"
4947 dd if=/dev/zero of=$DIR/$tdir/tmp bs=$PAGE_SIZE count=30 ||
4950 dd if=$DIR/$tdir/tmp of=/dev/zero bs=$PAGE_SIZE count=30 ||
4954 run_test 54c "block device works in lustre ====================="
4960 [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string"
4962 run_test 54d "fifo device works in lustre ======================"
4967 cp -aL /dev/console $f
4968 echo $string > $f || error "echo $string to $f failed"
4970 run_test 54e "console/tty device works in lustre ======================"
4974 local dir=$DIR/$tdir
4977 test_mkdir -p $dir/dir
4978 for i in $(seq $numfiles); do
4980 touch $dir/dir/file$i
4983 local numcomp=$($LFS getstripe --component-count $dir)
4985 [[ $numcomp == 0 ]] && numcomp=1
4987 # test lfs getstripe with --recursive
4988 local filenum=$($LFS getstripe -r $dir | egrep -c "obdidx|l_ost_idx")
4990 [[ $filenum -eq $((numfiles * 2)) ]] ||
4991 error "$LFS getstripe -r: found $filenum != $((numfiles * 2))"
4992 filenum=$($LFS getstripe $dir | egrep -c "obdidx|l_ost_idx")
4993 [[ $filenum -eq $numfiles ]] ||
4994 error "$LFS getstripe $dir: found $filenum, not $numfiles"
4995 echo "$LFS getstripe showed obdidx or l_ost_idx"
4997 # test lfs getstripe with file instead of dir
4998 filenum=$($LFS getstripe $dir/file1 | egrep -c "obdidx|l_ost_idx")
4999 [[ $filenum -eq 1 ]] ||
5000 error "$LFS getstripe $dir/file1: found $filenum, not 1"
5001 echo "$LFS getstripe file1 passed"
5003 #test lfs getstripe with --verbose
5004 filenum=$($LFS getstripe --verbose $dir | grep -c lmm_magic)
5005 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
5006 error "$LFS getstripe --verbose $dir: "\
5007 "got $filenum want $((numfiles * numcomp)) lmm_magic"
5008 [[ $($LFS getstripe $dir | grep -c lmm_magic) -eq 0 ]] ||
5009 error "$LFS getstripe $dir: showed lmm_magic"
5011 #test lfs getstripe with -v prints lmm_fid
5012 filenum=$($LFS getstripe -v $dir | grep -c lmm_fid)
5013 [[ $filenum -eq $((numfiles * numcomp)) ]] ||
5014 error "$LFS getstripe -v $dir: "\
5015 "got $filenum want $((numfiles * numcomp)) lmm_fid"
5016 [[ $($LFS getstripe $dir | grep -c lmm_fid) -eq 0 ]] ||
5017 error "$LFS getstripe $dir: showed lmm_fid by default"
5018 echo "$LFS getstripe --verbose passed"
5020 #check for FID information
5021 local fid1=$($LFS getstripe --fid $dir/file1)
5022 local fid2=$($LFS getstripe --verbose $dir/file1 |
5023 awk '/lmm_fid: / { print $2; exit; }')
5024 local fid3=$($LFS path2fid $dir/file1)
5026 [ "$fid1" != "$fid2" ] &&
5027 error "getstripe --fid '$fid1' != getstripe --verbose '$fid2'"
5028 [ "$fid1" != "$fid3" ] &&
5029 error "getstripe --fid '$fid1' != lfs path2fid '$fid3'"
5030 echo "$LFS getstripe --fid passed"
5032 #test lfs getstripe with --obd
5033 $LFS getstripe --obd wrong_uuid $dir 2>&1 | grep -q "unknown obduuid" ||
5034 error "$LFS getstripe --obd wrong_uuid: should return error"
5036 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5039 local obduuid=$(ostuuid_from_index $ostidx)
5040 local found=$($LFS getstripe -r --obd $obduuid $dir |
5041 grep 'lmm_stripe_offset:' | grep -c " $ostidx\$")
5043 filenum=$($LFS getstripe -ir $dir | grep -c "^$ostidx\$")
5044 [[ $($LFS getstripe -id $dir) -ne $ostidx ]] ||
5046 [[ $($LFS getstripe -id $dir/dir) -ne $ostidx ]] ||
5049 [[ $found -eq $filenum ]] ||
5050 error "$LFS getstripe --obd: found $found expect $filenum"
5051 [[ $($LFS getstripe -r -v --obd $obduuid $dir |
5052 sed '/^[ ]*'${ostidx}'[ ]/d' |
5053 sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] ||
5054 error "$LFS getstripe --obd: should not show file on other obd"
5055 echo "$LFS getstripe --obd passed"
5057 run_test 56a "check $LFS getstripe"
5060 local dir=$DIR/$tdir
5064 for i in $(seq $numdirs); do
5065 test_mkdir $dir/dir$i
5068 # test lfs getdirstripe default mode is non-recursion, which is
5069 # different from lfs getstripe
5070 local dircnt=$($LFS getdirstripe $dir | grep -c lmv_stripe_count)
5072 [[ $dircnt -eq 1 ]] ||
5073 error "$LFS getdirstripe: found $dircnt, not 1"
5074 dircnt=$($LFS getdirstripe --recursive $dir |
5075 grep -c lmv_stripe_count)
5076 [[ $dircnt -eq $((numdirs + 1)) ]] ||
5077 error "$LFS getdirstripe -r: $dircnt, != $((numdirs + 1))"
5079 run_test 56b "check $LFS getdirstripe"
5082 remote_ost_nodsh && skip "remote OST with nodsh"
5085 local ost_name=$(ostname_from_index $ost_idx)
5086 local old_status=$(ost_dev_status $ost_idx)
5088 [[ -z "$old_status" ]] ||
5089 skip_env "OST $ost_name is in $old_status status"
5091 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
5092 [[ $OST1_VERSION -ge $(version_code 2.12.3) ]] && do_facet ost1 \
5093 $LCTL set_param -n obdfilter.$ost_name.no_precreate=1
5096 local new_status=$(ost_dev_status $ost_idx)
5098 [[ "$new_status" =~ "D" ]] ||
5099 error "$ost_name status is '$new_status', missing 'D'"
5100 if [[ $OST1_VERSION -ge $(version_code 2.12.3) ]]; then
5101 [[ "$new_status" =~ "N" ]] ||
5102 error "$ost_name status is '$new_status', missing 'N'"
5105 do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
5106 [[ $OST1_VERSION -ge $(version_code 2.12.3) ]] && do_facet ost1 \
5107 $LCTL set_param -n obdfilter.$ost_name.no_precreate=0
5110 new_status=$(ost_dev_status $ost_idx)
5111 [[ ! "$new_status" =~ "D" && ! "$new_status" =~ "N" ]] ||
5112 error "$ost_name status is '$new_status', has 'D' and/or 'N'"
5114 run_test 56c "check 'lfs df' showing device status"
5119 local local_tdir="$1"
5120 local local_numfiles="$2"
5121 local local_numdirs="$3"
5122 local dir_params="$4"
5123 local dir_stripe_params="$5"
5125 if [ ! -d "$local_tdir" ] ; then
5126 test_mkdir -p $dir_stripe_params $local_tdir
5127 [ "$dir_params" ] && $LFS setstripe $dir_params $local_tdir
5128 for i in $(seq $local_numfiles) ; do
5129 touch $local_tdir/file$i
5131 for i in $(seq $local_numdirs) ; do
5132 test_mkdir $dir_stripe_params $local_tdir/dir$i
5133 for j in $(seq $local_numfiles) ; do
5134 touch $local_tdir/dir$i/file$j
5140 setup_56_special() {
5142 local local_numfiles=$2
5143 local local_numdirs=$3
5145 setup_56 $local_tdir $local_numfiles $local_numdirs
5147 if [ ! -e "$local_tdir/loop${local_numfiles}b" ] ; then
5148 for i in $(seq $local_numfiles) ; do
5149 mknod $local_tdir/loop${i}b b 7 $i
5150 mknod $local_tdir/null${i}c c 1 3
5151 ln -s $local_tdir/file1 $local_tdir/link${i}
5153 for i in $(seq $local_numdirs) ; do
5154 mknod $local_tdir/dir$i/loop${i}b b 7 $i
5155 mknod $local_tdir/dir$i/null${i}c c 1 3
5156 ln -s $local_tdir/dir$i/file1 $local_tdir/dir$i/link${i}
5162 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5163 local expected=$(($NUMDIRS + 2))
5165 setup_56 $dir $NUMFILES $NUMDIRS
5167 # test lfs find with -name
5168 for i in $(seq $NUMFILES) ; do
5169 local nums=$($LFS find -name "*$i" $dir | wc -l)
5171 [ $nums -eq $expected ] ||
5172 error "lfs find -name '*$i' $dir wrong: "\
5173 "found $nums, expected $expected"
5176 run_test 56g "check lfs find -name"
5179 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5180 local expected=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES))
5182 setup_56 $dir $NUMFILES $NUMDIRS
5184 # test lfs find with ! -name
5185 for i in $(seq $NUMFILES) ; do
5186 local nums=$($LFS find ! -name "*$i" $dir | wc -l)
5188 [ $nums -eq $expected ] ||
5189 error "lfs find ! -name '*$i' $dir wrong: "\
5190 "found $nums, expected $expected"
5193 run_test 56h "check lfs find ! -name"
5196 local dir=$DIR/$tdir
5200 local cmd="$LFS find -ost $(ostuuid_from_index 0 $dir) $dir"
5203 [ -z "$out" ] || error "'$cmd' returned directory '$out'"
5205 run_test 56i "check 'lfs find -ost UUID' skips directories"
5208 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5210 setup_56_special $dir $NUMFILES $NUMDIRS
5212 local expected=$((NUMDIRS + 1))
5213 local cmd="$LFS find -type d $dir"
5214 local nums=$($cmd | wc -l)
5216 [ $nums -eq $expected ] ||
5217 error "'$cmd' wrong: found $nums, expected $expected"
5219 run_test 56j "check lfs find -type d"
5222 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5224 setup_56_special $dir $NUMFILES $NUMDIRS
5226 local expected=$(((NUMDIRS + 1) * NUMFILES))
5227 local cmd="$LFS find -type f $dir"
5228 local nums=$($cmd | wc -l)
5230 [ $nums -eq $expected ] ||
5231 error "'$cmd' wrong: found $nums, expected $expected"
5233 run_test 56k "check lfs find -type f"
5236 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5238 setup_56_special $dir $NUMFILES $NUMDIRS
5240 local expected=$((NUMDIRS + NUMFILES))
5241 local cmd="$LFS find -type b $dir"
5242 local nums=$($cmd | wc -l)
5244 [ $nums -eq $expected ] ||
5245 error "'$cmd' wrong: found $nums, expected $expected"
5247 run_test 56l "check lfs find -type b"
5250 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5252 setup_56_special $dir $NUMFILES $NUMDIRS
5254 local expected=$((NUMDIRS + NUMFILES))
5255 local cmd="$LFS find -type c $dir"
5256 local nums=$($cmd | wc -l)
5257 [ $nums -eq $expected ] ||
5258 error "'$cmd' wrong: found $nums, expected $expected"
5260 run_test 56m "check lfs find -type c"
5263 local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE
5264 setup_56_special $dir $NUMFILES $NUMDIRS
5266 local expected=$((NUMDIRS + NUMFILES))
5267 local cmd="$LFS find -type l $dir"
5268 local nums=$($cmd | wc -l)
5270 [ $nums -eq $expected ] ||
5271 error "'$cmd' wrong: found $nums, expected $expected"
5273 run_test 56n "check lfs find -type l"
5276 local dir=$DIR/$tdir
5278 setup_56 $dir $NUMFILES $NUMDIRS
5279 utime $dir/file1 > /dev/null || error "utime (1)"
5280 utime $dir/file2 > /dev/null || error "utime (2)"
5281 utime $dir/dir1 > /dev/null || error "utime (3)"
5282 utime $dir/dir2 > /dev/null || error "utime (4)"
5283 utime $dir/dir1/file1 > /dev/null || error "utime (5)"
5284 dd if=/dev/zero count=1 >> $dir/dir1/file1 && sync
5287 local nums=$($LFS find -mtime +0 $dir | wc -l)
5289 [ $nums -eq $expected ] ||
5290 error "lfs find -mtime +0 $dir: found $nums expect $expected"
5293 cmd="$LFS find -mtime 0 $dir"
5294 nums=$($cmd | wc -l)
5295 [ $nums -eq $expected ] ||
5296 error "'$cmd' wrong: found $nums, expected $expected"
5298 run_test 56o "check lfs find -mtime for old files"
5301 [ $RUNAS_ID -eq $UID ] &&
5302 skip_env "RUNAS_ID = UID = $UID -- skipping"
5304 local dir=$DIR/$tdir
5306 setup_56 $dir $NUMFILES $NUMDIRS
5307 chown $RUNAS_ID $dir/file* || error "chown $DIR/${tdir}g/file$i failed"
5309 local expected=$NUMFILES
5310 local cmd="$LFS find -uid $RUNAS_ID $dir"
5311 local nums=$($cmd | wc -l)
5313 [ $nums -eq $expected ] ||
5314 error "'$cmd' wrong: found $nums, expected $expected"
5316 expected=$(((NUMFILES + 1) * NUMDIRS + 1))
5317 cmd="$LFS find ! -uid $RUNAS_ID $dir"
5318 nums=$($cmd | wc -l)
5319 [ $nums -eq $expected ] ||
5320 error "'$cmd' wrong: found $nums, expected $expected"
5322 run_test 56p "check lfs find -uid and ! -uid"
5325 [ $RUNAS_ID -eq $UID ] &&
5326 skip_env "RUNAS_ID = UID = $UID -- skipping"
5328 local dir=$DIR/$tdir
5330 setup_56 $dir $NUMFILES $NUMDIRS
5331 chgrp $RUNAS_GID $dir/file* || error "chown $dir/file$i failed"
5333 local expected=$NUMFILES
5334 local cmd="$LFS find -gid $RUNAS_GID $dir"
5335 local nums=$($cmd | wc -l)
5337 [ $nums -eq $expected ] ||
5338 error "'$cmd' wrong: found $nums, expected $expected"
5340 expected=$(( ($NUMFILES+1) * $NUMDIRS + 1))
5341 cmd="$LFS find ! -gid $RUNAS_GID $dir"
5342 nums=$($cmd | wc -l)
5343 [ $nums -eq $expected ] ||
5344 error "'$cmd' wrong: found $nums, expected $expected"
5346 run_test 56q "check lfs find -gid and ! -gid"
5349 local dir=$DIR/$tdir
5351 setup_56 $dir $NUMFILES $NUMDIRS
5354 local cmd="$LFS find -size 0 -type f -lazy $dir"
5355 local nums=$($cmd | wc -l)
5357 [ $nums -eq $expected ] ||
5358 error "'$cmd' wrong: found $nums, expected $expected"
5359 cmd="$LFS find -size 0 -type f $dir"
5360 nums=$($cmd | wc -l)
5361 [ $nums -eq $expected ] ||
5362 error "'$cmd' wrong: found $nums, expected $expected"
5365 cmd="$LFS find ! -size 0 -type f -lazy $dir"
5366 nums=$($cmd | wc -l)
5367 [ $nums -eq $expected ] ||
5368 error "'$cmd' wrong: found $nums, expected $expected"
5369 cmd="$LFS find ! -size 0 -type f $dir"
5370 nums=$($cmd | wc -l)
5371 [ $nums -eq $expected ] ||
5372 error "'$cmd' wrong: found $nums, expected $expected"
5374 echo "test" > $dir/$tfile
5375 echo "test2" > $dir/$tfile.2 && sync
5377 cmd="$LFS find -size 5 -type f -lazy $dir"
5378 nums=$($cmd | wc -l)
5379 [ $nums -eq $expected ] ||
5380 error "'$cmd' wrong: found $nums, expected $expected"
5381 cmd="$LFS find -size 5 -type f $dir"
5382 nums=$($cmd | wc -l)
5383 [ $nums -eq $expected ] ||
5384 error "'$cmd' wrong: found $nums, expected $expected"
5387 cmd="$LFS find -size +5 -type f -lazy $dir"
5388 nums=$($cmd | wc -l)
5389 [ $nums -eq $expected ] ||
5390 error "'$cmd' wrong: found $nums, expected $expected"
5391 cmd="$LFS find -size +5 -type f $dir"
5392 nums=$($cmd | wc -l)
5393 [ $nums -eq $expected ] ||
5394 error "'$cmd' wrong: found $nums, expected $expected"
5397 cmd="$LFS find -size +0 -type f -lazy $dir"
5398 nums=$($cmd | wc -l)
5399 [ $nums -eq $expected ] ||
5400 error "'$cmd' wrong: found $nums, expected $expected"
5401 cmd="$LFS find -size +0 -type f $dir"
5402 nums=$($cmd | wc -l)
5403 [ $nums -eq $expected ] ||
5404 error "'$cmd' wrong: found $nums, expected $expected"
5407 cmd="$LFS find ! -size -5 -type f -lazy $dir"
5408 nums=$($cmd | wc -l)
5409 [ $nums -eq $expected ] ||
5410 error "'$cmd' wrong: found $nums, expected $expected"
5411 cmd="$LFS find ! -size -5 -type f $dir"
5412 nums=$($cmd | wc -l)
5413 [ $nums -eq $expected ] ||
5414 error "'$cmd' wrong: found $nums, expected $expected"
5417 cmd="$LFS find -size -5 -type f -lazy $dir"
5418 nums=$($cmd | wc -l)
5419 [ $nums -eq $expected ] ||
5420 error "'$cmd' wrong: found $nums, expected $expected"
5421 cmd="$LFS find -size -5 -type f $dir"
5422 nums=$($cmd | wc -l)
5423 [ $nums -eq $expected ] ||
5424 error "'$cmd' wrong: found $nums, expected $expected"
5426 run_test 56r "check lfs find -size works"
5433 cancel_lru_locks $OSC
5435 local rpcs_before=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5436 local nums=$($cmd | wc -l)
5438 [ $nums -eq $expected ] ||
5439 error "'$cmd' wrong: found $nums, expected $expected"
5441 local rpcs_after=$(calc_stats $OSC.*$OSC*.stats ldlm_glimpse_enqueue)
5443 if (( rpcs_before + glimpses != rpcs_after )); then
5444 echo "Before: $rpcs_before After: $rpcs_after $NUMFILES"
5445 $LCTL get_param osc.*.stats | grep ldlm_glimpse_enqueue
5447 if [[ $glimpses == 0 ]]; then
5448 error "'$cmd' should not send glimpse RPCs to OST"
5450 error "'$cmd' should send $glimpses glimpse RPCs to OST"
5456 [[ $MDS1_VERSION -ge $(version_code 2.12.4) ]] ||
5457 skip "MDS < 2.12.4 doesn't return LSOM data"
5458 local dir=$DIR/$tdir
5460 [[ $OSC == "mdc" ]] && skip "DoM files"
5462 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5463 # open and close all files to ensure LSOM is updated
5464 cancel_lru_locks $OSC
5465 find $dir -type f | xargs cat > /dev/null
5467 # expect_found glimpse_rpcs command_to_run
5468 test_56ra_sub 12 0 "$LFS find -size 0 -type f -lazy $dir"
5469 test_56ra_sub 12 12 "$LFS find -size 0 -type f $dir"
5470 test_56ra_sub 0 0 "$LFS find ! -size 0 -type f -lazy $dir"
5471 test_56ra_sub 0 12 "$LFS find ! -size 0 -type f $dir"
5473 echo "test" > $dir/$tfile
5474 echo "test2" > $dir/$tfile.2 && sync
5475 cancel_lru_locks $OSC
5476 cat $dir/$tfile $dir/$tfile.2 > /dev/null
5478 test_56ra_sub 1 0 "$LFS find -size 5 -type f -lazy $dir"
5479 test_56ra_sub 1 14 "$LFS find -size 5 -type f $dir"
5480 test_56ra_sub 1 0 "$LFS find -size +5 -type f -lazy $dir"
5481 test_56ra_sub 1 14 "$LFS find -size +5 -type f $dir"
5483 test_56ra_sub 2 0 "$LFS find -size +0 -type f -lazy $dir"
5484 test_56ra_sub 2 14 "$LFS find -size +0 -type f $dir"
5485 test_56ra_sub 2 0 "$LFS find ! -size -5 -type f -lazy $dir"
5486 test_56ra_sub 2 14 "$LFS find ! -size -5 -type f $dir"
5487 test_56ra_sub 12 0 "$LFS find -size -5 -type f -lazy $dir"
5488 test_56ra_sub 12 14 "$LFS find -size -5 -type f $dir"
5490 run_test 56ra "check lfs find -size -lazy works for data on OSTs"
5492 test_56s() { # LU-611 #LU-9369
5493 [[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
5495 local dir=$DIR/$tdir
5496 local onestripe=$(((NUMDIRS + 1) * NUMFILES))
5498 setup_56 $dir $NUMFILES $NUMDIRS "-c 1"
5499 for i in $(seq $NUMDIRS); do
5500 $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile
5503 local expected=$NUMDIRS
5504 local cmd="$LFS find -c $OSTCOUNT $dir"
5505 local nums=$($cmd | wc -l)
5507 [ $nums -eq $expected ] || {
5508 $LFS getstripe -R $dir
5509 error "'$cmd' wrong: found $nums, expected $expected"
5512 expected=$((NUMDIRS + onestripe))
5513 cmd="$LFS find -stripe-count +0 -type f $dir"
5514 nums=$($cmd | wc -l)
5515 [ $nums -eq $expected ] || {
5516 $LFS getstripe -R $dir
5517 error "'$cmd' wrong: found $nums, expected $expected"
5521 cmd="$LFS find -stripe-count 1 -type f $dir"
5522 nums=$($cmd | wc -l)
5523 [ $nums -eq $expected ] || {
5524 $LFS getstripe -R $dir
5525 error "'$cmd' wrong: found $nums, expected $expected"
5528 cmd="$LFS find -stripe-count -2 -type f $dir"
5529 nums=$($cmd | wc -l)
5530 [ $nums -eq $expected ] || {
5531 $LFS getstripe -R $dir
5532 error "'$cmd' wrong: found $nums, expected $expected"
5536 cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir"
5537 nums=$($cmd | wc -l)
5538 [ $nums -eq $expected ] || {
5539 $LFS getstripe -R $dir
5540 error "'$cmd' wrong: found $nums, expected $expected"
5543 run_test 56s "check lfs find -stripe-count works"
5545 test_56t() { # LU-611 #LU-9369
5546 local dir=$DIR/$tdir
5548 setup_56 $dir 0 $NUMDIRS
5549 for i in $(seq $NUMDIRS); do
5550 $LFS setstripe -S 8M $dir/dir$i/$tfile
5553 local expected=$NUMDIRS
5554 local cmd="$LFS find -S 8M $dir"
5555 local nums=$($cmd | wc -l)
5557 [ $nums -eq $expected ] || {
5558 $LFS getstripe -R $dir
5559 error "'$cmd' wrong: found $nums, expected $expected"
5563 setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k"
5565 $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3}
5567 expected=$(((NUMDIRS + 1) * NUMFILES))
5568 cmd="$LFS find -stripe-size 512k -type f $dir"
5569 nums=$($cmd | wc -l)
5570 [ $nums -eq $expected ] ||
5571 error "'$cmd' wrong: found $nums, expected $expected"
5573 cmd="$LFS find -stripe-size +320k -type f $dir"
5574 nums=$($cmd | wc -l)
5575 [ $nums -eq $expected ] ||
5576 error "'$cmd' wrong: found $nums, expected $expected"
5578 expected=$(((NUMDIRS + 1) * NUMFILES + 4))
5579 cmd="$LFS find -stripe-size +200k -type f $dir"
5580 nums=$($cmd | wc -l)
5581 [ $nums -eq $expected ] ||
5582 error "'$cmd' wrong: found $nums, expected $expected"
5584 cmd="$LFS find -stripe-size -640k -type f $dir"
5585 nums=$($cmd | wc -l)
5586 [ $nums -eq $expected ] ||
5587 error "'$cmd' wrong: found $nums, expected $expected"
5590 cmd="$LFS find -stripe-size 256k -type f $dir"
5591 nums=$($cmd | wc -l)
5592 [ $nums -eq $expected ] ||
5593 error "'$cmd' wrong: found $nums, expected $expected"
5595 cmd="$LFS find -stripe-size -320k -type f $dir"
5596 nums=$($cmd | wc -l)
5597 [ $nums -eq $expected ] ||
5598 error "'$cmd' wrong: found $nums, expected $expected"
5601 cmd="$LFS find -stripe-size 1024k -type f $dir"
5602 nums=$($cmd | wc -l)
5603 [ $nums -eq $expected ] ||
5604 error "'$cmd' wrong: found $nums, expected $expected"
5606 run_test 56t "check lfs find -stripe-size works"
5608 test_56u() { # LU-611
5609 local dir=$DIR/$tdir
5611 setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1"
5613 if [[ $OSTCOUNT -gt 1 ]]; then
5614 $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3}
5620 local expected=$(((NUMDIRS + 1) * NUMFILES))
5621 local cmd="$LFS find -stripe-index 0 -type f $dir"
5622 local nums=$($cmd | wc -l)
5624 [ $nums -eq $expected ] ||
5625 error "'$cmd' wrong: found $nums, expected $expected"
5628 cmd="$LFS find -stripe-index 1 -type f $dir"
5629 nums=$($cmd | wc -l)
5630 [ $nums -eq $expected ] ||
5631 error "'$cmd' wrong: found $nums, expected $expected"
5633 cmd="$LFS find ! -stripe-index 0 -type f $dir"
5634 nums=$($cmd | wc -l)
5635 [ $nums -eq $expected ] ||
5636 error "'$cmd' wrong: found $nums, expected $expected"
5639 # This should produce an error and not return any files
5640 cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir"
5641 nums=$($cmd 2>/dev/null | wc -l)
5642 [ $nums -eq $expected ] ||
5643 error "'$cmd' wrong: found $nums, expected $expected"
5645 if [[ $OSTCOUNT -gt 1 ]]; then
5646 expected=$(((NUMDIRS + 1) * NUMFILES + onestripe))
5647 cmd="$LFS find -stripe-index 0,1 -type f $dir"
5648 nums=$($cmd | wc -l)
5649 [ $nums -eq $expected ] ||
5650 error "'$cmd' wrong: found $nums, expected $expected"
5653 run_test 56u "check lfs find -stripe-index works"
5657 local dir=$DIR/$tdir
5659 setup_56 $dir $NUMFILES $NUMDIRS
5661 UUID=$(mdtuuid_from_index $mdt_idx $dir)
5662 [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $mdt_idx"
5664 for file in $($LFS find -m $UUID $dir); do
5665 file_midx=$($LFS getstripe -m $file)
5666 [ $file_midx -eq $mdt_idx ] ||
5667 error "lfs find -m $UUID != getstripe -m $file_midx"
5670 run_test 56v "check 'lfs find -m match with lfs getstripe -m'"
5673 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5674 [ $PARALLEL == "yes" ] && skip "skip parallel run"
5676 local dir=$DIR/$tdir
5678 setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
5680 local stripe_size=$($LFS getstripe -S -d $dir) ||
5681 error "$LFS getstripe -S -d $dir failed"
5682 stripe_size=${stripe_size%% *}
5684 local file_size=$((stripe_size * OSTCOUNT))
5685 local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
5686 local required_space=$((file_num * file_size))
5687 local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
5689 [[ $free_space -le $((required_space / 1024)) ]] &&
5690 skip_env "need $required_space, have $free_space kbytes"
5693 local dd_count=$((file_size / dd_bs))
5695 # write data into the files
5700 for i in $(seq $NUMFILES); do
5702 yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5703 error "write data into $file failed"
5705 for i in $(seq $NUMDIRS); do
5706 for j in $(seq $NUMFILES); do
5707 file=$dir/dir$i/file$j
5708 yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
5709 error "write data into $file failed"
5713 # $LFS_MIGRATE will fail if hard link migration is unsupported
5714 if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then
5715 createmany -l$dir/dir1/file1 $dir/dir1/link 200 ||
5716 error "creating links to $dir/dir1/file1 failed"
5721 [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
5724 local cmd="$LFS_MIGRATE -y -c $expected $dir/file1"
5727 eval $cmd || error "$cmd failed"
5729 check_stripe_count $dir/file1 $expected
5731 if [ $MDS1_VERSION -ge $(version_code 2.6.90) ];
5733 # lfs_migrate file onto OST 0 if it is on OST 1, or onto
5734 # OST 1 if it is on OST 0. This file is small enough to
5735 # be on only one stripe.
5736 file=$dir/migr_1_ost
5737 dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 ||
5738 error "write data into $file failed"
5739 local obdidx=$($LFS getstripe -i $file)
5740 local oldmd5=$(md5sum $file)
5743 [[ $obdidx -eq 0 ]] && newobdidx=1
5744 cmd="$LFS migrate -i $newobdidx $file"
5746 eval $cmd || error "$cmd failed"
5748 local realobdix=$($LFS getstripe -i $file)
5749 local newmd5=$(md5sum $file)
5751 [[ $newobdidx -ne $realobdix ]] &&
5752 error "new OST is different (was=$obdidx, "\
5753 "wanted=$newobdidx, got=$realobdix)"
5754 [[ "$oldmd5" != "$newmd5" ]] &&
5755 error "md5sum differ: $oldmd5, $newmd5"
5759 cmd="$LFS_MIGRATE -y -c $expected $dir/dir1"
5761 eval $cmd || error "$cmd failed"
5763 for j in $(seq $NUMFILES); do
5764 check_stripe_count $dir/dir1/file$j $expected
5767 # lfs_migrate works with lfs find
5768 cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir |
5769 $LFS_MIGRATE -y -c $expected"
5771 eval $cmd || error "$cmd failed"
5773 for i in $(seq 2 $NUMFILES); do
5774 check_stripe_count $dir/file$i $expected
5776 for i in $(seq 2 $NUMDIRS); do
5777 for j in $(seq $NUMFILES); do
5778 check_stripe_count $dir/dir$i/file$j $expected
5782 run_test 56w "check lfs_migrate -c stripe_count works"
5785 local file1=$DIR/$tdir/file1
5786 local create_pool=false
5787 local initial_pool=$($LFS getstripe -p $DIR)
5791 echo -n "Creating test dir..."
5792 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5795 echo -n "Creating test file..."
5796 touch $file1 || error "cannot create file"
5799 echo -n "Detecting existing pools..."
5800 pool_list=($($LFS pool_list $FSNAME | grep "$FSNAME\." | cut -d. -f2))
5802 if [ ${#pool_list[@]} -gt 0 ]; then
5803 echo "${pool_list[@]}"
5804 for thispool in "${pool_list[@]}"; do
5805 if [[ -z "$initial_pool" ||
5806 "$initial_pool" != "$thispool" ]]; then
5808 echo "Using existing pool '$pool'"
5813 echo "none detected."
5815 if [ -z "$pool" ]; then
5816 pool=${POOL:-testpool}
5817 [ "$initial_pool" = "$pool" ] && pool="testpool2"
5818 echo -n "Creating pool '$pool'..."
5820 pool_add $pool &> /dev/null ||
5821 error "pool_add failed"
5824 echo -n "Adding target to pool..."
5825 pool_add_targets $pool 0 0 1 &> /dev/null ||
5826 error "pool_add_targets failed"
5830 echo -n "Setting pool using -p option..."
5831 $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null ||
5832 error "migrate failed rc = $?"
5835 echo -n "Verifying test file is in pool after migrating..."
5836 [ "$($LFS getstripe -p $file1)" = $pool ] ||
5837 error "file was not migrated to pool $pool"
5840 echo -n "Removing test file from pool '$pool'..."
5841 # "lfs migrate $file" won't remove the file from the pool
5842 # until some striping information is changed.
5843 $LFS migrate -c 1 $file1 &> /dev/null ||
5844 error "cannot remove from pool"
5845 [ "$($LFS getstripe -p $file1)" ] &&
5846 error "pool still set"
5849 echo -n "Setting pool using --pool option..."
5850 $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null ||
5851 error "migrate failed rc = $?"
5856 if $create_pool; then
5857 destroy_test_pools 2> /dev/null ||
5858 error "destroy test pools failed"
5861 run_test 56wb "check lfs_migrate pool support"
5864 local file1="$DIR/$tdir/file1"
5871 echo -n "Creating test dir..."
5872 test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
5873 $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
5874 error "cannot set stripe by '-S 1M -c 1'"
5877 echo -n "Setting initial stripe for test file..."
5878 $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
5879 error "cannot set stripe"
5880 cur_ssize=$($LFS getstripe -S "$file1")
5881 [ $cur_ssize -eq 524288 ] || error "setstripe -S $cur_ssize != 524288"
5884 # File currently set to -S 512K -c 1
5886 # Ensure -c and -S options are rejected when -R is set
5887 echo -n "Verifying incompatible options are detected..."
5888 $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null &&
5889 error "incompatible -c and -R options not detected"
5890 $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null &&
5891 error "incompatible -S and -R options not detected"
5894 # Ensure unrecognized options are passed through to 'lfs migrate'
5895 echo -n "Verifying -S option is passed through to lfs migrate..."
5896 $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
5897 error "migration failed"
5898 cur_ssize=$($LFS getstripe -S "$file1")
5899 [ $cur_ssize -eq 1048576 ] || error "migrate -S $cur_ssize != 1048576"
5902 # File currently set to -S 1M -c 1
5904 # Ensure long options are supported
5905 echo -n "Verifying long options supported..."
5906 $LFS_MIGRATE -y --non-block "$file1" &> /dev/null ||
5907 error "long option without argument not supported"
5908 $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
5909 error "long option with argument not supported"
5910 cur_ssize=$($LFS getstripe -S "$file1")
5911 [ $cur_ssize -eq 524288 ] ||
5912 error "migrate --stripe-size $cur_ssize != 524288"
5915 # File currently set to -S 512K -c 1
5917 if [ "$OSTCOUNT" -gt 1 ]; then
5918 echo -n "Verifying explicit stripe count can be set..."
5919 $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
5920 error "migrate failed"
5921 cur_scount=$($LFS getstripe -c "$file1")
5922 [ $cur_scount -eq 2 ] || error "migrate -c $cur_scount != 2"
5926 # File currently set to -S 512K -c 1 or -S 512K -c 2
5928 # Ensure parent striping is used if -R is set, and no stripe
5929 # count or size is specified
5930 echo -n "Setting stripe for parent directory..."
5931 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5932 error "cannot set stripe '-S 2M -c 1'"
5935 echo -n "Verifying restripe option uses parent stripe settings..."
5936 parent_ssize=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
5937 parent_scount=$($LFS getstripe -c $DIR/$tdir 2>/dev/null)
5938 $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
5939 error "migrate failed"
5940 cur_ssize=$($LFS getstripe -S "$file1")
5941 [ $cur_ssize -eq $parent_ssize ] ||
5942 error "migrate -R stripe_size $cur_ssize != $parent_ssize"
5943 cur_scount=$($LFS getstripe -c "$file1")
5944 [ $cur_scount -eq $parent_scount ] ||
5945 error "migrate -R stripe_count $cur_scount != $parent_scount"
5948 # File currently set to -S 1M -c 1
5950 # Ensure striping is preserved if -R is not set, and no stripe
5951 # count or size is specified
5952 echo -n "Verifying striping size preserved when not specified..."
5953 orig_ssize=$($LFS getstripe -S "$file1" 2>/dev/null)
5954 $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
5955 error "cannot set stripe on parent directory"
5956 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5957 error "migrate failed"
5958 cur_ssize=$($LFS getstripe -S "$file1")
5959 [ $cur_ssize -eq $orig_ssize ] ||
5960 error "migrate by default $cur_ssize != $orig_ssize"
5963 # Ensure file name properly detected when final option has no argument
5964 echo -n "Verifying file name properly detected..."
5965 $LFS_MIGRATE -y "$file1" &> /dev/null ||
5966 error "file name interpreted as option argument"
5972 run_test 56wc "check unrecognized options for lfs_migrate are passed through"
5975 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
5977 local file1=$DIR/$tdir/file1
5979 echo -n "Creating test dir..."
5980 test_mkdir $DIR/$tdir || error "cannot create dir"
5983 echo -n "Creating test file..."
5987 # Ensure 'lfs migrate' will fail by using a non-existent option,
5988 # and make sure rsync is not called to recover
5989 echo -n "Make sure --no-rsync option works..."
5990 $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 |
5991 grep -q 'refusing to fall back to rsync' ||
5992 error "rsync was called with --no-rsync set"
5995 # Ensure rsync is called without trying 'lfs migrate' first
5996 echo -n "Make sure --rsync option works..."
5997 $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 |
5998 grep -q 'falling back to rsync' &&
5999 error "lfs migrate was called with --rsync set"
6002 echo -n "Make sure --rsync and --no-rsync options are exclusive..."
6003 $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 |
6004 grep -q 'at the same time' ||
6005 error "--rsync and --no-rsync accepted concurrently"
6011 run_test 56wd "check lfs_migrate --rsync and --no-rsync work"
6014 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6015 check_swap_layouts_support
6017 local dir=$DIR/$tdir
6018 local ref1=/etc/passwd
6019 local file1=$dir/file1
6021 test_mkdir $dir || error "creating dir $dir"
6022 $LFS setstripe -c 2 $file1
6024 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
6025 stripe=$($LFS getstripe -c $file1)
6026 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6027 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6032 run_test 56x "lfs migration support"
6035 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6036 check_swap_layouts_support
6038 local dir=$DIR/$tdir/$testnum
6042 local ref1=/etc/passwd
6043 local file1=$dir/file1
6045 $LFS setstripe -c 2 $file1
6047 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
6049 local stripe=$($LFS getstripe -c $file1)
6051 [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
6052 cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
6057 run_test 56xa "lfs migration --block support"
6059 check_migrate_links() {
6061 local file1="$dir/file1"
6064 local total_count=$(($begin + $count - 1))
6065 local symlink_count=10
6068 if [ ! -f "$file1" ]; then
6069 echo -n "creating initial file..."
6070 $LFS setstripe -c 1 -S "512k" "$file1" ||
6071 error "cannot setstripe initial file"
6074 echo -n "creating symlinks..."
6075 for s in $(seq 1 $symlink_count); do
6076 ln -s "$file1" "$dir/slink$s" ||
6077 error "cannot create symlinks"
6081 echo -n "creating nonlinked files..."
6082 createmany -o "$dir/uniq" 1 10 &> /dev/null ||
6083 error "cannot create nonlinked files"
6088 if [ ! -f "$dir/file$total_count" ]; then
6089 echo -n "creating hard links $begin:$total_count..."
6090 createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
6091 /dev/null || error "cannot create hard links"
6095 echo -n "checking number of hard links listed in xattrs..."
6096 local fid=$($LFS getstripe -F "$file1")
6097 local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
6100 if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
6101 skip "hard link list has unexpected size, skipping test"
6103 if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
6104 error "link names should exceed xattrs size"
6107 echo -n "migrating files..."
6108 local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir)
6110 [ $rc -eq 0 ] || error "migrate failed rc = $rc"
6113 # make sure all links have been properly migrated
6114 echo -n "verifying files..."
6115 fid=$($LFS getstripe -F "$file1") ||
6116 error "cannot get fid for file $file1"
6117 for i in $(seq 2 $total_count); do
6118 local fid2=$($LFS getstripe -F $dir/file$i)
6120 [ "$fid2" == "$fid" ] ||
6121 error "migrated hard link has mismatched FID"
6124 # make sure hard links were properly detected, and migration was
6125 # performed only once for the entire link set; nonlinked files should
6127 local actual=$(grep -c 'done' <<< "$migrate_out")
6128 local expected=$(($uniq_count + 1))
6130 [ "$actual" -eq "$expected" ] ||
6131 error "hard links individually migrated ($actual != $expected)"
6133 # make sure the correct number of hard links are present
6134 local hardlinks=$(stat -c '%h' "$file1")
6136 [ $hardlinks -eq $total_count ] ||
6137 error "num hard links $hardlinks != $total_count"
6144 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
6145 skip "Need MDS version at least 2.10.55"
6147 local dir="$DIR/$tdir"
6149 test_mkdir "$dir" || error "cannot create dir $dir"
6151 echo "testing lfs migrate mode when all links fit within xattrs"
6152 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 2 99
6154 echo "testing rsync mode when all links fit within xattrs"
6155 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 2 99
6157 echo "testing lfs migrate mode when all links do not fit within xattrs"
6158 LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100
6160 echo "testing rsync mode when all links do not fit within xattrs"
6161 LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 101 100
6167 run_test 56xb "lfs migration hard link support"
6170 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6172 local dir="$DIR/$tdir"
6174 test_mkdir "$dir" || error "cannot create dir $dir"
6176 # Test 1: ensure file < 1 GB is always migrated with 1 stripe
6177 echo -n "Setting initial stripe for 20MB test file..."
6178 $LFS setstripe -c 2 -i 0 "$dir/20mb" ||
6179 error "cannot setstripe 20MB file"
6181 echo -n "Sizing 20MB test file..."
6182 truncate "$dir/20mb" 20971520 || error "cannot create 20MB test file"
6184 echo -n "Verifying small file autostripe count is 1..."
6185 $LFS_MIGRATE -y -A -C 1 "$dir/20mb" ||
6186 error "cannot migrate 20MB file"
6187 local stripe_count=$($LFS getstripe -c "$dir/20mb") ||
6188 error "cannot get stripe for $dir/20mb"
6189 [ $stripe_count -eq 1 ] ||
6190 error "unexpected stripe count $stripe_count for 20MB file"
6194 # Test 2: File is small enough to fit within the available space on
6195 # sqrt(size_in_gb) + 1 OSTs but is larger than 1GB. The file must
6196 # have at least an additional 1KB for each desired stripe for test 3
6197 echo -n "Setting stripe for 1GB test file..."
6198 $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe 1GB file"
6200 echo -n "Sizing 1GB test file..."
6201 # File size is 1GB + 3KB
6202 truncate "$dir/1gb" 1073744896 || error "cannot create 1GB test file"
6205 # need at least 512MB per OST for 1GB file to fit in 2 stripes
6206 local avail=$($LCTL get_param -n llite.$FSNAME*.kbytesavail)
6207 if (( avail > 524288 * OSTCOUNT )); then
6208 echo -n "Migrating 1GB file..."
6209 $LFS_MIGRATE -y -A -C 1 "$dir/1gb" ||
6210 error "cannot migrate 1GB file"
6212 echo -n "Verifying autostripe count is sqrt(n) + 1..."
6213 stripe_count=$($LFS getstripe -c "$dir/1gb") ||
6214 error "cannot getstripe for 1GB file"
6215 [ $stripe_count -eq 2 ] ||
6216 error "unexpected stripe count $stripe_count != 2"
6220 # Test 3: File is too large to fit within the available space on
6221 # sqrt(n) + 1 OSTs. Simulate limited available space with -X
6222 if [ $OSTCOUNT -ge 3 ]; then
6223 # The required available space is calculated as
6224 # file size (1GB + 3KB) / OST count (3).
6225 local kb_per_ost=349526
6227 echo -n "Migrating 1GB file with limit..."
6228 $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" ||
6229 error "cannot migrate 1GB file with limit"
6232 stripe_count=$($LFS getstripe -c "$dir/1gb")
6233 echo -n "Verifying 1GB autostripe count with limited space..."
6234 [ "$stripe_count" -a $stripe_count -ge 3 ] ||
6235 error "unexpected stripe count $stripe_count (min 3)"
6242 run_test 56xc "lfs migration autostripe"
6245 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6247 local dir=$DIR/$tdir
6248 local f_mgrt=$dir/$tfile.mgrt
6249 local f_yaml=$dir/$tfile.yaml
6250 local f_copy=$dir/$tfile.copy
6251 local layout_yaml="-E 1M -S 512K -c 1 -E -1 -S 1M -c 2 -i 0"
6252 local layout_copy="-c 2 -S 2M -i 1"
6253 local yamlfile=$dir/yamlfile
6254 local layout_before;
6257 test_mkdir "$dir" || error "cannot create dir $dir"
6258 $LFS setstripe $layout_yaml $f_yaml ||
6259 error "cannot setstripe $f_yaml with layout $layout_yaml"
6260 $LFS getstripe --yaml $f_yaml > $yamlfile
6261 $LFS setstripe $layout_copy $f_copy ||
6262 error "cannot setstripe $f_copy with layout $layout_copy"
6264 dd if=/dev/zero of=$f_mgrt bs=1M count=4
6266 # 1. test option --yaml
6267 $LFS_MIGRATE -y --yaml $yamlfile $f_mgrt ||
6268 error "cannot migrate $f_mgrt with --yaml $yamlfile"
6269 layout_before=$(get_layout_param $f_yaml)
6270 layout_after=$(get_layout_param $f_mgrt)
6271 [ "$layout_after" == "$layout_before" ] ||
6272 error "lfs_migrate --yaml: $layout_after != $layout_before"
6274 # 2. test option --copy
6275 $LFS_MIGRATE -y --copy $f_copy $f_mgrt ||
6276 error "cannot migrate $f_mgrt with --copy $f_copy"
6277 layout_before=$(get_layout_param $f_copy)
6278 layout_after=$(get_layout_param $f_mgrt)
6279 [ "$layout_after" == "$layout_before" ] ||
6280 error "lfs_migrate --copy: $layout_after != $layout_before"
6282 run_test 56xd "check lfs_migrate --yaml and --copy support"
6285 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
6287 local dir=$DIR/$tdir
6288 local f_comp=$dir/$tfile
6289 local layout="-E 1M -S 512K -c 1 -E -1 -S 1M -c 2 -i 0"
6290 local layout_before=""
6291 local layout_after=""
6293 test_mkdir "$dir" || error "cannot create dir $dir"
6294 $LFS setstripe $layout $f_comp ||
6295 error "cannot setstripe $f_comp with layout $layout"
6296 layout_before=$(get_layout_param $f_comp)
6297 dd if=/dev/zero of=$f_comp bs=1M count=4
6299 # 1. migrate a comp layout file by lfs_migrate
6300 $LFS_MIGRATE -y $f_comp || error "cannot migrate $f_comp by lfs_migrate"
6301 layout_after=$(get_layout_param $f_comp)
6302 [ "$layout_before" == "$layout_after" ] ||
6303 error "lfs_migrate: $layout_before != $layout_after"
6305 # 2. migrate a comp layout file by lfs migrate
6306 $LFS migrate $f_comp || error "cannot migrate $f_comp by lfs migrate"
6307 layout_after=$(get_layout_param $f_comp)
6308 [ "$layout_before" == "$layout_after" ] ||
6309 error "lfs migrate: $layout_before != $layout_after"
6311 run_test 56xe "migrate a composite layout file"
6314 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
6315 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
6318 local dir=$DIR/$tdir
6322 test_mkdir -p $dir || error "creating dir $dir"
6323 touch $f1 || error "creating std file $f1"
6324 $MULTIOP $f2 H2c || error "creating released file $f2"
6326 # a directory can be raid0, so ask only for files
6327 res=$($LFS find $dir -L raid0 -type f | wc -l)
6328 [[ $res == 2 ]] || error "search raid0: found $res files != 2"
6330 res=$($LFS find $dir \! -L raid0 -type f | wc -l)
6331 [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
6333 # only files can be released, so no need to force file search
6334 res=$($LFS find $dir -L released)
6335 [[ $res == $f2 ]] || error "search released: found $res != $f2"
6337 res=$($LFS find $dir -type f \! -L released)
6338 [[ $res == $f1 ]] || error "search !released: found $res != $f1"
6340 run_test 56y "lfs find -L raid0|released"
6342 test_56z() { # LU-4824
6343 # This checks to make sure 'lfs find' continues after errors
6344 # There are two classes of errors that should be caught:
6345 # - If multiple paths are provided, all should be searched even if one
6347 # - If errors are encountered during the search, it should not terminate
6349 local dir=$DIR/$tdir
6353 for i in d{0..9}; do
6355 touch $dir/$i/$tfile
6357 $LFS find $DIR/non_existent_dir $dir &&
6358 error "$LFS find did not return an error"
6359 # Make a directory unsearchable. This should NOT be the last entry in
6360 # directory order. Arbitrarily pick the 6th entry
6361 chmod 700 $($LFS find $dir -type d | sed '6!d')
6363 $RUNAS $LFS find $DIR/non_existent $dir
6364 local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l)
6366 # The user should be able to see 10 directories and 9 files
6367 (( count == 19 )) ||
6368 error "$LFS find found $count != 19 entries after error"
6370 run_test 56z "lfs find should continue after an error"
6372 test_56aa() { # LU-5937
6373 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
6375 local dir=$DIR/$tdir
6378 $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
6380 createmany -o $dir/striped_dir/${tfile}- 1024
6381 local dirs=$($LFS find --size +8k $dir/)
6383 [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
6385 run_test 56aa "lfs find --size under striped dir"
6387 test_56ab() { # LU-10705
6388 test_mkdir $DIR/$tdir
6389 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
6390 dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
6391 dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
6392 # Flush writes to ensure valid blocks. Need to be more thorough for
6393 # ZFS, since blocks are not allocated/returned to client immediately.
6395 wait_zfs_commit ost1 2
6396 cancel_lru_locks osc
6399 local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
6401 [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
6403 files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
6404 [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
6406 rm -f $DIR/$tdir/$tfile.[123]
6408 run_test 56ab "lfs find --blocks"
6411 [ $MDS1_VERSION -lt $(version_code 2.10.50) ] &&
6412 skip "Need MDS version at least 2.10.50"
6414 # Create composite files with one component
6415 local dir=$DIR/$tdir
6417 setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
6418 # Create composite files with three components
6419 setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
6420 # Create non-composite files
6421 createmany -o $dir/${tfile}- 10
6423 local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l)
6425 [[ $nfiles == 10 ]] ||
6426 error "lfs find -E 1M found $nfiles != 10 files"
6428 nfiles=$($LFS find ! -E 1M --type f $dir | wc -l)
6429 [[ $nfiles == 25 ]] ||
6430 error "lfs find ! -E 1M found $nfiles != 25 files"
6432 # All files have a component that starts at 0
6433 nfiles=$($LFS find --component-start 0 --type f $dir | wc -l)
6434 [[ $nfiles == 35 ]] ||
6435 error "lfs find --component-start 0 - $nfiles != 35 files"
6437 nfiles=$($LFS find --component-start 2M --type f $dir | wc -l)
6438 [[ $nfiles == 15 ]] ||
6439 error "lfs find --component-start 2M - $nfiles != 15 files"
6441 # All files created here have a componenet that does not starts at 2M
6442 nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l)
6443 [[ $nfiles == 35 ]] ||
6444 error "lfs find ! --component-start 2M - $nfiles != 35 files"
6446 # Find files with a specified number of components
6447 local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l)
6448 [[ $nfiles == 15 ]] ||
6449 error "lfs find --component-count 3 - $nfiles != 15 files"
6451 # Remember non-composite files have a component count of zero
6452 local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l)
6453 [[ $nfiles == 10 ]] ||
6454 error "lfs find --component-count 0 - $nfiles != 10 files"
6456 nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l)
6457 [[ $nfiles == 20 ]] ||
6458 error "lfs find ! --component-count 3 - $nfiles != 20 files"
6460 # All files have a flag called "init"
6461 local nfiles=$($LFS find --component-flags init --type f $dir | wc -l)
6462 [[ $nfiles == 35 ]] ||
6463 error "lfs find --component-flags init - $nfiles != 35 files"
6465 # Multi-component files will have a component not initialized
6466 local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l)
6467 [[ $nfiles == 15 ]] ||
6468 error "lfs find !--component-flags init - $nfiles != 15 files"
6473 run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
6476 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
6477 skip "Need MDS version at least 2.10.57"
6487 # create mirrored directories and mirrored files
6488 mkdir $td || error "mkdir $td failed"
6489 $LFS mirror create -N3 $td || error "create mirrored dir $td failed"
6490 createmany -o $tf- 10 || error "create $tf- failed"
6492 for i in $(seq 2); do
6494 mkdir $dir || error "mkdir $dir failed"
6495 $LFS mirror create -N$((3 + i)) $dir ||
6496 error "create mirrored dir $dir failed"
6497 createmany -o $dir/$tfile- 10 ||
6498 error "create $dir/$tfile- failed"
6501 # change the states of some mirrored files
6503 for i in $(seq 2); do
6505 for j in $(seq 4 9); do
6506 echo foo > $dir/$tfile-$j
6510 # find mirrored files with specific mirror count
6511 cmd="$LFS find --mirror-count 3 --type f $td"
6512 nfiles=$($cmd | wc -l)
6513 [[ $nfiles = 10 ]] || error "$cmd: $nfiles != 10 files"
6515 cmd="$LFS find ! --mirror-count 3 --type f $td"
6516 nfiles=$($cmd | wc -l)
6517 [[ $nfiles = 20 ]] || error "$cmd: $nfiles != 20 files"
6519 cmd="$LFS find --mirror-count +2 --type f $td"
6520 nfiles=$($cmd | wc -l)
6521 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6523 cmd="$LFS find --mirror-count -6 --type f $td"
6524 nfiles=$($cmd | wc -l)
6525 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6527 # find mirrored files with specific file state
6528 cmd="$LFS find --maxdepth 1 --mirror-state=^ro --type f $td"
6529 [[ $($cmd) = $tf-6 ]] || error "$cmd: didn't return $tf-6"
6531 cmd="$LFS find --mirror-state=ro --type f $td"
6532 nfiles=$($cmd | wc -l)
6533 [[ $nfiles = 17 ]] || error "$cmd: $nfiles != 17 files"
6535 cmd="$LFS find ! --mirror-state=ro --type f $td"
6536 nfiles=$($cmd | wc -l)
6537 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6539 cmd="$LFS find --mirror-state=wp --type f $td"
6540 nfiles=$($cmd | wc -l)
6541 [[ $nfiles = 13 ]] || error "$cmd: $nfiles != 13 files"
6543 cmd="$LFS find ! --mirror-state=sp --type f $td"
6544 nfiles=$($cmd | wc -l)
6545 [[ $nfiles = 30 ]] || error "$cmd: $nfiles != 30 files"
6547 run_test 56ca "check lfs find --mirror-count|-N and --mirror-state"
6550 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6551 # note test will not do anything if MDS is not local
6552 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6553 skip_env "ldiskfs only test"
6555 remote_mds_nodsh && skip "remote MDS with nodsh"
6557 local MNTDEV="osd*.*MDT*.mntdev"
6558 DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV)
6559 [ -z "$DEV" ] && error "can't access $MNTDEV"
6560 for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
6561 do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
6562 error "can't access $DEV"
6563 DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
6564 [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
6568 run_test 57a "verify MDS filesystem created with large inodes =="
6571 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6572 if [ "$mds1_FSTYPE" != ldiskfs ]; then
6573 skip_env "ldiskfs only test"
6575 remote_mds_nodsh && skip "remote MDS with nodsh"
6577 local dir=$DIR/$tdir
6580 local fileN=$dir/f$filecount
6582 rm -rf $dir || error "removing $dir"
6584 local mdtidx=$($LFS getstripe -m $dir)
6585 local mdtname=MDT$(printf %04x $mdtidx)
6586 local facet=mds$((mdtidx + 1))
6588 echo "mcreating $filecount files"
6589 createmany -m $dir/f 1 $filecount || error "creating files in $dir"
6591 # verify that files do not have EAs yet
6592 $LFS getstripe $file1 2>&1 | grep -q "no stripe" ||
6593 error "$file1 has an EA"
6594 $LFS getstripe $fileN 2>&1 | grep -q "no stripe" ||
6595 error "$fileN has an EA"
6599 df $dir #make sure we get new statfs data
6600 local mdsfree=$(do_facet $facet \
6601 lctl get_param -n osd*.*$mdtname.kbytesfree)
6602 local mdcfree=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6605 echo "opening files to create objects/EAs"
6606 for file in $(seq -f $dir/f%g 1 $filecount); do
6607 $OPENFILE -f O_RDWR $file > /dev/null 2>&1 ||
6608 error "opening $file"
6611 # verify that files have EAs now
6612 $LFS getstripe $file1 | grep -q "obdidx" || error "$file1 missing EA"
6613 $LFS getstripe $fileN | grep -q "obdidx" || error "$fileN missing EA"
6615 sleep 1 #make sure we get new statfs data
6617 local mdsfree2=$(do_facet $facet \
6618 lctl get_param -n osd*.*$mdtname.kbytesfree)
6619 local mdcfree2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree)
6621 if [[ $mdcfree2 -lt $((mdcfree - 16)) ]]; then
6622 if [ "$mdsfree" != "$mdsfree2" ]; then
6623 error "MDC before $mdcfree != after $mdcfree2"
6625 echo "MDC before $mdcfree != after $mdcfree2"
6626 echo "unable to confirm if MDS has large inodes"
6631 run_test 57b "default LOV EAs are stored inside large inodes ==="
6634 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6635 [ -z "$(which wiretest 2>/dev/null)" ] &&
6636 skip_env "could not find wiretest"
6640 run_test 58 "verify cross-platform wire constants =============="
6643 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6645 echo "touch 130 files"
6646 createmany -o $DIR/f59- 130
6648 unlinkmany $DIR/f59- 130
6650 # wait for commitment of removal
6651 wait_delete_completed
6653 run_test 59 "verify cancellation of llog records async ========="
6655 TEST60_HEAD="test_60 run $RANDOM"
6657 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6658 remote_mgs_nodsh && skip "remote MGS with nodsh"
6659 do_facet mgs "! which run-llog.sh &> /dev/null" &&
6660 do_facet mgs "! ls run-llog.sh &> /dev/null" &&
6661 skip_env "missing subtest run-llog.sh"
6663 log "$TEST60_HEAD - from kernel mode"
6664 do_facet mgs "$LCTL dk > /dev/null"
6665 do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed"
6666 do_facet mgs $LCTL dk > $TMP/$tfile
6668 # LU-6388: test llog_reader
6669 local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
6670 llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
6671 [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
6672 skip_env "missing llog_reader"
6673 local fstype=$(facet_fstype mgs)
6674 [ $fstype != ldiskfs -a $fstype != zfs ] &&
6675 skip_env "Only for ldiskfs or zfs type mgs"
6677 local mntpt=$(facet_mntpt mgs)
6678 local mgsdev=$(mgsdevname 1)
6690 #get fid and record list
6691 fid_list=($(awk '/9_sub.*record/ { print $NF }' /$TMP/$tfile |
6693 rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' /$TMP/$tfile |
6695 #remount mgs as ldiskfs or zfs type
6696 stop mgs || error "stop mgs failed"
6697 mount_fstype mgs || error "remount mgs failed"
6698 for ((i = 0; i < ${#fid_list[@]}; i++)); do
6701 seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
6702 oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
6707 obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
6709 obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
6711 echo "obj_file is $obj_file"
6712 do_facet mgs $llog_reader $obj_file
6714 rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
6715 awk '{ print $3 }' | sed -e "s/^type=//g")
6716 if [ $rec_type != $rec ]; then
6717 echo "FAILED test_60a wrong record type $rec_type," \
6723 #check obj path if record type is LLOG_LOGID_MAGIC
6724 if [ "$rec" == "1064553b" ]; then
6725 path=$(do_facet mgs $llog_reader $obj_file |
6726 grep "path=" | awk '{ print $NF }' |
6727 sed -e "s/^path=//g")
6728 if [ $obj_file != $mntpt/$path ]; then
6729 echo "FAILED test_60a wrong obj path" \
6730 "$montpt/$path, should be $obj_file"
6737 #restart mgs before "error", otherwise it will block the next test
6738 stop mgs || error "stop mgs failed"
6739 start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
6740 $pass || error "test failed, see FAILED test_60a messages for specifics"
6742 run_test 60a "llog_test run from kernel module and test llog_reader"
6744 test_60b() { # bug 6411
6745 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6748 LLOG_COUNT=$(do_facet mgs dmesg |
6749 awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
6750 /llog_[a-z]*.c:[0-9]/ {
6762 [[ $LLOG_COUNT -gt 120 ]] &&
6763 error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
6765 run_test 60b "limit repeated messages from CERROR/CWARN"
6768 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6770 echo "create 5000 files"
6771 createmany -o $DIR/f60c- 5000
6772 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137
6773 lctl set_param fail_loc=0x80000137
6774 unlinkmany $DIR/f60c- 5000
6775 lctl set_param fail_loc=0
6777 run_test 60c "unlink file when mds full"
6780 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6782 SAVEPRINTK=$(lctl get_param -n printk)
6783 # verify "lctl mark" is even working"
6784 MESSAGE="test message ID $RANDOM $$"
6785 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6786 dmesg | grep -q "$MESSAGE" || error "didn't find debug marker in log"
6788 lctl set_param printk=0 || error "set lnet.printk failed"
6789 lctl get_param -n printk | grep emerg || error "lnet.printk dropped emerg"
6790 MESSAGE="new test message ID $RANDOM $$"
6791 # Assume here that libcfs_debug_mark_buffer() uses D_WARNING
6792 $LCTL mark "$MESSAGE" || error "$LCTL mark failed"
6793 dmesg | grep -q "$MESSAGE" && error "D_WARNING wasn't masked" || true
6795 lctl set_param -n printk="$SAVEPRINTK"
6797 run_test 60d "test printk console message masking"
6800 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6801 remote_mds_nodsh && skip "remote MDS with nodsh"
6804 #define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
6805 do_facet mds1 lctl set_param fail_loc=0x15b
6808 run_test 60e "no space while new llog is being created"
6813 test_mkdir -c $MDSCOUNT $DIR/$tdir
6814 $LFS setdirstripe -D -i -1 -c $MDSCOUNT $DIR/$tdir
6819 mkdir $DIR/$tdir/subdir$index 2>/dev/null
6820 rmdir $DIR/$tdir/subdir$index 2>/dev/null
6821 index=$((index + 1))
6827 for i in $(seq 100); do
6828 # define OBD_FAIL_OSD_TXN_START 0x19a
6829 do_facet mds1 lctl set_param fail_loc=0x8000019a
6835 mkdir $DIR/$tdir/new || error "mkdir failed"
6836 rmdir $DIR/$tdir/new || error "rmdir failed"
6838 run_test 60g "transaction abort won't cause MDT hung"
6841 [ $MDS1_VERSION -le $(version_code 2.12.52) ] ||
6842 skip "Need MDS version at least 2.12.52"
6843 [ $MDSCOUNT -le 2 ] && skip "Need >= 2 MDTs"
6847 #define OBD_FAIL_MDS_STRIPE_CREATE 0x188
6848 #define OBD_FAIL_MDS_STRIPE_FID 0x189
6849 for fail_loc in 0x80000188 0x80000189; do
6850 do_facet mds1 "$LCTL set_param fail_loc=$fail_loc"
6851 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir-$fail_loc ||
6852 error "mkdir $dir-$fail_loc failed"
6853 for i in {0..10}; do
6854 # create may fail on missing stripe
6855 echo $i > $DIR/$tdir-$fail_loc/$i
6857 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6858 error "getdirstripe $tdir-$fail_loc failed"
6859 $LFS migrate -m 1 $DIR/$tdir-$fail_loc ||
6860 error "migrate $tdir-$fail_loc failed"
6861 $LFS getdirstripe $DIR/$tdir-$fail_loc ||
6862 error "getdirstripe $tdir-$fail_loc failed"
6863 pushd $DIR/$tdir-$fail_loc
6865 echo $f | cmp $f - || error "$f data mismatch"
6868 rm -rf $DIR/$tdir-$fail_loc
6871 run_test 60h "striped directory with missing stripes can be accessed"
6874 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6877 dd if=/dev/zero of=$f bs=$PAGE_SIZE count=1 || error "dd $f failed"
6878 cancel_lru_locks osc
6879 $MULTIOP $f OSMWUc || error "$MULTIOP $f failed"
6882 run_test 61a "mmap() writes don't make sync hang ================"
6885 mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
6887 run_test 61b "mmap() of unstriped file is successful"
6889 # bug 2330 - insufficient obd_match error checking causes LBUG
6891 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6895 cancel_lru_locks osc
6896 lctl set_param fail_loc=0x405
6897 cat $f && error "cat succeeded, expect -EIO"
6898 lctl set_param fail_loc=0
6900 # This test is now irrelevant (as of bug 10718 inclusion), we no longer
6901 # match every page all of the time.
6902 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
6904 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
6905 # Though this test is irrelevant anymore, it helped to reveal some
6906 # other grant bugs (LU-4482), let's keep it.
6907 test_63a() { # was test_63
6908 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6910 MAX_DIRTY_MB=$(lctl get_param -n osc.*.max_dirty_mb | head -n 1)
6912 for i in `seq 10` ; do
6913 dd if=/dev/zero of=$DIR/f63 bs=8k &
6919 rm -f $DIR/f63 || true
6921 run_test 63a "Verify oig_wait interruption does not crash ======="
6923 # bug 2248 - async write errors didn't return to application on sync
6924 # bug 3677 - async write errors left page locked
6926 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6929 lctl set_param debug=-1
6931 # ensure we have a grant to do async writes
6932 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
6935 sync # sync lest earlier test intercept the fail_loc
6937 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
6938 lctl set_param fail_loc=0x80000406
6939 $MULTIOP $DIR/$tfile Owy && \
6940 error "sync didn't return ENOMEM"
6941 sync; sleep 2; sync # do a real sync this time to flush page
6942 lctl get_param -n llite.*.dump_page_cache | grep locked && \
6943 error "locked page left in cache after async error" || true
6946 run_test 63b "async write errors should be returned to fsync ==="
6949 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6952 lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
6954 run_test 64a "verify filter grant calculations (in kernel) ====="
6957 [ $PARALLEL == "yes" ] && skip "skip parallel run"
6959 sh oos.sh $MOUNT || error "oos.sh failed: $?"
6961 run_test 64b "check out-of-space detection on client"
6964 $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
6966 run_test 64c "verify grant shrink"
6972 $LCTL get_param osc.$tgt.import | awk "/$param/ { print \$2 }"
6975 # this does exactly what osc_request.c:osc_announce_cached() does in
6976 # order to calculate max amount of grants to ask from server
6980 local nrpages=$($LCTL get_param -n osc.$tgt.max_pages_per_rpc)
6981 local rpc_in_flight=$($LCTL get_param -n osc.$tgt.max_rpcs_in_flight)
6983 ((rpc_in_flight++));
6984 nrpages=$((nrpages * rpc_in_flight))
6986 local dirty_max_pages=$($LCTL get_param -n osc.$tgt.max_dirty_mb)
6988 dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / PAGE_SIZE))
6990 [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages
6991 local undirty=$((nrpages * PAGE_SIZE))
6993 local max_extent_pages
6994 max_extent_pages=$(import_param $tgt grant_max_extent_size)
6995 max_extent_pages=$((max_extent_pages / PAGE_SIZE))
6996 local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages))
6997 local grant_extent_tax
6998 grant_extent_tax=$(import_param $tgt grant_extent_tax)
7000 undirty=$((undirty + nrextents * grant_extent_tax))
7005 # this is size of unit for grant allocation. It should be equal to
7006 # what tgt_grant.c:tgt_grant_chunk() calculates
7010 local grant_extent_tax
7012 max_brw_size=$(import_param $tgt max_brw_size)
7014 grant_extent_tax=$(import_param $tgt grant_extent_tax)
7016 echo $(((max_brw_size + grant_extent_tax) * 2))
7020 [ $OST1_VERSION -ge $(version_code 2.10.56) ] ||
7021 skip "OST < 2.10.55 doesn't limit grants enough"
7023 local tgt=$($LCTL dl | awk '/OST0000-osc-[^mM]/ { print $4 }')
7025 [[ "$($LCTL get_param osc.${tgt}.import)" =~ "grant_param" ]] ||
7026 skip "no grant_param connect flag"
7028 local olddebug="$($LCTL get_param -n debug 2> /dev/null)"
7030 $LCTL set_param -n -n debug="$OLDDEBUG" || true
7031 stack_trap "$LCTL set_param -n debug='$olddebug'" EXIT
7034 local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
7035 stack_trap "rm -f $DIR/$tfile && wait_delete_completed" EXIT
7037 $LFS setstripe $DIR/$tfile -i 0 -c 1
7038 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1000 &
7041 while kill -0 $ddpid; do
7042 local cur_grant=$($LCTL get_param -n osc.$tgt.cur_grant_bytes)
7044 if [[ $cur_grant -gt $max_cur_granted ]]; then
7046 error "cur_grant $cur_grant > $max_cur_granted"
7052 run_test 64d "check grant limit exceed"
7058 local cur_grants=$($LCTL get_param -n osc.$tgt.cur_grant_bytes)
7060 ((cur_grants == expected)) ||
7061 error "$msg: grants mismatch: $cur_grants, expected $expected"
7065 echo $((($1 + $2 - 1) & ~($2 - 1)))
7069 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7070 [ $OST1_VERSION -ge $(version_code 2.11.56) ] ||
7071 skip "Need OSS version at least 2.11.56"
7073 # Remount client to reset grant
7074 remount_client $MOUNT || error "failed to remount client"
7075 local osc_tgt=$($LCTL dl | awk '/OST0000-osc-[^mM]/ { print $4 }')
7076 local init_grants=$(import_param $osc_tgt initial_grant)
7078 check_grants $osc_tgt $init_grants "init grants"
7080 local extent_tax=$(import_param $osc_tgt grant_extent_tax)
7081 local max_brw_size=$(import_param $osc_tgt max_brw_size)
7082 local gbs=$(import_param $osc_tgt grant_block_size)
7084 # write random number of bytes from max_brw_size / 4 to max_brw_size
7085 local write_bytes=$(shuf -i $((max_brw_size / 4))-$max_brw_size -n 1)
7086 # align for direct io
7087 write_bytes=$(round_up_p2 $write_bytes PAGE_SIZE)
7088 # round to grant consumption unit
7089 local wb_round_up=$(round_up_p2 $write_bytes gbs)
7091 local grants=$((wb_round_up + extent_tax))
7093 $LFS setstripe -c 1 -i 0 $DIR/$tfile || error "lfs setstripe failed"
7095 # define OBD_FAIL_TGT_NO_GRANT 0x725
7096 # make the server not grant more back
7097 do_facet ost1 $LCTL set_param fail_loc=0x725
7098 dd if=/dev/zero of=$DIR/$tfile bs=$write_bytes count=1 oflag=direct
7100 do_facet ost1 $LCTL set_param fail_loc=0
7102 check_grants $osc_tgt $((init_grants - grants)) "dio w/o grant alloc"
7104 rm -f $DIR/$tfile || error "rm failed"
7106 # Remount client to reset grant
7107 remount_client $MOUNT || error "failed to remount client"
7108 osc_tgt=$($LCTL dl | awk '/OST0000-osc-[^mM]/ { print $4 }')
7110 $LFS setstripe -c 1 -i 0 $DIR/$tfile || error "lfs setstripe failed"
7112 # define OBD_FAIL_TGT_NO_GRANT 0x725
7113 # make the server not grant more back
7114 do_facet ost1 $LCTL set_param fail_loc=0x725
7115 $MULTIOP $DIR/$tfile "oO_WRONLY:w${write_bytes}yc"
7116 do_facet ost1 $LCTL set_param fail_loc=0
7118 check_grants $osc_tgt $((init_grants - grants)) "buf io w/o grant alloc"
7120 run_test 64e "check grant consumption (no grant allocation)"
7123 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7125 # Remount client to reset grant
7126 remount_client $MOUNT || error "failed to remount client"
7127 local osc_tgt=$($LCTL dl | awk '/OST0000-osc-[^mM]/ { print $4 }')
7129 local init_grants=$(import_param $osc_tgt initial_grant)
7130 local extent_tax=$(import_param $osc_tgt grant_extent_tax)
7131 local max_brw_size=$(import_param $osc_tgt max_brw_size)
7132 local gbs=$(import_param $osc_tgt grant_block_size)
7133 local chunk=$(grant_chunk $osc_tgt)
7135 # write random number of bytes from max_brw_size / 4 to max_brw_size
7136 local write_bytes=$(shuf -i $((max_brw_size / 4))-$max_brw_size -n 1)
7137 # align for direct io
7138 write_bytes=$(round_up_p2 $write_bytes PAGE_SIZE)
7139 # round to grant consumption unit
7140 local wb_round_up=$(round_up_p2 $write_bytes gbs)
7142 local grants=$((wb_round_up + extent_tax))
7144 $LFS setstripe -c 1 -i 0 $DIR/$tfile || error "lfs setstripe failed"
7145 dd if=/dev/zero of=$DIR/$tfile bs=$write_bytes count=1 oflag=direct ||
7146 error "error writing to $DIR/$tfile"
7148 check_grants $osc_tgt $((init_grants - grants + chunk)) \
7149 "direct io with grant allocation"
7151 rm -f $DIR/$tfile || error "rm failed"
7153 # Remount client to reset grant
7154 remount_client $MOUNT || error "failed to remount client"
7155 osc_tgt=$($LCTL dl | awk '/OST0000-osc-[^mM]/ { print $4 }')
7157 $LFS setstripe -c 1 -i 0 $DIR/$tfile || error "lfs setstripe failed"
7159 local cmd="oO_WRONLY:w${write_bytes}_yc"
7161 $MULTIOP $DIR/$tfile $cmd &
7165 check_grants $osc_tgt $((init_grants - grants)) \
7166 "buffered io, not write rpc"
7168 kill -USR1 $MULTIPID
7171 check_grants $osc_tgt $((init_grants - grants + chunk)) \
7172 "buffered io, one RPC"
7174 run_test 64f "check grant consumption (with grant allocation)"
7176 # bug 1414 - set/get directories' stripe info
7178 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7180 test_mkdir $DIR/$tdir
7182 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
7184 run_test 65a "directory with no stripe info"
7187 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7189 test_mkdir $DIR/$tdir
7190 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7192 $SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7195 $LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
7197 run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
7200 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7201 [ $OSTCOUNT -lt 2 ] && skip_env "need at least 2 OSTs"
7203 test_mkdir $DIR/$tdir
7204 local stripesize=$($GETSTRIPE -S $DIR/$tdir)
7206 $LFS setstripe -S $((stripesize * 4)) -i 1 \
7207 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
7209 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
7211 run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
7214 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7216 test_mkdir $DIR/$tdir
7217 local STRIPECOUNT=$($GETSTRIPE -c $DIR/$tdir)
7218 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7220 if [[ $STRIPECOUNT -le 0 ]]; then
7222 elif [[ $STRIPECOUNT -gt 2000 ]]; then
7223 #LOV_MAX_STRIPE_COUNT is 2000
7224 [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1))
7226 sc=$(($STRIPECOUNT - 1))
7228 $SETSTRIPE -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
7229 touch $DIR/$tdir/f4 $DIR/$tdir/f5
7230 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
7231 error "lverify failed"
7233 run_test 65d "directory setstripe -S stripe_size -c stripe_count"
7236 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7238 test_mkdir $DIR/$tdir
7240 $SETSTRIPE $DIR/$tdir || error "setstripe"
7241 $GETSTRIPE -v $DIR/$tdir | grep "Default" ||
7242 error "no stripe info failed"
7244 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
7246 run_test 65e "directory setstripe defaults"
7249 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7251 test_mkdir $DIR/${tdir}f
7252 $RUNAS $SETSTRIPE $DIR/${tdir}f && error "setstripe succeeded" || true
7254 run_test 65f "dir setstripe permission (should return error) ==="
7257 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7259 test_mkdir $DIR/$tdir
7260 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7262 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7263 error "setstripe -S failed"
7264 $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
7265 $LFS getstripe -v $DIR/$tdir | grep "Default" ||
7266 error "delete default stripe failed"
7268 run_test 65g "directory setstripe -d"
7271 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7273 test_mkdir $DIR/$tdir
7274 local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
7276 $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
7277 error "setstripe -S failed"
7278 test_mkdir $DIR/$tdir/dd1
7279 [ $($LFS getstripe -c $DIR/$tdir) = $($GETSTRIPE -c $DIR/$tdir/dd1) ] ||
7280 error "stripe info inherit failed"
7282 run_test 65h "directory stripe info inherit ===================="
7285 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7287 save_layout_restore_at_exit $MOUNT
7289 # bug6367: set non-default striping on root directory
7290 $LFS setstripe -S 65536 -c -1 $MOUNT || error "error setting stripe"
7292 # bug12836: getstripe on -1 default directory striping
7293 $LFS getstripe $MOUNT || error "getstripe $MOUNT failed"
7295 # bug12836: getstripe -v on -1 default directory striping
7296 $LFS getstripe -v $MOUNT || error "getstripe -v $MOUNT failed"
7298 # bug12836: new find on -1 default directory striping
7299 $LFS find -mtime -1 $MOUNT > /dev/null || error "find $MOUNT failed"
7301 run_test 65i "various tests to set root directory striping"
7303 test_65j() { # bug6367
7304 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7308 # if we aren't already remounting for each test, do so for this test
7309 if [ "$I_MOUNTED" = "yes" ]; then
7310 cleanup || error "failed to unmount"
7314 save_layout_restore_at_exit $MOUNT
7316 $SETSTRIPE -d $MOUNT || error "setstripe failed"
7318 run_test 65j "set default striping on root directory (bug 6367)="
7322 wait_delete_completed
7323 do_facet $SINGLEMDS "lctl set_param -n \
7324 osp.$ost*MDT0000.max_create_count=$max_count"
7325 do_facet $SINGLEMDS "lctl set_param -n \
7326 osp.$ost*MDT0000.create_count=$count"
7327 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7328 echo $INACTIVE_OSC "is Activate"
7330 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7333 test_65k() { # bug11679
7334 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7335 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
7336 remote_mds_nodsh && skip "remote MDS with nodsh"
7338 local disable_precreate=true
7339 [ $MDS1_VERSION -le $(version_code 2.8.54) ] &&
7340 disable_precreate=false
7342 echo "Check OST status: "
7343 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
7344 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
7346 for OSC in $MDS_OSCS; do
7347 echo $OSC "is active"
7348 do_facet $SINGLEMDS lctl --device %$OSC activate
7351 for INACTIVE_OSC in $MDS_OSCS; do
7352 local ost=$(osc_to_ost $INACTIVE_OSC)
7353 local ostnum=$(do_facet $SINGLEMDS lctl get_param -n \
7354 lov.*md*.target_obd |
7355 awk -F: /$ost/'{ print $1 }' | head -n 1)
7358 $SETSTRIPE -i $ostnum -c 1 $DIR/$tdir
7359 createmany -o $DIR/$tdir/$tfile.$ostnum. 1000
7361 echo "Deactivate: " $INACTIVE_OSC
7362 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC deactivate
7364 local count=$(do_facet $SINGLEMDS "lctl get_param -n \
7365 osp.$ost*MDT0000.create_count")
7366 local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \
7367 osp.$ost*MDT0000.max_create_count")
7368 $disable_precreate &&
7369 do_facet $SINGLEMDS "lctl set_param -n \
7370 osp.$ost*MDT0000.max_create_count=0"
7372 for idx in $(seq 0 $((OSTCOUNT - 1))); do
7373 [ -f $DIR/$tdir/$idx ] && continue
7374 echo "$SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx"
7375 $SETSTRIPE -i $idx -c 1 $DIR/$tdir/$idx ||
7377 error "setstripe $idx should succeed"; }
7378 rm -f $DIR/$tdir/$idx || error "rm $idx failed"
7380 unlinkmany $DIR/$tdir/$tfile.$ostnum. 1000
7383 do_facet $SINGLEMDS "lctl set_param -n \
7384 osp.$ost*MDT0000.max_create_count=$max_count"
7385 do_facet $SINGLEMDS "lctl set_param -n \
7386 osp.$ost*MDT0000.create_count=$count"
7387 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate
7388 echo $INACTIVE_OSC "is Activate"
7390 wait_osc_import_state mds ost$(( ostnum + 1 )) FULL
7393 run_test 65k "validate manual striping works properly with deactivated OSCs"
7395 test_65l() { # bug 12836
7396 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7398 test_mkdir -p $DIR/$tdir/test_dir
7399 $SETSTRIPE -c -1 $DIR/$tdir/test_dir
7400 $LFS find -mtime -1 $DIR/$tdir >/dev/null
7402 run_test 65l "lfs find on -1 stripe dir ========================"
7405 local layout=$(save_layout $MOUNT)
7406 $RUNAS $SETSTRIPE -c 2 $MOUNT && {
7407 restore_layout $MOUNT $layout
7408 error "setstripe should fail by non-root users"
7412 run_test 65m "normal user can't set filesystem default stripe"
7415 [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.0) ]] ||
7416 skip "Need MDS version at least 2.12.0"
7417 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
7419 [[ $OSTCOUNT -ge 2 ]] || skip_env "needs >= 2 OSTs"
7420 which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
7421 which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
7423 save_layout_restore_at_exit $MOUNT
7425 # new subdirectory under root directory should not inherit
7426 # the default layout from root
7427 local dir1=$MOUNT/$tdir-1
7428 mkdir $dir1 || error "mkdir $dir1 failed"
7429 ! getfattr -n trusted.lov $dir1 &> /dev/null ||
7430 error "$dir1 shouldn't have LOV EA"
7432 # delete the default layout on root directory
7433 $LFS setstripe -d $MOUNT || error "delete root default layout failed"
7435 local dir2=$MOUNT/$tdir-2
7436 mkdir $dir2 || error "mkdir $dir2 failed"
7437 ! getfattr -n trusted.lov $dir2 &> /dev/null ||
7438 error "$dir2 shouldn't have LOV EA"
7440 # set a new striping pattern on root directory
7441 local def_stripe_size=$($LFS getstripe -S $MOUNT)
7442 local new_def_stripe_size=$((def_stripe_size * 2))
7443 $LFS setstripe -S $new_def_stripe_size $MOUNT ||
7444 error "set stripe size on $MOUNT failed"
7446 # new file created in $dir2 should inherit the new stripe size from
7447 # the filesystem default
7448 local file2=$dir2/$tfile-2
7449 touch $file2 || error "touch $file2 failed"
7451 local file2_stripe_size=$($LFS getstripe -S $file2)
7452 [[ $file2_stripe_size -eq $new_def_stripe_size ]] ||
7453 error "$file2 didn't inherit stripe size $new_def_stripe_size"
7455 local dir3=$MOUNT/$tdir-3
7456 mkdir $dir3 || error "mkdir $dir3 failed"
7457 # $dir3 shouldn't have LOV EA, but "lfs getstripe -d $dir3" should show
7458 # the root layout, which is the actual default layout that will be used
7459 # when new files are created in $dir3.
7460 local dir3_layout=$(get_layout_param $dir3)
7461 local root_dir_layout=$(get_layout_param $MOUNT)
7462 [[ "$dir3_layout" = "$root_dir_layout" ]] ||
7463 error "$dir3 should show the default layout from $MOUNT"
7465 # set OST pool on root directory
7466 local pool=$TESTNAME
7467 pool_add $pool || error "add $pool failed"
7468 pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
7469 error "add targets to $pool failed"
7471 $LFS setstripe -p $pool $MOUNT ||
7472 error "set OST pool on $MOUNT failed"
7474 # new file created in $dir3 should inherit the pool from
7475 # the filesystem default
7476 local file3=$dir3/$tfile-3
7477 touch $file3 || error "touch $file3 failed"
7479 local file3_pool=$($LFS getstripe -p $file3)
7480 [[ "$file3_pool" = "$pool" ]] ||
7481 error "$file3 didn't inherit OST pool $pool"
7483 local dir4=$MOUNT/$tdir-4
7484 mkdir $dir4 || error "mkdir $dir4 failed"
7485 local dir4_layout=$(get_layout_param $dir4)
7486 root_dir_layout=$(get_layout_param $MOUNT)
7487 echo "$LFS getstripe -d $dir4"
7488 $LFS getstripe -d $dir4
7489 echo "$LFS getstripe -d $MOUNT"
7490 $LFS getstripe -d $MOUNT
7491 [[ "$dir4_layout" = "$root_dir_layout" ]] ||
7492 error "$dir4 should show the default layout from $MOUNT"
7494 # new file created in $dir4 should inherit the pool from
7495 # the filesystem default
7496 local file4=$dir4/$tfile-4
7497 touch $file4 || error "touch $file4 failed"
7499 local file4_pool=$($LFS getstripe -p $file4)
7500 [[ "$file4_pool" = "$pool" ]] ||
7501 error "$file4 didn't inherit OST pool $pool"
7503 # new subdirectory under non-root directory should inherit
7504 # the default layout from its parent directory
7505 $LFS setstripe -S $new_def_stripe_size -p $pool $dir4 ||
7506 error "set directory layout on $dir4 failed"
7508 local dir5=$dir4/$tdir-5
7509 mkdir $dir5 || error "mkdir $dir5 failed"
7511 dir4_layout=$(get_layout_param $dir4)
7512 local dir5_layout=$(get_layout_param $dir5)
7513 [[ "$dir4_layout" = "$dir5_layout" ]] ||
7514 error "$dir5 should inherit the default layout from $dir4"
7516 # though subdir under ROOT doesn't inherit default layout, but
7517 # its sub dir/file should be created with default layout.
7518 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
7519 [[ $MDS1_VERSION -ge $(version_code 2.12.59) ]] ||
7520 [[ $MDS1_VERSION -ge $(version_code 2.12.3) &&
7521 $MDS1_VERSION -lt $(version_code 2.12.50) ]] ||
7522 skip "Need MDS version at least 2.12.3 or 2.12.59"
7524 local default_lmv_count=$($LFS getdirstripe -D -c $MOUNT)
7525 local default_lmv_index=$($LFS getdirstripe -D -i $MOUNT)
7526 local default_lmv_hash=$($LFS getdirstripe -D -H $MOUNT)
7528 if [ $default_lmv_hash == "none" ]; then
7529 stack_trap "$LFS setdirstripe -D -d $MOUNT" EXIT
7531 stack_trap "$LFS setdirstripe -D -i $default_lmv_index \
7532 -c $default_lmv_count -H $default_lmv_hash $MOUNT" EXIT
7535 $LFS setdirstripe -D -c 2 $MOUNT ||
7536 error "setdirstripe -D -c 2 failed"
7537 mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed"
7538 local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6)
7539 [ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count"
7541 run_test 65n "don't inherit default layout from root for new subdirectories"
7543 # bug 2543 - update blocks count on client
7545 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7548 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
7549 sync; sync_all_data; sync; sync_all_data
7550 cancel_lru_locks osc
7551 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
7552 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
7554 run_test 66 "update inode blocks count on client ==============="
7557 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
7561 swapon -s | awk '($1 == "'$1'") { print $4 }'
7564 # bug5265, obdfilter oa2dentry return -ENOENT
7565 # #define OBD_FAIL_SRV_ENOENT 0x217
7567 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7568 remote_ost_nodsh && skip "remote OST with nodsh"
7571 $SETSTRIPE -c 1 -i 0 $f
7573 $DIRECTIO write ${f}.2 0 1 || error "directio write error"
7575 do_facet ost1 lctl set_param fail_loc=0x217
7576 $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
7577 $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
7579 do_facet ost1 lctl set_param fail_loc=0
7580 $DIRECTIO write $f 0 2 || error "write error"
7582 cancel_lru_locks osc
7583 $DIRECTIO read $f 0 1 || error "read error"
7585 do_facet ost1 lctl set_param fail_loc=0x217
7586 $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
7588 do_facet ost1 lctl set_param fail_loc=0
7591 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
7594 test_mkdir $DIR/$tdir
7595 $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
7596 sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
7598 run_test 71 "Running dbench on lustre (don't segment fault) ===="
7600 test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
7601 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7602 [ "$RUNAS_ID" = "$UID" ] &&
7603 skip_env "RUNAS_ID = UID = $UID -- skipping"
7604 # Check that testing environment is properly set up. Skip if not
7605 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS ||
7606 skip_env "User $RUNAS_ID does not exist - skipping"
7609 chmod 777 $DIR/$tfile
7610 chmod ug+s $DIR/$tfile
7611 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 ||
7612 error "$RUNAS dd $DIR/$tfile failed"
7613 # See if we are still setuid/sgid
7614 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7615 error "S/gid is not dropped on write"
7616 # Now test that MDS is updated too
7617 cancel_lru_locks mdc
7618 test -u $DIR/$tfile -o -g $DIR/$tfile &&
7619 error "S/gid is not dropped on MDS"
7622 run_test 72a "Test that remove suid works properly (bug5695) ===="
7624 test_72b() { # bug 24226 -- keep mode setting when size is not changing
7627 [ "$RUNAS_ID" = "$UID" ] &&
7628 skip_env "RUNAS_ID = UID = $UID -- skipping"
7629 [ "$RUNAS_ID" -eq 0 ] &&
7630 skip_env "RUNAS_ID = 0 -- skipping"
7631 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7632 # Check that testing environment is properly set up. Skip if not
7633 FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS ||
7634 skip_env "User $RUNAS_ID does not exist - skipping"
7636 touch $DIR/${tfile}-f{g,u}
7637 test_mkdir $DIR/${tfile}-dg
7638 test_mkdir $DIR/${tfile}-du
7639 chmod 770 $DIR/${tfile}-{f,d}{g,u}
7640 chmod g+s $DIR/${tfile}-{f,d}g
7641 chmod u+s $DIR/${tfile}-{f,d}u
7642 for perm in 777 2777 4777; do
7643 $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
7644 $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
7645 $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
7646 $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
7650 run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
7652 # bug 3462 - multiple simultaneous MDC requests
7654 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7656 test_mkdir $DIR/d73-1
7657 test_mkdir $DIR/d73-2
7658 multiop_bg_pause $DIR/d73-1/f73-1 O_c || return 1
7661 lctl set_param fail_loc=0x80000129
7662 $MULTIOP $DIR/d73-1/f73-2 Oc &
7664 lctl set_param fail_loc=0
7666 $MULTIOP $DIR/d73-2/f73-3 Oc &
7670 wait $pid1 || return 1
7674 $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
7675 $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5
7676 $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6
7680 run_test 73 "multiple MDC requests (should not deadlock)"
7682 test_74a() { # bug 6149, 6184
7683 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7686 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7688 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7689 # will spin in a tight reconnection loop
7690 $LCTL set_param fail_loc=0x8000030e
7691 # get any lock that won't be difficult - lookup works.
7693 $LCTL set_param fail_loc=0
7697 run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
7699 test_74b() { # bug 13310
7700 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7702 #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
7704 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
7705 # will spin in a tight reconnection loop
7706 $LCTL set_param fail_loc=0x8000030e
7707 # get a "difficult" lock
7709 $LCTL set_param fail_loc=0
7713 run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
7716 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7718 #define OBD_FAIL_LDLM_NEW_LOCK
7719 $LCTL set_param fail_loc=0x319
7720 touch $DIR/$tfile && error "touch successful"
7721 $LCTL set_param fail_loc=0
7724 run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
7727 awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
7730 test_76() { # Now for bug 20433, added originally in bug 1443
7731 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7733 local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
7735 cancel_lru_locks osc
7736 BEFORE_INODES=$(num_inodes)
7737 echo "before inodes: $BEFORE_INODES"
7739 [ "$SLOW" = "no" ] && COUNT=100
7740 for i in $(seq $COUNT); do
7744 cancel_lru_locks osc
7745 AFTER_INODES=$(num_inodes)
7746 echo "after inodes: $AFTER_INODES"
7748 while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
7750 AFTER_INODES=$(num_inodes)
7752 echo "wait $wait seconds inodes: $AFTER_INODES"
7753 if [ $wait -gt 30 ]; then
7754 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
7758 run_test 76 "confirm clients recycle inodes properly ===="
7764 # Note: in sptlrpc modes which enable its own bulk checksum, the
7765 # original crc32_le bulk checksum will be automatically disabled,
7766 # and the OBD_FAIL_OSC_CHECKSUM_SEND/OBD_FAIL_OSC_CHECKSUM_RECEIVE
7767 # will be checked by sptlrpc code against sptlrpc bulk checksum.
7768 # In this case set_checksums() will not be no-op, because sptlrpc
7769 # bulk checksum will be enabled all through the test.
7771 [ "$ORIG_CSUM" ] || ORIG_CSUM=`lctl get_param -n osc.*.checksums | head -n1`
7772 lctl set_param -n osc.*.checksums $1
7776 export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7777 sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
7778 CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type |
7779 tr -d [] | head -n1)}
7782 lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
7783 log "set checksum type to $1"
7786 F77_TMP=$TMP/f77-temp
7789 dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
7790 error "error writing to $F77_TMP"
7793 test_77a() { # bug 10889
7794 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7795 $GSS && skip_env "could not run with gss"
7797 [ ! -f $F77_TMP ] && setup_f77
7799 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
7803 run_test 77a "normal checksum read/write operation"
7805 test_77b() { # bug 10889
7806 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7807 $GSS && skip_env "could not run with gss"
7809 [ ! -f $F77_TMP ] && setup_f77
7810 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7811 $LCTL set_param fail_loc=0x80000409
7814 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7815 error "dd error: $?"
7816 $LCTL set_param fail_loc=0
7818 for algo in $CKSUM_TYPES; do
7819 cancel_lru_locks osc
7820 set_checksum_type $algo
7821 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7822 $LCTL set_param fail_loc=0x80000408
7823 cmp $F77_TMP $DIR/$tfile || error "file compare failed"
7824 $LCTL set_param fail_loc=0
7827 set_checksum_type $ORIG_CSUM_TYPE
7830 run_test 77b "checksum error on client write, read"
7835 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
7837 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
7838 [ -n "$osc_file_prefix" ] && rm -f ${osc_file_prefix}*
7839 $check_ost && [ -n "$ost_file_prefix" ] &&
7840 do_facet ost1 rm -f ${ost_file_prefix}\*
7844 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7845 $GSS && skip_env "could not run with gss"
7846 remote_ost_nodsh && skip "remote OST with nodsh"
7849 local osc_file_prefix
7851 local check_ost=false
7852 local ost_file_prefix
7858 # ensure corruption will occur on first OSS/OST
7859 $LFS setstripe -i 0 $DIR/$tfile
7861 [ ! -f $F77_TMP ] && setup_f77
7862 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
7863 error "dd write error: $?"
7864 fid=$($LFS path2fid $DIR/$tfile)
7866 if [ $OST1_VERSION -ge $(version_code 2.9.57) ]
7869 ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
7870 ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
7872 echo "OSS do not support bulk pages dump upon error"
7875 osc_file_prefix=$($LCTL get_param -n debug_path)
7876 osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
7878 trap cleanup_77c EXIT
7881 # enable bulk pages dump upon error on Client
7882 $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
7883 # enable bulk pages dump upon error on OSS
7885 do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
7887 # flush Client cache to allow next read to reach OSS
7888 cancel_lru_locks osc
7890 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7891 $LCTL set_param fail_loc=0x80000408
7892 dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
7893 $LCTL set_param fail_loc=0
7897 # check cksum dump on Client
7898 osc_file=$(ls ${osc_file_prefix}*)
7899 [ -n "$osc_file" ] || error "no checksum dump file on Client"
7900 # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
7901 bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
7902 [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
7903 orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
7905 dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
7906 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7907 error "dump content does not match on Client"
7909 $check_ost || skip "No need to check cksum dump on OSS"
7911 # check cksum dump on OSS
7912 ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
7913 [ -n "$ost_file" ] || error "no checksum dump file on OSS"
7914 orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
7915 dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
7916 [[ "$orig_cksum" == "$dump_cksum" ]] ||
7917 error "dump content does not match on OSS"
7921 run_test 77c "checksum error on client read with debug"
7923 test_77d() { # bug 10889
7924 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7925 $GSS && skip_env "could not run with gss"
7927 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7928 $LCTL set_param fail_loc=0x80000409
7930 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7931 error "direct write: rc=$?"
7932 $LCTL set_param fail_loc=0
7935 #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
7936 $LCTL set_param fail_loc=0x80000408
7938 cancel_lru_locks osc
7939 $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
7940 error "direct read: rc=$?"
7941 $LCTL set_param fail_loc=0
7944 run_test 77d "checksum error on OST direct write, read"
7946 test_77f() { # bug 10889
7947 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7948 $GSS && skip_env "could not run with gss"
7951 for algo in $CKSUM_TYPES; do
7952 cancel_lru_locks osc
7953 set_checksum_type $algo
7954 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
7955 $LCTL set_param fail_loc=0x409
7956 $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
7957 error "direct write succeeded"
7958 $LCTL set_param fail_loc=0
7960 set_checksum_type $ORIG_CSUM_TYPE
7963 run_test 77f "repeat checksum error on write (expect error)"
7965 test_77g() { # bug 10889
7966 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7967 $GSS && skip_env "could not run with gss"
7968 remote_ost_nodsh && skip "remote OST with nodsh"
7970 [ ! -f $F77_TMP ] && setup_f77
7972 local file=$DIR/$tfile
7973 stack_trap "rm -f $file" EXIT
7975 $SETSTRIPE -c 1 -i 0 $file
7976 #define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
7977 do_facet ost1 lctl set_param fail_loc=0x8000021a
7979 dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
7980 error "write error: rc=$?"
7981 do_facet ost1 lctl set_param fail_loc=0
7984 cancel_lru_locks osc
7985 #define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
7986 do_facet ost1 lctl set_param fail_loc=0x8000021b
7988 cmp $F77_TMP $file || error "file compare failed"
7989 do_facet ost1 lctl set_param fail_loc=0
7992 run_test 77g "checksum error on OST write, read"
7994 test_77k() { # LU-10906
7995 [ $PARALLEL == "yes" ] && skip "skip parallel run"
7996 $GSS && skip_env "could not run with gss"
7998 local cksum_param="osc.$FSNAME*.checksums"
7999 local get_checksum="$LCTL get_param -n $cksum_param | head -n1"
8003 [ "$ORIG_CSUM" ] || ORIG_CSUM=$(eval $get_checksum)
8004 stack_trap "wait_update $HOSTNAME '$get_checksum' $ORIG_CSUM" EXIT
8005 stack_trap "do_facet mgs $LCTL set_param -P $cksum_param=$ORIG_CSUM" \
8009 do_facet mgs $LCTL set_param -P $cksum_param=$i ||
8010 error "failed to set checksum=$i on MGS"
8011 wait_update $HOSTNAME "$get_checksum" $i
8013 echo "remount client, checksum should be $i"
8014 remount_client $MOUNT || "failed to remount client"
8015 checksum=$(eval $get_checksum)
8016 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
8019 for opt in "checksum" "nochecksum"; do
8020 #remount with mount option
8021 echo "remount client with option $opt, checksum should be $i"
8022 umount_client $MOUNT || "failed to umount client"
8023 mount_client $MOUNT "$MOUNT_OPTS,$opt" ||
8024 "failed to mount client with option '$opt'"
8025 checksum=$(eval $get_checksum)
8026 [ $checksum -eq $i ] || error "checksum($checksum) != $i"
8030 remount_client $MOUNT || "failed to remount client"
8032 run_test 77k "enable/disable checksum correctly"
8034 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
8043 test_78() { # bug 10901
8044 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8045 remote_ost || skip_env "local OST"
8048 F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
8049 echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
8050 MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
8051 echo "MemTotal: $MEMTOTAL"
8053 # reserve 256MB of memory for the kernel and other running processes,
8054 # and then take 1/2 of the remaining memory for the read/write buffers.
8055 if [ $MEMTOTAL -gt 512 ] ;then
8056 MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
8058 # for those poor memory-starved high-end clusters...
8059 MEMTOTAL=$((MEMTOTAL / 2))
8061 echo "Mem to use for directio: $MEMTOTAL"
8063 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
8064 [[ $F78SIZE -gt 512 ]] && F78SIZE=512
8065 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
8066 SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
8068 echo "Smallest OST: $SMALLESTOST"
8069 [[ $SMALLESTOST -lt 10240 ]] &&
8070 skip "too small OSTSIZE, useless to run large O_DIRECT test"
8072 trap cleanup_test_78 EXIT
8074 [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
8075 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
8077 [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
8078 echo "File size: $F78SIZE"
8079 $SETSTRIPE -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
8080 for i in $(seq 1 $NSEQ); do
8081 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
8082 echo directIO rdwr round $i of $NSEQ
8083 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
8088 run_test 78 "handle large O_DIRECT writes correctly ============"
8090 test_79() { # bug 12743
8091 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8093 wait_delete_completed
8095 BKTOTAL=$(calc_osc_kbytes kbytestotal)
8096 BKFREE=$(calc_osc_kbytes kbytesfree)
8097 BKAVAIL=$(calc_osc_kbytes kbytesavail)
8099 STRING=`df -P $MOUNT | tail -n 1 | awk '{print $2","$3","$4}'`
8100 DFTOTAL=`echo $STRING | cut -d, -f1`
8101 DFUSED=`echo $STRING | cut -d, -f2`
8102 DFAVAIL=`echo $STRING | cut -d, -f3`
8103 DFFREE=$(($DFTOTAL - $DFUSED))
8105 ALLOWANCE=$((64 * $OSTCOUNT))
8107 if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
8108 [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
8109 error "df total($DFTOTAL) mismatch OST total($BKTOTAL)"
8111 if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
8112 [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
8113 error "df free($DFFREE) mismatch OST free($BKFREE)"
8115 if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
8116 [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
8117 error "df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
8120 run_test 79 "df report consistency check ======================="
8122 test_80() { # bug 10718
8123 remote_ost_nodsh && skip "remote OST with nodsh"
8124 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8126 # relax strong synchronous semantics for slow backends like ZFS
8127 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
8128 local soc="obdfilter.*.sync_lock_cancel"
8129 local save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
8131 # "sync_on_lock_cancel" was broken by v2_11_55_0-26-g7059644e9a
8132 if [ -z "$save" ]; then
8133 soc="obdfilter.*.sync_on_lock_cancel"
8134 save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
8137 if [ "$save" != "never" ]; then
8138 local hosts=$(comma_list $(osts_nodes))
8140 do_nodes $hosts $LCTL set_param $soc=never
8141 stack_trap "do_nodes $hosts $LCTL set_param $soc=$save"
8145 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
8147 local before=$(date +%s)
8148 cancel_lru_locks osc
8149 local after=$(date +%s)
8150 local diff=$((after - before))
8151 [ $diff -le 1 ] || error "elapsed for 1M@1T = $diff"
8155 run_test 80 "Page eviction is equally fast at high offsets too"
8157 test_81a() { # LU-456
8158 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8159 remote_ost_nodsh && skip "remote OST with nodsh"
8161 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8162 # MUST OR with the OBD_FAIL_ONCE (0x80000000)
8163 do_facet ost1 lctl set_param fail_loc=0x80000228
8165 # write should trigger a retry and success
8166 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
8167 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8169 if [ $RC -ne 0 ] ; then
8170 error "write should success, but failed for $RC"
8173 run_test 81a "OST should retry write when get -ENOSPC ==============="
8175 test_81b() { # LU-456
8176 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8177 remote_ost_nodsh && skip "remote OST with nodsh"
8179 # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
8180 # Don't OR with the OBD_FAIL_ONCE (0x80000000)
8181 do_facet ost1 lctl set_param fail_loc=0x228
8183 # write should retry several times and return -ENOSPC finally
8184 $SETSTRIPE -i 0 -c 1 $DIR/$tfile
8185 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
8188 if [ $RC -ne $ENOSPC ] ; then
8189 error "dd should fail for -ENOSPC, but succeed."
8192 run_test 81b "OST should return -ENOSPC when retry still fails ======="
8194 test_82() { # LU-1031
8195 dd if=/dev/zero of=$DIR/$tfile bs=1M count=10
8199 multiop_bg_pause $DIR/$tfile OG${gid1}_g${gid1}c || return 1
8201 multiop_bg_pause $DIR/$tfile O_G${gid2}r10g${gid2}c || return 2
8203 kill -USR1 $MULTIPID2
8205 if [[ `ps h -o comm -p $MULTIPID2` == "" ]]; then
8206 error "First grouplock does not block second one"
8208 echo "Second grouplock blocks first one"
8210 kill -USR1 $MULTIPID1
8214 run_test 82 "Basic grouplock test"
8217 [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs"
8219 test_mkdir $DIR/$tdir.cvsroot
8220 chown $RUNAS_ID $DIR/$tdir.cvsroot
8223 $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
8226 # some versions of cvs import exit(1) when asked to import links or
8227 # files they can't read. ignore those files.
8228 local toignore=$(find . -type l -printf '-I %f\n' -o \
8229 ! -perm /4 -printf '-I %f\n')
8230 $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
8231 $tdir.reposname vtag rtag
8234 test_mkdir $DIR/$tdir.reposname
8235 chown $RUNAS_ID $DIR/$tdir.reposname
8236 $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
8238 cd $DIR/$tdir.reposname
8240 $RUNAS cvs add -m 'addmsg' foo99
8242 $RUNAS cvs commit -m 'nomsg' foo99
8243 rm -fr $DIR/$tdir.cvsroot
8245 run_test 99 "cvs strange file/directory operations"
8248 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8249 [[ "$NETTYPE" =~ tcp ]] ||
8250 skip_env "TCP secure port test, not useful for NETTYPE=$NETTYPE"
8251 remote_ost_nodsh && skip "remote OST with nodsh"
8252 remote_mds_nodsh && skip "remote MDS with nodsh"
8254 skip "useless for local single node setup"
8256 netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
8257 [ "$PROT" != "tcp" ] && continue
8258 RPORT=$(echo $REMOTE | cut -d: -f2)
8259 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
8262 LPORT=`echo $LOCAL | cut -d: -f2`
8263 if [ $LPORT -ge 1024 ]; then
8264 echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
8266 error_exit "local: $LPORT > 1024, remote: $RPORT"
8269 [ "$rc" = 0 ] || error_exit "privileged port not found" )
8271 run_test 100 "check local port using privileged port ==========="
8273 function get_named_value()
8282 echo $line | sed "s/^$tag[ ]*//"
8289 export CACHE_MAX=$($LCTL get_param -n llite.*.max_cached_mb |
8290 awk '/^max_cached_mb/ { print $2 }')
8293 $LCTL set_param -n llite.*.max_cached_mb $CACHE_MAX
8298 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8299 [ $MDSCOUNT -ge 2 ] && skip_env "needs < 2 MDTs" #LU-4322
8304 local cache_limit=32
8306 $LCTL set_param -n osc.*-osc*.rpc_stats 0
8307 trap cleanup_101a EXIT
8308 $LCTL set_param -n llite.*.read_ahead_stats 0
8309 $LCTL set_param -n llite.*.max_cached_mb $cache_limit
8312 # randomly read 10000 of 64K chunks from file 3x 32MB in size
8314 echo "nreads: $nreads file size: $((cache_limit * 3))MB"
8315 $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
8318 for s in $($LCTL get_param -n llite.*.read_ahead_stats |
8319 get_named_value 'read but discarded' | cut -d" " -f1); do
8320 discard=$(($discard + $s))
8324 if [[ $(($discard * 10)) -gt $nreads ]]; then
8325 $LCTL get_param osc.*-osc*.rpc_stats
8326 $LCTL get_param llite.*.read_ahead_stats
8327 error "too many ($discard) discarded pages"
8329 rm -f $DIR/$tfile || true
8331 run_test 101a "check read-ahead for random reads"
8334 test_mkdir $DIR/$tdir
8335 local STRIPE_SIZE=$1
8336 local FILE_LENGTH=$2
8339 local FILE_SIZE_MB=$((FILE_LENGTH / STRIPE_SIZE))
8341 local list=$(comma_list $(osts_nodes))
8342 set_osd_param $list '' read_cache_enable 0
8343 set_osd_param $list '' writethrough_cache_enable 0
8345 trap cleanup_test101bc EXIT
8346 # prepare the read-ahead file
8347 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
8349 dd if=/dev/zero of=$DIR/$tfile bs=$STRIPE_SIZE \
8350 count=$FILE_SIZE_MB 2> /dev/null
8354 cleanup_test101bc() {
8359 local list=$(comma_list $(osts_nodes))
8360 set_osd_param $list '' read_cache_enable 1
8361 set_osd_param $list '' writethrough_cache_enable 1
8365 awk 'BEGIN{total=0}; {total+=$1}; END{print total}'
8370 local STRIPE_SIZE=$2
8371 local FILE_LENGTH=$3
8372 local RA_INC=1048576
8373 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
8374 local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
8375 (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
8376 DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
8377 get_named_value 'read but discarded' |
8378 cut -d" " -f1 | calc_total)
8379 if [[ $DISCARD -gt $discard_limit ]]; then
8380 $LCTL get_param llite.*.read_ahead_stats
8381 error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
8383 echo "Read-ahead success for size ${READ_SIZE}"
8388 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8389 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8391 local STRIPE_SIZE=1048576
8392 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
8394 if [ $SLOW == "yes" ]; then
8395 local FILE_LENGTH=$((STRIDE_SIZE * 64))
8397 local FILE_LENGTH=$((STRIDE_SIZE * 8))
8400 local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
8402 # prepare the read-ahead file
8403 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8404 cancel_lru_locks osc
8405 for BIDX in 2 4 8 16 32 64 128 256
8407 local BSIZE=$((BIDX*4096))
8408 local READ_COUNT=$((STRIPE_SIZE/BSIZE))
8409 local STRIDE_LENGTH=$((STRIDE_SIZE/BSIZE))
8410 local OFFSET=$((STRIPE_SIZE/BSIZE*(OSTCOUNT - 1)))
8411 $LCTL set_param -n llite.*.read_ahead_stats 0
8412 $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
8413 -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
8414 cancel_lru_locks osc
8415 ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
8420 run_test 101b "check stride-io mode read-ahead ================="
8423 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8425 local STRIPE_SIZE=1048576
8426 local FILE_LENGTH=$((STRIPE_SIZE*100))
8431 setup_test101bc $STRIPE_SIZE $FILE_LENGTH
8433 cancel_lru_locks osc
8434 $LCTL set_param osc.*.rpc_stats 0
8435 $READS -f $DIR/$tfile -s$FILE_LENGTH -b$rsize -n$nreads -t 180
8436 for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
8437 local stats=$($LCTL get_param -n $osc_rpc_stats)
8438 local lines=$(echo "$stats" | awk 'END {print NR;}')
8441 if [ $lines -le 20 ]; then
8444 for size in 1 2 4 8; do
8445 local rpc=$(echo "$stats" |
8446 awk '($1 == "'$size':") {print $2; exit; }')
8447 [ $rpc != 0 ] && ((size * PAGE_SIZE < rsize)) &&
8448 error "Small $((size*PAGE_SIZE)) read IO $rpc!"
8450 echo "$osc_rpc_stats check passed!"
8455 run_test 101c "check stripe_size aligned read-ahead ================="
8458 $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
8459 $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
8463 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8465 local file=$DIR/$tfile
8466 local sz_MB=${FILESIZE_101d:-500}
8467 local ra_MB=${READAHEAD_MB:-40}
8469 local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
8470 [ $free_MB -lt $sz_MB ] &&
8471 skip "Need free space ${sz_MB}M, have ${free_MB}M"
8473 echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
8474 $SETSTRIPE -c -1 $file || error "setstripe failed"
8476 dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
8477 echo Cancel LRU locks on lustre client to flush the client cache
8478 cancel_lru_locks osc
8480 echo Disable read-ahead
8481 local old_READAHEAD=$(set_read_ahead 0)
8483 echo Reading the test file $file with read-ahead disabled
8484 local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8486 echo Cancel LRU locks on lustre client to flush the client cache
8487 cancel_lru_locks osc
8488 echo Enable read-ahead with ${ra_MB}MB
8489 set_read_ahead $ra_MB
8491 echo Reading the test file $file with read-ahead enabled
8492 local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
8494 echo "read-ahead disabled time read $raOFF"
8495 echo "read-ahead enabled time read $raON"
8497 set_read_ahead $old_READAHEAD
8499 wait_delete_completed
8501 [ $raOFF -le 1 -o $raON -lt $raOFF ] ||
8502 error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
8504 run_test 101d "file read with and without read-ahead enabled"
8507 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8509 local file=$DIR/$tfile
8510 local size_KB=500 #KB
8514 local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
8515 local need_KB=$((count * size_KB))
8516 [[ $free_KB -le $need_KB ]] &&
8517 skip_env "Need free space $need_KB, have $free_KB"
8519 echo "Creating $count ${size_KB}K test files"
8520 for ((i = 0; i < $count; i++)); do
8521 dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
8524 echo "Cancel LRU locks on lustre client to flush the client cache"
8525 cancel_lru_locks $OSC
8527 echo "Reset readahead stats"
8528 $LCTL set_param -n llite.*.read_ahead_stats 0
8530 for ((i = 0; i < $count; i++)); do
8531 dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
8534 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8535 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8537 for ((i = 0; i < $count; i++)); do
8538 rm -rf $file.$i 2>/dev/null
8541 #10000 means 20% reads are missing in readahead
8542 [[ $miss -lt 10000 ]] || error "misses too much for small reads"
8544 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
8547 which iozone || skip_env "no iozone installed"
8549 local old_debug=$($LCTL get_param debug)
8550 old_debug=${old_debug#*=}
8551 $LCTL set_param debug="reada mmap"
8553 # create a test file
8554 iozone -i 0 -+n -r 1m -s 128m -w -f $DIR/$tfile > /dev/null 2>&1
8556 echo Cancel LRU locks on lustre client to flush the client cache
8557 cancel_lru_locks osc
8559 echo Reset readahead stats
8560 $LCTL set_param -n llite.*.read_ahead_stats 0
8562 echo mmap read the file with small block size
8563 iozone -i 1 -u 1 -l 1 -+n -r 32k -s 128m -B -f $DIR/$tfile \
8566 echo checking missing pages
8567 $LCTL get_param llite.*.read_ahead_stats
8568 local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
8569 get_named_value 'misses' | cut -d" " -f1 | calc_total)
8571 $LCTL set_param debug="$old_debug"
8572 [ $miss -lt 3 ] || error "misses too much pages ('$miss')!"
8575 run_test 101f "check mmap read performance"
8577 test_101g_brw_size_test() {
8579 local pages=$((mb * 1048576 / PAGE_SIZE))
8580 local file=$DIR/$tfile
8582 $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
8583 { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
8584 for mp in $($LCTL get_param -n osc.*.max_pages_per_rpc); do
8585 [ $mp -ne $pages ] && error "max_pages_per_rpc $mp != $pages" &&
8589 stack_trap "rm -f $file" EXIT
8590 $LCTL set_param -n osc.*.rpc_stats=0
8592 # 10 RPCs should be enough for the test
8594 dd if=/dev/zero of=$file bs=${mb}M count=$count ||
8595 { error "dd write ${mb} MB blocks failed"; return 3; }
8596 cancel_lru_locks osc
8597 dd of=/dev/null if=$file bs=${mb}M count=$count ||
8598 { error "dd write ${mb} MB blocks failed"; return 4; }
8600 # calculate number of full-sized read and write RPCs
8601 rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
8602 sed -n '/pages per rpc/,/^$/p' |
8603 awk '/'$pages':/ { reads += $2; writes += $6 }; \
8604 END { print reads,writes }'))
8605 [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
8607 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
8614 remote_ost_nodsh && skip "remote OST with nodsh"
8617 local osts=$(get_facets OST)
8618 local list=$(comma_list $(osts_nodes))
8619 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
8620 local brw_size="obdfilter.*.brw_size"
8622 $LFS setstripe -i 0 -c 1 $DIR/$tfile
8624 local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
8625 if [ $OST1_VERSION -ge $(version_code 2.8.52) -o \
8626 \( $OST1_VERSION -ge $(version_code 2.7.17) -a \
8627 $OST1_VERSION -lt $(version_code 2.7.50) \) ] &&
8628 [ $CLIENT_VERSION -ge $(version_code 2.8.52) -o \
8629 \( $CLIENT_VERSION -ge $(version_code 2.7.17) -a \
8630 $CLIENT_VERSION -lt $(version_code 2.7.50) \) ]; then
8631 [ $OST1_VERSION -ge $(version_code 2.9.52) ] && suffix="M"
8632 if [[ $orig_mb -lt 16 ]]; then
8633 save_lustre_params $osts "$brw_size" > $p
8634 do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
8635 error "set 16MB RPC size failed"
8637 echo "remount client to enable new RPC size"
8638 remount_client $MOUNT || error "remount_client failed"
8641 test_101g_brw_size_test 16 || error "16MB RPC test failed"
8642 # should be able to set brw_size=12, but no rpc_stats for that
8643 test_101g_brw_size_test 8 || error "8MB RPC test failed"
8646 test_101g_brw_size_test 4 || error "4MB RPC test failed"
8648 if [[ $orig_mb -lt 16 ]]; then
8649 restore_lustre_params < $p
8650 remount_client $MOUNT || error "remount_client restore failed"
8653 rm -f $p $DIR/$tfile
8655 run_test 101g "Big bulk(4/16 MiB) readahead"
8658 test_mkdir $DIR/$tdir
8659 chown $RUNAS_ID $DIR/$tdir
8662 STRIPE_COUNT=$OSTCOUNT
8663 [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
8665 trap cleanup_test102 EXIT
8667 $1 $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT $tdir
8669 for num in 1 2 3 4; do
8670 for count in $(seq 1 $STRIPE_COUNT); do
8671 for idx in $(seq 0 $[$STRIPE_COUNT - 1]); do
8672 local size=`expr $STRIPE_SIZE \* $num`
8673 local file=file"$num-$idx-$count"
8674 $1 $SETSTRIPE -S $size -i $idx -c $count $file
8680 $1 tar cf $TMP/f102.tar $tdir --xattrs
8686 rm -rf $DIR/d0.sanity/d102
8690 [ "$UID" != 0 ] && skip "must run as root"
8691 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep xattr)" ] &&
8692 skip_env "must have user_xattr"
8694 [ -z "$(which setfattr 2>/dev/null)" ] &&
8695 skip_env "could not find setfattr"
8697 local testfile=$DIR/$tfile
8700 echo "set/get xattr..."
8701 setfattr -n trusted.name1 -v value1 $testfile ||
8702 error "setfattr -n trusted.name1=value1 $testfile failed"
8703 getfattr -n trusted.name1 $testfile 2> /dev/null |
8704 grep "trusted.name1=.value1" ||
8705 error "$testfile missing trusted.name1=value1"
8707 setfattr -n user.author1 -v author1 $testfile ||
8708 error "setfattr -n user.author1=author1 $testfile failed"
8709 getfattr -n user.author1 $testfile 2> /dev/null |
8710 grep "user.author1=.author1" ||
8711 error "$testfile missing trusted.author1=author1"
8714 setfattr -n trusted.name2 -v value2 $testfile ||
8715 error "$testfile unable to set trusted.name2"
8716 setfattr -n trusted.name3 -v value3 $testfile ||
8717 error "$testfile unable to set trusted.name3"
8718 [ $(getfattr -d -m "^trusted" $testfile 2> /dev/null |
8719 grep "trusted.name" | wc -l) -eq 3 ] ||
8720 error "$testfile missing 3 trusted.name xattrs"
8722 setfattr -n user.author2 -v author2 $testfile ||
8723 error "$testfile unable to set user.author2"
8724 setfattr -n user.author3 -v author3 $testfile ||
8725 error "$testfile unable to set user.author3"
8726 [ $(getfattr -d -m "^user" $testfile 2> /dev/null |
8727 grep "user.author" | wc -l) -eq 3 ] ||
8728 error "$testfile missing 3 user.author xattrs"
8730 echo "remove xattr..."
8731 setfattr -x trusted.name1 $testfile ||
8732 error "$testfile error deleting trusted.name1"
8733 getfattr -d -m trusted $testfile 2> /dev/null | grep "trusted.name1" &&
8734 error "$testfile did not delete trusted.name1 xattr"
8736 setfattr -x user.author1 $testfile ||
8737 error "$testfile error deleting user.author1"
8738 echo "set lustre special xattr ..."
8739 $LFS setstripe -c1 $testfile
8740 local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
8741 awk -F "=" '/trusted.lov/ { print $2 }' )
8742 setfattr -n "trusted.lov" -v $lovea $testfile ||
8743 error "$testfile doesn't ignore setting trusted.lov again"
8744 setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
8745 error "$testfile allow setting invalid trusted.lov"
8748 run_test 102a "user xattr test =================================="
8750 check_102b_layout() {
8752 local testfile=$DIR/$tfile
8754 echo "test layout '$layout'"
8755 $LFS setstripe $layout $testfile || error "setstripe failed"
8756 $LFS getstripe -y $testfile
8758 echo "get/set/list trusted.lov xattr ..." # b=10930
8759 local value=$(getfattr -n trusted.lov -e hex $testfile | grep trusted)
8760 [[ "$value" =~ "trusted.lov" ]] ||
8761 error "can't get trusted.lov from $testfile"
8762 local stripe_count_orig=$($LFS getstripe -c $testfile) ||
8763 error "getstripe failed"
8765 $MCREATE $testfile.2 || error "mcreate $testfile.2 failed"
8767 value=$(cut -d= -f2 <<<$value)
8768 # LU-13168: truncated xattr should fail if short lov_user_md header
8769 [ $CLIENT_VERSION -lt $(version_code 2.13.53) ] &&
8770 lens="${#value}" || lens="$(seq 4 2 ${#value})"
8771 for len in $lens; do
8772 echo "setfattr $len $testfile.2"
8773 setfattr -n trusted.lov -v ${value:0:$len} $testfile.2 &&
8774 [ $len -lt 66 ] && error "short xattr len=$len worked"
8776 local stripe_size=$($LFS getstripe -S $testfile.2)
8777 local stripe_count=$($LFS getstripe -c $testfile.2)
8778 [[ $stripe_size -eq 65536 ]] ||
8779 error "stripe size $stripe_size != 65536"
8780 [[ $stripe_count -eq $stripe_count_orig ]] ||
8781 error "stripe count $stripe_count != $stripe_count_orig"
8782 rm $testfile $testfile.2
8786 [ -z "$(which setfattr 2>/dev/null)" ] &&
8787 skip_env "could not find setfattr"
8788 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8790 # check plain layout
8791 check_102b_layout -S 65536 -i 1 -c $OSTCOUNT
8793 # and also check composite layout
8794 check_102b_layout -E 1M -S 65536 -i 1 -c $OSTCOUNT -Eeof -S4M
8797 run_test 102b "getfattr/setfattr for trusted.lov EAs"
8800 [ -z "$(which setfattr 2>/dev/null)" ] &&
8801 skip_env "could not find setfattr"
8802 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8804 # b10930: get/set/list lustre.lov xattr
8805 echo "get/set/list lustre.lov xattr ..."
8806 test_mkdir $DIR/$tdir
8807 chown $RUNAS_ID $DIR/$tdir
8808 local testfile=$DIR/$tdir/$tfile
8809 $RUNAS $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
8810 error "setstripe failed"
8811 local STRIPECOUNT=$($RUNAS $GETSTRIPE -c $testfile) ||
8812 error "getstripe failed"
8813 $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
8814 grep "lustre.lov" || error "can't get lustre.lov from $testfile"
8816 local testfile2=${testfile}2
8817 local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
8818 grep "lustre.lov" |sed -e 's/[^=]\+=//' `
8820 $RUNAS $MCREATE $testfile2
8821 $RUNAS setfattr -n lustre.lov -v $value $testfile2
8822 local stripe_size=$($RUNAS $GETSTRIPE -S $testfile2)
8823 local stripe_count=$($RUNAS $GETSTRIPE -c $testfile2)
8824 [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
8825 [ $stripe_count -eq $STRIPECOUNT ] ||
8826 error "stripe count $stripe_count != $STRIPECOUNT"
8828 run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
8830 compare_stripe_info1() {
8831 local stripe_index_all_zero=true
8833 for num in 1 2 3 4; do
8834 for count in $(seq 1 $STRIPE_COUNT); do
8835 for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
8836 local size=$((STRIPE_SIZE * num))
8837 local file=file"$num-$offset-$count"
8838 stripe_size=$($LFS getstripe -S $PWD/$file)
8839 [[ $stripe_size -ne $size ]] &&
8840 error "$file: size $stripe_size != $size"
8841 stripe_count=$($LFS getstripe -c $PWD/$file)
8842 # allow fewer stripes to be created, ORI-601
8843 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
8844 error "$file: count $stripe_count != $count"
8845 stripe_index=$($LFS getstripe -i $PWD/$file)
8846 [[ $stripe_index -ne 0 ]] &&
8847 stripe_index_all_zero=false
8851 $stripe_index_all_zero &&
8852 error "all files are being extracted starting from OST index 0"
8856 have_xattrs_include() {
8857 tar --help | grep -q xattrs-include &&
8858 echo --xattrs-include="lustre.*"
8862 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8863 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8865 XINC=$(have_xattrs_include)
8867 tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8869 compare_stripe_info1
8871 run_test 102d "tar restore stripe info from tarfile,not keep osts"
8874 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8875 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8877 XINC=$(have_xattrs_include)
8879 test_mkdir $DIR/$tdir.restore
8881 tar cf - --xattrs $tdir | tar xf - \
8882 -C $DIR/$tdir.restore --xattrs $XINC
8883 cd $DIR/$tdir.restore/$tdir
8884 compare_stripe_info1
8886 run_test 102f "tar copy files, not keep osts"
8889 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
8890 skip "must have user_xattr"
8891 [ -z "$(which setfattr 2>/dev/null)" ] &&
8892 skip_env "could not find setfattr"
8893 [ -z "$(which getfattr 2>/dev/null)" ] &&
8894 skip_env "could not find getfattr"
8896 local xsize=${1:-1024} # in bytes
8897 local file=$DIR/$tfile
8898 local value="$(generate_string $xsize)"
8899 local xbig=trusted.big
8902 log "save $xbig on $file"
8903 setfattr -n $xbig -v $value $file ||
8904 error "saving $xbig on $file failed"
8906 local orig=$(get_xattr_value $xbig $file)
8907 [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
8909 local xsml=trusted.sml
8910 log "save $xsml on $file"
8911 setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
8913 local new=$(get_xattr_value $xbig $file)
8914 [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
8916 log "grow $xsml on $file"
8917 setfattr -n $xsml -v "$value" $file ||
8918 error "growing $xsml on $file failed"
8920 new=$(get_xattr_value $xbig $file)
8921 [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
8922 log "$xbig still valid after growing $xsml"
8927 test_102h() { # bug 15777
8930 run_test 102h "grow xattr from inside inode to external block"
8933 large_xattr_enabled || skip_env "ea_inode feature disabled"
8935 grow_xattr $(max_xattr_size)
8937 run_test 102ha "grow xattr from inside inode to external inode"
8939 test_102i() { # bug 17038
8940 [ -z "$(which getfattr 2>/dev/null)" ] &&
8941 skip "could not find getfattr"
8944 ln -s $DIR/$tfile $DIR/${tfile}link
8945 getfattr -n trusted.lov $DIR/$tfile ||
8946 error "lgetxattr on $DIR/$tfile failed"
8947 getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
8948 grep -i "no such attr" ||
8949 error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
8950 rm -f $DIR/$tfile $DIR/${tfile}link
8952 run_test 102i "lgetxattr test on symbolic link ============"
8955 [ $PARALLEL == "yes" ] && skip "skip parallel run"
8956 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
8958 XINC=$(have_xattrs_include)
8959 setup_test102 "$RUNAS"
8960 chown $RUNAS_ID $DIR/$tdir
8961 $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
8963 compare_stripe_info1 "$RUNAS"
8965 run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
8968 [ -z "$(which setfattr 2>/dev/null)" ] &&
8969 skip "could not find setfattr"
8972 # b22187 just check that does not crash for regular file.
8973 setfattr -n trusted.lov $DIR/$tfile
8974 # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
8975 local test_kdir=$DIR/$tdir
8976 test_mkdir $test_kdir
8977 local default_size=$($LFS getstripe -S $test_kdir)
8978 local default_count=$($LFS getstripe -c $test_kdir)
8979 local default_offset=$($LFS getstripe -i $test_kdir)
8980 $SETSTRIPE -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
8981 error 'dir setstripe failed'
8982 setfattr -n trusted.lov $test_kdir
8983 local stripe_size=$($LFS getstripe -S $test_kdir)
8984 local stripe_count=$($LFS getstripe -c $test_kdir)
8985 local stripe_offset=$($LFS getstripe -i $test_kdir)
8986 [ $stripe_size -eq $default_size ] ||
8987 error "stripe size $stripe_size != $default_size"
8988 [ $stripe_count -eq $default_count ] ||
8989 error "stripe count $stripe_count != $default_count"
8990 [ $stripe_offset -eq $default_offset ] ||
8991 error "stripe offset $stripe_offset != $default_offset"
8992 rm -rf $DIR/$tfile $test_kdir
8994 run_test 102k "setfattr without parameter of value shouldn't cause a crash"
8997 [ -z "$(which getfattr 2>/dev/null)" ] &&
8998 skip "could not find getfattr"
9000 # LU-532 trusted. xattr is invisible to non-root
9001 local testfile=$DIR/$tfile
9005 echo "listxattr as user..."
9006 chown $RUNAS_ID $testfile
9007 $RUNAS getfattr -d -m '.*' $testfile 2>&1 |
9008 grep -q "trusted" &&
9009 error "$testfile trusted xattrs are user visible"
9013 run_test 102l "listxattr size test =================================="
9015 test_102m() { # LU-3403 llite: error of listxattr when buffer is small
9016 local path=$DIR/$tfile
9019 listxattr_size_check $path || error "listattr_size_check $path failed"
9021 run_test 102m "Ensure listxattr fails on small bufffer ========"
9025 getxattr() { # getxattr path name
9026 # Return the base64 encoding of the value of xattr name on path.
9030 # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
9032 # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
9034 # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
9036 getfattr --absolute-names --encoding=base64 --name=$name $path |
9037 awk -F= -v name=$name '$1 == name {
9038 print substr($0, index($0, "=") + 1);
9042 test_102n() { # LU-4101 mdt: protect internal xattrs
9043 [ -z "$(which setfattr 2>/dev/null)" ] &&
9044 skip "could not find setfattr"
9045 if [ $MDS1_VERSION -lt $(version_code 2.5.50) ]
9047 skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
9050 local file0=$DIR/$tfile.0
9051 local file1=$DIR/$tfile.1
9052 local xattr0=$TMP/$tfile.0
9053 local xattr1=$TMP/$tfile.1
9054 local namelist="lov lma lmv link fid version som hsm"
9058 rm -rf $file0 $file1 $xattr0 $xattr1
9061 # Get 'before' xattrs of $file1.
9062 getfattr --absolute-names --dump --match=- $file1 > $xattr0
9064 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
9065 namelist+=" lfsck_namespace"
9066 for name in $namelist; do
9067 # Try to copy xattr from $file0 to $file1.
9068 value=$(getxattr $file0 trusted.$name 2> /dev/null)
9070 setfattr --name=trusted.$name --value="$value" $file1 ||
9071 error "setxattr 'trusted.$name' failed"
9073 # Try to set a garbage xattr.
9074 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9076 if [[ x$name == "xlov" ]]; then
9077 setfattr --name=trusted.lov --value="$value" $file1 &&
9078 error "setxattr invalid 'trusted.lov' success"
9080 setfattr --name=trusted.$name --value="$value" $file1 ||
9081 error "setxattr invalid 'trusted.$name' failed"
9084 # Try to remove the xattr from $file1. We don't care if this
9085 # appears to succeed or fail, we just don't want there to be
9086 # any changes or crashes.
9087 setfattr --remove=$trusted.$name $file1 2> /dev/null
9090 if [ $MDS1_VERSION -gt $(version_code 2.6.50) ]
9093 # Try to copy xattr from $file0 to $file1.
9094 value=$(getxattr $file0 trusted.$name 2> /dev/null)
9096 setfattr --name=trusted.$name --value="$value" $file1 ||
9097 error "setxattr 'trusted.$name' failed"
9099 # Try to set a garbage xattr.
9100 value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
9102 setfattr --name=trusted.$name --value="$value" $file1 ||
9103 error "setxattr 'trusted.$name' failed"
9105 # Try to remove the xattr from $file1. We don't care if this
9106 # appears to succeed or fail, we just don't want there to be
9107 # any changes or crashes.
9108 setfattr --remove=$trusted.$name $file1 2> /dev/null
9111 # Get 'after' xattrs of file1.
9112 getfattr --absolute-names --dump --match=- $file1 > $xattr1
9114 if ! diff $xattr0 $xattr1; then
9115 error "before and after xattrs of '$file1' differ"
9118 rm -rf $file0 $file1 $xattr0 $xattr1
9122 run_test 102n "silently ignore setxattr on internal trusted xattrs"
9124 test_102p() { # LU-4703 setxattr did not check ownership
9125 [ $MDS1_VERSION -lt $(version_code 2.5.56) ] &&
9126 skip "MDS needs to be at least 2.5.56"
9128 local testfile=$DIR/$tfile
9132 echo "setfacl as user..."
9133 $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
9134 [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
9136 echo "setfattr as user..."
9137 setfacl -m "u:$RUNAS_ID:---" $testfile
9138 $RUNAS setfattr -x system.posix_acl_access $testfile
9139 [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
9141 run_test 102p "check setxattr(2) correctly fails without permission"
9144 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] &&
9145 skip "MDS needs to be at least 2.6.92"
9147 orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
9149 run_test 102q "flistxattr should not return trusted.link EAs for orphans"
9152 [ $MDS1_VERSION -lt $(version_code 2.6.93) ] &&
9153 skip "MDS needs to be at least 2.6.93"
9155 touch $DIR/$tfile || error "touch"
9156 setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
9157 getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
9158 rm $DIR/$tfile || error "rm"
9161 mkdir -p $DIR/$tdir || error "mkdir"
9162 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9163 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9164 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9165 error "$testfile error deleting user.author1"
9166 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9167 grep "user.$(basename $tdir)" &&
9168 error "$tdir did not delete user.$(basename $tdir)"
9169 rmdir $DIR/$tdir || error "rmdir"
9172 test_mkdir $DIR/$tdir
9173 setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
9174 getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
9175 setfattr -x user.$(basename $tdir) $DIR/$tdir ||
9176 error "$testfile error deleting user.author1"
9177 getfattr -d -m user.$(basename $tdir) 2> /dev/null |
9178 grep "user.$(basename $tdir)" &&
9179 error "$tdir did not delete user.$(basename $tdir)"
9180 rmdir $DIR/$tdir || error "rm striped dir"
9182 run_test 102r "set EAs with empty values"
9185 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9186 skip "MDS needs to be at least 2.11.52"
9188 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9190 save_lustre_params client "llite.*.xattr_cache" > $save
9192 for cache in 0 1; do
9193 lctl set_param llite.*.xattr_cache=$cache
9196 touch $DIR/$tfile || error "touch"
9197 for prefix in lustre security system trusted user; do
9198 # Note getxattr() may fail with 'Operation not
9199 # supported' or 'No such attribute' depending
9200 # on prefix and cache.
9201 getfattr -n $prefix.n102s $DIR/$tfile &&
9202 error "getxattr '$prefix.n102s' should fail (cache = $cache)"
9206 restore_lustre_params < $save
9208 run_test 102s "getting nonexistent xattrs should fail"
9211 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
9212 skip "MDS needs to be at least 2.11.52"
9214 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
9216 save_lustre_params client "llite.*.xattr_cache" > $save
9218 for cache in 0 1; do
9219 lctl set_param llite.*.xattr_cache=$cache
9221 for buf_size in 0 256; do
9223 touch $DIR/$tfile || error "touch"
9224 setfattr -n user.multiop $DIR/$tfile
9225 $MULTIOP $DIR/$tfile oa$buf_size ||
9226 error "cannot get zero length xattr value (buf_size = $buf_size)"
9230 restore_lustre_params < $save
9232 run_test 102t "zero length xattr values handled correctly"
9236 $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
9241 [ "$UID" != 0 ] && skip "must run as root"
9242 $GSS && skip_env "could not run under gss"
9243 [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
9244 skip_env "must have acl enabled"
9245 [ -z "$(which setfacl 2>/dev/null)" ] &&
9246 skip_env "could not find setfacl"
9247 remote_mds_nodsh && skip "remote MDS with nodsh"
9249 gpasswd -a daemon bin # LU-5641
9250 do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641
9252 declare -a identity_old
9254 for num in $(seq $MDSCOUNT); do
9255 switch_identity $num true || identity_old[$num]=$?
9263 echo "performing cp ..."
9264 run_acl_subtest cp || error "run_acl_subtest cp failed"
9265 echo "performing getfacl-noacl..."
9266 run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
9267 echo "performing misc..."
9268 run_acl_subtest misc || error "misc test failed"
9269 echo "performing permissions..."
9270 run_acl_subtest permissions || error "permissions failed"
9271 # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
9272 if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] ||
9273 { [ $MDS1_VERSION -lt $(version_code 2.6) ] &&
9274 [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; }
9276 echo "performing permissions xattr..."
9277 run_acl_subtest permissions_xattr ||
9278 error "permissions_xattr failed"
9280 echo "performing setfacl..."
9281 run_acl_subtest setfacl || error "setfacl test failed"
9283 # inheritance test got from HP
9284 echo "performing inheritance..."
9285 cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
9286 chmod +x make-tree || error "chmod +x failed"
9287 run_acl_subtest inheritance || error "inheritance test failed"
9290 echo "LU-974 ignore umask when acl is enabled..."
9291 run_acl_subtest 974 || error "LU-974 umask test failed"
9292 if [ $MDSCOUNT -ge 2 ]; then
9293 run_acl_subtest 974_remote ||
9294 error "LU-974 umask test failed under remote dir"
9297 echo "LU-2561 newly created file is same size as directory..."
9298 if [ "$mds1_FSTYPE" != "zfs" ]; then
9299 run_acl_subtest 2561 || error "LU-2561 test failed"
9301 run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
9304 run_acl_subtest 4924 || error "LU-4924 test failed"
9309 for num in $(seq $MDSCOUNT); do
9310 if [ "${identity_old[$num]}" = 1 ]; then
9311 switch_identity $num false || identity_old[$num]=$?
9315 run_test 103a "acl test"
9321 for U in {0..511}; do
9323 local O=$(printf "%04o" $U)
9325 umask $(printf "%04o" $((511 ^ $O)))
9326 $LFS setstripe -c 1 $DIR/$tfile.s$O
9327 local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
9329 (( $S == ($O & 0666) )) ||
9330 error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
9332 $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
9333 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
9334 (( $S == ($O & 0666) )) ||
9335 error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
9337 $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
9338 S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
9339 (( $S == ($O & 0666) )) ||
9340 error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
9341 rm -f $DIR/$tfile.[smp]$0
9345 # limit the concurrently running threads to 64. LU-11878
9346 local idx=$((U % 64))
9347 [ -z "${pids[idx]}" ] || wait ${pids[idx]}
9352 run_test 103b "umask lfs setstripe"
9356 cp -rp $DIR/$tdir $DIR/$tdir.bak
9358 [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
9359 error "$DIR/$tdir shouldn't contain default ACL"
9360 [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
9361 error "$DIR/$tdir.bak shouldn't contain default ACL"
9364 run_test 103c "'cp -rp' won't set empty acl"
9367 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9370 lfs df || error "lfs df failed"
9371 lfs df -ih || error "lfs df -ih failed"
9372 lfs df -h $DIR || error "lfs df -h $DIR failed"
9373 lfs df -i $DIR || error "lfs df -i $DIR failed"
9374 lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
9375 lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
9377 local OSC=$(lctl dl | grep OST0000-osc-[^M] | awk '{ print $4 }')
9378 lctl --device %$OSC deactivate
9379 lfs df || error "lfs df with deactivated OSC failed"
9380 lctl --device %$OSC activate
9381 # wait the osc back to normal
9382 wait_osc_import_ready client ost
9384 lfs df || error "lfs df with reactivated OSC failed"
9387 run_test 104a "lfs df [-ih] [path] test ========================="
9390 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9391 [ $RUNAS_ID -eq $UID ] &&
9392 skip_env "RUNAS_ID = UID = $UID -- skipping"
9394 denied_cnt=$(($($RUNAS $LFS check servers 2>&1 |
9395 grep "Permission denied" | wc -l)))
9396 if [ $denied_cnt -ne 0 ]; then
9397 error "lfs check servers test failed"
9400 run_test 104b "$RUNAS lfs check servers test ===================="
9403 # doesn't work on 2.4 kernels
9405 if $(flock_is_enabled); then
9406 flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
9408 flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
9412 run_test 105a "flock when mounted without -o flock test ========"
9416 if $(flock_is_enabled); then
9417 flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
9419 flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
9423 run_test 105b "fcntl when mounted without -o flock test ========"
9427 if $(flock_is_enabled); then
9428 flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
9430 flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
9434 run_test 105c "lockf when mounted without -o flock test"
9436 test_105d() { # bug 15924
9437 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9439 test_mkdir $DIR/$tdir
9440 flock_is_enabled || skip_env "mount w/o flock enabled"
9441 #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
9442 $LCTL set_param fail_loc=0x80000315
9443 flocks_test 2 $DIR/$tdir
9445 run_test 105d "flock race (should not freeze) ========"
9447 test_105e() { # bug 22660 && 22040
9448 flock_is_enabled || skip_env "mount w/o flock enabled"
9451 flocks_test 3 $DIR/$tfile
9453 run_test 105e "Two conflicting flocks from same process"
9455 test_106() { #bug 10921
9456 test_mkdir $DIR/$tdir
9457 $DIR/$tdir && error "exec $DIR/$tdir succeeded"
9458 chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
9460 run_test 106 "attempt exec of dir followed by chown of that dir"
9463 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9471 local save_pattern=$(sysctl -n kernel.core_pattern)
9472 local save_uses_pid=$(sysctl -n kernel.core_uses_pid)
9473 sysctl -w kernel.core_pattern=$file
9474 sysctl -w kernel.core_uses_pid=0
9482 kill -s 11 $SLEEPPID
9484 if [ -e $file ]; then
9485 size=`stat -c%s $file`
9486 [ $size -eq 0 ] && error "Fail to create core file $file"
9488 error "Fail to create core file $file"
9491 sysctl -w kernel.core_pattern=$save_pattern
9492 sysctl -w kernel.core_uses_pid=$save_uses_pid
9495 run_test 107 "Coredump on SIG"
9498 test_mkdir $DIR/$tdir
9499 test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
9500 $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
9501 error "mkdir with 256 char should fail, but did not"
9502 touch $DIR/$tdir/$(str_repeat 'x' 255) ||
9503 error "create with 255 char failed"
9504 touch $DIR/$tdir/$(str_repeat 'y' 256) &&
9505 error "create with 256 char should fail, but did not"
9510 run_test 110 "filename length checking"
9513 # Purpose: To verify dynamic thread (OSS) creation.
9516 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9517 remote_ost_nodsh && skip "remote OST with nodsh"
9519 # Lustre does not stop service threads once they are started.
9520 # Reset number of running threads to default.
9525 local save_params="$TMP/sanity-$TESTNAME.parameters"
9527 # Get ll_ost_io count before I/O
9528 OSTIO_pre=$(do_facet ost1 \
9529 "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
9530 # Exit if lustre is not running (ll_ost_io not running).
9531 [ -z "$OSTIO_pre" ] && error "no OSS threads"
9533 echo "Starting with $OSTIO_pre threads"
9534 local thread_max=$((OSTIO_pre * 2))
9535 local rpc_in_flight=$((thread_max * 2))
9536 # Number of I/O Process proposed to be started.
9538 local facets=$(get_facets OST)
9540 save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
9541 save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
9543 # Set in_flight to $rpc_in_flight
9544 $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
9545 error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
9546 nfiles=${rpc_in_flight}
9547 # Set ost thread_max to $thread_max
9548 do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
9550 # 5 Minutes should be sufficient for max number of OSS
9551 # threads(thread_max) to be created.
9555 local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
9556 test_mkdir $DIR/$tdir
9557 for i in $(seq $nfiles); do
9558 local file=$DIR/$tdir/${tfile}-$i
9559 $LFS setstripe -c -1 -i 0 $file
9560 ($WTL $file $timeout)&
9563 # I/O Started - Wait for thread_started to reach thread_max or report
9564 # error if thread_started is more than thread_max.
9565 echo "Waiting for thread_started to reach thread_max"
9566 local thread_started=0
9567 local end_time=$((SECONDS + timeout))
9569 while [ $SECONDS -le $end_time ] ; do
9571 # Get ost i/o thread_started count.
9572 thread_started=$(do_facet ost1 \
9574 ost.OSS.ost_io.threads_started | cut -d= -f2")
9575 # Break out if thread_started is equal/greater than thread_max
9576 if [[ $thread_started -ge $thread_max ]]; then
9577 echo ll_ost_io thread_started $thread_started, \
9578 equal/greater than thread_max $thread_max
9584 # Cleanup - We have the numbers, Kill i/o jobs if running.
9585 jobcount=($(jobs -p))
9586 for i in $(seq 0 $((${#jobcount[@]}-1)))
9588 kill -9 ${jobcount[$i]}
9589 if [ $? -ne 0 ] ; then
9591 Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
9595 # Cleanup files left by WTL binary.
9596 for i in $(seq $nfiles); do
9597 local file=$DIR/$tdir/${tfile}-$i
9599 if [ $? -ne 0 ] ; then
9600 echo "Warning: Failed to delete file $file"
9604 restore_lustre_params <$save_params
9605 rm -f $save_params || echo "Warning: delete file '$save_params' failed"
9607 # Error out if no new thread has started or Thread started is greater
9609 if [[ $thread_started -le $OSTIO_pre ||
9610 $thread_started -gt $thread_max ]]; then
9611 error "ll_ost_io: thread_started $thread_started" \
9612 "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
9613 "No new thread started or thread started greater " \
9617 run_test 115 "verify dynamic thread creation===================="
9620 wait_delete_completed
9621 AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
9622 echo "OST kbytes available: ${AVAIL[@]}"
9627 for ((i = 0; i < ${#AVAIL[@]}; i++)); do
9628 #echo OST $i: ${AVAIL[i]}kb
9629 if [[ ${AVAIL[i]} -gt $MAXV ]]; then
9633 if [[ ${AVAIL[i]} -lt $MINV ]]; then
9638 echo "Min free space: OST $MINI: $MINV"
9639 echo "Max free space: OST $MAXI: $MAXV"
9642 test_116a() { # was previously test_116()
9643 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9644 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
9645 remote_mds_nodsh && skip "remote MDS with nodsh"
9647 echo -n "Free space priority "
9648 do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free |
9653 [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
9654 [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
9655 trap simple_cleanup_common EXIT
9657 # Check if we need to generate uneven OSTs
9658 test_mkdir -p $DIR/$tdir/OST${MINI}
9659 local FILL=$((MINV / 4))
9660 local DIFF=$((MAXV - MINV))
9661 local DIFF2=$((DIFF * 100 / MINV))
9663 local threshold=$(do_facet $SINGLEMDS \
9664 lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
9665 threshold=${threshold%%%}
9666 echo -n "Check for uneven OSTs: "
9667 echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
9669 if [[ $DIFF2 -gt $threshold ]]; then
9671 echo "Don't need to fill OST$MINI"
9673 # generate uneven OSTs. Write 2% over the QOS threshold value
9675 DIFF=$((threshold - DIFF2 + 2))
9676 DIFF2=$((MINV * DIFF / 100))
9677 echo "Fill $DIFF% remaining space in OST$MINI with ${DIFF2}KB"
9678 $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
9679 error "setstripe failed"
9680 DIFF=$((DIFF2 / 2048))
9682 while [ $i -lt $DIFF ]; do
9684 dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
9685 bs=2M count=1 2>/dev/null
9694 DIFF=$((MAXV - MINV))
9695 DIFF2=$((DIFF * 100 / MINV))
9696 echo -n "diff=$DIFF=$DIFF2% must be > $threshold% for QOS mode..."
9697 if [ $DIFF2 -gt $threshold ]; then
9700 echo "failed - QOS mode won't be used"
9701 simple_cleanup_common
9702 skip "QOS imbalance criteria not met"
9710 # now fill using QOS
9711 $SETSTRIPE -c 1 $DIR/$tdir
9712 FILL=$((FILL / 200))
9713 if [ $FILL -gt 600 ]; then
9716 echo "writing $FILL files to QOS-assigned OSTs"
9718 while [ $i -lt $FILL ]; do
9720 dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
9724 echo "wrote $i 200k files"
9728 echo "Note: free space may not be updated, so measurements might be off"
9730 DIFF2=$((MAXV - MINV))
9731 echo "free space delta: orig $DIFF final $DIFF2"
9732 [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
9733 DIFF=$((MINV1 - ${AVAIL[$MINI1]}))
9734 echo "Wrote ${DIFF}KB to smaller OST $MINI1"
9735 DIFF2=$((MAXV1 - ${AVAIL[$MAXI1]}))
9736 echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
9737 if [[ $DIFF -gt 0 ]]; then
9738 FILL=$((DIFF2 * 100 / DIFF - 100))
9739 echo "Wrote ${FILL}% more data to larger OST $MAXI1"
9742 # Figure out which files were written where
9743 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9744 awk '/'$MINI1': / {print $2; exit}')
9746 MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9747 echo "$MINC files created on smaller OST $MINI1"
9748 UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
9749 awk '/'$MAXI1': / {print $2; exit}')
9751 MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
9752 echo "$MAXC files created on larger OST $MAXI1"
9753 if [[ $MINC -gt 0 ]]; then
9754 FILL=$((MAXC * 100 / MINC - 100))
9755 echo "Wrote ${FILL}% more files to larger OST $MAXI1"
9757 [[ $MAXC -gt $MINC ]] ||
9758 error_ignore LU-9 "stripe QOS didn't balance free space"
9759 simple_cleanup_common
9761 run_test 116a "stripe QOS: free space balance ==================="
9763 test_116b() { # LU-2093
9764 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9765 remote_mds_nodsh && skip "remote MDS with nodsh"
9767 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
9768 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
9769 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
9770 [ -z "$old_rr" ] && skip "no QOS"
9771 do_facet $SINGLEMDS lctl set_param \
9772 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
9774 do_facet $SINGLEMDS lctl set_param fail_loc=0x147
9775 createmany -o $DIR/$tdir/f- 20 || error "can't create"
9776 do_facet $SINGLEMDS lctl set_param fail_loc=0
9778 do_facet $SINGLEMDS lctl set_param \
9779 lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
9781 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
9783 test_117() # bug 10891
9785 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9787 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
9788 #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
9789 lctl set_param fail_loc=0x21e
9790 > $DIR/$tfile || error "truncate failed"
9791 lctl set_param fail_loc=0
9792 echo "Truncate succeeded."
9795 run_test 117 "verify osd extend =========="
9797 NO_SLOW_RESENDCOUNT=4
9798 export OLD_RESENDCOUNT=""
9799 set_resend_count () {
9800 local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
9801 OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
9802 lctl set_param -n $PROC_RESENDCOUNT $1
9803 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
9806 # for reduce test_118* time (b=14842)
9807 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9809 # Reset async IO behavior after error case
9811 FILE=$DIR/reset_async
9813 # Ensure all OSCs are cleared
9814 $SETSTRIPE -c -1 $FILE
9815 dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT
9820 test_118a() #bug 11710
9822 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9826 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9827 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9828 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
9830 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9831 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9836 run_test 118a "verify O_SYNC works =========="
9840 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9841 remote_ost_nodsh && skip "remote OST with nodsh"
9845 #define OBD_FAIL_SRV_ENOENT 0x217
9846 set_nodes_failloc "$(osts_nodes)" 0x217
9847 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9849 set_nodes_failloc "$(osts_nodes)" 0
9850 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9851 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9854 if [[ $RC -eq 0 ]]; then
9855 error "Must return error due to dropped pages, rc=$RC"
9859 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9860 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9864 echo "Dirty pages not leaked on ENOENT"
9866 # Due to the above error the OSC will issue all RPCs syncronously
9867 # until a subsequent RPC completes successfully without error.
9868 $MULTIOP $DIR/$tfile Ow4096yc
9873 run_test 118b "Reclaim dirty pages on fatal error =========="
9877 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9879 # for 118c, restore the original resend count, LU-1940
9880 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] &&
9881 set_resend_count $OLD_RESENDCOUNT
9882 remote_ost_nodsh && skip "remote OST with nodsh"
9886 #define OBD_FAIL_OST_EROFS 0x216
9887 set_nodes_failloc "$(osts_nodes)" 0x216
9889 # multiop should block due to fsync until pages are written
9890 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9894 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9895 error "Multiop failed to block on fsync, pid=$MULTIPID"
9898 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9900 if [[ $WRITEBACK -eq 0 ]]; then
9901 error "No page in writeback, writeback=$WRITEBACK"
9904 set_nodes_failloc "$(osts_nodes)" 0
9907 if [[ $RC -ne 0 ]]; then
9908 error "Multiop fsync failed, rc=$RC"
9911 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9912 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9914 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9915 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9919 echo "Dirty pages flushed via fsync on EROFS"
9922 run_test 118c "Fsync blocks on EROFS until dirty pages are flushed =========="
9924 # continue to use small resend count to reduce test_118* time (b=14842)
9925 [ "$SLOW" = "no" ] && set_resend_count $NO_SLOW_RESENDCOUNT
9929 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9930 remote_ost_nodsh && skip "remote OST with nodsh"
9934 #define OBD_FAIL_OST_BRW_PAUSE_BULK
9935 set_nodes_failloc "$(osts_nodes)" 0x214
9936 # multiop should block due to fsync until pages are written
9937 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
9941 if [[ `ps h -o comm -p $MULTIPID` != "multiop" ]]; then
9942 error "Multiop failed to block on fsync, pid=$MULTIPID"
9945 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9947 if [[ $WRITEBACK -eq 0 ]]; then
9948 error "No page in writeback, writeback=$WRITEBACK"
9951 wait $MULTIPID || error "Multiop fsync failed, rc=$?"
9952 set_nodes_failloc "$(osts_nodes)" 0
9954 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9955 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9957 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9958 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9962 echo "Dirty pages gaurenteed flushed via fsync"
9965 run_test 118d "Fsync validation inject a delay of the bulk =========="
9968 [ $PARALLEL == "yes" ] && skip "skip parallel run"
9972 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
9973 lctl set_param fail_loc=0x8000040a
9975 # Should simulate EINVAL error which is fatal
9976 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
9978 if [[ $RC -eq 0 ]]; then
9979 error "Must return error due to dropped pages, rc=$RC"
9982 lctl set_param fail_loc=0x0
9984 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
9985 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
9986 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
9988 if [[ $LOCKED -ne 0 ]]; then
9989 error "Locked pages remain in cache, locked=$LOCKED"
9992 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
9993 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
9997 echo "No pages locked after fsync"
10002 run_test 118f "Simulate unrecoverable OSC side error =========="
10005 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10009 #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
10010 lctl set_param fail_loc=0x406
10012 # simulate local -ENOMEM
10013 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10016 lctl set_param fail_loc=0
10017 if [[ $RC -eq 0 ]]; then
10018 error "Must return error due to dropped pages, rc=$RC"
10021 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10022 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10023 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10025 if [[ $LOCKED -ne 0 ]]; then
10026 error "Locked pages remain in cache, locked=$LOCKED"
10029 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10030 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10034 echo "No pages locked after fsync"
10039 run_test 118g "Don't stay in wait if we got local -ENOMEM =========="
10042 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10043 remote_ost_nodsh && skip "remote OST with nodsh"
10047 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10048 set_nodes_failloc "$(osts_nodes)" 0x20e
10049 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
10050 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10053 set_nodes_failloc "$(osts_nodes)" 0
10054 if [[ $RC -eq 0 ]]; then
10055 error "Must return error due to dropped pages, rc=$RC"
10058 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10059 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10060 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache |
10062 if [[ $LOCKED -ne 0 ]]; then
10063 error "Locked pages remain in cache, locked=$LOCKED"
10066 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10067 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10071 echo "No pages locked after fsync"
10075 run_test 118h "Verify timeout in handling recoverables errors =========="
10077 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10080 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10081 remote_ost_nodsh && skip "remote OST with nodsh"
10085 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10086 set_nodes_failloc "$(osts_nodes)" 0x20e
10088 # Should simulate ENOMEM error which is recoverable and should be handled by timeout
10089 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
10092 set_nodes_failloc "$(osts_nodes)" 0
10096 if [[ $RC -ne 0 ]]; then
10097 error "got error, but should be not, rc=$RC"
10100 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10101 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10102 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10103 if [[ $LOCKED -ne 0 ]]; then
10104 error "Locked pages remain in cache, locked=$LOCKED"
10107 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10108 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10112 echo "No pages locked after fsync"
10116 run_test 118i "Fix error before timeout in recoverable error =========="
10118 [ "$SLOW" = "no" ] && set_resend_count 4
10121 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10122 remote_ost_nodsh && skip "remote OST with nodsh"
10126 #define OBD_FAIL_OST_BRW_WRITE_BULK2 0x220
10127 set_nodes_failloc "$(osts_nodes)" 0x220
10129 # return -EIO from OST
10130 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
10132 set_nodes_failloc "$(osts_nodes)" 0x0
10133 if [[ $RC -eq 0 ]]; then
10134 error "Must return error due to dropped pages, rc=$RC"
10137 LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
10138 DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
10139 WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
10140 if [[ $LOCKED -ne 0 ]]; then
10141 error "Locked pages remain in cache, locked=$LOCKED"
10144 # in recoverable error on OST we want resend and stay until it finished
10145 if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
10146 error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
10150 echo "No pages locked after fsync"
10154 run_test 118j "Simulate unrecoverable OST side error =========="
10158 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10159 remote_ost_nodsh && skip "remote OSTs with nodsh"
10161 #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
10162 set_nodes_failloc "$(osts_nodes)" 0x20e
10163 test_mkdir $DIR/$tdir
10165 for ((i=0;i<10;i++)); do
10166 (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
10167 error "dd to $DIR/$tdir/$tfile-$i failed" )&
10174 set_nodes_failloc "$(osts_nodes)" 0
10177 run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
10179 test_118l() # LU-646
10181 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10183 test_mkdir $DIR/$tdir
10184 $MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
10187 run_test 118l "fsync dir"
10189 test_118m() # LU-3066
10191 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10193 test_mkdir $DIR/$tdir
10194 $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
10197 run_test 118m "fdatasync dir ========="
10199 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
10206 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10207 remote_ost_nodsh && skip "remote OSTs with nodsh"
10209 # Sleep to avoid a cached response.
10210 #define OBD_STATFS_CACHE_SECONDS 1
10213 # Inject a 10 second delay in the OST_STATFS handler.
10214 #define OBD_FAIL_OST_STATFS_DELAY 0x242
10215 set_nodes_failloc "$(osts_nodes)" 0x242
10218 stat --file-system $MOUNT > /dev/null
10221 set_nodes_failloc "$(osts_nodes)" 0
10223 if ((end - begin > 20)); then
10224 error "statfs took $((end - begin)) seconds, expected 10"
10227 run_test 118n "statfs() sends OST_STATFS requests in parallel"
10229 test_119a() # bug 11737
10231 BSIZE=$((512 * 1024))
10232 directio write $DIR/$tfile 0 1 $BSIZE
10233 # We ask to read two blocks, which is more than a file size.
10234 # directio will indicate an error when requested and actual
10235 # sizes aren't equeal (a normal situation in this case) and
10236 # print actual read amount.
10237 NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
10238 if [ "$NOB" != "$BSIZE" ]; then
10239 error "read $NOB bytes instead of $BSIZE"
10243 run_test 119a "Short directIO read must return actual read amount"
10245 test_119b() # bug 11737
10247 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
10249 $SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed"
10250 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
10252 $MULTIOP $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) ||
10253 error "direct read failed"
10256 run_test 119b "Sparse directIO read must return actual read amount"
10258 test_119c() # bug 13099
10261 directio write $DIR/$tfile 3 1 $BSIZE || error "direct write failed"
10262 directio readhole $DIR/$tfile 0 2 $BSIZE || error "reading hole failed"
10265 run_test 119c "Testing for direct read hitting hole"
10267 test_119d() # bug 15950
10269 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10271 MAX_RPCS_IN_FLIGHT=`$LCTL get_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight`
10272 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight 1
10274 $SETSTRIPE $DIR/$tfile -i 0 -c 1 || error "setstripe failed"
10275 $DIRECTIO write $DIR/$tfile 0 1 $BSIZE || error "first directio failed"
10276 #define OBD_FAIL_OSC_DIO_PAUSE 0x40d
10277 lctl set_param fail_loc=0x40d
10278 $DIRECTIO write $DIR/$tfile 1 4 $BSIZE &
10281 cat $DIR/$tfile > /dev/null &
10282 lctl set_param fail_loc=0
10285 log "the DIO writes have completed, now wait for the reads (should not block very long)"
10287 [ -n "`ps h -p $pid_reads -o comm`" ] && \
10288 error "the read rpcs have not completed in 2s"
10290 $LCTL set_param -n osc.*OST0000-osc-[^mM]*.max_rpcs_in_flight $MAX_RPCS_IN_FLIGHT
10292 run_test 119d "The DIO path should try to send a new rpc once one is completed"
10295 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10296 remote_mds_nodsh && skip "remote MDS with nodsh"
10297 test_mkdir $DIR/$tdir
10298 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10299 skip_env "no early lock cancel on server"
10301 lru_resize_disable mdc
10302 lru_resize_disable osc
10303 cancel_lru_locks mdc
10304 # asynchronous object destroy at MDT could cause bl ast to client
10305 cancel_lru_locks osc
10307 stat $DIR/$tdir > /dev/null
10308 can1=$(do_facet $SINGLEMDS \
10309 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10310 awk '/ldlm_cancel/ {print $2}')
10311 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10312 awk '/ldlm_bl_callback/ {print $2}')
10313 test_mkdir -c1 $DIR/$tdir/d1
10314 can2=$(do_facet $SINGLEMDS \
10315 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10316 awk '/ldlm_cancel/ {print $2}')
10317 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10318 awk '/ldlm_bl_callback/ {print $2}')
10319 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10320 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10321 lru_resize_enable mdc
10322 lru_resize_enable osc
10324 run_test 120a "Early Lock Cancel: mkdir test"
10327 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10328 remote_mds_nodsh && skip "remote MDS with nodsh"
10329 test_mkdir $DIR/$tdir
10330 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10331 skip_env "no early lock cancel on server"
10333 lru_resize_disable mdc
10334 lru_resize_disable osc
10335 cancel_lru_locks mdc
10336 stat $DIR/$tdir > /dev/null
10337 can1=$(do_facet $SINGLEMDS \
10338 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10339 awk '/ldlm_cancel/ {print $2}')
10340 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10341 awk '/ldlm_bl_callback/ {print $2}')
10342 touch $DIR/$tdir/f1
10343 can2=$(do_facet $SINGLEMDS \
10344 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10345 awk '/ldlm_cancel/ {print $2}')
10346 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10347 awk '/ldlm_bl_callback/ {print $2}')
10348 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10349 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10350 lru_resize_enable mdc
10351 lru_resize_enable osc
10353 run_test 120b "Early Lock Cancel: create test"
10356 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10357 remote_mds_nodsh && skip "remote MDS with nodsh"
10358 test_mkdir -c1 $DIR/$tdir
10359 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10360 skip "no early lock cancel on server"
10362 lru_resize_disable mdc
10363 lru_resize_disable osc
10364 test_mkdir -c1 $DIR/$tdir/d1
10365 test_mkdir -c1 $DIR/$tdir/d2
10366 touch $DIR/$tdir/d1/f1
10367 cancel_lru_locks mdc
10368 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
10369 can1=$(do_facet $SINGLEMDS \
10370 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10371 awk '/ldlm_cancel/ {print $2}')
10372 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10373 awk '/ldlm_bl_callback/ {print $2}')
10374 ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10375 can2=$(do_facet $SINGLEMDS \
10376 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10377 awk '/ldlm_cancel/ {print $2}')
10378 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10379 awk '/ldlm_bl_callback/ {print $2}')
10380 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10381 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10382 lru_resize_enable mdc
10383 lru_resize_enable osc
10385 run_test 120c "Early Lock Cancel: link test"
10388 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10389 remote_mds_nodsh && skip "remote MDS with nodsh"
10390 test_mkdir -c1 $DIR/$tdir
10391 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10392 skip_env "no early lock cancel on server"
10394 lru_resize_disable mdc
10395 lru_resize_disable osc
10397 cancel_lru_locks mdc
10398 stat $DIR/$tdir > /dev/null
10399 can1=$(do_facet $SINGLEMDS \
10400 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10401 awk '/ldlm_cancel/ {print $2}')
10402 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10403 awk '/ldlm_bl_callback/ {print $2}')
10404 chmod a+x $DIR/$tdir
10405 can2=$(do_facet $SINGLEMDS \
10406 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10407 awk '/ldlm_cancel/ {print $2}')
10408 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10409 awk '/ldlm_bl_callback/ {print $2}')
10410 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10411 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10412 lru_resize_enable mdc
10413 lru_resize_enable osc
10415 run_test 120d "Early Lock Cancel: setattr test"
10418 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10419 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10420 skip_env "no early lock cancel on server"
10421 remote_mds_nodsh && skip "remote MDS with nodsh"
10423 local dlmtrace_set=false
10425 test_mkdir -c1 $DIR/$tdir
10426 lru_resize_disable mdc
10427 lru_resize_disable osc
10428 ! $LCTL get_param debug | grep -q dlmtrace &&
10429 $LCTL set_param debug=+dlmtrace && dlmtrace_set=true
10430 dd if=/dev/zero of=$DIR/$tdir/f1 count=1
10431 cancel_lru_locks mdc
10432 cancel_lru_locks osc
10433 dd if=$DIR/$tdir/f1 of=/dev/null
10434 stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
10435 # XXX client can not do early lock cancel of OST lock
10436 # during unlink (LU-4206), so cancel osc lock now.
10438 cancel_lru_locks osc
10439 can1=$(do_facet $SINGLEMDS \
10440 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10441 awk '/ldlm_cancel/ {print $2}')
10442 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10443 awk '/ldlm_bl_callback/ {print $2}')
10444 unlink $DIR/$tdir/f1
10446 can2=$(do_facet $SINGLEMDS \
10447 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10448 awk '/ldlm_cancel/ {print $2}')
10449 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10450 awk '/ldlm_bl_callback/ {print $2}')
10451 [ $can1 -ne $can2 ] && error "$((can2 - can1)) cancel RPC occured" &&
10452 $LCTL dk $TMP/cancel.debug.txt
10453 [ $blk1 -ne $blk2 ] && error "$((blk2 - blk1)) blocking RPC occured" &&
10454 $LCTL dk $TMP/blocking.debug.txt
10455 $dlmtrace_set && $LCTL set_param debug=-dlmtrace
10456 lru_resize_enable mdc
10457 lru_resize_enable osc
10459 run_test 120e "Early Lock Cancel: unlink test"
10462 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10463 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10464 skip_env "no early lock cancel on server"
10465 remote_mds_nodsh && skip "remote MDS with nodsh"
10467 test_mkdir -c1 $DIR/$tdir
10468 lru_resize_disable mdc
10469 lru_resize_disable osc
10470 test_mkdir -c1 $DIR/$tdir/d1
10471 test_mkdir -c1 $DIR/$tdir/d2
10472 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
10473 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
10474 cancel_lru_locks mdc
10475 cancel_lru_locks osc
10476 dd if=$DIR/$tdir/d1/f1 of=/dev/null
10477 dd if=$DIR/$tdir/d2/f2 of=/dev/null
10478 stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
10479 # XXX client can not do early lock cancel of OST lock
10480 # during rename (LU-4206), so cancel osc lock now.
10482 cancel_lru_locks osc
10483 can1=$(do_facet $SINGLEMDS \
10484 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10485 awk '/ldlm_cancel/ {print $2}')
10486 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10487 awk '/ldlm_bl_callback/ {print $2}')
10488 mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
10490 can2=$(do_facet $SINGLEMDS \
10491 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10492 awk '/ldlm_cancel/ {print $2}')
10493 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10494 awk '/ldlm_bl_callback/ {print $2}')
10495 [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
10496 [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
10497 lru_resize_enable mdc
10498 lru_resize_enable osc
10500 run_test 120f "Early Lock Cancel: rename test"
10503 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10504 $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
10505 skip_env "no early lock cancel on server"
10506 remote_mds_nodsh && skip "remote MDS with nodsh"
10508 lru_resize_disable mdc
10509 lru_resize_disable osc
10511 echo create $count files
10512 test_mkdir $DIR/$tdir
10513 cancel_lru_locks mdc
10514 cancel_lru_locks osc
10517 can0=$(do_facet $SINGLEMDS \
10518 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10519 awk '/ldlm_cancel/ {print $2}')
10520 blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10521 awk '/ldlm_bl_callback/ {print $2}')
10522 createmany -o $DIR/$tdir/f $count
10524 can1=$(do_facet $SINGLEMDS \
10525 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10526 awk '/ldlm_cancel/ {print $2}')
10527 blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10528 awk '/ldlm_bl_callback/ {print $2}')
10530 echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
10531 echo rm $count files
10534 can2=$(do_facet $SINGLEMDS \
10535 "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
10536 awk '/ldlm_cancel/ {print $2}')
10537 blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
10538 awk '/ldlm_bl_callback/ {print $2}')
10540 echo total: $count removes in $((t2-t1))
10541 echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
10543 # wait for commitment of removal
10544 lru_resize_enable mdc
10545 lru_resize_enable osc
10547 run_test 120g "Early Lock Cancel: performance test"
10549 test_121() { #bug #10589
10550 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10553 writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
10554 #define OBD_FAIL_LDLM_CANCEL_RACE 0x310
10555 lctl set_param fail_loc=0x310
10556 cancel_lru_locks osc > /dev/null
10557 reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
10558 lctl set_param fail_loc=0
10559 [[ $reads -eq $writes ]] ||
10560 error "read $reads blocks, must be $writes blocks"
10562 run_test 121 "read cancel race ========="
10564 test_123a() { # was test 123, statahead(bug 11401)
10565 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10568 if ! grep -q "processor.*: 1" /proc/cpuinfo; then
10569 log "testing UP system. Performance may be lower than expected."
10574 test_mkdir $DIR/$tdir
10575 NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
10576 [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
10578 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
10579 createmany -o $DIR/$tdir/$tfile $j $((i - j))
10581 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10582 lctl set_param -n llite.*.statahead_max 0
10583 lctl get_param llite.*.statahead_max
10584 cancel_lru_locks mdc
10585 cancel_lru_locks osc
10587 time ls -l $DIR/$tdir | wc -l
10589 delta=$((etime - stime))
10590 log "ls $i files without statahead: $delta sec"
10591 lctl set_param llite.*.statahead_max=$max
10593 swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10594 lctl get_param -n llite.*.statahead_max | grep '[0-9]'
10595 cancel_lru_locks mdc
10596 cancel_lru_locks osc
10598 time ls -l $DIR/$tdir | wc -l
10600 delta_sa=$((etime - stime))
10601 log "ls $i files with statahead: $delta_sa sec"
10602 lctl get_param -n llite.*.statahead_stats
10603 ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
10605 [[ $swrong -lt $ewrong ]] &&
10606 log "statahead was stopped, maybe too many locks held!"
10607 [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
10609 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10610 max=`lctl get_param -n llite.*.statahead_max | head -n 1`
10611 lctl set_param -n llite.*.statahead_max 0
10612 lctl get_param llite.*.statahead_max
10613 cancel_lru_locks mdc
10614 cancel_lru_locks osc
10616 time ls -l $DIR/$tdir | wc -l
10618 delta=$((etime - stime))
10619 log "ls $i files again without statahead: $delta sec"
10620 lctl set_param llite.*.statahead_max=$max
10621 if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
10622 if [ $SLOWOK -eq 0 ]; then
10623 error "ls $i files is slower with statahead!"
10625 log "ls $i files is slower with statahead!"
10631 [ $delta -gt 20 ] && break
10632 [ $delta -gt 8 ] && MULT=$((50 / delta))
10633 [ "$SLOW" = "no" -a $delta -gt 5 ] && break
10641 delta=$((etime - stime))
10642 log "rm -r $DIR/$tdir/: $delta seconds"
10644 lctl get_param -n llite.*.statahead_stats
10646 run_test 123a "verify statahead work"
10648 test_123b () { # statahead(bug 15027)
10649 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10651 test_mkdir $DIR/$tdir
10652 createmany -o $DIR/$tdir/$tfile-%d 1000
10654 cancel_lru_locks mdc
10655 cancel_lru_locks osc
10657 #define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803
10658 lctl set_param fail_loc=0x80000803
10659 ls -lR $DIR/$tdir > /dev/null
10661 lctl set_param fail_loc=0x0
10662 lctl get_param -n llite.*.statahead_stats
10667 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
10670 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
10672 test_mkdir -i 0 -c 1 $DIR/$tdir.0
10673 test_mkdir -i 1 -c 1 $DIR/$tdir.1
10674 touch $DIR/$tdir.1/{1..3}
10675 mv $DIR/$tdir.1/{1..3} $DIR/$tdir.0
10677 remount_client $MOUNT
10679 $MULTIOP $DIR/$tdir.0 Q
10681 # let statahead to complete
10682 ls -l $DIR/$tdir.0 > /dev/null
10684 testid=$(echo $TESTNAME | tr '_' ' ')
10685 dmesg | tac | sed "/$testid/,$ d" | grep "Can not initialize inode" &&
10686 error "statahead warning" || true
10688 run_test 123c "Can not initialize inode warning on DNE statahead"
10691 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10692 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10693 skip_env "no lru resize on server"
10697 test_mkdir $DIR/$tdir
10699 log "create $NR files at $DIR/$tdir"
10700 createmany -o $DIR/$tdir/f $NR ||
10701 error "failed to create $NR files in $DIR/$tdir"
10703 cancel_lru_locks mdc
10704 ls -l $DIR/$tdir > /dev/null
10708 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
10709 local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
10710 LRU_SIZE=$($LCTL get_param -n $PARAM)
10711 if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
10712 NSDIR=$(echo $PARAM | cut -d "." -f1-3)
10714 log "NS=$(basename $NSDIR)"
10719 if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
10720 skip "Not enough cached locks created!"
10722 log "LRU=$LRU_SIZE"
10726 # We know that lru resize allows one client to hold $LIMIT locks
10727 # for 10h. After that locks begin to be killed by client.
10729 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit)
10731 if [ $LIMIT -lt $LRU_SIZE ]; then
10732 skip "Limit is too small $LIMIT"
10735 # Make LVF so higher that sleeping for $SLEEP is enough to _start_
10736 # killing locks. Some time was spent for creating locks. This means
10737 # that up to the moment of sleep finish we must have killed some of
10738 # them (10-100 locks). This depends on how fast ther were created.
10739 # Many of them were touched in almost the same moment and thus will
10740 # be killed in groups.
10741 local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE))
10743 # Use $LRU_SIZE_B here to take into account real number of locks
10744 # created in the case of CMD, LRU_SIZE_B != $NR in most of cases
10745 local LRU_SIZE_B=$LRU_SIZE
10747 local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor)
10748 log "OLD_LVF=$OLD_LVF"
10749 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF
10751 # Let's make sure that we really have some margin. Client checks
10752 # cached locks every 10 sec.
10753 SLEEP=$((SLEEP+20))
10754 log "Sleep ${SLEEP} sec"
10756 while ((SEC<$SLEEP)); do
10760 LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
10761 echo -n "$LRU_SIZE"
10764 $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
10765 local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
10767 [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
10768 error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
10769 unlinkmany $DIR/$tdir/f $NR
10773 log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in ${SLEEP}s"
10774 log "unlink $NR files at $DIR/$tdir"
10775 unlinkmany $DIR/$tdir/f $NR
10777 run_test 124a "lru resize ======================================="
10779 get_max_pool_limit()
10781 local limit=$($LCTL get_param \
10782 -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
10784 for l in $limit; do
10785 if [[ $l -gt $max ]]; then
10793 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10794 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10795 skip_env "no lru resize on server"
10797 LIMIT=$(get_max_pool_limit)
10799 NR=$(($(default_lru_size)*20))
10800 if [[ $NR -gt $LIMIT ]]; then
10801 log "Limit lock number by $LIMIT locks"
10805 IFree=$(mdsrate_inodes_available)
10806 if [ $IFree -lt $NR ]; then
10807 log "Limit lock number by $IFree inodes"
10811 lru_resize_disable mdc
10812 test_mkdir -p $DIR/$tdir/disable_lru_resize
10814 createmany -o $DIR/$tdir/disable_lru_resize/f $NR
10815 log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
10816 cancel_lru_locks mdc
10819 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10822 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10825 ls -la $DIR/$tdir/disable_lru_resize > /dev/null &
10829 nolruresize_delta=$((etime-stime))
10830 log "ls -la time: $nolruresize_delta seconds"
10831 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10832 unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
10834 lru_resize_enable mdc
10835 test_mkdir -p $DIR/$tdir/enable_lru_resize
10837 createmany -o $DIR/$tdir/enable_lru_resize/f $NR
10838 log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
10839 cancel_lru_locks mdc
10842 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10845 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10848 ls -la $DIR/$tdir/enable_lru_resize > /dev/null &
10852 lruresize_delta=$((etime-stime))
10853 log "ls -la time: $lruresize_delta seconds"
10854 log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
10856 if [ $lruresize_delta -gt $nolruresize_delta ]; then
10857 log "ls -la is $(((lruresize_delta - $nolruresize_delta) * 100 / $nolruresize_delta))% slower with lru resize enabled"
10858 elif [ $nolruresize_delta -gt $lruresize_delta ]; then
10859 log "ls -la is $(((nolruresize_delta - $lruresize_delta) * 100 / $nolruresize_delta))% faster with lru resize enabled"
10861 log "lru resize performs the same with no lru resize"
10863 unlinkmany $DIR/$tdir/enable_lru_resize/f $NR
10865 run_test 124b "lru resize (performance test) ======================="
10868 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10869 $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
10870 skip_env "no lru resize on server"
10872 # cache ununsed locks on client
10874 cancel_lru_locks mdc
10875 test_mkdir $DIR/$tdir
10876 createmany -o $DIR/$tdir/f $nr ||
10877 error "failed to create $nr files in $DIR/$tdir"
10878 ls -l $DIR/$tdir > /dev/null
10880 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10881 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10882 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10883 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10884 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10886 # set lru_max_age to 1 sec
10887 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10888 echo "sleep $((recalc_p * 2)) seconds..."
10889 sleep $((recalc_p * 2))
10891 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10892 # restore lru_max_age
10893 $LCTL set_param -n $nsdir.lru_max_age $max_age
10894 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10895 unlinkmany $DIR/$tdir/f $nr
10897 run_test 124c "LRUR cancel very aged locks"
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
10907 lru_resize_disable mdc
10908 stack_trap "lru_resize_enable mdc" EXIT
10910 cancel_lru_locks mdc
10912 # asynchronous object destroy at MDT could cause bl ast to client
10913 test_mkdir $DIR/$tdir
10914 createmany -o $DIR/$tdir/f $nr ||
10915 error "failed to create $nr files in $DIR/$tdir"
10916 stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT
10918 ls -l $DIR/$tdir > /dev/null
10920 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
10921 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
10922 local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
10923 local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
10925 echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
10927 # set lru_max_age to 1 sec
10928 $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
10929 stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT
10931 echo "sleep $((recalc_p * 2)) seconds..."
10932 sleep $((recalc_p * 2))
10934 local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
10936 [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
10938 run_test 124d "cancel very aged locks if lru-resize diasbaled"
10940 test_125() { # 13358
10941 $LCTL get_param -n llite.*.client_type | grep -q local ||
10942 skip "must run as local client"
10943 $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
10944 skip_env "must have acl enabled"
10945 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
10947 test_mkdir $DIR/$tdir
10948 $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
10949 setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
10950 ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
10952 run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
10954 test_126() { # bug 12829/13455
10955 $GSS && skip_env "must run as gss disabled"
10956 $LCTL get_param -n llite.*.client_type | grep -q local ||
10957 skip "must run as local client"
10958 [ "$UID" != 0 ] && skip "must run as root, not UID $UID"
10960 $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
10961 gid=`ls -n $DIR/$tfile | awk '{print $4}'`
10963 [ $gid -eq "1" ] || error "gid is set to" $gid "instead of 1"
10965 run_test 126 "check that the fsgid provided by the client is taken into account"
10967 test_127a() { # bug 15521
10968 [ $PARALLEL == "yes" ] && skip "skip parallel run"
10970 $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
10971 $LCTL set_param osc.*.stats=0
10972 FSIZE=$((2048 * 1024))
10973 dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
10974 cancel_lru_locks osc
10975 dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
10977 $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
10978 while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
10979 echo "got $COUNT $NAME"
10980 [ ! $MIN ] && error "Missing min value for $NAME proc entry"
10981 eval $NAME=$COUNT || error "Wrong proc format"
10984 read_bytes|write_bytes)
10985 [ $MIN -lt 4096 ] && error "min is too small: $MIN"
10986 [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
10987 [ $MAX -lt 4096 ] && error "max is too small: $MAX"
10988 [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
10989 [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
10990 [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
10991 error "sumsquare is too small: $SUMSQ"
10992 [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
10993 error "sumsquare is too big: $SUMSQ"
10997 done < $DIR/${tfile}.tmp
10999 #check that we actually got some stats
11000 [ "$read_bytes" ] || error "Missing read_bytes stats"
11001 [ "$write_bytes" ] || error "Missing write_bytes stats"
11002 [ "$read_bytes" != 0 ] || error "no read done"
11003 [ "$write_bytes" != 0 ] || error "no write done"
11005 run_test 127a "verify the client stats are sane"
11007 test_127b() { # bug LU-333
11008 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11009 local name count samp unit min max sum sumsq
11011 $LCTL set_param llite.*.stats=0
11013 # perform 2 reads and writes so MAX is different from SUM.
11014 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
11015 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1
11016 cancel_lru_locks osc
11017 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
11018 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
11020 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
11021 while read name count samp unit min max sum sumsq; do
11022 echo "got $count $name"
11023 eval $name=$count || error "Wrong proc format"
11027 [ $count -ne 2 ] && error "count is not 2: $count"
11028 [ $min -ne $PAGE_SIZE ] &&
11029 error "min is not $PAGE_SIZE: $min"
11030 [ $max -ne $PAGE_SIZE ] &&
11031 error "max is incorrect: $max"
11032 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
11033 error "sum is wrong: $sum"
11036 [ $count -ne 2 ] && error "count is not 2: $count"
11037 [ $min -ne $PAGE_SIZE ] &&
11038 error "min is not $PAGE_SIZE: $min"
11039 [ $max -ne $PAGE_SIZE ] &&
11040 error "max is incorrect: $max"
11041 [ $sum -ne $((PAGE_SIZE * 2)) ] &&
11042 error "sum is wrong: $sum"
11046 done < $TMP/$tfile.tmp
11048 #check that we actually got some stats
11049 [ "$read_bytes" ] || error "Missing read_bytes stats"
11050 [ "$write_bytes" ] || error "Missing write_bytes stats"
11051 [ "$read_bytes" != 0 ] || error "no read done"
11052 [ "$write_bytes" != 0 ] || error "no write done"
11054 rm -f $TMP/${tfile}.tmp
11056 run_test 127b "verify the llite client stats are sane"
11058 test_127c() { # LU-12394
11059 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11066 $LCTL set_param llite.*.extents_stats=1
11067 stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT
11069 # Use two stripes so there is enough space in default config
11070 $LFS setstripe -c 2 $DIR/$tfile
11072 # Extent stats start at 0-4K and go in power of two buckets
11073 # LL_HIST_START = 12 --> 2^12 = 4K
11074 # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket.
11075 # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on
11077 for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M;
11079 # Write and read, 2x each, second time at a non-zero offset
11080 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1
11081 dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10
11082 dd if=$DIR/$tfile of=/dev/null bs=$size count=1
11083 dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10
11087 $LCTL get_param llite.*.extents_stats
11090 for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M;
11092 local bucket=$($LCTL get_param -n llite.*.extents_stats |
11094 reads=$(echo $bucket | awk '{print $5}')
11095 writes=$(echo $bucket | awk '{print $9}')
11096 [ "$reads" -eq $count ] ||
11097 error "$reads reads in < $bsize bucket, expect $count"
11098 [ "$writes" -eq $count ] ||
11099 error "$writes writes in < $bsize bucket, expect $count"
11102 # Test mmap write and read
11103 $LCTL set_param llite.*.extents_stats=c
11105 dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1
11106 $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed"
11107 $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed"
11109 $LCTL get_param llite.*.extents_stats
11111 count=$(((size*1024) / PAGE_SIZE))
11113 bsize=$((2 * PAGE_SIZE / 1024))K
11115 bucket=$($LCTL get_param -n llite.*.extents_stats |
11117 reads=$(echo $bucket | awk '{print $5}')
11118 writes=$(echo $bucket | awk '{print $9}')
11119 # mmap writes fault in the page first, creating an additonal read
11120 [ "$reads" -eq $((2 * count)) ] ||
11121 error "$reads reads in < $bsize bucket, expect $count"
11122 [ "$writes" -eq $count ] ||
11123 error "$writes writes in < $bsize bucket, expect $count"
11125 run_test 127c "test llite extent stats with regular & mmap i/o"
11127 test_128() { # bug 15212
11129 $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log
11134 result=$(grep error $TMP/$tfile.log)
11135 rm -f $DIR/$tfile $TMP/$tfile.log
11136 [ -z "$result" ] ||
11137 error "consecutive find's under interactive lfs failed"
11139 run_test 128 "interactive lfs for 2 consecutive find's"
11141 set_dir_limits () {
11146 local ldproc=/proc/fs/ldiskfs
11147 local facets=$(get_facets MDS)
11149 for facet in ${facets//,/ }; do
11150 canondev=$(ldiskfs_canon \
11151 *.$(convert_facet2label $facet).mntdev $facet)
11152 do_facet $facet "test -e $ldproc/$canondev/max_dir_size" ||
11153 ldproc=/sys/fs/ldiskfs
11154 do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size"
11155 do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size"
11159 check_mds_dmesg() {
11160 local facets=$(get_facets MDS)
11161 for facet in ${facets//,/ }; do
11162 do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
11168 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11169 [[ $MDS1_VERSION -ge $(version_code 2.5.56) ]] ||
11170 skip "Need MDS version with at least 2.5.56"
11171 if [ "$mds1_FSTYPE" != ldiskfs ]; then
11172 skip_env "ldiskfs only test"
11174 remote_mds_nodsh && skip "remote MDS with nodsh"
11178 local has_warning=false
11181 mkdir -p $DIR/$tdir
11183 # block size of mds1
11184 local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
11185 set_dir_limits $maxsize $maxsize
11186 local dirsize=$(stat -c%s "$DIR/$tdir")
11188 while [[ $dirsize -le $maxsize ]]; do
11189 $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
11191 if ! $has_warning; then
11192 check_mds_dmesg '"is approaching"' && has_warning=true
11194 # check two errors:
11195 # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
11196 # EFBIG for previous versions included in ldiskfs series
11197 if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
11199 echo "return code $rc received as expected"
11201 createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
11202 error_exit "create failed w/o dir size limit"
11204 check_mds_dmesg '"has reached"' ||
11205 error_exit "reached message should be output"
11207 [ $has_warning = "false" ] &&
11208 error_exit "warning message should be output"
11210 dirsize=$(stat -c%s "$DIR/$tdir")
11212 [[ $dirsize -ge $maxsize ]] && return 0
11213 error_exit "current dir size $dirsize, " \
11214 "previous limit $maxsize"
11215 elif [ $rc -ne 0 ]; then
11217 error_exit "return $rc received instead of expected " \
11218 "$EFBIG or $ENOSPC, files in dir $dirsize"
11220 nfiles=$((nfiles + 1))
11221 dirsize=$(stat -c%s "$DIR/$tdir")
11225 error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
11227 run_test 129 "test directory size limit ========================"
11236 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11237 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11239 trap cleanup_130 EXIT RETURN
11241 local fm_file=$DIR/$tfile
11242 $SETSTRIPE -S 65536 -c 1 $fm_file || error "setstripe on $fm_file"
11243 dd if=/dev/zero of=$fm_file bs=65536 count=1 ||
11244 error "dd failed for $fm_file"
11246 # LU-1795: test filefrag/FIEMAP once, even if unsupported
11247 filefrag -ves $fm_file
11249 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11250 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11251 [ $RC != 0 ] && error "filefrag $fm_file failed"
11253 filefrag_op=$(filefrag -ve -k $fm_file |
11254 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11255 lun=$($GETSTRIPE -i $fm_file)
11257 start_blk=`echo $filefrag_op | cut -d: -f2 | cut -d. -f1`
11260 for line in $filefrag_op
11262 frag_lun=`echo $line | cut -d: -f5`
11263 ext_len=`echo $line | cut -d: -f4`
11264 if (( $frag_lun != $lun )); then
11266 error "FIEMAP on 1-stripe file($fm_file) failed"
11269 (( tot_len += ext_len ))
11272 if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then
11274 error "FIEMAP on 1-stripe file($fm_file) failed;"
11280 echo "FIEMAP on single striped file succeeded"
11282 run_test 130a "FIEMAP (1-stripe file)"
11285 [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs"
11287 local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11288 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11290 trap cleanup_130 EXIT RETURN
11292 local fm_file=$DIR/$tfile
11293 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11294 error "setstripe on $fm_file"
11295 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11296 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11298 dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT ||
11299 error "dd failed on $fm_file"
11301 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11302 filefrag_op=$(filefrag -ve -k $fm_file |
11303 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11305 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11306 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11311 for line in $filefrag_op
11313 frag_lun=$(echo $line | cut -d: -f5 |
11314 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11315 ext_len=$(echo $line | cut -d: -f4)
11316 if (( $frag_lun != $last_lun )); then
11317 if (( tot_len != 1024 )); then
11319 error "FIEMAP on $fm_file failed; returned " \
11320 "len $tot_len for OST $last_lun instead of 1024"
11323 (( num_luns += 1 ))
11327 (( tot_len += ext_len ))
11330 if (( num_luns != $OSTCOUNT || tot_len != 1024 )); then
11332 error "FIEMAP on $fm_file failed; returned wrong number of " \
11333 "luns or wrong len for OST $last_lun"
11339 echo "FIEMAP on $OSTCOUNT-stripe file succeeded"
11341 run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
11344 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11346 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11347 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11349 trap cleanup_130 EXIT RETURN
11351 local fm_file=$DIR/$tfile
11352 $SETSTRIPE -S 65536 -c 2 $fm_file || error "setstripe on $fm_file"
11353 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11354 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11356 dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 ||
11357 error "dd failed on $fm_file"
11359 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11360 filefrag_op=$(filefrag -ve -k $fm_file |
11361 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11363 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11364 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11369 for line in $filefrag_op
11371 frag_lun=$(echo $line | cut -d: -f5 |
11372 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11373 ext_len=$(echo $line | cut -d: -f4)
11374 if (( $frag_lun != $last_lun )); then
11375 logical=`echo $line | cut -d: -f2 | cut -d. -f1`
11376 if (( logical != 512 )); then
11378 error "FIEMAP on $fm_file failed; returned " \
11379 "logical start for lun $logical instead of 512"
11382 if (( tot_len != 512 )); then
11384 error "FIEMAP on $fm_file failed; returned " \
11385 "len $tot_len for OST $last_lun instead of 1024"
11388 (( num_luns += 1 ))
11392 (( tot_len += ext_len ))
11395 if (( num_luns != 2 || tot_len != 512 )); then
11397 error "FIEMAP on $fm_file failed; returned wrong number of " \
11398 "luns or wrong len for OST $last_lun"
11404 echo "FIEMAP on 2-stripe file with hole succeeded"
11406 run_test 130c "FIEMAP (2-stripe file with hole)"
11409 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
11411 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11412 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11414 trap cleanup_130 EXIT RETURN
11416 local fm_file=$DIR/$tfile
11417 $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file ||
11418 error "setstripe on $fm_file"
11419 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11420 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11422 local actual_stripe_count=$($GETSTRIPE -c $fm_file)
11423 dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
11424 error "dd failed on $fm_file"
11426 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11427 filefrag_op=$(filefrag -ve -k $fm_file |
11428 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11430 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11431 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11436 for line in $filefrag_op
11438 frag_lun=$(echo $line | cut -d: -f5 |
11439 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11440 ext_len=$(echo $line | cut -d: -f4)
11441 if (( $frag_lun != $last_lun )); then
11442 if (( tot_len != 1024 )); then
11444 error "FIEMAP on $fm_file failed; returned " \
11445 "len $tot_len for OST $last_lun instead of 1024"
11448 (( num_luns += 1 ))
11452 (( tot_len += ext_len ))
11455 if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
11457 error "FIEMAP on $fm_file failed; returned wrong number of " \
11458 "luns or wrong len for OST $last_lun"
11464 echo "FIEMAP on N-stripe file succeeded"
11466 run_test 130d "FIEMAP (N-stripe file)"
11469 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
11471 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11472 [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP"
11474 trap cleanup_130 EXIT RETURN
11476 local fm_file=$DIR/$tfile
11477 $SETSTRIPE -S 131072 -c 2 $fm_file || error "setstripe on $fm_file"
11478 [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
11479 skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS"
11482 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
11483 for ((i = 0; i < $NUM_BLKS; i++))
11485 dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
11488 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11489 filefrag_op=$(filefrag -ve -k $fm_file |
11490 sed -n '/ext:/,/found/{/ext:/d; /found/d; p}')
11492 last_lun=$(echo $filefrag_op | cut -d: -f5 |
11493 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11498 for line in $filefrag_op
11500 frag_lun=$(echo $line | cut -d: -f5 |
11501 sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/')
11502 ext_len=$(echo $line | cut -d: -f4)
11503 if (( $frag_lun != $last_lun )); then
11504 if (( tot_len != $EXPECTED_LEN )); then
11506 error "FIEMAP on $fm_file failed; returned " \
11507 "len $tot_len for OST $last_lun instead " \
11511 (( num_luns += 1 ))
11515 (( tot_len += ext_len ))
11518 if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then
11520 error "FIEMAP on $fm_file failed; returned wrong number " \
11521 "of luns or wrong len for OST $last_lun"
11527 echo "FIEMAP with continuation calls succeeded"
11529 run_test 130e "FIEMAP (test continuation FIEMAP calls)"
11532 filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
11533 [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP"
11535 local fm_file=$DIR/$tfile
11536 $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c ||
11537 error "multiop create with lov_delay_create on $fm_file"
11539 filefrag -ves $fm_file || error "filefrag $fm_file failed"
11540 filefrag_extents=$(filefrag -vek $fm_file |
11541 awk '/extents? found/ { print $2 }')
11542 if [[ "$filefrag_extents" != "0" ]]; then
11543 error "FIEMAP on $fm_file failed; " \
11544 "returned $filefrag_extents expected 0"
11549 run_test 130f "FIEMAP (unstriped file)"
11551 # Test for writev/readv
11553 rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
11554 error "writev test failed"
11555 rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
11556 error "readv failed"
11559 run_test 131a "test iov's crossing stripe boundary for writev/readv"
11562 local fsize=$((524288 + 1048576 + 1572864))
11563 rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
11564 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11565 error "append writev test failed"
11567 ((fsize += 1572864 + 1048576))
11568 rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
11569 $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
11570 error "append writev test failed"
11573 run_test 131b "test append writev"
11576 rwv -f $DIR/$tfile -w -d -n 1 1048576 || return 0
11579 run_test 131c "test read/write on file w/o objects"
11582 rwv -f $DIR/$tfile -w -n 1 1572864
11583 NOB=`rwv -f $DIR/$tfile -r -n 3 524288 524288 1048576 | awk '/error/ {print $6}'`
11584 if [ "$NOB" != 1572864 ]; then
11585 error "Short read filed: read $NOB bytes instead of 1572864"
11589 run_test 131d "test short read"
11592 rwv -f $DIR/$tfile -w -s 1048576 -n 1 1048576
11593 rwv -f $DIR/$tfile -r -z -s 0 -n 1 524288 || \
11594 error "read hitting hole failed"
11597 run_test 131e "test read hitting hole"
11606 mds*) res=$(do_facet $facet \
11607 $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
11609 ost*) res=$(do_facet $facet \
11610 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
11612 *) error "Wrong facet '$facet'" ;;
11614 [ "$res" ] || error "The counter for $op on $facet was not incremented"
11615 # if the argument $3 is zero, it means any stat increment is ok.
11616 if [[ $want -gt 0 ]]; then
11617 local count=$(echo $res | awk '{ print $2 }')
11618 [[ $count -ne $want ]] &&
11619 error "The $op counter on $facet is $count, not $want"
11624 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11625 remote_ost_nodsh && skip "remote OST with nodsh"
11626 remote_mds_nodsh && skip "remote MDS with nodsh"
11627 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11628 skip_env "MDS doesn't support rename stats"
11630 local testdir=$DIR/${tdir}/stats_testdir
11632 mkdir -p $DIR/${tdir}
11635 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11636 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11638 # verify mdt stats first.
11639 mkdir ${testdir} || error "mkdir failed"
11640 check_stats $SINGLEMDS "mkdir" 1
11641 touch ${testdir}/${tfile} || error "touch failed"
11642 check_stats $SINGLEMDS "open" 1
11643 check_stats $SINGLEMDS "close" 1
11644 [ $MDS1_VERSION -ge $(version_code 2.8.54) ] && {
11645 mknod ${testdir}/${tfile}-pipe p || error "mknod failed"
11646 check_stats $SINGLEMDS "mknod" 2
11648 rm -f ${testdir}/${tfile}-pipe || error "pipe remove failed"
11649 check_stats $SINGLEMDS "unlink" 1
11650 rm -f ${testdir}/${tfile} || error "file remove failed"
11651 check_stats $SINGLEMDS "unlink" 2
11653 # remove working dir and check mdt stats again.
11654 rmdir ${testdir} || error "rmdir failed"
11655 check_stats $SINGLEMDS "rmdir" 1
11657 local testdir1=$DIR/${tdir}/stats_testdir1
11658 mkdir -p ${testdir}
11659 mkdir -p ${testdir1}
11660 touch ${testdir1}/test1
11661 mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
11662 check_stats $SINGLEMDS "crossdir_rename" 1
11664 mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
11665 check_stats $SINGLEMDS "samedir_rename" 1
11667 rm -rf $DIR/${tdir}
11669 run_test 133a "Verifying MDT stats ========================================"
11674 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11675 remote_ost_nodsh && skip "remote OST with nodsh"
11676 remote_mds_nodsh && skip "remote MDS with nodsh"
11678 local testdir=$DIR/${tdir}/stats_testdir
11680 mkdir -p ${testdir} || error "mkdir failed"
11681 touch ${testdir}/${tfile} || error "touch failed"
11682 cancel_lru_locks mdc
11685 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11686 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11688 # extra mdt stats verification.
11689 chmod 444 ${testdir}/${tfile} || error "chmod failed"
11690 check_stats $SINGLEMDS "setattr" 1
11691 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11692 if [ $MDS1_VERSION -ne $(version_code 2.2.0) ]
11694 ls -l ${testdir}/${tfile} > /dev/null|| error "ls failed"
11695 check_stats $SINGLEMDS "getattr" 1
11697 rm -rf $DIR/${tdir}
11699 # when DNE is enabled, MDT uses STATFS RPC to ping other targets
11700 # so the check below is not reliable
11701 [ $MDSCOUNT -eq 1 ] || return 0
11703 # Sleep to avoid a cached response.
11704 #define OBD_STATFS_CACHE_SECONDS 1
11706 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11707 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11708 $LFS df || error "lfs failed"
11709 check_stats $SINGLEMDS "statfs" 1
11711 # check aggregated statfs (LU-10018)
11712 [ $MDS1_VERSION -lt $(version_code 2.11.54) ] &&
11714 [ $CLIENT_VERSION -lt $(version_code 2.11.54) ] &&
11717 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11718 do_facet ost1 $LCTL set_param obdfilter.*.exports.*.stats=clear
11720 check_stats $SINGLEMDS "statfs" 1
11722 # We want to check that the client didn't send OST_STATFS to
11723 # ost1 but the MDT also uses OST_STATFS for precreate. So some
11724 # extra care is needed here.
11725 if remote_mds; then
11726 local nid=$($LCTL list_nids | head -1 | sed "s/\./\\\./g")
11727 local param="obdfilter.$FSNAME-OST0000.exports.'$nid'.stats"
11729 res=$(do_facet ost1 $LCTL get_param $param | grep statfs)
11730 [ "$res" ] && error "OST got STATFS"
11735 run_test 133b "Verifying extra MDT stats =================================="
11738 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11739 remote_ost_nodsh && skip "remote OST with nodsh"
11740 remote_mds_nodsh && skip "remote MDS with nodsh"
11742 local testdir=$DIR/$tdir/stats_testdir
11744 test_mkdir -p $testdir
11746 # verify obdfilter stats.
11747 $SETSTRIPE -c 1 -i 0 $testdir/$tfile
11749 cancel_lru_locks osc
11750 wait_delete_completed
11753 do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
11754 do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
11756 dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
11759 cancel_lru_locks osc
11760 check_stats ost1 "write" 1
11762 dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
11763 check_stats ost1 "read" 1
11765 > $testdir/$tfile || error "truncate failed"
11766 check_stats ost1 "punch" 1
11768 rm -f $testdir/$tfile || error "file remove failed"
11769 wait_delete_completed
11770 check_stats ost1 "destroy" 1
11774 run_test 133c "Verifying OST stats ========================================"
11781 while [ $value -ge 2 ]; do
11786 if [ $orig -gt $order ]; then
11794 local size=('K' 'M' 'G' 'T');
11796 local size_string=$value
11798 while [ $value -ge 1024 ]; do
11799 if [ $i -gt 3 ]; then
11800 #T is the biggest unit we get here, if that is bigger,
11802 size_string=${value}T
11805 value=$((value >> 10))
11806 if [ $value -lt 1024 ]; then
11807 size_string=${value}${size[$i]}
11816 get_rename_size() {
11818 local context=${2:-.}
11819 local sample=$(do_facet $SINGLEMDS $LCTL \
11820 get_param mdt.$FSNAME-MDT0000.rename_stats |
11821 grep -A1 $context |
11822 awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
11827 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11828 remote_ost_nodsh && skip "remote OST with nodsh"
11829 remote_mds_nodsh && skip "remote MDS with nodsh"
11830 do_facet $SINGLEMDS $LCTL list_param mdt.*.rename_stats ||
11831 skip_env "MDS doesn't support rename stats"
11833 local testdir1=$DIR/${tdir}/stats_testdir1
11834 local testdir2=$DIR/${tdir}/stats_testdir2
11835 mkdir -p $DIR/${tdir}
11837 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11839 lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
11840 lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
11842 createmany -o $testdir1/test 512 || error "createmany failed"
11844 # check samedir rename size
11845 mv ${testdir1}/test0 ${testdir1}/test_0
11847 local testdir1_size=$(ls -l $DIR/${tdir} |
11848 awk '/stats_testdir1/ {print $5}')
11849 local testdir2_size=$(ls -l $DIR/${tdir} |
11850 awk '/stats_testdir2/ {print $5}')
11852 testdir1_size=$(order_2 $testdir1_size)
11853 testdir2_size=$(order_2 $testdir2_size)
11855 testdir1_size=$(size_in_KMGT $testdir1_size)
11856 testdir2_size=$(size_in_KMGT $testdir2_size)
11858 echo "source rename dir size: ${testdir1_size}"
11859 echo "target rename dir size: ${testdir2_size}"
11861 local cmd="do_facet $SINGLEMDS $LCTL "
11862 cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
11864 eval $cmd || error "$cmd failed"
11865 local samedir=$($cmd | grep 'same_dir')
11866 local same_sample=$(get_rename_size $testdir1_size)
11867 [ -z "$samedir" ] && error "samedir_rename_size count error"
11868 [[ $same_sample -eq 1 ]] ||
11869 error "samedir_rename_size error $same_sample"
11870 echo "Check same dir rename stats success"
11872 do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
11874 # check crossdir rename size
11875 mv ${testdir1}/test_0 ${testdir2}/test_0
11877 testdir1_size=$(ls -l $DIR/${tdir} |
11878 awk '/stats_testdir1/ {print $5}')
11879 testdir2_size=$(ls -l $DIR/${tdir} |
11880 awk '/stats_testdir2/ {print $5}')
11882 testdir1_size=$(order_2 $testdir1_size)
11883 testdir2_size=$(order_2 $testdir2_size)
11885 testdir1_size=$(size_in_KMGT $testdir1_size)
11886 testdir2_size=$(size_in_KMGT $testdir2_size)
11888 echo "source rename dir size: ${testdir1_size}"
11889 echo "target rename dir size: ${testdir2_size}"
11891 eval $cmd || error "$cmd failed"
11892 local crossdir=$($cmd | grep 'crossdir')
11893 local src_sample=$(get_rename_size $testdir1_size crossdir_src)
11894 local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
11895 [ -z "$crossdir" ] && error "crossdir_rename_size count error"
11896 [[ $src_sample -eq 1 ]] ||
11897 error "crossdir_rename_size error $src_sample"
11898 [[ $tgt_sample -eq 1 ]] ||
11899 error "crossdir_rename_size error $tgt_sample"
11900 echo "Check cross dir rename stats success"
11901 rm -rf $DIR/${tdir}
11903 run_test 133d "Verifying rename_stats ========================================"
11906 remote_mds_nodsh && skip "remote MDS with nodsh"
11907 remote_ost_nodsh && skip "remote OST with nodsh"
11908 [ $PARALLEL == "yes" ] && skip "skip parallel run"
11910 local testdir=$DIR/${tdir}/stats_testdir
11911 local ctr f0 f1 bs=32768 count=42 sum
11913 mkdir -p ${testdir} || error "mkdir failed"
11915 $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
11917 for ctr in {write,read}_bytes; do
11919 cancel_lru_locks osc
11921 do_facet ost1 $LCTL set_param -n \
11922 "obdfilter.*.exports.clear=clear"
11924 if [ $ctr = write_bytes ]; then
11926 f1=${testdir}/${tfile}
11928 f0=${testdir}/${tfile}
11932 dd if=$f0 of=$f1 conv=notrunc bs=$bs count=$count || \
11935 cancel_lru_locks osc
11937 sum=$(do_facet ost1 $LCTL get_param \
11938 "obdfilter.*.exports.*.stats" |
11939 awk -v ctr=$ctr 'BEGIN { sum = 0 }
11940 $1 == ctr { sum += $7 }
11941 END { printf("%0.0f", sum) }')
11943 if ((sum != bs * count)); then
11944 error "Bad $ctr sum, expected $((bs * count)), got $sum"
11948 rm -rf $DIR/${tdir}
11950 run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
11952 proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
11954 # Some versions of find (4.5.11, 4.5.14) included in CentOS 7.3-7.5 do
11955 # not honor the -ignore_readdir_race option correctly. So we call
11956 # error_ignore() rather than error() in these cases. See LU-11152.
11958 if (find --version; do_facet mds1 find --version) |
11959 grep -q '\b4\.5\.1[1-4]\b'; then
11960 error_ignore LU-11152 "$@"
11967 # First without trusting modes.
11968 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
11969 echo "proc_dirs='$proc_dirs'"
11970 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
11971 find $proc_dirs -exec cat '{}' \; &> /dev/null
11973 # Second verifying readability.
11974 $LCTL get_param -R '*' &> /dev/null
11976 # Verifing writability with badarea_io.
11978 -ignore_readdir_race \
11980 -not -name force_lbug \
11981 -not -name changelog_mask \
11982 -exec badarea_io '{}' \; ||
11983 error_133 "find $proc_dirs failed"
11985 run_test 133f "Check reads/writes of client lustre proc files with bad area io"
11988 remote_mds_nodsh && skip "remote MDS with nodsh"
11989 remote_ost_nodsh && skip "remote OST with nodsh"
11991 # eventually, this can also be replaced with "lctl get_param -R",
11992 # but not until that option is always available on the server
11994 for facet in mds1 ost1; do
11995 [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
11996 skip_noexit "Too old lustre on $facet"
11997 local facet_proc_dirs=$(do_facet $facet \
11998 \\\ls -d $proc_regexp 2>/dev/null)
11999 echo "${facet}_proc_dirs='$facet_proc_dirs'"
12000 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
12001 do_facet $facet find $facet_proc_dirs \
12002 ! -name req_history \
12003 -exec cat '{}' \\\; &> /dev/null
12005 do_facet $facet find $facet_proc_dirs \
12006 ! -name req_history \
12008 -exec cat '{}' \\\; &> /dev/null ||
12009 error "proc file read failed"
12011 do_facet $facet find $facet_proc_dirs \
12012 -ignore_readdir_race \
12014 -not -name force_lbug \
12015 -not -name changelog_mask \
12016 -exec badarea_io '{}' \\\; ||
12017 error_133 "$facet find $facet_proc_dirs failed"
12020 # remount the FS in case writes/reads /proc break the FS
12021 cleanup || error "failed to unmount"
12022 setup || error "failed to setup"
12025 run_test 133g "Check reads/writes of server lustre proc files with bad area io"
12028 remote_mds_nodsh && skip "remote MDS with nodsh"
12029 remote_ost_nodsh && skip "remote OST with nodsh"
12030 [[ $MDS1_VERSION -lt $(version_code 2.9.54) ]] &&
12031 skip "Need MDS version at least 2.9.54"
12035 for facet in client mds1 ost1; do
12036 local facet_proc_dirs=$(do_facet $facet \
12037 \\\ls -d $proc_regexp 2> /dev/null)
12038 [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
12039 echo "${facet}_proc_dirs='$facet_proc_dirs'"
12040 # Get the list of files that are missing the terminating newline
12041 local missing=($(do_facet $facet \
12042 find ${facet_proc_dirs} -type f \| \
12043 while read F\; do \
12044 awk -v FS='\v' -v RS='\v\v' \
12045 "'END { if(NR>0 && \
12046 \\\$NF !~ /.*\\\n\$/) \
12047 print FILENAME}'" \
12050 [ ${#missing[*]} -eq 0 ] ||
12051 error "files do not end with newline: ${missing[*]}"
12054 run_test 133h "Proc files should end with newlines"
12057 remote_mds_nodsh && skip "remote MDS with nodsh"
12058 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
12059 skip "Need MDS version at least 2.7.54"
12061 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12062 cancel_lru_locks mdc
12064 local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
12065 local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
12066 [ $unused -eq 0 ] || error "$unused locks are not cleared"
12069 createmany -o $DIR/$tdir/f $nr ||
12070 error "failed to create $nr files in $DIR/$tdir"
12071 unused=$($LCTL get_param -n $nsdir.lock_unused_count)
12073 #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
12074 do_facet mds1 $LCTL set_param fail_loc=0x327
12075 do_facet mds1 $LCTL set_param fail_val=500
12078 echo "sleep 10 seconds ..."
12080 local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
12082 do_facet mds1 $LCTL set_param fail_loc=0
12083 do_facet mds1 $LCTL set_param fail_val=0
12084 [ $lck_cnt -lt $unused ] ||
12085 error "No locks reclaimed, before:$unused, after:$lck_cnt"
12088 unlinkmany $DIR/$tdir/f $nr
12090 run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
12093 remote_mds_nodsh && skip "remote MDS with nodsh"
12094 [[ $MDS1_VERSION -lt $(version_code 2.7.54) ]] &&
12095 skip "Need MDS version at least 2.7.54"
12097 mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
12098 cancel_lru_locks mdc
12100 local low_wm=$(do_facet mds1 $LCTL get_param -n \
12101 ldlm.lock_reclaim_threshold_mb)
12102 # disable reclaim temporarily
12103 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
12105 #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
12106 do_facet mds1 $LCTL set_param fail_loc=0x328
12107 do_facet mds1 $LCTL set_param fail_val=500
12109 $LCTL set_param debug=+trace
12112 createmany -o $DIR/$tdir/f $nr &
12113 local create_pid=$!
12115 echo "Sleep $TIMEOUT seconds ..."
12117 if ! ps -p $create_pid > /dev/null 2>&1; then
12118 do_facet mds1 $LCTL set_param fail_loc=0
12119 do_facet mds1 $LCTL set_param fail_val=0
12120 do_facet mds1 $LCTL set_param \
12121 ldlm.lock_reclaim_threshold_mb=${low_wm}m
12122 error "createmany finished incorrectly!"
12124 do_facet mds1 $LCTL set_param fail_loc=0
12125 do_facet mds1 $LCTL set_param fail_val=0
12126 do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
12127 wait $create_pid || return 1
12129 unlinkmany $DIR/$tdir/f $nr
12131 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
12133 test_140() { #bug-17379
12134 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12136 test_mkdir $DIR/$tdir
12137 cd $DIR/$tdir || error "Changing to $DIR/$tdir"
12138 cp $(which stat) . || error "Copying stat to $DIR/$tdir"
12140 # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
12141 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
12143 while i=$((i + 1)); do
12145 cd $i || error "Changing to $i"
12146 ln -s ../stat stat || error "Creating stat symlink"
12147 # Read the symlink until ELOOP present,
12148 # not LBUGing the system is considered success,
12149 # we didn't overrun the stack.
12150 $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
12151 if [ $ret -ne 0 ]; then
12152 if [ $ret -eq 40 ]; then
12155 error "Open stat symlink"
12161 echo "The symlink depth = $i"
12162 [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] ||
12163 error "Invalid symlink depth"
12165 # Test recursive symlink
12166 ln -s symlink_self symlink_self
12167 $OPENFILE -f O_RDONLY symlink_self >/dev/null 2>&1; ret=$?
12168 echo "open symlink_self returns $ret"
12169 [ $ret -eq 40 ] || error "recursive symlink doesn't return -ELOOP"
12171 run_test 140 "Check reasonable stack depth (shouldn't LBUG) ===="
12174 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12176 local TF="$TMP/$tfile"
12178 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12180 cancel_lru_locks $OSC
12181 cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
12182 remount_client $MOUNT
12184 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
12187 $TRUNCATE $DIR/$tfile 6000
12188 cancel_lru_locks $OSC
12189 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
12192 echo "12345" >>$DIR/$tfile
12193 cancel_lru_locks $OSC
12194 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
12197 echo "12345" >>$DIR/$tfile
12198 cancel_lru_locks $OSC
12199 cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
12204 run_test 150 "truncate/append tests"
12206 #LU-2902 roc_hit was not able to read all values from lproc
12207 function roc_hit_init() {
12208 local list=$(comma_list $(osts_nodes))
12209 local dir=$DIR/$tdir-check
12210 local file=$dir/$tfile
12216 #use setstripe to do a write to every ost
12217 for i in $(seq 0 $((OSTCOUNT-1))); do
12218 $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
12219 dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
12220 idx=$(printf %04x $i)
12221 BEFORE=$(get_osd_param $list *OST*$idx stats |
12222 awk '$1 == "cache_access" {sum += $7}
12223 END { printf("%0.0f", sum) }')
12225 cancel_lru_locks osc
12226 cat $file >/dev/null
12228 AFTER=$(get_osd_param $list *OST*$idx stats |
12229 awk '$1 == "cache_access" {sum += $7}
12230 END { printf("%0.0f", sum) }')
12232 echo BEFORE:$BEFORE AFTER:$AFTER
12233 if ! let "AFTER - BEFORE == 4"; then
12235 error "roc_hit is not safe to use"
12243 function roc_hit() {
12244 local list=$(comma_list $(osts_nodes))
12245 echo $(get_osd_param $list '' stats |
12246 awk '$1 == "cache_hit" {sum += $7}
12247 END { printf("%0.0f", sum) }')
12250 function set_cache() {
12253 if [ "$2" == "off" ]; then
12256 local list=$(comma_list $(osts_nodes))
12257 set_osd_param $list '' $1_cache_enable $on
12259 cancel_lru_locks osc
12263 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12264 remote_ost_nodsh && skip "remote OST with nodsh"
12267 local list=$(comma_list $(osts_nodes))
12269 # check whether obdfilter is cache capable at all
12270 if ! get_osd_param $list '' read_cache_enable >/dev/null; then
12271 skip "not cache-capable obdfilter"
12274 # check cache is enabled on all obdfilters
12275 if get_osd_param $list '' read_cache_enable | grep 0; then
12276 skip "oss cache is disabled"
12279 set_osd_param $list '' writethrough_cache_enable 1
12281 # check write cache is enabled on all obdfilters
12282 if get_osd_param $list '' writethrough_cache_enable | grep 0; then
12283 skip "oss write cache is NOT enabled"
12288 #define OBD_FAIL_OBD_NO_LRU 0x609
12289 do_nodes $list $LCTL set_param fail_loc=0x609
12291 # pages should be in the case right after write
12292 dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES ||
12295 local BEFORE=$(roc_hit)
12296 cancel_lru_locks osc
12297 cat $DIR/$tfile >/dev/null
12298 local AFTER=$(roc_hit)
12300 do_nodes $list $LCTL set_param fail_loc=0
12302 if ! let "AFTER - BEFORE == CPAGES"; then
12303 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12306 # the following read invalidates the cache
12307 cancel_lru_locks osc
12308 set_osd_param $list '' read_cache_enable 0
12309 cat $DIR/$tfile >/dev/null
12311 # now data shouldn't be found in the cache
12313 cancel_lru_locks osc
12314 cat $DIR/$tfile >/dev/null
12316 if let "AFTER - BEFORE != 0"; then
12317 error "IN CACHE: before: $BEFORE, after: $AFTER"
12320 set_osd_param $list '' read_cache_enable 1
12323 run_test 151 "test cache on oss and controls ==============================="
12326 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12328 local TF="$TMP/$tfile"
12330 # simulate ENOMEM during write
12331 #define OBD_FAIL_OST_NOMEM 0x226
12332 lctl set_param fail_loc=0x80000226
12333 dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
12335 sync || error "sync failed"
12336 lctl set_param fail_loc=0
12338 # discard client's cache
12339 cancel_lru_locks osc
12341 # simulate ENOMEM during read
12342 lctl set_param fail_loc=0x80000226
12343 cmp $TF $DIR/$tfile || error "cmp failed"
12344 lctl set_param fail_loc=0
12348 run_test 152 "test read/write with enomem ============================"
12351 $MULTIOP $DIR/$tfile Ow4096Ycu || error "multiop failed"
12353 run_test 153 "test if fdatasync does not crash ======================="
12355 dot_lustre_fid_permission_check() {
12357 local ffid=$MOUNT/.lustre/fid/$fid
12360 echo "stat fid $fid"
12361 stat $ffid > /dev/null || error "stat $ffid failed."
12362 echo "touch fid $fid"
12363 touch $ffid || error "touch $ffid failed."
12364 echo "write to fid $fid"
12365 cat /etc/hosts > $ffid || error "write $ffid failed."
12366 echo "read fid $fid"
12367 diff /etc/hosts $ffid || error "read $ffid failed."
12368 echo "append write to fid $fid"
12369 cat /etc/hosts >> $ffid || error "append write $ffid failed."
12370 echo "rename fid $fid"
12371 mv $ffid $test_dir/$tfile.1 &&
12372 error "rename $ffid to $tfile.1 should fail."
12373 touch $test_dir/$tfile.1
12374 mv $test_dir/$tfile.1 $ffid &&
12375 error "rename $tfile.1 to $ffid should fail."
12376 rm -f $test_dir/$tfile.1
12377 echo "truncate fid $fid"
12378 $TRUNCATE $ffid 777 || error "truncate $ffid failed."
12379 echo "link fid $fid"
12380 ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
12381 if [[ $($LCTL get_param -n mdc.*-mdc-*.connect_flags) =~ acl ]]; then
12382 echo "setfacl fid $fid"
12383 setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
12384 echo "getfacl fid $fid"
12385 getfacl $ffid >/dev/null || error "getfacl $ffid failed."
12387 echo "unlink fid $fid"
12388 unlink $MOUNT/.lustre/fid/$fid && error "unlink $ffid should fail."
12389 echo "mknod fid $fid"
12390 mknod $ffid c 1 3 && error "mknod $ffid should fail."
12392 fid=[0xf00000400:0x1:0x0]
12393 ffid=$MOUNT/.lustre/fid/$fid
12395 echo "stat non-exist fid $fid"
12396 stat $ffid > /dev/null && error "stat non-exist $ffid should fail."
12397 echo "write to non-exist fid $fid"
12398 cat /etc/hosts > $ffid && error "write non-exist $ffid should fail."
12399 echo "link new fid $fid"
12400 ln $test_dir/$tfile $ffid && error "link $ffid should fail."
12402 mkdir -p $test_dir/$tdir
12403 touch $test_dir/$tdir/$tfile
12404 fid=$($LFS path2fid $test_dir/$tdir)
12407 error "error: could not get fid for $test_dir/$dir/$tfile."
12409 ffid=$MOUNT/.lustre/fid/$fid
12412 ls $ffid > /dev/null || error "ls $ffid failed."
12413 echo "touch $fid/$tfile.1"
12414 touch $ffid/$tfile.1 || error "touch $ffid/$tfile.1 failed."
12416 echo "touch $MOUNT/.lustre/fid/$tfile"
12417 touch $MOUNT/.lustre/fid/$tfile && \
12418 error "touch $MOUNT/.lustre/fid/$tfile should fail."
12420 echo "setxattr to $MOUNT/.lustre/fid"
12421 setfattr -n trusted.name1 -v value1 $MOUNT/.lustre/fid
12423 echo "listxattr for $MOUNT/.lustre/fid"
12424 getfattr -d -m "^trusted" $MOUNT/.lustre/fid
12426 echo "delxattr from $MOUNT/.lustre/fid"
12427 setfattr -x trusted.name1 $MOUNT/.lustre/fid
12429 echo "touch invalid fid: $MOUNT/.lustre/fid/[0x200000400:0x2:0x3]"
12430 touch $MOUNT/.lustre/fid/[0x200000400:0x2:0x3] &&
12431 error "touch invalid fid should fail."
12433 echo "touch non-normal fid: $MOUNT/.lustre/fid/[0x1:0x2:0x0]"
12434 touch $MOUNT/.lustre/fid/[0x1:0x2:0x0] &&
12435 error "touch non-normal fid should fail."
12437 echo "rename $tdir to $MOUNT/.lustre/fid"
12438 mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
12439 error "rename to $MOUNT/.lustre/fid should fail."
12441 if [ $MDS1_VERSION -ge $(version_code 2.3.51) ]
12443 local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
12444 local new_obf_mode=777
12446 echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
12447 chmod $new_obf_mode $DIR/.lustre/fid ||
12448 error "chmod $new_obf_mode $DIR/.lustre/fid failed"
12450 local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
12451 [ $obf_mode -eq $new_obf_mode ] ||
12452 error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
12454 echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
12455 chmod $old_obf_mode $DIR/.lustre/fid ||
12456 error "chmod $old_obf_mode $DIR/.lustre/fid failed"
12459 $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
12460 fid=$($LFS path2fid $test_dir/$tfile-2)
12462 if [ $MDS1_VERSION -ge $(version_code 2.6.50) ]
12464 echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
12465 cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
12466 error "create lov data thru .lustre failed"
12468 echo "cp /etc/passwd $test_dir/$tfile-2"
12469 cp /etc/passwd $test_dir/$tfile-2 ||
12470 error "copy to $test_dir/$tfile-2 failed."
12471 echo "diff /etc/passwd $MOUNT/.lustre/fid/$fid"
12472 diff /etc/passwd $MOUNT/.lustre/fid/$fid ||
12473 error "diff /etc/passwd $MOUNT/.lustre/fid/$fid failed."
12475 rm -rf $test_dir/tfile.lnk
12476 rm -rf $test_dir/$tfile-2
12480 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12481 skip "Need MDS version at least 2.4.1"
12483 local tf=$DIR/$tfile
12486 local fid=$($LFS path2fid $tf)
12487 [ -z "$fid" ] && error "path2fid unable to get $tf FID"
12489 # check that we get the same pathname back
12490 local found=$($LFS fid2path $MOUNT "$fid")
12491 [ -z "$found" ] && error "fid2path unable to get '$fid' path"
12492 [ "$found" == "$tf" ] ||
12493 error "fid2path($fid=path2fid($tf)) = $found != $tf"
12495 run_test 154A "lfs path2fid and fid2path basic checks"
12498 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12499 skip "Need MDS version at least 2.4.1"
12501 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
12502 touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
12503 local linkea=$($LL_DECODE_LINKEA $DIR/$tdir/$tfile | grep 'pfid')
12504 [ -z "$linkea" ] && error "decode linkea $DIR/$tdir/$tfile failed"
12506 local name=$(echo $linkea | awk '/pfid/ {print $5}' | sed -e "s/'//g")
12507 local PFID=$(echo $linkea | awk '/pfid/ {print $3}' | sed -e "s/,//g")
12509 # check that we get the same pathname
12510 echo "PFID: $PFID, name: $name"
12511 local FOUND=$($LFS fid2path $MOUNT "$PFID")
12512 [ -z "$FOUND" ] && error "fid2path unable to get $PFID path"
12513 [ "$FOUND/$name" != "$DIR/$tdir/$tfile" ] &&
12514 error "ll_decode_linkea has $FOUND/$name != $DIR/$tdir/$tfile"
12516 rm -rf $DIR/$tdir || error "Can not delete directory $DIR/$tdir"
12518 run_test 154B "verify the ll_decode_linkea tool"
12521 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12522 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12523 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12524 skip "Need MDS version at least 2.2.51"
12525 [ -z "$(which setfacl)" ] && skip_env "must have setfacl tool"
12527 cp /etc/hosts $DIR/$tfile
12529 fid=$($LFS path2fid $DIR/$tfile)
12531 [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile."
12533 dot_lustre_fid_permission_check "$fid" $DIR ||
12534 error "dot lustre permission check $fid failed"
12536 ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed"
12538 rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked"
12540 touch $MOUNT/.lustre/file &&
12541 error "creation is not allowed under .lustre"
12543 mkdir $MOUNT/.lustre/dir &&
12544 error "mkdir is not allowed under .lustre"
12548 run_test 154a "Open-by-FID"
12551 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12552 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12553 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
12554 [[ $MDS1_VERSION -ge $(version_code 2.2.51) ]] ||
12555 skip "Need MDS version at least 2.2.51"
12557 local remote_dir=$DIR/$tdir/remote_dir
12561 mkdir -p $DIR/$tdir
12562 $LFS mkdir -i $MDTIDX $remote_dir ||
12563 error "create remote directory failed"
12565 cp /etc/hosts $remote_dir/$tfile
12567 fid=$($LFS path2fid $remote_dir/$tfile)
12569 [ $rc -ne 0 ] && error "error: could not get fid for $remote_dir/$tfile"
12571 dot_lustre_fid_permission_check "$fid" $remote_dir ||
12572 error "dot lustre permission check $fid failed"
12575 run_test 154b "Open-by-FID for remote directory"
12578 [[ $MDS1_VERSION -lt $(version_code 2.4.1) ]] &&
12579 skip "Need MDS version at least 2.4.1"
12581 touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
12582 local FID1=$($LFS path2fid $DIR/$tfile.1)
12583 local FID2=$($LFS path2fid $DIR/$tfile.2)
12584 local FID3=$($LFS path2fid $DIR/$tfile.3)
12587 $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
12588 [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
12589 error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
12591 [ "$FID" = "${!want}" ] ||
12592 error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
12596 $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
12598 [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
12599 error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
12603 run_test 154c "lfs path2fid and fid2path multiple arguments"
12606 remote_mds_nodsh && skip "remote MDS with nodsh"
12607 [[ $MDS1_VERSION -lt $(version_code 2.5.53) ]] &&
12608 skip "Need MDS version at least 2.5.53"
12610 if remote_mds; then
12611 nid=$($LCTL list_nids | sed "s/\./\\\./g")
12615 local proc_ofile="mdt.*.exports.'$nid'.open_files"
12622 local fid=$($LFS path2fid $DIR/$tfile)
12625 cmd="exec $fd<$DIR/$tfile"
12627 local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
12628 echo "$fid_list" | grep "$fid"
12631 cmd="exec $fd>/dev/null"
12633 if [ $rc -ne 0 ]; then
12634 error "FID $fid not found in open files list $fid_list"
12637 run_test 154d "Verify open file fid"
12641 [[ $MDS1_VERSION -lt $(version_code 2.6.50) ]] &&
12642 skip "Need MDS version at least 2.6.50"
12644 if ls -a $MOUNT | grep -q '^\.lustre$'; then
12645 error ".lustre returned by readdir"
12648 run_test 154e ".lustre is not returned by readdir"
12651 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12653 # create parent directory on a single MDT to avoid cross-MDT hardlinks
12654 test_mkdir -p -c1 $DIR/$tdir/d
12655 # test dirs inherit from its stripe
12656 mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
12657 mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
12658 cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
12659 ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
12662 # get fid of parents
12663 local FID0=$($LFS path2fid $DIR/$tdir/d)
12664 local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
12665 local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
12666 local FID3=$($LFS path2fid $DIR)
12668 # check that path2fid --parents returns expected <parent_fid>/name
12669 # 1) test for a directory (single parent)
12670 local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
12671 [ "$parent" == "$FID0/foo1" ] ||
12672 error "expected parent: $FID0/foo1, got: $parent"
12674 # 2) test for a file with nlink > 1 (multiple parents)
12675 parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
12676 echo "$parent" | grep -F "$FID1/$tfile" ||
12677 error "$FID1/$tfile not returned in parent list"
12678 echo "$parent" | grep -F "$FID2/link" ||
12679 error "$FID2/link not returned in parent list"
12681 # 3) get parent by fid
12682 local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
12683 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12684 echo "$parent" | grep -F "$FID1/$tfile" ||
12685 error "$FID1/$tfile not returned in parent list (by fid)"
12686 echo "$parent" | grep -F "$FID2/link" ||
12687 error "$FID2/link not returned in parent list (by fid)"
12689 # 4) test for entry in root directory
12690 parent=$($LFS path2fid --parents $DIR/f)
12691 echo "$parent" | grep -F "$FID3/f" ||
12692 error "$FID3/f not returned in parent list"
12694 # 5) test it on root directory
12695 [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
12696 error "$MOUNT should not have parents"
12698 # enable xattr caching and check that linkea is correctly updated
12699 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
12700 save_lustre_params client "llite.*.xattr_cache" > $save
12701 lctl set_param llite.*.xattr_cache 1
12703 # 6.1) linkea update on rename
12704 mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
12706 # get parents by fid
12707 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12708 # foo1 should no longer be returned in parent list
12709 echo "$parent" | grep -F "$FID1" &&
12710 error "$FID1 should no longer be in parent list"
12711 # the new path should appear
12712 echo "$parent" | grep -F "$FID2/$tfile.moved" ||
12713 error "$FID2/$tfile.moved is not in parent list"
12715 # 6.2) linkea update on unlink
12716 rm -f $DIR/$tdir/d/foo2/link
12717 parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
12718 # foo2/link should no longer be returned in parent list
12719 echo "$parent" | grep -F "$FID2/link" &&
12720 error "$FID2/link should no longer be in parent list"
12724 restore_lustre_params < $save
12727 run_test 154f "get parent fids by reading link ea"
12731 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
12732 [[ $MDS1_VERSION -ge $(version_code 2.6.92) &&
12733 $CLIENT_VERSION -gt $(version_code 2.6.99) ]] ||
12734 skip "Need MDS version at least 2.6.92"
12736 mkdir -p $DIR/$tdir
12737 llapi_fid_test -d $DIR/$tdir
12739 run_test 154g "various llapi FID tests"
12741 test_155_small_load() {
12742 local temp=$TMP/$tfile
12743 local file=$DIR/$tfile
12745 dd if=/dev/urandom of=$temp bs=6096 count=1 || \
12746 error "dd of=$temp bs=6096 count=1 failed"
12748 cancel_lru_locks $OSC
12749 cmp $temp $file || error "$temp $file differ"
12751 $TRUNCATE $temp 6000
12752 $TRUNCATE $file 6000
12753 cmp $temp $file || error "$temp $file differ (truncate1)"
12755 echo "12345" >>$temp
12756 echo "12345" >>$file
12757 cmp $temp $file || error "$temp $file differ (append1)"
12759 echo "12345" >>$temp
12760 echo "12345" >>$file
12761 cmp $temp $file || error "$temp $file differ (append2)"
12767 test_155_big_load() {
12768 remote_ost_nodsh && skip "remote OST with nodsh"
12770 local temp=$TMP/$tfile
12771 local file=$DIR/$tfile
12774 local cache_size=$(do_facet ost$((MAXI+1)) \
12775 "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
12776 local large_file_size=$((cache_size * 2))
12778 echo "OSS cache size: $cache_size KB"
12779 echo "Large file size: $large_file_size KB"
12781 [ $MAXV -le $large_file_size ] &&
12782 skip_env "max available OST size needs > $large_file_size KB"
12784 $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed"
12786 dd if=/dev/urandom of=$temp bs=$large_file_size count=1k ||
12787 error "dd of=$temp bs=$large_file_size count=1k failed"
12790 cancel_lru_locks osc
12791 cmp $temp $file || error "$temp $file differ"
12797 save_writethrough() {
12798 local facets=$(get_facets OST)
12800 save_lustre_params $facets "osd-*.*.writethrough_cache_enable" > $1
12804 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12806 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12808 save_writethrough $p
12811 set_cache writethrough on
12812 test_155_small_load
12813 restore_lustre_params < $p
12816 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
12819 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12821 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12823 save_writethrough $p
12826 set_cache writethrough off
12827 test_155_small_load
12828 restore_lustre_params < $p
12831 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
12834 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12836 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12838 save_writethrough $p
12841 set_cache writethrough on
12842 test_155_small_load
12843 restore_lustre_params < $p
12846 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
12849 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12851 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12853 save_writethrough $p
12856 set_cache writethrough off
12857 test_155_small_load
12858 restore_lustre_params < $p
12861 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
12864 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12866 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12868 save_writethrough $p
12871 set_cache writethrough on
12873 restore_lustre_params < $p
12876 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
12879 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12881 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12883 save_writethrough $p
12886 set_cache writethrough off
12888 restore_lustre_params < $p
12891 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
12894 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12896 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12898 save_writethrough $p
12901 set_cache writethrough on
12903 restore_lustre_params < $p
12906 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
12909 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12911 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12913 save_writethrough $p
12916 set_cache writethrough off
12918 restore_lustre_params < $p
12921 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
12924 [ $PARALLEL == "yes" ] && skip "skip parallel run"
12925 remote_ost_nodsh && skip "remote OST with nodsh"
12926 [ $OST1_VERSION -lt $(version_code 2.6.93) ] &&
12927 skip "stats not implemented on old servers"
12928 [ "$ost1_FSTYPE" = "zfs" ] &&
12929 skip "LU-1956/LU-2261: stats not implemented on OSD ZFS"
12934 local file="$DIR/$tfile"
12935 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
12937 save_writethrough $p
12940 log "Turn on read and write cache"
12942 set_cache writethrough on
12944 log "Write data and read it back."
12945 log "Read should be satisfied from the cache."
12946 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12948 cancel_lru_locks osc
12949 cat $file >/dev/null
12951 if ! let "AFTER - BEFORE == CPAGES"; then
12952 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12954 log "cache hits:: before: $BEFORE, after: $AFTER"
12957 log "Read again; it should be satisfied from the cache."
12959 cancel_lru_locks osc
12960 cat $file >/dev/null
12962 if ! let "AFTER - BEFORE == CPAGES"; then
12963 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12965 log "cache hits:: before: $BEFORE, after: $AFTER"
12968 log "Turn off the read cache and turn on the write cache"
12970 set_cache writethrough on
12972 log "Read again; it should be satisfied from the cache."
12974 cancel_lru_locks osc
12975 cat $file >/dev/null
12977 if ! let "AFTER - BEFORE == CPAGES"; then
12978 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
12980 log "cache hits:: before: $BEFORE, after: $AFTER"
12983 log "Read again; it should not be satisfied from the cache."
12985 cancel_lru_locks osc
12986 cat $file >/dev/null
12988 if ! let "AFTER - BEFORE == 0"; then
12989 error "IN CACHE: before: $BEFORE, after: $AFTER"
12991 log "cache hits:: before: $BEFORE, after: $AFTER"
12994 log "Write data and read it back."
12995 log "Read should be satisfied from the cache."
12996 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
12998 cancel_lru_locks osc
12999 cat $file >/dev/null
13001 if ! let "AFTER - BEFORE == CPAGES"; then
13002 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
13004 log "cache hits:: before: $BEFORE, after: $AFTER"
13007 log "Read again; it should not be satisfied from the cache."
13009 cancel_lru_locks osc
13010 cat $file >/dev/null
13012 if ! let "AFTER - BEFORE == 0"; then
13013 error "IN CACHE: before: $BEFORE, after: $AFTER"
13015 log "cache hits:: before: $BEFORE, after: $AFTER"
13018 log "Turn off read and write cache"
13020 set_cache writethrough off
13022 log "Write data and read it back"
13023 log "It should not be satisfied from the cache."
13025 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13026 cancel_lru_locks osc
13028 cat $file >/dev/null
13030 if ! let "AFTER - BEFORE == 0"; then
13031 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
13033 log "cache hits:: before: $BEFORE, after: $AFTER"
13036 log "Turn on the read cache and turn off the write cache"
13038 set_cache writethrough off
13040 log "Write data and read it back"
13041 log "It should not be satisfied from the cache."
13043 dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
13045 cancel_lru_locks osc
13046 cat $file >/dev/null
13048 if ! let "AFTER - BEFORE == 0"; then
13049 error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
13051 log "cache hits:: before: $BEFORE, after: $AFTER"
13054 log "Read again; it should be satisfied from the cache."
13056 cancel_lru_locks osc
13057 cat $file >/dev/null
13059 if ! let "AFTER - BEFORE == CPAGES"; then
13060 error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
13062 log "cache hits:: before: $BEFORE, after: $AFTER"
13065 restore_lustre_params < $p
13068 run_test 156 "Verification of tunables"
13071 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13072 remote_mds_nodsh && skip "remote MDS with nodsh"
13073 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13074 skip "Need MDS version at least 2.2.0"
13076 changelog_register || error "changelog_register failed"
13077 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13078 changelog_users $SINGLEMDS | grep -q $cl_user ||
13079 error "User $cl_user not found in changelog_users"
13082 test_mkdir -p $DIR/$tdir/pics/2008/zachy
13083 changelog_clear 0 || error "changelog_clear failed"
13084 touch $DIR/$tdir/pics/2008/zachy/$tfile # open 1
13085 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg # open 2
13086 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
13087 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
13088 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
13089 rm $DIR/$tdir/pics/desktop.jpg
13091 changelog_dump | tail -10
13093 echo "verifying changelog mask"
13094 changelog_chmask "-MKDIR"
13095 changelog_chmask "-CLOSE"
13097 test_mkdir -p $DIR/$tdir/pics/zach/sofia # not logged
13098 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # not logged
13100 changelog_chmask "+MKDIR"
13101 changelog_chmask "+CLOSE"
13103 test_mkdir -p $DIR/$tdir/pics/2008/sofia # mkdir 1
13104 echo "zzzzzz" > $DIR/$tdir/pics/zach/file # open 3
13106 changelog_dump | tail -10
13107 MKDIRS=$(changelog_dump | grep -c "MKDIR")
13108 CLOSES=$(changelog_dump | grep -c "CLOSE")
13109 [ $MKDIRS -eq 1 ] || error "MKDIR changelog mask count $MKDIRS != 1"
13110 [ $CLOSES -eq 3 ] || error "CLOSE changelog mask count $CLOSES != 3"
13113 echo "verifying target fid"
13114 local fidc=$(changelog_extract_field "CREAT" "$tfile" "t=")
13115 local fidf=$($LFS path2fid $DIR/$tdir/pics/zach/$tfile)
13116 [ "$fidc" == "$fidf" ] ||
13117 error "changelog '$tfile' fid $fidc != file fid $fidf"
13118 echo "verifying parent fid"
13119 # The FID returned from the Changelog may be the directory shard on
13120 # a different MDT, and not the FID returned by path2fid on the parent.
13121 # Instead of comparing FIDs, verify that fid2path(fidp) is correct,
13122 # since this is what will matter when recreating this file in the tree.
13123 local fidp=$(changelog_extract_field "CREAT" "$tfile" "p=")
13124 local pathp=$($LFS fid2path $MOUNT "$fidp")
13125 [ "${pathp%/}" == "$DIR/$tdir/pics/zach" ] ||
13126 error "changelog fid2path($fidc) $pathp != $DIR/$tdir/pics/zach"
13128 echo "getting records for $cl_user"
13129 changelog_users $SINGLEMDS
13130 local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user)
13132 __changelog_clear $SINGLEMDS $cl_user +$nclr ||
13133 error "changelog_clear failed"
13134 local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user)
13135 echo "verifying user clear: $user_rec1 + $nclr == $user_rec2"
13136 [ $user_rec2 == $((user_rec1 + nclr)) ] ||
13137 error "user index expect $user_rec1 + $nclr != $user_rec2"
13139 local min0_rec=$(changelog_users $SINGLEMDS |
13140 awk 'min == "" || $2 < min { min = $2 }; END { print min }')
13141 local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) |
13142 awk '{ print $1; exit; }')
13144 changelog_dump | tail -n 5
13145 echo "verifying user min purge: $min0_rec + 1 == $first_rec"
13146 [ $first_rec == $((min0_rec + 1)) ] ||
13147 error "first index should be $min0_rec + 1 not $first_rec"
13149 # LU-3446 changelog index reset on MDT restart
13150 local cur_rec1=$(changelog_users $SINGLEMDS |
13151 awk '/^current.index:/ { print $NF }')
13152 changelog_clear 0 ||
13153 error "clear all changelog records for $cl_user failed"
13154 stop $SINGLEMDS || error "Fail to stop $SINGLEMDS"
13155 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
13156 error "Fail to start $SINGLEMDS"
13157 local cur_rec2=$(changelog_users $SINGLEMDS |
13158 awk '/^current.index:/ { print $NF }')
13159 echo "verifying index survives MDT restart: $cur_rec1 == $cur_rec2"
13160 [ $cur_rec1 == $cur_rec2 ] ||
13161 error "current index should be $cur_rec1 not $cur_rec2"
13163 echo "verifying users from this test are deregistered"
13164 changelog_deregister || error "changelog_deregister failed"
13165 changelog_users $SINGLEMDS | grep -q $cl_user &&
13166 error "User '$cl_user' still in changelog_users"
13168 # lctl get_param -n mdd.*.changelog_users
13169 # current index: 144
13170 # ID index (idle seconds)
13172 if ! changelog_users $SINGLEMDS | grep "^cl"; then
13173 # this is the normal case where all users were deregistered
13174 # make sure no new records are added when no users are present
13175 local last_rec1=$(changelog_users $SINGLEMDS |
13176 awk '/^current.index:/ { print $NF }')
13177 touch $DIR/$tdir/chloe
13178 local last_rec2=$(changelog_users $SINGLEMDS |
13179 awk '/^current.index:/ { print $NF }')
13180 echo "verify changelogs are off: $last_rec1 == $last_rec2"
13181 [ $last_rec1 == $last_rec2 ] || error "changelogs not off"
13183 # any changelog users must be leftovers from a previous test
13184 changelog_users $SINGLEMDS
13185 echo "other changelog users; can't verify off"
13188 run_test 160a "changelog sanity"
13190 test_160b() { # LU-3587
13191 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13192 remote_mds_nodsh && skip "remote MDS with nodsh"
13193 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] ||
13194 skip "Need MDS version at least 2.2.0"
13196 changelog_register || error "changelog_register failed"
13197 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13198 changelog_users $SINGLEMDS | grep -q $cl_user ||
13199 error "User '$cl_user' not found in changelog_users"
13201 local longname1=$(str_repeat a 255)
13202 local longname2=$(str_repeat b 255)
13205 echo "creating very long named file"
13206 touch $longname1 || error "create of '$longname1' failed"
13207 echo "renaming very long named file"
13208 mv $longname1 $longname2
13210 changelog_dump | grep RENME | tail -n 5
13213 run_test 160b "Verify that very long rename doesn't crash in changelog"
13216 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13217 remote_mds_nodsh && skip "remote MDS with nodsh"
13219 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
13220 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
13221 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
13222 skip "Need MDS version at least 2.5.58 or 2.5.2+"
13226 # Registration step
13227 changelog_register || error "changelog_register failed"
13230 mkdir -p $DIR/$tdir
13231 $MCREATE $DIR/$tdir/foo_160c
13232 changelog_chmask "-TRUNC"
13233 $TRUNCATE $DIR/$tdir/foo_160c 200
13234 changelog_chmask "+TRUNC"
13235 $TRUNCATE $DIR/$tdir/foo_160c 199
13236 changelog_dump | tail -n 5
13237 local truncs=$(changelog_dump | tail -n 5 | grep -c TRUNC)
13238 [ $truncs -eq 1 ] || error "TRUNC changelog mask count $truncs != 1"
13240 run_test 160c "verify that changelog log catch the truncate event"
13243 remote_mds_nodsh && skip "remote MDS with nodsh"
13244 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
13245 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13246 [[ $MDS1_VERSION -ge $(version_code 2.7.60) ]] ||
13247 skip "Need MDS version at least 2.7.60"
13249 # Registration step
13250 changelog_register || error "changelog_register failed"
13252 mkdir -p $DIR/$tdir/migrate_dir
13253 changelog_clear 0 || error "changelog_clear failed"
13255 $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
13256 changelog_dump | tail -n 5
13257 local migrates=$(changelog_dump | grep -c "MIGRT")
13258 [ $migrates -eq 1 ] || error "MIGRATE changelog count $migrates != 1"
13260 run_test 160d "verify that changelog log catch the migrate event"
13263 remote_mds_nodsh && skip "remote MDS with nodsh"
13266 changelog_register || error "changelog_register failed"
13268 # Delete a future user (expect fail)
13269 local MDT0=$(facet_svc $SINGLEMDS)
13270 do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister "cl77"
13273 if [ $rc -eq 0 ]; then
13274 error "Deleted non-existant user cl77"
13275 elif [ $rc -ne 2 ]; then
13276 error "changelog_deregister failed with $rc, expect 2 (ENOENT)"
13279 # Clear to a bad index (1 billion should be safe)
13280 $LFS changelog_clear $MDT0 "${CL_USERS[$SINGLEMDS]%% *}" 1000000000
13283 if [ $rc -eq 0 ]; then
13284 error "Successfully cleared to invalid CL index"
13285 elif [ $rc -ne 22 ]; then
13286 error "changelog_clear failed with $rc, expected 22 (EINVAL)"
13289 run_test 160e "changelog negative testing (should return errors)"
13292 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13293 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13294 skip "Need MDS version at least 2.10.56"
13296 local mdts=$(comma_list $(mdts_nodes))
13299 changelog_register || error "first changelog_register failed"
13300 changelog_register || error "second changelog_register failed"
13302 declare -A cl_user1
13303 declare -A cl_user2
13308 # generate some changelog records to accumulate on each MDT
13309 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13310 log "$(date +%s): creating first files"
13311 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13312 error "create $DIR/$tdir/$tfile failed"
13314 # check changelogs have been generated
13315 local start=$SECONDS
13316 local idle_time=$((MDSCOUNT * 5 + 5))
13317 local nbcl=$(changelog_dump | wc -l)
13318 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13320 for param in "changelog_max_idle_time=$idle_time" \
13322 "changelog_min_gc_interval=2" \
13323 "changelog_min_free_cat_entries=3"; do
13324 local MDT0=$(facet_svc $SINGLEMDS)
13325 local var="${param%=*}"
13326 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13328 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13329 do_nodes $mdts $LCTL set_param mdd.*.$param
13332 # force cl_user2 to be idle (1st part), but also cancel the
13333 # cl_user1 records so that it is not evicted later in the test.
13334 local sleep1=$((idle_time / 2))
13335 echo "$(date +%s): sleep1 $sleep1/${idle_time}s"
13338 # simulate changelog catalog almost full
13339 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13340 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13342 for i in $(seq $MDSCOUNT); do
13343 cl_users=(${CL_USERS[mds$i]})
13344 cl_user1[mds$i]="${cl_users[0]}"
13345 cl_user2[mds$i]="${cl_users[1]}"
13347 [ -n "${cl_user1[mds$i]}" ] ||
13348 error "mds$i: no user registered"
13349 [ -n "${cl_user2[mds$i]}" ] ||
13350 error "mds$i: only ${cl_user2[mds$i]} is registered"
13352 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13353 [ -n "$user_rec1" ] ||
13354 error "mds$i: User ${cl_user1[mds$i]} not registered"
13355 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13356 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13357 [ -n "$user_rec2" ] ||
13358 error "mds$i: User ${cl_user1[mds$i]} not registered"
13359 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13360 "$user_rec1 + 2 == $user_rec2"
13361 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13362 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13363 "$user_rec1 + 2, but is $user_rec2"
13364 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13365 [ -n "$user_rec2" ] ||
13366 error "mds$i: User ${cl_user2[mds$i]} not registered"
13367 [ $user_rec1 == $user_rec2 ] ||
13368 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13369 "$user_rec1, but is $user_rec2"
13372 # force cl_user2 idle (2nd part) to just exceed changelog_max_idle_time
13373 local sleep2=$((idle_time - (SECONDS - start) + 1))
13374 echo "$(date +%s): sleep2 $sleep2/${idle_time}s"
13377 # Generate one more changelog to trigger GC at fail_loc for cl_user2.
13378 # cl_user1 should be OK because it recently processed records.
13379 echo "$(date +%s): creating $((MDSCOUNT * 2)) files"
13380 createmany -m $DIR/$tdir/${tfile}b $((MDSCOUNT * 2)) ||
13381 error "create $DIR/$tdir/${tfile}b failed"
13383 # ensure gc thread is done
13384 for i in $(mdts_nodes); do
13386 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13387 error "$i: GC-thread not done"
13391 for i in $(seq $MDSCOUNT); do
13392 # check cl_user1 still registered
13393 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13394 error "mds$i: User ${cl_user1[mds$i]} not registered"
13395 # check cl_user2 unregistered
13396 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13397 error "mds$i: User ${cl_user2[mds$i]} still registered"
13399 # check changelogs are present and starting at $user_rec1 + 1
13400 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13401 [ -n "$user_rec1" ] ||
13402 error "mds$i: User ${cl_user1[mds$i]} not registered"
13403 first_rec=$($LFS changelog $(facet_svc mds$i) |
13404 awk '{ print $1; exit; }')
13406 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13407 [ $((user_rec1 + 1)) == $first_rec ] ||
13408 error "mds$i: first index should be $user_rec1 + 1, " \
13409 "but is $first_rec"
13412 run_test 160f "changelog garbage collect (timestamped users)"
13415 remote_mds_nodsh && skip "remote MDS with nodsh"
13416 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13417 skip "Need MDS version at least 2.10.56"
13419 local mdts=$(comma_list $(mdts_nodes))
13421 #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
13422 do_nodes $mdts $LCTL set_param fail_loc=0x1314
13425 changelog_register || error "first changelog_register failed"
13426 changelog_register || error "second changelog_register failed"
13428 declare -A cl_user1
13429 declare -A cl_user2
13434 # generate some changelog records to accumulate on each MDT
13435 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13436 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13437 error "create $DIR/$tdir/$tfile failed"
13439 # check changelogs have been generated
13440 local nbcl=$(changelog_dump | wc -l)
13441 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13443 # reduce the max_idle_indexes value to make sure we exceed it
13444 max_ndx=$((nbcl / 2 - 1))
13446 for param in "changelog_max_idle_indexes=$max_ndx" \
13448 "changelog_min_gc_interval=2" \
13449 "changelog_min_free_cat_entries=3"; do
13450 local MDT0=$(facet_svc $SINGLEMDS)
13451 local var="${param%=*}"
13452 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13454 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13455 do_nodes $mdts $LCTL set_param mdd.*.$param ||
13456 error "unable to set mdd.*.$param"
13459 # simulate changelog catalog almost full
13460 #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
13461 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3
13463 for i in $(seq $MDSCOUNT); do
13464 cl_users=(${CL_USERS[mds$i]})
13465 cl_user1[mds$i]="${cl_users[0]}"
13466 cl_user2[mds$i]="${cl_users[1]}"
13468 [ -n "${cl_user1[mds$i]}" ] ||
13469 error "mds$i: no user registered"
13470 [ -n "${cl_user2[mds$i]}" ] ||
13471 error "mds$i: only ${cl_user1[mds$i]} is registered"
13473 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13474 [ -n "$user_rec1" ] ||
13475 error "mds$i: User ${cl_user1[mds$i]} not registered"
13476 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13477 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13478 [ -n "$user_rec2" ] ||
13479 error "mds$i: User ${cl_user1[mds$i]} not registered"
13480 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13481 "$user_rec1 + 2 == $user_rec2"
13482 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13483 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13484 "$user_rec1 + 2, but is $user_rec2"
13485 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13486 [ -n "$user_rec2" ] ||
13487 error "mds$i: User ${cl_user2[mds$i]} not registered"
13488 [ $user_rec1 == $user_rec2 ] ||
13489 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13490 "$user_rec1, but is $user_rec2"
13493 # ensure we are past the previous changelog_min_gc_interval set above
13496 # generate one more changelog to trigger fail_loc
13497 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13498 error "create $DIR/$tdir/${tfile}bis failed"
13500 # ensure gc thread is done
13501 for i in $(mdts_nodes); do
13503 "ps -e -o comm= | grep chlg_gc_thread" "" 20 ||
13504 error "$i: GC-thread not done"
13508 for i in $(seq $MDSCOUNT); do
13509 # check cl_user1 still registered
13510 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13511 error "mds$i: User ${cl_user1[mds$i]} not registered"
13512 # check cl_user2 unregistered
13513 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13514 error "mds$i: User ${cl_user2[mds$i]} still registered"
13516 # check changelogs are present and starting at $user_rec1 + 1
13517 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13518 [ -n "$user_rec1" ] ||
13519 error "mds$i: User ${cl_user1[mds$i]} not registered"
13520 first_rec=$($LFS changelog $(facet_svc mds$i) |
13521 awk '{ print $1; exit; }')
13523 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13524 [ $((user_rec1 + 1)) == $first_rec ] ||
13525 error "mds$i: first index should be $user_rec1 + 1, " \
13526 "but is $first_rec"
13529 run_test 160g "changelog garbage collect (old users)"
13532 remote_mds_nodsh && skip "remote MDS with nodsh" && return
13533 [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
13534 skip "Need MDS version at least 2.10.56"
13536 local mdts=$(comma_list $(mdts_nodes))
13539 changelog_register || error "first changelog_register failed"
13540 changelog_register || error "second changelog_register failed"
13542 declare -A cl_user1
13543 declare -A cl_user2
13548 # generate some changelog records to accumulate on each MDT
13549 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
13550 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13551 error "create $DIR/$tdir/$tfile failed"
13553 # check changelogs have been generated
13554 local nbcl=$(changelog_dump | wc -l)
13555 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13557 for param in "changelog_max_idle_time=10" \
13559 "changelog_min_gc_interval=2"; do
13560 local MDT0=$(facet_svc $SINGLEMDS)
13561 local var="${param%=*}"
13562 local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
13564 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
13565 do_nodes $mdts $LCTL set_param mdd.*.$param
13568 # force cl_user2 to be idle (1st part)
13571 for i in $(seq $MDSCOUNT); do
13572 cl_users=(${CL_USERS[mds$i]})
13573 cl_user1[mds$i]="${cl_users[0]}"
13574 cl_user2[mds$i]="${cl_users[1]}"
13576 [ -n "${cl_user1[mds$i]}" ] ||
13577 error "mds$i: no user registered"
13578 [ -n "${cl_user2[mds$i]}" ] ||
13579 error "mds$i: only ${cl_user2[mds$i]} is registered"
13581 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13582 [ -n "$user_rec1" ] ||
13583 error "mds$i: User ${cl_user1[mds$i]} not registered"
13584 __changelog_clear mds$i ${cl_user1[mds$i]} +2
13585 user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13586 [ -n "$user_rec2" ] ||
13587 error "mds$i: User ${cl_user1[mds$i]} not registered"
13588 echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
13589 "$user_rec1 + 2 == $user_rec2"
13590 [ $((user_rec1 + 2)) == $user_rec2 ] ||
13591 error "mds$i: user ${cl_user1[mds$i]} index expected " \
13592 "$user_rec1 + 2, but is $user_rec2"
13593 user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
13594 [ -n "$user_rec2" ] ||
13595 error "mds$i: User ${cl_user2[mds$i]} not registered"
13596 [ $user_rec1 == $user_rec2 ] ||
13597 error "mds$i: user ${cl_user2[mds$i]} index expected " \
13598 "$user_rec1, but is $user_rec2"
13601 # force cl_user2 to be idle (2nd part) and to reach
13602 # changelog_max_idle_time
13605 # force each GC-thread start and block then
13606 # one per MDT/MDD, set fail_val accordingly
13607 #define OBD_FAIL_FORCE_GC_THREAD 0x1316
13608 do_nodes $mdts $LCTL set_param fail_loc=0x1316
13610 # generate more changelogs to trigger fail_loc
13611 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13612 error "create $DIR/$tdir/${tfile}bis failed"
13614 # stop MDT to stop GC-thread, should be done in back-ground as it will
13615 # block waiting for the thread to be released and exit
13616 declare -A stop_pids
13617 for i in $(seq $MDSCOUNT); do
13619 stop_pids[mds$i]=$!
13622 for i in $(mdts_nodes); do
13625 local facets=$(facets_up_on_host $i)
13627 for facet in ${facets//,/ }; do
13628 if [[ $facet == mds* ]]; then
13632 # ensure each MDS's gc threads are still present and all in "R"
13633 # state (OBD_FAIL_FORCE_GC_THREAD effect!)
13634 [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] ||
13635 error "$i: expected $nb GC-thread"
13637 "ps -C chlg_gc_thread -o state --no-headers | uniq" \
13639 error "$i: GC-thread not found in R-state"
13640 # check umounts of each MDT on MDS have reached kthread_stop()
13641 [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] ||
13642 error "$i: expected $nb umount"
13644 "ps -C umount -o state --no-headers | uniq" "D" 20 ||
13645 error "$i: umount not found in D-state"
13648 # release all GC-threads
13649 do_nodes $mdts $LCTL set_param fail_loc=0
13651 # wait for MDT stop to complete
13652 for i in $(seq $MDSCOUNT); do
13653 wait ${stop_pids[mds$i]} || error "mds$i: stop failed"
13657 # may try to check if any orphan changelog records are present
13658 # via ldiskfs/zfs and llog_reader...
13660 # re-start/mount MDTs
13661 for i in $(seq $MDSCOUNT); do
13662 start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS ||
13663 error "Fail to start mds$i"
13667 for i in $(seq $MDSCOUNT); do
13668 # check cl_user1 still registered
13669 changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
13670 error "mds$i: User ${cl_user1[mds$i]} not registered"
13671 # check cl_user2 unregistered
13672 changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
13673 error "mds$i: User ${cl_user2[mds$i]} still registered"
13675 # check changelogs are present and starting at $user_rec1 + 1
13676 user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
13677 [ -n "$user_rec1" ] ||
13678 error "mds$i: User ${cl_user1[mds$i]} not registered"
13679 first_rec=$($LFS changelog $(facet_svc mds$i) |
13680 awk '{ print $1; exit; }')
13682 echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec"
13683 [ $((user_rec1 + 1)) == $first_rec ] ||
13684 error "mds$i: first index should be $user_rec1 + 1, " \
13685 "but is $first_rec"
13688 run_test 160h "changelog gc thread stop upon umount, orphan records delete " \
13693 local mdts=$(comma_list $(mdts_nodes))
13695 changelog_register || error "first changelog_register failed"
13697 # generate some changelog records to accumulate on each MDT
13698 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13699 createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
13700 error "create $DIR/$tdir/$tfile failed"
13702 # check changelogs have been generated
13703 local nbcl=$(changelog_dump | wc -l)
13704 [[ $nbcl -eq 0 ]] && error "no changelogs found"
13706 # simulate race between register and unregister
13707 # XXX as fail_loc is set per-MDS, with DNE configs the race
13708 # simulation will only occur for one MDT per MDS and for the
13709 # others the normal race scenario will take place
13710 #define CFS_FAIL_CHLOG_USER_REG_UNREG_RACE 0x1315
13711 do_nodes $mdts $LCTL set_param fail_loc=0x10001315
13712 do_nodes $mdts $LCTL set_param fail_val=1
13714 # unregister 1st user
13715 changelog_deregister &
13717 # wait some time for deregister work to reach race rdv
13719 # register 2nd user
13720 changelog_register || error "2nd user register failed"
13722 wait $pid1 || error "1st user deregister failed"
13726 declare -A LAST_REC
13727 for i in $(seq $MDSCOUNT); do
13728 if changelog_users mds$i | grep "^cl"; then
13729 # make sure new records are added with one user present
13730 LAST_REC[mds$i]=$(changelog_users $SINGLEMDS |
13731 awk '/^current.index:/ { print $NF }')
13733 error "mds$i has no user registered"
13737 # generate more changelog records to accumulate on each MDT
13738 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13739 error "create $DIR/$tdir/${tfile}bis failed"
13741 for i in $(seq $MDSCOUNT); do
13742 last_rec=$(changelog_users $SINGLEMDS |
13743 awk '/^current.index:/ { print $NF }')
13744 echo "verify changelogs are on: $last_rec != ${LAST_REC[mds$i]}"
13745 [ $last_rec != ${LAST_REC[mds$i]} ] ||
13746 error "changelogs are off on mds$i"
13749 run_test 160i "changelog user register/unregister race"
13752 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13753 remote_mds_nodsh && skip "remote MDS with nodsh"
13755 mkdir -p $DIR/$tdir/1/1
13757 changelog_register || error "changelog_register failed"
13758 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13760 changelog_users $SINGLEMDS | grep -q $cl_user ||
13761 error "User '$cl_user' not found in changelog_users"
13762 #define OBD_FAIL_MDS_CHANGELOG_REORDER 0x15d
13763 do_facet mds1 $LCTL set_param fail_loc=0x8000015d fail_val=3
13764 rmdir $DIR/$tdir/1/1 & sleep 1
13766 touch $DIR/$tdir/2/2
13767 rm -rf $DIR/$tdir/2
13772 changelog_dump | grep rmdir || error "rmdir not recorded"
13775 changelog_deregister
13777 run_test 160k "Verify that changelog records are not lost"
13780 remote_mds_nodsh && skip "remote MDS with nodsh"
13781 [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] &&
13782 skip "Need MDS version at least 2.12.56"
13784 mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
13786 changelog_register || error "first changelog_register failed"
13788 # generate some changelog
13789 test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
13790 createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
13791 error "create $DIR/$tdir/${tfile}bis failed"
13793 # open the changelog device
13794 exec 3>/dev/changelog-$FSNAME-MDT0000
13795 exec 4</dev/changelog-$FSNAME-MDT0000
13797 # umount the first lustre mount
13801 cat <&4 >/dev/null || error "read changelog failed"
13804 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
13805 changelog_users $SINGLEMDS | grep -q $cl_user ||
13806 error "User $cl_user not found in changelog_users"
13808 printf 'clear:'$cl_user':0' >&3
13815 changelog_deregister || error "changelog_deregister failed"
13818 mount_client $MOUNT || error "mount_client on $MOUNT failed"
13820 run_test 160j "client can be umounted while its chanangelog is being used"
13823 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13825 test_mkdir -c1 $DIR/$tdir
13826 cp /etc/hosts $DIR/$tdir/$tfile
13827 test_mkdir -c1 $DIR/$tdir/foo1
13828 test_mkdir -c1 $DIR/$tdir/foo2
13829 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
13830 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
13831 ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
13832 ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
13833 local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
13834 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13835 $LFS fid2path $DIR $FID
13836 error "bad link ea"
13839 rm $DIR/$tdir/foo2/zachary
13841 rm $DIR/$tdir/foo2/thor
13843 rm $DIR/$tdir/$tfile
13845 mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
13846 [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
13847 { $LFS fid2path $DIR $FID; error "bad link rename"; }
13848 rm $DIR/$tdir/foo2/maggie
13851 local longname=$tfile.avg_len_is_thirty_two_
13852 stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
13853 error_noexit 'failed to unlink many hardlinks'" EXIT
13854 createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
13855 error "failed to hardlink many files"
13856 links=$($LFS fid2path $DIR $FID | wc -l)
13857 echo -n "${links}/1000 links in link EA"
13858 [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
13860 run_test 161a "link ea sanity"
13863 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13864 [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
13867 local remote_dir=$DIR/$tdir/remote_dir
13869 mkdir -p $DIR/$tdir
13870 $LFS mkdir -i $MDTIDX $remote_dir ||
13871 error "create remote directory failed"
13873 cp /etc/hosts $remote_dir/$tfile
13874 mkdir -p $remote_dir/foo1
13875 mkdir -p $remote_dir/foo2
13876 ln $remote_dir/$tfile $remote_dir/foo1/sofia
13877 ln $remote_dir/$tfile $remote_dir/foo2/zachary
13878 ln $remote_dir/$tfile $remote_dir/foo1/luna
13879 ln $remote_dir/$tfile $remote_dir/foo2/thor
13881 local FID=$($LFS path2fid $remote_dir/$tfile | tr -d '[' |
13883 if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
13884 $LFS fid2path $DIR $FID
13885 error "bad link ea"
13888 rm $remote_dir/foo2/zachary
13890 rm $remote_dir/foo2/thor
13892 rm $remote_dir/$tfile
13894 mv $remote_dir/foo1/sofia $remote_dir/foo2/maggie
13895 local link_path=$($LFS fid2path $FSNAME --link 1 $FID)
13896 if [ "$DIR/$link_path" != "$remote_dir/foo2/maggie" ]; then
13897 $LFS fid2path $DIR $FID
13898 error "bad link rename"
13900 rm $remote_dir/foo2/maggie
13903 local longname=filename_avg_len_is_thirty_two_
13904 createmany -l$remote_dir/foo1/luna $remote_dir/foo2/$longname 1000 ||
13905 error "failed to hardlink many files"
13906 links=$($LFS fid2path $DIR $FID | wc -l)
13907 echo -n "${links}/1000 links in link EA"
13908 [[ ${links} -gt 60 ]] ||
13909 error "expected at least 60 links in link EA"
13910 unlinkmany $remote_dir/foo2/$longname 1000 ||
13911 error "failed to unlink many hardlinks"
13913 run_test 161b "link ea sanity under remote directory"
13916 remote_mds_nodsh && skip "remote MDS with nodsh"
13917 [ $PARALLEL == "yes" ] && skip "skip parallel run"
13918 [[ $MDS1_VERSION -lt $(version_code 2.1.5) ]] &&
13919 skip "Need MDS version at least 2.1.5"
13921 # define CLF_RENAME_LAST 0x0001
13922 # rename overwrite a target having nlink = 1 (changelog flag 0x1)
13923 changelog_register || error "changelog_register failed"
13926 test_mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir
13927 touch $DIR/$tdir/foo_161c
13928 touch $DIR/$tdir/bar_161c
13929 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13930 changelog_dump | grep RENME | tail -n 5
13931 local flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13932 changelog_clear 0 || error "changelog_clear failed"
13933 if [ x$flags != "x0x1" ]; then
13934 error "flag $flags is not 0x1"
13937 echo "rename overwrite target with nlink = 1, changelog flags=$flags"
13938 # rename overwrite a target having nlink > 1 (changelog flag 0x0)
13939 touch $DIR/$tdir/foo_161c
13940 touch $DIR/$tdir/bar_161c
13941 ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13942 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
13943 changelog_dump | grep RENME | tail -n 5
13944 flags=$(changelog_dump | grep "RENME.*bar_161c" | cut -f5 -d' ')
13945 changelog_clear 0 || error "changelog_clear failed"
13946 if [ x$flags != "x0x0" ]; then
13947 error "flag $flags is not 0x0"
13949 echo "rename overwrite a target having nlink > 1," \
13950 "changelog record has flags of $flags"
13952 # rename doesn't overwrite a target (changelog flag 0x0)
13953 touch $DIR/$tdir/foo_161c
13954 mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
13955 changelog_dump | grep RENME | tail -n 5
13956 flags=$(changelog_dump | grep RENME | tail -1 | cut -f5 -d' ')
13957 changelog_clear 0 || error "changelog_clear failed"
13958 if [ x$flags != "x0x0" ]; then
13959 error "flag $flags is not 0x0"
13961 echo "rename doesn't overwrite a target," \
13962 "changelog record has flags of $flags"
13964 # define CLF_UNLINK_LAST 0x0001
13965 # unlink a file having nlink = 1 (changelog flag 0x1)
13966 rm -f $DIR/$tdir/foo2_161c
13967 changelog_dump | grep UNLNK | tail -n 5
13968 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13969 changelog_clear 0 || error "changelog_clear failed"
13970 if [ x$flags != "x0x1" ]; then
13971 error "flag $flags is not 0x1"
13973 echo "unlink a file having nlink = 1," \
13974 "changelog record has flags of $flags"
13976 # unlink a file having nlink > 1 (changelog flag 0x0)
13977 ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
13978 rm -f $DIR/$tdir/foobar_161c
13979 changelog_dump | grep UNLNK | tail -n 5
13980 flags=$(changelog_dump | grep UNLNK | tail -1 | cut -f5 -d' ')
13981 changelog_clear 0 || error "changelog_clear failed"
13982 if [ x$flags != "x0x0" ]; then
13983 error "flag $flags is not 0x0"
13985 echo "unlink a file having nlink > 1, changelog record flags '$flags'"
13987 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
13990 remote_mds_nodsh && skip "remote MDS with nodsh"
13995 changelog_register || error "changelog_register failed"
13997 # work in a standalone dir to avoid locking on $DIR/$MOUNT to
13998 # interfer with $MOUNT/.lustre/fid/ access
14000 [[ $? -eq 0 ]] || error "mkdir failed"
14002 #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
14003 $LCTL set_param fail_loc=0x8000140c
14005 $LCTL set_param fail_val=5
14008 echo foofoo > $DIR/$tdir/$tfile &
14011 # wait for create to be delayed
14015 [[ $? -eq 0 ]] || error "create should be blocked"
14017 local tempfile=$(mktemp)
14018 fid=$(changelog_extract_field "CREAT" "$tfile" "t=")
14019 cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
14020 # some delay may occur during ChangeLog publishing and file read just
14021 # above, that could allow file write to happen finally
14022 [[ -s $tempfile ]] && echo "file should be empty"
14024 $LCTL set_param fail_loc=0
14027 [[ $? -eq 0 ]] || error "create failed"
14029 run_test 161d "create with concurrent .lustre/fid access"
14032 local expected="$1"
14037 path=$($LFS fid2path "$@")
14040 if [ $rc -ne 0 ]; then
14041 error "path looked up of '$expected' failed: rc=$rc"
14042 elif [ "$path" != "$expected" ]; then
14043 error "path looked up '$path' instead of '$expected'"
14045 echo "FID '$fid' resolves to path '$path' as expected"
14049 test_162a() { # was test_162
14050 test_mkdir -p -c1 $DIR/$tdir/d2
14051 touch $DIR/$tdir/d2/$tfile
14052 touch $DIR/$tdir/d2/x1
14053 touch $DIR/$tdir/d2/x2
14054 test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
14055 test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
14057 local fid=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
14058 check_path "$tdir/d2/$tfile" $FSNAME "$fid" --link 0
14061 ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
14062 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
14063 check_path "$tdir/d2/p/q/r/slink" $FSNAME "$fid" --link 0
14065 # softlink to wrong file
14066 ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
14067 fid=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
14068 check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME "$fid" --link 0
14071 ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
14072 mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
14073 fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
14074 # fid2path dir/fsname should both work
14075 check_path "$tdir/d2/a/b/c/new_file" $FSNAME "$fid" --link 1
14076 check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR "$fid" --link 0
14078 # hardlink count: check that there are 2 links
14079 local nlinks=$($LFS fid2path $DIR "$fid" | wc -l)
14080 [ $nlinks -eq 2 ] || error "expect 2 links, found $nlinks"
14082 # hardlink indexing: remove the first link
14083 rm $DIR/$tdir/d2/p/q/r/hlink
14084 check_path "$tdir/d2/a/b/c/new_file" $FSNAME $fid --link 0
14086 run_test 162a "path lookup sanity"
14089 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14090 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
14093 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
14094 error "create striped dir failed"
14096 local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
14097 tail -n 1 | awk '{print $2}')
14098 stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
14100 touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
14101 mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
14104 for ((i=0;i<5;i++)); do
14105 FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
14106 error "get fid for f$i failed"
14107 check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
14109 FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
14110 error "get fid for d$i failed"
14111 check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
14116 run_test 162b "striped directory path lookup sanity"
14118 # LU-4239: Verify fid2path works with paths 100 or more directories deep
14120 [[ $MDS1_VERSION -lt $(version_code 2.7.51) ]] &&
14121 skip "Need MDS version at least 2.7.51"
14123 local lpath=$tdir.local
14124 local rpath=$tdir.remote
14126 test_mkdir $DIR/$lpath
14127 test_mkdir $DIR/$rpath
14129 for ((i = 0; i <= 101; i++)); do
14132 FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') ||
14133 error "get fid for local directory $DIR/$lpath failed"
14134 check_path "$DIR/$lpath" $MOUNT $FID --link 0
14137 test_mkdir $DIR/$rpath
14138 FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') ||
14139 error "get fid for remote directory $DIR/$rpath failed"
14140 check_path "$DIR/$rpath" $MOUNT $FID --link 0
14145 run_test 162c "fid2path works with paths 100 or more directories deep"
14148 # do directio so as not to populate the page cache
14149 log "creating a 10 Mb file"
14150 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
14151 log "starting reads"
14152 dd if=$DIR/$tfile of=/dev/null bs=4096 &
14153 log "truncating the file"
14154 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
14156 kill %+ || true # reads might have finished
14157 echo "wait until dd is finished"
14159 log "removing the temporary file"
14160 rm -rf $DIR/$tfile || error "tmp file removal failed"
14162 run_test 169 "parallel read and truncate should not deadlock"
14165 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14167 $LCTL clear # bug 18514
14168 $LCTL debug_daemon start $TMP/${tfile}_log_good
14170 $LCTL debug_daemon stop
14171 sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
14172 error "sed failed to read log_good"
14174 $LCTL debug_daemon start $TMP/${tfile}_log_good
14176 $LCTL debug_daemon stop
14178 $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
14179 error "lctl df log_bad failed"
14181 local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14182 local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14184 $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
14185 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
14187 [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
14188 error "bad_line good_line1 good_line2 are empty"
14190 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14191 cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
14192 cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
14194 $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
14195 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
14196 local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
14198 [ "$bad_line_new" ] && [ "$good_line_new" ] ||
14199 error "bad_line_new good_line_new are empty"
14201 local expected_good=$((good_line1 + good_line2*2))
14203 rm -f $TMP/${tfile}*
14204 # LU-231, short malformed line may not be counted into bad lines
14205 if [ $bad_line -ne $bad_line_new ] &&
14206 [ $bad_line -ne $((bad_line_new - 1)) ]; then
14207 error "expected $bad_line bad lines, but got $bad_line_new"
14211 if [ $expected_good -ne $good_line_new ]; then
14212 error "expected $expected_good good lines, but got $good_line_new"
14217 run_test 170 "test lctl df to handle corrupted log ====================="
14219 test_171() { # bug20592
14220 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14222 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
14223 $LCTL set_param fail_loc=0x50e
14224 $LCTL set_param fail_val=3000
14225 multiop_bg_pause $DIR/$tfile O_s || true
14227 kill -USR1 $MULTIPID
14231 if dmesg | grep "recursive fault"; then
14232 error "caught a recursive fault"
14234 $LCTL set_param fail_loc=0
14237 run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
14239 # it would be good to share it with obdfilter-survey/iokit-libecho code
14240 setup_obdecho_osc () {
14243 local obdfilter_name=$2
14244 echo "Creating new osc for $obdfilter_name on $ost_nid"
14245 # make sure we can find loopback nid
14246 $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
14248 [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
14249 ${obdfilter_name}_osc_UUID || rc=2; }
14250 [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
14251 ${obdfilter_name}_UUID $ost_nid || rc=3; }
14255 cleanup_obdecho_osc () {
14256 local obdfilter_name=$1
14257 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null
14258 $LCTL --device ${obdfilter_name}_osc detach >/dev/null
14265 local pages=${3:-64}
14270 local obd_size=$(get_obd_size $node $OBD)
14271 local page_size=$(get_page_size $node)
14272 if [[ -n "$obd_size" ]]; then
14273 local new_count=$((obd_size / (pages * page_size / 1024)))
14274 [[ $new_count -ge $count ]] || count=$new_count
14277 do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
14278 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
14280 if [ $rc -eq 0 ]; then
14281 id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}')
14282 [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3
14284 echo "New object id is $id"
14285 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
14287 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
14288 "test_brw $count w v $pages $id" || rc=4; }
14289 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
14291 [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
14292 "cleanup" || rc=5; }
14293 [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \
14294 "detach" || rc=6; }
14295 [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc"
14300 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14302 if ! module_loaded obdecho; then
14303 load_module obdecho/obdecho &&
14304 stack_trap "rmmod obdecho" EXIT ||
14305 error "unable to load obdecho on client"
14308 local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
14309 local host=$($LCTL get_param -n osc.$osc.import |
14310 awk '/current_connection:/ { print $2 }' )
14311 local target=$($LCTL get_param -n osc.$osc.import |
14312 awk '/target:/ { print $2 }' )
14313 target=${target%_UUID}
14315 if [ -n "$target" ]; then
14316 setup_obdecho_osc $host $target &&
14317 stack_trap "cleanup_obdecho_osc $target" EXIT ||
14318 { error "obdecho setup failed with $?"; return; }
14320 obdecho_test ${target}_osc client ||
14321 error "obdecho_test failed on ${target}_osc"
14323 $LCTL get_param osc.$osc.import
14324 error "there is no osc.$osc.import target"
14327 run_test 180a "test obdecho on osc"
14330 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14331 remote_ost_nodsh && skip "remote OST with nodsh"
14333 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14334 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14335 error "failed to load module obdecho"
14337 local target=$(do_facet ost1 $LCTL dl |
14338 awk '/obdfilter/ { print $4; exit; }')
14340 if [ -n "$target" ]; then
14341 obdecho_test $target ost1 || error "obdecho_test failed with $?"
14343 do_facet ost1 $LCTL dl
14344 error "there is no obdfilter target on ost1"
14347 run_test 180b "test obdecho directly on obdfilter"
14349 test_180c() { # LU-2598
14350 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14351 remote_ost_nodsh && skip "remote OST with nodsh"
14352 [[ $MDS1_VERSION -lt $(version_code 2.4.0) ]] &&
14353 skip "Need MDS version at least 2.4.0"
14355 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
14356 stack_trap "do_facet ost1 rmmod obdecho" EXIT ||
14357 error "failed to load module obdecho"
14359 local target=$(do_facet ost1 $LCTL dl |
14360 awk '/obdfilter/ { print $4; exit; }')
14362 if [ -n "$target" ]; then
14363 local pages=16384 # 64MB bulk I/O RPC size
14365 obdecho_test "$target" ost1 "$pages" ||
14366 error "obdecho_test with pages=$pages failed with $?"
14368 do_facet ost1 $LCTL dl
14369 error "there is no obdfilter target on ost1"
14372 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
14374 test_181() { # bug 22177
14375 test_mkdir $DIR/$tdir
14376 # create enough files to index the directory
14377 createmany -o $DIR/$tdir/foobar 4000
14378 # print attributes for debug purpose
14381 multiop_bg_pause $DIR/$tdir D_Sc || return 1
14383 # remove the files & current working dir
14384 unlinkmany $DIR/$tdir/foobar 4000
14386 kill -USR1 $MULTIPID
14388 stat $DIR/$tdir && error "open-unlinked dir was not removed!"
14391 run_test 181 "Test open-unlinked dir ========================"
14397 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14399 $LCTL set_param mdc.*.rpc_stats=clear
14401 for (( i = 0; i < $tcount; i++ )) ; do
14402 mkdir $DIR/$tdir/$i
14405 for (( i = 0; i < $tcount; i++ )) ; do
14406 createmany -o $DIR/$tdir/$i/f- $fcount &
14410 for (( i = 0; i < $tcount; i++ )) ; do
14411 unlinkmany $DIR/$tdir/$i/f- $fcount &
14415 $LCTL get_param mdc.*.rpc_stats
14419 run_test 182 "Test parallel modify metadata operations ================"
14421 test_183() { # LU-2275
14422 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14423 remote_mds_nodsh && skip "remote MDS with nodsh"
14424 [[ $MDS1_VERSION -lt $(version_code 2.3.56) ]] &&
14425 skip "Need MDS version at least 2.3.56"
14427 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14428 echo aaa > $DIR/$tdir/$tfile
14430 #define OBD_FAIL_MDS_NEGATIVE_POSITIVE 0x148
14431 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x148
14433 ls -l $DIR/$tdir && error "ls succeeded, should have failed"
14434 cat $DIR/$tdir/$tfile && error "cat succeeded, should have failed"
14436 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
14438 # Flush negative dentry cache
14439 touch $DIR/$tdir/$tfile
14441 # We are not checking for any leaked references here, they'll
14442 # become evident next time we do cleanup with module unload.
14445 run_test 183 "No crash or request leak in case of strange dispositions ========"
14447 # test suite 184 is for LU-2016, LU-2017
14449 check_swap_layouts_support
14451 dir0=$DIR/$tdir/$testnum
14452 test_mkdir -p -c1 $dir0
14457 $SETSTRIPE -c1 $file1
14459 $SETSTRIPE -c2 $file2
14461 gen1=$($GETSTRIPE -g $file1)
14462 gen2=$($GETSTRIPE -g $file2)
14464 $LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
14465 gen=$($GETSTRIPE -g $file1)
14466 [[ $gen1 != $gen ]] ||
14467 "Layout generation on $file1 does not change"
14468 gen=$($GETSTRIPE -g $file2)
14469 [[ $gen2 != $gen ]] ||
14470 "Layout generation on $file2 does not change"
14472 cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
14473 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
14475 lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred"
14477 run_test 184a "Basic layout swap"
14480 check_swap_layouts_support
14482 dir0=$DIR/$tdir/$testnum
14483 mkdir -p $dir0 || error "creating dir $dir0"
14490 $SETSTRIPE -c1 $file1
14491 $SETSTRIPE -c2 $file2
14492 $SETSTRIPE -c1 $file3
14493 chown $RUNAS_ID $file3
14494 gen1=$($GETSTRIPE -g $file1)
14495 gen2=$($GETSTRIPE -g $file2)
14497 $LFS swap_layouts $dir1 $dir2 &&
14498 error "swap of directories layouts should fail"
14499 $LFS swap_layouts $dir1 $file1 &&
14500 error "swap of directory and file layouts should fail"
14501 $RUNAS $LFS swap_layouts $file1 $file2 &&
14502 error "swap of file we cannot write should fail"
14503 $LFS swap_layouts $file1 $file3 &&
14504 error "swap of file with different owner should fail"
14505 /bin/true # to clear error code
14507 run_test 184b "Forbidden layout swap (will generate errors)"
14510 local cmpn_arg=$(cmp -n 2>&1 | grep "invalid option")
14511 [ -n "$cmpn_arg" ] && skip_env "cmp does not support -n"
14512 check_swap_layouts_support
14514 local dir0=$DIR/$tdir/$testnum
14515 mkdir -p $dir0 || error "creating dir $dir0"
14517 local ref1=$dir0/ref1
14518 local ref2=$dir0/ref2
14519 local file1=$dir0/file1
14520 local file2=$dir0/file2
14521 # create a file large enough for the concurrent test
14522 dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
14523 dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
14524 echo "ref file size: ref1($(stat -c %s $ref1))," \
14525 "ref2($(stat -c %s $ref2))"
14528 dd if=$ref1 of=$file1 bs=16k &
14531 # Make sure dd starts to copy file
14532 while [ ! -f $file1 ]; do sleep 0.1; done
14534 $LFS swap_layouts $file1 $file2
14537 [[ $? == 0 ]] || error "concurrent write on $file1 failed"
14538 [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
14540 # how many bytes copied before swapping layout
14541 local copied=$(stat -c %s $file2)
14542 local remaining=$(stat -c %s $ref1)
14543 remaining=$((remaining - copied))
14544 echo "Copied $copied bytes before swapping layout..."
14546 cmp -n $copied $file1 $ref2 | grep differ &&
14547 error "Content mismatch [0, $copied) of ref2 and file1"
14548 cmp -n $copied $file2 $ref1 ||
14549 error "Content mismatch [0, $copied) of ref1 and file2"
14550 cmp -i $copied:$copied -n $remaining $file1 $ref1 ||
14551 error "Content mismatch [$copied, EOF) of ref1 and file1"
14554 rm -f $ref1 $ref2 $file1 $file2
14556 run_test 184c "Concurrent write and layout swap"
14559 check_swap_layouts_support
14560 [ -z "$(which getfattr 2>/dev/null)" ] &&
14561 skip_env "no getfattr command"
14563 local file1=$DIR/$tdir/$tfile-1
14564 local file2=$DIR/$tdir/$tfile-2
14565 local file3=$DIR/$tdir/$tfile-3
14569 mkdir -p $DIR/$tdir
14570 touch $file1 || error "create $file1 failed"
14571 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14572 error "create $file2 failed"
14573 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14574 error "create $file3 failed"
14575 lovea1=$(get_layout_param $file1)
14577 $LFS swap_layouts $file2 $file3 ||
14578 error "swap $file2 $file3 layouts failed"
14579 $LFS swap_layouts $file1 $file2 ||
14580 error "swap $file1 $file2 layouts failed"
14582 lovea2=$(get_layout_param $file2)
14585 [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
14587 lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14588 [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
14590 run_test 184d "allow stripeless layouts swap"
14593 [[ $MDS1_VERSION -ge $(version_code 2.6.94) ]] ||
14594 skip "Need MDS version at least 2.6.94"
14595 check_swap_layouts_support
14596 [ -z "$(which getfattr 2>/dev/null)" ] &&
14597 skip_env "no getfattr command"
14599 local file1=$DIR/$tdir/$tfile-1
14600 local file2=$DIR/$tdir/$tfile-2
14601 local file3=$DIR/$tdir/$tfile-3
14604 mkdir -p $DIR/$tdir
14605 touch $file1 || error "create $file1 failed"
14606 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
14607 error "create $file2 failed"
14608 $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
14609 error "create $file3 failed"
14611 $LFS swap_layouts $file1 $file2 ||
14612 error "swap $file1 $file2 layouts failed"
14614 lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
14615 [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
14617 echo 123 > $file1 || error "Should be able to write into $file1"
14619 $LFS swap_layouts $file1 $file3 ||
14620 error "swap $file1 $file3 layouts failed"
14622 echo 123 > $file1 || error "Should be able to write into $file1"
14624 rm -rf $file1 $file2 $file3
14626 run_test 184e "Recreate layout after stripeless layout swaps"
14629 # Create a file with name longer than sizeof(struct stat) ==
14630 # 144 to see if we can get chars from the file name to appear
14631 # in the returned striping. Note that 'f' == 0x66.
14632 local file=$(for ((i = 0; i < 200; i++)); do echo -n f; done)
14634 mkdir -p $DIR/$tdir
14635 mcreate $DIR/$tdir/$file
14636 if lfs find --stripe-count 0x6666 $DIR/$tdir | grep $file; then
14637 error "IOC_MDC_GETFILEINFO returned garbage striping"
14640 run_test 184f "IOC_MDC_GETFILEINFO for files with long names but no striping"
14642 test_185() { # LU-2441
14643 # LU-3553 - no volatile file support in old servers
14644 [[ $MDS1_VERSION -ge $(version_code 2.3.60) ]] ||
14645 skip "Need MDS version at least 2.3.60"
14647 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
14648 touch $DIR/$tdir/spoo
14649 local mtime1=$(stat -c "%Y" $DIR/$tdir)
14650 local fid=$($MULTIOP $DIR/$tdir VFw4096c) ||
14651 error "cannot create/write a volatile file"
14652 [ "$FILESET" == "" ] &&
14653 $CHECKSTAT -t file $MOUNT/.lustre/fid/$fid 2>/dev/null &&
14654 error "FID is still valid after close"
14656 multiop_bg_pause $DIR/$tdir vVw4096_c
14663 # assume that the next FID for this client is sequential, since stdout
14664 # is unfortunately eaten by multiop_bg_pause
14665 local n=$((${fidv[1]} + 1))
14666 local next_fid="${fidv[0]}:$(printf "0x%x" $n):${fidv[2]}"
14667 if [ "$FILESET" == "" ]; then
14668 $CHECKSTAT -t file $MOUNT/.lustre/fid/$next_fid ||
14669 error "FID is missing before close"
14671 kill -USR1 $multi_pid
14672 # 1 second delay, so if mtime change we will see it
14674 local mtime2=$(stat -c "%Y" $DIR/$tdir)
14675 [[ $mtime1 == $mtime2 ]] || error "mtime has changed"
14677 run_test 185 "Volatile file support"
14679 function create_check_volatile() {
14683 $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid &
14686 local FID=$(cat /tmp/${tfile}.fid)
14687 [ "$FID" == "" ] && error "can't get FID for volatile"
14688 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID"
14689 tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID)
14690 [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx"
14694 cancel_lru_locks mdc # flush opencache
14695 $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID"
14700 # LU-12516 - volatile creation via .lustre
14701 [[ $MDS1_VERSION -ge $(version_code 2.12.2) ]] ||
14702 skip "Need MDS version at least 2.12.2"
14704 create_check_volatile 0
14705 [ $MDSCOUNT -lt 2 ] && return 0
14708 create_check_volatile 1
14712 run_test 185a "Volatile file creation in .lustre/fid/"
14715 remote_mds_nodsh && skip "remote MDS with nodsh"
14716 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14717 skip "Need MDS version at least 2.3.0"
14719 local dir0=$DIR/$tdir/$testnum
14720 mkdir -p $dir0 || error "creating dir $dir0"
14722 local file=$dir0/file1
14723 dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
14724 local dv1=$($LFS data_version $file)
14725 dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
14726 local dv2=$($LFS data_version $file)
14727 [[ $dv1 != $dv2 ]] ||
14728 error "data version did not change on write $dv1 == $dv2"
14733 run_test 187a "Test data version change"
14736 remote_mds_nodsh && skip "remote MDS with nodsh"
14737 [ $MDS1_VERSION -lt $(version_code 2.3.0) ] &&
14738 skip "Need MDS version at least 2.3.0"
14740 local dir0=$DIR/$tdir/$testnum
14741 mkdir -p $dir0 || error "creating dir $dir0"
14743 declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
14744 [[ ${DV[0]} != ${DV[1]} ]] ||
14745 error "data version did not change on write"\
14746 " ${DV[0]} == ${DV[1]}"
14751 run_test 187b "Test data version change on volatile file"
14754 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14755 remote_mgs_nodsh && skip "remote MGS with nodsh"
14756 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
14758 local POOL=${POOL:-cea1}
14759 local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools}
14760 local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst}
14763 local last_ost=$(($OSTCOUNT - 1))
14765 local ost_list=$(seq $first_ost $ost_step $last_ost)
14766 local ost_range="$first_ost $last_ost $ost_step"
14767 local test_path=$POOL_ROOT/$POOL_DIR_NAME
14768 local file_dir=$POOL_ROOT/file_tst
14769 local subdir=$test_path/subdir
14773 # former test_200a test_200b
14774 pool_add $POOL || { rc=$? ; break; }
14775 pool_add_targets $POOL $ost_range || { rc=$? ; break; }
14776 # former test_200c test_200d
14777 mkdir -p $test_path
14778 pool_set_dir $POOL $test_path || { rc=$? ; break; }
14779 pool_check_dir $POOL $test_path || { rc=$? ; break; }
14781 pool_check_dir $POOL $subdir || { rc=$? ; break; }
14782 pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \
14783 || { rc=$? ; break; }
14784 # former test_200e test_200f
14785 local files=$((OSTCOUNT*3))
14786 pool_alloc_files $POOL $test_path $files "$ost_list" \
14787 || { rc=$? ; break; }
14788 pool_create_files $POOL $file_dir $files "$ost_list" \
14789 || { rc=$? ; break; }
14790 # former test_200g test_200h
14791 pool_lfs_df $POOL || { rc=$? ; break; }
14792 pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
14794 # former test_201a test_201b test_201c
14795 pool_remove_first_target $POOL || { rc=$? ; break; }
14797 local f=$test_path/$tfile
14798 pool_remove_all_targets $POOL $f || { rc=$? ; break; }
14799 pool_remove $POOL $f || { rc=$? ; break; }
14807 run_test 200 "OST pools"
14809 # usage: default_attr <count | size | offset>
14811 $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
14814 # usage: check_default_stripe_attr
14815 check_default_stripe_attr() {
14816 ACTUAL=$($GETSTRIPE $* $DIR/$tdir)
14819 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
14821 [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
14825 error "unknown getstripe attr '$1'"
14828 [ $ACTUAL == $EXPECTED ] ||
14829 error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
14833 test_mkdir $DIR/$tdir
14834 $SETSTRIPE --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
14836 check_default_stripe_attr --stripe-count
14837 check_default_stripe_attr --stripe-size
14838 check_default_stripe_attr --stripe-index
14840 run_test 204a "Print default stripe attributes"
14843 test_mkdir $DIR/$tdir
14844 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14846 check_default_stripe_attr --stripe-size
14847 check_default_stripe_attr --stripe-index
14849 run_test 204b "Print default stripe size and offset"
14852 test_mkdir $DIR/$tdir
14853 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14855 check_default_stripe_attr --stripe-count
14856 check_default_stripe_attr --stripe-index
14858 run_test 204c "Print default stripe count and offset"
14861 test_mkdir $DIR/$tdir
14862 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14864 check_default_stripe_attr --stripe-count
14865 check_default_stripe_attr --stripe-size
14867 run_test 204d "Print default stripe count and size"
14870 test_mkdir $DIR/$tdir
14871 $SETSTRIPE -d $DIR/$tdir
14873 check_default_stripe_attr --stripe-count --raw
14874 check_default_stripe_attr --stripe-size --raw
14875 check_default_stripe_attr --stripe-index --raw
14877 run_test 204e "Print raw stripe attributes"
14880 test_mkdir $DIR/$tdir
14881 $SETSTRIPE --stripe-count 1 $DIR/$tdir
14883 check_default_stripe_attr --stripe-size --raw
14884 check_default_stripe_attr --stripe-index --raw
14886 run_test 204f "Print raw stripe size and offset"
14889 test_mkdir $DIR/$tdir
14890 $SETSTRIPE --stripe-size 65536 $DIR/$tdir
14892 check_default_stripe_attr --stripe-count --raw
14893 check_default_stripe_attr --stripe-index --raw
14895 run_test 204g "Print raw stripe count and offset"
14898 test_mkdir $DIR/$tdir
14899 $SETSTRIPE --stripe-index 0 $DIR/$tdir
14901 check_default_stripe_attr --stripe-count --raw
14902 check_default_stripe_attr --stripe-size --raw
14904 run_test 204h "Print raw stripe count and size"
14906 # Figure out which job scheduler is being used, if any,
14907 # or use a fake one
14908 if [ -n "$SLURM_JOB_ID" ]; then # SLURM
14909 JOBENV=SLURM_JOB_ID
14910 elif [ -n "$LSB_JOBID" ]; then # Load Sharing Facility
14912 elif [ -n "$PBS_JOBID" ]; then # PBS/Maui/Moab
14914 elif [ -n "$LOADL_STEPID" ]; then # LoadLeveller
14915 JOBENV=LOADL_STEP_ID
14916 elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
14919 $LCTL list_param jobid_name > /dev/null 2>&1
14920 if [ $? -eq 0 ]; then
14926 LUSTRE_JOBID_SIZE=31 # plus NUL terminator
14928 verify_jobstats() {
14933 # we don't really need to clear the stats for this test to work, since each
14934 # command has a unique jobid, but it makes debugging easier if needed.
14935 # for facet in $facets; do
14936 # local dev=$(convert_facet2label $facet)
14937 # # clear old jobstats
14938 # do_facet $facet lctl set_param *.$dev.job_stats="clear"
14941 # use a new JobID for each test, or we might see an old one
14942 [ "$JOBENV" = "FAKE_JOBID" ] &&
14943 FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
14945 JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
14947 [ "$JOBENV" = "nodelocal" ] && {
14948 FAKE_JOBID=id.$testnum.%e.$RANDOM
14949 $LCTL set_param jobid_name=$FAKE_JOBID
14950 JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
14953 log "Test: ${cmd[*]}"
14954 log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
14956 if [ $JOBENV = "FAKE_JOBID" ]; then
14957 FAKE_JOBID=$JOBVAL ${cmd[*]}
14962 # all files are created on OST0000
14963 for facet in $facets; do
14964 local stats="*.$(convert_facet2label $facet).job_stats"
14966 # strip out libtool wrappers for in-tree executables
14967 if [ $(do_facet $facet lctl get_param $stats |
14968 sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
14969 do_facet $facet lctl get_param $stats
14970 error "No jobstats for $JOBVAL found on $facet::$stats"
14976 local new_jobenv=$1
14978 set_persistent_param_and_check client "jobid_var" \
14979 "$FSNAME.sys.jobid_var" $new_jobenv
14982 test_205a() { # Job stats
14983 [ $PARALLEL == "yes" ] && skip "skip parallel run"
14984 [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
14985 skip "Need MDS version with at least 2.7.1"
14986 remote_mgs_nodsh && skip "remote MGS with nodsh"
14987 remote_mds_nodsh && skip "remote MDS with nodsh"
14988 remote_ost_nodsh && skip "remote OST with nodsh"
14989 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
14990 skip "Server doesn't support jobstats"
14991 [[ $JOBID_VAR = disable ]] && skip_env "jobstats is disabled"
14993 local old_jobenv=$($LCTL get_param -n jobid_var)
14994 [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
14996 if [[ $PERM_CMD = *"set_param -P"* ]]; then
14997 stack_trap "do_facet mgs $PERM_CMD jobid_var=$old_jobenv" EXIT
14999 stack_trap "do_facet mgs $PERM_CMD \
15000 $FSNAME.sys.jobid_var=$old_jobenv" EXIT
15004 local old_interval=$(do_facet $SINGLEMDS lctl get_param -n \
15005 mdt.*.job_cleanup_interval | head -n 1)
15006 local new_interval=5
15007 do_facet $SINGLEMDS \
15008 $LCTL set_param mdt.*.job_cleanup_interval=$new_interval
15009 stack_trap "do_facet $SINGLEMDS \
15010 $LCTL set_param mdt.*.job_cleanup_interval=$old_interval" EXIT
15011 local start=$SECONDS
15015 cmd="mkdir $DIR/$tdir"
15016 verify_jobstats "$cmd" "$SINGLEMDS"
15018 cmd="rmdir $DIR/$tdir"
15019 verify_jobstats "$cmd" "$SINGLEMDS"
15020 # mkdir on secondary MDT
15021 if [ $MDSCOUNT -gt 1 ]; then
15022 cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
15023 verify_jobstats "$cmd" "mds2"
15026 cmd="mknod $DIR/$tfile c 1 3"
15027 verify_jobstats "$cmd" "$SINGLEMDS"
15029 cmd="rm -f $DIR/$tfile"
15030 verify_jobstats "$cmd" "$SINGLEMDS"
15031 # create all files on OST0000 so verify_jobstats can find OST stats
15033 cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile"
15034 verify_jobstats "$cmd" "$SINGLEMDS"
15036 cmd="touch $DIR/$tfile"
15037 verify_jobstats "$cmd" "$SINGLEMDS ost1"
15039 cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
15040 verify_jobstats "$cmd" "ost1"
15042 cancel_lru_locks osc
15043 cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
15044 verify_jobstats "$cmd" "ost1"
15046 cmd="$TRUNCATE $DIR/$tfile 0"
15047 verify_jobstats "$cmd" "$SINGLEMDS ost1"
15049 cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
15050 verify_jobstats "$cmd" "$SINGLEMDS"
15051 # jobstats expiry - sleep until old stats should be expired
15052 local left=$((new_interval + 5 - (SECONDS - start)))
15053 [ $left -ge 0 ] && wait_update_facet $SINGLEMDS \
15054 "lctl get_param *.*.job_stats | grep -c 'job_id.*mkdir'" \
15056 cmd="mkdir $DIR/$tdir.expire"
15057 verify_jobstats "$cmd" "$SINGLEMDS"
15058 [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
15059 grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
15061 # Ensure that jobid are present in changelog (if supported by MDS)
15062 if [ $MDS1_VERSION -ge $(version_code 2.6.52) ];then
15063 changelog_dump | tail -10
15064 jobids=$(changelog_dump | tail -9 | grep -c "j=")
15065 [ $jobids -eq 9 ] ||
15066 error "Wrong changelog jobid count $jobids != 9"
15070 jobstats_set $JOBENV
15072 changelog_dump | grep $tfile
15073 jobids=$(changelog_dump | grep $tfile | tail -1 | grep -c "j=")
15074 [ $jobids -eq 0 ] ||
15075 error "Unexpected jobids when jobid_var=$JOBENV"
15078 lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
15079 JOBENV="JOBCOMPLEX"
15080 JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
15082 verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
15084 run_test 205a "Verify job stats"
15088 $LCTL set_param jobid_var=USER jobid_name="%e.%u"
15089 env -i USERTESTJOBSTATS=foolish touch $DIR/$tfile.1
15090 do_facet $SINGLEMDS $LCTL get_param mdt.*.job_stats |
15091 grep job_id: | grep foolish &&
15092 error "Unexpected jobid found"
15095 run_test 205b "Verify job stats jobid parsing"
15097 # LU-1480, LU-1773 and LU-1657
15099 mkdir -p $DIR/$tdir
15100 $SETSTRIPE -c -1 $DIR/$tdir
15101 #define OBD_FAIL_LOV_INIT 0x1403
15102 $LCTL set_param fail_loc=0xa0001403
15103 $LCTL set_param fail_val=1
15104 touch $DIR/$tdir/$tfile || true
15106 run_test 206 "fail lov_init_raid0() doesn't lbug"
15109 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15110 local fsz=`stat -c %s $DIR/$tfile`
15111 cancel_lru_locks mdc
15113 # do not return layout in getattr intent
15114 #define OBD_FAIL_MDS_NO_LL_GETATTR 0x170
15115 $LCTL set_param fail_loc=0x170
15116 local sz=`stat -c %s $DIR/$tfile`
15118 [ $fsz -eq $sz ] || error "file size expected $fsz, actual $sz"
15122 run_test 207a "can refresh layout at glimpse"
15125 dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((RANDOM%10+1))
15126 local cksum=`md5sum $DIR/$tfile`
15127 local fsz=`stat -c %s $DIR/$tfile`
15128 cancel_lru_locks mdc
15129 cancel_lru_locks osc
15131 # do not return layout in getattr intent
15132 #define OBD_FAIL_MDS_NO_LL_OPEN 0x171
15133 $LCTL set_param fail_loc=0x171
15135 # it will refresh layout after the file is opened but before read issues
15136 echo checksum is "$cksum"
15137 echo "$cksum" |md5sum -c --quiet || error "file differs"
15141 run_test 207b "can refresh layout at open"
15144 # FIXME: in this test suite, only RD lease is used. This is okay
15145 # for now as only exclusive open is supported. After generic lease
15146 # is done, this test suite should be revised. - Jinshan
15148 remote_mds_nodsh && skip "remote MDS with nodsh"
15149 [[ $MDS1_VERSION -ge $(version_code 2.4.52) ]] ||
15150 skip "Need MDS version at least 2.4.52"
15152 echo "==== test 1: verify get lease work"
15153 $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
15155 echo "==== test 2: verify lease can be broken by upcoming open"
15156 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15160 $MULTIOP $DIR/$tfile oO_RDONLY:c
15161 kill -USR1 $PID && wait $PID || error "break lease error"
15163 echo "==== test 3: verify lease can't be granted if an open already exists"
15164 $MULTIOP $DIR/$tfile oO_RDONLY:_c &
15168 $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
15169 kill -USR1 $PID && wait $PID || error "open file error"
15171 echo "==== test 4: lease can sustain over recovery"
15172 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
15178 kill -USR1 $PID && wait $PID || error "lease broken over recovery"
15180 echo "==== test 5: lease broken can't be regained by replay"
15181 $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
15185 # open file to break lease and then recovery
15186 $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
15189 kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
15193 run_test 208 "Exclusive open"
15196 [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
15197 skip_env "must have disp_stripe"
15200 sync; sleep 5; sync;
15202 echo 3 > /proc/sys/vm/drop_caches
15203 req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15205 # open/close 500 times
15206 for i in $(seq 500); do
15210 echo 3 > /proc/sys/vm/drop_caches
15211 req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
15213 echo "before: $req_before, after: $req_after"
15214 [ $((req_after - req_before)) -ge 300 ] &&
15215 error "open/close requests are not freed"
15218 run_test 209 "read-only open/close requests should be freed promptly"
15222 size=$((size % 8192 + 1))
15223 dd if=/dev/urandom of=$DIR/f212 bs=1k count=$size
15224 sendfile $DIR/f212 $DIR/f212.xyz || error "sendfile wrong"
15225 rm -f $DIR/f212 $DIR/f212.xyz
15227 run_test 212 "Sendfile test ============================================"
15230 dd if=/dev/zero of=$DIR/$tfile bs=4k count=4
15231 cancel_lru_locks osc
15232 lctl set_param fail_loc=0x8000040f
15233 # generate a read lock
15234 cat $DIR/$tfile > /dev/null
15235 # write to the file, it will try to cancel the above read lock.
15236 cat /etc/hosts >> $DIR/$tfile
15238 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
15240 test_214() { # for bug 20133
15241 mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
15242 for (( i=0; i < 340; i++ )) ; do
15243 touch $DIR/$tdir/d214c/a$i
15246 ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
15247 mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
15248 ls $DIR/d214c || error "ls $DIR/d214c failed"
15249 rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
15250 rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
15252 run_test 214 "hash-indexed directory test - bug 20133"
15254 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
15255 create_lnet_proc_files() {
15256 lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
15259 # counterpart of create_lnet_proc_files
15260 remove_lnet_proc_files() {
15261 rm -f $TMP/lnet_$1.sys
15264 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15265 # 3rd arg as regexp for body
15266 check_lnet_proc_stats() {
15267 local l=$(cat "$TMP/lnet_$1" |wc -l)
15268 [ $l = 1 ] || (cat "$TMP/lnet_$1" && error "$2 is not of 1 line: $l")
15270 grep -E "$3" "$TMP/lnet_$1" || (cat "$TMP/lnet_$1" && error "$2 misformatted")
15273 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
15274 # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
15275 # optional and can be regexp for 2nd line (lnet.routes case)
15276 check_lnet_proc_entry() {
15277 local blp=2 # blp stands for 'position of 1st line of body'
15278 [ -z "$5" ] || blp=3 # lnet.routes case
15280 local l=$(cat "$TMP/lnet_$1" |wc -l)
15281 # subtracting one from $blp because the body can be empty
15282 [ "$l" -ge "$(($blp - 1))" ] || (cat "$TMP/lnet_$1" && error "$2 is too short: $l")
15284 sed -n '1 p' "$TMP/lnet_$1" |grep -E "$4" >/dev/null ||
15285 (cat "$TMP/lnet_$1" && error "1st line of $2 misformatted")
15287 [ "$5" = "" ] || sed -n '2 p' "$TMP/lnet_$1" |grep -E "$5" >/dev/null ||
15288 (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
15290 # bail out if any unexpected line happened
15291 sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
15292 [ "$?" != 0 ] || error "$2 misformatted"
15295 test_215() { # for bugs 18102, 21079, 21517
15296 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15298 local N='(0|[1-9][0-9]*)' # non-negative numeric
15299 local P='[1-9][0-9]*' # positive numeric
15300 local I='(0|-?[1-9][0-9]*|NA)' # any numeric (0 | >0 | <0) or NA if no value
15301 local NET='[a-z][a-z0-9]*' # LNET net like o2ib2
15302 local ADDR='[0-9.]+' # LNET addr like 10.0.0.1
15303 local NID="$ADDR@$NET" # LNET nid like 10.0.0.1@o2ib2
15305 local L1 # regexp for 1st line
15306 local L2 # regexp for 2nd line (optional)
15307 local BR # regexp for the rest (body)
15309 # lnet.stats should look as 11 space-separated non-negative numerics
15310 BR="^$N $N $N $N $N $N $N $N $N $N $N$"
15311 create_lnet_proc_files "stats"
15312 check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
15313 remove_lnet_proc_files "stats"
15315 # lnet.routes should look like this:
15316 # Routing disabled/enabled
15317 # net hops priority state router
15318 # where net is a string like tcp0, hops > 0, priority >= 0,
15319 # state is up/down,
15320 # router is a string like 192.168.1.1@tcp2
15321 L1="^Routing (disabled|enabled)$"
15322 L2="^net +hops +priority +state +router$"
15323 BR="^$NET +$N +(0|1) +(up|down) +$NID$"
15324 create_lnet_proc_files "routes"
15325 check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
15326 remove_lnet_proc_files "routes"
15328 # lnet.routers should look like this:
15329 # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
15330 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
15331 # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
15332 # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2
15333 L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
15334 BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
15335 create_lnet_proc_files "routers"
15336 check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
15337 remove_lnet_proc_files "routers"
15339 # lnet.peers should look like this:
15340 # nid refs state last max rtr min tx min queue
15341 # where nid is a string like 192.168.1.1@tcp2, refs > 0,
15342 # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
15343 # numeric (0 or >0 or <0), queue >= 0.
15344 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
15345 BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
15346 create_lnet_proc_files "peers"
15347 check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
15348 remove_lnet_proc_files "peers"
15350 # lnet.buffers should look like this:
15351 # pages count credits min
15352 # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
15353 L1="^pages +count +credits +min$"
15354 BR="^ +$N +$N +$I +$I$"
15355 create_lnet_proc_files "buffers"
15356 check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
15357 remove_lnet_proc_files "buffers"
15359 # lnet.nis should look like this:
15360 # nid status alive refs peer rtr max tx min
15361 # where nid is a string like 192.168.1.1@tcp2, status is up/down,
15362 # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
15363 # rtr >= 0, max >=0, tx and min are numeric (0 or >0 or <0).
15364 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
15365 BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
15366 create_lnet_proc_files "nis"
15367 check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
15368 remove_lnet_proc_files "nis"
15370 # can we successfully write to lnet.stats?
15371 lctl set_param -n stats=0 || error "cannot write to lnet.stats"
15373 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
15375 test_216() { # bug 20317
15376 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15377 remote_ost_nodsh && skip "remote OST with nodsh"
15380 local facets=$(get_facets OST)
15381 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15383 save_lustre_params client "osc.*.contention_seconds" > $p
15384 save_lustre_params $facets \
15385 "ldlm.namespaces.filter-*.max_nolock_bytes" >> $p
15386 save_lustre_params $facets \
15387 "ldlm.namespaces.filter-*.contended_locks" >> $p
15388 save_lustre_params $facets \
15389 "ldlm.namespaces.filter-*.contention_seconds" >> $p
15390 clear_stats osc.*.osc_stats
15392 # agressive lockless i/o settings
15393 do_nodes $(comma_list $(osts_nodes)) \
15394 "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
15395 ldlm.namespaces.filter-*.contended_locks=0 \
15396 ldlm.namespaces.filter-*.contention_seconds=60"
15397 lctl set_param -n osc.*.contention_seconds=60
15399 $DIRECTIO write $DIR/$tfile 0 10 4096
15400 $CHECKSTAT -s 40960 $DIR/$tfile
15402 # disable lockless i/o
15403 do_nodes $(comma_list $(osts_nodes)) \
15404 "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
15405 ldlm.namespaces.filter-*.contended_locks=32 \
15406 ldlm.namespaces.filter-*.contention_seconds=0"
15407 lctl set_param -n osc.*.contention_seconds=0
15408 clear_stats osc.*.osc_stats
15410 dd if=/dev/zero of=$DIR/$tfile count=0
15411 $CHECKSTAT -s 0 $DIR/$tfile
15413 restore_lustre_params <$p
15417 run_test 216 "check lockless direct write updates file size and kms correctly"
15419 test_217() { # bug 22430
15420 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15425 for node in $(nodes_list); do
15426 nid=$(host_nids_address $node $NETTYPE)
15427 if [[ $nid = *-* ]] ; then
15428 echo "lctl ping $(h2nettype $nid)"
15429 lctl ping $(h2nettype $nid)
15431 echo "skipping $node (no hyphen detected)"
15435 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
15438 # do directio so as not to populate the page cache
15439 log "creating a 10 Mb file"
15440 $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
15441 log "starting reads"
15442 dd if=$DIR/$tfile of=/dev/null bs=4096 &
15443 log "truncating the file"
15444 $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
15446 kill %+ || true # reads might have finished
15447 echo "wait until dd is finished"
15449 log "removing the temporary file"
15450 rm -rf $DIR/$tfile || error "tmp file removal failed"
15452 run_test 218 "parallel read and truncate should not deadlock"
15455 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15457 # write one partial page
15458 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
15459 # set no grant so vvp_io_commit_write will do sync write
15460 $LCTL set_param fail_loc=0x411
15461 # write a full page at the end of file
15462 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
15464 $LCTL set_param fail_loc=0
15465 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
15466 $LCTL set_param fail_loc=0x411
15467 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
15470 dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
15471 $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
15473 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
15475 test_220() { #LU-325
15476 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15477 remote_ost_nodsh && skip "remote OST with nodsh"
15478 remote_mds_nodsh && skip "remote MDS with nodsh"
15479 remote_mgs_nodsh && skip "remote MGS with nodsh"
15483 # create on MDT0000 so the last_id and next_id are correct
15485 local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
15489 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
15490 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
15491 osp.$mdtosc_proc1.prealloc_last_id)
15492 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
15493 osp.$mdtosc_proc1.prealloc_next_id)
15497 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
15498 #define OBD_FAIL_OST_ENOINO 0x229
15499 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
15500 create_pool $FSNAME.$TESTNAME || return 1
15501 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
15503 $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
15505 MDSOBJS=$((last_id - next_id))
15506 echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
15508 blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
15509 echo "OST still has $count kbytes free"
15511 echo "create $MDSOBJS files @next_id..."
15512 createmany -o $DIR/$tdir/f $MDSOBJS || return 3
15514 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15515 osp.$mdtosc_proc1.prealloc_last_id)
15516 local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
15517 osp.$mdtosc_proc1.prealloc_next_id)
15519 echo "after creation, last_id=$last_id2, next_id=$next_id2"
15524 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
15525 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
15527 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
15528 error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
15529 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
15530 error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
15531 echo "unlink $MDSOBJS files @$next_id..."
15532 unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
15534 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
15537 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15539 dd if=`which date` of=$MOUNT/date oflag=sync
15540 chmod +x $MOUNT/date
15542 #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
15543 $LCTL set_param fail_loc=0x80001401
15545 $MOUNT/date > /dev/null
15548 run_test 221 "make sure fault and truncate race to not cause OOM"
15551 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15554 test_mkdir $DIR/$tdir
15555 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15556 createmany -o $DIR/$tdir/$tfile 10
15557 cancel_lru_locks mdc
15558 cancel_lru_locks osc
15559 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15560 $LCTL set_param fail_loc=0x31a
15561 ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
15562 $LCTL set_param fail_loc=0
15565 run_test 222a "AGL for ls should not trigger CLIO lock failure"
15568 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15571 test_mkdir $DIR/$tdir
15572 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15573 createmany -o $DIR/$tdir/$tfile 10
15574 cancel_lru_locks mdc
15575 cancel_lru_locks osc
15576 #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
15577 $LCTL set_param fail_loc=0x31a
15578 rm -r $DIR/$tdir || error "AGL for rmdir failed"
15579 $LCTL set_param fail_loc=0
15581 run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
15584 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15587 test_mkdir $DIR/$tdir
15588 $LFS setstripe -c 1 -i 0 $DIR/$tdir
15589 createmany -o $DIR/$tdir/$tfile 10
15590 cancel_lru_locks mdc
15591 cancel_lru_locks osc
15592 #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
15593 $LCTL set_param fail_loc=0x31b
15594 ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
15595 $LCTL set_param fail_loc=0
15598 run_test 223 "osc reenqueue if without AGL lock granted ======================="
15600 test_224a() { # LU-1039, MRP-303
15601 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15603 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB 0x508
15604 $LCTL set_param fail_loc=0x508
15605 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync
15606 $LCTL set_param fail_loc=0
15609 run_test 224a "Don't panic on bulk IO failure"
15611 test_224b() { # LU-1039, MRP-303
15612 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15614 dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
15615 cancel_lru_locks osc
15616 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB2 0x515
15617 $LCTL set_param fail_loc=0x515
15618 dd of=/dev/null if=$DIR/$tfile bs=4096 count=1
15619 $LCTL set_param fail_loc=0
15622 run_test 224b "Don't panic on bulk IO failure"
15624 test_224c() { # LU-6441
15625 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15626 remote_mds_nodsh && skip "remote MDS with nodsh"
15628 local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
15629 save_writethrough $p
15630 set_cache writethrough on
15632 local pages_per_rpc=$($LCTL get_param \
15633 osc.*.max_pages_per_rpc)
15634 local at_max=$($LCTL get_param -n at_max)
15635 local timeout=$($LCTL get_param -n timeout)
15636 local test_at="at_max"
15637 local param_at="$FSNAME.sys.at_max"
15638 local test_timeout="timeout"
15639 local param_timeout="$FSNAME.sys.timeout"
15641 $LCTL set_param -n osc.*.max_pages_per_rpc=1024
15643 set_persistent_param_and_check client "$test_at" "$param_at" 0
15644 set_persistent_param_and_check client "$test_timeout" "$param_timeout" 5
15646 #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
15647 do_facet ost1 $LCTL set_param fail_loc=0x520
15648 $LFS setstripe -c 1 -i 0 $DIR/$tfile
15649 dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
15651 do_facet ost1 $LCTL set_param fail_loc=0
15653 set_persistent_param_and_check client "$test_at" "$param_at" $at_max
15654 set_persistent_param_and_check client "$test_timeout" "$param_timeout" \
15657 $LCTL set_param -n $pages_per_rpc
15658 restore_lustre_params < $p
15661 run_test 224c "Don't hang if one of md lost during large bulk RPC"
15663 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
15665 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15666 if [ -z ${MDSSURVEY} ]; then
15667 skip_env "mds-survey not found"
15669 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15670 skip "Need MDS version at least 2.2.51"
15672 local mds=$(facet_host $SINGLEMDS)
15673 local target=$(do_nodes $mds 'lctl dl' |
15674 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15676 local cmd1="file_count=1000 thrhi=4"
15677 local cmd2="dir_count=2 layer=mdd stripe_count=0"
15678 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15679 local cmd="$cmd1 $cmd2 $cmd3"
15681 rm -f ${TMP}/mds_survey*
15683 eval $cmd || error "mds-survey with zero-stripe failed"
15684 cat ${TMP}/mds_survey*
15685 rm -f ${TMP}/mds_survey*
15687 run_test 225a "Metadata survey sanity with zero-stripe"
15690 if [ -z ${MDSSURVEY} ]; then
15691 skip_env "mds-survey not found"
15693 [ $MDS1_VERSION -ge $(version_code 2.2.51) ] ||
15694 skip "Need MDS version at least 2.2.51"
15695 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15696 remote_mds_nodsh && skip "remote MDS with nodsh"
15697 if [ $($LCTL dl | grep -c osc) -eq 0 ]; then
15698 skip_env "Need to mount OST to test"
15701 local mds=$(facet_host $SINGLEMDS)
15702 local target=$(do_nodes $mds 'lctl dl' |
15703 awk '{ if ($2 == "UP" && $3 == "mdt") { print $4 }}')
15705 local cmd1="file_count=1000 thrhi=4"
15706 local cmd2="dir_count=2 layer=mdd stripe_count=1"
15707 local cmd3="rslt_loc=${TMP} targets=\"$mds:$target\" $MDSSURVEY"
15708 local cmd="$cmd1 $cmd2 $cmd3"
15710 rm -f ${TMP}/mds_survey*
15712 eval $cmd || error "mds-survey with stripe_count failed"
15713 cat ${TMP}/mds_survey*
15714 rm -f ${TMP}/mds_survey*
15716 run_test 225b "Metadata survey sanity with stripe_count = 1"
15718 mcreate_path2fid () {
15724 local path=$DIR/$tdir/$name
15729 $MCREATE --mode=$1 --major=$2 --minor=$3 $path ||
15730 error "cannot create $desc"
15732 fid=$($LFS path2fid $path | tr -d '[' | tr -d ']')
15734 [ $rc -ne 0 ] && error "cannot get fid of a $desc"
15736 fid_path=$($LFS fid2path $MOUNT $fid)
15738 [ $rc -ne 0 ] && error "cannot get path of $desc by $DIR $path $fid"
15740 [ "$path" == "$fid_path" ] ||
15741 error "fid2path returned $fid_path, expected $path"
15743 echo "pass with $path and $fid"
15748 mkdir -p $DIR/$tdir
15750 mcreate_path2fid 0010666 0 0 fifo "FIFO"
15751 mcreate_path2fid 0020666 1 3 null "character special file (null)"
15752 mcreate_path2fid 0020666 1 255 none "character special file (no device)"
15753 mcreate_path2fid 0040666 0 0 dir "directory"
15754 mcreate_path2fid 0060666 7 0 loop0 "block special file (loop)"
15755 mcreate_path2fid 0100666 0 0 file "regular file"
15756 mcreate_path2fid 0120666 0 0 link "symbolic link"
15757 mcreate_path2fid 0140666 0 0 sock "socket"
15759 run_test 226a "call path2fid and fid2path on files of all type"
15762 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15767 mkdir -p $DIR/$tdir
15768 $LFS setdirstripe -i $MDTIDX $DIR/$tdir/remote_dir ||
15769 error "create remote directory failed"
15770 mcreate_path2fid 0010666 0 0 "remote_dir/fifo" "FIFO"
15771 mcreate_path2fid 0020666 1 3 "remote_dir/null" \
15772 "character special file (null)"
15773 mcreate_path2fid 0020666 1 255 "remote_dir/none" \
15774 "character special file (no device)"
15775 mcreate_path2fid 0040666 0 0 "remote_dir/dir" "directory"
15776 mcreate_path2fid 0060666 7 0 "remote_dir/loop0" \
15777 "block special file (loop)"
15778 mcreate_path2fid 0100666 0 0 "remote_dir/file" "regular file"
15779 mcreate_path2fid 0120666 0 0 "remote_dir/link" "symbolic link"
15780 mcreate_path2fid 0140666 0 0 "remote_dir/sock" "socket"
15782 run_test 226b "call path2fid and fid2path on files of all type under remote dir"
15784 # LU-1299 Executing or running ldd on a truncated executable does not
15785 # cause an out-of-memory condition.
15787 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15788 [ -z "$(which ldd)" ] && skip_env "should have ldd tool"
15790 dd if=$(which date) of=$MOUNT/date bs=1k count=1
15791 chmod +x $MOUNT/date
15793 $MOUNT/date > /dev/null
15794 ldd $MOUNT/date > /dev/null
15797 run_test 227 "running truncated executable does not cause OOM"
15799 # LU-1512 try to reuse idle OI blocks
15801 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15802 remote_mds_nodsh && skip "remote MDS with nodsh"
15803 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15805 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15806 local myDIR=$DIR/$tdir
15809 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15810 $LCTL set_param fail_loc=0x80001002
15811 createmany -o $myDIR/t- 10000
15812 $LCTL set_param fail_loc=0
15813 # The guard is current the largest FID holder
15815 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15817 local IDX=$(($SEQ % 64))
15819 do_facet $SINGLEMDS sync
15820 # Make sure journal flushed.
15822 local blk1=$(do_facet $SINGLEMDS \
15823 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15824 grep Blockcount | awk '{print $4}')
15826 # Remove old files, some OI blocks will become idle.
15827 unlinkmany $myDIR/t- 10000
15828 # Create new files, idle OI blocks should be reused.
15829 createmany -o $myDIR/t- 2000
15830 do_facet $SINGLEMDS sync
15831 # Make sure journal flushed.
15833 local blk2=$(do_facet $SINGLEMDS \
15834 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15835 grep Blockcount | awk '{print $4}')
15837 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15839 run_test 228a "try to reuse idle OI blocks"
15842 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15843 remote_mds_nodsh && skip "remote MDS with nodsh"
15844 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15846 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15847 local myDIR=$DIR/$tdir
15850 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15851 $LCTL set_param fail_loc=0x80001002
15852 createmany -o $myDIR/t- 10000
15853 $LCTL set_param fail_loc=0
15854 # The guard is current the largest FID holder
15856 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15858 local IDX=$(($SEQ % 64))
15860 do_facet $SINGLEMDS sync
15861 # Make sure journal flushed.
15863 local blk1=$(do_facet $SINGLEMDS \
15864 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15865 grep Blockcount | awk '{print $4}')
15867 # Remove old files, some OI blocks will become idle.
15868 unlinkmany $myDIR/t- 10000
15871 stop $SINGLEMDS || error "Fail to stop MDT."
15873 start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
15875 df $MOUNT || error "Fail to df."
15876 # Create new files, idle OI blocks should be reused.
15877 createmany -o $myDIR/t- 2000
15878 do_facet $SINGLEMDS sync
15879 # Make sure journal flushed.
15881 local blk2=$(do_facet $SINGLEMDS \
15882 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15883 grep Blockcount | awk '{print $4}')
15885 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15887 run_test 228b "idle OI blocks can be reused after MDT restart"
15891 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15892 remote_mds_nodsh && skip "remote MDS with nodsh"
15893 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
15895 local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
15896 local myDIR=$DIR/$tdir
15899 #define OBD_FAIL_SEQ_EXHAUST 0x1002
15900 $LCTL set_param fail_loc=0x80001002
15901 # 20000 files can guarantee there are index nodes in the OI file
15902 createmany -o $myDIR/t- 20000
15903 $LCTL set_param fail_loc=0
15904 # The guard is current the largest FID holder
15906 local SEQ=$($LFS path2fid $myDIR/guard | awk -F ':' '{print $1}' |
15908 local IDX=$(($SEQ % 64))
15910 do_facet $SINGLEMDS sync
15911 # Make sure journal flushed.
15913 local blk1=$(do_facet $SINGLEMDS \
15914 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15915 grep Blockcount | awk '{print $4}')
15917 # Remove old files, some OI blocks will become idle.
15918 unlinkmany $myDIR/t- 20000
15920 # The OI file should become empty now
15922 # Create new files, idle OI blocks should be reused.
15923 createmany -o $myDIR/t- 2000
15924 do_facet $SINGLEMDS sync
15925 # Make sure journal flushed.
15927 local blk2=$(do_facet $SINGLEMDS \
15928 "$DEBUGFS -c -R \\\"stat oi.16.${IDX}\\\" $MDT_DEV" |
15929 grep Blockcount | awk '{print $4}')
15931 [ $blk1 == $blk2 ] || error "old blk1=$blk1, new blk2=$blk2, unmatched!"
15933 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
15935 test_229() { # LU-2482, LU-3448
15936 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15937 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
15938 [ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
15939 skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
15943 # Create a file with a released layout and stripe count 2.
15944 $MULTIOP $DIR/$tfile H2c ||
15945 error "failed to create file with released layout"
15947 $GETSTRIPE -v $DIR/$tfile
15949 local pattern=$($GETSTRIPE -L $DIR/$tfile)
15950 [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
15952 local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
15953 [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
15954 stat $DIR/$tfile || error "failed to stat released file"
15956 chown $RUNAS_ID $DIR/$tfile ||
15957 error "chown $RUNAS_ID $DIR/$tfile failed"
15959 chgrp $RUNAS_ID $DIR/$tfile ||
15960 error "chgrp $RUNAS_ID $DIR/$tfile failed"
15962 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
15963 rm $DIR/$tfile || error "failed to remove released file"
15965 run_test 229 "getstripe/stat/rm/attr changes work on released files"
15968 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15969 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15970 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15971 skip "Need MDS version at least 2.11.52"
15975 test_mkdir $DIR/$tdir
15976 test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
15977 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230_local)
15978 [ $mdt_idx -ne 0 ] &&
15979 error "create local directory on wrong MDT $mdt_idx"
15981 $LFS mkdir -i $MDTIDX $DIR/$tdir/test_230 ||
15982 error "create remote directory failed"
15983 local mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230)
15984 [ $mdt_idx -ne $MDTIDX ] &&
15985 error "create remote directory on wrong MDT $mdt_idx"
15987 createmany -o $DIR/$tdir/test_230/t- 10 ||
15988 error "create files on remote directory failed"
15989 mdt_idx=$($LFS getstripe -m $DIR/$tdir/test_230/t-0)
15990 [ $mdt_idx -ne $MDTIDX ] && error "create files on wrong MDT $mdt_idx"
15991 rm -r $DIR/$tdir || error "unlink remote directory failed"
15993 run_test 230a "Create remote directory and files under the remote directory"
15996 [ $PARALLEL == "yes" ] && skip "skip parallel run"
15997 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
15998 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
15999 skip "Need MDS version at least 2.11.52"
16007 local migrate_dir=$DIR/$tdir/migrate_dir
16008 local other_dir=$DIR/$tdir/other_dir
16010 test_mkdir $DIR/$tdir
16011 test_mkdir -i0 -c1 $migrate_dir
16012 test_mkdir -i0 -c1 $other_dir
16013 for ((i=0; i<10; i++)); do
16014 mkdir -p $migrate_dir/dir_${i}
16015 createmany -o $migrate_dir/dir_${i}/f 10 ||
16016 error "create files under remote dir failed $i"
16019 cp /etc/passwd $migrate_dir/$tfile
16020 cp /etc/passwd $other_dir/$tfile
16021 chattr +SAD $migrate_dir
16022 chattr +SAD $migrate_dir/$tfile
16024 local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16025 local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16026 local old_dir_mode=$(stat -c%f $migrate_dir)
16027 local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
16029 mkdir -p $migrate_dir/dir_default_stripe2
16030 $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2
16031 $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2
16033 mkdir -p $other_dir
16034 ln $migrate_dir/$tfile $other_dir/luna
16035 ln $migrate_dir/$tfile $migrate_dir/sofia
16036 ln $other_dir/$tfile $migrate_dir/david
16037 ln -s $migrate_dir/$tfile $other_dir/zachary
16038 ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
16039 ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
16045 for len in 58 59 60; do
16046 lnktgt=$(str_repeat 'l' $len)
16047 touch $migrate_dir/$lnktgt
16048 ln -s $lnktgt $migrate_dir/${len}char_ln
16052 for len in 4094 4095; do
16053 lnktgt=$(str_repeat 'l' $len)
16054 ln -s $lnktgt $migrate_dir/${len}char_ln
16058 for len in 254 255; do
16059 touch $migrate_dir/$(str_repeat 'l' $len)
16062 $LFS migrate -m $MDTIDX $migrate_dir ||
16063 error "fails on migrating remote dir to MDT1"
16065 echo "migratate to MDT1, then checking.."
16066 for ((i = 0; i < 10; i++)); do
16067 for file in $(find $migrate_dir/dir_${i}); do
16068 mdt_index=$($LFS getstripe -m $file)
16069 # broken symlink getstripe will fail
16070 [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
16071 error "$file is not on MDT${MDTIDX}"
16075 # the multiple link file should still in MDT0
16076 mdt_index=$($LFS getstripe -m $migrate_dir/$tfile)
16077 [ $mdt_index == 0 ] ||
16078 error "$file is not on MDT${MDTIDX}"
16080 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16081 [ "$old_dir_flag" = "$new_dir_flag" ] ||
16082 error " expect $old_dir_flag get $new_dir_flag"
16084 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16085 [ "$old_file_flag" = "$new_file_flag" ] ||
16086 error " expect $old_file_flag get $new_file_flag"
16088 local new_dir_mode=$(stat -c%f $migrate_dir)
16089 [ "$old_dir_mode" = "$new_dir_mode" ] ||
16090 error "expect mode $old_dir_mode get $new_dir_mode"
16092 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
16093 [ "$old_file_mode" = "$new_file_mode" ] ||
16094 error "expect mode $old_file_mode get $new_file_mode"
16096 diff /etc/passwd $migrate_dir/$tfile ||
16097 error "$tfile different after migration"
16099 diff /etc/passwd $other_dir/luna ||
16100 error "luna different after migration"
16102 diff /etc/passwd $migrate_dir/sofia ||
16103 error "sofia different after migration"
16105 diff /etc/passwd $migrate_dir/david ||
16106 error "david different after migration"
16108 diff /etc/passwd $other_dir/zachary ||
16109 error "zachary different after migration"
16111 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16112 error "${tfile}_ln different after migration"
16114 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16115 error "${tfile}_ln_other different after migration"
16117 stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
16118 [ $stripe_count = 2 ] ||
16119 error "dir strpe_count $d != 2 after migration."
16121 stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
16122 [ $stripe_count = 2 ] ||
16123 error "file strpe_count $d != 2 after migration."
16125 #migrate back to MDT0
16128 $LFS migrate -m $MDTIDX $migrate_dir ||
16129 error "fails on migrating remote dir to MDT0"
16131 echo "migrate back to MDT0, checking.."
16132 for file in $(find $migrate_dir); do
16133 mdt_index=$($LFS getstripe -m $file)
16134 [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
16135 error "$file is not on MDT${MDTIDX}"
16138 local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
16139 [ "$old_dir_flag" = "$new_dir_flag" ] ||
16140 error " expect $old_dir_flag get $new_dir_flag"
16142 local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
16143 [ "$old_file_flag" = "$new_file_flag" ] ||
16144 error " expect $old_file_flag get $new_file_flag"
16146 local new_dir_mode=$(stat -c%f $migrate_dir)
16147 [ "$old_dir_mode" = "$new_dir_mode" ] ||
16148 error "expect mode $old_dir_mode get $new_dir_mode"
16150 local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
16151 [ "$old_file_mode" = "$new_file_mode" ] ||
16152 error "expect mode $old_file_mode get $new_file_mode"
16154 diff /etc/passwd ${migrate_dir}/$tfile ||
16155 error "$tfile different after migration"
16157 diff /etc/passwd ${other_dir}/luna ||
16158 error "luna different after migration"
16160 diff /etc/passwd ${migrate_dir}/sofia ||
16161 error "sofia different after migration"
16163 diff /etc/passwd ${other_dir}/zachary ||
16164 error "zachary different after migration"
16166 diff /etc/passwd $migrate_dir/${tfile}_ln ||
16167 error "${tfile}_ln different after migration"
16169 diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
16170 error "${tfile}_ln_other different after migration"
16172 stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
16173 [ $stripe_count = 2 ] ||
16174 error "dir strpe_count $d != 2 after migration."
16176 stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
16177 [ $stripe_count = 2 ] ||
16178 error "file strpe_count $d != 2 after migration."
16180 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16182 run_test 230b "migrate directory"
16185 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16186 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16187 remote_mds_nodsh && skip "remote MDS with nodsh"
16188 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16189 skip "Need MDS version at least 2.11.52"
16195 local migrate_dir=$DIR/$tdir/migrate_dir
16197 #If migrating directory fails in the middle, all entries of
16198 #the directory is still accessiable.
16199 test_mkdir $DIR/$tdir
16200 test_mkdir -i0 -c1 $migrate_dir
16201 test_mkdir -i1 -c1 $DIR/$tdir/remote_dir
16203 createmany -o $migrate_dir/f $total ||
16204 error "create files under ${migrate_dir} failed"
16206 # fail after migrating top dir, and this will fail only once, so the
16207 # first sub file migration will fail (currently f3), others succeed.
16208 #OBD_FAIL_MIGRATE_ENTRIES 0x1801
16209 do_facet mds1 lctl set_param fail_loc=0x1801
16210 local t=$(ls $migrate_dir | wc -l)
16211 $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
16212 error "migrate should fail"
16213 local u=$(ls $migrate_dir | wc -l)
16214 [ "$u" == "$t" ] || error "$u != $t during migration"
16216 # add new dir/file should succeed
16217 mkdir $migrate_dir/dir ||
16218 error "mkdir failed under migrating directory"
16219 touch $migrate_dir/file ||
16220 error "create file failed under migrating directory"
16222 # add file with existing name should fail
16223 for file in $migrate_dir/f*; do
16224 stat $file > /dev/null || error "stat $file failed"
16225 $OPENFILE -f O_CREAT:O_EXCL $file &&
16226 error "open(O_CREAT|O_EXCL) $file should fail"
16227 $MULTIOP $file m && error "create $file should fail"
16228 touch $DIR/$tdir/remote_dir/$tfile ||
16229 error "touch $tfile failed"
16230 ln $DIR/$tdir/remote_dir/$tfile $file &&
16231 error "link $file should fail"
16232 mdt_index=$($LFS getstripe -m $file)
16233 if [ $mdt_index == 0 ]; then
16234 # file failed to migrate is not allowed to rename to
16235 mv $DIR/$tdir/remote_dir/$tfile $file &&
16236 error "rename to $file should fail"
16238 mv $DIR/$tdir/remote_dir/$tfile $file ||
16239 error "rename to $file failed"
16241 echo hello >> $file || error "write $file failed"
16244 # resume migration with different options should fail
16245 $LFS migrate -m 0 $migrate_dir &&
16246 error "migrate -m 0 $migrate_dir should fail"
16248 $LFS migrate -m $MDTIDX -c 2 $migrate_dir &&
16249 error "migrate -c 2 $migrate_dir should fail"
16251 # resume migration should succeed
16252 $LFS migrate -m $MDTIDX $migrate_dir ||
16253 error "migrate $migrate_dir failed"
16255 echo "Finish migration, then checking.."
16256 for file in $(find $migrate_dir); do
16257 mdt_index=$($LFS getstripe -m $file)
16258 [ $mdt_index == $MDTIDX ] ||
16259 error "$file is not on MDT${MDTIDX}"
16262 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16264 run_test 230c "check directory accessiblity if migration failed"
16267 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16268 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16269 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16270 skip "Need MDS version at least 2.11.52"
16272 [ "$mds1_FSTYPE" == "zfs" ] && skip "skip ZFS backend"
16274 local migrate_dir=$DIR/$tdir/migrate_dir
16284 old_index=$((RANDOM % MDSCOUNT))
16285 old_count=$((MDSCOUNT - old_index))
16286 new_index=$((RANDOM % MDSCOUNT))
16287 new_count=$((MDSCOUNT - new_index))
16288 new_hash="all_char"
16290 [ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
16291 [ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
16293 test_mkdir $DIR/$tdir
16294 test_mkdir -i $old_index -c $old_count $migrate_dir
16296 for ((i=0; i<100; i++)); do
16297 test_mkdir -i0 -c1 $migrate_dir/dir_${i}
16298 createmany -o $migrate_dir/dir_${i}/f 100 ||
16299 error "create files under remote dir failed $i"
16302 echo -n "Migrate from MDT$old_index "
16303 [ $old_count -gt 1 ] && echo -n "... MDT$((old_index + old_count - 1)) "
16304 echo -n "to MDT$new_index"
16305 [ $new_count -gt 1 ] && echo -n " ... MDT$((new_index + new_count - 1))"
16308 echo "$LFS migrate -m$new_index -c$new_count -H $new_hash $migrate_dir"
16309 $LFS migrate -m $new_index -c $new_count -H $new_hash $migrate_dir ||
16310 error "migrate remote dir error"
16312 echo "Finish migration, then checking.."
16313 for file in $(find $migrate_dir); do
16314 mdt_index=$($LFS getstripe -m $file)
16315 if [ $mdt_index -lt $new_index ] ||
16316 [ $mdt_index -gt $((new_index + new_count - 1)) ]; then
16317 error "$file is on MDT$mdt_index"
16321 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16323 run_test 230d "check migrate big directory"
16326 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16327 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16328 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16329 skip "Need MDS version at least 2.11.52"
16336 mkdir -p $DIR/$tdir
16337 mkdir $DIR/$tdir/migrate_dir
16338 mkdir $DIR/$tdir/other_dir
16339 touch $DIR/$tdir/migrate_dir/a
16340 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
16341 ls $DIR/$tdir/other_dir
16343 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16344 error "migrate dir fails"
16346 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16347 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16349 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16350 [ $mdt_index == 0 ] || error "a is not on MDT0"
16352 $LFS migrate -m 1 $DIR/$tdir/other_dir ||
16353 error "migrate dir fails"
16355 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir)
16356 [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
16358 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16359 [ $mdt_index == 1 ] || error "a is not on MDT1"
16361 mdt_index=$($LFS getstripe -m $DIR/$tdir/other_dir/b)
16362 [ $mdt_index == 1 ] || error "b is not on MDT1"
16364 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16365 b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
16367 [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
16369 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16371 run_test 230e "migrate mulitple local link files"
16374 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16375 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16376 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16377 skip "Need MDS version at least 2.11.52"
16382 mkdir -p $DIR/$tdir
16383 mkdir $DIR/$tdir/migrate_dir
16384 $LFS mkdir -i1 $DIR/$tdir/other_dir
16385 touch $DIR/$tdir/migrate_dir/a
16386 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
16387 ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
16388 ls $DIR/$tdir/other_dir
16390 # a should be migrated to MDT1, since no other links on MDT0
16391 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16392 error "#1 migrate dir fails"
16393 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir)
16394 [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
16395 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16396 [ $mdt_index == 1 ] || error "a is not on MDT1"
16398 # a should stay on MDT1, because it is a mulitple link file
16399 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16400 error "#2 migrate dir fails"
16401 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16402 [ $mdt_index == 1 ] || error "a is not on MDT1"
16404 $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
16405 error "#3 migrate dir fails"
16407 a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
16408 ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
16409 [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
16411 rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
16412 rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
16414 # a should be migrated to MDT0, since no other links on MDT1
16415 $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
16416 error "#4 migrate dir fails"
16417 mdt_index=$($LFS getstripe -m $DIR/$tdir/migrate_dir/a)
16418 [ $mdt_index == 0 ] || error "a is not on MDT0"
16420 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16422 run_test 230f "migrate mulitple remote link files"
16425 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16426 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16427 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16428 skip "Need MDS version at least 2.11.52"
16430 mkdir -p $DIR/$tdir/migrate_dir
16432 $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
16433 error "migrating dir to non-exist MDT succeeds"
16436 run_test 230g "migrate dir to non-exist MDT"
16439 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16440 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16441 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16442 skip "Need MDS version at least 2.11.52"
16446 mkdir -p $DIR/$tdir/migrate_dir
16448 $LFS migrate -m1 $DIR &&
16449 error "migrating mountpoint1 should fail"
16451 $LFS migrate -m1 $DIR/$tdir/.. &&
16452 error "migrating mountpoint2 should fail"
16455 $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. &&
16456 error "migrating $tdir/migrate_dir/.. should fail"
16460 run_test 230h "migrate .. and root"
16463 [ $PARALLEL == "yes" ] && skip "skip parallel run"
16464 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16465 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16466 skip "Need MDS version at least 2.11.52"
16468 mkdir -p $DIR/$tdir/migrate_dir
16470 $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
16471 error "migration fails with a tailing slash"
16473 $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
16474 error "migration fails with two tailing slashes"
16476 run_test 230i "lfs migrate -m tolerates trailing slashes"
16479 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16480 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
16481 skip "Need MDS version at least 2.11.52"
16483 $LFS mkdir -m 0 -c 1 $DIR/$tdir || error "mkdir $tdir failed"
16484 $LFS setstripe -E 1M -L mdt $DIR/$tdir/$tfile ||
16485 error "create $tfile failed"
16486 cat /etc/passwd > $DIR/$tdir/$tfile
16488 $LFS migrate -m 1 $DIR/$tdir
16490 cmp /etc/passwd $DIR/$tdir/$tfile ||
16491 error "DoM file mismatch after migration"
16493 run_test 230j "DoM file data not changed after dir migration"
16496 [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
16497 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16498 skip "Need MDS version at least 2.11.56"
16501 local files_on_starting_mdt=0
16503 $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
16504 $LFS getdirstripe $DIR/$tdir
16505 for i in $(seq $total); do
16506 echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
16507 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16508 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16511 echo "$files_on_starting_mdt files on MDT0"
16513 $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
16514 $LFS getdirstripe $DIR/$tdir
16516 files_on_starting_mdt=0
16517 for i in $(seq $total); do
16518 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16519 error "file $tfile.$i mismatch after migration"
16520 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
16521 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16524 echo "$files_on_starting_mdt files on MDT1 after migration"
16525 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
16527 $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
16528 $LFS getdirstripe $DIR/$tdir
16530 files_on_starting_mdt=0
16531 for i in $(seq $total); do
16532 $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
16533 error "file $tfile.$i mismatch after 2nd migration"
16534 [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
16535 files_on_starting_mdt=$((files_on_starting_mdt + 1))
16538 echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
16539 [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
16543 run_test 230k "file data not changed after dir migration"
16546 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16547 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16548 skip "Need MDS version at least 2.11.56"
16550 $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
16551 createmany -o $DIR/$tdir/f___________________________________ 1000 ||
16552 error "create files under remote dir failed $i"
16553 $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
16555 run_test 230l "readdir between MDTs won't crash"
16558 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
16559 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
16560 skip "Need MDS version at least 2.11.56"
16563 local mig_dir=$DIR/$tdir/migrate_dir
16564 local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
16568 echo "Creating files and dirs with xattrs"
16569 test_mkdir $DIR/$tdir
16570 test_mkdir -i0 -c1 $mig_dir
16572 setfattr -n user.attr1 -v $longstr $mig_dir/dir ||
16573 error "cannot set xattr attr1 on dir"
16574 setfattr -n user.attr2 -v $shortstr $mig_dir/dir ||
16575 error "cannot set xattr attr2 on dir"
16576 touch $mig_dir/dir/f0
16577 setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 ||
16578 error "cannot set xattr attr1 on file"
16579 setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 ||
16580 error "cannot set xattr attr2 on file"
16581 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16582 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16583 [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir"
16584 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16585 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir"
16586 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16587 [ "$val" = $longstr ] || error "xattr attr1 not set properly on file"
16588 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16589 [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file"
16591 echo "Migrating to MDT1"
16592 $LFS migrate -m $MDTIDX $mig_dir ||
16593 error "fails on migrating dir to MDT1"
16595 sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
16596 echo "Checking xattrs"
16597 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
16598 [ "$val" = $longstr ] ||
16599 error "expecting xattr1 $longstr on dir, found $val"
16600 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
16601 [ "$val" = $shortstr ] ||
16602 error "expecting xattr2 $shortstr on dir, found $val"
16603 val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
16604 [ "$val" = $longstr ] ||
16605 error "expecting xattr1 $longstr on file, found $val"
16606 val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
16607 [ "$val" = $shortstr ] ||
16608 error "expecting xattr2 $shortstr on file, found $val"
16610 run_test 230m "xattrs not changed after dir migration"
16613 [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
16614 [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs"
16615 [[ $MDS1_VERSION -ge $(version_code 2.12.5) ]] ||
16616 skip "Need MDS version at least 2.12.5"
16618 # maximum amount of local locks:
16619 # parent striped dir - 2 locks
16620 # new stripe in parent to migrate to - 1 lock
16621 # source and target - 2 locks
16622 # Total 5 locks for regular file
16623 mkdir -p $DIR/$tdir
16624 $LFS mkdir -i1 -c2 $DIR/$tdir/dir1
16625 touch $DIR/$tdir/dir1/eee
16627 # create 4 hardlink for 4 more locks
16628 # Total: 9 locks > RS_MAX_LOCKS (8)
16629 $LFS mkdir -i1 -c1 $DIR/$tdir/dir2
16630 $LFS mkdir -i1 -c1 $DIR/$tdir/dir3
16631 $LFS mkdir -i1 -c1 $DIR/$tdir/dir4
16632 $LFS mkdir -i1 -c1 $DIR/$tdir/dir5
16633 ln $DIR/$tdir/dir1/eee $DIR/$tdir/dir2/eee
16634 ln $DIR/$tdir/dir1/eee $DIR/$tdir/dir3/eee
16635 ln $DIR/$tdir/dir1/eee $DIR/$tdir/dir4/eee
16636 ln $DIR/$tdir/dir1/eee $DIR/$tdir/dir5/eee
16638 cancel_lru_locks mdc
16640 $LFS migrate -m1 -c1 $DIR/$tdir/dir1 ||
16641 error "migrate dir fails"
16643 rm -rf $DIR/$tdir || error "rm dir failed after migration"
16645 run_test 230r "migrate with too many local locks"
16649 # For simplicity this test assumes that max_pages_per_rpc
16650 # is the same across all OSCs
16651 local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
16652 local bulk_size=$((max_pages * PAGE_SIZE))
16653 local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
16656 mkdir -p $DIR/$tdir
16657 $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
16658 error "failed to set stripe with -S ${brw_size}M option"
16660 # clear the OSC stats
16661 $LCTL set_param osc.*.stats=0 &>/dev/null
16664 # Client writes $bulk_size - there must be 1 rpc for $max_pages.
16665 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
16666 oflag=direct &>/dev/null || error "dd failed"
16668 sync; sleep 1; sync # just to be safe
16669 local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
16670 if [ x$nrpcs != "x1" ]; then
16671 $LCTL get_param osc.*.stats
16672 error "found $nrpcs ost_write RPCs, not 1 as expected"
16676 # Drop the OSC cache, otherwise we will read from it
16677 cancel_lru_locks osc
16679 # clear the OSC stats
16680 $LCTL set_param osc.*.stats=0 &>/dev/null
16682 # Client reads $bulk_size.
16683 dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
16684 iflag=direct &>/dev/null || error "dd failed"
16686 nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
16687 if [ x$nrpcs != "x1" ]; then
16688 $LCTL get_param osc.*.stats
16689 error "found $nrpcs ost_read RPCs, not 1 as expected"
16692 run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
16695 mkdir -p $DIR/$tdir
16697 for i in {0..1023}; do
16698 dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
16699 seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
16700 error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
16704 run_test 231b "must not assert on fully utilized OST request buffer"
16707 mkdir -p $DIR/$tdir
16708 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16710 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16711 do_facet ost1 $LCTL set_param fail_loc=0x31c
16713 # ignore dd failure
16714 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
16716 do_facet ost1 $LCTL set_param fail_loc=0
16717 umount_client $MOUNT || error "umount failed"
16718 mount_client $MOUNT || error "mount failed"
16719 stop ost1 || error "cannot stop ost1"
16720 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16722 run_test 232a "failed lock should not block umount"
16725 [ $MDS1_VERSION -ge $(version_code 2.10.58) ] ||
16726 skip "Need MDS version at least 2.10.58"
16728 mkdir -p $DIR/$tdir
16729 $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
16730 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
16732 cancel_lru_locks osc
16734 #define OBD_FAIL_LDLM_OST_LVB 0x31c
16735 do_facet ost1 $LCTL set_param fail_loc=0x31c
16738 $LFS data_version $DIR/$tdir/$tfile || true
16740 do_facet ost1 $LCTL set_param fail_loc=0
16741 umount_client $MOUNT || error "umount failed"
16742 mount_client $MOUNT || error "mount failed"
16743 stop ost1 || error "cannot stop ost1"
16744 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
16746 run_test 232b "failed data version lock should not block umount"
16749 [ $MDS1_VERSION -ge $(version_code 2.3.64) ] ||
16750 skip "Need MDS version at least 2.3.64"
16751 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16753 local fid=$($LFS path2fid $MOUNT)
16755 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16756 error "cannot access $MOUNT using its FID '$fid'"
16758 run_test 233a "checking that OBF of the FS root succeeds"
16761 [ $MDS1_VERSION -ge $(version_code 2.5.90) ] ||
16762 skip "Need MDS version at least 2.5.90"
16763 [ -n "$FILESET" ] && skip_env "SKIP due to FILESET set"
16765 local fid=$($LFS path2fid $MOUNT/.lustre)
16767 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16768 error "cannot access $MOUNT/.lustre using its FID '$fid'"
16770 fid=$($LFS path2fid $MOUNT/.lustre/fid)
16771 stat $MOUNT/.lustre/fid/$fid > /dev/null ||
16772 error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
16774 run_test 233b "checking that OBF of the FS .lustre succeeds"
16777 local p="$TMP/sanityN-$TESTNAME.parameters"
16778 save_lustre_params client "llite.*.xattr_cache" > $p
16779 lctl set_param llite.*.xattr_cache 1 ||
16780 skip_env "xattr cache is not supported"
16782 mkdir -p $DIR/$tdir || error "mkdir failed"
16783 touch $DIR/$tdir/$tfile || error "touch failed"
16784 # OBD_FAIL_LLITE_XATTR_ENOMEM
16785 $LCTL set_param fail_loc=0x1405
16786 getfattr -n user.attr $DIR/$tdir/$tfile &&
16787 error "getfattr should have failed with ENOMEM"
16788 $LCTL set_param fail_loc=0x0
16791 restore_lustre_params < $p
16794 run_test 234 "xattr cache should not crash on ENOMEM"
16797 [ $MDS1_VERSION -lt $(version_code 2.4.52) ] &&
16798 skip "Need MDS version at least 2.4.52"
16800 flock_deadlock $DIR/$tfile
16805 124) error "process hangs on a deadlock"
16807 *) error "error executing flock_deadlock $DIR/$tfile"
16811 run_test 235 "LU-1715: flock deadlock detection does not work properly"
16815 check_swap_layouts_support
16817 local ref1=/etc/passwd
16818 local ref2=/etc/group
16819 local file1=$DIR/$tdir/f1
16820 local file2=$DIR/$tdir/f2
16822 test_mkdir -c1 $DIR/$tdir
16823 $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
16824 cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
16825 $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
16826 cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
16827 local fd=$(free_fd)
16828 local cmd="exec $fd<>$file2"
16831 $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
16832 error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
16835 cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
16840 run_test 236 "Layout swap on open unlinked file"
16842 # LU-4659 linkea consistency
16844 [[ $MDS1_VERSION -gt $(version_code 2.5.57) ]] ||
16845 [[ $MDS1_VERSION -gt $(version_code 2.5.1) &&
16846 $MDS1_VERSION -lt $(version_code 2.5.50) ]] ||
16847 skip "Need MDS version at least 2.5.58 or 2.5.2+"
16850 ln $DIR/$tfile $DIR/$tfile.lnk
16851 touch $DIR/$tfile.new
16852 mv $DIR/$tfile.new $DIR/$tfile
16853 local fid1=$($LFS path2fid $DIR/$tfile)
16854 local fid2=$($LFS path2fid $DIR/$tfile.lnk)
16855 local path1=$($LFS fid2path $FSNAME "$fid1")
16856 [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
16857 local path2=$($LFS fid2path $FSNAME "$fid2")
16858 [ $tfile.lnk == $path2 ] ||
16859 error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
16862 run_test 238 "Verify linkea consistency"
16864 test_239A() { # was test_239
16865 [ $MDS1_VERSION -lt $(version_code 2.5.60) ] &&
16866 skip "Need MDS version at least 2.5.60"
16868 local list=$(comma_list $(mdts_nodes))
16870 mkdir -p $DIR/$tdir
16871 createmany -o $DIR/$tdir/f- 5000
16872 unlinkmany $DIR/$tdir/f- 5000
16873 [ $MDS1_VERSION -gt $(version_code 2.10.4) ] &&
16874 do_nodes $list "lctl set_param -n osp.*.force_sync=1"
16875 changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
16876 osp.*MDT*.sync_in_flight" | calc_sum)
16877 [ "$changes" -eq 0 ] || error "$changes not synced"
16879 run_test 239A "osp_sync test"
16881 test_239a() { #LU-5297
16882 remote_mds_nodsh && skip "remote MDS with nodsh"
16885 #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
16886 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
16887 chgrp $RUNAS_GID $DIR/$tfile
16888 wait_delete_completed
16890 run_test 239a "process invalid osp sync record correctly"
16892 test_239b() { #LU-5297
16893 remote_mds_nodsh && skip "remote MDS with nodsh"
16896 #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
16897 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
16898 chgrp $RUNAS_GID $DIR/$tfile1
16899 wait_delete_completed
16900 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
16902 chgrp $RUNAS_GID $DIR/$tfile2
16903 wait_delete_completed
16905 run_test 239b "process osp sync record with ENOMEM error correctly"
16908 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
16909 remote_mds_nodsh && skip "remote MDS with nodsh"
16911 mkdir -p $DIR/$tdir
16913 $LFS mkdir -i 0 $DIR/$tdir/d0 ||
16914 error "failed to mkdir $DIR/$tdir/d0 on MDT0"
16915 $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
16916 error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
16918 umount_client $MOUNT || error "umount failed"
16919 #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
16920 do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
16921 mount_client $MOUNT || error "failed to mount client"
16923 echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
16924 stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
16926 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
16932 for LOOP in $(seq $count); do
16933 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 2>/dev/null
16934 cancel_lru_locks $OSC || true
16942 for LOOP in $(seq $1); do
16943 dd if=$DIR/$tfile of=/dev/null bs=$bsize count=1 iflag=direct \
16948 test_241a() { # was test_241
16949 local bsize=$PAGE_SIZE
16951 (( bsize < 40960 )) && bsize=40960
16952 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16954 cancel_lru_locks $OSC
16955 test_241_bio 1000 $bsize &
16957 test_241_dio 1000 $bsize
16960 run_test 241a "bio vs dio"
16963 local bsize=$PAGE_SIZE
16965 (( bsize < 40960 )) && bsize=40960
16966 dd if=/dev/zero of=$DIR/$tfile count=1 bs=$bsize
16968 test_241_dio 1000 $bsize &
16970 test_241_dio 1000 $bsize
16973 run_test 241b "dio vs dio"
16976 remote_mds_nodsh && skip "remote MDS with nodsh"
16978 mkdir -p $DIR/$tdir
16979 touch $DIR/$tdir/$tfile
16981 #define OBD_FAIL_MDS_READPAGE_PACK 0x105
16982 do_facet mds1 lctl set_param fail_loc=0x105
16983 /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail"
16985 do_facet mds1 lctl set_param fail_loc=0
16986 /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed"
16988 run_test 242 "mdt_readpage failure should not cause directory unreadable"
16992 test_mkdir $DIR/$tdir
16993 group_lock_test -d $DIR/$tdir || error "A group lock test failed"
16995 run_test 243 "various group lock tests"
16999 test_mkdir $DIR/$tdir
17000 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
17001 sendfile_grouplock $DIR/$tdir/$tfile || \
17002 error "sendfile+grouplock failed"
17005 run_test 244 "sendfile with group lock tests"
17008 local flagname="multi_mod_rpcs"
17009 local connect_data_name="max_mod_rpcs"
17012 # check if multiple modify RPCs flag is set
17013 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
17014 grep "connect_flags:")
17017 echo "$out" | grep -qw $flagname
17018 if [ $? -ne 0 ]; then
17019 echo "connect flag $flagname is not set"
17023 # check if multiple modify RPCs data is set
17024 out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
17027 echo "$out" | grep -qw $connect_data_name ||
17028 error "import should have connect data $connect_data_name"
17030 run_test 245 "check mdc connection flag/data: multiple modify RPCs"
17032 test_246() { # LU-7371
17033 remote_ost_nodsh && skip "remote OST with nodsh"
17034 [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
17035 skip "Need OST version >= 2.7.62"
17037 do_facet ost1 $LCTL set_param fail_val=4095
17038 #define OBD_FAIL_OST_READ_SIZE 0x234
17039 do_facet ost1 $LCTL set_param fail_loc=0x234
17040 $LFS setstripe $DIR/$tfile -i 0 -c 1
17041 dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
17042 cancel_lru_locks $FSNAME-OST0000
17043 dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
17045 run_test 246 "Read file of size 4095 should return right length"
17051 umount_client $submount
17056 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
17058 skip_env "Fileset feature is not supported"
17060 local submount=${MOUNT}_$tdir
17063 mkdir -p $submount || error "mkdir $submount failed"
17064 FILESET="$FILESET/$tdir" mount_client $submount ||
17065 error "mount $submount failed"
17066 trap "cleanup_247 $submount" EXIT
17067 echo foo > $submount/$tfile || error "write $submount/$tfile failed"
17068 [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
17069 error "read $MOUNT/$tdir/$tfile failed"
17070 cleanup_247 $submount
17072 run_test 247a "mount subdir as fileset"
17075 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
17076 skip_env "Fileset feature is not supported"
17078 local submount=${MOUNT}_$tdir
17080 rm -rf $MOUNT/$tdir
17081 mkdir -p $submount || error "mkdir $submount failed"
17083 FILESET="$FILESET/$tdir" mount_client $submount &&
17084 error "mount $submount should fail"
17087 run_test 247b "mount subdir that dose not exist"
17090 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
17091 skip_env "Fileset feature is not supported"
17093 local submount=${MOUNT}_$tdir
17095 mkdir -p $MOUNT/$tdir/dir1
17096 mkdir -p $submount || error "mkdir $submount failed"
17097 trap "cleanup_247 $submount" EXIT
17098 FILESET="$FILESET/$tdir" mount_client $submount ||
17099 error "mount $submount failed"
17100 local fid=$($LFS path2fid $MOUNT/)
17101 $LFS fid2path $submount $fid && error "fid2path should fail"
17102 cleanup_247 $submount
17104 run_test 247c "running fid2path outside root"
17107 lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree ||
17108 skip "Fileset feature is not supported"
17110 local submount=${MOUNT}_$tdir
17112 mkdir -p $MOUNT/$tdir/dir1
17113 mkdir -p $submount || error "mkdir $submount failed"
17114 FILESET="$FILESET/$tdir" mount_client $submount ||
17115 error "mount $submount failed"
17116 trap "cleanup_247 $submount" EXIT
17117 local fid=$($LFS path2fid $submount/dir1)
17118 $LFS fid2path $submount $fid || error "fid2path should succeed"
17119 cleanup_247 $submount
17121 run_test 247d "running fid2path inside root"
17125 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
17127 skip "Fileset feature is not supported"
17129 local submount=${MOUNT}_$tdir
17132 mkdir -p $submount || error "mkdir $submount failed"
17133 FILESET="$FILESET/.." mount_client $submount &&
17134 error "mount $submount should fail"
17137 run_test 247e "mount .. as fileset"
17140 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
17141 [ $MDS1_VERSION -lt $(version_code 2.12.6) ] &&
17142 skip "Need at least version 2.12.6"
17143 [ $CLIENT_VERSION -lt $(version_code 2.12.6) ] &&
17144 skip "Need at least version 2.12.6"
17145 lctl get_param -n mdc.$FSNAME-MDT0000*.import |
17147 skip "Fileset feature is not supported"
17149 mkdir $DIR/$tdir || error "mkdir $tdir failed"
17150 $LFS mkdir -i $((MDSCOUNT - 1)) $DIR/$tdir/remote ||
17151 error "mkdir remote failed"
17152 mkdir $DIR/$tdir/remote/subdir || error "mkdir remote/subdir failed"
17153 $LFS mkdir -i 0 -c $MDSCOUNT $DIR/$tdir/striped ||
17154 error "mkdir striped failed"
17155 mkdir $DIR/$tdir/striped/subdir || error "mkdir striped/subdir failed"
17157 local submount=${MOUNT}_$tdir
17159 mkdir -p $submount || error "mkdir $submount failed"
17160 stack_trap "rmdir $submount"
17164 local fileset=$FILESET
17165 local mdts=$(comma_list $(mdts_nodes))
17167 stat=$(do_facet mds1 $LCTL get_param -n \
17168 mdt.*MDT0000.enable_remote_subdir_mount)
17169 stack_trap "do_nodes $mdts $LCTL set_param \
17170 mdt.*.enable_remote_subdir_mount=$stat"
17172 do_nodes $mdts "$LCTL set_param mdt.*.enable_remote_subdir_mount=0"
17173 stack_trap "umount_client $submount"
17174 FILESET="$fileset/$tdir/remote" mount_client $submount &&
17175 error "mount remote dir $dir should fail"
17177 for dir in $tdir/remote/subdir $tdir/striped $tdir/striped/subdir \
17178 $tdir/striped/. ; do
17179 FILESET="$fileset/$dir" mount_client $submount ||
17180 error "mount $dir failed"
17181 umount_client $submount
17184 do_nodes $mdts "$LCTL set_param mdt.*.enable_remote_subdir_mount=1"
17185 FILESET="$fileset/$tdir/remote" mount_client $submount ||
17186 error "mount $tdir/remote failed"
17188 run_test 247f "mount striped or remote directory as fileset"
17191 [ $MDSCOUNT -lt 4 ] && skip_env "needs >= 4 MDTs"
17192 [ $CLIENT_VERSION -lt $(version_code 2.12.6) ] &&
17193 skip "Need at least version 2.12.6"
17195 $LFS mkdir -i 0 -c 4 -H fnv_1a_64 $DIR/$tdir ||
17196 error "mkdir $tdir failed"
17197 touch $DIR/$tdir/$tfile || error "touch $tfile failed"
17199 local submount=${MOUNT}_$tdir
17201 mkdir -p $submount || error "mkdir $submount failed"
17202 stack_trap "rmdir $submount"
17204 FILESET="$fileset/$tdir" mount_client $submount ||
17205 error "mount $dir failed"
17206 stack_trap "umount $submount"
17208 local mdts=$(comma_list $(mdts_nodes))
17212 stat $submount > /dev/null
17213 cancel_lru_locks $MDC
17214 stat $submount > /dev/null
17215 stat $submount/$tfile > /dev/null
17216 do_nodes $mdts "$LCTL set_param mdt.*.md_stats=clear > /dev/null"
17217 stat $submount/$tfile > /dev/null
17218 nrpcs=$(do_nodes $mdts "lctl get_param -n mdt.*.md_stats" |
17219 awk '/getattr/ {sum += $2} END {print sum}')
17221 [ -z "$nrpcs" ] || error "$nrpcs extra getattr sent"
17223 run_test 247g "mount striped directory as fileset caches ROOT lookup lock"
17226 local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
17227 [ -z "$fast_read_sav" ] && skip "no fast read support"
17229 # create a large file for fast read verification
17230 dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
17232 # make sure the file is created correctly
17233 $CHECKSTAT -s $((128*1024*1024)) $DIR/$tfile ||
17234 { rm -f $DIR/$tfile; skip "file creation error"; }
17236 echo "Test 1: verify that fast read is 4 times faster on cache read"
17238 # small read with fast read enabled
17239 $LCTL set_param -n llite.*.fast_read=1
17240 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
17241 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17242 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17243 # small read with fast read disabled
17244 $LCTL set_param -n llite.*.fast_read=0
17245 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
17246 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17247 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17249 # verify that fast read is 4 times faster for cache read
17250 [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
17251 error_not_in_vm "fast read was not 4 times faster: " \
17252 "$t_fast vs $t_slow"
17254 echo "Test 2: verify the performance between big and small read"
17255 $LCTL set_param -n llite.*.fast_read=1
17257 # 1k non-cache read
17258 cancel_lru_locks osc
17259 local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17260 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17261 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17263 # 1M non-cache read
17264 cancel_lru_locks osc
17265 local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
17266 egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
17267 sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
17269 # verify that big IO is not 4 times faster than small IO
17270 [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
17271 error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
17273 $LCTL set_param -n llite.*.fast_read=$fast_read_sav
17276 run_test 248 "fast read verification"
17278 test_249() { # LU-7890
17279 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
17280 skip "Need at least version 2.8.54"
17283 $SETSTRIPE -c 1 $DIR/$tfile
17284 # Offset 2T == 4k * 512M
17285 dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 seek=512M ||
17286 error "dd to 2T offset failed"
17288 run_test 249 "Write above 2T file size"
17291 [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
17292 && skip "no 16TB file size limit on ZFS"
17294 $SETSTRIPE -c 1 $DIR/$tfile
17295 # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
17296 local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
17297 $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
17298 dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
17299 conv=notrunc,fsync && error "append succeeded"
17302 run_test 250 "Write above 16T limit"
17305 $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile
17307 #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
17308 #Skip once - writing the first stripe will succeed
17309 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17310 $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
17311 error "short write happened"
17313 $LCTL set_param fail_loc=0xa0001407 fail_val=1
17314 $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
17315 error "short read happened"
17319 run_test 251 "Handling short read and write correctly"
17322 remote_mds_nodsh && skip "remote MDS with nodsh"
17323 remote_ost_nodsh && skip "remote OST with nodsh"
17324 if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then
17325 skip_env "ldiskfs only test"
17335 # check lr_reader on OST0000
17337 dev=$(facet_device $tgt)
17338 out=$(do_facet $tgt $LR_READER $dev)
17339 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17341 uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
17342 [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
17343 error "Invalid uuid returned by $LR_READER on target $tgt"
17344 echo -e "uuid returned by $LR_READER is '$uuid'\n"
17346 # check lr_reader -c on MDT0000
17348 dev=$(facet_device $tgt)
17349 if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
17350 skip "$LR_READER does not support additional options"
17352 out=$(do_facet $tgt $LR_READER -c $dev)
17353 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17355 num=$(echo "$out" | grep -c "mdtlov")
17356 [ "$num" -eq $((MDSCOUNT - 1)) ] ||
17357 error "Invalid number of mdtlov clients returned by $LR_READER"
17358 echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
17360 # check lr_reader -cr on MDT0000
17361 out=$(do_facet $tgt $LR_READER -cr $dev)
17362 [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
17364 echo "$out" | grep -q "^reply_data:$" ||
17365 error "$LR_READER should have returned 'reply_data' section"
17366 num=$(echo "$out" | grep -c "client_generation")
17367 echo -e "Number of reply data returned by $LR_READER is '$num'\n"
17369 run_test 252 "check lr_reader tool"
17371 test_253_fill_ost() {
17372 local size_mb #how many MB should we write to pass watermark
17373 local lwm=$3 #low watermark
17374 local free_10mb #10% of free space
17376 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17377 size_mb=$((free_kb / 1024 - lwm))
17378 free_10mb=$((free_kb / 10240))
17379 #If 10% of free space cross low watermark use it
17380 if (( free_10mb > size_mb )); then
17383 #At least we need to store 1.1 of difference between
17384 #free space and low watermark
17385 size_mb=$((size_mb + size_mb / 10))
17387 if (( lwm <= $((free_kb / 1024)) )) || [ ! -f $DIR/$tdir/1 ]; then
17388 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M count=$size_mb \
17389 oflag=append conv=notrunc
17394 free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }')
17395 echo "OST still has $((free_kb / 1024)) mbytes free"
17399 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17400 remote_mds_nodsh && skip "remote MDS with nodsh"
17401 remote_mgs_nodsh && skip "remote MGS with nodsh"
17406 local ost_name=$($LFS osts |
17407 sed -n 's/^'$ostidx': \(.*\)_UUID .*/\1/p')
17409 local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name)
17410 do_facet $SINGLEMDS $LCTL get_param -n \
17411 osp.$mdtosc_proc1.reserved_mb_high ||
17412 skip "remote MDS does not support reserved_mb_high"
17416 wait_delete_completed
17419 local last_wm_h=$(do_facet $SINGLEMDS $LCTL get_param -n \
17420 osp.$mdtosc_proc1.reserved_mb_high)
17421 local last_wm_l=$(do_facet $SINGLEMDS $LCTL get_param -n \
17422 osp.$mdtosc_proc1.reserved_mb_low)
17423 echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l"
17425 create_pool $FSNAME.$TESTNAME || error "Pool creation failed"
17426 do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name ||
17427 error "Adding $ost_name to pool failed"
17429 # Wait for client to see a OST at pool
17430 wait_update $HOSTNAME "$LCTL get_param -n
17431 lov.$FSNAME-*.pools.$TESTNAME | sort -u |
17432 grep $ost_name" "$ost_name""_UUID" $((TIMEOUT/2)) ||
17433 error "Client can not see the pool"
17434 $SETSTRIPE $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME ||
17435 error "Setstripe failed"
17437 dd if=/dev/zero of=$DIR/$tdir/0 bs=1M count=10
17438 local blocks=$($LFS df $MOUNT | grep $ost_name | awk '{ print $4 }')
17439 echo "OST still has $((blocks/1024)) mbytes free"
17441 local new_lwm=$((blocks/1024-10))
17442 do_facet $SINGLEMDS $LCTL set_param \
17443 osp.$mdtosc_proc1.reserved_mb_high=$((new_lwm+5))
17444 do_facet $SINGLEMDS $LCTL set_param \
17445 osp.$mdtosc_proc1.reserved_mb_low=$new_lwm
17447 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17449 #First enospc could execute orphan deletion so repeat.
17450 test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm
17452 local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17453 osp.$mdtosc_proc1.prealloc_status)
17454 echo "prealloc_status $oa_status"
17456 dd if=/dev/zero of=$DIR/$tdir/2 bs=1M count=1 &&
17457 error "File creation should fail"
17458 #object allocation was stopped, but we still able to append files
17459 dd if=/dev/zero of=$DIR/$tdir/1 bs=1M seek=6 count=5 oflag=append ||
17460 error "Append failed"
17461 rm -f $DIR/$tdir/1 $DIR/$tdir/0 $DIR/$tdir/r*
17463 wait_delete_completed
17467 for i in $(seq 10 12); do
17468 dd if=/dev/zero of=$DIR/$tdir/$i bs=1M count=1 2>/dev/null ||
17469 error "File creation failed after rm";
17472 oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \
17473 osp.$mdtosc_proc1.prealloc_status)
17474 echo "prealloc_status $oa_status"
17476 if (( oa_status != 0 )); then
17477 error "Object allocation still disable after rm"
17479 do_facet $SINGLEMDS $LCTL set_param \
17480 osp.$mdtosc_proc1.reserved_mb_high=$last_wm_h
17481 do_facet $SINGLEMDS $LCTL set_param \
17482 osp.$mdtosc_proc1.reserved_mb_low=$last_wm_l
17485 do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $ost_name ||
17486 error "Remove $ost_name from pool failed"
17487 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
17488 error "Pool destroy fialed"
17490 run_test 253 "Check object allocation limit"
17493 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17494 remote_mds_nodsh && skip "remote MDS with nodsh"
17495 do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_size ||
17496 skip "MDS does not support changelog_size"
17499 local MDT0=$(facet_svc $SINGLEMDS)
17501 changelog_register || error "changelog_register failed"
17503 changelog_clear 0 || error "changelog_clear failed"
17505 local size1=$(do_facet $SINGLEMDS \
17506 $LCTL get_param -n mdd.$MDT0.changelog_size)
17507 echo "Changelog size $size1"
17510 $LFS mkdir -i 0 $DIR/$tdir
17512 mkdir -p $DIR/$tdir/pics/2008/zachy
17513 touch $DIR/$tdir/pics/2008/zachy/timestamp
17514 cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
17515 mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
17516 ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
17517 ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
17518 rm $DIR/$tdir/pics/desktop.jpg
17520 local size2=$(do_facet $SINGLEMDS \
17521 $LCTL get_param -n mdd.$MDT0.changelog_size)
17522 echo "Changelog size after work $size2"
17524 (( $size2 > $size1 )) ||
17525 error "new Changelog size=$size2 less than old size=$size1"
17527 run_test 254 "Check changelog size"
17534 lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
17535 awk -F: '{print $2}' | grep $type > /dev/null
17536 if [ $? -ne 0 ]; then
17546 lfs ladvise -a willread $file > /dev/null 2>&1
17547 if [ $? -eq 0 ]; then
17551 lfs ladvise -a willread $file 2>&1 |
17552 grep "Inappropriate ioctl for device" > /dev/null
17553 if [ $? -eq 0 ]; then
17560 bc <<<"scale=2; ($1 - $2) * 100 / $2"
17563 # run a random read IO workload
17564 # usage: random_read_iops <filename> <filesize> <iosize>
17565 random_read_iops() {
17568 local iosize=${3:-4096}
17570 $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
17571 sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
17574 drop_file_oss_cache() {
17578 $LFS ladvise -a dontneed $file 2>/dev/null ||
17579 do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
17582 ladvise_willread_performance()
17585 local average_origin=0
17586 local average_cache=0
17587 local average_ladvise=0
17589 for ((i = 1; i <= $repeat; i++)); do
17590 echo "Iter $i/$repeat: reading without willread hint"
17591 cancel_lru_locks osc
17592 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17593 local speed_origin=$(random_read_iops $DIR/$tfile $size)
17594 echo "Iter $i/$repeat: uncached speed: $speed_origin"
17595 average_origin=$(bc <<<"$average_origin + $speed_origin")
17597 cancel_lru_locks osc
17598 local speed_cache=$(random_read_iops $DIR/$tfile $size)
17599 echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
17600 average_cache=$(bc <<<"$average_cache + $speed_cache")
17602 cancel_lru_locks osc
17603 drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
17604 $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
17605 local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
17606 echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
17607 average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
17609 average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
17610 average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
17611 average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
17613 speedup_cache=$(percent $average_cache $average_origin)
17614 speedup_ladvise=$(percent $average_ladvise $average_origin)
17616 echo "Average uncached read: $average_origin"
17617 echo "Average speedup with OSS cached read: " \
17618 "$average_cache = +$speedup_cache%"
17619 echo "Average speedup with ladvise willread: " \
17620 "$average_ladvise = +$speedup_ladvise%"
17622 local lowest_speedup=20
17623 if [ ${average_cache%.*} -lt $lowest_speedup ]; then
17624 echo "Speedup with OSS cached read less than $lowest_speedup%," \
17625 "got $average_cache%. Skipping ladvise willread check."
17629 # the test won't work on ZFS until it supports 'ladvise dontneed', but
17630 # it is still good to run until then to exercise 'ladvise willread'
17631 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17632 [ "$ost1_FSTYPE" = "zfs" ] &&
17633 echo "osd-zfs does not support dontneed or drop_caches" &&
17636 lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
17637 [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
17638 error_not_in_vm "Speedup with willread is less than " \
17639 "$lowest_speedup%, got $average_ladvise%"
17643 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17644 skip "lustre < 2.8.54 does not support ladvise "
17645 remote_ost_nodsh && skip "remote OST with nodsh"
17647 lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
17649 ladvise_no_type willread $DIR/$tfile &&
17650 skip "willread ladvise is not supported"
17652 ladvise_no_ioctl $DIR/$tfile &&
17653 skip "ladvise ioctl is not supported"
17656 local size=$((size_mb * 1048576))
17657 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17658 error "dd to $DIR/$tfile failed"
17660 lfs ladvise -a willread $DIR/$tfile ||
17661 error "Ladvise failed with no range argument"
17663 lfs ladvise -a willread -s 0 $DIR/$tfile ||
17664 error "Ladvise failed with no -l or -e argument"
17666 lfs ladvise -a willread -e 1 $DIR/$tfile ||
17667 error "Ladvise failed with only -e argument"
17669 lfs ladvise -a willread -l 1 $DIR/$tfile ||
17670 error "Ladvise failed with only -l argument"
17672 lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
17673 error "End offset should not be smaller than start offset"
17675 lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
17676 error "End offset should not be equal to start offset"
17678 lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
17679 error "Ladvise failed with overflowing -s argument"
17681 lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
17682 error "Ladvise failed with overflowing -e argument"
17684 lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
17685 error "Ladvise failed with overflowing -l argument"
17687 lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
17688 error "Ladvise succeeded with conflicting -l and -e arguments"
17690 echo "Synchronous ladvise should wait"
17692 #define OBD_FAIL_OST_LADVISE_PAUSE 0x237
17693 do_nodes $(comma_list $(osts_nodes)) \
17694 $LCTL set_param fail_val=$delay fail_loc=0x237
17696 local start_ts=$SECONDS
17697 lfs ladvise -a willread $DIR/$tfile ||
17698 error "Ladvise failed with no range argument"
17699 local end_ts=$SECONDS
17700 local inteval_ts=$((end_ts - start_ts))
17702 if [ $inteval_ts -lt $(($delay - 1)) ]; then
17703 error "Synchronous advice didn't wait reply"
17706 echo "Asynchronous ladvise shouldn't wait"
17707 local start_ts=$SECONDS
17708 lfs ladvise -a willread -b $DIR/$tfile ||
17709 error "Ladvise failed with no range argument"
17710 local end_ts=$SECONDS
17711 local inteval_ts=$((end_ts - start_ts))
17713 if [ $inteval_ts -gt $(($delay / 2)) ]; then
17714 error "Asynchronous advice blocked"
17717 do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
17718 ladvise_willread_performance
17720 run_test 255a "check 'lfs ladvise -a willread'"
17726 do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
17730 [ $OST1_VERSION -lt $(version_code 2.8.54) ] &&
17731 skip "lustre < 2.8.54 does not support ladvise "
17732 remote_ost_nodsh && skip "remote OST with nodsh"
17734 lfs setstripe -c 1 -i 0 $DIR/$tfile
17736 ladvise_no_type dontneed $DIR/$tfile &&
17737 skip "dontneed ladvise is not supported"
17739 ladvise_no_ioctl $DIR/$tfile &&
17740 skip "ladvise ioctl is not supported"
17742 ! $LFS ladvise -a dontneed $DIR/$tfile &&
17743 [ "$ost1_FSTYPE" = "zfs" ] &&
17744 skip "zfs-osd does not support 'ladvise dontneed'"
17747 local size=$((size_mb * 1048576))
17748 # In order to prevent disturbance of other processes, only check 3/4
17749 # of the memory usage
17750 local kibibytes=$((size_mb * 1024 * 3 / 4))
17752 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
17753 error "dd to $DIR/$tfile failed"
17755 #force write to complete before dropping OST cache & checking memory
17758 local total=$(facet_meminfo ost1 MemTotal)
17759 echo "Total memory: $total KiB"
17761 do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
17762 local before_read=$(facet_meminfo ost1 Cached)
17763 echo "Cache used before read: $before_read KiB"
17765 lfs ladvise -a willread $DIR/$tfile ||
17766 error "Ladvise willread failed"
17767 local after_read=$(facet_meminfo ost1 Cached)
17768 echo "Cache used after read: $after_read KiB"
17770 lfs ladvise -a dontneed $DIR/$tfile ||
17771 error "Ladvise dontneed again failed"
17772 local no_read=$(facet_meminfo ost1 Cached)
17773 echo "Cache used after dontneed ladvise: $no_read KiB"
17775 if [ $total -lt $((before_read + kibibytes)) ]; then
17776 echo "Memory is too small, abort checking"
17780 if [ $((before_read + kibibytes)) -gt $after_read ]; then
17781 error "Ladvise willread should use more memory" \
17782 "than $kibibytes KiB"
17785 if [ $((no_read + kibibytes)) -gt $after_read ]; then
17786 error "Ladvise dontneed should release more memory" \
17787 "than $kibibytes KiB"
17790 run_test 255b "check 'lfs ladvise -a dontneed'"
17793 [ $OST1_VERSION -lt $(version_code 2.10.50) ] &&
17794 skip "lustre < 2.10.50 does not support lockahead"
17802 test_mkdir -p $DIR/$tdir
17803 $SETSTRIPE -i 0 $DIR/$tdir
17805 #test 10 returns only success/failure
17807 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17809 if [ $rc -eq 255 ]; then
17810 error "Ladvise test${i} failed, ${rc}"
17813 #test 11 counts lock enqueue requests, all others count new locks
17815 count=$(do_facet ost1 \
17816 $LCTL get_param -n ost.OSS.ost.stats)
17817 count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
17819 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17821 if [ $rc -eq 255 ]; then
17822 error "Ladvise test${i} failed, ${rc}"
17825 new_count=$(do_facet ost1 \
17826 $LCTL get_param -n ost.OSS.ost.stats)
17827 new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
17828 awk '{ print $2 }')
17830 difference="$((new_count - count))"
17831 if [ $difference -ne $rc ]; then
17832 error "Ladvise test${i}, bad enqueue count, returned " \
17833 "${rc}, actual ${difference}"
17836 for i in $(seq 12 21); do
17837 # If we do not do this, we run the risk of having too many
17838 # locks and starting lock cancellation while we are checking
17840 cancel_lru_locks osc
17842 count=$($LCTL get_param -n \
17843 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17845 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17847 if [ $rc -eq 255 ]; then
17848 error "Ladvise test ${i} failed, ${rc}"
17851 new_count=$($LCTL get_param -n \
17852 ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count)
17853 difference="$((new_count - count))"
17855 # Test 15 output is divided by 100 to map down to valid return
17856 if [ $i -eq 15 ]; then
17860 if [ $difference -ne $rc ]; then
17861 error "Ladvise test ${i}, bad lock count, returned " \
17862 "${rc}, actual ${difference}"
17866 #test 22 returns only success/failure
17868 lockahead_test -d $DIR/$tdir -t $i -f $tfile
17870 if [ $rc -eq 255 ]; then
17871 error "Ladvise test${i} failed, ${rc}"
17874 run_test 255c "suite of ladvise lockahead tests"
17877 [ $PARALLEL == "yes" ] && skip "skip parallel run"
17878 remote_mds_nodsh && skip "remote MDS with nodsh"
17879 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17880 changelog_users $SINGLEMDS | grep "^cl" &&
17881 skip "active changelog user"
17887 mdt_dev=$(mdsdevname 1)
17890 changelog_register || error "changelog_register failed"
17893 mkdir -p $DIR/$tdir
17895 changelog_clear 0 || error "changelog_clear failed"
17898 touch $DIR/$tdir/{1..10}
17901 stop $SINGLEMDS || error "Fail to stop MDT"
17905 start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
17907 #after mount new plainllog is used
17908 touch $DIR/$tdir/{11..19}
17909 local tmpfile=$(mktemp -u $tfile.XXXXXX)
17910 cat_sl=$(do_facet $SINGLEMDS "sync; \
17911 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17912 llog_reader $tmpfile | grep -c type=1064553b")
17913 do_facet $SINGLEMDS llog_reader $tmpfile
17915 [ $cat_sl != 2 ] && error "Changelog catalog has $cat_sl != 2 slots"
17917 changelog_clear 0 || error "changelog_clear failed"
17919 cat_sl=$(do_facet $SINGLEMDS "sync; \
17920 $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \
17921 llog_reader $tmpfile | grep -c type=1064553b; rm -f $tmpfile")
17923 if (( cat_sl == 2 )); then
17924 error "Empty plain llog was not deleted from changelog catalog"
17925 elif (( cat_sl != 1 )); then
17926 error "Active plain llog shouldn't be deleted from catalog"
17929 run_test 256 "Check llog delete for empty and not full state"
17932 remote_mds_nodsh && skip "remote MDS with nodsh"
17933 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
17934 skip "Need MDS version at least 2.8.55"
17936 test_mkdir $DIR/$tdir
17938 setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
17939 error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
17942 #define OBD_FAIL_MDS_XATTR_REP 0x161
17943 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
17944 local facet=mds$((mdtidx + 1))
17945 set_nodes_failloc $(facet_active_host $facet) 0x80000161
17946 getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
17948 stop $facet || error "stop MDS failed"
17949 start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
17950 error "start MDS fail"
17952 run_test 257 "xattr locks are not lost"
17954 # Verify we take the i_mutex when security requires it
17956 #define OBD_FAIL_IMUTEX_SEC 0x141c
17957 $LCTL set_param fail_loc=0x141c
17959 chmod u+s $DIR/$tfile
17960 chmod a+rwx $DIR/$tfile
17961 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17963 if [ $RC -ne 0 ]; then
17964 error "error, failed to take i_mutex, rc=$?"
17968 run_test 258a "verify i_mutex security behavior when suid attributes is set"
17970 # Verify we do NOT take the i_mutex in the normal case
17972 #define OBD_FAIL_IMUTEX_NOSEC 0x141d
17973 $LCTL set_param fail_loc=0x141d
17976 chmod a+rw $DIR/$tfile
17977 $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
17979 if [ $RC -ne 0 ]; then
17980 error "error, took i_mutex unnecessarily, rc=$?"
17985 run_test 258b "verify i_mutex security behavior"
17988 local file=$DIR/$tfile
17992 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip "ldiskfs only test"
17994 stack_trap "rm -f $file" EXIT
17996 wait_delete_completed
17997 before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
17998 echo "before: $before"
18000 $LFS setstripe -i 0 -c 1 $file
18001 dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write"
18003 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
18004 echo "after write: $after"
18006 #define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301
18007 do_facet ost1 $LCTL set_param fail_loc=0x2301
18009 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
18010 echo "after truncate: $after"
18013 do_facet ost1 $LCTL set_param fail_loc=0
18014 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1"
18016 after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree")
18017 echo "after restart: $after"
18018 [ $((after - before)) -ge $(fs_log_size ost1) ] &&
18019 error "missing truncate?"
18023 run_test 259 "crash at delayed truncate"
18026 #define OBD_FAIL_MDC_CLOSE 0x806
18027 $LCTL set_param fail_loc=0x80000806
18031 run_test 260 "Check mdc_close fail"
18033 ### Data-on-MDT sanity tests ###
18035 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18036 skip "Need MDS version at least 2.10.55 for DoM"
18039 local dom=$DIR/$tdir/dom_file
18040 local tmp=$DIR/$tdir/tmp_file
18042 mkdir -p $DIR/$tdir
18044 # basic checks for DoM component creation
18045 $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
18046 error "Can set MDT layout to non-first entry"
18048 $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
18049 error "Can define multiple entries as MDT layout"
18051 $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
18053 [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
18054 [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
18055 [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
18057 local mdtidx=$($LFS getstripe -m $dom)
18058 local mdtname=MDT$(printf %04x $mdtidx)
18059 local facet=mds$((mdtidx + 1))
18060 local space_check=1
18062 # Skip free space checks with ZFS
18063 [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
18067 local size_tmp=$((65536 * 3))
18068 local mdtfree1=$(do_facet $facet \
18069 lctl get_param -n osd*.*$mdtname.kbytesfree)
18071 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
18072 # check also direct IO along write
18073 # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
18074 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
18076 cmp $tmp $dom || error "file data is different"
18077 [ $(stat -c%s $dom) == $size_tmp ] ||
18078 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
18079 if [ $space_check == 1 ]; then
18080 local mdtfree2=$(do_facet $facet \
18081 lctl get_param -n osd*.*$mdtname.kbytesfree)
18083 # increase in usage from by $size_tmp
18084 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
18085 error "MDT free space wrong after write: " \
18086 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
18090 local size_dom=10000
18092 $TRUNCATE $dom $size_dom
18093 [ $(stat -c%s $dom) == $size_dom ] ||
18094 error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
18095 if [ $space_check == 1 ]; then
18096 mdtfree1=$(do_facet $facet \
18097 lctl get_param -n osd*.*$mdtname.kbytesfree)
18098 # decrease in usage from $size_tmp to new $size_dom
18099 [ $(($mdtfree1 - $mdtfree2)) -ge \
18100 $(((size_tmp - size_dom) / 1024)) ] ||
18101 error "MDT free space is wrong after truncate: " \
18102 "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
18108 size_dom=$((size_dom + size_tmp))
18109 [ $(stat -c%s $dom) == $size_dom ] ||
18110 error "bad size after append: $(stat -c%s $dom) != $size_dom"
18111 if [ $space_check == 1 ]; then
18112 mdtfree2=$(do_facet $facet \
18113 lctl get_param -n osd*.*$mdtname.kbytesfree)
18114 # increase in usage by $size_tmp from previous
18115 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
18116 error "MDT free space is wrong after append: " \
18117 "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
18122 if [ $space_check == 1 ]; then
18123 mdtfree1=$(do_facet $facet \
18124 lctl get_param -n osd*.*$mdtname.kbytesfree)
18125 # decrease in usage by $size_dom from previous
18126 [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
18127 error "MDT free space is wrong after removal: " \
18128 "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
18131 # combined striping
18132 $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
18133 error "Can't create DoM + OST striping"
18135 size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
18136 dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
18137 # check also direct IO along write
18138 dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
18140 cmp $tmp $dom || error "file data is different"
18141 [ $(stat -c%s $dom) == $size_tmp ] ||
18142 error "bad size after write: $(stat -c%s $dom) != $size_tmp"
18147 run_test 270a "DoM: basic functionality tests"
18150 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18151 skip "Need MDS version at least 2.10.55"
18153 local dom=$DIR/$tdir/dom_file
18154 local max_size=1048576
18156 mkdir -p $DIR/$tdir
18157 $LFS setstripe -E $max_size -L mdt $dom
18159 # truncate over the limit
18160 $TRUNCATE $dom $(($max_size + 1)) &&
18161 error "successful truncate over the maximum size"
18162 # write over the limit
18163 dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
18164 error "successful write over the maximum size"
18165 # append over the limit
18166 dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
18167 echo "12345" >> $dom && error "successful append over the maximum size"
18172 run_test 270b "DoM: maximum size overflow checks for DoM-only file"
18175 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18176 skip "Need MDS version at least 2.10.55"
18178 mkdir -p $DIR/$tdir
18179 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18181 # check files inherit DoM EA
18182 touch $DIR/$tdir/first
18183 [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] ||
18184 error "bad pattern"
18185 [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
18186 error "bad stripe count"
18187 [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
18188 error "bad stripe size"
18190 # check directory inherits DoM EA and uses it as default
18191 mkdir $DIR/$tdir/subdir
18192 touch $DIR/$tdir/subdir/second
18193 [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
18194 error "bad pattern in sub-directory"
18195 [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
18196 error "bad stripe count in sub-directory"
18197 [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
18198 error "bad stripe size in sub-directory"
18201 run_test 270c "DoM: DoM EA inheritance tests"
18204 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18205 skip "Need MDS version at least 2.10.55"
18207 mkdir -p $DIR/$tdir
18208 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18210 # inherit default DoM striping
18211 mkdir $DIR/$tdir/subdir
18212 touch $DIR/$tdir/subdir/f1
18214 # change default directory striping
18215 $LFS setstripe -c 1 $DIR/$tdir/subdir
18216 touch $DIR/$tdir/subdir/f2
18217 [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
18218 error "wrong default striping in file 2"
18219 [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
18220 error "bad pattern in file 2"
18223 run_test 270d "DoM: change striping from DoM to RAID0"
18226 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18227 skip "Need MDS version at least 2.10.55"
18229 mkdir -p $DIR/$tdir/dom
18230 mkdir -p $DIR/$tdir/norm
18233 $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
18234 $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
18236 createmany -o $DIR/$tdir/dom/dom- $DOMFILES
18237 createmany -o $DIR/$tdir/norm/norm- $NORMFILES
18239 # find DoM files by layout
18240 NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
18241 [ $NUM -eq $DOMFILES ] ||
18242 error "lfs find -L: found $NUM, expected $DOMFILES"
18243 echo "Test 1: lfs find 20 DOM files by layout: OK"
18245 # there should be 1 dir with default DOM striping
18246 NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
18248 error "lfs find -L: found $NUM, expected 1 dir"
18249 echo "Test 2: lfs find 1 DOM dir by layout: OK"
18251 # find DoM files by stripe size
18252 NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
18253 [ $NUM -eq $DOMFILES ] ||
18254 error "lfs find -S: found $NUM, expected $DOMFILES"
18255 echo "Test 4: lfs find 20 DOM files by stripe size: OK"
18257 # find files by stripe offset except DoM files
18258 NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
18259 [ $NUM -eq $NORMFILES ] ||
18260 error "lfs find -i: found $NUM, expected $NORMFILES"
18261 echo "Test 5: lfs find no DOM files by stripe index: OK"
18264 run_test 270e "DoM: lfs find with DoM files test"
18267 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18268 skip "Need MDS version at least 2.10.55"
18270 local mdtname=${FSNAME}-MDT0000-mdtlov
18271 local dom=$DIR/$tdir/dom_file
18272 local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
18273 lod.$mdtname.dom_stripesize)
18274 local dom_limit=131072
18276 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
18277 local dom_current=$(do_facet mds1 $LCTL get_param -n \
18278 lod.$mdtname.dom_stripesize)
18279 [ ${dom_limit} -eq ${dom_current} ] ||
18280 error "Cannot change per-MDT DoM stripe limit to $dom_limit"
18282 $LFS mkdir -i 0 -c 1 $DIR/$tdir
18283 $LFS setstripe -d $DIR/$tdir
18284 $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
18285 error "Can't set directory default striping"
18287 # exceed maximum stripe size
18288 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18289 error "Can't create file with $((dom_limit * 2)) DoM stripe"
18290 [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] &&
18291 error "Able to create DoM component size more than LOD limit"
18293 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
18294 dom_current=$(do_facet mds1 $LCTL get_param -n \
18295 lod.$mdtname.dom_stripesize)
18296 [ 0 -eq ${dom_current} ] ||
18297 error "Can't set zero DoM stripe limit"
18300 # attempt to create DoM file on server with disabled DoM should
18301 # remove DoM entry from layout and be succeed
18302 $LFS setstripe -E $dom_limit -L mdt -E -1 $dom ||
18303 error "Can't create DoM file (DoM is disabled)"
18304 [ $($LFS getstripe -L $dom) == "mdt" ] &&
18305 error "File has DoM component while DoM is disabled"
18308 # attempt to create DoM file with only DoM stripe should return error
18309 $LFS setstripe -E $dom_limit -L mdt $dom &&
18310 error "Able to create DoM-only file while DoM is disabled"
18312 # too low values to be aligned with smallest stripe size 64K
18313 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
18314 dom_current=$(do_facet mds1 $LCTL get_param -n \
18315 lod.$mdtname.dom_stripesize)
18316 [ 30000 -eq ${dom_current} ] &&
18317 error "Can set too small DoM stripe limit"
18319 # 64K is a minimal stripe size in Lustre, expect limit of that size
18320 [ 65536 -eq ${dom_current} ] ||
18321 error "Limit is not set to 64K but ${dom_current}"
18323 do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
18324 dom_current=$(do_facet mds1 $LCTL get_param -n \
18325 lod.$mdtname.dom_stripesize)
18327 [ 2147483648 -eq ${dom_current} ] &&
18328 error "Can set too large DoM stripe limit"
18330 do_facet mds1 $LCTL set_param -n \
18331 lod.$mdtname.dom_stripesize=$((dom_limit * 2))
18332 $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
18333 error "Can't create DoM component size after limit change"
18334 do_facet mds1 $LCTL set_param -n \
18335 lod.$mdtname.dom_stripesize=$((dom_limit / 2))
18336 $LFS setstripe -E $dom_limit -L mdt ${dom}_big ||
18337 error "Can't create DoM file after limit decrease"
18338 [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] ||
18339 error "Can create big DoM component after limit decrease"
18340 touch ${dom}_def ||
18341 error "Can't create file with old default layout"
18343 do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
18346 run_test 270f "DoM: maximum DoM stripe size checks"
18349 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18350 skip "Need MDS version at least 2.10.55"
18352 local dom=$DIR/$tdir/dom
18354 mkdir -p $DIR/$tdir
18356 $LFS setstripe -E 1024K -L mdt $dom
18358 lctl set_param -n mdc.*.stats=clear
18359 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18360 cat $dom > /dev/null
18361 local reads=$(lctl get_param -n mdc.*.stats | grep -c ost_read)
18362 [ $reads -eq 0 ] || error "Unexpected $reads READ RPCs"
18366 run_test 271a "DoM: data is cached for read after write"
18369 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18370 skip "Need MDS version at least 2.10.55"
18372 local dom=$DIR/$tdir/dom
18374 mkdir -p $DIR/$tdir
18376 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18378 lctl set_param -n mdc.*.stats=clear
18379 dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
18380 cancel_lru_locks mdc
18381 $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
18382 # second stat to check size is cached on client
18383 $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
18384 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18385 [ $gls -eq 0 ] || error "Unexpected $gls glimpse RPCs"
18388 run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
18391 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18392 skip "Need MDS version at least 2.10.55"
18394 local dom=$DIR/$tdir/dom
18396 mkdir -p $DIR/$tdir
18398 $LFS setstripe -E 1024K -L mdt -E EOF $dom
18400 lctl set_param -n mdc.*.stats=clear
18401 lctl set_param -n osc.*.stats=clear
18402 dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
18403 cancel_lru_locks mdc
18404 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18405 # second stat to check size is cached on client
18406 $CHECKSTAT -t file -s 2097152 $dom || error "stat"
18407 local gls=$(lctl get_param -n mdc.*.stats | grep -c ldlm_glimpse)
18408 [ $gls == 0 ] || error "Unexpected $gls glimpse RPCs"
18409 local gls=$(lctl get_param -n osc.*.stats | grep -c ldlm_glimpse)
18410 [ $gls == 0 ] || error "Unexpected $gls OSC glimpse RPCs"
18413 run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
18419 local mdt=MDT$(printf %04x $mdtidx)
18421 if [ -z $param ]; then
18422 lctl get_param -n mdc.*$mdt*.stats
18424 lctl get_param -n mdc.*$mdt*.stats | awk "/$param/"'{print $2}'
18429 [ $MDS1_VERSION -lt $(version_code 2.10.55) ] &&
18430 skip "Need MDS version at least 2.10.55"
18432 local dom=$DIR/$tdir/dom
18434 mkdir -p $DIR/$tdir
18436 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18438 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
18439 local facet=mds$((mdtidx + 1))
18441 cancel_lru_locks mdc
18442 do_facet $facet lctl set_param -n mdt.*.dom_lock=0
18443 createmany -o $dom 1000
18444 lctl set_param -n mdc.*.stats=clear
18445 smalliomany -w $dom 1000 200
18446 get_mdc_stats $mdtidx
18447 local enq=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18448 # Each file has 1 open, 1 IO enqueues, total 2000
18449 # but now we have also +1 getxattr for security.capability, total 3000
18450 [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
18451 unlinkmany $dom 1000
18453 cancel_lru_locks mdc
18454 do_facet $facet lctl set_param -n mdt.*.dom_lock=1
18455 createmany -o $dom 1000
18456 lctl set_param -n mdc.*.stats=clear
18457 smalliomany -w $dom 1000 200
18458 local enq_2=$(get_mdc_stats $mdtidx ldlm_ibits_enqueue)
18459 # Expect to see reduced amount of RPCs by 1000 due to single enqueue
18460 # for OPEN and IO lock.
18461 [ $((enq - enq_2)) -ge 1000 ] ||
18462 error "Too many enqueues $enq_2, expected about $((enq - 1000))"
18463 unlinkmany $dom 1000
18466 run_test 271c "DoM: IO lock at open saves enqueue RPCs"
18468 cleanup_271def_tests() {
18474 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18475 skip "Need MDS version at least 2.10.57"
18477 local dom=$DIR/$tdir/dom
18478 local tmp=$TMP/$tfile
18479 trap "cleanup_271def_tests $tmp" EXIT
18481 mkdir -p $DIR/$tdir
18483 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18485 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18487 cancel_lru_locks mdc
18488 dd if=/dev/urandom of=$tmp bs=1000 count=1
18489 dd if=$tmp of=$dom bs=1000 count=1
18490 cancel_lru_locks mdc
18492 cat /etc/hosts >> $tmp
18493 lctl set_param -n mdc.*.stats=clear
18495 # append data to the same file it should update local page
18496 echo "Append to the same page"
18497 cat /etc/hosts >> $dom
18498 local num=$(get_mdc_stats $mdtidx ost_read)
18499 local ra=$(get_mdc_stats $mdtidx req_active)
18500 local rw=$(get_mdc_stats $mdtidx req_waittime)
18502 [ -z $num ] || error "$num READ RPC occured"
18503 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18507 cmp $tmp $dom || error "file miscompare"
18509 cancel_lru_locks mdc
18510 lctl set_param -n mdc.*.stats=clear
18512 echo "Open and read file"
18513 cat $dom > /dev/null
18514 local num=$(get_mdc_stats $mdtidx ost_read)
18515 local ra=$(get_mdc_stats $mdtidx req_active)
18516 local rw=$(get_mdc_stats $mdtidx req_waittime)
18518 [ -z $num ] || error "$num READ RPC occured"
18519 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18523 cmp $tmp $dom || error "file miscompare"
18527 run_test 271d "DoM: read on open (1K file in reply buffer)"
18530 [ $MDS1_VERSION -lt $(version_code 2.10.57) ] &&
18531 skip "Need MDS version at least 2.10.57"
18533 local dom=$DIR/$tdir/dom
18534 local tmp=$TMP/$tfile
18535 trap "cleanup_271def_tests $tmp" EXIT
18537 mkdir -p $DIR/$tdir
18539 $LFS setstripe -E 1024K -L mdt $DIR/$tdir
18541 local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir)
18543 cancel_lru_locks mdc
18544 dd if=/dev/urandom of=$tmp bs=200000 count=1
18545 dd if=$tmp of=$dom bs=200000 count=1
18546 cancel_lru_locks mdc
18547 cat /etc/hosts >> $tmp
18548 lctl set_param -n mdc.*.stats=clear
18550 echo "Append to the same page"
18551 cat /etc/hosts >> $dom
18552 local num=$(get_mdc_stats $mdtidx ost_read)
18553 local ra=$(get_mdc_stats $mdtidx req_active)
18554 local rw=$(get_mdc_stats $mdtidx req_waittime)
18556 [ -z $num ] || error "$num READ RPC occured"
18557 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18561 cmp $tmp $dom || error "file miscompare"
18563 cancel_lru_locks mdc
18564 lctl set_param -n mdc.*.stats=clear
18566 echo "Open and read file"
18567 cat $dom > /dev/null
18568 local num=$(get_mdc_stats $mdtidx ost_read)
18569 local ra=$(get_mdc_stats $mdtidx req_active)
18570 local rw=$(get_mdc_stats $mdtidx req_waittime)
18572 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured"
18573 [ $ra == $rw ] || error "$((ra - rw)) resend occured"
18577 cmp $tmp $dom || error "file miscompare"
18581 run_test 271f "DoM: read on open (200K file and read tail)"
18584 [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] ||
18585 skip "Skipping due to old client or server version"
18587 $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile
18589 $CHECKSTAT -t file $DIR1/$tfile
18591 $MULTIOP $DIR1/$tfile Ow40960_w4096c &
18594 #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE
18595 $LCTL set_param fail_loc=0x80000314
18596 rm $DIR1/$tfile || error "Unlink fails"
18598 kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
18599 [ $RC -eq 0 ] || error "Failed write to stale object"
18601 run_test 271g "Discard DoM data vs client flush race"
18604 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18605 skip "Need MDS version at least 2.11.50"
18607 local dom=$DIR/$tdir/dom
18608 mkdir -p $DIR/$tdir
18610 $LFS setstripe -E 256K -L mdt -E -1 -c1 $dom
18611 dd if=/dev/urandom of=$dom bs=512K count=1 ||
18612 error "failed to write data into $dom"
18613 local old_md5=$(md5sum $dom)
18615 $LFS migrate -E 256K -L mdt -E -1 -c2 $dom ||
18616 error "failed to migrate to the same DoM component"
18618 [ $($LFS getstripe -c $dom) -eq 2 ] ||
18619 error "layout was not changed silently"
18621 local new_md5=$(md5sum $dom)
18623 [ "$old_md5" != "$new_md5" ] &&
18624 error "md5sum differ: $old_md5, $new_md5"
18627 run_test 272a "DoM migration: new layout with the same DOM component"
18630 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18631 skip "Need MDS version at least 2.11.50"
18633 local dom=$DIR/$tdir/dom
18634 mkdir -p $DIR/$tdir
18635 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18637 local mdtidx=$($LFS getstripe -m $dom)
18638 local mdtname=MDT$(printf %04x $mdtidx)
18639 local facet=mds$((mdtidx + 1))
18641 local mdtfree1=$(do_facet $facet \
18642 lctl get_param -n osd*.*$mdtname.kbytesfree)
18643 dd if=/dev/urandom of=$dom bs=2M count=1 ||
18644 error "failed to write data into $dom"
18645 local old_md5=$(md5sum $dom)
18646 cancel_lru_locks mdc
18647 local mdtfree1=$(do_facet $facet \
18648 lctl get_param -n osd*.*$mdtname.kbytesfree)
18650 $LFS migrate -c2 $dom ||
18651 error "failed to migrate to the new composite layout"
18652 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18653 error "MDT stripe was not removed"
18655 cancel_lru_locks mdc
18656 local new_md5=$(md5sum $dom)
18657 [ "$old_md5" != "$new_md5" ] &&
18658 error "$old_md5 != $new_md5"
18660 # Skip free space checks with ZFS
18661 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18662 local mdtfree2=$(do_facet $facet \
18663 lctl get_param -n osd*.*$mdtname.kbytesfree)
18664 [ $mdtfree2 -gt $mdtfree1 ] ||
18665 error "MDT space is not freed after migration"
18669 run_test 272b "DoM migration: DOM file to the OST-striped file (plain)"
18672 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18673 skip "Need MDS version at least 2.11.50"
18675 local dom=$DIR/$tdir/$tfile
18676 mkdir -p $DIR/$tdir
18677 $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom
18679 local mdtidx=$($LFS getstripe -m $dom)
18680 local mdtname=MDT$(printf %04x $mdtidx)
18681 local facet=mds$((mdtidx + 1))
18683 dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct ||
18684 error "failed to write data into $dom"
18685 local old_md5=$(md5sum $dom)
18686 cancel_lru_locks mdc
18687 local mdtfree1=$(do_facet $facet \
18688 lctl get_param -n osd*.*$mdtname.kbytesfree)
18690 $LFS migrate -E 2M -c1 -E -1 -c2 $dom ||
18691 error "failed to migrate to the new composite layout"
18692 [ $($LFS getstripe -L $dom) == 'mdt' ] &&
18693 error "MDT stripe was not removed"
18695 cancel_lru_locks mdc
18696 local new_md5=$(md5sum $dom)
18697 [ "$old_md5" != "$new_md5" ] &&
18698 error "$old_md5 != $new_md5"
18700 # Skip free space checks with ZFS
18701 if [ "$(facet_fstype $facet)" != "zfs" ]; then
18702 local mdtfree2=$(do_facet $facet \
18703 lctl get_param -n osd*.*$mdtname.kbytesfree)
18704 [ $mdtfree2 -gt $mdtfree1 ] ||
18705 error "MDS space is not freed after migration"
18709 run_test 272c "DoM migration: DOM file to the OST-striped file (composite)"
18712 [ $MDS1_VERSION -lt $(version_code 2.11.50) ] &&
18713 skip "Need MDS version at least 2.11.50"
18715 # Layout swap cannot be done if either file has DOM component,
18716 # this will never be supported, migration should be used instead
18718 local dom=$DIR/$tdir/$tfile
18719 mkdir -p $DIR/$tdir
18721 $LFS setstripe -c2 ${dom}_plain
18722 $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom
18723 $LFS swap_layouts ${dom}_plain ${dom}_dom &&
18724 error "can swap layout with DoM component"
18725 $LFS swap_layouts ${dom}_dom ${dom}_plain &&
18726 error "can swap layout with DoM component"
18728 $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp
18729 $LFS swap_layouts ${dom}_comp ${dom}_dom &&
18730 error "can swap layout with DoM component"
18731 $LFS swap_layouts ${dom}_dom ${dom}_comp &&
18732 error "can swap layout with DoM component"
18735 run_test 273a "DoM: layout swapping should fail with DOM"
18738 remote_ost_nodsh && skip "remote OST with nodsh"
18739 [ $OST1_VERSION -lt $(version_code 2.10.57) ] &&
18740 skip "Need OST version >= 2.10.57"
18742 local file=$DIR/$tfile
18745 oss=$(comma_list $(osts_nodes))
18747 dd if=/dev/urandom of=$file bs=1M count=2 ||
18748 error "failed to create a file"
18749 cancel_lru_locks osc
18752 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18753 error "failed to read a file"
18755 #define OBD_FAIL_LDLM_PAUSE_CANCEL2 0x31f
18756 $LCTL set_param fail_loc=0x8000031f
18758 cancel_lru_locks osc &
18761 #define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
18762 do_nodes $oss $LCTL set_param fail_loc=0x8000032b
18763 #IO takes another lock, but matches the PENDING one
18764 #and places it to the IO RPC
18765 dd if=$file of=/dev/null bs=1M count=1 iflag=direct ||
18766 error "failed to read a file with PENDING lock"
18768 run_test 275 "Read on a canceled duplicate lock"
18771 remote_ost_nodsh && skip "remote OST with nodsh"
18774 do_facet ost1 "(while true; do \
18775 $LCTL get_param obdfilter.*.filesfree > /dev/null 2>&1; \
18776 done) & pid=\\\$!; echo \\\$pid > $TMP/sanity_276_pid" &
18779 for LOOP in $(seq 20); do
18781 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
18784 do_facet ost1 "pid=\\\$(cat $TMP/sanity_276_pid); kill -9 \\\$pid; \
18785 rm $TMP/sanity_276_pid"
18787 run_test 276 "Race between mount and obd_statfs"
18789 cleanup_test_300() {
18793 test_striped_dir() {
18798 mkdir -p $DIR/$tdir
18800 SAVE_UMASK=$(umask)
18801 trap cleanup_test_300 RETURN EXIT
18803 $LFS setdirstripe -i $mdt_index -c 2 -H all_char -o 755 \
18804 $DIR/$tdir/striped_dir ||
18805 error "set striped dir error"
18807 local mode=$(stat -c%a $DIR/$tdir/striped_dir)
18808 [ "$mode" = "755" ] || error "expect 755 got $mode"
18810 $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
18811 error "getdirstripe failed"
18812 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
18813 if [ "$stripe_count" != "2" ]; then
18814 error "1:stripe_count is $stripe_count, expect 2"
18816 stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
18817 if [ "$stripe_count" != "2" ]; then
18818 error "2:stripe_count is $stripe_count, expect 2"
18821 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
18822 if [ "$stripe_index" != "$mdt_index" ]; then
18823 error "stripe_index is $stripe_index, expect $mdt_index"
18826 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18827 error "nlink error after create striped dir"
18829 mkdir $DIR/$tdir/striped_dir/a
18830 mkdir $DIR/$tdir/striped_dir/b
18832 stat $DIR/$tdir/striped_dir/a ||
18833 error "create dir under striped dir failed"
18834 stat $DIR/$tdir/striped_dir/b ||
18835 error "create dir under striped dir failed"
18837 [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
18838 error "nlink error after mkdir"
18840 rmdir $DIR/$tdir/striped_dir/a
18841 [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
18842 error "nlink error after rmdir"
18844 rmdir $DIR/$tdir/striped_dir/b
18845 [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
18846 error "nlink error after rmdir"
18848 chattr +i $DIR/$tdir/striped_dir
18849 createmany -o $DIR/$tdir/striped_dir/f 10 &&
18850 error "immutable flags not working under striped dir!"
18851 chattr -i $DIR/$tdir/striped_dir
18853 rmdir $DIR/$tdir/striped_dir ||
18854 error "rmdir striped dir error"
18862 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18863 skip "skipped for lustre < 2.7.0"
18864 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18865 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18867 test_striped_dir 0 || error "failed on striped dir on MDT0"
18868 test_striped_dir 1 || error "failed on striped dir on MDT0"
18870 run_test 300a "basic striped dir sanity test"
18873 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18874 skip "skipped for lustre < 2.7.0"
18875 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18876 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18883 test_mkdir $DIR/$tdir || error "mkdir fail"
18884 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18885 error "set striped dir error"
18886 for i in {0..9}; do
18887 mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
18889 touch $DIR/$tdir/striped_dir/file_$i || error "touch error $i"
18890 mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
18891 [ $mtime1 -eq $mtime2 ] && error "mtime unchanged after create"
18893 rm -f $DIR/$tdir/striped_dir/file_$i || error "unlink error $i"
18894 mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
18895 [ $mtime2 -eq $mtime3 ] && error "mtime unchanged after unlink"
18899 run_test 300b "check ctime/mtime for striped dir"
18902 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18903 skip "skipped for lustre < 2.7.0"
18904 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18905 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18909 mkdir -p $DIR/$tdir
18910 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
18911 error "set striped dir error"
18913 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
18914 error "chown striped dir failed"
18916 $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
18917 error "create 5k files failed"
18919 file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
18921 [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
18925 run_test 300c "chown && check ls under striped directory"
18928 [ $MDS1_VERSION -lt $(version_code 2.7.0) ] &&
18929 skip "skipped for lustre < 2.7.0"
18930 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18931 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18936 mkdir -p $DIR/$tdir
18937 $SETSTRIPE -c 2 $DIR/$tdir
18939 #local striped directory
18940 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18941 error "set striped dir error"
18942 #look at the directories for debug purposes
18944 $LFS getdirstripe $DIR/$tdir
18945 ls -l $DIR/$tdir/striped_dir
18946 $LFS getdirstripe $DIR/$tdir/striped_dir
18947 createmany -o $DIR/$tdir/striped_dir/f 10 ||
18948 error "create 10 files failed"
18950 #remote striped directory
18951 $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
18952 error "set striped dir error"
18953 #look at the directories for debug purposes
18955 $LFS getdirstripe $DIR/$tdir
18956 ls -l $DIR/$tdir/remote_striped_dir
18957 $LFS getdirstripe $DIR/$tdir/remote_striped_dir
18958 createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
18959 error "create 10 files failed"
18961 for file in $(find $DIR/$tdir); do
18962 stripe_count=$($LFS getstripe -c $file)
18963 [ $stripe_count -eq 2 ] ||
18964 error "wrong stripe $stripe_count for $file"
18969 run_test 300d "check default stripe under striped directory"
18972 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
18973 skip "Need MDS version at least 2.7.55"
18974 [ $PARALLEL == "yes" ] && skip "skip parallel run"
18975 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
18980 mkdir -p $DIR/$tdir
18982 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
18983 error "set striped dir error"
18985 touch $DIR/$tdir/striped_dir/a
18986 touch $DIR/$tdir/striped_dir/b
18987 touch $DIR/$tdir/striped_dir/c
18989 mkdir $DIR/$tdir/striped_dir/dir_a
18990 mkdir $DIR/$tdir/striped_dir/dir_b
18991 mkdir $DIR/$tdir/striped_dir/dir_c
18993 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_a ||
18994 error "set striped adir under striped dir error"
18996 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
18997 error "set striped bdir under striped dir error"
18999 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_c ||
19000 error "set striped cdir under striped dir error"
19002 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
19003 error "rename dir under striped dir fails"
19005 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
19006 error "rename dir under different stripes fails"
19008 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
19009 error "rename file under striped dir should succeed"
19011 mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
19012 error "rename dir under striped dir should succeed"
19016 run_test 300e "check rename under striped directory"
19019 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19020 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19021 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19022 skip "Need MDS version at least 2.7.55"
19028 mkdir -p $DIR/$tdir
19030 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
19031 error "set striped dir error"
19033 $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir1 ||
19034 error "set striped dir error"
19036 touch $DIR/$tdir/striped_dir/a
19037 mkdir $DIR/$tdir/striped_dir/dir_a
19038 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
19039 error "create striped dir under striped dir fails"
19041 touch $DIR/$tdir/striped_dir1/b
19042 mkdir $DIR/$tdir/striped_dir1/dir_b
19043 $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
19044 error "create striped dir under striped dir fails"
19046 mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
19047 error "rename dir under different striped dir should fail"
19049 mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
19050 error "rename striped dir under diff striped dir should fail"
19052 mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
19053 error "rename file under diff striped dirs fails"
19057 run_test 300f "check rename cross striped directory"
19059 test_300_check_default_striped_dir()
19062 local default_count=$2
19063 local default_index=$3
19066 local dir_stripe_index
19069 echo "checking $dirname $default_count $default_index"
19070 $LFS setdirstripe -D -c $default_count -i $default_index \
19071 -t all_char $DIR/$tdir/$dirname ||
19072 error "set default stripe on striped dir error"
19073 stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
19074 [ $stripe_count -eq $default_count ] ||
19075 error "expect $default_count get $stripe_count for $dirname"
19077 stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
19078 [ $stripe_index -eq $default_index ] ||
19079 error "expect $default_index get $stripe_index for $dirname"
19081 mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
19082 error "create dirs failed"
19084 createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
19085 unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
19086 for dir in $(find $DIR/$tdir/$dirname/*); do
19087 stripe_count=$($LFS getdirstripe -c $dir)
19088 [ $stripe_count -eq $default_count ] ||
19089 [ $stripe_count -eq 0 -o $default_count -eq 1 ] ||
19090 error "stripe count $default_count != $stripe_count for $dir"
19092 stripe_index=$($LFS getdirstripe -i $dir)
19093 [ $default_index -eq -1 -o $stripe_index -eq $default_index ] ||
19094 error "$stripe_index != $default_index for $dir"
19096 #check default stripe
19097 stripe_count=$($LFS getdirstripe -D -c $dir)
19098 [ $stripe_count -eq $default_count ] ||
19099 error "default count $default_count != $stripe_count for $dir"
19101 stripe_index=$($LFS getdirstripe -D -i $dir)
19102 [ $stripe_index -eq $default_index ] ||
19103 error "default index $default_index != $stripe_index for $dir"
19105 rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
19109 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19110 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19111 skip "Need MDS version at least 2.7.55"
19118 mkdir $DIR/$tdir/normal_dir
19120 #Checking when client cache stripe index
19121 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
19122 $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
19123 error "create striped_dir failed"
19125 $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
19126 error "create dir0 fails"
19127 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
19128 [ $stripe_index -eq 0 ] ||
19129 error "dir0 expect index 0 got $stripe_index"
19131 mkdir $DIR/$tdir/striped_dir/dir1 ||
19132 error "create dir1 fails"
19133 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
19134 [ $stripe_index -eq 1 ] ||
19135 error "dir1 expect index 1 got $stripe_index"
19137 #check default stripe count/stripe index
19138 test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
19139 test_300_check_default_striped_dir normal_dir 1 0
19140 test_300_check_default_striped_dir normal_dir 2 1
19141 test_300_check_default_striped_dir normal_dir 2 -1
19143 #delete default stripe information
19144 echo "delete default stripeEA"
19145 $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
19146 error "set default stripe on striped dir error"
19148 mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
19149 for dir in $(find $DIR/$tdir/normal_dir/*); do
19150 stripe_count=$($LFS getdirstripe -c $dir)
19151 [ $stripe_count -eq 0 ] ||
19152 error "expect 1 get $stripe_count for $dir"
19153 stripe_index=$($LFS getdirstripe -i $dir)
19154 [ $stripe_index -eq 0 ] ||
19155 error "expect 0 get $stripe_index for $dir"
19158 run_test 300g "check default striped directory for normal directory"
19161 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19162 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19163 skip "Need MDS version at least 2.7.55"
19169 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19170 error "set striped dir error"
19172 test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
19173 test_300_check_default_striped_dir striped_dir 1 0
19174 test_300_check_default_striped_dir striped_dir 2 1
19175 test_300_check_default_striped_dir striped_dir 2 -1
19177 #delete default stripe information
19178 $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
19179 error "set default stripe on striped dir error"
19181 mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
19182 for dir in $(find $DIR/$tdir/striped_dir/*); do
19183 stripe_count=$($LFS getdirstripe -c $dir)
19184 [ $stripe_count -eq 0 ] ||
19185 error "expect 1 get $stripe_count for $dir"
19188 run_test 300h "check default striped directory for striped directory"
19191 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19192 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19193 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19194 skip "Need MDS version at least 2.7.55"
19201 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19202 error "set striped dir error"
19204 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
19205 error "create files under striped dir failed"
19207 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
19208 error "set striped hashdir error"
19210 $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
19211 error "create dir0 under hash dir failed"
19212 $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
19213 error "create dir1 under hash dir failed"
19215 # unfortunately, we need to umount to clear dir layout cache for now
19216 # once we fully implement dir layout, we can drop this
19217 umount_client $MOUNT || error "umount failed"
19218 mount_client $MOUNT || error "mount failed"
19220 $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
19221 local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
19222 [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
19224 #set the stripe to be unknown hash type
19225 #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
19226 $LCTL set_param fail_loc=0x1901
19227 for ((i = 0; i < 10; i++)); do
19228 $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
19229 error "stat f-$i failed"
19230 rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
19233 touch $DIR/$tdir/striped_dir/f0 &&
19234 error "create under striped dir with unknown hash should fail"
19236 $LCTL set_param fail_loc=0
19238 umount_client $MOUNT || error "umount failed"
19239 mount_client $MOUNT || error "mount failed"
19243 run_test 300i "client handle unknown hash type striped directory"
19246 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19247 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19248 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19249 skip "Need MDS version at least 2.7.55"
19256 #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
19257 $LCTL set_param fail_loc=0x1702
19258 $LFS setdirstripe -i 0 -c$MDSCOUNT -H all_char $DIR/$tdir/striped_dir ||
19259 error "set striped dir error"
19261 createmany -o $DIR/$tdir/striped_dir/f- 10 ||
19262 error "create files under striped dir failed"
19264 $LCTL set_param fail_loc=0
19266 rm -rf $DIR/$tdir || error "unlink striped dir fails"
19270 run_test 300j "test large update record"
19273 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19274 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19275 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19276 skip "Need MDS version at least 2.7.55"
19283 #define OBD_FAIL_LARGE_STRIPE 0x1703
19284 $LCTL set_param fail_loc=0x1703
19285 $LFS setdirstripe -i 0 -c192 $DIR/$tdir/striped_dir ||
19286 error "set striped dir error"
19287 $LCTL set_param fail_loc=0
19289 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19290 error "getstripeddir fails"
19291 rm -rf $DIR/$tdir/striped_dir ||
19292 error "unlink striped dir fails"
19296 run_test 300k "test large striped directory"
19299 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19300 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19301 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19302 skip "Need MDS version at least 2.7.55"
19306 test_mkdir -p $DIR/$tdir/striped_dir
19307 chown $RUNAS_ID $DIR/$tdir/striped_dir ||
19308 error "chown $RUNAS_ID failed"
19309 $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
19310 error "set default striped dir failed"
19312 #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
19313 $LCTL set_param fail_loc=0x80000158
19314 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
19316 stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
19317 [ $stripe_index -eq 1 ] ||
19318 error "expect 1 get $stripe_index for $dir"
19320 run_test 300l "non-root user to create dir under striped dir with stale layout"
19323 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19324 [ $MDSCOUNT -ge 2 ] && skip_env "Only for single MDT"
19325 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19326 skip "Need MDS version at least 2.7.55"
19328 mkdir -p $DIR/$tdir/striped_dir
19329 $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
19330 error "set default stripes dir error"
19332 mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
19334 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
19335 [ $stripe_count -eq 0 ] ||
19336 error "expect 0 get $stripe_count for a"
19338 $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
19339 error "set default stripes dir error"
19341 mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
19343 stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
19344 [ $stripe_count -eq 0 ] ||
19345 error "expect 0 get $stripe_count for b"
19347 $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
19348 error "set default stripes dir error"
19350 mkdir $DIR/$tdir/striped_dir/c &&
19351 error "default stripe_index is invalid, mkdir c should fails"
19353 rm -rf $DIR/$tdir || error "rmdir fails"
19355 run_test 300m "setstriped directory on single MDT FS"
19358 local list=$(comma_list $(mdts_nodes))
19361 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19365 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19366 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19367 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19368 skip "Need MDS version at least 2.7.55"
19369 remote_mds_nodsh && skip "remote MDS with nodsh"
19372 local list=$(comma_list $(mdts_nodes))
19374 trap cleanup_300n RETURN EXIT
19375 mkdir -p $DIR/$tdir
19376 chmod 777 $DIR/$tdir
19377 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
19378 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19379 error "create striped dir succeeds with gid=0"
19381 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19382 $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
19383 error "create striped dir fails with gid=-1"
19385 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19386 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
19387 $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
19388 error "set default striped dir succeeds with gid=0"
19391 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
19392 $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
19393 error "set default striped dir fails with gid=-1"
19396 do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
19397 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
19398 error "create test_dir fails"
19399 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
19400 error "create test_dir1 fails"
19401 $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
19402 error "create test_dir2 fails"
19405 run_test 300n "non-root user to create dir under striped dir with default EA"
19408 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19409 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19410 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19411 skip "Need MDS version at least 2.7.55"
19416 mkdir -p $DIR/$tdir
19418 numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
19419 numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
19420 if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then
19421 skip "not enough free inodes $numfree1 $numfree2"
19424 numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
19425 numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
19426 if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then
19427 skip "not enough free space $numfree1 $numfree2"
19430 $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
19431 error "setdirstripe fails"
19433 createmany -d $DIR/$tdir/striped_dir/d 131000 ||
19434 error "create dirs fails"
19436 $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
19437 ls $DIR/$tdir/striped_dir > /dev/null ||
19438 error "ls striped dir fails"
19439 unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
19440 error "unlink big striped dir fails"
19442 run_test 300o "unlink big sub stripe(> 65000 subdirs)"
19445 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19446 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19447 remote_mds_nodsh && skip "remote MDS with nodsh"
19449 mkdir -p $DIR/$tdir
19451 #define OBD_FAIL_OUT_ENOSPC 0x1704
19452 do_facet mds2 lctl set_param fail_loc=0x80001704
19453 $LFS setdirstripe -i 0 -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 \
19454 && error "create striped directory should fail"
19456 [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
19458 $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
19461 run_test 300p "create striped directory without space"
19464 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19465 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
19467 local fd=$(free_fd)
19468 local cmd="exec $fd<$tdir"
19470 $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
19473 trap "eval $cmd" EXIT
19474 cd $tdir || error "cd $tdir fails"
19475 rmdir ../$tdir || error "rmdir $tdir fails"
19476 mkdir local_dir && error "create dir succeeds"
19477 $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
19481 run_test 300q "create remote directory under orphan directory"
19484 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
19485 skip "Need MDS version at least 2.7.55" && return
19486 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19490 $LFS setdirstripe -i 0 -c -1 $DIR/$tdir/striped_dir ||
19491 error "set striped dir error"
19493 $LFS getdirstripe $DIR/$tdir/striped_dir ||
19494 error "getstripeddir fails"
19497 stripe_count=$($LFS getdirstripe $DIR/$tdir/striped_dir |
19498 awk '/lmv_stripe_count:/ { print $2 }')
19500 [ $MDSCOUNT -ne $stripe_count ] &&
19501 error "wrong stripe count $stripe_count expected $MDSCOUNT"
19503 rm -rf $DIR/$tdir/striped_dir ||
19504 error "unlink striped dir fails"
19506 run_test 300r "test -1 striped directory"
19508 test_300s_helper() {
19511 local stripe_dir=$DIR/$tdir/striped_dir.$count
19513 $LFS mkdir -c $count $stripe_dir ||
19514 error "lfs mkdir -c error"
19516 $LFS getdirstripe $stripe_dir ||
19517 error "lfs getdirstripe fails"
19520 stripe_count=$($LFS getdirstripe $stripe_dir |
19521 awk '/lmv_stripe_count:/ { print $2 }')
19523 [ $count -ne $stripe_count ] &&
19524 error_noexit "bad stripe count $stripe_count expected $count"
19527 dupe_stripes=$($LFS getdirstripe $stripe_dir |
19528 awk '/0x/ {count[$1] += 1}; END {
19529 for (idx in count) {
19530 if (count[idx]>1) {
19531 print "index " idx " count " count[idx]
19536 if [[ -n "$dupe_stripes" ]] ; then
19537 lfs getdirstripe $stripe_dir
19538 error_noexit "Dupe MDT above: $dupe_stripes "
19541 rm -rf $stripe_dir ||
19542 error_noexit "unlink $stripe_dir fails"
19546 [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
19547 skip "Need MDS version at least 2.7.55" && return
19548 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
19551 for count in $(seq 2 $MDSCOUNT); do
19552 test_300s_helper $count
19555 run_test 300s "test lfs mkdir -c without -i"
19558 prepare_remote_file() {
19559 mkdir $DIR/$tdir/src_dir ||
19560 error "create remote source failed"
19562 cp /etc/hosts $DIR/$tdir/src_dir/a ||
19563 error "cp to remote source failed"
19564 touch $DIR/$tdir/src_dir/a
19566 $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
19567 error "create remote target dir failed"
19569 touch $DIR/$tdir/tgt_dir/b
19571 mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
19572 error "rename dir cross MDT failed!"
19574 $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
19575 error "src_child still exists after rename"
19577 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
19578 error "missing file(a) after rename"
19580 diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
19581 error "diff after rename"
19585 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19586 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19588 local remote_file=$DIR/$tdir/tgt_dir/b
19590 mkdir -p $DIR/$tdir
19592 prepare_remote_file || error "prepare remote file failed"
19595 $OPENUNLINK $remote_file $remote_file ||
19596 error "openunlink $remote_file failed"
19597 $CHECKSTAT -a $remote_file || error "$remote_file exists"
19599 run_test 310a "open unlink remote file"
19602 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 4 MDTs"
19603 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19605 local remote_file=$DIR/$tdir/tgt_dir/b
19607 mkdir -p $DIR/$tdir
19609 prepare_remote_file || error "prepare remote file failed"
19611 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19612 $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
19613 $CHECKSTAT -t file $remote_file || error "check file failed"
19615 run_test 310b "unlink remote file with multiple links while open"
19618 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19619 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
19621 local remote_file=$DIR/$tdir/tgt_dir/b
19623 mkdir -p $DIR/$tdir
19625 prepare_remote_file || error "prepare remote file failed"
19627 ln $remote_file $DIR/$tfile || error "link failed for remote file"
19628 multiop_bg_pause $remote_file O_uc ||
19629 error "mulitop failed for remote file"
19631 $MULTIOP $DIR/$tfile Ouc
19632 kill -USR1 $MULTIPID
19635 run_test 310c "open-unlink remote file with multiple links"
19639 [ $PARALLEL == "yes" ] && skip "skip parallel run"
19640 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19641 [ $MDS1_VERSION -lt $(version_code 2.8.54) ] &&
19642 skip "lustre < 2.8.54 does not contain LU-4825 fix"
19643 remote_mds_nodsh && skip "remote MDS with nodsh"
19645 local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19646 local mdts=$(comma_list $(mdts_nodes))
19648 mkdir -p $DIR/$tdir
19649 $SETSTRIPE -i 0 -c 1 $DIR/$tdir
19650 createmany -o $DIR/$tdir/$tfile. 1000
19652 # statfs data is not real time, let's just calculate it
19653 old_iused=$((old_iused + 1000))
19655 local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19656 osp.*OST0000*MDT0000.create_count")
19657 local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \
19658 osp.*OST0000*MDT0000.max_create_count")
19659 do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0"
19661 $SETSTRIPE -i 0 $DIR/$tdir/$tfile || error "setstripe failed"
19662 local index=$($GETSTRIPE -i $DIR/$tdir/$tfile)
19663 [ $index -ne 0 ] || error "$tfile stripe index is 0"
19665 unlinkmany $DIR/$tdir/$tfile. 1000
19667 do_nodes $mdts "$LCTL set_param -n \
19668 osp.*OST0000*.max_create_count=$max_count"
19669 [ $MDS1_VERSION -lt $(version_code 2.12.51) ] &&
19670 do_nodes $mdts "$LCTL set_param -n \
19671 osp.*OST0000*.create_count=$count"
19672 do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" |
19673 grep "=0" && error "create_count is zero"
19676 for i in $(seq 120); do
19677 new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
19678 # system may be too busy to destroy all objs in time, use
19679 # a somewhat small value to not fail autotest
19680 [ $((old_iused - new_iused)) -gt 400 ] && break
19684 echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
19685 [ $((old_iused - new_iused)) -gt 400 ] ||
19686 error "objs not destroyed after unlink"
19688 run_test 311 "disable OSP precreate, and unlink should destroy objs"
19695 local vdevdir=$(dirname $(facet_vdevice $ost))
19696 local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
19697 local zfs_zapid=$(do_facet $ost $cmd |
19698 grep -w "/O/0/d$((objid%32))" -C 5 |
19699 awk '/Object/{getline; print $1}')
19700 local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
19701 awk "/$objid = /"'{printf $3}')
19706 zfs_object_blksz() {
19710 local vdevdir=$(dirname $(facet_vdevice $ost))
19711 local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
19712 local blksz=$(do_facet $ost $cmd $objid |
19713 awk '/dblk/{getline; printf $4}')
19715 case "${blksz: -1}" in
19716 k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
19717 m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
19724 test_312() { # LU-4856
19725 remote_ost_nodsh && skip "remote OST with nodsh"
19726 [ "$ost1_FSTYPE" = "zfs" ] ||
19727 skip_env "the test only applies to zfs"
19729 local max_blksz=$(do_facet ost1 \
19730 $ZFS get -p recordsize $(facet_device ost1) |
19731 awk '!/VALUE/{print $3}')
19733 # to make life a little bit easier
19734 $LFS mkdir -c 1 -i 0 $DIR/$tdir
19735 $LFS setstripe -c 1 -i 0 $DIR/$tdir
19737 local tf=$DIR/$tdir/$tfile
19739 local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19741 # Get ZFS object id
19742 local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19743 # block size change by sequential overwrite
19746 for ((bs=$PAGE_SIZE; bs <= max_blksz; bs *= 4)) ; do
19747 dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
19749 local blksz=$(zfs_object_blksz ost1 $zfs_objid)
19750 [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
19754 # block size change by sequential append write
19755 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=1 oflag=sync conv=notrunc
19756 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19757 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19760 for ((count = 1; count < $((max_blksz / PAGE_SIZE)); count *= 2)); do
19761 dd if=/dev/zero of=$tf bs=$PAGE_SIZE count=$count seek=$count \
19762 oflag=sync conv=notrunc
19764 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19765 [ $blksz -eq $((2 * count * PAGE_SIZE)) ] ||
19766 error "blksz error, actual $blksz, " \
19767 "expected: 2 * $count * $PAGE_SIZE"
19773 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
19774 zfs_objid=$(zfs_oid_to_objid ost1 $oid)
19776 dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
19777 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19778 [ $blksz -eq $PAGE_SIZE ] ||
19779 error "blksz error: $blksz, expected: $PAGE_SIZE"
19781 dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
19782 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19783 [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
19785 dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
19786 blksz=$(zfs_object_blksz ost1 $zfs_objid)
19787 [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
19789 run_test 312 "make sure ZFS adjusts its block size by write pattern"
19792 remote_ost_nodsh && skip "remote OST with nodsh"
19794 local file=$DIR/$tfile
19797 $SETSTRIPE -c 1 -i 0 $file || error "setstripe failed"
19799 # define OBD_FAIL_TGT_RCVD_EIO 0x720
19800 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19801 dd if=/dev/zero of=$file bs=$PAGE_SIZE oflag=direct count=1 &&
19802 error "write should failed"
19803 do_facet ost1 "$LCTL set_param fail_loc=0"
19806 run_test 313 "io should fail after last_rcvd update fail"
19809 [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs"
19811 $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
19812 do_facet ost1 "$LCTL set_param fail_loc=0x720"
19814 wait_delete_completed
19815 do_facet ost1 "$LCTL set_param fail_loc=0"
19817 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
19819 test_315() { # LU-618
19820 local file=$DIR/$tfile
19823 $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4063232c ||
19824 error "multiop file write failed"
19825 $MULTIOP $file oO_RDONLY:r4063232_c &
19830 local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
19833 [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
19836 run_test 315 "read should be accounted"
19839 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
19840 large_xattr_enabled || skip_env "ea_inode feature disabled"
19842 rm -rf $DIR/$tdir/d
19843 mkdir -p $DIR/$tdir/d
19844 chown nobody $DIR/$tdir/d
19845 touch $DIR/$tdir/d/file
19847 $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
19849 run_test 316 "lfs mv"
19852 [ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
19853 skip "Need MDS version at least 2.11.53"
19854 if [ "$ost1_FSTYPE" == "zfs" ]; then
19855 skip "LU-10370: no implementation for ZFS"
19859 local grant_blk_size
19861 grant_blk_size=$($LCTL get_param osc.$FSNAME*.import |
19862 awk '/grant_block_size:/ { print $2; exit; }')
19864 # Create File of size 5M. Truncate it to below size's and verify
19867 dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync ||
19868 error "Create file $DIR/$tfile failed"
19869 stack_trap "rm -f $DIR/$tfile" EXIT
19871 for trunc_sz in 2097152 4097 4000 509 0; do
19872 $TRUNCATE $DIR/$tfile $trunc_sz ||
19873 error "truncate $tfile to $trunc_sz failed"
19874 local sz=$(stat --format=%s $DIR/$tfile)
19875 local blk=$(stat --format=%b $DIR/$tfile)
19876 local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) /
19877 grant_blk_size) * 8))
19879 if [[ $blk -ne $trunc_blk ]]; then
19880 $(which stat) $DIR/$tfile
19881 error "Expected Block $trunc_blk got $blk for $tfile"
19884 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19885 error "Expected Size $trunc_sz got $sz for $tfile"
19890 # Create file with a hole and write actual two blocks. Block count
19893 dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \
19894 conv=fsync || error "Create file : $DIR/$tfile"
19896 # Calculate the final truncate size.
19897 trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1)))
19900 # truncate to size $trunc_sz bytes. Strip the last block
19901 # The block count must drop to 8
19903 $TRUNCATE $DIR/$tfile $trunc_sz ||
19904 error "truncate $tfile to $trunc_sz failed"
19906 local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile)))
19907 sz=$(stat --format=%s $DIR/$tfile)
19908 blk=$(stat --format=%b $DIR/$tfile)
19910 if [[ $blk -ne $trunc_bsz ]]; then
19911 $(which stat) $DIR/$tfile
19912 error "Expected Block $trunc_bsz got $blk for $tfile"
19915 $CHECKSTAT -s $trunc_sz $DIR/$tfile ||
19916 error "Expected Size $trunc_sz got $sz for $tfile"
19918 run_test 317 "Verify blocks get correctly update after truncate"
19921 local read_write=$1
19922 if [ "$read_write" = "write" ]; then
19923 local dd_cmd="dd if=/dev/zero of=$DIR/$tfile"
19924 elif [ "$read_write" = "read" ]; then
19925 local dd_cmd="dd of=/dev/null if=$DIR/$tfile"
19927 error "argument error"
19930 # turn off debug for performance testing
19931 local saved_debug=$($LCTL get_param -n debug)
19932 $LCTL set_param debug=0
19934 $SETSTRIPE -c 1 -i 0 $DIR/$tfile
19936 # get ost1 size - lustre-OST0000
19937 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
19938 local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
19939 [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
19941 if [ "$read_write" = "read" ]; then
19942 truncate -s $(expr 1048576 \* $blocks) $DIR/$tfile
19945 local start_time=$(date +%s.%N)
19946 $dd_cmd bs=1M count=$blocks oflag=sync ||
19947 error "real dd $read_write error"
19948 local duration=$(bc <<< "$(date +%s.%N) - $start_time")
19950 if [ "$read_write" = "write" ]; then
19954 # define OBD_FAIL_OST_FAKE_RW 0x238
19955 do_facet ost1 $LCTL set_param fail_loc=0x238
19957 local start_time=$(date +%s.%N)
19958 $dd_cmd bs=1M count=$blocks oflag=sync ||
19959 error "fake dd $read_write error"
19960 local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
19962 if [ "$read_write" = "write" ]; then
19964 cancel_lru_locks osc
19965 $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
19966 error "$tfile size not $blocks MB"
19968 do_facet ost1 $LCTL set_param fail_loc=0
19970 echo "fake $read_write $duration_fake vs. normal $read_write" \
19971 "$duration in seconds"
19972 [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
19973 error_not_in_vm "fake write is slower"
19975 $LCTL set_param -n debug="$saved_debug"
19978 test_399a() { # LU-7655 for OST fake write
19979 remote_ost_nodsh && skip "remote OST with nodsh"
19983 run_test 399a "fake write should not be slower than normal write"
19985 test_399b() { # LU-8726 for OST fake read
19986 remote_ost_nodsh && skip "remote OST with nodsh"
19987 if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
19988 skip_env "ldiskfs only test"
19993 run_test 399b "fake read should not be slower than normal read"
19995 test_400a() { # LU-1606, was conf-sanity test_74
19996 if ! which $CC > /dev/null 2>&1; then
19997 skip_env "$CC is not installed"
20000 local extra_flags=''
20001 local out=$TMP/$tfile
20002 local prefix=/usr/include/lustre
20005 # Oleg removes c files in his test rig so test if any c files exist
20006 [ -z "$(ls -A $LUSTRE_TESTS_API_DIR)" ] && \
20007 skip_env "Needed c test files are missing"
20009 if ! [[ -d $prefix ]]; then
20010 # Assume we're running in tree and fixup the include path.
20011 extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
20012 extra_flags+=" -L$LUSTRE/utils/.lib"
20015 for prog in $LUSTRE_TESTS_API_DIR/*.c; do
20016 $CC -Wall -Werror -std=c99 $extra_flags -o $out $prog -llustreapi ||
20017 error "client api broken"
20021 run_test 400a "Lustre client api program can compile and link"
20023 test_400b() { # LU-1606, LU-5011
20025 local out=$TMP/$tfile
20026 local prefix=/usr/include/linux/lustre
20028 # We use a hard coded prefix so that this test will not fail
20029 # when run in tree. There are headers in lustre/include/lustre/
20030 # that are not packaged (like lustre_idl.h) and have more
20031 # complicated include dependencies (like config.h and lnet/types.h).
20032 # Since this test about correct packaging we just skip them when
20033 # they don't exist (see below) rather than try to fixup cppflags.
20035 if ! which $CC > /dev/null 2>&1; then
20036 skip_env "$CC is not installed"
20039 for header in $prefix/*.h; do
20040 if ! [[ -f "$header" ]]; then
20044 if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
20045 continue # lustre_ioctl.h is internal header
20048 $CC -Wall -Werror -std=c99 -include $header -c -x c /dev/null -o $out ||
20049 error "cannot compile '$header'"
20053 run_test 400b "packaged headers can be compiled"
20055 test_401a() { #LU-7437
20056 local printf_arg=$(find -printf 2>&1 | grep "unrecognized:")
20057 [ -n "$printf_arg" ] && skip_env "find does not support -printf"
20059 #count the number of parameters by "list_param -R"
20060 local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
20061 #count the number of parameters by listing proc files
20062 local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
20063 echo "proc_dirs='$proc_dirs'"
20064 [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
20065 local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
20068 [ $params -eq $procs ] ||
20069 error "found $params parameters vs. $procs proc files"
20071 # test the list_param -D option only returns directories
20072 params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
20073 #count the number of parameters by listing proc directories
20074 procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
20077 [ $params -eq $procs ] ||
20078 error "found $params parameters vs. $procs proc files"
20080 run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
20083 local save=$($LCTL get_param -n jobid_var)
20086 $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
20087 error "no error returned when setting bad parameters"
20089 local jobid_new=$($LCTL get_param -n foe jobid_var baz)
20090 [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
20092 $LCTL set_param -n fog=bam jobid_var=$save bat=fog
20093 local jobid_old=$($LCTL get_param -n foe jobid_var bag)
20094 [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
20096 run_test 401b "Verify 'lctl {get,set}_param' continue after error"
20099 local jobid_var_old=$($LCTL get_param -n jobid_var)
20100 local jobid_var_new
20102 $LCTL set_param jobid_var= &&
20103 error "no error returned for 'set_param a='"
20105 jobid_var_new=$($LCTL get_param -n jobid_var)
20106 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
20107 error "jobid_var was changed by setting without value"
20109 $LCTL set_param jobid_var &&
20110 error "no error returned for 'set_param a'"
20112 jobid_var_new=$($LCTL get_param -n jobid_var)
20113 [[ "$jobid_var_old" == "$jobid_var_new" ]] ||
20114 error "jobid_var was changed by setting without value"
20116 run_test 401c "Verify 'lctl set_param' without value fails in either format."
20119 local jobid_var_old=$($LCTL get_param -n jobid_var)
20120 local jobid_var_new
20121 local new_value="foo=bar"
20123 $LCTL set_param jobid_var=$new_value ||
20124 error "'set_param a=b' did not accept a value containing '='"
20126 jobid_var_new=$($LCTL get_param -n jobid_var)
20127 [[ "$jobid_var_new" == "$new_value" ]] ||
20128 error "'set_param a=b' failed on a value containing '='"
20130 # Reset the jobid_var to test the other format
20131 $LCTL set_param jobid_var=$jobid_var_old
20132 jobid_var_new=$($LCTL get_param -n jobid_var)
20133 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
20134 error "failed to reset jobid_var"
20136 $LCTL set_param jobid_var $new_value ||
20137 error "'set_param a b' did not accept a value containing '='"
20139 jobid_var_new=$($LCTL get_param -n jobid_var)
20140 [[ "$jobid_var_new" == "$new_value" ]] ||
20141 error "'set_param a b' failed on a value containing '='"
20143 $LCTL set_param jobid_var $jobid_var_old
20144 jobid_var_new=$($LCTL get_param -n jobid_var)
20145 [[ "$jobid_var_new" == "$jobid_var_old" ]] ||
20146 error "failed to reset jobid_var"
20148 run_test 401d "Verify 'lctl set_param' accepts values containing '='"
20151 [[ $MDS1_VERSION -ge $(version_code 2.7.66) ]] ||
20152 [[ $MDS1_VERSION -ge $(version_code 2.7.18.4) &&
20153 $MDS1_VERSION -lt $(version_code 2.7.50) ]] ||
20154 [[ $MDS1_VERSION -ge $(version_code 2.7.2) &&
20155 $MDS1_VERSION -lt $(version_code 2.7.11) ]] ||
20156 skip "Need MDS version 2.7.2+ or 2.7.18.4+ or 2.7.66+"
20157 remote_mds_nodsh && skip "remote MDS with nodsh"
20159 $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
20160 #define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
20161 do_facet mds1 "lctl set_param fail_loc=0x8000015c"
20162 touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
20163 echo "Touch failed - OK"
20165 run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
20168 local file1=$DIR/$tfile.1
20169 local file2=$DIR/$tfile.2
20170 local tfile=$TMP/$tfile
20172 rm -f $file1 $file2 $tfile
20177 # 30 sec OBD_TIMEOUT in ll_getattr()
20178 # right before populating st_nlink
20179 $LCTL set_param fail_loc=0x80001409
20180 stat -c %h $file1 > $tfile &
20182 # create an alias, drop all locks and reclaim the dentry
20184 cancel_lru_locks mdc
20185 cancel_lru_locks osc
20186 sysctl -w vm.drop_caches=2
20190 [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
20192 rm -f $tfile $file1 $file2
20194 run_test 403 "i_nlink should not drop to zero due to aliasing"
20196 test_404() { # LU-6601
20197 [[ $MDS1_VERSION -ge $(version_code 2.8.53) ]] ||
20198 skip "Need server version newer than 2.8.52"
20199 remote_mds_nodsh && skip "remote MDS with nodsh"
20201 local mosps=$(do_facet $SINGLEMDS $LCTL dl |
20202 awk '/osp .*-osc-MDT/ { print $4}')
20205 for osp in $mosps; do
20206 echo "Deactivate: " $osp
20207 do_facet $SINGLEMDS $LCTL --device %$osp deactivate
20208 local stat=$(do_facet $SINGLEMDS $LCTL dl |
20209 awk -vp=$osp '$4 == p { print $2 }')
20210 [ $stat = IN ] || {
20211 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
20212 error "deactivate error"
20214 echo "Activate: " $osp
20215 do_facet $SINGLEMDS $LCTL --device %$osp activate
20216 local stat=$(do_facet $SINGLEMDS $LCTL dl |
20217 awk -vp=$osp '$4 == p { print $2 }')
20218 [ $stat = UP ] || {
20219 do_facet $SINGLEMDS $LCTL dl | grep -w $osp
20220 error "activate error"
20224 run_test 404 "validate manual {de}activated works properly for OSPs"
20227 [ $MDS1_VERSION -lt $(version_code 2.6.92) ] ||
20228 [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] &&
20229 skip "Layout swap lock is not supported"
20231 check_swap_layouts_support
20233 test_mkdir $DIR/$tdir
20234 swap_lock_test -d $DIR/$tdir ||
20235 error "One layout swap locked test failed"
20237 run_test 405 "Various layout swap lock tests"
20240 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20241 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
20242 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
20243 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20244 [ $MDS1_VERSION -lt $(version_code 2.8.50) ] &&
20245 skip "Need MDS version at least 2.8.50"
20247 local def_stripe_size=$($LFS getstripe -S $MOUNT)
20248 local test_pool=$TESTNAME
20250 pool_add $test_pool || error "pool_add failed"
20251 pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
20252 error "pool_add_targets failed"
20254 save_layout_restore_at_exit $MOUNT
20256 # parent set default stripe count only, child will stripe from both
20257 # parent and fs default
20258 $LFS setstripe -c 1 -i 1 -S $((def_stripe_size * 2)) -p $test_pool $MOUNT ||
20259 error "setstripe $MOUNT failed"
20260 $LFS mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
20261 $LFS setstripe -c $OSTCOUNT $DIR/$tdir || error "setstripe $tdir failed"
20262 for i in $(seq 10); do
20263 local f=$DIR/$tdir/$tfile.$i
20264 touch $f || error "touch failed"
20265 local count=$($LFS getstripe -c $f)
20266 [ $count -eq $OSTCOUNT ] ||
20267 error "$f stripe count $count != $OSTCOUNT"
20268 local offset=$($LFS getstripe -i $f)
20269 [ $offset -eq 1 ] || error "$f stripe offset $offset != 1"
20270 local size=$($LFS getstripe -S $f)
20271 [ $size -eq $((def_stripe_size * 2)) ] ||
20272 error "$f stripe size $size != $((def_stripe_size * 2))"
20273 local pool=$($LFS getstripe -p $f)
20274 [ $pool == $test_pool ] || error "$f pool $pool != $test_pool"
20277 # change fs default striping, delete parent default striping, now child
20278 # will stripe from new fs default striping only
20279 $LFS setstripe -c 1 -S $def_stripe_size -i 0 $MOUNT ||
20280 error "change $MOUNT default stripe failed"
20281 $LFS setstripe -c 0 $DIR/$tdir ||
20282 error "delete $tdir default stripe failed"
20283 for i in $(seq 11 20); do
20284 local f=$DIR/$tdir/$tfile.$i
20285 touch $f || error "touch $f failed"
20286 local count=$($LFS getstripe -c $f)
20287 [ $count -eq 1 ] || error "$f stripe count $count != 1"
20288 local offset=$($LFS getstripe -i $f)
20289 [ $offset -eq 0 ] || error "$f stripe offset $offset != 0"
20290 local size=$($LFS getstripe -S $f)
20291 [ $size -eq $def_stripe_size ] ||
20292 error "$f stripe size $size != $def_stripe_size"
20293 local pool=$($LFS getstripe -p $f)
20294 [ $pool == $test_pool ] || error "$f pool $pool isn't set"
20297 unlinkmany $DIR/$tdir/$tfile. 1 20
20299 local f=$DIR/$tdir/$tfile
20300 pool_remove_all_targets $test_pool $f
20301 pool_remove $test_pool $f
20303 run_test 406 "DNE support fs default striping"
20306 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20307 [[ $MDS1_VERSION -lt $(version_code 2.8.55) ]] &&
20308 skip "Need MDS version at least 2.8.55"
20309 remote_mds_nodsh && skip "remote MDS with nodsh"
20311 $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
20312 error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
20313 $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
20314 error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
20315 touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
20317 #define OBD_FAIL_DT_TXN_STOP 0x2019
20318 for idx in $(seq $MDSCOUNT); do
20319 do_facet mds$idx "lctl set_param fail_loc=0x2019"
20321 $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
20322 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
20323 error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
20326 run_test 407 "transaction fail should cause operation fail"
20329 dd if=/dev/zero of=$DIR/$tfile bs=$PAGE_SIZE count=1 oflag=direct
20331 #define OBD_FAIL_OSC_BRW_PREP_REQ2 0x40a
20332 lctl set_param fail_loc=0x8000040a
20333 # let ll_prepare_partial_page() fail
20334 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 conv=notrunc || true
20338 # create at least 100 unused inodes so that
20339 # shrink_icache_memory(0) should not return 0
20340 touch $DIR/$tfile-{0..100}
20341 rm -f $DIR/$tfile-{0..100}
20344 echo 2 > /proc/sys/vm/drop_caches
20346 run_test 408 "drop_caches should not hang due to page leaks"
20350 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20351 check_mount_and_prep
20353 mkdir -p $DIR/$tdir || error "(0) Fail to mkdir"
20354 $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir"
20355 touch $DIR/$tdir/guard || error "(2) Fail to create"
20357 local PREFIX=$(str_repeat 'A' 128)
20358 echo "Create 1K hard links start at $(date)"
20359 createmany -l $DIR/$tdir/guard $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20360 error "(3) Fail to hard link"
20362 echo "Links count should be right although linkEA overflow"
20363 stat $DIR/$tdir/guard || error "(4) Fail to stat"
20364 local linkcount=$(stat --format=%h $DIR/$tdir/guard)
20365 [ $linkcount -eq 1001 ] ||
20366 error "(5) Unexpected hard links count: $linkcount"
20368 echo "List all links start at $(date)"
20369 ls -l $DIR/$tdir/foo > /dev/null ||
20370 error "(6) Fail to list $DIR/$tdir/foo"
20372 echo "Unlink hard links start at $(date)"
20373 unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 ||
20374 error "(7) Fail to unlink"
20376 run_test 409 "Large amount of cross-MDTs hard links on the same file"
20380 [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] &&
20381 skip "Need client version at least 2.9.59"
20383 # Create a file, and stat it from the kernel
20384 local testfile=$DIR/$tfile
20387 local run_id=$RANDOM
20388 local my_ino=$(stat --format "%i" $testfile)
20390 # Try to insert the module. This will always fail as the
20391 # module is designed to not be inserted.
20392 insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
20395 # Anything but success is a test failure
20397 "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
20398 error "no inode match"
20400 run_test 410 "Test inode number returned from kernel thread"
20402 cleanup_test411_cgroup() {
20408 local cg_basedir=/sys/fs/cgroup/memory
20410 test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
20411 skip "no setup for cgroup"
20413 dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
20414 error "test file creation failed"
20415 cancel_lru_locks osc
20417 # Create a very small memory cgroup to force a slab allocation error
20418 local cgdir=$cg_basedir/osc_slab_alloc
20419 mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
20420 trap "cleanup_test411_cgroup $cgdir" EXIT
20421 echo 2M > $cgdir/memory.kmem.limit_in_bytes
20422 echo 1M > $cgdir/memory.limit_in_bytes
20424 # Should not LBUG, just be killed by oom-killer
20425 # dd will return 0 even allocation failure in some environment.
20426 # So don't check return value
20427 sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
20428 cleanup_test411_cgroup $cgdir
20432 run_test 411 "Slab allocation error with cgroup does not LBUG"
20435 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
20436 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20437 skip "Need server version at least 2.10.55"
20440 $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
20441 error "mkdir failed"
20442 $LFS getdirstripe $DIR/$tdir
20443 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir)
20444 [ $stripe_index -eq $((MDSCOUNT - 1)) ] ||
20445 error "expect $((MDSCOUT - 1)) get $stripe_index"
20446 local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
20447 [ $stripe_count -eq 2 ] ||
20448 error "expect 2 get $stripe_count"
20450 run_test 412 "mkdir on specific MDTs"
20453 [ $MDSCOUNT -lt 2 ] &&
20454 skip "We need at least 2 MDTs for this test"
20456 if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
20457 skip "Need server version at least 2.10.55"
20460 mkdir $DIR/$tdir || error "mkdir failed"
20462 # find MDT that is the most full
20463 local max=$($LFS df | grep MDT |
20472 END { split(b, c, ":")
20477 for i in $(seq $((MDSCOUNT - 1))); do
20478 $LFS mkdir -c $i $DIR/$tdir/d$i ||
20479 error "mkdir d$i failed"
20480 $LFS getdirstripe $DIR/$tdir/d$i
20481 local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i)
20482 [ $stripe_index -ne $max ] ||
20483 error "don't expect $max"
20486 run_test 413 "mkdir on less full MDTs"
20489 #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
20490 $LCTL set_param fail_loc=0x80000521
20491 dd if=/dev/zero of=$DIR/$tfile bs=2M count=1 oflag=sync
20494 run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
20497 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20498 [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
20499 skip "Need server version at least 2.11.52"
20509 # this test may be slow on ZFS
20510 [ "$mds1_FSTYPE" == "zfs" ] && total=100
20512 # though this test is designed for striped directory, let's test normal
20513 # directory too since lock is always saved as CoS lock.
20514 test_mkdir $DIR/$tdir || error "mkdir $tdir"
20515 createmany -o $DIR/$tdir/$tfile. $total || error "createmany"
20524 start_time=$(date +%s)
20525 for i in $(seq $total); do
20526 mrename $DIR/$tdir/$tfile.$i $DIR/$tdir/$tfile-new.$i \
20529 end_time=$(date +%s)
20530 duration=$((end_time - start_time))
20532 kill -9 $setattr_pid
20534 echo "rename $total files took $duration sec"
20535 [ $duration -lt 100 ] || error "rename took $duration sec"
20537 run_test 415 "lock revoke is not missing"
20540 [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
20541 skip "Need server version at least 2.11.55"
20543 # define OBD_FAIL_OSD_TXN_START 0x19a
20544 do_facet mds1 lctl set_param fail_loc=0x19a
20546 lfs mkdir -c $MDSCOUNT $DIR/$tdir
20550 run_test 416 "transaction start failure won't cause system hung"
20554 do_nodes $(comma_list $(mdts_nodes)) \
20555 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
20556 do_nodes $(comma_list $(mdts_nodes)) \
20557 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
20558 do_nodes $(comma_list $(mdts_nodes)) \
20559 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
20563 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20564 [[ $MDS1_VERSION -lt $(version_code 2.11.56) ]] &&
20565 skip "Need MDS version at least 2.11.56"
20567 trap cleanup_417 RETURN EXIT
20569 $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
20570 do_nodes $(comma_list $(mdts_nodes)) \
20571 "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
20572 $LFS migrate -m 0 $DIR/$tdir.1 &&
20573 error "migrate dir $tdir.1 should fail"
20575 do_nodes $(comma_list $(mdts_nodes)) \
20576 "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
20577 $LFS mkdir -i 1 $DIR/$tdir.2 &&
20578 error "create remote dir $tdir.2 should fail"
20580 do_nodes $(comma_list $(mdts_nodes)) \
20581 "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
20582 $LFS mkdir -c 2 $DIR/$tdir.3 &&
20583 error "create striped dir $tdir.3 should fail"
20586 run_test 417 "disable remote dir, striped dir and dir migration"
20588 # Checks that the outputs of df [-i] and lfs df [-i] match
20590 # usage: check_lfs_df <blocks | inodes> <mountpoint>
20600 [ "$1" == "blocks" ] && inodes= || inodes="-i"
20602 for count in {1..100}; do
20606 # read the lines of interest
20607 df_out=($(df -P $inodes $dir | tail -n +2)) ||
20608 error "df $inodes $dir | tail -n +2 failed"
20609 lfs_df_out=($($LFS df $inodes $dir | grep summary:)) ||
20610 error "lfs df $inodes $dir | grep summary: failed"
20612 # skip first substrings of each output as they are different
20613 # "<NID>:/<fsname>" for df, "filesystem_summary:" for lfs df
20614 # compare the remaining fields of the two outputs
20616 for i in {1..5}; do
20617 [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false
20625 lfs df $inodes $dir
20626 error "df and lfs df $1 output mismatch: " \
20627 "df ${inodes}: ${df_out[*]}, " \
20628 "lfs df ${inodes}: ${lfs_df_out[*]}"
20633 [ $PARALLEL == "yes" ] && skip "skip parallel run"
20635 local dir=$DIR/$tdir
20636 local numfiles=$((RANDOM % 4096 + 2))
20637 local numblocks=$((RANDOM % 256 + 1))
20639 wait_delete_completed
20642 # check block output
20643 check_lfs_df blocks $dir
20644 # check inode output
20645 check_lfs_df inodes $dir
20647 # create a single file and retest
20648 echo "Creating a single file and testing"
20649 createmany -o $dir/$tfile- 1 &>/dev/null ||
20650 error "creating 1 file in $dir failed"
20651 check_lfs_df blocks $dir
20652 check_lfs_df inodes $dir
20654 # create a random number of files
20655 echo "Creating $((numfiles - 1)) files and testing"
20656 createmany -o $dir/$tfile- 1 $((numfiles - 1)) &>/dev/null ||
20657 error "creating $((numfiles - 1)) files in $dir failed"
20659 # write a random number of blocks to the first test file
20660 echo "Writing $numblocks 4K blocks and testing"
20661 dd if=/dev/urandom of=$dir/${tfile}-0 bs=4K conv=fsync \
20662 count=$numblocks &>/dev/null ||
20663 error "dd to $dir/${tfile}-0 failed"
20666 check_lfs_df blocks $dir
20667 check_lfs_df inodes $dir
20669 unlinkmany $dir/$tfile- $numfiles &>/dev/null ||
20670 error "unlinking $numfiles files in $dir failed"
20672 run_test 418 "df and lfs df outputs match"
20676 local dir=$DIR/$tdir
20681 cancel_lru_locks mdc
20683 #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410
20684 $LCTL set_param fail_loc=0x1410
20686 $LCTL set_param fail_loc=0
20689 run_test 419 "Verify open file by name doesn't crash kernel"
20693 [[ $MDS1_VERSION -ge $(version_code 2.12.1) ]] ||
20694 skip "Need MDS version at least 2.12.1"
20696 local SAVE_UMASK=$(umask)
20697 local dir=$DIR/$tdir
20698 local uname=$(getent passwd $RUNAS_ID | cut -d: -f1)
20702 mkdir -m03777 $dir/testdir
20703 ls -dn $dir/testdir
20704 # Need to remove trailing '.' when SELinux is enabled
20705 local dirperms=$(ls -dn $dir/testdir |
20706 awk '{ sub(/\.$/, "", $1); print $1}')
20707 [ $dirperms == "drwxrwsrwt" ] ||
20708 error "incorrect perms on $dir/testdir"
20710 su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \
20711 openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile"
20712 ls -n $dir/testdir/testfile
20713 local fileperms=$(ls -n $dir/testdir/testfile |
20714 awk '{ sub(/\.$/, "", $1); print $1}')
20715 [ $fileperms == "-rwxr-xr-x" ] ||
20716 error "incorrect perms on $dir/testdir/testfile"
20720 run_test 420 "clear SGID bit on non-directories for non-members"
20727 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20728 skip "Need MDS version at least 2.12.2"
20730 test_mkdir $DIR/$tdir
20731 createmany -o $DIR/$tdir/f 3
20732 cnt=$(ls -1 $DIR/$tdir | wc -l)
20733 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20735 fid1=$(lfs path2fid $DIR/$tdir/f1)
20736 fid2=$(lfs path2fid $DIR/$tdir/f2)
20737 $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed"
20739 stat $DIR/$tdir/f1 && error "f1 still visible on the client"
20740 stat $DIR/$tdir/f2 && error "f2 still visible on the client"
20742 cnt=$(ls -1 $DIR/$tdir | wc -l)
20743 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20745 rm -f $DIR/$tdir/f3 || error "can't remove f3"
20746 createmany -o $DIR/$tdir/f 3
20747 cnt=$(ls -1 $DIR/$tdir | wc -l)
20748 [ $cnt != 3 ] && error "unexpected #files: $cnt"
20750 fid1=$(lfs path2fid $DIR/$tdir/f1)
20751 fid2=$(lfs path2fid $DIR/$tdir/f2)
20752 echo "remove using fsname $FSNAME"
20753 $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed"
20755 cnt=$(ls -1 $DIR/$tdir | wc -l)
20756 [ $cnt == 1 ] || error "unexpected #files after: $cnt"
20758 run_test 421a "simple rm by fid"
20765 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20766 skip "Need MDS version at least 2.12.2"
20768 test_mkdir $DIR/$tdir
20769 createmany -o $DIR/$tdir/f 3
20770 multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start"
20773 FID1=$(lfs path2fid $DIR/$tdir/f1)
20774 FID2=$(lfs path2fid $DIR/$tdir/f2)
20775 $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail"
20777 kill -USR1 $MULTIPID
20780 cnt=$(ls $DIR/$tdir | wc -l)
20781 [ $cnt == 2 ] || error "unexpected #files after: $cnt"
20783 run_test 421b "rm by fid on open file"
20789 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20790 skip "Need MDS version at least 2.12.2"
20792 test_mkdir $DIR/$tdir
20793 createmany -o $DIR/$tdir/f 3
20794 touch $DIR/$tdir/$tfile
20795 createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180
20796 cnt=$(ls -1 $DIR/$tdir | wc -l)
20797 [ $cnt != 184 ] && error "unexpected #files: $cnt"
20799 FID1=$(lfs path2fid $DIR/$tdir/$tfile)
20800 $LFS rmfid $DIR $FID1 || error "rmfid failed"
20802 cnt=$(ls $DIR/$tdir | wc -l)
20803 [ $cnt == 3 ] || error "unexpected #files after: $cnt"
20805 run_test 421c "rm by fid against hardlinked files"
20811 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20812 skip "Need MDS version at least 2.12.2"
20814 test_mkdir $DIR/$tdir
20815 createmany -o $DIR/$tdir/f 4097
20816 cnt=$(ls -1 $DIR/$tdir | wc -l)
20817 [ $cnt != 4097 ] && error "unexpected #files: $cnt"
20819 FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g")
20820 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20822 cnt=$(ls $DIR/$tdir | wc -l)
20824 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20826 run_test 421d "rmfid en masse"
20832 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20833 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20834 skip "Need MDS version at least 2.12.2"
20836 mkdir -p $DIR/$tdir
20837 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20838 createmany -o $DIR/$tdir/striped_dir/f 512
20839 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20840 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20842 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20843 sed "s/[/][^:]*://g")
20844 $LFS rmfid $DIR $FIDS || error "rmfid failed"
20846 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20848 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20850 run_test 421e "rmfid in DNE"
20856 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20857 skip "Need MDS version at least 2.12.2"
20859 test_mkdir $DIR/$tdir
20861 cnt=$(ls -1 $DIR/$tdir | wc -l)
20862 [ $cnt != 1 ] && error "unexpected #files: $cnt"
20864 FID=$(lfs path2fid $DIR/$tdir/f)
20865 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)"
20866 # rmfid should fail
20867 cnt=$(ls -1 $DIR/$tdir | wc -l)
20868 [ $cnt != 1 ] && error "unexpected #files after (2): $cnt"
20870 chmod a+rw $DIR/$tdir
20872 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)"
20873 # rmfid should fail
20874 cnt=$(ls -1 $DIR/$tdir | wc -l)
20875 [ $cnt != 1 ] && error "unexpected #files after (3): $cnt"
20878 $RUNAS touch $DIR/$tdir/f
20879 FID=$(lfs path2fid $DIR/$tdir/f)
20880 echo "rmfid as root"
20881 $LFS rmfid $DIR $FID || error "rmfid as root failed"
20882 cnt=$(ls -1 $DIR/$tdir | wc -l)
20883 [ $cnt == 0 ] || error "unexpected #files after (4): $cnt"
20886 $RUNAS touch $DIR/$tdir/f
20887 cnt=$(ls -1 $DIR/$tdir | wc -l)
20888 [ $cnt != 1 ] && error "unexpected #files (4): $cnt"
20889 FID=$(lfs path2fid $DIR/$tdir/f)
20890 # rmfid w/o user_fid2path mount option should fail
20891 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)"
20892 cnt=$(ls -1 $DIR/$tdir | wc -l)
20893 [ $cnt == 1 ] || error "unexpected #files after (5): $cnt"
20895 umount_client $MOUNT || "failed to umount client"
20896 mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" ||
20897 "failed to mount client'"
20899 $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed"
20900 # rmfid should succeed
20901 cnt=$(ls -1 $DIR/$tdir | wc -l)
20902 [ $cnt == 0 ] || error "unexpected #files after (6): $cnt"
20904 # rmfid shouldn't allow to remove files due to dir's permission
20905 chmod a+rwx $DIR/$tdir
20908 FID=$(lfs path2fid $DIR/$tdir/f)
20909 $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail"
20911 umount_client $MOUNT || "failed to umount client"
20912 mount_client $MOUNT "$MOUNT_OPTS" ||
20913 "failed to mount client'"
20916 run_test 421f "rmfid checks permissions"
20922 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
20923 [ $MDS1_VERSION -lt $(version_code 2.12.2) ] &&
20924 skip "Need MDS version at least 2.12.2"
20926 mkdir -p $DIR/$tdir
20927 $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
20928 createmany -o $DIR/$tdir/striped_dir/f 512
20929 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20930 [ $cnt != 512 ] && error "unexpected #files: $cnt"
20932 FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* |
20933 sed "s/[/][^:]*://g")
20935 rm -f $DIR/$tdir/striped_dir/f1*
20936 cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l)
20937 removed=$((512 - cnt))
20939 # few files have been just removed, so we expect
20940 # rmfid to fail on their fids
20941 errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l)
20942 [ $removed != $errors ] && error "$errors != $removed"
20944 cnt=$(ls $DIR/$tdir/striped_dir | wc -l)
20946 [ $cnt == 0 ] || error "unexpected #files after: $cnt"
20948 run_test 421g "rmfid to return errors properly"
20961 # ensure statfs cache is expired
20964 _stats=$(stat_test | grep $MOUNT | sort -u | wc -l)
20965 [[ ${_stats} -ne 1 ]] && error "statfs wrong"
20969 run_test 423 "statfs should return a right data"
20972 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
20973 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
20974 skip "Need server version at least 2.9.55"
20976 start_full_debug_logging
20980 stop_full_debug_logging
20984 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20985 local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20986 awk '/The barrier for/ { print $7 }')
20989 local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
20994 barrier_expired() {
20997 if [ $MGS_VERSION -le $(version_code 2.10.0) ]; then
20998 expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
20999 awk '/will be expired/ { print $7 }')
21001 expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
21010 echo "Start barrier_freeze at: $(date)"
21011 #define OBD_FAIL_BARRIER_DELAY 0x2202
21012 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
21013 # Do not reduce barrier time - See LU-11873
21014 do_facet mgs $LCTL barrier_freeze $FSNAME 20 &
21017 local b_status=$(barrier_stat)
21018 echo "Got barrier status at: $(date)"
21019 [ "$b_status" = "'freezing_p1'" ] ||
21020 error "(1) unexpected barrier status $b_status"
21022 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
21024 b_status=$(barrier_stat)
21025 [ "$b_status" = "'frozen'" ] ||
21026 error "(2) unexpected barrier status $b_status"
21028 local expired=$(barrier_expired)
21029 echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
21030 sleep $((expired + 3))
21032 b_status=$(barrier_stat)
21033 [ "$b_status" = "'expired'" ] ||
21034 error "(3) unexpected barrier status $b_status"
21036 # Do not reduce barrier time - See LU-11873
21037 do_facet mgs $LCTL barrier_freeze $FSNAME 20 ||
21038 error "(4) fail to freeze barrier"
21040 b_status=$(barrier_stat)
21041 [ "$b_status" = "'frozen'" ] ||
21042 error "(5) unexpected barrier status $b_status"
21044 echo "Start barrier_thaw at: $(date)"
21045 #define OBD_FAIL_BARRIER_DELAY 0x2202
21046 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
21047 do_facet mgs $LCTL barrier_thaw $FSNAME &
21050 b_status=$(barrier_stat)
21051 echo "Got barrier status at: $(date)"
21052 [ "$b_status" = "'thawing'" ] ||
21053 error "(6) unexpected barrier status $b_status"
21055 do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
21057 b_status=$(barrier_stat)
21058 [ "$b_status" = "'thawed'" ] ||
21059 error "(7) unexpected barrier status $b_status"
21061 #define OBD_FAIL_BARRIER_FAILURE 0x2203
21062 do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
21063 do_facet mgs $LCTL barrier_freeze $FSNAME
21065 b_status=$(barrier_stat)
21066 [ "$b_status" = "'failed'" ] ||
21067 error "(8) unexpected barrier status $b_status"
21069 do_facet $SINGLEMDS $LCTL set_param fail_loc=0
21070 do_facet mgs $LCTL barrier_thaw $FSNAME
21074 run_test 801a "write barrier user interfaces and stat machine"
21079 mkdir $DIR/$tdir || error "(1) fail to mkdir"
21080 createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
21081 touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
21082 touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
21083 touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
21085 cancel_lru_locks mdc
21087 # 180 seconds should be long enough
21088 do_facet mgs $LCTL barrier_freeze $FSNAME 180
21090 local b_status=$(barrier_stat)
21091 [ "$b_status" = "'frozen'" ] ||
21092 error "(6) unexpected barrier status $b_status"
21094 mkdir $DIR/$tdir/d0/d10 &
21097 touch $DIR/$tdir/d1/f13 &
21100 ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
21103 mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
21106 rm -f $DIR/$tdir/d4/f12 &
21109 stat $DIR/$tdir/d5 || error "(7) stat should succeed"
21111 # To guarantee taht the 'stat' is not blocked
21112 b_status=$(barrier_stat)
21113 [ "$b_status" = "'frozen'" ] ||
21114 error "(8) unexpected barrier status $b_status"
21116 # let above commands to run at background
21119 ps -p $mkdir_pid || error "(9) mkdir should be blocked"
21120 ps -p $touch_pid || error "(10) touch should be blocked"
21121 ps -p $ln_pid || error "(11) link should be blocked"
21122 ps -p $mv_pid || error "(12) rename should be blocked"
21123 ps -p $rm_pid || error "(13) unlink should be blocked"
21125 b_status=$(barrier_stat)
21126 [ "$b_status" = "'frozen'" ] ||
21127 error "(14) unexpected barrier status $b_status"
21129 do_facet mgs $LCTL barrier_thaw $FSNAME
21130 b_status=$(barrier_stat)
21131 [ "$b_status" = "'thawed'" ] ||
21132 error "(15) unexpected barrier status $b_status"
21134 wait $mkdir_pid || error "(16) mkdir should succeed"
21135 wait $touch_pid || error "(17) touch should succeed"
21136 wait $ln_pid || error "(18) link should succeed"
21137 wait $mv_pid || error "(19) rename should succeed"
21138 wait $rm_pid || error "(20) unlink should succeed"
21142 run_test 801b "modification will be blocked by write barrier"
21145 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21149 stop mds2 || error "(1) Fail to stop mds2"
21151 do_facet mgs $LCTL barrier_freeze $FSNAME 30
21153 local b_status=$(barrier_stat)
21154 [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || {
21155 do_facet mgs $LCTL barrier_thaw $FSNAME
21156 error "(2) unexpected barrier status $b_status"
21159 do_facet mgs $LCTL barrier_rescan $FSNAME ||
21160 error "(3) Fail to rescan barrier bitmap"
21162 # Do not reduce barrier time - See LU-11873
21163 do_facet mgs $LCTL barrier_freeze $FSNAME 20
21165 b_status=$(barrier_stat)
21166 [ "$b_status" = "'frozen'" ] ||
21167 error "(4) unexpected barrier status $b_status"
21169 do_facet mgs $LCTL barrier_thaw $FSNAME
21170 b_status=$(barrier_stat)
21171 [ "$b_status" = "'thawed'" ] ||
21172 error "(5) unexpected barrier status $b_status"
21174 local devname=$(mdsdevname 2)
21176 start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
21178 do_facet mgs $LCTL barrier_rescan $FSNAME ||
21179 error "(7) Fail to rescan barrier bitmap"
21183 run_test 801c "rescan barrier bitmap"
21185 saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
21186 saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
21187 saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
21188 saved_MOUNT_OPTS=$MOUNT_OPTS
21194 MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
21195 MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
21196 OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
21197 MOUNT_OPTS=$saved_MOUNT_OPTS
21202 [[ $mds1_FSTYPE = zfs ]] || skip "ZFS specific test"
21203 [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
21204 [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
21205 skip "Need server version at least 2.9.55"
21207 [[ $ENABLE_QUOTA ]] && skip "Quota enabled for read-only test"
21209 mkdir $DIR/$tdir || error "(1) fail to mkdir"
21211 cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
21212 error "(2) Fail to copy"
21214 trap cleanup_802 EXIT
21216 # sync by force before remount as readonly
21217 sync; sync_all_data; sleep 3; sync_all_data
21221 MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
21222 MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
21223 OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
21225 echo "Mount the server as read only"
21226 setupall server_only || error "(3) Fail to start servers"
21228 echo "Mount client without ro should fail"
21229 mount_client $MOUNT &&
21230 error "(4) Mount client without 'ro' should fail"
21232 echo "Mount client with ro should succeed"
21233 MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro)
21234 mount_client $MOUNT ||
21235 error "(5) Mount client with 'ro' should succeed"
21237 echo "Modify should be refused"
21238 touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
21240 echo "Read should be allowed"
21241 diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
21242 error "(7) Read should succeed under ro mode"
21246 run_test 802 "simulate readonly device"
21249 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21250 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
21251 skip "MDS needs to be newer than 2.10.54"
21253 mkdir -p $DIR/$tdir
21254 # Create some objects on all MDTs to trigger related logs objects
21255 for idx in $(seq $MDSCOUNT); do
21256 $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \
21257 $DIR/$tdir/dir${idx} ||
21258 error "Fail to create $DIR/$tdir/dir${idx}"
21262 wait_delete_completed # ensure old test cleanups are finished
21263 echo "before create:"
21265 local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21267 for i in {1..10}; do
21268 $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
21269 error "Fail to create $DIR/$tdir/foo$i"
21273 echo "after create:"
21275 local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21277 # allow for an llog to be cleaned up during the test
21278 [ $after_used -ge $((before_used + 10 - 1)) ] ||
21279 error "before ($before_used) + 10 > after ($after_used)"
21281 for i in {1..10}; do
21282 rm -rf $DIR/$tdir/foo$i ||
21283 error "Fail to remove $DIR/$tdir/foo$i"
21286 sleep 3 # avoid MDT return cached statfs
21287 wait_delete_completed
21288 echo "after unlink:"
21290 after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
21292 # allow for an llog to be created during the test
21293 [ $after_used -le $((before_used + 1)) ] ||
21294 error "after ($after_used) > before ($before_used) + 1"
21296 run_test 803a "verify agent object for remote object"
21299 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21300 [ $MDS1_VERSION -lt $(version_code 2.13.56) ] &&
21301 skip "MDS needs to be newer than 2.13.56"
21302 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21304 for i in $(seq 0 $((MDSCOUNT - 1))); do
21305 $LFS mkdir -i $i $DIR/$tdir.$i || error "mkdir $tdir.$i"
21313 stat $DIR/$tdir.* >/dev/null || error "stat $tdir.*"
21314 for i in $(seq 0 $((MDSCOUNT - 1))); do
21315 tmp=$(do_facet mds$i $LCTL get_param mdt.*-MDT000$i.md_stats |
21316 awk '/getattr/ { print $2 }')
21317 before=$((before + tmp))
21319 stat $DIR/$tdir.* >/dev/null || error "stat $tdir.*"
21320 for i in $(seq 0 $((MDSCOUNT - 1))); do
21321 tmp=$(do_facet mds$i $LCTL get_param mdt.*-MDT000$i.md_stats |
21322 awk '/getattr/ { print $2 }')
21323 after=$((after + tmp))
21326 [ $before -eq $after ] || error "getattr count $before != $after"
21328 run_test 803b "remote object can getattr from cache"
21331 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
21332 [ $MDS1_VERSION -lt $(version_code 2.10.54) ] &&
21333 skip "MDS needs to be newer than 2.10.54"
21334 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
21336 mkdir -p $DIR/$tdir
21337 $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 ||
21338 error "Fail to create $DIR/$tdir/dir0"
21340 local fid=$($LFS path2fid $DIR/$tdir/dir0)
21341 local dev=$(mdsdevname 2)
21343 do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21344 grep ${fid} || error "NOT found agent entry for dir0"
21346 $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 ||
21347 error "Fail to create $DIR/$tdir/dir1"
21349 touch $DIR/$tdir/dir1/foo0 ||
21350 error "Fail to create $DIR/$tdir/dir1/foo0"
21351 fid=$($LFS path2fid $DIR/$tdir/dir1/foo0)
21354 for idx in $(seq $MDSCOUNT); do
21355 dev=$(mdsdevname $idx)
21356 do_facet mds${idx} \
21357 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21358 grep ${fid} && rc=$idx
21361 mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 ||
21362 error "Fail to rename foo0 to foo1"
21363 if [ $rc -eq 0 ]; then
21364 for idx in $(seq $MDSCOUNT); do
21365 dev=$(mdsdevname $idx)
21366 do_facet mds${idx} \
21367 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21368 grep ${fid} && rc=$idx
21372 mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 ||
21373 error "Fail to rename foo1 to foo2"
21374 if [ $rc -eq 0 ]; then
21375 for idx in $(seq $MDSCOUNT); do
21376 dev=$(mdsdevname $idx)
21377 do_facet mds${idx} \
21378 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" |
21379 grep ${fid} && rc=$idx
21383 [ $rc -ne 0 ] || error "NOT found agent entry for foo"
21385 ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard ||
21386 error "Fail to link to $DIR/$tdir/dir1/foo2"
21387 mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 ||
21388 error "Fail to rename foo2 to foo0"
21389 unlink $DIR/$tdir/dir1/foo0 ||
21390 error "Fail to unlink $DIR/$tdir/dir1/foo0"
21391 rm -rf $DIR/$tdir/dir0 ||
21392 error "Fail to rm $DIR/$tdir/dir0"
21394 for idx in $(seq $MDSCOUNT); do
21395 dev=$(mdsdevname $idx)
21399 run_e2fsck $(facet_active_host mds$idx) $dev -n ||
21401 start mds${idx} $dev $MDS_MOUNT_OPTS ||
21402 error "mount mds$idx failed"
21403 df $MOUNT > /dev/null 2>&1
21405 # e2fsck should not return error
21407 error "e2fsck detected error on MDT${idx}: rc=$rc"
21410 run_test 804 "verify agent entry for remote entry"
21413 do_facet $SINGLEMDS zfs set quota=$old $fsset
21414 unlinkmany $DIR/$tdir/f- 1000000
21419 local zfs_version=$(do_facet mds1 cat /sys/module/zfs/version)
21420 [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test"
21421 [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
21422 skip "netfree not implemented before 0.7"
21423 [[ $MDS1_VERSION -ge $(version_code 2.10.57) ]] ||
21424 skip "Need MDS version at least 2.10.57"
21431 local pref="osd-zfs.lustre-MDT0000."
21433 # limit available space on MDS dataset to meet nospace issue
21434 # quickly. then ZFS 0.7.2 can use reserved space if asked
21435 # properly (using netfree flag in osd_declare_destroy()
21436 fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
21437 old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
21439 freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
21440 usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
21441 let "usedkb=usedkb-freekb"
21442 let "freekb=freekb/2"
21443 if let "freekb > 5000"; then
21446 do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
21447 trap cleanup_805 EXIT
21449 $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
21450 createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
21451 rm -rf $DIR/$tdir || error "not able to remove"
21452 do_facet $SINGLEMDS zfs set quota=$old $fsset
21455 run_test 805 "ZFS can remove from full fs"
21461 local size=$($LFS getsom -s $file)
21462 local expect=$(stat -c %s $file)
21464 [[ $size == $expect ]] ||
21465 error "$file expected size: $expect, got: $size"
21467 local blocks=$($LFS getsom -b $file)
21468 expect=$(stat -c %b $file)
21469 [[ $blocks == $expect ]] ||
21470 error "$file expected blocks: $expect, got: $blocks"
21475 local size=$($LFS getsom -s $1)
21478 [[ $size == $expect ]] ||
21479 error "$file expected size: $expect, got: $size"
21483 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21484 skip "Need MDS version at least 2.11.52"
21488 touch $DIR/$tfile || error "touch $tfile failed"
21490 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21491 save_lustre_params client "llite.*.xattr_cache" > $save
21492 lctl set_param llite.*.xattr_cache=0
21493 stack_trap "restore_lustre_params < $save" EXIT
21495 # single-threaded write
21496 echo "Test SOM for single-threaded write"
21497 dd if=/dev/zero of=$DIR/$tfile bs=$bs count=1 ||
21498 error "write $tfile failed"
21499 check_lsom_size $DIR/$tfile $bs
21502 local size=$(($num * $bs))
21506 echo "Test SOM for single client multi-threaded($num) write"
21507 $TRUNCATE $DIR/$tfile 0
21508 for ((i = 0; i < $num; i++)); do
21509 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21511 offset=$((offset + $bs))
21513 for (( i=0; i < $num; i++ )); do
21516 check_lsom_size $DIR/$tfile $size
21518 $TRUNCATE $DIR/$tfile 0
21519 for ((i = 0; i < $num; i++)); do
21520 offset=$((offset - $bs))
21521 $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21524 for (( i=0; i < $num; i++ )); do
21527 check_lsom_size $DIR/$tfile $size
21529 # multi-client writes
21530 num=$(get_node_count ${CLIENTS//,/ })
21531 size=$(($num * $bs))
21535 echo "Test SOM for multi-client ($num) writes"
21536 $TRUNCATE $DIR/$tfile 0
21537 for client in ${CLIENTS//,/ }; do
21538 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21541 offset=$((offset + $bs))
21543 for (( i=0; i < $num; i++ )); do
21546 check_lsom_size $DIR/$tfile $offset
21549 $TRUNCATE $DIR/$tfile 0
21550 for client in ${CLIENTS//,/ }; do
21551 offset=$((offset - $bs))
21552 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21556 for (( i=0; i < $num; i++ )); do
21559 check_lsom_size $DIR/$tfile $size
21562 echo "Test SOM for truncate"
21563 $TRUNCATE $DIR/$tfile 1048576
21564 check_lsom_size $DIR/$tfile 1048576
21565 $TRUNCATE $DIR/$tfile 1234
21566 check_lsom_size $DIR/$tfile 1234
21568 # verify SOM blocks count
21569 echo "Verify SOM block count"
21570 $TRUNCATE $DIR/$tfile 0
21571 $MULTIOP $DIR/$tfile oO_TRUNC:O_RDWR:w1048576YSc ||
21572 error "failed to write file $tfile"
21573 check_lsom_data $DIR/$tfile
21575 run_test 806 "Verify Lazy Size on MDS"
21578 [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
21579 skip "Need MDS version at least 2.11.52"
21581 # Registration step
21582 changelog_register || error "changelog_register failed"
21583 local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
21584 changelog_users $SINGLEMDS | grep -q $cl_user ||
21585 error "User $cl_user not found in changelog_users"
21587 local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
21588 save_lustre_params client "llite.*.xattr_cache" > $save
21589 lctl set_param llite.*.xattr_cache=0
21590 stack_trap "restore_lustre_params < $save" EXIT
21592 rm -rf $DIR/$tdir || error "rm $tdir failed"
21593 mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
21594 touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
21595 $TRUNCATE $DIR/$tdir/trunc 1024 || error "truncate $tdir/trunc failed"
21596 $TRUNCATE $DIR/$tdir/trunc 1048576 ||
21597 error "truncate $tdir/trunc failed"
21600 dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
21601 error "write $tfile failed"
21603 # multi-client wirtes
21604 local num=$(get_node_count ${CLIENTS//,/ })
21608 echo "Test SOM for multi-client ($num) writes"
21609 touch $DIR/$tfile || error "touch $tfile failed"
21610 $TRUNCATE $DIR/$tfile 0
21611 for client in ${CLIENTS//,/ }; do
21612 do_node $client $MULTIOP $DIR/$tfile Oz${offset}w${bs}c &
21615 offset=$((offset + $bs))
21617 for (( i=0; i < $num; i++ )); do
21622 $LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
21623 check_lsom_data $DIR/$tdir/trunc
21624 check_lsom_data $DIR/$tdir/single_dd
21625 check_lsom_data $DIR/$tfile
21628 # Deregistration step
21629 changelog_deregister || error "changelog_deregister failed"
21631 run_test 807 "verify LSOM syncing tool"
21633 check_som_nologged()
21635 local lines=$($LFS changelog $FSNAME-MDT0000 |
21636 grep 'x=trusted.som' | wc -l)
21637 [ $lines -ne 0 ] && error "trusted.som xattr is logged in Changelogs"
21641 [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
21642 skip "Need MDS version at least 2.11.55"
21644 # Registration step
21645 changelog_register || error "changelog_register failed"
21647 touch $DIR/$tfile || error "touch $tfile failed"
21650 dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=1 ||
21651 error "write $tfile failed"
21654 $TRUNCATE $DIR/$tfile 1234
21657 $TRUNCATE $DIR/$tfile 1048576
21660 # Deregistration step
21661 changelog_deregister || error "changelog_deregister failed"
21663 run_test 808 "Check trusted.som xattr not logged in Changelogs"
21668 [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
21672 [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
21673 skip "Need MDS version at least 2.11.56"
21675 $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
21676 error "failed to create DoM-only file $DIR/$tfile"
21677 touch $DIR/$tfile || error "touch $tfile failed"
21678 check_som_nodata $DIR/$tfile
21680 dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
21681 error "write $tfile failed"
21682 check_som_nodata $DIR/$tfile
21684 $TRUNCATE $DIR/$tfile 1234
21685 check_som_nodata $DIR/$tfile
21687 $TRUNCATE $DIR/$tfile 4097
21688 check_som_nodata $DIR/$file
21690 run_test 809 "Verify no SOM xattr store for DoM-only files"
21693 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21694 $GSS && skip_env "could not run with gss"
21697 stack_trap "set_checksums $ORIG_CSUM" EXIT
21698 stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT
21703 for csum in $CKSUM_TYPES; do
21704 #define OBD_FAIL_OSC_NO_GRANT 0x411
21705 $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411
21706 for i in "10240 0" "10000 0" "4000 1" "500 1"; do
21708 dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2
21709 before=$(md5sum $DIR/$tfile)
21710 $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear
21711 after=$(md5sum $DIR/$tfile)
21712 [ "$before" == "$after" ] ||
21713 error "$csum: $before != $after bs=$1 seek=$2"
21717 run_test 810 "partial page writes on ZFS (LU-11663)"
21720 [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
21721 skip "OST < 2.12.51 doesn't support this fail_loc"
21722 [ "$SHARED_KEY" = true ] &&
21723 skip "OSC connections never go IDLE with Shared-Keys enabled"
21725 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21726 # ensure ost1 is connected
21727 stat $DIR/$tfile >/dev/null || error "can't stat"
21728 wait_osc_import_state client ost1 FULL
21729 # no locks, no reqs to let the connection idle
21730 cancel_lru_locks osc
21732 # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
21733 #define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
21734 do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
21735 wait_osc_import_state client ost1 CONNECTING
21736 do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
21738 stat $DIR/$tfile >/dev/null || error "can't stat file"
21740 run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
21744 dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
21745 echo -n y >> $DIR/$tfile
21746 cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
21747 diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
21749 run_test 814 "sparse cp works as expected (LU-12361)"
21753 writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
21754 writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
21756 run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
21759 [ "$SHARED_KEY" = true ] &&
21760 skip "OSC connections never go IDLE with Shared-Keys enabled"
21762 $LFS setstripe -c 1 -i 0 $DIR/$tfile
21763 # ensure ost1 is connected
21764 stat $DIR/$tfile >/dev/null || error "can't stat"
21765 wait_osc_import_state client ost1 FULL
21766 # no locks, no reqs to let the connection idle
21767 cancel_lru_locks osc
21768 lru_resize_disable osc
21771 before=$($LCTL get_param -n \
21772 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21774 wait_osc_import_state client ost1 IDLE
21775 dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
21776 now=$($LCTL get_param -n \
21777 ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
21778 [ $before == $now ] || error "lru_size changed $before != $now"
21780 run_test 816 "do not reset lru_resize on idle reconnect"
21784 exportfs -u localhost:$DIR/nfsexp
21789 systemctl restart nfs-server.service || skip "failed to restart nfsd"
21791 mkdir -p $DIR/nfsexp
21792 exportfs -orw,no_root_squash localhost:$DIR/nfsexp ||
21793 error "failed to export nfs"
21795 tmpdir=$(mktemp -d /tmp/nfs-XXXXXX)
21796 stack_trap cleanup_817 EXIT
21798 mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir ||
21799 error "failed to mount nfs to $tmpdir"
21801 cp /bin/true $tmpdir
21802 $DIR/nfsexp/true || error "failed to execute 'true' command"
21804 run_test 817 "nfsd won't cache write lock for exec file"
21807 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21808 cancel_lru_locks osc
21809 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21810 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21811 dd if=$DIR/$tfile of=/dev/null bs=1M count=1
21814 run_test 819a "too big niobuf in read"
21817 #define OBD_FAIL_OST_2BIG_NIOBUF 0x248
21818 do_facet $SINGLEMDS lctl set_param fail_loc=0x80000248
21819 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21820 cancel_lru_locks osc
21824 run_test 819b "too big niobuf in write"
21828 $LFS setstripe -c1 -i0 $DIR/$tfile
21829 $LFS setstripe -c1 -i1 $DIR/$tfile
21831 #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105
21832 do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105
21833 start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS ||
21834 error "start $SINGLEMDS failed"
21837 run_test 818 "unlink with failed llog"
21840 # tests that do cleanup/setup should be run at the end
21844 [ $PARALLEL == "yes" ] && skip "skip parallel run"
21847 #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
21848 $LCTL set_param fail_loc=0x903
21850 cancel_lru_locks MGC
21852 FAIL_ON_ERROR=true cleanup
21853 FAIL_ON_ERROR=true setup
21855 run_test 900 "umount should not race with any mgc requeue thread"
21859 [ $CLIENT_VERSION -lt $(version_code 2.13.52) ] &&
21860 skip "client does not have LU-13377 fix"
21861 #define OBD_FAIL_LLITE_SHORT_COMMIT 0x1415
21862 $LCTL set_param fail_loc=0x1415
21863 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
21864 cancel_lru_locks osc
21867 run_test 902 "test short write doesn't hang lustre"
21870 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
21871 check_and_cleanup_lustre
21872 if [ "$I_MOUNTED" != "yes" ]; then
21873 lctl set_param debug="$OLDDEBUG" 2> /dev/null || true