3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
6 # e.g. ONLY="22 23" or ONLY="`seq 32 39`" or EXCEPT="31"
11 # Check Grants after these tests
12 GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c 64d"
17 CREATETEST=${CREATETEST:-createtest}
18 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
19 OPENFILE=${OPENFILE:-openfile}
20 OPENUNLINK=${OPENUNLINK:-openunlink}
21 READS=${READS:-"reads"}
22 MUNLINK=${MUNLINK:-munlink}
23 SOCKETSERVER=${SOCKETSERVER:-socketserver}
24 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
25 MEMHOG=${MEMHOG:-memhog}
26 DIRECTIO=${DIRECTIO:-directio}
27 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
29 CHECK_GRANT=${CHECK_GRANT:-"yes"}
30 GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
31 export PARALLEL=${PARALLEL:-"no"}
34 LUSTRE=${LUSTRE:-$(dirname $0)/..}
35 LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
36 . $LUSTRE/tests/test-framework.sh
41 ALWAYS_EXCEPT="$SANITY_EXCEPT "
42 # bug number for skipped test: LU-9693 LU-6493 LU-9693
43 ALWAYS_EXCEPT+=" 42a 42b 42c "
44 # bug number: LU-8411 LU-9054
45 ALWAYS_EXCEPT+=" 407 312"
48 # bug number: LU-14181 LU-14181
49 ALWAYS_EXCEPT+=" 64e 64f"
52 selinux_status=$(getenforce)
53 if [ "$selinux_status" != "Disabled" ]; then
58 # skip the grant tests for ARM until they are fixed
59 if [[ $(uname -m) = aarch64 ]]; then
60 # bug number: LU-11596
61 ALWAYS_EXCEPT+=" $GRANT_CHECK_LIST"
62 # bug number: LU-11671 LU-11667
63 ALWAYS_EXCEPT+=" 45 317"
64 # bug number: LU-14067 LU-14067
65 ALWAYS_EXCEPT+=" 400a 400b"
68 # skip nfs tests on kernels >= 4.12.0 until they are fixed
69 if [ $LINUX_VERSION_CODE -ge $(version_code 4.12.0) ]; then
70 # bug number: LU-12661
73 # skip cgroup tests on RHEL8.1 kernels until they are fixed
74 if (( $LINUX_VERSION_CODE >= $(version_code 4.18.0) &&
75 $LINUX_VERSION_CODE < $(version_code 5.4.0) )); then
76 # bug number: LU-13063
81 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 135 136 300o"
83 if [ "$mds1_FSTYPE" = "zfs" ]; then
84 # bug number for skipped test:
87 [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
90 if [ "$ost1_FSTYPE" = "zfs" ]; then
91 # bug number for skipped test: LU-1941 LU-1941 LU-1941 LU-1941
92 ALWAYS_EXCEPT+=" 130a 130b 130c 130d 130e 130f 130g"
95 # Get the SLES distro version
97 # Returns a version string that should only be used in comparing
98 # strings returned by version_code()
101 local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2)
103 # All SuSE Linux versions have one decimal. version_code expects two
104 local sles_version=$version.0
105 version_code $sles_version
108 # Check if we are running on Ubuntu or SLES so we can make decisions on
110 if [ -r /etc/SuSE-release ]; then
111 sles_version=$(sles_version_code)
112 [ $sles_version -lt $(version_code 11.4.0) ] &&
113 # bug number for skipped test: LU-4341
114 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170"
115 [ $sles_version -lt $(version_code 12.0.0) ] &&
116 # bug number for skipped test: LU-3703
117 ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234"
118 elif [ -r /etc/os-release ]; then
119 if grep -qi ubuntu /etc/os-release; then
120 ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
121 -e 's/^VERSION=//p' \
125 if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
126 # bug number for skipped test:
128 ALWAYS_EXCEPT+=" 103a 410"
138 pgrep ll_sa > /dev/null && { echo "There are ll_sa thread not exit!"; exit 20; }
139 cleanupall ${FORCE} $* || { echo "FAILed to clean up"; exit 20; }
148 check_swap_layouts_support()
150 $LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
151 skip "Does not support layout lock."
154 check_swap_layout_no_dom()
157 local SUPP=$(lfs getstripe $FOLDER | grep "pattern: mdt" | wc -l)
158 [ $SUPP -eq 0 ] || skip "layout swap does not support DOM files so far"
161 check_and_setup_lustre
165 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
167 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
168 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
169 rm -rf $DIR/[Rdfs][0-9]*
171 # $RUNAS_ID may get set incorrectly somewhere else
172 [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] &&
173 error "\$RUNAS_ID set to 0, but \$UID is also 0!"
175 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
177 if [ "${ONLY}" = "MOUNT" ] ; then
178 echo "Lustre is up, please go on"
182 echo "preparing for tests involving mounts"
183 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
185 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
186 echo # add a newline after mke2fs.
190 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
191 lctl set_param debug=-1 2> /dev/null || true
194 $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
196 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
198 run_test 0a "touch; rm ====================="
201 chmod 0755 $DIR || error "chmod 0755 $DIR failed"
202 $CHECKSTAT -p 0755 $DIR || error "$DIR permission is not 0755"
204 run_test 0b "chmod 0755 $DIR ============================="
207 $LCTL get_param mdc.*.import | grep "state: FULL" ||
208 error "import not FULL"
209 $LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" ||
212 run_test 0c "check import proc"
214 test_0d() { # LU-3397
215 [ $MGS_VERSION -lt $(version_code 2.10.57) ] &&
216 skip "proc exports not supported before 2.10.57"
218 local mgs_exp="mgs.MGS.exports"
219 local client_uuid=$($LCTL get_param -n mgc.*.uuid)
221 local exp_client_version
224 local temp_imp=$DIR/$tfile.import
225 local temp_exp=$DIR/$tfile.export
227 # save mgc import file to $temp_imp
228 $LCTL get_param mgc.*.import | tee $temp_imp
229 # Check if client uuid is found in MGS export
230 for exp_client_nid in $(do_facet mgs $LCTL get_param -N $mgs_exp.*); do
231 [ $(do_facet mgs $LCTL get_param -n $exp_client_nid.uuid) == \
235 # save mgs export file to $temp_exp
236 do_facet mgs $LCTL get_param $exp_client_nid.export | tee $temp_exp
238 # Compare the value of field "connect_flags"
239 imp_val=$(grep "connect_flags" $temp_imp)
240 exp_val=$(grep "connect_flags" $temp_exp)
241 [ "$exp_val" == "$imp_val" ] ||
242 error "export flags '$exp_val' != import flags '$imp_val'"
244 # Compare client versions. Only compare top-3 fields for compatibility
245 exp_client_version=$(awk '/target_version:/ { print $2 }' $temp_exp)
246 exp_val=$(version_code $(cut -d. -f1,2,3 <<<$exp_client_version))
247 imp_val=$(version_code $(lustre_build_version client | cut -d. -f1,2,3))
248 [ "$exp_val" == "$imp_val" ] ||
249 error "exp version '$exp_client_version'($exp_val) != " \
250 "'$(lustre_build_version client)'($imp_val)"
252 run_test 0d "check export proc ============================="
255 test_mkdir $DIR/$tdir
256 test_mkdir $DIR/$tdir/d2
257 mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
258 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir"
261 $CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed"
263 run_test 1 "mkdir; remkdir; rmdir"
266 test_mkdir $DIR/$tdir
267 touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed"
268 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
270 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed"
272 run_test 2 "mkdir; touch; rmdir; check file"
275 test_mkdir $DIR/$tdir
276 $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
277 touch $DIR/$tdir/$tfile
278 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
280 $CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed"
282 run_test 3 "mkdir; touch; rmdir; check dir"
284 # LU-4471 - failed rmdir on remote directories still removes directory on MDT0
286 test_mkdir -i 1 $DIR/$tdir
288 touch $DIR/$tdir/$tfile ||
289 error "Create file under remote directory failed"
292 error "Expect error removing in-use dir $DIR/$tdir"
294 test -d $DIR/$tdir || error "Remote directory disappeared"
296 rm -rf $DIR/$tdir || error "remove remote dir error"
298 run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
301 test_mkdir $DIR/$tdir
302 test_mkdir $DIR/$tdir/d2
303 chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed"
304 $CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707"
305 $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
307 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2"
310 touch $DIR/$tfile || error "touch $DIR/$tfile failed"
311 chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
312 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
313 error "$tfile does not have perm 0666 or UID $UID"
314 $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
315 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
316 error "$tfile should be 0666 and owned by UID $UID"
318 run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
321 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
324 chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
325 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
326 error "$tfile should be owned by UID $RUNAS_ID"
327 $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
328 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
329 error "$tfile should be owned by UID $RUNAS_ID"
331 run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
334 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
337 chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
338 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
339 error "$tfile should be owned by GID $UID"
340 $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
341 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
342 error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
344 run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)"
347 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
349 test_mkdir $DIR/$tdir
350 chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed"
351 $RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
352 chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed"
353 test_mkdir $DIR/$tdir/d/subdir
354 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir ||
355 error "$tdir/d/subdir should be GID $RUNAS_GID"
356 if [[ $MDSCOUNT -gt 1 ]]; then
357 # check remote dir sgid inherite
358 $LFS mkdir -i 0 $DIR/$tdir.local ||
359 error "mkdir $tdir.local failed"
360 chmod g+s $DIR/$tdir.local ||
361 error "chmod $tdir.local failed"
362 chgrp $RUNAS_GID $DIR/$tdir.local ||
363 error "chgrp $tdir.local failed"
364 $LFS mkdir -i 1 $DIR/$tdir.local/$tdir.remote ||
365 error "mkdir $tdir.remote failed"
366 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir.local/$tdir.remote ||
367 error "$tdir.remote should be owned by $UID.$RUNAS_ID"
368 $CHECKSTAT -p 02755 $DIR/$tdir.local/$tdir.remote ||
369 error "$tdir.remote should be mode 02755"
372 run_test 6g "verify new dir in sgid dir inherits group"
374 test_6h() { # bug 7331
375 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
377 touch $DIR/$tfile || error "touch failed"
378 chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile || error "initial chown failed"
379 $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/$tfile &&
380 error "chown $RUNAS_ID:0 $tfile worked as GID $RUNAS_GID"
381 $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile ||
382 error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID"
384 run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)"
387 test_mkdir $DIR/$tdir
388 $MCREATE $DIR/$tdir/$tfile
389 chmod 0666 $DIR/$tdir/$tfile
390 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
391 error "$tdir/$tfile should be mode 0666"
393 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
396 if [ ! -d $DIR/$tdir ]; then
397 test_mkdir $DIR/$tdir
399 $MCREATE $DIR/$tdir/$tfile
400 echo -n foo > $DIR/$tdir/$tfile
401 [ "$(cat $DIR/$tdir/$tfile)" = "foo" ] || error "$tdir/$tfile not 'foo'"
402 $CHECKSTAT -t file -s 3 $DIR/$tdir/$tfile || error "$tfile size not 3"
404 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
407 test_mkdir $DIR/$tdir
408 touch $DIR/$tdir/$tfile
409 chmod 0666 $DIR/$tdir/$tfile
410 $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
411 error "$tfile mode not 0666"
413 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
416 test_mkdir $DIR/$tdir
417 test_mkdir $DIR/$tdir/d2
418 test_mkdir $DIR/$tdir/d2/d3
419 $CHECKSTAT -t dir $DIR/$tdir/d2/d3 || error "$tdir/d2/d3 not a dir"
421 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
424 test_mkdir $DIR/$tdir
425 test_mkdir $DIR/$tdir/d2
426 touch $DIR/$tdir/d2/$tfile
427 $CHECKSTAT -t file $DIR/$tdir/d2/$tfile ||
428 error "$tdir/d2/$tfile not a file"
430 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
433 test_mkdir $DIR/$tdir
434 test_mkdir $DIR/$tdir/d2
435 chmod 0666 $DIR/$tdir/d2
436 chmod 0705 $DIR/$tdir/d2
437 $CHECKSTAT -t dir -p 0705 $DIR/$tdir/d2 ||
438 error "$tdir/d2 mode not 0705"
440 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
443 test_mkdir $DIR/$tdir
444 touch $DIR/$tdir/$tfile
445 chmod 0666 $DIR/$tdir/$tfile
446 chmod 0654 $DIR/$tdir/$tfile
447 $CHECKSTAT -t file -p 0654 $DIR/$tdir/$tfile ||
448 error "$tdir/d2 mode not 0654"
450 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
453 test_mkdir $DIR/$tdir
454 dd if=/dev/zero of=$DIR/$tdir/$tfile count=10
456 $CHECKSTAT -t file -s 0 $DIR/$tdir/$tfile ||
457 error "$tdir/$tfile size not 0 after truncate"
459 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
462 test_mkdir $DIR/$tdir
463 touch $DIR/$tdir/$tfile
465 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
467 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
470 test_mkdir $DIR/$tdir
471 touch $DIR/$tdir/$tfile
472 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
473 $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
474 error "$tdir/${tfile_2} not a file after rename"
475 rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
477 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
480 test_mkdir $DIR/$tdir
481 touch $DIR/$tdir/$tfile
482 rm -rf $DIR/$tdir/$tfile
483 $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
485 run_test 16 "touch .../d16/f; rm -rf .../d16/f"
488 test_mkdir $DIR/$tdir
489 touch $DIR/$tdir/$tfile
490 ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist
492 $CHECKSTAT -l $DIR/$tdir/$tfile $DIR/$tdir/l-exist ||
493 error "$tdir/l-exist not a symlink"
494 $CHECKSTAT -f -t f $DIR/$tdir/l-exist ||
495 error "$tdir/l-exist not referencing a file"
496 rm -f $DIR/$tdir/l-exist
497 $CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed"
499 run_test 17a "symlinks: create, remove (real)"
502 test_mkdir $DIR/$tdir
503 ln -s no-such-file $DIR/$tdir/l-dangle
505 $CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle ||
506 error "$tdir/l-dangle not referencing no-such-file"
507 $CHECKSTAT -fa $DIR/$tdir/l-dangle ||
508 error "$tdir/l-dangle not referencing non-existent file"
509 rm -f $DIR/$tdir/l-dangle
510 $CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed"
512 run_test 17b "symlinks: create, remove (dangling)"
514 test_17c() { # bug 3440 - don't save failed open RPC for replay
515 test_mkdir $DIR/$tdir
516 ln -s foo $DIR/$tdir/$tfile
517 cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true
519 run_test 17c "symlinks: open dangling (should return error)"
522 test_mkdir $DIR/$tdir
523 ln -s foo $DIR/$tdir/$tfile
524 touch $DIR/$tdir/$tfile || error "creating to new symlink"
526 run_test 17d "symlinks: create dangling"
529 test_mkdir $DIR/$tdir
530 local foo=$DIR/$tdir/$tfile
531 ln -s $foo $foo || error "create symlink failed"
532 ls -l $foo || error "ls -l failed"
533 ls $foo && error "ls not failed" || true
535 run_test 17e "symlinks: create recursive symlink (should return error)"
538 test_mkdir $DIR/$tdir
539 ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
540 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
541 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
542 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
543 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
544 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
547 run_test 17f "symlinks: long and very long symlink name"
549 # str_repeat(S, N) generate a string that is string S repeated N times
554 while [ $((n -= 1)) -ge 0 ]; do
560 # Long symlinks and LU-2241
562 test_mkdir $DIR/$tdir
563 local TESTS="59 60 61 4094 4095"
565 # Fix for inode size boundary in 2.1.4
566 [ $MDS1_VERSION -lt $(version_code 2.1.4) ] &&
569 # Patch not applied to 2.2 or 2.3 branches
570 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
571 [ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
575 local SYMNAME=$(str_repeat 'x' $i)
576 ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
577 readlink $DIR/$tdir/f$i || error "failed $i-char readlink"
580 run_test 17g "symlinks: really long symlink name and inode boundaries"
582 test_17h() { #bug 17378
583 [ $PARALLEL == "yes" ] && skip "skip parallel run"
584 remote_mds_nodsh && skip "remote MDS with nodsh"
588 test_mkdir $DIR/$tdir
589 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
590 $LFS setstripe -c -1 $DIR/$tdir
591 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
592 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
593 touch $DIR/$tdir/$tfile || true
595 run_test 17h "create objects: lov_free_memmd() doesn't lbug"
597 test_17i() { #bug 20018
598 [ $PARALLEL == "yes" ] && skip "skip parallel run"
599 remote_mds_nodsh && skip "remote MDS with nodsh"
601 local foo=$DIR/$tdir/$tfile
604 test_mkdir -c1 $DIR/$tdir
605 mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
606 ln -s $foo $foo || error "create symlink failed"
607 #define OBD_FAIL_MDS_READLINK_EPROTO 0x143
608 do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000143
609 ls -l $foo && error "error not detected"
612 run_test 17i "don't panic on short symlink (should return error)"
614 test_17k() { #bug 22301
615 [ $PARALLEL == "yes" ] && skip "skip parallel run"
616 [[ -z "$(which rsync 2>/dev/null)" ]] &&
617 skip "no rsync command"
618 rsync --help | grep -q xattr ||
619 skip_env "$(rsync --version | head -n1) does not support xattrs"
620 test_mkdir $DIR/$tdir
621 test_mkdir $DIR/$tdir.new
622 touch $DIR/$tdir/$tfile
623 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
624 rsync -av -X $DIR/$tdir/ $DIR/$tdir.new ||
625 error "rsync failed with xattrs enabled"
627 run_test 17k "symlinks: rsync with xattrs enabled"
629 test_17l() { # LU-279
630 [[ -z "$(which getfattr 2>/dev/null)" ]] &&
631 skip "no getfattr command"
633 test_mkdir $DIR/$tdir
634 touch $DIR/$tdir/$tfile
635 ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
636 for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
637 # -h to not follow symlinks. -m '' to list all the xattrs.
638 # grep to remove first line: '# file: $path'.
639 for xattr in `getfattr -hm '' $path 2>/dev/null | grep -v '^#'`;
641 lgetxattr_size_check $path $xattr ||
642 error "lgetxattr_size_check $path $xattr failed"
646 run_test 17l "Ensure lgetxattr's returned xattr size is consistent"
650 [ $PARALLEL == "yes" ] && skip "skip parallel run"
651 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
652 remote_mds_nodsh && skip "remote MDS with nodsh"
653 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
654 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
655 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
657 local short_sym="0123456789"
658 local wdir=$DIR/$tdir
663 # create a long symlink file
664 for ((i = 0; i < 4; ++i)); do
665 long_sym=${long_sym}${long_sym}
668 echo "create 512 short and long symlink files under $wdir"
669 for ((i = 0; i < 256; ++i)); do
670 ln -sf ${long_sym}"a5a5" $wdir/long-$i
671 ln -sf ${short_sym}"a5a5" $wdir/short-$i
677 wait_delete_completed
679 echo "recreate the 512 symlink files with a shorter string"
680 for ((i = 0; i < 512; ++i)); do
681 # rewrite the symlink file with a shorter string
682 ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed"
683 ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed"
686 local mds_index=$(($($LFS getstripe -m $wdir) + 1))
687 local devname=$(mdsdevname $mds_index)
689 echo "stop and checking mds${mds_index}:"
690 # e2fsck should not return error
692 run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
695 start mds${mds_index} $devname $MDS_MOUNT_OPTS ||
696 error "start mds${mds_index} failed"
697 df $MOUNT > /dev/null 2>&1
699 error "e2fsck detected error for short/long symlink: rc=$rc"
702 run_test 17m "run e2fsck against MDT which contains short/long symlink"
704 check_fs_consistency_17n() {
708 # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
709 # so it only check MDT1/MDT2 instead of all of MDTs.
710 for mdt_index in 1 2; do
711 local devname=$(mdsdevname $mdt_index)
712 # e2fsck should not return error
714 run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
717 start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
718 error "mount mds$mdt_index failed"
719 df $MOUNT > /dev/null 2>&1
725 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
726 [ $PARALLEL == "yes" ] && skip "skip parallel run"
727 [ "$mds1_FSTYPE" != "ldiskfs" ] && skip_env "ldiskfs only test"
728 remote_mds_nodsh && skip "remote MDS with nodsh"
729 [ $MDS1_VERSION -ge $(version_code 2.2.0) ] &&
730 [ $MDS1_VERSION -le $(version_code 2.2.93) ] &&
731 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
735 test_mkdir $DIR/$tdir
736 for ((i=0; i<10; i++)); do
737 $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
738 error "create remote dir error $i"
739 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
740 error "create files under remote dir failed $i"
743 check_fs_consistency_17n ||
744 error "e2fsck report error after create files under remote dir"
746 for ((i = 0; i < 10; i++)); do
747 rm -rf $DIR/$tdir/remote_dir_${i} ||
748 error "destroy remote dir error $i"
751 check_fs_consistency_17n ||
752 error "e2fsck report error after unlink files under remote dir"
754 [ $MDS1_VERSION -lt $(version_code 2.4.50) ] &&
755 skip "lustre < 2.4.50 does not support migrate mv"
757 for ((i = 0; i < 10; i++)); do
758 mkdir -p $DIR/$tdir/remote_dir_${i}
759 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
760 error "create files under remote dir failed $i"
761 $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
762 error "migrate remote dir error $i"
764 check_fs_consistency_17n || error "e2fsck report error after migration"
766 for ((i = 0; i < 10; i++)); do
767 rm -rf $DIR/$tdir/remote_dir_${i} ||
768 error "destroy remote dir error $i"
771 check_fs_consistency_17n || error "e2fsck report error after unlink"
773 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
776 remote_mds_nodsh && skip "remote MDS with nodsh"
777 [ $MDS1_VERSION -lt $(version_code 2.3.64) ] &&
778 skip "Need MDS version at least 2.3.64"
780 local wdir=$DIR/${tdir}o
786 mdt_index=$($LFS getstripe -m $wdir/$tfile)
787 mdt_index=$((mdt_index + 1))
790 #fail mds will wait the failover finish then set
791 #following fail_loc to avoid interfer the recovery process.
794 #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
795 do_facet mds${mdt_index} lctl set_param fail_loc=0x194
796 ls -l $wdir/$tfile && rc=1
797 do_facet mds${mdt_index} lctl set_param fail_loc=0
798 [[ $rc -eq 0 ]] || error "stat file should fail"
800 run_test 17o "stat file with incompat LMA feature"
803 touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
804 ls $DIR || error "Failed to ls $DIR: $?"
806 run_test 18 "touch .../f ; ls ... =============================="
812 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
814 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
817 ls -l $DIR/$tfile && error "ls -l $tfile failed"|| true
819 run_test 19b "ls -l .../f19 (should return error) =============="
822 [ $RUNAS_ID -eq $UID ] &&
823 skip_env "RUNAS_ID = UID = $UID -- skipping"
825 $RUNAS touch $DIR/$tfile && error "create non-root file failed" || true
827 run_test 19c "$RUNAS touch .../f19 (should return error) =="
830 cat $DIR/f19 && error || true
832 run_test 19d "cat .../f19 (should return error) =============="
841 $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
843 run_test 20 "touch .../f ; ls -l ..."
846 test_mkdir $DIR/$tdir
847 [ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle
848 ln -s dangle $DIR/$tdir/link
849 echo foo >> $DIR/$tdir/link
850 cat $DIR/$tdir/dangle
851 $CHECKSTAT -t link $DIR/$tdir/link || error "$tdir/link not a link"
852 $CHECKSTAT -f -t file $DIR/$tdir/link ||
853 error "$tdir/link not linked to a file"
855 run_test 21 "write to dangling link"
858 local wdir=$DIR/$tdir
860 chown $RUNAS_ID:$RUNAS_GID $wdir
861 (cd $wdir || error "cd $wdir failed";
862 $RUNAS tar cf - /etc/hosts /etc/sysconfig/network |
864 ls -lR $wdir/etc || error "ls -lR $wdir/etc failed"
865 $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed"
866 $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc ||
867 error "checkstat -u failed"
869 run_test 22 "unpack tar archive as non-root user"
873 test_mkdir $DIR/$tdir
874 local file=$DIR/$tdir/$tfile
876 openfile -f O_CREAT:O_EXCL $file || error "$file create failed"
877 openfile -f O_CREAT:O_EXCL $file &&
878 error "$file recreate succeeded" || true
880 run_test 23a "O_CREAT|O_EXCL in subdir"
882 test_23b() { # bug 18988
883 test_mkdir $DIR/$tdir
884 local file=$DIR/$tdir/$tfile
887 echo foo > $file || error "write filed"
888 echo bar >> $file || error "append filed"
889 $CHECKSTAT -s 8 $file || error "wrong size"
892 run_test 23b "O_APPEND check"
894 # LU-9409, size with O_APPEND and tiny writes
896 local file=$DIR/$tfile
899 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800
900 $CHECKSTAT -s 6400 $file || error "wrong size, expected 6400"
904 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
905 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
907 $CHECKSTAT -s 12800 $file || error "wrong size, expected 12800"
910 #racing tiny & normal writes
911 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4096 count=4 &
912 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=100 &
914 $CHECKSTAT -s 17184 $file || error "wrong size, expected 17184"
917 #racing tiny & normal writes 2, ugly numbers
918 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4099 count=11 &
919 dd conv=notrunc oflag=append if=/dev/zero of=$file bs=17 count=173 &
921 $CHECKSTAT -s 48030 $file || error "wrong size, expected 48030"
924 run_test 23c "O_APPEND size checks for tiny writes"
926 # LU-11069 file offset is correct after appending writes
928 local file=$DIR/$tfile
931 echo CentaurHauls > $file
932 offset=$($MULTIOP $file oO_WRONLY:O_APPEND:w13Zp)
933 if ((offset != 26)); then
934 error "wrong offset, expected 26, got '$offset'"
937 run_test 23d "file offset is correct after appending writes"
941 echo '-- same directory rename'
942 test_mkdir $DIR/$tdir
943 touch $DIR/$tdir/$tfile.1
944 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
945 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
947 run_test 24a "rename file to non-existent target"
950 test_mkdir $DIR/$tdir
951 touch $DIR/$tdir/$tfile.{1,2}
952 mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
953 $CHECKSTAT -a $DIR/$tdir/$tfile.1 || error "$tfile.1 exists"
954 $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
956 run_test 24b "rename file to existing target"
959 test_mkdir $DIR/$tdir
960 test_mkdir $DIR/$tdir/d$testnum.1
961 mv $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
962 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
963 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
965 run_test 24c "rename directory to non-existent target"
968 test_mkdir -c1 $DIR/$tdir
969 test_mkdir -c1 $DIR/$tdir/d$testnum.1
970 test_mkdir -c1 $DIR/$tdir/d$testnum.2
971 mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
972 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
973 $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
975 run_test 24d "rename directory to existing target"
978 echo '-- cross directory renames --'
982 mv $DIR/R5a/f $DIR/R5b/g
983 $CHECKSTAT -a $DIR/R5a/f || error "$DIR/R5a/f exists"
984 $CHECKSTAT -t file $DIR/R5b/g || error "$DIR/R5b/g not file type"
986 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
991 touch $DIR/R6a/f $DIR/R6b/g
992 mv $DIR/R6a/f $DIR/R6b/g
993 $CHECKSTAT -a $DIR/R6a/f || error "$DIR/R6a/f exists"
994 $CHECKSTAT -t file $DIR/R6b/g || error "$DIR/R6b/g not file type"
996 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
1001 test_mkdir $DIR/R7a/d
1002 mv $DIR/R7a/d $DIR/R7b/e
1003 $CHECKSTAT -a $DIR/R7a/d || error "$DIR/R7a/d exists"
1004 $CHECKSTAT -t dir $DIR/R7b/e || error "$DIR/R7b/e not dir type"
1006 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
1009 test_mkdir -c1 $DIR/R8a
1010 test_mkdir -c1 $DIR/R8b
1011 test_mkdir -c1 $DIR/R8a/d
1012 test_mkdir -c1 $DIR/R8b/e
1013 mrename $DIR/R8a/d $DIR/R8b/e
1014 $CHECKSTAT -a $DIR/R8a/d || error "$DIR/R8a/d exists"
1015 $CHECKSTAT -t dir $DIR/R8b/e || error "$DIR/R8b/e not dir type"
1017 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
1020 echo "-- rename error cases"
1022 test_mkdir $DIR/R9/a
1024 mrename $DIR/R9/f $DIR/R9/a
1025 $CHECKSTAT -t file $DIR/R9/f || error "$DIR/R9/f not file type"
1026 $CHECKSTAT -t dir $DIR/R9/a || error "$DIR/R9/a not dir type"
1027 $CHECKSTAT -a $DIR/R9/a/f || error "$DIR/R9/a/f exists"
1029 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
1033 mrename $DIR/R10/f $DIR/R10/g
1034 $CHECKSTAT -t dir $DIR/R10 || error "$DIR/R10 not dir type"
1035 $CHECKSTAT -a $DIR/R10/f || error "$DIR/R10/f exists"
1036 $CHECKSTAT -a $DIR/R10/g || error "$DIR/R10/g exists"
1038 run_test 24j "source does not exist ============================"
1041 test_mkdir $DIR/R11a
1042 test_mkdir $DIR/R11a/d
1044 mv $DIR/R11a/f $DIR/R11a/d
1045 $CHECKSTAT -a $DIR/R11a/f || error "$DIR/R11a/f exists"
1046 $CHECKSTAT -t file $DIR/R11a/d/f || error "$DIR/R11a/d/f not file type"
1048 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
1050 # bug 2429 - rename foo foo foo creates invalid file
1053 $MULTIOP $f OcNs || error "rename of ${f} to itself failed"
1055 run_test 24l "Renaming a file to itself ========================"
1059 $MULTIOP $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
1060 # on ext3 this does not remove either the source or target files
1061 # though the "expected" operation would be to remove the source
1062 $CHECKSTAT -t file ${f} || error "${f} missing"
1063 $CHECKSTAT -t file ${f}2 || error "${f}2 missing"
1065 run_test 24m "Renaming a file to a hard link to itself ========="
1069 # this stats the old file after it was renamed, so it should fail
1071 $CHECKSTAT ${f} || error "${f} missing"
1073 $CHECKSTAT ${f}.rename || error "${f}.rename missing"
1074 $CHECKSTAT -a ${f} || error "${f} exists"
1076 run_test 24n "Statting the old file after renaming (Posix rename 2)"
1079 test_mkdir $DIR/$tdir
1080 rename_many -s random -v -n 10 $DIR/$tdir
1082 run_test 24o "rename of files during htree split"
1085 test_mkdir $DIR/R12a
1086 test_mkdir $DIR/R12b
1087 DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
1088 mrename $DIR/R12a $DIR/R12b
1089 $CHECKSTAT -a $DIR/R12a || error "$DIR/R12a exists"
1090 $CHECKSTAT -t dir $DIR/R12b || error "$DIR/R12b not dir type"
1091 DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
1092 [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
1094 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
1096 cleanup_multiop_pause() {
1098 kill -USR1 $MULTIPID
1102 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1104 test_mkdir $DIR/R13a
1105 test_mkdir $DIR/R13b
1106 local DIRINO=$(ls -lid $DIR/R13a | awk '{ print $1 }')
1107 multiop_bg_pause $DIR/R13b D_c || error "multiop failed to start"
1110 trap cleanup_multiop_pause EXIT
1111 mrename $DIR/R13a $DIR/R13b
1112 $CHECKSTAT -a $DIR/R13a || error "R13a still exists"
1113 $CHECKSTAT -t dir $DIR/R13b || error "R13b does not exist"
1114 local DIRINO2=$(ls -lid $DIR/R13b | awk '{ print $1 }')
1115 [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
1116 cleanup_multiop_pause
1117 wait $MULTIPID || error "multiop close failed"
1119 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
1121 test_24r() { #bug 3789
1122 test_mkdir $DIR/R14a
1123 test_mkdir $DIR/R14a/b
1124 mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
1125 $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
1126 $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
1128 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
1131 test_mkdir $DIR/R15a
1132 test_mkdir $DIR/R15a/b
1133 test_mkdir $DIR/R15a/b/c
1134 mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
1135 $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
1136 $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
1138 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
1140 test_mkdir $DIR/R16a
1141 test_mkdir $DIR/R16a/b
1142 test_mkdir $DIR/R16a/b/c
1143 mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
1144 $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
1145 $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
1147 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
1149 test_24u() { # bug12192
1150 $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error "multiop failed"
1151 $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
1153 run_test 24u "create stripe file"
1155 simple_cleanup_common() {
1158 [ -z "$DIR" ] || [ -z "$tdir" ] && return 0
1160 local start=$SECONDS
1163 wait_delete_completed
1164 echo "cleanup time $((SECONDS - start))"
1168 max_pages_per_rpc() {
1169 local mdtname="$(printf "MDT%04x" ${1:-0})"
1170 $LCTL get_param -n mdc.*$mdtname*.max_pages_per_rpc
1174 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1176 local nrfiles=${COUNT:-100000}
1177 local fname="$DIR/$tdir/$tfile"
1179 # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
1180 [ "$mds1_FSTYPE" = "zfs" ] && nrfiles=${COUNT:-10000}
1182 test_mkdir "$(dirname $fname)"
1183 # assume MDT0000 has the fewest inodes
1184 local stripes=$($LFS getdirstripe -c $(dirname $fname))
1185 local free_inodes=$(($(mdt_free_inodes 0) * stripes))
1186 [[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
1188 trap simple_cleanup_common EXIT
1190 createmany -m "$fname" $nrfiles
1192 cancel_lru_locks mdc
1193 lctl set_param mdc.*.stats clear
1195 # was previously test_24D: LU-6101
1196 # readdir() returns correct number of entries after cursor reload
1197 local num_ls=$(ls $DIR/$tdir | wc -l)
1198 local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l)
1199 local num_all=$(ls -a $DIR/$tdir | wc -l)
1200 if [ $num_ls -ne $nrfiles ] || [ $num_uniq -ne $nrfiles ] ||
1201 [ $num_all -ne $((nrfiles + 2)) ]; then
1202 error "Expected $nrfiles files, got $num_ls " \
1203 "($num_uniq unique $num_all .&..)"
1205 # LU-5 large readdir
1206 # dirent_size = 32 bytes for sizeof(struct lu_dirent) +
1207 # N bytes for name (len($nrfiles) rounded to 8 bytes) +
1208 # 8 bytes for luda_type (4 bytes rounded to 8 bytes)
1209 # take into account of overhead in lu_dirpage header and end mark in
1210 # each page, plus one in rpc_num calculation.
1211 local dirent_size=$((32 + (${#tfile} | 7) + 1 + 8))
1212 local page_entries=$(((PAGE_SIZE - 24) / dirent_size))
1213 local mdt_idx=$($LFS getdirstripe -i $(dirname $fname))
1214 local rpc_pages=$(max_pages_per_rpc $mdt_idx)
1215 local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
1216 local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
1217 echo "readpages: $mds_readpage rpc_max: $rpc_max"
1218 (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
1219 error "large readdir doesn't take effect: " \
1220 "$mds_readpage should be about $rpc_max"
1222 simple_cleanup_common
1224 run_test 24v "list large directory (test hash collision, b=17560)"
1226 test_24w() { # bug21506
1228 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
1229 dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
1230 dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
1231 SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
1232 [[ "$SZ1" -eq "$SZ2" ]] ||
1233 error "Error reading at the end of the file $tfile"
1235 run_test 24w "Reading a file larger than 4Gb"
1238 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1239 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1240 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1241 skip "Need MDS version at least 2.7.56"
1244 local remote_dir=$DIR/$tdir/remote_dir
1246 test_mkdir $DIR/$tdir
1247 $LFS mkdir -i $MDTIDX $remote_dir ||
1248 error "create remote directory failed"
1250 test_mkdir $DIR/$tdir/src_dir
1251 touch $DIR/$tdir/src_file
1252 test_mkdir $remote_dir/tgt_dir
1253 touch $remote_dir/tgt_file
1255 mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
1256 error "rename dir cross MDT failed!"
1258 mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
1259 error "rename file cross MDT failed!"
1261 touch $DIR/$tdir/ln_file
1262 ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
1263 error "ln file cross MDT failed"
1265 rm -rf $DIR/$tdir || error "Can not delete directories"
1267 run_test 24x "cross MDT rename/link"
1270 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1271 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1273 local remote_dir=$DIR/$tdir/remote_dir
1276 test_mkdir $DIR/$tdir
1277 $LFS mkdir -i $mdtidx $remote_dir ||
1278 error "create remote directory failed"
1280 test_mkdir $remote_dir/src_dir
1281 touch $remote_dir/src_file
1282 test_mkdir $remote_dir/tgt_dir
1283 touch $remote_dir/tgt_file
1285 mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
1286 error "rename subdir in the same remote dir failed!"
1288 mrename $remote_dir/src_file $remote_dir/tgt_file ||
1289 error "rename files in the same remote dir failed!"
1291 ln $remote_dir/tgt_file $remote_dir/tgt_file1 ||
1292 error "link files in the same remote dir failed!"
1294 rm -rf $DIR/$tdir || error "Can not delete directories"
1296 run_test 24y "rename/link on the same dir should succeed"
1299 [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1300 [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] &&
1301 skip "Need MDS version at least 2.12.51"
1305 for index in 0 1; do
1306 $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed"
1307 touch $DIR/$tdir.0/$tfile.$index || error "touch failed"
1310 mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed"
1312 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0)
1313 [ $index -eq 0 ] || error "$tfile.0 is on MDT$index"
1315 local mdts=$(comma_list $(mdts_nodes))
1317 do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0
1318 stack_trap "do_nodes $mdts $LCTL \
1319 set_param mdt.*.enable_remote_rename=1" EXIT
1321 mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed"
1323 index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1)
1324 [ $index -eq 1 ] || error "$tfile.1 is on MDT$index"
1326 run_test 24z "cross-MDT rename is done as cp"
1328 test_24A() { # LU-3182
1332 test_mkdir $DIR/$tdir
1333 trap simple_cleanup_common EXIT
1334 createmany -m $DIR/$tdir/$tfile $NFILES
1335 local t=$(ls $DIR/$tdir | wc -l)
1336 local u=$(ls $DIR/$tdir | sort -u | wc -l)
1337 local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
1338 if [ $t -ne $NFILES ] || [ $u -ne $NFILES ] ||
1339 [ $v -ne $((NFILES + 2)) ] ; then
1340 error "Expected $NFILES files, got $t ($u unique $v .&..)"
1343 simple_cleanup_common || error "Can not delete directories"
1345 run_test 24A "readdir() returns correct number of entries."
1347 test_24B() { # LU-4805
1348 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1352 test_mkdir $DIR/$tdir
1353 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
1354 error "create striped dir failed"
1356 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1357 [ $count -eq 2 ] || error "Expected 2, got $count"
1359 touch $DIR/$tdir/striped_dir/a
1361 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1362 [ $count -eq 3 ] || error "Expected 3, got $count"
1364 touch $DIR/$tdir/striped_dir/.f
1366 count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1367 [ $count -eq 4 ] || error "Expected 4, got $count"
1369 rm -rf $DIR/$tdir || error "Can not delete directories"
1371 run_test 24B "readdir for striped dir return correct number of entries"
1374 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1380 $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
1381 error "create striped dir failed"
1383 cd $DIR/$tdir/d0/striped_dir
1385 local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
1386 local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
1387 local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1389 [ "$d0_ino" = "$parent_ino" ] ||
1390 error ".. wrong, expect $d0_ino, get $parent_ino"
1392 mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
1393 error "mv striped dir failed"
1395 parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1397 [ "$d1_ino" = "$parent_ino" ] ||
1398 error ".. wrong after mv, expect $d1_ino, get $parent_ino"
1400 run_test 24C "check .. in striped dir"
1403 [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
1404 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1407 mkdir $DIR/$tdir/src_dir
1408 $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
1409 error "create remote source failed"
1411 touch $DIR/$tdir/src_dir/src_child/a
1413 $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
1414 error "create remote target dir failed"
1416 $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
1417 error "create remote target child failed"
1419 mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
1420 error "rename dir cross MDT failed!"
1424 $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
1425 error "src_child still exists after rename"
1427 $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
1428 error "missing file(a) after rename"
1430 rm -rf $DIR/$tdir || error "Can not delete directories"
1432 run_test 24E "cross MDT rename/link"
1435 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
1438 [ "$SLOW" = "no" ] && repeats=100
1442 echo "$repeats repeats"
1443 for ((i = 0; i < repeats; i++)); do
1444 $LFS mkdir -i0 -c2 $DIR/$tdir/test || error "mkdir fails"
1445 touch $DIR/$tdir/test/a || error "touch fails"
1446 mkdir $DIR/$tdir/test/b || error "mkdir fails"
1447 rm -rf $DIR/$tdir/test || error "rmdir fails"
1452 run_test 24F "hash order vs readdir (LU-11330)"
1455 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
1460 $LFS mkdir -i 0 $DIR/$tdir-0 || error "mkdir $tdir-0"
1461 $LFS mkdir -i 1 $DIR/$tdir-1 || error "mkdir $tdir-1"
1462 touch $DIR/$tdir-0/f1 || error "touch f1"
1463 ln -s $DIR/$tdir-0/f1 $DIR/$tdir-0/s1 || error "ln s1"
1464 ino1=$(stat -c%i $DIR/$tdir-0/s1)
1465 mv $DIR/$tdir-0/s1 $DIR/$tdir-1 || error "mv s1"
1466 ino2=$(stat -c%i $DIR/$tdir-1/s1)
1467 [ $ino1 -ne $ino2 ] || error "s1 should be migrated"
1469 run_test 24G "migrate symlink in rename"
1472 echo '== symlink sanity ============================================='
1476 touch $DIR/s25/foo ||
1477 error "File creation in symlinked directory failed"
1479 run_test 25a "create file in symlinked directory ==============="
1482 [ ! -d $DIR/d25 ] && test_25a
1483 $CHECKSTAT -t file $DIR/s25/foo || error "$DIR/s25/foo not file type"
1485 run_test 25b "lookup file in symlinked directory ==============="
1489 test_mkdir $DIR/d26/d26-2
1490 ln -s d26/d26-2 $DIR/s26
1491 touch $DIR/s26/foo || error "File creation failed"
1493 run_test 26a "multiple component symlink ======================="
1496 test_mkdir -p $DIR/$tdir/d26-2
1497 ln -s $tdir/d26-2/foo $DIR/s26-2
1498 touch $DIR/s26-2 || error "File creation failed"
1500 run_test 26b "multiple component symlink at end of lookup ======"
1503 test_mkdir $DIR/d26.2
1504 touch $DIR/d26.2/foo
1505 ln -s d26.2 $DIR/s26.2-1
1506 ln -s s26.2-1 $DIR/s26.2-2
1507 ln -s s26.2-2 $DIR/s26.2-3
1508 chmod 0666 $DIR/s26.2-3/foo
1510 run_test 26c "chain of symlinks"
1512 # recursive symlinks (bug 439)
1514 ln -s d26-3/foo $DIR/d26-3
1516 run_test 26d "create multiple component recursive symlink"
1519 [ ! -h $DIR/d26-3 ] && test_26d
1522 run_test 26e "unlink multiple component recursive symlink"
1524 # recursive symlinks (bug 7022)
1526 test_mkdir $DIR/$tdir
1527 test_mkdir $DIR/$tdir/$tfile
1528 cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed"
1529 test_mkdir -p lndir/bar1
1530 test_mkdir $DIR/$tdir/$tfile/$tfile
1531 cd $tfile || error "cd $tfile failed"
1532 ln -s .. dotdot || error "ln dotdot failed"
1533 ln -s dotdot/lndir lndir || error "ln lndir failed"
1534 cd $DIR/$tdir || error "cd $DIR/$tdir failed"
1535 output=`ls $tfile/$tfile/lndir/bar1`
1536 [ "$output" = bar1 ] && error "unexpected output"
1537 rm -r $tfile || error "rm $tfile failed"
1538 $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
1540 run_test 26f "rm -r of a directory which has recursive symlink"
1543 test_mkdir $DIR/$tdir
1544 $LFS getstripe $DIR/$tdir
1545 $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed"
1546 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1547 cp /etc/hosts $DIR/$tdir/$tfile || error "Can't copy to one stripe file"
1549 run_test 27a "one stripe file"
1552 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1554 test_mkdir $DIR/$tdir
1555 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1556 $LFS getstripe -c $DIR/$tdir/$tfile
1557 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
1558 error "two-stripe file doesn't have two stripes"
1560 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1562 run_test 27b "create and write to two stripe file"
1564 # 27c family tests specific striping, setstripe -o
1566 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1567 test_mkdir -p $DIR/$tdir
1570 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1571 $LFS getstripe -i $DIR/$tdir/$tfile
1572 [ $($LFS getstripe -i $DIR/$tdir/$tfile ) -eq $osts ] ||
1573 error "stripe not on specified OST"
1575 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1577 run_test 27ca "one stripe on specified OST"
1580 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1581 test_mkdir -p $DIR/$tdir
1583 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1584 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1587 # Strip getstripe output to a space separated list of OSTs
1588 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1589 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1590 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1591 error "stripes not on specified OSTs"
1593 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1595 run_test 27cb "two stripes on specified OSTs"
1598 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1599 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
1600 skip "server does not support overstriping"
1602 test_mkdir -p $DIR/$tdir
1604 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1605 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1608 # Strip getstripe output to a space separated list of OSTs
1609 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1610 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1611 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1612 error "stripes not on specified OSTs"
1614 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1616 run_test 27cc "two stripes on the same OST"
1619 [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test"
1620 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
1621 skip "server does not support overstriping"
1622 test_mkdir -p $DIR/$tdir
1623 local osts="0,1,1,0"
1624 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1625 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1628 # Strip getstripe output to a space separated list of OSTs
1629 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1630 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1631 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1632 error "stripes not on specified OSTs"
1634 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1636 run_test 27cd "four stripes on two OSTs"
1639 [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
1640 skip_env "too many osts, skipping"
1641 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
1642 skip "server does not support overstriping"
1643 # We do one more stripe than we have OSTs
1644 [ $OSTCOUNT -ge 159 ] || large_xattr_enabled ||
1645 skip_env "ea_inode feature disabled"
1647 test_mkdir -p $DIR/$tdir
1649 for i in $(seq 0 $OSTCOUNT);
1652 if [ $i -ne $OSTCOUNT ]; then
1656 $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed"
1657 local getstripe=$($LFS getstripe $DIR/$tdir/$tfile)
1660 # Strip getstripe output to a space separated list of OSTs
1661 local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\
1662 awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//')
1663 [ "$getstripe_osts" = "${osts//,/ }" ] ||
1664 error "stripes not on specified OSTs"
1666 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed"
1668 run_test 27ce "more stripes than OSTs with -o"
1671 local osp_proc="osp.$FSNAME-OST0000-osc-MDT000*.active"
1674 test_mkdir -p $DIR/$tdir || error "failed to mkdir $DIR/$tdir"
1675 do_facet $SINGLEMDS "$LCTL set_param -n $osp_proc=0"
1676 stack_trap "do_facet $SINGLEMDS $LCTL set_param -n $osp_proc=1" EXIT
1677 wait_update_facet $SINGLEMDS "$LCTL get_param -n $osp_proc | grep 1" ||
1678 error "failed to set $osp_proc=0"
1680 $LFS setstripe -o 0 $DIR/$tdir/$tfile &
1683 do_facet $SINGLEMDS "$LCTL set_param -n $osp_proc=1"
1684 wait_update_facet $SINGLEMDS "$LCTL get_param -n $osp_proc | grep 0" ||
1685 error "failed to set $osp_proc=1"
1688 error "should return error due to $osp_proc=0"
1690 run_test 27cf "'setstripe -o' on inactive OSTs should return error"
1693 test_mkdir $DIR/$tdir
1694 $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
1695 error "setstripe failed"
1696 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1697 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1699 run_test 27d "create file with default settings"
1702 # LU-5839 adds check for existed layout before setting it
1703 [[ $MDS1_VERSION -lt $(version_code 2.7.56) ]] &&
1704 skip "Need MDS version at least 2.7.56"
1706 test_mkdir $DIR/$tdir
1707 $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1708 $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice"
1709 $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1711 run_test 27e "setstripe existing file (should return error)"
1714 test_mkdir $DIR/$tdir
1715 $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
1716 error "$LFS setstripe $DIR/$tdir/$tfile failed"
1717 $CHECKSTAT -t file $DIR/$tdir/$tfile &&
1718 error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
1719 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1720 $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed"
1722 run_test 27f "setstripe with bad stripe size (should return error)"
1725 test_mkdir $DIR/$tdir
1726 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1727 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" ||
1728 error "$DIR/$tdir/$tfile has object"
1730 run_test 27g "$LFS getstripe with no objects"
1733 test_mkdir $DIR/$tdir
1734 touch $DIR/$tdir/$tfile || error "touch failed"
1735 ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed"
1736 $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2
1738 (( rc == 2 )) || error "getstripe did not return ENOENT"
1740 run_test 27ga "$LFS getstripe with missing file (should return error)"
1743 test_mkdir $DIR/$tdir
1744 touch $DIR/$tdir/$tfile || error "touch failed"
1745 [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] ||
1746 error "missing objects"
1748 run_test 27i "$LFS getstripe with some objects"
1751 test_mkdir $DIR/$tdir
1752 $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile &&
1753 error "setstripe failed" || true
1755 run_test 27j "setstripe with bad stripe offset (should return error)"
1757 test_27k() { # bug 2844
1758 test_mkdir $DIR/$tdir
1759 local file=$DIR/$tdir/$tfile
1760 local ll_max_blksize=$((4 * 1024 * 1024))
1761 $LFS setstripe -S 67108864 $file || error "setstripe failed"
1762 local blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1763 [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize"
1764 dd if=/dev/zero of=$file bs=4k count=1
1765 blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1766 [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize"
1768 run_test 27k "limit i_blksize for broken user apps"
1771 mcreate $DIR/$tfile || error "creating file"
1772 $RUNAS $LFS setstripe -c 1 $DIR/$tfile &&
1773 error "setstripe should have failed" || true
1775 run_test 27l "check setstripe permissions (should return error)"
1778 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1780 [ -n "$RCLIENTS" -o -n "$MOUNT_2" ] &&
1781 skip_env "multiple clients -- skipping"
1783 ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
1785 if [[ $ORIGFREE -gt $MAXFREE ]]; then
1786 skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
1788 trap simple_cleanup_common EXIT
1789 test_mkdir $DIR/$tdir
1790 $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
1791 dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
1792 error "dd should fill OST0"
1794 while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do
1796 [ $i -gt 256 ] && break
1799 touch $DIR/$tdir/$tfile.$i
1800 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1801 awk '{print $1}'| grep -w "0") ] &&
1802 error "OST0 was full but new created file still use it"
1804 touch $DIR/$tdir/$tfile.$i
1805 [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1806 awk '{print $1}'| grep -w "0") ] &&
1807 error "OST0 was full but new created file still use it"
1808 simple_cleanup_common
1810 run_test 27m "create file while OST0 was full"
1812 # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage)
1813 # if the OST isn't full anymore.
1815 local ostidx=${1:-""}
1820 local list=$(comma_list $(osts_nodes))
1821 [ "$ostidx" ] && list=$(facet_host ost$((ostidx + 1)))
1823 do_nodes $list lctl set_param fail_loc=0
1824 wait_delete_completed # initiate all OST_DESTROYs from MDS to OST
1825 delay=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage |
1826 awk '{print $1 * 2;exit;}')
1827 get_prealloc="$LCTL get_param -n osc.*MDT*.prealloc_status |
1829 wait_update_facet $SINGLEMDS "$get_prealloc" "" $delay
1832 __exhaust_precreations() {
1835 local FAILIDX=${3:-$OSTIDX}
1836 local ofacet=ost$((OSTIDX + 1))
1838 test_mkdir -p -c1 $DIR/$tdir
1839 local mdtidx=$($LFS getstripe -m $DIR/$tdir)
1840 local mfacet=mds$((mdtidx + 1))
1841 echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
1843 local OST=$(ostname_from_index $OSTIDX)
1846 local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST)
1847 local last_id=$(do_facet $mfacet lctl get_param -n \
1848 osp.$mdtosc_proc1.prealloc_last_id)
1849 local next_id=$(do_facet $mfacet lctl get_param -n \
1850 osp.$mdtosc_proc1.prealloc_next_id)
1852 local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet)
1853 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1855 test_mkdir -p $DIR/$tdir/${OST}
1856 $LFS setstripe -i $OSTIDX -c 1 $DIR/$tdir/${OST}
1857 #define OBD_FAIL_OST_ENOSPC 0x215
1858 do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215
1859 echo "Creating to objid $last_id on ost $OST..."
1860 createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
1861 do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc*
1862 do_facet $ofacet lctl set_param fail_loc=$FAILLOC
1865 exhaust_precreations() {
1866 __exhaust_precreations $1 $2 $3
1870 exhaust_all_precreations() {
1872 for (( i=0; i < OSTCOUNT; i++ )) ; do
1873 __exhaust_precreations $i $1 -1
1879 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1880 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1881 remote_mds_nodsh && skip "remote MDS with nodsh"
1882 remote_ost_nodsh && skip "remote OST with nodsh"
1885 rm -f $DIR/$tdir/$tfile
1886 exhaust_precreations 0 0x80000215
1887 $LFS setstripe -c -1 $DIR/$tdir || error "setstripe failed"
1888 touch $DIR/$tdir/$tfile || error "touch failed"
1889 $LFS getstripe $DIR/$tdir/$tfile
1892 run_test 27n "create file with some full OSTs"
1895 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1896 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1897 remote_mds_nodsh && skip "remote MDS with nodsh"
1898 remote_ost_nodsh && skip "remote OST with nodsh"
1901 rm -f $DIR/$tdir/$tfile
1902 exhaust_all_precreations 0x215
1904 touch $DIR/$tdir/$tfile && error "able to create $DIR/$tdir/$tfile"
1909 run_test 27o "create file with all full OSTs (should error)"
1912 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1913 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1914 remote_mds_nodsh && skip "remote MDS with nodsh"
1915 remote_ost_nodsh && skip "remote OST with nodsh"
1918 rm -f $DIR/$tdir/$tfile
1919 test_mkdir $DIR/$tdir
1921 $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1922 $TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed"
1923 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1925 exhaust_precreations 0 0x80000215
1926 echo foo >> $DIR/$tdir/$tfile || error "append failed"
1927 $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed"
1928 $LFS getstripe $DIR/$tdir/$tfile
1932 run_test 27p "append to a truncated file with some full OSTs"
1935 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1936 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1937 remote_mds_nodsh && skip "remote MDS with nodsh"
1938 remote_ost_nodsh && skip "remote OST with nodsh"
1941 rm -f $DIR/$tdir/$tfile
1943 test_mkdir $DIR/$tdir
1944 $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
1945 $TRUNCATE $DIR/$tdir/$tfile 80000000 ||
1946 error "truncate $DIR/$tdir/$tfile failed"
1947 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1949 exhaust_all_precreations 0x215
1951 echo foo >> $DIR/$tdir/$tfile && error "append succeeded"
1952 $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat 2 failed"
1956 run_test 27q "append to truncated file with all OSTs full (should error)"
1959 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1960 [ $PARALLEL == "yes" ] && skip "skip parallel run"
1961 remote_mds_nodsh && skip "remote MDS with nodsh"
1962 remote_ost_nodsh && skip "remote OST with nodsh"
1965 rm -f $DIR/$tdir/$tfile
1966 exhaust_precreations 0 0x80000215
1968 $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1972 run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
1974 test_27s() { # bug 10725
1975 test_mkdir $DIR/$tdir
1976 local stripe_size=$((4096 * 1024 * 1024)) # 2^32
1977 local stripe_count=0
1978 [ $OSTCOUNT -eq 1 ] || stripe_count=2
1979 $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir &&
1980 error "stripe width >= 2^32 succeeded" || true
1983 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
1985 test_27t() { # bug 10864
1990 $WLFS getstripe $tfile
1993 run_test 27t "check that utils parse path correctly"
1995 test_27u() { # bug 4900
1996 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1997 remote_mds_nodsh && skip "remote MDS with nodsh"
2000 local list=$(comma_list $(mdts_nodes))
2002 #define OBD_FAIL_MDS_OSC_PRECREATE 0x139
2003 do_nodes $list $LCTL set_param fail_loc=0x139
2004 test_mkdir -p $DIR/$tdir
2005 trap simple_cleanup_common EXIT
2006 createmany -o $DIR/$tdir/t- 1000
2007 do_nodes $list $LCTL set_param fail_loc=0
2009 TLOG=$TMP/$tfile.getstripe
2010 $LFS getstripe $DIR/$tdir > $TLOG
2011 OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
2012 unlinkmany $DIR/$tdir/t- 1000
2014 [[ $OBJS -gt 0 ]] &&
2015 error "$OBJS objects created on OST-0. See $TLOG" ||
2018 run_test 27u "skip object creation on OSC w/o objects"
2020 test_27v() { # bug 4900
2021 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2022 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2023 remote_mds_nodsh && skip "remote MDS with nodsh"
2024 remote_ost_nodsh && skip "remote OST with nodsh"
2026 exhaust_all_precreations 0x215
2029 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
2031 touch $DIR/$tdir/$tfile
2032 #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
2034 for (( i=1; i < OSTCOUNT; i++ )); do
2035 do_facet ost$i lctl set_param fail_loc=0x705
2037 local START=`date +%s`
2038 createmany -o $DIR/$tdir/$tfile 32
2040 local FINISH=`date +%s`
2041 local TIMEOUT=`lctl get_param -n timeout`
2042 local PROCESS=$((FINISH - START))
2043 [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
2044 error "$FINISH - $START >= $TIMEOUT / 2"
2045 sleep $((TIMEOUT / 2 - PROCESS))
2048 run_test 27v "skip object creation on slow OST"
2050 test_27w() { # bug 10997
2051 test_mkdir $DIR/$tdir
2052 $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
2053 [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
2054 error "stripe size $size != 65536" || true
2055 [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
2056 error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
2058 run_test 27w "check $LFS setstripe -S and getstrip -d options"
2061 [[ $OSTCOUNT -lt 2 ]] &&
2062 skip_env "skipping multiple stripe count/offset test"
2064 test_mkdir $DIR/$tdir
2065 for i in $(seq 1 $OSTCOUNT); do
2067 $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i ||
2068 error "setstripe -c $i -i $offset failed"
2069 count=$($LFS getstripe -c $DIR/$tdir/f$i)
2070 index=$($LFS getstripe -i $DIR/$tdir/f$i)
2071 [ $count -ne $i ] && error "stripe count $count != $i" || true
2072 [ $index -ne $offset ] &&
2073 error "stripe offset $index != $offset" || true
2076 run_test 27wa "check $LFS setstripe -c -i options"
2079 remote_ost_nodsh && skip "remote OST with nodsh"
2080 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2081 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2083 OFFSET=$(($OSTCOUNT - 1))
2085 local OST=$(ostname_from_index $OSTIDX)
2087 test_mkdir $DIR/$tdir
2088 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file
2089 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1
2091 createmany -o $DIR/$tdir/$tfile $OSTCOUNT
2092 for i in $(seq 0 $OFFSET); do
2093 [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx |
2094 awk '{print $1}' | grep -w "$OSTIDX") ] &&
2095 error "OST0 was degraded but new created file still use it"
2097 do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0
2099 run_test 27x "create files while OST0 is degraded"
2102 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2103 remote_mds_nodsh && skip "remote MDS with nodsh"
2104 remote_ost_nodsh && skip "remote OST with nodsh"
2105 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2107 local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
2108 local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
2109 osp.$mdtosc.prealloc_last_id)
2110 local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
2111 osp.$mdtosc.prealloc_next_id)
2112 local fcount=$((last_id - next_id))
2113 [[ $fcount -eq 0 ]] && skip "not enough space on OST0"
2114 [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
2116 local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
2117 awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
2118 local OST_DEACTIVE_IDX=-1
2123 for OSC in $MDS_OSCS; do
2124 OST=$(osc_to_ost $OSC)
2125 OSTIDX=$(index_from_ostuuid $OST)
2126 if [ $OST_DEACTIVE_IDX == -1 ]; then
2127 OST_DEACTIVE_IDX=$OSTIDX
2129 if [ $OSTIDX != $OST_DEACTIVE_IDX ]; then
2130 echo $OSC "is Deactivated:"
2131 do_facet $SINGLEMDS lctl --device %$OSC deactivate
2135 OSTIDX=$(index_from_ostuuid $OST)
2136 test_mkdir $DIR/$tdir
2137 $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
2139 for OSC in $MDS_OSCS; do
2140 OST=$(osc_to_ost $OSC)
2141 OSTIDX=$(index_from_ostuuid $OST)
2142 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
2143 echo $OST "is degraded:"
2144 do_facet ost$((OSTIDX+1)) lctl set_param -n \
2145 obdfilter.$OST.degraded=1
2150 createmany -o $DIR/$tdir/$tfile $fcount
2152 for OSC in $MDS_OSCS; do
2153 OST=$(osc_to_ost $OSC)
2154 OSTIDX=$(index_from_ostuuid $OST)
2155 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
2156 echo $OST "is recovered from degraded:"
2157 do_facet ost$((OSTIDX+1)) lctl set_param -n \
2158 obdfilter.$OST.degraded=0
2160 do_facet $SINGLEMDS lctl --device %$OSC activate
2164 # all osp devices get activated, hence -1 stripe count restored
2165 local stripe_count=0
2167 # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp
2168 # devices get activated.
2170 $LFS setstripe -c -1 $DIR/$tfile
2171 stripe_count=$($LFS getstripe -c $DIR/$tfile)
2173 [ $stripe_count -ne $OSTCOUNT ] &&
2174 error "Of $OSTCOUNT OSTs, only $stripe_count is available"
2177 run_test 27y "create files while OST0 is degraded and the rest inactive"
2183 lmm_count=$($LFS getstripe -c $1)
2184 lmm_seq=$($LFS getstripe -v $1 | awk '/lmm_seq/ { print $2 }')
2185 lmm_oid=$($LFS getstripe -v $1 | awk '/lmm_object_id/ { print $2 }')
2187 local old_ifs="$IFS"
2189 fid=($($LFS path2fid $1))
2192 log "FID seq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}"
2193 log "LOV seq $lmm_seq, oid $lmm_oid, count: $lmm_count"
2195 # compare lmm_seq and lu_fid->f_seq
2196 [ $lmm_seq = ${fid[1]} ] || { error "SEQ mismatch"; return 1; }
2197 # compare lmm_object_id and lu_fid->oid
2198 [ $lmm_oid = ${fid[2]} ] || { error "OID mismatch"; return 2; }
2200 # check the trusted.fid attribute of the OST objects of the file
2201 local have_obdidx=false
2203 $LFS getstripe $1 | while read obdidx oid hex seq; do
2204 # skip lines up to and including "obdidx"
2205 [ -z "$obdidx" ] && break
2206 [ "$obdidx" = "obdidx" ] && have_obdidx=true && continue
2207 $have_obdidx || continue
2209 local ost=$((obdidx + 1))
2210 local dev=$(ostdevname $ost)
2213 log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
2215 seq=$(echo $seq | sed -e "s/^0x//g")
2216 if [ $seq == 0 ] || [ $(facet_fstype ost$ost) == zfs ]; then
2217 oid_hex=$(echo $oid)
2219 oid_hex=$(echo $hex | sed -e "s/^0x//g")
2221 local obj_file="O/$seq/d$((oid %32))/$oid_hex"
2225 # Don't unmount/remount the OSTs if we don't need to do that.
2226 # LU-2577 changes filter_fid to be smaller, so debugfs needs
2227 # update too, until that use mount/ll_decode_filter_fid/mount.
2228 # Re-enable when debugfs will understand new filter_fid.
2230 if [ $(facet_fstype ost$ost) == ldiskfs ]; then
2231 ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
2232 $dev 2>/dev/null" | grep "parent=")
2234 if [ -z "$ff" ]; then
2236 mount_fstype ost$ost
2237 ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
2238 $(facet_mntpt ost$ost)/$obj_file)
2239 unmount_fstype ost$ost
2240 start ost$ost $dev $OST_MOUNT_OPTS
2244 [ -z "$ff" ] && error "$obj_file: no filter_fid info"
2246 echo "$ff" | sed -e 's#.*objid=#got: objid=#'
2248 # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
2249 # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
2251 # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \
2252 # stripe_size=1048576 component_id=1 component_start=0 \
2253 # component_end=33554432
2254 local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff)
2255 local ff_pseq=$(cut -d: -f1 <<<$ff_parent)
2256 local ff_poid=$(cut -d: -f2 <<<$ff_parent)
2258 if grep -q 'stripe=' <<<$ff; then
2259 ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff)
2261 # $LL_DECODE_FILTER_FID does not print "stripe="; look
2262 # into f_ver in this case. See comment on ff_parent.
2263 ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//')
2266 # compare lmm_seq and filter_fid->ff_parent.f_seq
2267 [ $ff_pseq = $lmm_seq ] ||
2268 error "FF parent SEQ $ff_pseq != $lmm_seq"
2269 # compare lmm_object_id and filter_fid->ff_parent.f_oid
2270 [ $ff_poid = $lmm_oid ] ||
2271 error "FF parent OID $ff_poid != $lmm_oid"
2272 (($ff_pstripe == $stripe_nr)) ||
2273 error "FF stripe $ff_pstripe != $stripe_nr"
2275 stripe_nr=$((stripe_nr + 1))
2276 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2278 if grep -q 'stripe_count=' <<<$ff; then
2279 local ff_scnt=$(sed -e 's/.*stripe_count=//' \
2280 -e 's/ .*//' <<<$ff)
2281 [ $lmm_count = $ff_scnt ] ||
2282 error "FF stripe count $lmm_count != $ff_scnt"
2288 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2289 remote_ost_nodsh && skip "remote OST with nodsh"
2291 test_mkdir $DIR/$tdir
2292 $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
2293 { error "setstripe -c -1 failed"; return 1; }
2294 # We need to send a write to every object to get parent FID info set.
2295 # This _should_ also work for setattr, but does not currently.
2296 # touch $DIR/$tdir/$tfile-1 ||
2297 dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
2298 { error "dd $tfile-1 failed"; return 2; }
2299 $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
2300 { error "setstripe -c -1 failed"; return 3; }
2301 dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
2302 { error "dd $tfile-2 failed"; return 4; }
2304 # make sure write RPCs have been sent to OSTs
2307 check_seq_oid $DIR/$tdir/$tfile-1 || return 5
2308 check_seq_oid $DIR/$tdir/$tfile-2 || return 6
2310 run_test 27z "check SEQ/OID on the MDT and OST filesystems"
2312 test_27A() { # b=19102
2313 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2315 save_layout_restore_at_exit $MOUNT
2316 $LFS setstripe -c 0 -i -1 -S 0 $MOUNT
2317 wait_update $HOSTNAME "$LFS getstripe -c $MOUNT | sed 's/ *//g'" "1" 20 ||
2318 error "stripe count $($LFS getstripe -c $MOUNT) != 1"
2319 local default_size=$($LFS getstripe -S $MOUNT)
2320 local default_offset=$($LFS getstripe -i $MOUNT)
2321 local dsize=$(do_facet $SINGLEMDS \
2322 "$LCTL get_param -n lod.$(facet_svc $SINGLEMDS)*.stripesize")
2323 [ $default_size -eq $dsize ] ||
2324 error "stripe size $default_size != $dsize"
2325 [ $default_offset -eq -1 ] ||
2326 error "stripe offset $default_offset != -1"
2328 run_test 27A "check filesystem-wide default LOV EA values"
2330 test_27B() { # LU-2523
2331 test_mkdir $DIR/$tdir
2332 rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
2334 # open f1 with O_LOV_DELAY_CREATE
2336 # call setstripe ioctl on open file descriptor for f1
2338 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:nB1c \
2342 # open f1 with O_LOV_DELAY_CREATE
2344 # call setstripe ioctl on open file descriptor for f1
2346 multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:uB1c
2348 # Allow multiop to fail in imitation of NFS's busted semantics.
2351 run_test 27B "call setstripe on open unlinked file/rename victim"
2353 # 27C family tests full striping and overstriping
2354 test_27Ca() { #LU-2871
2355 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2363 test_mkdir $DIR/$tdir
2365 for i in $(seq 0 $((OSTCOUNT - 1))); do
2366 # set stripe across all OSTs starting from OST$i
2367 $LFS setstripe -i $i -c -1 $tfile$i
2368 # get striping information
2369 ost_idx=($($LFS getstripe $tfile$i |
2370 tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
2374 [ ${#ost_idx[@]} -eq $OSTCOUNT ] ||
2375 error "${#ost_idx[@]} != $OSTCOUNT"
2377 for index in $(seq 0 $((OSTCOUNT - 1))); do
2379 for j in $(echo ${ost_idx[@]}); do
2380 if [ $index -eq $j ]; then
2386 error "Can not find $index in ${ost_idx[@]}"
2390 run_test 27Ca "check full striping across all OSTs"
2393 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2394 skip "server does not support overstriping"
2395 [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2396 skip_env "too many osts, skipping"
2398 test_mkdir -p $DIR/$tdir
2399 local setcount=$(($OSTCOUNT * 2))
2400 [ $setcount -ge 160 ] || large_xattr_enabled ||
2401 skip_env "ea_inode feature disabled"
2403 $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
2404 error "setstripe failed"
2406 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2407 [ $count -eq $setcount ] ||
2408 error "stripe count $count, should be $setcount"
2410 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2411 error "overstriped should be set in pattern"
2413 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2416 run_test 27Cb "more stripes than OSTs with -C"
2419 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2420 skip "server does not support overstriping"
2421 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2423 test_mkdir -p $DIR/$tdir
2424 local setcount=$(($OSTCOUNT - 1))
2426 [ $setcount -ge 160 ] || large_xattr_enabled ||
2427 skip_env "ea_inode feature disabled"
2429 $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
2430 error "setstripe failed"
2432 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2433 [ $count -eq $setcount ] ||
2434 error "stripe count $count, should be $setcount"
2436 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" &&
2437 error "overstriped should not be set in pattern"
2439 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2442 run_test 27Cc "fewer stripes than OSTs does not set overstriping"
2445 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2446 skip "server does not support overstriping"
2447 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2448 large_xattr_enabled || skip_env "ea_inode feature disabled"
2450 test_mkdir -p $DIR/$tdir
2451 local setcount=$LOV_MAX_STRIPE_COUNT
2453 $LFS setstripe -C $setcount $DIR/$tdir/$tfile ||
2454 error "setstripe failed"
2456 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2457 [ $count -eq $setcount ] ||
2458 error "stripe count $count, should be $setcount"
2460 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2461 error "overstriped should be set in pattern"
2463 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2466 rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
2468 run_test 27Cd "test maximum stripe count"
2471 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2472 skip "server does not support overstriping"
2473 test_mkdir -p $DIR/$tdir
2475 pool_add $TESTNAME || error "Pool creation failed"
2476 pool_add_targets $TESTNAME 0 || error "pool_add_targets failed"
2480 $LFS setstripe -C $setcount -p "$TESTNAME" $DIR/$tdir/$tfile ||
2481 error "setstripe failed"
2483 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2484 [ $count -eq $setcount ] ||
2485 error "stripe count $count, should be $setcount"
2487 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2488 error "overstriped should be set in pattern"
2490 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2493 rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
2495 run_test 27Ce "test pool with overstriping"
2498 [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] ||
2499 skip "server does not support overstriping"
2500 [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2501 skip_env "too many osts, skipping"
2503 test_mkdir -p $DIR/$tdir
2505 local setcount=$(($OSTCOUNT * 2))
2506 [ $setcount -ge 160 ] || large_xattr_enabled ||
2507 skip_env "ea_inode feature disabled"
2509 $LFS setstripe -C $setcount $DIR/$tdir/ ||
2510 error "setstripe failed"
2512 echo 1 > $DIR/$tdir/$tfile
2514 local count=$($LFS getstripe -c $DIR/$tdir/$tfile)
2515 [ $count -eq $setcount ] ||
2516 error "stripe count $count, should be $setcount"
2518 $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" ||
2519 error "overstriped should be set in pattern"
2521 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc ||
2524 rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed"
2526 run_test 27Cf "test default inheritance with overstriping"
2529 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2530 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2531 remote_mds_nodsh && skip "remote MDS with nodsh"
2533 local POOL=${POOL:-testpool}
2535 local last_ost=$(($OSTCOUNT - 1))
2537 local ost_list=$(seq $first_ost $ost_step $last_ost)
2538 local ost_range="$first_ost $last_ost $ost_step"
2540 test_mkdir $DIR/$tdir
2541 pool_add $POOL || error "pool_add failed"
2542 pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
2545 [ $MDS1_VERSION -lt $(version_code 2.8.55) ] &&
2547 [ $MDS1_VERSION -lt $(version_code 2.9.55) ] ||
2548 [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] &&
2549 skip27D+=" -s 30,31"
2550 [[ ! $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ||
2551 $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] &&
2552 skip27D+=" -s 32,33"
2553 [[ $MDS_VERSION -lt $(version_code $SEL_VER) ]] &&
2555 llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
2556 error "llapi_layout_test failed"
2558 destroy_test_pools || error "destroy test pools failed"
2560 run_test 27D "validate llapi_layout API"
2562 # Verify that default_easize is increased from its initial value after
2563 # accessing a widely striped file.
2565 [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2566 [ $CLIENT_VERSION -lt $(version_code 2.5.57) ] &&
2567 skip "client does not have LU-3338 fix"
2569 # 72 bytes is the minimum space required to store striping
2570 # information for a file striped across one OST:
2571 # (sizeof(struct lov_user_md_v3) +
2572 # sizeof(struct lov_user_ost_data_v1))
2574 $LCTL set_param -n llite.*.default_easize $min_easize ||
2575 error "lctl set_param failed"
2576 local easize=$($LCTL get_param -n llite.*.default_easize)
2578 [ $easize -eq $min_easize ] ||
2579 error "failed to set default_easize"
2581 $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
2582 error "setstripe failed"
2583 # In order to ensure stat() call actually talks to MDS we need to
2584 # do something drastic to this file to shake off all lock, e.g.
2585 # rename it (kills lookup lock forcing cache cleaning)
2586 mv $DIR/$tfile $DIR/${tfile}-1
2587 ls -l $DIR/${tfile}-1
2590 easize=$($LCTL get_param -n llite.*.default_easize)
2592 [ $easize -gt $min_easize ] ||
2593 error "default_easize not updated"
2595 run_test 27E "check that default extended attribute size properly increases"
2597 test_27F() { # LU-5346/LU-7975
2598 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2599 [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs"
2600 [[ $MDS1_VERSION -lt $(version_code 2.8.51) ]] &&
2601 skip "Need MDS version at least 2.8.51"
2602 remote_ost_nodsh && skip "remote OST with nodsh"
2604 test_mkdir $DIR/$tdir
2606 $LFS setstripe -c 2 $DIR/$tdir
2608 # stop all OSTs to reproduce situation for LU-7975 ticket
2609 for num in $(seq $OSTCOUNT); do
2613 # open/create f0 with O_LOV_DELAY_CREATE
2614 # truncate f0 to a non-0 size
2616 multiop $DIR/$tdir/f0 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T1050000c
2618 $CHECKSTAT -s 1050000 $DIR/$tdir/f0 || error "checkstat failed"
2619 # open/write it again to force delayed layout creation
2620 cat /etc/hosts > $DIR/$tdir/f0 &
2624 for num in $(seq $OSTCOUNT); do
2625 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS ||
2626 error "ost$num failed to start"
2629 wait $catpid || error "cat failed"
2631 cmp /etc/hosts $DIR/$tdir/f0 || error "cmp failed"
2632 [[ $($LFS getstripe -c $DIR/$tdir/f0) == 2 ]] ||
2633 error "wrong stripecount"
2636 run_test 27F "Client resend delayed layout creation with non-zero size"
2638 test_27G() { #LU-10629
2639 [ $MDS1_VERSION -lt $(version_code 2.11.51) ] &&
2640 skip "Need MDS version at least 2.11.51"
2641 [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2642 remote_mds_nodsh && skip "remote MDS with nodsh"
2643 local POOL=${POOL:-testpool}
2644 local ostrange="0 0 1"
2646 test_mkdir $DIR/$tdir
2647 touch $DIR/$tdir/$tfile.nopool
2648 pool_add $POOL || error "pool_add failed"
2649 pool_add_targets $POOL $ostrange || error "pool_add_targets failed"
2650 $LFS setstripe -p $POOL $DIR/$tdir
2652 local pool=$($LFS getstripe -p $DIR/$tdir)
2654 [ "$pool" = "$POOL" ] || error "Striping failed got '$pool' not '$POOL'"
2655 touch $DIR/$tdir/$tfile.default
2656 $LFS setstripe -E 1M --pool $POOL -c 1 -E eof -c 1 $DIR/$tdir/$tfile.pfl
2657 $LFS find $DIR/$tdir -type f --pool $POOL
2658 local found=$($LFS find $DIR/$tdir -type f --pool $POOL | wc -l)
2659 [[ "$found" == "2" ]] ||
2660 error "found $found != 2 files in '$DIR/$tdir' in '$POOL'"
2662 $LFS setstripe -d $DIR/$tdir
2664 pool=$($LFS getstripe -p -d $DIR/$tdir)
2666 [[ "$pool" != "$POOL" ]] || error "$DIR/$tdir is still '$pool'"
2668 run_test 27G "Clear OST pool from stripe"
2671 [[ $MDS1_VERSION -le $(version_code 2.11.54) ]] &&
2672 skip "Need MDS version newer than 2.11.54"
2673 [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
2674 test_mkdir $DIR/$tdir
2675 $LFS setstripe -o 0 -o 2 $DIR/$tdir || error "setstripe failed"
2676 touch $DIR/$tdir/$tfile
2677 $LFS getstripe -c $DIR/$tdir/$tfile
2678 [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
2679 error "two-stripe file doesn't have two stripes"
2681 dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
2682 $LFS getstripe -y $DIR/$tdir/$tfile
2683 (( $($LFS getstripe -y $DIR/$tdir/$tfile |
2684 egrep -c "l_ost_idx: [02]$") == "2" )) ||
2685 error "expected l_ost_idx: [02]$ not matched"
2687 # make sure ost list has been cleared
2688 local stripesize=$($LFS getstripe -S $DIR/$tdir)
2689 $LFS setstripe -S $((stripesize * 4)) -i 1 \
2690 -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
2692 $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
2694 run_test 27H "Set specific OSTs stripe"
2697 [ $PARALLEL == "yes" ] && skip "skip parallel run"
2698 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2699 [[ $MDS1_VERSION -gt $(version_code 2.12.52) ]] ||
2700 skip "Need MDS version newer than 2.12.52"
2701 local pool=$TESTNAME
2702 local ostrange="1 1 1"
2704 save_layout_restore_at_exit $MOUNT
2705 $LFS setstripe -c 2 -i 0 $MOUNT
2706 pool_add $pool || error "pool_add failed"
2707 pool_add_targets $pool $ostrange || "pool_add_targets failed"
2708 test_mkdir $DIR/$tdir
2709 $LFS setstripe -p $pool $DIR/$tdir
2710 $MULTIOP $DIR/$tdir/$tfile Oc || error "multiop failed"
2711 $LFS getstripe $DIR/$tdir/$tfile
2713 run_test 27I "check that root dir striping does not break parent dir one"
2716 [[ $MDS1_VERSION -le $(version_code 2.12.51) ]] &&
2717 skip "Need MDS version newer than 2.12.51"
2719 test_mkdir $DIR/$tdir
2720 local uuid1=$(cat /proc/sys/kernel/random/uuid)
2721 local uuid2=$(cat /proc/sys/kernel/random/uuid)
2723 # create foreign file (raw way)
2724 create_foreign_file -f $DIR/$tdir/$tfile -x "${uuid1}@${uuid2}" \
2725 -t 1 -F 0xda08 || error "create_foreign_file failed"
2727 # verify foreign file (raw way)
2728 parse_foreign_file -f $DIR/$tdir/$tfile |
2729 grep "lov_foreign_magic: 0x0BD70BD0" ||
2730 error "$DIR/$tdir/$tfile: invalid LOV EA foreign magic"
2731 parse_foreign_file -f $DIR/$tdir/$tfile | grep "lov_xattr_size: 89" ||
2732 error "$DIR/$tdir/$tfile: invalid LOV EA foreign size"
2733 parse_foreign_file -f $DIR/$tdir/$tfile |
2734 grep "lov_foreign_size: 73" ||
2735 error "$DIR/$tdir/$tfile: invalid LOV EA foreign size"
2736 parse_foreign_file -f $DIR/$tdir/$tfile |
2737 grep "lov_foreign_type: 1" ||
2738 error "$DIR/$tdir/$tfile: invalid LOV EA foreign type"
2739 parse_foreign_file -f $DIR/$tdir/$tfile |
2740 grep "lov_foreign_flags: 0x0000DA08" ||
2741 error "$DIR/$tdir/$tfile: invalid LOV EA foreign flags"
2742 local lov=$(parse_foreign_file -f $DIR/$tdir/$tfile |
2743 grep "lov_foreign_value: 0x" |
2744 sed -e 's/lov_foreign_value: 0x//')
2745 local lov2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160)
2746 [[ $lov = ${lov2// /} ]] ||
2747 error "$DIR/$tdir/$tfile: invalid LOV EA foreign value"
2749 # create foreign file (lfs + API)
2750 $LFS setstripe --foreign=daos --flags 0xda08 \
2751 -x "${uuid1}@${uuid2}" $DIR/$tdir/${tfile}2 ||
2752 error "$DIR/$tdir/${tfile}2: create failed"
2754 $LFS getstripe -v $DIR/$tdir/${tfile}2 |
2755 grep "lfm_magic:.*0x0BD70BD0" ||
2756 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign magic"
2757 # lfm_length is LOV EA size - sizeof(lfm_magic) - sizeof(lfm_length)
2758 $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_length:.*73" ||
2759 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign size"
2760 $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_type:.*daos" ||
2761 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign type"
2762 $LFS getstripe -v $DIR/$tdir/${tfile}2 |
2763 grep "lfm_flags:.*0x0000DA08" ||
2764 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign flags"
2765 $LFS getstripe $DIR/$tdir/${tfile}2 |
2766 grep "lfm_value:.*${uuid1}@${uuid2}" ||
2767 error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign value"
2769 # modify striping should fail
2770 $LFS setstripe -c 2 $DIR/$tdir/$tfile &&
2771 error "$DIR/$tdir/$tfile: setstripe should fail"
2772 $LFS setstripe -c 2 $DIR/$tdir/${tfile}2 &&
2773 error "$DIR/$tdir/${tfile}2: setstripe should fail"
2776 cat $DIR/$tdir/$tfile && error "$DIR/$tdir/$tfile: read should fail"
2777 cat $DIR/$tdir/${tfile}2 &&
2778 error "$DIR/$tdir/${tfile}2: read should fail"
2779 cat /etc/passwd > $DIR/$tdir/$tfile &&
2780 error "$DIR/$tdir/$tfile: write should fail"
2781 cat /etc/passwd > $DIR/$tdir/${tfile}2 &&
2782 error "$DIR/$tdir/${tfile}2: write should fail"
2785 chmod 222 $DIR/$tdir/$tfile ||
2786 error "$DIR/$tdir/$tfile: chmod failed"
2787 chmod 222 $DIR/$tdir/${tfile}2 ||
2788 error "$DIR/$tdir/${tfile}2: chmod failed"
2791 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tfile ||
2792 error "$DIR/$tdir/$tfile: chown failed"
2793 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tfile}2 ||
2794 error "$DIR/$tdir/${tfile}2: chown failed"
2796 # rename should work
2797 mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}.new ||
2798 error "$DIR/$tdir/$tfile: rename of foreign file has failed"
2799 mv $DIR/$tdir/${tfile}2 $DIR/$tdir/${tfile}2.new ||
2800 error "$DIR/$tdir/${tfile}2: rename of foreign file has failed"
2802 #remove foreign file
2803 rm $DIR/$tdir/${tfile}.new ||
2804 error "$DIR/$tdir/${tfile}.new: remove of foreign file has failed"
2805 rm $DIR/$tdir/${tfile}2.new ||
2806 error "$DIR/$tdir/${tfile}2.new: remove of foreign file has failed"
2808 run_test 27J "basic ops on file with foreign LOV"
2811 [[ $MDS1_VERSION -le $(version_code 2.12.49) ]] &&
2812 skip "Need MDS version newer than 2.12.49"
2814 test_mkdir $DIR/$tdir
2815 local uuid1=$(cat /proc/sys/kernel/random/uuid)
2816 local uuid2=$(cat /proc/sys/kernel/random/uuid)
2818 # create foreign dir (raw way)
2819 create_foreign_dir -d $DIR/$tdir/$tdir -x "${uuid1}@${uuid2}" -t 1 ||
2820 error "create_foreign_dir FAILED"
2822 # verify foreign dir (raw way)
2823 parse_foreign_dir -d $DIR/$tdir/$tdir |
2824 grep "lmv_foreign_magic:.*0xcd50cd0" ||
2825 error "$DIR/$tdir/$tfile: invalid LMV EA magic"
2826 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_xattr_size:.*89$" ||
2827 error "$DIR/$tdir/$tdir: invalid LMV EA size"
2828 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_type: 1$" ||
2829 error "$DIR/$tdir/$tdir: invalid LMV EA type"
2830 parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_flags: 0$" ||
2831 error "$DIR/$tdir/$tdir: invalid LMV EA flags"
2832 local lmv=$(parse_foreign_dir -d $DIR/$tdir/$tdir |
2833 grep "lmv_foreign_value: 0x" |
2834 sed 's/lmv_foreign_value: 0x//')
2835 local lmv2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160 |
2837 [[ $lmv == $lmv2 ]] || error "$DIR/$tdir/$tdir: invalid LMV EA value"
2839 # create foreign dir (lfs + API)
2840 $LFS mkdir --foreign=daos --xattr="${uuid1}@${uuid2}" --flags=0xda05 \
2841 $DIR/$tdir/${tdir}2 ||
2842 error "$DIR/$tdir/${tdir}2: create failed"
2844 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
2845 grep "lfm_magic:.*0x0CD50CD0" ||
2846 error "$DIR/$tdir/${tdir}2: invalid LMV EA magic"
2847 # lfm_length is LMV EA size - sizeof(lfm_magic) - sizeof(lfm_length)
2848 # - sizeof(lfm_type) - sizeof(lfm_flags)
2849 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_length:.*73" ||
2850 error "$DIR/$tdir/${tdir}2: invalid LMV EA size"
2851 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_type:.*daos" ||
2852 error "$DIR/$tdir/${tdir}2: invalid LMV EA type"
2853 $LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
2854 grep "lfm_flags:.*0x0000DA05" ||
2855 error "$DIR/$tdir/${tdir}2: invalid LMV EA flags"
2856 $LFS getdirstripe $DIR/$tdir/${tdir}2 |
2857 grep "lfm_value.*${uuid1}@${uuid2}" ||
2858 error "$DIR/$tdir/${tdir}2: invalid LMV EA value"
2860 # file create in dir should fail
2861 touch $DIR/$tdir/$tdir/$tfile && "$DIR/$tdir: file create should fail"
2862 touch $DIR/$tdir/${tdir}2/$tfile &&
2863 "$DIR/${tdir}2: file create should fail"
2866 chmod 777 $DIR/$tdir/$tdir ||
2867 error "$DIR/$tdir: chmod failed"
2868 chmod 777 $DIR/$tdir/${tdir}2 ||
2869 error "$DIR/${tdir}2: chmod failed"
2872 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tdir ||
2873 error "$DIR/$tdir: chown failed"
2874 chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tdir}2 ||
2875 error "$DIR/${tdir}2: chown failed"
2877 # rename should work
2878 mv $DIR/$tdir/$tdir $DIR/$tdir/${tdir}.new ||
2879 error "$DIR/$tdir/$tdir: rename of foreign dir has failed"
2880 mv $DIR/$tdir/${tdir}2 $DIR/$tdir/${tdir}2.new ||
2881 error "$DIR/$tdir/${tdir}2: rename of foreign dir has failed"
2884 rmdir $DIR/$tdir/${tdir}.new ||
2885 error "$DIR/$tdir/${tdir}.new: remove of foreign dir has failed"
2886 rmdir $DIR/$tdir/${tdir}2.new ||
2887 error "$DIR/$tdir/${tdir}2.new: remove of foreign dir has failed"
2889 run_test 27K "basic ops on dir with foreign LMV"
2892 remote_mds_nodsh && skip "remote MDS with nodsh"
2894 local POOL=${POOL:-$TESTNAME}
2896 pool_add $POOL || error "pool_add failed"
2898 lfs pool_list $MOUNT | grep -Fx "${FSNAME}.${POOL}" ||
2899 error "pool_list does not contain ${FSNAME}.${POOL}:" \
2900 "$(lfs pool_list $MOUNT | grep -F "${POOL}")"
2902 run_test 27L "lfs pool_list gives correct pool name"
2905 [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.12.57) ]] &&
2906 skip "Need MDS version >= than 2.12.57"
2907 remote_mds_nodsh && skip "remote MDS with nodsh"
2908 [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
2910 test_mkdir $DIR/$tdir
2912 # Set default striping on directory
2913 $LFS setstripe -C 4 $DIR/$tdir
2915 echo 1 > $DIR/$tdir/${tfile}.1
2916 local count=$($LFS getstripe -c $DIR/$tdir/${tfile}.1)
2918 [ $count -eq $setcount ] ||
2919 error "(1) stripe count $count, should be $setcount"
2921 # Capture existing append_stripe_count setting for restore
2922 local orig_count=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_stripe_count)
2923 local mdts=$(comma_list $(mdts_nodes))
2924 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=$orig_count" EXIT
2926 local appendcount=$orig_count
2927 echo 1 >> $DIR/$tdir/${tfile}.2_append
2928 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.2_append)
2929 [ $count -eq $appendcount ] ||
2930 error "(2)stripe count $count, should be $appendcount for append"
2932 # Disable O_APPEND striping, verify it works
2933 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
2935 # Should now get the default striping, which is 4
2937 echo 1 >> $DIR/$tdir/${tfile}.3_append
2938 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.3_append)
2939 [ $count -eq $setcount ] ||
2940 error "(3) stripe count $count, should be $setcount"
2942 # Try changing the stripe count for append files
2943 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=2
2945 # Append striping is now 2 (directory default is still 4)
2947 echo 1 >> $DIR/$tdir/${tfile}.4_append
2948 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.4_append)
2949 [ $count -eq $appendcount ] ||
2950 error "(4) stripe count $count, should be $appendcount for append"
2952 # Test append stripe count of -1
2953 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=-1
2954 appendcount=$OSTCOUNT
2955 echo 1 >> $DIR/$tdir/${tfile}.5
2956 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.5)
2957 [ $count -eq $appendcount ] ||
2958 error "(5) stripe count $count, should be $appendcount for append"
2960 # Set append striping back to default of 1
2961 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=1
2963 # Try a new default striping, PFL + DOM
2964 $LFS setstripe -L mdt -E 1M -E -1 -c 2 $DIR/$tdir
2966 # Create normal DOM file, DOM returns stripe count == 0
2968 touch $DIR/$tdir/${tfile}.6
2969 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.6)
2970 [ $count -eq $setcount ] ||
2971 error "(6) stripe count $count, should be $setcount"
2975 echo 1 >> $DIR/$tdir/${tfile}.7_append
2976 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.7_append)
2977 [ $count -eq $appendcount ] ||
2978 error "(7) stripe count $count, should be $appendcount for append"
2980 # Clean up DOM layout
2981 $LFS setstripe -d $DIR/$tdir
2983 # Now test that append striping works when layout is from root
2984 $LFS setstripe -c 2 $MOUNT
2985 # Make a special directory for this
2986 mkdir $DIR/${tdir}/${tdir}.2
2987 stack_trap "$LFS setstripe -d $MOUNT" EXIT
2989 # Verify for normal file
2991 echo 1 > $DIR/${tdir}/${tdir}.2/${tfile}.8
2992 count=$($LFS getstripe -c $DIR/$tdir/${tdir}.2/${tfile}.8)
2993 [ $count -eq $setcount ] ||
2994 error "(8) stripe count $count, should be $setcount"
2997 echo 1 >> $DIR/${tdir}/${tdir}.2/${tfile}.9_append
2998 count=$($LFS getstripe -c $DIR/${tdir}/${tdir}.2/${tfile}.9_append)
2999 [ $count -eq $appendcount ] ||
3000 error "(9) stripe count $count, should be $appendcount for append"
3002 # Now test O_APPEND striping with pools
3003 do_nodes $mdts $LCTL set_param mdd.*.append_pool="$TESTNAME"
3004 stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'" EXIT
3007 pool_add $TESTNAME || error "pool creation failed"
3008 pool_add_targets $TESTNAME 0 1 || error "Pool add targets failed"
3010 echo 1 >> $DIR/$tdir/${tfile}.10_append
3012 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.10_append)
3013 [ "$pool" = "$TESTNAME" ] || error "(10) incorrect pool: $pool"
3015 # Check that count is still correct
3017 echo 1 >> $DIR/$tdir/${tfile}.11_append
3018 count=$($LFS getstripe -c $DIR/$tdir/${tfile}.11_append)
3019 [ $count -eq $appendcount ] ||
3020 error "(11) stripe count $count, should be $appendcount for append"
3022 # Disable O_APPEND stripe count, verify pool works separately
3023 do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=0
3025 echo 1 >> $DIR/$tdir/${tfile}.12_append
3027 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.12_append)
3028 [ "$pool" = "$TESTNAME" ] || error "(12) incorrect pool: $pool"
3030 # Remove pool setting, verify it's not applied
3031 do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'
3033 echo 1 >> $DIR/$tdir/${tfile}.13_append
3035 pool=$($LFS getstripe -p $DIR/$tdir/${tfile}.13_append)
3036 [ "$pool" = "" ] || error "(13) pool found: $pool"
3038 run_test 27M "test O_APPEND striping"
3041 combined_mgs_mds && skip "needs separate MGS/MDT"
3043 pool_add $TESTNAME || error "pool_add failed"
3044 do_facet mgs "$LCTL pool_list $FSNAME" |
3045 grep -Fx "${FSNAME}.${TESTNAME}" ||
3046 error "lctl pool_list on MGS failed"
3048 run_test 27N "lctl pool_list on separate MGS gives correct pool name"
3050 # createtest also checks that device nodes are created and
3051 # then visible correctly (#2091)
3052 test_28() { # bug 2091
3054 $CREATETEST $DIR/d28/ct || error "createtest failed"
3056 run_test 28 "create/mknod/mkdir with bad file types ============"
3059 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3061 sync; sleep 1; sync # flush out any dirty pages from previous tests
3068 declare -i LOCKCOUNTORIG=0
3069 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
3070 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
3072 [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
3074 declare -i LOCKUNUSEDCOUNTORIG=0
3075 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
3076 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
3083 declare -i LOCKCOUNTCURRENT=0
3084 for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
3085 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
3088 declare -i LOCKUNUSEDCOUNTCURRENT=0
3089 for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
3090 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
3093 if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
3094 $LCTL set_param -n ldlm.dump_namespaces ""
3095 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
3096 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
3097 log "dumped log to $TMP/test_29.dk (bug 5793)"
3100 if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
3101 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
3102 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
3103 log "dumped log to $TMP/test_29.dk (bug 5793)"
3107 run_test 29 "IT_GETATTR regression ============================"
3109 test_30a() { # was test_30
3110 cp $(which ls) $DIR || cp /bin/ls $DIR
3111 $DIR/ls / || error "Can't execute binary from lustre"
3114 run_test 30a "execute binary from Lustre (execve) =============="
3117 cp `which ls` $DIR || cp /bin/ls $DIR
3119 $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
3122 run_test 30b "execute binary from Lustre as non-root ==========="
3124 test_30c() { # b=22376
3125 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3127 cp $(which ls) $DIR || cp /bin/ls $DIR
3129 cancel_lru_locks mdc
3130 cancel_lru_locks osc
3131 $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
3134 run_test 30c "execute binary from Lustre without read perms ===="
3137 cp $(which dd) $DIR || error "failed to copy dd to $DIR/dd"
3139 for i in {1..10}; do
3140 $DIR/dd bs=1M count=128 if=/dev/zero of=$DIR/$tfile &
3143 $LCTL set_param ldlm.namespaces.*MDT*.lru_size=clear
3144 wait $PID || error "executing dd from Lustre failed"
3150 run_test 30d "execute binary from Lustre while clear locks"
3153 $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
3154 $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
3156 run_test 31a "open-unlink file =================================="
3159 touch $DIR/f31 || error "touch $DIR/f31 failed"
3160 ln $DIR/f31 $DIR/f31b || error "ln failed"
3161 $MULTIOP $DIR/f31b Ouc || error "multiop failed"
3162 $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
3164 run_test 31b "unlink file with multiple links while open ======="
3167 touch $DIR/f31 || error "touch $DIR/f31 failed"
3168 ln $DIR/f31 $DIR/f31c || error "ln failed"
3169 multiop_bg_pause $DIR/f31 O_uc ||
3170 error "multiop_bg_pause for $DIR/f31 failed"
3172 $MULTIOP $DIR/f31c Ouc
3173 kill -USR1 $MULTIPID
3176 run_test 31c "open-unlink file with multiple links ============="
3179 opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
3180 $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
3182 run_test 31d "remove of open directory ========================="
3184 test_31e() { # bug 2904
3185 openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
3187 run_test 31e "remove of open non-empty directory ==============="
3189 test_31f() { # bug 4554
3190 [ $PARALLEL == "yes" ] && skip "skip parallel run"
3193 test_mkdir $DIR/d31f
3194 $LFS setstripe -S 1048576 -c 1 $DIR/d31f
3195 cp /etc/hosts $DIR/d31f
3197 $LFS getstripe $DIR/d31f/hosts
3198 multiop_bg_pause $DIR/d31f D_c || return 1
3201 rm -rv $DIR/d31f || error "first of $DIR/d31f"
3202 test_mkdir $DIR/d31f
3203 $LFS setstripe -S 1048576 -c 1 $DIR/d31f
3204 cp /etc/hosts $DIR/d31f
3206 $LFS getstripe $DIR/d31f/hosts
3207 multiop_bg_pause $DIR/d31f D_c || return 1
3210 kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
3211 wait $MULTIPID || error "first opendir $MULTIPID failed"
3215 kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
3216 wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
3219 run_test 31f "remove of open directory with open-unlink file ==="
3222 echo "-- cross directory link --"
3223 test_mkdir -c1 $DIR/${tdir}ga
3224 test_mkdir -c1 $DIR/${tdir}gb
3225 touch $DIR/${tdir}ga/f
3226 ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
3227 $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
3228 [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
3229 $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
3230 [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
3232 run_test 31g "cross directory link==============="
3235 echo "-- cross directory link --"
3236 test_mkdir -c1 $DIR/${tdir}
3237 test_mkdir -c1 $DIR/${tdir}/dir
3238 touch $DIR/${tdir}/f
3239 ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
3240 $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
3241 [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
3242 $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
3243 [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
3245 run_test 31h "cross directory link under child==============="
3248 echo "-- cross directory link --"
3249 test_mkdir -c1 $DIR/$tdir
3250 test_mkdir -c1 $DIR/$tdir/dir
3251 touch $DIR/$tdir/dir/f
3252 ln $DIR/$tdir/dir/f $DIR/$tdir/g
3253 $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
3254 [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
3255 $CHECKSTAT -t file $DIR/$tdir/g || error "target"
3256 [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
3258 run_test 31i "cross directory link under parent==============="
3261 test_mkdir -c1 -p $DIR/$tdir
3262 test_mkdir -c1 -p $DIR/$tdir/dir1
3263 ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
3264 link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
3265 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
3266 mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
3269 run_test 31j "link for directory==============="
3272 test_mkdir -c1 -p $DIR/$tdir
3274 touch $DIR/$tdir/exist
3275 mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
3276 mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
3277 mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
3278 mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
3279 mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
3280 mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
3281 mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
3284 run_test 31k "link to file: the same, non-existing, dir==============="
3290 touch $DIR/d31m2/exist
3291 mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
3292 mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
3293 mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
3294 mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
3295 mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
3296 mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
3299 run_test 31m "link to file: the same, non-existing, dir==============="
3302 touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
3303 nlink=$(stat --format=%h $DIR/$tfile)
3304 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
3306 local cmd="exec $fd<$DIR/$tfile"
3309 trap "eval $cmd" EXIT
3310 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
3311 [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
3312 rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
3313 nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
3314 [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
3317 run_test 31n "check link count of unlinked file"
3320 local tempfile=$(mktemp $1_XXXXXX)
3321 mlink $tempfile $1 2> /dev/null &&
3322 echo "$BASHPID: link $tempfile to $1 succeeded"
3326 test_31o() { # LU-2901
3327 test_mkdir $DIR/$tdir
3328 for LOOP in $(seq 100); do
3329 rm -f $DIR/$tdir/$tfile*
3330 for THREAD in $(seq 8); do
3331 link_one $DIR/$tdir/$tfile.$LOOP &
3334 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
3335 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
3336 error "$LINKS duplicate links to $tfile.$LOOP" &&
3340 run_test 31o "duplicate hard links with same filename"
3343 [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3345 test_mkdir $DIR/$tdir
3346 $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3347 $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
3349 opendirunlink $DIR/$tdir/striped_dir/test1 ||
3350 error "open unlink test1 failed"
3351 opendirunlink $DIR/$tdir/striped_dir/test2 ||
3352 error "open unlink test2 failed"