Whamcloud - gitweb
LU-11161 tests: stop running sanity test 160g
[fs/lustre-release.git] / lustre / tests / sanity.sh
1 #!/bin/bash
2 # -*- tab-width: 8; indent-tabs-mode: t; -*-
3 #
4 # Run select tests by setting ONLY, or as arguments to the script.
5 # Skip specific tests by setting EXCEPT.
6 #
7 # e.g. ONLY="22 23" or ONLY="`seq 32 39`" or EXCEPT="31"
8 set -e
9
10 ONLY=${ONLY:-"$*"}
11 # bug number for skipped test: LU-9693 LU-6493 LU-9693 LU-11058
12 ALWAYS_EXCEPT="$SANITY_EXCEPT  42a     42b     42c     77k"
13 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
14
15 # skipped tests: LU-8411 LU-9096 LU-9054 ..
16 ALWAYS_EXCEPT="  407     253     312     $ALWAYS_EXCEPT"
17
18 # Check Grants after these tests
19 GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c"
20
21 SRCDIR=$(cd $(dirname $0); echo $PWD)
22 export PATH=$PATH:/sbin
23
24 TMP=${TMP:-/tmp}
25 OSC=${OSC:-"osc"}
26
27 CC=${CC:-cc}
28 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
29 CREATETEST=${CREATETEST:-createtest}
30 LFS=${LFS:-lfs}
31 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
32 LCTL=${LCTL:-lctl}
33 OPENFILE=${OPENFILE:-openfile}
34 OPENUNLINK=${OPENUNLINK:-openunlink}
35 export MULTIOP=${MULTIOP:-multiop}
36 READS=${READS:-"reads"}
37 MUNLINK=${MUNLINK:-munlink}
38 SOCKETSERVER=${SOCKETSERVER:-socketserver}
39 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
40 MEMHOG=${MEMHOG:-memhog}
41 DIRECTIO=${DIRECTIO:-directio}
42 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
43 DEF_STRIPE_COUNT=-1
44 CHECK_GRANT=${CHECK_GRANT:-"yes"}
45 GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
46 export PARALLEL=${PARALLEL:-"no"}
47
48 export NAME=${NAME:-local}
49
50 SAVE_PWD=$PWD
51
52 CLEANUP=${CLEANUP:-:}
53 SETUP=${SETUP:-:}
54 TRACE=${TRACE:-""}
55 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
56 LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
57 . $LUSTRE/tests/test-framework.sh
58 init_test_env $@
59 . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh}
60 init_logging
61
62 if [[ $MDSCOUNT -gt 1 ]]; then
63         # bug number:    LU-11161
64         ALWAYS_EXCEPT+=" 160g"
65 fi
66
67 #                                  5          12          (min)"
68 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
69
70 if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then
71         # bug number for skipped test: LU-1957
72         ALWAYS_EXCEPT="$ALWAYS_EXCEPT  180"
73         #                                               13    (min)"
74         [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
75 fi
76
77 # Get the SLES distro version
78 #
79 # Returns a version string that should only be used in comparing
80 # strings returned by version_code()
81 sles_version_code()
82 {
83         local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2)
84
85         # All SuSE Linux versions have one decimal. version_code expects two
86         local sles_version=$version.0
87         version_code $sles_version
88 }
89
90 # Check if we are running on Ubuntu or SLES so we can make decisions on
91 # what tests to run
92 if [ -r /etc/SuSE-release ]; then
93         sles_version=$(sles_version_code)
94         [ $sles_version -lt $(version_code 11.4.0) ] &&
95                 # bug number for skipped test: LU-4341
96                 ALWAYS_EXCEPT="$ALWAYS_EXCEPT  170"
97         [ $sles_version -lt $(version_code 12.0.0) ] &&
98                 # bug number for skipped test: LU-3703
99                 ALWAYS_EXCEPT="$ALWAYS_EXCEPT  234"
100 elif [ -r /etc/os-release ]; then
101         if grep -qi ubuntu /etc/os-release; then
102                 ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
103                                                 -e 's/^VERSION=//p' \
104                                                 /etc/os-release |
105                                                 awk '{ print $1 }'))
106
107                 if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
108                         # bug number for skipped test:
109                         #                LU-10334 LU-10335 LU-10335 LU-10335
110                         ALWAYS_EXCEPT+=" 103a     130a     130b     130c"
111                         #                LU-10335 LU-10335 LU-10365 LU-10366
112                         ALWAYS_EXCEPT+=" 130d     130e     400a     410"
113                 fi
114         fi
115 fi
116
117 FAIL_ON_ERROR=false
118
119 cleanup() {
120         echo -n "cln.."
121         pgrep ll_sa > /dev/null && { echo "There are ll_sa thread not exit!"; exit 20; }
122         cleanupall ${FORCE} $* || { echo "FAILed to clean up"; exit 20; }
123 }
124 setup() {
125         echo -n "mnt.."
126         load_modules
127         setupall || exit 10
128         echo "done"
129 }
130
131 check_swap_layouts_support()
132 {
133         $LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
134                 skip "Does not support layout lock."
135 }
136
137 check_and_setup_lustre
138 DIR=${DIR:-$MOUNT}
139 assert_DIR
140
141 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
142
143 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
144 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
145 rm -rf $DIR/[Rdfs][0-9]*
146
147 # $RUNAS_ID may get set incorrectly somewhere else
148 [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] && error "\$RUNAS_ID set to 0, but \$UID is also 0!"
149
150 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
151
152 build_test_filter
153
154 if [ "${ONLY}" = "MOUNT" ] ; then
155         echo "Lustre is up, please go on"
156         exit
157 fi
158
159 echo "preparing for tests involving mounts"
160 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
161 touch $EXT2_DEV
162 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
163 echo # add a newline after mke2fs.
164
165 umask 077
166
167 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
168 lctl set_param debug=-1 2> /dev/null || true
169 test_0a() {
170         touch $DIR/$tfile
171         $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
172         rm $DIR/$tfile
173         $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
174 }
175 run_test 0a "touch; rm ====================="
176
177 test_0b() {
178         chmod 0755 $DIR || error "chmod 0755 $DIR failed"
179         $CHECKSTAT -p 0755 $DIR || error "$DIR permission is not 0755"
180 }
181 run_test 0b "chmod 0755 $DIR ============================="
182
183 test_0c() {
184         $LCTL get_param mdc.*.import | grep "state: FULL" ||
185                 error "import not FULL"
186         $LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" ||
187                 error "bad target"
188 }
189 run_test 0c "check import proc"
190
191 test_0d() { # LU-3397
192         [ $(lustre_version_code mgs) -lt $(version_code 2.10.57) ] &&
193                 skip "proc exports not supported before 2.10.57"
194
195         local mgs_exp="mgs.MGS.exports"
196         local client_uuid=$($LCTL get_param -n mgc.*.uuid)
197         local exp_client_nid
198         local exp_client_version
199         local exp_val
200         local imp_val
201         local temp_imp=$DIR/$tfile.import
202         local temp_exp=$DIR/$tfile.export
203
204         # save mgc import file to $temp_imp
205         $LCTL get_param mgc.*.import | tee $temp_imp
206         # Check if client uuid is found in MGS export
207         for exp_client_nid in $(do_facet mgs $LCTL get_param -N $mgs_exp.*); do
208                 [ $(do_facet mgs $LCTL get_param -n $exp_client_nid.uuid) == \
209                         $client_uuid ] &&
210                         break;
211         done
212         # save mgs export file to $temp_exp
213         do_facet mgs $LCTL get_param $exp_client_nid.export | tee $temp_exp
214
215         # Compare the value of field "connect_flags"
216         imp_val=$(grep "connect_flags" $temp_imp)
217         exp_val=$(grep "connect_flags" $temp_exp)
218         [ "$exp_val" == "$imp_val" ] ||
219                 error "export flags '$exp_val' != import flags '$imp_val'"
220
221         # Compare the value of client version
222         exp_client_version=$(awk '/target_version:/ { print $2 }' $temp_exp)
223         exp_val=$(version_code $exp_client_version)
224         imp_val=$(lustre_version_code client)
225         [ "$exp_val" == "$imp_val" ] ||
226                 error "export client version '$exp_val' != '$imp_val'"
227 }
228 run_test 0d "check export proc ============================="
229
230 test_1() {
231         test_mkdir $DIR/$tdir
232         test_mkdir $DIR/$tdir/d2
233         mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
234         $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir"
235         rmdir $DIR/$tdir/d2
236         rmdir $DIR/$tdir
237         $CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed"
238 }
239 run_test 1 "mkdir; remkdir; rmdir"
240
241 test_2() {
242         test_mkdir $DIR/$tdir
243         touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed"
244         $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
245         rm -r $DIR/$tdir
246         $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed"
247 }
248 run_test 2 "mkdir; touch; rmdir; check file"
249
250 test_3() {
251         test_mkdir $DIR/$tdir
252         $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
253         touch $DIR/$tdir/$tfile
254         $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
255         rm -r $DIR/$tdir
256         $CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed"
257 }
258 run_test 3 "mkdir; touch; rmdir; check dir"
259
260 # LU-4471 - failed rmdir on remote directories still removes directory on MDT0
261 test_4() {
262         test_mkdir -i 1 $DIR/$tdir
263
264         touch $DIR/$tdir/$tfile ||
265                 error "Create file under remote directory failed"
266
267         rmdir $DIR/$tdir &&
268                 error "Expect error removing in-use dir $DIR/$tdir"
269
270         test -d $DIR/$tdir || error "Remote directory disappeared"
271
272         rm -rf $DIR/$tdir || error "remove remote dir error"
273 }
274 run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
275
276 test_5() {
277         test_mkdir $DIR/$tdir
278         test_mkdir $DIR/$tdir/d2
279         chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed"
280         $CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707"
281         $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
282 }
283 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2"
284
285 test_6a() {
286         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
287         chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
288         $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
289                 error "$tfile does not have perm 0666 or UID $UID"
290         $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
291         $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
292                 error "$tfile should be 0666 and owned by UID $UID"
293 }
294 run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
295
296 test_6c() {
297         [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
298
299         touch $DIR/$tfile
300         chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
301         $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
302                 error "$tfile should be owned by UID $RUNAS_ID"
303         $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
304         $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
305                 error "$tfile should be owned by UID $RUNAS_ID"
306 }
307 run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
308
309 test_6e() {
310         [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
311
312         touch $DIR/$tfile
313         chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
314         $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
315                 error "$tfile should be owned by GID $UID"
316         $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
317         $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
318                 error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
319 }
320 run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)"
321
322 test_6g() {
323         [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
324
325         test_mkdir $DIR/$tdir
326         chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed"
327         $RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
328         chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed"
329         test_mkdir $DIR/$tdir/d/subdir
330         $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir ||
331                 error "$tdir/d/subdir should be GID $RUNAS_GID"
332         if [[ $MDSCOUNT -gt 1 ]]; then
333                 # check remote dir sgid inherite
334                 $LFS mkdir -i 0 $DIR/$tdir.local ||
335                         error "mkdir $tdir.local failed"
336                 chmod g+s $DIR/$tdir.local ||
337                         error "chmod $tdir.local failed"
338                 chgrp $RUNAS_GID $DIR/$tdir.local ||
339                         error "chgrp $tdir.local failed"
340                 $LFS mkdir -i 1 $DIR/$tdir.local/$tdir.remote ||
341                         error "mkdir $tdir.remote failed"
342                 $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir.local/$tdir.remote ||
343                         error "$tdir.remote should be owned by $UID.$RUNAS_ID"
344                 $CHECKSTAT -p 02755 $DIR/$tdir.local/$tdir.remote ||
345                         error "$tdir.remote should be mode 02755"
346         fi
347 }
348 run_test 6g "verify new dir in sgid dir inherits group"
349
350 test_6h() { # bug 7331
351         [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID"
352
353         touch $DIR/$tfile || error "touch failed"
354         chown $RUNAS_ID:$RUNAS_GID $DIR/$tfile || error "initial chown failed"
355         $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/$tfile &&
356                 error "chown $RUNAS_ID:0 $tfile worked as GID $RUNAS_GID"
357         $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile ||
358                 error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID"
359 }
360 run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)"
361
362 test_7a() {
363         test_mkdir $DIR/$tdir
364         $MCREATE $DIR/$tdir/$tfile
365         chmod 0666 $DIR/$tdir/$tfile
366         $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
367                 error "$tdir/$tfile should be mode 0666"
368 }
369 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
370
371 test_7b() {
372         if [ ! -d $DIR/$tdir ]; then
373                 test_mkdir $DIR/$tdir
374         fi
375         $MCREATE $DIR/$tdir/$tfile
376         echo -n foo > $DIR/$tdir/$tfile
377         [ "$(cat $DIR/$tdir/$tfile)" = "foo" ] || error "$tdir/$tfile not 'foo'"
378         $CHECKSTAT -t file -s 3 $DIR/$tdir/$tfile || error "$tfile size not 3"
379 }
380 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
381
382 test_8() {
383         test_mkdir $DIR/$tdir
384         touch $DIR/$tdir/$tfile
385         chmod 0666 $DIR/$tdir/$tfile
386         $CHECKSTAT -t file -p 0666 $DIR/$tdir/$tfile ||
387                 error "$tfile mode not 0666"
388 }
389 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
390
391 test_9() {
392         test_mkdir $DIR/$tdir
393         test_mkdir $DIR/$tdir/d2
394         test_mkdir $DIR/$tdir/d2/d3
395         $CHECKSTAT -t dir $DIR/$tdir/d2/d3 || error "$tdir/d2/d3 not a dir"
396 }
397 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
398
399 test_10() {
400         test_mkdir $DIR/$tdir
401         test_mkdir $DIR/$tdir/d2
402         touch $DIR/$tdir/d2/$tfile
403         $CHECKSTAT -t file $DIR/$tdir/d2/$tfile ||
404                 error "$tdir/d2/$tfile not a file"
405 }
406 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
407
408 test_11() {
409         test_mkdir $DIR/$tdir
410         test_mkdir $DIR/$tdir/d2
411         chmod 0666 $DIR/$tdir/d2
412         chmod 0705 $DIR/$tdir/d2
413         $CHECKSTAT -t dir -p 0705 $DIR/$tdir/d2 ||
414                 error "$tdir/d2 mode not 0705"
415 }
416 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
417
418 test_12() {
419         test_mkdir $DIR/$tdir
420         touch $DIR/$tdir/$tfile
421         chmod 0666 $DIR/$tdir/$tfile
422         chmod 0654 $DIR/$tdir/$tfile
423         $CHECKSTAT -t file -p 0654 $DIR/$tdir/$tfile ||
424                 error "$tdir/d2 mode not 0654"
425 }
426 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
427
428 test_13() {
429         test_mkdir $DIR/$tdir
430         dd if=/dev/zero of=$DIR/$tdir/$tfile count=10
431         >  $DIR/$tdir/$tfile
432         $CHECKSTAT -t file -s 0 $DIR/$tdir/$tfile ||
433                 error "$tdir/$tfile size not 0 after truncate"
434 }
435 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
436
437 test_14() {
438         test_mkdir $DIR/$tdir
439         touch $DIR/$tdir/$tfile
440         rm $DIR/$tdir/$tfile
441         $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
442 }
443 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
444
445 test_15() {
446         test_mkdir $DIR/$tdir
447         touch $DIR/$tdir/$tfile
448         mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
449         $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
450                 error "$tdir/${tfile_2} not a file after rename"
451         rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
452 }
453 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
454
455 test_16() {
456         test_mkdir $DIR/$tdir
457         touch $DIR/$tdir/$tfile
458         rm -rf $DIR/$tdir/$tfile
459         $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
460 }
461 run_test 16 "touch .../d16/f; rm -rf .../d16/f"
462
463 test_17a() {
464         test_mkdir $DIR/$tdir
465         touch $DIR/$tdir/$tfile
466         ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist
467         ls -l $DIR/$tdir
468         $CHECKSTAT -l $DIR/$tdir/$tfile $DIR/$tdir/l-exist ||
469                 error "$tdir/l-exist not a symlink"
470         $CHECKSTAT -f -t f $DIR/$tdir/l-exist ||
471                 error "$tdir/l-exist not referencing a file"
472         rm -f $DIR/$tdir/l-exist
473         $CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed"
474 }
475 run_test 17a "symlinks: create, remove (real)"
476
477 test_17b() {
478         test_mkdir $DIR/$tdir
479         ln -s no-such-file $DIR/$tdir/l-dangle
480         ls -l $DIR/$tdir
481         $CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle ||
482                 error "$tdir/l-dangle not referencing no-such-file"
483         $CHECKSTAT -fa $DIR/$tdir/l-dangle ||
484                 error "$tdir/l-dangle not referencing non-existent file"
485         rm -f $DIR/$tdir/l-dangle
486         $CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed"
487 }
488 run_test 17b "symlinks: create, remove (dangling)"
489
490 test_17c() { # bug 3440 - don't save failed open RPC for replay
491         test_mkdir $DIR/$tdir
492         ln -s foo $DIR/$tdir/$tfile
493         cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true
494 }
495 run_test 17c "symlinks: open dangling (should return error)"
496
497 test_17d() {
498         test_mkdir $DIR/$tdir
499         ln -s foo $DIR/$tdir/$tfile
500         touch $DIR/$tdir/$tfile || error "creating to new symlink"
501 }
502 run_test 17d "symlinks: create dangling"
503
504 test_17e() {
505         test_mkdir $DIR/$tdir
506         local foo=$DIR/$tdir/$tfile
507         ln -s $foo $foo || error "create symlink failed"
508         ls -l $foo || error "ls -l failed"
509         ls $foo && error "ls not failed" || true
510 }
511 run_test 17e "symlinks: create recursive symlink (should return error)"
512
513 test_17f() {
514         test_mkdir $DIR/$tdir
515         ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
516         ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
517         ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
518         ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
519         ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
520         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
521         ls -l  $DIR/$tdir
522 }
523 run_test 17f "symlinks: long and very long symlink name"
524
525 # str_repeat(S, N) generate a string that is string S repeated N times
526 str_repeat() {
527         local s=$1
528         local n=$2
529         local ret=''
530         while [ $((n -= 1)) -ge 0 ]; do
531                 ret=$ret$s
532         done
533         echo $ret
534 }
535
536 # Long symlinks and LU-2241
537 test_17g() {
538         test_mkdir $DIR/$tdir
539         local TESTS="59 60 61 4094 4095"
540
541         # Fix for inode size boundary in 2.1.4
542         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.1.4) ] &&
543                 TESTS="4094 4095"
544
545         # Patch not applied to 2.2 or 2.3 branches
546         [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] &&
547         [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.3.55) ] &&
548                 TESTS="4094 4095"
549
550         # skip long symlink name for rhel6.5.
551         # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
552         grep -q '6.5' /etc/redhat-release &>/dev/null &&
553                 TESTS="59 60 61 4062 4063"
554
555         for i in $TESTS; do
556                 local SYMNAME=$(str_repeat 'x' $i)
557                 ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
558                 readlink $DIR/$tdir/f$i || error "failed $i-char readlink"
559         done
560 }
561 run_test 17g "symlinks: really long symlink name and inode boundaries"
562
563 test_17h() { #bug 17378
564         [ $PARALLEL == "yes" ] && skip "skip parallel run"
565         remote_mds_nodsh && skip "remote MDS with nodsh"
566
567         local mdt_idx
568
569         test_mkdir $DIR/$tdir
570         mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
571         $LFS setstripe -c -1 $DIR/$tdir
572         #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
573         do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
574         touch $DIR/$tdir/$tfile || true
575 }
576 run_test 17h "create objects: lov_free_memmd() doesn't lbug"
577
578 test_17i() { #bug 20018
579         [ $PARALLEL == "yes" ] && skip "skip parallel run"
580         remote_mds_nodsh && skip "remote MDS with nodsh"
581
582         local foo=$DIR/$tdir/$tfile
583         local mdt_idx
584
585         test_mkdir -c1 $DIR/$tdir
586         mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
587         ln -s $foo $foo || error "create symlink failed"
588 #define OBD_FAIL_MDS_READLINK_EPROTO     0x143
589         do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000143
590         ls -l $foo && error "error not detected"
591         return 0
592 }
593 run_test 17i "don't panic on short symlink (should return error)"
594
595 test_17k() { #bug 22301
596         [ $PARALLEL == "yes" ] && skip "skip parallel run"
597         [[ -z "$(which rsync 2>/dev/null)" ]] &&
598                 skip "no rsync command"
599         rsync --help | grep -q xattr ||
600                 skip_env "$(rsync --version | head -n1) does not support xattrs"
601         test_mkdir $DIR/$tdir
602         test_mkdir $DIR/$tdir.new
603         touch $DIR/$tdir/$tfile
604         ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
605         rsync -av -X $DIR/$tdir/ $DIR/$tdir.new ||
606                 error "rsync failed with xattrs enabled"
607 }
608 run_test 17k "symlinks: rsync with xattrs enabled"
609
610 test_17l() { # LU-279
611         [[ -z "$(which getfattr 2>/dev/null)" ]] &&
612                 skip "no getfattr command"
613
614         test_mkdir $DIR/$tdir
615         touch $DIR/$tdir/$tfile
616         ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
617         for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
618                 # -h to not follow symlinks. -m '' to list all the xattrs.
619                 # grep to remove first line: '# file: $path'.
620                 for xattr in `getfattr -hm '' $path 2>/dev/null | grep -v '^#'`;
621                 do
622                         lgetxattr_size_check $path $xattr ||
623                                 error "lgetxattr_size_check $path $xattr failed"
624                 done
625         done
626 }
627 run_test 17l "Ensure lgetxattr's returned xattr size is consistent"
628
629 # LU-1540
630 test_17m() {
631         [ $PARALLEL == "yes" ] && skip "skip parallel run"
632         [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
633                 skip_env "ldiskfs only test"
634         remote_mds_nodsh && skip "remote MDS with nodsh"
635         [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] &&
636         [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.2.93) ] &&
637                 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
638
639         local short_sym="0123456789"
640         local wdir=$DIR/$tdir
641         local i
642
643         test_mkdir $wdir
644         long_sym=$short_sym
645         # create a long symlink file
646         for ((i = 0; i < 4; ++i)); do
647                 long_sym=${long_sym}${long_sym}
648         done
649
650         echo "create 512 short and long symlink files under $wdir"
651         for ((i = 0; i < 256; ++i)); do
652                 ln -sf ${long_sym}"a5a5" $wdir/long-$i
653                 ln -sf ${short_sym}"a5a5" $wdir/short-$i
654         done
655
656         echo "erase them"
657         rm -f $wdir/*
658         sync
659         wait_delete_completed
660
661         echo "recreate the 512 symlink files with a shorter string"
662         for ((i = 0; i < 512; ++i)); do
663                 # rewrite the symlink file with a shorter string
664                 ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed"
665                 ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed"
666         done
667
668         local mds_index=$(($($LFS getstripe -m $wdir) + 1))
669         local devname=$(mdsdevname $mds_index)
670
671         echo "stop and checking mds${mds_index}:"
672         # e2fsck should not return error
673         stop mds${mds_index}
674         run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
675         rc=$?
676
677         start mds${mds_index} $devname $MDS_MOUNT_OPTS ||
678                 error "start mds${mds_index} failed"
679         df $MOUNT > /dev/null 2>&1
680         [ $rc -eq 0 ] ||
681                 error "e2fsck detected error for short/long symlink: rc=$rc"
682         rm -f $wdir/*
683 }
684 run_test 17m "run e2fsck against MDT which contains short/long symlink"
685
686 check_fs_consistency_17n() {
687         local mdt_index
688         local rc=0
689
690         # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
691         # so it only check MDT1/MDT2 instead of all of MDTs.
692         for mdt_index in 1 2; do
693                 local devname=$(mdsdevname $mdt_index)
694                 # e2fsck should not return error
695                 stop mds${mdt_index}
696                 run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
697                         rc=$((rc + $?))
698
699                 start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
700                         error "mount mds$mdt_index failed"
701                 df $MOUNT > /dev/null 2>&1
702         done
703         return $rc
704 }
705
706 test_17n() {
707         [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
708         [ $PARALLEL == "yes" ] && skip "skip parallel run"
709         [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
710                 skip_env "ldiskfs only test"
711         remote_mds_nodsh && skip "remote MDS with nodsh"
712         [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] &&
713         [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.2.93) ] &&
714                 skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks"
715
716         local i
717
718         test_mkdir $DIR/$tdir
719         for ((i=0; i<10; i++)); do
720                 $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
721                         error "create remote dir error $i"
722                 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
723                         error "create files under remote dir failed $i"
724         done
725
726         check_fs_consistency_17n ||
727                 error "e2fsck report error after create files under remote dir"
728
729         for ((i = 0; i < 10; i++)); do
730                 rm -rf $DIR/$tdir/remote_dir_${i} ||
731                         error "destroy remote dir error $i"
732         done
733
734         check_fs_consistency_17n ||
735                 error "e2fsck report error after unlink files under remote dir"
736
737         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.50) ] &&
738                 skip "lustre < 2.4.50 does not support migrate mv"
739
740         for ((i = 0; i < 10; i++)); do
741                 mkdir -p $DIR/$tdir/remote_dir_${i}
742                 createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
743                         error "create files under remote dir failed $i"
744                 $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
745                         error "migrate remote dir error $i"
746         done
747         check_fs_consistency_17n || error "e2fsck report error after migration"
748
749         for ((i = 0; i < 10; i++)); do
750                 rm -rf $DIR/$tdir/remote_dir_${i} ||
751                         error "destroy remote dir error $i"
752         done
753
754         check_fs_consistency_17n || error "e2fsck report error after unlink"
755 }
756 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
757
758 test_17o() {
759         remote_mds_nodsh && skip "remote MDS with nodsh"
760         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.64) ] &&
761                 skip "Need MDS version at least 2.3.64"
762
763         local wdir=$DIR/${tdir}o
764         local mdt_index
765         local rc=0
766
767         test_mkdir $wdir
768         touch $wdir/$tfile
769         mdt_index=$($LFS getstripe -m $wdir/$tfile)
770         mdt_index=$((mdt_index + 1))
771
772         cancel_lru_locks mdc
773         #fail mds will wait the failover finish then set
774         #following fail_loc to avoid interfer the recovery process.
775         fail mds${mdt_index}
776
777         #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
778         do_facet mds${mdt_index} lctl set_param fail_loc=0x194
779         ls -l $wdir/$tfile && rc=1
780         do_facet mds${mdt_index} lctl set_param fail_loc=0
781         [[ $rc -eq 0 ]] || error "stat file should fail"
782 }
783 run_test 17o "stat file with incompat LMA feature"
784
785 test_18() {
786         touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
787         ls $DIR || error "Failed to ls $DIR: $?"
788 }
789 run_test 18 "touch .../f ; ls ... =============================="
790
791 test_19a() {
792         touch $DIR/$tfile
793         ls -l $DIR
794         rm $DIR/$tfile
795         $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
796 }
797 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
798
799 test_19b() {
800         ls -l $DIR/$tfile && error "ls -l $tfile failed"|| true
801 }
802 run_test 19b "ls -l .../f19 (should return error) =============="
803
804 test_19c() {
805         [ $RUNAS_ID -eq $UID ] &&
806                 skip_env "RUNAS_ID = UID = $UID -- skipping"
807
808         $RUNAS touch $DIR/$tfile && error "create non-root file failed" || true
809 }
810 run_test 19c "$RUNAS touch .../f19 (should return error) =="
811
812 test_19d() {
813         cat $DIR/f19 && error || true
814 }
815 run_test 19d "cat .../f19 (should return error) =============="
816
817 test_20() {
818         touch $DIR/$tfile
819         rm $DIR/$tfile
820         touch $DIR/$tfile
821         rm $DIR/$tfile
822         touch $DIR/$tfile
823         rm $DIR/$tfile
824         $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
825 }
826 run_test 20 "touch .../f ; ls -l ..."
827
828 test_21() {
829         test_mkdir $DIR/$tdir
830         [ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle
831         ln -s dangle $DIR/$tdir/link
832         echo foo >> $DIR/$tdir/link
833         cat $DIR/$tdir/dangle
834         $CHECKSTAT -t link $DIR/$tdir/link || error "$tdir/link not a link"
835         $CHECKSTAT -f -t file $DIR/$tdir/link ||
836                 error "$tdir/link not linked to a file"
837 }
838 run_test 21 "write to dangling link"
839
840 test_22() {
841         local wdir=$DIR/$tdir
842         test_mkdir $wdir
843         chown $RUNAS_ID:$RUNAS_GID $wdir
844         (cd $wdir || error "cd $wdir failed";
845                 $RUNAS tar cf - /etc/hosts /etc/sysconfig/network |
846                 $RUNAS tar xf -)
847         ls -lR $wdir/etc || error "ls -lR $wdir/etc failed"
848         $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed"
849         $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc ||
850                 error "checkstat -u failed"
851 }
852 run_test 22 "unpack tar archive as non-root user"
853
854 # was test_23
855 test_23a() {
856         test_mkdir $DIR/$tdir
857         local file=$DIR/$tdir/$tfile
858
859         openfile -f O_CREAT:O_EXCL $file || error "$file create failed"
860         openfile -f O_CREAT:O_EXCL $file &&
861                 error "$file recreate succeeded" || true
862 }
863 run_test 23a "O_CREAT|O_EXCL in subdir"
864
865 test_23b() { # bug 18988
866         test_mkdir $DIR/$tdir
867         local file=$DIR/$tdir/$tfile
868
869         rm -f $file
870         echo foo > $file || error "write filed"
871         echo bar >> $file || error "append filed"
872         $CHECKSTAT -s 8 $file || error "wrong size"
873         rm $file
874 }
875 run_test 23b "O_APPEND check"
876
877 # LU-9409, size with O_APPEND and tiny writes
878 test_23c() {
879         local file=$DIR/$tfile
880
881         # single dd
882         dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800
883         $CHECKSTAT -s 6400 $file || error "wrong size, expected 6400"
884         rm -f $file
885
886         # racing tiny writes
887         dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
888         dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=800 &
889         wait
890         $CHECKSTAT -s 12800 $file || error "wrong size, expected 12800"
891         rm -f $file
892
893         #racing tiny & normal writes
894         dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4096 count=4 &
895         dd conv=notrunc oflag=append if=/dev/zero of=$file bs=8 count=100 &
896         wait
897         $CHECKSTAT -s 17184 $file || error "wrong size, expected 17184"
898         rm -f $file
899
900         #racing tiny & normal writes 2, ugly numbers
901         dd conv=notrunc oflag=append if=/dev/zero of=$file bs=4099 count=11 &
902         dd conv=notrunc oflag=append if=/dev/zero of=$file bs=17 count=173 &
903         wait
904         $CHECKSTAT -s 48030 $file || error "wrong size, expected 48030"
905         rm -f $file
906 }
907 run_test 23c "O_APPEND size checks for tiny writes"
908
909 # LU-11069 file offset is correct after appending writes
910 test_23d() {
911         local file=$DIR/$tfile
912         local offset
913
914         echo CentaurHauls > $file
915         offset=$($MULTIOP $file oO_WRONLY:O_APPEND:w13Zp)
916         if ((offset != 26)); then
917                 error "wrong offset, expected 26, got '$offset'"
918         fi
919 }
920 run_test 23d "file offset is correct after appending writes"
921
922 # rename sanity
923 test_24a() {
924         echo '-- same directory rename'
925         test_mkdir $DIR/$tdir
926         touch $DIR/$tdir/$tfile.1
927         mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
928         $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
929 }
930 run_test 24a "rename file to non-existent target"
931
932 test_24b() {
933         test_mkdir $DIR/$tdir
934         touch $DIR/$tdir/$tfile.{1,2}
935         mv $DIR/$tdir/$tfile.1 $DIR/$tdir/$tfile.2
936         $CHECKSTAT -a $DIR/$tdir/$tfile.1 || error "$tfile.1 exists"
937         $CHECKSTAT -t file $DIR/$tdir/$tfile.2 || error "$tfile.2 not a file"
938 }
939 run_test 24b "rename file to existing target"
940
941 test_24c() {
942         test_mkdir $DIR/$tdir
943         test_mkdir $DIR/$tdir/d$testnum.1
944         mv $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
945         $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
946         $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
947 }
948 run_test 24c "rename directory to non-existent target"
949
950 test_24d() {
951         test_mkdir -c1 $DIR/$tdir
952         test_mkdir -c1 $DIR/$tdir/d$testnum.1
953         test_mkdir -c1 $DIR/$tdir/d$testnum.2
954         mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
955         $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
956         $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
957 }
958 run_test 24d "rename directory to existing target"
959
960 test_24e() {
961         echo '-- cross directory renames --'
962         test_mkdir $DIR/R5a
963         test_mkdir $DIR/R5b
964         touch $DIR/R5a/f
965         mv $DIR/R5a/f $DIR/R5b/g
966         $CHECKSTAT -a $DIR/R5a/f || error "$DIR/R5a/f exists"
967         $CHECKSTAT -t file $DIR/R5b/g || error "$DIR/R5b/g not file type"
968 }
969 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
970
971 test_24f() {
972         test_mkdir $DIR/R6a
973         test_mkdir $DIR/R6b
974         touch $DIR/R6a/f $DIR/R6b/g
975         mv $DIR/R6a/f $DIR/R6b/g
976         $CHECKSTAT -a $DIR/R6a/f || error "$DIR/R6a/f exists"
977         $CHECKSTAT -t file $DIR/R6b/g || error "$DIR/R6b/g not file type"
978 }
979 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
980
981 test_24g() {
982         test_mkdir $DIR/R7a
983         test_mkdir $DIR/R7b
984         test_mkdir $DIR/R7a/d
985         mv $DIR/R7a/d $DIR/R7b/e
986         $CHECKSTAT -a $DIR/R7a/d || error "$DIR/R7a/d exists"
987         $CHECKSTAT -t dir $DIR/R7b/e || error "$DIR/R7b/e not dir type"
988 }
989 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
990
991 test_24h() {
992         test_mkdir -c1 $DIR/R8a
993         test_mkdir -c1 $DIR/R8b
994         test_mkdir -c1 $DIR/R8a/d
995         test_mkdir -c1 $DIR/R8b/e
996         mrename $DIR/R8a/d $DIR/R8b/e
997         $CHECKSTAT -a $DIR/R8a/d || error "$DIR/R8a/d exists"
998         $CHECKSTAT -t dir $DIR/R8b/e || error "$DIR/R8b/e not dir type"
999 }
1000 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
1001
1002 test_24i() {
1003         echo "-- rename error cases"
1004         test_mkdir $DIR/R9
1005         test_mkdir $DIR/R9/a
1006         touch $DIR/R9/f
1007         mrename $DIR/R9/f $DIR/R9/a
1008         $CHECKSTAT -t file $DIR/R9/f || error "$DIR/R9/f not file type"
1009         $CHECKSTAT -t dir  $DIR/R9/a || error "$DIR/R9/a not dir type"
1010         $CHECKSTAT -a $DIR/R9/a/f || error "$DIR/R9/a/f exists"
1011 }
1012 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
1013
1014 test_24j() {
1015         test_mkdir $DIR/R10
1016         mrename $DIR/R10/f $DIR/R10/g
1017         $CHECKSTAT -t dir $DIR/R10 || error "$DIR/R10 not dir type"
1018         $CHECKSTAT -a $DIR/R10/f || error "$DIR/R10/f exists"
1019         $CHECKSTAT -a $DIR/R10/g || error "$DIR/R10/g exists"
1020 }
1021 run_test 24j "source does not exist ============================"
1022
1023 test_24k() {
1024         test_mkdir $DIR/R11a
1025         test_mkdir $DIR/R11a/d
1026         touch $DIR/R11a/f
1027         mv $DIR/R11a/f $DIR/R11a/d
1028         $CHECKSTAT -a $DIR/R11a/f || error "$DIR/R11a/f exists"
1029         $CHECKSTAT -t file $DIR/R11a/d/f || error "$DIR/R11a/d/f not file type"
1030 }
1031 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
1032
1033 # bug 2429 - rename foo foo foo creates invalid file
1034 test_24l() {
1035         f="$DIR/f24l"
1036         $MULTIOP $f OcNs || error "rename of ${f} to itself failed"
1037 }
1038 run_test 24l "Renaming a file to itself ========================"
1039
1040 test_24m() {
1041         f="$DIR/f24m"
1042         $MULTIOP $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
1043         # on ext3 this does not remove either the source or target files
1044         # though the "expected" operation would be to remove the source
1045         $CHECKSTAT -t file ${f} || error "${f} missing"
1046         $CHECKSTAT -t file ${f}2 || error "${f}2 missing"
1047 }
1048 run_test 24m "Renaming a file to a hard link to itself ========="
1049
1050 test_24n() {
1051     f="$DIR/f24n"
1052     # this stats the old file after it was renamed, so it should fail
1053     touch ${f}
1054     $CHECKSTAT ${f} || error "${f} missing"
1055     mv ${f} ${f}.rename
1056     $CHECKSTAT ${f}.rename || error "${f}.rename missing"
1057     $CHECKSTAT -a ${f} || error "${f} exists"
1058 }
1059 run_test 24n "Statting the old file after renaming (Posix rename 2)"
1060
1061 test_24o() {
1062         test_mkdir $DIR/$tdir
1063         rename_many -s random -v -n 10 $DIR/$tdir
1064 }
1065 run_test 24o "rename of files during htree split"
1066
1067 test_24p() {
1068         test_mkdir $DIR/R12a
1069         test_mkdir $DIR/R12b
1070         DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
1071         mrename $DIR/R12a $DIR/R12b
1072         $CHECKSTAT -a $DIR/R12a || error "$DIR/R12a exists"
1073         $CHECKSTAT -t dir $DIR/R12b || error "$DIR/R12b not dir type"
1074         DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
1075         [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
1076 }
1077 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
1078
1079 cleanup_multiop_pause() {
1080         trap 0
1081         kill -USR1 $MULTIPID
1082 }
1083
1084 test_24q() {
1085         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1086
1087         test_mkdir $DIR/R13a
1088         test_mkdir $DIR/R13b
1089         local DIRINO=$(ls -lid $DIR/R13a | awk '{ print $1 }')
1090         multiop_bg_pause $DIR/R13b D_c || error "multiop failed to start"
1091         MULTIPID=$!
1092
1093         trap cleanup_multiop_pause EXIT
1094         mrename $DIR/R13a $DIR/R13b
1095         $CHECKSTAT -a $DIR/R13a || error "R13a still exists"
1096         $CHECKSTAT -t dir $DIR/R13b || error "R13b does not exist"
1097         local DIRINO2=$(ls -lid $DIR/R13b | awk '{ print $1 }')
1098         [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
1099         cleanup_multiop_pause
1100         wait $MULTIPID || error "multiop close failed"
1101 }
1102 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
1103
1104 test_24r() { #bug 3789
1105         test_mkdir $DIR/R14a
1106         test_mkdir $DIR/R14a/b
1107         mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
1108         $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
1109         $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
1110 }
1111 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
1112
1113 test_24s() {
1114         test_mkdir $DIR/R15a
1115         test_mkdir $DIR/R15a/b
1116         test_mkdir $DIR/R15a/b/c
1117         mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
1118         $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
1119         $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
1120 }
1121 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
1122 test_24t() {
1123         test_mkdir $DIR/R16a
1124         test_mkdir $DIR/R16a/b
1125         test_mkdir $DIR/R16a/b/c
1126         mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
1127         $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
1128         $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
1129 }
1130 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
1131
1132 test_24u() { # bug12192
1133         $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error "multiop failed"
1134         $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
1135 }
1136 run_test 24u "create stripe file"
1137
1138 page_size() {
1139         local size
1140         size=$(getconf PAGE_SIZE 2>/dev/null)
1141         echo -n ${size:-4096}
1142 }
1143
1144 simple_cleanup_common() {
1145         local rc=0
1146         trap 0
1147         [ -z "$DIR" -o -z "$tdir" ] && return 0
1148
1149         local start=$SECONDS
1150         rm -rf $DIR/$tdir
1151         rc=$?
1152         wait_delete_completed
1153         echo "cleanup time $((SECONDS - start))"
1154         return $rc
1155 }
1156
1157 max_pages_per_rpc() {
1158         local mdtname="$(printf "MDT%04x" ${1:-0})"
1159         $LCTL get_param -n mdc.*$mdtname*.max_pages_per_rpc
1160 }
1161
1162 test_24v() {
1163         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1164
1165         local nrfiles=${COUNT:-100000}
1166         local fname="$DIR/$tdir/$tfile"
1167
1168         # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
1169         [ $(facet_fstype $SINGLEMDS) = "zfs" ] && nrfiles=${COUNT:-10000}
1170
1171         test_mkdir "$(dirname $fname)"
1172         # assume MDT0000 has the fewest inodes
1173         local stripes=$($LFS getdirstripe -c $(dirname $fname))
1174         local free_inodes=$(($(mdt_free_inodes 0) * stripes))
1175         [[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
1176
1177         trap simple_cleanup_common EXIT
1178
1179         createmany -m "$fname" $nrfiles
1180
1181         cancel_lru_locks mdc
1182         lctl set_param mdc.*.stats clear
1183
1184         # was previously test_24D: LU-6101
1185         # readdir() returns correct number of entries after cursor reload
1186         local num_ls=$(ls $DIR/$tdir | wc -l)
1187         local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l)
1188         local num_all=$(ls -a $DIR/$tdir | wc -l)
1189         if [ $num_ls -ne $nrfiles -o $num_uniq -ne $nrfiles -o \
1190              $num_all -ne $((nrfiles + 2)) ]; then
1191                 error "Expected $nrfiles files, got $num_ls " \
1192                         "($num_uniq unique $num_all .&..)"
1193         fi
1194         # LU-5 large readdir
1195         # dirent_size = 32 bytes for sizeof(struct lu_dirent) +
1196         #               N bytes for name (len($nrfiles) rounded to 8 bytes) +
1197         #               8 bytes for luda_type (4 bytes rounded to 8 bytes)
1198         # take into account of overhead in lu_dirpage header and end mark in
1199         # each page, plus one in rpc_num calculation.
1200         local dirent_size=$((32 + (${#tfile} | 7) + 1 + 8))
1201         local page_entries=$((($(page_size) - 24) / dirent_size))
1202         local mdt_idx=$($LFS getdirstripe -i $(dirname $fname))
1203         local rpc_pages=$(max_pages_per_rpc $mdt_idx)
1204         local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
1205         local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
1206         echo "readpages: $mds_readpage rpc_max: $rpc_max"
1207         (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
1208                 error "large readdir doesn't take effect: " \
1209                       "$mds_readpage should be about $rpc_max"
1210
1211         simple_cleanup_common
1212 }
1213 run_test 24v "list large directory (test hash collision, b=17560)"
1214
1215 test_24w() { # bug21506
1216         SZ1=234852
1217         dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
1218         dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
1219         dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
1220         SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
1221         [[ "$SZ1" -eq "$SZ2" ]] ||
1222                 error "Error reading at the end of the file $tfile"
1223 }
1224 run_test 24w "Reading a file larger than 4Gb"
1225
1226 test_24x() {
1227         [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1228         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1229         [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.56) ]] &&
1230                 skip "Need MDS version at least 2.7.56"
1231
1232         local MDTIDX=1
1233         local remote_dir=$DIR/$tdir/remote_dir
1234
1235         test_mkdir $DIR/$tdir
1236         $LFS mkdir -i $MDTIDX $remote_dir ||
1237                 error "create remote directory failed"
1238
1239         test_mkdir $DIR/$tdir/src_dir
1240         touch $DIR/$tdir/src_file
1241         test_mkdir $remote_dir/tgt_dir
1242         touch $remote_dir/tgt_file
1243
1244         mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
1245                 error "rename dir cross MDT failed!"
1246
1247         mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
1248                 error "rename file cross MDT failed!"
1249
1250         touch $DIR/$tdir/ln_file
1251         ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
1252                 error "ln file cross MDT failed"
1253
1254         rm -rf $DIR/$tdir || error "Can not delete directories"
1255 }
1256 run_test 24x "cross MDT rename/link"
1257
1258 test_24y() {
1259         [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
1260         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1261
1262         local remote_dir=$DIR/$tdir/remote_dir
1263         local mdtidx=1
1264
1265         test_mkdir $DIR/$tdir
1266         $LFS mkdir -i $mdtidx $remote_dir ||
1267                 error "create remote directory failed"
1268
1269         test_mkdir $remote_dir/src_dir
1270         touch $remote_dir/src_file
1271         test_mkdir $remote_dir/tgt_dir
1272         touch $remote_dir/tgt_file
1273
1274         mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
1275                 error "rename subdir in the same remote dir failed!"
1276
1277         mrename $remote_dir/src_file $remote_dir/tgt_file ||
1278                 error "rename files in the same remote dir failed!"
1279
1280         ln $remote_dir/tgt_file $remote_dir/tgt_file1 ||
1281                 error "link files in the same remote dir failed!"
1282
1283         rm -rf $DIR/$tdir || error "Can not delete directories"
1284 }
1285 run_test 24y "rename/link on the same dir should succeed"
1286
1287 test_24A() { # LU-3182
1288         local NFILES=5000
1289
1290         rm -rf $DIR/$tdir
1291         test_mkdir $DIR/$tdir
1292         trap simple_cleanup_common EXIT
1293         createmany -m $DIR/$tdir/$tfile $NFILES
1294         local t=$(ls $DIR/$tdir | wc -l)
1295         local u=$(ls $DIR/$tdir | sort -u | wc -l)
1296         local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
1297         if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then
1298                 error "Expected $NFILES files, got $t ($u unique $v .&..)"
1299         fi
1300
1301         simple_cleanup_common || error "Can not delete directories"
1302 }
1303 run_test 24A "readdir() returns correct number of entries."
1304
1305 test_24B() { # LU-4805
1306         [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1307
1308         local count
1309
1310         test_mkdir $DIR/$tdir
1311         $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
1312                 error "create striped dir failed"
1313
1314         count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1315         [ $count -eq 2 ] || error "Expected 2, got $count"
1316
1317         touch $DIR/$tdir/striped_dir/a
1318
1319         count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1320         [ $count -eq 3 ] || error "Expected 3, got $count"
1321
1322         touch $DIR/$tdir/striped_dir/.f
1323
1324         count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
1325         [ $count -eq 4 ] || error "Expected 4, got $count"
1326
1327         rm -rf $DIR/$tdir || error "Can not delete directories"
1328 }
1329 run_test 24B "readdir for striped dir return correct number of entries"
1330
1331 test_24C() {
1332         [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
1333
1334         mkdir $DIR/$tdir
1335         mkdir $DIR/$tdir/d0
1336         mkdir $DIR/$tdir/d1
1337
1338         $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
1339                 error "create striped dir failed"
1340
1341         cd $DIR/$tdir/d0/striped_dir
1342
1343         local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
1344         local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
1345         local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1346
1347         [ "$d0_ino" = "$parent_ino" ] ||
1348                 error ".. wrong, expect $d0_ino, get $parent_ino"
1349
1350         mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
1351                 error "mv striped dir failed"
1352
1353         parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
1354
1355         [ "$d1_ino" = "$parent_ino" ] ||
1356                 error ".. wrong after mv, expect $d1_ino, get $parent_ino"
1357 }
1358 run_test 24C "check .. in striped dir"
1359
1360 test_24E() {
1361         [[ $MDSCOUNT -lt 4 ]] && skip_env "needs >= 4 MDTs"
1362         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1363
1364         mkdir -p $DIR/$tdir
1365         mkdir $DIR/$tdir/src_dir
1366         $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
1367                 error "create remote source failed"
1368
1369         touch $DIR/$tdir/src_dir/src_child/a
1370
1371         $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
1372                 error "create remote target dir failed"
1373
1374         $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
1375                 error "create remote target child failed"
1376
1377         mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
1378                 error "rename dir cross MDT failed!"
1379
1380         find $DIR/$tdir
1381
1382         $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
1383                 error "src_child still exists after rename"
1384
1385         $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
1386                 error "missing file(a) after rename"
1387
1388         rm -rf $DIR/$tdir || error "Can not delete directories"
1389 }
1390 run_test 24E "cross MDT rename/link"
1391
1392 test_25a() {
1393         echo '== symlink sanity ============================================='
1394
1395         test_mkdir $DIR/d25
1396         ln -s d25 $DIR/s25
1397         touch $DIR/s25/foo ||
1398                 error "File creation in symlinked directory failed"
1399 }
1400 run_test 25a "create file in symlinked directory ==============="
1401
1402 test_25b() {
1403         [ ! -d $DIR/d25 ] && test_25a
1404         $CHECKSTAT -t file $DIR/s25/foo || error "$DIR/s25/foo not file type"
1405 }
1406 run_test 25b "lookup file in symlinked directory ==============="
1407
1408 test_26a() {
1409         test_mkdir $DIR/d26
1410         test_mkdir $DIR/d26/d26-2
1411         ln -s d26/d26-2 $DIR/s26
1412         touch $DIR/s26/foo || error "File creation failed"
1413 }
1414 run_test 26a "multiple component symlink ======================="
1415
1416 test_26b() {
1417         test_mkdir -p $DIR/$tdir/d26-2
1418         ln -s $tdir/d26-2/foo $DIR/s26-2
1419         touch $DIR/s26-2 || error "File creation failed"
1420 }
1421 run_test 26b "multiple component symlink at end of lookup ======"
1422
1423 test_26c() {
1424         test_mkdir $DIR/d26.2
1425         touch $DIR/d26.2/foo
1426         ln -s d26.2 $DIR/s26.2-1
1427         ln -s s26.2-1 $DIR/s26.2-2
1428         ln -s s26.2-2 $DIR/s26.2-3
1429         chmod 0666 $DIR/s26.2-3/foo
1430 }
1431 run_test 26c "chain of symlinks"
1432
1433 # recursive symlinks (bug 439)
1434 test_26d() {
1435         ln -s d26-3/foo $DIR/d26-3
1436 }
1437 run_test 26d "create multiple component recursive symlink"
1438
1439 test_26e() {
1440         [ ! -h $DIR/d26-3 ] && test_26d
1441         rm $DIR/d26-3
1442 }
1443 run_test 26e "unlink multiple component recursive symlink"
1444
1445 # recursive symlinks (bug 7022)
1446 test_26f() {
1447         test_mkdir $DIR/$tdir
1448         test_mkdir $DIR/$tdir/$tfile
1449         cd $DIR/$tdir/$tfile           || error "cd $DIR/$tdir/$tfile failed"
1450         test_mkdir -p lndir/bar1
1451         test_mkdir $DIR/$tdir/$tfile/$tfile
1452         cd $tfile                || error "cd $tfile failed"
1453         ln -s .. dotdot          || error "ln dotdot failed"
1454         ln -s dotdot/lndir lndir || error "ln lndir failed"
1455         cd $DIR/$tdir                 || error "cd $DIR/$tdir failed"
1456         output=`ls $tfile/$tfile/lndir/bar1`
1457         [ "$output" = bar1 ] && error "unexpected output"
1458         rm -r $tfile             || error "rm $tfile failed"
1459         $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
1460 }
1461 run_test 26f "rm -r of a directory which has recursive symlink"
1462
1463 test_27a() {
1464         test_mkdir $DIR/$tdir
1465         $LFS getstripe $DIR/$tdir
1466         $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed"
1467         $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1468         cp /etc/hosts $DIR/$tdir/$tfile || error "Can't copy to one stripe file"
1469 }
1470 run_test 27a "one stripe file"
1471
1472 test_27b() {
1473         [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1474
1475         test_mkdir $DIR/$tdir
1476         $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1477         $LFS getstripe -c $DIR/$tdir/$tfile
1478         [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
1479                 error "two-stripe file doesn't have two stripes"
1480
1481         dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1482 }
1483 run_test 27b "create and write to two stripe file"
1484
1485 test_27d() {
1486         test_mkdir $DIR/$tdir
1487         $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
1488                 error "setstripe failed"
1489         $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1490         dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1491 }
1492 run_test 27d "create file with default settings"
1493
1494 test_27e() {
1495         # LU-5839 adds check for existed layout before setting it
1496         [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.56) ]] &&
1497                 skip "Need MDS version at least 2.7.56"
1498
1499         test_mkdir $DIR/$tdir
1500         $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1501         $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice"
1502         $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
1503 }
1504 run_test 27e "setstripe existing file (should return error)"
1505
1506 test_27f() {
1507         test_mkdir $DIR/$tdir
1508         $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
1509                 error "$SETSTRIPE $DIR/$tdir/$tfile failed"
1510         $CHECKSTAT -t file $DIR/$tdir/$tfile &&
1511                 error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
1512         dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
1513         $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed"
1514 }
1515 run_test 27f "setstripe with bad stripe size (should return error)"
1516
1517 test_27g() {
1518         test_mkdir $DIR/$tdir
1519         $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1520         $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" ||
1521                 error "$DIR/$tdir/$tfile has object"
1522 }
1523 run_test 27g "$LFS getstripe with no objects"
1524
1525 test_27i() {
1526         test_mkdir $DIR/$tdir
1527         touch $DIR/$tdir/$tfile || error "touch failed"
1528         [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] ||
1529                 error "missing objects"
1530 }
1531 run_test 27i "$LFS getstripe with some objects"
1532
1533 test_27j() {
1534         test_mkdir $DIR/$tdir
1535         $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile &&
1536                 error "setstripe failed" || true
1537 }
1538 run_test 27j "setstripe with bad stripe offset (should return error)"
1539
1540 test_27k() { # bug 2844
1541         test_mkdir $DIR/$tdir
1542         local file=$DIR/$tdir/$tfile
1543         local ll_max_blksize=$((4 * 1024 * 1024))
1544         $LFS setstripe -S 67108864 $file || error "setstripe failed"
1545         local blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1546         [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize"
1547         dd if=/dev/zero of=$file bs=4k count=1
1548         blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
1549         [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize"
1550 }
1551 run_test 27k "limit i_blksize for broken user apps"
1552
1553 test_27l() {
1554         mcreate $DIR/$tfile || error "creating file"
1555         $RUNAS $LFS setstripe -c 1 $DIR/$tfile &&
1556                 error "setstripe should have failed" || true
1557 }
1558 run_test 27l "check setstripe permissions (should return error)"
1559
1560 test_27m() {
1561         [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1562
1563         ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
1564                    head -n1)
1565         if [[ $ORIGFREE -gt $MAXFREE ]]; then
1566                 skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
1567         fi
1568         trap simple_cleanup_common EXIT
1569         test_mkdir $DIR/$tdir
1570         $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
1571         dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
1572                 error "dd should fill OST0"
1573         i=2
1574         while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do
1575                 i=$((i + 1))
1576                 [ $i -gt 256 ] && break
1577         done
1578         i=$((i + 1))
1579         touch $DIR/$tdir/$tfile.$i
1580         [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1581             awk '{print $1}'| grep -w "0") ] &&
1582                 error "OST0 was full but new created file still use it"
1583         i=$((i + 1))
1584         touch $DIR/$tdir/$tfile.$i
1585         [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
1586             awk '{print $1}'| grep -w "0") ] &&
1587                 error "OST0 was full but new created file still use it"
1588         simple_cleanup_common
1589 }
1590 run_test 27m "create file while OST0 was full"
1591
1592 sleep_maxage() {
1593         local delay=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage |
1594                       awk '{ print $1 * 2; exit; }')
1595         sleep $delay
1596 }
1597
1598 # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage)
1599 # if the OST isn't full anymore.
1600 reset_enospc() {
1601         local OSTIDX=${1:-""}
1602
1603         local list=$(comma_list $(osts_nodes))
1604         [ "$OSTIDX" ] && list=$(facet_host ost$((OSTIDX + 1)))
1605
1606         do_nodes $list lctl set_param fail_loc=0
1607         sync    # initiate all OST_DESTROYs from MDS to OST
1608         sleep_maxage
1609 }
1610
1611 exhaust_precreations() {
1612         local OSTIDX=$1
1613         local FAILLOC=$2
1614         local FAILIDX=${3:-$OSTIDX}
1615         local ofacet=ost$((OSTIDX + 1))
1616
1617         test_mkdir -p -c1 $DIR/$tdir
1618         local mdtidx=$($LFS getstripe -m $DIR/$tdir)
1619         local mfacet=mds$((mdtidx + 1))
1620         echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
1621
1622         local OST=$(ostname_from_index $OSTIDX)
1623
1624         # on the mdt's osc
1625         local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST)
1626         local last_id=$(do_facet $mfacet lctl get_param -n \
1627                         osc.$mdtosc_proc1.prealloc_last_id)
1628         local next_id=$(do_facet $mfacet lctl get_param -n \
1629                         osc.$mdtosc_proc1.prealloc_next_id)
1630
1631         local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet)
1632         do_facet $mfacet lctl get_param osc.$mdtosc_proc2.prealloc*
1633
1634         test_mkdir -p $DIR/$tdir/${OST}
1635         $SETSTRIPE -i $OSTIDX -c 1 $DIR/$tdir/${OST}
1636 #define OBD_FAIL_OST_ENOSPC              0x215
1637         do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215
1638         echo "Creating to objid $last_id on ost $OST..."
1639         createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2))
1640         do_facet $mfacet lctl get_param osc.$mdtosc_proc2.prealloc*
1641         do_facet $ofacet lctl set_param fail_loc=$FAILLOC
1642         sleep_maxage
1643 }
1644
1645 exhaust_all_precreations() {
1646         local i
1647         for (( i=0; i < OSTCOUNT; i++ )) ; do
1648                 exhaust_precreations $i $1 -1
1649         done
1650 }
1651
1652 test_27n() {
1653         [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1654         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1655         remote_mds_nodsh && skip "remote MDS with nodsh"
1656         remote_ost_nodsh && skip "remote OST with nodsh"
1657
1658         reset_enospc
1659         rm -f $DIR/$tdir/$tfile
1660         exhaust_precreations 0 0x80000215
1661         $LFS setstripe -c -1 $DIR/$tdir || error "setstripe failed"
1662         touch $DIR/$tdir/$tfile || error "touch failed"
1663         $LFS getstripe $DIR/$tdir/$tfile
1664         reset_enospc
1665 }
1666 run_test 27n "create file with some full OSTs"
1667
1668 test_27o() {
1669         [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1670         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1671         remote_mds_nodsh && skip "remote MDS with nodsh"
1672         remote_ost_nodsh && skip "remote OST with nodsh"
1673
1674         reset_enospc
1675         rm -f $DIR/$tdir/$tfile
1676         exhaust_all_precreations 0x215
1677
1678         touch $DIR/$tdir/$tfile && error "able to create $DIR/$tdir/$tfile"
1679
1680         reset_enospc
1681         rm -rf $DIR/$tdir/*
1682 }
1683 run_test 27o "create file with all full OSTs (should error)"
1684
1685 test_27p() {
1686         [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1687         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1688         remote_mds_nodsh && skip "remote MDS with nodsh"
1689         remote_ost_nodsh && skip "remote OST with nodsh"
1690
1691         reset_enospc
1692         rm -f $DIR/$tdir/$tfile
1693         test_mkdir $DIR/$tdir
1694
1695         $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
1696         $TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed"
1697         $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1698
1699         exhaust_precreations 0 0x80000215
1700         echo foo >> $DIR/$tdir/$tfile || error "append failed"
1701         $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed"
1702         $LFS getstripe $DIR/$tdir/$tfile
1703
1704         reset_enospc
1705 }
1706 run_test 27p "append to a truncated file with some full OSTs"
1707
1708 test_27q() {
1709         [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1710         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1711         remote_mds_nodsh && skip "remote MDS with nodsh"
1712         remote_ost_nodsh && skip "remote OST with nodsh"
1713
1714         reset_enospc
1715         rm -f $DIR/$tdir/$tfile
1716
1717         test_mkdir $DIR/$tdir
1718         $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
1719         $TRUNCATE $DIR/$tdir/$tfile 80000000 ||
1720                 error "truncate $DIR/$tdir/$tfile failed"
1721         $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
1722
1723         exhaust_all_precreations 0x215
1724
1725         echo foo >> $DIR/$tdir/$tfile && error "append succeeded"
1726         $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat 2 failed"
1727
1728         reset_enospc
1729 }
1730 run_test 27q "append to truncated file with all OSTs full (should error)"
1731
1732 test_27r() {
1733         [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1734         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1735         remote_mds_nodsh && skip "remote MDS with nodsh"
1736         remote_ost_nodsh && skip "remote OST with nodsh"
1737
1738         reset_enospc
1739         rm -f $DIR/$tdir/$tfile
1740         exhaust_precreations 0 0x80000215
1741
1742         $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
1743
1744         reset_enospc
1745 }
1746 run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
1747
1748 test_27s() { # bug 10725
1749         test_mkdir $DIR/$tdir
1750         local stripe_size=$((4096 * 1024 * 1024))       # 2^32
1751         local stripe_count=0
1752         [ $OSTCOUNT -eq 1 ] || stripe_count=2
1753         $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir &&
1754                 error "stripe width >= 2^32 succeeded" || true
1755
1756 }
1757 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
1758
1759 test_27t() { # bug 10864
1760         WDIR=$(pwd)
1761         WLFS=$(which lfs)
1762         cd $DIR
1763         touch $tfile
1764         $WLFS getstripe $tfile
1765         cd $WDIR
1766 }
1767 run_test 27t "check that utils parse path correctly"
1768
1769 test_27u() { # bug 4900
1770         [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1771         remote_mds_nodsh && skip "remote MDS with nodsh"
1772
1773         local index
1774         local list=$(comma_list $(mdts_nodes))
1775
1776 #define OBD_FAIL_MDS_OSC_PRECREATE      0x139
1777         do_nodes $list $LCTL set_param fail_loc=0x139
1778         test_mkdir -p $DIR/$tdir
1779         trap simple_cleanup_common EXIT
1780         createmany -o $DIR/$tdir/t- 1000
1781         do_nodes $list $LCTL set_param fail_loc=0
1782
1783         TLOG=$TMP/$tfile.getstripe
1784         $LFS getstripe $DIR/$tdir > $TLOG
1785         OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
1786         unlinkmany $DIR/$tdir/t- 1000
1787         trap 0
1788         [[ $OBJS -gt 0 ]] &&
1789                 error "$OBJS objects created on OST-0. See $TLOG" ||
1790                 rm -f $TLOG
1791 }
1792 run_test 27u "skip object creation on OSC w/o objects"
1793
1794 test_27v() { # bug 4900
1795         [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1796         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1797         remote_mds_nodsh && skip "remote MDS with nodsh"
1798         remote_ost_nodsh && skip "remote OST with nodsh"
1799
1800         exhaust_all_precreations 0x215
1801         reset_enospc
1802
1803         $LFS setstripe -c 1 $DIR/$tdir         # 1 stripe / file
1804
1805         touch $DIR/$tdir/$tfile
1806         #define OBD_FAIL_TGT_DELAY_PRECREATE     0x705
1807         # all except ost1
1808         for (( i=1; i < OSTCOUNT; i++ )); do
1809                 do_facet ost$i lctl set_param fail_loc=0x705
1810         done
1811         local START=`date +%s`
1812         createmany -o $DIR/$tdir/$tfile 32
1813
1814         local FINISH=`date +%s`
1815         local TIMEOUT=`lctl get_param -n timeout`
1816         local PROCESS=$((FINISH - START))
1817         [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
1818                error "$FINISH - $START >= $TIMEOUT / 2"
1819         sleep $((TIMEOUT / 2 - PROCESS))
1820         reset_enospc
1821 }
1822 run_test 27v "skip object creation on slow OST"
1823
1824 test_27w() { # bug 10997
1825         test_mkdir $DIR/$tdir
1826         $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
1827         [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
1828                 error "stripe size $size != 65536" || true
1829         [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
1830                 error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
1831 }
1832 run_test 27w "check $LFS setstripe -S and getstrip -d options"
1833
1834 test_27wa() {
1835         [[ $OSTCOUNT -lt 2 ]] &&
1836                 skip_env "skipping multiple stripe count/offset test"
1837
1838         test_mkdir $DIR/$tdir
1839         for i in $(seq 1 $OSTCOUNT); do
1840                 offset=$((i - 1))
1841                 $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i ||
1842                         error "setstripe -c $i -i $offset failed"
1843                 count=$($LFS getstripe -c $DIR/$tdir/f$i)
1844                 index=$($LFS getstripe -i $DIR/$tdir/f$i)
1845                 [ $count -ne $i ] && error "stripe count $count != $i" || true
1846                 [ $index -ne $offset ] &&
1847                         error "stripe offset $index != $offset" || true
1848         done
1849 }
1850 run_test 27wa "check $LFS setstripe -c -i options"
1851
1852 test_27x() {
1853         remote_ost_nodsh && skip "remote OST with nodsh"
1854         [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1855         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1856
1857         OFFSET=$(($OSTCOUNT - 1))
1858         OSTIDX=0
1859         local OST=$(ostname_from_index $OSTIDX)
1860
1861         test_mkdir $DIR/$tdir
1862         $LFS setstripe -c 1 $DIR/$tdir  # 1 stripe per file
1863         do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1
1864         sleep_maxage
1865         createmany -o $DIR/$tdir/$tfile $OSTCOUNT
1866         for i in $(seq 0 $OFFSET); do
1867                 [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx |
1868                         awk '{print $1}' | grep -w "$OSTIDX") ] &&
1869                 error "OST0 was degraded but new created file still use it"
1870         done
1871         do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0
1872 }
1873 run_test 27x "create files while OST0 is degraded"
1874
1875 test_27y() {
1876         [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
1877         remote_mds_nodsh && skip "remote MDS with nodsh"
1878         remote_ost_nodsh && skip "remote OST with nodsh"
1879         [ $PARALLEL == "yes" ] && skip "skip parallel run"
1880
1881         local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
1882         local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
1883                 osc.$mdtosc.prealloc_last_id)
1884         local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
1885                 osc.$mdtosc.prealloc_next_id)
1886         local fcount=$((last_id - next_id))
1887         [[ $fcount -eq 0 ]] && skip "not enough space on OST0"
1888         [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
1889
1890         local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
1891                          awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
1892         local OST_DEACTIVE_IDX=-1
1893         local OSC
1894         local OSTIDX
1895         local OST
1896
1897         for OSC in $MDS_OSCS; do
1898                 OST=$(osc_to_ost $OSC)
1899                 OSTIDX=$(index_from_ostuuid $OST)
1900                 if [ $OST_DEACTIVE_IDX == -1 ]; then
1901                         OST_DEACTIVE_IDX=$OSTIDX
1902                 fi
1903                 if [ $OSTIDX != $OST_DEACTIVE_IDX ]; then
1904                         echo $OSC "is Deactivated:"
1905                         do_facet $SINGLEMDS lctl --device  %$OSC deactivate
1906                 fi
1907         done
1908
1909         OSTIDX=$(index_from_ostuuid $OST)
1910         test_mkdir $DIR/$tdir
1911         $LFS setstripe -c 1 $DIR/$tdir      # 1 stripe / file
1912
1913         for OSC in $MDS_OSCS; do
1914                 OST=$(osc_to_ost $OSC)
1915                 OSTIDX=$(index_from_ostuuid $OST)
1916                 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
1917                         echo $OST "is degraded:"
1918                         do_facet ost$((OSTIDX+1)) lctl set_param -n \
1919                                                 obdfilter.$OST.degraded=1
1920                 fi
1921         done
1922
1923         sleep_maxage
1924         createmany -o $DIR/$tdir/$tfile $fcount
1925
1926         for OSC in $MDS_OSCS; do
1927                 OST=$(osc_to_ost $OSC)
1928                 OSTIDX=$(index_from_ostuuid $OST)
1929                 if [ $OSTIDX == $OST_DEACTIVE_IDX ]; then
1930                         echo $OST "is recovered from degraded:"
1931                         do_facet ost$((OSTIDX+1)) lctl set_param -n \
1932                                                 obdfilter.$OST.degraded=0
1933                 else
1934                         do_facet $SINGLEMDS lctl --device %$OSC activate
1935                 fi
1936         done
1937
1938         # all osp devices get activated, hence -1 stripe count restored
1939         local stripe_count=0
1940
1941         # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp
1942         # devices get activated.
1943         sleep_maxage
1944         $LFS setstripe -c -1 $DIR/$tfile
1945         stripe_count=$($LFS getstripe -c $DIR/$tfile)
1946         rm -f $DIR/$tfile
1947         [ $stripe_count -ne $OSTCOUNT ] &&
1948                 error "Of $OSTCOUNT OSTs, only $stripe_count is available"
1949         return 0
1950 }
1951 run_test 27y "create files while OST0 is degraded and the rest inactive"
1952
1953 check_seq_oid()
1954 {
1955         log "check file $1"
1956
1957         lmm_count=$($GETSTRIPE -c $1)
1958         lmm_seq=$($GETSTRIPE -v $1 | awk '/lmm_seq/ { print $2 }')
1959         lmm_oid=$($GETSTRIPE -v $1 | awk '/lmm_object_id/ { print $2 }')
1960
1961         local old_ifs="$IFS"
1962         IFS=$'[:]'
1963         fid=($($LFS path2fid $1))
1964         IFS="$old_ifs"
1965
1966         log "FID seq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}"
1967         log "LOV seq $lmm_seq, oid $lmm_oid, count: $lmm_count"
1968
1969         # compare lmm_seq and lu_fid->f_seq
1970         [ $lmm_seq = ${fid[1]} ] || { error "SEQ mismatch"; return 1; }
1971         # compare lmm_object_id and lu_fid->oid
1972         [ $lmm_oid = ${fid[2]} ] || { error "OID mismatch"; return 2; }
1973
1974         # check the trusted.fid attribute of the OST objects of the file
1975         local have_obdidx=false
1976         local stripe_nr=0
1977         $GETSTRIPE $1 | while read obdidx oid hex seq; do
1978                 # skip lines up to and including "obdidx"
1979                 [ -z "$obdidx" ] && break
1980                 [ "$obdidx" = "obdidx" ] && have_obdidx=true && continue
1981                 $have_obdidx || continue
1982
1983                 local ost=$((obdidx + 1))
1984                 local dev=$(ostdevname $ost)
1985                 local oid_hex
1986
1987                 log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
1988
1989                 seq=$(echo $seq | sed -e "s/^0x//g")
1990                 if [ $seq == 0 ] || [ $(facet_fstype ost$ost) == zfs ]; then
1991                         oid_hex=$(echo $oid)
1992                 else
1993                         oid_hex=$(echo $hex | sed -e "s/^0x//g")
1994                 fi
1995                 local obj_file="O/$seq/d$((oid %32))/$oid_hex"
1996
1997                 local ff=""
1998                 #
1999                 # Don't unmount/remount the OSTs if we don't need to do that.
2000                 # LU-2577 changes filter_fid to be smaller, so debugfs needs
2001                 # update too, until that use mount/ll_decode_filter_fid/mount.
2002                 # Re-enable when debugfs will understand new filter_fid.
2003                 #
2004                 if [ $(facet_fstype ost$ost) == ldiskfs ]; then
2005                         ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
2006                                 $dev 2>/dev/null" | grep "parent=")
2007                 fi
2008                 if [ -z "$ff" ]; then
2009                         stop ost$ost
2010                         mount_fstype ost$ost
2011                         ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
2012                                 $(facet_mntpt ost$ost)/$obj_file)
2013                         unmount_fstype ost$ost
2014                         start ost$ost $dev $OST_MOUNT_OPTS
2015                         clients_up
2016                 fi
2017
2018                 [ -z "$ff" ] && error "$obj_file: no filter_fid info"
2019
2020                 echo "$ff" | sed -e 's#.*objid=#got: objid=#'
2021
2022                 # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
2023                 # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
2024                 #
2025                 # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \
2026                 #       stripe_size=1048576 component_id=1 component_start=0 \
2027                 #       component_end=33554432
2028                 local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff)
2029                 local ff_pseq=$(cut -d: -f1 <<<$ff_parent)
2030                 local ff_poid=$(cut -d: -f2 <<<$ff_parent)
2031                 local ff_pstripe
2032                 if grep -q 'stripe=' <<<$ff; then
2033                         ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff)
2034                 else
2035                         # $LL_DECODE_FILTER_FID does not print "stripe="; look
2036                         # into f_ver in this case.  See comment on ff_parent.
2037                         ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//')
2038                 fi
2039
2040                 # compare lmm_seq and filter_fid->ff_parent.f_seq
2041                 [ $ff_pseq = $lmm_seq ] ||
2042                         error "FF parent SEQ $ff_pseq != $lmm_seq"
2043                 # compare lmm_object_id and filter_fid->ff_parent.f_oid
2044                 [ $ff_poid = $lmm_oid ] ||
2045                         error "FF parent OID $ff_poid != $lmm_oid"
2046                 (($ff_pstripe == $stripe_nr)) ||
2047                         error "FF stripe $ff_pstripe != $stripe_nr"
2048
2049                 stripe_nr=$((stripe_nr + 1))
2050                 [ $(lustre_version_code client) -lt $(version_code 2.9.55) ] &&
2051                         continue
2052                 if grep -q 'stripe_count=' <<<$ff; then
2053                         local ff_scnt=$(sed -e 's/.*stripe_count=//' \
2054                                             -e 's/ .*//' <<<$ff)
2055                         [ $lmm_count = $ff_scnt ] ||
2056                                 error "FF stripe count $lmm_count != $ff_scnt"
2057                 fi
2058         done
2059 }
2060
2061 test_27z() {
2062         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2063         remote_ost_nodsh && skip "remote OST with nodsh"
2064
2065         test_mkdir $DIR/$tdir
2066         $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
2067                 { error "setstripe -c -1 failed"; return 1; }
2068         # We need to send a write to every object to get parent FID info set.
2069         # This _should_ also work for setattr, but does not currently.
2070         # touch $DIR/$tdir/$tfile-1 ||
2071         dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
2072                 { error "dd $tfile-1 failed"; return 2; }
2073         $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
2074                 { error "setstripe -c -1 failed"; return 3; }
2075         dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
2076                 { error "dd $tfile-2 failed"; return 4; }
2077
2078         # make sure write RPCs have been sent to OSTs
2079         sync; sleep 5; sync
2080
2081         check_seq_oid $DIR/$tdir/$tfile-1 || return 5
2082         check_seq_oid $DIR/$tdir/$tfile-2 || return 6
2083 }
2084 run_test 27z "check SEQ/OID on the MDT and OST filesystems"
2085
2086 test_27A() { # b=19102
2087         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2088
2089         save_layout_restore_at_exit $MOUNT
2090         $LFS setstripe -c 0 -i -1 -S 0 $MOUNT
2091         wait_update $HOSTNAME "$GETSTRIPE -c $MOUNT | sed 's/  *//g'" "1" 20 ||
2092                 error "stripe count $($GETSTRIPE -c $MOUNT) != 1"
2093         local default_size=$($GETSTRIPE -S $MOUNT)
2094         local default_offset=$($GETSTRIPE -i $MOUNT)
2095         local dsize=$(do_facet $SINGLEMDS \
2096                 "$LCTL get_param -n lod.$(facet_svc $SINGLEMDS)*.stripesize")
2097         [ $default_size -eq $dsize ] ||
2098                 error "stripe size $default_size != $dsize"
2099         [ $default_offset -eq -1 ] ||
2100                 error "stripe offset $default_offset != -1"
2101 }
2102 run_test 27A "check filesystem-wide default LOV EA values"
2103
2104 test_27B() { # LU-2523
2105         test_mkdir $DIR/$tdir
2106         rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
2107         touch $DIR/$tdir/f0
2108         # open f1 with O_LOV_DELAY_CREATE
2109         # rename f0 onto f1
2110         # call setstripe ioctl on open file descriptor for f1
2111         # close
2112         multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:nB1c \
2113                 $DIR/$tdir/f0
2114
2115         rm -f $DIR/$tdir/f1
2116         # open f1 with O_LOV_DELAY_CREATE
2117         # unlink f1
2118         # call setstripe ioctl on open file descriptor for f1
2119         # close
2120         multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:uB1c
2121
2122         # Allow multiop to fail in imitation of NFS's busted semantics.
2123         true
2124 }
2125 run_test 27B "call setstripe on open unlinked file/rename victim"
2126
2127 test_27C() { #LU-2871
2128         [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
2129
2130         declare -a ost_idx
2131         local index
2132         local found
2133         local i
2134         local j
2135
2136         test_mkdir $DIR/$tdir
2137         cd $DIR/$tdir
2138         for i in $(seq 0 $((OSTCOUNT - 1))); do
2139                 # set stripe across all OSTs starting from OST$i
2140                 $SETSTRIPE -i $i -c -1 $tfile$i
2141                 # get striping information
2142                 ost_idx=($($GETSTRIPE $tfile$i |
2143                          tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
2144                 echo ${ost_idx[@]}
2145
2146                 # check the layout
2147                 [ ${#ost_idx[@]} -eq $OSTCOUNT ] ||
2148                         error "${#ost_idx[@]} != $OSTCOUNT"
2149
2150                 for index in $(seq 0 $((OSTCOUNT - 1))); do
2151                         found=0
2152                         for j in $(echo ${ost_idx[@]}); do
2153                                 if [ $index -eq $j ]; then
2154                                         found=1
2155                                         break
2156                                 fi
2157                         done
2158                         [ $found = 1 ] ||
2159                                 error "Can not find $index in ${ost_idx[@]}"
2160                 done
2161         done
2162 }
2163 run_test 27C "check full striping across all OSTs"
2164
2165 test_27D() {
2166         [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2167         [ -n "$FILESET" ] && skip "SKIP due to FILESET set"
2168         remote_mds_nodsh && skip "remote MDS with nodsh"
2169
2170         local POOL=${POOL:-testpool}
2171         local first_ost=0
2172         local last_ost=$(($OSTCOUNT - 1))
2173         local ost_step=1
2174         local ost_list=$(seq $first_ost $ost_step $last_ost)
2175         local ost_range="$first_ost $last_ost $ost_step"
2176
2177         if ! combined_mgs_mds ; then
2178                 mount_mgs_client
2179         fi
2180
2181         test_mkdir $DIR/$tdir
2182         pool_add $POOL || error "pool_add failed"
2183         pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
2184
2185         local skip27D
2186         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.55) ] &&
2187                 skip27D+="-s 29"
2188         [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.9.55) -o \
2189           $(lustre_version_code client) -lt $(version_code 2.9.55) ] &&
2190                 skip27D+=" -s 30,31"
2191         llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
2192                 error "llapi_layout_test failed"
2193
2194         destroy_test_pools || error "destroy test pools failed"
2195
2196         if ! combined_mgs_mds ; then
2197                 umount_mgs_client
2198         fi
2199 }
2200 run_test 27D "validate llapi_layout API"
2201
2202 # Verify that default_easize is increased from its initial value after
2203 # accessing a widely striped file.
2204 test_27E() {
2205         [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs"
2206         [ $(lustre_version_code client) -lt $(version_code 2.5.57) ] &&
2207                 skip "client does not have LU-3338 fix"
2208
2209         # 72 bytes is the minimum space required to store striping
2210         # information for a file striped across one OST:
2211         # (sizeof(struct lov_user_md_v3) +
2212         #  sizeof(struct lov_user_ost_data_v1))
2213         local min_easize=72
2214         $LCTL set_param -n llite.*.default_easize $min_easize ||
2215                 error "lctl set_param failed"
2216         local easize=$($LCTL get_param -n llite.*.default_easize)
2217
2218         [ $easize -eq $min_easize ] ||
2219                 error "failed to set default_easize"
2220
2221         $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
2222                 error "setstripe failed"
2223         cat $DIR/$tfile
2224         rm $DIR/$tfile
2225
2226         easize=$($LCTL get_param -n llite.*.default_easize)
2227
2228         [ $easize -gt $min_easize ] ||
2229                 error "default_easize not updated"
2230 }
2231 run_test 27E "check that default extended attribute size properly increases"
2232
2233 test_27F() { # LU-5346/LU-7975
2234         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2235         [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs"
2236         [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.51) ]] &&
2237                 skip "Need MDS version at least 2.8.51"
2238         remote_ost_nodsh && skip "remote OST with nodsh"
2239
2240         test_mkdir $DIR/$tdir
2241         rm -f $DIR/$tdir/f0
2242         $SETSTRIPE -c 2 $DIR/$tdir
2243
2244         # stop all OSTs to reproduce situation for LU-7975 ticket
2245         for num in $(seq $OSTCOUNT); do
2246                 stop ost$num
2247         done
2248
2249         # open/create f0 with O_LOV_DELAY_CREATE
2250         # truncate f0 to a non-0 size
2251         # close
2252         multiop $DIR/$tdir/f0 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T1050000c
2253
2254         $CHECKSTAT -s 1050000 $DIR/$tdir/f0 || error "checkstat failed"
2255         # open/write it again to force delayed layout creation
2256         cat /etc/hosts > $DIR/$tdir/f0 &
2257         catpid=$!
2258
2259         # restart OSTs
2260         for num in $(seq $OSTCOUNT); do
2261                 start ost$num $(ostdevname $num) $OST_MOUNT_OPTS ||
2262                         error "ost$num failed to start"
2263         done
2264
2265         wait $catpid || error "cat failed"
2266
2267         cmp /etc/hosts $DIR/$tdir/f0 || error "cmp failed"
2268         [[ $($GETSTRIPE -c $DIR/$tdir/f0) == 2 ]] || error "wrong stripecount"
2269
2270 }
2271 run_test 27F "Client resend delayed layout creation with non-zero size"
2272
2273 test_27G() { #LU-10629
2274         [ -n "$FILESET" ] && skip "SKIP due to FILESET set" && return
2275         remote_mds_nodsh && skip "remote MDS with nodsh" && return
2276         local POOL=${POOL:-testpool}
2277         local ostrange="0 0 1"
2278
2279         test_mkdir $DIR/$tdir
2280         pool_add $POOL || error "pool_add failed"
2281         pool_add_targets $POOL $ostrange || error "pool_add_targets failed"
2282         $LFS setstripe -p $POOL $DIR/$tdir
2283
2284         local pool=$($LFS getstripe -p $DIR/$tdir)
2285
2286         [ "$pool" = "$POOL" ] || error "Striping failed got '$pool' not '$POOL'"
2287
2288         $LFS setstripe -d $DIR/$tdir
2289
2290         pool=$($LFS getstripe -p $DIR/$tdir)
2291
2292         rmdir $DIR/$tdir
2293
2294         [ -z "$pool" ] || error "'$pool' is not empty"
2295 }
2296 run_test 27G "Clear OST pool from stripe"
2297
2298 # createtest also checks that device nodes are created and
2299 # then visible correctly (#2091)
2300 test_28() { # bug 2091
2301         test_mkdir $DIR/d28
2302         $CREATETEST $DIR/d28/ct || error "createtest failed"
2303 }
2304 run_test 28 "create/mknod/mkdir with bad file types ============"
2305
2306 test_29() {
2307         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2308
2309         sync; sleep 1; sync # flush out any dirty pages from previous tests
2310         cancel_lru_locks
2311         test_mkdir $DIR/d29
2312         touch $DIR/d29/foo
2313         log 'first d29'
2314         ls -l $DIR/d29
2315
2316         declare -i LOCKCOUNTORIG=0
2317         for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2318                 let LOCKCOUNTORIG=$LOCKCOUNTORIG+$lock_count
2319         done
2320         [ $LOCKCOUNTORIG -eq 0 ] && error "No mdc lock count" && return 1
2321
2322         declare -i LOCKUNUSEDCOUNTORIG=0
2323         for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2324                 let LOCKUNUSEDCOUNTORIG=$LOCKUNUSEDCOUNTORIG+$unused_count
2325         done
2326
2327         log 'second d29'
2328         ls -l $DIR/d29
2329         log 'done'
2330
2331         declare -i LOCKCOUNTCURRENT=0
2332         for lock_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_count); do
2333                 let LOCKCOUNTCURRENT=$LOCKCOUNTCURRENT+$lock_count
2334         done
2335
2336         declare -i LOCKUNUSEDCOUNTCURRENT=0
2337         for unused_count in $(lctl get_param -n ldlm.namespaces.*mdc*.lock_unused_count); do
2338                 let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
2339         done
2340
2341         if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
2342                 $LCTL set_param -n ldlm.dump_namespaces ""
2343                 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
2344                 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2345                 log "dumped log to $TMP/test_29.dk (bug 5793)"
2346                 return 2
2347         fi
2348         if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
2349                 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
2350                 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
2351                 log "dumped log to $TMP/test_29.dk (bug 5793)"
2352                 return 3
2353         fi
2354 }
2355 run_test 29 "IT_GETATTR regression  ============================"
2356
2357 test_30a() { # was test_30
2358         cp $(which ls) $DIR || cp /bin/ls $DIR
2359         $DIR/ls / || error "Can't execute binary from lustre"
2360         rm $DIR/ls
2361 }
2362 run_test 30a "execute binary from Lustre (execve) =============="
2363
2364 test_30b() {
2365         cp `which ls` $DIR || cp /bin/ls $DIR
2366         chmod go+rx $DIR/ls
2367         $RUNAS $DIR/ls / || error "Can't execute binary from lustre as non-root"
2368         rm $DIR/ls
2369 }
2370 run_test 30b "execute binary from Lustre as non-root ==========="
2371
2372 test_30c() { # b=22376
2373         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2374
2375         cp `which ls` $DIR || cp /bin/ls $DIR
2376         chmod a-rw $DIR/ls
2377         cancel_lru_locks mdc
2378         cancel_lru_locks osc
2379         $RUNAS $DIR/ls / || error "Can't execute binary from lustre"
2380         rm -f $DIR/ls
2381 }
2382 run_test 30c "execute binary from Lustre without read perms ===="
2383
2384 test_31a() {
2385         $OPENUNLINK $DIR/f31 $DIR/f31 || error "openunlink failed"
2386         $CHECKSTAT -a $DIR/f31 || error "$DIR/f31 exists"
2387 }
2388 run_test 31a "open-unlink file =================================="
2389
2390 test_31b() {
2391         touch $DIR/f31 || error "touch $DIR/f31 failed"
2392         ln $DIR/f31 $DIR/f31b || error "ln failed"
2393         $MULTIOP $DIR/f31b Ouc || error "multiop failed"
2394         $CHECKSTAT -t file $DIR/f31 || error "$DIR/f31 not file type"
2395 }
2396 run_test 31b "unlink file with multiple links while open ======="
2397
2398 test_31c() {
2399         touch $DIR/f31 || error "touch $DIR/f31 failed"
2400         ln $DIR/f31 $DIR/f31c || error "ln failed"
2401         multiop_bg_pause $DIR/f31 O_uc ||
2402                 error "multiop_bg_pause for $DIR/f31 failed"
2403         MULTIPID=$!
2404         $MULTIOP $DIR/f31c Ouc
2405         kill -USR1 $MULTIPID
2406         wait $MULTIPID
2407 }
2408 run_test 31c "open-unlink file with multiple links ============="
2409
2410 test_31d() {
2411         opendirunlink $DIR/d31d $DIR/d31d || error "opendirunlink failed"
2412         $CHECKSTAT -a $DIR/d31d || error "$DIR/d31d exists"
2413 }
2414 run_test 31d "remove of open directory ========================="
2415
2416 test_31e() { # bug 2904
2417         openfilleddirunlink $DIR/d31e || error "openfilleddirunlink failed"
2418 }
2419 run_test 31e "remove of open non-empty directory ==============="
2420
2421 test_31f() { # bug 4554
2422         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2423
2424         set -vx
2425         test_mkdir $DIR/d31f
2426         $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2427         cp /etc/hosts $DIR/d31f
2428         ls -l $DIR/d31f
2429         $GETSTRIPE $DIR/d31f/hosts
2430         multiop_bg_pause $DIR/d31f D_c || return 1
2431         MULTIPID=$!
2432
2433         rm -rv $DIR/d31f || error "first of $DIR/d31f"
2434         test_mkdir $DIR/d31f
2435         $SETSTRIPE -S 1048576 -c 1 $DIR/d31f
2436         cp /etc/hosts $DIR/d31f
2437         ls -l $DIR/d31f
2438         $GETSTRIPE $DIR/d31f/hosts
2439         multiop_bg_pause $DIR/d31f D_c || return 1
2440         MULTIPID2=$!
2441
2442         kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
2443         wait $MULTIPID || error "first opendir $MULTIPID failed"
2444
2445         sleep 6
2446
2447         kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
2448         wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
2449         set +vx
2450 }
2451 run_test 31f "remove of open directory with open-unlink file ==="
2452
2453 test_31g() {
2454         echo "-- cross directory link --"
2455         test_mkdir -c1 $DIR/${tdir}ga
2456         test_mkdir -c1 $DIR/${tdir}gb
2457         touch $DIR/${tdir}ga/f
2458         ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
2459         $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
2460         [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
2461         $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
2462         [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
2463 }
2464 run_test 31g "cross directory link==============="
2465
2466 test_31h() {
2467         echo "-- cross directory link --"
2468         test_mkdir -c1 $DIR/${tdir}
2469         test_mkdir -c1 $DIR/${tdir}/dir
2470         touch $DIR/${tdir}/f
2471         ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
2472         $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
2473         [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
2474         $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
2475         [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
2476 }
2477 run_test 31h "cross directory link under child==============="
2478
2479 test_31i() {
2480         echo "-- cross directory link --"
2481         test_mkdir -c1 $DIR/$tdir
2482         test_mkdir -c1 $DIR/$tdir/dir
2483         touch $DIR/$tdir/dir/f
2484         ln $DIR/$tdir/dir/f $DIR/$tdir/g
2485         $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
2486         [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
2487         $CHECKSTAT -t file $DIR/$tdir/g || error "target"
2488         [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
2489 }
2490 run_test 31i "cross directory link under parent==============="
2491
2492 test_31j() {
2493         test_mkdir -c1 -p $DIR/$tdir
2494         test_mkdir -c1 -p $DIR/$tdir/dir1
2495         ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
2496         link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
2497         mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
2498         mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
2499         return 0
2500 }
2501 run_test 31j "link for directory==============="
2502
2503 test_31k() {
2504         test_mkdir -c1 -p $DIR/$tdir
2505         touch $DIR/$tdir/s
2506         touch $DIR/$tdir/exist
2507         mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
2508         mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
2509         mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
2510         mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
2511         mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
2512         mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
2513         mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
2514         return 0
2515 }
2516 run_test 31k "link to file: the same, non-existing, dir==============="
2517
2518 test_31m() {
2519         mkdir $DIR/d31m
2520         touch $DIR/d31m/s
2521         mkdir $DIR/d31m2
2522         touch $DIR/d31m2/exist
2523         mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
2524         mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
2525         mlink $DIR/d31m/s $DIR/d31m2 && error "mlink to parent dir"
2526         mlink $DIR/d31m2 $DIR/d31m/s && error "mlink parent dir to target"
2527         mlink $DIR/d31m/not-exist $DIR/d31m2/foo && error "mlink non-existing to new"
2528         mlink $DIR/d31m/not-exist $DIR/d31m2/s && error "mlink non-existing to exist"
2529         return 0
2530 }
2531 run_test 31m "link to file: the same, non-existing, dir==============="
2532
2533 test_31n() {
2534         touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
2535         nlink=$(stat --format=%h $DIR/$tfile)
2536         [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2537         local fd=$(free_fd)
2538         local cmd="exec $fd<$DIR/$tfile"
2539         eval $cmd
2540         cmd="exec $fd<&-"
2541         trap "eval $cmd" EXIT
2542         nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2543         [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
2544         rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
2545         nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
2546         [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
2547         eval $cmd
2548 }
2549 run_test 31n "check link count of unlinked file"
2550
2551 link_one() {
2552         local TEMPNAME=$(mktemp $1_XXXXXX)
2553         mlink $TEMPNAME $1 2> /dev/null &&
2554                 echo "$BASHPID: link $TEMPNAME to $1 succeeded"
2555         munlink $TEMPNAME
2556 }
2557
2558 test_31o() { # LU-2901
2559         test_mkdir $DIR/$tdir
2560         for LOOP in $(seq 100); do
2561                 rm -f $DIR/$tdir/$tfile*
2562                 for THREAD in $(seq 8); do
2563                         link_one $DIR/$tdir/$tfile.$LOOP &
2564                 done
2565                 wait
2566                 local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
2567                 [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
2568                         error "$LINKS duplicate links to $tfile.$LOOP" &&
2569                         break || true
2570         done
2571 }
2572 run_test 31o "duplicate hard links with same filename"
2573
2574 test_31p() {
2575         [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
2576
2577         test_mkdir $DIR/$tdir
2578         $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
2579         $LFS setdirstripe -D -c2 -H all_char $DIR/$tdir/striped_dir
2580
2581         opendirunlink $DIR/$tdir/striped_dir/test1 ||
2582                 error "open unlink test1 failed"
2583         opendirunlink $DIR/$tdir/striped_dir/test2 ||
2584                 error "open unlink test2 failed"
2585
2586         $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
2587                 error "test1 still exists"
2588         $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
2589                 error "test2 still exists"
2590 }
2591 run_test 31p "remove of open striped directory"
2592
2593 cleanup_test32_mount() {
2594         local rc=0
2595         trap 0
2596         local loopdev=$(losetup -a | grep $EXT2_DEV | sed -ne 's/:.*$//p')
2597         $UMOUNT $DIR/$tdir/ext2-mountpoint || rc=$?
2598         losetup -d $loopdev || true
2599         rm -rf $DIR/$tdir
2600         return $rc
2601 }
2602
2603 test_32a() {
2604         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2605
2606         echo "== more mountpoints and symlinks ================="
2607         [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2608         trap cleanup_test32_mount EXIT
2609         test_mkdir -p $DIR/$tdir/ext2-mountpoint
2610         mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2611                 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2612         $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/.. ||
2613                 error "$DIR/$tdir/ext2-mountpoint/.. not dir type"
2614         cleanup_test32_mount
2615 }
2616 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
2617
2618 test_32b() {
2619         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2620
2621         [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2622         trap cleanup_test32_mount EXIT
2623         test_mkdir -p $DIR/$tdir/ext2-mountpoint
2624         mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2625                 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2626         ls -al $DIR/$tdir/ext2-mountpoint/.. ||
2627                 error "Can't list $DIR/$tdir/ext2-mountpoint/.."
2628         cleanup_test32_mount
2629 }
2630 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
2631
2632 test_32c() {
2633         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2634
2635         [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2636         trap cleanup_test32_mount EXIT
2637         test_mkdir -p $DIR/$tdir/ext2-mountpoint
2638         mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2639                 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2640         test_mkdir -p $DIR/$tdir/d2/test_dir
2641         $CHECKSTAT -t dir $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2642                 error "$DIR/$tdir/ext2-mountpoint/../d2/test_dir not dir type"
2643         cleanup_test32_mount
2644 }
2645 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
2646
2647 test_32d() {
2648         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2649
2650         [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2651         trap cleanup_test32_mount EXIT
2652         test_mkdir -p $DIR/$tdir/ext2-mountpoint
2653         mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2654                 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2655         test_mkdir -p $DIR/$tdir/d2/test_dir
2656         ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir ||
2657                 error "Can't list $DIR/$tdir/ext2-mountpoint/../d2/test_dir"
2658         cleanup_test32_mount
2659 }
2660 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
2661
2662 test_32e() {
2663         rm -fr $DIR/$tdir
2664         test_mkdir -p $DIR/$tdir/tmp
2665         local tmp_dir=$DIR/$tdir/tmp
2666         ln -s $DIR/$tdir $tmp_dir/symlink11
2667         ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2668         $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
2669         $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
2670 }
2671 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
2672
2673 test_32f() {
2674         rm -fr $DIR/$tdir
2675         test_mkdir -p $DIR/$tdir/tmp
2676         local tmp_dir=$DIR/$tdir/tmp
2677         ln -s $DIR/$tdir $tmp_dir/symlink11
2678         ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
2679         ls $DIR/$tdir/tmp/symlink11  || error "symlink11 bad"
2680         ls $DIR/$tdir/symlink01 || error "symlink01 bad"
2681 }
2682 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
2683
2684 test_32g() {
2685         local tmp_dir=$DIR/$tdir/tmp
2686         test_mkdir -p $tmp_dir
2687         test_mkdir $DIR/${tdir}2
2688         ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2689         ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2690         $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
2691         $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
2692         $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
2693         $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
2694 }
2695 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2696
2697 test_32h() {
2698         rm -fr $DIR/$tdir $DIR/${tdir}2
2699         tmp_dir=$DIR/$tdir/tmp
2700         test_mkdir -p $tmp_dir
2701         test_mkdir $DIR/${tdir}2
2702         ln -s $DIR/${tdir}2 $tmp_dir/symlink12
2703         ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
2704         ls $tmp_dir/symlink12 || error "listing symlink12"
2705         ls $DIR/$tdir/symlink02  || error "listing symlink02"
2706 }
2707 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
2708
2709 test_32i() {
2710         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2711
2712         [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2713         trap cleanup_test32_mount EXIT
2714         test_mkdir -p $DIR/$tdir/ext2-mountpoint
2715         mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2716                 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2717         touch $DIR/$tdir/test_file
2718         $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../test_file ||
2719                 error "$DIR/$tdir/ext2-mountpoint/../test_file not file type"
2720         cleanup_test32_mount
2721 }
2722 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
2723
2724 test_32j() {
2725         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2726
2727         [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2728         trap cleanup_test32_mount EXIT
2729         test_mkdir -p $DIR/$tdir/ext2-mountpoint
2730         mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2731                 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2732         touch $DIR/$tdir/test_file
2733         cat $DIR/$tdir/ext2-mountpoint/../test_file ||
2734                 error "Can't open $DIR/$tdir/ext2-mountpoint/../test_file"
2735         cleanup_test32_mount
2736 }
2737 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
2738
2739 test_32k() {
2740         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2741
2742         rm -fr $DIR/$tdir
2743         trap cleanup_test32_mount EXIT
2744         test_mkdir -p $DIR/$tdir/ext2-mountpoint
2745         mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2746                 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2747         test_mkdir -p $DIR/$tdir/d2
2748         touch $DIR/$tdir/d2/test_file || error "touch failed"
2749         $CHECKSTAT -t file $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2750                 error "$DIR/$tdir/ext2-mountpoint/../d2/test_file not file type"
2751         cleanup_test32_mount
2752 }
2753 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
2754
2755 test_32l() {
2756         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2757
2758         rm -fr $DIR/$tdir
2759         trap cleanup_test32_mount EXIT
2760         test_mkdir -p $DIR/$tdir/ext2-mountpoint
2761         mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2762                 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2763         test_mkdir -p $DIR/$tdir/d2
2764         touch $DIR/$tdir/d2/test_file || error "touch failed"
2765         cat  $DIR/$tdir/ext2-mountpoint/../d2/test_file ||
2766                 error "Can't open $DIR/$tdir/ext2-mountpoint/../d2/test_file"
2767         cleanup_test32_mount
2768 }
2769 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
2770
2771 test_32m() {
2772         rm -fr $DIR/d32m
2773         test_mkdir -p $DIR/d32m/tmp
2774         TMP_DIR=$DIR/d32m/tmp
2775         ln -s $DIR $TMP_DIR/symlink11
2776         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
2777         $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 ||
2778                 error "symlink11 not a link"
2779         $CHECKSTAT -t link $DIR/d32m/symlink01 ||
2780                 error "symlink01 not a link"
2781 }
2782 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
2783
2784 test_32n() {
2785         rm -fr $DIR/d32n
2786         test_mkdir -p $DIR/d32n/tmp
2787         TMP_DIR=$DIR/d32n/tmp
2788         ln -s $DIR $TMP_DIR/symlink11
2789         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
2790         ls -l $DIR/d32n/tmp/symlink11  || error "listing symlink11"
2791         ls -l $DIR/d32n/symlink01 || error "listing symlink01"
2792 }
2793 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
2794
2795 test_32o() {
2796         touch $DIR/$tfile
2797         test_mkdir -p $DIR/d32o/tmp
2798         TMP_DIR=$DIR/d32o/tmp
2799         ln -s $DIR/$tfile $TMP_DIR/symlink12
2800         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
2801         $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 ||
2802                 error "symlink12 not a link"
2803         $CHECKSTAT -t link $DIR/d32o/symlink02 || error "symlink02 not a link"
2804         $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 ||
2805                 error "$DIR/d32o/tmp/symlink12 not file type"
2806         $CHECKSTAT -t file -f $DIR/d32o/symlink02 ||
2807                 error "$DIR/d32o/symlink02 not file type"
2808 }
2809 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
2810
2811 test_32p() {
2812         log 32p_1
2813         rm -fr $DIR/d32p
2814         log 32p_2
2815         rm -f $DIR/$tfile
2816         log 32p_3
2817         touch $DIR/$tfile
2818         log 32p_4
2819         test_mkdir -p $DIR/d32p/tmp
2820         log 32p_5
2821         TMP_DIR=$DIR/d32p/tmp
2822         log 32p_6
2823         ln -s $DIR/$tfile $TMP_DIR/symlink12
2824         log 32p_7
2825         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
2826         log 32p_8
2827         cat $DIR/d32p/tmp/symlink12 ||
2828                 error "Can't open $DIR/d32p/tmp/symlink12"
2829         log 32p_9
2830         cat $DIR/d32p/symlink02 || error "Can't open $DIR/d32p/symlink02"
2831         log 32p_10
2832 }
2833 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
2834
2835 test_32q() {
2836         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2837
2838         [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2839         trap cleanup_test32_mount EXIT
2840         test_mkdir -p $DIR/$tdir/ext2-mountpoint
2841         touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
2842         mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2843                 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2844         ls $DIR/$tdir/ext2-mountpoint | grep "\<under_the_mount\>" && error
2845         cleanup_test32_mount
2846 }
2847 run_test 32q "stat follows mountpoints in Lustre (should return error)"
2848
2849 test_32r() {
2850         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2851
2852         [ -e $DIR/$tdir ] && rm -fr $DIR/$tdir
2853         trap cleanup_test32_mount EXIT
2854         test_mkdir -p $DIR/$tdir/ext2-mountpoint
2855         touch $DIR/$tdir/ext2-mountpoint/under_the_mount || error "touch failed"
2856         mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir/ext2-mountpoint ||
2857                 error "mount failed for $EXT2_DEV $DIR/$tdir/ext2-mountpoint"
2858         ls $DIR/$tdir/ext2-mountpoint | grep -q under_the_mount && error || true
2859         cleanup_test32_mount
2860 }
2861 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
2862
2863 test_33aa() {
2864         rm -f $DIR/$tfile
2865         touch $DIR/$tfile
2866         chmod 444 $DIR/$tfile
2867         chown $RUNAS_ID $DIR/$tfile
2868         log 33_1
2869         $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
2870         log 33_2
2871 }
2872 run_test 33aa "write file with mode 444 (should return error)"
2873
2874 test_33a() {
2875         rm -fr $DIR/$tdir
2876         test_mkdir $DIR/$tdir
2877         chown $RUNAS_ID $DIR/$tdir
2878         $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
2879                 error "$RUNAS create $tdir/$tfile failed"
2880         $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
2881                 error "open RDWR" || true
2882 }
2883 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
2884
2885 test_33b() {
2886         rm -fr $DIR/$tdir
2887         test_mkdir $DIR/$tdir
2888         chown $RUNAS_ID $DIR/$tdir
2889         $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
2890 }
2891 run_test 33b "test open file with malformed flags (No panic)"
2892
2893 test_33c() {
2894         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2895         remote_ost_nodsh && skip "remote OST with nodsh"
2896
2897         local ostnum
2898         local ostname
2899         local write_bytes
2900         local all_zeros
2901
2902         all_zeros=:
2903         rm -fr $DIR/$tdir
2904         test_mkdir $DIR/$tdir
2905         # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
2906
2907         sync
2908         for ostnum in $(seq $OSTCOUNT); do
2909                 # test-framework's OST numbering is one-based, while Lustre's
2910                 # is zero-based
2911                 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
2912                 # Parsing llobdstat's output sucks; we could grep the /proc
2913                 # path, but that's likely to not be as portable as using the
2914                 # llobdstat utility.  So we parse lctl output instead.
2915                 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
2916                         obdfilter/$ostname/stats |
2917                         awk '/^write_bytes/ {print $7}' )
2918                 echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes"
2919                 if (( ${write_bytes:-0} > 0 ))
2920                 then
2921                         all_zeros=false
2922                         break;
2923                 fi
2924         done
2925
2926         $all_zeros || return 0
2927
2928         # Write four bytes
2929         echo foo > $DIR/$tdir/bar
2930         # Really write them
2931         sync
2932
2933         # Total up write_bytes after writing.  We'd better find non-zeros.
2934         for ostnum in $(seq $OSTCOUNT); do
2935                 ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
2936                 write_bytes=$(do_facet ost$ostnum lctl get_param -n \
2937                         obdfilter/$ostname/stats |
2938                         awk '/^write_bytes/ {print $7}' )
2939                 echo "write_bytes@$OSTnum/$ostname=$write_bytes"
2940                 if (( ${write_bytes:-0} > 0 ))
2941                 then
2942                         all_zeros=false
2943                         break;
2944                 fi
2945         done
2946
2947         if $all_zeros
2948         then
2949                 for ostnum in $(seq $OSTCOUNT); do
2950                         ostname=$(printf "$FSNAME-OST%.4x" $((ostnum - 1)))
2951                         echo "Check that write_bytes is present in obdfilter/*/stats:"
2952                         do_facet ost$ostnum lctl get_param -n \
2953                                 obdfilter/$ostname/stats
2954                 done
2955                 error "OST not keeping write_bytes stats (b22312)"
2956         fi
2957 }
2958 run_test 33c "test llobdstat and write_bytes"
2959
2960 test_33d() {
2961         [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
2962         [ $PARALLEL == "yes" ] && skip "skip parallel run"
2963
2964         local MDTIDX=1
2965         local remote_dir=$DIR/$tdir/remote_dir
2966
2967         test_mkdir $DIR/$tdir
2968         $LFS mkdir -i $MDTIDX $remote_dir ||
2969                 error "create remote directory failed"
2970
2971         touch $remote_dir/$tfile
2972         chmod 444 $remote_dir/$tfile
2973         chown $RUNAS_ID $remote_dir/$tfile
2974
2975         $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
2976
2977         chown $RUNAS_ID $remote_dir
2978         $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 ||
2979                                         error "create" || true
2980         $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
2981                                     error "open RDWR" || true
2982         $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
2983 }
2984 run_test 33d "openfile with 444 modes and malformed flags under remote dir"
2985
2986 test_33e() {
2987         [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
2988
2989         mkdir $DIR/$tdir
2990
2991         $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
2992         $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
2993         mkdir $DIR/$tdir/local_dir
2994
2995         local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
2996         local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
2997         local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
2998
2999         [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3000                 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
3001
3002         rmdir $DIR/$tdir/* || error "rmdir failed"
3003
3004         umask 777
3005         $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3006         $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3007         mkdir $DIR/$tdir/local_dir
3008
3009         s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3010         s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3011         l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3012
3013         [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3014                 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
3015
3016         rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
3017
3018         umask 000
3019         $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
3020         $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
3021         mkdir $DIR/$tdir/local_dir
3022
3023         s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
3024         s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
3025         l_mode=$(stat -c%f $DIR/$tdir/local_dir)
3026
3027         [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
3028                 error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
3029 }
3030 run_test 33e "mkdir and striped directory should have same mode"
3031
3032 cleanup_33f() {
3033         trap 0
3034         do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
3035 }
3036
3037 test_33f() {
3038         [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3039         remote_mds_nodsh && skip "remote MDS with nodsh"
3040
3041         mkdir $DIR/$tdir
3042         chmod go+rwx $DIR/$tdir
3043         do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
3044         trap cleanup_33f EXIT
3045
3046         $RUNAS lfs mkdir -i 0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
3047                 error "cannot create striped directory"
3048
3049         $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
3050                 error "cannot create files in striped directory"
3051
3052         $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
3053                 error "cannot remove files in striped directory"
3054
3055         $RUNAS rmdir $DIR/$tdir/striped_dir ||
3056                 error "cannot remove striped directory"
3057
3058         cleanup_33f
3059 }
3060 run_test 33f "nonroot user can create, access, and remove a striped directory"
3061
3062 test_33g() {
3063         mkdir -p $DIR/$tdir/dir2
3064
3065         local err=$($RUNAS mkdir $DIR/$tdir/dir2 2>&1)
3066         echo $err
3067         [[ $err =~ "exists" ]] || error "Not exists error"
3068 }
3069 run_test 33g "nonroot user create already existing root created file"
3070
3071 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
3072 test_34a() {
3073         rm -f $DIR/f34
3074         $MCREATE $DIR/f34 || error "mcreate failed"
3075         $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3076                 error "getstripe failed"
3077         $TRUNCATE $DIR/f34 $TEST_34_SIZE || error "truncate failed"
3078         $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3079                 error "getstripe failed"
3080         $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3081                 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3082 }
3083 run_test 34a "truncate file that has not been opened ==========="
3084
3085 test_34b() {
3086         [ ! -f $DIR/f34 ] && test_34a
3087         $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3088                 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3089         $OPENFILE -f O_RDONLY $DIR/f34
3090         $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" ||
3091                 error "getstripe failed"
3092         $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3093                 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3094 }
3095 run_test 34b "O_RDONLY opening file doesn't create objects ====="
3096
3097 test_34c() {
3098         [ ! -f $DIR/f34 ] && test_34a
3099         $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3100                 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3101         $OPENFILE -f O_RDWR $DIR/f34
3102         $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" && error
3103         $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3104                 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3105 }
3106 run_test 34c "O_RDWR opening file-with-size works =============="
3107
3108 test_34d() {
3109         [ ! -f $DIR/f34 ] && test_34a
3110         dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 ||
3111                 error "dd failed"
3112         $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 ||
3113                 error "Size of $DIR/f34 not equal to $TEST_34_SIZE bytes"
3114         rm $DIR/f34
3115 }
3116 run_test 34d "write to sparse file ============================="
3117
3118 test_34e() {
3119         rm -f $DIR/f34e
3120         $MCREATE $DIR/f34e || error "mcreate failed"
3121         $TRUNCATE $DIR/f34e 1000 || error "truncate failed"
3122         $CHECKSTAT -s 1000 $DIR/f34e ||
3123                 error "Size of $DIR/f34e not equal to 1000 bytes"
3124         $OPENFILE -f O_RDWR $DIR/f34e
3125         $CHECKSTAT -s 1000 $DIR/f34e ||
3126                 error "Size of $DIR/f34e not equal to 1000 bytes"
3127 }
3128 run_test 34e "create objects, some with size and some without =="
3129
3130 test_34f() { # bug 6242, 6243
3131         [ $PARALLEL == "yes" ] && skip "skip parallel run"
3132
3133         SIZE34F=48000
3134         rm -f $DIR/f34f
3135         $MCREATE $DIR/f34f || error "mcreate failed"
3136         $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
3137         dd if=$DIR/f34f of=$TMP/f34f
3138         $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
3139         dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
3140         cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
3141         cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
3142         rm $TMP/f34f $TMP/f34fzero $DIR/f34f
3143 }
3144 run_test 34f "read from a file with no objects until EOF ======="
3145
3146 test_34g() {
3147         [ $PARALLEL == "yes" ] && skip "skip parallel run"
3148
3149         dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE ||
3150                 error "dd failed"
3151         $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error "truncate failed"
3152         $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3153                 error "Size of $DIR/$tfile not equal to $((TEST_34_SIZE / 2))"
3154         cancel_lru_locks osc
3155         $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile ||
3156                 error "wrong size after lock cancel"
3157
3158         $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error "truncate failed"
3159         $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3160                 error "expanding truncate failed"
3161         cancel_lru_locks osc
3162         $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile ||
3163                 error "wrong expanded size after lock cancel"
3164 }
3165 run_test 34g "truncate long file ==============================="
3166
3167 test_34h() {
3168         [ $PARALLEL == "yes" ] && skip "skip parallel run"
3169
3170         local gid=10
3171         local sz=1000
3172
3173         dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 || error "dd failed"
3174         sync # Flush the cache so that multiop below does not block on cache
3175              # flush when getting the group lock
3176         $MULTIOP $DIR/$tfile OG${gid}T${sz}g${gid}c &
3177         MULTIPID=$!
3178
3179         # Since just timed wait is not good enough, let's do a sync write
3180         # that way we are sure enough time for a roundtrip + processing
3181         # passed + 2 seconds of extra margin.
3182         dd if=/dev/zero of=$DIR/${tfile}-1 bs=4096 oflag=direct count=1
3183         rm $DIR/${tfile}-1
3184         sleep 2
3185
3186         if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then
3187                 error "Multiop blocked on ftruncate, pid=$MULTIPID"
3188                 kill -9 $MULTIPID
3189         fi
3190         wait $MULTIPID
3191         local nsz=`stat -c %s $DIR/$tfile`
3192         [[ $nsz == $sz ]] || error "New size wrong $nsz != $sz"
3193 }
3194 run_test 34h "ftruncate file under grouplock should not block"
3195
3196 test_35a() {
3197         cp /bin/sh $DIR/f35a
3198         chmod 444 $DIR/f35a
3199         chown $RUNAS_ID $DIR/f35a
3200         $RUNAS $DIR/f35a && error || true
3201         rm $DIR/f35a
3202 }
3203 run_test 35a "exec file with mode 444 (should return and not leak)"
3204
3205 test_36a() {
3206         rm -f $DIR/f36
3207         utime $DIR/f36 || error "utime failed for MDS"
3208 }
3209 run_test 36a "MDS utime check (mknod, utime)"
3210
3211 test_36b() {
3212         echo "" > $DIR/f36
3213         utime $DIR/f36 || error "utime failed for OST"
3214 }
3215 run_test 36b "OST utime check (open, utime)"
3216
3217 test_36c() {
3218         rm -f $DIR/d36/f36
3219         test_mkdir $DIR/d36
3220         chown $RUNAS_ID $DIR/d36
3221         $RUNAS utime $DIR/d36/f36 || error "utime failed for MDS as non-root"
3222 }
3223 run_test 36c "non-root MDS utime check (mknod, utime)"
3224
3225 test_36d() {
3226         [ ! -d $DIR/d36 ] && test_36c
3227         echo "" > $DIR/d36/f36
3228         $RUNAS utime $DIR/d36/f36 || error "utime failed for OST as non-root"
3229 }
3230 run_test 36d "non-root OST utime check (open, utime)"
3231
3232 test_36e() {
3233         [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping"
3234
3235         test_mkdir $DIR/$tdir
3236         touch $DIR/$tdir/$tfile
3237         $RUNAS utime $DIR/$tdir/$tfile &&
3238                 error "utime worked, expected failure" || true
3239 }
3240 run_test 36e "utime on non-owned file (should return error)"
3241
3242 subr_36fh() {
3243         local fl="$1"
3244         local LANG_SAVE=$LANG
3245         local LC_LANG_SAVE=$LC_LANG
3246         export LANG=C LC_LANG=C # for date language
3247
3248         DATESTR="Dec 20  2000"
3249         test_mkdir $DIR/$tdir
3250         lctl set_param fail_loc=$fl
3251         date; date +%s
3252         cp /etc/hosts $DIR/$tdir/$tfile
3253         sync & # write RPC generated with "current" inode timestamp, but delayed
3254         sleep 1
3255         touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
3256         LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
3257         cancel_lru_locks osc
3258         LS_AFTER="`ls -l $DIR/$tdir/$tfile`"  # timestamp from OST object
3259         date; date +%s
3260         [ "$LS_BEFORE" != "$LS_AFTER" ] && \
3261                 echo "BEFORE: $LS_BEFORE" && \
3262                 echo "AFTER : $LS_AFTER" && \
3263                 echo "WANT  : $DATESTR" && \
3264                 error "$DIR/$tdir/$tfile timestamps changed" || true
3265
3266         export LANG=$LANG_SAVE LC_LANG=$LC_LANG_SAVE
3267 }
3268
3269 test_36f() {
3270         [ $PARALLEL == "yes" ] && skip "skip parallel run"
3271
3272         #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
3273         subr_36fh "0x80000214"
3274 }
3275 run_test 36f "utime on file racing with OST BRW write =========="
3276
3277 test_36g() {
3278         remote_ost_nodsh && skip "remote OST with nodsh"
3279         [ $PARALLEL == "yes" ] && skip "skip parallel run"
3280
3281         local fmd_max_age
3282         local fmd_before
3283         local fmd_after
3284
3285         test_mkdir $DIR/$tdir
3286         fmd_max_age=$(do_facet ost1 \
3287                 "lctl get_param -n obdfilter.*.client_cache_seconds 2> /dev/null | \
3288                 head -n 1")
3289
3290         fmd_before=$(do_facet ost1 \
3291                 "awk '/ll_fmd_cache/ {print \\\$2}' /proc/slabinfo")
3292         touch $DIR/$tdir/$tfile
3293         sleep $((fmd_max_age + 12))
3294         fmd_after=$(do_facet ost1 \
3295                 "awk '/ll_fmd_cache/ {print \\\$2}' /proc/slabinfo")
3296
3297         echo "fmd_before: $fmd_before"
3298         echo "fmd_after: $fmd_after"
3299         [[ $fmd_after -gt $fmd_before ]] &&
3300                 echo "AFTER: $fmd_after > BEFORE: $fmd_before" &&
3301                 error "fmd didn't expire after ping" || true
3302 }
3303 run_test 36g "filter mod data cache expiry ====================="
3304
3305 test_36h() {
3306         [ $PARALLEL == "yes" ] && skip "skip parallel run"
3307
3308         #define OBD_FAIL_OST_BRW_PAUSE_BULK2 0x227
3309         subr_36fh "0x80000227"
3310 }
3311 run_test 36h "utime on file racing with OST BRW write =========="
3312
3313 test_36i() {
3314         [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
3315
3316         test_mkdir $DIR/$tdir
3317         $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
3318
3319         local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
3320         local new_mtime=$((mtime + 200))
3321
3322         #change Modify time of striped dir
3323         touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
3324                         error "change mtime failed"
3325
3326         local got=$(stat -c%Y $DIR/$tdir/striped_dir)
3327
3328         [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
3329 }
3330 run_test 36i "change mtime on striped directory"
3331
3332 # test_37 - duplicate with tests 32q 32r
3333
3334 test_38() {
3335         local file=$DIR/$tfile
3336         touch $file
3337         openfile -f O_DIRECTORY $file
3338         local RC=$?
3339         local ENOTDIR=20
3340         [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true
3341         [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)"
3342 }
3343 run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ==="
3344
3345 test_39a() { # was test_39
3346         touch $DIR/$tfile
3347         touch $DIR/${tfile}2
3348 #       ls -l  $DIR/$tfile $DIR/${tfile}2
3349 #       ls -lu  $DIR/$tfile $DIR/${tfile}2
3350 #       ls -lc  $DIR/$tfile $DIR/${tfile}2
3351         sleep 2
3352         $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
3353         if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
3354                 echo "mtime"
3355                 ls -l --full-time $DIR/$tfile $DIR/${tfile}2
3356                 echo "atime"
3357                 ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
3358                 echo "ctime"
3359                 ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
3360                 error "O_TRUNC didn't change timestamps"
3361         fi
3362 }
3363 run_test 39a "mtime changed on create"
3364
3365 test_39b() {
3366         test_mkdir -c1 $DIR/$tdir
3367         cp -p /etc/passwd $DIR/$tdir/fopen
3368         cp -p /etc/passwd $DIR/$tdir/flink
3369         cp -p /etc/passwd $DIR/$tdir/funlink
3370         cp -p /etc/passwd $DIR/$tdir/frename
3371         ln $DIR/$tdir/funlink $DIR/$tdir/funlink2
3372
3373         sleep 1
3374         echo "aaaaaa" >> $DIR/$tdir/fopen
3375         echo "aaaaaa" >> $DIR/$tdir/flink
3376         echo "aaaaaa" >> $DIR/$tdir/funlink
3377         echo "aaaaaa" >> $DIR/$tdir/frename
3378
3379         local open_new=`stat -c %Y $DIR/$tdir/fopen`
3380         local link_new=`stat -c %Y $DIR/$tdir/flink`
3381         local unlink_new=`stat -c %Y $DIR/$tdir/funlink`
3382         local rename_new=`stat -c %Y $DIR/$tdir/frename`
3383
3384         cat $DIR/$tdir/fopen > /dev/null
3385         ln $DIR/$tdir/flink $DIR/$tdir/